mirror of
https://github.com/misskey-dev/misskey.git
synced 2026-05-05 01:55:36 +02:00
Compare commits
395 Commits
2025.9.0-a
...
copilot/bu
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
23358a5fe9 | ||
|
|
fbc4da1c48 | ||
|
|
28e196e978 | ||
|
|
2cffd9f0fb | ||
|
|
988f5ab69f | ||
|
|
3afe7c5348 | ||
|
|
73cc30f50f | ||
|
|
da3b3af984 | ||
|
|
3273ca7512 | ||
|
|
b67bfe0763 | ||
|
|
63d2870755 | ||
|
|
61f9c148f0 | ||
|
|
8927a9e98a | ||
|
|
dc77d59f87 | ||
|
|
2d0dae236f | ||
|
|
a1f0ca4b8f | ||
|
|
2a996287e3 | ||
|
|
65dd917bfb | ||
|
|
b0bffd3842 | ||
|
|
4ee6f90ab2 | ||
|
|
50379e52db | ||
|
|
6bb29ab5c3 | ||
|
|
fc1e2229e5 | ||
|
|
daf2a57b3c | ||
|
|
6716950d7f | ||
|
|
29a0750eef | ||
|
|
24bd150967 | ||
|
|
a3c3052d0f | ||
|
|
a6f57d99f9 | ||
|
|
55ef4c5faa | ||
|
|
6293a57de8 | ||
|
|
5512898463 | ||
|
|
0b77dc8c48 | ||
|
|
9900b3492a | ||
|
|
d9c9b95fc0 | ||
|
|
613900598a | ||
|
|
1facca1ac5 | ||
|
|
8d66cc006a | ||
|
|
72cdaff810 | ||
|
|
7b9e83a6b8 | ||
|
|
483483bc44 | ||
|
|
f222d7e24d | ||
|
|
e1b6e9d4b6 | ||
|
|
128fe6d644 | ||
|
|
aa905a74cf | ||
|
|
5e2a6021ae | ||
|
|
dfd479bec5 | ||
|
|
0933aa4d92 | ||
|
|
fbd11c1eec | ||
|
|
768e1dd016 | ||
|
|
d55f51a69b | ||
|
|
fe01a5a28f | ||
|
|
32b5583432 | ||
|
|
5fbe801d35 | ||
|
|
3c11797c6d | ||
|
|
10242d5f14 | ||
|
|
0455187a68 | ||
|
|
1ae8e7900d | ||
|
|
81635d9f1c | ||
|
|
4bdbe794a6 | ||
|
|
cad93071da | ||
|
|
2effd9da6e | ||
|
|
2732034447 | ||
|
|
17a4d4fad9 | ||
|
|
f01ceb0b7c | ||
|
|
0b3efa47a2 | ||
|
|
e44f14115e | ||
|
|
bcd9e106e3 | ||
|
|
82b577a2f4 | ||
|
|
8d8504103c | ||
|
|
7a8c4817a8 | ||
|
|
825dcf7e3e | ||
|
|
53e2be747d | ||
|
|
f10496645c | ||
|
|
666e046399 | ||
|
|
f13a34bda4 | ||
|
|
643fd0f22a | ||
|
|
d3aba01db2 | ||
|
|
8fec44d0e9 | ||
|
|
105cc4b50a | ||
|
|
1590a73d3d | ||
|
|
18caa20969 | ||
|
|
1bb8447c73 | ||
|
|
df54bd92d0 | ||
|
|
8cb37792c9 | ||
|
|
3f539916d9 | ||
|
|
415339b30b | ||
|
|
de7cbb376e | ||
|
|
6cb6f794e5 | ||
|
|
236c235115 | ||
|
|
71808d3cc0 | ||
|
|
989c1b351a | ||
|
|
0c5f61721a | ||
|
|
e0e17a78f1 | ||
|
|
2ad393ea45 | ||
|
|
cdf059cc11 | ||
|
|
0fdd88f38e | ||
|
|
4679b2b34d | ||
|
|
052b1a6c76 | ||
|
|
fd15a7fc23 | ||
|
|
b895088546 | ||
|
|
1e5592a5bd | ||
|
|
c3ad46ad6f | ||
|
|
8c7e1bd287 | ||
|
|
043b9b3d26 | ||
|
|
91dafc26a7 | ||
|
|
4edd6a68e6 | ||
|
|
f801d1cf0b | ||
|
|
42706970f2 | ||
|
|
14730e429a | ||
|
|
2ee04860fb | ||
|
|
25afb5d279 | ||
|
|
c4f53aba3f | ||
|
|
86e4f15e95 | ||
|
|
6c190e7a5d | ||
|
|
1b46813e7a | ||
|
|
0ea0e05e61 | ||
|
|
015e680133 | ||
|
|
ea40a0756f | ||
|
|
70fa621e22 | ||
|
|
c741aa5d7d | ||
|
|
7afe0d44d1 | ||
|
|
e588615ea9 | ||
|
|
7e56fed164 | ||
|
|
9f810d701d | ||
|
|
2f3421645a | ||
|
|
4c0f215fc5 | ||
|
|
449b00c934 | ||
|
|
cdcff3ede8 | ||
|
|
9d1c3f053c | ||
|
|
8c5d571975 | ||
|
|
c5e9f7add4 | ||
|
|
e15fdd05b7 | ||
|
|
41e945b0ef | ||
|
|
f89faae0ab | ||
|
|
67ca3d7e71 | ||
|
|
2ac2e9e849 | ||
|
|
746269c4b1 | ||
|
|
c059256bd6 | ||
|
|
2e17979abc | ||
|
|
c2d95ebdcb | ||
|
|
cb5de83bad | ||
|
|
30d87d5532 | ||
|
|
5c212c996a | ||
|
|
39e01b1dfe | ||
|
|
fd2fe34270 | ||
|
|
73bcd330f7 | ||
|
|
23d2d191a0 | ||
|
|
ca1bf21dcf | ||
|
|
1ffc53f596 | ||
|
|
4e38f218ec | ||
|
|
a0d34940ff | ||
|
|
bdddd623b6 | ||
|
|
29bfc9a91a | ||
|
|
2e596607f8 | ||
|
|
cf89280fc5 | ||
|
|
c0f4c47c53 | ||
|
|
58995e6b97 | ||
|
|
d00ca499a3 | ||
|
|
ec1120bdaa | ||
|
|
3a65728fb4 | ||
|
|
e4c03b9f4e | ||
|
|
b82533c4b8 | ||
|
|
ef1cdca6f9 | ||
|
|
46d30f454b | ||
|
|
b300b5b94a | ||
|
|
39d6aecc57 | ||
|
|
edbe30a3df | ||
|
|
ad4751918b | ||
|
|
bd9041bd8f | ||
|
|
4dcff123df | ||
|
|
990be44d98 | ||
|
|
78d65ef3dd | ||
|
|
0a67d6f1a0 | ||
|
|
e312283ea0 | ||
|
|
e8c78e12d5 | ||
|
|
37fe7a9634 | ||
|
|
729abbef62 | ||
|
|
e74ab35de3 | ||
|
|
4ba18690d7 | ||
|
|
26c8914a26 | ||
|
|
119423e3ae | ||
|
|
3de1ce63cd | ||
|
|
18fbc9bb05 | ||
|
|
37a21cf54e | ||
|
|
290fd8c7cc | ||
|
|
0edb0133fc | ||
|
|
0abe021640 | ||
|
|
344f50d538 | ||
|
|
1cebad0ddb | ||
|
|
3e34e87a59 | ||
|
|
b9713259a7 | ||
|
|
e15b8b7fa3 | ||
|
|
ca89c86426 | ||
|
|
6bce19655b | ||
|
|
78ed024b0b | ||
|
|
6f76b598a1 | ||
|
|
a888f2863b | ||
|
|
a892bbcce5 | ||
|
|
6571c87e14 | ||
|
|
9e0f18a705 | ||
|
|
3dfca2d61f | ||
|
|
f1578c282e | ||
|
|
231a6877be | ||
|
|
d0a5ccc1ec | ||
|
|
4e16e23acd | ||
|
|
17da44078b | ||
|
|
1f29fb4e40 | ||
|
|
0343b4e689 | ||
|
|
a76a1a6305 | ||
|
|
1f934ada5d | ||
|
|
cd77404006 | ||
|
|
351386c8ff | ||
|
|
298f8802d4 | ||
|
|
6e614ff061 | ||
|
|
ca76ba1871 | ||
|
|
9f768b8022 | ||
|
|
4ff826eb3d | ||
|
|
60bcb9c6a9 | ||
|
|
0c85bfd56f | ||
|
|
9d37f696b4 | ||
|
|
2734ff6af7 | ||
|
|
456504cf82 | ||
|
|
81cea6aed5 | ||
|
|
2d1b7c957a | ||
|
|
5b6aa1496a | ||
|
|
259dd34b26 | ||
|
|
cf81406fae | ||
|
|
42f230f223 | ||
|
|
2e07e50bb4 | ||
|
|
d203e1a446 | ||
|
|
4988719a2e | ||
|
|
f0380f2d1c | ||
|
|
130d065d0c | ||
|
|
7b41fddf54 | ||
|
|
aafd8b6bf7 | ||
|
|
7a82c1a912 | ||
|
|
3c97c12e7f | ||
|
|
5b5a1f08e1 | ||
|
|
c4ee95a40a | ||
|
|
8ea7fe0ba1 | ||
|
|
187b6477da | ||
|
|
09896fdc12 | ||
|
|
d4cda989a2 | ||
|
|
f93043e170 | ||
|
|
1c2e57d60c | ||
|
|
67c853104c | ||
|
|
986d783940 | ||
|
|
61cfccff37 | ||
|
|
b161fe7adc | ||
|
|
c3b1c8a8ff | ||
|
|
bc2b512be6 | ||
|
|
7fe9574897 | ||
|
|
8549f71656 | ||
|
|
ae4487fa69 | ||
|
|
0a75d6fcf1 | ||
|
|
d3bb24d851 | ||
|
|
9aea7363ce | ||
|
|
f0889f4b3c | ||
|
|
b8433b2413 | ||
|
|
4e9070a4c5 | ||
|
|
bff194f648 | ||
|
|
8714945ec9 | ||
|
|
aadc7bf61a | ||
|
|
acd35ef96c | ||
|
|
43919a3fe3 | ||
|
|
8a21202281 | ||
|
|
579499a7df | ||
|
|
b48233eb4c | ||
|
|
d98bf012b5 | ||
|
|
44930342a8 | ||
|
|
29892d2a01 | ||
|
|
b6bf3cfcb7 | ||
|
|
a132a1d3e1 | ||
|
|
8cfd147555 | ||
|
|
a405575cd6 | ||
|
|
56885cceed | ||
|
|
3c64281696 | ||
|
|
45b3afa70d | ||
|
|
beabe84354 | ||
|
|
42008d1377 | ||
|
|
3df81931ec | ||
|
|
4c536630d4 | ||
|
|
92cc55f0f1 | ||
|
|
f8c6273acc | ||
|
|
edf7beff23 | ||
|
|
3804028b6e | ||
|
|
70473c66e9 | ||
|
|
a87a3c6693 | ||
|
|
72a5daeb9a | ||
|
|
54efe1b4c5 | ||
|
|
24129efe97 | ||
|
|
41aa0c8efe | ||
|
|
37526de323 | ||
|
|
21ed2e3002 | ||
|
|
917def4e13 | ||
|
|
d1eb1cad42 | ||
|
|
994690eebf | ||
|
|
b25810e091 | ||
|
|
03544dfd9d | ||
|
|
d4df749f4f | ||
|
|
04e2d44d28 | ||
|
|
6d2e582eaf | ||
|
|
9eb975e71d | ||
|
|
ced687117f | ||
|
|
7cc0483b47 | ||
|
|
a8a0c1c1b6 | ||
|
|
6b438f2ce0 | ||
|
|
188b37b33f | ||
|
|
0b642cf446 | ||
|
|
fe38115883 | ||
|
|
6fba73ca13 | ||
|
|
0d33e1f839 | ||
|
|
74f33157a3 | ||
|
|
ae10cad9a7 | ||
|
|
ba9924abdb | ||
|
|
99686801a0 | ||
|
|
f3e0713501 | ||
|
|
7fcbf57a9d | ||
|
|
7cd55c31da | ||
|
|
d03cf4d7f9 | ||
|
|
a8fcdb79ab | ||
|
|
eae9af73c2 | ||
|
|
c0dc156df7 | ||
|
|
720c6519cd | ||
|
|
f89b4cdc12 | ||
|
|
46b0e8115a | ||
|
|
7796fce779 | ||
|
|
3954837cfa | ||
|
|
7ea4cad12e | ||
|
|
d864e9a269 | ||
|
|
4e0434c275 | ||
|
|
e2f939080a | ||
|
|
6956f44d1f | ||
|
|
a393d5a87e | ||
|
|
6c634de482 | ||
|
|
fc02e0d34d | ||
|
|
cb1a90ddad | ||
|
|
f0fb3a56a8 | ||
|
|
b8ae7edcec | ||
|
|
e24233c1c7 | ||
|
|
225154d76d | ||
|
|
c5f9c0ce5c | ||
|
|
cce302ae4f | ||
|
|
e0d210e15b | ||
|
|
0b7634b126 | ||
|
|
d1446d195a | ||
|
|
218070eb13 | ||
|
|
0f8c068e84 | ||
|
|
69d66b89f2 | ||
|
|
211365de64 | ||
|
|
966127c63e | ||
|
|
54800971eb | ||
|
|
13d5c6d2b2 | ||
|
|
2cff00eedd | ||
|
|
3fc2261041 | ||
|
|
18d66c0233 | ||
|
|
2f52c20150 | ||
|
|
9d70c9ad78 | ||
|
|
42b2aea533 | ||
|
|
97adf6f2cc | ||
|
|
93ff209c51 | ||
|
|
5fe08d0bbb | ||
|
|
8c413d01e6 | ||
|
|
b231da7c7c | ||
|
|
df3e44f62e | ||
|
|
e504560477 | ||
|
|
bcb2073715 | ||
|
|
6a80c23a50 | ||
|
|
2621f468ff | ||
|
|
d4654dd7bd | ||
|
|
b7da6cad87 | ||
|
|
5b4115e21a | ||
|
|
c174c5c144 | ||
|
|
aebc3f781e | ||
|
|
f60b6291d7 | ||
|
|
7673874675 | ||
|
|
6e3354f95d | ||
|
|
b9df928097 | ||
|
|
0754678144 | ||
|
|
a8cc51dc77 | ||
|
|
690edcef16 | ||
|
|
2ea784f345 | ||
|
|
20d257b562 | ||
|
|
c215415613 | ||
|
|
726c03d96a | ||
|
|
e65ddb546c | ||
|
|
85aea9077f | ||
|
|
f3fffce6a9 | ||
|
|
eb7db5a3aa | ||
|
|
e33eb26863 | ||
|
|
430310f306 | ||
|
|
1e1eea521e | ||
|
|
86ad771221 | ||
|
|
057acf471e |
@@ -105,6 +105,16 @@ port: 3000
|
||||
# socket: /path/to/misskey.sock
|
||||
# chmodSocket: '777'
|
||||
|
||||
# Proxy trust settings
|
||||
#
|
||||
# Changes how the server interpret the origin IP of the request.
|
||||
#
|
||||
# Any format supported by Fastify is accepted.
|
||||
# Default: do not trust any proxies (i.e. trustProxy: false)
|
||||
# See: https://fastify.dev/docs/latest/reference/server/#trustproxy
|
||||
#
|
||||
# trustProxy: false
|
||||
|
||||
# ┌──────────────────────────┐
|
||||
#───┘ PostgreSQL configuration └────────────────────────────────
|
||||
|
||||
|
||||
@@ -1 +1 @@
|
||||
FROM mcr.microsoft.com/devcontainers/javascript-node:0-18
|
||||
FROM mcr.microsoft.com/devcontainers/javascript-node:4.0.3-24-trixie
|
||||
|
||||
@@ -28,7 +28,7 @@ services:
|
||||
|
||||
db:
|
||||
restart: unless-stopped
|
||||
image: postgres:15-alpine
|
||||
image: postgres:18-alpine
|
||||
networks:
|
||||
- internal_network
|
||||
environment:
|
||||
|
||||
2
.github/ISSUE_TEMPLATE/01_bug-report.yml
vendored
2
.github/ISSUE_TEMPLATE/01_bug-report.yml
vendored
@@ -76,7 +76,7 @@ body:
|
||||
* Installation Method or Hosting Service: docker compose, k8s/docker, systemd, "Misskey install shell script", development environment
|
||||
* Misskey: 2025.x.x
|
||||
* Node: 20.x.x
|
||||
* PostgreSQL: 15.x.x
|
||||
* PostgreSQL: 18.x.x
|
||||
* Redis: 7.x.x
|
||||
* OS and Architecture: Ubuntu 24.04.2 LTS aarch64
|
||||
value: |
|
||||
|
||||
2
.github/workflows/api-misskey-js.yml
vendored
2
.github/workflows/api-misskey-js.yml
vendored
@@ -19,7 +19,7 @@ jobs:
|
||||
uses: actions/checkout@v4.3.0
|
||||
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v4.1.0
|
||||
uses: pnpm/action-setup@v4.2.0
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4.4.0
|
||||
|
||||
28
.github/workflows/dockle.yml
vendored
28
.github/workflows/dockle.yml
vendored
@@ -13,20 +13,36 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
DOCKER_CONTENT_TRUST: 1
|
||||
DOCKLE_VERSION: 0.4.14
|
||||
DOCKLE_VERSION: 0.4.15
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4.3.0
|
||||
|
||||
- name: Download and install dockle v${{ env.DOCKLE_VERSION }}
|
||||
run: |
|
||||
curl -L -o dockle.deb "https://github.com/goodwithtech/dockle/releases/download/v${DOCKLE_VERSION}/dockle_${DOCKLE_VERSION}_Linux-64bit.deb"
|
||||
sudo dpkg -i dockle.deb
|
||||
|
||||
- run: |
|
||||
cp .config/docker_example.env .config/docker.env
|
||||
cp ./compose_example.yml ./compose.yml
|
||||
|
||||
- run: |
|
||||
docker compose up -d web
|
||||
docker tag "$(docker compose images --format json web | jq -r '.[] | .ID')" misskey-web:latest
|
||||
- run: |
|
||||
cmd="dockle --exit-code 1 misskey-web:latest ${image_name}"
|
||||
echo "> ${cmd}"
|
||||
eval "${cmd}"
|
||||
IMAGE_ID=$(docker compose images --format json web | jq -r '.[0].ID')
|
||||
docker tag "${IMAGE_ID}" misskey-web:latest
|
||||
|
||||
- name: Prune docker junk (optional but recommended)
|
||||
run: |
|
||||
docker system prune -af
|
||||
docker volume prune -f
|
||||
|
||||
- name: Save image for Dockle
|
||||
run: |
|
||||
docker save misskey-web:latest -o ./misskey-web.tar
|
||||
ls -lh ./misskey-web.tar
|
||||
|
||||
- name: Run Dockle with tar input
|
||||
run: |
|
||||
dockle --exit-code 1 --input ./misskey-web.tar
|
||||
|
||||
|
||||
2
.github/workflows/get-api-diff.yml
vendored
2
.github/workflows/get-api-diff.yml
vendored
@@ -30,7 +30,7 @@ jobs:
|
||||
ref: ${{ matrix.ref }}
|
||||
submodules: true
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v4.1.0
|
||||
uses: pnpm/action-setup@v4.2.0
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@v4.4.0
|
||||
with:
|
||||
|
||||
87
.github/workflows/get-backend-memory.yml
vendored
Normal file
87
.github/workflows/get-backend-memory.yml
vendored
Normal file
@@ -0,0 +1,87 @@
|
||||
# this name is used in report-backend-memory.yml so be careful when change name
|
||||
name: Get backend memory usage
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches:
|
||||
- master
|
||||
- develop
|
||||
paths:
|
||||
- packages/backend/**
|
||||
- packages/misskey-js/**
|
||||
- .github/workflows/get-backend-memory.yml
|
||||
|
||||
jobs:
|
||||
get-memory-usage:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
memory-json-name: [memory-base.json, memory-head.json]
|
||||
include:
|
||||
- memory-json-name: memory-base.json
|
||||
ref: ${{ github.base_ref }}
|
||||
- memory-json-name: memory-head.json
|
||||
ref: refs/pull/${{ github.event.number }}/merge
|
||||
|
||||
services:
|
||||
postgres:
|
||||
image: postgres:18
|
||||
ports:
|
||||
- 54312:5432
|
||||
env:
|
||||
POSTGRES_DB: test-misskey
|
||||
POSTGRES_HOST_AUTH_METHOD: trust
|
||||
redis:
|
||||
image: redis:7
|
||||
ports:
|
||||
- 56312:6379
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4.3.0
|
||||
with:
|
||||
ref: ${{ matrix.ref }}
|
||||
submodules: true
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v4.2.0
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@v4.4.0
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
cache: 'pnpm'
|
||||
- run: pnpm i --frozen-lockfile
|
||||
- name: Check pnpm-lock.yaml
|
||||
run: git diff --exit-code pnpm-lock.yaml
|
||||
- name: Copy Configure
|
||||
run: cp .github/misskey/test.yml .config/default.yml
|
||||
- name: Compile Configure
|
||||
run: pnpm compile-config
|
||||
- name: Build
|
||||
run: pnpm build
|
||||
- name: Run migrations
|
||||
run: pnpm --filter backend migrate
|
||||
- name: Measure memory usage
|
||||
run: |
|
||||
# Start the server and measure memory usage
|
||||
node packages/backend/scripts/measure-memory.mjs > ${{ matrix.memory-json-name }}
|
||||
- name: Upload Artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: memory-artifact-${{ matrix.memory-json-name }}
|
||||
path: ${{ matrix.memory-json-name }}
|
||||
|
||||
save-pr-number:
|
||||
runs-on: ubuntu-latest
|
||||
permissions: {}
|
||||
steps:
|
||||
- name: Save PR number
|
||||
env:
|
||||
PR_NUMBER: ${{ github.event.number }}
|
||||
run: |
|
||||
echo "$PR_NUMBER" > ./pr_number
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: memory-artifact-pr-number
|
||||
path: pr_number
|
||||
14
.github/workflows/lint.yml
vendored
14
.github/workflows/lint.yml
vendored
@@ -41,7 +41,7 @@ jobs:
|
||||
fetch-depth: 0
|
||||
submodules: true
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v4.1.0
|
||||
uses: pnpm/action-setup@v4.2.0
|
||||
- uses: actions/setup-node@v4.4.0
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
@@ -74,14 +74,14 @@ jobs:
|
||||
fetch-depth: 0
|
||||
submodules: true
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v4.1.0
|
||||
uses: pnpm/action-setup@v4.2.0
|
||||
- uses: actions/setup-node@v4.4.0
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
cache: 'pnpm'
|
||||
- run: pnpm i --frozen-lockfile
|
||||
- name: Restore eslint cache
|
||||
uses: actions/cache@v4.2.4
|
||||
uses: actions/cache@v4.3.0
|
||||
with:
|
||||
path: ${{ env.eslint-cache-path }}
|
||||
key: eslint-${{ env.eslint-cache-version }}-${{ matrix.workspace }}-${{ hashFiles('**/pnpm-lock.yaml') }}-${{ github.ref_name }}-${{ github.sha }}
|
||||
@@ -96,6 +96,7 @@ jobs:
|
||||
matrix:
|
||||
workspace:
|
||||
- backend
|
||||
- frontend
|
||||
- sw
|
||||
- misskey-js
|
||||
steps:
|
||||
@@ -104,14 +105,11 @@ jobs:
|
||||
fetch-depth: 0
|
||||
submodules: true
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v4.1.0
|
||||
uses: pnpm/action-setup@v4.2.0
|
||||
- uses: actions/setup-node@v4.4.0
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
cache: 'pnpm'
|
||||
- run: pnpm i --frozen-lockfile
|
||||
- run: pnpm --filter misskey-js run build
|
||||
if: ${{ matrix.workspace == 'backend' || matrix.workspace == 'sw' }}
|
||||
- run: pnpm --filter misskey-reversi run build
|
||||
if: ${{ matrix.workspace == 'backend' }}
|
||||
- run: pnpm --filter "${{ matrix.workspace }}^..." run build
|
||||
- run: pnpm --filter ${{ matrix.workspace }} run typecheck
|
||||
|
||||
29
.github/workflows/locale.yml
vendored
29
.github/workflows/locale.yml
vendored
@@ -3,10 +3,12 @@ name: Lint
|
||||
on:
|
||||
push:
|
||||
paths:
|
||||
- packages/i18n/**
|
||||
- locales/**
|
||||
- .github/workflows/locale.yml
|
||||
pull_request:
|
||||
paths:
|
||||
- packages/i18n/**
|
||||
- locales/**
|
||||
- .github/workflows/locale.yml
|
||||
jobs:
|
||||
@@ -14,15 +16,18 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
continue-on-error: true
|
||||
steps:
|
||||
- uses: actions/checkout@v4.3.0
|
||||
with:
|
||||
fetch-depth: 0
|
||||
submodules: true
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v4.1.0
|
||||
- uses: actions/setup-node@v4.4.0
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
cache: 'pnpm'
|
||||
- run: pnpm i --frozen-lockfile
|
||||
- run: cd locales && node verify.js
|
||||
- uses: actions/checkout@v4.3.0
|
||||
with:
|
||||
fetch-depth: 0
|
||||
submodules: true
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v4.2.0
|
||||
- uses: actions/setup-node@v4.4.0
|
||||
with:
|
||||
node-version-file: ".node-version"
|
||||
cache: "pnpm"
|
||||
- run: pnpm i --frozen-lockfile
|
||||
- run: pnpm --filter i18n build
|
||||
- name: Verify Locales
|
||||
working-directory: ./packages/i18n
|
||||
run: pnpm run verify
|
||||
|
||||
2
.github/workflows/on-release-created.yml
vendored
2
.github/workflows/on-release-created.yml
vendored
@@ -20,7 +20,7 @@ jobs:
|
||||
with:
|
||||
submodules: true
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v4.1.0
|
||||
uses: pnpm/action-setup@v4.2.0
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@v4.4.0
|
||||
with:
|
||||
|
||||
2
.github/workflows/report-api-diff.yml
vendored
2
.github/workflows/report-api-diff.yml
vendored
@@ -16,7 +16,7 @@ jobs:
|
||||
# api-artifact
|
||||
steps:
|
||||
- name: Download artifact
|
||||
uses: actions/github-script@v7.0.1
|
||||
uses: actions/github-script@v7.1.0
|
||||
with:
|
||||
script: |
|
||||
const fs = require('fs');
|
||||
|
||||
122
.github/workflows/report-backend-memory.yml
vendored
Normal file
122
.github/workflows/report-backend-memory.yml
vendored
Normal file
@@ -0,0 +1,122 @@
|
||||
name: Report backend memory
|
||||
|
||||
on:
|
||||
workflow_run:
|
||||
types: [completed]
|
||||
workflows:
|
||||
- Get backend memory usage # get-backend-memory.yml
|
||||
|
||||
jobs:
|
||||
compare-memory:
|
||||
runs-on: ubuntu-latest
|
||||
if: ${{ github.event.workflow_run.conclusion == 'success' }}
|
||||
permissions:
|
||||
pull-requests: write
|
||||
|
||||
steps:
|
||||
- name: Download artifact
|
||||
uses: actions/github-script@v7.1.0
|
||||
with:
|
||||
script: |
|
||||
const fs = require('fs');
|
||||
let allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
run_id: context.payload.workflow_run.id,
|
||||
});
|
||||
let matchArtifacts = allArtifacts.data.artifacts.filter((artifact) => {
|
||||
return artifact.name.startsWith("memory-artifact-") || artifact.name == "memory-artifact"
|
||||
});
|
||||
await Promise.all(matchArtifacts.map(async (artifact) => {
|
||||
let download = await github.rest.actions.downloadArtifact({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
artifact_id: artifact.id,
|
||||
archive_format: 'zip',
|
||||
});
|
||||
await fs.promises.writeFile(`${process.env.GITHUB_WORKSPACE}/${artifact.name}.zip`, Buffer.from(download.data));
|
||||
}));
|
||||
- name: Extract all artifacts
|
||||
run: |
|
||||
find . -mindepth 1 -maxdepth 1 -type f -name '*.zip' -exec unzip {} -d artifacts ';'
|
||||
ls -la artifacts/
|
||||
- name: Load PR Number
|
||||
id: load-pr-num
|
||||
run: echo "pr-number=$(cat artifacts/pr_number)" >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: Output base
|
||||
run: cat ./artifacts/memory-base.json
|
||||
- name: Output head
|
||||
run: cat ./artifacts/memory-head.json
|
||||
- name: Compare memory usage
|
||||
id: compare
|
||||
run: |
|
||||
BASE_MEMORY=$(cat ./artifacts/memory-base.json)
|
||||
HEAD_MEMORY=$(cat ./artifacts/memory-head.json)
|
||||
|
||||
BASE_RSS=$(echo "$BASE_MEMORY" | jq -r '.memory.rss // 0')
|
||||
HEAD_RSS=$(echo "$HEAD_MEMORY" | jq -r '.memory.rss // 0')
|
||||
|
||||
# Calculate difference
|
||||
if [ "$BASE_RSS" -gt 0 ] && [ "$HEAD_RSS" -gt 0 ]; then
|
||||
DIFF=$((HEAD_RSS - BASE_RSS))
|
||||
DIFF_PERCENT=$(echo "scale=2; ($DIFF * 100) / $BASE_RSS" | bc)
|
||||
|
||||
# Convert to MB for readability
|
||||
BASE_MB=$(echo "scale=2; $BASE_RSS / 1048576" | bc)
|
||||
HEAD_MB=$(echo "scale=2; $HEAD_RSS / 1048576" | bc)
|
||||
DIFF_MB=$(echo "scale=2; $DIFF / 1048576" | bc)
|
||||
|
||||
echo "base_mb=$BASE_MB" >> "$GITHUB_OUTPUT"
|
||||
echo "head_mb=$HEAD_MB" >> "$GITHUB_OUTPUT"
|
||||
echo "diff_mb=$DIFF_MB" >> "$GITHUB_OUTPUT"
|
||||
echo "diff_percent=$DIFF_PERCENT" >> "$GITHUB_OUTPUT"
|
||||
echo "has_data=true" >> "$GITHUB_OUTPUT"
|
||||
|
||||
# Determine if this is a significant change (more than 5% increase)
|
||||
if [ "$(echo "$DIFF_PERCENT > 5" | bc)" -eq 1 ]; then
|
||||
echo "significant_increase=true" >> "$GITHUB_OUTPUT"
|
||||
else
|
||||
echo "significant_increase=false" >> "$GITHUB_OUTPUT"
|
||||
fi
|
||||
else
|
||||
echo "has_data=false" >> "$GITHUB_OUTPUT"
|
||||
fi
|
||||
- id: build-comment
|
||||
name: Build memory comment
|
||||
run: |
|
||||
HEADER="## Backend Memory Usage Comparison"
|
||||
FOOTER="[See workflow logs for details](https://github.com/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID})"
|
||||
|
||||
echo "$HEADER" > ./output.md
|
||||
echo >> ./output.md
|
||||
|
||||
if [ "${{ steps.compare.outputs.has_data }}" == "true" ]; then
|
||||
echo "| Metric | base | head | Diff |" >> ./output.md
|
||||
echo "|--------|------|------|------|" >> ./output.md
|
||||
echo "| RSS | ${{ steps.compare.outputs.base_mb }} MB | ${{ steps.compare.outputs.head_mb }} MB | ${{ steps.compare.outputs.diff_mb }} MB (${{ steps.compare.outputs.diff_percent }}%) |" >> ./output.md
|
||||
echo >> ./output.md
|
||||
|
||||
if [ "${{ steps.compare.outputs.significant_increase }}" == "true" ]; then
|
||||
echo "⚠️ **Warning**: Memory usage has increased by more than 5%. Please verify this is not an unintended change." >> ./output.md
|
||||
echo >> ./output.md
|
||||
fi
|
||||
else
|
||||
echo "Could not retrieve memory usage data." >> ./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 }}
|
||||
comment_tag: show_memory_diff
|
||||
filePath: ./output.md
|
||||
- name: Tell error to PR
|
||||
uses: thollander/actions-comment-pull-request@v2
|
||||
if: failure() && steps.load-pr-num.outputs.pr-number
|
||||
with:
|
||||
pr_number: ${{ steps.load-pr-num.outputs.pr-number }}
|
||||
comment_tag: show_memory_diff_error
|
||||
message: |
|
||||
An error occurred while comparing backend memory usage. See [workflow logs](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}) for details.
|
||||
51
.github/workflows/request-release-review.yml
vendored
Normal file
51
.github/workflows/request-release-review.yml
vendored
Normal file
@@ -0,0 +1,51 @@
|
||||
name: Request release review
|
||||
|
||||
on:
|
||||
issue_comment:
|
||||
types: [created]
|
||||
|
||||
jobs:
|
||||
reply:
|
||||
if: github.event.comment.body == '/request-release-review'
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
issues: write
|
||||
pull-requests: write
|
||||
steps:
|
||||
- name: Reply
|
||||
uses: actions/github-script@v6
|
||||
with:
|
||||
script: |
|
||||
const body = `To dev team (@misskey-dev/dev):
|
||||
|
||||
リリースが提案されています :rocket:
|
||||
|
||||
GOの場合はapprove、NO GOの場合はその旨コメントをお願いいたします。
|
||||
|
||||
判断にあたって考慮すべき観点は、
|
||||
|
||||
- やり残したことはないか?
|
||||
- CHANGELOGは過不足ないか?
|
||||
- バージョンに問題はないか?(月跨いでいるのに更新忘れているなど)
|
||||
- 再考すべき仕様・実装はないか?
|
||||
- ベータ版を検証したサーバーから不具合の報告等は上がってないか?
|
||||
- (セキュリティの修正や重要なバグ修正などのため)リリースを急いだ方が良いか?そうではないか?
|
||||
- Actionsが落ちていないか?
|
||||
|
||||
などが挙げられます。
|
||||
|
||||
ご協力ありがとうございます :sparkles:
|
||||
`
|
||||
|
||||
const issue_number = context.payload.issue ? context.payload.issue.number : (context.payload.pull_request && context.payload.pull_request.number)
|
||||
if (!issue_number) {
|
||||
console.log('No issue or PR number found in payload; skipping')
|
||||
} else {
|
||||
await github.rest.issues.createComment({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number,
|
||||
body,
|
||||
})
|
||||
}
|
||||
4
.github/workflows/storybook.yml
vendored
4
.github/workflows/storybook.yml
vendored
@@ -37,7 +37,7 @@ jobs:
|
||||
if: github.event_name == 'pull_request_target'
|
||||
run: git checkout "$(git rev-list --parents -n1 HEAD | cut -d" " -f3)"
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v4.1.0
|
||||
uses: pnpm/action-setup@v4.2.0
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@v4.4.0
|
||||
with:
|
||||
@@ -90,7 +90,7 @@ jobs:
|
||||
env:
|
||||
CHROMATIC_PROJECT_TOKEN: ${{ secrets.CHROMATIC_PROJECT_TOKEN }}
|
||||
- name: Notify that Chromatic detects changes
|
||||
uses: actions/github-script@v7.0.1
|
||||
uses: actions/github-script@v7.1.0
|
||||
if: github.event_name != 'pull_request_target' && steps.chromatic_push.outputs.success == 'false'
|
||||
with:
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
12
.github/workflows/test-backend.yml
vendored
12
.github/workflows/test-backend.yml
vendored
@@ -38,7 +38,7 @@ jobs:
|
||||
|
||||
services:
|
||||
postgres:
|
||||
image: postgres:15
|
||||
image: postgres:18
|
||||
ports:
|
||||
- 54312:5432
|
||||
env:
|
||||
@@ -54,7 +54,7 @@ jobs:
|
||||
with:
|
||||
submodules: true
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v4.1.0
|
||||
uses: pnpm/action-setup@v4.2.0
|
||||
- name: Get current date
|
||||
id: current-date
|
||||
run: echo "today=$(date +'%Y-%m-%d')" >> $GITHUB_OUTPUT
|
||||
@@ -117,7 +117,7 @@ jobs:
|
||||
|
||||
services:
|
||||
postgres:
|
||||
image: postgres:15
|
||||
image: postgres:18
|
||||
ports:
|
||||
- 54312:5432
|
||||
env:
|
||||
@@ -133,7 +133,7 @@ jobs:
|
||||
with:
|
||||
submodules: true
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v4.1.0
|
||||
uses: pnpm/action-setup@v4.2.0
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@v4.4.0
|
||||
with:
|
||||
@@ -165,7 +165,7 @@ jobs:
|
||||
|
||||
services:
|
||||
postgres:
|
||||
image: postgres:15
|
||||
image: postgres:18
|
||||
ports:
|
||||
- 54312:5432
|
||||
env:
|
||||
@@ -177,7 +177,7 @@ jobs:
|
||||
with:
|
||||
submodules: true
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v4.1.0
|
||||
uses: pnpm/action-setup@v4.2.0
|
||||
- name: Get current date
|
||||
id: current-date
|
||||
run: echo "today=$(date +'%Y-%m-%d')" >> $GITHUB_OUTPUT
|
||||
|
||||
2
.github/workflows/test-federation.yml
vendored
2
.github/workflows/test-federation.yml
vendored
@@ -36,7 +36,7 @@ jobs:
|
||||
with:
|
||||
submodules: true
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v4.1.0
|
||||
uses: pnpm/action-setup@v4.2.0
|
||||
- name: Get current date
|
||||
id: current-date
|
||||
run: echo "today=$(date +'%Y-%m-%d')" >> $GITHUB_OUTPUT
|
||||
|
||||
6
.github/workflows/test-frontend.yml
vendored
6
.github/workflows/test-frontend.yml
vendored
@@ -32,7 +32,7 @@ jobs:
|
||||
with:
|
||||
submodules: true
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v4.1.0
|
||||
uses: pnpm/action-setup@v4.2.0
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@v4.4.0
|
||||
with:
|
||||
@@ -64,7 +64,7 @@ jobs:
|
||||
|
||||
services:
|
||||
postgres:
|
||||
image: postgres:15
|
||||
image: postgres:18
|
||||
ports:
|
||||
- 54312:5432
|
||||
env:
|
||||
@@ -86,7 +86,7 @@ jobs:
|
||||
#- uses: browser-actions/setup-firefox@latest
|
||||
# if: ${{ matrix.browser == 'firefox' }}
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v4.1.0
|
||||
uses: pnpm/action-setup@v4.2.0
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@v4.4.0
|
||||
with:
|
||||
|
||||
2
.github/workflows/test-misskey-js.yml
vendored
2
.github/workflows/test-misskey-js.yml
vendored
@@ -25,7 +25,7 @@ jobs:
|
||||
uses: actions/checkout@v4.3.0
|
||||
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v4.1.0
|
||||
uses: pnpm/action-setup@v4.2.0
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4.4.0
|
||||
|
||||
2
.github/workflows/test-production.yml
vendored
2
.github/workflows/test-production.yml
vendored
@@ -20,7 +20,7 @@ jobs:
|
||||
with:
|
||||
submodules: true
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v4.1.0
|
||||
uses: pnpm/action-setup@v4.2.0
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@v4.4.0
|
||||
with:
|
||||
|
||||
2
.github/workflows/validate-api-json.yml
vendored
2
.github/workflows/validate-api-json.yml
vendored
@@ -21,7 +21,7 @@ jobs:
|
||||
with:
|
||||
submodules: true
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v4.1.0
|
||||
uses: pnpm/action-setup@v4.2.0
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@v4.4.0
|
||||
with:
|
||||
|
||||
1
.vscode/settings.json
vendored
1
.vscode/settings.json
vendored
@@ -3,6 +3,7 @@
|
||||
"**/node_modules": true
|
||||
},
|
||||
"typescript.tsdk": "node_modules/typescript/lib",
|
||||
"typescript.enablePromptUseWorkspaceTsdk": true,
|
||||
"files.associations": {
|
||||
"*.test.ts": "typescript"
|
||||
},
|
||||
|
||||
157
CHANGELOG.md
157
CHANGELOG.md
@@ -1,3 +1,159 @@
|
||||
## Unreleased
|
||||
|
||||
### General
|
||||
-
|
||||
|
||||
### Client
|
||||
- Fix: 特定の条件下でMisskeyが起動せず空白のページが表示されることがある問題を軽減
|
||||
- Fix: 初回読み込み時などに、言語設定で不整合が発生することがある問題を修正
|
||||
|
||||
### Server
|
||||
- Fix: ジョブキューでSentryが有効にならない問題を修正
|
||||
|
||||
|
||||
## 2025.12.0
|
||||
|
||||
### Note
|
||||
- configの`trustProxy`のデフォルト値を`false`に変更しました。アップデート前に現在のconfigをご確認の上、必要に応じて値を変更してください。
|
||||
|
||||
### Client
|
||||
- Fix: stacking router viewで連続して戻る操作を行うと何も表示されなくなる問題を修正
|
||||
|
||||
### Server
|
||||
- Enhance: メモリ使用量を削減しました
|
||||
- Enhance: ActivityPubアクティビティを送信する際のパフォーマンス向上
|
||||
- Enhance: 依存関係の更新
|
||||
- Fix: セキュリティに関する修正
|
||||
|
||||
## 2025.11.1
|
||||
|
||||
### Client
|
||||
|
||||
- Enhance: リアクションの受け入れ設定にキャプションを追加 #15921
|
||||
- Fix: ページの内容がはみ出ることがある問題を修正
|
||||
- Fix: ナビゲーションバーを下に表示しているときに、項目数が多いと表示が崩れる問題を修正
|
||||
- Fix: ヘッダーメニューのチャンネルの新規作成の項目でチャンネル作成ページに飛べない問題を修正 #16816
|
||||
- Fix: ラジオボタンに空白の選択肢が表示される問題を修正
|
||||
(Cherry-picked from https://github.com/MisskeyIO/misskey/pull/1105)
|
||||
- Fix: 一部のシチュエーションで投稿フォームのツアーが正しく表示されない問題を修正
|
||||
- Fix: 投稿フォームのリセットボタンで注釈がリセットされない問題を修正
|
||||
- Fix: PlayのAiScriptバージョン判定(v0.x系・v1.x系の判定)が正しく動作しない問題を修正
|
||||
(Cherry-picked from https://github.com/MisskeyIO/misskey/pull/1129)
|
||||
- Fix: フォロー申請をキャンセルする際の確認ダイアログの文言が不正確な問題を修正
|
||||
- Fix: 初回読み込み時にエラーになることがある問題を修正
|
||||
- Fix: お気に入りクリップの一覧表示が正しく動作しない問題を修正
|
||||
- Fix: AiScript Misskey 拡張APIにおいて、各種関数の引数で明示的に `null` が指定されている場合のハンドリングを修正
|
||||
|
||||
### Server
|
||||
- Enhance: メモリ使用量を削減しました
|
||||
- Enhance: 依存関係の更新
|
||||
- Fix: ワードミュートの文字数計算を修正
|
||||
- Fix: チャンネルのリアルタイム更新時に、ロックダウン設定にて非ログイン時にノートを表示しない設定にしている場合でもノートが表示されてしまう問題を修正
|
||||
- Fix: DeepL APIのAPIキー指定方式変更に対応
|
||||
(Cherry-picked from https://github.com/MisskeyIO/misskey/pull/1096)
|
||||
- 内部実装の変更にて対応可能な更新です。Misskey側の設定方法に変更はありません。
|
||||
- Fix: DBレプリケーションを利用する環境でクエリーが失敗する問題を修正
|
||||
(Cherry-picked from https://github.com/MisskeyIO/misskey/pull/1123)
|
||||
|
||||
## 2025.11.0
|
||||
|
||||
### General
|
||||
- Feat: チャンネルミュート機能の実装 #10649
|
||||
- チャンネルの概要画面の右上からミュートできます(リンクコピー、共有、設定と同列)
|
||||
- Enhance: Node.js 24.10.0をサポートするようになりました
|
||||
- Enhance: DockerのNode.jsが24.10.0に更新されました
|
||||
- 依存関係の更新
|
||||
|
||||
### Client
|
||||
- Feat: 画像にメタデータを含むフレームをつけられる機能
|
||||
- Enhance: プリセットを作成しなくても画像にウォーターマークを付与できるように
|
||||
- Enhance: 管理しているチャンネルの見分けがつきやすくなるように
|
||||
- Enhance: プロフィールへのリンクをユーザーポップアップのアバターに追加
|
||||
- Enhance: ユーザーのノート、フォロー、フォロワーページへのリンクをユーザーポップアップに追加
|
||||
- Enhance: プッシュ通知を行うための権限確認をより確実に行うように
|
||||
- Enhance: 投稿フォームのチュートリアルを追加
|
||||
- Enhance: 「自動でもっと見る」をほとんどの箇所で利用可能に
|
||||
- Enhance: アンテナ・リスト設定画面とタイムラインの動線を改善
|
||||
- アンテナ・リスト一覧画面の項目を選択すると、設定画面ではなくタイムラインに移動するようになりました
|
||||
- アンテナ・リストの設定画面の右上にタイムラインに移動するボタンを追加しました
|
||||
- Fix: 紙吹雪エフェクトがアニメーション設定を考慮せず常に表示される問題を修正
|
||||
- Fix: ナビゲーションバーのリアルタイムモード切替ボタンの状態をよりわかりやすく表示するように
|
||||
- Fix: ページのタイトルが長いとき、はみ出る問題を修正
|
||||
- Fix: 投稿フォームのアバターが正しく表示されない問題を修正 #16789
|
||||
- FIx: カスタム絵文字(β)画面で変更行が正しくハイライトされない問題を修正 #16626
|
||||
|
||||
### Server
|
||||
- Enhance: Remote Notes Cleaningが複雑度が高いノートの処理を中断せずに次のノートから再開するように
|
||||
- Fix: チャンネルの説明欄の最小文字数制約を除去
|
||||
|
||||
## 2025.10.2
|
||||
|
||||
### Client
|
||||
- Fix: アプリ内からキャッシュをクリアするとテーマ再適用するまでレンダリングが正しく行われない問題を修正
|
||||
- Fix: 期限が無期限のアンケートに投票できない問題を修正
|
||||
|
||||
## 2025.10.1
|
||||
|
||||
### General
|
||||
- Enhance: リモートユーザーに付与したロールバッジを表示できるように(オプトイン)
|
||||
パフォーマンス上の問題からデフォルトで無効化されています。「コントロールパネル > パフォーマンス」から有効化できます。
|
||||
- 依存関係の更新
|
||||
|
||||
### Client
|
||||
- Enhance: デッキのメインカラムのヘッダをクリックしてページ上部/下部にスクロールできるように
|
||||
- Enhance: 下書き/予約投稿一覧は投稿フォームのアカウントメニュー内に移動し、下書き保存は「...」メニュー内に移動されました
|
||||
- Fix: カスタム絵文字画面(beta)のaliasesで使用される区切り文字が一致していないのを修正 #15614
|
||||
- Fix: バナー画像の幅が表示領域と一致していない問題を修正
|
||||
- Fix: 一部のブラウザでバナー画像が上下中央に表示されない問題を修正
|
||||
- Fix: ナビゲーションバーの設定で削除した項目をその場で再追加できない問題を修正
|
||||
- Fix: ロールポリシーによりダイレクトメッセージが無効化されている際のデッキのダイレクトメッセージカラムの挙動を改善
|
||||
- Fix: 画像のマスクでタッチ操作が不安定な問題を修正
|
||||
- Fix: ウォーターマークの各種挙動修正
|
||||
- ウォーターマークを回転させると歪む問題を修正
|
||||
- ウォーターマークを敷き詰めると上下左右反転した画像/文字が表示される問題を修正
|
||||
- ウォーターマークを回転させた際に画面からはみ出た部分を考慮できるように
|
||||
- Fix: 投票が終了した後に投票結果が正しく表示されない問題を修正
|
||||
- Fix: ダークモードの同期が機能しない場合がある問題を修正
|
||||
- Fix: iOSで動画の圧縮を行うと音声トラックが失われる問題を修正
|
||||
|
||||
### Server
|
||||
- Enhance: 管理者/モデレーターはファイルのアップロード制限をバイパスするように
|
||||
- Enhance: セキュリティの向上
|
||||
|
||||
## 2025.10.0
|
||||
|
||||
### NOTE
|
||||
- pnpm 10.16.0 が必要です
|
||||
- ロールのインポート機能の利用可否ポリシーのデフォルト値が「いいえ」に変わったため、デフォルトから変更していないサーバーでは適宜設定を変更してください。
|
||||
- ロールのアップロード可能なファイル種別ポリシーのデフォルト値に「text/*」が追加されたため、デフォルトから変更していないサーバーでは適宜設定を変更してください。
|
||||
|
||||
### General
|
||||
- Feat: 予約投稿ができるようになりました
|
||||
- デフォルトで作成可能数は1になっています。適宜ロールのポリシーで設定を行ってください。
|
||||
- Enhance: 広告ごとにセンシティブフラグを設定できるようになりました
|
||||
- Enhance: 依存関係の更新
|
||||
- Enhance: 翻訳の更新
|
||||
|
||||
### Client
|
||||
- Feat: アカウントのQRコードを表示・読み取りできるようになりました
|
||||
- Feat: 動画を圧縮してアップロードできるようになりました
|
||||
- Feat: (実験的) ブラウザ上でノートの翻訳を行えるように
|
||||
- Enhance: チャットの日本語名称がダイレクトメッセージに戻るとともに、ベータ版機能ではなくなりました
|
||||
- Enhance: 画像編集にマスクエフェクト(塗りつぶし、ぼかし、モザイク)を追加
|
||||
- Enhance: 画像編集の集中線エフェクトを強化
|
||||
- Enhance: ウォーターマークにアカウントのQRコードを追加できるように
|
||||
- Enhance: テーマをドラッグ&ドロップできるように
|
||||
- Enhance: 絵文字ピッカーのサイズをより大きくできるように
|
||||
- Enhance: カスタム絵文字が多い場合にサーバーの絵文字一覧ページがフリーズしないように
|
||||
- Enhance: 時刻計算のための基準値を一か所で管理するようにし、パフォーマンスを向上
|
||||
- Enhance: 「お問い合わせ」ページから、バグの調査等に役立つ情報(OSやブラウザのバージョン等)を取得・コピーできるように
|
||||
- Fix: iOSで、デバイスがダークモードだと初回読み込み時にエラーになる問題を修正
|
||||
- Fix: アクティビティウィジェットのグラフモードが動作しない問題を修正
|
||||
- Fix: ユニコード絵文字の追加辞書をインストールするとユニコード絵文字が絵文字ピッカーで検索できなくなる絵文字があるバグを修正
|
||||
|
||||
### Server
|
||||
- Enhance: ユーザーIPを確実に取得できるために設定ファイルにFastifyOptions.trustProxyを追加しました
|
||||
|
||||
## 2025.9.0
|
||||
|
||||
### Client
|
||||
@@ -5,6 +161,7 @@
|
||||
- Enhance: /flushページでサイトキャッシュをクリアできるようになりました
|
||||
- Enhance: クリップ/リスト/アンテナ/ロール追加系メニュー項目において、表示件数を拡張
|
||||
- Enhance: 「キャッシュを削除」ボタンでブラウザの内部キャッシュの削除も行えるように
|
||||
- Enhance: Ctrlキー(Commandキー)を押下しながらリンクをクリックすると新しいタブで開くように
|
||||
- Fix: プッシュ通知を有効にできない問題を修正
|
||||
- Fix: RSSティッカーウィジェットが正しく動作しない問題を修正
|
||||
- Fix: プロファイルを復元後アカウントの切り替えができない問題を修正
|
||||
|
||||
@@ -24,6 +24,7 @@ COPY --link ["packages/frontend-shared/package.json", "./packages/frontend-share
|
||||
COPY --link ["packages/frontend/package.json", "./packages/frontend/"]
|
||||
COPY --link ["packages/frontend-embed/package.json", "./packages/frontend-embed/"]
|
||||
COPY --link ["packages/frontend-builder/package.json", "./packages/frontend-builder/"]
|
||||
COPY --link ["packages/i18n/package.json", "./packages/i18n/"]
|
||||
COPY --link ["packages/icons-subsetter/package.json", "./packages/icons-subsetter/"]
|
||||
COPY --link ["packages/sw/package.json", "./packages/sw/"]
|
||||
COPY --link ["packages/misskey-js/package.json", "./packages/misskey-js/"]
|
||||
@@ -101,6 +102,7 @@ COPY --chown=misskey:misskey --from=native-builder /misskey/packages/misskey-js/
|
||||
COPY --chown=misskey:misskey --from=native-builder /misskey/packages/misskey-reversi/built ./packages/misskey-reversi/built
|
||||
COPY --chown=misskey:misskey --from=native-builder /misskey/packages/misskey-bubble-game/built ./packages/misskey-bubble-game/built
|
||||
COPY --chown=misskey:misskey --from=native-builder /misskey/packages/backend/built ./packages/backend/built
|
||||
COPY --chown=misskey:misskey --from=native-builder /misskey/packages/i18n/built ./packages/i18n/built
|
||||
COPY --chown=misskey:misskey --from=native-builder /misskey/fluent-emojis /misskey/fluent-emojis
|
||||
COPY --chown=misskey:misskey . ./
|
||||
|
||||
|
||||
@@ -24,6 +24,8 @@
|
||||
<a href="https://www.patreon.com/syuilo">
|
||||
<img src="https://custom-icon-badges.herokuapp.com/badge/become_a-patron-F96854?logoColor=F96854&style=for-the-badge&logo=patreon&labelColor=363B40" alt="become a patron"/></a>
|
||||
|
||||
[](https://deepwiki.com/misskey-dev/misskey)
|
||||
|
||||
</div>
|
||||
|
||||
## Thanks
|
||||
|
||||
@@ -6,7 +6,7 @@ Also, the later tasks are more indefinite and are subject to change as developme
|
||||
This is the phase we are at now. We need to make a high-maintenance environment that can withstand future development.
|
||||
|
||||
- ~~Make the number of type errors zero (backend)~~ → Done ✔️
|
||||
- Make the number of type errors zero (frontend)
|
||||
- ~~Make the number of type errors zero (frontend)~~ → Done ✔️
|
||||
- Improve CI
|
||||
- ~~Fix tests~~ → Done ✔️
|
||||
- Fix random test failures - https://github.com/misskey-dev/misskey/issues/7985 and https://github.com/misskey-dev/misskey/issues/7986
|
||||
|
||||
@@ -27,7 +27,7 @@ spec:
|
||||
ports:
|
||||
- containerPort: 3000
|
||||
- name: postgres
|
||||
image: postgres:15-alpine
|
||||
image: postgres:18-alpine
|
||||
env:
|
||||
- name: POSTGRES_USER
|
||||
value: "example-misskey-user"
|
||||
|
||||
@@ -15,7 +15,7 @@ services:
|
||||
|
||||
db:
|
||||
restart: always
|
||||
image: postgres:15-alpine
|
||||
image: postgres:18-alpine
|
||||
ports:
|
||||
- "5432:5432"
|
||||
env_file:
|
||||
|
||||
@@ -37,7 +37,7 @@ services:
|
||||
|
||||
db:
|
||||
restart: always
|
||||
image: postgres:15-alpine
|
||||
image: postgres:18-alpine
|
||||
networks:
|
||||
- internal_network
|
||||
env_file:
|
||||
|
||||
232
idea/MkAnimatedBg.dotted-ripples.vue
Normal file
232
idea/MkAnimatedBg.dotted-ripples.vue
Normal file
@@ -0,0 +1,232 @@
|
||||
<!--
|
||||
SPDX-FileCopyrightText: syuilo and misskey-project
|
||||
SPDX-License-Identifier: AGPL-3.0-only
|
||||
-->
|
||||
|
||||
<template>
|
||||
<canvas ref="canvasEl" style="display: block; width: 100%; height: 100%; pointer-events: none;"></canvas>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { onMounted, onUnmounted, useTemplateRef } from 'vue';
|
||||
import isChromatic from 'chromatic/isChromatic';
|
||||
import { initShaderProgram } from '@/utility/webgl.js';
|
||||
|
||||
const VERTEX_SHADER = `#version 300 es
|
||||
in vec2 position;
|
||||
out vec2 in_uv;
|
||||
|
||||
void main() {
|
||||
in_uv = (position + 1.0) / 2.0;
|
||||
gl_Position = vec4(position, 0.0, 1.0);
|
||||
}
|
||||
`;
|
||||
|
||||
const FRAGMENT_SHADER = `#version 300 es
|
||||
precision mediump float;
|
||||
|
||||
const float PI = 3.141592653589793;
|
||||
const float TWO_PI = 6.283185307179586;
|
||||
const float HALF_PI = 1.5707963267948966;
|
||||
|
||||
in vec2 in_uv;
|
||||
uniform vec2 in_resolution;
|
||||
uniform float u_scale;
|
||||
uniform float u_time;
|
||||
uniform float u_seed;
|
||||
uniform float u_angle;
|
||||
uniform float u_radius;
|
||||
uniform vec3 u_color;
|
||||
uniform vec2 u_ripplePositions[16];
|
||||
uniform float u_rippleRadiuses[16];
|
||||
out vec4 out_color;
|
||||
|
||||
float getRipple(vec2 uv) {
|
||||
float strength = 0.0;
|
||||
float thickness = 0.05;
|
||||
for (int i = 0; i < 16; i++) {
|
||||
if (u_rippleRadiuses[i] <= 0.0) continue;
|
||||
|
||||
float d = distance(uv, u_ripplePositions[i]);
|
||||
|
||||
// フチ
|
||||
if (d < u_rippleRadiuses[i] + thickness && d > u_rippleRadiuses[i] - thickness) {
|
||||
float gradate = abs(d - u_rippleRadiuses[i] + thickness) / thickness;
|
||||
strength += (1.0 - u_rippleRadiuses[i]) * gradate;
|
||||
}
|
||||
|
||||
// 内側
|
||||
if (d < u_rippleRadiuses[i] + thickness) {
|
||||
strength += 0.25 * (1.0 - u_rippleRadiuses[i]);
|
||||
}
|
||||
}
|
||||
return strength;
|
||||
}
|
||||
|
||||
void main() {
|
||||
float x_ratio = min(in_resolution.x / in_resolution.y, 1.0);
|
||||
float y_ratio = min(in_resolution.y / in_resolution.x, 1.0);
|
||||
|
||||
float angle = -(u_angle * PI);
|
||||
vec2 centeredUv = (in_uv - vec2(0.5, 0.5)) * vec2(x_ratio, y_ratio);
|
||||
vec2 rotatedUV = vec2(
|
||||
centeredUv.x * cos(angle) - centeredUv.y * sin(angle),
|
||||
centeredUv.x * sin(angle) + centeredUv.y * cos(angle)
|
||||
);
|
||||
vec2 uv = rotatedUV;
|
||||
|
||||
float time = u_time * 0.00025;
|
||||
|
||||
float size = 1.0 / u_scale;
|
||||
float size_half = size / 2.0;
|
||||
float modX = mod(uv.x, size);
|
||||
float modY = mod(uv.y, size);
|
||||
|
||||
vec2 pixelated_uv = vec2(
|
||||
(size * (floor((uv.x - 0.5 - size) / size) + 0.5)),
|
||||
(size * (floor((uv.y - 0.5 - size) / size) + 0.5))
|
||||
) + vec2(0.5 + size, 0.5 + size);
|
||||
|
||||
float strength = getRipple(pixelated_uv);
|
||||
|
||||
float opacity = min(max(strength, 0.0), 1.0);
|
||||
|
||||
float threshold = ((u_radius / 2.0) / u_scale);
|
||||
if (length(vec2(modX - size_half, modY - size_half)) < threshold) {
|
||||
out_color = vec4(u_color.r, u_color.g, u_color.b, opacity);
|
||||
//out_color = vec4(1.0);
|
||||
return;
|
||||
}
|
||||
|
||||
// debug
|
||||
//float a = min(max(getRipple(uv), 0.0), 1.0);
|
||||
//out_color = vec4(u_color.r, u_color.g, u_color.b, (opacity + a) / 2.0);
|
||||
|
||||
out_color = vec4(0.0, 0.0, 0.0, 0.0);
|
||||
}
|
||||
`;
|
||||
|
||||
const canvasEl = useTemplateRef('canvasEl');
|
||||
|
||||
const props = withDefaults(defineProps<{
|
||||
scale?: number;
|
||||
}>(), {
|
||||
scale: 48,
|
||||
});
|
||||
|
||||
let handle: ReturnType<typeof window['requestAnimationFrame']> | null = null;
|
||||
|
||||
onMounted(() => {
|
||||
const canvas = canvasEl.value!;
|
||||
let width = canvas.offsetWidth;
|
||||
let height = canvas.offsetHeight;
|
||||
canvas.width = width;
|
||||
canvas.height = height;
|
||||
|
||||
const maybeGl = canvas.getContext('webgl2', { preserveDrawingBuffer: false, alpha: true, premultipliedAlpha: false, antialias: true });
|
||||
if (maybeGl == null) return;
|
||||
|
||||
const gl = maybeGl;
|
||||
|
||||
const VERTICES = new Float32Array([-1, -1, -1, 1, 1, 1, -1, -1, 1, 1, 1, -1]);
|
||||
const vertexBuffer = gl.createBuffer();
|
||||
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
|
||||
gl.bufferData(gl.ARRAY_BUFFER, VERTICES, gl.STATIC_DRAW);
|
||||
|
||||
//gl.clearColor(0.0, 0.0, 0.0, 0.0);
|
||||
//gl.clear(gl.COLOR_BUFFER_BIT);
|
||||
|
||||
const shaderProgram = initShaderProgram(gl, VERTEX_SHADER, FRAGMENT_SHADER);
|
||||
|
||||
gl.useProgram(shaderProgram);
|
||||
|
||||
const positionLocation = gl.getAttribLocation(shaderProgram, 'position');
|
||||
gl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0);
|
||||
gl.enableVertexAttribArray(positionLocation);
|
||||
|
||||
const in_resolution = gl.getUniformLocation(shaderProgram, 'in_resolution');
|
||||
gl.uniform2fv(in_resolution, [canvas.width, canvas.height]);
|
||||
|
||||
const u_time = gl.getUniformLocation(shaderProgram, 'u_time');
|
||||
const u_seed = gl.getUniformLocation(shaderProgram, 'u_seed');
|
||||
const u_scale = gl.getUniformLocation(shaderProgram, 'u_scale');
|
||||
const u_angle = gl.getUniformLocation(shaderProgram, 'u_angle');
|
||||
const u_radius = gl.getUniformLocation(shaderProgram, 'u_radius');
|
||||
const u_color = gl.getUniformLocation(shaderProgram, 'u_color');
|
||||
gl.uniform1f(u_seed, Math.random() * 1000);
|
||||
gl.uniform1f(u_scale, props.scale);
|
||||
gl.uniform1f(u_angle, 0.0);
|
||||
gl.uniform1f(u_radius, 0.15);
|
||||
gl.uniform3fv(u_color, [0.5, 1.0, 0]);
|
||||
|
||||
if (isChromatic()) {
|
||||
gl.uniform1f(u_time, 0);
|
||||
gl.drawArrays(gl.TRIANGLES, 0, 6);
|
||||
} else {
|
||||
let ripples = [] as { position: [number, number]; startTime: number; }[];
|
||||
const LIFE_TIME = 1000 * 4;
|
||||
|
||||
function render(timeStamp: number) {
|
||||
let sizeChanged = false;
|
||||
if (Math.abs(height - canvas.offsetHeight) > 2) {
|
||||
height = canvas.offsetHeight;
|
||||
canvas.height = height;
|
||||
sizeChanged = true;
|
||||
}
|
||||
if (Math.abs(width - canvas.offsetWidth) > 2) {
|
||||
width = canvas.offsetWidth;
|
||||
canvas.width = width;
|
||||
sizeChanged = true;
|
||||
}
|
||||
if (sizeChanged && gl) {
|
||||
gl.uniform2fv(in_resolution, [width, height]);
|
||||
gl.viewport(0, 0, width, height);
|
||||
}
|
||||
|
||||
gl.uniform1f(u_time, timeStamp);
|
||||
|
||||
if (Math.random() < 0.01 && ripples.length < 16) {
|
||||
ripples.push({ position: [(Math.random() * 2) - 1, (Math.random() * 2) - 1], startTime: timeStamp });
|
||||
}
|
||||
|
||||
for (let i = 0; i < 16; i++) {
|
||||
const o = gl.getUniformLocation(shaderProgram, `u_ripplePositions[${i.toString()}]`);
|
||||
const r = gl.getUniformLocation(shaderProgram, `u_rippleRadiuses[${i.toString()}]`);
|
||||
const ripple = ripples[i];
|
||||
if (ripple == null) {
|
||||
gl.uniform2f(o, 0, 0);
|
||||
gl.uniform1f(r, 0.0);
|
||||
continue;
|
||||
}
|
||||
|
||||
const delta = timeStamp - ripple.startTime;
|
||||
|
||||
gl.uniform2f(o, ripple.position[0], ripple.position[1]);
|
||||
gl.uniform1f(r, delta / LIFE_TIME);
|
||||
}
|
||||
|
||||
ripples = ripples.filter(r => (timeStamp - r.startTime) < LIFE_TIME);
|
||||
if (ripples.length === 0) {
|
||||
ripples.push({ position: [(Math.random() * 2) - 1, (Math.random() * 2) - 1], startTime: timeStamp });
|
||||
}
|
||||
|
||||
gl.drawArrays(gl.TRIANGLES, 0, 6);
|
||||
|
||||
handle = window.requestAnimationFrame(render);
|
||||
}
|
||||
|
||||
handle = window.requestAnimationFrame(render);
|
||||
}
|
||||
});
|
||||
|
||||
onUnmounted(() => {
|
||||
if (handle) {
|
||||
window.cancelAnimationFrame(handle);
|
||||
}
|
||||
|
||||
// TODO: WebGLリソースの解放
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss" module>
|
||||
</style>
|
||||
190
idea/MkAnimatedBg.dotted.vue
Normal file
190
idea/MkAnimatedBg.dotted.vue
Normal file
@@ -0,0 +1,190 @@
|
||||
<!--
|
||||
SPDX-FileCopyrightText: syuilo and misskey-project
|
||||
SPDX-License-Identifier: AGPL-3.0-only
|
||||
-->
|
||||
|
||||
<template>
|
||||
<canvas ref="canvasEl" style="display: block; width: 100%; height: 100%; pointer-events: none;"></canvas>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { onMounted, onUnmounted, useTemplateRef } from 'vue';
|
||||
import isChromatic from 'chromatic/isChromatic';
|
||||
import { GLSL_LIB_SNOISE, initShaderProgram } from '@/utility/webgl.js';
|
||||
|
||||
const VERTEX_SHADER = `#version 300 es
|
||||
in vec2 position;
|
||||
out vec2 in_uv;
|
||||
|
||||
void main() {
|
||||
in_uv = (position + 1.0) / 2.0;
|
||||
gl_Position = vec4(position, 0.0, 1.0);
|
||||
}
|
||||
`;
|
||||
|
||||
const FRAGMENT_SHADER = `#version 300 es
|
||||
precision mediump float;
|
||||
|
||||
const float PI = 3.141592653589793;
|
||||
const float TWO_PI = 6.283185307179586;
|
||||
const float HALF_PI = 1.5707963267948966;
|
||||
|
||||
${GLSL_LIB_SNOISE}
|
||||
|
||||
in vec2 in_uv;
|
||||
uniform vec2 in_resolution;
|
||||
uniform float u_scale;
|
||||
uniform float u_time;
|
||||
uniform float u_seed;
|
||||
uniform float u_angle;
|
||||
uniform float u_radius;
|
||||
uniform vec3 u_color;
|
||||
out vec4 out_color;
|
||||
|
||||
void main() {
|
||||
float x_ratio = min(in_resolution.x / in_resolution.y, 1.0);
|
||||
float y_ratio = min(in_resolution.y / in_resolution.x, 1.0);
|
||||
|
||||
float size = 1.0 / u_scale;
|
||||
float size_half = size / 2.0;
|
||||
|
||||
float angle = -(u_angle * PI);
|
||||
vec2 centeredUv = (in_uv - vec2(0.5, 0.5)) * vec2(x_ratio, y_ratio);
|
||||
vec2 rotatedUV = vec2(
|
||||
centeredUv.x * cos(angle) - centeredUv.y * sin(angle),
|
||||
centeredUv.x * sin(angle) + centeredUv.y * cos(angle)
|
||||
);
|
||||
vec2 uv = rotatedUV;
|
||||
|
||||
float modX = mod(uv.x, size);
|
||||
float modY = mod(uv.y, size);
|
||||
|
||||
vec2 pixelated_uv = vec2(
|
||||
(size * (floor((uv.x - 0.5 - size) / size) + 0.5)),
|
||||
(size * (floor((uv.y - 0.5 - size) / size) + 0.5))
|
||||
) + vec2(0.5 + size, 0.5 + size);
|
||||
|
||||
float time = u_time * 0.00025;
|
||||
|
||||
float noiseAScale = 1.0;
|
||||
float noiseAX = (pixelated_uv.x + u_seed) * (u_scale / noiseAScale);
|
||||
float noiseAY = (pixelated_uv.y + u_seed) * (u_scale / noiseAScale);
|
||||
float noiseA = snoise(vec3(noiseAX, noiseAY, time * 2.0));
|
||||
|
||||
float noiseBScale = 32.0;
|
||||
float noiseBX = (pixelated_uv.x + u_seed) * (u_scale / noiseBScale);
|
||||
float noiseBY = (pixelated_uv.y + u_seed) * (u_scale / noiseBScale);
|
||||
float noiseB = snoise(vec3(noiseBX, noiseBY, time));
|
||||
|
||||
float strength = 0.0;
|
||||
strength += noiseA * 0.2;
|
||||
strength += noiseB * 0.8;
|
||||
|
||||
float opacity = min(max(strength, 0.0), 1.0);
|
||||
|
||||
float threshold = ((u_radius / 2.0) / u_scale);
|
||||
if (length(vec2(modX - size_half, modY - size_half)) < threshold) {
|
||||
out_color = vec4(u_color.r, u_color.g, u_color.b, opacity);
|
||||
return;
|
||||
}
|
||||
|
||||
out_color = vec4(0.0, 0.0, 0.0, 0.0);
|
||||
}
|
||||
`;
|
||||
|
||||
const canvasEl = useTemplateRef('canvasEl');
|
||||
|
||||
const props = withDefaults(defineProps<{
|
||||
scale?: number;
|
||||
}>(), {
|
||||
scale: 48,
|
||||
});
|
||||
|
||||
let handle: ReturnType<typeof window['requestAnimationFrame']> | null = null;
|
||||
|
||||
onMounted(() => {
|
||||
const canvas = canvasEl.value!;
|
||||
let width = canvas.offsetWidth;
|
||||
let height = canvas.offsetHeight;
|
||||
canvas.width = width;
|
||||
canvas.height = height;
|
||||
|
||||
const maybeGl = canvas.getContext('webgl2', { preserveDrawingBuffer: false, alpha: true, premultipliedAlpha: false, antialias: true });
|
||||
if (maybeGl == null) return;
|
||||
|
||||
const gl = maybeGl;
|
||||
|
||||
const VERTICES = new Float32Array([-1, -1, -1, 1, 1, 1, -1, -1, 1, 1, 1, -1]);
|
||||
const vertexBuffer = gl.createBuffer();
|
||||
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
|
||||
gl.bufferData(gl.ARRAY_BUFFER, VERTICES, gl.STATIC_DRAW);
|
||||
|
||||
//gl.clearColor(0.0, 0.0, 0.0, 0.0);
|
||||
//gl.clear(gl.COLOR_BUFFER_BIT);
|
||||
|
||||
const shaderProgram = initShaderProgram(gl, VERTEX_SHADER, FRAGMENT_SHADER);
|
||||
|
||||
gl.useProgram(shaderProgram);
|
||||
|
||||
const positionLocation = gl.getAttribLocation(shaderProgram, 'position');
|
||||
gl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0);
|
||||
gl.enableVertexAttribArray(positionLocation);
|
||||
|
||||
const in_resolution = gl.getUniformLocation(shaderProgram, 'in_resolution');
|
||||
gl.uniform2fv(in_resolution, [canvas.width, canvas.height]);
|
||||
|
||||
const u_time = gl.getUniformLocation(shaderProgram, 'u_time');
|
||||
const u_seed = gl.getUniformLocation(shaderProgram, 'u_seed');
|
||||
const u_scale = gl.getUniformLocation(shaderProgram, 'u_scale');
|
||||
const u_angle = gl.getUniformLocation(shaderProgram, 'u_angle');
|
||||
const u_radius = gl.getUniformLocation(shaderProgram, 'u_radius');
|
||||
const u_color = gl.getUniformLocation(shaderProgram, 'u_color');
|
||||
gl.uniform1f(u_seed, Math.random() * 1000);
|
||||
gl.uniform1f(u_scale, props.scale);
|
||||
gl.uniform1f(u_angle, 0.0);
|
||||
gl.uniform1f(u_radius, 0.15);
|
||||
gl.uniform3fv(u_color, [0.5, 1.0, 0]);
|
||||
|
||||
if (isChromatic()) {
|
||||
gl.uniform1f(u_time, 0);
|
||||
gl.drawArrays(gl.TRIANGLES, 0, 6);
|
||||
} else {
|
||||
function render(timeStamp: number) {
|
||||
let sizeChanged = false;
|
||||
if (Math.abs(height - canvas.offsetHeight) > 2) {
|
||||
height = canvas.offsetHeight;
|
||||
canvas.height = height;
|
||||
sizeChanged = true;
|
||||
}
|
||||
if (Math.abs(width - canvas.offsetWidth) > 2) {
|
||||
width = canvas.offsetWidth;
|
||||
canvas.width = width;
|
||||
sizeChanged = true;
|
||||
}
|
||||
if (sizeChanged && gl) {
|
||||
gl.uniform2fv(in_resolution, [width, height]);
|
||||
gl.viewport(0, 0, width, height);
|
||||
}
|
||||
|
||||
gl.uniform1f(u_time, timeStamp);
|
||||
|
||||
gl.drawArrays(gl.TRIANGLES, 0, 6);
|
||||
|
||||
handle = window.requestAnimationFrame(render);
|
||||
}
|
||||
|
||||
handle = window.requestAnimationFrame(render);
|
||||
}
|
||||
});
|
||||
|
||||
onUnmounted(() => {
|
||||
if (handle) {
|
||||
window.cancelAnimationFrame(handle);
|
||||
}
|
||||
|
||||
// TODO: WebGLリソースの解放
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss" module>
|
||||
</style>
|
||||
@@ -1010,6 +1010,15 @@ postForm: "أنشئ ملاحظة"
|
||||
information: "عن"
|
||||
inMinutes: "د"
|
||||
inDays: "ي"
|
||||
widgets: "التطبيقات المُصغّرة"
|
||||
presets: "إعدادات مسبقة"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
filename: "اسم الملف"
|
||||
_imageFrameEditor:
|
||||
font: "الخط"
|
||||
fontSerif: "Serif"
|
||||
fontSansSerif: "Sans Serif"
|
||||
_chat:
|
||||
invitations: "دعوة"
|
||||
noHistory: "السجل فارغ"
|
||||
@@ -1396,6 +1405,9 @@ _postForm:
|
||||
replyPlaceholder: "رد على هذه الملاحظة…"
|
||||
quotePlaceholder: "اقتبس هذه الملاحظة…"
|
||||
channelPlaceholder: "انشر في قناة..."
|
||||
_howToUse:
|
||||
visibility_title: "الظهور"
|
||||
menu_title: "القائمة"
|
||||
_placeholders:
|
||||
a: "ما الذي تنوي فعله؟"
|
||||
b: "ماذا يحدث حولك ؟"
|
||||
@@ -1603,5 +1615,9 @@ _imageEffector:
|
||||
_fxProps:
|
||||
scale: "الحجم"
|
||||
size: "الحجم"
|
||||
offset: "الموضع"
|
||||
color: "اللون"
|
||||
opacity: "الشفافية"
|
||||
_qr:
|
||||
showTabTitle: "المظهر"
|
||||
raw: "نص"
|
||||
|
||||
@@ -850,6 +850,15 @@ postForm: "নোট লিখুন"
|
||||
information: "আপনার সম্পর্কে"
|
||||
inMinutes: "মিনিট"
|
||||
inDays: "দিন"
|
||||
widgets: "উইজেটগুলি"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
filename: "ফাইলের নাম"
|
||||
_imageFrameEditor:
|
||||
header: "হেডার"
|
||||
font: "ফন্ট"
|
||||
fontSerif: "সেরিফ"
|
||||
fontSansSerif: "স্যান্স সেরিফ"
|
||||
_chat:
|
||||
invitations: "আমন্ত্রণ"
|
||||
noHistory: "কোনো ইতিহাস নেই"
|
||||
@@ -1168,6 +1177,9 @@ _postForm:
|
||||
replyPlaceholder: "নোটটির জবাব দিন..."
|
||||
quotePlaceholder: "নোটটিকে উদ্ধৃত করুন..."
|
||||
channelPlaceholder: "চ্যানেলে পোস্ট করুন..."
|
||||
_howToUse:
|
||||
visibility_title: "দৃশ্যমানতা"
|
||||
menu_title: "মেনু"
|
||||
_placeholders:
|
||||
a: "আপনি এখন কি করছেন?"
|
||||
b: "আপনার আশে পাশে কি হচ্ছে?"
|
||||
@@ -1364,3 +1376,6 @@ _imageEffector:
|
||||
color: "রং"
|
||||
opacity: "অস্বচ্ছতা"
|
||||
lightness: "উজ্জ্বল করুন"
|
||||
_qr:
|
||||
showTabTitle: "প্রদর্শন"
|
||||
raw: "লেখা"
|
||||
|
||||
@@ -83,6 +83,8 @@ files: "Fitxers"
|
||||
download: "Descarregar"
|
||||
driveFileDeleteConfirm: "Estàs segur que vols suprimir el fitxer \"{name}\"? Les notes associades a aquest fitxer també seran esborrades."
|
||||
unfollowConfirm: "Segur que vols deixar de seguir a {name}?"
|
||||
cancelFollowRequestConfirm: "Vols cancel·lar la teva sol·licitud de seguiment a {name}?"
|
||||
rejectFollowRequestConfirm: "Vols rebutjar la sol·licitud de seguiment de {name}?"
|
||||
exportRequested: "Has sol·licitat una exportació de dades. Això pot trigar una estona. S'afegirà a la teva unitat de disc un cop estigui completada."
|
||||
importRequested: "Has sol·licitat una importació de dades. Això pot trigar una estona."
|
||||
lists: "Llistes"
|
||||
@@ -253,6 +255,7 @@ noteDeleteConfirm: "Segur que voleu eliminar aquesta publicació?"
|
||||
pinLimitExceeded: "No podeu fixar més publicacions"
|
||||
done: "Fet"
|
||||
processing: "S'està processant..."
|
||||
preprocessing: "Preparant"
|
||||
preview: "Vista prèvia"
|
||||
default: "Per defecte"
|
||||
defaultValueIs: "Per defecte: {value}"
|
||||
@@ -301,6 +304,7 @@ uploadFromUrlMayTakeTime: "La càrrega des de l'enllaç pot trigar un temps"
|
||||
uploadNFiles: "Pujar {n} arxius"
|
||||
explore: "Explora"
|
||||
messageRead: "Vist"
|
||||
readAllChatMessages: "Marcar tots els missatges com a llegits"
|
||||
noMoreHistory: "No hi ha res més per veure"
|
||||
startChat: "Comença a xatejar "
|
||||
nUsersRead: "Vist per {n}"
|
||||
@@ -333,6 +337,7 @@ fileName: "Nom del Fitxer"
|
||||
selectFile: "Selecciona un fitxer"
|
||||
selectFiles: "Selecciona fitxers"
|
||||
selectFolder: "Selecció de carpeta"
|
||||
unselectFolder: "Deixa de seleccionar la carpeta"
|
||||
selectFolders: "Selecció de carpetes"
|
||||
fileNotSelected: "Cap fitxer seleccionat"
|
||||
renameFile: "Canvia el nom del fitxer"
|
||||
@@ -345,6 +350,7 @@ addFile: "Afegeix un fitxer"
|
||||
showFile: "Mostrar fitxer"
|
||||
emptyDrive: "El teu Disc és buit"
|
||||
emptyFolder: "La carpeta està buida"
|
||||
dropHereToUpload: "Arrossega els arxius fins aquí per pujar-los al servidor"
|
||||
unableToDelete: "No es pot eliminar"
|
||||
inputNewFileName: "Introduïu el nom de fitxer nou"
|
||||
inputNewDescription: "Escriu el peu de foto."
|
||||
@@ -648,7 +654,7 @@ disablePlayer: "Tanca el reproductor de vídeo"
|
||||
expandTweet: "Expandir post"
|
||||
themeEditor: "Editor de temes"
|
||||
description: "Descripció"
|
||||
describeFile: "Afegeix una descripció "
|
||||
describeFile: "Afegir text alternatiu"
|
||||
enterFileDescription: "Escriu un peu de foto"
|
||||
author: "Autor"
|
||||
leaveConfirm: "Hi ha canvis sense guardar. Els vols descartar?"
|
||||
@@ -772,6 +778,7 @@ lockedAccountInfo: "Tret que establiu la visibilitat de la nota a \"Només segui
|
||||
alwaysMarkSensitive: "Marcar com a sensible per defecte"
|
||||
loadRawImages: "Carregar les imatges originals en comptes de miniatures "
|
||||
disableShowingAnimatedImages: "No reproduir imatges animades"
|
||||
disableShowingAnimatedImages_caption: "Si les imatges animades no es reprodueixen, independentment d'aquesta configuració, és possible que la configuració d'accessibilitat del navegador i el sistema operatiu, els modes d'estalvi d'energia i similars estiguin interferint."
|
||||
highlightSensitiveMedia: "Ressalta els medis marcats com a sensibles"
|
||||
verificationEmailSent: "S'ha enviat un correu electrònic de verificació. Fes clic a l'enllaç per completar la verificació."
|
||||
notSet: "Sense definir"
|
||||
@@ -1018,6 +1025,9 @@ pushNotificationAlreadySubscribed: "L'enviament de notificacions ja és activat"
|
||||
pushNotificationNotSupported: "El teu navegador o la teva instància no suporta l'enviament de notificacions "
|
||||
sendPushNotificationReadMessage: "Esborrar les notificacions enviades quan s'hagin llegit"
|
||||
sendPushNotificationReadMessageCaption: "Això pot fer que el teu dispositiu consumeixi més bateria"
|
||||
pleaseAllowPushNotification: "Si us plau, permet les notificacions del navegador"
|
||||
browserPushNotificationDisabled: "No s'ha pogut obtenir permisos per les notificacions"
|
||||
browserPushNotificationDisabledDescription: "No tens permisos per enviar notificacions des de {serverName}. Activa les notificacions a la configuració del teu navegador i tornar-ho a intentar."
|
||||
windowMaximize: "Maximitzar "
|
||||
windowMinimize: "Minimitzar"
|
||||
windowRestore: "Restaurar"
|
||||
@@ -1168,6 +1178,7 @@ installed: "Instal·lats "
|
||||
branding: "Marca"
|
||||
enableServerMachineStats: "Publicar estadístiques del maquinari del servidor"
|
||||
enableIdenticonGeneration: "Activar la generació d'icones d'identificació "
|
||||
showRoleBadgesOfRemoteUsers: "Mostrar insígnies de rols d'instàncies remotes "
|
||||
turnOffToImprovePerformance: "Desactivant aquesta opció es pot millorar el rendiment."
|
||||
createInviteCode: "Crear codi d'invitació "
|
||||
createWithOptions: "Crear invitació amb opcions"
|
||||
@@ -1316,6 +1327,7 @@ acknowledgeNotesAndEnable: "Activa'l després de comprendre els possibles perill
|
||||
federationSpecified: "Aquest servidor treballa amb una federació de llistes blanques. No pot interactuar amb altres servidors que no siguin els especificats per l'administrador."
|
||||
federationDisabled: "La unió es troba deshabilitada en aquest servidor. No es pot interactuar amb usuaris d'altres servidors."
|
||||
draft: "Esborrany "
|
||||
draftsAndScheduledNotes: "Esborranys i publicacions programades"
|
||||
confirmOnReact: "Confirmar en reaccionar"
|
||||
reactAreYouSure: "Vols reaccionar amb \"{emoji}\"?"
|
||||
markAsSensitiveConfirm: "Vols marcar aquest contingut com a sensible?"
|
||||
@@ -1343,6 +1355,8 @@ postForm: "Formulari de publicació"
|
||||
textCount: "Nombre de caràcters "
|
||||
information: "Informació"
|
||||
chat: "Xat"
|
||||
directMessage: "Xateja amb aquest usuari"
|
||||
directMessage_short: "Missatge"
|
||||
migrateOldSettings: "Migrar la configuració anterior"
|
||||
migrateOldSettings_description: "Normalment això es fa automàticament, però si la transició no es fa, el procés es pot iniciar manualment. S'esborrarà la configuració actual."
|
||||
compress: "Comprimir "
|
||||
@@ -1370,6 +1384,8 @@ redisplayAllTips: "Torna ha mostrat tots els trucs i consells"
|
||||
hideAllTips: "Amagar tots els trucs i consells"
|
||||
defaultImageCompressionLevel: "Nivell de comprensió de la imatge per defecte"
|
||||
defaultImageCompressionLevel_description: "Baixa, conserva la qualitat de la imatge però la mida de l'arxiu és més gran. <br>Alta, redueix la mida de l'arxiu però també la qualitat de la imatge."
|
||||
defaultCompressionLevel: "Nivell de compressió predeterminat"
|
||||
defaultCompressionLevel_description: "Si el redueixes augmentaràs la qualitat de la imatge, però la mida de l'arxiu serà més gran. <br>Si augmentes l'opció redueixes la mida de l'arxiu i la qualitat de la imatge és pitjor."
|
||||
inMinutes: "Minut(s)"
|
||||
inDays: "Di(a)(es)"
|
||||
safeModeEnabled: "Mode segur activat"
|
||||
@@ -1377,10 +1393,73 @@ pluginsAreDisabledBecauseSafeMode: "Els afegits no estan activats perquè el mod
|
||||
customCssIsDisabledBecauseSafeMode: "El CSS personalitzat no s'aplica perquè el mode segur es troba activat."
|
||||
themeIsDefaultBecauseSafeMode: "El tema predeterminat es farà servir mentre el mode segur estigui activat. Una vegada es desactivi el mode segur es restablirà el tema escollit."
|
||||
thankYouForTestingBeta: "Gràcies per ajudar-nos a provar la versió beta!"
|
||||
createUserSpecifiedNote: "Crear notes especificades per l'usuari "
|
||||
schedulePost: "Programar una nota"
|
||||
scheduleToPostOnX: "Programar una nota per {x}"
|
||||
scheduledToPostOnX: "S'ha programat la nota per {x}"
|
||||
schedule: "Programa"
|
||||
scheduled: "Programat"
|
||||
widgets: "Ginys"
|
||||
deviceInfo: "Informació del dispositiu"
|
||||
deviceInfoDescription: "En fer consultes tècniques influir la següent informació pot ajudar a resoldre'l més ràpidament."
|
||||
youAreAdmin: "Ets l'administrador "
|
||||
frame: "Marc"
|
||||
presets: "Predefinit"
|
||||
zeroPadding: "Sense omplir"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
caption: "Títol de l'arxiu"
|
||||
filename: "Nom del Fitxer"
|
||||
filename_without_ext: "Nom de l'arxiu sense extensió "
|
||||
year: "Any"
|
||||
month: "Mes"
|
||||
day: "Dia"
|
||||
hour: "Hora"
|
||||
minute: "Minut"
|
||||
second: "Segon"
|
||||
camera_model: "Nom de la càmera "
|
||||
camera_lens_model: "Nom de la lent"
|
||||
camera_mm: "Distància focal"
|
||||
camera_mm_35: "Distància focal (equivalent a 35 mm)"
|
||||
camera_f: "Obertura"
|
||||
camera_s: "Velocitat d'obturació"
|
||||
camera_iso: "Sensibilitat ISO"
|
||||
gps_lat: "Latitud "
|
||||
gps_long: "Longitud "
|
||||
_imageFrameEditor:
|
||||
title: "Edició de fotogrames "
|
||||
tip: "Pots decorar les imatges afegint etiquetes que continguin marcs i metadades."
|
||||
header: "Capçalera"
|
||||
footer: "Peu de pàgina "
|
||||
borderThickness: "Amplada de la vora"
|
||||
labelThickness: "Amplada de l'etiqueta "
|
||||
labelScale: "Mida de l'etiqueta "
|
||||
centered: "Alinea al centre"
|
||||
captionMain: "Peu de foto (gran)"
|
||||
captionSub: "Peu de foto (petit)"
|
||||
availableVariables: "Variables disponibles"
|
||||
withQrCode: "Codi QR"
|
||||
backgroundColor: "Color del fons"
|
||||
textColor: "Color del text"
|
||||
font: "Lletra tipogràfica"
|
||||
fontSerif: "Serif"
|
||||
fontSansSerif: "Sans Serif"
|
||||
quitWithoutSaveConfirm: "Sortir sense desar?"
|
||||
failedToLoadImage: "Error en carregar la imatge"
|
||||
_compression:
|
||||
_quality:
|
||||
high: "Qualitat alta"
|
||||
medium: "Qualitat mitjana"
|
||||
low: "Qualitat baixa"
|
||||
_size:
|
||||
large: "Mida gran"
|
||||
medium: "Mida mitjana"
|
||||
small: "Mida petita"
|
||||
_order:
|
||||
newest: "Més recent"
|
||||
oldest: "Antigues primer"
|
||||
_chat:
|
||||
messages: "Missatge"
|
||||
noMessagesYet: "Encara no tens missatges "
|
||||
newMessage: "Missatge nou"
|
||||
individualChat: "Xat individual "
|
||||
@@ -1469,6 +1548,8 @@ _settings:
|
||||
showUrlPreview: "Mostrar vista prèvia d'URL"
|
||||
showAvailableReactionsFirstInNote: "Mostra les reacciones que pots fer servir al damunt"
|
||||
showPageTabBarBottom: "Mostrar les pestanyes de les línies de temps a la part inferior"
|
||||
emojiPaletteBanner: "Pots registrar ajustos preestablerts com paletes perquè es mostrin permanentment al selector d'emojis, o personalitzar la configuració de visió del selector."
|
||||
enableAnimatedImages: "Activar imatges animades"
|
||||
_chat:
|
||||
showSenderName: "Mostrar el nom del remitent"
|
||||
sendOnEnter: "Introdueix per enviar"
|
||||
@@ -1477,6 +1558,8 @@ _preferencesProfile:
|
||||
profileNameDescription: "Estableix un nom que identifiqui aquest dispositiu."
|
||||
profileNameDescription2: "Per exemple: \"PC Principal\", \"Smartphone\", etc"
|
||||
manageProfiles: "Gestionar perfils"
|
||||
shareSameProfileBetweenDevicesIsNotRecommended: "No recomanem compartir el mateix perfil en diferents dispositius."
|
||||
useSyncBetweenDevicesOptionIfYouWantToSyncSetting: "Si hi ha ajustos que vols sincronitzar entre diferents dispositius activa l'opció \"Sincronitza entre diferents dispositius\" individualment per cada una de les diferents opcions."
|
||||
_preferencesBackup:
|
||||
autoBackup: "Còpia de seguretat automàtica "
|
||||
restoreFromBackup: "Restaurar des d'una còpia de seguretat"
|
||||
@@ -1486,6 +1569,7 @@ _preferencesBackup:
|
||||
youNeedToNameYourProfileToEnableAutoBackup: "Has de posar-li un nom al teu perfil per poder activar les còpies de seguretat automàtiques."
|
||||
autoPreferencesBackupIsNotEnabledForThisDevice: "La còpia de seguretat automàtica no es troba activada en aquest dispositiu."
|
||||
backupFound: "Còpia de seguretat de la configuració trobada"
|
||||
forceBackup: "Còpia de seguretat forçada de la configuració "
|
||||
_accountSettings:
|
||||
requireSigninToViewContents: "És obligatori l'inici de sessió per poder veure el contingut"
|
||||
requireSigninToViewContentsDescription1: "Es requereix l'inici de sessió per poder veure totes les notes i el contingut que has creat. Amb això esperem evitar que els rastrejadors recopilin informació."
|
||||
@@ -1537,7 +1621,7 @@ _announcement:
|
||||
needConfirmationToRead: "Es necessita confirmació de lectura de la notificació "
|
||||
needConfirmationToReadDescription: "Si s'activa es mostrarà un diàleg per confirmar la lectura d'aquesta notificació. A més aquesta notificació serà exclosa de qualsevol funcionalitat com \"Marcar tot com a llegit\"."
|
||||
end: "Final de la notificació "
|
||||
tooManyActiveAnnouncementDescription: "Tenir massa notificacions actives pot empitjorar l'experiència de l'usuari. Considera finalitzar els avisos que siguin antics."
|
||||
tooManyActiveAnnouncementDescription: "Tenir masses notificacions actives pot empitjorar l'experiència de l'usuari. Considera finalitzar els avisos que siguin antics."
|
||||
readConfirmTitle: "Marcar com llegida?"
|
||||
readConfirmText: "Això marcarà el contingut de \"{title}\" com llegit."
|
||||
shouldNotBeUsedToPresentPermanentInfo: "Ja que l'ús de notificacions pot impactar l'experiència dels nous usuaris, és recomanable fer servir les notificacions amb el flux d'informació en comptes de fer-les servir en un únic bloc."
|
||||
@@ -1644,7 +1728,7 @@ _serverSettings:
|
||||
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."
|
||||
remoteNotesCleaning: "Neteja automàtica de notes remotes"
|
||||
remoteNotesCleaning_description: "Quan activis aquesta opció, periòdicament es netejaran les notes remotes que no es consultin, això evitarà que la base de dades se"
|
||||
remoteNotesCleaningMaxProcessingDuration: "D'oració màxima del temps de funcionament del procés de neteja"
|
||||
remoteNotesCleaningMaxProcessingDuration: "Duració màxima del temps de funcionament del procés de neteja"
|
||||
remoteNotesCleaningExpiryDaysForEachNotes: "Duració mínima de conservació de les notes"
|
||||
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ó."
|
||||
@@ -1991,6 +2075,7 @@ _role:
|
||||
canManageAvatarDecorations: "Gestiona les decoracions dels avatars "
|
||||
driveCapacity: "Capacitat del disc"
|
||||
maxFileSize: "Mida màxima de l'arxiu que es pot carregar"
|
||||
maxFileSize_caption: "Pot haver-hi la possibilitat que existeixin altres opcions de configuració de l'etapa anterior, com podria ser el proxy invers i la CDN."
|
||||
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"
|
||||
@@ -2018,6 +2103,7 @@ _role:
|
||||
uploadableFileTypes_caption: "Especifica el tipus MIME. Es poden especificar diferents tipus MIME separats amb una nova línia, i es poden especificar comodins amb asteriscs (*). (Per exemple: image/*)"
|
||||
uploadableFileTypes_caption2: "Pot que no sigui possible determinar el tipus MIME d'alguns arxius. Per permetre aquests tipus d'arxius afegeix {x} a les especificacions."
|
||||
noteDraftLimit: "Nombre possible d'esborranys de notes al servidor"
|
||||
scheduledNoteLimit: "Màxim nombre de notes programades que es poden crear simultàniament"
|
||||
watermarkAvailable: "Pots fer servir la marca d'aigua"
|
||||
_condition:
|
||||
roleAssignedTo: "Assignat a rols manuals"
|
||||
@@ -2076,7 +2162,7 @@ _ad:
|
||||
timezoneinfo: "El dia de la setmana ve determinat del fus horari del servidor."
|
||||
adsSettings: "Configurar la publicitat"
|
||||
notesPerOneAd: "Interval d'emplaçament publicitari en temps real (Notes per anuncis)"
|
||||
setZeroToDisable: "Ajusta aquest valor a 0 per deshabilitar l'actualització d'anuncis en temps real"
|
||||
setZeroToDisable: "Ajusta aquest valor a 0 per deshabilitar l'actualització de publicitat en temps real"
|
||||
adsTooClose: "L'interval actual pot fer que l'experiència de l'usuari sigui dolenta perquè l'interval és molt baix."
|
||||
_forgotPassword:
|
||||
enterEmail: "Escriu l'adreça de correu electrònic amb la que et vas registrar. S'enviarà un correu electrònic amb un enllaç perquè puguis canviar-la."
|
||||
@@ -2408,6 +2494,7 @@ _auth:
|
||||
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"
|
||||
alreadyAuthorized: "Aquesta aplicació ja té accés."
|
||||
_antennaSources:
|
||||
all: "Totes les publicacions"
|
||||
homeTimeline: "Publicacions dels usuaris seguits"
|
||||
@@ -2453,7 +2540,7 @@ _widgets:
|
||||
chooseList: "Tria una llista"
|
||||
clicker: "Clicker"
|
||||
birthdayFollowings: "Usuaris que fan l'aniversari avui"
|
||||
chat: "Xat"
|
||||
chat: "Xateja amb aquest usuari"
|
||||
_cw:
|
||||
hide: "Amagar"
|
||||
show: "Carregar més"
|
||||
@@ -2498,6 +2585,20 @@ _postForm:
|
||||
replyPlaceholder: "Contestar..."
|
||||
quotePlaceholder: "Citar..."
|
||||
channelPlaceholder: "Publicar a un canal..."
|
||||
showHowToUse: "Mostrar les instruccions"
|
||||
_howToUse:
|
||||
content_title: "Cos principal"
|
||||
content_description: "Introdueix el contingut que vols publicar."
|
||||
toolbar_title: "Barra d'eines "
|
||||
toolbar_description: "Pots adjuntar arxius o enquestes, afegir anotacions o etiquetes i inserir emojis o mencions."
|
||||
account_title: "Menú del compte"
|
||||
account_description: "Pots anar canviant de comptes per publicar o veure una llista d'esborranys i les publicacions programades del teu compte."
|
||||
visibility_title: "Visibilitat"
|
||||
visibility_description: "Pots configurar la visibilitat de les teves notes."
|
||||
menu_title: "Menú"
|
||||
menu_description: "Pots fer altres accions com desar esborranys, programar publicacions i configurar reaccions."
|
||||
submit_title: "Botó per publicar"
|
||||
submit_description: "Publica les teves notes. També pots fer servir Ctrl + Enter / Cmd + Enter"
|
||||
_placeholders:
|
||||
a: "Que vols dir?..."
|
||||
b: "Alguna cosa interessant al teu voltant?..."
|
||||
@@ -2643,6 +2744,8 @@ _notification:
|
||||
youReceivedFollowRequest: "Has rebut una petició de seguiment"
|
||||
yourFollowRequestAccepted: "La teva petició de seguiment ha sigut acceptada"
|
||||
pollEnded: "Ja pots veure els resultats de l'enquesta "
|
||||
scheduledNotePosted: "Una nota programada ha sigut publicada"
|
||||
scheduledNotePostFailed: "Ha fallat la publicació d'una nota programada"
|
||||
newNote: "Nota nova"
|
||||
unreadAntennaNote: "Antena {name}"
|
||||
roleAssigned: "Rol assignat "
|
||||
@@ -2672,6 +2775,8 @@ _notification:
|
||||
quote: "Citar"
|
||||
reaction: "Reaccions"
|
||||
pollEnded: "Enquesta terminada"
|
||||
scheduledNotePosted: "Nota programada amb èxit "
|
||||
scheduledNotePostFailed: "Ha fallat la programació de la nota"
|
||||
receiveFollowRequest: "Rebuda una petició de seguiment"
|
||||
followRequestAccepted: "Petició de seguiment acceptada"
|
||||
roleAssigned: "Rol donat"
|
||||
@@ -2722,7 +2827,7 @@ _deck:
|
||||
mentions: "Mencions"
|
||||
direct: "Publicacions directes"
|
||||
roleTimeline: "Línia de temps dels rols"
|
||||
chat: "Xat"
|
||||
chat: "Xateja amb aquest usuari"
|
||||
_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}"
|
||||
@@ -2771,6 +2876,8 @@ _abuseReport:
|
||||
notifiedWebhook: "Webhook que s'ha de fer servir"
|
||||
deleteConfirm: "Segur que vols esborrar el destinatari de l'informe de moderació?"
|
||||
_moderationLogTypes:
|
||||
clearQueue: "Esborra la cua de feina"
|
||||
promoteQueue: "Tornar a intentar la feina de la cua"
|
||||
createRole: "Rol creat"
|
||||
deleteRole: "Rol esborrat"
|
||||
updateRole: "Rol actualitzat"
|
||||
@@ -3165,10 +3272,13 @@ _watermarkEditor:
|
||||
title: "Editar la marca d'aigua "
|
||||
cover: "Cobrir-ho tot"
|
||||
repeat: "Repetir"
|
||||
preserveBoundingRect: "Ajusta'l per evitar que sobresortir en fer la rotació "
|
||||
opacity: "Opacitat"
|
||||
scale: "Mida"
|
||||
text: "Text"
|
||||
qr: "Codi QR"
|
||||
position: "Posició "
|
||||
margin: "Marge"
|
||||
type: "Tipus"
|
||||
image: "Imatges"
|
||||
advanced: "Avançat"
|
||||
@@ -3183,17 +3293,22 @@ _watermarkEditor:
|
||||
polkadotSubDotOpacity: "Opacitat del lunar secundari"
|
||||
polkadotSubDotRadius: "Mida del lunar secundari"
|
||||
polkadotSubDotDivisions: "Nombre de punts secundaris"
|
||||
leaveBlankToAccountUrl: "Si deixes aquest camp buit, es farà servir l'URL del teu compte"
|
||||
failedToLoadImage: "Error en carregar la imatge"
|
||||
_imageEffector:
|
||||
title: "Efecte"
|
||||
addEffect: "Afegeix un efecte"
|
||||
discardChangesConfirm: "Vols descartar els canvis i sortir?"
|
||||
nothingToConfigure: "No hi ha opcions de configuració disponibles"
|
||||
failedToLoadImage: "Error en carregar la imatge"
|
||||
_fxs:
|
||||
chromaticAberration: "Aberració cromàtica"
|
||||
glitch: "Glitch"
|
||||
mirror: "Mirall"
|
||||
invert: "Inversió cromàtica "
|
||||
grayscale: "Monocrom "
|
||||
blur: "Desenfocament"
|
||||
pixelate: "Mosaic"
|
||||
colorAdjust: "Correcció de color"
|
||||
colorClamp: "Compressió cromàtica "
|
||||
colorClampAdvanced: "Compressió de cromàtica avançada "
|
||||
@@ -3205,10 +3320,14 @@ _imageEffector:
|
||||
checker: "Escacs"
|
||||
blockNoise: "Bloqueig de soroll"
|
||||
tearing: "Trencament d'imatge "
|
||||
fill: "Omplir"
|
||||
_fxProps:
|
||||
angle: "Angle"
|
||||
scale: "Mida"
|
||||
size: "Mida"
|
||||
radius: "Radi"
|
||||
samples: "Mida de la mostra"
|
||||
offset: "Posició "
|
||||
color: "Color"
|
||||
opacity: "Opacitat"
|
||||
normalize: "Normalitzar"
|
||||
@@ -3225,7 +3344,7 @@ _imageEffector:
|
||||
frequency: "Freqüència "
|
||||
strength: "Intensitat"
|
||||
glitchChannelShift: "Canvi de canal "
|
||||
seed: "Llindar"
|
||||
seed: "Llavors"
|
||||
redComponent: "Component vermell"
|
||||
greenComponent: "Component verd"
|
||||
blueComponent: "Component blau"
|
||||
@@ -3237,6 +3356,7 @@ _imageEffector:
|
||||
zoomLinesThreshold: "Amplada de línia a l'augmentar "
|
||||
zoomLinesMaskSize: "Diàmetre del centre"
|
||||
zoomLinesBlack: "Obscurir"
|
||||
circle: "Cercle"
|
||||
drafts: "Esborrany "
|
||||
_drafts:
|
||||
select: "Seleccionar esborrany"
|
||||
@@ -3252,3 +3372,22 @@ _drafts:
|
||||
restoreFromDraft: "Restaurar des dels esborranys"
|
||||
restore: "Restaurar esborrany"
|
||||
listDrafts: "Llistat d'esborranys"
|
||||
schedule: "Programació esborranys"
|
||||
listScheduledNotes: "Llista de notes programades"
|
||||
cancelSchedule: "Cancel·lar la programació"
|
||||
qr: "Codi QR"
|
||||
_qr:
|
||||
showTabTitle: "Veure"
|
||||
readTabTitle: "Escanejar "
|
||||
shareTitle: "{name} {acct}"
|
||||
shareText: "Segueix-me al Fediverse"
|
||||
chooseCamera: "Seleccionar càmera "
|
||||
cannotToggleFlash: "No es pot activar el flaix"
|
||||
turnOnFlash: "Activar el flaix"
|
||||
turnOffFlash: "Apagar el flaix"
|
||||
startQr: "Reiniciar el lector de codis QR"
|
||||
stopQr: "Parar el lector de codis QR"
|
||||
noQrCodeFound: "No s'ha trobat cap codi QR"
|
||||
scanFile: "Escanejar la imatge des del dispositiu"
|
||||
raw: "Text"
|
||||
mfm: "MFM"
|
||||
|
||||
@@ -1109,6 +1109,16 @@ postForm: "Formulář pro odeslání"
|
||||
information: "Informace"
|
||||
inMinutes: "Minut"
|
||||
inDays: "Dnů"
|
||||
widgets: "Widgety"
|
||||
presets: "Předvolba"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
filename: "Název souboru"
|
||||
_imageFrameEditor:
|
||||
header: "Nadpis"
|
||||
font: "Písmo"
|
||||
fontSerif: "Serif"
|
||||
fontSansSerif: "Sans Serif"
|
||||
_chat:
|
||||
invitations: "Pozvat"
|
||||
noHistory: "Žádná historie"
|
||||
@@ -1821,6 +1831,9 @@ _postForm:
|
||||
replyPlaceholder: "Odpovědět na tuto poznámku..."
|
||||
quotePlaceholder: "Citovat tuto poznámku..."
|
||||
channelPlaceholder: "Zveřejnit příspěvek do kanálu..."
|
||||
_howToUse:
|
||||
visibility_title: "Viditelnost"
|
||||
menu_title: "Menu"
|
||||
_placeholders:
|
||||
a: "Co máte v plánu?"
|
||||
b: "Co se děje kolem vás?"
|
||||
@@ -2057,6 +2070,10 @@ _imageEffector:
|
||||
_fxProps:
|
||||
scale: "Velikost"
|
||||
size: "Velikost"
|
||||
offset: "Pozice"
|
||||
color: "Barva"
|
||||
opacity: "Průhlednost"
|
||||
lightness: "Zesvětlit"
|
||||
_qr:
|
||||
showTabTitle: "Zobrazit"
|
||||
raw: "Text"
|
||||
|
||||
@@ -1340,6 +1340,7 @@ postForm: "Notizfenster"
|
||||
textCount: "Zeichenanzahl"
|
||||
information: "Über"
|
||||
chat: "Chat"
|
||||
directMessage: "Mit dem Benutzer chatten"
|
||||
migrateOldSettings: "Alte Client-Einstellungen migrieren"
|
||||
migrateOldSettings_description: "Dies sollte normalerweise automatisch geschehen, aber wenn die Migration aus irgendeinem Grund nicht erfolgreich war, kannst du den Migrationsprozess selbst manuell auslösen. Die aktuellen Konfigurationsinformationen werden dabei überschrieben."
|
||||
compress: "Komprimieren"
|
||||
@@ -1369,6 +1370,17 @@ defaultImageCompressionLevel: "Standard-Bildkomprimierungsstufe"
|
||||
defaultImageCompressionLevel_description: "Ein niedrigerer Wert erhält die Bildqualität, erhöht aber die Dateigröße. <br>Höhere Werte reduzieren die Dateigröße, verringern aber die Bildqualität."
|
||||
inMinutes: "Minute(n)"
|
||||
inDays: "Tag(en)"
|
||||
widgets: "Widgets"
|
||||
presets: "Vorlage"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
filename: "Dateiname"
|
||||
_imageFrameEditor:
|
||||
header: "Kopfzeile"
|
||||
font: "Schriftart"
|
||||
fontSerif: "Serif"
|
||||
fontSansSerif: "Sans Serif"
|
||||
quitWithoutSaveConfirm: "Nicht gespeicherte Änderungen verwerfen?"
|
||||
_order:
|
||||
newest: "Neueste zuerst"
|
||||
oldest: "Älteste zuerst"
|
||||
@@ -2433,7 +2445,7 @@ _widgets:
|
||||
chooseList: "Liste auswählen"
|
||||
clicker: "Klickzähler"
|
||||
birthdayFollowings: "Nutzer, die heute Geburtstag haben"
|
||||
chat: "Chat"
|
||||
chat: "Mit dem Benutzer chatten"
|
||||
_cw:
|
||||
hide: "Inhalt verbergen"
|
||||
show: "Inhalt anzeigen"
|
||||
@@ -2478,6 +2490,9 @@ _postForm:
|
||||
replyPlaceholder: "Dieser Notiz antworten …"
|
||||
quotePlaceholder: "Diese Notiz zitieren …"
|
||||
channelPlaceholder: "In einen Kanal senden"
|
||||
_howToUse:
|
||||
visibility_title: "Sichtbarkeit"
|
||||
menu_title: "Menü"
|
||||
_placeholders:
|
||||
a: "Was machst du momentan?"
|
||||
b: "Was ist um dich herum los?"
|
||||
@@ -2702,7 +2717,7 @@ _deck:
|
||||
mentions: "Erwähnungen"
|
||||
direct: "Direktnachrichten"
|
||||
roleTimeline: "Rollenchronik"
|
||||
chat: "Chat"
|
||||
chat: "Mit dem Benutzer chatten"
|
||||
_dialog:
|
||||
charactersExceeded: "Maximallänge überschritten! Momentan {current} von {max}"
|
||||
charactersBelow: "Minimallänge unterschritten! Momentan {current} von {min}"
|
||||
@@ -3176,6 +3191,7 @@ _imageEffector:
|
||||
angle: "Winkel"
|
||||
scale: "Größe"
|
||||
size: "Größe"
|
||||
offset: "Position"
|
||||
color: "Farbe"
|
||||
opacity: "Transparenz"
|
||||
lightness: "Erhellen"
|
||||
@@ -3193,3 +3209,6 @@ _drafts:
|
||||
restoreFromDraft: "Aus Entwurf wiederherstellen"
|
||||
restore: "Wiederherstellen"
|
||||
listDrafts: "Liste der Entwürfe"
|
||||
_qr:
|
||||
showTabTitle: "Anzeigeart"
|
||||
raw: "Text"
|
||||
|
||||
@@ -288,6 +288,10 @@ replies: "Απάντηση"
|
||||
renotes: "Κοινοποίηση σημειώματος"
|
||||
postForm: "Φόρμα δημοσίευσης"
|
||||
information: "Πληροφορίες"
|
||||
widgets: "Μαραφέτια"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
filename: "Όνομα αρχείου"
|
||||
_chat:
|
||||
members: "Μέλη"
|
||||
home: "Κεντρικό"
|
||||
|
||||
@@ -253,6 +253,7 @@ noteDeleteConfirm: "Are you sure you want to delete this note?"
|
||||
pinLimitExceeded: "You cannot pin any more notes"
|
||||
done: "Done"
|
||||
processing: "Processing..."
|
||||
preprocessing: "Preparing..."
|
||||
preview: "Preview"
|
||||
default: "Default"
|
||||
defaultValueIs: "Default: {value}"
|
||||
@@ -301,6 +302,7 @@ uploadFromUrlMayTakeTime: "It may take some time until the upload is complete."
|
||||
uploadNFiles: "Upload {n} files"
|
||||
explore: "Explore"
|
||||
messageRead: "Read"
|
||||
readAllChatMessages: "Mark all messages as read"
|
||||
noMoreHistory: "There is no further history"
|
||||
startChat: "Start chat"
|
||||
nUsersRead: "read by {n}"
|
||||
@@ -333,6 +335,7 @@ fileName: "Filename"
|
||||
selectFile: "Select a file"
|
||||
selectFiles: "Select files"
|
||||
selectFolder: "Select a folder"
|
||||
unselectFolder: "Deselect folder"
|
||||
selectFolders: "Select folders"
|
||||
fileNotSelected: "No file selected"
|
||||
renameFile: "Rename file"
|
||||
@@ -345,6 +348,7 @@ addFile: "Add a file"
|
||||
showFile: "Show files"
|
||||
emptyDrive: "Your Drive is empty"
|
||||
emptyFolder: "This folder is empty"
|
||||
dropHereToUpload: "Drop files here to upload"
|
||||
unableToDelete: "Unable to delete"
|
||||
inputNewFileName: "Enter a new filename"
|
||||
inputNewDescription: "Enter new alt text"
|
||||
@@ -772,6 +776,7 @@ lockedAccountInfo: "Unless you set your note visiblity to \"Followers only\", yo
|
||||
alwaysMarkSensitive: "Mark as sensitive by default"
|
||||
loadRawImages: "Load original images instead of showing thumbnails"
|
||||
disableShowingAnimatedImages: "Don't play animated images"
|
||||
disableShowingAnimatedImages_caption: "If animated images do not play even if this setting is disabled, it may be due to browser or OS accessibility settings, power-saving settings, or similar factors."
|
||||
highlightSensitiveMedia: "Highlight sensitive media"
|
||||
verificationEmailSent: "A verification email has been sent. Please follow the included link to complete verification."
|
||||
notSet: "Not set"
|
||||
@@ -1018,6 +1023,9 @@ pushNotificationAlreadySubscribed: "Push notifications are already enabled"
|
||||
pushNotificationNotSupported: "Your browser or instance does not support push notifications"
|
||||
sendPushNotificationReadMessage: "Delete push notifications once they have been read"
|
||||
sendPushNotificationReadMessageCaption: "This may increase the power consumption of your device."
|
||||
pleaseAllowPushNotification: "Please enable push notifications in your browser"
|
||||
browserPushNotificationDisabled: "Failed to acquire permission to send notifications"
|
||||
browserPushNotificationDisabledDescription: "You do not have permission to send notifications from {serverName}. Please allow notifications in your browser settings and try again."
|
||||
windowMaximize: "Maximize"
|
||||
windowMinimize: "Minimize"
|
||||
windowRestore: "Restore"
|
||||
@@ -1168,6 +1176,7 @@ installed: "Installed"
|
||||
branding: "Branding"
|
||||
enableServerMachineStats: "Publish server hardware stats"
|
||||
enableIdenticonGeneration: "Enable user identicon generation"
|
||||
showRoleBadgesOfRemoteUsers: "Display the role badges assigned to remote users"
|
||||
turnOffToImprovePerformance: "Turning this off can increase performance."
|
||||
createInviteCode: "Generate invite"
|
||||
createWithOptions: "Generate with options"
|
||||
@@ -1316,6 +1325,7 @@ acknowledgeNotesAndEnable: "Turn on after understanding the precautions."
|
||||
federationSpecified: "This server is operated in a whitelist federation. Interacting with servers other than those designated by the administrator is not allowed."
|
||||
federationDisabled: "Federation is disabled on this server. You cannot interact with users on other servers."
|
||||
draft: "Drafts"
|
||||
draftsAndScheduledNotes: "Drafts and scheduled notes"
|
||||
confirmOnReact: "Confirm when reacting"
|
||||
reactAreYouSure: "Would you like to add a \"{emoji}\" reaction?"
|
||||
markAsSensitiveConfirm: "Do you want to set this media as sensitive?"
|
||||
@@ -1343,6 +1353,8 @@ postForm: "Posting form"
|
||||
textCount: "Character count"
|
||||
information: "About"
|
||||
chat: "Chat"
|
||||
directMessage: "Chat with user"
|
||||
directMessage_short: "Message"
|
||||
migrateOldSettings: "Migrate old client settings"
|
||||
migrateOldSettings_description: "This should be done automatically but if for some reason the migration was not successful, you can trigger the migration process yourself manually. The current configuration information will be overwritten."
|
||||
compress: "Compress"
|
||||
@@ -1370,6 +1382,8 @@ redisplayAllTips: "Show all “Tips & Tricks” again"
|
||||
hideAllTips: "Hide all \"Tips & Tricks\""
|
||||
defaultImageCompressionLevel: "Default image compression level"
|
||||
defaultImageCompressionLevel_description: "Lower level preserves image quality but increases file size.<br>Higher level reduce file size, but reduce image quality."
|
||||
defaultCompressionLevel: "Default compression level"
|
||||
defaultCompressionLevel_description: "Lower compression preserves quality but increases file size.<br>Higher compression reduces file size but lowers quality."
|
||||
inMinutes: "Minute(s)"
|
||||
inDays: "Day(s)"
|
||||
safeModeEnabled: "Safe mode is enabled"
|
||||
@@ -1377,10 +1391,73 @@ pluginsAreDisabledBecauseSafeMode: "All plugins are disabled because safe mode i
|
||||
customCssIsDisabledBecauseSafeMode: "Custom CSS is not applied because safe mode is enabled."
|
||||
themeIsDefaultBecauseSafeMode: "While safe mode is active, the default theme is used. Disabling safe mode will revert these changes."
|
||||
thankYouForTestingBeta: "Thank you for helping us test the beta version!"
|
||||
createUserSpecifiedNote: "Create a direct note"
|
||||
schedulePost: "Schedule note"
|
||||
scheduleToPostOnX: "Scheduled to note on {x}"
|
||||
scheduledToPostOnX: "Note is scheduled for {x}"
|
||||
schedule: "Schedule"
|
||||
scheduled: "Scheduled"
|
||||
widgets: "Widgets"
|
||||
deviceInfo: "Device information"
|
||||
deviceInfoDescription: "When making technical inquiries, including the following information may help resolve the issue."
|
||||
youAreAdmin: "You are admin"
|
||||
frame: "Frame"
|
||||
presets: "Preset"
|
||||
zeroPadding: "Zero padding"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
caption: "File caption"
|
||||
filename: "Filename"
|
||||
filename_without_ext: "Filename without extension"
|
||||
year: "Year of photography"
|
||||
month: "Month of photogrphy"
|
||||
day: "Date of photography"
|
||||
hour: "Time the photo was taken (hour)"
|
||||
minute: "Time the photo was taken (minute)"
|
||||
second: "Time the photo was taken (second)"
|
||||
camera_model: "Camera Name"
|
||||
camera_lens_model: "Lens model"
|
||||
camera_mm: "Focal length"
|
||||
camera_mm_35: "Focal length (in 35 mm format)"
|
||||
camera_f: "Aperture (f-number)"
|
||||
camera_s: "Shutter speed"
|
||||
camera_iso: "ISO"
|
||||
gps_lat: "Latitude"
|
||||
gps_long: "Longitude"
|
||||
_imageFrameEditor:
|
||||
title: "Edit frame"
|
||||
tip: "You can decorate images by adding labels that include frames and metadata."
|
||||
header: "Header"
|
||||
footer: "Footer"
|
||||
borderThickness: "Frame width"
|
||||
labelThickness: "Label width"
|
||||
labelScale: "Label scale"
|
||||
centered: "Centered"
|
||||
captionMain: "Caption (Big)"
|
||||
captionSub: "Caption (Small)"
|
||||
availableVariables: "Supported variables"
|
||||
withQrCode: "QR Code"
|
||||
backgroundColor: "Background color"
|
||||
textColor: "Text color"
|
||||
font: "Font"
|
||||
fontSerif: "Serif"
|
||||
fontSansSerif: "Sans Serif"
|
||||
quitWithoutSaveConfirm: "Discard unsaved changes?"
|
||||
failedToLoadImage: "Failed to load image"
|
||||
_compression:
|
||||
_quality:
|
||||
high: "High quality"
|
||||
medium: "Medium quality"
|
||||
low: "Low quality"
|
||||
_size:
|
||||
large: "Large size"
|
||||
medium: "Medium size"
|
||||
small: "Small size"
|
||||
_order:
|
||||
newest: "Newest First"
|
||||
oldest: "Oldest First"
|
||||
_chat:
|
||||
messages: "Messages"
|
||||
noMessagesYet: "No messages yet"
|
||||
newMessage: "New message"
|
||||
individualChat: "Private Chat"
|
||||
@@ -1469,6 +1546,8 @@ _settings:
|
||||
showUrlPreview: "Show URL preview"
|
||||
showAvailableReactionsFirstInNote: "Show available reactions at the top."
|
||||
showPageTabBarBottom: "Show page tab bar at the bottom"
|
||||
emojiPaletteBanner: "You can register presets as palettes to display prominently in the emoji picker or customize the appearance of the picker."
|
||||
enableAnimatedImages: "Enable animated images"
|
||||
_chat:
|
||||
showSenderName: "Show sender's name"
|
||||
sendOnEnter: "Press Enter to send"
|
||||
@@ -1477,6 +1556,8 @@ _preferencesProfile:
|
||||
profileNameDescription: "Set a name that identifies this device."
|
||||
profileNameDescription2: "Example: \"Main PC\", \"Smartphone\""
|
||||
manageProfiles: "Manage Profiles"
|
||||
shareSameProfileBetweenDevicesIsNotRecommended: "We do not recommend sharing the same profile across multiple devices."
|
||||
useSyncBetweenDevicesOptionIfYouWantToSyncSetting: "If there are settings you wish to synchronize across multiple devices, enable the “Synchronize across multiple devices” option individually for each device."
|
||||
_preferencesBackup:
|
||||
autoBackup: "Auto backup"
|
||||
restoreFromBackup: "Restore from backup"
|
||||
@@ -1486,6 +1567,7 @@ _preferencesBackup:
|
||||
youNeedToNameYourProfileToEnableAutoBackup: "A profile name must be set to enable auto backup."
|
||||
autoPreferencesBackupIsNotEnabledForThisDevice: "Settings auto backup is not enabled on this device."
|
||||
backupFound: "Settings backup is found"
|
||||
forceBackup: "Force a backup of settings"
|
||||
_accountSettings:
|
||||
requireSigninToViewContents: "Require sign-in to view contents"
|
||||
requireSigninToViewContentsDescription1: "Require login to view all notes and other content you have created. This will have the effect of preventing crawlers from collecting your information."
|
||||
@@ -1991,6 +2073,7 @@ _role:
|
||||
canManageAvatarDecorations: "Manage avatar decorations"
|
||||
driveCapacity: "Drive capacity"
|
||||
maxFileSize: "Upload-able max file size"
|
||||
maxFileSize_caption: "Reverse proxies, CDNs, and other front-end components may have their own configuration settings."
|
||||
alwaysMarkNsfw: "Always mark files as NSFW"
|
||||
canUpdateBioMedia: "Can edit an icon or a banner image"
|
||||
pinMax: "Maximum number of pinned notes"
|
||||
@@ -2018,6 +2101,7 @@ _role:
|
||||
uploadableFileTypes_caption: "Specifies the allowed MIME/file types. Multiple MIME types can be specified by separating them with a new line, and wildcards can be specified with an asterisk (*). (e.g., image/*)"
|
||||
uploadableFileTypes_caption2: "Some files types might fail to be detected. To allow such files, add {x} to the specification."
|
||||
noteDraftLimit: "Number of possible drafts of server notes"
|
||||
scheduledNoteLimit: "Maximum number of simultaneous scheduled notes"
|
||||
watermarkAvailable: "Watermark function"
|
||||
_condition:
|
||||
roleAssignedTo: "Assigned to manual roles"
|
||||
@@ -2408,6 +2492,7 @@ _auth:
|
||||
scopeUser: "Operate as the following user"
|
||||
pleaseLogin: "Please log in to authorize applications."
|
||||
byClickingYouWillBeRedirectedToThisUrl: "When access is granted, you will automatically be redirected to the following URL"
|
||||
alreadyAuthorized: "This application already has access permission."
|
||||
_antennaSources:
|
||||
all: "All notes"
|
||||
homeTimeline: "Notes from followed users"
|
||||
@@ -2453,7 +2538,7 @@ _widgets:
|
||||
chooseList: "Select a list"
|
||||
clicker: "Clicker"
|
||||
birthdayFollowings: "Today's Birthdays"
|
||||
chat: "Chat"
|
||||
chat: "Chat with user"
|
||||
_cw:
|
||||
hide: "Hide"
|
||||
show: "Show content"
|
||||
@@ -2498,6 +2583,20 @@ _postForm:
|
||||
replyPlaceholder: "Reply to this note..."
|
||||
quotePlaceholder: "Quote this note..."
|
||||
channelPlaceholder: "Post to a channel..."
|
||||
showHowToUse: "Show how to use this form"
|
||||
_howToUse:
|
||||
content_title: "Body"
|
||||
content_description: "Enter the content you wish to post here."
|
||||
toolbar_title: "Toolbars"
|
||||
toolbar_description: "You can attach files or poll, add annotations or hashtags, and insert emojis or mentions."
|
||||
account_title: "Account menu"
|
||||
account_description: "You can switch between accounts for posting, or view a list of drafts and scheduled posts saved to your account."
|
||||
visibility_title: "Visibility"
|
||||
visibility_description: "You can configure the visibility of your notes."
|
||||
menu_title: "Menu"
|
||||
menu_description: "You can save current content to drafts, schedule posts, set reactions, and perform other actions."
|
||||
submit_title: "Post button"
|
||||
submit_description: "Post your notes by pressing this button. You can also post using Ctrl + Enter / Cmd + Enter."
|
||||
_placeholders:
|
||||
a: "What are you up to?"
|
||||
b: "What's happening around you?"
|
||||
@@ -2643,6 +2742,8 @@ _notification:
|
||||
youReceivedFollowRequest: "You've received a follow request"
|
||||
yourFollowRequestAccepted: "Your follow request was accepted"
|
||||
pollEnded: "Poll results have become available"
|
||||
scheduledNotePosted: "Scheduled note has been posted"
|
||||
scheduledNotePostFailed: "Failed to post scheduled note"
|
||||
newNote: "New note"
|
||||
unreadAntennaNote: "Antenna {name}"
|
||||
roleAssigned: "Role given"
|
||||
@@ -2672,6 +2773,8 @@ _notification:
|
||||
quote: "Quotes"
|
||||
reaction: "Reactions"
|
||||
pollEnded: "Polls ending"
|
||||
scheduledNotePosted: "Scheduled note was successful"
|
||||
scheduledNotePostFailed: "Scheduled note failed"
|
||||
receiveFollowRequest: "Received follow requests"
|
||||
followRequestAccepted: "Accepted follow requests"
|
||||
roleAssigned: "Role given"
|
||||
@@ -2722,7 +2825,7 @@ _deck:
|
||||
mentions: "Mentions"
|
||||
direct: "Direct notes"
|
||||
roleTimeline: "Role Timeline"
|
||||
chat: "Chat"
|
||||
chat: "Chat with user"
|
||||
_dialog:
|
||||
charactersExceeded: "You've exceeded the maximum character limit! Currently at {current} of {max}."
|
||||
charactersBelow: "You're below the minimum character limit! Currently at {current} of {min}."
|
||||
@@ -2771,6 +2874,8 @@ _abuseReport:
|
||||
notifiedWebhook: "Webhook to use"
|
||||
deleteConfirm: "Are you sure that you want to delete the notification recipient?"
|
||||
_moderationLogTypes:
|
||||
clearQueue: "Clear queue"
|
||||
promoteQueue: "Promote queue"
|
||||
createRole: "Role created"
|
||||
deleteRole: "Role deleted"
|
||||
updateRole: "Role updated"
|
||||
@@ -3165,10 +3270,13 @@ _watermarkEditor:
|
||||
title: "Edit Watermark"
|
||||
cover: "Cover everything"
|
||||
repeat: "spread all over"
|
||||
preserveBoundingRect: "Adjust to prevent overflow when rotating"
|
||||
opacity: "Opacity"
|
||||
scale: "Size"
|
||||
text: "Text"
|
||||
qr: "QR Code"
|
||||
position: "Position"
|
||||
margin: "Margin"
|
||||
type: "Type"
|
||||
image: "Images"
|
||||
advanced: "Advanced"
|
||||
@@ -3183,17 +3291,22 @@ _watermarkEditor:
|
||||
polkadotSubDotOpacity: "Opacity of the secondary dot"
|
||||
polkadotSubDotRadius: "Size of the secondary dot"
|
||||
polkadotSubDotDivisions: "Number of sub-dots."
|
||||
leaveBlankToAccountUrl: "Leave blank to use account URL"
|
||||
failedToLoadImage: "Failed to load image"
|
||||
_imageEffector:
|
||||
title: "Effects"
|
||||
addEffect: "Add Effects"
|
||||
discardChangesConfirm: "Are you sure you want to leave? You have unsaved changes."
|
||||
nothingToConfigure: "No configurable options available"
|
||||
failedToLoadImage: "Failed to load image"
|
||||
_fxs:
|
||||
chromaticAberration: "Chromatic Aberration"
|
||||
glitch: "Glitch"
|
||||
mirror: "Mirror"
|
||||
invert: "Invert Colors"
|
||||
grayscale: "Grayscale"
|
||||
blur: "Blur"
|
||||
pixelate: "Pixelate"
|
||||
colorAdjust: "Color Correction"
|
||||
colorClamp: "Color Compression"
|
||||
colorClampAdvanced: "Color Compression (Advanced)"
|
||||
@@ -3205,10 +3318,14 @@ _imageEffector:
|
||||
checker: "Checker"
|
||||
blockNoise: "Block Noise"
|
||||
tearing: "Tearing"
|
||||
fill: "Fill"
|
||||
_fxProps:
|
||||
angle: "Angle"
|
||||
scale: "Size"
|
||||
size: "Size"
|
||||
radius: "Radius"
|
||||
samples: "Sample count"
|
||||
offset: "Position"
|
||||
color: "Color"
|
||||
opacity: "Opacity"
|
||||
normalize: "Normalize"
|
||||
@@ -3237,6 +3354,7 @@ _imageEffector:
|
||||
zoomLinesThreshold: "Zoom line width"
|
||||
zoomLinesMaskSize: "Center diameter"
|
||||
zoomLinesBlack: "Make black"
|
||||
circle: "Circular"
|
||||
drafts: "Drafts"
|
||||
_drafts:
|
||||
select: "Select Draft"
|
||||
@@ -3252,3 +3370,22 @@ _drafts:
|
||||
restoreFromDraft: "Restore from Draft"
|
||||
restore: "Restore"
|
||||
listDrafts: "List of Drafts"
|
||||
schedule: "Schedule note"
|
||||
listScheduledNotes: "Scheduled notes list"
|
||||
cancelSchedule: "Cancel schedule"
|
||||
qr: "QR Code"
|
||||
_qr:
|
||||
showTabTitle: "Display"
|
||||
readTabTitle: "Scan"
|
||||
shareTitle: "{name} {acct}"
|
||||
shareText: "Follow me on the Fediverse!"
|
||||
chooseCamera: "Choose camera"
|
||||
cannotToggleFlash: "Unable to toggle flashlight"
|
||||
turnOnFlash: "Turn on flashlight"
|
||||
turnOffFlash: "Turn off flashlight"
|
||||
startQr: "Resume QR code reader"
|
||||
stopQr: "Stop QR code reader"
|
||||
noQrCodeFound: "No QR code found"
|
||||
scanFile: "Scan image from device"
|
||||
raw: "Text"
|
||||
mfm: "MFM"
|
||||
|
||||
@@ -5,11 +5,11 @@ introMisskey: "¡Bienvenido/a! Misskey es un servicio de microblogging descentra
|
||||
poweredByMisskeyDescription: "{name} es uno de los servicios (también llamado instancia) que usa la plataforma de código abierto <b>Misskey</b>"
|
||||
monthAndDay: "{day}/{month}"
|
||||
search: "Buscar"
|
||||
reset: "Reiniciar"
|
||||
reset: "Restablecer"
|
||||
notifications: "Notificaciones"
|
||||
username: "Nombre de usuario"
|
||||
password: "Contraseña"
|
||||
initialPasswordForSetup: "Contraseña para iniciar la inicialización"
|
||||
initialPasswordForSetup: "Contraseña de configuración inicial"
|
||||
initialPasswordIsIncorrect: "La contraseña para iniciar la configuración inicial es incorrecta."
|
||||
initialPasswordForSetupDescription: "Si ha instalado Misskey usted mismo, utilice la contraseña introducida en el archivo de configuración.\nSi utiliza un servicio de alojamiento de Misskey o similar, utilice la contraseña proporcionada.\nSi no ha establecido una contraseña, déjela en blanco para continuar."
|
||||
forgotPassword: "Olvidé mi contraseña"
|
||||
@@ -43,7 +43,7 @@ favorite: "Añadir a favoritos"
|
||||
favorites: "Favoritos"
|
||||
unfavorite: "Quitar de favoritos"
|
||||
favorited: "Añadido a favoritos."
|
||||
alreadyFavorited: "Ya había sido añadido a favoritos"
|
||||
alreadyFavorited: "Ya añadido a favoritos."
|
||||
cantFavorite: "No se puede añadir a favoritos."
|
||||
pin: "Fijar al perfil"
|
||||
unpin: "Desfijar"
|
||||
@@ -83,11 +83,13 @@ files: "Archivos"
|
||||
download: "Descargar"
|
||||
driveFileDeleteConfirm: "¿Desea borrar el archivo \"{name}\"? Las notas que tengan este archivo como adjunto serán eliminadas"
|
||||
unfollowConfirm: "¿Desea dejar de seguir a {name}?"
|
||||
cancelFollowRequestConfirm: "¿Desea cancelar su solicitud de seguimiento a {name}?"
|
||||
rejectFollowRequestConfirm: "¿Desea rechazar la solicitud de seguimiento de {name}?"
|
||||
exportRequested: "Has solicitado la exportación. Puede llevar un tiempo. Cuando termine la exportación, se añadirá al drive"
|
||||
importRequested: "Has solicitado la importación. Puede llevar un tiempo."
|
||||
lists: "Listas"
|
||||
noLists: "No tienes ninguna lista"
|
||||
note: "Notas"
|
||||
note: "Nota"
|
||||
notes: "Notas"
|
||||
following: "Siguiendo"
|
||||
followers: "Seguidores"
|
||||
@@ -126,10 +128,10 @@ pinnedNote: "Nota fijada"
|
||||
pinned: "Fijar al perfil"
|
||||
you: "Tú"
|
||||
clickToShow: "Haz clic para verlo"
|
||||
sensitive: "Marcado como sensible"
|
||||
sensitive: "Marcado como sensible (NSFW)"
|
||||
add: "Agregar"
|
||||
reaction: "Reacción"
|
||||
reactions: "Reacción"
|
||||
reactions: "Reacciones"
|
||||
emojiPicker: "Selector de emojis"
|
||||
pinnedEmojisForReactionSettingDescription: "Puedes seleccionar reacciones para fijarlos en el selector"
|
||||
pinnedEmojisSettingDescription: "Puedes seleccionar emojis para fijarlos en el selector"
|
||||
@@ -141,7 +143,7 @@ rememberNoteVisibility: "Recordar visibilidad"
|
||||
attachCancel: "Quitar adjunto"
|
||||
deleteFile: "Eliminar archivo"
|
||||
markAsSensitive: "Marcar como sensible"
|
||||
unmarkAsSensitive: "Desmarcar como sensible"
|
||||
unmarkAsSensitive: "No marcar como sensible"
|
||||
enterFileName: "Introduce el nombre del archivo"
|
||||
mute: "Silenciar"
|
||||
unmute: "Dejar de silenciar"
|
||||
@@ -251,8 +253,9 @@ noUsers: "No hay usuarios"
|
||||
editProfile: "Editar perfil"
|
||||
noteDeleteConfirm: "¿Quieres borrar esta nota?"
|
||||
pinLimitExceeded: "Ya no se pueden fijar más notas"
|
||||
done: "Terminado"
|
||||
done: "Hecho"
|
||||
processing: "Procesando..."
|
||||
preprocessing: "Preparando"
|
||||
preview: "Vista previa"
|
||||
default: "Predeterminado"
|
||||
defaultValueIs: "Por defecto: {value}"
|
||||
@@ -301,6 +304,7 @@ uploadFromUrlMayTakeTime: "Subir el fichero puede tardar un tiempo."
|
||||
uploadNFiles: "Subir {n} archivos"
|
||||
explore: "Explorar"
|
||||
messageRead: "Ya leído"
|
||||
readAllChatMessages: "Marcar todos los mensajes como leídos"
|
||||
noMoreHistory: "El historial se ha acabado"
|
||||
startChat: "Nuevo Chat"
|
||||
nUsersRead: "Leído por {n} personas"
|
||||
@@ -315,10 +319,10 @@ remoteUserCaution: "Para el usuario remoto, la información está incompleta"
|
||||
activity: "Actividad"
|
||||
images: "Imágenes"
|
||||
image: "Imágenes"
|
||||
birthday: "Fecha de nacimiento"
|
||||
birthday: "Cumpleaños"
|
||||
yearsOld: "{age} años"
|
||||
registeredDate: "Fecha de registro"
|
||||
location: "Lugar"
|
||||
location: "Ubicación"
|
||||
theme: "Tema"
|
||||
themeForLightMode: "Tema para usar en Modo Linterna"
|
||||
themeForDarkMode: "Tema para usar en Modo Oscuro"
|
||||
@@ -333,6 +337,7 @@ fileName: "Nombre de archivo"
|
||||
selectFile: "Elegir archivo"
|
||||
selectFiles: "Elegir archivos"
|
||||
selectFolder: "Seleccione una carpeta"
|
||||
unselectFolder: "Deseleccionar carpeta"
|
||||
selectFolders: "Seleccione carpetas"
|
||||
fileNotSelected: "Archivo no seleccionado."
|
||||
renameFile: "Renombrar archivo"
|
||||
@@ -345,9 +350,10 @@ addFile: "Agregar archivo"
|
||||
showFile: "Examinar archivos"
|
||||
emptyDrive: "El drive está vacío"
|
||||
emptyFolder: "La carpeta está vacía"
|
||||
dropHereToUpload: "Arrastra los archivos aquí para subirlos."
|
||||
unableToDelete: "No se puede borrar"
|
||||
inputNewFileName: "Ingrese un nuevo nombre de archivo"
|
||||
inputNewDescription: "Ingrese nueva descripción"
|
||||
inputNewDescription: "Introducir un nuevo texto alternativo"
|
||||
inputNewFolderName: "Ingrese un nuevo nombre de la carpeta"
|
||||
circularReferenceFolder: "La carpeta de destino es una sub-carpeta de la carpeta que quieres mover."
|
||||
hasChildFilesOrFolders: "No se puede borrar esta carpeta. No está vacía."
|
||||
@@ -573,7 +579,7 @@ objectStorageSetPublicRead: "Seleccionar \"public-read\" al subir "
|
||||
s3ForcePathStyleDesc: "Si s3ForcePathStyle esta habilitado el nombre del bucket debe ser especificado como parte de la URL en lugar del nombre de host en la URL. Puede ser necesario activar esta opción cuando se utilice, por ejemplo, Minio en un servidor propio."
|
||||
serverLogs: "Registros del servidor"
|
||||
deleteAll: "Eliminar todos"
|
||||
showFixedPostForm: "Mostrar el formulario de las entradas encima de la línea de tiempo"
|
||||
showFixedPostForm: "Visualizar la ventana de publicación en la parte superior de la línea de tiempo."
|
||||
showFixedPostFormInChannel: "Mostrar el formulario de publicación por encima de la cronología (Canales)"
|
||||
withRepliesByDefaultForNewlyFollowed: "Incluir por defecto respuestas de usuarios recién seguidos en la línea de tiempo"
|
||||
newNoteRecived: "Tienes una nota nueva"
|
||||
@@ -648,7 +654,7 @@ disablePlayer: "Cerrar reproductor"
|
||||
expandTweet: "Expandir tweet"
|
||||
themeEditor: "Editor de temas"
|
||||
description: "Descripción"
|
||||
describeFile: "Añade una descripción"
|
||||
describeFile: "Añadir texto alternativo"
|
||||
enterFileDescription: "Introducir un título"
|
||||
author: "Autor"
|
||||
leaveConfirm: "Hay modificaciones sin guardar. ¿Desea descartarlas?"
|
||||
@@ -700,7 +706,7 @@ userSaysSomethingAbout: "{name} dijo algo sobre {word}"
|
||||
makeActive: "Activar"
|
||||
display: "Apariencia"
|
||||
copy: "Copiar"
|
||||
copiedToClipboard: "Texto copiado al portapapeles"
|
||||
copiedToClipboard: "Copiado al portapapeles"
|
||||
metrics: "Métricas"
|
||||
overview: "Resumen"
|
||||
logs: "Registros"
|
||||
@@ -709,7 +715,7 @@ database: "Base de datos"
|
||||
channel: "Canal"
|
||||
create: "Crear"
|
||||
notificationSetting: "Ajustes de Notificaciones"
|
||||
notificationSettingDesc: "Por favor elija el tipo de notificación a mostrar"
|
||||
notificationSettingDesc: "Por favor elige el tipo de notificación a mostrar"
|
||||
useGlobalSetting: "Usar ajustes globales"
|
||||
useGlobalSettingDesc: "Al activarse, se usará la configuración de notificaciones de la cuenta, al desactivarse se pueden hacer configuraciones particulares."
|
||||
other: "Otro"
|
||||
@@ -741,7 +747,7 @@ system: "Sistema"
|
||||
switchUi: "Cambiar interfaz de usuario"
|
||||
desktop: "Escritorio"
|
||||
clip: "Clip"
|
||||
createNew: "Crear"
|
||||
createNew: "Crear Nuevo"
|
||||
optional: "Opcional"
|
||||
createNewClip: "Crear clip nuevo"
|
||||
unclip: "Quitar clip"
|
||||
@@ -772,6 +778,7 @@ lockedAccountInfo: "A menos que configures la visibilidad de tus notas como \"S
|
||||
alwaysMarkSensitive: "Marcar los medios de comunicación como contenido sensible por defecto"
|
||||
loadRawImages: "Cargar las imágenes originales en lugar de mostrar las miniaturas"
|
||||
disableShowingAnimatedImages: "No reproducir imágenes animadas"
|
||||
disableShowingAnimatedImages_caption: "Si las imágenes animadas no se reproducen independientemente de esta configuración, es posible que la configuración de accesibilidad del navegador o del sistema operativo, los modos de ahorro de energía o funciones similares estén interfiriendo."
|
||||
highlightSensitiveMedia: "Resaltar medios marcados como sensibles"
|
||||
verificationEmailSent: "Se le ha enviado un correo electrónico de confirmación. Por favor, acceda al enlace proporcionado en el correo electrónico para completar la configuración."
|
||||
notSet: "Sin especificar"
|
||||
@@ -837,7 +844,7 @@ jumpToSpecifiedDate: "Saltar a una fecha específica"
|
||||
showingPastTimeline: "Mostrar líneas de tiempo antiguas"
|
||||
clear: "Limpiar"
|
||||
markAllAsRead: "Marcar todo como leído"
|
||||
goBack: "Deseleccionar"
|
||||
goBack: "Anterior"
|
||||
unlikeConfirm: "¿Quitar como favorito?"
|
||||
fullView: "Vista completa"
|
||||
quitFullView: "quitar vista completa"
|
||||
@@ -910,8 +917,8 @@ pubSub: "Cuentas Pub/Sub"
|
||||
lastCommunication: "Última comunicación"
|
||||
resolved: "Resuelto"
|
||||
unresolved: "Sin resolver"
|
||||
breakFollow: "Dejar de seguir"
|
||||
breakFollowConfirm: "¿Quieres dejar de seguir?"
|
||||
breakFollow: "Eliminar seguidor"
|
||||
breakFollowConfirm: "¿De verdad quieres eliminar a este seguidor?"
|
||||
itsOn: "¡Está encendido!"
|
||||
itsOff: "¡Está apagado!"
|
||||
on: "Activado"
|
||||
@@ -962,7 +969,7 @@ threeDays: "Tres días"
|
||||
reflectMayTakeTime: "Puede pasar un tiempo hasta que se reflejen los cambios"
|
||||
failedToFetchAccountInformation: "No se pudo obtener información de la cuenta"
|
||||
rateLimitExceeded: "Se excedió el límite de peticiones"
|
||||
cropImage: "Recortar imágen"
|
||||
cropImage: "Recortar Imagen"
|
||||
cropImageAsk: "¿Desea recortar la imagen?"
|
||||
cropYes: "Recortar"
|
||||
cropNo: "Usar como está"
|
||||
@@ -981,7 +988,7 @@ typeToConfirm: "Ingrese {x} para confirmar"
|
||||
deleteAccount: "Borrar cuenta"
|
||||
document: "Documento"
|
||||
numberOfPageCache: "Cantidad de páginas cacheadas"
|
||||
numberOfPageCacheDescription: "Al aumentar el número mejora la conveniencia pero tambien puede aumentar la carga y la memoria a usarse"
|
||||
numberOfPageCacheDescription: "Al aumentar el número mejora la conveniencia pero también puede aumentar la carga y la memoria a usarse"
|
||||
logoutConfirm: "¿Cerrar sesión?"
|
||||
logoutWillClearClientData: "Al cerrar la sesión, la información de configuración del cliente se borra del navegador. Para garantizar que la información de configuración se pueda restaurar al volver a iniciar sesión, active la copia de seguridad automática de la configuración."
|
||||
lastActiveDate: "Utilizado por última vez el"
|
||||
@@ -1018,10 +1025,13 @@ pushNotificationAlreadySubscribed: "Notificaciones emergentes ya activadas"
|
||||
pushNotificationNotSupported: "El navegador o la instancia no admiten notificaciones push"
|
||||
sendPushNotificationReadMessage: "Eliminar las notificaciones push después de leer las notificaciones y los mensajes"
|
||||
sendPushNotificationReadMessageCaption: "La notificación \"{emptyPushNotificationMessage}\" aparecerá momentáneamente. Esto puede aumentar el consumo de batería del dispositivo."
|
||||
pleaseAllowPushNotification: "Por favor, permita las notificaciones y la configuración del navegador."
|
||||
browserPushNotificationDisabled: "No se ha podido obtener permiso para enviar notificaciones."
|
||||
browserPushNotificationDisabledDescription: "No tienes permiso para enviar notificaciones desde {serverName}. Permite las notificaciones en la configuración de tu navegador y vuelve a intentarlo."
|
||||
windowMaximize: "Maximizar"
|
||||
windowMinimize: "Minimizar"
|
||||
windowRestore: "Regresar"
|
||||
caption: "Pie de foto"
|
||||
caption: "Texto alternativo"
|
||||
loggedInAsBot: "Inicio sesión como cuenta bot."
|
||||
tools: "Utilidades"
|
||||
cannotLoad: "No se puede cargar."
|
||||
@@ -1149,7 +1159,7 @@ initialAccountSetting: "Configración inicial de su cuenta"
|
||||
youFollowing: "Siguiendo"
|
||||
preventAiLearning: "Rechazar el uso en el Aprendizaje de Máquinas. (IA Generativa)"
|
||||
preventAiLearningDescription: "Pedirle a las arañas (crawlers) no usar los textos publicados o imágenes en el aprendizaje automático (IA Predictiva / Generativa). Ésto se logra añadiendo una marca respuesta HTML con la cadena \"noai\" al cantenido. Una prevención total no podría lograrse sólo usando ésta marca, ya que puede ser simplemente ignorada."
|
||||
options: "Opción"
|
||||
options: "Opciones"
|
||||
specifyUser: "Especificar usuario"
|
||||
lookupConfirm: "¿Quiere informarse?"
|
||||
openTagPageConfirm: "¿Quieres abrir la página de etiquetas?"
|
||||
@@ -1168,6 +1178,7 @@ installed: "Instalado"
|
||||
branding: "Marca"
|
||||
enableServerMachineStats: "Publicar estadísticas de hardware del servidor"
|
||||
enableIdenticonGeneration: "Activar generación de identicon por usuario"
|
||||
showRoleBadgesOfRemoteUsers: "Mostrar la insignia de rol asignada a los usuarios remotos."
|
||||
turnOffToImprovePerformance: "Desactivar esto puede aumentar el rendimiento."
|
||||
createInviteCode: "Generar invitación"
|
||||
createWithOptions: "Generar con opciones"
|
||||
@@ -1192,8 +1203,8 @@ iHaveReadXCarefullyAndAgree: "He leído el texto {x} y estoy de acuerdo"
|
||||
dialog: "Diálogo"
|
||||
icon: "Avatar"
|
||||
forYou: "Para ti"
|
||||
currentAnnouncements: "Anuncios actuales"
|
||||
pastAnnouncements: "Anuncios anteriores"
|
||||
currentAnnouncements: "Avisos actuales"
|
||||
pastAnnouncements: "Avisos anteriores"
|
||||
youHaveUnreadAnnouncements: "Hay anuncios sin leer"
|
||||
useSecurityKey: "Por favor, sigue las instrucciones de tu dispositivo o navegador para usar tu clave de seguridad o tu clave de paso."
|
||||
replies: "Responder"
|
||||
@@ -1258,7 +1269,7 @@ addMfmFunction: "Añadir función MFM"
|
||||
enableQuickAddMfmFunction: "Activar acceso rápido para añadir funciones MFM"
|
||||
bubbleGame: "Bubble Game"
|
||||
sfx: "Efectos de sonido"
|
||||
soundWillBePlayed: "Se reproducirán efectos sonoros"
|
||||
soundWillBePlayed: "Con música y efectos sonoros"
|
||||
showReplay: "Ver reproducción"
|
||||
replay: "Reproducir"
|
||||
replaying: "Reproduciendo"
|
||||
@@ -1316,6 +1327,7 @@ acknowledgeNotesAndEnable: "Activar después de comprender las precauciones"
|
||||
federationSpecified: "Este servidor opera en una federación de listas blancas. No puede interactuar con otros servidores que no sean los especificados por el administrador."
|
||||
federationDisabled: "La federación está desactivada en este servidor. No puede interactuar con usuarios de otros servidores"
|
||||
draft: "Borrador"
|
||||
draftsAndScheduledNotes: "Borradores y notas programadas"
|
||||
confirmOnReact: "Confirmar la reacción"
|
||||
reactAreYouSure: "¿Quieres añadir una reacción «{emoji}»?"
|
||||
markAsSensitiveConfirm: "¿Desea establecer este medio multimedia(Imagen,vídeo...) como sensible?"
|
||||
@@ -1343,9 +1355,11 @@ postForm: "Formulario"
|
||||
textCount: "caracteres"
|
||||
information: "Información"
|
||||
chat: "Chat"
|
||||
directMessage: "Chatear"
|
||||
directMessage_short: "Mensajes"
|
||||
migrateOldSettings: "Migrar la configuración anterior"
|
||||
migrateOldSettings_description: "Esto debería hacerse automáticamente, pero si por alguna razón la migración no ha tenido éxito, puede activar usted mismo el proceso de migración manualmente. Se sobrescribirá la información de configuración actual."
|
||||
compress: "Comprimir"
|
||||
compress: "Compresión de la imagen"
|
||||
right: "Derecha"
|
||||
bottom: "Abajo"
|
||||
top: "Arriba"
|
||||
@@ -1370,6 +1384,8 @@ redisplayAllTips: "Volver a mostrar todos \"Trucos y consejos\""
|
||||
hideAllTips: "Ocultar todos los \"Trucos y consejos\""
|
||||
defaultImageCompressionLevel: "Nivel de compresión de la imagen por defecto"
|
||||
defaultImageCompressionLevel_description: "Baja, conserva la calidad de la imagen pero la medida del archivo es más grande. <br>Alta, reduce la medida del archivo pero también la calidad de la imagen."
|
||||
defaultCompressionLevel: "Nivel de compresión predeterminado"
|
||||
defaultCompressionLevel_description: "Al reducir el ajuste se conserva la calidad, pero aumenta el tamaño del archivo.<br>Al aumentar el ajuste se reduce el tamaño del archivo, pero disminuye la calidad."
|
||||
inMinutes: "Minutos"
|
||||
inDays: "Días"
|
||||
safeModeEnabled: "El modo seguro está activado"
|
||||
@@ -1377,10 +1393,73 @@ pluginsAreDisabledBecauseSafeMode: "El modo seguro está activado, por lo que to
|
||||
customCssIsDisabledBecauseSafeMode: "El modo seguro está activado, por lo que no se aplica el CSS personalizado."
|
||||
themeIsDefaultBecauseSafeMode: "Mientras el modo seguro esté activado, se utilizará el tema predeterminado. Cuando se desactive el modo seguro, se volverá al tema original."
|
||||
thankYouForTestingBeta: "¡Gracias por tu colaboración en la prueba de la versión beta!"
|
||||
createUserSpecifiedNote: "Mencionar al usuario (Nota Directa)"
|
||||
schedulePost: "Programar una nota"
|
||||
scheduleToPostOnX: "Programar una nota para {x}"
|
||||
scheduledToPostOnX: "La nota está programada para el {x}."
|
||||
schedule: "Programar"
|
||||
scheduled: "Programado"
|
||||
widgets: "Widgets"
|
||||
deviceInfo: "Información del dispositivo"
|
||||
deviceInfoDescription: "Al realizar consultas técnicas, incluir la siguiente información puede ayudar a resolver el problema."
|
||||
youAreAdmin: "Eres administrador."
|
||||
frame: "Marco"
|
||||
presets: "Predefinido"
|
||||
zeroPadding: "Relleno cero"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
caption: "Título del archivo"
|
||||
filename: "Nombre de archivo"
|
||||
filename_without_ext: "Nombre del archivo sin la extensión"
|
||||
year: "Año de rodaje"
|
||||
month: "Mes de la fotografía"
|
||||
day: "Día de la fotografía"
|
||||
hour: "Hora"
|
||||
minute: "Minuto"
|
||||
second: "Segundo"
|
||||
camera_model: "Nombre de la cámara"
|
||||
camera_lens_model: "Modelo de lente"
|
||||
camera_mm: "Distancia focal"
|
||||
camera_mm_35: "Distancia Focal (Equivalente a formato de 35mm)"
|
||||
camera_f: "Apertura de diafragma"
|
||||
camera_s: "Velocidad de Obturación"
|
||||
camera_iso: "Sensibilidad ISO"
|
||||
gps_lat: "Latitud"
|
||||
gps_long: "Longitud"
|
||||
_imageFrameEditor:
|
||||
title: "Edición de Fotos"
|
||||
tip: "Decora tus imágenes con marcos y etiquetas que contengan metadatos."
|
||||
header: "Título"
|
||||
footer: "Pie de página"
|
||||
borderThickness: "Ancho del borde"
|
||||
labelThickness: "Ancho de la etiqueta"
|
||||
labelScale: "Escala de la Etiqueta"
|
||||
centered: "Alinear al centro"
|
||||
captionMain: "Pie de foto (Grande)"
|
||||
captionSub: "Pie de foto (Pequeño)"
|
||||
availableVariables: "Variables disponibles"
|
||||
withQrCode: "Código QR"
|
||||
backgroundColor: "Color de fondo"
|
||||
textColor: "Color del texto"
|
||||
font: "Fuente"
|
||||
fontSerif: "Serif"
|
||||
fontSansSerif: "Sans Serif"
|
||||
quitWithoutSaveConfirm: "¿Descartar cambios no guardados?"
|
||||
failedToLoadImage: "Error al cargar la imagen"
|
||||
_compression:
|
||||
_quality:
|
||||
high: "Calidad alta"
|
||||
medium: "Calidad media"
|
||||
low: "Calidad baja"
|
||||
_size:
|
||||
large: "Tamaño grande"
|
||||
medium: "Tamaño mediano"
|
||||
small: "Tamaño pequeño"
|
||||
_order:
|
||||
newest: "Los más recientes primero"
|
||||
oldest: "Los más antiguos primero"
|
||||
newest: "Más reciente primero"
|
||||
oldest: "Más antiguos primero"
|
||||
_chat:
|
||||
messages: "Mensajes"
|
||||
noMessagesYet: "Aún no hay mensajes"
|
||||
newMessage: "Mensajes nuevos"
|
||||
individualChat: "Chat individual"
|
||||
@@ -1432,7 +1511,7 @@ _emojiPalette:
|
||||
palettes: "Paleta\n"
|
||||
enableSyncBetweenDevicesForPalettes: "Activar la sincronización de paletas entre dispositivos"
|
||||
paletteForMain: "Paleta principal"
|
||||
paletteForReaction: "Paleta de reacción"
|
||||
paletteForReaction: "Paleta utilizada para las reacciones"
|
||||
_settings:
|
||||
driveBanner: "Puedes gestionar y configurar la unidad, comprobar su uso y configurar los ajustes de carga de archivos."
|
||||
pluginBanner: "Puedes ampliar las funciones del cliente con plugins. Puedes instalar plugins, configurarlos y gestionarlos individualmente."
|
||||
@@ -1444,7 +1523,7 @@ _settings:
|
||||
accountData: "Datos de la cuenta"
|
||||
accountDataBanner: "Exportación e importación para gestionar los datos de la cuenta."
|
||||
muteAndBlockBanner: "Puedes configurar y gestionar ajustes para ocultar contenidos y restringir acciones a usuarios específicos."
|
||||
accessibilityBanner: "Puedes personalizar los visuales y el comportamiento del cliente, y configurar los ajustes para optimizar el uso."
|
||||
accessibilityBanner: "Puedes personalizar el aspecto y el comportamiento del cliente y configurar los ajustes para optimizar su uso."
|
||||
privacyBanner: "Puedes configurar opciones relacionadas con la privacidad de la cuenta, como la visibilidad del contenido, la posibilidad de descubrir la cuenta y la aprobación de seguimiento."
|
||||
securityBanner: "Puedes configurar opciones relacionadas con la seguridad de la cuenta, como la contraseña, los métodos de inicio de sesión, las aplicaciones de autenticación y Passkeys."
|
||||
preferencesBanner: "Puedes configurar el comportamiento general del cliente según tus preferencias."
|
||||
@@ -1461,7 +1540,7 @@ _settings:
|
||||
ifOff: "Si está desactivado"
|
||||
enableSyncThemesBetweenDevices: "Sincronizar los temas instalados entre dispositivos."
|
||||
enablePullToRefresh: "Tirar para actualizar"
|
||||
enablePullToRefresh_description: "Si utiliza un ratón, arrastre mientras pulsa la rueda de desplazamiento."
|
||||
enablePullToRefresh_description: "Si utilizas un ratón, arrastra mientras pulsas la rueda de desplazamiento."
|
||||
realtimeMode_description: "Establece una conexión con el servidor y actualiza el contenido en tiempo real. Esto puede aumentar el tráfico y el consumo de memoria."
|
||||
contentsUpdateFrequency: "Frecuencia de adquisición del contenido."
|
||||
contentsUpdateFrequency_description: "Cuanto mayor sea el valor, más se actualiza el contenido, pero disminuye el rendimiento y aumenta el tráfico y el consumo de memoria."
|
||||
@@ -1469,6 +1548,8 @@ _settings:
|
||||
showUrlPreview: "Mostrar la vista previa de la URL"
|
||||
showAvailableReactionsFirstInNote: "Mostrar las reacciones disponibles en la parte superior."
|
||||
showPageTabBarBottom: "Mostrar la barra de pestañas de la página en la parte inferior."
|
||||
emojiPaletteBanner: "Puedes registrar ajustes preestablecidos como paletas para que se muestren permanentemente en el selector de emojis, o personalizar el método de visualización del selector."
|
||||
enableAnimatedImages: "Habilitar imágenes animadas"
|
||||
_chat:
|
||||
showSenderName: "Mostrar el nombre del remitente"
|
||||
sendOnEnter: "Intro para enviar"
|
||||
@@ -1477,6 +1558,8 @@ _preferencesProfile:
|
||||
profileNameDescription: "Establece un nombre que identifique al dispositivo"
|
||||
profileNameDescription2: "Por ejemplo: \"PC Principal\",\"Teléfono\""
|
||||
manageProfiles: "Administrar perfiles"
|
||||
shareSameProfileBetweenDevicesIsNotRecommended: "No recomendamos compartir el mismo perfil en varios dispositivos."
|
||||
useSyncBetweenDevicesOptionIfYouWantToSyncSetting: "Si hay ajustes que deseas sincronizar en varios dispositivos, activa la opción «Sincronizar en varios dispositivos» individualmente para cada uno de ellos."
|
||||
_preferencesBackup:
|
||||
autoBackup: "Respaldo automático"
|
||||
restoreFromBackup: "Restaurar desde copia de seguridad"
|
||||
@@ -1486,6 +1569,7 @@ _preferencesBackup:
|
||||
youNeedToNameYourProfileToEnableAutoBackup: "Se debe establecer un nombre de perfil para activar la copia de seguridad automática."
|
||||
autoPreferencesBackupIsNotEnabledForThisDevice: "La copia de seguridad automática de los ajustes no está activada en este dispositivo."
|
||||
backupFound: "Copia de seguridad de los ajustes encontrada "
|
||||
forceBackup: "Forzar una copia de seguridad de la configuración"
|
||||
_accountSettings:
|
||||
requireSigninToViewContents: "Se requiere iniciar sesión para ver el contenido"
|
||||
requireSigninToViewContentsDescription1: "Requiere iniciar sesión para ver todas las notas y otros contenidos que hayas creado. Se espera que esto evite que los rastreadores recopilen información."
|
||||
@@ -1523,7 +1607,7 @@ _bubbleGame:
|
||||
score: "Puntos"
|
||||
scoreYen: "Cantidad de dinero ganada"
|
||||
highScore: "Puntuación más alta"
|
||||
maxChain: "Número máximo de cadenas"
|
||||
maxChain: "Número máximo de combos"
|
||||
yen: "{yen} Yenes"
|
||||
estimatedQty: "{qty} Piezas"
|
||||
scoreSweets: "{onigiriQtyWithUnit} Onigiris"
|
||||
@@ -1601,7 +1685,7 @@ _initialTutorial:
|
||||
followers: "Visible solo para seguidores. Sólo tus seguidores podrán ver la nota, y no podrá ser renotada por otras personas."
|
||||
direct: "Visible sólo para usuarios específicos, y el destinatario será notificado. Puede usarse como alternativa a la mensajería directa."
|
||||
doNotSendConfidencialOnDirect1: "¡Ten cuidado cuando vayas a enviar información sensible!"
|
||||
doNotSendConfidencialOnDirect2: "Los administradores del servidor pueden leer lo que escribes. Ten cuidado cuando envíes información sensible en notas directas en servidores no confiables."
|
||||
doNotSendConfidencialOnDirect2: "Los administradores del servidor, también llamado instancia, pueden leer lo que escribes. Ten cuidado cuando envíes información sensible en notas directas en servidores o instancias no confiables."
|
||||
localOnly: "Publicando con esta opción seleccionada, la nota no se federará hacia otros servidores. Los usuarios de otros servidores no podrán ver estas notas directamente, sin importar los ajustes seleccionados más arriba."
|
||||
_cw:
|
||||
title: "Alerta de contenido (CW)"
|
||||
@@ -1957,7 +2041,7 @@ _role:
|
||||
isConditionalRole: "Esto es un rol condicional"
|
||||
isPublic: "Publicar rol"
|
||||
descriptionOfIsPublic: "Cualquiera puede ver los usuarios asignados a este rol. También, el perfil del usuario mostrará este rol."
|
||||
options: "Opción"
|
||||
options: "Opciones"
|
||||
policies: "Política"
|
||||
baseRole: "Rol base"
|
||||
useBaseValue: "Usar los valores del rol base"
|
||||
@@ -1991,6 +2075,7 @@ _role:
|
||||
canManageAvatarDecorations: "Administrar decoraciones de avatar"
|
||||
driveCapacity: "Capacidad del drive"
|
||||
maxFileSize: "Tamaño máximo de archivo que se puede cargar."
|
||||
maxFileSize_caption: "Los proxies inversos o las CDN pueden tener diferentes valores de configuración aguas arriba."
|
||||
alwaysMarkNsfw: "Siempre marcar archivos como NSFW"
|
||||
canUpdateBioMedia: "Puede editar un icono o una imagen de fondo (banner)"
|
||||
pinMax: "Máximo de notas fijadas"
|
||||
@@ -2018,6 +2103,7 @@ _role:
|
||||
uploadableFileTypes_caption: "Especifica los tipos MIME/archivos permitidos. Se pueden especificar varios tipos MIME separándolos con una nueva línea, y se pueden especificar comodines con un asterisco (*). (por ejemplo, image/*)"
|
||||
uploadableFileTypes_caption2: "Es posible que no se detecten algunos tipos de archivos. Para permitir estos archivos, añade {x} a la especificación."
|
||||
noteDraftLimit: "Número de posibles borradores de notas del servidor"
|
||||
scheduledNoteLimit: "Máximo número de notas programadas que se pueden crear simultáneamente."
|
||||
watermarkAvailable: "Disponibilidad de la función de marca de agua"
|
||||
_condition:
|
||||
roleAssignedTo: "Asignado a roles manuales"
|
||||
@@ -2066,11 +2152,11 @@ _accountDelete:
|
||||
accountDelete: "Eliminar Cuenta"
|
||||
mayTakeTime: "La eliminación de la cuenta es un proceso que precisa de carga. Puede pasar un tiempo hasta que se complete si es mucho el contenido creado y los archivos subidos."
|
||||
sendEmail: "Cuando se termine de borrar la cuenta, se enviará un correo a la dirección usada para el registro."
|
||||
requestAccountDelete: "Pedir la eliminación de la cuenta."
|
||||
requestAccountDelete: "Solicitar la eliminación de la cuenta."
|
||||
started: "El proceso de eliminación ha comenzado."
|
||||
inProgress: "La eliminación está en proceso."
|
||||
_ad:
|
||||
back: "Deseleccionar"
|
||||
back: "Anterior"
|
||||
reduceFrequencyOfThisAd: "Mostrar menos este anuncio."
|
||||
hide: "No mostrar"
|
||||
timezoneinfo: "El día de la semana está determidado por la zona horaria del servidor."
|
||||
@@ -2137,7 +2223,7 @@ _aboutMisskey:
|
||||
_displayOfSensitiveMedia:
|
||||
respect: "Esconder medios marcados como sensibles"
|
||||
ignore: "Mostrar medios marcados como sensibles"
|
||||
force: "Esconder todala multimedia"
|
||||
force: "Esconder toda la multimedia"
|
||||
_instanceTicker:
|
||||
none: "No mostrar"
|
||||
remote: "Mostrar a usuarios remotos"
|
||||
@@ -2213,7 +2299,7 @@ _theme:
|
||||
indicator: "Indicador"
|
||||
panel: "Panel"
|
||||
shadow: "Sombra"
|
||||
header: "Cabezal"
|
||||
header: "Título"
|
||||
navBg: "Fondo de la barra lateral"
|
||||
navFg: "Texto de la barra lateral"
|
||||
navActive: "Texto de la barra lateral (activo)"
|
||||
@@ -2408,6 +2494,7 @@ _auth:
|
||||
scopeUser: "Operar como el siguiente usuario"
|
||||
pleaseLogin: "Se requiere un inicio de sesión para darle permisos a la aplicación"
|
||||
byClickingYouWillBeRedirectedToThisUrl: "Cuando el acceso es concedido, serás automáticamente redireccionado a la siguiente URL"
|
||||
alreadyAuthorized: "Esta aplicación ya ha obtenido acceso."
|
||||
_antennaSources:
|
||||
all: "Todas las notas"
|
||||
homeTimeline: "Notas de los usuarios que sigues"
|
||||
@@ -2438,7 +2525,7 @@ _widgets:
|
||||
digitalClock: "Reloj digital"
|
||||
unixClock: "Reloj UNIX"
|
||||
federation: "Federación"
|
||||
instanceCloud: "Nube de palabras de la instancia"
|
||||
instanceCloud: "Nube de Instancias Federadas"
|
||||
postForm: "Formulario"
|
||||
slideshow: "Diapositivas"
|
||||
button: "Botón"
|
||||
@@ -2453,7 +2540,7 @@ _widgets:
|
||||
chooseList: "Seleccione una lista"
|
||||
clicker: "Cliqueador"
|
||||
birthdayFollowings: "Hoy cumplen años"
|
||||
chat: "Chat"
|
||||
chat: "Chatear"
|
||||
_cw:
|
||||
hide: "Ocultar"
|
||||
show: "Ver más"
|
||||
@@ -2463,7 +2550,7 @@ _poll:
|
||||
noOnlyOneChoice: "Se necesitan al menos 2 opciones"
|
||||
choiceN: "Opción {n}"
|
||||
noMore: "No se pueden agregar más"
|
||||
canMultipleVote: "Permitir más de una respuesta"
|
||||
canMultipleVote: "Permitir seleccionar varias opciones"
|
||||
expiration: "Termina el"
|
||||
infinite: "Sin límite de tiempo"
|
||||
at: "Elegir fecha y hora"
|
||||
@@ -2494,10 +2581,24 @@ _visibility:
|
||||
disableFederationDescription: "No enviar a otras instancias"
|
||||
_postForm:
|
||||
quitInspiteOfThereAreUnuploadedFilesConfirm: "Hay archivos que no se han cargado, ¿deseas descartarlos y cerrar el formulario?"
|
||||
uploaderTip: "El archivo aún no se ha cargado. Desde el menú Archivo, puedes cambiar el nombre, recortar imágenes, poner marcas de agua y comprimir o no el archivo. Los archivos se cargan automáticamente al publicar una nota."
|
||||
uploaderTip: "El archivo aún no se ha cargado. Desde el menú de archivos, puedes cambiar el nombre, recortar la imagen, añadir una marca de agua y configurar la compresión, entre otras opciones. Los archivos se suben automáticamente al publicar una nota."
|
||||
replyPlaceholder: "Responder a esta nota"
|
||||
quotePlaceholder: "Citar esta nota"
|
||||
channelPlaceholder: "Publicar en el canal"
|
||||
showHowToUse: "Mostrar el tutorial de este formulario"
|
||||
_howToUse:
|
||||
content_title: "Cuerpo"
|
||||
content_description: "Introduce aquí el contenido que deseas publicar."
|
||||
toolbar_title: "Barras de herramientas"
|
||||
toolbar_description: "Puedes adjuntar archivos o realizar encuestas, añadir anotaciones o hashtags e insertar emojis o menciones."
|
||||
account_title: "Menú de la cuenta"
|
||||
account_description: "Puedes cambiar entre cuentas para publicar o ver una lista de borradores y publicaciones programadas guardadas en tu cuenta."
|
||||
visibility_title: "Visibilidad"
|
||||
visibility_description: "Puedes configurar la visibilidad de tus notas."
|
||||
menu_title: "Menú"
|
||||
menu_description: "Puedes realizar otras acciones, como guardar borradores, programar publicaciones y configurar reacciones."
|
||||
submit_title: "Botón de publicar"
|
||||
submit_description: "Publica tus notas pulsando este botón. También puedes publicar utilizando Ctrl + Intro / Cmd + Intro."
|
||||
_placeholders:
|
||||
a: "¿Qué haces?"
|
||||
b: "¿Te pasó algo?"
|
||||
@@ -2509,10 +2610,10 @@ _profile:
|
||||
name: "Nombre"
|
||||
username: "Nombre de usuario"
|
||||
description: "Descripción"
|
||||
youCanIncludeHashtags: "Puedes añadir hashtags"
|
||||
youCanIncludeHashtags: "También puedes incluir hashtags en tu biografía"
|
||||
metadata: "información adicional"
|
||||
metadataEdit: "Editar información adicional"
|
||||
metadataDescription: "Muestra la información adicional en el perfil"
|
||||
metadataDescription: "Usando esto puedes mostrar campos de información adicionales en tu perfil."
|
||||
metadataLabel: "Etiqueta"
|
||||
metadataContent: "Contenido"
|
||||
changeAvatar: "Cambiar avatar"
|
||||
@@ -2532,7 +2633,7 @@ _exportOrImport:
|
||||
userLists: "Listas"
|
||||
excludeMutingUsers: "Excluir usuarios silenciados"
|
||||
excludeInactiveUsers: "Excluir usuarios inactivos"
|
||||
withReplies: "Incluir respuestas de los usuarios importados en la línea de tiempo"
|
||||
withReplies: "Si el archivo no incluye información sobre si las respuestas deben incluirse en la línea de tiempo, las respuestas realizadas por el importador deben incluirse en la línea de tiempo."
|
||||
_charts:
|
||||
federation: "Federación"
|
||||
apRequest: "Pedidos"
|
||||
@@ -2643,6 +2744,8 @@ _notification:
|
||||
youReceivedFollowRequest: "Has mandado una solicitud de seguimiento"
|
||||
yourFollowRequestAccepted: "Tu solicitud de seguimiento fue aceptada"
|
||||
pollEnded: "Estan disponibles los resultados de la encuesta"
|
||||
scheduledNotePosted: "Una nota programada ha sido publicada"
|
||||
scheduledNotePostFailed: "Ha fallado la publicación de una nota programada"
|
||||
newNote: "Nueva nota"
|
||||
unreadAntennaNote: "Antena {name}"
|
||||
roleAssigned: "Rol asignado"
|
||||
@@ -2668,10 +2771,12 @@ _notification:
|
||||
follow: "Siguiendo"
|
||||
mention: "Menciones"
|
||||
reply: "Respuestas"
|
||||
renote: "Renotar"
|
||||
renote: "Renotas"
|
||||
quote: "Citar"
|
||||
reaction: "Reacción"
|
||||
pollEnded: "La encuesta terminó"
|
||||
scheduledNotePosted: "Publicación programada con éxito"
|
||||
scheduledNotePostFailed: "Publicación programada fallida"
|
||||
receiveFollowRequest: "Recibió una solicitud de seguimiento"
|
||||
followRequestAccepted: "El seguimiento fue aceptado"
|
||||
roleAssigned: "Rol asignado"
|
||||
@@ -2722,7 +2827,7 @@ _deck:
|
||||
mentions: "Menciones"
|
||||
direct: "Notas directas"
|
||||
roleTimeline: "Linea de tiempo del rol"
|
||||
chat: "Chat"
|
||||
chat: "Chatear"
|
||||
_dialog:
|
||||
charactersExceeded: "¡Has excedido el límite de caracteres! Actualmente {current} de {max}."
|
||||
charactersBelow: "¡Estás por debajo del límite de caracteres! Actualmente {current} de {min}."
|
||||
@@ -2771,6 +2876,8 @@ _abuseReport:
|
||||
notifiedWebhook: "Webhook a utilizar"
|
||||
deleteConfirm: "¿Estás seguro de que deseas borrar el destinatario del informe de moderación?"
|
||||
_moderationLogTypes:
|
||||
clearQueue: "Borrar la cola de trabajos"
|
||||
promoteQueue: "Reintentar el trabajo en la cola"
|
||||
createRole: "Rol creado"
|
||||
deleteRole: "Rol eliminado"
|
||||
updateRole: "Rol actualizado"
|
||||
@@ -2923,7 +3030,7 @@ _reversi:
|
||||
loopedMap: "Mapa en bucle"
|
||||
canPutEverywhere: "Las fichas se pueden poner a cualquier lugar\n"
|
||||
timeLimitForEachTurn: "Tiempo límite por jugada."
|
||||
freeMatch: "Partida libre."
|
||||
freeMatch: "Partida libre"
|
||||
lookingForPlayer: "Buscando oponente"
|
||||
gameCanceled: "La partida ha sido cancelada."
|
||||
shareToTlTheGameWhenStart: "Compartir la partida en la línea de tiempo cuando comience "
|
||||
@@ -3165,10 +3272,13 @@ _watermarkEditor:
|
||||
title: "Editar la marca de agua"
|
||||
cover: "Cubrir todo"
|
||||
repeat: "Repetir"
|
||||
preserveBoundingRect: "Ajuste para evitar que se desborde al rotar."
|
||||
opacity: "Opacidad"
|
||||
scale: "Tamaño"
|
||||
text: "Texto"
|
||||
qr: "Código QR"
|
||||
position: "Posición"
|
||||
margin: "Margen"
|
||||
type: "Tipo"
|
||||
image: "Imágenes"
|
||||
advanced: "Avanzado"
|
||||
@@ -3176,39 +3286,48 @@ _watermarkEditor:
|
||||
stripe: "Rayas"
|
||||
stripeWidth: "Anchura de línea"
|
||||
stripeFrequency: "Número de líneas."
|
||||
polkadot: "Lunares"
|
||||
checker: "verificador"
|
||||
polkadot: "Patrón de Lunares"
|
||||
checker: "Patrón de Damas / Tablero de Ajedrez"
|
||||
polkadotMainDotOpacity: "Opacidad del círculo principal"
|
||||
polkadotMainDotRadius: "Tamaño del círculo principal."
|
||||
polkadotSubDotOpacity: "Opacidad del círculo secundario"
|
||||
polkadotSubDotRadius: "Tamaño del círculo secundario."
|
||||
polkadotSubDotDivisions: "Número de subpuntos."
|
||||
leaveBlankToAccountUrl: "Si dejas este campo en blanco, se utilizará la URL de tu cuenta."
|
||||
failedToLoadImage: "Error al cargar la imagen"
|
||||
_imageEffector:
|
||||
title: "Efecto"
|
||||
addEffect: "Añadir Efecto"
|
||||
discardChangesConfirm: "¿Ignorar cambios y salir?"
|
||||
nothingToConfigure: "No hay opciones configurables disponibles."
|
||||
failedToLoadImage: "Error al cargar la imagen"
|
||||
_fxs:
|
||||
chromaticAberration: "Aberración Cromática"
|
||||
glitch: "Glitch"
|
||||
mirror: "Espejo"
|
||||
invert: "Invertir colores"
|
||||
grayscale: "Blanco y negro"
|
||||
blur: "Difuminar"
|
||||
pixelate: "Pixelar"
|
||||
colorAdjust: "Corrección de Color"
|
||||
colorClamp: "Compresión cromática"
|
||||
colorClampAdvanced: "Compresión cromática avanzada"
|
||||
colorClamp: "Ajuste de Tono"
|
||||
colorClampAdvanced: "Ajuste de Tono avanzado"
|
||||
distort: "Distorsión"
|
||||
threshold: "umbral"
|
||||
zoomLines: "Saturación de Líneas"
|
||||
threshold: "Binarización"
|
||||
zoomLines: "Líneas de Impacto"
|
||||
stripe: "Rayas"
|
||||
polkadot: "Lunares"
|
||||
checker: "Corrector"
|
||||
blockNoise: "Bloquear Ruido"
|
||||
polkadot: "Patrón de Lunares"
|
||||
checker: "Patrón de Damas / Tablero de Ajedrez"
|
||||
blockNoise: "Ruido de Bloque"
|
||||
tearing: "Rasgado de Imagen (Tearing)"
|
||||
fill: "Relleno de color"
|
||||
_fxProps:
|
||||
angle: "Ángulo"
|
||||
scale: "Tamaño"
|
||||
size: "Tamaño"
|
||||
radius: "Radio"
|
||||
samples: "Tamaño de muestra"
|
||||
offset: "Posición"
|
||||
color: "Color"
|
||||
opacity: "Opacidad"
|
||||
normalize: "Normalización"
|
||||
@@ -3216,7 +3335,7 @@ _imageEffector:
|
||||
lightness: "Brillo"
|
||||
contrast: "Contraste"
|
||||
hue: "Tonalidad"
|
||||
brightness: "Brillo"
|
||||
brightness: "Luminancia"
|
||||
saturation: "Saturación"
|
||||
max: "Valor máximo"
|
||||
min: "Valor mínimo"
|
||||
@@ -3224,11 +3343,11 @@ _imageEffector:
|
||||
phase: "Fase"
|
||||
frequency: "Frecuencia"
|
||||
strength: "Intensidad"
|
||||
glitchChannelShift: "cambio de canal de imagen"
|
||||
glitchChannelShift: "Desfase"
|
||||
seed: "Valor de la semilla"
|
||||
redComponent: "Componente rojo"
|
||||
greenComponent: "Componente Verde"
|
||||
blueComponent: "Componente Azul"
|
||||
redComponent: "Canal Rojo"
|
||||
greenComponent: "Canal Verde"
|
||||
blueComponent: "Canal Azul"
|
||||
threshold: "Umbral"
|
||||
centerX: "Centrar X"
|
||||
centerY: "Centrar Y"
|
||||
@@ -3236,7 +3355,8 @@ _imageEffector:
|
||||
zoomLinesSmoothingDescription: "El suavizado y el ancho de línea de zoom no se pueden utilizar juntos."
|
||||
zoomLinesThreshold: "Ancho de línea del zoom"
|
||||
zoomLinesMaskSize: "Diámetro del centro"
|
||||
zoomLinesBlack: "Hacer oscuro"
|
||||
zoomLinesBlack: "Cambiar color de las líneas de impacto a negro."
|
||||
circle: "Círculo"
|
||||
drafts: "Borrador"
|
||||
_drafts:
|
||||
select: "Seleccionar borradores"
|
||||
@@ -3252,3 +3372,22 @@ _drafts:
|
||||
restoreFromDraft: "Restaurar desde los borradores"
|
||||
restore: "Restaurar"
|
||||
listDrafts: "Listar los borradores"
|
||||
schedule: "Programar Nota"
|
||||
listScheduledNotes: "Lista de notas programadas"
|
||||
cancelSchedule: "Cancelar programación"
|
||||
qr: "Código QR"
|
||||
_qr:
|
||||
showTabTitle: "Apariencia"
|
||||
readTabTitle: "Escanear"
|
||||
shareTitle: "{name} {acct}"
|
||||
shareText: "¡Sígueme en el Fediverso!"
|
||||
chooseCamera: "Seleccione cámara"
|
||||
cannotToggleFlash: "No se puede activar el flash"
|
||||
turnOnFlash: "Encender el flash"
|
||||
turnOffFlash: "Apagar el flash"
|
||||
startQr: "Reiniciar el lector de códigos QR"
|
||||
stopQr: "Detener el lector de códigos QR"
|
||||
noQrCodeFound: "No se encontró el código QR"
|
||||
scanFile: "Escanear imagen desde un dispositivo"
|
||||
raw: "Texto"
|
||||
mfm: "MFM"
|
||||
|
||||
@@ -1273,6 +1273,16 @@ postForm: "Formulaire de publication"
|
||||
information: "Informations"
|
||||
inMinutes: "min"
|
||||
inDays: "j"
|
||||
widgets: "Widgets"
|
||||
presets: "Préréglage"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
filename: "Nom du fichier"
|
||||
_imageFrameEditor:
|
||||
header: "Entête"
|
||||
font: "Police de caractères"
|
||||
fontSerif: "Serif"
|
||||
fontSansSerif: "Sans Serif"
|
||||
_chat:
|
||||
invitations: "Inviter"
|
||||
noHistory: "Pas d'historique"
|
||||
@@ -2036,6 +2046,9 @@ _postForm:
|
||||
replyPlaceholder: "Répondre à cette note ..."
|
||||
quotePlaceholder: "Citez cette note ..."
|
||||
channelPlaceholder: "Publier au canal…"
|
||||
_howToUse:
|
||||
visibility_title: "Visibilité"
|
||||
menu_title: "Menu"
|
||||
_placeholders:
|
||||
a: "Quoi de neuf ?"
|
||||
b: "Il s'est passé quelque chose ?"
|
||||
@@ -2376,6 +2389,10 @@ _imageEffector:
|
||||
angle: "Angle"
|
||||
scale: "Taille"
|
||||
size: "Taille"
|
||||
offset: "Position"
|
||||
color: "Couleur"
|
||||
opacity: "Transparence"
|
||||
lightness: "Clair"
|
||||
_qr:
|
||||
showTabTitle: "Affichage"
|
||||
raw: "Texte"
|
||||
|
||||
@@ -1,232 +0,0 @@
|
||||
import * as fs from 'node:fs';
|
||||
import { fileURLToPath } from 'node:url';
|
||||
import { dirname } from 'node:path';
|
||||
import * as yaml from 'js-yaml';
|
||||
import ts from 'typescript';
|
||||
|
||||
const __filename = fileURLToPath(import.meta.url);
|
||||
const __dirname = dirname(__filename);
|
||||
const parameterRegExp = /\{(\w+)\}/g;
|
||||
|
||||
function createMemberType(item) {
|
||||
if (typeof item !== 'string') {
|
||||
return ts.factory.createTypeLiteralNode(createMembers(item));
|
||||
}
|
||||
const parameters = Array.from(
|
||||
item.matchAll(parameterRegExp),
|
||||
([, parameter]) => parameter,
|
||||
);
|
||||
return parameters.length
|
||||
? ts.factory.createTypeReferenceNode(
|
||||
ts.factory.createIdentifier('ParameterizedString'),
|
||||
[
|
||||
ts.factory.createUnionTypeNode(
|
||||
parameters.map((parameter) =>
|
||||
ts.factory.createStringLiteral(parameter),
|
||||
),
|
||||
),
|
||||
],
|
||||
)
|
||||
: ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword);
|
||||
}
|
||||
|
||||
function createMembers(record) {
|
||||
return Object.entries(record).map(([k, v]) => {
|
||||
const node = ts.factory.createPropertySignature(
|
||||
undefined,
|
||||
ts.factory.createStringLiteral(k),
|
||||
undefined,
|
||||
createMemberType(v),
|
||||
);
|
||||
if (typeof v === 'string') {
|
||||
ts.addSyntheticLeadingComment(
|
||||
node,
|
||||
ts.SyntaxKind.MultiLineCommentTrivia,
|
||||
`*
|
||||
* ${v.replace(/\n/g, '\n * ')}
|
||||
`,
|
||||
true,
|
||||
);
|
||||
}
|
||||
return node;
|
||||
});
|
||||
}
|
||||
|
||||
export default function generateDTS() {
|
||||
const locale = yaml.load(fs.readFileSync(`${__dirname}/ja-JP.yml`, 'utf-8'));
|
||||
const members = createMembers(locale);
|
||||
const elements = [
|
||||
ts.factory.createVariableStatement(
|
||||
[ts.factory.createToken(ts.SyntaxKind.DeclareKeyword)],
|
||||
ts.factory.createVariableDeclarationList(
|
||||
[
|
||||
ts.factory.createVariableDeclaration(
|
||||
ts.factory.createIdentifier('kParameters'),
|
||||
undefined,
|
||||
ts.factory.createTypeOperatorNode(
|
||||
ts.SyntaxKind.UniqueKeyword,
|
||||
ts.factory.createKeywordTypeNode(ts.SyntaxKind.SymbolKeyword),
|
||||
),
|
||||
undefined,
|
||||
),
|
||||
],
|
||||
ts.NodeFlags.Const,
|
||||
),
|
||||
),
|
||||
ts.factory.createTypeAliasDeclaration(
|
||||
[ts.factory.createToken(ts.SyntaxKind.ExportKeyword)],
|
||||
ts.factory.createIdentifier('ParameterizedString'),
|
||||
[
|
||||
ts.factory.createTypeParameterDeclaration(
|
||||
undefined,
|
||||
ts.factory.createIdentifier('T'),
|
||||
ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword),
|
||||
ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword),
|
||||
),
|
||||
],
|
||||
ts.factory.createIntersectionTypeNode([
|
||||
ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword),
|
||||
ts.factory.createTypeLiteralNode([
|
||||
ts.factory.createPropertySignature(
|
||||
undefined,
|
||||
ts.factory.createComputedPropertyName(
|
||||
ts.factory.createIdentifier('kParameters'),
|
||||
),
|
||||
undefined,
|
||||
ts.factory.createTypeReferenceNode(
|
||||
ts.factory.createIdentifier('T'),
|
||||
undefined,
|
||||
),
|
||||
),
|
||||
])
|
||||
]),
|
||||
),
|
||||
ts.factory.createInterfaceDeclaration(
|
||||
[ts.factory.createToken(ts.SyntaxKind.ExportKeyword)],
|
||||
ts.factory.createIdentifier('ILocale'),
|
||||
undefined,
|
||||
undefined,
|
||||
[
|
||||
ts.factory.createIndexSignature(
|
||||
undefined,
|
||||
[
|
||||
ts.factory.createParameterDeclaration(
|
||||
undefined,
|
||||
undefined,
|
||||
ts.factory.createIdentifier('_'),
|
||||
undefined,
|
||||
ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword),
|
||||
undefined,
|
||||
),
|
||||
],
|
||||
ts.factory.createUnionTypeNode([
|
||||
ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword),
|
||||
ts.factory.createTypeReferenceNode(
|
||||
ts.factory.createIdentifier('ParameterizedString'),
|
||||
),
|
||||
ts.factory.createTypeReferenceNode(
|
||||
ts.factory.createIdentifier('ILocale'),
|
||||
undefined,
|
||||
),
|
||||
]),
|
||||
),
|
||||
],
|
||||
),
|
||||
ts.factory.createInterfaceDeclaration(
|
||||
[ts.factory.createToken(ts.SyntaxKind.ExportKeyword)],
|
||||
ts.factory.createIdentifier('Locale'),
|
||||
undefined,
|
||||
[
|
||||
ts.factory.createHeritageClause(ts.SyntaxKind.ExtendsKeyword, [
|
||||
ts.factory.createExpressionWithTypeArguments(
|
||||
ts.factory.createIdentifier('ILocale'),
|
||||
undefined,
|
||||
),
|
||||
]),
|
||||
],
|
||||
members,
|
||||
),
|
||||
ts.factory.createVariableStatement(
|
||||
[ts.factory.createToken(ts.SyntaxKind.DeclareKeyword)],
|
||||
ts.factory.createVariableDeclarationList(
|
||||
[
|
||||
ts.factory.createVariableDeclaration(
|
||||
ts.factory.createIdentifier('locales'),
|
||||
undefined,
|
||||
ts.factory.createTypeLiteralNode([
|
||||
ts.factory.createIndexSignature(
|
||||
undefined,
|
||||
[
|
||||
ts.factory.createParameterDeclaration(
|
||||
undefined,
|
||||
undefined,
|
||||
ts.factory.createIdentifier('lang'),
|
||||
undefined,
|
||||
ts.factory.createKeywordTypeNode(
|
||||
ts.SyntaxKind.StringKeyword,
|
||||
),
|
||||
undefined,
|
||||
),
|
||||
],
|
||||
ts.factory.createTypeReferenceNode(
|
||||
ts.factory.createIdentifier('Locale'),
|
||||
undefined,
|
||||
),
|
||||
),
|
||||
]),
|
||||
undefined,
|
||||
),
|
||||
],
|
||||
ts.NodeFlags.Const,
|
||||
),
|
||||
),
|
||||
ts.factory.createFunctionDeclaration(
|
||||
[ts.factory.createModifier(ts.SyntaxKind.ExportKeyword)],
|
||||
undefined,
|
||||
ts.factory.createIdentifier('build'),
|
||||
undefined,
|
||||
[],
|
||||
ts.factory.createTypeReferenceNode(
|
||||
ts.factory.createIdentifier('Locale'),
|
||||
undefined,
|
||||
),
|
||||
undefined,
|
||||
),
|
||||
ts.factory.createExportDefault(ts.factory.createIdentifier('locales')),
|
||||
];
|
||||
ts.addSyntheticLeadingComment(
|
||||
elements[0],
|
||||
ts.SyntaxKind.MultiLineCommentTrivia,
|
||||
' eslint-disable ',
|
||||
true,
|
||||
);
|
||||
ts.addSyntheticLeadingComment(
|
||||
elements[0],
|
||||
ts.SyntaxKind.SingleLineCommentTrivia,
|
||||
' This file is generated by locales/generateDTS.js',
|
||||
true,
|
||||
);
|
||||
ts.addSyntheticLeadingComment(
|
||||
elements[0],
|
||||
ts.SyntaxKind.SingleLineCommentTrivia,
|
||||
' Do not edit this file directly.',
|
||||
true,
|
||||
);
|
||||
const printed = ts
|
||||
.createPrinter({
|
||||
newLine: ts.NewLineKind.LineFeed,
|
||||
})
|
||||
.printList(
|
||||
ts.ListFormat.MultiLine,
|
||||
ts.factory.createNodeArray(elements),
|
||||
ts.createSourceFile(
|
||||
'index.d.ts',
|
||||
'',
|
||||
ts.ScriptTarget.ESNext,
|
||||
true,
|
||||
ts.ScriptKind.TS,
|
||||
),
|
||||
);
|
||||
|
||||
fs.writeFileSync(`${__dirname}/index.d.ts`, printed, 'utf-8');
|
||||
}
|
||||
@@ -240,6 +240,8 @@ blockedInstances: "Instansi terblokir"
|
||||
blockedInstancesDescription: "Daftar nama host dari instansi yang diperlukan untuk diblokir. Instansi yang didaftarkan tidak akan dapat berkomunikasi dengan instansi ini."
|
||||
silencedInstances: "Instansi yang disenyapkan"
|
||||
silencedInstancesDescription: "Daftar nama host dari instansi yang ingin kamu senyapkan. Semua akun dari instansi yang terdaftar akan diperlakukan sebagai disenyapkan. Hal ini membuat akun hanya dapat membuat permintaan mengikuti, dan tidak dapat menyebutkan akun lokal apabila tidak mengikuti. Hal ini tidak akan mempengaruhi instansi yang diblokir."
|
||||
mediaSilencedInstances: "Server dengan media dibisukan"
|
||||
mediaSilencedInstancesDescription: "Masukkan host server yang medianya ingin Anda bisukan, pisahkan dengan baris baru. Semua berkas dari akun di server ini akan dianggap sebagai sensitif dan emoji kustom tidak akan tersedia. Ini tidak akan membengaruhi server yang diblokir."
|
||||
federationAllowedHosts: "Server yang membolehkan federasi"
|
||||
muteAndBlock: "Bisukan / Blokir"
|
||||
mutedUsers: "Pengguna yang dibisukan"
|
||||
@@ -298,6 +300,7 @@ uploadFromUrlMayTakeTime: "Membutuhkan beberapa waktu hingga pengunggahan selesa
|
||||
explore: "Jelajahi"
|
||||
messageRead: "Telah dibaca"
|
||||
noMoreHistory: "Tidak ada sejarah lagi"
|
||||
startChat: "Kirim pesan"
|
||||
nUsersRead: "Dibaca oleh {n}"
|
||||
agreeTo: "Saya setuju kepada {0}"
|
||||
agree: "Setuju"
|
||||
@@ -397,7 +400,7 @@ enableHcaptcha: "Nyalakan hCaptcha"
|
||||
hcaptchaSiteKey: "Site Key"
|
||||
hcaptchaSecretKey: "Secret Key"
|
||||
mcaptcha: "mCaptcha"
|
||||
enableMcaptcha: "Nyalakan mCaptcha"
|
||||
enableMcaptcha: ""
|
||||
mcaptchaSiteKey: "Site key"
|
||||
mcaptchaSecretKey: "Secret Key"
|
||||
mcaptchaInstanceUrl: "URL instansi mCaptcha"
|
||||
@@ -510,6 +513,7 @@ emojiStyle: "Gaya emoji"
|
||||
native: "Native"
|
||||
menuStyle: "Gaya menu"
|
||||
style: "Gaya"
|
||||
popup: "Pemunculan"
|
||||
showNoteActionsOnlyHover: "Hanya tampilkan aksi catatan saat ditunjuk"
|
||||
showReactionsCount: "Lihat jumlah reaksi dalam catatan"
|
||||
noHistory: "Tidak ada riwayat"
|
||||
@@ -566,6 +570,7 @@ showFixedPostForm: "Tampilkan form posting di atas lini masa"
|
||||
showFixedPostFormInChannel: "Tampilkan form posting di atas lini masa (Kanal)"
|
||||
withRepliesByDefaultForNewlyFollowed: "Termasuk balasan dari pengguna baru yang diikuti pada lini masa secara bawaan"
|
||||
newNoteRecived: "Kamu mendapat catatan baru"
|
||||
newNote: "Catatan baru"
|
||||
sounds: "Bunyi"
|
||||
sound: "Bunyi"
|
||||
listen: "Dengarkan"
|
||||
@@ -1028,6 +1033,7 @@ permissionDeniedError: "Operasi ditolak"
|
||||
permissionDeniedErrorDescription: "Akun ini tidak memiliki izin untuk melakukan aksi ini."
|
||||
preset: "Prasetel"
|
||||
selectFromPresets: "Pilih dari prasetel"
|
||||
custom: "Penyesuaian"
|
||||
achievements: "Pencapaian"
|
||||
gotInvalidResponseError: "Respon peladen tidak valid"
|
||||
gotInvalidResponseErrorDescription: "Peladen tidak dapat dijangkau atau sedang dalam perawatan. Mohon coba lagi nanti."
|
||||
@@ -1110,6 +1116,7 @@ preservedUsernamesDescription: "Daftar nama pengguna yang dicadangkan dipisah de
|
||||
createNoteFromTheFile: "Buat catatan dari berkas ini"
|
||||
archive: "Arsipkan"
|
||||
archived: "Diarsipkan"
|
||||
unarchive: "Batalkan pengarsipan"
|
||||
channelArchiveConfirmTitle: "Yakin untuk mengarsipkan {name}?"
|
||||
channelArchiveConfirmDescription: "Kanal yang diarsipkan tidak akan muncul pada daftar kanal atau hasil pencarian. Postingan baru juga tidak dapat ditambahkan lagi."
|
||||
thisChannelArchived: "Kanal ini telah diarsipkan."
|
||||
@@ -1251,6 +1258,7 @@ noDescription: "Tidak ada deskripsi"
|
||||
alwaysConfirmFollow: "Selalu konfirmasi ketika mengikuti"
|
||||
inquiry: "Hubungi kami"
|
||||
tryAgain: "Silahkan coba lagi."
|
||||
sensitiveMediaRevealConfirm: "Media sensitif. Apakah ingin melihat?"
|
||||
createdLists: "Senarai yang dibuat"
|
||||
createdAntennas: "Antena yang dibuat"
|
||||
fromX: "Dari {x}"
|
||||
@@ -1258,20 +1266,52 @@ noteOfThisUser: "Catatan oleh pengguna ini"
|
||||
clipNoteLimitExceeded: "Klip ini tak bisa ditambahi lagi catatan."
|
||||
performance: "Kinerja"
|
||||
modified: "Diubah"
|
||||
discard: "Buang"
|
||||
thereAreNChanges: "Ada {n} perubahan"
|
||||
signinWithPasskey: "Masuk dengan kunci sandi"
|
||||
unknownWebAuthnKey: "Kunci sandi tidak terdaftar."
|
||||
passkeyVerificationFailed: "Verifikasi kunci sandi gagal."
|
||||
passkeyVerificationSucceededButPasswordlessLoginDisabled: "Verifikasi kunci sandi berhasil, namun pemasukan tanpa sandi dinonaktifkan."
|
||||
messageToFollower: "Pesan kepada pengikut"
|
||||
prohibitedWordsForNameOfUser: "Kata yang dilarang untuk nama pengguna"
|
||||
lockdown: "Kuncitara"
|
||||
noName: "Tidak ada nama"
|
||||
skip: "Lewati"
|
||||
paste: "Tempel"
|
||||
emojiPalette: "Palet emoji"
|
||||
postForm: "Buat catatan"
|
||||
information: "Informasi"
|
||||
chat: "Obrolan"
|
||||
directMessage: "Obrolan pengguna"
|
||||
right: "Kanan"
|
||||
bottom: "Bawah"
|
||||
top: "Atas"
|
||||
advice: "Saran"
|
||||
inMinutes: "menit"
|
||||
inDays: "hari"
|
||||
widgets: "Widget"
|
||||
presets: "Prasetel"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
filename: "Nama berkas"
|
||||
_imageFrameEditor:
|
||||
header: "Header"
|
||||
font: "Font"
|
||||
fontSerif: "Serif"
|
||||
fontSansSerif: "Sans-serif"
|
||||
_chat:
|
||||
invitations: "Undang"
|
||||
history: "Riwayat obrolan"
|
||||
noHistory: "Tidak ada riwayat"
|
||||
members: "Anggota"
|
||||
home: "Beranda"
|
||||
send: "Kirim"
|
||||
chatWithThisUser: "Obrolan pengguna"
|
||||
_settings:
|
||||
webhook: "Webhook"
|
||||
contentsUpdateFrequency: "Frekuensi pembaruan konten"
|
||||
_preferencesProfile:
|
||||
profileName: "Nama profil"
|
||||
_abuseUserReport:
|
||||
accept: "Setuju"
|
||||
reject: "Tolak"
|
||||
@@ -1965,6 +2005,7 @@ _sfx:
|
||||
noteMy: "Catatan (Saya)"
|
||||
notification: "Notifikasi"
|
||||
reaction: "Ketika memilih reaksi"
|
||||
chatMessage: "Obrolan pengguna"
|
||||
_soundSettings:
|
||||
driveFile: "Menggunakan berkas audio dalam Drive"
|
||||
driveFileWarn: "Pilih berkas audio dari Drive"
|
||||
@@ -2167,6 +2208,7 @@ _widgets:
|
||||
chooseList: "Pilih daftar"
|
||||
clicker: "Pengeklik"
|
||||
birthdayFollowings: "Pengguna yang merayakan hari ulang tahunnya hari ini"
|
||||
chat: "Obrolan pengguna"
|
||||
_cw:
|
||||
hide: "Sembunyikan"
|
||||
show: "Lihat konten"
|
||||
@@ -2209,6 +2251,9 @@ _postForm:
|
||||
replyPlaceholder: "Balas ke catatan ini..."
|
||||
quotePlaceholder: "Kutip catatan ini..."
|
||||
channelPlaceholder: "Posting ke kanal"
|
||||
_howToUse:
|
||||
visibility_title: "Visibilitas"
|
||||
menu_title: "Menu"
|
||||
_placeholders:
|
||||
a: "Sedang apa kamu saat ini?"
|
||||
b: "Apa yang terjadi di sekitarmu?"
|
||||
@@ -2415,6 +2460,7 @@ _deck:
|
||||
mentions: "Sebutan"
|
||||
direct: "Langsung"
|
||||
roleTimeline: "Lini masa peran"
|
||||
chat: "Obrolan pengguna"
|
||||
_dialog:
|
||||
charactersExceeded: "Kamu telah melebihi batas karakter maksimum! Saat ini pada {current} dari {max}."
|
||||
charactersBelow: "Kamu berada di bawah batas minimum karakter! Saat ini pada {current} dari {min}."
|
||||
@@ -2631,6 +2677,10 @@ _imageEffector:
|
||||
angle: "Sudut"
|
||||
scale: "Ukuran"
|
||||
size: "Ukuran"
|
||||
offset: "Posisi"
|
||||
color: "Warna"
|
||||
opacity: "Opasitas"
|
||||
lightness: "Menerangkan"
|
||||
_qr:
|
||||
showTabTitle: "Tampilkan"
|
||||
raw: "Teks"
|
||||
|
||||
@@ -1,93 +0,0 @@
|
||||
/**
|
||||
* Languages Loader
|
||||
*/
|
||||
|
||||
import * as fs from 'node:fs';
|
||||
import * as yaml from 'js-yaml';
|
||||
|
||||
const merge = (...args) => args.reduce((a, c) => ({
|
||||
...a,
|
||||
...c,
|
||||
...Object.entries(a)
|
||||
.filter(([k]) => c && typeof c[k] === 'object')
|
||||
.reduce((a, [k, v]) => (a[k] = merge(v, c[k]), a), {})
|
||||
}), {});
|
||||
|
||||
const languages = [
|
||||
'ar-SA',
|
||||
'ca-ES',
|
||||
'cs-CZ',
|
||||
'da-DK',
|
||||
'de-DE',
|
||||
'en-US',
|
||||
'es-ES',
|
||||
'fr-FR',
|
||||
'id-ID',
|
||||
'it-IT',
|
||||
'ja-JP',
|
||||
'ja-KS',
|
||||
'kab-KAB',
|
||||
'kn-IN',
|
||||
'ko-KR',
|
||||
'nl-NL',
|
||||
'no-NO',
|
||||
'pl-PL',
|
||||
'pt-PT',
|
||||
'ru-RU',
|
||||
'sk-SK',
|
||||
'th-TH',
|
||||
'tr-TR',
|
||||
'ug-CN',
|
||||
'uk-UA',
|
||||
'vi-VN',
|
||||
'zh-CN',
|
||||
'zh-TW',
|
||||
];
|
||||
|
||||
const primaries = {
|
||||
'en': 'US',
|
||||
'ja': 'JP',
|
||||
'zh': 'CN',
|
||||
};
|
||||
|
||||
// 何故か文字列にバックスペース文字が混入することがあり、YAMLが壊れるので取り除く
|
||||
const clean = (text) => text.replace(new RegExp(String.fromCodePoint(0x08), 'g'), '');
|
||||
|
||||
export function build() {
|
||||
// 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) => {
|
||||
for (const [k, v] of Object.entries(obj)) {
|
||||
if (v === '') {
|
||||
delete obj[k];
|
||||
} else if (typeof v === 'object') {
|
||||
removeEmpty(v);
|
||||
}
|
||||
}
|
||||
return obj;
|
||||
};
|
||||
removeEmpty(locales);
|
||||
|
||||
return Object.entries(locales)
|
||||
.reduce((a, [k, v]) => (a[k] = (() => {
|
||||
const [lang] = k.split('-');
|
||||
switch (k) {
|
||||
case 'ja-JP': return v;
|
||||
case 'ja-KS':
|
||||
case 'en-US': return merge(locales['ja-JP'], v);
|
||||
default: return merge(
|
||||
locales['ja-JP'],
|
||||
locales['en-US'],
|
||||
locales[`${lang}-${primaries[lang]}`] ?? {},
|
||||
v
|
||||
);
|
||||
}
|
||||
})(), a), {});
|
||||
}
|
||||
|
||||
export default build();
|
||||
@@ -83,6 +83,8 @@ files: "Allegati"
|
||||
download: "Scarica"
|
||||
driveFileDeleteConfirm: "Vuoi davvero eliminare il file \"{name}\", e le Note a cui è stato allegato?"
|
||||
unfollowConfirm: "Vuoi davvero togliere il Following a {name}?"
|
||||
cancelFollowRequestConfirm: "Vuoi annullare la tua richiesta di follow inviata a {name}?"
|
||||
rejectFollowRequestConfirm: "Vuoi rifiutare la richiesta di follow ricevuta da {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"
|
||||
@@ -144,7 +146,7 @@ markAsSensitive: "Segna come esplicito"
|
||||
unmarkAsSensitive: "Non segnare come esplicito "
|
||||
enterFileName: "Nome del file"
|
||||
mute: "Silenziare"
|
||||
unmute: "Riattiva l'audio"
|
||||
unmute: "Dai voce"
|
||||
renoteMute: "Silenziare le Rinota"
|
||||
renoteUnmute: "Non silenziare le Rinota"
|
||||
block: "Bloccare"
|
||||
@@ -253,6 +255,7 @@ noteDeleteConfirm: "Vuoi davvero eliminare questa Nota?"
|
||||
pinLimitExceeded: "Non puoi fissare altre note "
|
||||
done: "Fine"
|
||||
processing: "In elaborazione"
|
||||
preprocessing: "In preparazione"
|
||||
preview: "Anteprima"
|
||||
default: "Predefinito"
|
||||
defaultValueIs: "Predefinito: {value}"
|
||||
@@ -301,6 +304,7 @@ uploadFromUrlMayTakeTime: "Il caricamento del file può richiedere tempo."
|
||||
uploadNFiles: "Caricare {n} file singolarmente"
|
||||
explore: "Esplora"
|
||||
messageRead: "Visualizzato"
|
||||
readAllChatMessages: "Segna tutti i messaggi come già letti"
|
||||
noMoreHistory: "Non c'è più cronologia da visualizzare"
|
||||
startChat: "Inizia a chattare"
|
||||
nUsersRead: "Letto da {n} persone"
|
||||
@@ -333,6 +337,7 @@ fileName: "Nome dell'allegato"
|
||||
selectFile: "Scelta allegato"
|
||||
selectFiles: "Scelta allegato"
|
||||
selectFolder: "Seleziona cartella"
|
||||
unselectFolder: "Deseleziona la cartella"
|
||||
selectFolders: "Seleziona cartella"
|
||||
fileNotSelected: "Nessun file selezionato"
|
||||
renameFile: "Rinomina file"
|
||||
@@ -345,6 +350,7 @@ addFile: "Allega"
|
||||
showFile: "Visualizza file"
|
||||
emptyDrive: "Il Drive è vuoto"
|
||||
emptyFolder: "La cartella è vuota"
|
||||
dropHereToUpload: "Trascina qui il tuo file per caricarlo"
|
||||
unableToDelete: "Eliminazione impossibile"
|
||||
inputNewFileName: "Inserisci nome del nuovo file"
|
||||
inputNewDescription: "Inserisci una nuova descrizione"
|
||||
@@ -455,7 +461,7 @@ setupOf2fa: "Impostare l'autenticazione a due fattori"
|
||||
totp: "App di autenticazione a due fattori (2FA/MFA)"
|
||||
totpDescription: "Puoi autenticarti inserendo un codice OTP tramite la tua App di autenticazione a due fattori (2FA/MFA)"
|
||||
moderator: "Moderatore"
|
||||
moderation: "moderazione"
|
||||
moderation: "Moderazione"
|
||||
moderationNote: "Promemoria di moderazione"
|
||||
moderationNoteDescription: "Puoi scrivere promemoria condivisi solo tra moderatori."
|
||||
addModerationNote: "Aggiungi promemoria di moderazione"
|
||||
@@ -496,7 +502,7 @@ attachAsFileQuestion: "Il testo copiato eccede le dimensioni, vuoi allegarlo?"
|
||||
onlyOneFileCanBeAttached: "È possibile allegare al messaggio soltanto uno file"
|
||||
signinRequired: "Occorre avere un profilo registrato su questa istanza"
|
||||
signinOrContinueOnRemote: "Per continuare, devi accedere alla tua istanza o registrarti su questa e poi accedere"
|
||||
invitations: "Invita"
|
||||
invitations: "Inviti"
|
||||
invitationCode: "Codice di invito"
|
||||
checking: "Confermando"
|
||||
available: "Disponibile"
|
||||
@@ -522,7 +528,7 @@ style: "Stile"
|
||||
drawer: "Drawer"
|
||||
popup: "Popup"
|
||||
showNoteActionsOnlyHover: "Mostra le azioni delle Note solo al passaggio del mouse"
|
||||
showReactionsCount: "Visualizza il numero di reazioni su una nota"
|
||||
showReactionsCount: "Visualizza la quantità di reazioni su una nota"
|
||||
noHistory: "Nessuna cronologia"
|
||||
signinHistory: "Storico degli accessi al profilo"
|
||||
enableAdvancedMfm: "Attivare i Misskey Flavoured Markdown (MFM) avanzati"
|
||||
@@ -577,7 +583,7 @@ showFixedPostForm: "Visualizzare la finestra di pubblicazione in cima alla timel
|
||||
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"
|
||||
newNote: "Nuova Nota"
|
||||
newNote: "Nuove Note"
|
||||
sounds: "Impostazioni suoni"
|
||||
sound: "Suono"
|
||||
notificationSoundSettings: "Preferenze di notifica"
|
||||
@@ -687,16 +693,16 @@ emptyToDisableSmtpAuth: "Lasciare i campi vuoti se non c'è autenticazione SMTP"
|
||||
smtpSecure: "Usare SSL/TLS implicito per le connessioni SMTP"
|
||||
smtpSecureInfo: "Disabilitare quando è attivo STARTTLS."
|
||||
testEmail: "Verifica il funzionamento"
|
||||
wordMute: "Filtri parole"
|
||||
wordMuteDescription: "Contrae le Note con la parola o la frase specificata. Permette di espandere le Note, cliccandole."
|
||||
hardWordMute: "Filtro parole forte"
|
||||
wordMute: "Parole silenziate"
|
||||
wordMuteDescription: "Comprimi le Note che hanno la parola o la regola specificata. Cliccale per espanderle e leggerne comunque il contenuto."
|
||||
hardWordMute: "Filtro per parole"
|
||||
showMutedWord: "Elenca le parole silenziate"
|
||||
hardWordMuteDescription: "Nasconde le Note con la parola o la frase specificata. A differenza delle parole silenziate, la Nota non verrà federata."
|
||||
hardWordMuteDescription: "Ignora le Note con la parola o la regola specificata. A differenza delle \"Parole Silenziate\", queste Note non ti verranno proprio recapitate."
|
||||
regexpError: "errore regex"
|
||||
regexpErrorDescription: "Si è verificato un errore nell'espressione regolare alla riga {line} della parola muta {tab}:"
|
||||
instanceMute: "Silenziare l'istanza"
|
||||
userSaysSomething: "{name} ha detto qualcosa"
|
||||
userSaysSomethingAbout: "{name} ha Notato a riguardo di \"{word}\""
|
||||
userSaysSomethingAbout: "{name} ha anNotato qualcosa su \"{word}\""
|
||||
makeActive: "Attiva"
|
||||
display: "Visualizza"
|
||||
copy: "Copia"
|
||||
@@ -752,19 +758,19 @@ i18nInfo: "Misskey è tradotto in diverse lingue da volontari. Anche tu puoi con
|
||||
manageAccessTokens: "Gestisci token di accesso"
|
||||
accountInfo: "Informazioni profilo"
|
||||
notesCount: "Conteggio note"
|
||||
repliesCount: "Numero di risposte inviate"
|
||||
renotesCount: "Numero di note che hai ricondiviso"
|
||||
repliedCount: "Numero di risposte ricevute"
|
||||
renotedCount: "Numero delle tue note ricondivise"
|
||||
followingCount: "Numero di Following"
|
||||
followersCount: "Numero di profili che ti seguono"
|
||||
sentReactionsCount: "Numero di reazioni inviate"
|
||||
receivedReactionsCount: "Numero di reazioni ricevute"
|
||||
pollVotesCount: "Numero di voti inviati"
|
||||
pollVotedCount: "Numero di voti ricevuti"
|
||||
repliesCount: "Quantità di risposte"
|
||||
renotesCount: "Quantità di Note ricondivise"
|
||||
repliedCount: "Quantità di risposte"
|
||||
renotedCount: "Quantità di tue Note ricondivise"
|
||||
followingCount: "Quantità di Following"
|
||||
followersCount: "Quantità di Follower"
|
||||
sentReactionsCount: "Quantità di reazioni"
|
||||
receivedReactionsCount: "Quantità di reazioni ricevute"
|
||||
pollVotesCount: "Quantità di voti"
|
||||
pollVotedCount: "Quantità di voti ricevuti"
|
||||
yes: "Sì"
|
||||
no: "No"
|
||||
driveFilesCount: "Numero di file nel Drive"
|
||||
driveFilesCount: "Quantità di file nel Drive"
|
||||
driveUsage: "Utilizzazione del Drive"
|
||||
noCrawle: "Rifiuta l'indicizzazione dai robot."
|
||||
noCrawleDescription: "Richiedi che i motori di ricerca non indicizzino la tua pagina di profilo, le tue note, pagine, ecc."
|
||||
@@ -772,12 +778,13 @@ lockedAccountInfo: "A meno che non imposti la visibilità delle tue note su \"So
|
||||
alwaysMarkSensitive: "Segnare automaticamente come espliciti gli allegati"
|
||||
loadRawImages: "Visualizza le intere immagini allegate invece delle miniature."
|
||||
disableShowingAnimatedImages: "Disabilitare le immagini animate"
|
||||
disableShowingAnimatedImages_caption: "L'attivazione delle animazioni immagini potrebbe interferire sull'accessibilità e sul risparmio energetico nel dispositivo."
|
||||
highlightSensitiveMedia: "Evidenzia i media espliciti"
|
||||
verificationEmailSent: "Una mail di verifica è stata inviata. Si prega di accedere al collegamento per compiere la verifica."
|
||||
notSet: "Non impostato"
|
||||
emailVerified: "Il tuo indirizzo email è stato verificato"
|
||||
noteFavoritesCount: "Conteggio note tra i preferiti"
|
||||
pageLikesCount: "Numero di pagine che ti piacciono"
|
||||
pageLikesCount: "Quantità di pagine che ti piacciono"
|
||||
pageLikedCount: "Numero delle tue pagine che hanno ricevuto \"Mi piace\""
|
||||
contact: "Contatti"
|
||||
useSystemFont: "Usa il carattere predefinito del sistema"
|
||||
@@ -822,9 +829,9 @@ currentVersion: "Versione attuale"
|
||||
latestVersion: "Ultima versione"
|
||||
youAreRunningUpToDateClient: "Stai usando la versione più recente del client."
|
||||
newVersionOfClientAvailable: "Una nuova versione del tuo client è disponibile."
|
||||
usageAmount: "In uso"
|
||||
usageAmount: "Quantità utilizzata"
|
||||
capacity: "Capacità"
|
||||
inUse: "In uso"
|
||||
inUse: "Usata da"
|
||||
editCode: "Modifica codice"
|
||||
apply: "Applica"
|
||||
receiveAnnouncementFromInstance: "Ricevi i messaggi informativi dall'istanza"
|
||||
@@ -899,7 +906,7 @@ useBlurEffect: "Utilizza effetto sfocatura"
|
||||
learnMore: "Per saperne di più"
|
||||
misskeyUpdated: "Misskey è stato aggiornato!"
|
||||
whatIsNew: "Informazioni sull'aggiornamento"
|
||||
translate: "Traduci"
|
||||
translate: "Traduzione"
|
||||
translatedFrom: "Traduzione da {x}"
|
||||
accountDeletionInProgress: "È in corso l'eliminazione del profilo"
|
||||
usernameInfo: "Un nome per identificare univocamente il tuo profilo sull'istanza. Puoi utilizzare caratteri alfanumerici maiuscoli, minuscoli e il trattino basso (_). Non potrai cambiare nome utente in seguito."
|
||||
@@ -910,7 +917,7 @@ pubSub: "Publish/Subscribe del profilo"
|
||||
lastCommunication: "La comunicazione più recente"
|
||||
resolved: "Risolto"
|
||||
unresolved: "Non risolto"
|
||||
breakFollow: "Rimuovi Follower"
|
||||
breakFollow: "Rimuovere Follower"
|
||||
breakFollowConfirm: "Vuoi davvero togliere questo Follower?"
|
||||
itsOn: "Abilitato"
|
||||
itsOff: "Disabilitato"
|
||||
@@ -943,7 +950,7 @@ tablet: "Tablet"
|
||||
auto: "Automatico"
|
||||
themeColor: "Colore del tema"
|
||||
size: "Dimensioni"
|
||||
numberOfColumn: "Numero di colonne"
|
||||
numberOfColumn: "Quantità di colonne"
|
||||
searchByGoogle: "Cerca"
|
||||
instanceDefaultLightTheme: "Istanza, tema luminoso predefinito."
|
||||
instanceDefaultDarkTheme: "Istanza, tema scuro predefinito."
|
||||
@@ -980,7 +987,7 @@ isSystemAccount: "Si tratta di un profilo creato e gestito automaticamente dal s
|
||||
typeToConfirm: "Digita {x} per continuare"
|
||||
deleteAccount: "Eliminazione profilo"
|
||||
document: "Documentazione"
|
||||
numberOfPageCache: "Numero di pagine cache"
|
||||
numberOfPageCache: "Quantità di pagine in cache"
|
||||
numberOfPageCacheDescription: "Aumenta l'usabilità, ma aumenta anche il carico e l'utilizzo della memoria."
|
||||
logoutConfirm: "Vuoi davvero uscire da Misskey? "
|
||||
logoutWillClearClientData: "All'uscita, la configurazione del client viene rimossa dal browser. Per ripristinarla quando si effettua nuovamente l'accesso, abilitare il backup automatico."
|
||||
@@ -1018,6 +1025,9 @@ pushNotificationAlreadySubscribed: "Le notifiche push sono già attivate"
|
||||
pushNotificationNotSupported: "Il client o il server non supporta le notifiche push"
|
||||
sendPushNotificationReadMessage: "Eliminare le notifiche push dopo la relativa lettura"
|
||||
sendPushNotificationReadMessageCaption: "Se possibile, verrà mostrata brevemente una notifica con il testo \"{emptyPushNotificationMessage}\". Potrebbe influire negativamente sulla durata della batteria."
|
||||
pleaseAllowPushNotification: "Per favore, acconsenti alla ricezione di notifiche nel browser"
|
||||
browserPushNotificationDisabled: "Non è stato possibile ottenere il consenso alla ricezione di notifche"
|
||||
browserPushNotificationDisabledDescription: "Non hai concesso a {serverName} di spedire notifiche. Per favore, acconsenti alla ricezione nelle impostazioni del browser e riprova."
|
||||
windowMaximize: "Ingrandisci"
|
||||
windowMinimize: "Contrai finestra"
|
||||
windowRestore: "Ripristina"
|
||||
@@ -1028,7 +1038,7 @@ cannotLoad: "Caricamento impossibile"
|
||||
numberOfProfileView: "Visualizzazioni profilo"
|
||||
like: "Mi piace!"
|
||||
unlike: "Non mi piace"
|
||||
numberOfLikes: "Numero di Like"
|
||||
numberOfLikes: "Quantità di Like"
|
||||
show: "Visualizza"
|
||||
neverShow: "Non mostrare più"
|
||||
remindMeLater: "Rimanda"
|
||||
@@ -1168,12 +1178,13 @@ installed: "Installazione avvenuta"
|
||||
branding: "Branding"
|
||||
enableServerMachineStats: "Pubblicare le informazioni sul server"
|
||||
enableIdenticonGeneration: "Generazione automatica delle Identicon"
|
||||
showRoleBadgesOfRemoteUsers: "Visualizza i badge per i ruoli concessi ai profili remoti"
|
||||
turnOffToImprovePerformance: "Disattiva, per migliorare le prestazioni"
|
||||
createInviteCode: "Genera codice di invito"
|
||||
createWithOptions: "Genera con opzioni"
|
||||
createCount: "Conteggio inviti"
|
||||
inviteCodeCreated: "Inviti generati"
|
||||
inviteLimitExceeded: "Hai raggiunto il numero massimo di codici invito generabili."
|
||||
inviteLimitExceeded: "Hai raggiunto la quantità massima di codici invito generabili."
|
||||
createLimitRemaining: "Inviti generabili: {limit} rimanenti"
|
||||
inviteLimitResetCycle: "Alle {time}, il limite verrà ripristinato a {limit}"
|
||||
expirationDate: "Scadenza"
|
||||
@@ -1290,7 +1301,7 @@ sensitiveMediaRevealConfirm: "Questo allegato è esplicito, vuoi vederlo?"
|
||||
createdLists: "Liste create"
|
||||
createdAntennas: "Antenne create"
|
||||
fromX: "Da {x}"
|
||||
genEmbedCode: "Ottieni il codice di incorporamento"
|
||||
genEmbedCode: "Ottieni il codice per incorporare"
|
||||
noteOfThisUser: "Elenco di Note di questo profilo"
|
||||
clipNoteLimitExceeded: "Non è possibile aggiungere ulteriori Note a questa Clip."
|
||||
performance: "Prestazioni"
|
||||
@@ -1316,13 +1327,14 @@ acknowledgeNotesAndEnable: "Attivare dopo averne compreso il comportamento."
|
||||
federationSpecified: "Questo server è federato solo con istanze specifiche del Fediverso. Puoi interagire solo con quelle scelte dall'amministrazione."
|
||||
federationDisabled: "Questo server ha la federazione disabilitata. Non puoi interagire con profili provenienti da altri server."
|
||||
draft: "Bozza"
|
||||
draftsAndScheduledNotes: "Bozze e Note pianificate"
|
||||
confirmOnReact: "Confermare le reazioni"
|
||||
reactAreYouSure: "Vuoi davvero reagire con {emoji} ?"
|
||||
markAsSensitiveConfirm: "Vuoi davvero indicare questo contenuto multimediale come esplicito?"
|
||||
unmarkAsSensitiveConfirm: "Vuoi davvero indicare come non esplicito il contenuto multimediale?"
|
||||
preferences: "Preferenze"
|
||||
accessibility: "Accessibilità"
|
||||
preferencesProfile: "Profilo preferenze"
|
||||
preferencesProfile: "Preferenze del profilo"
|
||||
copyPreferenceId: "Copia ID preferenze"
|
||||
resetToDefaultValue: "Ripristina a predefinito"
|
||||
overrideByAccount: "Sovrascrivere col profilo"
|
||||
@@ -1340,9 +1352,11 @@ preferenceSyncConflictChoiceCancel: "Annulla la sincronizzazione"
|
||||
paste: "Incolla"
|
||||
emojiPalette: "Tavolozza emoji"
|
||||
postForm: "Finestra di pubblicazione"
|
||||
textCount: "Il numero di caratteri"
|
||||
textCount: "Quantità di caratteri"
|
||||
information: "Informazioni"
|
||||
chat: "Chat"
|
||||
directMessage: "Chattare insieme"
|
||||
directMessage_short: "Messaggio"
|
||||
migrateOldSettings: "Migrare le vecchie impostazioni"
|
||||
migrateOldSettings_description: "Di solito, viene fatto automaticamente. Se per qualche motivo non fossero migrate con successo, è possibile avviare il processo di migrazione manualmente, sovrascrivendo le configurazioni attuali."
|
||||
compress: "Compressione"
|
||||
@@ -1370,6 +1384,8 @@ redisplayAllTips: "Mostra tutti i suggerimenti"
|
||||
hideAllTips: "Nascondi tutti i suggerimenti"
|
||||
defaultImageCompressionLevel: "Livello predefinito di compressione immagini"
|
||||
defaultImageCompressionLevel_description: "La compressione diminuisce la qualità dell'immagine, poca compressione mantiene alta qualità delle immagini. Aumentandola, si riducono le dimensioni del file, a discapito della qualità dell'immagine."
|
||||
defaultCompressionLevel: "Compressione predefinita"
|
||||
defaultCompressionLevel_description: "Diminuisci per mantenere la qualità aumentando le dimensioni del file.<br> Aumenta per ridurre le dimensioni del file e anche la qualità."
|
||||
inMinutes: "min"
|
||||
inDays: "giorni"
|
||||
safeModeEnabled: "La modalità sicura è attiva"
|
||||
@@ -1377,10 +1393,73 @@ pluginsAreDisabledBecauseSafeMode: "Tutti i plugin sono disattivati, poiché la
|
||||
customCssIsDisabledBecauseSafeMode: "Il CSS personalizzato non è stato applicato, poiché la modalità sicura è attiva."
|
||||
themeIsDefaultBecauseSafeMode: "Quando la modalità sicura è attiva, viene utilizzato il tema predefinito. Quando la modalità sicura viene disattivata, il tema torna a essere quello precedente."
|
||||
thankYouForTestingBeta: "Grazie per la tua collaborazione nella verifica delle versioni beta!"
|
||||
createUserSpecifiedNote: "Crea Nota privata"
|
||||
schedulePost: "Pianificare la pubblicazione"
|
||||
scheduleToPostOnX: "Pianificare la pubblicazione {x}"
|
||||
scheduledToPostOnX: "Pubblicazione pianificata {x}"
|
||||
schedule: "Pianificare"
|
||||
scheduled: "Pianificata"
|
||||
widgets: "Riquadri"
|
||||
deviceInfo: "Informazioni sul dispositivo"
|
||||
deviceInfoDescription: "Se ci contatti per ricevere supporto tecnico, ti preghiamo di includere le seguenti informazioni per aiutarci a risolvere il tuo problema."
|
||||
youAreAdmin: "Sei un amministratore"
|
||||
frame: "Cornice"
|
||||
presets: "Preimpostato"
|
||||
zeroPadding: "Al vivo"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
caption: "Didascalia dell'immagine"
|
||||
filename: "Nome dell'allegato"
|
||||
filename_without_ext: "Nome file senza estensione"
|
||||
year: "Anno di scatto"
|
||||
month: "Mese dello scatto"
|
||||
day: "Giorno dello scatto"
|
||||
hour: "Ora dello scatto"
|
||||
minute: "Minuto dello scatto"
|
||||
second: "Secondi dello scatto"
|
||||
camera_model: "Modello di fotocamera"
|
||||
camera_lens_model: "Modello della lente"
|
||||
camera_mm: "Lunghezza focale"
|
||||
camera_mm_35: "Lunghezza focale (equivalente a 35 mm)"
|
||||
camera_f: "Diaframma"
|
||||
camera_s: "Velocità otturatore"
|
||||
camera_iso: "Sensibilità ISO"
|
||||
gps_lat: "Latitudine"
|
||||
gps_long: "Longitudine"
|
||||
_imageFrameEditor:
|
||||
title: "Modifica fotogramma"
|
||||
tip: "Puoi decorare le immagini aggiungendo etichette con cornici e metadati."
|
||||
header: "Intestazione"
|
||||
footer: "Piè di pagina"
|
||||
borderThickness: "Larghezza del bordo"
|
||||
labelThickness: "Spessore etichetta"
|
||||
labelScale: "Dimensione etichetta"
|
||||
centered: "Allinea al centro"
|
||||
captionMain: "Didascalia (grande)"
|
||||
captionSub: "Didascalia (piccola)"
|
||||
availableVariables: "Variabili disponibili"
|
||||
withQrCode: "QR Code"
|
||||
backgroundColor: "Colore dello sfondo"
|
||||
textColor: "Colore del testo"
|
||||
font: "Tipo di carattere"
|
||||
fontSerif: "Serif"
|
||||
fontSansSerif: "Sans serif"
|
||||
quitWithoutSaveConfirm: "Uscire senza salvare?"
|
||||
failedToLoadImage: "Impossibile caricare l'immagine"
|
||||
_compression:
|
||||
_quality:
|
||||
high: "Alta qualità"
|
||||
medium: "Media qualità"
|
||||
low: "Bassa qualità"
|
||||
_size:
|
||||
large: "Taglia grande"
|
||||
medium: "Taglia media"
|
||||
small: "Taglia piccola"
|
||||
_order:
|
||||
newest: "Prima i più recenti"
|
||||
oldest: "Meno recenti prima"
|
||||
newest: "Più recenti"
|
||||
oldest: "Meno recenti"
|
||||
_chat:
|
||||
messages: "Messaggi"
|
||||
noMessagesYet: "Ancora nessun messaggio"
|
||||
newMessage: "Nuovo messaggio"
|
||||
individualChat: "Chat individuale"
|
||||
@@ -1391,12 +1470,12 @@ _chat:
|
||||
inviteUserToChat: "Invita a chattare altre persone"
|
||||
yourRooms: "Le tue stanze"
|
||||
joiningRooms: "Stanze a cui partecipi"
|
||||
invitations: "Invita"
|
||||
invitations: "Inviti"
|
||||
noInvitations: "Nessun invito"
|
||||
history: "Cronologia"
|
||||
noHistory: "Nessuna cronologia"
|
||||
noRooms: "Nessuna stanza"
|
||||
inviteUser: "Invita"
|
||||
inviteUser: "Invita persona"
|
||||
sentInvitations: "Inviti spediti"
|
||||
join: "Entra"
|
||||
ignore: "Ignora"
|
||||
@@ -1469,6 +1548,8 @@ _settings:
|
||||
showUrlPreview: "Mostra anteprima dell'URL"
|
||||
showAvailableReactionsFirstInNote: "Mostra le reazioni disponibili in alto"
|
||||
showPageTabBarBottom: "Visualizza le schede della pagina nella parte inferiore"
|
||||
emojiPaletteBanner: "Puoi salvare i le emoji predefinite da appuntare in alto nel raccoglitore emoji come tavolozza e personalizzare in che modo visualizzare il raccoglitore."
|
||||
enableAnimatedImages: "Attivare le immagini animate"
|
||||
_chat:
|
||||
showSenderName: "Mostra il nome del mittente"
|
||||
sendOnEnter: "Invio spedisce"
|
||||
@@ -1477,6 +1558,8 @@ _preferencesProfile:
|
||||
profileNameDescription: "Impostare il nome che indentifica questo dispositivo."
|
||||
profileNameDescription2: "Es: \"PC principale\" o \"Cellulare\""
|
||||
manageProfiles: "Gestione profili"
|
||||
shareSameProfileBetweenDevicesIsNotRecommended: "Si sconsiglia di condividere lo stesso profilo su più dispositivi."
|
||||
useSyncBetweenDevicesOptionIfYouWantToSyncSetting: "Se intendi sincronizzare solo alcuni parametri di configurazione su più dispositivi, devi attivare l'opzione \"Sincronizzazione tra dispositivi\" per ogni parametro interessato."
|
||||
_preferencesBackup:
|
||||
autoBackup: "Backup automatico"
|
||||
restoreFromBackup: "Ripristinare da backup"
|
||||
@@ -1486,6 +1569,7 @@ _preferencesBackup:
|
||||
youNeedToNameYourProfileToEnableAutoBackup: "Per abilitare i backup automatici, è necessario indicare il nome del profilo."
|
||||
autoPreferencesBackupIsNotEnabledForThisDevice: "Su questo dispositivo non è stato attivato il backup automatico delle preferenze."
|
||||
backupFound: "Esiste il Backup delle preferenze"
|
||||
forceBackup: "Backup forzato delle impostazioni"
|
||||
_accountSettings:
|
||||
requireSigninToViewContents: "Per vedere il contenuto, è necessaria l'iscrizione"
|
||||
requireSigninToViewContentsDescription1: "Richiedere l'iscrizione per visualizzare tutte le Note e gli altri contenuti che hai creato. Probabilmente l'effetto è impedire la raccolta di informazioni da parte dei bot crawler."
|
||||
@@ -1991,6 +2075,7 @@ _role:
|
||||
canManageAvatarDecorations: "Gestisce le decorazioni di immagini del profilo"
|
||||
driveCapacity: "Capienza del Drive"
|
||||
maxFileSize: "Dimensione massima del file caricabile"
|
||||
maxFileSize_caption: "Potrebbero esserci altre impostazioni nella fase precedente, come reverse proxy o CDN."
|
||||
alwaysMarkNsfw: "Impostare sempre come esplicito (NSFW)"
|
||||
canUpdateBioMedia: "Può aggiornare foto profilo e di testata"
|
||||
pinMax: "Quantità massima di Note in primo piano"
|
||||
@@ -2018,6 +2103,7 @@ _role:
|
||||
uploadableFileTypes_caption: "Specifica il tipo MIME. Puoi specificare più valori separandoli andando a capo, oppure indicare caratteri jolly con un asterisco (*). Ad esempio: image/*"
|
||||
uploadableFileTypes_caption2: "A seconda del file, il tipo potrebbe non essere determinato. Se si desidera consentire tali file, aggiungere {x} alla specifica."
|
||||
noteDraftLimit: "Numero massimo di Note in bozza, lato server"
|
||||
scheduledNoteLimit: "Quantità di Note pianificabili contemporaneamente"
|
||||
watermarkAvailable: "Disponibilità della funzione filigrana"
|
||||
_condition:
|
||||
roleAssignedTo: "Assegnato a ruoli manualmente"
|
||||
@@ -2266,13 +2352,13 @@ _ago:
|
||||
yearsAgo: "{n} anni fa"
|
||||
invalid: "Niente da visualizzare"
|
||||
_timeIn:
|
||||
seconds: "Dopo {n} secondi"
|
||||
minutes: "Dopo {n} minuti"
|
||||
hours: "Dopo {n} ore"
|
||||
days: "Dopo {n} giorni"
|
||||
weeks: "Dopo {n} settimane"
|
||||
months: "Dopo {n} mesi"
|
||||
years: "Dopo {n} anni"
|
||||
seconds: "Tra {n} secondi"
|
||||
minutes: "Tra {n} minuti"
|
||||
hours: "Tra {n} ore"
|
||||
days: "Tra {n} giorni"
|
||||
weeks: "Tra {n} settimane"
|
||||
months: "Tra {n} mesi"
|
||||
years: "Tra {n} anni"
|
||||
_time:
|
||||
second: "s"
|
||||
minute: "min"
|
||||
@@ -2408,6 +2494,7 @@ _auth:
|
||||
scopeUser: "Sto funzionando per il seguente profilo"
|
||||
pleaseLogin: "Per favore accedi al tuo account per cambiare i permessi dell'applicazione"
|
||||
byClickingYouWillBeRedirectedToThisUrl: "Consentendo l'accesso, si verrà reindirizzati presso questo indirizzo URL"
|
||||
alreadyAuthorized: "Questa applicazione è già autorizzata ad accedere."
|
||||
_antennaSources:
|
||||
all: "Tutte le note"
|
||||
homeTimeline: "Note dai tuoi Following"
|
||||
@@ -2453,7 +2540,7 @@ _widgets:
|
||||
chooseList: "Seleziona una lista"
|
||||
clicker: "Cliccheria"
|
||||
birthdayFollowings: "Compleanni del giorno"
|
||||
chat: "Chat"
|
||||
chat: "Chatta con questa persona"
|
||||
_cw:
|
||||
hide: "Nascondere"
|
||||
show: "Continua la lettura..."
|
||||
@@ -2490,7 +2577,7 @@ _visibility:
|
||||
followersDescription: "Visibile solo ai tuoi follower"
|
||||
specified: "Nota diretta"
|
||||
specifiedDescription: "Visibile solo ai profili menzionati"
|
||||
disableFederation: "Senza federazione"
|
||||
disableFederation: "Gestisci la federazione"
|
||||
disableFederationDescription: "Non spedire attività alle altre istanze remote"
|
||||
_postForm:
|
||||
quitInspiteOfThereAreUnuploadedFilesConfirm: "Alcuni file non sono stati caricati. Vuoi annullare l'operazione?"
|
||||
@@ -2498,6 +2585,20 @@ _postForm:
|
||||
replyPlaceholder: "Rispondi a questa nota..."
|
||||
quotePlaceholder: "Cita questa nota..."
|
||||
channelPlaceholder: "Pubblica sul canale..."
|
||||
showHowToUse: "Mostra il tutorial"
|
||||
_howToUse:
|
||||
content_title: "Testo"
|
||||
content_description: "Inserisci il contenuto che desideri pubblicare."
|
||||
toolbar_title: "Barra degli Strumenti"
|
||||
toolbar_description: "Puoi allegare file e sondaggi, aggiungere Note, hashtag, inserire emoji e menzioni."
|
||||
account_title: "Menu profilo"
|
||||
account_description: "Puoi cambiare il profilo col quale vuoi pubblicare, elencare bozze e pianificare le Note."
|
||||
visibility_title: "Visibilità"
|
||||
visibility_description: "Puoi impostare il grado di visibilità delle Note."
|
||||
menu_title: "Menù"
|
||||
menu_description: "Puoi svolgere varie azioni, come salvare in bozza, pianificare le annotazioni, regolare le reazioni ricevute e altro."
|
||||
submit_title: "Bottone invia"
|
||||
submit_description: "Pubblica la Nota. Funziona anche con \"Ctrl + Invio\", oppure \"Cmd + Invio\"."
|
||||
_placeholders:
|
||||
a: "Come va?"
|
||||
b: "Hai qualcosa da raccontare? Inizia pure..."
|
||||
@@ -2643,6 +2744,8 @@ _notification:
|
||||
youReceivedFollowRequest: "Hai ricevuto una richiesta di follow"
|
||||
yourFollowRequestAccepted: "La tua richiesta di follow è stata accettata"
|
||||
pollEnded: "Risultati del sondaggio."
|
||||
scheduledNotePosted: "Pubblicazione Nota pianificata"
|
||||
scheduledNotePostFailed: "Impossibile pubblicare la Nota pianificata"
|
||||
newNote: "Nuove Note"
|
||||
unreadAntennaNote: "Antenna {name}"
|
||||
roleAssigned: "Ruolo assegnato"
|
||||
@@ -2672,6 +2775,8 @@ _notification:
|
||||
quote: "Cita"
|
||||
reaction: "Reazioni"
|
||||
pollEnded: "Sondaggio terminato"
|
||||
scheduledNotePosted: "Nota pianificata correttamente"
|
||||
scheduledNotePostFailed: "La pianificazione della Nota è fallita"
|
||||
receiveFollowRequest: "Richieste di follow in arrivo"
|
||||
followRequestAccepted: "Richieste di follow accettate"
|
||||
roleAssigned: "Ruolo concesso"
|
||||
@@ -2687,7 +2792,7 @@ _notification:
|
||||
reply: "Rispondi"
|
||||
renote: "Rinota"
|
||||
_deck:
|
||||
alwaysShowMainColumn: "Mostra sempre la colonna principale"
|
||||
alwaysShowMainColumn: "Mostrare sempre la colonna Principale"
|
||||
columnAlign: "Allineamento delle colonne"
|
||||
columnGap: "Spessore del margine tra colonne"
|
||||
deckMenuPosition: "Posizione del menu Deck"
|
||||
@@ -2704,8 +2809,8 @@ _deck:
|
||||
profile: "Profilo"
|
||||
newProfile: "Nuovo profilo"
|
||||
deleteProfile: "Cancellare il profilo."
|
||||
introduction: "Combinate le colonne per creare la vostra interfaccia!"
|
||||
introduction2: "È possibile aggiungere colonne in qualsiasi momento premendo + sulla destra dello schermo."
|
||||
introduction: "Crea la tua interfaccia combinando le colonne!"
|
||||
introduction2: "Per aggiungere una colonna, cliccare il bottone + (più) visibile al margine dello schermo."
|
||||
widgetsIntroduction: "Dal menu della colonna, selezionare \"Modifica i riquadri\" per aggiungere un un riquadro con funzionalità"
|
||||
useSimpleUiForNonRootPages: "Visualizza sotto pagine con interfaccia web semplice"
|
||||
usedAsMinWidthWhenFlexible: "Se \"larghezza flessibile\" è abilitato, questa diventa la larghezza minima"
|
||||
@@ -2722,7 +2827,7 @@ _deck:
|
||||
mentions: "Menzioni"
|
||||
direct: "Note Dirette"
|
||||
roleTimeline: "Timeline Ruolo"
|
||||
chat: "Chat"
|
||||
chat: "Chatta con questa persona"
|
||||
_dialog:
|
||||
charactersExceeded: "Hai superato il limite di {max} caratteri! ({current})"
|
||||
charactersBelow: "Sei al di sotto del minimo di {min} caratteri! ({current})"
|
||||
@@ -2771,6 +2876,8 @@ _abuseReport:
|
||||
notifiedWebhook: "Webhook da usare"
|
||||
deleteConfirm: "Vuoi davvero rimuovere il destinatario della notifica?"
|
||||
_moderationLogTypes:
|
||||
clearQueue: "Ha cancellato la coda di Attività"
|
||||
promoteQueue: "Ripeti le attività in coda"
|
||||
createRole: "Crea un Ruolo"
|
||||
deleteRole: "Elimina un Ruolo"
|
||||
updateRole: "Modifica un ruolo"
|
||||
@@ -3018,7 +3125,7 @@ _customEmojisManager:
|
||||
confirmClearEmojisDescription: "Annullare le modifiche e cancella le emoji nell'elenco. Confermi?"
|
||||
confirmUploadEmojisDescription: "Caricamento sul Drive di {count} file locali. Vuoi davvero procedere?"
|
||||
_embedCodeGen:
|
||||
title: "Personalizza il codice di incorporamento"
|
||||
title: "Personalizza il codice per incorporare"
|
||||
header: "Mostra la testata"
|
||||
autoload: "Carica automaticamente di più (sconsigliato)"
|
||||
maxHeight: "Altezza massima"
|
||||
@@ -3027,8 +3134,8 @@ _embedCodeGen:
|
||||
previewIsNotActual: "Poiché supera l'intervallo che può essere visualizzato in anteprima, la visualizzazione vera e propria sarà diversa quando effettivamente incorporata."
|
||||
rounded: "Bordo arrotondato"
|
||||
border: "Aggiungi un bordo al contenitore"
|
||||
applyToPreview: "Applica all'anteprima"
|
||||
generateCode: "Crea il codice di incorporamento"
|
||||
applyToPreview: "Aggiorna l'anteprima"
|
||||
generateCode: "Crea il codice per incorporare"
|
||||
codeGenerated: "Codice generato"
|
||||
codeGeneratedDescription: "Incolla il codice appena generato sul tuo sito web."
|
||||
_selfXssPrevention:
|
||||
@@ -3085,7 +3192,7 @@ _bootErrors:
|
||||
_search:
|
||||
searchScopeAll: "Tutte"
|
||||
searchScopeLocal: "Locale"
|
||||
searchScopeServer: "Specifiche del server"
|
||||
searchScopeServer: "Server specifico"
|
||||
searchScopeUser: "Profilo specifico"
|
||||
pleaseEnterServerHost: "Inserire il nome host"
|
||||
pleaseSelectUser: "Per favore, seleziona un profilo"
|
||||
@@ -3165,10 +3272,13 @@ _watermarkEditor:
|
||||
title: "Modifica la filigrana"
|
||||
cover: "Coprire tutto"
|
||||
repeat: "Disposizione"
|
||||
preserveBoundingRect: "Fai in modo da non eccedere durante la rotazione"
|
||||
opacity: "Opacità"
|
||||
scale: "Dimensioni"
|
||||
text: "Testo"
|
||||
qr: "QR Code"
|
||||
position: "Posizione"
|
||||
margin: "Margine"
|
||||
type: "Tipo"
|
||||
image: "Immagini"
|
||||
advanced: "Avanzato"
|
||||
@@ -3183,17 +3293,22 @@ _watermarkEditor:
|
||||
polkadotSubDotOpacity: "Opacità del punto secondario"
|
||||
polkadotSubDotRadius: "Dimensione del punto secondario"
|
||||
polkadotSubDotDivisions: "Quantità di punti secondari"
|
||||
leaveBlankToAccountUrl: "Il valore vuoto indica la URL dell'account"
|
||||
failedToLoadImage: "Impossibile caricare l'immagine"
|
||||
_imageEffector:
|
||||
title: "Effetto"
|
||||
addEffect: "Aggiungi effetto"
|
||||
discardChangesConfirm: "Scarta le modifiche ed esci?"
|
||||
nothingToConfigure: "Nessuna impostazione configurabile."
|
||||
failedToLoadImage: "Impossibile caricare l'immagine"
|
||||
_fxs:
|
||||
chromaticAberration: "Aberrazione cromatica"
|
||||
glitch: "Glitch"
|
||||
mirror: "Specchio"
|
||||
invert: "Inversione colore"
|
||||
grayscale: "Bianco e nero"
|
||||
blur: "Sfocatura"
|
||||
pixelate: "Mosaico"
|
||||
colorAdjust: "Correzione Colore"
|
||||
colorClamp: "Compressione del colore"
|
||||
colorClampAdvanced: "Compressione del colore (avanzata)"
|
||||
@@ -3205,10 +3320,14 @@ _imageEffector:
|
||||
checker: "revisore"
|
||||
blockNoise: "Attenua rumore"
|
||||
tearing: "Strappa immagine"
|
||||
fill: "Riempimento"
|
||||
_fxProps:
|
||||
angle: "Angolo"
|
||||
scale: "Dimensioni"
|
||||
size: "Dimensioni"
|
||||
radius: "Raggio"
|
||||
samples: "Quantità di campioni"
|
||||
offset: "Posizione"
|
||||
color: "Colore"
|
||||
opacity: "Opacità"
|
||||
normalize: "Normalizza"
|
||||
@@ -3237,6 +3356,7 @@ _imageEffector:
|
||||
zoomLinesThreshold: "Limite delle linee zoom"
|
||||
zoomLinesMaskSize: "Ampiezza del diametro"
|
||||
zoomLinesBlack: "Bande nere"
|
||||
circle: "Circolare"
|
||||
drafts: "Bozze"
|
||||
_drafts:
|
||||
select: "Selezionare bozza"
|
||||
@@ -3252,3 +3372,22 @@ _drafts:
|
||||
restoreFromDraft: "Recuperare dalle bozze"
|
||||
restore: "Ripristina"
|
||||
listDrafts: "Elenco bozze"
|
||||
schedule: "Pianifica pubblicazione"
|
||||
listScheduledNotes: "Elenca Note pianificate"
|
||||
cancelSchedule: "Annulla pianificazione"
|
||||
qr: "QR Code"
|
||||
_qr:
|
||||
showTabTitle: "Visualizza"
|
||||
readTabTitle: "Leggere"
|
||||
shareTitle: "{name} {acct}"
|
||||
shareText: "Seguimi nel Fediverso!"
|
||||
chooseCamera: "Seleziona fotocamera"
|
||||
cannotToggleFlash: "Flash non controllabile"
|
||||
turnOnFlash: "Accendi il flash"
|
||||
turnOffFlash: "Spegni il flash"
|
||||
startQr: "Inizia lettura QR Code"
|
||||
stopQr: "Interrompi lettura QR Code"
|
||||
noQrCodeFound: "Non trovo alcun QR Code"
|
||||
scanFile: "Scansiona immagine nel dispositivo"
|
||||
raw: "Testo"
|
||||
mfm: "MFM"
|
||||
|
||||
@@ -83,6 +83,8 @@ files: "ファイル"
|
||||
download: "ダウンロード"
|
||||
driveFileDeleteConfirm: "ファイル「{name}」を削除しますか?このファイルを使用した一部のコンテンツも削除されます。"
|
||||
unfollowConfirm: "{name}のフォローを解除しますか?"
|
||||
cancelFollowRequestConfirm: "{name}へのフォロー申請をキャンセルしますか?"
|
||||
rejectFollowRequestConfirm: "{name}からのフォロー申請を拒否しますか?"
|
||||
exportRequested: "エクスポートをリクエストしました。これには時間がかかる場合があります。エクスポートが終わると、「ドライブ」に追加されます。"
|
||||
importRequested: "インポートをリクエストしました。これには時間がかかる場合があります。"
|
||||
lists: "リスト"
|
||||
@@ -182,7 +184,7 @@ flagAsCat: "にゃああああああああああああああ!!!!!!
|
||||
flagAsCatDescription: "にゃにゃにゃ??"
|
||||
flagShowTimelineReplies: "タイムラインにノートへの返信を表示する"
|
||||
flagShowTimelineRepliesDescription: "オンにすると、タイムラインにユーザーのノート以外にもそのユーザーの他のノートへの返信を表示します。"
|
||||
autoAcceptFollowed: "フォロー中ユーザーからのフォロリクを自動承認"
|
||||
autoAcceptFollowed: "フォロー中ユーザーからのフォロー申請を自動承認"
|
||||
addAccount: "アカウントを追加"
|
||||
reloadAccountsList: "アカウントリストの情報を更新"
|
||||
loginFailed: "ログインに失敗しました"
|
||||
@@ -253,6 +255,7 @@ noteDeleteConfirm: "このノートを削除しますか?"
|
||||
pinLimitExceeded: "これ以上ピン留めできません"
|
||||
done: "完了"
|
||||
processing: "処理中"
|
||||
preprocessing: "準備中"
|
||||
preview: "プレビュー"
|
||||
default: "デフォルト"
|
||||
defaultValueIs: "デフォルト: {value}"
|
||||
@@ -301,8 +304,9 @@ uploadFromUrlMayTakeTime: "アップロードが完了するまで時間がか
|
||||
uploadNFiles: "{n}個のファイルをアップロード"
|
||||
explore: "みつける"
|
||||
messageRead: "既読"
|
||||
readAllChatMessages: "すべてのメッセージを既読にする"
|
||||
noMoreHistory: "これより過去の履歴はありません"
|
||||
startChat: "チャットを始める"
|
||||
startChat: "メッセージを送る"
|
||||
nUsersRead: "{n}人が読みました"
|
||||
agreeTo: "{0}に同意"
|
||||
agree: "同意する"
|
||||
@@ -333,6 +337,7 @@ fileName: "ファイル名"
|
||||
selectFile: "ファイルを選択"
|
||||
selectFiles: "ファイルを選択"
|
||||
selectFolder: "フォルダーを選択"
|
||||
unselectFolder: "フォルダーの選択を解除"
|
||||
selectFolders: "フォルダーを選択"
|
||||
fileNotSelected: "ファイルが選択されていません"
|
||||
renameFile: "ファイル名を変更"
|
||||
@@ -345,6 +350,7 @@ addFile: "ファイルを追加"
|
||||
showFile: "ファイルを表示"
|
||||
emptyDrive: "ドライブは空です"
|
||||
emptyFolder: "フォルダーは空です"
|
||||
dropHereToUpload: "ここにファイルをドロップしてアップロード"
|
||||
unableToDelete: "削除できません"
|
||||
inputNewFileName: "新しいファイル名を入力してください"
|
||||
inputNewDescription: "新しいキャプションを入力してください"
|
||||
@@ -477,7 +483,7 @@ notFoundDescription: "指定されたURLに該当するページはありませ
|
||||
uploadFolder: "既定アップロード先"
|
||||
markAsReadAllNotifications: "すべての通知を既読にする"
|
||||
markAsReadAllUnreadNotes: "すべての投稿を既読にする"
|
||||
markAsReadAllTalkMessages: "すべてのチャットを既読にする"
|
||||
markAsReadAllTalkMessages: "すべてのダイレクトメッセージを既読にする"
|
||||
help: "ヘルプ"
|
||||
inputMessageHere: "ここにメッセージを入力"
|
||||
close: "閉じる"
|
||||
@@ -772,6 +778,7 @@ lockedAccountInfo: "フォローを承認制にしても、ノートの公開範
|
||||
alwaysMarkSensitive: "デフォルトでメディアをセンシティブ設定にする"
|
||||
loadRawImages: "添付画像のサムネイルをオリジナル画質にする"
|
||||
disableShowingAnimatedImages: "アニメーション画像を再生しない"
|
||||
disableShowingAnimatedImages_caption: "この設定に関わらずアニメーション画像が再生されないときは、ブラウザ・OSのアクセシビリティ設定や省電力設定等が干渉している場合があります。"
|
||||
highlightSensitiveMedia: "メディアがセンシティブであることを分かりやすく表示"
|
||||
verificationEmailSent: "確認のメールを送信しました。メールに記載されたリンクにアクセスして、設定を完了してください。"
|
||||
notSet: "未設定"
|
||||
@@ -1018,6 +1025,9 @@ pushNotificationAlreadySubscribed: "プッシュ通知は有効です"
|
||||
pushNotificationNotSupported: "ブラウザかサーバーがプッシュ通知に非対応"
|
||||
sendPushNotificationReadMessage: "通知が既読になったらプッシュ通知を削除する"
|
||||
sendPushNotificationReadMessageCaption: "端末の電池消費量が増加する可能性があります。"
|
||||
pleaseAllowPushNotification: "ブラウザの通知設定を許可してください"
|
||||
browserPushNotificationDisabled: "通知の送信権限の取得に失敗しました"
|
||||
browserPushNotificationDisabledDescription: "{serverName}から通知を送信する権限がありません。ブラウザの設定から通知を許可して再度お試しください。"
|
||||
windowMaximize: "最大化"
|
||||
windowMinimize: "最小化"
|
||||
windowRestore: "元に戻す"
|
||||
@@ -1168,6 +1178,7 @@ installed: "インストール済み"
|
||||
branding: "ブランディング"
|
||||
enableServerMachineStats: "サーバーのマシン情報を公開する"
|
||||
enableIdenticonGeneration: "ユーザーごとのIdenticon生成を有効にする"
|
||||
showRoleBadgesOfRemoteUsers: "リモートユーザーに付与したロールバッジを表示する"
|
||||
turnOffToImprovePerformance: "オフにするとパフォーマンスが向上します。"
|
||||
createInviteCode: "招待コードを作成"
|
||||
createWithOptions: "オプションを指定して作成"
|
||||
@@ -1316,6 +1327,7 @@ acknowledgeNotesAndEnable: "注意事項を理解した上でオンにします
|
||||
federationSpecified: "このサーバーはホワイトリスト連合で運用されています。管理者が指定したサーバー以外とやり取りすることはできません。"
|
||||
federationDisabled: "このサーバーは連合が無効化されています。他のサーバーのユーザーとやり取りすることはできません。"
|
||||
draft: "下書き"
|
||||
draftsAndScheduledNotes: "下書きと予約投稿"
|
||||
confirmOnReact: "リアクションする際に確認する"
|
||||
reactAreYouSure: "\" {emoji} \" をリアクションしますか?"
|
||||
markAsSensitiveConfirm: "このメディアをセンシティブとして設定しますか?"
|
||||
@@ -1343,6 +1355,8 @@ postForm: "投稿フォーム"
|
||||
textCount: "文字数"
|
||||
information: "情報"
|
||||
chat: "チャット"
|
||||
directMessage: "ダイレクトメッセージ"
|
||||
directMessage_short: "メッセージ"
|
||||
migrateOldSettings: "旧設定情報を移行"
|
||||
migrateOldSettings_description: "通常これは自動で行われていますが、何らかの理由により上手く移行されなかった場合は手動で移行処理をトリガーできます。現在の設定情報は上書きされます。"
|
||||
compress: "圧縮"
|
||||
@@ -1370,6 +1384,8 @@ redisplayAllTips: "全ての「ヒントとコツ」を再表示"
|
||||
hideAllTips: "全ての「ヒントとコツ」を非表示"
|
||||
defaultImageCompressionLevel: "デフォルトの画像圧縮度"
|
||||
defaultImageCompressionLevel_description: "低くすると画質を保てますが、ファイルサイズは増加します。<br>高くするとファイルサイズを減らせますが、画質は低下します。"
|
||||
defaultCompressionLevel: "デフォルトの圧縮度"
|
||||
defaultCompressionLevel_description: "低くすると品質を保てますが、ファイルサイズは増加します。<br>高くするとファイルサイズを減らせますが、品質は低下します。"
|
||||
inMinutes: "分"
|
||||
inDays: "日"
|
||||
safeModeEnabled: "セーフモードが有効です"
|
||||
@@ -1377,53 +1393,119 @@ pluginsAreDisabledBecauseSafeMode: "セーフモードが有効なため、プ
|
||||
customCssIsDisabledBecauseSafeMode: "セーフモードが有効なため、カスタムCSSは適用されていません。"
|
||||
themeIsDefaultBecauseSafeMode: "セーフモードが有効な間はデフォルトのテーマが使用されます。セーフモードをオフにすると元に戻ります。"
|
||||
thankYouForTestingBeta: "ベータ版の検証にご協力いただきありがとうございます!"
|
||||
createUserSpecifiedNote: "ユーザー指定ノートを作成"
|
||||
schedulePost: "投稿を予約"
|
||||
scheduleToPostOnX: "{x}に投稿を予約します"
|
||||
scheduledToPostOnX: "{x}に投稿が予約されています"
|
||||
schedule: "予約"
|
||||
scheduled: "予約"
|
||||
widgets: "ウィジェット"
|
||||
deviceInfo: "デバイス情報"
|
||||
deviceInfoDescription: "技術的なお問い合わせの際に、以下の情報を併記すると問題の解決に役立つことがあります。"
|
||||
youAreAdmin: "あなたは管理者です"
|
||||
frame: "フレーム"
|
||||
presets: "プリセット"
|
||||
zeroPadding: "ゼロ埋め"
|
||||
|
||||
_imageEditing:
|
||||
_vars:
|
||||
caption: "ファイルのキャプション"
|
||||
filename: "ファイル名"
|
||||
filename_without_ext: "拡張子無しファイル名"
|
||||
year: "撮影年"
|
||||
month: "撮影月"
|
||||
day: "撮影日"
|
||||
hour: "撮影した時刻(時)"
|
||||
minute: "撮影した時刻(分)"
|
||||
second: "撮影した時刻(秒)"
|
||||
camera_model: "カメラ名"
|
||||
camera_lens_model: "レンズ名"
|
||||
camera_mm: "焦点距離"
|
||||
camera_mm_35: "焦点距離(35mm判換算)"
|
||||
camera_f: "絞り"
|
||||
camera_s: "シャッタースピード"
|
||||
camera_iso: "ISO感度"
|
||||
gps_lat: "緯度"
|
||||
gps_long: "経度"
|
||||
|
||||
_imageFrameEditor:
|
||||
title: "フレームの編集"
|
||||
tip: "画像にフレームやメタデータを含んだラベルを追加して装飾できます。"
|
||||
header: "ヘッダー"
|
||||
footer: "フッター"
|
||||
borderThickness: "フチの幅"
|
||||
labelThickness: "ラベルの幅"
|
||||
labelScale: "ラベルのスケール"
|
||||
centered: "中央揃え"
|
||||
captionMain: "キャプション(大)"
|
||||
captionSub: "キャプション(小)"
|
||||
availableVariables: "利用可能な変数"
|
||||
withQrCode: "二次元コード"
|
||||
backgroundColor: "背景色"
|
||||
textColor: "文字色"
|
||||
font: "フォント"
|
||||
fontSerif: "セリフ"
|
||||
fontSansSerif: "サンセリフ"
|
||||
quitWithoutSaveConfirm: "保存せずに終了しますか?"
|
||||
failedToLoadImage: "画像の読み込みに失敗しました"
|
||||
|
||||
_compression:
|
||||
_quality:
|
||||
high: "高品質"
|
||||
medium: "中品質"
|
||||
low: "低品質"
|
||||
_size:
|
||||
large: "サイズ大"
|
||||
medium: "サイズ中"
|
||||
small: "サイズ小"
|
||||
|
||||
_order:
|
||||
newest: "新しい順"
|
||||
oldest: "古い順"
|
||||
|
||||
_chat:
|
||||
messages: "メッセージ"
|
||||
noMessagesYet: "まだメッセージはありません"
|
||||
newMessage: "新しいメッセージ"
|
||||
individualChat: "個人チャット"
|
||||
individualChat_description: "特定ユーザーとの一対一のチャットができます。"
|
||||
roomChat: "ルームチャット"
|
||||
roomChat_description: "複数人でのチャットができます。\nまた、個人チャットを許可していないユーザーとでも、相手が受け入れればチャットができます。"
|
||||
createRoom: "ルームを作成"
|
||||
inviteUserToChat: "ユーザーを招待してチャットを始めましょう"
|
||||
yourRooms: "作成したルーム"
|
||||
joiningRooms: "参加中のルーム"
|
||||
individualChat: "個別"
|
||||
individualChat_description: "特定ユーザーと個別にメッセージのやりとりができます。"
|
||||
roomChat: "グループ"
|
||||
roomChat_description: "複数人でメッセージのやりとりができます。\nまた、個別のメッセージを許可していないユーザーとでも、相手が受け入れればやりとりできます。"
|
||||
createRoom: "グループを作成"
|
||||
inviteUserToChat: "ユーザーを招待してメッセージを送信しましょう"
|
||||
yourRooms: "作成したグループ"
|
||||
joiningRooms: "参加中のグループ"
|
||||
invitations: "招待"
|
||||
noInvitations: "招待はありません"
|
||||
history: "履歴"
|
||||
noHistory: "履歴はありません"
|
||||
noRooms: "ルームはありません"
|
||||
noRooms: "グループはありません"
|
||||
inviteUser: "ユーザーを招待"
|
||||
sentInvitations: "送信した招待"
|
||||
join: "参加"
|
||||
ignore: "無視"
|
||||
leave: "ルームから退出"
|
||||
leave: "グループから退出"
|
||||
members: "メンバー"
|
||||
searchMessages: "メッセージを検索"
|
||||
home: "ホーム"
|
||||
send: "送信"
|
||||
newline: "改行"
|
||||
muteThisRoom: "このルームをミュート"
|
||||
deleteRoom: "ルームを削除"
|
||||
chatNotAvailableForThisAccountOrServer: "このサーバー、またはこのアカウントでチャットは有効化されていません。"
|
||||
chatIsReadOnlyForThisAccountOrServer: "このサーバー、またはこのアカウントでチャットは読み取り専用となっています。新たに書き込んだり、チャットルームを作成・参加したりすることはできません。"
|
||||
chatNotAvailableInOtherAccount: "相手のアカウントでチャット機能が使えない状態になっています。"
|
||||
cannotChatWithTheUser: "このユーザーとのチャットを開始できません"
|
||||
cannotChatWithTheUser_description: "チャットが使えない状態になっているか、相手がチャットを開放していません。"
|
||||
youAreNotAMemberOfThisRoomButInvited: "あなたはこのルームの参加者ではありませんが、招待が届いています。参加するには、招待を承認してください。"
|
||||
muteThisRoom: "このグループをミュート"
|
||||
deleteRoom: "グループを削除"
|
||||
chatNotAvailableForThisAccountOrServer: "このサーバー、またはこのアカウントでダイレクトメッセージは有効化されていません。"
|
||||
chatIsReadOnlyForThisAccountOrServer: "このサーバー、またはこのアカウントでダイレクトメッセージは読み取り専用となっています。新たに書き込んだり、グループを作成・参加したりすることはできません。"
|
||||
chatNotAvailableInOtherAccount: "相手のアカウントでダイレクトメッセージが使えない状態になっています。"
|
||||
cannotChatWithTheUser: "このユーザーとのダイレクトメッセージを開始できません"
|
||||
cannotChatWithTheUser_description: "ダイレクトメッセージが使えない状態になっているか、相手がダイレクトメッセージを開放していません。"
|
||||
youAreNotAMemberOfThisRoomButInvited: "あなたはこのグループの参加者ではありませんが、招待が届いています。参加するには、招待を承認してください。"
|
||||
doYouAcceptInvitation: "招待を承認しますか?"
|
||||
chatWithThisUser: "チャットする"
|
||||
thisUserAllowsChatOnlyFromFollowers: "このユーザーはフォロワーからのみチャットを受け付けています。"
|
||||
thisUserAllowsChatOnlyFromFollowing: "このユーザーは、このユーザーがフォローしているユーザーからのみチャットを受け付けています。"
|
||||
thisUserAllowsChatOnlyFromMutualFollowing: "このユーザーは相互フォローのユーザーからのみチャットを受け付けています。"
|
||||
thisUserNotAllowedChatAnyone: "このユーザーは誰からもチャットを受け付けていません。"
|
||||
chatAllowedUsers: "チャットを許可する相手"
|
||||
chatAllowedUsers_note: "自分からチャットメッセージを送った相手とはこの設定に関わらずチャットが可能です。"
|
||||
chatWithThisUser: "ダイレクトメッセージ"
|
||||
thisUserAllowsChatOnlyFromFollowers: "このユーザーはフォロワーからのみメッセージを受け付けています。"
|
||||
thisUserAllowsChatOnlyFromFollowing: "このユーザーは、このユーザーがフォローしているユーザーからのみメッセージを受け付けています。"
|
||||
thisUserAllowsChatOnlyFromMutualFollowing: "このユーザーは相互フォローのユーザーからのみメッセージを受け付けています。"
|
||||
thisUserNotAllowedChatAnyone: "このユーザーは誰からもメッセージを受け付けていません。"
|
||||
chatAllowedUsers: "メッセージを許可する相手"
|
||||
chatAllowedUsers_note: "自分からメッセージを送った相手とはこの設定に関わらずメッセージの送受信が可能です。"
|
||||
_chatAllowedUsers:
|
||||
everyone: "誰でも"
|
||||
followers: "自分のフォロワーのみ"
|
||||
@@ -1473,6 +1555,8 @@ _settings:
|
||||
showUrlPreview: "URLプレビューを表示する"
|
||||
showAvailableReactionsFirstInNote: "利用できるリアクションを先頭に表示"
|
||||
showPageTabBarBottom: "ページのタブバーを下部に表示"
|
||||
emojiPaletteBanner: "絵文字ピッカーに固定表示するプリセットをパレットとして登録したり、ピッカーの表示方法をカスタマイズしたりできます。"
|
||||
enableAnimatedImages: "アニメーション画像を有効にする"
|
||||
|
||||
_chat:
|
||||
showSenderName: "送信者の名前を表示"
|
||||
@@ -1483,6 +1567,8 @@ _preferencesProfile:
|
||||
profileNameDescription: "このデバイスを識別する名前を設定してください。"
|
||||
profileNameDescription2: "例: 「メインPC」、「スマホ」など"
|
||||
manageProfiles: "プロファイルの管理"
|
||||
shareSameProfileBetweenDevicesIsNotRecommended: "複数のデバイスで同一のプロファイルを共有することは推奨しません。"
|
||||
useSyncBetweenDevicesOptionIfYouWantToSyncSetting: "複数のデバイスで同期したい設定項目が存在する場合は、個別に「複数のデバイスで同期」オプションを有効にしてください。"
|
||||
|
||||
_preferencesBackup:
|
||||
autoBackup: "自動バックアップ"
|
||||
@@ -1493,6 +1579,7 @@ _preferencesBackup:
|
||||
youNeedToNameYourProfileToEnableAutoBackup: "自動バックアップを有効にするにはプロファイル名の設定が必要です。"
|
||||
autoPreferencesBackupIsNotEnabledForThisDevice: "このデバイスで設定の自動バックアップは有効になっていません。"
|
||||
backupFound: "設定のバックアップが見つかりました"
|
||||
forceBackup: "設定の強制バックアップ"
|
||||
|
||||
_accountSettings:
|
||||
requireSigninToViewContents: "コンテンツの表示にログインを必須にする"
|
||||
@@ -2012,6 +2099,7 @@ _role:
|
||||
canManageAvatarDecorations: "アバターデコレーションの管理"
|
||||
driveCapacity: "ドライブ容量"
|
||||
maxFileSize: "アップロード可能な最大ファイルサイズ"
|
||||
maxFileSize_caption: "リバースプロキシやCDNなど、前段で別の設定値が存在する場合があります。"
|
||||
alwaysMarkNsfw: "ファイルにNSFWを常に付与"
|
||||
canUpdateBioMedia: "アイコンとバナーの更新を許可"
|
||||
pinMax: "ノートのピン留めの最大数"
|
||||
@@ -2034,11 +2122,12 @@ _role:
|
||||
canImportFollowing: "フォローのインポートを許可"
|
||||
canImportMuting: "ミュートのインポートを許可"
|
||||
canImportUserLists: "リストのインポートを許可"
|
||||
chatAvailability: "チャットを許可"
|
||||
chatAvailability: "ダイレクトメッセージを許可"
|
||||
uploadableFileTypes: "アップロード可能なファイル種別"
|
||||
uploadableFileTypes_caption: "MIMEタイプを指定します。改行で区切って複数指定できるほか、アスタリスク(*)でワイルドカード指定できます。(例: image/*)"
|
||||
uploadableFileTypes_caption2: "ファイルによっては種別を判定できないことがあります。そのようなファイルを許可する場合は {x} を指定に追加してください。"
|
||||
noteDraftLimit: "サーバーサイドのノートの下書きの作成可能数"
|
||||
scheduledNoteLimit: "予約投稿の同時作成可能数"
|
||||
watermarkAvailable: "ウォーターマーク機能の使用可否"
|
||||
_condition:
|
||||
roleAssignedTo: "マニュアルロールにアサイン済み"
|
||||
@@ -2281,7 +2370,7 @@ _theme:
|
||||
buttonHoverBg: "ボタンの背景 (ホバー)"
|
||||
inputBorder: "入力ボックスの縁取り"
|
||||
badge: "バッジ"
|
||||
messageBg: "チャットの背景"
|
||||
messageBg: "メッセージの背景"
|
||||
fgHighlighted: "強調された文字"
|
||||
|
||||
_sfx:
|
||||
@@ -2289,7 +2378,7 @@ _sfx:
|
||||
noteMy: "ノート(自分)"
|
||||
notification: "通知"
|
||||
reaction: "リアクション選択時"
|
||||
chatMessage: "チャットのメッセージ"
|
||||
chatMessage: "ダイレクトメッセージ"
|
||||
|
||||
_soundSettings:
|
||||
driveFile: "ドライブの音声を使用"
|
||||
@@ -2369,8 +2458,8 @@ _permissions:
|
||||
"write:favorites": "お気に入りを操作する"
|
||||
"read:following": "フォローの情報を見る"
|
||||
"write:following": "フォロー・フォロー解除する"
|
||||
"read:messaging": "チャットを見る"
|
||||
"write:messaging": "チャットを操作する"
|
||||
"read:messaging": "ダイレクトメッセージを見る"
|
||||
"write:messaging": "ダイレクトメッセージを操作する"
|
||||
"read:mutes": "ミュートを見る"
|
||||
"write:mutes": "ミュートを操作する"
|
||||
"write:notes": "ノートを作成・削除する"
|
||||
@@ -2443,8 +2532,8 @@ _permissions:
|
||||
"read:clip-favorite": "クリップのいいねを見る"
|
||||
"read:federation": "連合に関する情報を取得する"
|
||||
"write:report-abuse": "違反を報告する"
|
||||
"write:chat": "チャットを操作する"
|
||||
"read:chat": "チャットを閲覧する"
|
||||
"write:chat": "ダイレクトメッセージを操作する"
|
||||
"read:chat": "ダイレクトメッセージを閲覧する"
|
||||
|
||||
_auth:
|
||||
shareAccessTitle: "アプリへのアクセス許可"
|
||||
@@ -2459,6 +2548,7 @@ _auth:
|
||||
scopeUser: "以下のユーザーとして操作しています"
|
||||
pleaseLogin: "アプリケーションにアクセス許可を与えるには、ログインが必要です。"
|
||||
byClickingYouWillBeRedirectedToThisUrl: "アクセスを許可すると、自動で以下のURLに遷移します"
|
||||
alreadyAuthorized: "このアプリケーションは既にアクセスが許可されています。"
|
||||
|
||||
_antennaSources:
|
||||
all: "全てのノート"
|
||||
@@ -2507,7 +2597,7 @@ _widgets:
|
||||
chooseList: "リストを選択"
|
||||
clicker: "クリッカー"
|
||||
birthdayFollowings: "今日誕生日のユーザー"
|
||||
chat: "チャット"
|
||||
chat: "ダイレクトメッセージ"
|
||||
|
||||
_cw:
|
||||
hide: "隠す"
|
||||
@@ -2556,6 +2646,20 @@ _postForm:
|
||||
replyPlaceholder: "このノートに返信..."
|
||||
quotePlaceholder: "このノートを引用..."
|
||||
channelPlaceholder: "チャンネルに投稿..."
|
||||
showHowToUse: "フォームの説明を表示"
|
||||
_howToUse:
|
||||
content_title: "本文"
|
||||
content_description: "投稿する内容を入力します。"
|
||||
toolbar_title: "ツールバー"
|
||||
toolbar_description: "ファイルやアンケートの添付、注釈やハッシュタグの設定、絵文字やメンションの挿入などが行えます。"
|
||||
account_title: "アカウントメニュー"
|
||||
account_description: "投稿するアカウントを切り替えたり、アカウントに保存した下書き・予約投稿を一覧できます。"
|
||||
visibility_title: "公開範囲"
|
||||
visibility_description: "ノートを公開する範囲の設定が行えます。"
|
||||
menu_title: "メニュー"
|
||||
menu_description: "下書きへの保存、投稿の予約、リアクションの設定など、その他のアクションが行えます。"
|
||||
submit_title: "投稿ボタン"
|
||||
submit_description: "ノートを投稿します。Ctrl + Enter / Cmd + Enter でも投稿できます。"
|
||||
_placeholders:
|
||||
a: "いまどうしてる?"
|
||||
b: "何かありましたか?"
|
||||
@@ -2711,10 +2815,12 @@ _notification:
|
||||
youReceivedFollowRequest: "フォローリクエストが来ました"
|
||||
yourFollowRequestAccepted: "フォローリクエストが承認されました"
|
||||
pollEnded: "アンケートの結果が出ました"
|
||||
scheduledNotePosted: "予約ノートが投稿されました"
|
||||
scheduledNotePostFailed: "予約ノートの投稿に失敗しました"
|
||||
newNote: "新しい投稿"
|
||||
unreadAntennaNote: "アンテナ {name}"
|
||||
roleAssigned: "ロールが付与されました"
|
||||
chatRoomInvitationReceived: "チャットルームへ招待されました"
|
||||
chatRoomInvitationReceived: "ダイレクトメッセージのグループへ招待されました"
|
||||
emptyPushNotificationMessage: "プッシュ通知の更新をしました"
|
||||
achievementEarned: "実績を獲得"
|
||||
testNotification: "通知テスト"
|
||||
@@ -2741,10 +2847,12 @@ _notification:
|
||||
quote: "引用"
|
||||
reaction: "リアクション"
|
||||
pollEnded: "アンケートが終了"
|
||||
scheduledNotePosted: "予約投稿が成功した"
|
||||
scheduledNotePostFailed: "予約投稿が失敗した"
|
||||
receiveFollowRequest: "フォロー申請を受け取った"
|
||||
followRequestAccepted: "フォローが受理された"
|
||||
roleAssigned: "ロールが付与された"
|
||||
chatRoomInvitationReceived: "チャットルームへ招待された"
|
||||
chatRoomInvitationReceived: "ダイレクトメッセージのグループへ招待された"
|
||||
achievementEarned: "実績の獲得"
|
||||
exportCompleted: "エクスポートが完了した"
|
||||
login: "ログイン"
|
||||
@@ -2794,7 +2902,7 @@ _deck:
|
||||
mentions: "メンション"
|
||||
direct: "指名"
|
||||
roleTimeline: "ロールタイムライン"
|
||||
chat: "チャット"
|
||||
chat: "ダイレクトメッセージ"
|
||||
|
||||
_dialog:
|
||||
charactersExceeded: "最大文字数を超えています! 現在 {current} / 制限 {max}"
|
||||
@@ -2849,6 +2957,8 @@ _abuseReport:
|
||||
deleteConfirm: "通知先を削除しますか?"
|
||||
|
||||
_moderationLogTypes:
|
||||
clearQueue: "ジョブキューをクリア"
|
||||
promoteQueue: "キューのジョブを再試行"
|
||||
createRole: "ロールを作成"
|
||||
deleteRole: "ロールを削除"
|
||||
updateRole: "ロールを更新"
|
||||
@@ -2897,7 +3007,7 @@ _moderationLogTypes:
|
||||
deletePage: "ページを削除"
|
||||
deleteFlash: "Playを削除"
|
||||
deleteGalleryPost: "ギャラリーの投稿を削除"
|
||||
deleteChatRoom: "チャットルームを削除"
|
||||
deleteChatRoom: "ダイレクトメッセージのグループを削除"
|
||||
updateProxyAccountDescription: "プロキシアカウントの説明を更新"
|
||||
|
||||
_fileViewer:
|
||||
@@ -3261,17 +3371,20 @@ _userLists:
|
||||
watermark: "ウォーターマーク"
|
||||
defaultPreset: "デフォルトのプリセット"
|
||||
_watermarkEditor:
|
||||
tip: "画像にクレジット情報などのウォーターマークを追加することができます。"
|
||||
tip: "画像にクレジット情報などのウォーターマークを追加できます。"
|
||||
quitWithoutSaveConfirm: "保存せずに終了しますか?"
|
||||
driveFileTypeWarn: "このファイルは対応していません"
|
||||
driveFileTypeWarnDescription: "画像ファイルを選択してください"
|
||||
title: "ウォーターマークの編集"
|
||||
cover: "全体に被せる"
|
||||
repeat: "敷き詰める"
|
||||
preserveBoundingRect: "回転時はみ出ないように調整する"
|
||||
opacity: "不透明度"
|
||||
scale: "サイズ"
|
||||
text: "テキスト"
|
||||
qr: "二次元コード"
|
||||
position: "位置"
|
||||
margin: "マージン"
|
||||
type: "タイプ"
|
||||
image: "画像"
|
||||
advanced: "高度"
|
||||
@@ -3286,12 +3399,15 @@ _watermarkEditor:
|
||||
polkadotSubDotOpacity: "サブドットの不透明度"
|
||||
polkadotSubDotRadius: "サブドットの大きさ"
|
||||
polkadotSubDotDivisions: "サブドットの数"
|
||||
leaveBlankToAccountUrl: "空欄にするとアカウントのURLになります"
|
||||
failedToLoadImage: "画像の読み込みに失敗しました"
|
||||
|
||||
_imageEffector:
|
||||
title: "エフェクト"
|
||||
addEffect: "エフェクトを追加"
|
||||
discardChangesConfirm: "変更を破棄して終了しますか?"
|
||||
nothingToConfigure: "設定項目はありません"
|
||||
failedToLoadImage: "画像の読み込みに失敗しました"
|
||||
|
||||
_fxs:
|
||||
chromaticAberration: "色収差"
|
||||
@@ -3299,6 +3415,8 @@ _imageEffector:
|
||||
mirror: "ミラー"
|
||||
invert: "色の反転"
|
||||
grayscale: "白黒"
|
||||
blur: "ぼかし"
|
||||
pixelate: "モザイク"
|
||||
colorAdjust: "色調補正"
|
||||
colorClamp: "色の圧縮"
|
||||
colorClampAdvanced: "色の圧縮(高度)"
|
||||
@@ -3310,11 +3428,15 @@ _imageEffector:
|
||||
checker: "チェッカー"
|
||||
blockNoise: "ブロックノイズ"
|
||||
tearing: "ティアリング"
|
||||
fill: "塗りつぶし"
|
||||
|
||||
_fxProps:
|
||||
angle: "角度"
|
||||
scale: "サイズ"
|
||||
size: "サイズ"
|
||||
radius: "半径"
|
||||
samples: "サンプル数"
|
||||
offset: "位置"
|
||||
color: "色"
|
||||
opacity: "不透明度"
|
||||
normalize: "正規化"
|
||||
@@ -3343,6 +3465,7 @@ _imageEffector:
|
||||
zoomLinesThreshold: "集中線の幅"
|
||||
zoomLinesMaskSize: "中心径"
|
||||
zoomLinesBlack: "黒色にする"
|
||||
circle: "円形"
|
||||
|
||||
drafts: "下書き"
|
||||
_drafts:
|
||||
@@ -3359,3 +3482,23 @@ _drafts:
|
||||
restoreFromDraft: "下書きから復元"
|
||||
restore: "復元"
|
||||
listDrafts: "下書き一覧"
|
||||
schedule: "投稿予約"
|
||||
listScheduledNotes: "予約投稿一覧"
|
||||
cancelSchedule: "予約解除"
|
||||
|
||||
qr: "二次元コード"
|
||||
_qr:
|
||||
showTabTitle: "表示"
|
||||
readTabTitle: "読み取る"
|
||||
shareTitle: "{name} {acct}"
|
||||
shareText: "Fediverseで私をフォローしてください!"
|
||||
chooseCamera: "カメラを選択"
|
||||
cannotToggleFlash: "ライト選択不可"
|
||||
turnOnFlash: "ライトをオンにする"
|
||||
turnOffFlash: "ライトをオフにする"
|
||||
startQr: "コードリーダーを再開"
|
||||
stopQr: "コードリーダーを停止"
|
||||
noQrCodeFound: "QRコードが見つかりません"
|
||||
scanFile: "端末の画像をスキャン"
|
||||
raw: "テキスト"
|
||||
mfm: "MFM"
|
||||
|
||||
@@ -220,6 +220,7 @@ silenceThisInstance: "サーバーサイレンスすんで?"
|
||||
mediaSilenceThisInstance: "サーバーをメディアサイレンス"
|
||||
operations: "操作"
|
||||
software: "ソフトウェア"
|
||||
softwareName: "ソフトウェア名"
|
||||
version: "バージョン"
|
||||
metadata: "メタデータ"
|
||||
withNFiles: "{n}個のファイル"
|
||||
@@ -252,6 +253,7 @@ noteDeleteConfirm: "このノートをほかしてええか?"
|
||||
pinLimitExceeded: "これ以上ピン留めできひん"
|
||||
done: "でけた"
|
||||
processing: "処理しとる"
|
||||
preprocessing: "準備中"
|
||||
preview: "プレビュー"
|
||||
default: "デフォルト"
|
||||
defaultValueIs: "デフォルト: {value}"
|
||||
@@ -299,13 +301,14 @@ uploadFromUrlRequested: "アップロードしたい言うといたで"
|
||||
uploadFromUrlMayTakeTime: "アップロード終わるんにちょい時間かかるかもしれへんわ。"
|
||||
explore: "みつける"
|
||||
messageRead: "もう読んだ"
|
||||
readAllChatMessages: "メッセージを全部読んだことにしとく"
|
||||
noMoreHistory: "これより昔のんはあらへんで"
|
||||
startChat: "チャットを始めよか"
|
||||
nUsersRead: "{n}人が読んでもうた"
|
||||
agreeTo: "{0}に同意したで"
|
||||
agree: "せやな"
|
||||
agreeBelow: "下記に同意したる"
|
||||
basicNotesBeforeCreateAccount: "よう読んでやってや"
|
||||
agreeBelow: "下記に同意するわ"
|
||||
basicNotesBeforeCreateAccount: "よう読んどいてや"
|
||||
termsOfService: "使うための決め事"
|
||||
start: "始める"
|
||||
home: "ホーム"
|
||||
@@ -325,12 +328,13 @@ dark: "ダーク"
|
||||
lightThemes: "デイゲーム"
|
||||
darkThemes: "ナイトゲーム"
|
||||
syncDeviceDarkMode: "デバイスのダークモードと一緒にする"
|
||||
switchDarkModeManuallyWhenSyncEnabledConfirm: "「{x}」がオンになってるで。同期をオフにして手動でモードを切り替えることにします?"
|
||||
switchDarkModeManuallyWhenSyncEnabledConfirm: "「{x}」がオンになってるで。同期切って手動でモード切り替える?"
|
||||
drive: "ドライブ"
|
||||
fileName: "ファイル名"
|
||||
selectFile: "ファイル選んでや"
|
||||
selectFiles: "ファイル選んでや"
|
||||
selectFolder: "フォルダ選んでや"
|
||||
unselectFolder: "フォルダーの選択を解除"
|
||||
selectFolders: "フォルダ選んでや"
|
||||
fileNotSelected: "ファイルが選択されてへんで"
|
||||
renameFile: "ファイル名をいらう"
|
||||
@@ -421,14 +425,13 @@ antennaSource: "受信ソース(このソースは食われへん)"
|
||||
antennaKeywords: "受信キーワード"
|
||||
antennaExcludeKeywords: "除外キーワード"
|
||||
antennaExcludeBots: "Botアカウントを除外"
|
||||
antennaKeywordsDescription: "スペースで区切ったるとAND指定で、改行で区切ったるとOR指定や"
|
||||
antennaKeywordsDescription: "スペースで区切ったらAND指定で、改行で区切ったらOR指定や"
|
||||
notifyAntenna: "新しいノートを通知すんで"
|
||||
withFileAntenna: "なんか添付されたノートだけ"
|
||||
excludeNotesInSensitiveChannel: "センシティブなチャンネルのノートは入れんとくわ"
|
||||
enableServiceworker: "ブラウザにプッシュ通知が行くようにする"
|
||||
antennaUsersDescription: "ユーザー名を改行で区切ったってな"
|
||||
caseSensitive: "大文字と小文字は別もんや"
|
||||
withReplies: "返信も入れたって"
|
||||
connectedTo: "次のアカウントに繋がっとるで"
|
||||
notesAndReplies: "投稿と返信"
|
||||
withFiles: "ファイル付いとる"
|
||||
@@ -471,9 +474,9 @@ newPasswordIs: "今度のパスワードは「{password}」や"
|
||||
reduceUiAnimation: "UIの動きやアニメーションを少なする"
|
||||
share: "わけわけ"
|
||||
notFound: "見つからへんね"
|
||||
notFoundDescription: "言われたURLにはまるページはなかったで。"
|
||||
notFoundDescription: "言われたURLのページはなかったで。"
|
||||
uploadFolder: "とりあえずアップロードしたやつ置いとく所"
|
||||
markAsReadAllNotifications: "通知はもう全て読んだわっ"
|
||||
markAsReadAllNotifications: "通知はもう全部読んだわ"
|
||||
markAsReadAllUnreadNotes: "投稿は全て読んだわっ"
|
||||
markAsReadAllTalkMessages: "チャットはもうぜんぶ読んだわっ"
|
||||
help: "ヘルプ"
|
||||
@@ -554,7 +557,7 @@ showFeaturedNotesInTimeline: "タイムラインにおすすめのノートを
|
||||
objectStorage: "オブジェクトストレージ"
|
||||
useObjectStorage: "オブジェクトストレージを使う"
|
||||
objectStorageBaseUrl: "Base URL"
|
||||
objectStorageBaseUrlDesc: "参照に使うにURLやで。CDNやProxyを使用してるんならそのURL、S3: 'https://<bucket>.s3.amazonaws.com'、GCSとかなら: 'https://storage.googleapis.com/<bucket>'。"
|
||||
objectStorageBaseUrlDesc: "参照に使うURLやで。CDNやProxyを使用してるんならそのURL、S3: 'https://<bucket>.s3.amazonaws.com'、GCSとかなら: 'https://storage.googleapis.com/<bucket>'。"
|
||||
objectStorageBucket: "Bucket"
|
||||
objectStorageBucketDesc: "使ってるサービスのbucket名を選んでな"
|
||||
objectStoragePrefix: "Prefix"
|
||||
@@ -571,17 +574,19 @@ objectStorageSetPublicRead: "アップロードした時に'public-read'を設
|
||||
s3ForcePathStyleDesc: "s3ForcePathStyleを使たらバケット名をURLのホスト名やなくてパスの一部として必ず指定させるようになるで。セルフホストされたMinioとかを使うてるんやったら有効にせなあかん場合があるで。"
|
||||
serverLogs: "サーバーログ"
|
||||
deleteAll: "全部ほかす"
|
||||
showFixedPostForm: "タイムラインの上の方で投稿できるようにやってくれへん?"
|
||||
showFixedPostForm: "タイムラインの上の方で投稿できるようにするわ"
|
||||
showFixedPostFormInChannel: "タイムラインの上の方で投稿できるようにするわ(チャンネル)"
|
||||
withRepliesByDefaultForNewlyFollowed: "フォローする時、デフォルトで返信をタイムラインに含むようにしよか"
|
||||
newNoteRecived: "新しいノートがあるで"
|
||||
newNote: "新しいノートがあるで"
|
||||
sounds: "音"
|
||||
sound: "音"
|
||||
notificationSoundSettings: "通知音の設定"
|
||||
listen: "聴く"
|
||||
none: "なし"
|
||||
showInPage: "ページで表示"
|
||||
popout: "ポップアウト"
|
||||
volume: "やかましさ"
|
||||
volume: "音のでかさ"
|
||||
masterVolume: "全体のやかましさ"
|
||||
notUseSound: "音出さへん"
|
||||
useSoundOnlyWhenActive: "Misskeyがアクティブなときだけ音出す"
|
||||
@@ -597,7 +602,7 @@ nothing: "あらへん"
|
||||
installedDate: "インストールした日時"
|
||||
lastUsedDate: "最後に使った日時"
|
||||
state: "状態"
|
||||
sort: "仕分ける"
|
||||
sort: "並び替え"
|
||||
ascendingOrder: "小さい順"
|
||||
descendingOrder: "大きい順"
|
||||
scratchpad: "スクラッチパッド"
|
||||
@@ -657,9 +662,9 @@ useBlurEffectForModal: "モーダルにぼかし効果を使用"
|
||||
useFullReactionPicker: "フルフルのツッコミピッカーを使う"
|
||||
width: "幅"
|
||||
height: "高さ"
|
||||
large: "大"
|
||||
medium: "中"
|
||||
small: "小"
|
||||
large: "でかい"
|
||||
medium: "ふつう"
|
||||
small: "ちいさい"
|
||||
generateAccessToken: "アクセストークンの発行"
|
||||
permission: "権限"
|
||||
adminPermission: "管理者権限"
|
||||
@@ -684,7 +689,7 @@ smtpSecure: "SMTP 接続に暗黙的なSSL/TLSを使用する"
|
||||
smtpSecureInfo: "STARTTLS使っとる時はオフにしてや。"
|
||||
testEmail: "配信テスト"
|
||||
wordMute: "ワードミュート"
|
||||
wordMuteDescription: "指定した語句が入ってるノートを最小化するで。最小化されたノートをクリックしたら、表示できるようになるで。"
|
||||
wordMuteDescription: "指定した語句が入ってるノートをちっさくするで。ちっさくなったノートをクリックしたら中身を見れるで。"
|
||||
hardWordMute: "ハードワードミュート"
|
||||
showMutedWord: "ミュートされたワードを表示するで"
|
||||
hardWordMuteDescription: "指定した語句が入ってるノートを隠すで。ワードミュートとちゃうて、ノートは完全に表示されんようになるで。"
|
||||
@@ -718,7 +723,7 @@ behavior: "動作"
|
||||
sample: "サンプル"
|
||||
abuseReports: "通報"
|
||||
reportAbuse: "通報"
|
||||
reportAbuseRenote: "リノート苦情だすで?"
|
||||
reportAbuseRenote: "リノートの苦情出す"
|
||||
reportAbuseOf: "{name}を通報する"
|
||||
fillAbuseReportDescription: "細かい通報理由を書いてなー。対象ノートがある時はそのURLも書いといてなー。"
|
||||
abuseReported: "無事内容が送信されたみたいやで。おおきに〜。"
|
||||
@@ -768,6 +773,7 @@ lockedAccountInfo: "フォローを承認制にしとっても、ノートの公
|
||||
alwaysMarkSensitive: "デフォルトでメディアを閲覧注意にするで"
|
||||
loadRawImages: "添付画像のサムネイルをオリジナル画質にするで"
|
||||
disableShowingAnimatedImages: "アニメーション画像を再生せんとくで"
|
||||
disableShowingAnimatedImages_caption: "この設定を変えてもアニメーション画像が再生されへん時は、ブラウザとかOSのアクセシビリティ設定とか省電力設定の方が悪さしてるかもしれへんで。"
|
||||
highlightSensitiveMedia: "きわどいことをめっっちゃわかりやすくする"
|
||||
verificationEmailSent: "無事確認のメールを送れたで。メールに書いてあるリンクにアクセスして、設定を完了してなー。"
|
||||
notSet: "未設定"
|
||||
@@ -877,7 +883,7 @@ startingperiod: "始めた期間"
|
||||
memo: "メモ"
|
||||
priority: "優先度"
|
||||
high: "高い"
|
||||
middle: "中"
|
||||
middle: "ふつう"
|
||||
low: "低い"
|
||||
emailNotConfiguredWarning: "メアドの設定がされてへんで。"
|
||||
ratio: "比率"
|
||||
@@ -1014,6 +1020,9 @@ pushNotificationAlreadySubscribed: "プッシュ通知はオンになってる
|
||||
pushNotificationNotSupported: "ブラウザかサーバーがプッシュ通知に対応してないみたいやで。"
|
||||
sendPushNotificationReadMessage: "通知やメッセージが既読になったらプッシュ通知を消すで"
|
||||
sendPushNotificationReadMessageCaption: "あんたの端末の電池使う量が増えるかもしれん。"
|
||||
pleaseAllowPushNotification: "ブラウザの通知設定を許可してな"
|
||||
browserPushNotificationDisabled: "通知の送信権限が取れんかったわ"
|
||||
browserPushNotificationDisabledDescription: "今 {serverName} から通知を送るための権限が無いから、ブラウザの設定で通知を許可してもっかい試してな。"
|
||||
windowMaximize: "最大化"
|
||||
windowMinimize: "最小化"
|
||||
windowRestore: "元に戻す"
|
||||
@@ -1050,6 +1059,7 @@ permissionDeniedError: "操作が拒否されてもうた。"
|
||||
permissionDeniedErrorDescription: "このアカウントはこれやったらアカンって。"
|
||||
preset: "プリセット"
|
||||
selectFromPresets: "プリセットから選ぶ"
|
||||
custom: "カスタム"
|
||||
achievements: "実績"
|
||||
gotInvalidResponseError: "サーバー黙っとるわ、知らんけど"
|
||||
gotInvalidResponseErrorDescription: "サーバーいま日曜日。またきて月曜日。"
|
||||
@@ -1088,6 +1098,7 @@ prohibitedWordsDescription2: "スペースで区切るとAND指定、キーワ
|
||||
hiddenTags: "見えてへんハッシュタグ"
|
||||
hiddenTagsDescription: "設定したタグを最近流行りのとこに見えんようにすんで。複数設定するときは改行で区切ってな。"
|
||||
notesSearchNotAvailable: "なんかノート探せへん。"
|
||||
usersSearchNotAvailable: "ユーザーを探すことはできへんみたいや。"
|
||||
license: "ライセンス"
|
||||
unfavoriteConfirm: "ほんまに気に入らんの?"
|
||||
myClips: "自分のクリップ"
|
||||
@@ -1239,6 +1250,7 @@ releaseToRefresh: "離したらリロード"
|
||||
refreshing: "リロードしとる"
|
||||
pullDownToRefresh: "引っ張ってリロードするで"
|
||||
useGroupedNotifications: "通知をグループ分けして出すで"
|
||||
emailVerificationFailedError: "メアド確認してたらなんか変なことなったわ。リンクの期限切れてるかもしれん。"
|
||||
cwNotationRequired: "「内容を隠す」んやったら注釈書かなアカンで。"
|
||||
doReaction: "ツッコむで"
|
||||
code: "コード"
|
||||
@@ -1319,6 +1331,7 @@ preferenceSyncConflictChoiceMerge: "ガッチャンコしよか"
|
||||
preferenceSyncConflictChoiceCancel: "同期の有効化はやめとくわ"
|
||||
postForm: "投稿フォーム"
|
||||
information: "情報"
|
||||
directMessage: "チャットしよか"
|
||||
migrateOldSettings: "旧設定情報をお引っ越し"
|
||||
migrateOldSettings_description: "通常これは自動で行われるはずなんやけど、なんかの理由で上手く移行できへんかったときは手動で移行処理をポチっとできるで。今の設定情報は上書きされるで。"
|
||||
settingsMigrating: "設定を移行しとるで。ちょっと待っとってな... (後で、設定→その他→旧設定情報を移行 で手動で移行することもできるで)"
|
||||
@@ -1330,21 +1343,41 @@ unmuteX: "{x}のミュートやめたる"
|
||||
redisplayAllTips: "全部の「ヒントとコツ」をもっかい見して"
|
||||
hideAllTips: "「ヒントとコツ」は全部表示せんでええ"
|
||||
defaultImageCompressionLevel_description: "低くすると画質は保てるんやけど、ファイルサイズが増えるで。<br>高くするとファイルサイズは減らせるんやけど、画質が落ちるで。"
|
||||
defaultCompressionLevel_description: "低くすると品質は保てるんやけど、ファイルサイズが増えるで。<br>高くするとファイルサイズは減らせるんやけど、品質が落ちるで。"
|
||||
inMinutes: "分"
|
||||
inDays: "日"
|
||||
safeModeEnabled: "セーフモードがオンになってるで"
|
||||
pluginsAreDisabledBecauseSafeMode: "セーフモードがオンやから、プラグインは全部無効化されてるで。"
|
||||
customCssIsDisabledBecauseSafeMode: "セーフモードがオンやから、カスタムCSSは適用されてへんで。"
|
||||
themeIsDefaultBecauseSafeMode: "セーフモードがオンの間はデフォルトのテーマを使うで。セーフモードをオフにれば元に戻るで。"
|
||||
thankYouForTestingBeta: "ベータ版使うてくれておおきに!"
|
||||
widgets: "ウィジェット"
|
||||
deviceInfoDescription: "なんか技術的なことで分からんこと聞くときは、下の情報も一緒に書いてもらえると、こっちも分かりやすいし、はよ直ると思います。"
|
||||
youAreAdmin: "あんた、管理者やで"
|
||||
presets: "プリセット"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
filename: "ファイル名"
|
||||
_imageFrameEditor:
|
||||
tip: "画像にフレームとかメタデータを入れたラベルとかを付け足していい感じにできるで。"
|
||||
header: "ヘッダー"
|
||||
font: "フォント"
|
||||
fontSerif: "セリフ"
|
||||
fontSansSerif: "サンセリフ"
|
||||
quitWithoutSaveConfirm: "保存せずに終わってもええんか?"
|
||||
failedToLoadImage: "あかん、画像読み込まれへんわ"
|
||||
_chat:
|
||||
noMessagesYet: "まだメッセージはあらへんで"
|
||||
individualChat_description: "特定のユーザーと一対一でチャットができるで。"
|
||||
individualChat_description: "特定のユーザーとサシでチャットできるで。"
|
||||
roomChat_description: "複数人でチャットできるで。\nあと、個人チャットを許可してへんユーザーとでも、相手がええって言うならチャットできるで。"
|
||||
inviteUserToChat: "ユーザーを招待してチャットを始めてみ"
|
||||
invitations: "来てや"
|
||||
noInvitations: "招待はあらへんで"
|
||||
noHistory: "履歴はないわ。"
|
||||
noRooms: "ルームはあらへんで"
|
||||
join: "入る"
|
||||
ignore: "ほっとく"
|
||||
leave: "グループから抜ける"
|
||||
members: "メンバーはん"
|
||||
home: "ホーム"
|
||||
send: "送信"
|
||||
@@ -1387,11 +1420,13 @@ _settings:
|
||||
appearanceBanner: "好みに応じた、クライアントの見た目・表示方法に関わる設定ができるで。"
|
||||
soundsBanner: "クライアントで流すサウンドの設定ができるで。"
|
||||
makeEveryTextElementsSelectable: "全部のテキスト要素を選択できるようにする"
|
||||
makeEveryTextElementsSelectable_description: "これをつけると、一部のシチュエーションでユーザビリティが低下するかもしれん。"
|
||||
makeEveryTextElementsSelectable_description: "これをつけると、場面によったら使いにくくなるかもしれん。"
|
||||
useStickyIcons: "アイコンがスクロールにひっつくようにする"
|
||||
enablePullToRefresh_description: "マウスやったら、ホイールを押し込みながらドラッグしてな。"
|
||||
realtimeMode_description: "サーバーと接続を確立して、リアルタイムでコンテンツを更新するで。通信量とバッテリーの消費が多くなるかもしれへん。"
|
||||
contentsUpdateFrequency_description: "高いほどリアルタイムにコンテンツが更新されるんやけど、そのぶんパフォーマンスが低くなるし、通信量とバッテリーの消費も増えるねん。"
|
||||
contentsUpdateFrequency_description: "高いほどリアルタイムにコンテンツが更新されるんやけど、そのぶんパフォーマンスが落ちるし、通信量とバッテリーの消費も増えるねん。"
|
||||
contentsUpdateFrequency_description2: "リアルタイムモードをつけてるんやったら、この設定がどうであれリアルタイムでコンテンツが更新されるで。"
|
||||
emojiPaletteBanner: "絵文字ピッカーに置いとくプリセットをパレットっていうので登録したり、ピッカーの見た目を変えたりできるで。"
|
||||
_preferencesProfile:
|
||||
profileNameDescription: "このデバイスはなんて呼んだらええんや?"
|
||||
_preferencesBackup:
|
||||
@@ -1409,7 +1444,7 @@ _accountSettings:
|
||||
makeNotesFollowersOnlyBefore: "昔のノートをフォロワーだけに見てもらう"
|
||||
makeNotesFollowersOnlyBeforeDescription: "この機能が有効になってる間は、設定された日時より前、それか設定された時間が経ったノートがフォロワーのみ見れるようになるで。無効に戻すと、ノートの公開状態も戻るで。"
|
||||
makeNotesHiddenBefore: "昔のノートを見れんようにする"
|
||||
makeNotesHiddenBeforeDescription: "この機能が有効になってる間は、設定された日時より前、それか設定された時間が経ったノートがフォロワーのみ見れるようになるで。無効に戻すと、ノートの公開状態も戻るで。"
|
||||
makeNotesHiddenBeforeDescription: "この機能が有効になってる間は、設定された日時より前、それか設定された時間が経ったノートがあんただけ見れるようになるで。無効に戻すと、ノートの公開状態も戻るで。"
|
||||
mayNotEffectForFederatedNotes: "リモートサーバーに連合されたノートには効果が及ばんかもしれん。"
|
||||
mayNotEffectSomeSituations: "これらの制限は簡易的なものやで。リモートサーバーでの閲覧とかモデレーション時とか、一部のシチュエーションでは適用されへんかもしれん。"
|
||||
notesHavePassedSpecifiedPeriod: "決めた時間が経ったノート"
|
||||
@@ -1485,7 +1520,7 @@ _initialTutorial:
|
||||
description: "ここでは、Misskeyのカンタンな使い方とか機能を確かめれんで。"
|
||||
_note:
|
||||
title: "ノートってなんや?"
|
||||
description: "Misskeyでの投稿は「ノート」って呼ばれてんで。ノートは順々にタイムラインに載ってて、リアルタイムで新しくなってってんで。"
|
||||
description: "Misskeyでの投稿は「ノート」って呼ばれてんで。ノートは順々にタイムラインに載ってて、リアルタイムで新しくなってくで。"
|
||||
reply: "返信もできるで。返信の返信もできるから、スレッドっぽく会話をそのまま続けれもするで。"
|
||||
renote: "そのノートを自分のタイムラインに流して共有できるで。テキスト入れて引用してもええな。"
|
||||
reaction: "ツッコミをつけることもできるで。細かいことは次のページや。"
|
||||
@@ -1505,7 +1540,7 @@ _initialTutorial:
|
||||
social: "ホームタイムラインの投稿もローカルタイムラインのも一緒に見れるで。"
|
||||
global: "繋がってる他の全サーバーからの投稿が見れるで。"
|
||||
description2: "それぞれのタイムラインは、いつでも画面上で切り替えられんねん。覚えとき。"
|
||||
description3: "その他にも、リストタイムラインとかチャンネルタイムラインとかがあんねん。詳しいのは{link}を見とき。"
|
||||
description3: "その他にも、リストタイムラインとかチャンネルタイムラインとかがあんねん。詳しいのは{link}を見ときや。"
|
||||
_postNote:
|
||||
title: "ノートの投稿設定"
|
||||
description1: "Misskeyにノートを投稿するとき、いろんなオプションが付けれるで。投稿画面はこんな感じや。"
|
||||
@@ -1541,7 +1576,7 @@ _timelineDescription:
|
||||
home: "ホームタイムラインは、あんたがフォローしとるアカウントの投稿だけ見れるで。"
|
||||
local: "ローカルタイムラインは、このサーバーにおる全員の投稿を見れるで。"
|
||||
social: "ソーシャルタイムラインは、ホームタイムラインの投稿もローカルタイムラインのも一緒に見れるで。"
|
||||
global: "グローバルタイムラインは、繋がっとる他のサーバーの投稿、全部ひっくるめて見れんで。"
|
||||
global: "グローバルタイムラインは、繋がっとる他のサーバーの投稿、全部ひっくるめて見れるで。"
|
||||
_serverRules:
|
||||
description: "新規登録前に見せる、サーバーのカンタンなルールを決めるで。内容は使うための決め事の要約がええと思うわ。"
|
||||
_serverSettings:
|
||||
@@ -1561,7 +1596,7 @@ _serverSettings:
|
||||
inquiryUrl: "問い合わせ先URL"
|
||||
inquiryUrlDescription: "サーバー運営者へのお問い合わせフォームのURLや、運営者の連絡先等が記載されたWebページのURLを指定するで。"
|
||||
openRegistration: "アカウントの作成をオープンにする"
|
||||
openRegistrationWarning: "登録を解放するのはリスクが伴うで。サーバーをいっつも監視して、なんか起きたらすぐに対応できるんやったら、オンにしてもええと思う。"
|
||||
openRegistrationWarning: "登録を解放するのはリスクあるで。サーバーをいっつも監視して、なんか起きたらすぐに対応できるんやったら、オンにしてもええと思うけどな。"
|
||||
thisSettingWillAutomaticallyOffWhenModeratorsInactive: "一定期間モデレーターがおらんかったら、スパムを防ぐためにこの設定は勝手に切られるで。"
|
||||
deliverSuspendedSoftwareDescription: "脆弱性とかの理由で、サーバーのソフトウェアの名前とバージョンの範囲を決めて配信を止められるで。このバージョン情報はサーバーが提供したものやから、信頼性は保証されへん。バージョン指定には semver の範囲指定が使えるねんけど、>= 2024.3.1と指定すると 2024.3.1-custom.0 みたいなカスタムバージョンが含まれへんから、>= 2024.3.1-0 みたいに prerelease を指定するとええかもしれへんな。"
|
||||
singleUserMode_description: "このサーバーを使うとるんが自分だけなんやったら、このモードを有効にすると動作がええ感じになるで。"
|
||||
@@ -1956,7 +1991,7 @@ _signup:
|
||||
emailSent: "さっき入れたメアド({email})宛に確認メールを送ったで。メールに書かれたリンク押してアカウント作るの終わらしてな。\nメールの認証リンクの期限は30分や。"
|
||||
_accountDelete:
|
||||
accountDelete: "アカウントの削除"
|
||||
mayTakeTime: "アカウント消すんはサーバーが重いんやって。やから作ったコンテンツとか上げたファイルの数が多いと消し終わるまでに時間がかかるかもしれへん。"
|
||||
mayTakeTime: "アカウント消すんはサーバーに負荷かかるんやって。やから、作ったコンテンツとか上げたファイルの数が多いと消し終わるまでに時間がかかるかもしれんわ。"
|
||||
sendEmail: "アカウントの消し終わるときは、登録してたメアドに通知するで。"
|
||||
requestAccountDelete: "アカウント削除頼む"
|
||||
started: "削除処理が始まったで。"
|
||||
@@ -2135,6 +2170,7 @@ _sfx:
|
||||
noteMy: "ノート(自分)"
|
||||
notification: "通知"
|
||||
reaction: "ツッコミ選んどるとき"
|
||||
chatMessage: "チャットしよか"
|
||||
_soundSettings:
|
||||
driveFile: "ドライブん中の音使う"
|
||||
driveFileWarn: "ドライブん中のファイル選びや"
|
||||
@@ -2295,6 +2331,7 @@ _auth:
|
||||
scopeUser: "以下のユーザーとしていじってるで"
|
||||
pleaseLogin: "アプリにアクセスさせるんやったら、ログインしてや。"
|
||||
byClickingYouWillBeRedirectedToThisUrl: "アクセスを許したら、自動で下のURLに遷移するで"
|
||||
alreadyAuthorized: "このアプリはもうアクセスを許可してるみたいやで。"
|
||||
_antennaSources:
|
||||
all: "みんなのノート"
|
||||
homeTimeline: "フォローしとるユーザーのノート"
|
||||
@@ -2340,6 +2377,7 @@ _widgets:
|
||||
chooseList: "リストを選ぶ"
|
||||
clicker: "クリッカー"
|
||||
birthdayFollowings: "今日誕生日のツレ"
|
||||
chat: "チャットしよか"
|
||||
_cw:
|
||||
hide: "隠す"
|
||||
show: "続き見して!"
|
||||
@@ -2384,6 +2422,14 @@ _postForm:
|
||||
replyPlaceholder: "このノートに返信..."
|
||||
quotePlaceholder: "このノートを引用..."
|
||||
channelPlaceholder: "チャンネルに投稿..."
|
||||
_howToUse:
|
||||
toolbar_description: "ファイルとかアンケートを付けたり、注釈とかハッシュタグを書いたり、絵文字とかメンションとかを付け足したりできるで。"
|
||||
account_description: "投稿するアカウントを変えたり、アカウントに保存した下書きとか予約投稿とかを見れるで。"
|
||||
visibility_title: "公開範囲"
|
||||
visibility_description: "ノートを誰に見せたいかはここで切り替えてな。"
|
||||
menu_title: "メニュー"
|
||||
menu_description: "下書きに保存したり、投稿の予約したり、リアクションの受け入れ設定とか…なんか色々できるで。"
|
||||
submit_description: "ノートを投稿するときはここ押してな。Ctrl + Enter / Cmd + Enter でも投稿できるで。"
|
||||
_placeholders:
|
||||
a: "いまどないしとるん?"
|
||||
b: "何かあったん?"
|
||||
@@ -2529,6 +2575,8 @@ _notification:
|
||||
youReceivedFollowRequest: "フォロー許可してほしいみたいやな"
|
||||
yourFollowRequestAccepted: "フォローさせてもろたで"
|
||||
pollEnded: "アンケートの結果が出たみたいや"
|
||||
scheduledNotePosted: "予約ノートが投稿されたで"
|
||||
scheduledNotePostFailed: "予約ノート投稿できんかったで"
|
||||
newNote: "さらの投稿"
|
||||
unreadAntennaNote: "アンテナ {name}"
|
||||
roleAssigned: "ロールが付与されたで"
|
||||
@@ -2602,6 +2650,7 @@ _deck:
|
||||
mentions: "あんた宛て"
|
||||
direct: "ダイレクト"
|
||||
roleTimeline: "ロールタイムライン"
|
||||
chat: "チャットしよか"
|
||||
_dialog:
|
||||
charactersExceeded: "最大の文字数を上回っとるで!今は {current} / 最大でも {max}"
|
||||
charactersBelow: "最小の文字数を下回っとるで!今は {current} / 最低でも {min}"
|
||||
@@ -2994,6 +3043,7 @@ _uploader:
|
||||
maxFileSizeIsX: "アップロードできるファイルサイズは{x}までやで。"
|
||||
tip: "ファイルはまだアップロードされてへんで。このダイアログで、アップロードする前に確認・リネーム・圧縮・クロッピングとかをできるで。準備が出来たら、「アップロード」ボタンを押してアップロードしてな。"
|
||||
_clientPerformanceIssueTip:
|
||||
title: "バッテリーようさん食うなぁと思ったら"
|
||||
makeSureDisabledAdBlocker: "アドブロッカーを切ってみてや"
|
||||
makeSureDisabledAdBlocker_description: "アドブロッカーはパフォーマンスに影響があるかもしれへん。OSの機能とかブラウザの機能・アドオンとかでアドブロッカーが有効になってないか確認してや。"
|
||||
makeSureDisabledCustomCss: "カスタムCSSを無効にしてみてや"
|
||||
@@ -3017,12 +3067,15 @@ _watermarkEditor:
|
||||
image: "画像"
|
||||
advanced: "高度"
|
||||
angle: "角度"
|
||||
failedToLoadImage: "あかん、画像読み込まれへんわ"
|
||||
_imageEffector:
|
||||
discardChangesConfirm: "変更をせんで終わるか?"
|
||||
failedToLoadImage: "あかん、画像読み込まれへんわ"
|
||||
_fxProps:
|
||||
angle: "角度"
|
||||
scale: "大きさ"
|
||||
size: "大きさ"
|
||||
offset: "位置"
|
||||
color: "色"
|
||||
opacity: "不透明度"
|
||||
lightness: "明るさ"
|
||||
@@ -3032,3 +3085,7 @@ _drafts:
|
||||
delete: "下書きをほかす"
|
||||
deleteAreYouSure: "下書きをほかしてもええか?"
|
||||
noDrafts: "下書きはあらへん"
|
||||
_qr:
|
||||
showTabTitle: "表示"
|
||||
shareText: "Fediverseでフォローしてな!"
|
||||
raw: "テキスト"
|
||||
|
||||
@@ -57,6 +57,10 @@ searchByGoogle: "Nadi"
|
||||
file: "Ifuyla"
|
||||
account: "Imiḍan"
|
||||
replies: "Err"
|
||||
_imageFrameEditor:
|
||||
font: "Tasefsit"
|
||||
fontSerif: "Serif"
|
||||
fontSansSerif: "Sans Serif"
|
||||
_email:
|
||||
_follow:
|
||||
title: "Yeṭṭafaṛ-ik·em-id"
|
||||
|
||||
@@ -651,6 +651,9 @@ renotes: "리노트"
|
||||
attach: "옇기"
|
||||
surrender: "아이예"
|
||||
information: "정보"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
filename: "파일 이럼"
|
||||
_chat:
|
||||
invitations: "초대하기"
|
||||
noHistory: "기록이 없십니다"
|
||||
@@ -852,3 +855,5 @@ _search:
|
||||
searchScopeUser: "사용자 지정"
|
||||
_watermarkEditor:
|
||||
image: "이미지"
|
||||
_qr:
|
||||
showTabTitle: "보기"
|
||||
|
||||
@@ -83,6 +83,8 @@ files: "파일"
|
||||
download: "다운로드"
|
||||
driveFileDeleteConfirm: "‘{name}’ 파일을 삭제하시겠습니까? 이 파일을 사용하는 일부 콘텐츠도 삭제됩니다."
|
||||
unfollowConfirm: "{name}님을 언팔로우하시겠습니까?"
|
||||
cancelFollowRequestConfirm: "{name}(으)로의 팔로우 신청을 취소하시겠습니까?"
|
||||
rejectFollowRequestConfirm: "{name}(으)로부터의 팔로우 신청을 거부하시겠습니까?"
|
||||
exportRequested: "내보내기를 요청하였습니다. 이 작업은 시간이 걸릴 수 있습니다. 내보내기가 완료되면 \"드라이브\"에 추가됩니다."
|
||||
importRequested: "가져오기를 요청하였습니다. 이 작업에는 시간이 걸릴 수 있습니다."
|
||||
lists: "리스트"
|
||||
@@ -253,6 +255,7 @@ noteDeleteConfirm: "이 노트를 삭제하시겠습니까?"
|
||||
pinLimitExceeded: "더 이상 고정할 수 없습니다."
|
||||
done: "완료"
|
||||
processing: "처리중"
|
||||
preprocessing: "준비중"
|
||||
preview: "미리보기"
|
||||
default: "기본값"
|
||||
defaultValueIs: "기본값: {value}"
|
||||
@@ -301,6 +304,7 @@ uploadFromUrlMayTakeTime: "업로드가 완료될 때까지 시간이 소요될
|
||||
uploadNFiles: "{n}개의 파일을 업로"
|
||||
explore: "둘러보기"
|
||||
messageRead: "읽음"
|
||||
readAllChatMessages: "모든 메시지를 읽은 상태로 표시"
|
||||
noMoreHistory: "이것보다 과거의 기록이 없습니다"
|
||||
startChat: "채팅을 시작하기"
|
||||
nUsersRead: "{n}명이 읽음"
|
||||
@@ -333,6 +337,7 @@ fileName: "파일명"
|
||||
selectFile: "파일 선택"
|
||||
selectFiles: "파일 선택"
|
||||
selectFolder: "폴더 선택"
|
||||
unselectFolder: "폴더 선택 해제"
|
||||
selectFolders: "폴더 선택"
|
||||
fileNotSelected: "파일을 선택하지 않았습니다"
|
||||
renameFile: "파일 이름 변경"
|
||||
@@ -345,6 +350,7 @@ addFile: "파일 추가"
|
||||
showFile: "파일 표시하기"
|
||||
emptyDrive: "드라이브가 비어 있습니다"
|
||||
emptyFolder: "폴더가 비어 있습니다"
|
||||
dropHereToUpload: "업로드할 파일을 여기로 드롭하십시오"
|
||||
unableToDelete: "삭제할 수 없습니다"
|
||||
inputNewFileName: "바꿀 파일명을 입력해 주세요"
|
||||
inputNewDescription: "새 캡션을 입력해 주세요"
|
||||
@@ -772,6 +778,7 @@ lockedAccountInfo: "팔로우를 승인으로 승인받더라도 노트의 공
|
||||
alwaysMarkSensitive: "미디어를 항상 열람 주의로 설정"
|
||||
loadRawImages: "첨부한 이미지의 썸네일을 원본화질로 표시"
|
||||
disableShowingAnimatedImages: "움직이는 이미지를 자동으로 재생하지 않음"
|
||||
disableShowingAnimatedImages_caption: "이 설정에 상관없이 애니메이션 이미지가 재생되지 않을 때는 브라우저·OS의 액티비티 설정이나 절전 모드 설정 등이 간섭하고 있는 경우가 있습니다."
|
||||
highlightSensitiveMedia: "미디어가 민감한 내용이라는 것을 알기 쉽게 표시"
|
||||
verificationEmailSent: "확인 메일을 발송하였습니다. 설정을 완료하려면 메일에 첨부된 링크를 확인해 주세요."
|
||||
notSet: "설정되지 않음"
|
||||
@@ -1018,6 +1025,9 @@ pushNotificationAlreadySubscribed: "푸시 알림이 이미 켜져 있습니다"
|
||||
pushNotificationNotSupported: "브라우저나 서버에서 푸시 알림이 지원되지 않습니다"
|
||||
sendPushNotificationReadMessage: "푸시 알림이나 메시지를 읽은 뒤 푸시 알림을 삭제"
|
||||
sendPushNotificationReadMessageCaption: "「{emptyPushNotificationMessage}」이라는 알림이 잠깐 표시됩니다. 기기의 전력 소비량이 증가할 수 있습니다."
|
||||
pleaseAllowPushNotification: "브라우저의 알림 설정을 허가해 주십시오."
|
||||
browserPushNotificationDisabled: "알림 송신 권한 얻기에 실패했습니다."
|
||||
browserPushNotificationDisabledDescription: "{serverName}에서의 알림 송신 권한이 없습니다. 브라우저의 설정에서 알림을 허가해 다시 시도해 주십시오."
|
||||
windowMaximize: "최대화"
|
||||
windowMinimize: "최소화"
|
||||
windowRestore: "복구"
|
||||
@@ -1168,6 +1178,7 @@ installed: "설치됨"
|
||||
branding: "브랜딩"
|
||||
enableServerMachineStats: "서버의 머신 사양을 공개하기"
|
||||
enableIdenticonGeneration: "유저마다의 Identicon 생성 유효화"
|
||||
showRoleBadgesOfRemoteUsers: "리모트 유저의 역할 배지 표시"
|
||||
turnOffToImprovePerformance: "이 기능을 끄면 성능이 향상될 수 있습니다."
|
||||
createInviteCode: "초대 코드 생성"
|
||||
createWithOptions: "옵션을 지정하여 생성"
|
||||
@@ -1316,6 +1327,7 @@ acknowledgeNotesAndEnable: "활성화 하기 전에 주의 사항을 확인했
|
||||
federationSpecified: "이 서버는 화이트 리스트 제도로 운영 중 입니다. 정해진 리모트 서버가 아닌 경우 연합되지 않습니다."
|
||||
federationDisabled: "이 서버는 연합을 하지 않고 있습니다. 리모트 서버 유저와 통신을 할 수 없습니다."
|
||||
draft: "초안"
|
||||
draftsAndScheduledNotes: "초안과 예약 게시물"
|
||||
confirmOnReact: "리액션할 때 확인"
|
||||
reactAreYouSure: "\" {emoji} \"로 리액션하시겠습니까?"
|
||||
markAsSensitiveConfirm: "이 미디어를 민감한 미디어로 설정하시겠습니까?"
|
||||
@@ -1343,6 +1355,8 @@ postForm: "글 입력란"
|
||||
textCount: "문자 수"
|
||||
information: "정보"
|
||||
chat: "채팅"
|
||||
directMessage: "채팅하기"
|
||||
directMessage_short: "메시지"
|
||||
migrateOldSettings: "기존 설정 정보를 이전"
|
||||
migrateOldSettings_description: "보통은 자동으로 이루어지지만, 어떤 이유로 인해 성공적으로 이전이 이루어지지 않는 경우 수동으로 이전을 실행할 수 있습니다. 현재 설정 정보는 덮어쓰게 됩니다."
|
||||
compress: "압축"
|
||||
@@ -1370,6 +1384,8 @@ redisplayAllTips: "모든 '팁과 유용한 정보'를 재표시"
|
||||
hideAllTips: "모든 '팁과 유용한 정보'를 비표시"
|
||||
defaultImageCompressionLevel: "기본 이미지 압축 정도"
|
||||
defaultImageCompressionLevel_description: "낮추면 화질을 유지합니다만 파일 크기는 증가합니다. <br>높이면 파일 크기를 줄일 수 있습니다만 화질은 저하됩니다."
|
||||
defaultCompressionLevel: "기본 압축 정도 "
|
||||
defaultCompressionLevel_description: "낮추면 품질을 유지합니다만 파일 크기는 증가합니다. <br>높이면 파일 크기를 줄일 수 있습니다만 품질은 저하됩니다."
|
||||
inMinutes: "분"
|
||||
inDays: "일"
|
||||
safeModeEnabled: "세이프 모드가 활성화돼있습니다"
|
||||
@@ -1377,10 +1393,73 @@ pluginsAreDisabledBecauseSafeMode: "세이프 모드가 활성화돼있기에
|
||||
customCssIsDisabledBecauseSafeMode: "세이프 모드가 활성화돼있기에 커스텀 CSS는 적용되지 않습니다."
|
||||
themeIsDefaultBecauseSafeMode: "세이프 모드가 활성화돼있는 동안에는 기본 테마가 사용됩니다. 세이프 모드를 끄면 원래대로 돌아옵니다."
|
||||
thankYouForTestingBeta: "베타 버전의 검증에 협력해 주셔서 감사합니다!"
|
||||
createUserSpecifiedNote: "사용자 지정 노트를 작성"
|
||||
schedulePost: "게시 예약"
|
||||
scheduleToPostOnX: "{x}에 게시를 예약합니다."
|
||||
scheduledToPostOnX: "{x}에 게시가 예약돼있습니다."
|
||||
schedule: "예약"
|
||||
scheduled: "예약"
|
||||
widgets: "위젯"
|
||||
deviceInfo: "장치 정보"
|
||||
deviceInfoDescription: "기술적 문의의 경우 아래의 정보를 병기하면 문제의 해결에 도움이 됩니다."
|
||||
youAreAdmin: "당신은 관리자입니다."
|
||||
frame: "프레임"
|
||||
presets: "프리셋"
|
||||
zeroPadding: "0으로 채우기"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
caption: "파일 설명"
|
||||
filename: "파일명"
|
||||
filename_without_ext: "확장자가 없는 파일명"
|
||||
year: "촬영한 해"
|
||||
month: "촬영한 달"
|
||||
day: "촬영한 날"
|
||||
hour: "촬영한 시각(시)"
|
||||
minute: "촬영한 시각(분)"
|
||||
second: "촬영한 시각(초)"
|
||||
camera_model: "카메라 이름"
|
||||
camera_lens_model: "렌즈 이름"
|
||||
camera_mm: "초점 거리"
|
||||
camera_mm_35: "초점 거리(35m판 환산)"
|
||||
camera_f: "조리개 조절"
|
||||
camera_s: "셔터 속도"
|
||||
camera_iso: "ISO 감도"
|
||||
gps_lat: "위도"
|
||||
gps_long: "경도"
|
||||
_imageFrameEditor:
|
||||
title: "프레임 편집"
|
||||
tip: "이미지에 프레임이나 메타 데이터를 포함한 라벨을 추가해 장식할 수 있습니다."
|
||||
header: "헤더"
|
||||
footer: "꼬리말"
|
||||
borderThickness: "테두리의 폭"
|
||||
labelThickness: "라벨의 폭"
|
||||
labelScale: "라벨의 스케일"
|
||||
centered: "중앙 정렬"
|
||||
captionMain: "캡션(대)"
|
||||
captionSub: "캡션(소)"
|
||||
availableVariables: "이용 가능한 변수"
|
||||
withQrCode: "QR 코드"
|
||||
backgroundColor: "배경색"
|
||||
textColor: "글꼴 색상"
|
||||
font: "폰트"
|
||||
fontSerif: "명조체"
|
||||
fontSansSerif: "고딕체"
|
||||
quitWithoutSaveConfirm: "보존하지 않고 종료하시겠습니까?"
|
||||
failedToLoadImage: "이미지 로드에 실패했습니다."
|
||||
_compression:
|
||||
_quality:
|
||||
high: "고품질"
|
||||
medium: "중간 품질"
|
||||
low: "저품질"
|
||||
_size:
|
||||
large: "대형"
|
||||
medium: "중형"
|
||||
small: "소형"
|
||||
_order:
|
||||
newest: "최신 순"
|
||||
oldest: "오래된 순"
|
||||
_chat:
|
||||
messages: "메시지"
|
||||
noMessagesYet: "아직 메시지가 없습니다"
|
||||
newMessage: "새로운 메시지"
|
||||
individualChat: "개인 대화"
|
||||
@@ -1469,6 +1548,8 @@ _settings:
|
||||
showUrlPreview: "URL 미리보기 표시"
|
||||
showAvailableReactionsFirstInNote: "이용 가능한 리액션을 선두로 표시"
|
||||
showPageTabBarBottom: "페이지의 탭 바를 아래쪽에 표시"
|
||||
emojiPaletteBanner: "이모티콘 선택기에 고정 표시되는 프리셋을 팔레트로 등록하거나 선택기의 표시 방법을 커스터마이징할 수 있습니다."
|
||||
enableAnimatedImages: "애니메이션 이미지 활성화"
|
||||
_chat:
|
||||
showSenderName: "발신자 이름 표시"
|
||||
sendOnEnter: "엔터로 보내기"
|
||||
@@ -1477,6 +1558,8 @@ _preferencesProfile:
|
||||
profileNameDescription: "이 디바이스를 식별할 이름을 설정해 주세요."
|
||||
profileNameDescription2: "예: '메인PC', '스마트폰' 등"
|
||||
manageProfiles: "프로파일 관리"
|
||||
shareSameProfileBetweenDevicesIsNotRecommended: "여러 장치에서 동일한 프로필을 공유하는 것은 권장하지 않습니다."
|
||||
useSyncBetweenDevicesOptionIfYouWantToSyncSetting: "여러 장치에서 동기화하고 싶은 설정 항목이 있는 경우에는 개별로 '여러 장치에서 동기화' 옵션을 활성화해 주십시오."
|
||||
_preferencesBackup:
|
||||
autoBackup: "자동 백업"
|
||||
restoreFromBackup: "백업으로 복구"
|
||||
@@ -1486,6 +1569,7 @@ _preferencesBackup:
|
||||
youNeedToNameYourProfileToEnableAutoBackup: "자동 백업을 활성화하려면 프로필 이름을 설정해야 합니다."
|
||||
autoPreferencesBackupIsNotEnabledForThisDevice: "이 장치에서 설정 자동 백업이 활성화되어 있지 않습니다."
|
||||
backupFound: "설정 백업이 발견되었습니다"
|
||||
forceBackup: "설정 강제 백업"
|
||||
_accountSettings:
|
||||
requireSigninToViewContents: "콘텐츠 열람을 위해 로그인을 필수로 설정하기"
|
||||
requireSigninToViewContentsDescription1: "자신이 작성한 모든 노트 등의 콘텐츠를 보기 위해 로그인을 필수로 설정합니다. 크롤러가 정보 수집하는 것을 방지하는 효과를 기대할 수 있습니다."
|
||||
@@ -1991,6 +2075,7 @@ _role:
|
||||
canManageAvatarDecorations: "아바타 꾸미기 관리"
|
||||
driveCapacity: "드라이브 용량"
|
||||
maxFileSize: "업로드 가능한 최대 파일 크기"
|
||||
maxFileSize_caption: "리버스 프록시나 CDN 등 전단에서 다른 설정값이 존재하는 경우가 있습니다."
|
||||
alwaysMarkNsfw: "파일을 항상 NSFW로 지정"
|
||||
canUpdateBioMedia: "아바타 및 배너 이미지 변경 허용"
|
||||
pinMax: "고정할 수 있는 노트 수"
|
||||
@@ -2018,6 +2103,7 @@ _role:
|
||||
uploadableFileTypes_caption: "MIME 유형을 "
|
||||
uploadableFileTypes_caption2: "파일에 따라서는 유형을 검사하지 못하는 경우가 있습니다. 그러한 파일을 허가하는 경우에는 {x}를 지정으로 추가해주십시오."
|
||||
noteDraftLimit: "서버측 노트 초안 작성 가능 수"
|
||||
scheduledNoteLimit: "예약 게시물의 동시 작성 가능 수"
|
||||
watermarkAvailable: "워터마크 기능의 사용 여부"
|
||||
_condition:
|
||||
roleAssignedTo: "수동 역할에 이미 할당됨"
|
||||
@@ -2408,6 +2494,7 @@ _auth:
|
||||
scopeUser: "다음 유저로 활동하고 있습니다."
|
||||
pleaseLogin: "어플리케이션의 접근을 허가하려면 로그인하십시오."
|
||||
byClickingYouWillBeRedirectedToThisUrl: "접근을 허용하면 자동으로 다음 URL로 이동합니다."
|
||||
alreadyAuthorized: "이 애플리케이션은 이미 접근이 허가돼있습니다."
|
||||
_antennaSources:
|
||||
all: "모든 노트"
|
||||
homeTimeline: "팔로우중인 유저의 노트"
|
||||
@@ -2453,7 +2540,7 @@ _widgets:
|
||||
chooseList: "리스트 선택"
|
||||
clicker: "클리커"
|
||||
birthdayFollowings: "오늘이 생일인 유저"
|
||||
chat: "채팅"
|
||||
chat: "채팅하기"
|
||||
_cw:
|
||||
hide: "숨기기"
|
||||
show: "더 보기"
|
||||
@@ -2498,6 +2585,20 @@ _postForm:
|
||||
replyPlaceholder: "이 노트에 답글..."
|
||||
quotePlaceholder: "이 노트를 인용..."
|
||||
channelPlaceholder: "채널에 게시하기..."
|
||||
showHowToUse: "입력란의 설명 표시"
|
||||
_howToUse:
|
||||
content_title: "본문"
|
||||
content_description: "게시할 내용을 입력합니다."
|
||||
toolbar_title: "도구 모음"
|
||||
toolbar_description: "파일이나 설문의 첨부, 주석이나 해시태그 설정, 이모티콘이나 멘션의 삽입 등을 할 수 있습니다."
|
||||
account_title: "계정 메뉴"
|
||||
account_description: "게시할 계정을 교체하거나, 계정에 보존한 초안 및 예약 게시물을 목록으로 볼 수 있습니다."
|
||||
visibility_title: "공개 범위"
|
||||
visibility_description: "노트 공개 범위의 설정을 할 수 있습니다."
|
||||
menu_title: "메뉴"
|
||||
menu_description: "초안의 보존, 게시 예약, 리액션의 설정 등 그 외의 액션을 할 수 있습니다."
|
||||
submit_title: "게시 버튼"
|
||||
submit_description: "노트를 게시합니다. Ctrl + Enter / Cmd + Enter로도 게시할 수 있습니다."
|
||||
_placeholders:
|
||||
a: "지금 무엇을 하고 있나요?"
|
||||
b: "무슨 일이 일어나고 있나요?"
|
||||
@@ -2643,6 +2744,8 @@ _notification:
|
||||
youReceivedFollowRequest: "새로운 팔로우 요청이 있습니다"
|
||||
yourFollowRequestAccepted: "팔로우 요청이 수락되었습니다"
|
||||
pollEnded: "투표 결과가 발표되었습니다"
|
||||
scheduledNotePosted: "예약 노트가 게시됐습니다."
|
||||
scheduledNotePostFailed: "예약 노트의 게시에 실패했습니다."
|
||||
newNote: "새 게시물"
|
||||
unreadAntennaNote: "안테나 {name}"
|
||||
roleAssigned: "역할이 부여 되었습니다."
|
||||
@@ -2672,6 +2775,8 @@ _notification:
|
||||
quote: "인용"
|
||||
reaction: "리액션"
|
||||
pollEnded: "투표가 종료됨"
|
||||
scheduledNotePosted: "예약 게시에 성공했습니다"
|
||||
scheduledNotePostFailed: "예약 게시에 실패했습니다"
|
||||
receiveFollowRequest: "팔로우 요청을 받았을 때"
|
||||
followRequestAccepted: "팔로우 요청이 승인되었을 때"
|
||||
roleAssigned: "역할이 부여됨"
|
||||
@@ -2722,7 +2827,7 @@ _deck:
|
||||
mentions: "받은 멘션"
|
||||
direct: "다이렉트"
|
||||
roleTimeline: "역할 타임라인"
|
||||
chat: "채팅"
|
||||
chat: "채팅하기"
|
||||
_dialog:
|
||||
charactersExceeded: "최대 글자수를 초과하였습니다! 현재 {current} / 최대 {max}"
|
||||
charactersBelow: "최소 글자수 미만입니다! 현재 {current} / 최소 {min}"
|
||||
@@ -2771,6 +2876,8 @@ _abuseReport:
|
||||
notifiedWebhook: "사용할 Webhook"
|
||||
deleteConfirm: "수신자를 삭제하시겠습니까?"
|
||||
_moderationLogTypes:
|
||||
clearQueue: "작업 대기열 비우기"
|
||||
promoteQueue: "큐의 작업을 재시도"
|
||||
createRole: "역할 생성"
|
||||
deleteRole: "역할 삭제"
|
||||
updateRole: "역할 수정"
|
||||
@@ -3165,10 +3272,13 @@ _watermarkEditor:
|
||||
title: "워터마크 편집"
|
||||
cover: "전체에 붙이기"
|
||||
repeat: "전면에 깔기"
|
||||
preserveBoundingRect: "회전 시 빠져나오지 않도록 조정"
|
||||
opacity: "불투명도"
|
||||
scale: "크기"
|
||||
text: "텍스트"
|
||||
qr: "QR 코드"
|
||||
position: "위치"
|
||||
margin: "여백"
|
||||
type: "종류"
|
||||
image: "이미지"
|
||||
advanced: "고급"
|
||||
@@ -3183,17 +3293,22 @@ _watermarkEditor:
|
||||
polkadotSubDotOpacity: "서브 물방울의 불투명도"
|
||||
polkadotSubDotRadius: "서브 물방울의 크기"
|
||||
polkadotSubDotDivisions: "서브 물방울의 수"
|
||||
leaveBlankToAccountUrl: "빈칸일 경우 계정의 URL로 됩니다."
|
||||
failedToLoadImage: "이미지 로딩에 실패했습니다."
|
||||
_imageEffector:
|
||||
title: "이펙트"
|
||||
addEffect: "이펙트를 추가"
|
||||
discardChangesConfirm: "변경을 취소하고 종료하시겠습니까?"
|
||||
nothingToConfigure: "설정 항목이 없습니다."
|
||||
failedToLoadImage: "이미지 로딩에 실패했습니다."
|
||||
_fxs:
|
||||
chromaticAberration: "색수차"
|
||||
glitch: "글리치"
|
||||
mirror: "미러"
|
||||
invert: "색 반전"
|
||||
grayscale: "흑백"
|
||||
blur: "흐림 효과"
|
||||
pixelate: "모자이크"
|
||||
colorAdjust: "색조 보정"
|
||||
colorClamp: "색 압축"
|
||||
colorClampAdvanced: "색 압축(고급)"
|
||||
@@ -3205,10 +3320,14 @@ _imageEffector:
|
||||
checker: "체크 무늬"
|
||||
blockNoise: "노이즈 방지"
|
||||
tearing: "티어링"
|
||||
fill: "채우기"
|
||||
_fxProps:
|
||||
angle: "각도"
|
||||
scale: "크기"
|
||||
size: "크기"
|
||||
radius: "반지름"
|
||||
samples: "샘플 수"
|
||||
offset: "위치"
|
||||
color: "색"
|
||||
opacity: "불투명도"
|
||||
normalize: "노멀라이즈"
|
||||
@@ -3237,6 +3356,7 @@ _imageEffector:
|
||||
zoomLinesThreshold: "집중선 폭"
|
||||
zoomLinesMaskSize: "중앙 값"
|
||||
zoomLinesBlack: "검은색으로 하기"
|
||||
circle: "원형"
|
||||
drafts: "초안"
|
||||
_drafts:
|
||||
select: "초안 선택"
|
||||
@@ -3252,3 +3372,22 @@ _drafts:
|
||||
restoreFromDraft: "초안에서 복원\n"
|
||||
restore: "복원"
|
||||
listDrafts: "초안 목록"
|
||||
schedule: "게시 예약"
|
||||
listScheduledNotes: "예약 게시물 목록"
|
||||
cancelSchedule: "예약 해제"
|
||||
qr: "QR 코드"
|
||||
_qr:
|
||||
showTabTitle: "보기"
|
||||
readTabTitle: "읽어들이기"
|
||||
shareTitle: "{name} {acct}"
|
||||
shareText: "Fediverse로 저를 팔로우해 주세요!"
|
||||
chooseCamera: "카메라 선택"
|
||||
cannotToggleFlash: "플래시 선택 불가"
|
||||
turnOnFlash: "플래시 켜기"
|
||||
turnOffFlash: "플래시 끄기"
|
||||
startQr: "코드 리더 재개"
|
||||
stopQr: "코드 리더 정지"
|
||||
noQrCodeFound: "QR 코드를 찾을 수 없습니다."
|
||||
scanFile: "단말기의 이미지 스캔"
|
||||
raw: "텍스트"
|
||||
mfm: "MFM"
|
||||
|
||||
@@ -393,6 +393,9 @@ file: "ໄຟລ໌"
|
||||
replies: "ຕອບກັບ"
|
||||
renotes: "Renote"
|
||||
information: "ກ່ຽວກັບ"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
filename: "ຊື່ໄຟລ໌"
|
||||
_chat:
|
||||
invitations: "ເຊີນ"
|
||||
noHistory: "ບໍ່ມີປະຫວັດ"
|
||||
@@ -434,6 +437,9 @@ _visibility:
|
||||
home: "ໜ້າຫຼັກ"
|
||||
followers: "ຜູ້ຕິດຕາມ"
|
||||
specified: "ໂພສ Direct note"
|
||||
_postForm:
|
||||
_howToUse:
|
||||
menu_title: "ເມນູ"
|
||||
_profile:
|
||||
name: "ຊື່"
|
||||
username: "ຊື່ຜູ້ໃຊ້"
|
||||
|
||||
@@ -970,6 +970,9 @@ renotes: "Herdelen"
|
||||
followingOrFollower: "Gevolgd of volger"
|
||||
confirmShowRepliesAll: "Dit is een onomkeerbare operatie. Weet je zeker dat reacties op anderen van iedereen die je volgt, wil weergeven in je tijdlijn?"
|
||||
information: "Over"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
filename: "Bestandsnaam"
|
||||
_chat:
|
||||
invitations: "Uitnodigen"
|
||||
noHistory: "Geen geschiedenis gevonden"
|
||||
@@ -1020,6 +1023,10 @@ _visibility:
|
||||
home: "Startpagina"
|
||||
followers: "Volgers"
|
||||
specified: "Directe notities"
|
||||
_postForm:
|
||||
_howToUse:
|
||||
visibility_title: "Zichtbaarheid"
|
||||
menu_title: "Menu"
|
||||
_profile:
|
||||
name: "Naam"
|
||||
username: "Gebruikersnaam"
|
||||
@@ -1083,3 +1090,5 @@ _search:
|
||||
_watermarkEditor:
|
||||
image: "Afbeeldingen"
|
||||
advanced: "Geavanceerd"
|
||||
_qr:
|
||||
showTabTitle: "Weergave"
|
||||
|
||||
@@ -463,6 +463,12 @@ surrender: "Avbryt"
|
||||
information: "Informasjon"
|
||||
inMinutes: "Minutter"
|
||||
inDays: "Dager"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
filename: "Filnavn"
|
||||
_imageFrameEditor:
|
||||
fontSerif: "Serif"
|
||||
fontSansSerif: "Sans Serif"
|
||||
_chat:
|
||||
invitations: "Inviter"
|
||||
members: "Medlemmer"
|
||||
@@ -650,6 +656,8 @@ _visibility:
|
||||
home: "Hjem"
|
||||
followers: "Følgere"
|
||||
_postForm:
|
||||
_howToUse:
|
||||
menu_title: "Meny"
|
||||
_placeholders:
|
||||
a: "Hva skjer?"
|
||||
_profile:
|
||||
@@ -747,3 +755,5 @@ _imageEffector:
|
||||
scale: "Størrelse"
|
||||
size: "Størrelse"
|
||||
color: "Farge"
|
||||
_qr:
|
||||
raw: "Tekst"
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
{
|
||||
"type": "module"
|
||||
}
|
||||
@@ -1042,6 +1042,16 @@ postForm: "Formularz tworzenia wpisu"
|
||||
information: "Informacje"
|
||||
inMinutes: "minuta"
|
||||
inDays: "dzień"
|
||||
widgets: "Widżety"
|
||||
presets: "Konfiguracja"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
filename: "Nazwa pliku"
|
||||
_imageFrameEditor:
|
||||
header: "Nagłówek"
|
||||
font: "Czcionka"
|
||||
fontSerif: "Szeryfowa"
|
||||
fontSansSerif: "Bezszeryfowa"
|
||||
_chat:
|
||||
invitations: "Zaproś"
|
||||
noHistory: "Brak historii"
|
||||
@@ -1392,6 +1402,9 @@ _postForm:
|
||||
replyPlaceholder: "Odpowiedz na ten wpis..."
|
||||
quotePlaceholder: "Zacytuj ten wpis…"
|
||||
channelPlaceholder: "Publikuj na kanale..."
|
||||
_howToUse:
|
||||
visibility_title: "Widoczność"
|
||||
menu_title: "Menu"
|
||||
_placeholders:
|
||||
a: "Co się dzieje?"
|
||||
b: "Co się wydarzyło?"
|
||||
@@ -1600,3 +1613,6 @@ _imageEffector:
|
||||
color: "Kolor"
|
||||
opacity: "Przezroczystość"
|
||||
lightness: "Rozjaśnij"
|
||||
_qr:
|
||||
showTabTitle: "Wyświetlanie"
|
||||
raw: "Tekst"
|
||||
|
||||
@@ -253,6 +253,7 @@ noteDeleteConfirm: "Deseja excluir esta nota?"
|
||||
pinLimitExceeded: "Não é possível fixar novas notas"
|
||||
done: "Concluído"
|
||||
processing: "Em Progresso"
|
||||
preprocessing: "Preparando..."
|
||||
preview: "Pré-visualizar"
|
||||
default: "Predefinição"
|
||||
defaultValueIs: "Predefinição: {value}"
|
||||
@@ -1054,6 +1055,7 @@ permissionDeniedError: "Operação recusada"
|
||||
permissionDeniedErrorDescription: "Esta conta não tem permissão para executar esta ação."
|
||||
preset: "Predefinições"
|
||||
selectFromPresets: "Escolher de predefinições"
|
||||
custom: "Personalizado"
|
||||
achievements: "Conquistas"
|
||||
gotInvalidResponseError: "Resposta do servidor inválida"
|
||||
gotInvalidResponseErrorDescription: "Servidor fora do ar ou em manutenção. Favor tentar mais tarde."
|
||||
@@ -1092,6 +1094,7 @@ prohibitedWordsDescription2: "Utilizar espaços irá criar expressões aditivas
|
||||
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."
|
||||
usersSearchNotAvailable: "Pesquisa de usuário está indisponível."
|
||||
license: "Licença"
|
||||
unfavoriteConfirm: "Deseja realmente remover dos favoritos?"
|
||||
myClips: "Meus clipes"
|
||||
@@ -1243,6 +1246,7 @@ releaseToRefresh: "Solte para atualizar"
|
||||
refreshing: "Atualizando..."
|
||||
pullDownToRefresh: "Puxe para baixo para atualizar"
|
||||
useGroupedNotifications: "Agrupar notificações"
|
||||
emailVerificationFailedError: "Houve um problema ao verificar seu 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"
|
||||
@@ -1313,6 +1317,7 @@ acknowledgeNotesAndEnable: "Ative após compreender as precauções."
|
||||
federationSpecified: "Esse servidor opera com uma lista branca de federação. Interagir com servidores diferentes daqueles designados pela administração não é permitido."
|
||||
federationDisabled: "Federação está desabilitada nesse servidor. Você não pode interagir com usuários de outros servidores."
|
||||
draft: "Rascunhos"
|
||||
draftsAndScheduledNotes: "Rascunhos e notas agendadas."
|
||||
confirmOnReact: "Confirmar ao reagir"
|
||||
reactAreYouSure: "Você deseja adicionar uma reação \"{emoji}\"?"
|
||||
markAsSensitiveConfirm: "Você deseja definir essa mídia como sensível?"
|
||||
@@ -1340,6 +1345,8 @@ postForm: "Campo de postagem"
|
||||
textCount: "Contagem de caracteres"
|
||||
information: "Sobre"
|
||||
chat: "Conversas"
|
||||
directMessage: "Conversar com usuário"
|
||||
directMessage_short: "Mensagem"
|
||||
migrateOldSettings: "Migrar configurações antigas de cliente"
|
||||
migrateOldSettings_description: "Isso deve ser feito automaticamente. Caso o processo de migração tenha falhado, você pode acioná-lo manualmente. As informações atuais de migração serão substituídas."
|
||||
compress: "Comprimir"
|
||||
@@ -1367,12 +1374,47 @@ redisplayAllTips: "Mostrar todas as \"Dicas e Truques\" novamente"
|
||||
hideAllTips: "Ocultas todas as \"Dicas e Truques\""
|
||||
defaultImageCompressionLevel: "Nível de compressão de imagem padrão"
|
||||
defaultImageCompressionLevel_description: "Alto, reduz o tamanho do arquivo mas, também, a qualidade da imagem.<br>Alto, reduz o tamanho do arquivo mas, também, a qualidade da imagem."
|
||||
defaultCompressionLevel: "Nível padrão de compressão"
|
||||
defaultCompressionLevel_description: "Menor compressão preserva a qualidade mas aumenta o tamanho do arquivo.<br>Maior compressão reduz o tamanho do arquivo mas diminui a qualidade."
|
||||
inMinutes: "Minuto(s)"
|
||||
inDays: "Dia(s)"
|
||||
safeModeEnabled: "Modo seguro está habilitado"
|
||||
pluginsAreDisabledBecauseSafeMode: "Todos os plugins estão desabilitados porque o modo seguro está habilitado."
|
||||
customCssIsDisabledBecauseSafeMode: "CSS personalizado não está aplicado porque o modo seguro está habilitado."
|
||||
themeIsDefaultBecauseSafeMode: "Enquanto o modo seguro estiver ativo, o tema padrão é utilizado. Desabilitar o modo seguro reverterá essas mudanças."
|
||||
thankYouForTestingBeta: "Obrigado por nos ajudar a testar a versão beta!"
|
||||
createUserSpecifiedNote: "Criar uma nota direta"
|
||||
schedulePost: "Agendar publicação"
|
||||
scheduleToPostOnX: "Agendar nota para {x}"
|
||||
scheduledToPostOnX: "A nota está agendada para {x}"
|
||||
schedule: "Agendar"
|
||||
scheduled: "Agendado"
|
||||
widgets: "Widgets"
|
||||
presets: "Predefinições"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
filename: "Nome do Ficheiro"
|
||||
_imageFrameEditor:
|
||||
header: "Cabeçalho"
|
||||
withQrCode: "Código QR"
|
||||
font: "Fonte"
|
||||
fontSerif: "Serif"
|
||||
fontSansSerif: "Sans Serif"
|
||||
quitWithoutSaveConfirm: "Descartar mudanças?"
|
||||
_compression:
|
||||
_quality:
|
||||
high: "Qualidade alta"
|
||||
medium: "Qualidade média"
|
||||
low: "Qualidade baixa"
|
||||
_size:
|
||||
large: "Tamanho grande"
|
||||
medium: "Tamanho médio"
|
||||
small: "Tamanho pequeno"
|
||||
_order:
|
||||
newest: "Priorizar Mais Novos"
|
||||
oldest: "Priorizar Mais Antigos"
|
||||
_chat:
|
||||
messages: "Mensagem"
|
||||
noMessagesYet: "Ainda não há mensagens"
|
||||
newMessage: "Nova mensagem"
|
||||
individualChat: "Conversa Particular"
|
||||
@@ -1460,6 +1502,7 @@ _settings:
|
||||
contentsUpdateFrequency_description2: "Quando o modo tempo-real está ativado, o conteúdo é atualizado em tempo real, ignorando essa opção."
|
||||
showUrlPreview: "Exibir prévia de URL"
|
||||
showAvailableReactionsFirstInNote: "Exibir reações disponíveis no topo."
|
||||
showPageTabBarBottom: "Mostrar barra de aba da página inferiormente"
|
||||
_chat:
|
||||
showSenderName: "Exibir nome de usuário do remetente"
|
||||
sendOnEnter: "Pressionar Enter para enviar"
|
||||
@@ -1633,6 +1676,10 @@ _serverSettings:
|
||||
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."
|
||||
reactionsBufferingDescription: "Quando ativado, o desempenho durante a criação de uma reação será melhorado substancialmente, reduzindo a carga do banco de dados. Porém, a o uso de memória do Redis irá aumentar."
|
||||
remoteNotesCleaning: "Limpeza automática de notas remotas"
|
||||
remoteNotesCleaning_description: "Quando habilitado, notas remotas obsoletas e não utilizadas serão periodicamente limpadas para previnir sobrecarga no banco de dados."
|
||||
remoteNotesCleaningMaxProcessingDuration: "Maximizar tempo de processamento da limpeza"
|
||||
remoteNotesCleaningExpiryDaysForEachNotes: "Mínimo de dias para retenção de notas"
|
||||
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."
|
||||
openRegistration: "Abrir a criação de contas"
|
||||
@@ -1651,6 +1698,11 @@ _serverSettings:
|
||||
userGeneratedContentsVisibilityForVisitor: "Visibilidade de conteúdo dos usuários para visitantes"
|
||||
userGeneratedContentsVisibilityForVisitor_description: "Isso é útil para prevenir problemas causados por conteúdo inapropriado de usuários remotos de servidores com pouca ou nenhuma moderação, que pode ser hospedado na internet a partir desse servidor."
|
||||
userGeneratedContentsVisibilityForVisitor_description2: "Publicar todo o conteúdo do servidor para a internet pode ser arriscado. Isso é especialmente importante para visitantes que desconhecem a natureza distribuída do conteúdo na internet, pois eles podem acreditar que o conteúdo remoto é criado por usuários desse servidor."
|
||||
restartServerSetupWizardConfirm_title: "Reiniciar o assistente de configuração?"
|
||||
restartServerSetupWizardConfirm_text: "Algumas configurações atuais serão reiniciadas."
|
||||
entrancePageStyle: "Estilo da página de entrada"
|
||||
showTimelineForVisitor: "Mostrar linha do tempo"
|
||||
showActivitiesForVisitor: "Mostrar atividades"
|
||||
_userGeneratedContentsVisibilityForVisitor:
|
||||
all: "Tudo é público"
|
||||
localOnly: "Conteúdo local é publicado, conteúdo remoto é privado"
|
||||
@@ -1987,6 +2039,7 @@ _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"
|
||||
canSearchUsers: "Busca de usuário"
|
||||
canUseTranslator: "Uso do tradutor"
|
||||
avatarDecorationLimit: "Número máximo de decorações de avatar que podem ser aplicadas"
|
||||
canImportAntennas: "Permitir importação de antenas"
|
||||
@@ -1999,6 +2052,7 @@ _role:
|
||||
uploadableFileTypes_caption: "Especifica tipos MIME permitidos. Múltiplos tipos MIME podem ser especificados separando-os por linha. Curingas podem ser especificados com um asterisco (*). (exemplo, image/*)"
|
||||
uploadableFileTypes_caption2: "Alguns tipos de arquivos podem não ser detectados. Para permiti-los, adicione {x} à especificação."
|
||||
noteDraftLimit: "Limite de rascunhos possíveis"
|
||||
scheduledNoteLimit: "Número máximo de notas agendadas simultâneas"
|
||||
watermarkAvailable: "Disponibilidade da função de marca d'água"
|
||||
_condition:
|
||||
roleAssignedTo: "Atribuído a cargos manuais"
|
||||
@@ -2259,6 +2313,7 @@ _time:
|
||||
minute: "Minuto(s)"
|
||||
hour: "Hora(s)"
|
||||
day: "Dia(s)"
|
||||
month: "Mês(es)"
|
||||
_2fa:
|
||||
alreadyRegistered: "Você já cadastrou um dispositivo de autenticação de dois fatores."
|
||||
registerTOTP: "Cadastrar aplicativo autenticador"
|
||||
@@ -2433,7 +2488,7 @@ _widgets:
|
||||
chooseList: "Selecione uma lista"
|
||||
clicker: "Clicker"
|
||||
birthdayFollowings: "Usuários de aniversário hoje"
|
||||
chat: "Conversas"
|
||||
chat: "Conversar com usuário"
|
||||
_cw:
|
||||
hide: "Esconder"
|
||||
show: "Carregar mais"
|
||||
@@ -2478,6 +2533,9 @@ _postForm:
|
||||
replyPlaceholder: "Responder a essa nota..."
|
||||
quotePlaceholder: "Citar essa nota..."
|
||||
channelPlaceholder: "Postar em canal..."
|
||||
_howToUse:
|
||||
visibility_title: "Visibilidade"
|
||||
menu_title: "Menu\n"
|
||||
_placeholders:
|
||||
a: "Como vão as coisas?"
|
||||
b: "O que está rolando por aí?"
|
||||
@@ -2623,6 +2681,8 @@ _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"
|
||||
scheduledNotePosted: "Nota agendada foi publicada"
|
||||
scheduledNotePostFailed: "Não foi possível publicar nota agendada"
|
||||
newNote: "Nova nota"
|
||||
unreadAntennaNote: "Antena {name}"
|
||||
roleAssigned: "Cargo dado"
|
||||
@@ -2702,7 +2762,7 @@ _deck:
|
||||
mentions: "Menções"
|
||||
direct: "Notas diretas"
|
||||
roleTimeline: "Linha do tempo do cargo"
|
||||
chat: "Conversas"
|
||||
chat: "Conversar com usuário"
|
||||
_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}."
|
||||
@@ -3061,6 +3121,7 @@ _bootErrors:
|
||||
otherOption1: "Excluir ajustes de cliente e cache"
|
||||
otherOption2: "Iniciar o cliente simples"
|
||||
otherOption3: "Iniciar ferramenta de reparo"
|
||||
otherOption4: "Abrir Misskey no modo seguro"
|
||||
_search:
|
||||
searchScopeAll: "Todos"
|
||||
searchScopeLocal: "Local"
|
||||
@@ -3097,6 +3158,8 @@ _serverSetupWizard:
|
||||
doYouConnectToFediverse_description1: "Quando conectado com uma rede distribuída de servidores (Fediverso), o conteúdo pode ser trocado com outros servidores."
|
||||
doYouConnectToFediverse_description2: "Conectar com o Fediverso também é chamado de \"federação\""
|
||||
youCanConfigureMoreFederationSettingsLater: "Configurações adicionais como especificar servidores para conectar-se com podem ser feitas posteriormente"
|
||||
remoteContentsCleaning: "Limpeza automática de conteúdos recebidos"
|
||||
remoteContentsCleaning_description: "A federação pode resultar em uma entrada contínua de conteúdo. Habilitar a limpeza automática removerá conteúdo obsoleto e não referenciado do servidor para economizar armazenamento."
|
||||
adminInfo: "Informações da administração"
|
||||
adminInfo_description: "Define as informações do administrador usadas para receber consultas."
|
||||
adminInfo_mustBeFilled: "Deve ser preenchido se o servidor é público ou se a federação está ativa."
|
||||
@@ -3145,7 +3208,9 @@ _watermarkEditor:
|
||||
opacity: "Opacidade"
|
||||
scale: "Tamanho"
|
||||
text: "Texto"
|
||||
qr: "Código QR"
|
||||
position: "Posição"
|
||||
margin: "Margem"
|
||||
type: "Tipo"
|
||||
image: "imagem"
|
||||
advanced: "Avançado"
|
||||
@@ -3160,16 +3225,20 @@ _watermarkEditor:
|
||||
polkadotSubDotOpacity: "Opacidade da bolinha secundária"
|
||||
polkadotSubDotRadius: "Raio das bolinhas adicionais"
|
||||
polkadotSubDotDivisions: "Número de bolinhas adicionais"
|
||||
leaveBlankToAccountUrl: "Deixe em branco para utilizar URL da conta"
|
||||
_imageEffector:
|
||||
title: "Efeitos"
|
||||
addEffect: "Adicionar efeitos"
|
||||
discardChangesConfirm: "Tem certeza que deseja sair? Há mudanças não salvas."
|
||||
nothingToConfigure: "Não há nada para configurar"
|
||||
_fxs:
|
||||
chromaticAberration: "Aberração cromática"
|
||||
glitch: "Glitch"
|
||||
mirror: "Espelho"
|
||||
invert: "Inverter Cores"
|
||||
grayscale: "Tons de Cinza"
|
||||
blur: "Desfoque"
|
||||
pixelate: "Pixelizar"
|
||||
colorAdjust: "Correção de Cores"
|
||||
colorClamp: "Compressão de Cores"
|
||||
colorClampAdvanced: "Compressão Avançada de Cores"
|
||||
@@ -3181,13 +3250,43 @@ _imageEffector:
|
||||
checker: "Xadrez"
|
||||
blockNoise: "Bloquear Ruído"
|
||||
tearing: "Descontinuidade"
|
||||
fill: "Preencher"
|
||||
_fxProps:
|
||||
angle: "Ângulo"
|
||||
scale: "Tamanho"
|
||||
size: "Tamanho"
|
||||
radius: "Raio"
|
||||
samples: "Número de amostras"
|
||||
offset: "Posição"
|
||||
color: "Cor"
|
||||
opacity: "Opacidade"
|
||||
normalize: "Normalizar"
|
||||
amount: "Quantidade"
|
||||
lightness: "Esclarecer"
|
||||
contrast: "Contraste"
|
||||
hue: "Matiz"
|
||||
brightness: "Brilho"
|
||||
saturation: "Saturação"
|
||||
max: "Máximo"
|
||||
min: "Mínimo"
|
||||
direction: "Direção"
|
||||
phase: "Fase"
|
||||
frequency: "Frequência"
|
||||
strength: "Força"
|
||||
glitchChannelShift: "Mudança de canal"
|
||||
seed: "Valor da semente"
|
||||
redComponent: "Componente vermelho"
|
||||
greenComponent: "Componente verde"
|
||||
blueComponent: "Componente azul"
|
||||
threshold: "Limiar"
|
||||
centerX: "Centralizar X"
|
||||
centerY: "Centralizar Y"
|
||||
zoomLinesSmoothing: "Suavização"
|
||||
zoomLinesSmoothingDescription: "Suavização e largura das linhas de zoom não podem ser utilizados simultaneamente."
|
||||
zoomLinesThreshold: "Largura das linhas de zoom"
|
||||
zoomLinesMaskSize: "Diâmetro do centro"
|
||||
zoomLinesBlack: "Linhas pretas"
|
||||
circle: "Circular"
|
||||
drafts: "Rascunhos"
|
||||
_drafts:
|
||||
select: "Selecionar Rascunho"
|
||||
@@ -3203,3 +3302,22 @@ _drafts:
|
||||
restoreFromDraft: "Restaurar de Rascunho"
|
||||
restore: "Redefinir"
|
||||
listDrafts: "Lista de Rascunhos"
|
||||
schedule: "Agendar nota"
|
||||
listScheduledNotes: "Lista de notas agendadas"
|
||||
cancelSchedule: "Cancelar agendamento"
|
||||
qr: "Código QR"
|
||||
_qr:
|
||||
showTabTitle: "Visualizar"
|
||||
readTabTitle: "Escanear"
|
||||
shareTitle: "{name} {acct}"
|
||||
shareText: "Siga-me no Fediverso!"
|
||||
chooseCamera: "Escolher câmera"
|
||||
cannotToggleFlash: "Não foi possível ligar a lanterna"
|
||||
turnOnFlash: "Ligar a lanterna"
|
||||
turnOffFlash: "Desligar a lanterna"
|
||||
startQr: "Retornar ao leitor de códigos QR"
|
||||
stopQr: "Deixar o leitor de códigos QR"
|
||||
noQrCodeFound: "Nenhum código QR encontrado"
|
||||
scanFile: "Escanear imagem de dispositivo"
|
||||
raw: "Texto"
|
||||
mfm: "MFM"
|
||||
|
||||
@@ -1215,6 +1215,10 @@ lastNDays: "Ultimele {n} zile"
|
||||
surrender: "Anulează"
|
||||
copyPreferenceId: "Copiază ID-ul preferințelor"
|
||||
information: "Despre"
|
||||
presets: "Presetate"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
filename: "Nume fișier"
|
||||
_chat:
|
||||
invitations: "Invită"
|
||||
noHistory: "Nu există istoric"
|
||||
@@ -1307,6 +1311,9 @@ _postForm:
|
||||
replyPlaceholder: "Răspunde la această notă..."
|
||||
quotePlaceholder: "Citează aceasta nota..."
|
||||
channelPlaceholder: "Postează pe un canal..."
|
||||
_howToUse:
|
||||
visibility_title: "Vizibilitate"
|
||||
menu_title: "Meniu"
|
||||
_placeholders:
|
||||
a: "Ce mai faci?"
|
||||
b: "Ce se mai petrece in jurul tău?"
|
||||
@@ -1404,3 +1411,7 @@ _imageEffector:
|
||||
_fxProps:
|
||||
scale: "Dimensiune"
|
||||
size: "Dimensiune"
|
||||
offset: "Poziție"
|
||||
_qr:
|
||||
showTabTitle: "Arată"
|
||||
raw: "Text"
|
||||
|
||||
@@ -87,7 +87,7 @@ exportRequested: "Вы запросили экспорт. Это может за
|
||||
importRequested: "Вы запросили импорт. Это может занять некоторое время."
|
||||
lists: "Списки"
|
||||
noLists: "Нет ни одного списка"
|
||||
note: "Заметка"
|
||||
note: "Пост"
|
||||
notes: "Заметки"
|
||||
following: "Подписки"
|
||||
followers: "Подписчики"
|
||||
@@ -122,7 +122,7 @@ inChannelRenote: "В канале"
|
||||
inChannelQuote: "Заметки в канале"
|
||||
renoteToChannel: "Репостнуть в канал"
|
||||
renoteToOtherChannel: "Репостнуть в другой канал"
|
||||
pinnedNote: "Закреплённая заметка"
|
||||
pinnedNote: "Закреплённый пост"
|
||||
pinned: "Закрепить в профиле"
|
||||
you: "Вы"
|
||||
clickToShow: "Нажмите для просмотра"
|
||||
@@ -253,6 +253,7 @@ noteDeleteConfirm: "Вы хотите удалить эту заметку?"
|
||||
pinLimitExceeded: "Нельзя закрепить ещё больше заметок"
|
||||
done: "Готово"
|
||||
processing: "Обработка"
|
||||
preprocessing: "Подготовка..."
|
||||
preview: "Предпросмотр"
|
||||
default: "По умолчанию"
|
||||
defaultValueIs: "По умолчанию: {value}"
|
||||
@@ -396,7 +397,7 @@ pinnedUsersDescription: "Перечислите по одному имени п
|
||||
pinnedPages: "Закрепленные страницы"
|
||||
pinnedPagesDescription: "Если хотите закрепить страницы на главной сайта, сюда можно добавить пути к ним, каждый в отдельной строке."
|
||||
pinnedClipId: "Идентификатор закреплённой подборки"
|
||||
pinnedNotes: "Закреплённая заметка"
|
||||
pinnedNotes: "Закреплённый пост"
|
||||
hcaptcha: "hCaptcha"
|
||||
enableHcaptcha: "Включить hCaptcha"
|
||||
hcaptchaSiteKey: "Ключ сайта"
|
||||
@@ -1164,6 +1165,7 @@ installed: "Установлено"
|
||||
branding: "Бренд"
|
||||
enableServerMachineStats: "Опубликовать характеристики сервера"
|
||||
enableIdenticonGeneration: "Включить генерацию иконки пользователя"
|
||||
showRoleBadgesOfRemoteUsers: "Display the role badges assigned to remote users"
|
||||
turnOffToImprovePerformance: "Отключение этого параметра может повысить производительность."
|
||||
createInviteCode: "Создать код приглашения"
|
||||
createWithOptions: "Используйте параметры для создания"
|
||||
@@ -1215,6 +1217,7 @@ privacyPolicyUrl: "Ссылка на Политику Конфиденциаль
|
||||
tosAndPrivacyPolicy: "Условия использования и политика конфиденциальности"
|
||||
avatarDecorations: "Украшения для аватара"
|
||||
attach: "Прикрепить"
|
||||
detachAll: "Убрать всё"
|
||||
angle: "Угол"
|
||||
flip: "Переворот"
|
||||
showAvatarDecorations: "Показать украшения для аватара"
|
||||
@@ -1253,7 +1256,7 @@ clipNoteLimitExceeded: "К этому клипу больше нельзя до
|
||||
performance: "Производительность"
|
||||
modified: "Изменено"
|
||||
signinWithPasskey: "Войдите в систему, используя свой пароль"
|
||||
unknownWebAuthnKey: "Не известный ключ "
|
||||
unknownWebAuthnKey: "Неизвестный ключ"
|
||||
passkeyVerificationFailed: "Ошибка проверка ключа доступа "
|
||||
messageToFollower: "Сообщение подписчикам"
|
||||
testCaptchaWarning: "Эта функция предназначена для тестирования CAPTCHA. <strong>Не использовать это в рабочей среде</strong>"
|
||||
@@ -1268,11 +1271,24 @@ availableRoles: "Доступные роли"
|
||||
federationDisabled: "Федерация отключена для этого сервера. Вы не можете взаимодействовать с пользователями на других серверах."
|
||||
draft: "Черновик"
|
||||
markAsSensitiveConfirm: "Отметить контент как чувствительный?"
|
||||
preferences: "Основное"
|
||||
resetToDefaultValue: "Сбросить настройки до стандартных"
|
||||
syncBetweenDevices: "Синхронизировать между устройствами"
|
||||
postForm: "Форма отправки"
|
||||
textCount: "Количество символов"
|
||||
information: "Описание"
|
||||
inMinutes: "мин"
|
||||
inDays: "сут"
|
||||
widgets: "Виджеты"
|
||||
presets: "Шаблоны"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
filename: "Имя файла"
|
||||
_imageFrameEditor:
|
||||
header: "Заголовок"
|
||||
font: "Шрифт"
|
||||
fontSerif: "Антиква (с засечками)"
|
||||
fontSansSerif: "Гротеск (без засечек)"
|
||||
_chat:
|
||||
invitations: "Пригласить"
|
||||
noHistory: "История пока пуста"
|
||||
@@ -1281,6 +1297,11 @@ _chat:
|
||||
send: "Отправить"
|
||||
_settings:
|
||||
webhook: "Вебхук"
|
||||
preferencesBanner: "Вы можете настроить общее поведение клиента по вашим предпочтениям"
|
||||
timelineAndNote: "Лента и заметки"
|
||||
_chat:
|
||||
showSenderName: "Показывать имя отправителя"
|
||||
sendOnEnter: "Использовать Enter для отправки"
|
||||
_delivery:
|
||||
stop: "Заморожено"
|
||||
_type:
|
||||
@@ -1529,7 +1550,7 @@ _achievements:
|
||||
description: "Нажато здесь"
|
||||
_justPlainLucky:
|
||||
title: "Чистая удача"
|
||||
description: "Может достаться с вероятностью 0,01% каждые 10 секунд."
|
||||
description: "Может достаться с вероятностью 0,005% каждые 10 секунд."
|
||||
_setNameToSyuilo:
|
||||
title: "Комплекс бога"
|
||||
description: "Установлено «syuilo» в качестве имени"
|
||||
@@ -1557,6 +1578,12 @@ _achievements:
|
||||
title: "Brain Diver"
|
||||
description: "Опубликована ссылка на песню «Brain Diver»"
|
||||
flavor: "Мисски-Мисски Ла-Ту-Ма"
|
||||
_bubbleGameExplodingHead:
|
||||
title: "🤯"
|
||||
description: "Самый большой объект в Bubble game"
|
||||
_bubbleGameDoubleExplodingHead:
|
||||
title: "Двойной🤯"
|
||||
description: "Два самых больших объекта в Bubble game одновременно!"
|
||||
_role:
|
||||
new: "Новая роль"
|
||||
edit: "Изменить роль"
|
||||
@@ -1991,6 +2018,9 @@ _postForm:
|
||||
replyPlaceholder: "Ответ на заметку..."
|
||||
quotePlaceholder: "Пояснение к цитате..."
|
||||
channelPlaceholder: "Отправить в канал"
|
||||
_howToUse:
|
||||
visibility_title: "Видимость"
|
||||
menu_title: "Меню"
|
||||
_placeholders:
|
||||
a: "Как дела?"
|
||||
b: "Что интересного вокруг?"
|
||||
@@ -2261,7 +2291,11 @@ _imageEffector:
|
||||
angle: "Угол"
|
||||
scale: "Размер"
|
||||
size: "Размер"
|
||||
offset: "Позиция"
|
||||
color: "Цвет"
|
||||
opacity: "Непрозрачность"
|
||||
lightness: "Осветление"
|
||||
drafts: "Черновик"
|
||||
_qr:
|
||||
showTabTitle: "Отображение"
|
||||
raw: "Текст"
|
||||
|
||||
@@ -915,6 +915,15 @@ postForm: "Napísať poznámku"
|
||||
information: "Informácie"
|
||||
inMinutes: "min"
|
||||
inDays: "dní"
|
||||
widgets: "Widgety"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
filename: "Názov súboru"
|
||||
_imageFrameEditor:
|
||||
header: "Hlavička"
|
||||
font: "Písmo"
|
||||
fontSerif: "Pätkové"
|
||||
fontSansSerif: "Bezpätkové"
|
||||
_chat:
|
||||
invitations: "Pozvať"
|
||||
noHistory: "Žiadna história"
|
||||
@@ -1263,6 +1272,9 @@ _postForm:
|
||||
replyPlaceholder: "Odpoveď na túto poznámku..."
|
||||
quotePlaceholder: "Citovanie tejto poznámky..."
|
||||
channelPlaceholder: "Poslať do kanála..."
|
||||
_howToUse:
|
||||
visibility_title: "Viditeľnosť"
|
||||
menu_title: "Menu"
|
||||
_placeholders:
|
||||
a: "Čo máte v pláne?"
|
||||
b: "Čo sa deje?"
|
||||
@@ -1466,3 +1478,6 @@ _imageEffector:
|
||||
color: "Farba"
|
||||
opacity: "Priehľadnosť"
|
||||
lightness: "Zosvetliť"
|
||||
_qr:
|
||||
showTabTitle: "Zobraziť"
|
||||
raw: "Text"
|
||||
|
||||
@@ -559,6 +559,9 @@ tryAgain: "Försök igen senare"
|
||||
signinWithPasskey: "Logga in med nyckel"
|
||||
unknownWebAuthnKey: "Okänd nyckel"
|
||||
information: "Om"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
filename: "Filnamn"
|
||||
_chat:
|
||||
invitations: "Inbjudan"
|
||||
members: "Medlemmar"
|
||||
@@ -647,6 +650,9 @@ _visibility:
|
||||
home: "Hem"
|
||||
followers: "Följare"
|
||||
specified: "Direktnoter"
|
||||
_postForm:
|
||||
_howToUse:
|
||||
menu_title: "Meny"
|
||||
_profile:
|
||||
name: "Namn"
|
||||
username: "Användarnamn"
|
||||
|
||||
@@ -253,6 +253,7 @@ noteDeleteConfirm: "ต้องการลบโน้ตนี้ใช่ไ
|
||||
pinLimitExceeded: "คุณไม่สามารถปักหมุดโน้ตเพิ่มเติมใดๆได้อีก"
|
||||
done: "เสร็จสิ้น"
|
||||
processing: "กำลังประมวลผล..."
|
||||
preprocessing: "กำลังจัดเตรียม..."
|
||||
preview: "แสดงตัวอย่าง"
|
||||
default: "ค่าเริ่มต้น"
|
||||
defaultValueIs: "ค่าเริ่มต้น: {value}"
|
||||
@@ -1245,6 +1246,7 @@ releaseToRefresh: "ปล่อยเพื่อรีเฟรช"
|
||||
refreshing: "กำลังรีเฟรช..."
|
||||
pullDownToRefresh: "ดึงลงเพื่อรีเฟรช"
|
||||
useGroupedNotifications: "แสดงผลการแจ้งเตือนแบบกลุ่มแล้ว"
|
||||
emailVerificationFailedError: "เกิดปัญหาในขณะตรวจสอบอีเมล อาจเป็นไปได้ว่าลิงก์หมดอายุแล้ว"
|
||||
cwNotationRequired: "หากเปิดใช้งาน “ซ่อนเนื้อหา” จะต้องระบุคำอธิบาย"
|
||||
doReaction: "เพิ่มรีแอคชั่น"
|
||||
code: "โค้ด"
|
||||
@@ -1315,6 +1317,7 @@ acknowledgeNotesAndEnable: "เปิดใช้งานหลังจาก
|
||||
federationSpecified: "เซิร์ฟเวอร์นี้ดำเนินงานในระบบกลุ่มไวท์ลิสต์ ไม่สามารถติดต่อกับเซิร์ฟเวอร์อื่นที่ไม่ได้รับอนุญาตจากผู้ดูแลระบบได้"
|
||||
federationDisabled: "เซิร์ฟเวอร์นี้ปิดใช้งานสหพันธ์ ไม่สามารถติดต่อหรือแลกเปลี่ยนข้อมูลกับผู้ใช้จากเซิร์ฟเวอร์อื่นได้"
|
||||
draft: "ร่าง"
|
||||
draftsAndScheduledNotes: "ร่างและกำหนดเวลาโพสต์"
|
||||
confirmOnReact: "ยืนยันเมื่อทำการรีแอคชั่น"
|
||||
reactAreYouSure: "ต้องการใส่รีแอคชั่นด้วย \"{emoji}\" หรือไม่?"
|
||||
markAsSensitiveConfirm: "ต้องการตั้งค่าสื่อนี้ว่าเป็นเนื้อหาละเอียดอ่อนหรือไม่?"
|
||||
@@ -1342,6 +1345,8 @@ postForm: "แบบฟอร์มการโพสต์"
|
||||
textCount: "จำนวนอักขระ"
|
||||
information: "เกี่ยวกับ"
|
||||
chat: "แชต"
|
||||
directMessage: "แชตเลย"
|
||||
directMessage_short: "ข้อความ"
|
||||
migrateOldSettings: "ย้ายข้อมูลการตั้งค่าเก่า"
|
||||
migrateOldSettings_description: "โดยปกติจะทำโดยอัตโนมัติ แต่หากด้วยเหตุผลบางประการที่ไม่สามารถย้ายได้สำเร็จ สามารถสั่งย้ายด้วยตนเองได้ การตั้งค่าปัจจุบันจะถูกเขียนทับ"
|
||||
compress: "บีบอัด"
|
||||
@@ -1367,8 +1372,10 @@ abort: "หยุดและยกเลิก"
|
||||
tip: "คำแนะนำและเคล็ดลับ"
|
||||
redisplayAllTips: "แสดงคำแนะนำและเคล็ดลับทั้งหมดอีกครั้ง"
|
||||
hideAllTips: "ซ่อนคำแนะนำและเคล็ดลับทั้งหมด"
|
||||
defaultImageCompressionLevel: "ความละเอียดเริ่มต้นสำหรับการบีบอัดภาพ"
|
||||
defaultImageCompressionLevel: "ค่าการบีบอัดภาพเริ่มต้น"
|
||||
defaultImageCompressionLevel_description: "หากตั้งค่าต่ำ จะรักษาคุณภาพภาพได้ดีขึ้นแต่ขนาดไฟล์จะเพิ่มขึ้น<br>หากตั้งค่าสูง จะลดขนาดไฟล์ได้ แต่คุณภาพภาพจะลดลง"
|
||||
defaultCompressionLevel: "ค่าการบีบอัดเริ่มต้น"
|
||||
defaultCompressionLevel_description: "ถ้าต่ำ จะรักษาคุณภาพได้ แต่ขนาดไฟล์จะเพิ่มขึ้น<br>ถ้าสูง จะลดขนาดไฟล์ได้ แต่คุณภาพจะลดลง"
|
||||
inMinutes: "นาที"
|
||||
inDays: "วัน"
|
||||
safeModeEnabled: "โหมดปลอดภัยถูกเปิดใช้งาน"
|
||||
@@ -1376,10 +1383,38 @@ pluginsAreDisabledBecauseSafeMode: "เนื่องจากโหมดป
|
||||
customCssIsDisabledBecauseSafeMode: "เนื่องจากโหมดปลอดภัยถูกเปิดใช้งาน CSS แบบกำหนดเองจึงไม่ได้ถูกนำมาใช้"
|
||||
themeIsDefaultBecauseSafeMode: "ในระหว่างที่โหมดปลอดภัยถูกเปิดใช้งาน จะใช้ธีมเริ่มต้น เมื่อปิดโหมดปลอดภัยจะกลับคืนดังเดิม"
|
||||
thankYouForTestingBeta: "ขอบคุณที่ให้ความร่วมมือในการทดสอบเวอร์ชันเบต้า!"
|
||||
createUserSpecifiedNote: "สร้างโน้ตแบบไดเร็กต์"
|
||||
schedulePost: "กำหนดเวลาให้โพสต์"
|
||||
scheduleToPostOnX: "กำหนดเวลาให้โพสต์ไว้ที่ {x}"
|
||||
scheduledToPostOnX: "มีการกำหนดเวลาให้โพสต์ไว้ที่ {x}"
|
||||
schedule: "กำหนดเวลา"
|
||||
scheduled: "กำหนดเวลา"
|
||||
widgets: "วิดเจ็ต"
|
||||
presets: "พรีเซ็ต"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
filename: "ชื่อไฟล์"
|
||||
_imageFrameEditor:
|
||||
header: "ส่วนหัว"
|
||||
withQrCode: "QR โค้ด"
|
||||
font: "แบบอักษร"
|
||||
fontSerif: "Serif"
|
||||
fontSansSerif: "Sans Serif"
|
||||
quitWithoutSaveConfirm: "ต้องการออกโดยไม่บันทึกหรือไม่?"
|
||||
_compression:
|
||||
_quality:
|
||||
high: "คุณภาพสูง"
|
||||
medium: "คุณภาพปานกลาง"
|
||||
low: "คุณภาพต่ำ"
|
||||
_size:
|
||||
large: "ขนาดใหญ่"
|
||||
medium: "ขนาดปานกลาง"
|
||||
small: "ขนาดเล็ก"
|
||||
_order:
|
||||
newest: "เรียงจากใหม่ไปเก่า"
|
||||
oldest: "เรียงจากเก่าไปใหม่"
|
||||
_chat:
|
||||
messages: "ข้อความ"
|
||||
noMessagesYet: "ยังไม่มีข้อความ"
|
||||
newMessage: "ข้อความใหม่"
|
||||
individualChat: "แชตส่วนตัว"
|
||||
@@ -1665,6 +1700,9 @@ _serverSettings:
|
||||
userGeneratedContentsVisibilityForVisitor_description2: "การเปิดเผยเนื้อหาทั้งหมดในเซิร์ฟเวอร์รวมทั้งเนื้อหาที่รับมาจากระยะไกลสู่สาธารณะบนอินเทอร์เน็ตโดยไม่มีข้อจำกัดใดๆ มีความเสี่ยงโดยเฉพาะอย่างยิ่งสำหรับผู้ชมที่ไม่เข้าใจลักษณะของระบบแบบกระจาย อาจทำให้เกิดความเข้าใจผิดคิดว่าเนื้อหาที่มาจากระยะไกลนั้นเป็นเนื้อหาที่สร้างขึ้นภายในเซิร์ฟเวอร์นี้ จึงควรใช้ความระมัดระวังอย่างมาก"
|
||||
restartServerSetupWizardConfirm_title: "ต้องการเริ่มวิซาร์ดการตั้งค่าเซิร์ฟเวอร์ใหม่หรือไม่?"
|
||||
restartServerSetupWizardConfirm_text: "การตั้งค่าบางส่วนในปัจจุบันจะถูกรีเซ็ต"
|
||||
entrancePageStyle: "สไตล์ของหน้าเพจทางเข้า"
|
||||
showTimelineForVisitor: "แสดงไทม์ไลน์"
|
||||
showActivitiesForVisitor: "แสดงกิจกรรม"
|
||||
_userGeneratedContentsVisibilityForVisitor:
|
||||
all: "ทั้งหมดสาธารณะ"
|
||||
localOnly: "เผยแพร่เป็นสาธารณะเฉพาะเนื้อหาท้องถิ่น เนื้อหาระยะไกลให้เป็นส่วนตัว"
|
||||
@@ -2014,6 +2052,7 @@ _role:
|
||||
uploadableFileTypes_caption: "สามารถระบุ MIME type ได้ โดยใช้การขึ้นบรรทัดใหม่เพื่อแยกหลายรายการ และสามารถใช้ดอกจัน (*) เพื่อระบุแบบไวลด์การ์ดได้ (เช่น: image/*)"
|
||||
uploadableFileTypes_caption2: "ไฟล์บางประเภทอาจไม่สามารถระบุชนิดได้ หากต้องการอนุญาตไฟล์ลักษณะนั้น กรุณาเพิ่ม {x} ลงในรายการที่อนุญาต"
|
||||
noteDraftLimit: "จำนวนโน้ตฉบับร่างที่สามารถสร้างได้บนฝั่งเซิร์ฟเวอร์"
|
||||
scheduledNoteLimit: "จำนวนโพสต์กำหนดเวลาที่สร้างพร้อมกันได้"
|
||||
watermarkAvailable: "มีฟังก์ชั่นลายน้ำให้เลือกใช้"
|
||||
_condition:
|
||||
roleAssignedTo: "มอบหมายให้มีบทบาทแบบทำมือ"
|
||||
@@ -2449,7 +2488,7 @@ _widgets:
|
||||
chooseList: "เลือกรายชื่อ"
|
||||
clicker: "คลิกเกอร์"
|
||||
birthdayFollowings: "วันเกิดผู้ใช้ในวันนี้"
|
||||
chat: "แชต"
|
||||
chat: "แชตเลย"
|
||||
_cw:
|
||||
hide: "ซ่อน"
|
||||
show: "โหลดเพิ่มเติม"
|
||||
@@ -2494,6 +2533,9 @@ _postForm:
|
||||
replyPlaceholder: "ตอบกลับโน้ตนี้..."
|
||||
quotePlaceholder: "อ้างโน้ตนี้..."
|
||||
channelPlaceholder: "โพสต์ลงช่อง..."
|
||||
_howToUse:
|
||||
visibility_title: "การมองเห็น"
|
||||
menu_title: "เมนู"
|
||||
_placeholders:
|
||||
a: "ตอนนี้เป็นยังไงบ้าง?"
|
||||
b: "มีอะไรเกิดขึ้นหรือเปล่า?"
|
||||
@@ -2639,6 +2681,8 @@ _notification:
|
||||
youReceivedFollowRequest: "ได้รับคำขอติดตาม"
|
||||
yourFollowRequestAccepted: "คำขอติดตามได้รับการอนุมัติแล้ว"
|
||||
pollEnded: "ผลโพลออกมาแล้ว"
|
||||
scheduledNotePosted: "โน้ตที่กำหนดเวลาไว้ได้ถูกโพสต์แล้ว"
|
||||
scheduledNotePostFailed: "ล้มเหลวในการโพสต์โน้ตที่กำหนดเวลาไว้"
|
||||
newNote: "โพสต์ใหม่"
|
||||
unreadAntennaNote: "เสาอากาศ {name}"
|
||||
roleAssigned: "ได้รับบทบาท"
|
||||
@@ -2718,7 +2762,7 @@ _deck:
|
||||
mentions: "กล่าวถึงคุณ"
|
||||
direct: "ไดเร็กต์"
|
||||
roleTimeline: "บทบาทไทม์ไลน์"
|
||||
chat: "แชต"
|
||||
chat: "แชตเลย"
|
||||
_dialog:
|
||||
charactersExceeded: "คุณกำลังมีตัวอักขระเกินขีดจำกัดสูงสุดแล้วนะ! ปัจจุบันอยู่ที่ {current} จาก {max}"
|
||||
charactersBelow: "คุณกำลังใช้อักขระต่ำกว่าขีดจำกัดขั้นต่ำเลยนะ! ปัจจุบันอยู่ที่ {current} จาก {min}"
|
||||
@@ -3164,7 +3208,9 @@ _watermarkEditor:
|
||||
opacity: "ความทึบแสง"
|
||||
scale: "ขนาด"
|
||||
text: "ข้อความ"
|
||||
qr: "QR โค้ด"
|
||||
position: "ตำแหน่ง"
|
||||
margin: "ระยะขอบ"
|
||||
type: "รูปแบบ"
|
||||
image: "รูปภาพ"
|
||||
advanced: "ขั้นสูง"
|
||||
@@ -3179,6 +3225,7 @@ _watermarkEditor:
|
||||
polkadotSubDotOpacity: "ความทึบของจุดรอง"
|
||||
polkadotSubDotRadius: "ขนาดของจุดรอง"
|
||||
polkadotSubDotDivisions: "จำนวนจุดรอง"
|
||||
leaveBlankToAccountUrl: "เว้นว่างไว้หากต้องการใช้ URL ของบัญชีแทน"
|
||||
_imageEffector:
|
||||
title: "เอฟเฟกต์"
|
||||
addEffect: "เพิ่มเอฟเฟกต์"
|
||||
@@ -3190,6 +3237,8 @@ _imageEffector:
|
||||
mirror: "กระจก"
|
||||
invert: "กลับสี"
|
||||
grayscale: "ขาวดำเทา"
|
||||
blur: "มัว"
|
||||
pixelate: "โมเสก"
|
||||
colorAdjust: "ปรับแก้สี"
|
||||
colorClamp: "บีบอัดสี"
|
||||
colorClampAdvanced: "บีบอัดสี (ขั้นสูง)"
|
||||
@@ -3201,10 +3250,14 @@ _imageEffector:
|
||||
checker: "ช่องตาราง"
|
||||
blockNoise: "บล็อกที่มีการรบกวน"
|
||||
tearing: "ฉีกขาด"
|
||||
fill: "เติมเต็ม"
|
||||
_fxProps:
|
||||
angle: "แองเกิล"
|
||||
scale: "ขนาด"
|
||||
size: "ขนาด"
|
||||
radius: "รัศสี"
|
||||
samples: "จำนวนตัวอย่าง"
|
||||
offset: "ตำแหน่ง"
|
||||
color: "สี"
|
||||
opacity: "ความทึบแสง"
|
||||
normalize: "นอร์มัลไลซ์"
|
||||
@@ -3233,6 +3286,7 @@ _imageEffector:
|
||||
zoomLinesThreshold: "ความกว้างเส้นรวมศูนย์"
|
||||
zoomLinesMaskSize: "ขนาดพื้นที่ตรงกลาง"
|
||||
zoomLinesBlack: "ทำให้ดำ"
|
||||
circle: "ทรงกลม"
|
||||
drafts: "ร่าง"
|
||||
_drafts:
|
||||
select: "เลือกฉบับร่าง"
|
||||
@@ -3248,3 +3302,22 @@ _drafts:
|
||||
restoreFromDraft: "คืนค่าจากฉบับร่าง"
|
||||
restore: "กู้คืน"
|
||||
listDrafts: "รายการฉบับร่าง"
|
||||
schedule: "โพสต์กำหนดเวลา"
|
||||
listScheduledNotes: "รายการโน้ตที่กำหนดเวลาไว้"
|
||||
cancelSchedule: "ยกเลิกกำหนดเวลา"
|
||||
qr: "QR โค้ด"
|
||||
_qr:
|
||||
showTabTitle: "แสดงผล"
|
||||
readTabTitle: "แสกน"
|
||||
shareTitle: "{name}{acct}"
|
||||
shareText: "โปรดติดตามฉันบน Fediverse ด้วย!"
|
||||
chooseCamera: "เลือกกล้อง"
|
||||
cannotToggleFlash: "ไม่สามารถเลือกแสงแฟลชได้"
|
||||
turnOnFlash: "ปิดแสงแฟลช"
|
||||
turnOffFlash: "เปิดแสงแฟลช"
|
||||
startQr: "เริ่มตัวอ่าน QR โค้ด"
|
||||
stopQr: "หยุดตัวอ่าน QR โค้ด"
|
||||
noQrCodeFound: "ไม่พบ QR โค้ด"
|
||||
scanFile: "สแกนภาพจากอุปกรณ์"
|
||||
raw: "ข้อความ"
|
||||
mfm: "MFM"
|
||||
|
||||
@@ -360,7 +360,7 @@ whenServerDisconnected: "Sunucu ile bağlantı kesildiğinde"
|
||||
disconnectedFromServer: "Sunucu bağlantısı kesildi"
|
||||
reload: "Yenile"
|
||||
doNothing: "Yoksay"
|
||||
reloadConfirm: "Zaman çizelgesini yenilemek ister misin?"
|
||||
reloadConfirm: "Panoyu yenilemek ister misin?"
|
||||
watch: "İzle"
|
||||
unwatch: "İzlemeyi bırak"
|
||||
accept: "Kabul et"
|
||||
@@ -573,9 +573,9 @@ objectStorageSetPublicRead: "Yükleme sırasında \"genel-okuma\" ayarını yap
|
||||
s3ForcePathStyleDesc: "s3ForcePathStyle etkinleştirilirse, kova adı URL'nin ana bilgisayar adı yerine URL yoluna eklenmelidir. Kendi kendine barındırılan bir Minio örneği gibi hizmetleri kullanırken bu ayarı etkinleştirmen gerekebilir."
|
||||
serverLogs: "Sunucu log kayıtları"
|
||||
deleteAll: "Tümünü sil"
|
||||
showFixedPostForm: "Gönderi formunu zaman çizelgesinin en üstünde görüntüle"
|
||||
showFixedPostFormInChannel: "Gönderi formunu zaman çizelgesinin en üstünde görüntüle (Kanallar)"
|
||||
withRepliesByDefaultForNewlyFollowed: "Yeni takip edilen kullanıcıların yanıtlarını varsayılan olarak zaman çizelgesine dahil et"
|
||||
showFixedPostForm: "Gönderi formunu pano üstünde görüntüle"
|
||||
showFixedPostFormInChannel: "Gönderi formunu pano üstünde görüntüle (Kanallar)"
|
||||
withRepliesByDefaultForNewlyFollowed: "Yeni takip edilen kullanıcıların yanıtlarını varsayılan olarak panoya dahil et"
|
||||
newNoteRecived: "Yeni Not'lar var"
|
||||
newNote: "Yeni Not"
|
||||
sounds: "Sesler"
|
||||
@@ -1059,7 +1059,7 @@ achievements: "Başarılar"
|
||||
gotInvalidResponseError: "Geçersiz sunucu yanıtı"
|
||||
gotInvalidResponseErrorDescription: "Sunucu erişilemez durumda olabilir veya bakım çalışması yapılmaktadır. Lütfen daha sonra tekrar dene."
|
||||
thisPostMayBeAnnoying: "Bu not başkalarını rahatsız edebilir."
|
||||
thisPostMayBeAnnoyingHome: "Ana zaman çizelgesine gönder"
|
||||
thisPostMayBeAnnoyingHome: "Ana panoya gönder"
|
||||
thisPostMayBeAnnoyingCancel: "İptal"
|
||||
thisPostMayBeAnnoyingIgnore: "Yine de gönder"
|
||||
collapseRenotes: "Daha önce görüntülenen Renote'lari kısaltılmış olarak göster"
|
||||
@@ -1218,8 +1218,8 @@ showRepliesToOthersInTimeline: "Pano'da diğer kişilere verilen yanıtları gö
|
||||
hideRepliesToOthersInTimeline: "Pano'dan diğer kişilerin yanıtlarını gizle"
|
||||
showRepliesToOthersInTimelineAll: "Pano'da takip ettiğin herkesin diğerlerine verdiği yanıtları göster"
|
||||
hideRepliesToOthersInTimelineAll: "Pano'da takip ettiğin herkesten diğer kişilere verilen yanıtları gizle"
|
||||
confirmShowRepliesAll: "Bu işlem geri alınamaz. Takip ettiğin herkesin yanıtlarını zaman çizelgende diğer kullanıcılara göstermek istiyor musun?"
|
||||
confirmHideRepliesAll: "Bu işlem geri alınamaz. Şu anda takip ettiğin tüm kullanıcıların yanıtlarını zaman tünelinde cidden göstermeyecek misin?"
|
||||
confirmShowRepliesAll: "Bu işlem geri alınamaz. Takip ettiğin herkesin yanıtlarını panoda diğer kullanıcılara göstermek istiyor musun?"
|
||||
confirmHideRepliesAll: "Bu işlem geri alınamaz. Şu anda takip ettiğin tüm kullanıcıların yanıtlarını panoda cidden göstermeyecek misin?"
|
||||
externalServices: "Dış Hizmetler"
|
||||
sourceCode: "Kaynak kodu"
|
||||
sourceCodeIsNotYetProvided: "Kaynak kodu henüz mevcut değildir. Bu sorunu gidermek için yöneticiyle iletişime geçin."
|
||||
@@ -1343,6 +1343,7 @@ postForm: "Gönderim formu"
|
||||
textCount: "Karakter sayısı"
|
||||
information: "Hakkında"
|
||||
chat: "Sohbet"
|
||||
directMessage: "Kullanıcıyla sohbet et"
|
||||
migrateOldSettings: "Eski istemci ayarlarını taşıma"
|
||||
migrateOldSettings_description: "Bu işlem otomatik olarak yapılmalıdır, ancak herhangi bir nedenle geçiş başarısız olursa, geçiş işlemini manuel olarak kendin başlatabilirsin. Mevcut yapılandırma bilgileri üzerine yazılacaktır."
|
||||
compress: "Sıkıştır"
|
||||
@@ -1377,6 +1378,17 @@ pluginsAreDisabledBecauseSafeMode: "Güvenli mod etkinleştirildiği için tüm
|
||||
customCssIsDisabledBecauseSafeMode: "Güvenli mod etkin olduğu için özel CSS uygulanmıyor."
|
||||
themeIsDefaultBecauseSafeMode: "Güvenli mod etkinken, varsayılan tema kullanılır. Güvenli modu devre dışı bırakmak bu değişiklikleri geri alır."
|
||||
thankYouForTestingBeta: "Beta sürümünü test ettiğin için teşekkür ederiz!"
|
||||
widgets: "Widget'lar"
|
||||
presets: "Ön ayar"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
filename: "Dosya adı"
|
||||
_imageFrameEditor:
|
||||
header: "Başlık"
|
||||
font: "Yazı tipi"
|
||||
fontSerif: "Serif"
|
||||
fontSansSerif: "Sans Serif"
|
||||
quitWithoutSaveConfirm: "Kaydedilmemiş değişiklikleri silmek ister misin?"
|
||||
_order:
|
||||
newest: "Önce yeni"
|
||||
oldest: "Önce eski"
|
||||
@@ -1570,9 +1582,9 @@ _initialTutorial:
|
||||
description: "Burada, Misskey'i kullanmanın temellerini ve özelliklerini öğrenebilirsin."
|
||||
_note:
|
||||
title: "Not nedir?"
|
||||
description: "Misskey'deki gönderiler “Notlar” olarak adlandırılır. Notlar zaman çizelgesinde kronolojik olarak düzenlenir ve gerçek zamanlı olarak güncellenir."
|
||||
description: "Misskey'deki gönderiler “Notlar” olarak adlandırılır. Notlar panoda kronolojik olarak düzenlenir ve gerçek zamanlı olarak güncellenir."
|
||||
reply: "Bir mesaja yanıt vermek için bu düğmeye tıklayın. Yanıtlara yanıt vermek de mümkündür, böylece konuşma bir konu başlığı gibi devam eder."
|
||||
renote: "Bu notu kendi zaman çizelgende paylaşabilirsiniz. Ayrıca yorumlarınızla birlikte alıntı da yapabilirsin."
|
||||
renote: "Bu notu kendi panonda paylaşabilirsin. Ayrıca yorumlarınla birlikte alıntı da yapabilirsin."
|
||||
reaction: "Not'a tepkiler ekleyebilirsin. Daha fazla ayrıntı bir sonraki sayfada açıklanacak."
|
||||
menu: "Not ayrıntılarını görüntüleyebilir, bağlantıları kopyalayabilir ve çeşitli diğer işlemleri gerçekleştirebilirsin."
|
||||
_reaction:
|
||||
@@ -1640,7 +1652,7 @@ _serverSettings:
|
||||
shortNameDescription: "Resmi adın uzun olması durumunda görüntülenebilen, örneğin adının kısaltması."
|
||||
fanoutTimelineDescription: "Etkinleştirildiğinde Pano alma performansını büyük ölçüde artırır ve veritabanı yükünü azaltır. Bunun karşılığında Redis'in bellek kullanımı artacaktır. Sunucu belleği düşükse veya sunucu kararsızsa bunu devre dışı bırakmayı düşün."
|
||||
fanoutTimelineDbFallback: "Veritabanına geri dön"
|
||||
fanoutTimelineDbFallbackDescription: "Etkinleştirildiğinde, Pano önbelleğe alınmamışsa ek sorgular için veritabanına geri döner. Bu özelliği devre dışı bırakmak, geri dönüş sürecini ortadan kaldırarak sunucu yükünü daha da azaltır, ancak alınabilecek zaman çizelgelerinin aralığını sınırlar."
|
||||
fanoutTimelineDbFallbackDescription: "Etkinleştirildiğinde, Pano önbelleğe alınmamışsa ek sorgular için veritabanına geri döner. Bu özelliği devre dışı bırakmak, geri dönüş sürecini ortadan kaldırarak sunucu yükünü daha da azaltır, ancak alınabilecek panoların aralığını sınırlar."
|
||||
reactionsBufferingDescription: "Etkinleştirildiğinde, reaksiyon oluşturma sırasında performans büyük ölçüde artacak ve veritabanı üzerindeki yük azalacaktır. Ancak, Redis bellek kullanımı artacakt."
|
||||
remoteNotesCleaning: "Uzak notların otomatik olarak temizlenmesi"
|
||||
remoteNotesCleaning_description: "Etkinleştirildiğinde, kullanılmayan ve güncelliğini yitirmiş uzak notlar, veritabanının şişmesini önlemek için periyodik olarak temizlenecek."
|
||||
@@ -1668,6 +1680,7 @@ _serverSettings:
|
||||
restartServerSetupWizardConfirm_text: "Bazı mevcut ayarlar sıfırlanacaktır."
|
||||
entrancePageStyle: "Giriş sayfası stili"
|
||||
showTimelineForVisitor: "Panoyu göster"
|
||||
showActivitiesForVisitor: "Aktiviteleri göster"
|
||||
_userGeneratedContentsVisibilityForVisitor:
|
||||
all: "Her şey halka açıktır."
|
||||
localOnly: "Yalnızca yerel içerik yayınlanır, uzak içerik gizli tutulur."
|
||||
@@ -1876,7 +1889,7 @@ _achievements:
|
||||
title: "Öz Referans"
|
||||
description: "Kendi notunuzu alıntı yapın"
|
||||
_htl20npm:
|
||||
title: "Akış Zaman Çizelgesi"
|
||||
title: "Akış Panosu"
|
||||
description: "Ev zaman çizelgenizin hızı 20 npm'yi (dakika başına not sayısı) aşıyor mu?"
|
||||
_viewInstanceChart:
|
||||
title: "Analist"
|
||||
@@ -1965,7 +1978,7 @@ _role:
|
||||
asBadge: "Rozet olarak göster"
|
||||
descriptionOfAsBadge: "This role's icon will be displayed next to the username of users with this role if turned on."
|
||||
isExplorable: "Rolü keşfedilebilir hale getir"
|
||||
descriptionOfIsExplorable: "Bu rolün zaman çizelgesi ve bu role sahip kullanıcıların listesi, etkinleştirilirse kamuya açık hale getirilecek."
|
||||
descriptionOfIsExplorable: "Bu rolün panosu ve bu role sahip kullanıcıların listesi, etkinleştirilirse kamuya açık hale getirilecek."
|
||||
displayOrder: "Pozisyon"
|
||||
descriptionOfDisplayOrder: "Sayı ne kadar yüksekse, UI pozisyonu da o kadar yüksek olur."
|
||||
preserveAssignmentOnMoveAccount: "Geçiş sırasında rol atamalarını koruyun"
|
||||
@@ -1979,7 +1992,7 @@ _role:
|
||||
high: "Yüksek"
|
||||
_options:
|
||||
gtlAvailable: "Global Pano'yu görüntüleyebilir"
|
||||
ltlAvailable: "Yerel zaman çizelgesini görüntüleyebilir"
|
||||
ltlAvailable: "Yerel panoyu görüntüleyebilir"
|
||||
canPublicNote: "Halka açık notlar gönderebilir"
|
||||
mentionMax: "Bir notta maksimum bahsetme sayısı"
|
||||
canInvite: "Sunucu davet kodları oluşturabilir"
|
||||
@@ -2484,7 +2497,7 @@ _visibility:
|
||||
public: "Halka açık"
|
||||
publicDescription: "Notunuz tüm kullanıcılar tarafından görülebilir olacaktır."
|
||||
home: "Pano"
|
||||
homeDescription: "Yalnızca ana zaman çizelgesine gönder"
|
||||
homeDescription: "Yalnızca ana panoya gönder"
|
||||
followers: "Takipçiler"
|
||||
followersDescription: "Sadece takipçilerine görünür hale getir"
|
||||
specified: "Doğrudan"
|
||||
@@ -2497,6 +2510,9 @@ _postForm:
|
||||
replyPlaceholder: "Bu notu yanıtla..."
|
||||
quotePlaceholder: "Bu notu alıntı yap..."
|
||||
channelPlaceholder: "Bir kanala gönder..."
|
||||
_howToUse:
|
||||
visibility_title: "Görünürlük"
|
||||
menu_title: "Menü"
|
||||
_placeholders:
|
||||
a: "Ne yapıyorsun?"
|
||||
b: "Çevrende neler oluyor?"
|
||||
@@ -2531,7 +2547,7 @@ _exportOrImport:
|
||||
userLists: "Kullanıcı listeleri"
|
||||
excludeMutingUsers: "Sessize alınan kullanıcıları hariç tut"
|
||||
excludeInactiveUsers: "Etkin olmayan kullanıcıları hariç tut"
|
||||
withReplies: "İçe aktarılan kullanıcıların yanıtlarını zaman çizelgesine dahil edin"
|
||||
withReplies: "İçe aktarılan kullanıcıların yanıtlarını panoya dahil edin"
|
||||
_charts:
|
||||
federation: "Federasyon"
|
||||
apRequest: "Talepler"
|
||||
@@ -2925,7 +2941,7 @@ _reversi:
|
||||
freeMatch: "Ücretsiz Eşleştirme"
|
||||
lookingForPlayer: "Rakip aranıyor..."
|
||||
gameCanceled: "Oyun iptal edildi."
|
||||
shareToTlTheGameWhenStart: "Oyun başlatıldığında zaman çizelgesinde paylaş"
|
||||
shareToTlTheGameWhenStart: "Oyun başlatıldığında panoda paylaş"
|
||||
iStartedAGame: "Oyun başladı! #MisskeyReversi"
|
||||
opponentHasSettingsChanged: "Rakip ayarlarını değiştirmiş."
|
||||
allowIrregularRules: "Düzensiz kurallar (tamamen ücretsiz)"
|
||||
@@ -3153,7 +3169,7 @@ _clientPerformanceIssueTip:
|
||||
_clip:
|
||||
tip: "Klip, notları gruplandırmanıza olanak tanıyan bir özelliktir."
|
||||
_userLists:
|
||||
tip: "Listeler, oluşturulurken belirttiğin herhangi bir kullanıcıyı içerebilir. Oluşturulan liste, yalnızca belirtilen kullanıcıları gösteren bir zaman çizelgesi olarak görüntülenebilir."
|
||||
tip: "Listeler, oluşturulurken belirttiğin herhangi bir kullanıcıyı içerebilir. Oluşturulan liste, yalnızca belirtilen kullanıcıları gösteren bir pano olarak görüntülenebilir."
|
||||
watermark: "Filigran"
|
||||
defaultPreset: "Varsayılan Ön Ayar"
|
||||
_watermarkEditor:
|
||||
@@ -3208,6 +3224,7 @@ _imageEffector:
|
||||
angle: "Açı"
|
||||
scale: "Boyut"
|
||||
size: "Boyut"
|
||||
offset: "Pozisyon"
|
||||
color: "Renk"
|
||||
opacity: "Opaklık"
|
||||
normalize: "Normalize"
|
||||
@@ -3251,3 +3268,6 @@ _drafts:
|
||||
restoreFromDraft: "Taslaktan geri yükle"
|
||||
restore: "Geri yükle"
|
||||
listDrafts: "Taslaklar Listesi"
|
||||
_qr:
|
||||
showTabTitle: "Ekran"
|
||||
raw: "Metin"
|
||||
|
||||
@@ -921,6 +921,15 @@ postForm: "Створення нотатки"
|
||||
information: "Інформація"
|
||||
inMinutes: "х"
|
||||
inDays: "д"
|
||||
widgets: "Віджети"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
filename: "Ім'я файлу"
|
||||
_imageFrameEditor:
|
||||
header: "Заголовок"
|
||||
font: "Шрифт"
|
||||
fontSerif: "Serif"
|
||||
fontSansSerif: "Sans serif"
|
||||
_chat:
|
||||
invitations: "Запросити"
|
||||
noHistory: "Історія порожня"
|
||||
@@ -1461,6 +1470,9 @@ _postForm:
|
||||
replyPlaceholder: "Відповідь на цю нотатку..."
|
||||
quotePlaceholder: "Прокоментуйте цю нотатку..."
|
||||
channelPlaceholder: "Опублікувати в каналі"
|
||||
_howToUse:
|
||||
visibility_title: "Видимість"
|
||||
menu_title: "Меню"
|
||||
_placeholders:
|
||||
a: "Чим займаєтесь?"
|
||||
b: "Що відбувається навколо вас?"
|
||||
@@ -1655,3 +1667,6 @@ _imageEffector:
|
||||
color: "Колір"
|
||||
opacity: "Непрозорість"
|
||||
lightness: "Яскравість"
|
||||
_qr:
|
||||
showTabTitle: "Відображення"
|
||||
raw: "Текст"
|
||||
|
||||
@@ -837,6 +837,14 @@ replies: "Javob berish"
|
||||
renotes: "Qayta qayd etish"
|
||||
flip: "Teskari"
|
||||
information: "Haqida"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
filename: "Fayl nomi"
|
||||
_imageFrameEditor:
|
||||
header: "Sarlavha"
|
||||
font: "Shrift"
|
||||
fontSerif: "Serif"
|
||||
fontSansSerif: "Sans Serif"
|
||||
_chat:
|
||||
invitations: "Taklif qilish"
|
||||
noHistory: "Tarix yo'q"
|
||||
@@ -964,6 +972,10 @@ _visibility:
|
||||
home: "Bosh sahifa"
|
||||
followers: "Obunachilar"
|
||||
specified: "Bevosita"
|
||||
_postForm:
|
||||
_howToUse:
|
||||
visibility_title: "Ko'rinishi"
|
||||
menu_title: "Menyu"
|
||||
_profile:
|
||||
name: "Ism"
|
||||
username: "Foydalanuvchi nomi"
|
||||
@@ -1106,3 +1118,6 @@ _imageEffector:
|
||||
_fxProps:
|
||||
color: "Rang"
|
||||
lightness: "Yoritish"
|
||||
_qr:
|
||||
showTabTitle: "Displey"
|
||||
raw: "Matn"
|
||||
|
||||
@@ -1,53 +0,0 @@
|
||||
import locales from './index.js';
|
||||
|
||||
let valid = true;
|
||||
|
||||
function writeError(type, lang, tree, data) {
|
||||
process.stderr.write(JSON.stringify({ type, lang, tree, data }));
|
||||
process.stderr.write('\n');
|
||||
valid = false;
|
||||
}
|
||||
|
||||
function verify(expected, actual, lang, trace) {
|
||||
for (let key in expected) {
|
||||
if (!Object.prototype.hasOwnProperty.call(actual, key)) {
|
||||
continue;
|
||||
}
|
||||
if (typeof expected[key] === 'object') {
|
||||
if (typeof actual[key] !== 'object') {
|
||||
writeError('mismatched_type', lang, trace ? `${trace}.${key}` : key, { expected: 'object', actual: typeof actual[key] });
|
||||
continue;
|
||||
}
|
||||
verify(expected[key], actual[key], lang, trace ? `${trace}.${key}` : key);
|
||||
} else if (typeof expected[key] === 'string') {
|
||||
switch (typeof actual[key]) {
|
||||
case 'object':
|
||||
writeError('mismatched_type', lang, trace ? `${trace}.${key}` : key, { expected: 'string', actual: 'object' });
|
||||
break;
|
||||
case 'undefined':
|
||||
continue;
|
||||
case 'string':
|
||||
const expectedParameters = new Set(expected[key].match(/\{[^}]+\}/g)?.map((s) => s.slice(1, -1)));
|
||||
const actualParameters = new Set(actual[key].match(/\{[^}]+\}/g)?.map((s) => s.slice(1, -1)));
|
||||
for (let parameter of expectedParameters) {
|
||||
if (!actualParameters.has(parameter)) {
|
||||
writeError('missing_parameter', lang, trace ? `${trace}.${key}` : key, { parameter });
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const { ['ja-JP']: original, ...verifiees } = locales;
|
||||
|
||||
for (let lang in verifiees) {
|
||||
if (!Object.prototype.hasOwnProperty.call(locales, lang)) {
|
||||
continue;
|
||||
}
|
||||
verify(original, verifiees[lang], lang);
|
||||
}
|
||||
|
||||
if (!valid) {
|
||||
process.exit(1);
|
||||
}
|
||||
@@ -1222,6 +1222,16 @@ migrateOldSettings: "Di chuyển cài đặt cũ"
|
||||
migrateOldSettings_description: "Thông thường, quá trình này diễn ra tự động, nhưng nếu vì lý do nào đó mà quá trình di chuyển không thành công, bạn có thể kích hoạt thủ công quy trình di chuyển, quá trình này sẽ ghi đè lên thông tin cấu hình hiện tại của bạn."
|
||||
inMinutes: "phút"
|
||||
inDays: "ngày"
|
||||
widgets: "Tiện ích"
|
||||
presets: "Mẫu thiết lập"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
filename: "Tên tập tin"
|
||||
_imageFrameEditor:
|
||||
header: "Ảnh bìa"
|
||||
font: "Phông chữ"
|
||||
fontSerif: "Serif"
|
||||
fontSansSerif: "Sans Serif"
|
||||
_chat:
|
||||
invitations: "Mời"
|
||||
noHistory: "Không có dữ liệu"
|
||||
@@ -1816,7 +1826,6 @@ _widgets:
|
||||
_userList:
|
||||
chooseList: "Chọn danh sách"
|
||||
clicker: "clicker"
|
||||
chat: "Trò chuyện"
|
||||
_cw:
|
||||
hide: "Ẩn"
|
||||
show: "Tải thêm"
|
||||
@@ -1859,6 +1868,9 @@ _postForm:
|
||||
replyPlaceholder: "Trả lời tút này"
|
||||
quotePlaceholder: "Trích dẫn tút này"
|
||||
channelPlaceholder: "Đăng lên một kênh"
|
||||
_howToUse:
|
||||
visibility_title: "Hiển thị"
|
||||
menu_title: "Menu"
|
||||
_placeholders:
|
||||
a: "Bạn đang định làm gì?"
|
||||
b: "Hôm nay bạn có gì vui?"
|
||||
@@ -2042,7 +2054,6 @@ _deck:
|
||||
channel: "Kênh"
|
||||
mentions: "Lượt nhắc"
|
||||
direct: "Nhắn riêng"
|
||||
chat: "Trò chuyện"
|
||||
_dialog:
|
||||
charactersExceeded: "Bạn nhắn quá giới hạn ký tự!! Hiện nay {current} / giới hạn {max}"
|
||||
charactersBelow: "Bạn nhắn quá ít tối thiểu ký tự!! Hiện nay {current} / Tối thiểu {min}"
|
||||
@@ -2095,6 +2106,10 @@ _imageEffector:
|
||||
angle: "Góc"
|
||||
scale: "Kích thước"
|
||||
size: "Kích thước"
|
||||
offset: "Vị trí"
|
||||
color: "Màu sắc"
|
||||
opacity: "Độ trong suốt"
|
||||
lightness: "Độ sáng"
|
||||
_qr:
|
||||
showTabTitle: "Hiển thị"
|
||||
raw: "Văn bản"
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -75,7 +75,7 @@ receiveFollowRequest: "您有新的追隨請求"
|
||||
followRequestAccepted: "追隨請求已被接受"
|
||||
mention: "提及"
|
||||
mentions: "提及"
|
||||
directNotes: "私訊"
|
||||
directNotes: "指定使用者"
|
||||
importAndExport: "匯入與匯出"
|
||||
import: "匯入"
|
||||
export: "匯出"
|
||||
@@ -83,6 +83,8 @@ files: "檔案"
|
||||
download: "下載"
|
||||
driveFileDeleteConfirm: "確定要刪除檔案「{name}」嗎?使用此檔案的貼文也會跟著被刪除。"
|
||||
unfollowConfirm: "確定要取消追隨{name}嗎?"
|
||||
cancelFollowRequestConfirm: "要取消向 {name} 送出的追隨申請嗎?"
|
||||
rejectFollowRequestConfirm: "要拒絕來自 {name} 的追隨申請嗎?"
|
||||
exportRequested: "已請求匯出。這可能會花一點時間。匯出的檔案將會被放到雲端硬碟裡。"
|
||||
importRequested: "已請求匯入。這可能會花一點時間。"
|
||||
lists: "清單"
|
||||
@@ -172,7 +174,7 @@ emojiUrl: "表情符號 URL"
|
||||
addEmoji: "新增表情符號"
|
||||
settingGuide: "推薦設定"
|
||||
cacheRemoteFiles: "快取遠端檔案"
|
||||
cacheRemoteFilesDescription: "啟用此設定後,遠端檔案會被快取在本伺服器的儲存空間中。雖然顯示圖片會變快,但會消耗較多伺服器的儲存空間。至於要快取遠端使用者到什麼程度,是依照角色的雲端硬碟容量而定。當超過這個限制時,從較舊的檔案開始自快取中刪除並改為連結。關閉這個設定時,遠端檔案從一開始就維持連結的方式,但建議將 default.yml 的 proxyRemoteFiles 設為 true,以便產生圖片的縮圖並保護使用者的隱私。"
|
||||
cacheRemoteFilesDescription: "啟用這個設定後,遠端檔案會被快取到這台伺服器的儲存空間中。這樣能加快圖片的顯示速度,但會多占用伺服器的儲存容量。遠端使用者能保留多少快取,取決於其角色所設定的硬碟容量上限。若超過這個上限,系統會從最舊的檔案開始刪除快取並改成連結。若停用這個設定,遠端檔案一開始就只會以連結的形式保留。"
|
||||
youCanCleanRemoteFilesCache: "按檔案管理的🗑️按鈕,可將快取全部刪除。"
|
||||
cacheRemoteSensitiveFiles: "快取遠端的敏感檔案"
|
||||
cacheRemoteSensitiveFilesDescription: "若停用這個設定,則不會快取遠端的敏感檔案,而是直接連結。"
|
||||
@@ -253,6 +255,7 @@ noteDeleteConfirm: "確定刪除此貼文嗎?"
|
||||
pinLimitExceeded: "不能置頂更多貼文了"
|
||||
done: "完成"
|
||||
processing: "處理中"
|
||||
preprocessing: "準備中"
|
||||
preview: "預覽"
|
||||
default: "預設"
|
||||
defaultValueIs: "預設值:{value}"
|
||||
@@ -301,6 +304,7 @@ uploadFromUrlMayTakeTime: "還需要一些時間才能完成上傳。"
|
||||
uploadNFiles: "上傳了 {n} 個檔案"
|
||||
explore: "探索"
|
||||
messageRead: "已讀"
|
||||
readAllChatMessages: "將所有訊息標記為已讀"
|
||||
noMoreHistory: "沒有更多歷史紀錄"
|
||||
startChat: "開始聊天"
|
||||
nUsersRead: "{n} 人已讀"
|
||||
@@ -333,6 +337,7 @@ fileName: "檔案名稱"
|
||||
selectFile: "選擇檔案"
|
||||
selectFiles: "選擇檔案"
|
||||
selectFolder: "選擇資料夾"
|
||||
unselectFolder: "取消選擇資料夾"
|
||||
selectFolders: "選擇資料夾"
|
||||
fileNotSelected: "尚未選擇檔案"
|
||||
renameFile: "重新命名檔案"
|
||||
@@ -345,6 +350,7 @@ addFile: "加入附件"
|
||||
showFile: "瀏覽文件"
|
||||
emptyDrive: "雲端硬碟為空"
|
||||
emptyFolder: "資料夾為空"
|
||||
dropHereToUpload: "將檔案拖放至此處即可上傳"
|
||||
unableToDelete: "無法刪除"
|
||||
inputNewFileName: "輸入檔案名稱"
|
||||
inputNewDescription: "請輸入新標題 "
|
||||
@@ -772,6 +778,7 @@ lockedAccountInfo: "即使追隨需要核准,除非你將貼文的可見性設
|
||||
alwaysMarkSensitive: "預設標記檔案為敏感內容"
|
||||
loadRawImages: "以原始圖檔顯示附件圖檔的縮圖"
|
||||
disableShowingAnimatedImages: "不播放動態圖檔"
|
||||
disableShowingAnimatedImages_caption: "無論這個設定如何,如果動畫圖片無法播放,可能是因為瀏覽器或作業系統的無障礙設定、省電設定等產生了干擾。"
|
||||
highlightSensitiveMedia: "強調敏感標記"
|
||||
verificationEmailSent: "已發送驗證電子郵件。請點擊進入電子郵件中的連結以完成驗證。"
|
||||
notSet: "未設定"
|
||||
@@ -1018,6 +1025,9 @@ pushNotificationAlreadySubscribed: "推播通知啟用中"
|
||||
pushNotificationNotSupported: "瀏覽器或伺服器不支援推播通知"
|
||||
sendPushNotificationReadMessage: "如果已閱讀通知與訊息,就刪除推播通知"
|
||||
sendPushNotificationReadMessageCaption: "可能會導致裝置的電池消耗量增加。"
|
||||
pleaseAllowPushNotification: "請允許瀏覽器的通知設定"
|
||||
browserPushNotificationDisabled: "取得通知發送權限失敗"
|
||||
browserPushNotificationDisabledDescription: "您沒有權限從 {serverName} 發送通知。請在瀏覽器設定中允許通知,然後再試一次。"
|
||||
windowMaximize: "最大化"
|
||||
windowMinimize: "最小化"
|
||||
windowRestore: "復原"
|
||||
@@ -1168,6 +1178,7 @@ installed: "已安裝"
|
||||
branding: "品牌宣傳"
|
||||
enableServerMachineStats: "公佈伺服器的機器資訊"
|
||||
enableIdenticonGeneration: "啟用生成使用者的 Identicon "
|
||||
showRoleBadgesOfRemoteUsers: "顯示授予遠端使用者的角色徽章"
|
||||
turnOffToImprovePerformance: "關閉時會提高性能。"
|
||||
createInviteCode: "建立邀請碼"
|
||||
createWithOptions: "使用選項建立"
|
||||
@@ -1316,6 +1327,7 @@ acknowledgeNotesAndEnable: "了解注意事項後再開啟。"
|
||||
federationSpecified: "此伺服器以白名單聯邦的方式運作。除了管理員指定的伺服器外,它無法與其他伺服器互動。"
|
||||
federationDisabled: "此伺服器未開啟站台聯邦。無法與其他伺服器上的使用者互動。"
|
||||
draft: "草稿\n"
|
||||
draftsAndScheduledNotes: "草稿與排定發布"
|
||||
confirmOnReact: "在做出反應前先確認"
|
||||
reactAreYouSure: "用「 {emoji} 」反應嗎?"
|
||||
markAsSensitiveConfirm: "要將這個媒體設定為敏感嗎?"
|
||||
@@ -1343,6 +1355,8 @@ postForm: "發文視窗"
|
||||
textCount: "字數"
|
||||
information: "關於"
|
||||
chat: "聊天"
|
||||
directMessage: "直接訊息"
|
||||
directMessage_short: "訊息"
|
||||
migrateOldSettings: "遷移舊設定資訊"
|
||||
migrateOldSettings_description: "通常情況下,這會自動進行,但若因某些原因未能順利遷移,您可以手動觸發遷移處理。請注意,當前的設定資訊將會被覆寫。"
|
||||
compress: "壓縮"
|
||||
@@ -1370,6 +1384,8 @@ redisplayAllTips: "重新顯示所有「提示與技巧」"
|
||||
hideAllTips: "隱藏所有「提示與技巧」"
|
||||
defaultImageCompressionLevel: "預設的影像壓縮程度"
|
||||
defaultImageCompressionLevel_description: "低的話可以保留畫質,但是會增加檔案的大小。<br>高的話可以減少檔案大小,但是會降低畫質。"
|
||||
defaultCompressionLevel: "預設的壓縮程度"
|
||||
defaultCompressionLevel_description: "低的話可以保留品質,但是會增加檔案的大小。<br>高的話可以減少檔案大小,但是會降低品質。"
|
||||
inMinutes: "分鐘"
|
||||
inDays: "日"
|
||||
safeModeEnabled: "啟用安全模式"
|
||||
@@ -1377,10 +1393,73 @@ pluginsAreDisabledBecauseSafeMode: "由於啟用安全模式,所有的外掛
|
||||
customCssIsDisabledBecauseSafeMode: "由於啟用安全模式,所有的客製 CSS 都被停用。"
|
||||
themeIsDefaultBecauseSafeMode: "在安全模式啟用期間將使用預設主題。關閉安全模式後會恢復原本的設定。"
|
||||
thankYouForTestingBeta: "感謝您協助驗證 beta 版!"
|
||||
createUserSpecifiedNote: "建立使用者指定的筆記"
|
||||
schedulePost: "排定發布"
|
||||
scheduleToPostOnX: "排定在 {x} 發布"
|
||||
scheduledToPostOnX: "已排定在 {x} 發布貼文"
|
||||
schedule: "排定"
|
||||
scheduled: "排定"
|
||||
widgets: "小工具"
|
||||
deviceInfo: "硬體資訊"
|
||||
deviceInfoDescription: "在提出技術性諮詢時,若能同時提供以下資訊,將有助於解決問題。"
|
||||
youAreAdmin: "您是管理員"
|
||||
frame: "邊框"
|
||||
presets: "預設值"
|
||||
zeroPadding: "補零"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
caption: "檔案標題"
|
||||
filename: "檔案名稱"
|
||||
filename_without_ext: "無副檔名的檔案名稱"
|
||||
year: "拍攝年份"
|
||||
month: "拍攝月份"
|
||||
day: "拍攝日期"
|
||||
hour: "拍攝時間(小時)"
|
||||
minute: "拍攝時間(分鐘)"
|
||||
second: "拍攝時間(秒)"
|
||||
camera_model: "相機名稱"
|
||||
camera_lens_model: "鏡頭型號"
|
||||
camera_mm: "焦距"
|
||||
camera_mm_35: "焦距(換算為 35mm 底片等效焦距)"
|
||||
camera_f: "光圈"
|
||||
camera_s: "快門速度"
|
||||
camera_iso: "ISO 感光度"
|
||||
gps_lat: "緯度"
|
||||
gps_long: "經度"
|
||||
_imageFrameEditor:
|
||||
title: "編輯邊框"
|
||||
tip: "可以在圖片上添加包含邊框或 EXIF 的標籤來裝飾圖片。"
|
||||
header: "標題"
|
||||
footer: "頁尾"
|
||||
borderThickness: "邊框寬度"
|
||||
labelThickness: "標籤寬度"
|
||||
labelScale: "標籤縮放比例"
|
||||
centered: "置中對齊"
|
||||
captionMain: "標題文字(大)"
|
||||
captionSub: "標題文字(小)"
|
||||
availableVariables: "可使用的變數"
|
||||
withQrCode: "二維條碼"
|
||||
backgroundColor: "背景顏色"
|
||||
textColor: "文字顏色"
|
||||
font: "字型"
|
||||
fontSerif: "襯線體"
|
||||
fontSansSerif: "無襯線體"
|
||||
quitWithoutSaveConfirm: "不儲存就退出嗎?"
|
||||
failedToLoadImage: "圖片載入失敗"
|
||||
_compression:
|
||||
_quality:
|
||||
high: "高品質"
|
||||
medium: "中品質"
|
||||
low: "低品質"
|
||||
_size:
|
||||
large: "大"
|
||||
medium: "中"
|
||||
small: "小"
|
||||
_order:
|
||||
newest: "最新的在前"
|
||||
oldest: "最舊的在前"
|
||||
_chat:
|
||||
messages: "訊息"
|
||||
noMessagesYet: "尚無訊息"
|
||||
newMessage: "新訊息"
|
||||
individualChat: "ㄧ對一聊天室"
|
||||
@@ -1469,6 +1548,8 @@ _settings:
|
||||
showUrlPreview: "顯示網址預覽"
|
||||
showAvailableReactionsFirstInNote: "將可用的反應顯示在頂部"
|
||||
showPageTabBarBottom: "在底部顯示頁面的標籤列"
|
||||
emojiPaletteBanner: "可以將固定顯示在表情符號選擇器的預設項目註冊為調色盤,或者自訂選擇器的顯示方式。"
|
||||
enableAnimatedImages: "啟用動畫圖片"
|
||||
_chat:
|
||||
showSenderName: "顯示發送者的名稱"
|
||||
sendOnEnter: "按下 Enter 發送訊息"
|
||||
@@ -1477,6 +1558,8 @@ _preferencesProfile:
|
||||
profileNameDescription: "設定一個名稱來識別此裝置。"
|
||||
profileNameDescription2: "例如:「主要個人電腦」、「智慧型手機」等"
|
||||
manageProfiles: "管理個人檔案"
|
||||
shareSameProfileBetweenDevicesIsNotRecommended: "不建議在多個裝置上共用同一個設定檔。"
|
||||
useSyncBetweenDevicesOptionIfYouWantToSyncSetting: "如果您希望在多個裝置之間同步某些設定項目,請分別啟用「跨裝置同步」選項。"
|
||||
_preferencesBackup:
|
||||
autoBackup: "自動備份"
|
||||
restoreFromBackup: "從備份還原"
|
||||
@@ -1486,6 +1569,7 @@ _preferencesBackup:
|
||||
youNeedToNameYourProfileToEnableAutoBackup: "要啟用自動備份,必須設定檔案名稱。"
|
||||
autoPreferencesBackupIsNotEnabledForThisDevice: "此裝置未啟用自動備份設定。"
|
||||
backupFound: "找到設定的備份"
|
||||
forceBackup: "強制備份設定"
|
||||
_accountSettings:
|
||||
requireSigninToViewContents: "須登入以顯示內容"
|
||||
requireSigninToViewContentsDescription1: "必須登入才會顯示您建立的貼文等內容。可望有效防止資訊被爬蟲蒐集。"
|
||||
@@ -1991,6 +2075,7 @@ _role:
|
||||
canManageAvatarDecorations: "管理頭像裝飾"
|
||||
driveCapacity: "雲端硬碟容量"
|
||||
maxFileSize: "可上傳的最大檔案大小"
|
||||
maxFileSize_caption: "前端可能還有其他設定值,例如反向代理或 CDN。"
|
||||
alwaysMarkNsfw: "總是將檔案標記為NSFW"
|
||||
canUpdateBioMedia: "允許更新大頭貼和橫幅"
|
||||
pinMax: "置頂貼文的最大數量"
|
||||
@@ -2018,6 +2103,7 @@ _role:
|
||||
uploadableFileTypes_caption: "請指定 MIME 類型。可以用換行區隔多個類型,也可以使用星號(*)作為萬用字元進行指定。(例如:image/*)\n"
|
||||
uploadableFileTypes_caption2: "有些檔案可能無法判斷其類型。若要允許這類檔案,請在指定中加入 {x}。"
|
||||
noteDraftLimit: "伺服器端可建立的貼文草稿數量上限\n"
|
||||
scheduledNoteLimit: "同時建立的排定發布數量"
|
||||
watermarkAvailable: "浮水印功能是否可用"
|
||||
_condition:
|
||||
roleAssignedTo: "手動指派角色完成"
|
||||
@@ -2238,7 +2324,7 @@ _theme:
|
||||
buttonHoverBg: "按鈕背景 (漂浮)"
|
||||
inputBorder: "輸入框邊框"
|
||||
badge: "徽章"
|
||||
messageBg: "私訊背景"
|
||||
messageBg: "聊天的背景"
|
||||
fgHighlighted: "突顯文字"
|
||||
_sfx:
|
||||
note: "貼文"
|
||||
@@ -2408,6 +2494,7 @@ _auth:
|
||||
scopeUser: "以下列使用者身分操作"
|
||||
pleaseLogin: "必須登入以提供應用程式的存取權限。"
|
||||
byClickingYouWillBeRedirectedToThisUrl: "如果授予存取權限,就會自動導向到以下的網址"
|
||||
alreadyAuthorized: "此應用程式已被授予存取權限。"
|
||||
_antennaSources:
|
||||
all: "全部貼文"
|
||||
homeTimeline: "來自已追隨使用者的貼文"
|
||||
@@ -2498,6 +2585,20 @@ _postForm:
|
||||
replyPlaceholder: "回覆此貼文..."
|
||||
quotePlaceholder: "引用此貼文..."
|
||||
channelPlaceholder: "發佈到頻道"
|
||||
showHowToUse: "顯示表單說明"
|
||||
_howToUse:
|
||||
content_title: "內文"
|
||||
content_description: "請輸入要發布的內容。"
|
||||
toolbar_title: "工具列"
|
||||
toolbar_description: "可以附加檔案或票選活動、設定註解與標籤、插入表情符號或提及等。"
|
||||
account_title: "帳號選單"
|
||||
account_description: "可以切換要發布的帳號,並查看該帳號所儲存的草稿與預約發布列表。"
|
||||
visibility_title: "可見性"
|
||||
visibility_description: "可以設定貼文的公開範圍。"
|
||||
menu_title: "選單"
|
||||
menu_description: "可以進行其他操作,例如儲存為草稿、預約發佈貼文、或設定反應等。\n"
|
||||
submit_title: "貼文按鈕"
|
||||
submit_description: "發布貼文。也可以使用 Ctrl + Enter 或 Cmd + Enter 來發布。"
|
||||
_placeholders:
|
||||
a: "今天過得如何?"
|
||||
b: "有什麼新鮮事嗎?"
|
||||
@@ -2607,7 +2708,7 @@ _pages:
|
||||
hideTitleWhenPinned: "被置頂於個人資料時隱藏頁面標題"
|
||||
font: "字型"
|
||||
fontSerif: "襯線體"
|
||||
fontSansSerif: "黑體"
|
||||
fontSansSerif: "無襯線體"
|
||||
eyeCatchingImageSet: "設定封面影像"
|
||||
eyeCatchingImageRemove: "刪除封面影像"
|
||||
chooseBlock: "新增方塊"
|
||||
@@ -2643,6 +2744,8 @@ _notification:
|
||||
youReceivedFollowRequest: "您有新的追隨請求"
|
||||
yourFollowRequestAccepted: "您的追隨請求已被核准"
|
||||
pollEnded: "問卷調查已產生結果"
|
||||
scheduledNotePosted: "已排定發布貼文"
|
||||
scheduledNotePostFailed: "排定發布貼文失敗了"
|
||||
newNote: "新的貼文"
|
||||
unreadAntennaNote: "天線 {name}"
|
||||
roleAssigned: "已授予角色"
|
||||
@@ -2672,6 +2775,8 @@ _notification:
|
||||
quote: "引用"
|
||||
reaction: "反應"
|
||||
pollEnded: "問卷調查結束"
|
||||
scheduledNotePosted: "預約發佈成功"
|
||||
scheduledNotePostFailed: "預約發佈失敗"
|
||||
receiveFollowRequest: "已收到追隨請求"
|
||||
followRequestAccepted: "追隨請求已接受"
|
||||
roleAssigned: "已授予角色"
|
||||
@@ -2771,6 +2876,8 @@ _abuseReport:
|
||||
notifiedWebhook: "使用的 Webhook"
|
||||
deleteConfirm: "確定要刪除通知對象嗎?"
|
||||
_moderationLogTypes:
|
||||
clearQueue: "清除佇列"
|
||||
promoteQueue: "重新嘗試排程中的工作"
|
||||
createRole: "新增角色"
|
||||
deleteRole: "刪除角色 "
|
||||
updateRole: "更新角色設定"
|
||||
@@ -3141,7 +3248,7 @@ _uploader:
|
||||
abortConfirm: "有些檔案尚未上傳,您要中止嗎?"
|
||||
doneConfirm: "有些檔案尚未上傳,是否要完成上傳?"
|
||||
maxFileSizeIsX: "可上傳的最大檔案大小為 {x}。"
|
||||
allowedTypes: "可上傳的檔案類型"
|
||||
allowedTypes: "可上傳的檔案類型。"
|
||||
tip: "檔案尚未上傳。您可以在此對話框中進行上傳前的確認、重新命名、壓縮、裁切等操作。準備完成後,請點選「上傳」按鈕開始上傳。\n"
|
||||
_clientPerformanceIssueTip:
|
||||
title: "如果覺得電池消耗過快的話"
|
||||
@@ -3165,10 +3272,13 @@ _watermarkEditor:
|
||||
title: "編輯浮水印"
|
||||
cover: "覆蓋整體"
|
||||
repeat: "佈局"
|
||||
preserveBoundingRect: "調整使其在旋轉時不會突出"
|
||||
opacity: "透明度"
|
||||
scale: "大小"
|
||||
text: "文字"
|
||||
qr: "二維條碼"
|
||||
position: "位置"
|
||||
margin: "邊界"
|
||||
type: "類型"
|
||||
image: "圖片"
|
||||
advanced: "進階"
|
||||
@@ -3183,17 +3293,22 @@ _watermarkEditor:
|
||||
polkadotSubDotOpacity: "子圓點的不透明度"
|
||||
polkadotSubDotRadius: "子圓點的尺寸"
|
||||
polkadotSubDotDivisions: "子圓點的數量"
|
||||
leaveBlankToAccountUrl: "若留空則使用帳戶的 URL"
|
||||
failedToLoadImage: "圖片載入失敗"
|
||||
_imageEffector:
|
||||
title: "特效"
|
||||
addEffect: "新增特效"
|
||||
discardChangesConfirm: "捨棄更改並退出嗎?"
|
||||
nothingToConfigure: "無可設定的項目"
|
||||
failedToLoadImage: "圖片載入失敗"
|
||||
_fxs:
|
||||
chromaticAberration: "色差"
|
||||
glitch: "異常雜訊效果"
|
||||
mirror: "鏡像"
|
||||
invert: "反轉色彩"
|
||||
grayscale: "黑白"
|
||||
blur: "模糊"
|
||||
pixelate: "馬賽克"
|
||||
colorAdjust: "色彩校正"
|
||||
colorClamp: "壓縮色彩"
|
||||
colorClampAdvanced: "壓縮色彩(進階)"
|
||||
@@ -3205,10 +3320,14 @@ _imageEffector:
|
||||
checker: "棋盤格"
|
||||
blockNoise: "阻擋雜訊"
|
||||
tearing: "撕裂"
|
||||
fill: "填充"
|
||||
_fxProps:
|
||||
angle: "角度"
|
||||
scale: "大小"
|
||||
size: "大小"
|
||||
radius: "半徑"
|
||||
samples: "取樣數"
|
||||
offset: "位置"
|
||||
color: "顏色"
|
||||
opacity: "透明度"
|
||||
normalize: "正規化"
|
||||
@@ -3237,6 +3356,7 @@ _imageEffector:
|
||||
zoomLinesThreshold: "集中線的寬度"
|
||||
zoomLinesMaskSize: "中心直徑"
|
||||
zoomLinesBlack: "變成黑色"
|
||||
circle: "圓形"
|
||||
drafts: "草稿\n"
|
||||
_drafts:
|
||||
select: "選擇草槁"
|
||||
@@ -3252,3 +3372,22 @@ _drafts:
|
||||
restoreFromDraft: "從草稿復原\n"
|
||||
restore: "還原"
|
||||
listDrafts: "草稿清單"
|
||||
schedule: "排定發布"
|
||||
listScheduledNotes: "排定發布列表"
|
||||
cancelSchedule: "解除排定"
|
||||
qr: "二維條碼"
|
||||
_qr:
|
||||
showTabTitle: "檢視"
|
||||
readTabTitle: "讀取"
|
||||
shareTitle: "{name} {acct}"
|
||||
shareText: "請在聯邦宇宙追隨我吧!"
|
||||
chooseCamera: "選擇相機"
|
||||
cannotToggleFlash: "無法切換閃光燈"
|
||||
turnOnFlash: "開啟閃光燈"
|
||||
turnOffFlash: "關閉閃光燈"
|
||||
startQr: "啟動條碼掃描器"
|
||||
stopQr: "停止條碼掃描器"
|
||||
noQrCodeFound: "找不到 QR code"
|
||||
scanFile: "掃描在裝置上的影像"
|
||||
raw: "文字"
|
||||
mfm: "MFM"
|
||||
|
||||
70
package.json
70
package.json
@@ -1,32 +1,36 @@
|
||||
{
|
||||
"name": "misskey",
|
||||
"version": "2025.9.0-alpha.2",
|
||||
"version": "2025.12.0",
|
||||
"codename": "nasubi",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/misskey-dev/misskey.git"
|
||||
},
|
||||
"packageManager": "pnpm@10.15.0",
|
||||
"packageManager": "pnpm@10.24.0",
|
||||
"workspaces": [
|
||||
"packages/frontend-shared",
|
||||
"packages/frontend",
|
||||
"packages/frontend-embed",
|
||||
"packages/icons-subsetter",
|
||||
"packages/backend",
|
||||
"packages/sw",
|
||||
"packages/misskey-js",
|
||||
"packages/i18n",
|
||||
"packages/misskey-reversi",
|
||||
"packages/misskey-bubble-game"
|
||||
"packages/misskey-bubble-game",
|
||||
"packages/icons-subsetter",
|
||||
"packages/frontend-shared",
|
||||
"packages/frontend-builder",
|
||||
"packages/sw",
|
||||
"packages/backend",
|
||||
"packages/frontend",
|
||||
"packages/frontend-embed"
|
||||
],
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"compile-config": "cd packages/backend && pnpm compile-config",
|
||||
"build-pre": "node ./scripts/build-pre.js",
|
||||
"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 --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": "ncp ./.github/misskey/test.yml ./.config/test.yml && cd packages/backend && cross-env NODE_ENV=test node ./built/boot/entry.js",
|
||||
"start": "pnpm check:connect && cd packages/backend && pnpm compile-config && node ./built/boot/entry.js",
|
||||
"start:inspect": "cd packages/backend && pnpm compile-config && node --inspect ./built/boot/entry.js",
|
||||
"start:test": "ncp ./.github/misskey/test.yml ./.config/test.yml && cd packages/backend && cross-env NODE_ENV=test pnpm compile-config && cross-env NODE_ENV=test node ./built/boot/entry.js",
|
||||
"cli": "cd packages/backend && pnpm cli",
|
||||
"init": "pnpm migrate",
|
||||
"migrate": "cd packages/backend && pnpm migrate",
|
||||
@@ -53,31 +57,32 @@
|
||||
"lodash": "4.17.21"
|
||||
},
|
||||
"dependencies": {
|
||||
"cssnano": "7.1.1",
|
||||
"esbuild": "0.25.9",
|
||||
"cssnano": "7.1.2",
|
||||
"esbuild": "0.27.0",
|
||||
"execa": "9.6.0",
|
||||
"fast-glob": "3.3.3",
|
||||
"glob": "11.0.3",
|
||||
"ignore-walk": "7.0.0",
|
||||
"js-yaml": "4.1.0",
|
||||
"glob": "13.0.0",
|
||||
"ignore-walk": "8.0.0",
|
||||
"js-yaml": "4.1.1",
|
||||
"postcss": "8.5.6",
|
||||
"tar": "7.4.3",
|
||||
"terser": "5.43.1",
|
||||
"typescript": "5.9.2"
|
||||
"tar": "7.5.2",
|
||||
"terser": "5.44.1",
|
||||
"typescript": "5.9.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@misskey-dev/eslint-plugin": "2.1.0",
|
||||
"@eslint/js": "9.39.1",
|
||||
"@misskey-dev/eslint-plugin": "2.2.0",
|
||||
"@types/js-yaml": "4.0.9",
|
||||
"@types/node": "22.17.2",
|
||||
"@typescript-eslint/eslint-plugin": "8.40.0",
|
||||
"@typescript-eslint/parser": "8.40.0",
|
||||
"cross-env": "7.0.3",
|
||||
"cypress": "14.5.4",
|
||||
"eslint": "9.34.0",
|
||||
"globals": "16.3.0",
|
||||
"@types/node": "24.10.1",
|
||||
"@typescript-eslint/eslint-plugin": "8.47.0",
|
||||
"@typescript-eslint/parser": "8.47.0",
|
||||
"cross-env": "10.1.0",
|
||||
"cypress": "15.7.0",
|
||||
"eslint": "9.39.1",
|
||||
"globals": "16.5.0",
|
||||
"ncp": "2.0.0",
|
||||
"pnpm": "10.15.0",
|
||||
"start-server-and-test": "2.0.13"
|
||||
"pnpm": "10.24.0",
|
||||
"start-server-and-test": "2.1.3"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@tensorflow/tfjs-core": "4.22.0"
|
||||
@@ -86,8 +91,9 @@
|
||||
"overrides": {
|
||||
"@aiscript-dev/aiscript-languageserver": "-"
|
||||
},
|
||||
"patchedDependencies": {
|
||||
"typeorm": "patches/typeorm.patch"
|
||||
}
|
||||
"ignoredBuiltDependencies": [
|
||||
"@sentry-internal/node-cpu-profiler",
|
||||
"exifreader"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,12 +3,17 @@
|
||||
"jsc": {
|
||||
"parser": {
|
||||
"syntax": "typescript",
|
||||
"jsx": true,
|
||||
"dynamicImport": true,
|
||||
"decorators": true
|
||||
},
|
||||
"transform": {
|
||||
"legacyDecorator": true,
|
||||
"decoratorMetadata": true
|
||||
"decoratorMetadata": true,
|
||||
"react": {
|
||||
"runtime": "automatic",
|
||||
"importSource": "@kitajs/html"
|
||||
}
|
||||
},
|
||||
"experimental": {
|
||||
"keepImportAssertions": true
|
||||
|
||||
46
packages/backend/assets/misc/flush.js
Normal file
46
packages/backend/assets/misc/flush.js
Normal file
@@ -0,0 +1,46 @@
|
||||
(async () => {
|
||||
const msg = document.getElementById('msg');
|
||||
const successText = `\nSuccess Flush! <a href="/">Back to Misskey</a>\n成功しました。<a href="/">Misskeyを開き直してください。</a>`;
|
||||
|
||||
if (!document.cookie) {
|
||||
message('Your site data is fully cleared by your browser.');
|
||||
message(successText);
|
||||
} else {
|
||||
message('Your browser does not support Clear-Site-Data header. Start opportunistic flushing.');
|
||||
try {
|
||||
localStorage.clear();
|
||||
message('localStorage cleared.');
|
||||
|
||||
const idbPromises = ['MisskeyClient', 'keyval-store'].map((name, i, arr) => new Promise((res, rej) => {
|
||||
const delidb = indexedDB.deleteDatabase(name);
|
||||
delidb.onsuccess = () => res(message(`indexedDB "${name}" cleared. (${i + 1}/${arr.length})`));
|
||||
delidb.onerror = e => rej(e)
|
||||
}));
|
||||
|
||||
await Promise.all(idbPromises);
|
||||
|
||||
if (navigator.serviceWorker.controller) {
|
||||
navigator.serviceWorker.controller.postMessage('clear');
|
||||
await navigator.serviceWorker.getRegistrations()
|
||||
.then(registrations => {
|
||||
return Promise.all(registrations.map(registration => registration.unregister()));
|
||||
})
|
||||
.catch(e => { throw new Error(e) });
|
||||
}
|
||||
|
||||
message(successText);
|
||||
} catch (e) {
|
||||
message(`\n${e}\n\nFlush Failed. <a href="/flush">Please retry.</a>\n失敗しました。<a href="/flush">もう一度試してみてください。</a>`);
|
||||
message(`\nIf you retry more than 3 times, try manually clearing the browser cache or contact to instance admin.\n3回以上試しても失敗する場合、ブラウザのキャッシュを手動で消去し、それでもだめならインスタンス管理者に連絡してみてください。\n`)
|
||||
|
||||
console.error(e);
|
||||
setTimeout(() => {
|
||||
location = '/';
|
||||
}, 10000)
|
||||
}
|
||||
}
|
||||
|
||||
function message(text) {
|
||||
msg.insertAdjacentHTML('beforeend', `<p>[${(new Date()).toString()}] ${text.replace(/\n/g,'<br>')}</p>`)
|
||||
}
|
||||
})();
|
||||
35
packages/backend/assets/misc/info-card.css
Normal file
35
packages/backend/assets/misc/info-card.css
Normal file
@@ -0,0 +1,35 @@
|
||||
html,
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
min-height: 100vh;
|
||||
background: #fff;
|
||||
}
|
||||
|
||||
#a {
|
||||
display: block;
|
||||
}
|
||||
|
||||
#banner {
|
||||
background-size: cover;
|
||||
background-position: center center;
|
||||
}
|
||||
|
||||
#title {
|
||||
display: inline-block;
|
||||
margin: 24px;
|
||||
padding: 0.5em 0.8em;
|
||||
color: #fff;
|
||||
background: rgba(0, 0, 0, 0.5);
|
||||
font-weight: bold;
|
||||
font-size: 1.3em;
|
||||
}
|
||||
|
||||
#content {
|
||||
overflow: auto;
|
||||
color: #353c3e;
|
||||
}
|
||||
|
||||
#description {
|
||||
margin: 24px;
|
||||
}
|
||||
@@ -205,7 +205,7 @@ module.exports = {
|
||||
// Whether to use watchman for file crawling
|
||||
// watchman: true,
|
||||
|
||||
extensionsToTreatAsEsm: ['.ts'],
|
||||
extensionsToTreatAsEsm: ['.ts', '.tsx'],
|
||||
|
||||
testTimeout: 60000,
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@ const base = require('./jest.config.cjs')
|
||||
|
||||
module.exports = {
|
||||
...base,
|
||||
globalSetup: "<rootDir>/test/jest.setup.unit.cjs",
|
||||
testMatch: [
|
||||
"<rootDir>/test/unit/**/*.ts",
|
||||
"<rootDir>/src/**/*.test.ts",
|
||||
|
||||
@@ -10,7 +10,7 @@ const __dirname = path.dirname(__filename);
|
||||
|
||||
const args = [];
|
||||
args.push(...[
|
||||
...semver.satisfies(process.version, '^20.17.0 || ^22.0.0') ? ['--no-experimental-require-module'] : [],
|
||||
...semver.satisfies(process.version, '^20.17.0 || ^22.0.0 || ^24.10.0') ? ['--no-experimental-require-module'] : [],
|
||||
'--experimental-vm-modules',
|
||||
'--experimental-import-meta-resolve',
|
||||
path.join(__dirname, 'node_modules/jest/bin/jest.js'),
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"target": "es6",
|
||||
"module": "commonjs",
|
||||
"allowSyntheticDefaultImports": true
|
||||
},
|
||||
"exclude": [
|
||||
"node_modules",
|
||||
"jspm_packages",
|
||||
"tmp",
|
||||
"temp"
|
||||
]
|
||||
}
|
||||
@@ -3,14 +3,14 @@
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
import { isConcurrentIndexMigrationEnabled } from "./js/migration-config.js";
|
||||
const isConcurrentIndexMigrationEnabled = process.env.MISSKEY_MIGRATION_CREATE_INDEX_CONCURRENTLY === '1';
|
||||
|
||||
export class CompositeNoteIndex1745378064470 {
|
||||
name = 'CompositeNoteIndex1745378064470';
|
||||
transaction = isConcurrentIndexMigrationEnabled() ? false : undefined;
|
||||
transaction = isConcurrentIndexMigrationEnabled ? false : undefined;
|
||||
|
||||
async up(queryRunner) {
|
||||
const concurrently = isConcurrentIndexMigrationEnabled();
|
||||
const concurrently = isConcurrentIndexMigrationEnabled;
|
||||
|
||||
if (concurrently) {
|
||||
const hasValidIndex = await queryRunner.query(`SELECT indisvalid FROM pg_index INNER JOIN pg_class ON pg_index.indexrelid = pg_class.oid WHERE pg_class.relname = 'IDX_724b311e6f883751f261ebe378'`);
|
||||
@@ -29,7 +29,7 @@ export class CompositeNoteIndex1745378064470 {
|
||||
}
|
||||
|
||||
async down(queryRunner) {
|
||||
const mayConcurrently = isConcurrentIndexMigrationEnabled() ? 'CONCURRENTLY' : '';
|
||||
const mayConcurrently = isConcurrentIndexMigrationEnabled ? 'CONCURRENTLY' : '';
|
||||
await queryRunner.query(`DROP INDEX IF EXISTS "IDX_724b311e6f883751f261ebe378"`);
|
||||
await queryRunner.query(`CREATE INDEX ${mayConcurrently} "IDX_5b87d9d19127bd5d92026017a7" ON "note" ("userId")`);
|
||||
}
|
||||
|
||||
@@ -3,17 +3,15 @@
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
import {loadConfig} from "./js/migration-config.js";
|
||||
|
||||
export class MigrateSomeConfigFileSettingsToMeta1746949539915 {
|
||||
name = 'MigrateSomeConfigFileSettingsToMeta1746949539915'
|
||||
|
||||
async up(queryRunner) {
|
||||
const config = loadConfig();
|
||||
// $1 cannot be used in ALTER TABLE queries
|
||||
await queryRunner.query(`ALTER TABLE "meta" ADD "proxyRemoteFiles" boolean NOT NULL DEFAULT ${config.proxyRemoteFiles}`);
|
||||
await queryRunner.query(`ALTER TABLE "meta" ADD "signToActivityPubGet" boolean NOT NULL DEFAULT ${config.signToActivityPubGet}`);
|
||||
await queryRunner.query(`ALTER TABLE "meta" ADD "allowExternalApRedirect" boolean NOT NULL DEFAULT ${!config.disallowExternalApRedirect}`);
|
||||
await queryRunner.query(`ALTER TABLE "meta" ADD "proxyRemoteFiles" boolean NOT NULL DEFAULT TRUE`);
|
||||
await queryRunner.query(`ALTER TABLE "meta" ADD "signToActivityPubGet" boolean NOT NULL DEFAULT TRUE`);
|
||||
await queryRunner.query(`ALTER TABLE "meta" ADD "allowExternalApRedirect" boolean NOT NULL DEFAULT TRUE`);
|
||||
}
|
||||
|
||||
async down(queryRunner) {
|
||||
|
||||
16
packages/backend/migration/1757823175259-sensitive-ad.js
Normal file
16
packages/backend/migration/1757823175259-sensitive-ad.js
Normal file
@@ -0,0 +1,16 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
export class SensitiveAd1757823175259 {
|
||||
name = 'SensitiveAd1757823175259'
|
||||
|
||||
async up(queryRunner) {
|
||||
await queryRunner.query(`ALTER TABLE "ad" ADD "isSensitive" boolean NOT NULL DEFAULT false`);
|
||||
}
|
||||
|
||||
async down(queryRunner) {
|
||||
await queryRunner.query(`ALTER TABLE "ad" DROP COLUMN "isSensitive"`);
|
||||
}
|
||||
}
|
||||
24
packages/backend/migration/1758677617888-scheduled-post.js
Normal file
24
packages/backend/migration/1758677617888-scheduled-post.js
Normal file
@@ -0,0 +1,24 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
export class ScheduledPost1758677617888 {
|
||||
name = 'ScheduledPost1758677617888'
|
||||
|
||||
/**
|
||||
* @param {QueryRunner} queryRunner
|
||||
*/
|
||||
async up(queryRunner) {
|
||||
await queryRunner.query(`ALTER TABLE "note_draft" ADD "scheduledAt" TIMESTAMP WITH TIME ZONE`);
|
||||
await queryRunner.query(`ALTER TABLE "note_draft" ADD "isActuallyScheduled" boolean NOT NULL DEFAULT false`);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {QueryRunner} queryRunner
|
||||
*/
|
||||
async down(queryRunner) {
|
||||
await queryRunner.query(`ALTER TABLE "note_draft" DROP COLUMN "isActuallyScheduled"`);
|
||||
await queryRunner.query(`ALTER TABLE "note_draft" DROP COLUMN "scheduledAt"`);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
export class RoleBadgesRemoteUsers1760607435831 {
|
||||
name = 'RoleBadgesRemoteUsers1760607435831'
|
||||
|
||||
async up(queryRunner) {
|
||||
await queryRunner.query(`ALTER TABLE "meta" ADD "showRoleBadgesOfRemoteUsers" boolean NOT NULL DEFAULT false`);
|
||||
}
|
||||
|
||||
async down(queryRunner) {
|
||||
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "showRoleBadgesOfRemoteUsers"`);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
export class UnnecessaryNullDefault1760790899857 {
|
||||
name = 'UnnecessaryNullDefault1760790899857'
|
||||
|
||||
/**
|
||||
* @param {QueryRunner} queryRunner
|
||||
*/
|
||||
async up(queryRunner) {
|
||||
await queryRunner.query(`ALTER TABLE "abuse_report_notification_recipient" ALTER COLUMN "userId" DROP DEFAULT`);
|
||||
await queryRunner.query(`ALTER TABLE "abuse_report_notification_recipient" ALTER COLUMN "systemWebhookId" DROP DEFAULT`);
|
||||
await queryRunner.query(`ALTER TABLE "meta" ALTER COLUMN "urlPreviewUserAgent" DROP DEFAULT`);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {QueryRunner} queryRunner
|
||||
*/
|
||||
async down(queryRunner) {
|
||||
await queryRunner.query(`ALTER TABLE "meta" ALTER COLUMN "urlPreviewUserAgent" SET DEFAULT NULL`);
|
||||
await queryRunner.query(`ALTER TABLE "abuse_report_notification_recipient" ALTER COLUMN "systemWebhookId" SET DEFAULT NULL`);
|
||||
await queryRunner.query(`ALTER TABLE "abuse_report_notification_recipient" ALTER COLUMN "userId" SET DEFAULT NULL`);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
export class AddChannelMuting1761569941833 {
|
||||
name = 'AddChannelMuting1761569941833'
|
||||
|
||||
/**
|
||||
* @param {QueryRunner} queryRunner
|
||||
*/
|
||||
async up(queryRunner) {
|
||||
await queryRunner.query(`CREATE TABLE "channel_muting" ("id" character varying(32) NOT NULL, "userId" character varying(32) NOT NULL, "channelId" character varying(32) NOT NULL, "expiresAt" TIMESTAMP WITH TIME ZONE, CONSTRAINT "PK_aec842e98f332ebd8e12f85bad6" PRIMARY KEY ("id"))`);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_34415e3062ae7a94617496e81c" ON "channel_muting" ("userId") `);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_4d534d7177fc59879d942e96d0" ON "channel_muting" ("channelId") `);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_6dd314e96806b7df65ddadff72" ON "channel_muting" ("expiresAt") `);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_b96870ed326ccc7fa243970965" ON "channel_muting" ("userId", "channelId") `);
|
||||
await queryRunner.query(`ALTER TABLE "note" ADD "renoteChannelId" character varying(32)`);
|
||||
await queryRunner.query(`COMMENT ON COLUMN "note"."renoteChannelId" IS '[Denormalized]'`);
|
||||
await queryRunner.query(`ALTER TABLE "channel_muting" ADD CONSTRAINT "FK_34415e3062ae7a94617496e81c5" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||
await queryRunner.query(`ALTER TABLE "channel_muting" ADD CONSTRAINT "FK_4d534d7177fc59879d942e96d03" FOREIGN KEY ("channelId") REFERENCES "channel"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {QueryRunner} queryRunner
|
||||
*/
|
||||
async down(queryRunner) {
|
||||
await queryRunner.query(`ALTER TABLE "channel_muting" DROP CONSTRAINT "FK_4d534d7177fc59879d942e96d03"`);
|
||||
await queryRunner.query(`ALTER TABLE "channel_muting" DROP CONSTRAINT "FK_34415e3062ae7a94617496e81c5"`);
|
||||
await queryRunner.query(`COMMENT ON COLUMN "note"."renoteChannelId" IS '[Denormalized]'`);
|
||||
await queryRunner.query(`ALTER TABLE "note" DROP COLUMN "renoteChannelId"`);
|
||||
await queryRunner.query(`DROP INDEX "public"."IDX_b96870ed326ccc7fa243970965"`);
|
||||
await queryRunner.query(`DROP INDEX "public"."IDX_6dd314e96806b7df65ddadff72"`);
|
||||
await queryRunner.query(`DROP INDEX "public"."IDX_4d534d7177fc59879d942e96d0"`);
|
||||
await queryRunner.query(`DROP INDEX "public"."IDX_34415e3062ae7a94617496e81c"`);
|
||||
await queryRunner.query(`DROP TABLE "channel_muting"`);
|
||||
}
|
||||
}
|
||||
@@ -1,31 +0,0 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
import { path as configYamlPath } from '../../built/config.js';
|
||||
import * as yaml from 'js-yaml';
|
||||
import fs from "node:fs";
|
||||
|
||||
export function isConcurrentIndexMigrationEnabled() {
|
||||
return process.env.MISSKEY_MIGRATION_CREATE_INDEX_CONCURRENTLY === '1';
|
||||
}
|
||||
|
||||
let loadedConfigCache = undefined;
|
||||
|
||||
function loadConfigInternal() {
|
||||
const config = yaml.load(fs.readFileSync(configYamlPath, 'utf-8'));
|
||||
|
||||
return {
|
||||
disallowExternalApRedirect: Boolean(config.disallowExternalApRedirect ?? false),
|
||||
proxyRemoteFiles: Boolean(config.proxyRemoteFiles ?? false),
|
||||
signToActivityPubGet: Boolean(config.signToActivityPubGet ?? true),
|
||||
}
|
||||
}
|
||||
|
||||
export function loadConfig() {
|
||||
if (loadedConfigCache === undefined) {
|
||||
loadedConfigCache = loadConfigInternal();
|
||||
}
|
||||
return loadedConfigCache;
|
||||
}
|
||||
@@ -1,7 +1,8 @@
|
||||
import { DataSource } from 'typeorm';
|
||||
import { loadConfig } from './built/config.js';
|
||||
import { entities } from './built/postgres.js';
|
||||
import { isConcurrentIndexMigrationEnabled } from "./migration/js/migration-config.js";
|
||||
|
||||
const isConcurrentIndexMigrationEnabled = process.env.MISSKEY_MIGRATION_CREATE_INDEX_CONCURRENTLY === '1';
|
||||
|
||||
const config = loadConfig();
|
||||
|
||||
@@ -15,5 +16,5 @@ export default new DataSource({
|
||||
extra: config.db.extra,
|
||||
entities: entities,
|
||||
migrations: ['migration/*.js'],
|
||||
migrationsTransactionMode: isConcurrentIndexMigrationEnabled() ? 'each' : 'all',
|
||||
migrationsTransactionMode: isConcurrentIndexMigrationEnabled ? 'each' : 'all',
|
||||
});
|
||||
|
||||
@@ -4,52 +4,54 @@
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"engines": {
|
||||
"node": "^22.15.0"
|
||||
"node": "^22.15.0 || ^24.10.0"
|
||||
},
|
||||
"scripts": {
|
||||
"start": "node ./built/boot/entry.js",
|
||||
"start:test": "cross-env NODE_ENV=test node ./built/boot/entry.js",
|
||||
"migrate": "pnpm typeorm migration:run -d ormconfig.js",
|
||||
"revert": "pnpm typeorm migration:revert -d ormconfig.js",
|
||||
"cli": "node ./built/boot/cli.js",
|
||||
"check:connect": "node ./scripts/check_connect.js",
|
||||
"start": "pnpm compile-config && node ./built/boot/entry.js",
|
||||
"start:inspect": "pnpm compile-config && node --inspect ./built/boot/entry.js",
|
||||
"start:test": "cross-env NODE_ENV=test pnpm compile-config && cross-env NODE_ENV=test node ./built/boot/entry.js",
|
||||
"migrate": "pnpm compile-config && pnpm typeorm migration:run -d ormconfig.js",
|
||||
"revert": "pnpm compile-config && pnpm typeorm migration:revert -d ormconfig.js",
|
||||
"cli": "pnpm compile-config && node ./built/boot/cli.js",
|
||||
"check:connect": "pnpm compile-config && node ./scripts/check_connect.js",
|
||||
"compile-config": "node ./scripts/compile_config.js",
|
||||
"build": "swc src -d built -D --strip-leading-paths",
|
||||
"build:test": "swc test-server -d built-test -D --config-file test-server/.swcrc --strip-leading-paths",
|
||||
"watch:swc": "swc src -d built -D -w --strip-leading-paths",
|
||||
"build:tsc": "tsc -p tsconfig.json && tsc-alias -p tsconfig.json",
|
||||
"watch": "node ./scripts/watch.mjs",
|
||||
"watch": "pnpm compile-config && node ./scripts/watch.mjs",
|
||||
"restart": "pnpm build && pnpm start",
|
||||
"dev": "node ./scripts/dev.mjs",
|
||||
"dev": "pnpm compile-config && node ./scripts/dev.mjs",
|
||||
"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 ./jest.js --forceExit --config jest.config.unit.cjs",
|
||||
"jest:e2e": "cross-env NODE_ENV=test node ./jest.js --forceExit --config jest.config.e2e.cjs",
|
||||
"jest:fed": "node ./jest.js --forceExit --config jest.config.fed.cjs",
|
||||
"jest-and-coverage": "cross-env NODE_ENV=test node ./jest.js --coverage --forceExit --config jest.config.unit.cjs",
|
||||
"jest-and-coverage:e2e": "cross-env NODE_ENV=test node ./jest.js --coverage --forceExit --config jest.config.e2e.cjs",
|
||||
"jest-clear": "cross-env NODE_ENV=test node ./jest.js --clearCache",
|
||||
"jest": "cross-env NODE_ENV=test pnpm compile-config && cross-env NODE_ENV=test node ./jest.js --forceExit --config jest.config.unit.cjs",
|
||||
"jest:e2e": "cross-env NODE_ENV=test pnpm compile-config && cross-env NODE_ENV=test node ./jest.js --forceExit --config jest.config.e2e.cjs",
|
||||
"jest:fed": "pnpm compile-config && node ./jest.js --forceExit --config jest.config.fed.cjs",
|
||||
"jest-and-coverage": "cross-env NODE_ENV=test pnpm compile-config && cross-env NODE_ENV=test node ./jest.js --coverage --forceExit --config jest.config.unit.cjs",
|
||||
"jest-and-coverage:e2e": "cross-env NODE_ENV=test pnpm compile-config && cross-env NODE_ENV=test node ./jest.js --coverage --forceExit --config jest.config.e2e.cjs",
|
||||
"jest-clear": "cross-env NODE_ENV=test pnpm compile-config && cross-env NODE_ENV=test node ./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",
|
||||
"check-migrations": "node scripts/check_migrations_clean.js",
|
||||
"generate-api-json": "node ./scripts/generate_api_json.js"
|
||||
"generate-api-json": "pnpm compile-config && node ./scripts/generate_api_json.js"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@swc/core-android-arm64": "1.3.11",
|
||||
"@swc/core-darwin-arm64": "1.13.4",
|
||||
"@swc/core-darwin-x64": "1.13.4",
|
||||
"@swc/core-darwin-arm64": "1.15.3",
|
||||
"@swc/core-darwin-x64": "1.15.3",
|
||||
"@swc/core-freebsd-x64": "1.3.11",
|
||||
"@swc/core-linux-arm-gnueabihf": "1.13.4",
|
||||
"@swc/core-linux-arm64-gnu": "1.13.4",
|
||||
"@swc/core-linux-arm64-musl": "1.13.4",
|
||||
"@swc/core-linux-x64-gnu": "1.13.4",
|
||||
"@swc/core-linux-x64-musl": "1.13.4",
|
||||
"@swc/core-win32-arm64-msvc": "1.13.4",
|
||||
"@swc/core-win32-ia32-msvc": "1.13.4",
|
||||
"@swc/core-win32-x64-msvc": "1.13.4",
|
||||
"@swc/core-linux-arm-gnueabihf": "1.15.3",
|
||||
"@swc/core-linux-arm64-gnu": "1.15.3",
|
||||
"@swc/core-linux-arm64-musl": "1.15.3",
|
||||
"@swc/core-linux-x64-gnu": "1.15.3",
|
||||
"@swc/core-linux-x64-musl": "1.15.3",
|
||||
"@swc/core-win32-arm64-msvc": "1.15.3",
|
||||
"@swc/core-win32-ia32-msvc": "1.15.3",
|
||||
"@swc/core-win32-x64-msvc": "1.15.3",
|
||||
"@tensorflow/tfjs": "4.22.0",
|
||||
"@tensorflow/tfjs-node": "4.22.0",
|
||||
"bufferutil": "4.0.9",
|
||||
@@ -69,120 +71,113 @@
|
||||
"utf-8-validate": "6.0.5"
|
||||
},
|
||||
"dependencies": {
|
||||
"@aws-sdk/client-s3": "3.873.0",
|
||||
"@aws-sdk/lib-storage": "3.873.0",
|
||||
"@aws-sdk/client-s3": "3.940.0",
|
||||
"@aws-sdk/lib-storage": "3.940.0",
|
||||
"@discordapp/twemoji": "16.0.1",
|
||||
"@fastify/accepts": "5.0.2",
|
||||
"@fastify/accepts": "5.0.3",
|
||||
"@fastify/cookie": "11.0.2",
|
||||
"@fastify/cors": "10.1.0",
|
||||
"@fastify/cors": "11.1.0",
|
||||
"@fastify/express": "4.0.2",
|
||||
"@fastify/http-proxy": "10.0.2",
|
||||
"@fastify/multipart": "9.0.3",
|
||||
"@fastify/static": "8.2.0",
|
||||
"@fastify/view": "10.0.2",
|
||||
"@fastify/http-proxy": "11.3.0",
|
||||
"@fastify/multipart": "9.3.0",
|
||||
"@fastify/static": "8.3.0",
|
||||
"@kitajs/html": "4.2.11",
|
||||
"@misskey-dev/sharp-read-bmp": "1.2.0",
|
||||
"@misskey-dev/summaly": "5.2.3",
|
||||
"@napi-rs/canvas": "0.1.77",
|
||||
"@nestjs/common": "11.1.6",
|
||||
"@nestjs/core": "11.1.6",
|
||||
"@nestjs/testing": "11.1.6",
|
||||
"@misskey-dev/summaly": "5.2.5",
|
||||
"@napi-rs/canvas": "0.1.83",
|
||||
"@nestjs/common": "11.1.9",
|
||||
"@nestjs/core": "11.1.9",
|
||||
"@nestjs/testing": "11.1.9",
|
||||
"@peertube/http-signature": "1.7.0",
|
||||
"@sentry/node": "8.55.0",
|
||||
"@sentry/profiling-node": "8.55.0",
|
||||
"@simplewebauthn/server": "12.0.0",
|
||||
"@sinonjs/fake-timers": "11.3.1",
|
||||
"@smithy/node-http-handler": "2.5.0",
|
||||
"@swc/cli": "0.7.8",
|
||||
"@swc/core": "1.13.4",
|
||||
"@sentry/node": "10.27.0",
|
||||
"@sentry/profiling-node": "10.27.0",
|
||||
"@simplewebauthn/server": "13.2.2",
|
||||
"@sinonjs/fake-timers": "15.0.0",
|
||||
"@smithy/node-http-handler": "4.4.5",
|
||||
"@swc/cli": "0.7.9",
|
||||
"@swc/core": "1.15.3",
|
||||
"@twemoji/parser": "16.0.0",
|
||||
"@types/redis-info": "3.0.3",
|
||||
"accepts": "1.3.8",
|
||||
"ajv": "8.17.1",
|
||||
"archiver": "7.0.1",
|
||||
"async-mutex": "0.5.0",
|
||||
"bcryptjs": "2.4.3",
|
||||
"bcryptjs": "3.0.3",
|
||||
"blurhash": "2.0.5",
|
||||
"body-parser": "1.20.3",
|
||||
"bullmq": "5.58.1",
|
||||
"body-parser": "2.2.1",
|
||||
"bullmq": "5.65.0",
|
||||
"cacheable-lookup": "7.0.0",
|
||||
"cbor": "9.0.2",
|
||||
"chalk": "5.6.0",
|
||||
"chalk-template": "1.1.0",
|
||||
"cbor": "10.0.11",
|
||||
"chalk": "5.6.2",
|
||||
"chalk-template": "1.1.2",
|
||||
"chokidar": "4.0.3",
|
||||
"cli-highlight": "2.1.11",
|
||||
"color-convert": "2.0.1",
|
||||
"content-disposition": "0.5.4",
|
||||
"date-fns": "2.30.0",
|
||||
"color-convert": "3.1.3",
|
||||
"content-disposition": "1.0.1",
|
||||
"date-fns": "4.1.0",
|
||||
"deep-email-validator": "0.1.21",
|
||||
"fastify": "5.5.0",
|
||||
"fastify": "5.6.2",
|
||||
"fastify-raw-body": "5.0.0",
|
||||
"feed": "4.2.2",
|
||||
"file-type": "19.6.0",
|
||||
"feed": "5.1.0",
|
||||
"file-type": "21.1.1",
|
||||
"fluent-ffmpeg": "2.1.3",
|
||||
"form-data": "4.0.4",
|
||||
"got": "14.4.7",
|
||||
"happy-dom": "16.8.1",
|
||||
"form-data": "4.0.5",
|
||||
"got": "14.6.5",
|
||||
"hpagent": "1.2.0",
|
||||
"htmlescape": "1.1.1",
|
||||
"http-link-header": "1.1.3",
|
||||
"ioredis": "5.7.0",
|
||||
"i18n": "workspace:*",
|
||||
"ioredis": "5.8.2",
|
||||
"ip-cidr": "4.0.2",
|
||||
"ipaddr.js": "2.2.0",
|
||||
"is-svg": "5.1.0",
|
||||
"js-yaml": "4.1.0",
|
||||
"jsdom": "26.1.0",
|
||||
"ipaddr.js": "2.3.0",
|
||||
"is-svg": "6.1.0",
|
||||
"json5": "2.2.3",
|
||||
"jsonld": "8.3.3",
|
||||
"jsonld": "9.0.0",
|
||||
"jsrsasign": "11.1.0",
|
||||
"juice": "11.0.1",
|
||||
"meilisearch": "0.52.0",
|
||||
"juice": "11.0.3",
|
||||
"meilisearch": "0.54.0",
|
||||
"mfm-js": "0.25.0",
|
||||
"microformats-parser": "2.0.4",
|
||||
"mime-types": "2.1.35",
|
||||
"mime-types": "3.0.2",
|
||||
"misskey-js": "workspace:*",
|
||||
"misskey-reversi": "workspace:*",
|
||||
"ms": "3.0.0-canary.1",
|
||||
"nanoid": "5.1.5",
|
||||
"ms": "3.0.0-canary.202508261828",
|
||||
"nanoid": "5.1.6",
|
||||
"nested-property": "4.0.0",
|
||||
"node-fetch": "3.3.2",
|
||||
"nodemailer": "6.10.1",
|
||||
"node-html-parser": "7.0.1",
|
||||
"nodemailer": "7.0.11",
|
||||
"nsfwjs": "4.2.0",
|
||||
"oauth": "0.10.2",
|
||||
"oauth2orize": "1.12.0",
|
||||
"oauth2orize-pkce": "0.1.2",
|
||||
"os-utils": "0.0.14",
|
||||
"otpauth": "9.4.1",
|
||||
"parse5": "7.3.0",
|
||||
"pg": "8.16.3",
|
||||
"pkce-challenge": "4.1.0",
|
||||
"pkce-challenge": "5.0.1",
|
||||
"probe-image-size": "7.2.3",
|
||||
"promise-limit": "2.7.0",
|
||||
"pug": "3.0.3",
|
||||
"qrcode": "1.5.4",
|
||||
"random-seed": "0.3.0",
|
||||
"ratelimiter": "3.4.1",
|
||||
"re2": "1.22.1",
|
||||
"re2": "1.22.3",
|
||||
"redis-info": "3.1.0",
|
||||
"redis-lock": "0.1.4",
|
||||
"reflect-metadata": "0.2.2",
|
||||
"rename": "1.0.4",
|
||||
"rss-parser": "3.13.0",
|
||||
"rxjs": "7.8.2",
|
||||
"sanitize-html": "2.17.0",
|
||||
"secure-json-parse": "3.0.2",
|
||||
"secure-json-parse": "4.1.0",
|
||||
"semver": "7.7.3",
|
||||
"sharp": "0.33.5",
|
||||
"semver": "7.7.2",
|
||||
"slacc": "0.0.10",
|
||||
"strict-event-emitter-types": "2.0.0",
|
||||
"stringz": "2.1.0",
|
||||
"systeminformation": "5.27.7",
|
||||
"systeminformation": "5.27.11",
|
||||
"tinycolor2": "1.6.0",
|
||||
"tmp": "0.2.5",
|
||||
"tsc-alias": "1.8.16",
|
||||
"tsconfig-paths": "4.2.0",
|
||||
"typeorm": "0.3.26",
|
||||
"typescript": "5.9.2",
|
||||
"ulid": "2.4.0",
|
||||
"typeorm": "0.3.27",
|
||||
"typescript": "5.9.3",
|
||||
"ulid": "3.0.1",
|
||||
"vary": "1.1.2",
|
||||
"web-push": "3.6.7",
|
||||
"ws": "8.18.3",
|
||||
@@ -190,59 +185,58 @@
|
||||
},
|
||||
"devDependencies": {
|
||||
"@jest/globals": "29.7.0",
|
||||
"@nestjs/platform-express": "10.4.20",
|
||||
"@sentry/vue": "9.46.0",
|
||||
"@kitajs/ts-html-plugin": "4.1.3",
|
||||
"@nestjs/platform-express": "11.1.9",
|
||||
"@sentry/vue": "10.27.0",
|
||||
"@simplewebauthn/types": "12.0.0",
|
||||
"@swc/jest": "0.2.39",
|
||||
"@types/accepts": "1.3.7",
|
||||
"@types/archiver": "6.0.3",
|
||||
"@types/bcryptjs": "2.4.6",
|
||||
"@types/archiver": "7.0.0",
|
||||
"@types/body-parser": "1.19.6",
|
||||
"@types/color-convert": "2.0.4",
|
||||
"@types/content-disposition": "0.5.9",
|
||||
"@types/fluent-ffmpeg": "2.1.27",
|
||||
"@types/htmlescape": "1.1.3",
|
||||
"@types/fluent-ffmpeg": "2.1.28",
|
||||
"@types/http-link-header": "1.0.7",
|
||||
"@types/jest": "29.5.14",
|
||||
"@types/js-yaml": "4.0.9",
|
||||
"@types/jsdom": "21.1.7",
|
||||
"@types/jsonld": "1.5.15",
|
||||
"@types/jsrsasign": "10.5.15",
|
||||
"@types/mime-types": "2.1.4",
|
||||
"@types/ms": "0.7.34",
|
||||
"@types/node": "22.17.2",
|
||||
"@types/nodemailer": "6.4.19",
|
||||
"@types/mime-types": "3.0.1",
|
||||
"@types/ms": "2.1.0",
|
||||
"@types/node": "24.10.1",
|
||||
"@types/nodemailer": "7.0.4",
|
||||
"@types/oauth": "0.9.6",
|
||||
"@types/oauth2orize": "1.11.5",
|
||||
"@types/oauth2orize-pkce": "0.1.2",
|
||||
"@types/pg": "8.15.5",
|
||||
"@types/pug": "2.0.10",
|
||||
"@types/qrcode": "1.5.5",
|
||||
"@types/pg": "8.15.6",
|
||||
"@types/qrcode": "1.5.6",
|
||||
"@types/random-seed": "0.3.5",
|
||||
"@types/ratelimiter": "3.4.6",
|
||||
"@types/rename": "1.0.7",
|
||||
"@types/sanitize-html": "2.16.0",
|
||||
"@types/semver": "7.7.0",
|
||||
"@types/semver": "7.7.1",
|
||||
"@types/simple-oauth2": "5.0.7",
|
||||
"@types/sinonjs__fake-timers": "8.1.5",
|
||||
"@types/sinonjs__fake-timers": "15.0.1",
|
||||
"@types/supertest": "6.0.3",
|
||||
"@types/tinycolor2": "1.4.6",
|
||||
"@types/tmp": "0.2.6",
|
||||
"@types/vary": "1.1.3",
|
||||
"@types/web-push": "3.6.4",
|
||||
"@types/ws": "8.18.1",
|
||||
"@typescript-eslint/eslint-plugin": "8.40.0",
|
||||
"@typescript-eslint/parser": "8.40.0",
|
||||
"@typescript-eslint/eslint-plugin": "8.48.0",
|
||||
"@typescript-eslint/parser": "8.48.0",
|
||||
"aws-sdk-client-mock": "4.1.0",
|
||||
"cross-env": "7.0.3",
|
||||
"cross-env": "10.1.0",
|
||||
"eslint-plugin-import": "2.32.0",
|
||||
"execa": "8.0.1",
|
||||
"fkill": "9.0.0",
|
||||
"execa": "9.6.0",
|
||||
"fkill": "10.0.1",
|
||||
"jest": "29.7.0",
|
||||
"jest-mock": "29.7.0",
|
||||
"nodemon": "3.1.10",
|
||||
"pid-port": "1.0.2",
|
||||
"jest-util": "29.7.0",
|
||||
"js-yaml": "4.1.1",
|
||||
"nodemon": "3.1.11",
|
||||
"pid-port": "2.0.0",
|
||||
"simple-oauth2": "5.1.0",
|
||||
"supertest": "7.1.4"
|
||||
"supertest": "7.1.4",
|
||||
"vite": "7.2.4"
|
||||
}
|
||||
}
|
||||
|
||||
54
packages/backend/scripts/compile_config.js
Normal file
54
packages/backend/scripts/compile_config.js
Normal file
@@ -0,0 +1,54 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
/**
|
||||
* YAMLファイルをJSONファイルに変換するスクリプト
|
||||
* ビルド前に実行し、ランタイムにjs-yamlを含まないようにする
|
||||
*/
|
||||
|
||||
import fs from 'node:fs';
|
||||
import { resolve, dirname } from 'node:path';
|
||||
import { fileURLToPath } from 'node:url';
|
||||
import yaml from 'js-yaml';
|
||||
|
||||
const _filename = fileURLToPath(import.meta.url);
|
||||
const _dirname = dirname(_filename);
|
||||
|
||||
const configDir = resolve(_dirname, '../../../.config');
|
||||
const OUTPUT_PATH = resolve(_dirname, '../../../built/.config.json');
|
||||
|
||||
// TODO: yamlのパースに失敗したときのエラーハンドリング
|
||||
|
||||
/**
|
||||
* YAMLファイルをJSONファイルに変換
|
||||
* @param {string} ymlPath - YAMLファイルのパス
|
||||
*/
|
||||
function yamlToJson(ymlPath) {
|
||||
if (!fs.existsSync(ymlPath)) {
|
||||
console.warn(`YAML file not found: ${ymlPath}`);
|
||||
return;
|
||||
}
|
||||
|
||||
console.log(`${ymlPath} → ${OUTPUT_PATH}`);
|
||||
|
||||
const yamlContent = fs.readFileSync(ymlPath, 'utf-8');
|
||||
const jsonContent = yaml.load(yamlContent);
|
||||
if (!fs.existsSync(dirname(OUTPUT_PATH))) {
|
||||
fs.mkdirSync(dirname(OUTPUT_PATH), { recursive: true });
|
||||
}
|
||||
fs.writeFileSync(OUTPUT_PATH, JSON.stringify({
|
||||
'_NOTE_': 'This file is auto-generated from YAML file. DO NOT EDIT.',
|
||||
...jsonContent,
|
||||
}), 'utf-8');
|
||||
}
|
||||
|
||||
if (process.env.MISSKEY_CONFIG_YML) {
|
||||
const customYmlPath = resolve(configDir, process.env.MISSKEY_CONFIG_YML);
|
||||
yamlToJson(customYmlPath);
|
||||
} else {
|
||||
yamlToJson(resolve(configDir, process.env.NODE_ENV === 'test' ? 'test.yml' : 'default.yml'));
|
||||
}
|
||||
|
||||
console.log('Configuration compiled ✓');
|
||||
@@ -42,7 +42,7 @@ async function killProc() {
|
||||
'./node_modules/nodemon/bin/nodemon.js',
|
||||
[
|
||||
'-w', 'src',
|
||||
'-e', 'ts,js,mjs,cjs,json,pug',
|
||||
'-e', 'ts,js,mjs,cjs,tsx,json,pug',
|
||||
'--exec', 'pnpm', 'run', 'build',
|
||||
],
|
||||
{
|
||||
|
||||
152
packages/backend/scripts/measure-memory.mjs
Normal file
152
packages/backend/scripts/measure-memory.mjs
Normal file
@@ -0,0 +1,152 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
/**
|
||||
* This script starts the Misskey backend server, waits for it to be ready,
|
||||
* measures memory usage, and outputs the result as JSON.
|
||||
*
|
||||
* Usage: node scripts/measure-memory.mjs
|
||||
*/
|
||||
|
||||
import { fork } from 'node:child_process';
|
||||
import { setTimeout } from 'node:timers/promises';
|
||||
import { fileURLToPath } from 'node:url';
|
||||
import { dirname, join } from 'node:path';
|
||||
|
||||
const __filename = fileURLToPath(import.meta.url);
|
||||
const __dirname = dirname(__filename);
|
||||
|
||||
const STARTUP_TIMEOUT = 120000; // 120 seconds timeout for server startup
|
||||
const MEMORY_SETTLE_TIME = 10000; // Wait 10 seconds after startup for memory to settle
|
||||
|
||||
async function measureMemory() {
|
||||
const startTime = Date.now();
|
||||
|
||||
// Start the Misskey backend server using fork to enable IPC
|
||||
const serverProcess = fork(join(__dirname, '../built/boot/entry.js'), [], {
|
||||
cwd: join(__dirname, '..'),
|
||||
env: {
|
||||
...process.env,
|
||||
NODE_ENV: 'test',
|
||||
},
|
||||
stdio: ['pipe', 'pipe', 'pipe', 'ipc'],
|
||||
});
|
||||
|
||||
let serverReady = false;
|
||||
|
||||
// Listen for the 'ok' message from the server indicating it's ready
|
||||
serverProcess.on('message', (message) => {
|
||||
if (message === 'ok') {
|
||||
serverReady = true;
|
||||
}
|
||||
});
|
||||
|
||||
// Handle server output
|
||||
serverProcess.stdout?.on('data', (data) => {
|
||||
process.stderr.write(`[server stdout] ${data}`);
|
||||
});
|
||||
|
||||
serverProcess.stderr?.on('data', (data) => {
|
||||
process.stderr.write(`[server stderr] ${data}`);
|
||||
});
|
||||
|
||||
// Handle server error
|
||||
serverProcess.on('error', (err) => {
|
||||
process.stderr.write(`[server error] ${err}\n`);
|
||||
});
|
||||
|
||||
// Wait for server to be ready or timeout
|
||||
const startupStartTime = Date.now();
|
||||
while (!serverReady) {
|
||||
if (Date.now() - startupStartTime > STARTUP_TIMEOUT) {
|
||||
serverProcess.kill('SIGTERM');
|
||||
throw new Error('Server startup timeout');
|
||||
}
|
||||
await setTimeout(100);
|
||||
}
|
||||
|
||||
const startupTime = Date.now() - startupStartTime;
|
||||
process.stderr.write(`Server started in ${startupTime}ms\n`);
|
||||
|
||||
// Wait for memory to settle
|
||||
await setTimeout(MEMORY_SETTLE_TIME);
|
||||
|
||||
// Get memory usage from the server process via /proc
|
||||
const pid = serverProcess.pid;
|
||||
let memoryInfo;
|
||||
|
||||
try {
|
||||
const fs = await import('node:fs/promises');
|
||||
|
||||
// Read /proc/[pid]/status for detailed memory info
|
||||
const status = await fs.readFile(`/proc/${pid}/status`, 'utf-8');
|
||||
const vmRssMatch = status.match(/VmRSS:\s+(\d+)\s+kB/);
|
||||
const vmDataMatch = status.match(/VmData:\s+(\d+)\s+kB/);
|
||||
const vmSizeMatch = status.match(/VmSize:\s+(\d+)\s+kB/);
|
||||
|
||||
memoryInfo = {
|
||||
rss: vmRssMatch ? parseInt(vmRssMatch[1], 10) * 1024 : null,
|
||||
heapUsed: vmDataMatch ? parseInt(vmDataMatch[1], 10) * 1024 : null,
|
||||
vmSize: vmSizeMatch ? parseInt(vmSizeMatch[1], 10) * 1024 : null,
|
||||
};
|
||||
} catch (err) {
|
||||
// Fallback: use ps command
|
||||
process.stderr.write(`Warning: Could not read /proc/${pid}/status: ${err}\n`);
|
||||
|
||||
const { execSync } = await import('node:child_process');
|
||||
try {
|
||||
const ps = execSync(`ps -o rss= -p ${pid}`, { encoding: 'utf-8' });
|
||||
const rssKb = parseInt(ps.trim(), 10);
|
||||
memoryInfo = {
|
||||
rss: rssKb * 1024,
|
||||
heapUsed: null,
|
||||
vmSize: null,
|
||||
};
|
||||
} catch {
|
||||
memoryInfo = {
|
||||
rss: null,
|
||||
heapUsed: null,
|
||||
vmSize: null,
|
||||
error: 'Could not measure memory',
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
// Stop the server
|
||||
serverProcess.kill('SIGTERM');
|
||||
|
||||
// Wait for process to exit
|
||||
let exited = false;
|
||||
await new Promise((resolve) => {
|
||||
serverProcess.on('exit', () => {
|
||||
exited = true;
|
||||
resolve(undefined);
|
||||
});
|
||||
// Force kill after 10 seconds if not exited
|
||||
setTimeout(10000).then(() => {
|
||||
if (!exited) {
|
||||
serverProcess.kill('SIGKILL');
|
||||
}
|
||||
resolve(undefined);
|
||||
});
|
||||
});
|
||||
|
||||
const result = {
|
||||
timestamp: new Date().toISOString(),
|
||||
startupTimeMs: startupTime,
|
||||
memory: memoryInfo,
|
||||
};
|
||||
|
||||
// Output as JSON to stdout
|
||||
console.log(JSON.stringify(result, null, 2));
|
||||
}
|
||||
|
||||
measureMemory().catch((err) => {
|
||||
console.error(JSON.stringify({
|
||||
error: err.message,
|
||||
timestamp: new Date().toISOString(),
|
||||
}));
|
||||
process.exit(1);
|
||||
});
|
||||
13
packages/backend/src/@types/redis-lock.d.ts
vendored
13
packages/backend/src/@types/redis-lock.d.ts
vendored
@@ -1,13 +0,0 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
declare module 'redis-lock' {
|
||||
import type Redis from 'ioredis';
|
||||
|
||||
type Lock = (lockName: string, timeout?: number, taskToPerform?: () => Promise<void>) => void;
|
||||
function redisLock(client: Redis.Redis, retryDelay: number): Lock;
|
||||
|
||||
export = redisLock;
|
||||
}
|
||||
@@ -10,8 +10,6 @@ import * as os from 'node:os';
|
||||
import cluster from 'node:cluster';
|
||||
import chalk from 'chalk';
|
||||
import chalkTemplate from 'chalk-template';
|
||||
import * as Sentry from '@sentry/node';
|
||||
import { nodeProfilingIntegration } from '@sentry/profiling-node';
|
||||
import Logger from '@/logger.js';
|
||||
import { loadConfig } from '@/config.js';
|
||||
import type { Config } from '@/config.js';
|
||||
@@ -41,7 +39,7 @@ function greet() {
|
||||
//#endregion
|
||||
|
||||
console.log(' Misskey is an open-source decentralized microblogging platform.');
|
||||
console.log(chalk.rgb(255, 136, 0)(' If you like Misskey, please donate to support development. https://www.patreon.com/syuilo'));
|
||||
console.log(chalk.rgb(255, 136, 0)(' If you like Misskey, please consider donating to support dev. https://misskey-hub.net/docs/donate/'));
|
||||
|
||||
console.log('');
|
||||
console.log(chalkTemplate`--- ${os.hostname()} {gray (PID: ${process.pid.toString()})} ---`);
|
||||
@@ -74,6 +72,9 @@ export async function masterMain() {
|
||||
bootLogger.succ('Misskey initialized');
|
||||
|
||||
if (config.sentryForBackend) {
|
||||
const Sentry = await import('@sentry/node');
|
||||
const { nodeProfilingIntegration } = await import('@sentry/profiling-node');
|
||||
|
||||
Sentry.init({
|
||||
integrations: [
|
||||
...(config.sentryForBackend.enableNodeProfiling ? [nodeProfilingIntegration()] : []),
|
||||
|
||||
@@ -4,8 +4,6 @@
|
||||
*/
|
||||
|
||||
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';
|
||||
@@ -17,6 +15,9 @@ export async function workerMain() {
|
||||
const config = loadConfig();
|
||||
|
||||
if (config.sentryForBackend) {
|
||||
const Sentry = await import('@sentry/node');
|
||||
const { nodeProfilingIntegration } = await import('@sentry/profiling-node');
|
||||
|
||||
Sentry.init({
|
||||
integrations: [
|
||||
...(config.sentryForBackend.enableNodeProfiling ? [nodeProfilingIntegration()] : []),
|
||||
|
||||
@@ -6,10 +6,11 @@
|
||||
import * as fs from 'node:fs';
|
||||
import { fileURLToPath } from 'node:url';
|
||||
import { dirname, resolve } from 'node:path';
|
||||
import * as yaml from 'js-yaml';
|
||||
import { type FastifyServerOptions } from 'fastify';
|
||||
import type * as Sentry from '@sentry/node';
|
||||
import type * as SentryVue from '@sentry/vue';
|
||||
import type { RedisOptions } from 'ioredis';
|
||||
import type { ManifestChunk } from 'vite';
|
||||
|
||||
type RedisOptionsSource = Partial<RedisOptions> & {
|
||||
host: string;
|
||||
@@ -27,6 +28,7 @@ type Source = {
|
||||
url?: string;
|
||||
port?: number;
|
||||
socket?: string;
|
||||
trustProxy?: FastifyServerOptions['trustProxy'];
|
||||
chmodSocket?: string;
|
||||
disableHsts?: boolean;
|
||||
db: {
|
||||
@@ -118,6 +120,7 @@ export type Config = {
|
||||
url: string;
|
||||
port: number;
|
||||
socket: string | undefined;
|
||||
trustProxy: FastifyServerOptions['trustProxy'];
|
||||
chmodSocket: string | undefined;
|
||||
disableHsts: boolean | undefined;
|
||||
db: {
|
||||
@@ -184,9 +187,9 @@ export type Config = {
|
||||
authUrl: string;
|
||||
driveUrl: string;
|
||||
userAgent: string;
|
||||
frontendEntry: { file: string | null };
|
||||
frontendEntry: ManifestChunk;
|
||||
frontendManifestExists: boolean;
|
||||
frontendEmbedEntry: { file: string | null };
|
||||
frontendEmbedEntry: ManifestChunk;
|
||||
frontendEmbedManifestExists: boolean;
|
||||
mediaProxy: string;
|
||||
externalMediaProxyEnabled: boolean;
|
||||
@@ -214,21 +217,15 @@ export type FulltextSearchProvider = 'sqlLike' | 'sqlPgroonga' | 'meilisearch';
|
||||
const _filename = fileURLToPath(import.meta.url);
|
||||
const _dirname = dirname(_filename);
|
||||
|
||||
/**
|
||||
* Path of configuration directory
|
||||
*/
|
||||
const dir = `${_dirname}/../../../.config`;
|
||||
const compiledConfigFilePathForTest = resolve(_dirname, '../../../built/._config_.json');
|
||||
|
||||
/**
|
||||
* Path of configuration file
|
||||
*/
|
||||
export const path = process.env.MISSKEY_CONFIG_YML
|
||||
? resolve(dir, process.env.MISSKEY_CONFIG_YML)
|
||||
: process.env.NODE_ENV === 'test'
|
||||
? resolve(dir, 'test.yml')
|
||||
: resolve(dir, 'default.yml');
|
||||
export const compiledConfigFilePath = fs.existsSync(compiledConfigFilePathForTest) ? compiledConfigFilePathForTest : resolve(_dirname, '../../../built/.config.json');
|
||||
|
||||
export function loadConfig(): Config {
|
||||
if (!fs.existsSync(compiledConfigFilePath)) {
|
||||
throw new Error('Compiled configuration file not found. Try running \'pnpm compile-config\'.');
|
||||
}
|
||||
|
||||
const meta = JSON.parse(fs.readFileSync(`${_dirname}/../../../built/meta.json`, 'utf-8'));
|
||||
|
||||
const frontendManifestExists = fs.existsSync(_dirname + '/../../../built/_frontend_vite_/manifest.json');
|
||||
@@ -240,7 +237,7 @@ export function loadConfig(): Config {
|
||||
JSON.parse(fs.readFileSync(`${_dirname}/../../../built/_frontend_embed_vite_/manifest.json`, 'utf-8'))
|
||||
: { 'src/boot.ts': { file: null } };
|
||||
|
||||
const config = yaml.load(fs.readFileSync(path, 'utf-8')) as Source;
|
||||
const config = JSON.parse(fs.readFileSync(compiledConfigFilePath, 'utf-8')) as Source;
|
||||
|
||||
const url = tryCreateUrl(config.url ?? process.env.MISSKEY_URL ?? '');
|
||||
const version = meta.version;
|
||||
@@ -266,6 +263,7 @@ export function loadConfig(): Config {
|
||||
url: url.origin,
|
||||
port: config.port ?? parseInt(process.env.PORT ?? '', 10),
|
||||
socket: config.socket,
|
||||
trustProxy: config.trustProxy,
|
||||
chmodSocket: config.chmodSocket,
|
||||
disableHsts: config.disableHsts,
|
||||
host,
|
||||
|
||||
@@ -7,11 +7,11 @@ import * as fs from 'node:fs';
|
||||
import { fileURLToPath } from 'node:url';
|
||||
import { dirname } from 'node:path';
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import * as nsfw from 'nsfwjs';
|
||||
import si from 'systeminformation';
|
||||
import { Mutex } from 'async-mutex';
|
||||
import fetch from 'node-fetch';
|
||||
import { bindThis } from '@/decorators.js';
|
||||
import type { NSFWJS, PredictionType } from 'nsfwjs';
|
||||
|
||||
const _filename = fileURLToPath(import.meta.url);
|
||||
const _dirname = dirname(_filename);
|
||||
@@ -21,7 +21,7 @@ let isSupportedCpu: undefined | boolean = undefined;
|
||||
|
||||
@Injectable()
|
||||
export class AiService {
|
||||
private model: nsfw.NSFWJS;
|
||||
private model: NSFWJS;
|
||||
private modelLoadMutex: Mutex = new Mutex();
|
||||
|
||||
constructor(
|
||||
@@ -29,7 +29,7 @@ export class AiService {
|
||||
}
|
||||
|
||||
@bindThis
|
||||
public async detectSensitive(source: string | Buffer): Promise<nsfw.PredictionType[] | null> {
|
||||
public async detectSensitive(source: string | Buffer): Promise<PredictionType[] | null> {
|
||||
try {
|
||||
if (isSupportedCpu === undefined) {
|
||||
isSupportedCpu = await this.computeIsSupportedCpu();
|
||||
@@ -44,6 +44,7 @@ export class AiService {
|
||||
tf.env().global.fetch = fetch;
|
||||
|
||||
if (this.model == null) {
|
||||
const nsfw = await import('nsfwjs');
|
||||
await this.modelLoadMutex.runExclusive(async () => {
|
||||
if (this.model == null) {
|
||||
this.model = await nsfw.load(`file://${_dirname}/../../nsfw-model/`, { size: 299 });
|
||||
|
||||
@@ -1,44 +0,0 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
import { promisify } from 'node:util';
|
||||
import { Inject, Injectable } from '@nestjs/common';
|
||||
import redisLock from 'redis-lock';
|
||||
import * as Redis from 'ioredis';
|
||||
import { DI } from '@/di-symbols.js';
|
||||
import { bindThis } from '@/decorators.js';
|
||||
|
||||
/**
|
||||
* Retry delay (ms) for lock acquisition
|
||||
*/
|
||||
const retryDelay = 100;
|
||||
|
||||
@Injectable()
|
||||
export class AppLockService {
|
||||
private lock: (key: string, timeout?: number, _?: (() => Promise<void>) | undefined) => Promise<() => void>;
|
||||
|
||||
constructor(
|
||||
@Inject(DI.redis)
|
||||
private redisClient: Redis.Redis,
|
||||
) {
|
||||
this.lock = promisify(redisLock(this.redisClient, retryDelay));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get AP Object lock
|
||||
* @param uri AP object ID
|
||||
* @param timeout Lock timeout (ms), The timeout releases previous lock.
|
||||
* @returns Unlock function
|
||||
*/
|
||||
@bindThis
|
||||
public getApLock(uri: string, timeout = 30 * 1000): Promise<() => void> {
|
||||
return this.lock(`ap-object:${uri}`, timeout);
|
||||
}
|
||||
|
||||
@bindThis
|
||||
public getChartInsertLock(lockKey: string, timeout = 30 * 1000): Promise<() => void> {
|
||||
return this.lock(`chart-insert:${lockKey}`, timeout);
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user