mirror of
https://github.com/misskey-dev/misskey
synced 2025-09-07 11:52:52 +02:00
Compare commits
245 commits
2025.8.0-a
...
develop
Author | SHA1 | Date | |
---|---|---|---|
|
430310f306 | ||
|
1e1eea521e | ||
|
86ad771221 | ||
|
057acf471e | ||
|
2bfe257879 | ||
|
6d75624aa8 | ||
|
369f0ec88a | ||
|
788c5660ba | ||
|
6cf1f86636 | ||
|
5b994b3e03 | ||
|
7b2abb7577 | ||
|
b681788315 | ||
|
279af1d72f | ||
|
9e188ca3fa | ||
|
de1b2223ff | ||
|
9b565728e7 | ||
|
a92fd8856a | ||
|
047773341d | ||
|
842670e100 | ||
|
ffc481a994 | ||
|
2ccf4f94cb | ||
|
3566bc207f | ||
|
4a0e968662 | ||
|
b1479ab1d8 | ||
|
18a9ccf7af | ||
|
959e72b2b3 | ||
|
a3d78b2f08 | ||
|
3c998e1f48 | ||
|
782c9f9852 | ||
|
d27c740ab0 | ||
|
08ecf7ca79 | ||
|
bdec4bf87a | ||
|
7000095b44 | ||
|
18e42cc83d | ||
|
11204eeb43 | ||
|
c95092903a | ||
|
21b2b9e5f8 | ||
|
665ec2c43c | ||
|
34bd840525 | ||
|
3d1cbcf094 | ||
|
5f5d88036f | ||
|
24739cd040 | ||
|
b491432daa | ||
|
ebe029458e | ||
|
d127d82c5b | ||
|
aabda5a956 | ||
|
bd5b38c9d9 | ||
|
647e03bf34 | ||
|
d16db7f311 | ||
|
ec4731dee4 | ||
|
65a4d77a7f | ||
|
328301ffc2 | ||
|
def148d7a6 | ||
|
aa85d701b9 | ||
|
f0833cffe9 | ||
|
9cd918f12b | ||
|
195a80622b | ||
|
8b347e23e3 | ||
|
bca3602da2 | ||
|
cfd4d7c57b | ||
|
084ccf5c9a | ||
|
fc1693f768 | ||
|
ff6f115976 | ||
|
8c2b96ad37 | ||
|
3e24419981 | ||
|
25c2007f59 | ||
|
2e4c4dd555 | ||
|
653cb116ea | ||
|
c9f363b215 | ||
|
e72da587e4 | ||
|
439337a108 | ||
|
5fef2332f4 | ||
|
40a325cbe7 | ||
|
5eff31383f | ||
|
575379a683 | ||
|
bf82b49633 | ||
|
87d09f255d | ||
|
98e07c3bd1 | ||
|
c5bb881438 | ||
|
ee96f77ef2 | ||
|
55eb18f5a6 | ||
|
aa8daca914 | ||
|
3e9118af3d | ||
|
25df56dfd0 | ||
|
231ccae006 | ||
|
2e0a34300a | ||
|
d2fd7460ed | ||
|
5e3d8fc9b8 | ||
|
b186c67767 | ||
|
ac7c60d102 | ||
|
b9dbd58a1c | ||
|
69bbac013a | ||
|
203296b9cb | ||
|
689d70ffae | ||
|
d5475d1ff6 | ||
|
05cc8047fa | ||
|
d6a1046361 | ||
|
eb9915baf8 | ||
|
dbb6c71c5c | ||
|
9e5c8d94bf | ||
|
120af977a9 | ||
|
506c8a259b | ||
|
0c8545ec1c | ||
|
7e7dc03796 | ||
|
a874def344 | ||
|
44ac51f64f | ||
|
3b65be8b91 | ||
|
76beac41d2 | ||
|
69cdc73f5a | ||
|
1c966db324 | ||
|
692284886b | ||
|
0121d19645 | ||
|
bf8636e516 | ||
|
d336a1fb1c | ||
|
7c761e7017 | ||
|
7924daf7f8 | ||
|
2b9706a68b | ||
|
f2d15f9240 | ||
|
caf6a3ab81 | ||
|
f4baa973bf | ||
|
3741fa4b49 | ||
|
27df7f643e | ||
|
30987b6f1f | ||
|
41b5677f01 | ||
|
47d83e8930 | ||
|
61ff1f313b | ||
|
637ad3d479 | ||
|
2dd8c2a355 | ||
|
857a87d4b6 | ||
|
8b4cea5c86 | ||
|
9f25d96ec3 | ||
|
bd0730e5e8 | ||
|
07ccb82691 | ||
|
16030c6381 | ||
|
1f6716d69b | ||
|
ade603ff7a | ||
|
4d215bde10 | ||
|
20d81696e1 | ||
|
8cbbb80e3f | ||
|
1eabb21d69 | ||
|
7f6ba2e501 | ||
|
8c433d2706 | ||
|
3a856b785d | ||
|
b07bf838e3 | ||
|
bdfe709319 | ||
|
4190c6cb8e | ||
|
44a2d531b3 | ||
|
a17271a5c4 | ||
|
3980172243 | ||
|
3b4879133c | ||
|
a1232cbae3 | ||
|
ebb014da4c | ||
|
7786761d76 | ||
|
ff334fe9d7 | ||
|
ba40cb750b | ||
|
fcde6789ff | ||
|
14cc42e305 | ||
|
e481205342 | ||
|
fea9f27fd6 | ||
|
9ea7340da6 | ||
|
60f7278aff | ||
|
bae92a944d | ||
|
7d30768769 | ||
|
e444942c4e | ||
|
90b9609341 | ||
|
c25a922928 | ||
|
d26169ea32 | ||
|
8839d8d679 | ||
|
ad6af74eef | ||
|
7bb43329bb | ||
|
4c41930554 | ||
|
295f42b986 | ||
|
299f9e3115 | ||
|
1d8e183883 | ||
|
f242892382 | ||
|
ecc033f101 | ||
|
684dbfd626 | ||
|
aa5c42997f | ||
|
e7b666f567 | ||
|
0f7c0ed053 | ||
|
1e92bb4a0a | ||
|
b5b7914073 | ||
|
7595bff43b | ||
|
72864fcbd0 | ||
|
1b0de39f92 | ||
|
d8a137cb6c | ||
|
ddac2fb7a1 | ||
|
b1b335d55a | ||
|
0586dd98cb | ||
|
504f886065 | ||
|
2931eb0aad | ||
|
103d5a4b44 | ||
|
785b85ee46 | ||
|
8bd84a0ec4 | ||
|
9539995458 | ||
|
e67ff36e57 | ||
|
96a165d729 | ||
|
215725a3ac | ||
|
3da04fcae4 | ||
|
85e3e49688 | ||
|
076a83466e | ||
|
aaf3f343ea | ||
|
4a5751416a | ||
|
adb3ad6b7f | ||
|
8598f3912e | ||
|
f86239ab2f | ||
|
ee9dc94063 | ||
|
998beeae59 | ||
|
9931fff35b | ||
|
b4a0fdfaa1 | ||
|
d979cd2c07 | ||
|
bb56b3b4f1 | ||
|
2f13f923a8 | ||
|
93fefc58c7 | ||
|
bd7339c397 | ||
|
941625fd08 | ||
|
b6765edffe | ||
|
9273b21516 | ||
|
aa10e537a5 | ||
|
c79fe6dc33 | ||
|
fbf8db618c | ||
|
6f3cc2cdf7 | ||
|
7c1f4c9037 | ||
|
2da20bf3e8 | ||
|
6d54370f01 | ||
|
905d3c87f1 | ||
|
fc244067e0 | ||
|
8449354887 | ||
|
57e0f1b4ef | ||
|
a1e170e065 | ||
|
73de40b81e | ||
|
2c836e3c24 | ||
|
c2c5898221 | ||
|
99adf12355 | ||
|
7df0a6c55f | ||
|
e092008dc5 | ||
|
0cfc910cdc | ||
|
62f68de800 | ||
|
5bf13c4cc2 | ||
|
16f47adcc6 | ||
|
8eba8c7218 | ||
|
b214a19d5f | ||
|
1082145c74 | ||
|
2a836047e3 | ||
|
b2b07e5f21 |
538 changed files with 16397 additions and 7836 deletions
2
.github/workflows/api-misskey-js.yml
vendored
2
.github/workflows/api-misskey-js.yml
vendored
|
@ -16,7 +16,7 @@ jobs:
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4.2.2
|
uses: actions/checkout@v4.3.0
|
||||||
|
|
||||||
- name: Setup pnpm
|
- name: Setup pnpm
|
||||||
uses: pnpm/action-setup@v4.1.0
|
uses: pnpm/action-setup@v4.1.0
|
||||||
|
|
2
.github/workflows/changelog-check.yml
vendored
2
.github/workflows/changelog-check.yml
vendored
|
@ -12,7 +12,7 @@ jobs:
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout head
|
- name: Checkout head
|
||||||
uses: actions/checkout@v4.2.2
|
uses: actions/checkout@v4.3.0
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v4.4.0
|
uses: actions/setup-node@v4.4.0
|
||||||
with:
|
with:
|
||||||
|
|
|
@ -18,7 +18,7 @@ jobs:
|
||||||
if: ${{ github.event.pull_request.mergeable == null || github.event.pull_request.mergeable == true }}
|
if: ${{ github.event.pull_request.mergeable == null || github.event.pull_request.mergeable == true }}
|
||||||
steps:
|
steps:
|
||||||
- name: checkout
|
- name: checkout
|
||||||
uses: actions/checkout@v4.2.2
|
uses: actions/checkout@v4.3.0
|
||||||
with:
|
with:
|
||||||
submodules: true
|
submodules: true
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
@ -66,7 +66,7 @@ jobs:
|
||||||
if: ${{ github.event.pull_request.mergeable == null || github.event.pull_request.mergeable == true }}
|
if: ${{ github.event.pull_request.mergeable == null || github.event.pull_request.mergeable == true }}
|
||||||
steps:
|
steps:
|
||||||
- name: checkout
|
- name: checkout
|
||||||
uses: actions/checkout@v4.2.2
|
uses: actions/checkout@v4.3.0
|
||||||
with:
|
with:
|
||||||
submodules: true
|
submodules: true
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
|
@ -20,7 +20,7 @@ jobs:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4.2.2
|
uses: actions/checkout@v4.3.0
|
||||||
- name: Check version
|
- name: Check version
|
||||||
run: |
|
run: |
|
||||||
if [ "$(jq -r '.version' package.json)" != "$(jq -r '.version' packages/misskey-js/package.json)" ]; then
|
if [ "$(jq -r '.version' package.json)" != "$(jq -r '.version' packages/misskey-js/package.json)" ]; then
|
||||||
|
|
3
.github/workflows/check-spdx-license-id.yml
vendored
3
.github/workflows/check-spdx-license-id.yml
vendored
|
@ -12,7 +12,7 @@ jobs:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4.2.2
|
uses: actions/checkout@v4.3.0
|
||||||
- name: Check
|
- name: Check
|
||||||
run: |
|
run: |
|
||||||
counter=0
|
counter=0
|
||||||
|
@ -50,6 +50,7 @@ jobs:
|
||||||
"packages/backend/test"
|
"packages/backend/test"
|
||||||
"packages/frontend-shared/@types"
|
"packages/frontend-shared/@types"
|
||||||
"packages/frontend-shared/js"
|
"packages/frontend-shared/js"
|
||||||
|
"packages/frontend-builder"
|
||||||
"packages/frontend/.storybook"
|
"packages/frontend/.storybook"
|
||||||
"packages/frontend/@types"
|
"packages/frontend/@types"
|
||||||
"packages/frontend/lib"
|
"packages/frontend/lib"
|
||||||
|
|
2
.github/workflows/check_copyright_year.yml
vendored
2
.github/workflows/check_copyright_year.yml
vendored
|
@ -10,7 +10,7 @@ jobs:
|
||||||
check_copyright_year:
|
check_copyright_year:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.2.2
|
- uses: actions/checkout@v4.3.0
|
||||||
- run: |
|
- run: |
|
||||||
if [ "$(grep Copyright COPYING | sed -e 's/.*2014-\([0-9]*\) .*/\1/g')" -ne "$(date +%Y)" ]; then
|
if [ "$(grep Copyright COPYING | sed -e 's/.*2014-\([0-9]*\) .*/\1/g')" -ne "$(date +%Y)" ]; then
|
||||||
echo "Please change copyright year!"
|
echo "Please change copyright year!"
|
||||||
|
|
|
@ -28,7 +28,7 @@ jobs:
|
||||||
wait_time: ${{ steps.get-wait-time.outputs.wait_time }}
|
wait_time: ${{ steps.get-wait-time.outputs.wait_time }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4.2.2
|
uses: actions/checkout@v4.3.0
|
||||||
|
|
||||||
- name: Check allowed users
|
- name: Check allowed users
|
||||||
id: check-allowed-users
|
id: check-allowed-users
|
||||||
|
|
2
.github/workflows/docker-develop.yml
vendored
2
.github/workflows/docker-develop.yml
vendored
|
@ -27,7 +27,7 @@ jobs:
|
||||||
platform=${{ matrix.platform }}
|
platform=${{ matrix.platform }}
|
||||||
echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV
|
echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV
|
||||||
- name: Check out the repo
|
- name: Check out the repo
|
||||||
uses: actions/checkout@v4.2.2
|
uses: actions/checkout@v4.3.0
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v3
|
uses: docker/setup-buildx-action@v3
|
||||||
- name: Log in to Docker Hub
|
- name: Log in to Docker Hub
|
||||||
|
|
2
.github/workflows/docker.yml
vendored
2
.github/workflows/docker.yml
vendored
|
@ -32,7 +32,7 @@ jobs:
|
||||||
platform=${{ matrix.platform }}
|
platform=${{ matrix.platform }}
|
||||||
echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV
|
echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV
|
||||||
- name: Check out the repo
|
- name: Check out the repo
|
||||||
uses: actions/checkout@v4.2.2
|
uses: actions/checkout@v4.3.0
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v3
|
uses: docker/setup-buildx-action@v3
|
||||||
- name: Docker meta
|
- name: Docker meta
|
||||||
|
|
4
.github/workflows/dockle.yml
vendored
4
.github/workflows/dockle.yml
vendored
|
@ -15,7 +15,7 @@ jobs:
|
||||||
DOCKER_CONTENT_TRUST: 1
|
DOCKER_CONTENT_TRUST: 1
|
||||||
DOCKLE_VERSION: 0.4.14
|
DOCKLE_VERSION: 0.4.14
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.2.2
|
- uses: actions/checkout@v4.3.0
|
||||||
- name: Download and install dockle v${{ env.DOCKLE_VERSION }}
|
- name: Download and install dockle v${{ env.DOCKLE_VERSION }}
|
||||||
run: |
|
run: |
|
||||||
curl -L -o dockle.deb "https://github.com/goodwithtech/dockle/releases/download/v${DOCKLE_VERSION}/dockle_${DOCKLE_VERSION}_Linux-64bit.deb"
|
curl -L -o dockle.deb "https://github.com/goodwithtech/dockle/releases/download/v${DOCKLE_VERSION}/dockle_${DOCKLE_VERSION}_Linux-64bit.deb"
|
||||||
|
@ -25,7 +25,7 @@ jobs:
|
||||||
cp ./compose_example.yml ./compose.yml
|
cp ./compose_example.yml ./compose.yml
|
||||||
- run: |
|
- run: |
|
||||||
docker compose up -d web
|
docker compose up -d web
|
||||||
docker tag "$(docker compose images web | awk 'OFS=":" {print $4}' | tail -n +2)" misskey-web:latest
|
docker tag "$(docker compose images --format json web | jq -r '.[] | .ID')" misskey-web:latest
|
||||||
- run: |
|
- run: |
|
||||||
cmd="dockle --exit-code 1 misskey-web:latest ${image_name}"
|
cmd="dockle --exit-code 1 misskey-web:latest ${image_name}"
|
||||||
echo "> ${cmd}"
|
echo "> ${cmd}"
|
||||||
|
|
2
.github/workflows/get-api-diff.yml
vendored
2
.github/workflows/get-api-diff.yml
vendored
|
@ -25,7 +25,7 @@ jobs:
|
||||||
ref: refs/pull/${{ github.event.number }}/merge
|
ref: refs/pull/${{ github.event.number }}/merge
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.2.2
|
- uses: actions/checkout@v4.3.0
|
||||||
with:
|
with:
|
||||||
ref: ${{ matrix.ref }}
|
ref: ${{ matrix.ref }}
|
||||||
submodules: true
|
submodules: true
|
||||||
|
|
11
.github/workflows/lint.yml
vendored
11
.github/workflows/lint.yml
vendored
|
@ -9,6 +9,7 @@ on:
|
||||||
- packages/backend/**
|
- packages/backend/**
|
||||||
- packages/frontend/**
|
- packages/frontend/**
|
||||||
- packages/frontend-shared/**
|
- packages/frontend-shared/**
|
||||||
|
- packages/frontend-builder/**
|
||||||
- packages/frontend-embed/**
|
- packages/frontend-embed/**
|
||||||
- packages/icons-subsetter/**
|
- packages/icons-subsetter/**
|
||||||
- packages/sw/**
|
- packages/sw/**
|
||||||
|
@ -22,6 +23,7 @@ on:
|
||||||
- packages/backend/**
|
- packages/backend/**
|
||||||
- packages/frontend/**
|
- packages/frontend/**
|
||||||
- packages/frontend-shared/**
|
- packages/frontend-shared/**
|
||||||
|
- packages/frontend-builder/**
|
||||||
- packages/frontend-embed/**
|
- packages/frontend-embed/**
|
||||||
- packages/icons-subsetter/**
|
- packages/icons-subsetter/**
|
||||||
- packages/sw/**
|
- packages/sw/**
|
||||||
|
@ -34,7 +36,7 @@ jobs:
|
||||||
pnpm_install:
|
pnpm_install:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.2.2
|
- uses: actions/checkout@v4.3.0
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
submodules: true
|
submodules: true
|
||||||
|
@ -56,6 +58,7 @@ jobs:
|
||||||
- backend
|
- backend
|
||||||
- frontend
|
- frontend
|
||||||
- frontend-shared
|
- frontend-shared
|
||||||
|
- frontend-builder
|
||||||
- frontend-embed
|
- frontend-embed
|
||||||
- icons-subsetter
|
- icons-subsetter
|
||||||
- sw
|
- sw
|
||||||
|
@ -66,7 +69,7 @@ jobs:
|
||||||
eslint-cache-version: v1
|
eslint-cache-version: v1
|
||||||
eslint-cache-path: ${{ github.workspace }}/node_modules/.cache/eslint-${{ matrix.workspace }}
|
eslint-cache-path: ${{ github.workspace }}/node_modules/.cache/eslint-${{ matrix.workspace }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.2.2
|
- uses: actions/checkout@v4.3.0
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
submodules: true
|
submodules: true
|
||||||
|
@ -78,7 +81,7 @@ jobs:
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
- run: pnpm i --frozen-lockfile
|
- run: pnpm i --frozen-lockfile
|
||||||
- name: Restore eslint cache
|
- name: Restore eslint cache
|
||||||
uses: actions/cache@v4.2.3
|
uses: actions/cache@v4.2.4
|
||||||
with:
|
with:
|
||||||
path: ${{ env.eslint-cache-path }}
|
path: ${{ env.eslint-cache-path }}
|
||||||
key: eslint-${{ env.eslint-cache-version }}-${{ matrix.workspace }}-${{ hashFiles('**/pnpm-lock.yaml') }}-${{ github.ref_name }}-${{ github.sha }}
|
key: eslint-${{ env.eslint-cache-version }}-${{ matrix.workspace }}-${{ hashFiles('**/pnpm-lock.yaml') }}-${{ github.ref_name }}-${{ github.sha }}
|
||||||
|
@ -96,7 +99,7 @@ jobs:
|
||||||
- sw
|
- sw
|
||||||
- misskey-js
|
- misskey-js
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.2.2
|
- uses: actions/checkout@v4.3.0
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
submodules: true
|
submodules: true
|
||||||
|
|
2
.github/workflows/locale.yml
vendored
2
.github/workflows/locale.yml
vendored
|
@ -14,7 +14,7 @@ jobs:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.2.2
|
- uses: actions/checkout@v4.3.0
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
submodules: true
|
submodules: true
|
||||||
|
|
2
.github/workflows/on-release-created.yml
vendored
2
.github/workflows/on-release-created.yml
vendored
|
@ -16,7 +16,7 @@ jobs:
|
||||||
id-token: write
|
id-token: write
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.2.2
|
- uses: actions/checkout@v4.3.0
|
||||||
with:
|
with:
|
||||||
submodules: true
|
submodules: true
|
||||||
- name: Setup pnpm
|
- name: Setup pnpm
|
||||||
|
|
4
.github/workflows/storybook.yml
vendored
4
.github/workflows/storybook.yml
vendored
|
@ -22,12 +22,12 @@ jobs:
|
||||||
NODE_OPTIONS: "--max_old_space_size=7168"
|
NODE_OPTIONS: "--max_old_space_size=7168"
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.2.2
|
- uses: actions/checkout@v4.3.0
|
||||||
if: github.event_name != 'pull_request_target'
|
if: github.event_name != 'pull_request_target'
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
submodules: true
|
submodules: true
|
||||||
- uses: actions/checkout@v4.2.2
|
- uses: actions/checkout@v4.3.0
|
||||||
if: github.event_name == 'pull_request_target'
|
if: github.event_name == 'pull_request_target'
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
6
.github/workflows/test-backend.yml
vendored
6
.github/workflows/test-backend.yml
vendored
|
@ -50,7 +50,7 @@ jobs:
|
||||||
- 56312:6379
|
- 56312:6379
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.2.2
|
- uses: actions/checkout@v4.3.0
|
||||||
with:
|
with:
|
||||||
submodules: true
|
submodules: true
|
||||||
- name: Setup pnpm
|
- name: Setup pnpm
|
||||||
|
@ -129,7 +129,7 @@ jobs:
|
||||||
- 56312:6379
|
- 56312:6379
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.2.2
|
- uses: actions/checkout@v4.3.0
|
||||||
with:
|
with:
|
||||||
submodules: true
|
submodules: true
|
||||||
- name: Setup pnpm
|
- name: Setup pnpm
|
||||||
|
@ -173,7 +173,7 @@ jobs:
|
||||||
POSTGRES_HOST_AUTH_METHOD: trust
|
POSTGRES_HOST_AUTH_METHOD: trust
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.2.2
|
- uses: actions/checkout@v4.3.0
|
||||||
with:
|
with:
|
||||||
submodules: true
|
submodules: true
|
||||||
- name: Setup pnpm
|
- name: Setup pnpm
|
||||||
|
|
4
.github/workflows/test-frontend.yml
vendored
4
.github/workflows/test-frontend.yml
vendored
|
@ -28,7 +28,7 @@ jobs:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.2.2
|
- uses: actions/checkout@v4.3.0
|
||||||
with:
|
with:
|
||||||
submodules: true
|
submodules: true
|
||||||
- name: Setup pnpm
|
- name: Setup pnpm
|
||||||
|
@ -76,7 +76,7 @@ jobs:
|
||||||
- 56312:6379
|
- 56312:6379
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.2.2
|
- uses: actions/checkout@v4.3.0
|
||||||
with:
|
with:
|
||||||
submodules: true
|
submodules: true
|
||||||
# https://github.com/cypress-io/cypress-docker-images/issues/150
|
# https://github.com/cypress-io/cypress-docker-images/issues/150
|
||||||
|
|
2
.github/workflows/test-misskey-js.yml
vendored
2
.github/workflows/test-misskey-js.yml
vendored
|
@ -22,7 +22,7 @@ jobs:
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4.2.2
|
uses: actions/checkout@v4.3.0
|
||||||
|
|
||||||
- name: Setup pnpm
|
- name: Setup pnpm
|
||||||
uses: pnpm/action-setup@v4.1.0
|
uses: pnpm/action-setup@v4.1.0
|
||||||
|
|
2
.github/workflows/test-production.yml
vendored
2
.github/workflows/test-production.yml
vendored
|
@ -16,7 +16,7 @@ jobs:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.2.2
|
- uses: actions/checkout@v4.3.0
|
||||||
with:
|
with:
|
||||||
submodules: true
|
submodules: true
|
||||||
- name: Setup pnpm
|
- name: Setup pnpm
|
||||||
|
|
2
.github/workflows/validate-api-json.yml
vendored
2
.github/workflows/validate-api-json.yml
vendored
|
@ -17,7 +17,7 @@ jobs:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.2.2
|
- uses: actions/checkout@v4.3.0
|
||||||
with:
|
with:
|
||||||
submodules: true
|
submodules: true
|
||||||
- name: Setup pnpm
|
- name: Setup pnpm
|
||||||
|
|
80
CHANGELOG.md
80
CHANGELOG.md
|
@ -1,3 +1,19 @@
|
||||||
|
## 2025.9.0
|
||||||
|
|
||||||
|
### Client
|
||||||
|
- Enhance: AiScriptAppウィジェットで構文エラーを検知してもダイアログではなくウィジェット内にエラーを表示するように
|
||||||
|
- Enhance: /flushページでサイトキャッシュをクリアできるようになりました
|
||||||
|
- Enhance: クリップ/リスト/アンテナ/ロール追加系メニュー項目において、表示件数を拡張
|
||||||
|
- Enhance: 「キャッシュを削除」ボタンでブラウザの内部キャッシュの削除も行えるように
|
||||||
|
- Fix: プッシュ通知を有効にできない問題を修正
|
||||||
|
- Fix: RSSティッカーウィジェットが正しく動作しない問題を修正
|
||||||
|
- Fix: プロファイルを復元後アカウントの切り替えができない問題を修正
|
||||||
|
- Fix: エラー画像が横に引き伸ばされてしまう問題に対応
|
||||||
|
- Fix: Ctrlキー(Commandキー)を押下しながらリンクをクリックすると新しいタブで開くように
|
||||||
|
|
||||||
|
### Server
|
||||||
|
- Fix: webpなどの画像に対してセンシティブなメディアの検出が適用されていなかった問題を修正
|
||||||
|
|
||||||
## 2025.8.0
|
## 2025.8.0
|
||||||
|
|
||||||
### Note
|
### Note
|
||||||
|
@ -6,18 +22,78 @@
|
||||||
### General
|
### General
|
||||||
- ノートを削除した際、関連するノートが同時に削除されないようになりました
|
- ノートを削除した際、関連するノートが同時に削除されないようになりました
|
||||||
- APIで、「replyIdが存在しているのにreplyがnull」や「renoteIdが存在しているのにrenoteがnull」であるという、今までにはなかったパターンが表れることになります
|
- APIで、「replyIdが存在しているのにreplyがnull」や「renoteIdが存在しているのにrenoteがnull」であるという、今までにはなかったパターンが表れることになります
|
||||||
- 定期的に参照されていない古いリモートの投稿を削除する機能が実装されました(コントロールパネル→パフォーマンス→Remote Notes Cleaning)
|
- 定期的に古いリモートの投稿を削除する機能が実装されました
|
||||||
- **デフォルトでオン**になっています
|
- コントロールパネル→パフォーマンス→Remote Notes Cleaning で有効化できます
|
||||||
- データベースの肥大化を防止することが可能です
|
- データベースの肥大化を防止することが可能です
|
||||||
|
- 既存のサーバーで当機能を有効化した場合は、処理量が多くなるため、一時的にストレージ使用量が増加する可能性があります。
|
||||||
|
- 増加量を抑えるには、最大処理継続時間をデフォルトより短くしてください。
|
||||||
|
- データベースサイズへの効果が見られない場合はautovacuumが有効になっているか確認してください
|
||||||
|
- サーバーの初期設定が完了するまでは連合がオンにならないようになりました
|
||||||
|
- 日本語における公開範囲名称の「ダイレクト」が「指名」に改称されました
|
||||||
|
- 実際の動作に即した名称になり、馴染みのない人でも理解しやすくなりました
|
||||||
|
- 他サービスにおける「ダイレクトメッセージ」に相当するMisskeyの機能は「チャット」ですが(過去のバージョンのMisskeyでも、当該機能は「チャット」ではなく「ダイレクトメッセージ」でした)、「ダイレクト投稿」という名称の機能が存在するとそちらがダイレクトメッセージ機能であるような誤解を生んでいました
|
||||||
|
- 今後、「チャット」の名称を「ダイレクトメッセージ」に戻す可能性があります
|
||||||
|
- mfm.jsをアップデートしました
|
||||||
|
- Enhance: Unicode 15.1 および 16.0 に収録されている絵文字に対応
|
||||||
|
- Enhance: acctに `.` が入っているユーザーのメンションに対応
|
||||||
|
- Fix: Unicode絵文字に隣接する異体字セレクタ(`U+FE0F`)が絵文字として認識される問題を修正
|
||||||
|
- Enhance: ユーザー検索をロールポリシーで制限できるように
|
||||||
|
|
||||||
### Client
|
### Client
|
||||||
|
- Feat: AiScriptが1.1.0に更新されました
|
||||||
|
- プラグインは1.xに対応したものが必要です
|
||||||
|
- Playはそのまま動作しますが、新規に作られるプリセットは1.xになります
|
||||||
|
- 以前のバージョンから無効化されていた note_view_interruptor が有効になりました
|
||||||
|
- ハンドラは同期的である必要があります
|
||||||
|
- Feat: セーフモード
|
||||||
|
- プラグイン・テーマ・カスタムCSSの使用でクライアントの起動に問題が発生した際に、これらを無効にして起動できます
|
||||||
|
- 以下の方法でセーフモードを起動できます
|
||||||
|
- `g` キーを連打する
|
||||||
|
- URLに`?safemode=true`を付ける
|
||||||
|
- PWAのショートカットで Safemode を選択して起動する
|
||||||
|
- Feat: 非ログイン時に表示されるトップページのスタイルを選択できるように
|
||||||
|
- コントロールパネル→ブランディング→エントランスページのスタイル
|
||||||
|
- Feat: ページのタブバーを下部に表示できるように
|
||||||
|
- Feat: (実験的)iOSでの触覚フィードバックを有効にできるように
|
||||||
|
- Feat: コントロールパネルを検索できるように
|
||||||
|
- Enhance: 「自動でもっと見る」オプションが有効になり、安定性が向上しました
|
||||||
|
- Enhance: トルコ語 (tr-TR) に対応
|
||||||
|
- Enhance: 不必要な翻訳データを読み込まなくなり、パフォーマンスが向上しました
|
||||||
|
- Enhance: 画像エフェクトのパラメータ名の多言語対応
|
||||||
|
- Enhance: ノートを非表示にする相対期間を1ヶ月単位で自由に指定できるように
|
||||||
|
- Enhance: メールアドレス確認画面のUIを改善
|
||||||
|
- Enhance: アイコンのスクロール追従を無効化する際の適用範囲を強化
|
||||||
|
- Enhance: レンダリングパフォーマンスの向上
|
||||||
|
- Enhance: 依存ソフトウェアの更新
|
||||||
|
- Fix: 投稿フォームでファイルのアップロードが中止または失敗した際のハンドリングを修正
|
||||||
- Fix: 一部の設定検索結果が存在しないパスになる問題を修正
|
- Fix: 一部の設定検索結果が存在しないパスになる問題を修正
|
||||||
(Cherry-picked from https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/1171)
|
(Cherry-picked from https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/1171)
|
||||||
- Fix: テーマエディタが動作しない問題を修正
|
- Fix: テーマエディタが動作しない問題を修正
|
||||||
|
- Fix: チャンネルのハイライトページにノートが表示されない問題を修正
|
||||||
|
- Fix: カラムの名前が正しくリスト/チャンネルの名前にならない問題を修正
|
||||||
|
- Fix: 複数のメンションを1行に記述した場合に、サジェストが正しく表示されない問題を修正
|
||||||
|
- Fix: メンションとしての条件を満たしていても、特定の条件(`-`が含まれる場合など)で正しくサジェストされない問題を一部修正
|
||||||
|
- Fix: ユーザーの前後ノートを閲覧する機能が動作しない問題を修正
|
||||||
|
- Fix: 照会ダイアログでap/showでローカルユーザーを解決した際@username@nullに飛ばされる問題を修正
|
||||||
|
- Fix: アイコンのデコレーションを付ける際にデコレーションが表示されなくなる問題を修正
|
||||||
|
- Fix: タッチ操作時にマウスホバー時のユーザープレビューが開くことがある問題を修正
|
||||||
|
- Fix: 管理中アカウント一覧で正しい表示が行われない問題を修正
|
||||||
|
- Fix: lookupページでリモートURLを指定した際に正しく動作しない問題を修正
|
||||||
|
|
||||||
### Server
|
### Server
|
||||||
|
- Feat: サーバー管理コマンド
|
||||||
|
- `pnpm cli foo` の形式で実行可能です
|
||||||
|
- 現在以下のコマンドが利用可能です
|
||||||
|
- `reset-captcha` - CAPTCHA設定をリセットします
|
||||||
- Enhance: ノートの削除処理の効率化
|
- Enhance: ノートの削除処理の効率化
|
||||||
- Enhance: 全体的なパフォーマンスの向上
|
- Enhance: 全体的なパフォーマンスの向上
|
||||||
|
- Enhance: 依存ソフトウェアの更新
|
||||||
|
- Enhance: `clips/list` APIがページネーションに対応しました
|
||||||
|
- Fix: `notes/mentions` で場合によっては並び順が正しく返されない問題を修正
|
||||||
|
- Fix: SystemWebhook設定でsecretを空に出来ない問題を修正
|
||||||
|
- Fix: 削除されたユーザーがチャットメッセージにリアクションしている場合`chat/history`などでエラーになる問題を修正
|
||||||
|
- Fix: Pageのアイキャッチ画像をドライブから消してもPageごと消えないように
|
||||||
|
- Fix: タイムラインAPIの withRenotes: false 時のレスポンスを修正
|
||||||
|
|
||||||
|
|
||||||
## 2025.7.0
|
## 2025.7.0
|
||||||
|
|
|
@ -618,3 +618,23 @@ color: hsl(from var(--MI_THEME-accent) h s calc(l - 10));
|
||||||
color: color(from var(--MI_THEME-accent) srgb r g b / 0.5);
|
color: color(from var(--MI_THEME-accent) srgb r g b / 0.5);
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## 考え方
|
||||||
|
### DRYに囚われるな
|
||||||
|
必要なのは一般化ではなく抽象化と考えます。
|
||||||
|
盲信せず、誤った・不必要な共通化は避け、それが自然だと感じる場合は重複させる勇気を持ちましょう。
|
||||||
|
|
||||||
|
### Misskeyを複雑にしない実装
|
||||||
|
それがいくら複雑であっても、Misskey固有のコンテキストと関心が分離されている(もしくは事実上分離されていると見做すことができる)実装であれば、それはMisskeyのコードベースに対する複雑性に影響を与えないと考えます。
|
||||||
|
|
||||||
|
例えるなら、VueやAiScriptといったMisskeyが使用しているライブラリの内部実装がいくら複雑だったとしても、「それを使用しているからMisskeyの実装は複雑である」ということにはならないのと同じです。
|
||||||
|
|
||||||
|
Misskeyのドメイン知識から関心が分離されているということは、Misskeyの実装について考える時にそれらの内部実装を考慮する必要が無く、認知負荷を増やさないからです。
|
||||||
|
|
||||||
|
また重要な点は、その実装が、Misskeyリポジトリの外部にあるか・内部にあるかということや、Misskeyがメンテナンスするものか・第三者がメンテナンスするものかといったことは複雑性を考える上ではほとんど無視できるという点です。
|
||||||
|
|
||||||
|
もちろんその実装がMisskeyリポジトリにあり、Misskeyがメンテナンスしなければならないものは、保守のコストはかかります。
|
||||||
|
しかし、Misskeyの本質的な設計・実装という観点で見たときは、その実装は実質的に外部ライブラリのように振る舞います。
|
||||||
|
換言すれば「たまたまMisskeyの開発者と同じ人たちがメンテナンスしているし、たまたまMisskeyのリポジトリ内に置いてあるだけの外部ライブラリ」です。
|
||||||
|
|
||||||
|
そのため、実装をなるべくMisskeyのドメイン知識から独立したものにすれば、Misskeyのコードベースの複雑性を上げることなく機能実装を行うことができ、お得であると言えます。
|
||||||
|
もちろんそれにこだわって、些細な実装でもそのように分離してしまうとかえって認知負荷が増えたり、実装量が増えてメリットをデメリットが上回る場合もあるので、ケースバイケースではあります。
|
||||||
|
|
|
@ -23,6 +23,7 @@ COPY --link ["packages/backend/package.json", "./packages/backend/"]
|
||||||
COPY --link ["packages/frontend-shared/package.json", "./packages/frontend-shared/"]
|
COPY --link ["packages/frontend-shared/package.json", "./packages/frontend-shared/"]
|
||||||
COPY --link ["packages/frontend/package.json", "./packages/frontend/"]
|
COPY --link ["packages/frontend/package.json", "./packages/frontend/"]
|
||||||
COPY --link ["packages/frontend-embed/package.json", "./packages/frontend-embed/"]
|
COPY --link ["packages/frontend-embed/package.json", "./packages/frontend-embed/"]
|
||||||
|
COPY --link ["packages/frontend-builder/package.json", "./packages/frontend-builder/"]
|
||||||
COPY --link ["packages/icons-subsetter/package.json", "./packages/icons-subsetter/"]
|
COPY --link ["packages/icons-subsetter/package.json", "./packages/icons-subsetter/"]
|
||||||
COPY --link ["packages/sw/package.json", "./packages/sw/"]
|
COPY --link ["packages/sw/package.json", "./packages/sw/"]
|
||||||
COPY --link ["packages/misskey-js/package.json", "./packages/misskey-js/"]
|
COPY --link ["packages/misskey-js/package.json", "./packages/misskey-js/"]
|
||||||
|
|
|
@ -4,8 +4,8 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* eslint-disable @typescript-eslint/explicit-function-return-type */
|
/* eslint-disable @typescript-eslint/explicit-function-return-type */
|
||||||
import { action } from '@storybook/addon-actions';
|
import { action } from 'storybook/actions';
|
||||||
import { StoryObj } from '@storybook/vue3';
|
import type { StoryObj } from '@storybook/vue3';
|
||||||
import { HttpResponse, http } from 'msw';
|
import { HttpResponse, http } from 'msw';
|
||||||
import { abuseUserReport } from '../packages/frontend/.storybook/fakes.js';
|
import { abuseUserReport } from '../packages/frontend/.storybook/fakes.js';
|
||||||
import { commonHandlers } from '../packages/frontend/.storybook/mocks.js';
|
import { commonHandlers } from '../packages/frontend/.storybook/mocks.js';
|
||||||
|
|
|
@ -68,7 +68,7 @@ receiveFollowRequest: "تلقيت طلب متابعة"
|
||||||
followRequestAccepted: "قُبل طلب المتابعة"
|
followRequestAccepted: "قُبل طلب المتابعة"
|
||||||
mention: "أشر الى"
|
mention: "أشر الى"
|
||||||
mentions: "الإشارات"
|
mentions: "الإشارات"
|
||||||
directNotes: "الملاحظات المباشرة"
|
directNotes: "رسالة خاصة"
|
||||||
importAndExport: "إستورد / صدر"
|
importAndExport: "إستورد / صدر"
|
||||||
import: "استيراد"
|
import: "استيراد"
|
||||||
export: "تصدير"
|
export: "تصدير"
|
||||||
|
@ -1008,6 +1008,8 @@ lastNDays: "آخر {n} أيام"
|
||||||
surrender: "ألغِ"
|
surrender: "ألغِ"
|
||||||
postForm: "أنشئ ملاحظة"
|
postForm: "أنشئ ملاحظة"
|
||||||
information: "عن"
|
information: "عن"
|
||||||
|
inMinutes: "د"
|
||||||
|
inDays: "ي"
|
||||||
_chat:
|
_chat:
|
||||||
invitations: "دعوة"
|
invitations: "دعوة"
|
||||||
noHistory: "السجل فارغ"
|
noHistory: "السجل فارغ"
|
||||||
|
@ -1597,3 +1599,9 @@ _watermarkEditor:
|
||||||
type: "نوع"
|
type: "نوع"
|
||||||
image: "صور"
|
image: "صور"
|
||||||
advanced: "متقدم"
|
advanced: "متقدم"
|
||||||
|
_imageEffector:
|
||||||
|
_fxProps:
|
||||||
|
scale: "الحجم"
|
||||||
|
size: "الحجم"
|
||||||
|
color: "اللون"
|
||||||
|
opacity: "الشفافية"
|
||||||
|
|
|
@ -848,6 +848,8 @@ sourceCode: "সোর্স কোড"
|
||||||
flip: "উল্টান"
|
flip: "উল্টান"
|
||||||
postForm: "নোট লিখুন"
|
postForm: "নোট লিখুন"
|
||||||
information: "আপনার সম্পর্কে"
|
information: "আপনার সম্পর্কে"
|
||||||
|
inMinutes: "মিনিট"
|
||||||
|
inDays: "দিন"
|
||||||
_chat:
|
_chat:
|
||||||
invitations: "আমন্ত্রণ"
|
invitations: "আমন্ত্রণ"
|
||||||
noHistory: "কোনো ইতিহাস নেই"
|
noHistory: "কোনো ইতিহাস নেই"
|
||||||
|
@ -1355,3 +1357,10 @@ _watermarkEditor:
|
||||||
text: "লেখা"
|
text: "লেখা"
|
||||||
image: "ছবি"
|
image: "ছবি"
|
||||||
advanced: "উন্নত"
|
advanced: "উন্নত"
|
||||||
|
_imageEffector:
|
||||||
|
_fxProps:
|
||||||
|
scale: "আকার"
|
||||||
|
size: "আকার"
|
||||||
|
color: "রং"
|
||||||
|
opacity: "অস্বচ্ছতা"
|
||||||
|
lightness: "উজ্জ্বল করুন"
|
||||||
|
|
|
@ -896,7 +896,7 @@ searchResult: "Resultats de la cerca"
|
||||||
hashtags: "Etiquetes"
|
hashtags: "Etiquetes"
|
||||||
troubleshooting: "Solucionar problemes"
|
troubleshooting: "Solucionar problemes"
|
||||||
useBlurEffect: "Fes servir efectes de desenfocament a la interfície"
|
useBlurEffect: "Fes servir efectes de desenfocament a la interfície"
|
||||||
learnMore: "Saber més "
|
learnMore: "Saber-ne més "
|
||||||
misskeyUpdated: "Misskey s'ha actualitzat "
|
misskeyUpdated: "Misskey s'ha actualitzat "
|
||||||
whatIsNew: "Mostra canvis"
|
whatIsNew: "Mostra canvis"
|
||||||
translate: "Traduir "
|
translate: "Traduir "
|
||||||
|
@ -1054,6 +1054,7 @@ permissionDeniedError: "Operació no permesa "
|
||||||
permissionDeniedErrorDescription: "Aquest compte no té suficients permisos per dur a terme aquesta acció "
|
permissionDeniedErrorDescription: "Aquest compte no té suficients permisos per dur a terme aquesta acció "
|
||||||
preset: "Predefinit"
|
preset: "Predefinit"
|
||||||
selectFromPresets: "Escull des dels predefinits"
|
selectFromPresets: "Escull des dels predefinits"
|
||||||
|
custom: "Personalitzat"
|
||||||
achievements: "Assoliments"
|
achievements: "Assoliments"
|
||||||
gotInvalidResponseError: "Resposta del servidor invàlida "
|
gotInvalidResponseError: "Resposta del servidor invàlida "
|
||||||
gotInvalidResponseErrorDescription: "No es pot contactar amb el servidor o potser es troba fora de línia per manteniment. Provar-ho de nou més tard."
|
gotInvalidResponseErrorDescription: "No es pot contactar amb el servidor o potser es troba fora de línia per manteniment. Provar-ho de nou més tard."
|
||||||
|
@ -1092,6 +1093,7 @@ prohibitedWordsDescription2: "Fent servir espais crearà expressions AND si l'ex
|
||||||
hiddenTags: "Etiquetes ocultes"
|
hiddenTags: "Etiquetes ocultes"
|
||||||
hiddenTagsDescription: "La visibilitat de totes les notes que continguin qualsevol de les paraules configurades seran, automàticament, afegides a \"Inici\". Pots llistar diferents paraules separant les per línies noves."
|
hiddenTagsDescription: "La visibilitat de totes les notes que continguin qualsevol de les paraules configurades seran, automàticament, afegides a \"Inici\". Pots llistar diferents paraules separant les per línies noves."
|
||||||
notesSearchNotAvailable: "La cerca de notes no es troba disponible."
|
notesSearchNotAvailable: "La cerca de notes no es troba disponible."
|
||||||
|
usersSearchNotAvailable: "La cerca d'usuaris no està disponible."
|
||||||
license: "Llicència"
|
license: "Llicència"
|
||||||
unfavoriteConfirm: "Esborrar dels favorits?"
|
unfavoriteConfirm: "Esborrar dels favorits?"
|
||||||
myClips: "Els meus retalls"
|
myClips: "Els meus retalls"
|
||||||
|
@ -1243,7 +1245,7 @@ releaseToRefresh: "Deixar anar per actualitzar"
|
||||||
refreshing: "Recarregant..."
|
refreshing: "Recarregant..."
|
||||||
pullDownToRefresh: "Llisca cap a baix per recarregar"
|
pullDownToRefresh: "Llisca cap a baix per recarregar"
|
||||||
useGroupedNotifications: "Mostrar les notificacions agrupades "
|
useGroupedNotifications: "Mostrar les notificacions agrupades "
|
||||||
signupPendingError: "Hi ha hagut un problema verificant l'adreça de correu electrònic. L'enllaç pot haver caducat."
|
emailVerificationFailedError: "Hem tingut un problema en verificar la teva adreça de correu electrònic. És probable que l'enllaç estigui caducat."
|
||||||
cwNotationRequired: "Si està activat \"Amagar contingut\" s'ha d'escriure una descripció "
|
cwNotationRequired: "Si està activat \"Amagar contingut\" s'ha d'escriure una descripció "
|
||||||
doReaction: "Afegeix una reacció "
|
doReaction: "Afegeix una reacció "
|
||||||
code: "Codi"
|
code: "Codi"
|
||||||
|
@ -1368,9 +1370,16 @@ redisplayAllTips: "Torna ha mostrat tots els trucs i consells"
|
||||||
hideAllTips: "Amagar tots els trucs i consells"
|
hideAllTips: "Amagar tots els trucs i consells"
|
||||||
defaultImageCompressionLevel: "Nivell de comprensió de la imatge per defecte"
|
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."
|
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."
|
||||||
|
inMinutes: "Minut(s)"
|
||||||
|
inDays: "Di(a)(es)"
|
||||||
|
safeModeEnabled: "Mode segur activat"
|
||||||
|
pluginsAreDisabledBecauseSafeMode: "Els afegits no estan activats perquè el mode segur està activat."
|
||||||
|
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!"
|
||||||
_order:
|
_order:
|
||||||
newest: "Més recent"
|
newest: "Més recent"
|
||||||
oldest: "Cronològic"
|
oldest: "Antigues primer"
|
||||||
_chat:
|
_chat:
|
||||||
noMessagesYet: "Encara no tens missatges "
|
noMessagesYet: "Encara no tens missatges "
|
||||||
newMessage: "Missatge nou"
|
newMessage: "Missatge nou"
|
||||||
|
@ -1459,6 +1468,7 @@ _settings:
|
||||||
contentsUpdateFrequency_description2: "Quan s'activa el mode en temps real, el contingut s'actualitza en temps real, independentment d'aquesta configuració."
|
contentsUpdateFrequency_description2: "Quan s'activa el mode en temps real, el contingut s'actualitza en temps real, independentment d'aquesta configuració."
|
||||||
showUrlPreview: "Mostrar vista prèvia d'URL"
|
showUrlPreview: "Mostrar vista prèvia d'URL"
|
||||||
showAvailableReactionsFirstInNote: "Mostra les reacciones que pots fer servir al damunt"
|
showAvailableReactionsFirstInNote: "Mostra les reacciones que pots fer servir al damunt"
|
||||||
|
showPageTabBarBottom: "Mostrar les pestanyes de les línies de temps a la part inferior"
|
||||||
_chat:
|
_chat:
|
||||||
showSenderName: "Mostrar el nom del remitent"
|
showSenderName: "Mostrar el nom del remitent"
|
||||||
sendOnEnter: "Introdueix per enviar"
|
sendOnEnter: "Introdueix per enviar"
|
||||||
|
@ -1632,6 +1642,10 @@ _serverSettings:
|
||||||
fanoutTimelineDbFallback: "Carregar de la base de dades"
|
fanoutTimelineDbFallback: "Carregar de la base de dades"
|
||||||
fanoutTimelineDbFallbackDescription: "Quan s'activa, la línia de temps fa servir la base de dades per consultes adicionals si la línia de temps no es troba a la memòria cau. Si és desactiva la càrrega del servidor és veure reduïda, però també és reduirà el nombre de línies de temps que és poden obtenir."
|
fanoutTimelineDbFallbackDescription: "Quan s'activa, la línia de temps fa servir la base de dades per consultes adicionals si la línia de temps no es troba a la memòria cau. Si és desactiva la càrrega del servidor és veure reduïda, però també és reduirà el nombre de línies de temps que és poden obtenir."
|
||||||
reactionsBufferingDescription: "Quan s'activa aquesta opció millora bastant el rendiment en recuperar les línies de temps reduint la càrrega de la base. Com a contrapunt, augmentarà l'ús de memòria de Redís. Desactiva aquesta opció en cas de tenir un servidor amb poca memòria o si tens problemes d'inestabilitat."
|
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: "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 "
|
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ó."
|
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ó."
|
||||||
openRegistration: "Registres oberts"
|
openRegistration: "Registres oberts"
|
||||||
|
@ -1650,6 +1664,11 @@ _serverSettings:
|
||||||
userGeneratedContentsVisibilityForVisitor: "L'abast de la publicació del contingut generat per l'usuari"
|
userGeneratedContentsVisibilityForVisitor: "L'abast de la publicació del contingut generat per l'usuari"
|
||||||
userGeneratedContentsVisibilityForVisitor_description: "Això ajuda a evitar problemes com que continguts remots inadequats que no hagin estat moderats correctament es publiquin a internet mitjançant el teu servidor."
|
userGeneratedContentsVisibilityForVisitor_description: "Això ajuda a evitar problemes com que continguts remots inadequats que no hagin estat moderats correctament es publiquin a internet mitjançant el teu servidor."
|
||||||
userGeneratedContentsVisibilityForVisitor_description2: "La publicació incondicional de tots els continguts del servidor a internet, incloent-hi els continguts remots rebuts pel servidor, comporta riscos. Això és extremadament important per els espectadors que desconeixen el caràcter descentralitzat dels continguts, ja que poden percebre erroneament els continguts remots com contingut generat per el propi servidor."
|
userGeneratedContentsVisibilityForVisitor_description2: "La publicació incondicional de tots els continguts del servidor a internet, incloent-hi els continguts remots rebuts pel servidor, comporta riscos. Això és extremadament important per els espectadors que desconeixen el caràcter descentralitzat dels continguts, ja que poden percebre erroneament els continguts remots com contingut generat per el propi servidor."
|
||||||
|
restartServerSetupWizardConfirm_title: "Vols tornar a executar l'assistent de configuració inicial del servidor?"
|
||||||
|
restartServerSetupWizardConfirm_text: "Algunes configuracions actuals seran restablertes."
|
||||||
|
entrancePageStyle: "Estil de la pàgina d'inici"
|
||||||
|
showTimelineForVisitor: "Mostrar la línia de temps"
|
||||||
|
showActivitiesForVisitor: "Mostrar activitat"
|
||||||
_userGeneratedContentsVisibilityForVisitor:
|
_userGeneratedContentsVisibilityForVisitor:
|
||||||
all: "Tot obert al públic "
|
all: "Tot obert al públic "
|
||||||
localOnly: "Només es publiquen els continguts locals, el contingut remot es manté privat"
|
localOnly: "Només es publiquen els continguts locals, el contingut remot es manté privat"
|
||||||
|
@ -1986,6 +2005,7 @@ _role:
|
||||||
descriptionOfRateLimitFactor: "Límits baixos són menys restrictius, límits alts són més restrictius."
|
descriptionOfRateLimitFactor: "Límits baixos són menys restrictius, límits alts són més restrictius."
|
||||||
canHideAds: "Pot amagar la publicitat"
|
canHideAds: "Pot amagar la publicitat"
|
||||||
canSearchNotes: "Pot cercar notes"
|
canSearchNotes: "Pot cercar notes"
|
||||||
|
canSearchUsers: "Pot cercar usuaris"
|
||||||
canUseTranslator: "Pot fer servir el traductor"
|
canUseTranslator: "Pot fer servir el traductor"
|
||||||
avatarDecorationLimit: "Nombre màxim de decoracions que es poden aplicar els avatars"
|
avatarDecorationLimit: "Nombre màxim de decoracions que es poden aplicar els avatars"
|
||||||
canImportAntennas: "Autoritza la importació d'antenes "
|
canImportAntennas: "Autoritza la importació d'antenes "
|
||||||
|
@ -2258,6 +2278,7 @@ _time:
|
||||||
minute: "Minut(s)"
|
minute: "Minut(s)"
|
||||||
hour: "Hor(a)(es)"
|
hour: "Hor(a)(es)"
|
||||||
day: "Di(a)(es)"
|
day: "Di(a)(es)"
|
||||||
|
month: "Mes(os)"
|
||||||
_2fa:
|
_2fa:
|
||||||
alreadyRegistered: "J has registrat un dispositiu d'autenticació de doble factor."
|
alreadyRegistered: "J has registrat un dispositiu d'autenticació de doble factor."
|
||||||
registerTOTP: "Registrar una aplicació autenticadora"
|
registerTOTP: "Registrar una aplicació autenticadora"
|
||||||
|
@ -3060,6 +3081,7 @@ _bootErrors:
|
||||||
otherOption1: "Esborrar la configuració i la memòria cau del client"
|
otherOption1: "Esborrar la configuració i la memòria cau del client"
|
||||||
otherOption2: "Iniciar client senzill"
|
otherOption2: "Iniciar client senzill"
|
||||||
otherOption3: "Iniciar l'eina de reparació "
|
otherOption3: "Iniciar l'eina de reparació "
|
||||||
|
otherOption4: "Iniciar Misskey en mode segur"
|
||||||
_search:
|
_search:
|
||||||
searchScopeAll: "Tot"
|
searchScopeAll: "Tot"
|
||||||
searchScopeLocal: "Local"
|
searchScopeLocal: "Local"
|
||||||
|
@ -3096,6 +3118,8 @@ _serverSetupWizard:
|
||||||
doYouConnectToFediverse_description1: "Quan es connecta amb una xarxa de servidors distribuïts (Fedivers), els continguts poden intercanviar-se amb altres servidors i entre ells."
|
doYouConnectToFediverse_description1: "Quan es connecta amb una xarxa de servidors distribuïts (Fedivers), els continguts poden intercanviar-se amb altres servidors i entre ells."
|
||||||
doYouConnectToFediverse_description2: "La connexió amb el Fedivers també es coneix com a \"federació\"."
|
doYouConnectToFediverse_description2: "La connexió amb el Fedivers també es coneix com a \"federació\"."
|
||||||
youCanConfigureMoreFederationSettingsLater: "Les configuracions avançades, com especificar els servidors amb els quals es pot federar, es poden fer més tard."
|
youCanConfigureMoreFederationSettingsLater: "Les configuracions avançades, com especificar els servidors amb els quals es pot federar, es poden fer més tard."
|
||||||
|
remoteContentsCleaning: "Neteja automàtica del contingut rebut"
|
||||||
|
remoteContentsCleaning_description: "Quan es comença a federar es rep un munt de contingut, quan s'activa la neteja automàtica el contingut antic que no es consulta serà eliminat del servidor, el que permet estalviar espai d'emmagatzematge."
|
||||||
adminInfo: "Informació de l'administrador "
|
adminInfo: "Informació de l'administrador "
|
||||||
adminInfo_description: "Estableix la informació de l'administrador que es farà servir per rebre consultes."
|
adminInfo_description: "Estableix la informació de l'administrador que es farà servir per rebre consultes."
|
||||||
adminInfo_mustBeFilled: "Aquesta informació ha de ser omplerta si el servidor té els registres oberts o la federació es troba activada."
|
adminInfo_mustBeFilled: "Aquesta informació ha de ser omplerta si el servidor té els registres oberts o la federació es troba activada."
|
||||||
|
@ -3148,10 +3172,10 @@ _watermarkEditor:
|
||||||
type: "Tipus"
|
type: "Tipus"
|
||||||
image: "Imatges"
|
image: "Imatges"
|
||||||
advanced: "Avançat"
|
advanced: "Avançat"
|
||||||
|
angle: "Angle"
|
||||||
stripe: "Bandes"
|
stripe: "Bandes"
|
||||||
stripeWidth: "Amplada de la banda"
|
stripeWidth: "Amplada de la banda"
|
||||||
stripeFrequency: "Freqüència de la banda"
|
stripeFrequency: "Freqüència de la banda"
|
||||||
angle: "Angle"
|
|
||||||
polkadot: "Lunars"
|
polkadot: "Lunars"
|
||||||
checker: "Escacs"
|
checker: "Escacs"
|
||||||
polkadotMainDotOpacity: "Opacitat del lunar principal"
|
polkadotMainDotOpacity: "Opacitat del lunar principal"
|
||||||
|
@ -3163,6 +3187,7 @@ _imageEffector:
|
||||||
title: "Efecte"
|
title: "Efecte"
|
||||||
addEffect: "Afegeix un efecte"
|
addEffect: "Afegeix un efecte"
|
||||||
discardChangesConfirm: "Vols descartar els canvis i sortir?"
|
discardChangesConfirm: "Vols descartar els canvis i sortir?"
|
||||||
|
nothingToConfigure: "No hi ha opcions de configuració disponibles"
|
||||||
_fxs:
|
_fxs:
|
||||||
chromaticAberration: "Aberració cromàtica"
|
chromaticAberration: "Aberració cromàtica"
|
||||||
glitch: "Glitch"
|
glitch: "Glitch"
|
||||||
|
@ -3180,6 +3205,38 @@ _imageEffector:
|
||||||
checker: "Escacs"
|
checker: "Escacs"
|
||||||
blockNoise: "Bloqueig de soroll"
|
blockNoise: "Bloqueig de soroll"
|
||||||
tearing: "Trencament d'imatge "
|
tearing: "Trencament d'imatge "
|
||||||
|
_fxProps:
|
||||||
|
angle: "Angle"
|
||||||
|
scale: "Mida"
|
||||||
|
size: "Mida"
|
||||||
|
color: "Color"
|
||||||
|
opacity: "Opacitat"
|
||||||
|
normalize: "Normalitzar"
|
||||||
|
amount: "Quantitat"
|
||||||
|
lightness: "Brillantor"
|
||||||
|
contrast: "Contrast"
|
||||||
|
hue: "Tonalitat"
|
||||||
|
brightness: "Brillantor"
|
||||||
|
saturation: "Saturació"
|
||||||
|
max: "Màxim"
|
||||||
|
min: "Mínim"
|
||||||
|
direction: "Direcció "
|
||||||
|
phase: "Fase"
|
||||||
|
frequency: "Freqüència "
|
||||||
|
strength: "Intensitat"
|
||||||
|
glitchChannelShift: "Canvi de canal "
|
||||||
|
seed: "Llindar"
|
||||||
|
redComponent: "Component vermell"
|
||||||
|
greenComponent: "Component verd"
|
||||||
|
blueComponent: "Component blau"
|
||||||
|
threshold: "Llindar"
|
||||||
|
centerX: "Centre de X"
|
||||||
|
centerY: "Centre de Y"
|
||||||
|
zoomLinesSmoothing: "Suavitzat"
|
||||||
|
zoomLinesSmoothingDescription: "Els paràmetres de suavitzat i amplada de línia en augmentar no es poden fer servir junts."
|
||||||
|
zoomLinesThreshold: "Amplada de línia a l'augmentar "
|
||||||
|
zoomLinesMaskSize: "Diàmetre del centre"
|
||||||
|
zoomLinesBlack: "Obscurir"
|
||||||
drafts: "Esborrany "
|
drafts: "Esborrany "
|
||||||
_drafts:
|
_drafts:
|
||||||
select: "Seleccionar esborrany"
|
select: "Seleccionar esborrany"
|
||||||
|
|
|
@ -1107,6 +1107,8 @@ lastNDays: "Posledních {n} dnů"
|
||||||
surrender: "Zrušit"
|
surrender: "Zrušit"
|
||||||
postForm: "Formulář pro odeslání"
|
postForm: "Formulář pro odeslání"
|
||||||
information: "Informace"
|
information: "Informace"
|
||||||
|
inMinutes: "Minut"
|
||||||
|
inDays: "Dnů"
|
||||||
_chat:
|
_chat:
|
||||||
invitations: "Pozvat"
|
invitations: "Pozvat"
|
||||||
noHistory: "Žádná historie"
|
noHistory: "Žádná historie"
|
||||||
|
@ -2002,7 +2004,7 @@ _deck:
|
||||||
list: "Seznamy"
|
list: "Seznamy"
|
||||||
channel: "Kanály"
|
channel: "Kanály"
|
||||||
mentions: "Zmínění"
|
mentions: "Zmínění"
|
||||||
direct: "Přímý"
|
direct: "Přímé poznámky"
|
||||||
roleTimeline: "Časová osa role"
|
roleTimeline: "Časová osa role"
|
||||||
_dialog:
|
_dialog:
|
||||||
charactersExceeded: "Překročili jste maximální počet znaků! V současné době je na hodnotě {current} z {max}."
|
charactersExceeded: "Překročili jste maximální počet znaků! V současné době je na hodnotě {current} z {max}."
|
||||||
|
@ -2051,3 +2053,10 @@ _watermarkEditor:
|
||||||
type: "Typ"
|
type: "Typ"
|
||||||
image: "Obrázky"
|
image: "Obrázky"
|
||||||
advanced: "Pokročilé"
|
advanced: "Pokročilé"
|
||||||
|
_imageEffector:
|
||||||
|
_fxProps:
|
||||||
|
scale: "Velikost"
|
||||||
|
size: "Velikost"
|
||||||
|
color: "Barva"
|
||||||
|
opacity: "Průhlednost"
|
||||||
|
lightness: "Zesvětlit"
|
||||||
|
|
|
@ -1243,7 +1243,6 @@ releaseToRefresh: "Zum Aktualisieren loslassen"
|
||||||
refreshing: "Wird aktualisiert..."
|
refreshing: "Wird aktualisiert..."
|
||||||
pullDownToRefresh: "Zum Aktualisieren ziehen"
|
pullDownToRefresh: "Zum Aktualisieren ziehen"
|
||||||
useGroupedNotifications: "Benachrichtigungen gruppieren"
|
useGroupedNotifications: "Benachrichtigungen gruppieren"
|
||||||
signupPendingError: "Beim Überprüfen der Mailadresse ist etwas schiefgelaufen. Der Link könnte abgelaufen sein."
|
|
||||||
cwNotationRequired: "Ist \"Inhaltswarnung verwenden\" aktiviert, muss eine Beschreibung gegeben werden."
|
cwNotationRequired: "Ist \"Inhaltswarnung verwenden\" aktiviert, muss eine Beschreibung gegeben werden."
|
||||||
doReaction: "Reagieren"
|
doReaction: "Reagieren"
|
||||||
code: "Code"
|
code: "Code"
|
||||||
|
@ -1368,6 +1367,8 @@ redisplayAllTips: "Alle „Tipps und Tricks“ wieder anzeigen"
|
||||||
hideAllTips: "Alle „Tipps und Tricks“ ausblenden"
|
hideAllTips: "Alle „Tipps und Tricks“ ausblenden"
|
||||||
defaultImageCompressionLevel: "Standard-Bildkomprimierungsstufe"
|
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."
|
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)"
|
||||||
_order:
|
_order:
|
||||||
newest: "Neueste zuerst"
|
newest: "Neueste zuerst"
|
||||||
oldest: "Älteste zuerst"
|
oldest: "Älteste zuerst"
|
||||||
|
@ -3145,10 +3146,10 @@ _watermarkEditor:
|
||||||
type: "Art"
|
type: "Art"
|
||||||
image: "Bilder"
|
image: "Bilder"
|
||||||
advanced: "Fortgeschritten"
|
advanced: "Fortgeschritten"
|
||||||
|
angle: "Winkel"
|
||||||
stripe: "Streifen"
|
stripe: "Streifen"
|
||||||
stripeWidth: "Linienbreite"
|
stripeWidth: "Linienbreite"
|
||||||
stripeFrequency: "Linienanzahl"
|
stripeFrequency: "Linienanzahl"
|
||||||
angle: "Winkel"
|
|
||||||
polkadot: "Punktmuster"
|
polkadot: "Punktmuster"
|
||||||
polkadotMainDotOpacity: "Deckkraft des Hauptpunktes"
|
polkadotMainDotOpacity: "Deckkraft des Hauptpunktes"
|
||||||
polkadotMainDotRadius: "Größe des Hauptpunktes"
|
polkadotMainDotRadius: "Größe des Hauptpunktes"
|
||||||
|
@ -3171,6 +3172,13 @@ _imageEffector:
|
||||||
distort: "Verzerrung"
|
distort: "Verzerrung"
|
||||||
stripe: "Streifen"
|
stripe: "Streifen"
|
||||||
polkadot: "Punktmuster"
|
polkadot: "Punktmuster"
|
||||||
|
_fxProps:
|
||||||
|
angle: "Winkel"
|
||||||
|
scale: "Größe"
|
||||||
|
size: "Größe"
|
||||||
|
color: "Farbe"
|
||||||
|
opacity: "Transparenz"
|
||||||
|
lightness: "Erhellen"
|
||||||
drafts: "Entwurf"
|
drafts: "Entwurf"
|
||||||
_drafts:
|
_drafts:
|
||||||
select: "Entwurf auswählen"
|
select: "Entwurf auswählen"
|
||||||
|
|
|
@ -353,6 +353,7 @@ _visibility:
|
||||||
home: "Κεντρικό"
|
home: "Κεντρικό"
|
||||||
homeDescription: "Δημοσίευση στο κεντρικό χρονολόγιο μόνο"
|
homeDescription: "Δημοσίευση στο κεντρικό χρονολόγιο μόνο"
|
||||||
followers: "Ακολουθούν"
|
followers: "Ακολουθούν"
|
||||||
|
specified: "Απευθείας σημειώματα"
|
||||||
_profile:
|
_profile:
|
||||||
name: "Όνομα"
|
name: "Όνομα"
|
||||||
username: "Όνομα μέλους"
|
username: "Όνομα μέλους"
|
||||||
|
@ -395,6 +396,7 @@ _deck:
|
||||||
antenna: "Αντένες"
|
antenna: "Αντένες"
|
||||||
list: "Λίστα"
|
list: "Λίστα"
|
||||||
mentions: "Επισημάνσεις"
|
mentions: "Επισημάνσεις"
|
||||||
|
direct: "Απευθείας σημειώματα"
|
||||||
_webhookSettings:
|
_webhookSettings:
|
||||||
name: "Όνομα"
|
name: "Όνομα"
|
||||||
_moderationLogTypes:
|
_moderationLogTypes:
|
||||||
|
|
|
@ -81,7 +81,7 @@ import: "Import"
|
||||||
export: "Export"
|
export: "Export"
|
||||||
files: "Files"
|
files: "Files"
|
||||||
download: "Download"
|
download: "Download"
|
||||||
driveFileDeleteConfirm: "Do you want to remove the file \"{name}\"? Some content using this file will also be removed."
|
driveFileDeleteConfirm: "Are you sure you want to delete \"{name}\"? All notes with this file attached will also be deleted."
|
||||||
unfollowConfirm: "Are you sure you want to unfollow {name}?"
|
unfollowConfirm: "Are you sure you want to unfollow {name}?"
|
||||||
exportRequested: "You've requested an export. This may take a while. It will be added to your Drive once completed."
|
exportRequested: "You've requested an export. This may take a while. It will be added to your Drive once completed."
|
||||||
importRequested: "You've requested an import. This may take a while."
|
importRequested: "You've requested an import. This may take a while."
|
||||||
|
@ -1054,6 +1054,7 @@ permissionDeniedError: "Operation denied"
|
||||||
permissionDeniedErrorDescription: "This account does not have the permission to perform this action."
|
permissionDeniedErrorDescription: "This account does not have the permission to perform this action."
|
||||||
preset: "Preset"
|
preset: "Preset"
|
||||||
selectFromPresets: "Choose from presets"
|
selectFromPresets: "Choose from presets"
|
||||||
|
custom: "Custom"
|
||||||
achievements: "Achievements"
|
achievements: "Achievements"
|
||||||
gotInvalidResponseError: "Invalid server response"
|
gotInvalidResponseError: "Invalid server response"
|
||||||
gotInvalidResponseErrorDescription: "The server may be unreachable or undergoing maintenance. Please try again later."
|
gotInvalidResponseErrorDescription: "The server may be unreachable or undergoing maintenance. Please try again later."
|
||||||
|
@ -1092,6 +1093,7 @@ prohibitedWordsDescription2: "Using spaces will create AND expressions and surro
|
||||||
hiddenTags: "Hidden hashtags"
|
hiddenTags: "Hidden hashtags"
|
||||||
hiddenTagsDescription: "Select tags which will not shown on trend list.\nMultiple tags could be registered by lines."
|
hiddenTagsDescription: "Select tags which will not shown on trend list.\nMultiple tags could be registered by lines."
|
||||||
notesSearchNotAvailable: "Note search is unavailable."
|
notesSearchNotAvailable: "Note search is unavailable."
|
||||||
|
usersSearchNotAvailable: "User search is not available."
|
||||||
license: "License"
|
license: "License"
|
||||||
unfavoriteConfirm: "Really remove from favorites?"
|
unfavoriteConfirm: "Really remove from favorites?"
|
||||||
myClips: "My clips"
|
myClips: "My clips"
|
||||||
|
@ -1216,8 +1218,8 @@ showRepliesToOthersInTimeline: "Show replies to others in timeline"
|
||||||
hideRepliesToOthersInTimeline: "Hide replies to others from timeline"
|
hideRepliesToOthersInTimeline: "Hide replies to others from timeline"
|
||||||
showRepliesToOthersInTimelineAll: "Show replies to others from everyone you follow in timeline"
|
showRepliesToOthersInTimelineAll: "Show replies to others from everyone you follow in timeline"
|
||||||
hideRepliesToOthersInTimelineAll: "Hide replies to others from everyone you follow in timeline"
|
hideRepliesToOthersInTimelineAll: "Hide replies to others from everyone you follow in timeline"
|
||||||
confirmShowRepliesAll: "This operation is irreversible. Would you really like to show replies to others from everyone you follow in your timeline?"
|
confirmShowRepliesAll: "Are you sure you want to show replies from everyone you follow in your timeline? This action is irreversible."
|
||||||
confirmHideRepliesAll: "This operation is irreversible. Would you really like to hide replies to others from everyone you follow in your timeline?"
|
confirmHideRepliesAll: "Are you sure you want to hide replies from everyone you follow in your timeline? This action is irreversible."
|
||||||
externalServices: "External Services"
|
externalServices: "External Services"
|
||||||
sourceCode: "Source code"
|
sourceCode: "Source code"
|
||||||
sourceCodeIsNotYetProvided: "Source code is not yet available. Contact the administrator to fix this problem."
|
sourceCodeIsNotYetProvided: "Source code is not yet available. Contact the administrator to fix this problem."
|
||||||
|
@ -1243,7 +1245,7 @@ releaseToRefresh: "Release to refresh"
|
||||||
refreshing: "Refreshing..."
|
refreshing: "Refreshing..."
|
||||||
pullDownToRefresh: "Pull down to refresh"
|
pullDownToRefresh: "Pull down to refresh"
|
||||||
useGroupedNotifications: "Display grouped notifications"
|
useGroupedNotifications: "Display grouped notifications"
|
||||||
signupPendingError: "There was a problem verifying the email address. The link may have expired."
|
emailVerificationFailedError: "A problem occurred while verifying your email address. The link may have expired."
|
||||||
cwNotationRequired: "If \"Hide content\" is enabled, a description must be provided."
|
cwNotationRequired: "If \"Hide content\" is enabled, a description must be provided."
|
||||||
doReaction: "Add reaction"
|
doReaction: "Add reaction"
|
||||||
code: "Code"
|
code: "Code"
|
||||||
|
@ -1302,7 +1304,7 @@ passkeyVerificationSucceededButPasswordlessLoginDisabled: "Passkey verification
|
||||||
messageToFollower: "Message to followers"
|
messageToFollower: "Message to followers"
|
||||||
target: "Target"
|
target: "Target"
|
||||||
testCaptchaWarning: "This function is intended for CAPTCHA testing purposes.\n<strong>Do not use in a production environment.</strong>"
|
testCaptchaWarning: "This function is intended for CAPTCHA testing purposes.\n<strong>Do not use in a production environment.</strong>"
|
||||||
prohibitedWordsForNameOfUser: "Prohibited words for user names"
|
prohibitedWordsForNameOfUser: "Prohibited words for usernames"
|
||||||
prohibitedWordsForNameOfUserDescription: "If any of the strings in this list are included in the user's name, the name will be denied. Users with moderator privileges are not affected by this restriction."
|
prohibitedWordsForNameOfUserDescription: "If any of the strings in this list are included in the user's name, the name will be denied. Users with moderator privileges are not affected by this restriction."
|
||||||
yourNameContainsProhibitedWords: "Your name contains prohibited words"
|
yourNameContainsProhibitedWords: "Your name contains prohibited words"
|
||||||
yourNameContainsProhibitedWordsDescription: "If you wish to use this name, please contact your server administrator."
|
yourNameContainsProhibitedWordsDescription: "If you wish to use this name, please contact your server administrator."
|
||||||
|
@ -1368,6 +1370,13 @@ redisplayAllTips: "Show all “Tips & Tricks” again"
|
||||||
hideAllTips: "Hide all \"Tips & Tricks\""
|
hideAllTips: "Hide all \"Tips & Tricks\""
|
||||||
defaultImageCompressionLevel: "Default image compression level"
|
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."
|
defaultImageCompressionLevel_description: "Lower level preserves image quality but increases file size.<br>Higher level reduce file size, but reduce image quality."
|
||||||
|
inMinutes: "Minute(s)"
|
||||||
|
inDays: "Day(s)"
|
||||||
|
safeModeEnabled: "Safe mode is enabled"
|
||||||
|
pluginsAreDisabledBecauseSafeMode: "All plugins are disabled because safe mode is enabled."
|
||||||
|
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!"
|
||||||
_order:
|
_order:
|
||||||
newest: "Newest First"
|
newest: "Newest First"
|
||||||
oldest: "Oldest First"
|
oldest: "Oldest First"
|
||||||
|
@ -1400,7 +1409,7 @@ _chat:
|
||||||
muteThisRoom: "Mute room"
|
muteThisRoom: "Mute room"
|
||||||
deleteRoom: "Delete room"
|
deleteRoom: "Delete room"
|
||||||
chatNotAvailableForThisAccountOrServer: "Chat is not enabled on this server or for this account."
|
chatNotAvailableForThisAccountOrServer: "Chat is not enabled on this server or for this account."
|
||||||
chatIsReadOnlyForThisAccountOrServer: "Chat is read-only on this instance or this account. You cannot write new messages or create/join chat rooms."
|
chatIsReadOnlyForThisAccountOrServer: "Chat is read-only on this server or this account. You cannot write new messages or create/join chat rooms."
|
||||||
chatNotAvailableInOtherAccount: "The chat function is disabled for the other user."
|
chatNotAvailableInOtherAccount: "The chat function is disabled for the other user."
|
||||||
cannotChatWithTheUser: "Cannot start a chat with this user"
|
cannotChatWithTheUser: "Cannot start a chat with this user"
|
||||||
cannotChatWithTheUser_description: "Chat is either unavailable or the other party has not enabled chat."
|
cannotChatWithTheUser_description: "Chat is either unavailable or the other party has not enabled chat."
|
||||||
|
@ -1459,6 +1468,7 @@ _settings:
|
||||||
contentsUpdateFrequency_description2: "When real-time mode is on, content is updated in real time regardless of this setting."
|
contentsUpdateFrequency_description2: "When real-time mode is on, content is updated in real time regardless of this setting."
|
||||||
showUrlPreview: "Show URL preview"
|
showUrlPreview: "Show URL preview"
|
||||||
showAvailableReactionsFirstInNote: "Show available reactions at the top."
|
showAvailableReactionsFirstInNote: "Show available reactions at the top."
|
||||||
|
showPageTabBarBottom: "Show page tab bar at the bottom"
|
||||||
_chat:
|
_chat:
|
||||||
showSenderName: "Show sender's name"
|
showSenderName: "Show sender's name"
|
||||||
sendOnEnter: "Press Enter to send"
|
sendOnEnter: "Press Enter to send"
|
||||||
|
@ -1498,7 +1508,7 @@ _abuseUserReport:
|
||||||
resolveTutorial: "If the report's content is legitimate, select \"Accept\" to mark it as resolved.\nIf the report's content is illegitimate, select \"Reject\" to ignore it."
|
resolveTutorial: "If the report's content is legitimate, select \"Accept\" to mark it as resolved.\nIf the report's content is illegitimate, select \"Reject\" to ignore it."
|
||||||
_delivery:
|
_delivery:
|
||||||
status: "Delivery status"
|
status: "Delivery status"
|
||||||
stop: "Suspended"
|
stop: "Suspend"
|
||||||
resume: "Delivery resume"
|
resume: "Delivery resume"
|
||||||
_type:
|
_type:
|
||||||
none: "Publishing"
|
none: "Publishing"
|
||||||
|
@ -1632,6 +1642,10 @@ _serverSettings:
|
||||||
fanoutTimelineDbFallback: "Fallback to database"
|
fanoutTimelineDbFallback: "Fallback to database"
|
||||||
fanoutTimelineDbFallbackDescription: "When enabled, the timeline will fall back to the database for additional queries if the timeline is not cached. Disabling it further reduces the server load by eliminating the fallback process, but limits the range of timelines that can be retrieved."
|
fanoutTimelineDbFallbackDescription: "When enabled, the timeline will fall back to the database for additional queries if the timeline is not cached. Disabling it further reduces the server load by eliminating the fallback process, but limits the range of timelines that can be retrieved."
|
||||||
reactionsBufferingDescription: "When enabled, performance during reaction creation will be greatly improved, reducing the load on the database. However, Redis memory usage will increase."
|
reactionsBufferingDescription: "When enabled, performance during reaction creation will be greatly improved, reducing the load on the database. However, Redis memory usage will increase."
|
||||||
|
remoteNotesCleaning: "Automatic cleanup of remote notes"
|
||||||
|
remoteNotesCleaning_description: "When enabled, unused and outdated remote notes will be periodically cleaned up to prevent database bloat."
|
||||||
|
remoteNotesCleaningMaxProcessingDuration: "Maximum cleanup processing time"
|
||||||
|
remoteNotesCleaningExpiryDaysForEachNotes: "Minimum days to retain notes"
|
||||||
inquiryUrl: "Inquiry URL"
|
inquiryUrl: "Inquiry URL"
|
||||||
inquiryUrlDescription: "Specify a URL for the inquiry form to the server maintainer or a web page for the contact information."
|
inquiryUrlDescription: "Specify a URL for the inquiry form to the server maintainer or a web page for the contact information."
|
||||||
openRegistration: "Make the account creation open"
|
openRegistration: "Make the account creation open"
|
||||||
|
@ -1650,6 +1664,11 @@ _serverSettings:
|
||||||
userGeneratedContentsVisibilityForVisitor: "Visibility of user-generated content to guests"
|
userGeneratedContentsVisibilityForVisitor: "Visibility of user-generated content to guests"
|
||||||
userGeneratedContentsVisibilityForVisitor_description: "This is useful for preventing problems caused by inappropriate remote content that is not well moderated from being unintentionally published on the Internet via your own server."
|
userGeneratedContentsVisibilityForVisitor_description: "This is useful for preventing problems caused by inappropriate remote content that is not well moderated from being unintentionally published on the Internet via your own server."
|
||||||
userGeneratedContentsVisibilityForVisitor_description2: "Unconditionally publishing all content on the server to the Internet, including remote content received by the server is risky. This is especially important for guests who are unaware of the distributed nature of the content, as they may mistakenly believe that even remote content is content created by users on the server."
|
userGeneratedContentsVisibilityForVisitor_description2: "Unconditionally publishing all content on the server to the Internet, including remote content received by the server is risky. This is especially important for guests who are unaware of the distributed nature of the content, as they may mistakenly believe that even remote content is content created by users on the server."
|
||||||
|
restartServerSetupWizardConfirm_title: "Restart server setup wizard?"
|
||||||
|
restartServerSetupWizardConfirm_text: "Some current settings will be reset."
|
||||||
|
entrancePageStyle: "Entrance page style"
|
||||||
|
showTimelineForVisitor: "Show timeline"
|
||||||
|
showActivitiesForVisitor: "Show activities"
|
||||||
_userGeneratedContentsVisibilityForVisitor:
|
_userGeneratedContentsVisibilityForVisitor:
|
||||||
all: "Everything is public"
|
all: "Everything is public"
|
||||||
localOnly: "Only local content is published, remote content is kept private"
|
localOnly: "Only local content is published, remote content is kept private"
|
||||||
|
@ -1986,19 +2005,20 @@ _role:
|
||||||
descriptionOfRateLimitFactor: "Lower rate limits are less restrictive, higher ones more restrictive. "
|
descriptionOfRateLimitFactor: "Lower rate limits are less restrictive, higher ones more restrictive. "
|
||||||
canHideAds: "Can hide ads"
|
canHideAds: "Can hide ads"
|
||||||
canSearchNotes: "Usage of note search"
|
canSearchNotes: "Usage of note search"
|
||||||
|
canSearchUsers: "User search"
|
||||||
canUseTranslator: "Translator usage"
|
canUseTranslator: "Translator usage"
|
||||||
avatarDecorationLimit: "Maximum number of avatar decorations that can be applied"
|
avatarDecorationLimit: "Maximum number of avatar decorations"
|
||||||
canImportAntennas: "Allow importing antennas"
|
canImportAntennas: "Can import antennas"
|
||||||
canImportBlocking: "Allow importing blocking"
|
canImportBlocking: "Can import blocking"
|
||||||
canImportFollowing: "Allow importing following"
|
canImportFollowing: "Can import following"
|
||||||
canImportMuting: "Allow importing muting"
|
canImportMuting: "Can import muting"
|
||||||
canImportUserLists: "Allow importing lists"
|
canImportUserLists: "Can import lists"
|
||||||
chatAvailability: "Allow Chat"
|
chatAvailability: "Chat"
|
||||||
uploadableFileTypes: "Uploadable file types"
|
uploadableFileTypes: "Uploadable file types"
|
||||||
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_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."
|
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"
|
noteDraftLimit: "Number of possible drafts of server notes"
|
||||||
watermarkAvailable: "Availability of watermark function"
|
watermarkAvailable: "Watermark function"
|
||||||
_condition:
|
_condition:
|
||||||
roleAssignedTo: "Assigned to manual roles"
|
roleAssignedTo: "Assigned to manual roles"
|
||||||
isLocal: "Local user"
|
isLocal: "Local user"
|
||||||
|
@ -2258,6 +2278,7 @@ _time:
|
||||||
minute: "Minute(s)"
|
minute: "Minute(s)"
|
||||||
hour: "Hour(s)"
|
hour: "Hour(s)"
|
||||||
day: "Day(s)"
|
day: "Day(s)"
|
||||||
|
month: "Month(s)"
|
||||||
_2fa:
|
_2fa:
|
||||||
alreadyRegistered: "You have already registered a 2-factor authentication device."
|
alreadyRegistered: "You have already registered a 2-factor authentication device."
|
||||||
registerTOTP: "Register authenticator app"
|
registerTOTP: "Register authenticator app"
|
||||||
|
@ -2330,7 +2351,7 @@ _permissions:
|
||||||
"read:admin:index-stats": "View database index stats"
|
"read:admin:index-stats": "View database index stats"
|
||||||
"read:admin:table-stats": "View database table stats"
|
"read:admin:table-stats": "View database table stats"
|
||||||
"read:admin:user-ips": "View user IP addresses"
|
"read:admin:user-ips": "View user IP addresses"
|
||||||
"read:admin:meta": "View instance metadata"
|
"read:admin:meta": "View server metadata"
|
||||||
"write:admin:reset-password": "Reset user password"
|
"write:admin:reset-password": "Reset user password"
|
||||||
"write:admin:resolve-abuse-user-report": "Resolve user report"
|
"write:admin:resolve-abuse-user-report": "Resolve user report"
|
||||||
"write:admin:send-email": "Send email"
|
"write:admin:send-email": "Send email"
|
||||||
|
@ -2341,7 +2362,7 @@ _permissions:
|
||||||
"write:admin:unset-user-avatar": "Remove user avatar"
|
"write:admin:unset-user-avatar": "Remove user avatar"
|
||||||
"write:admin:unset-user-banner": "Remove user banner"
|
"write:admin:unset-user-banner": "Remove user banner"
|
||||||
"write:admin:unsuspend-user": "Unsuspend user"
|
"write:admin:unsuspend-user": "Unsuspend user"
|
||||||
"write:admin:meta": "Manage instance metadata"
|
"write:admin:meta": "Manage server metadata"
|
||||||
"write:admin:user-note": "Manage moderation note"
|
"write:admin:user-note": "Manage moderation note"
|
||||||
"write:admin:roles": "Manage roles"
|
"write:admin:roles": "Manage roles"
|
||||||
"read:admin:roles": "View roles"
|
"read:admin:roles": "View roles"
|
||||||
|
@ -2773,7 +2794,7 @@ _moderationLogTypes:
|
||||||
resetPassword: "Password reset"
|
resetPassword: "Password reset"
|
||||||
suspendRemoteInstance: "Remote instance suspended"
|
suspendRemoteInstance: "Remote instance suspended"
|
||||||
unsuspendRemoteInstance: "Remote instance unsuspended"
|
unsuspendRemoteInstance: "Remote instance unsuspended"
|
||||||
updateRemoteInstanceNote: "Moderation note updated for remote instance."
|
updateRemoteInstanceNote: "Updated moderation note for remote servers"
|
||||||
markSensitiveDriveFile: "File marked as sensitive"
|
markSensitiveDriveFile: "File marked as sensitive"
|
||||||
unmarkSensitiveDriveFile: "File unmarked as sensitive"
|
unmarkSensitiveDriveFile: "File unmarked as sensitive"
|
||||||
resolveAbuseReport: "Report resolved"
|
resolveAbuseReport: "Report resolved"
|
||||||
|
@ -3060,6 +3081,7 @@ _bootErrors:
|
||||||
otherOption1: "Delete client settings and cache"
|
otherOption1: "Delete client settings and cache"
|
||||||
otherOption2: "Start the simple client"
|
otherOption2: "Start the simple client"
|
||||||
otherOption3: "Launch the repair tool"
|
otherOption3: "Launch the repair tool"
|
||||||
|
otherOption4: "Launch Misskey in safe mode"
|
||||||
_search:
|
_search:
|
||||||
searchScopeAll: "All"
|
searchScopeAll: "All"
|
||||||
searchScopeLocal: "Local"
|
searchScopeLocal: "Local"
|
||||||
|
@ -3096,6 +3118,8 @@ _serverSetupWizard:
|
||||||
doYouConnectToFediverse_description1: "When connected to a network of distributed servers (Fediverse) content can be exchanged with other servers."
|
doYouConnectToFediverse_description1: "When connected to a network of distributed servers (Fediverse) content can be exchanged with other servers."
|
||||||
doYouConnectToFediverse_description2: "Connecting with the Fediverse is also called \"federation\""
|
doYouConnectToFediverse_description2: "Connecting with the Fediverse is also called \"federation\""
|
||||||
youCanConfigureMoreFederationSettingsLater: "Advanced settings such as specifying federated servers can be configured later."
|
youCanConfigureMoreFederationSettingsLater: "Advanced settings such as specifying federated servers can be configured later."
|
||||||
|
remoteContentsCleaning: "Automatic cleanup of received contents"
|
||||||
|
remoteContentsCleaning_description: "Federation may result in a continuous inflow of content. Enabling automatic cleanup will remove outdated and unreferenced content from the server to save storage."
|
||||||
adminInfo: "Administrator information"
|
adminInfo: "Administrator information"
|
||||||
adminInfo_description: "Sets the administrator information used to receive inquiries."
|
adminInfo_description: "Sets the administrator information used to receive inquiries."
|
||||||
adminInfo_mustBeFilled: "Must be entered if public server or federation is on."
|
adminInfo_mustBeFilled: "Must be entered if public server or federation is on."
|
||||||
|
@ -3148,10 +3172,10 @@ _watermarkEditor:
|
||||||
type: "Type"
|
type: "Type"
|
||||||
image: "Images"
|
image: "Images"
|
||||||
advanced: "Advanced"
|
advanced: "Advanced"
|
||||||
|
angle: "Angle"
|
||||||
stripe: "Stripes"
|
stripe: "Stripes"
|
||||||
stripeWidth: "Line width"
|
stripeWidth: "Line width"
|
||||||
stripeFrequency: "Lines count"
|
stripeFrequency: "Lines count"
|
||||||
angle: "Angle"
|
|
||||||
polkadot: "Polkadot"
|
polkadot: "Polkadot"
|
||||||
checker: "Checker"
|
checker: "Checker"
|
||||||
polkadotMainDotOpacity: "Opacity of the main dot"
|
polkadotMainDotOpacity: "Opacity of the main dot"
|
||||||
|
@ -3163,6 +3187,7 @@ _imageEffector:
|
||||||
title: "Effects"
|
title: "Effects"
|
||||||
addEffect: "Add Effects"
|
addEffect: "Add Effects"
|
||||||
discardChangesConfirm: "Are you sure you want to leave? You have unsaved changes."
|
discardChangesConfirm: "Are you sure you want to leave? You have unsaved changes."
|
||||||
|
nothingToConfigure: "No configurable options available"
|
||||||
_fxs:
|
_fxs:
|
||||||
chromaticAberration: "Chromatic Aberration"
|
chromaticAberration: "Chromatic Aberration"
|
||||||
glitch: "Glitch"
|
glitch: "Glitch"
|
||||||
|
@ -3180,6 +3205,38 @@ _imageEffector:
|
||||||
checker: "Checker"
|
checker: "Checker"
|
||||||
blockNoise: "Block Noise"
|
blockNoise: "Block Noise"
|
||||||
tearing: "Tearing"
|
tearing: "Tearing"
|
||||||
|
_fxProps:
|
||||||
|
angle: "Angle"
|
||||||
|
scale: "Size"
|
||||||
|
size: "Size"
|
||||||
|
color: "Color"
|
||||||
|
opacity: "Opacity"
|
||||||
|
normalize: "Normalize"
|
||||||
|
amount: "Amount"
|
||||||
|
lightness: "Lighten"
|
||||||
|
contrast: "Contrast"
|
||||||
|
hue: "Hue"
|
||||||
|
brightness: "Brightness"
|
||||||
|
saturation: "Saturation"
|
||||||
|
max: "Maximum"
|
||||||
|
min: "Minimum"
|
||||||
|
direction: "Direction"
|
||||||
|
phase: "Phase"
|
||||||
|
frequency: "Frequency"
|
||||||
|
strength: "Strength"
|
||||||
|
glitchChannelShift: "Channel shift"
|
||||||
|
seed: "Seed value"
|
||||||
|
redComponent: "Red component"
|
||||||
|
greenComponent: "Green component"
|
||||||
|
blueComponent: "Blue component"
|
||||||
|
threshold: "Threshold"
|
||||||
|
centerX: "Center X"
|
||||||
|
centerY: "Center Y"
|
||||||
|
zoomLinesSmoothing: "Smoothing"
|
||||||
|
zoomLinesSmoothingDescription: "Smoothing and zoom line width cannot be used together."
|
||||||
|
zoomLinesThreshold: "Zoom line width"
|
||||||
|
zoomLinesMaskSize: "Center diameter"
|
||||||
|
zoomLinesBlack: "Make black"
|
||||||
drafts: "Drafts"
|
drafts: "Drafts"
|
||||||
_drafts:
|
_drafts:
|
||||||
select: "Select Draft"
|
select: "Select Draft"
|
||||||
|
|
|
@ -280,8 +280,8 @@ featured: "Destacados"
|
||||||
usernameOrUserId: "Nombre o ID del usuario"
|
usernameOrUserId: "Nombre o ID del usuario"
|
||||||
noSuchUser: "No se encuentra el usuario"
|
noSuchUser: "No se encuentra el usuario"
|
||||||
lookup: "Búsqueda"
|
lookup: "Búsqueda"
|
||||||
announcements: "Anuncios"
|
announcements: "Avisos"
|
||||||
imageUrl: "URL de la imágen"
|
imageUrl: "URL de la imagen."
|
||||||
remove: "Borrar"
|
remove: "Borrar"
|
||||||
removed: "Borrado"
|
removed: "Borrado"
|
||||||
removeAreYouSure: "¿Desea borrar \"{x}\"?"
|
removeAreYouSure: "¿Desea borrar \"{x}\"?"
|
||||||
|
@ -842,7 +842,7 @@ unlikeConfirm: "¿Quitar como favorito?"
|
||||||
fullView: "Vista completa"
|
fullView: "Vista completa"
|
||||||
quitFullView: "quitar vista completa"
|
quitFullView: "quitar vista completa"
|
||||||
addDescription: "Agregar descripción"
|
addDescription: "Agregar descripción"
|
||||||
userPagePinTip: "Puede mantener sus notas visibles aquí seleccionando Pin en el menú de notas individuales"
|
userPagePinTip: "Puede mantener sus notas visibles aquí seleccionando 'Fijar al perfil' en el menú de notas individuales"
|
||||||
notSpecifiedMentionWarning: "Algunas menciones no están incluidas en el destino"
|
notSpecifiedMentionWarning: "Algunas menciones no están incluidas en el destino"
|
||||||
info: "Información"
|
info: "Información"
|
||||||
userInfo: "Información del usuario"
|
userInfo: "Información del usuario"
|
||||||
|
@ -877,7 +877,7 @@ popularPosts: "Más vistos"
|
||||||
shareWithNote: "Compartir con una nota"
|
shareWithNote: "Compartir con una nota"
|
||||||
ads: "Anuncios"
|
ads: "Anuncios"
|
||||||
expiration: "Termina el"
|
expiration: "Termina el"
|
||||||
startingperiod: "periodo de inicio"
|
startingperiod: "Comienzo"
|
||||||
memo: "Notas"
|
memo: "Notas"
|
||||||
priority: "Prioridad"
|
priority: "Prioridad"
|
||||||
high: "Alta"
|
high: "Alta"
|
||||||
|
@ -1054,6 +1054,7 @@ permissionDeniedError: "Operación denegada"
|
||||||
permissionDeniedErrorDescription: "Esta cuenta no tiene permisos para hacer esa acción."
|
permissionDeniedErrorDescription: "Esta cuenta no tiene permisos para hacer esa acción."
|
||||||
preset: "Predefinido"
|
preset: "Predefinido"
|
||||||
selectFromPresets: "Escoger desde predefinidos"
|
selectFromPresets: "Escoger desde predefinidos"
|
||||||
|
custom: "Personalizado"
|
||||||
achievements: "Logros"
|
achievements: "Logros"
|
||||||
gotInvalidResponseError: "Respuesta del servidor inválida"
|
gotInvalidResponseError: "Respuesta del servidor inválida"
|
||||||
gotInvalidResponseErrorDescription: "Puede que el servidor esté caído o en mantenimiento. Favor de intentar más tarde"
|
gotInvalidResponseErrorDescription: "Puede que el servidor esté caído o en mantenimiento. Favor de intentar más tarde"
|
||||||
|
@ -1092,6 +1093,7 @@ prohibitedWordsDescription2: "Si se usan espacios se crearán expresiones AND y
|
||||||
hiddenTags: "Hashtags ocultos"
|
hiddenTags: "Hashtags ocultos"
|
||||||
hiddenTagsDescription: "Selecciona las etiquetas que no se mostrarán en tendencias. Una etiqueta por línea."
|
hiddenTagsDescription: "Selecciona las etiquetas que no se mostrarán en tendencias. Una etiqueta por línea."
|
||||||
notesSearchNotAvailable: "No se puede buscar una nota"
|
notesSearchNotAvailable: "No se puede buscar una nota"
|
||||||
|
usersSearchNotAvailable: "La búsqueda de usuarios no está disponible."
|
||||||
license: "Licencia"
|
license: "Licencia"
|
||||||
unfavoriteConfirm: "¿Desea quitar de favoritos?"
|
unfavoriteConfirm: "¿Desea quitar de favoritos?"
|
||||||
myClips: "Mis clips"
|
myClips: "Mis clips"
|
||||||
|
@ -1143,7 +1145,7 @@ channelArchiveConfirmTitle: "¿Seguro de archivar {name}?"
|
||||||
channelArchiveConfirmDescription: "Un canal archivado no aparecerá en la lista de canales ni en los resultados. Las nuevas publicaciones tampoco serán añadidas."
|
channelArchiveConfirmDescription: "Un canal archivado no aparecerá en la lista de canales ni en los resultados. Las nuevas publicaciones tampoco serán añadidas."
|
||||||
thisChannelArchived: "El canal ha sido archivado."
|
thisChannelArchived: "El canal ha sido archivado."
|
||||||
displayOfNote: "Mostrar notas"
|
displayOfNote: "Mostrar notas"
|
||||||
initialAccountSetting: "Configración inicial de su cuenta\nか\nConfigración de inicio"
|
initialAccountSetting: "Configración inicial de su cuenta"
|
||||||
youFollowing: "Siguiendo"
|
youFollowing: "Siguiendo"
|
||||||
preventAiLearning: "Rechazar el uso en el Aprendizaje de Máquinas. (IA Generativa)"
|
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."
|
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."
|
||||||
|
@ -1243,7 +1245,7 @@ releaseToRefresh: "Soltar para recargar"
|
||||||
refreshing: "Recargando..."
|
refreshing: "Recargando..."
|
||||||
pullDownToRefresh: "Tira hacia abajo para recargar"
|
pullDownToRefresh: "Tira hacia abajo para recargar"
|
||||||
useGroupedNotifications: "Mostrar notificaciones agrupadas"
|
useGroupedNotifications: "Mostrar notificaciones agrupadas"
|
||||||
signupPendingError: "Ha habido un problema al verificar tu dirección de correo electrónico. Es posible que el enlace haya caducado."
|
emailVerificationFailedError: "Se ha producido un error al confirmar tu dirección de correo electrónico. Es posible que el enlace haya caducado."
|
||||||
cwNotationRequired: "Si se ha activado \"ocultar contenido\", es necesario proporcionar una descripción."
|
cwNotationRequired: "Si se ha activado \"ocultar contenido\", es necesario proporcionar una descripción."
|
||||||
doReaction: "Añadir reacción"
|
doReaction: "Añadir reacción"
|
||||||
code: "Código"
|
code: "Código"
|
||||||
|
@ -1358,8 +1360,8 @@ advice: "Consejos"
|
||||||
realtimeMode: "Modo en tiempo real"
|
realtimeMode: "Modo en tiempo real"
|
||||||
turnItOn: "Activar"
|
turnItOn: "Activar"
|
||||||
turnItOff: "Desactivar"
|
turnItOff: "Desactivar"
|
||||||
emojiMute: "Silenciar emojis"
|
emojiMute: "Silenciar emoji"
|
||||||
emojiUnmute: "No Silenciar emojis"
|
emojiUnmute: "No silenciar emoji"
|
||||||
muteX: "Silenciar {x}"
|
muteX: "Silenciar {x}"
|
||||||
unmuteX: "Dejar de silenciar {x}"
|
unmuteX: "Dejar de silenciar {x}"
|
||||||
abort: "Abortar"
|
abort: "Abortar"
|
||||||
|
@ -1368,6 +1370,13 @@ redisplayAllTips: "Volver a mostrar todos \"Trucos y consejos\""
|
||||||
hideAllTips: "Ocultar todos los \"Trucos y consejos\""
|
hideAllTips: "Ocultar todos los \"Trucos y consejos\""
|
||||||
defaultImageCompressionLevel: "Nivel de compresión de la imagen por defecto"
|
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."
|
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."
|
||||||
|
inMinutes: "Minutos"
|
||||||
|
inDays: "Días"
|
||||||
|
safeModeEnabled: "El modo seguro está activado"
|
||||||
|
pluginsAreDisabledBecauseSafeMode: "El modo seguro está activado, por lo que todos los plugins están desactivados."
|
||||||
|
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!"
|
||||||
_order:
|
_order:
|
||||||
newest: "Los más recientes primero"
|
newest: "Los más recientes primero"
|
||||||
oldest: "Los más antiguos primero"
|
oldest: "Los más antiguos primero"
|
||||||
|
@ -1459,6 +1468,7 @@ _settings:
|
||||||
contentsUpdateFrequency_description2: "Cuando el modo en tiempo real está activado, el contenido se actualiza en tiempo real independientemente de esta configuración."
|
contentsUpdateFrequency_description2: "Cuando el modo en tiempo real está activado, el contenido se actualiza en tiempo real independientemente de esta configuración."
|
||||||
showUrlPreview: "Mostrar la vista previa de la URL"
|
showUrlPreview: "Mostrar la vista previa de la URL"
|
||||||
showAvailableReactionsFirstInNote: "Mostrar las reacciones disponibles en la parte superior."
|
showAvailableReactionsFirstInNote: "Mostrar las reacciones disponibles en la parte superior."
|
||||||
|
showPageTabBarBottom: "Mostrar la barra de pestañas de la página en la parte inferior."
|
||||||
_chat:
|
_chat:
|
||||||
showSenderName: "Mostrar el nombre del remitente"
|
showSenderName: "Mostrar el nombre del remitente"
|
||||||
sendOnEnter: "Intro para enviar"
|
sendOnEnter: "Intro para enviar"
|
||||||
|
@ -1530,7 +1540,7 @@ _announcement:
|
||||||
tooManyActiveAnnouncementDescription: "Tener demasiados anuncios activos empeora la experiencia de usuario. Por favor, considera archivar aquellos anuncios que hayan quedado obsoletos."
|
tooManyActiveAnnouncementDescription: "Tener demasiados anuncios activos empeora la experiencia de usuario. Por favor, considera archivar aquellos anuncios que hayan quedado obsoletos."
|
||||||
readConfirmTitle: "¿Marcar como leído?"
|
readConfirmTitle: "¿Marcar como leído?"
|
||||||
readConfirmText: "Esto marcará el contenido de \"{title}\" como leído."
|
readConfirmText: "Esto marcará el contenido de \"{title}\" como leído."
|
||||||
shouldNotBeUsedToPresentPermanentInfo: "Dado que puede impactar en la experiencia de usuario de forma significativa, es recomendable usar notificaciones en el flujo de información en vez de información persistente."
|
shouldNotBeUsedToPresentPermanentInfo: "Se recomienda utilizar los avisos para publicar información que requiera inmediatez, en lugar de hacerlo constantemente, ya que esto perjudica especialmente la UX de los nuevos usuarios."
|
||||||
dialogAnnouncementUxWarn: "Mostrar dos o más notificaciones en formato diálogo a la vez puede impactar en la experiencia de usuario de forma significativa, úsalos con cuidado."
|
dialogAnnouncementUxWarn: "Mostrar dos o más notificaciones en formato diálogo a la vez puede impactar en la experiencia de usuario de forma significativa, úsalos con cuidado."
|
||||||
silence: "Silenciar notificaciones"
|
silence: "Silenciar notificaciones"
|
||||||
silenceDescription: "Si lo activas, no enviarás notificación sobre este anuncio y el usuario no tendrá que leerlo."
|
silenceDescription: "Si lo activas, no enviarás notificación sobre este anuncio y el usuario no tendrá que leerlo."
|
||||||
|
@ -1632,6 +1642,10 @@ _serverSettings:
|
||||||
fanoutTimelineDbFallback: "Cargar desde la base de datos"
|
fanoutTimelineDbFallback: "Cargar desde la base de datos"
|
||||||
fanoutTimelineDbFallbackDescription: "Cuando esta opción está habilitada, la carga de peticiones adicionales de la línea de tiempo se hará desde la base de datos cuando éstas no se encuentren en la caché. Al deshabilitar esta opción se reduce la carga del servidor, pero limita el número de líneas de tiempo que pueden obtenerse."
|
fanoutTimelineDbFallbackDescription: "Cuando esta opción está habilitada, la carga de peticiones adicionales de la línea de tiempo se hará desde la base de datos cuando éstas no se encuentren en la caché. Al deshabilitar esta opción se reduce la carga del servidor, pero limita el número de líneas de tiempo que pueden obtenerse."
|
||||||
reactionsBufferingDescription: "Cuando se activa, el rendimiento durante la creación de reacciones mejorará considerablemente, reduciendo la carga de la base de datos. Sin embargo, aumentará el uso de memoria de Redis."
|
reactionsBufferingDescription: "Cuando se activa, el rendimiento durante la creación de reacciones mejorará considerablemente, reduciendo la carga de la base de datos. Sin embargo, aumentará el uso de memoria de Redis."
|
||||||
|
remoteNotesCleaning: "Limpieza automática de notas (publicaciones) remotas"
|
||||||
|
remoteNotesCleaning_description: "Al habilitar esta opción, se limpiarán periódicamente las entradas remotas antiguas que no se consultan, lo que evitará que la base de datos se sature."
|
||||||
|
remoteNotesCleaningMaxProcessingDuration: "Tiempo máximo de funcionamiento continuo del proceso de limpieza"
|
||||||
|
remoteNotesCleaningExpiryDaysForEachNotes: "Días mínimos para conservar las notas"
|
||||||
inquiryUrl: "URL de consulta "
|
inquiryUrl: "URL de consulta "
|
||||||
inquiryUrlDescription: "Especifica una URL para el formulario de consulta al responsable del servidor o una página web para la información de contacto."
|
inquiryUrlDescription: "Especifica una URL para el formulario de consulta al responsable del servidor o una página web para la información de contacto."
|
||||||
openRegistration: "Registros Abiertos"
|
openRegistration: "Registros Abiertos"
|
||||||
|
@ -1650,6 +1664,11 @@ _serverSettings:
|
||||||
userGeneratedContentsVisibilityForVisitor: "Visibilidad de contenido generado por un usuario a invitados"
|
userGeneratedContentsVisibilityForVisitor: "Visibilidad de contenido generado por un usuario a invitados"
|
||||||
userGeneratedContentsVisibilityForVisitor_description: "Esto es útil para evitar problemas causados por contenidos remotos inapropiados que no estén bien moderados y que se publiquen involuntariamente en Internet a través de su propio servidor."
|
userGeneratedContentsVisibilityForVisitor_description: "Esto es útil para evitar problemas causados por contenidos remotos inapropiados que no estén bien moderados y que se publiquen involuntariamente en Internet a través de su propio servidor."
|
||||||
userGeneratedContentsVisibilityForVisitor_description2: "Publicar incondicionalmente todo el contenido del servidor en Internet, incluido el contenido remoto recibido por el servidor, es arriesgado. Esto es especialmente importante para los invitados que desconocen la naturaleza distribuida del contenido, ya que pueden creer erróneamente que incluso el contenido remoto es contenido creado por usuarios en el servidor."
|
userGeneratedContentsVisibilityForVisitor_description2: "Publicar incondicionalmente todo el contenido del servidor en Internet, incluido el contenido remoto recibido por el servidor, es arriesgado. Esto es especialmente importante para los invitados que desconocen la naturaleza distribuida del contenido, ya que pueden creer erróneamente que incluso el contenido remoto es contenido creado por usuarios en el servidor."
|
||||||
|
restartServerSetupWizardConfirm_title: "¿Reiniciar el asistente de configuración del servidor?"
|
||||||
|
restartServerSetupWizardConfirm_text: "Algunas configuraciones actuales se restablecerán"
|
||||||
|
entrancePageStyle: "Estilo de la página de inicio"
|
||||||
|
showTimelineForVisitor: "Mostrar la línea de tiempo"
|
||||||
|
showActivitiesForVisitor: "Mostrar actividades"
|
||||||
_userGeneratedContentsVisibilityForVisitor:
|
_userGeneratedContentsVisibilityForVisitor:
|
||||||
all: "Todo es público."
|
all: "Todo es público."
|
||||||
localOnly: "Sólo se publica el contenido local, el remoto se mantiene privado"
|
localOnly: "Sólo se publica el contenido local, el remoto se mantiene privado"
|
||||||
|
@ -1986,6 +2005,7 @@ _role:
|
||||||
descriptionOfRateLimitFactor: "Límites más bajos son menos restrictivos, más altos menos restrictivos"
|
descriptionOfRateLimitFactor: "Límites más bajos son menos restrictivos, más altos menos restrictivos"
|
||||||
canHideAds: "Puede ocultar anuncios"
|
canHideAds: "Puede ocultar anuncios"
|
||||||
canSearchNotes: "Uso de la búsqueda de notas"
|
canSearchNotes: "Uso de la búsqueda de notas"
|
||||||
|
canSearchUsers: "Uso de la búsqueda de usuarios"
|
||||||
canUseTranslator: "Uso de traductor"
|
canUseTranslator: "Uso de traductor"
|
||||||
avatarDecorationLimit: "Número máximo de decoraciones de avatar"
|
avatarDecorationLimit: "Número máximo de decoraciones de avatar"
|
||||||
canImportAntennas: "Permitir la importación de antenas"
|
canImportAntennas: "Permitir la importación de antenas"
|
||||||
|
@ -2117,7 +2137,7 @@ _aboutMisskey:
|
||||||
_displayOfSensitiveMedia:
|
_displayOfSensitiveMedia:
|
||||||
respect: "Esconder medios marcados como sensibles"
|
respect: "Esconder medios marcados como sensibles"
|
||||||
ignore: "Mostrar medios marcados como sensibles"
|
ignore: "Mostrar medios marcados como sensibles"
|
||||||
force: "Esconder todala multimedia"
|
force: "Esconder toda la multimedia"
|
||||||
_instanceTicker:
|
_instanceTicker:
|
||||||
none: "No mostrar"
|
none: "No mostrar"
|
||||||
remote: "Mostrar a usuarios remotos"
|
remote: "Mostrar a usuarios remotos"
|
||||||
|
@ -2258,6 +2278,7 @@ _time:
|
||||||
minute: "Minutos"
|
minute: "Minutos"
|
||||||
hour: "Horas"
|
hour: "Horas"
|
||||||
day: "Días"
|
day: "Días"
|
||||||
|
month: "Mes(es)"
|
||||||
_2fa:
|
_2fa:
|
||||||
alreadyRegistered: "Ya has completado la configuración."
|
alreadyRegistered: "Ya has completado la configuración."
|
||||||
registerTOTP: "Registrar aplicación autenticadora"
|
registerTOTP: "Registrar aplicación autenticadora"
|
||||||
|
@ -3060,6 +3081,7 @@ _bootErrors:
|
||||||
otherOption1: "Borra la configuración y la memoria caché del cliente"
|
otherOption1: "Borra la configuración y la memoria caché del cliente"
|
||||||
otherOption2: "Iniciar el cliente simple"
|
otherOption2: "Iniciar el cliente simple"
|
||||||
otherOption3: "Iniciar la herramienta de reparación"
|
otherOption3: "Iniciar la herramienta de reparación"
|
||||||
|
otherOption4: "Iniciar Misskey en modo seguro"
|
||||||
_search:
|
_search:
|
||||||
searchScopeAll: "Todo"
|
searchScopeAll: "Todo"
|
||||||
searchScopeLocal: "Local"
|
searchScopeLocal: "Local"
|
||||||
|
@ -3096,6 +3118,8 @@ _serverSetupWizard:
|
||||||
doYouConnectToFediverse_description1: "Cuando se conecta a una red de servidores distribuidos (Fediverso), el contenido puede intercambiarse con otros servidores."
|
doYouConnectToFediverse_description1: "Cuando se conecta a una red de servidores distribuidos (Fediverso), el contenido puede intercambiarse con otros servidores."
|
||||||
doYouConnectToFediverse_description2: "Conectarse con el Fediverso también se conoce como \"federación\"."
|
doYouConnectToFediverse_description2: "Conectarse con el Fediverso también se conoce como \"federación\"."
|
||||||
youCanConfigureMoreFederationSettingsLater: "Los ajustes avanzados, como la especificación de servidores federados, pueden configurarse más adelante."
|
youCanConfigureMoreFederationSettingsLater: "Los ajustes avanzados, como la especificación de servidores federados, pueden configurarse más adelante."
|
||||||
|
remoteContentsCleaning: "Limpieza automática de los contenidos recibidos"
|
||||||
|
remoteContentsCleaning_description: "La federación puede dar lugar a un flujo continuo de contenido. Al habilitar la limpieza automática, se eliminará del servidor el contenido obsoleto y sin referencias para ahorrar espacio de almacenamiento."
|
||||||
adminInfo: "Información del administrador"
|
adminInfo: "Información del administrador"
|
||||||
adminInfo_description: "Establece la información del administrador para recibir consultas."
|
adminInfo_description: "Establece la información del administrador para recibir consultas."
|
||||||
adminInfo_mustBeFilled: "Esta información debe ser introducida en el caso de registros abiertos o la federación esté activada."
|
adminInfo_mustBeFilled: "Esta información debe ser introducida en el caso de registros abiertos o la federación esté activada."
|
||||||
|
@ -3121,7 +3145,7 @@ _uploader:
|
||||||
tip: "El archivo aún no se ha cargado, por lo que este cuadro de diálogo te permite confirmar, renombrar, comprimir y recortar el archivo antes de cargarlo. Cuando esté listo, puedes iniciar la carga pulsando el botón \"Cargar\"."
|
tip: "El archivo aún no se ha cargado, por lo que este cuadro de diálogo te permite confirmar, renombrar, comprimir y recortar el archivo antes de cargarlo. Cuando esté listo, puedes iniciar la carga pulsando el botón \"Cargar\"."
|
||||||
_clientPerformanceIssueTip:
|
_clientPerformanceIssueTip:
|
||||||
title: "Si crees que el consumo de batería es demasiado alto"
|
title: "Si crees que el consumo de batería es demasiado alto"
|
||||||
makeSureDisabledAdBlocker: "Por favor, desactive el bloqueador de publicidad."
|
makeSureDisabledAdBlocker: "Por favor, desactiva el bloqueador de publicidad."
|
||||||
makeSureDisabledAdBlocker_description: "Los bloqueadores de anuncios pueden afectar al rendimiento. Asegúrate de que no están activados en tu sistema o en las funciones/extensiones de tu navegador."
|
makeSureDisabledAdBlocker_description: "Los bloqueadores de anuncios pueden afectar al rendimiento. Asegúrate de que no están activados en tu sistema o en las funciones/extensiones de tu navegador."
|
||||||
makeSureDisabledCustomCss: "Desactiva el CSS personalizado"
|
makeSureDisabledCustomCss: "Desactiva el CSS personalizado"
|
||||||
makeSureDisabledCustomCss_description: "Anular estilos puede afectar al rendimiento. Asegúrate de que el CSS personalizado o las extensiones que sobrescriben estilos no están activados."
|
makeSureDisabledCustomCss_description: "Anular estilos puede afectar al rendimiento. Asegúrate de que el CSS personalizado o las extensiones que sobrescriben estilos no están activados."
|
||||||
|
@ -3148,10 +3172,10 @@ _watermarkEditor:
|
||||||
type: "Tipo"
|
type: "Tipo"
|
||||||
image: "Imágenes"
|
image: "Imágenes"
|
||||||
advanced: "Avanzado"
|
advanced: "Avanzado"
|
||||||
|
angle: "Ángulo"
|
||||||
stripe: "Rayas"
|
stripe: "Rayas"
|
||||||
stripeWidth: "Anchura de línea"
|
stripeWidth: "Anchura de línea"
|
||||||
stripeFrequency: "Número de líneas."
|
stripeFrequency: "Número de líneas."
|
||||||
angle: "Ángulo"
|
|
||||||
polkadot: "Lunares"
|
polkadot: "Lunares"
|
||||||
checker: "verificador"
|
checker: "verificador"
|
||||||
polkadotMainDotOpacity: "Opacidad del círculo principal"
|
polkadotMainDotOpacity: "Opacidad del círculo principal"
|
||||||
|
@ -3163,6 +3187,7 @@ _imageEffector:
|
||||||
title: "Efecto"
|
title: "Efecto"
|
||||||
addEffect: "Añadir Efecto"
|
addEffect: "Añadir Efecto"
|
||||||
discardChangesConfirm: "¿Ignorar cambios y salir?"
|
discardChangesConfirm: "¿Ignorar cambios y salir?"
|
||||||
|
nothingToConfigure: "No hay opciones configurables disponibles."
|
||||||
_fxs:
|
_fxs:
|
||||||
chromaticAberration: "Aberración Cromática"
|
chromaticAberration: "Aberración Cromática"
|
||||||
glitch: "Glitch"
|
glitch: "Glitch"
|
||||||
|
@ -3180,6 +3205,38 @@ _imageEffector:
|
||||||
checker: "Corrector"
|
checker: "Corrector"
|
||||||
blockNoise: "Bloquear Ruido"
|
blockNoise: "Bloquear Ruido"
|
||||||
tearing: "Rasgado de Imagen (Tearing)"
|
tearing: "Rasgado de Imagen (Tearing)"
|
||||||
|
_fxProps:
|
||||||
|
angle: "Ángulo"
|
||||||
|
scale: "Tamaño"
|
||||||
|
size: "Tamaño"
|
||||||
|
color: "Color"
|
||||||
|
opacity: "Opacidad"
|
||||||
|
normalize: "Normalización"
|
||||||
|
amount: "Cantidad"
|
||||||
|
lightness: "Brillo"
|
||||||
|
contrast: "Contraste"
|
||||||
|
hue: "Tonalidad"
|
||||||
|
brightness: "Brillo"
|
||||||
|
saturation: "Saturación"
|
||||||
|
max: "Valor máximo"
|
||||||
|
min: "Valor mínimo"
|
||||||
|
direction: "Dirección"
|
||||||
|
phase: "Fase"
|
||||||
|
frequency: "Frecuencia"
|
||||||
|
strength: "Intensidad"
|
||||||
|
glitchChannelShift: "cambio de canal de imagen"
|
||||||
|
seed: "Valor de la semilla"
|
||||||
|
redComponent: "Componente rojo"
|
||||||
|
greenComponent: "Componente Verde"
|
||||||
|
blueComponent: "Componente Azul"
|
||||||
|
threshold: "Umbral"
|
||||||
|
centerX: "Centrar X"
|
||||||
|
centerY: "Centrar Y"
|
||||||
|
zoomLinesSmoothing: "Suavizado"
|
||||||
|
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"
|
||||||
drafts: "Borrador"
|
drafts: "Borrador"
|
||||||
_drafts:
|
_drafts:
|
||||||
select: "Seleccionar borradores"
|
select: "Seleccionar borradores"
|
||||||
|
|
|
@ -1208,7 +1208,6 @@ releaseToRefresh: "Relâcher pour rafraîchir"
|
||||||
refreshing: "Rafraîchissement..."
|
refreshing: "Rafraîchissement..."
|
||||||
pullDownToRefresh: "Tirer vers le bas pour rafraîchir"
|
pullDownToRefresh: "Tirer vers le bas pour rafraîchir"
|
||||||
useGroupedNotifications: "Grouper les notifications"
|
useGroupedNotifications: "Grouper les notifications"
|
||||||
signupPendingError: "Un problème est survenu lors de la vérification de votre adresse e-mail. Le lien a peut-être expiré."
|
|
||||||
cwNotationRequired: "Si « Masquer le contenu » est activé, une description doit être fournie."
|
cwNotationRequired: "Si « Masquer le contenu » est activé, une description doit être fournie."
|
||||||
doReaction: "Réagir"
|
doReaction: "Réagir"
|
||||||
code: "Code"
|
code: "Code"
|
||||||
|
@ -1272,6 +1271,8 @@ pleaseSelectAccount: "Sélectionner un compte"
|
||||||
availableRoles: "Rôles disponibles"
|
availableRoles: "Rôles disponibles"
|
||||||
postForm: "Formulaire de publication"
|
postForm: "Formulaire de publication"
|
||||||
information: "Informations"
|
information: "Informations"
|
||||||
|
inMinutes: "min"
|
||||||
|
inDays: "j"
|
||||||
_chat:
|
_chat:
|
||||||
invitations: "Inviter"
|
invitations: "Inviter"
|
||||||
noHistory: "Pas d'historique"
|
noHistory: "Pas d'historique"
|
||||||
|
@ -2370,3 +2371,11 @@ _watermarkEditor:
|
||||||
image: "Images"
|
image: "Images"
|
||||||
advanced: "Avancé"
|
advanced: "Avancé"
|
||||||
angle: "Angle"
|
angle: "Angle"
|
||||||
|
_imageEffector:
|
||||||
|
_fxProps:
|
||||||
|
angle: "Angle"
|
||||||
|
scale: "Taille"
|
||||||
|
size: "Taille"
|
||||||
|
color: "Couleur"
|
||||||
|
opacity: "Transparence"
|
||||||
|
lightness: "Clair"
|
||||||
|
|
|
@ -73,7 +73,7 @@ export default function generateDTS() {
|
||||||
ts.NodeFlags.Const,
|
ts.NodeFlags.Const,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
ts.factory.createInterfaceDeclaration(
|
ts.factory.createTypeAliasDeclaration(
|
||||||
[ts.factory.createToken(ts.SyntaxKind.ExportKeyword)],
|
[ts.factory.createToken(ts.SyntaxKind.ExportKeyword)],
|
||||||
ts.factory.createIdentifier('ParameterizedString'),
|
ts.factory.createIdentifier('ParameterizedString'),
|
||||||
[
|
[
|
||||||
|
@ -84,20 +84,22 @@ export default function generateDTS() {
|
||||||
ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword),
|
ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
undefined,
|
ts.factory.createIntersectionTypeNode([
|
||||||
[
|
ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword),
|
||||||
ts.factory.createPropertySignature(
|
ts.factory.createTypeLiteralNode([
|
||||||
undefined,
|
ts.factory.createPropertySignature(
|
||||||
ts.factory.createComputedPropertyName(
|
|
||||||
ts.factory.createIdentifier('kParameters'),
|
|
||||||
),
|
|
||||||
undefined,
|
|
||||||
ts.factory.createTypeReferenceNode(
|
|
||||||
ts.factory.createIdentifier('T'),
|
|
||||||
undefined,
|
undefined,
|
||||||
|
ts.factory.createComputedPropertyName(
|
||||||
|
ts.factory.createIdentifier('kParameters'),
|
||||||
|
),
|
||||||
|
undefined,
|
||||||
|
ts.factory.createTypeReferenceNode(
|
||||||
|
ts.factory.createIdentifier('T'),
|
||||||
|
undefined,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
])
|
||||||
],
|
]),
|
||||||
),
|
),
|
||||||
ts.factory.createInterfaceDeclaration(
|
ts.factory.createInterfaceDeclaration(
|
||||||
[ts.factory.createToken(ts.SyntaxKind.ExportKeyword)],
|
[ts.factory.createToken(ts.SyntaxKind.ExportKeyword)],
|
||||||
|
|
|
@ -1212,7 +1212,6 @@ releaseToRefresh: "Lepaskan untuk memuat ulang"
|
||||||
refreshing: "Sedang memuat ulang..."
|
refreshing: "Sedang memuat ulang..."
|
||||||
pullDownToRefresh: "Tarik ke bawah untuk memuat ulang"
|
pullDownToRefresh: "Tarik ke bawah untuk memuat ulang"
|
||||||
useGroupedNotifications: "Tampilkan notifikasi secara dikelompokkan"
|
useGroupedNotifications: "Tampilkan notifikasi secara dikelompokkan"
|
||||||
signupPendingError: "Terdapat masalah ketika memverifikasi alamat surel. Tautan kemungkinan telah kedaluwarsa."
|
|
||||||
cwNotationRequired: "Jika \"Sembunyikan konten\" diaktifkan, deskripsi harus disediakan."
|
cwNotationRequired: "Jika \"Sembunyikan konten\" diaktifkan, deskripsi harus disediakan."
|
||||||
doReaction: "Tambahkan reaksi"
|
doReaction: "Tambahkan reaksi"
|
||||||
code: "Kode"
|
code: "Kode"
|
||||||
|
@ -1263,6 +1262,8 @@ thereAreNChanges: "Ada {n} perubahan"
|
||||||
prohibitedWordsForNameOfUser: "Kata yang dilarang untuk nama pengguna"
|
prohibitedWordsForNameOfUser: "Kata yang dilarang untuk nama pengguna"
|
||||||
postForm: "Buat catatan"
|
postForm: "Buat catatan"
|
||||||
information: "Informasi"
|
information: "Informasi"
|
||||||
|
inMinutes: "menit"
|
||||||
|
inDays: "hari"
|
||||||
_chat:
|
_chat:
|
||||||
invitations: "Undang"
|
invitations: "Undang"
|
||||||
noHistory: "Tidak ada riwayat"
|
noHistory: "Tidak ada riwayat"
|
||||||
|
@ -2625,3 +2626,11 @@ _watermarkEditor:
|
||||||
image: "Gambar"
|
image: "Gambar"
|
||||||
advanced: "Tingkat lanjut"
|
advanced: "Tingkat lanjut"
|
||||||
angle: "Sudut"
|
angle: "Sudut"
|
||||||
|
_imageEffector:
|
||||||
|
_fxProps:
|
||||||
|
angle: "Sudut"
|
||||||
|
scale: "Ukuran"
|
||||||
|
size: "Ukuran"
|
||||||
|
color: "Warna"
|
||||||
|
opacity: "Opasitas"
|
||||||
|
lightness: "Menerangkan"
|
||||||
|
|
220
locales/index.d.ts
vendored
220
locales/index.d.ts
vendored
|
@ -2,9 +2,9 @@
|
||||||
// This file is generated by locales/generateDTS.js
|
// This file is generated by locales/generateDTS.js
|
||||||
// Do not edit this file directly.
|
// Do not edit this file directly.
|
||||||
declare const kParameters: unique symbol;
|
declare const kParameters: unique symbol;
|
||||||
export interface ParameterizedString<T extends string = string> {
|
export type ParameterizedString<T extends string = string> = string & {
|
||||||
[kParameters]: T;
|
[kParameters]: T;
|
||||||
}
|
};
|
||||||
export interface ILocale {
|
export interface ILocale {
|
||||||
[_: string]: string | ParameterizedString | ILocale;
|
[_: string]: string | ParameterizedString | ILocale;
|
||||||
}
|
}
|
||||||
|
@ -315,11 +315,11 @@ export interface Locale extends ILocale {
|
||||||
*/
|
*/
|
||||||
"mention": string;
|
"mention": string;
|
||||||
/**
|
/**
|
||||||
* あなた宛て
|
* メンション
|
||||||
*/
|
*/
|
||||||
"mentions": string;
|
"mentions": string;
|
||||||
/**
|
/**
|
||||||
* ダイレクト投稿
|
* 指名
|
||||||
*/
|
*/
|
||||||
"directNotes": string;
|
"directNotes": string;
|
||||||
/**
|
/**
|
||||||
|
@ -4234,6 +4234,10 @@ export interface Locale extends ILocale {
|
||||||
* プリセットから選択
|
* プリセットから選択
|
||||||
*/
|
*/
|
||||||
"selectFromPresets": string;
|
"selectFromPresets": string;
|
||||||
|
/**
|
||||||
|
* カスタム
|
||||||
|
*/
|
||||||
|
"custom": string;
|
||||||
/**
|
/**
|
||||||
* 実績
|
* 実績
|
||||||
*/
|
*/
|
||||||
|
@ -4386,6 +4390,10 @@ export interface Locale extends ILocale {
|
||||||
* ノート検索は利用できません。
|
* ノート検索は利用できません。
|
||||||
*/
|
*/
|
||||||
"notesSearchNotAvailable": string;
|
"notesSearchNotAvailable": string;
|
||||||
|
/**
|
||||||
|
* ユーザー検索は利用できません。
|
||||||
|
*/
|
||||||
|
"usersSearchNotAvailable": string;
|
||||||
/**
|
/**
|
||||||
* ライセンス
|
* ライセンス
|
||||||
*/
|
*/
|
||||||
|
@ -4993,7 +5001,7 @@ export interface Locale extends ILocale {
|
||||||
/**
|
/**
|
||||||
* メールアドレスの確認中に問題が発生しました。リンクの有効期限が切れている可能性があります。
|
* メールアドレスの確認中に問題が発生しました。リンクの有効期限が切れている可能性があります。
|
||||||
*/
|
*/
|
||||||
"signupPendingError": string;
|
"emailVerificationFailedError": string;
|
||||||
/**
|
/**
|
||||||
* 「内容を隠す」がオンの場合は注釈の記述が必要です。
|
* 「内容を隠す」がオンの場合は注釈の記述が必要です。
|
||||||
*/
|
*/
|
||||||
|
@ -5501,6 +5509,26 @@ export interface Locale extends ILocale {
|
||||||
* 日
|
* 日
|
||||||
*/
|
*/
|
||||||
"inDays": string;
|
"inDays": string;
|
||||||
|
/**
|
||||||
|
* セーフモードが有効です
|
||||||
|
*/
|
||||||
|
"safeModeEnabled": string;
|
||||||
|
/**
|
||||||
|
* セーフモードが有効なため、プラグインはすべて無効化されています。
|
||||||
|
*/
|
||||||
|
"pluginsAreDisabledBecauseSafeMode": string;
|
||||||
|
/**
|
||||||
|
* セーフモードが有効なため、カスタムCSSは適用されていません。
|
||||||
|
*/
|
||||||
|
"customCssIsDisabledBecauseSafeMode": string;
|
||||||
|
/**
|
||||||
|
* セーフモードが有効な間はデフォルトのテーマが使用されます。セーフモードをオフにすると元に戻ります。
|
||||||
|
*/
|
||||||
|
"themeIsDefaultBecauseSafeMode": string;
|
||||||
|
/**
|
||||||
|
* ベータ版の検証にご協力いただきありがとうございます!
|
||||||
|
*/
|
||||||
|
"thankYouForTestingBeta": string;
|
||||||
"_order": {
|
"_order": {
|
||||||
/**
|
/**
|
||||||
* 新しい順
|
* 新しい順
|
||||||
|
@ -5855,6 +5883,10 @@ export interface Locale extends ILocale {
|
||||||
* 利用できるリアクションを先頭に表示
|
* 利用できるリアクションを先頭に表示
|
||||||
*/
|
*/
|
||||||
"showAvailableReactionsFirstInNote": string;
|
"showAvailableReactionsFirstInNote": string;
|
||||||
|
/**
|
||||||
|
* ページのタブバーを下部に表示
|
||||||
|
*/
|
||||||
|
"showPageTabBarBottom": string;
|
||||||
"_chat": {
|
"_chat": {
|
||||||
/**
|
/**
|
||||||
* 送信者の名前を表示
|
* 送信者の名前を表示
|
||||||
|
@ -6337,7 +6369,7 @@ export interface Locale extends ILocale {
|
||||||
*/
|
*/
|
||||||
"followers": string;
|
"followers": string;
|
||||||
/**
|
/**
|
||||||
* 指定したユーザーにのみ公開され、また相手に通知が入ります。ダイレクトメッセージのかわりにお使いいただけます。
|
* 指定したユーザーにのみ公開され、また相手に通知が入ります。
|
||||||
*/
|
*/
|
||||||
"direct": string;
|
"direct": string;
|
||||||
/**
|
/**
|
||||||
|
@ -6345,7 +6377,7 @@ export interface Locale extends ILocale {
|
||||||
*/
|
*/
|
||||||
"doNotSendConfidencialOnDirect1": string;
|
"doNotSendConfidencialOnDirect1": string;
|
||||||
/**
|
/**
|
||||||
* 送信先のサーバーの管理者は投稿内容を見ることが可能なので、信頼できないサーバーのユーザーにダイレクト投稿を送信する場合は、機密情報の扱いに注意が必要です。
|
* 送信先のサーバーの管理者は投稿内容を見ることが可能なので、信頼できないサーバーのユーザーが含まれる限定公開のノートを作成する際は、機密情報の扱いに注意が必要です。
|
||||||
*/
|
*/
|
||||||
"doNotSendConfidencialOnDirect2": string;
|
"doNotSendConfidencialOnDirect2": string;
|
||||||
/**
|
/**
|
||||||
|
@ -6499,7 +6531,7 @@ export interface Locale extends ILocale {
|
||||||
*/
|
*/
|
||||||
"remoteNotesCleaning": string;
|
"remoteNotesCleaning": string;
|
||||||
/**
|
/**
|
||||||
* 有効にすると、参照されていない古いリモートの投稿を定期的にクリーンアップしてデータベースの肥大化を抑制します。
|
* 有効にすると、一定期間経過したリモートの投稿を定期的にクリーンアップしてデータベースの肥大化を抑制します。
|
||||||
*/
|
*/
|
||||||
"remoteNotesCleaning_description": string;
|
"remoteNotesCleaning_description": string;
|
||||||
/**
|
/**
|
||||||
|
@ -6590,6 +6622,18 @@ export interface Locale extends ILocale {
|
||||||
* 現在の一部の設定はリセットされます。
|
* 現在の一部の設定はリセットされます。
|
||||||
*/
|
*/
|
||||||
"restartServerSetupWizardConfirm_text": string;
|
"restartServerSetupWizardConfirm_text": string;
|
||||||
|
/**
|
||||||
|
* エントランスページのスタイル
|
||||||
|
*/
|
||||||
|
"entrancePageStyle": string;
|
||||||
|
/**
|
||||||
|
* タイムラインを表示する
|
||||||
|
*/
|
||||||
|
"showTimelineForVisitor": string;
|
||||||
|
/**
|
||||||
|
* アクティビティを表示する
|
||||||
|
*/
|
||||||
|
"showActivitiesForVisitor": string;
|
||||||
"_userGeneratedContentsVisibilityForVisitor": {
|
"_userGeneratedContentsVisibilityForVisitor": {
|
||||||
/**
|
/**
|
||||||
* 全て公開
|
* 全て公開
|
||||||
|
@ -7779,6 +7823,10 @@ export interface Locale extends ILocale {
|
||||||
* ノート検索の利用
|
* ノート検索の利用
|
||||||
*/
|
*/
|
||||||
"canSearchNotes": string;
|
"canSearchNotes": string;
|
||||||
|
/**
|
||||||
|
* ユーザー検索の利用
|
||||||
|
*/
|
||||||
|
"canSearchUsers": string;
|
||||||
/**
|
/**
|
||||||
* 翻訳機能の利用
|
* 翻訳機能の利用
|
||||||
*/
|
*/
|
||||||
|
@ -8808,6 +8856,10 @@ export interface Locale extends ILocale {
|
||||||
* 日
|
* 日
|
||||||
*/
|
*/
|
||||||
"day": string;
|
"day": string;
|
||||||
|
/**
|
||||||
|
* ヶ月
|
||||||
|
*/
|
||||||
|
"month": string;
|
||||||
};
|
};
|
||||||
"_2fa": {
|
"_2fa": {
|
||||||
/**
|
/**
|
||||||
|
@ -9625,7 +9677,7 @@ export interface Locale extends ILocale {
|
||||||
*/
|
*/
|
||||||
"followersDescription": string;
|
"followersDescription": string;
|
||||||
/**
|
/**
|
||||||
* ダイレクト
|
* 指名
|
||||||
*/
|
*/
|
||||||
"specified": string;
|
"specified": string;
|
||||||
/**
|
/**
|
||||||
|
@ -10514,11 +10566,11 @@ export interface Locale extends ILocale {
|
||||||
*/
|
*/
|
||||||
"channel": string;
|
"channel": string;
|
||||||
/**
|
/**
|
||||||
* あなた宛て
|
* メンション
|
||||||
*/
|
*/
|
||||||
"mentions": string;
|
"mentions": string;
|
||||||
/**
|
/**
|
||||||
* ダイレクト
|
* 指名
|
||||||
*/
|
*/
|
||||||
"direct": string;
|
"direct": string;
|
||||||
/**
|
/**
|
||||||
|
@ -11839,6 +11891,10 @@ export interface Locale extends ILocale {
|
||||||
* 修復ツールを起動
|
* 修復ツールを起動
|
||||||
*/
|
*/
|
||||||
"otherOption3": string;
|
"otherOption3": string;
|
||||||
|
/**
|
||||||
|
* Misskeyをセーフモードで起動
|
||||||
|
*/
|
||||||
|
"otherOption4": string;
|
||||||
};
|
};
|
||||||
"_search": {
|
"_search": {
|
||||||
/**
|
/**
|
||||||
|
@ -11976,11 +12032,11 @@ export interface Locale extends ILocale {
|
||||||
*/
|
*/
|
||||||
"youCanConfigureMoreFederationSettingsLater": string;
|
"youCanConfigureMoreFederationSettingsLater": string;
|
||||||
/**
|
/**
|
||||||
* 受信コンテンツの自動クリーニング
|
* リモートコンテンツの自動クリーニング
|
||||||
*/
|
*/
|
||||||
"remoteContentsCleaning": string;
|
"remoteContentsCleaning": string;
|
||||||
/**
|
/**
|
||||||
* 連合を行うと、継続して多くのコンテンツを受信します。自動クリーニングを有効にすると、参照されていない古くなったコンテンツを自動でサーバーから削除し、ストレージを節約できます。
|
* 連合を行うと、継続して多くのコンテンツを受信します。自動クリーニングを有効にすると、一定期間経過したリモートコンテンツを自動でサーバーから削除し、ストレージを節約できます。
|
||||||
*/
|
*/
|
||||||
"remoteContentsCleaning_description": string;
|
"remoteContentsCleaning_description": string;
|
||||||
/**
|
/**
|
||||||
|
@ -12179,6 +12235,10 @@ export interface Locale extends ILocale {
|
||||||
* 高度
|
* 高度
|
||||||
*/
|
*/
|
||||||
"advanced": string;
|
"advanced": string;
|
||||||
|
/**
|
||||||
|
* 角度
|
||||||
|
*/
|
||||||
|
"angle": string;
|
||||||
/**
|
/**
|
||||||
* ストライプ
|
* ストライプ
|
||||||
*/
|
*/
|
||||||
|
@ -12191,10 +12251,6 @@ export interface Locale extends ILocale {
|
||||||
* ラインの数
|
* ラインの数
|
||||||
*/
|
*/
|
||||||
"stripeFrequency": string;
|
"stripeFrequency": string;
|
||||||
/**
|
|
||||||
* 角度
|
|
||||||
*/
|
|
||||||
"angle": string;
|
|
||||||
/**
|
/**
|
||||||
* ポルカドット
|
* ポルカドット
|
||||||
*/
|
*/
|
||||||
|
@ -12237,6 +12293,10 @@ export interface Locale extends ILocale {
|
||||||
* 変更を破棄して終了しますか?
|
* 変更を破棄して終了しますか?
|
||||||
*/
|
*/
|
||||||
"discardChangesConfirm": string;
|
"discardChangesConfirm": string;
|
||||||
|
/**
|
||||||
|
* 設定項目はありません
|
||||||
|
*/
|
||||||
|
"nothingToConfigure": string;
|
||||||
"_fxs": {
|
"_fxs": {
|
||||||
/**
|
/**
|
||||||
* 色収差
|
* 色収差
|
||||||
|
@ -12303,6 +12363,132 @@ export interface Locale extends ILocale {
|
||||||
*/
|
*/
|
||||||
"tearing": string;
|
"tearing": string;
|
||||||
};
|
};
|
||||||
|
"_fxProps": {
|
||||||
|
/**
|
||||||
|
* 角度
|
||||||
|
*/
|
||||||
|
"angle": string;
|
||||||
|
/**
|
||||||
|
* サイズ
|
||||||
|
*/
|
||||||
|
"scale": string;
|
||||||
|
/**
|
||||||
|
* サイズ
|
||||||
|
*/
|
||||||
|
"size": string;
|
||||||
|
/**
|
||||||
|
* 色
|
||||||
|
*/
|
||||||
|
"color": string;
|
||||||
|
/**
|
||||||
|
* 不透明度
|
||||||
|
*/
|
||||||
|
"opacity": string;
|
||||||
|
/**
|
||||||
|
* 正規化
|
||||||
|
*/
|
||||||
|
"normalize": string;
|
||||||
|
/**
|
||||||
|
* 量
|
||||||
|
*/
|
||||||
|
"amount": string;
|
||||||
|
/**
|
||||||
|
* 明るさ
|
||||||
|
*/
|
||||||
|
"lightness": string;
|
||||||
|
/**
|
||||||
|
* コントラスト
|
||||||
|
*/
|
||||||
|
"contrast": string;
|
||||||
|
/**
|
||||||
|
* 色相
|
||||||
|
*/
|
||||||
|
"hue": string;
|
||||||
|
/**
|
||||||
|
* 輝度
|
||||||
|
*/
|
||||||
|
"brightness": string;
|
||||||
|
/**
|
||||||
|
* 彩度
|
||||||
|
*/
|
||||||
|
"saturation": string;
|
||||||
|
/**
|
||||||
|
* 最大値
|
||||||
|
*/
|
||||||
|
"max": string;
|
||||||
|
/**
|
||||||
|
* 最小値
|
||||||
|
*/
|
||||||
|
"min": string;
|
||||||
|
/**
|
||||||
|
* 方向
|
||||||
|
*/
|
||||||
|
"direction": string;
|
||||||
|
/**
|
||||||
|
* 位相
|
||||||
|
*/
|
||||||
|
"phase": string;
|
||||||
|
/**
|
||||||
|
* 頻度
|
||||||
|
*/
|
||||||
|
"frequency": string;
|
||||||
|
/**
|
||||||
|
* 強さ
|
||||||
|
*/
|
||||||
|
"strength": string;
|
||||||
|
/**
|
||||||
|
* ズレ
|
||||||
|
*/
|
||||||
|
"glitchChannelShift": string;
|
||||||
|
/**
|
||||||
|
* シード値
|
||||||
|
*/
|
||||||
|
"seed": string;
|
||||||
|
/**
|
||||||
|
* 赤色成分
|
||||||
|
*/
|
||||||
|
"redComponent": string;
|
||||||
|
/**
|
||||||
|
* 緑色成分
|
||||||
|
*/
|
||||||
|
"greenComponent": string;
|
||||||
|
/**
|
||||||
|
* 青色成分
|
||||||
|
*/
|
||||||
|
"blueComponent": string;
|
||||||
|
/**
|
||||||
|
* しきい値
|
||||||
|
*/
|
||||||
|
"threshold": string;
|
||||||
|
/**
|
||||||
|
* 中心X
|
||||||
|
*/
|
||||||
|
"centerX": string;
|
||||||
|
/**
|
||||||
|
* 中心Y
|
||||||
|
*/
|
||||||
|
"centerY": string;
|
||||||
|
/**
|
||||||
|
* スムージング
|
||||||
|
*/
|
||||||
|
"zoomLinesSmoothing": string;
|
||||||
|
/**
|
||||||
|
* スムージングと集中線の幅の設定は併用できません。
|
||||||
|
*/
|
||||||
|
"zoomLinesSmoothingDescription": string;
|
||||||
|
/**
|
||||||
|
* 集中線の幅
|
||||||
|
*/
|
||||||
|
"zoomLinesThreshold": string;
|
||||||
|
/**
|
||||||
|
* 中心径
|
||||||
|
*/
|
||||||
|
"zoomLinesMaskSize": string;
|
||||||
|
/**
|
||||||
|
* 黒色にする
|
||||||
|
*/
|
||||||
|
"zoomLinesBlack": string;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
/**
|
/**
|
||||||
* 下書き
|
* 下書き
|
||||||
|
|
|
@ -36,6 +36,7 @@ const languages = [
|
||||||
'ru-RU',
|
'ru-RU',
|
||||||
'sk-SK',
|
'sk-SK',
|
||||||
'th-TH',
|
'th-TH',
|
||||||
|
'tr-TR',
|
||||||
'ug-CN',
|
'ug-CN',
|
||||||
'uk-UA',
|
'uk-UA',
|
||||||
'vi-VN',
|
'vi-VN',
|
||||||
|
|
|
@ -139,7 +139,7 @@ overwriteFromPinnedEmojis: "Sovrascrivi con le impostazioni globali"
|
||||||
reactionSettingDescription2: "Trascina per riorganizzare, clicca per cancellare, usa il pulsante \"+\" per aggiungere."
|
reactionSettingDescription2: "Trascina per riorganizzare, clicca per cancellare, usa il pulsante \"+\" per aggiungere."
|
||||||
rememberNoteVisibility: "Ricordare le impostazioni di visibilità delle note"
|
rememberNoteVisibility: "Ricordare le impostazioni di visibilità delle note"
|
||||||
attachCancel: "Rimuovi allegato"
|
attachCancel: "Rimuovi allegato"
|
||||||
deleteFile: "File da Drive eliminato"
|
deleteFile: "Elimina un file dal Drive"
|
||||||
markAsSensitive: "Segna come esplicito"
|
markAsSensitive: "Segna come esplicito"
|
||||||
unmarkAsSensitive: "Non segnare come esplicito "
|
unmarkAsSensitive: "Non segnare come esplicito "
|
||||||
enterFileName: "Nome del file"
|
enterFileName: "Nome del file"
|
||||||
|
@ -1054,6 +1054,7 @@ permissionDeniedError: "Errore, attività non autorizzata"
|
||||||
permissionDeniedErrorDescription: "Non si dispone dell'autorizzazione per eseguire questa operazione."
|
permissionDeniedErrorDescription: "Non si dispone dell'autorizzazione per eseguire questa operazione."
|
||||||
preset: "Preimpostato"
|
preset: "Preimpostato"
|
||||||
selectFromPresets: "Seleziona preimpostato"
|
selectFromPresets: "Seleziona preimpostato"
|
||||||
|
custom: "Personalizzato"
|
||||||
achievements: "Conquiste"
|
achievements: "Conquiste"
|
||||||
gotInvalidResponseError: "Risposta del server non valida"
|
gotInvalidResponseError: "Risposta del server non valida"
|
||||||
gotInvalidResponseErrorDescription: "Il server potrebbe essere irraggiungibile o in manutenzione. Riprova più tardi."
|
gotInvalidResponseErrorDescription: "Il server potrebbe essere irraggiungibile o in manutenzione. Riprova più tardi."
|
||||||
|
@ -1092,6 +1093,7 @@ prohibitedWordsDescription2: "Gli spazi creano la relazione \"E\" tra parole (qu
|
||||||
hiddenTags: "Hashtag nascosti"
|
hiddenTags: "Hashtag nascosti"
|
||||||
hiddenTagsDescription: "Impedire la visualizzazione del tag impostato nei trend. Puoi impostare più valori, uno per riga."
|
hiddenTagsDescription: "Impedire la visualizzazione del tag impostato nei trend. Puoi impostare più valori, uno per riga."
|
||||||
notesSearchNotAvailable: "Non è possibile cercare tra le Note."
|
notesSearchNotAvailable: "Non è possibile cercare tra le Note."
|
||||||
|
usersSearchNotAvailable: "La ricerca profili non è disponibile."
|
||||||
license: "Licenza"
|
license: "Licenza"
|
||||||
unfavoriteConfirm: "Vuoi davvero rimuovere la preferenza?"
|
unfavoriteConfirm: "Vuoi davvero rimuovere la preferenza?"
|
||||||
myClips: "Le mie Clip"
|
myClips: "Le mie Clip"
|
||||||
|
@ -1198,7 +1200,7 @@ replies: "Risposte"
|
||||||
renotes: "Rinota"
|
renotes: "Rinota"
|
||||||
loadReplies: "Leggi le risposte"
|
loadReplies: "Leggi le risposte"
|
||||||
loadConversation: "Leggi la conversazione"
|
loadConversation: "Leggi la conversazione"
|
||||||
pinnedList: "Elenco in primo piano"
|
pinnedList: "Lista in primo piano"
|
||||||
keepScreenOn: "Mantenere lo schermo acceso"
|
keepScreenOn: "Mantenere lo schermo acceso"
|
||||||
verifiedLink: "Abbiamo confermato la validità di questo collegamento"
|
verifiedLink: "Abbiamo confermato la validità di questo collegamento"
|
||||||
notifyNotes: "Notifica nuove Note"
|
notifyNotes: "Notifica nuove Note"
|
||||||
|
@ -1243,7 +1245,7 @@ releaseToRefresh: "Rilascia per aggiornare"
|
||||||
refreshing: "Aggiornamento..."
|
refreshing: "Aggiornamento..."
|
||||||
pullDownToRefresh: "Trascinare per aggiornare"
|
pullDownToRefresh: "Trascinare per aggiornare"
|
||||||
useGroupedNotifications: "Mostra le notifiche raggruppate"
|
useGroupedNotifications: "Mostra le notifiche raggruppate"
|
||||||
signupPendingError: "Si è verificato un problema durante la verifica del tuo indirizzo email. Potrebbe essere scaduto il collegamento temporaneo."
|
emailVerificationFailedError: "La verifica dell'indirizzo e-mail non è andata a buon fine. Il link potrebbe essere scaduto."
|
||||||
cwNotationRequired: "Devi indicare perché il contenuto è indicato come esplicito."
|
cwNotationRequired: "Devi indicare perché il contenuto è indicato come esplicito."
|
||||||
doReaction: "Reagisci"
|
doReaction: "Reagisci"
|
||||||
code: "Codice"
|
code: "Codice"
|
||||||
|
@ -1313,6 +1315,7 @@ availableRoles: "Ruoli disponibili"
|
||||||
acknowledgeNotesAndEnable: "Attivare dopo averne compreso il comportamento."
|
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."
|
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."
|
federationDisabled: "Questo server ha la federazione disabilitata. Non puoi interagire con profili provenienti da altri server."
|
||||||
|
draft: "Bozza"
|
||||||
confirmOnReact: "Confermare le reazioni"
|
confirmOnReact: "Confermare le reazioni"
|
||||||
reactAreYouSure: "Vuoi davvero reagire con {emoji} ?"
|
reactAreYouSure: "Vuoi davvero reagire con {emoji} ?"
|
||||||
markAsSensitiveConfirm: "Vuoi davvero indicare questo contenuto multimediale come esplicito?"
|
markAsSensitiveConfirm: "Vuoi davvero indicare questo contenuto multimediale come esplicito?"
|
||||||
|
@ -1367,6 +1370,16 @@ redisplayAllTips: "Mostra tutti i suggerimenti"
|
||||||
hideAllTips: "Nascondi tutti i suggerimenti"
|
hideAllTips: "Nascondi tutti i suggerimenti"
|
||||||
defaultImageCompressionLevel: "Livello predefinito di compressione immagini"
|
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."
|
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."
|
||||||
|
inMinutes: "min"
|
||||||
|
inDays: "giorni"
|
||||||
|
safeModeEnabled: "La modalità sicura è attiva"
|
||||||
|
pluginsAreDisabledBecauseSafeMode: "Tutti i plugin sono disattivati, poiché la modalità sicura è attiva."
|
||||||
|
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!"
|
||||||
|
_order:
|
||||||
|
newest: "Prima i più recenti"
|
||||||
|
oldest: "Meno recenti prima"
|
||||||
_chat:
|
_chat:
|
||||||
noMessagesYet: "Ancora nessun messaggio"
|
noMessagesYet: "Ancora nessun messaggio"
|
||||||
newMessage: "Nuovo messaggio"
|
newMessage: "Nuovo messaggio"
|
||||||
|
@ -1455,6 +1468,7 @@ _settings:
|
||||||
contentsUpdateFrequency_description2: "Quando la modalità è in tempo reale, arriveranno a prescindere."
|
contentsUpdateFrequency_description2: "Quando la modalità è in tempo reale, arriveranno a prescindere."
|
||||||
showUrlPreview: "Mostra anteprima dell'URL"
|
showUrlPreview: "Mostra anteprima dell'URL"
|
||||||
showAvailableReactionsFirstInNote: "Mostra le reazioni disponibili in alto"
|
showAvailableReactionsFirstInNote: "Mostra le reazioni disponibili in alto"
|
||||||
|
showPageTabBarBottom: "Visualizza le schede della pagina nella parte inferiore"
|
||||||
_chat:
|
_chat:
|
||||||
showSenderName: "Mostra il nome del mittente"
|
showSenderName: "Mostra il nome del mittente"
|
||||||
sendOnEnter: "Invio spedisce"
|
sendOnEnter: "Invio spedisce"
|
||||||
|
@ -1628,6 +1642,10 @@ _serverSettings:
|
||||||
fanoutTimelineDbFallback: "Elaborazione dati alternativa"
|
fanoutTimelineDbFallback: "Elaborazione dati alternativa"
|
||||||
fanoutTimelineDbFallbackDescription: "Attivando l'elaborazione alternativa, verrà interrogato ulteriormente il database se la timeline non è nella cache. \nDisattivando, si può ridurre ulteriormente il carico del server, evitando l'elaborazione alternativa, ma limitando l'intervallo recuperabile delle timeline."
|
fanoutTimelineDbFallbackDescription: "Attivando l'elaborazione alternativa, verrà interrogato ulteriormente il database se la timeline non è nella cache. \nDisattivando, si può ridurre ulteriormente il carico del server, evitando l'elaborazione alternativa, ma limitando l'intervallo recuperabile delle timeline."
|
||||||
reactionsBufferingDescription: "Attivando questa opzione, puoi migliorare significativamente le prestazioni durante la creazione delle reazioni e ridurre il carico sul database. Tuttavia, aumenterà l'impiego di memoria Redis."
|
reactionsBufferingDescription: "Attivando questa opzione, puoi migliorare significativamente le prestazioni durante la creazione delle reazioni e ridurre il carico sul database. Tuttavia, aumenterà l'impiego di memoria Redis."
|
||||||
|
remoteNotesCleaning: "Pulizia automatica dei contenuti remoti"
|
||||||
|
remoteNotesCleaning_description: "Se abilitata, verranno periodicamente rimosse le vecchie Note remote senza relazioni, per ridurre il sovraccarico del sistema."
|
||||||
|
remoteNotesCleaningMaxProcessingDuration: "Durata massima del processo di pulizia"
|
||||||
|
remoteNotesCleaningExpiryDaysForEachNotes: "Periodo minimo di conservazione delle note"
|
||||||
inquiryUrl: "URL di contatto"
|
inquiryUrl: "URL di contatto"
|
||||||
inquiryUrlDescription: "Specificare l'URL al modulo di contatto, oppure le informazioni con i dati di contatto dell'amministrazione."
|
inquiryUrlDescription: "Specificare l'URL al modulo di contatto, oppure le informazioni con i dati di contatto dell'amministrazione."
|
||||||
openRegistration: "Registrazioni aperte"
|
openRegistration: "Registrazioni aperte"
|
||||||
|
@ -1646,6 +1664,11 @@ _serverSettings:
|
||||||
userGeneratedContentsVisibilityForVisitor: "Visibilità dei contenuti generati dagli utenti ai non utenti"
|
userGeneratedContentsVisibilityForVisitor: "Visibilità dei contenuti generati dagli utenti ai non utenti"
|
||||||
userGeneratedContentsVisibilityForVisitor_description: "Questa funzionalità è utile per impedire che contenuti remoti inappropriati e difficili da moderare vengano inavvertitamente resi pubblici su Internet tramite il proprio server."
|
userGeneratedContentsVisibilityForVisitor_description: "Questa funzionalità è utile per impedire che contenuti remoti inappropriati e difficili da moderare vengano inavvertitamente resi pubblici su Internet tramite il proprio server."
|
||||||
userGeneratedContentsVisibilityForVisitor_description2: "Esistono dei rischi nell'esporre incondizionatamente su internet tutto il contenuto del tuo server, incluso il contenuto remoto ricevuto da altri server. In particolare, occorre prestare attenzione, perché le persone non consapevoli della federazione potrebbero erroneamente credere che il contenuto remoto sia stato invece creato all'interno del proprio server."
|
userGeneratedContentsVisibilityForVisitor_description2: "Esistono dei rischi nell'esporre incondizionatamente su internet tutto il contenuto del tuo server, incluso il contenuto remoto ricevuto da altri server. In particolare, occorre prestare attenzione, perché le persone non consapevoli della federazione potrebbero erroneamente credere che il contenuto remoto sia stato invece creato all'interno del proprio server."
|
||||||
|
restartServerSetupWizardConfirm_title: "Vuoi ripetere la procedura guidata di configurazione iniziale del server?"
|
||||||
|
restartServerSetupWizardConfirm_text: "Verranno ripristinate alcune tue impostazioni personalizzate."
|
||||||
|
entrancePageStyle: "Stile della pagina di ingresso"
|
||||||
|
showTimelineForVisitor: "Mostra la Timeline a visitatori non autenticati"
|
||||||
|
showActivitiesForVisitor: "Mostrare la propria attività"
|
||||||
_userGeneratedContentsVisibilityForVisitor:
|
_userGeneratedContentsVisibilityForVisitor:
|
||||||
all: "Tutto pubblico"
|
all: "Tutto pubblico"
|
||||||
localOnly: "Pubblica solo contenuti locali, mantieni privati i contenuti remoti"
|
localOnly: "Pubblica solo contenuti locali, mantieni privati i contenuti remoti"
|
||||||
|
@ -1982,6 +2005,7 @@ _role:
|
||||||
descriptionOfRateLimitFactor: "I rapporti più bassi sono meno restrittivi, quelli più alti lo sono di più."
|
descriptionOfRateLimitFactor: "I rapporti più bassi sono meno restrittivi, quelli più alti lo sono di più."
|
||||||
canHideAds: "Nascondere i banner"
|
canHideAds: "Nascondere i banner"
|
||||||
canSearchNotes: "Ricercare nelle Note"
|
canSearchNotes: "Ricercare nelle Note"
|
||||||
|
canSearchUsers: "Può cercare profili"
|
||||||
canUseTranslator: "Tradurre le Note"
|
canUseTranslator: "Tradurre le Note"
|
||||||
avatarDecorationLimit: "Numero massimo di decorazioni foto profilo installabili"
|
avatarDecorationLimit: "Numero massimo di decorazioni foto profilo installabili"
|
||||||
canImportAntennas: "Può importare Antenne"
|
canImportAntennas: "Può importare Antenne"
|
||||||
|
@ -1993,6 +2017,8 @@ _role:
|
||||||
uploadableFileTypes: "Tipi di file caricabili"
|
uploadableFileTypes: "Tipi di file caricabili"
|
||||||
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_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."
|
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"
|
||||||
|
watermarkAvailable: "Disponibilità della funzione filigrana"
|
||||||
_condition:
|
_condition:
|
||||||
roleAssignedTo: "Assegnato a ruoli manualmente"
|
roleAssignedTo: "Assegnato a ruoli manualmente"
|
||||||
isLocal: "Profilo locale"
|
isLocal: "Profilo locale"
|
||||||
|
@ -2152,6 +2178,7 @@ _theme:
|
||||||
install: "Installa un tema"
|
install: "Installa un tema"
|
||||||
manage: "Gestione dei temi"
|
manage: "Gestione dei temi"
|
||||||
code: "Codice tema"
|
code: "Codice tema"
|
||||||
|
copyThemeCode: "Copia il codice del Tema"
|
||||||
description: "Descrizione"
|
description: "Descrizione"
|
||||||
installed: "{name} è installato"
|
installed: "{name} è installato"
|
||||||
installedThemes: "Temi installati"
|
installedThemes: "Temi installati"
|
||||||
|
@ -2195,7 +2222,7 @@ _theme:
|
||||||
hashtag: "Hashtag"
|
hashtag: "Hashtag"
|
||||||
mention: "Menzioni"
|
mention: "Menzioni"
|
||||||
mentionMe: "Menzioni (di me)"
|
mentionMe: "Menzioni (di me)"
|
||||||
renote: "Renota"
|
renote: "Rinota"
|
||||||
modalBg: "Sfondo modale."
|
modalBg: "Sfondo modale."
|
||||||
divider: "Interruzione di linea"
|
divider: "Interruzione di linea"
|
||||||
scrollbarHandle: "Maniglie della barra di scorrimento"
|
scrollbarHandle: "Maniglie della barra di scorrimento"
|
||||||
|
@ -2251,6 +2278,7 @@ _time:
|
||||||
minute: "min"
|
minute: "min"
|
||||||
hour: "ore"
|
hour: "ore"
|
||||||
day: "giorni"
|
day: "giorni"
|
||||||
|
month: "Mese"
|
||||||
_2fa:
|
_2fa:
|
||||||
alreadyRegistered: "La configurazione è stata già completata."
|
alreadyRegistered: "La configurazione è stata già completata."
|
||||||
registerTOTP: "Registra una App di autenticazione a due fattori (2FA/MFA)"
|
registerTOTP: "Registra una App di autenticazione a due fattori (2FA/MFA)"
|
||||||
|
@ -2635,7 +2663,7 @@ _notification:
|
||||||
createToken: "È stato creato un token di accesso"
|
createToken: "È stato creato un token di accesso"
|
||||||
createTokenDescription: "In caso contrario, eliminare il token di accesso tramite ({text})."
|
createTokenDescription: "In caso contrario, eliminare il token di accesso tramite ({text})."
|
||||||
_types:
|
_types:
|
||||||
all: "Tutto"
|
all: "Tutte"
|
||||||
note: "Nuove Note"
|
note: "Nuove Note"
|
||||||
follow: "Follower"
|
follow: "Follower"
|
||||||
mention: "Menzioni"
|
mention: "Menzioni"
|
||||||
|
@ -2643,7 +2671,7 @@ _notification:
|
||||||
renote: "Rinota"
|
renote: "Rinota"
|
||||||
quote: "Cita"
|
quote: "Cita"
|
||||||
reaction: "Reazioni"
|
reaction: "Reazioni"
|
||||||
pollEnded: "Sondaggio chiuso."
|
pollEnded: "Sondaggio terminato"
|
||||||
receiveFollowRequest: "Richieste di follow in arrivo"
|
receiveFollowRequest: "Richieste di follow in arrivo"
|
||||||
followRequestAccepted: "Richieste di follow accettate"
|
followRequestAccepted: "Richieste di follow accettate"
|
||||||
roleAssigned: "Ruolo concesso"
|
roleAssigned: "Ruolo concesso"
|
||||||
|
@ -2651,7 +2679,7 @@ _notification:
|
||||||
achievementEarned: "Risultato raggiunto"
|
achievementEarned: "Risultato raggiunto"
|
||||||
exportCompleted: "Esportazione completata"
|
exportCompleted: "Esportazione completata"
|
||||||
login: "Accessi"
|
login: "Accessi"
|
||||||
createToken: "Creare un token di accesso"
|
createToken: "Aggiunto un token di accesso"
|
||||||
test: "Notifiche di test"
|
test: "Notifiche di test"
|
||||||
app: "Notifiche da applicazioni"
|
app: "Notifiche da applicazioni"
|
||||||
_actions:
|
_actions:
|
||||||
|
@ -2743,56 +2771,56 @@ _abuseReport:
|
||||||
notifiedWebhook: "Webhook da usare"
|
notifiedWebhook: "Webhook da usare"
|
||||||
deleteConfirm: "Vuoi davvero rimuovere il destinatario della notifica?"
|
deleteConfirm: "Vuoi davvero rimuovere il destinatario della notifica?"
|
||||||
_moderationLogTypes:
|
_moderationLogTypes:
|
||||||
createRole: "Ruolo creato"
|
createRole: "Crea un Ruolo"
|
||||||
deleteRole: "Ruolo eliminato"
|
deleteRole: "Elimina un Ruolo"
|
||||||
updateRole: "Ruolo aggiornato"
|
updateRole: "Modifica un ruolo"
|
||||||
assignRole: "Ruolo assegnato"
|
assignRole: "Assegna un Ruolo"
|
||||||
unassignRole: "Ruolo disassegnato"
|
unassignRole: "Toglie un Ruolo al Profilo"
|
||||||
suspend: "Sospensione"
|
suspend: "Sospende"
|
||||||
unsuspend: "Sospensione rimossa"
|
unsuspend: "Solleva la sospensione"
|
||||||
addCustomEmoji: "Emoji personalizzata aggiunta"
|
addCustomEmoji: "Aggiunge Emoji personalizzata"
|
||||||
updateCustomEmoji: "Emoji personalizzata aggiornata"
|
updateCustomEmoji: "Modifica Emoji personalizzata"
|
||||||
deleteCustomEmoji: "Emoji personalizzata eliminata"
|
deleteCustomEmoji: "Elimina Emoji personalizzata"
|
||||||
updateServerSettings: "Impostazioni del server aggiornate"
|
updateServerSettings: "Modifica le impostazioni del server"
|
||||||
updateUserNote: "Promemoria di moderazione aggiornato"
|
updateUserNote: "Modifica un promemoria di moderazione"
|
||||||
deleteDriveFile: "File da Drive eliminato"
|
deleteDriveFile: "Elimina un file dal Drive"
|
||||||
deleteNote: "Nota eliminata"
|
deleteNote: "Elimina una Nota"
|
||||||
createGlobalAnnouncement: "Annuncio globale creato"
|
createGlobalAnnouncement: "Crea un annuncio globale"
|
||||||
createUserAnnouncement: "Annuncio ai profili iscritti creato"
|
createUserAnnouncement: "Crea un annuncio ai profili già iscritti"
|
||||||
updateGlobalAnnouncement: "Annuncio globale aggiornato"
|
updateGlobalAnnouncement: "Modifica un annuncio globale"
|
||||||
updateUserAnnouncement: "Annuncio ai profili iscritti aggiornato"
|
updateUserAnnouncement: "Modifica un annuncio ai profili già iscritti"
|
||||||
deleteGlobalAnnouncement: "Annuncio globale eliminato"
|
deleteGlobalAnnouncement: "Elimina un annuncio globale"
|
||||||
deleteUserAnnouncement: "Annuncio ai profili iscritti eliminato"
|
deleteUserAnnouncement: "Elimina un annuncio ai profili già iscritti"
|
||||||
resetPassword: "Password azzerata"
|
resetPassword: "Azzera la password"
|
||||||
suspendRemoteInstance: "Istanza remota sospesa"
|
suspendRemoteInstance: "Sospende una istanza remota"
|
||||||
unsuspendRemoteInstance: "Istanza remota riattivata"
|
unsuspendRemoteInstance: "Riattiva una istanza remota"
|
||||||
updateRemoteInstanceNote: "Aggiornamento del promemoria di moderazione per il server remoto"
|
updateRemoteInstanceNote: "Modifica il promemoria di moderazione per il server remoto"
|
||||||
markSensitiveDriveFile: "File nel Drive segnato come esplicito"
|
markSensitiveDriveFile: "Aggiunge NSFW a un file nel Drive"
|
||||||
unmarkSensitiveDriveFile: "File nel Drive segnato come non esplicito"
|
unmarkSensitiveDriveFile: "Toglie NSFW da un file nel Drive"
|
||||||
resolveAbuseReport: "Segnalazione risolta"
|
resolveAbuseReport: "Risolve una segnalazione"
|
||||||
forwardAbuseReport: "Segnalazione inoltrata"
|
forwardAbuseReport: "Inoltra una segnalazione"
|
||||||
updateAbuseReportNote: "Ha aggiornato la segnalazione"
|
updateAbuseReportNote: "Modifica una segnalazione"
|
||||||
createInvitation: "Genera codice di invito"
|
createInvitation: "Genera un codice di invito"
|
||||||
createAd: "Banner creato"
|
createAd: "Aggiunge un Banner"
|
||||||
deleteAd: "Banner eliminato"
|
deleteAd: "Elimina un Banner"
|
||||||
updateAd: "Banner aggiornato"
|
updateAd: "Modifica un Banner"
|
||||||
createAvatarDecoration: "Creazione decorazione della foto profilo"
|
createAvatarDecoration: "Crea una decorazione della foto profilo"
|
||||||
updateAvatarDecoration: "Aggiornamento decorazione foto profilo"
|
updateAvatarDecoration: "Modifica una decorazione della foto profilo"
|
||||||
deleteAvatarDecoration: "Eliminazione decorazione della foto profilo"
|
deleteAvatarDecoration: "Elimina una decorazione della foto profilo"
|
||||||
unsetUserAvatar: "Rimossa foto profilo"
|
unsetUserAvatar: "Toglie una foto profilo"
|
||||||
unsetUserBanner: "Rimossa intestazione profilo"
|
unsetUserBanner: "Toglie una immagine di intestazione profilo"
|
||||||
createSystemWebhook: "Crea un SystemWebhook"
|
createSystemWebhook: "Aggiunge un System Webhook"
|
||||||
updateSystemWebhook: "Modifica SystemWebhook"
|
updateSystemWebhook: "Modifica un System Webhook"
|
||||||
deleteSystemWebhook: "Elimina SystemWebhook"
|
deleteSystemWebhook: "Elimina un System Webhook"
|
||||||
createAbuseReportNotificationRecipient: "Crea destinatario per le notifiche di segnalazioni"
|
createAbuseReportNotificationRecipient: "Crea destinatario per le notifiche di segnalazioni"
|
||||||
updateAbuseReportNotificationRecipient: "Aggiorna destinatario notifiche di segnalazioni"
|
updateAbuseReportNotificationRecipient: "Modifica un destinatario per le notifiche di segnalazioni"
|
||||||
deleteAbuseReportNotificationRecipient: "Elimina destinatario notifiche di segnalazioni"
|
deleteAbuseReportNotificationRecipient: "Elimina un destinatario per le notifiche di segnalazioni"
|
||||||
deleteAccount: "Quando viene eliminato un profilo"
|
deleteAccount: "Elimina un profilo"
|
||||||
deletePage: "Pagina eliminata"
|
deletePage: "Elimina una Pagina"
|
||||||
deleteFlash: "Play eliminato"
|
deleteFlash: "Elimina un Play"
|
||||||
deleteGalleryPost: "Eliminazione pubblicazione nella Galleria"
|
deleteGalleryPost: "Elimina pubblicazione nella Galleria"
|
||||||
deleteChatRoom: "Elimina chat"
|
deleteChatRoom: "Elimina una Chat"
|
||||||
updateProxyAccountDescription: "Aggiornata la descrizione del profilo proxy"
|
updateProxyAccountDescription: "Aggiorna la descrizione del profilo proxy"
|
||||||
_fileViewer:
|
_fileViewer:
|
||||||
title: "Dettagli del file"
|
title: "Dettagli del file"
|
||||||
type: "Tipo di file"
|
type: "Tipo di file"
|
||||||
|
@ -2800,6 +2828,7 @@ _fileViewer:
|
||||||
url: "URL"
|
url: "URL"
|
||||||
uploadedAt: "Caricato il"
|
uploadedAt: "Caricato il"
|
||||||
attachedNotes: "Note a cui è allegato"
|
attachedNotes: "Note a cui è allegato"
|
||||||
|
usage: "In uso"
|
||||||
thisPageCanBeSeenFromTheAuthor: "Questa pagina può essere vista solo da chi ha caricato il file."
|
thisPageCanBeSeenFromTheAuthor: "Questa pagina può essere vista solo da chi ha caricato il file."
|
||||||
_externalResourceInstaller:
|
_externalResourceInstaller:
|
||||||
title: "Installa da sito esterno"
|
title: "Installa da sito esterno"
|
||||||
|
@ -3052,6 +3081,7 @@ _bootErrors:
|
||||||
otherOption1: "Nelle impostazioni, cancellare le impostazioni del client e svuotare la cache"
|
otherOption1: "Nelle impostazioni, cancellare le impostazioni del client e svuotare la cache"
|
||||||
otherOption2: "Avviare il client predefinito"
|
otherOption2: "Avviare il client predefinito"
|
||||||
otherOption3: "Avviare lo strumento di riparazione"
|
otherOption3: "Avviare lo strumento di riparazione"
|
||||||
|
otherOption4: "Avvia Misskey in modalità sicura"
|
||||||
_search:
|
_search:
|
||||||
searchScopeAll: "Tutte"
|
searchScopeAll: "Tutte"
|
||||||
searchScopeLocal: "Locale"
|
searchScopeLocal: "Locale"
|
||||||
|
@ -3088,6 +3118,8 @@ _serverSetupWizard:
|
||||||
doYouConnectToFediverse_description1: "Collegandosi a una rete di server distribuiti, denominata Fediverso, potrai scambiare contenuti con altri server, tramite il protocollo di comunicazione ActivityPub."
|
doYouConnectToFediverse_description1: "Collegandosi a una rete di server distribuiti, denominata Fediverso, potrai scambiare contenuti con altri server, tramite il protocollo di comunicazione ActivityPub."
|
||||||
doYouConnectToFediverse_description2: "Connettersi al Fediverso è anche detto \"federazione\"."
|
doYouConnectToFediverse_description2: "Connettersi al Fediverso è anche detto \"federazione\"."
|
||||||
youCanConfigureMoreFederationSettingsLater: "Puoi svolgere la configurazione avanzata anche dopo. Ad esempio specificando quali server possono federarsi."
|
youCanConfigureMoreFederationSettingsLater: "Puoi svolgere la configurazione avanzata anche dopo. Ad esempio specificando quali server possono federarsi."
|
||||||
|
remoteContentsCleaning: "Pulizia automatica dei contenuti in arrivo"
|
||||||
|
remoteContentsCleaning_description: "Con la federazione funzionante, riceverai sempre più contenuti. Abilitando la pulizia automatica, i contenuti non referenziati e obsoleti verranno rimossi automaticamente dai tuoi server, risparmiando spazio di archiviazione."
|
||||||
adminInfo: "Informazioni sull'amministratore"
|
adminInfo: "Informazioni sull'amministratore"
|
||||||
adminInfo_description: "Imposta le informazioni dell'amministratore utilizzate per accettare le richieste."
|
adminInfo_description: "Imposta le informazioni dell'amministratore utilizzate per accettare le richieste."
|
||||||
adminInfo_mustBeFilled: "Questa operazione è necessaria su un server aperto o se è attiva la federazione."
|
adminInfo_mustBeFilled: "Questa operazione è necessaria su un server aperto o se è attiva la federazione."
|
||||||
|
@ -3103,6 +3135,7 @@ _serverSetupWizard:
|
||||||
text2: "Se puoi, ti preghiamo di prendere in considerazione l'idea di fare una donazione, così potremo continuare a sviluppare."
|
text2: "Se puoi, ti preghiamo di prendere in considerazione l'idea di fare una donazione, così potremo continuare a sviluppare."
|
||||||
text3: "Sono previsti anche dei vantaggi speciali per i sostenitori!"
|
text3: "Sono previsti anche dei vantaggi speciali per i sostenitori!"
|
||||||
_uploader:
|
_uploader:
|
||||||
|
editImage: "Modifica immagine"
|
||||||
compressedToX: "Compresso in {x}"
|
compressedToX: "Compresso in {x}"
|
||||||
savedXPercent: "{x}% risparmiati"
|
savedXPercent: "{x}% risparmiati"
|
||||||
abortConfirm: "Alcuni file non sono stati caricati. Vuoi annullare l'operazione?"
|
abortConfirm: "Alcuni file non sono stati caricati. Vuoi annullare l'operazione?"
|
||||||
|
@ -3139,10 +3172,10 @@ _watermarkEditor:
|
||||||
type: "Tipo"
|
type: "Tipo"
|
||||||
image: "Immagini"
|
image: "Immagini"
|
||||||
advanced: "Avanzato"
|
advanced: "Avanzato"
|
||||||
|
angle: "Angolo"
|
||||||
stripe: "Strisce"
|
stripe: "Strisce"
|
||||||
stripeWidth: "Larghezza della linea"
|
stripeWidth: "Larghezza della linea"
|
||||||
stripeFrequency: "Il numero di linee"
|
stripeFrequency: "Il numero di linee"
|
||||||
angle: "Angolo"
|
|
||||||
polkadot: "A pallini"
|
polkadot: "A pallini"
|
||||||
checker: "revisore"
|
checker: "revisore"
|
||||||
polkadotMainDotOpacity: "Opacità del punto principale"
|
polkadotMainDotOpacity: "Opacità del punto principale"
|
||||||
|
@ -3154,6 +3187,7 @@ _imageEffector:
|
||||||
title: "Effetto"
|
title: "Effetto"
|
||||||
addEffect: "Aggiungi effetto"
|
addEffect: "Aggiungi effetto"
|
||||||
discardChangesConfirm: "Scarta le modifiche ed esci?"
|
discardChangesConfirm: "Scarta le modifiche ed esci?"
|
||||||
|
nothingToConfigure: "Nessuna impostazione configurabile."
|
||||||
_fxs:
|
_fxs:
|
||||||
chromaticAberration: "Aberrazione cromatica"
|
chromaticAberration: "Aberrazione cromatica"
|
||||||
glitch: "Glitch"
|
glitch: "Glitch"
|
||||||
|
@ -3169,5 +3203,52 @@ _imageEffector:
|
||||||
stripe: "Strisce"
|
stripe: "Strisce"
|
||||||
polkadot: "A pallini"
|
polkadot: "A pallini"
|
||||||
checker: "revisore"
|
checker: "revisore"
|
||||||
|
blockNoise: "Attenua rumore"
|
||||||
|
tearing: "Strappa immagine"
|
||||||
|
_fxProps:
|
||||||
|
angle: "Angolo"
|
||||||
|
scale: "Dimensioni"
|
||||||
|
size: "Dimensioni"
|
||||||
|
color: "Colore"
|
||||||
|
opacity: "Opacità"
|
||||||
|
normalize: "Normalizza"
|
||||||
|
amount: "Quantità"
|
||||||
|
lightness: "Chiaro"
|
||||||
|
contrast: "Contrasto"
|
||||||
|
hue: "Tinta"
|
||||||
|
brightness: "Luminosità"
|
||||||
|
saturation: "Saturazione"
|
||||||
|
max: "Valore massimo"
|
||||||
|
min: "Valore minimo"
|
||||||
|
direction: "Orientamento"
|
||||||
|
phase: "Fasare"
|
||||||
|
frequency: "Frequenza"
|
||||||
|
strength: "Forza"
|
||||||
|
glitchChannelShift: "Glitch cambio canale"
|
||||||
|
seed: "Seme"
|
||||||
|
redComponent: "Rosso composito"
|
||||||
|
greenComponent: "Verde composito"
|
||||||
|
blueComponent: "Blu composito"
|
||||||
|
threshold: "Soglia"
|
||||||
|
centerX: "Centro orizzontale"
|
||||||
|
centerY: "Centro verticale"
|
||||||
|
zoomLinesSmoothing: "Levigatura"
|
||||||
|
zoomLinesSmoothingDescription: "Non si possono usare insieme la levigatura e la larghezza della linea centrale."
|
||||||
|
zoomLinesThreshold: "Limite delle linee zoom"
|
||||||
|
zoomLinesMaskSize: "Ampiezza del diametro"
|
||||||
|
zoomLinesBlack: "Bande nere"
|
||||||
|
drafts: "Bozze"
|
||||||
_drafts:
|
_drafts:
|
||||||
|
select: "Selezionare bozza"
|
||||||
|
cannotCreateDraftAnymore: "Hai superato il numero massimo di bozze ammissibili."
|
||||||
|
cannotCreateDraft: "Impossibile creare una bozza di questo contenuto."
|
||||||
|
delete: "Elimina bozza"
|
||||||
|
deleteAreYouSure: "Vuoi davvero eliminare la bozza?"
|
||||||
|
noDrafts: "Non c'è nessuna bozza."
|
||||||
|
replyTo: "Rispondere a {user}"
|
||||||
|
quoteOf: "Citare la nota di {user}"
|
||||||
|
postTo: "Inserire in {channel}"
|
||||||
|
saveToDraft: "Salva come bozza"
|
||||||
|
restoreFromDraft: "Recuperare dalle bozze"
|
||||||
restore: "Ripristina"
|
restore: "Ripristina"
|
||||||
|
listDrafts: "Elenco bozze"
|
||||||
|
|
|
@ -74,8 +74,8 @@ youGotNewFollower: "フォローされました"
|
||||||
receiveFollowRequest: "フォローリクエストされました"
|
receiveFollowRequest: "フォローリクエストされました"
|
||||||
followRequestAccepted: "フォローが承認されました"
|
followRequestAccepted: "フォローが承認されました"
|
||||||
mention: "メンション"
|
mention: "メンション"
|
||||||
mentions: "あなた宛て"
|
mentions: "メンション"
|
||||||
directNotes: "ダイレクト投稿"
|
directNotes: "指名"
|
||||||
importAndExport: "インポートとエクスポート"
|
importAndExport: "インポートとエクスポート"
|
||||||
import: "インポート"
|
import: "インポート"
|
||||||
export: "エクスポート"
|
export: "エクスポート"
|
||||||
|
@ -1054,6 +1054,7 @@ permissionDeniedError: "操作が拒否されました"
|
||||||
permissionDeniedErrorDescription: "このアカウントにはこの操作を行うための権限がありません。"
|
permissionDeniedErrorDescription: "このアカウントにはこの操作を行うための権限がありません。"
|
||||||
preset: "プリセット"
|
preset: "プリセット"
|
||||||
selectFromPresets: "プリセットから選択"
|
selectFromPresets: "プリセットから選択"
|
||||||
|
custom: "カスタム"
|
||||||
achievements: "実績"
|
achievements: "実績"
|
||||||
gotInvalidResponseError: "サーバーの応答が無効です"
|
gotInvalidResponseError: "サーバーの応答が無効です"
|
||||||
gotInvalidResponseErrorDescription: "サーバーがダウンまたはメンテナンスしている可能性があります。しばらくしてから再度お試しください。"
|
gotInvalidResponseErrorDescription: "サーバーがダウンまたはメンテナンスしている可能性があります。しばらくしてから再度お試しください。"
|
||||||
|
@ -1092,6 +1093,7 @@ prohibitedWordsDescription2: "スペースで区切るとAND指定になり、
|
||||||
hiddenTags: "非表示ハッシュタグ"
|
hiddenTags: "非表示ハッシュタグ"
|
||||||
hiddenTagsDescription: "設定したタグをトレンドに表示させないようにします。改行で区切って複数設定できます。"
|
hiddenTagsDescription: "設定したタグをトレンドに表示させないようにします。改行で区切って複数設定できます。"
|
||||||
notesSearchNotAvailable: "ノート検索は利用できません。"
|
notesSearchNotAvailable: "ノート検索は利用できません。"
|
||||||
|
usersSearchNotAvailable: "ユーザー検索は利用できません。"
|
||||||
license: "ライセンス"
|
license: "ライセンス"
|
||||||
unfavoriteConfirm: "お気に入り解除しますか?"
|
unfavoriteConfirm: "お気に入り解除しますか?"
|
||||||
myClips: "自分のクリップ"
|
myClips: "自分のクリップ"
|
||||||
|
@ -1243,7 +1245,7 @@ releaseToRefresh: "離してリロード"
|
||||||
refreshing: "リロード中"
|
refreshing: "リロード中"
|
||||||
pullDownToRefresh: "引っ張ってリロード"
|
pullDownToRefresh: "引っ張ってリロード"
|
||||||
useGroupedNotifications: "通知をグルーピング"
|
useGroupedNotifications: "通知をグルーピング"
|
||||||
signupPendingError: "メールアドレスの確認中に問題が発生しました。リンクの有効期限が切れている可能性があります。"
|
emailVerificationFailedError: "メールアドレスの確認中に問題が発生しました。リンクの有効期限が切れている可能性があります。"
|
||||||
cwNotationRequired: "「内容を隠す」がオンの場合は注釈の記述が必要です。"
|
cwNotationRequired: "「内容を隠す」がオンの場合は注釈の記述が必要です。"
|
||||||
doReaction: "リアクションする"
|
doReaction: "リアクションする"
|
||||||
code: "コード"
|
code: "コード"
|
||||||
|
@ -1370,6 +1372,11 @@ defaultImageCompressionLevel: "デフォルトの画像圧縮度"
|
||||||
defaultImageCompressionLevel_description: "低くすると画質を保てますが、ファイルサイズは増加します。<br>高くするとファイルサイズを減らせますが、画質は低下します。"
|
defaultImageCompressionLevel_description: "低くすると画質を保てますが、ファイルサイズは増加します。<br>高くするとファイルサイズを減らせますが、画質は低下します。"
|
||||||
inMinutes: "分"
|
inMinutes: "分"
|
||||||
inDays: "日"
|
inDays: "日"
|
||||||
|
safeModeEnabled: "セーフモードが有効です"
|
||||||
|
pluginsAreDisabledBecauseSafeMode: "セーフモードが有効なため、プラグインはすべて無効化されています。"
|
||||||
|
customCssIsDisabledBecauseSafeMode: "セーフモードが有効なため、カスタムCSSは適用されていません。"
|
||||||
|
themeIsDefaultBecauseSafeMode: "セーフモードが有効な間はデフォルトのテーマが使用されます。セーフモードをオフにすると元に戻ります。"
|
||||||
|
thankYouForTestingBeta: "ベータ版の検証にご協力いただきありがとうございます!"
|
||||||
|
|
||||||
_order:
|
_order:
|
||||||
newest: "新しい順"
|
newest: "新しい順"
|
||||||
|
@ -1465,6 +1472,7 @@ _settings:
|
||||||
contentsUpdateFrequency_description2: "リアルタイムモードがオンのときは、この設定に関わらずリアルタイムでコンテンツが更新されます。"
|
contentsUpdateFrequency_description2: "リアルタイムモードがオンのときは、この設定に関わらずリアルタイムでコンテンツが更新されます。"
|
||||||
showUrlPreview: "URLプレビューを表示する"
|
showUrlPreview: "URLプレビューを表示する"
|
||||||
showAvailableReactionsFirstInNote: "利用できるリアクションを先頭に表示"
|
showAvailableReactionsFirstInNote: "利用できるリアクションを先頭に表示"
|
||||||
|
showPageTabBarBottom: "ページのタブバーを下部に表示"
|
||||||
|
|
||||||
_chat:
|
_chat:
|
||||||
showSenderName: "送信者の名前を表示"
|
showSenderName: "送信者の名前を表示"
|
||||||
|
@ -1605,9 +1613,9 @@ _initialTutorial:
|
||||||
public: "すべてのユーザーに公開。"
|
public: "すべてのユーザーに公開。"
|
||||||
home: "ホームタイムラインのみに公開。フォロワー・プロフィールを見に来た人・リノートから、他のユーザーも見ることができます。"
|
home: "ホームタイムラインのみに公開。フォロワー・プロフィールを見に来た人・リノートから、他のユーザーも見ることができます。"
|
||||||
followers: "フォロワーにのみ公開。本人以外がリノートすることはできず、またフォロワー以外は閲覧できません。"
|
followers: "フォロワーにのみ公開。本人以外がリノートすることはできず、またフォロワー以外は閲覧できません。"
|
||||||
direct: "指定したユーザーにのみ公開され、また相手に通知が入ります。ダイレクトメッセージのかわりにお使いいただけます。"
|
direct: "指定したユーザーにのみ公開され、また相手に通知が入ります。"
|
||||||
doNotSendConfidencialOnDirect1: "機密情報は送信する際は注意してください。"
|
doNotSendConfidencialOnDirect1: "機密情報は送信する際は注意してください。"
|
||||||
doNotSendConfidencialOnDirect2: "送信先のサーバーの管理者は投稿内容を見ることが可能なので、信頼できないサーバーのユーザーにダイレクト投稿を送信する場合は、機密情報の扱いに注意が必要です。"
|
doNotSendConfidencialOnDirect2: "送信先のサーバーの管理者は投稿内容を見ることが可能なので、信頼できないサーバーのユーザーが含まれる限定公開のノートを作成する際は、機密情報の扱いに注意が必要です。"
|
||||||
localOnly: "他のサーバーに投稿を連合しません。上記の公開範囲に関わらず、他のサーバーのユーザーは、この設定がついたノートを直接閲覧することができなくなります。"
|
localOnly: "他のサーバーに投稿を連合しません。上記の公開範囲に関わらず、他のサーバーのユーザーは、この設定がついたノートを直接閲覧することができなくなります。"
|
||||||
_cw:
|
_cw:
|
||||||
title: "内容を隠す(CW)"
|
title: "内容を隠す(CW)"
|
||||||
|
@ -1652,7 +1660,7 @@ _serverSettings:
|
||||||
fanoutTimelineDbFallbackDescription: "有効にすると、タイムラインがキャッシュされていない場合にDBへ追加で問い合わせを行うフォールバック処理を行います。無効にすると、フォールバック処理を行わないことでさらにサーバーの負荷を軽減することができますが、タイムラインが取得できる範囲に制限が生じます。"
|
fanoutTimelineDbFallbackDescription: "有効にすると、タイムラインがキャッシュされていない場合にDBへ追加で問い合わせを行うフォールバック処理を行います。無効にすると、フォールバック処理を行わないことでさらにサーバーの負荷を軽減することができますが、タイムラインが取得できる範囲に制限が生じます。"
|
||||||
reactionsBufferingDescription: "有効にすると、リアクション作成時のパフォーマンスが大幅に向上し、データベースへの負荷を軽減することが可能です。ただし、Redisのメモリ使用量は増加します。"
|
reactionsBufferingDescription: "有効にすると、リアクション作成時のパフォーマンスが大幅に向上し、データベースへの負荷を軽減することが可能です。ただし、Redisのメモリ使用量は増加します。"
|
||||||
remoteNotesCleaning: "リモート投稿の自動クリーニング"
|
remoteNotesCleaning: "リモート投稿の自動クリーニング"
|
||||||
remoteNotesCleaning_description: "有効にすると、参照されていない古いリモートの投稿を定期的にクリーンアップしてデータベースの肥大化を抑制します。"
|
remoteNotesCleaning_description: "有効にすると、一定期間経過したリモートの投稿を定期的にクリーンアップしてデータベースの肥大化を抑制します。"
|
||||||
remoteNotesCleaningMaxProcessingDuration: "最大クリーニング処理継続時間"
|
remoteNotesCleaningMaxProcessingDuration: "最大クリーニング処理継続時間"
|
||||||
remoteNotesCleaningExpiryDaysForEachNotes: "最低ノート保持日数"
|
remoteNotesCleaningExpiryDaysForEachNotes: "最低ノート保持日数"
|
||||||
inquiryUrl: "問い合わせ先URL"
|
inquiryUrl: "問い合わせ先URL"
|
||||||
|
@ -1675,6 +1683,9 @@ _serverSettings:
|
||||||
userGeneratedContentsVisibilityForVisitor_description2: "サーバーで受信したリモートのコンテンツを含め、サーバー内の全てのコンテンツを無条件でインターネットに公開することはリスクが伴います。特に、分散型の特性を知らない閲覧者にとっては、リモートのコンテンツであってもサーバー内で作成されたコンテンツであると誤って認識してしまう可能性があるため、注意が必要です。"
|
userGeneratedContentsVisibilityForVisitor_description2: "サーバーで受信したリモートのコンテンツを含め、サーバー内の全てのコンテンツを無条件でインターネットに公開することはリスクが伴います。特に、分散型の特性を知らない閲覧者にとっては、リモートのコンテンツであってもサーバー内で作成されたコンテンツであると誤って認識してしまう可能性があるため、注意が必要です。"
|
||||||
restartServerSetupWizardConfirm_title: "サーバーの初期設定ウィザードをやり直しますか?"
|
restartServerSetupWizardConfirm_title: "サーバーの初期設定ウィザードをやり直しますか?"
|
||||||
restartServerSetupWizardConfirm_text: "現在の一部の設定はリセットされます。"
|
restartServerSetupWizardConfirm_text: "現在の一部の設定はリセットされます。"
|
||||||
|
entrancePageStyle: "エントランスページのスタイル"
|
||||||
|
showTimelineForVisitor: "タイムラインを表示する"
|
||||||
|
showActivitiesForVisitor: "アクティビティを表示する"
|
||||||
|
|
||||||
_userGeneratedContentsVisibilityForVisitor:
|
_userGeneratedContentsVisibilityForVisitor:
|
||||||
all: "全て公開"
|
all: "全て公開"
|
||||||
|
@ -2015,6 +2026,7 @@ _role:
|
||||||
descriptionOfRateLimitFactor: "小さいほど制限が緩和され、大きいほど制限が強化されます。"
|
descriptionOfRateLimitFactor: "小さいほど制限が緩和され、大きいほど制限が強化されます。"
|
||||||
canHideAds: "広告の非表示"
|
canHideAds: "広告の非表示"
|
||||||
canSearchNotes: "ノート検索の利用"
|
canSearchNotes: "ノート検索の利用"
|
||||||
|
canSearchUsers: "ユーザー検索の利用"
|
||||||
canUseTranslator: "翻訳機能の利用"
|
canUseTranslator: "翻訳機能の利用"
|
||||||
avatarDecorationLimit: "アイコンデコレーションの最大取付個数"
|
avatarDecorationLimit: "アイコンデコレーションの最大取付個数"
|
||||||
canImportAntennas: "アンテナのインポートを許可"
|
canImportAntennas: "アンテナのインポートを許可"
|
||||||
|
@ -2314,6 +2326,7 @@ _time:
|
||||||
minute: "分"
|
minute: "分"
|
||||||
hour: "時間"
|
hour: "時間"
|
||||||
day: "日"
|
day: "日"
|
||||||
|
month: "ヶ月"
|
||||||
|
|
||||||
_2fa:
|
_2fa:
|
||||||
alreadyRegistered: "既に設定は完了しています。"
|
alreadyRegistered: "既に設定は完了しています。"
|
||||||
|
@ -2532,7 +2545,7 @@ _visibility:
|
||||||
homeDescription: "ホームタイムラインのみに公開"
|
homeDescription: "ホームタイムラインのみに公開"
|
||||||
followers: "フォロワー"
|
followers: "フォロワー"
|
||||||
followersDescription: "自分のフォロワーのみに公開"
|
followersDescription: "自分のフォロワーのみに公開"
|
||||||
specified: "ダイレクト"
|
specified: "指名"
|
||||||
specifiedDescription: "指定したユーザーのみに公開"
|
specifiedDescription: "指定したユーザーのみに公開"
|
||||||
disableFederation: "連合なし"
|
disableFederation: "連合なし"
|
||||||
disableFederationDescription: "他サーバーへの配信を行いません"
|
disableFederationDescription: "他サーバーへの配信を行いません"
|
||||||
|
@ -2778,8 +2791,8 @@ _deck:
|
||||||
antenna: "アンテナ"
|
antenna: "アンテナ"
|
||||||
list: "リスト"
|
list: "リスト"
|
||||||
channel: "チャンネル"
|
channel: "チャンネル"
|
||||||
mentions: "あなた宛て"
|
mentions: "メンション"
|
||||||
direct: "ダイレクト"
|
direct: "指名"
|
||||||
roleTimeline: "ロールタイムライン"
|
roleTimeline: "ロールタイムライン"
|
||||||
chat: "チャット"
|
chat: "チャット"
|
||||||
|
|
||||||
|
@ -3164,6 +3177,7 @@ _bootErrors:
|
||||||
otherOption1: "クライアント設定とキャッシュを削除"
|
otherOption1: "クライアント設定とキャッシュを削除"
|
||||||
otherOption2: "簡易クライアントを起動"
|
otherOption2: "簡易クライアントを起動"
|
||||||
otherOption3: "修復ツールを起動"
|
otherOption3: "修復ツールを起動"
|
||||||
|
otherOption4: "Misskeyをセーフモードで起動"
|
||||||
|
|
||||||
_search:
|
_search:
|
||||||
searchScopeAll: "全て"
|
searchScopeAll: "全て"
|
||||||
|
@ -3202,8 +3216,8 @@ _serverSetupWizard:
|
||||||
doYouConnectToFediverse_description1: "分散型サーバーで構成されるネットワーク(Fediverse)に接続すると、他のサーバーと相互にコンテンツのやり取りが可能です。"
|
doYouConnectToFediverse_description1: "分散型サーバーで構成されるネットワーク(Fediverse)に接続すると、他のサーバーと相互にコンテンツのやり取りが可能です。"
|
||||||
doYouConnectToFediverse_description2: "Fediverseと接続することは「連合」とも呼ばれます。"
|
doYouConnectToFediverse_description2: "Fediverseと接続することは「連合」とも呼ばれます。"
|
||||||
youCanConfigureMoreFederationSettingsLater: "連合可能なサーバーの指定など、高度な設定も後ほど可能です。"
|
youCanConfigureMoreFederationSettingsLater: "連合可能なサーバーの指定など、高度な設定も後ほど可能です。"
|
||||||
remoteContentsCleaning: "受信コンテンツの自動クリーニング"
|
remoteContentsCleaning: "リモートコンテンツの自動クリーニング"
|
||||||
remoteContentsCleaning_description: "連合を行うと、継続して多くのコンテンツを受信します。自動クリーニングを有効にすると、参照されていない古くなったコンテンツを自動でサーバーから削除し、ストレージを節約できます。"
|
remoteContentsCleaning_description: "連合を行うと、継続して多くのコンテンツを受信します。自動クリーニングを有効にすると、一定期間経過したリモートコンテンツを自動でサーバーから削除し、ストレージを節約できます。"
|
||||||
adminInfo: "管理者情報"
|
adminInfo: "管理者情報"
|
||||||
adminInfo_description: "問い合わせを受け付けるために使用される管理者情報を設定します。"
|
adminInfo_description: "問い合わせを受け付けるために使用される管理者情報を設定します。"
|
||||||
adminInfo_mustBeFilled: "オープンサーバー、または連合がオンの場合は必ず入力が必要です。"
|
adminInfo_mustBeFilled: "オープンサーバー、または連合がオンの場合は必ず入力が必要です。"
|
||||||
|
@ -3261,10 +3275,10 @@ _watermarkEditor:
|
||||||
type: "タイプ"
|
type: "タイプ"
|
||||||
image: "画像"
|
image: "画像"
|
||||||
advanced: "高度"
|
advanced: "高度"
|
||||||
|
angle: "角度"
|
||||||
stripe: "ストライプ"
|
stripe: "ストライプ"
|
||||||
stripeWidth: "ラインの幅"
|
stripeWidth: "ラインの幅"
|
||||||
stripeFrequency: "ラインの数"
|
stripeFrequency: "ラインの数"
|
||||||
angle: "角度"
|
|
||||||
polkadot: "ポルカドット"
|
polkadot: "ポルカドット"
|
||||||
checker: "チェッカー"
|
checker: "チェッカー"
|
||||||
polkadotMainDotOpacity: "メインドットの不透明度"
|
polkadotMainDotOpacity: "メインドットの不透明度"
|
||||||
|
@ -3277,6 +3291,7 @@ _imageEffector:
|
||||||
title: "エフェクト"
|
title: "エフェクト"
|
||||||
addEffect: "エフェクトを追加"
|
addEffect: "エフェクトを追加"
|
||||||
discardChangesConfirm: "変更を破棄して終了しますか?"
|
discardChangesConfirm: "変更を破棄して終了しますか?"
|
||||||
|
nothingToConfigure: "設定項目はありません"
|
||||||
|
|
||||||
_fxs:
|
_fxs:
|
||||||
chromaticAberration: "色収差"
|
chromaticAberration: "色収差"
|
||||||
|
@ -3296,6 +3311,39 @@ _imageEffector:
|
||||||
blockNoise: "ブロックノイズ"
|
blockNoise: "ブロックノイズ"
|
||||||
tearing: "ティアリング"
|
tearing: "ティアリング"
|
||||||
|
|
||||||
|
_fxProps:
|
||||||
|
angle: "角度"
|
||||||
|
scale: "サイズ"
|
||||||
|
size: "サイズ"
|
||||||
|
color: "色"
|
||||||
|
opacity: "不透明度"
|
||||||
|
normalize: "正規化"
|
||||||
|
amount: "量"
|
||||||
|
lightness: "明るさ"
|
||||||
|
contrast: "コントラスト"
|
||||||
|
hue: "色相"
|
||||||
|
brightness: "輝度"
|
||||||
|
saturation: "彩度"
|
||||||
|
max: "最大値"
|
||||||
|
min: "最小値"
|
||||||
|
direction: "方向"
|
||||||
|
phase: "位相"
|
||||||
|
frequency: "頻度"
|
||||||
|
strength: "強さ"
|
||||||
|
glitchChannelShift: "ズレ"
|
||||||
|
seed: "シード値"
|
||||||
|
redComponent: "赤色成分"
|
||||||
|
greenComponent: "緑色成分"
|
||||||
|
blueComponent: "青色成分"
|
||||||
|
threshold: "しきい値"
|
||||||
|
centerX: "中心X"
|
||||||
|
centerY: "中心Y"
|
||||||
|
zoomLinesSmoothing: "スムージング"
|
||||||
|
zoomLinesSmoothingDescription: "スムージングと集中線の幅の設定は併用できません。"
|
||||||
|
zoomLinesThreshold: "集中線の幅"
|
||||||
|
zoomLinesMaskSize: "中心径"
|
||||||
|
zoomLinesBlack: "黒色にする"
|
||||||
|
|
||||||
drafts: "下書き"
|
drafts: "下書き"
|
||||||
_drafts:
|
_drafts:
|
||||||
select: "下書きを選択"
|
select: "下書きを選択"
|
||||||
|
|
|
@ -300,6 +300,7 @@ uploadFromUrlMayTakeTime: "アップロード終わるんにちょい時間か
|
||||||
explore: "みつける"
|
explore: "みつける"
|
||||||
messageRead: "もう読んだ"
|
messageRead: "もう読んだ"
|
||||||
noMoreHistory: "これより昔のんはあらへんで"
|
noMoreHistory: "これより昔のんはあらへんで"
|
||||||
|
startChat: "チャットを始めよか"
|
||||||
nUsersRead: "{n}人が読んでもうた"
|
nUsersRead: "{n}人が読んでもうた"
|
||||||
agreeTo: "{0}に同意したで"
|
agreeTo: "{0}に同意したで"
|
||||||
agree: "せやな"
|
agree: "せやな"
|
||||||
|
@ -324,6 +325,7 @@ dark: "ダーク"
|
||||||
lightThemes: "デイゲーム"
|
lightThemes: "デイゲーム"
|
||||||
darkThemes: "ナイトゲーム"
|
darkThemes: "ナイトゲーム"
|
||||||
syncDeviceDarkMode: "デバイスのダークモードと一緒にする"
|
syncDeviceDarkMode: "デバイスのダークモードと一緒にする"
|
||||||
|
switchDarkModeManuallyWhenSyncEnabledConfirm: "「{x}」がオンになってるで。同期をオフにして手動でモードを切り替えることにします?"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
fileName: "ファイル名"
|
fileName: "ファイル名"
|
||||||
selectFile: "ファイル選んでや"
|
selectFile: "ファイル選んでや"
|
||||||
|
@ -422,6 +424,7 @@ antennaExcludeBots: "Botアカウントを除外"
|
||||||
antennaKeywordsDescription: "スペースで区切ったるとAND指定で、改行で区切ったるとOR指定や"
|
antennaKeywordsDescription: "スペースで区切ったるとAND指定で、改行で区切ったるとOR指定や"
|
||||||
notifyAntenna: "新しいノートを通知すんで"
|
notifyAntenna: "新しいノートを通知すんで"
|
||||||
withFileAntenna: "なんか添付されたノートだけ"
|
withFileAntenna: "なんか添付されたノートだけ"
|
||||||
|
excludeNotesInSensitiveChannel: "センシティブなチャンネルのノートは入れんとくわ"
|
||||||
enableServiceworker: "ブラウザにプッシュ通知が行くようにする"
|
enableServiceworker: "ブラウザにプッシュ通知が行くようにする"
|
||||||
antennaUsersDescription: "ユーザー名を改行で区切ったってな"
|
antennaUsersDescription: "ユーザー名を改行で区切ったってな"
|
||||||
caseSensitive: "大文字と小文字は別もんや"
|
caseSensitive: "大文字と小文字は別もんや"
|
||||||
|
@ -693,6 +696,7 @@ userSaysSomethingAbout: "{name}が「{word}」についてなんか言うてた
|
||||||
makeActive: "使うで"
|
makeActive: "使うで"
|
||||||
display: "表示"
|
display: "表示"
|
||||||
copy: "コピー"
|
copy: "コピー"
|
||||||
|
copiedToClipboard: "クリップボードにコピーされたで"
|
||||||
metrics: "メトリクス"
|
metrics: "メトリクス"
|
||||||
overview: "概要"
|
overview: "概要"
|
||||||
logs: "ログ"
|
logs: "ログ"
|
||||||
|
@ -787,6 +791,7 @@ wide: "広い"
|
||||||
narrow: "狭い"
|
narrow: "狭い"
|
||||||
reloadToApplySetting: "設定はページリロード後に反映されるで。今リロードしとくか?"
|
reloadToApplySetting: "設定はページリロード後に反映されるで。今リロードしとくか?"
|
||||||
needReloadToApply: "反映には再起動せなあかんで"
|
needReloadToApply: "反映には再起動せなあかんで"
|
||||||
|
needToRestartServerToApply: "反映にはサーバーを再起動せなあかんのよ。"
|
||||||
showTitlebar: "タイトルバーを見せる"
|
showTitlebar: "タイトルバーを見せる"
|
||||||
clearCache: "キャッシュをほかす"
|
clearCache: "キャッシュをほかす"
|
||||||
onlineUsersCount: "{n}人が起きとるで"
|
onlineUsersCount: "{n}人が起きとるで"
|
||||||
|
@ -974,6 +979,7 @@ document: "ドキュメント"
|
||||||
numberOfPageCache: "ページ、どんだけキャッシュすんの?"
|
numberOfPageCache: "ページ、どんだけキャッシュすんの?"
|
||||||
numberOfPageCacheDescription: "増やすと使いやすくなるけど、負荷とメモリ使用量が増えてくで。一長一短やな。"
|
numberOfPageCacheDescription: "増やすと使いやすくなるけど、負荷とメモリ使用量が増えてくで。一長一短やな。"
|
||||||
logoutConfirm: "ログアウトしまっか?"
|
logoutConfirm: "ログアウトしまっか?"
|
||||||
|
logoutWillClearClientData: "ログアウトするとクライアントの設定情報がブラウザから消されてまうで。再ログイン時に設定情報を復元できるようにするためには、設定の自動バックアップを有効にするとええで。"
|
||||||
lastActiveDate: "最後に使った日時"
|
lastActiveDate: "最後に使った日時"
|
||||||
statusbar: "ステータスバー"
|
statusbar: "ステータスバー"
|
||||||
pleaseSelect: "選んだってやー"
|
pleaseSelect: "選んだってやー"
|
||||||
|
@ -992,6 +998,7 @@ failedToUpload: "アップロードに失敗してもうたわ…"
|
||||||
cannotUploadBecauseInappropriate: "きわどい内容を含むかもしれへんって言われたからアップロードできへんわ。"
|
cannotUploadBecauseInappropriate: "きわどい内容を含むかもしれへんって言われたからアップロードできへんわ。"
|
||||||
cannotUploadBecauseNoFreeSpace: "ドライブがもうパンパンやからアップロードできへんわ。"
|
cannotUploadBecauseNoFreeSpace: "ドライブがもうパンパンやからアップロードできへんわ。"
|
||||||
cannotUploadBecauseExceedsFileSizeLimit: "ファイルが思うたよりも大きいさかいアップロードできへんでこれ。"
|
cannotUploadBecauseExceedsFileSizeLimit: "ファイルが思うたよりも大きいさかいアップロードできへんでこれ。"
|
||||||
|
cannotUploadBecauseUnallowedFileType: "許可されてへんファイル種別やからアップロードできへんっぽい。"
|
||||||
beta: "ベータ"
|
beta: "ベータ"
|
||||||
enableAutoSensitive: "自動できわどいか判断する"
|
enableAutoSensitive: "自動できわどいか判断する"
|
||||||
enableAutoSensitiveDescription: "使える時は、機械学習を使って自動でメディアにNSFWフラグを設定するで。この機能をオフにしても、サーバーによっては自動で設定されることがあるで。"
|
enableAutoSensitiveDescription: "使える時は、機械学習を使って自動でメディアにNSFWフラグを設定するで。この機能をオフにしても、サーバーによっては自動で設定されることがあるで。"
|
||||||
|
@ -1232,7 +1239,6 @@ releaseToRefresh: "離したらリロード"
|
||||||
refreshing: "リロードしとる"
|
refreshing: "リロードしとる"
|
||||||
pullDownToRefresh: "引っ張ってリロードするで"
|
pullDownToRefresh: "引っ張ってリロードするで"
|
||||||
useGroupedNotifications: "通知をグループ分けして出すで"
|
useGroupedNotifications: "通知をグループ分けして出すで"
|
||||||
signupPendingError: "メアド確認してたらなんか変なことなったわ。リンクの期限切れてるかもしれん。"
|
|
||||||
cwNotationRequired: "「内容を隠す」んやったら注釈書かなアカンで。"
|
cwNotationRequired: "「内容を隠す」んやったら注釈書かなアカンで。"
|
||||||
doReaction: "ツッコむで"
|
doReaction: "ツッコむで"
|
||||||
code: "コード"
|
code: "コード"
|
||||||
|
@ -1304,16 +1310,97 @@ federationSpecified: "このサーバーはホワイトリスト連合で運用
|
||||||
federationDisabled: "このサーバーは連合が無効化されてるで。他のサーバーのユーザーとやり取りすることはできひんで。"
|
federationDisabled: "このサーバーは連合が無効化されてるで。他のサーバーのユーザーとやり取りすることはできひんで。"
|
||||||
confirmOnReact: "ツッコむときに確認とる"
|
confirmOnReact: "ツッコむときに確認とる"
|
||||||
reactAreYouSure: "\" {emoji} \" でツッコむ?"
|
reactAreYouSure: "\" {emoji} \" でツッコむ?"
|
||||||
|
markAsSensitiveConfirm: "このメディアをきわどい扱いしときますか?"
|
||||||
|
unmarkAsSensitiveConfirm: "このメディアはやっぱきわどくなかったってことでええんか?"
|
||||||
|
noName: "名前はあらへんで"
|
||||||
|
preferenceSyncConflictTitle: "サーバーに設定値があるみたいやわ"
|
||||||
|
preferenceSyncConflictText: "同期が有効にされた設定項目は設定値をサーバーに保存するねんけど、この設定項目はサーバーに保存されたやつがあるみたいやわ。どないするん?"
|
||||||
|
preferenceSyncConflictChoiceMerge: "ガッチャンコしよか"
|
||||||
|
preferenceSyncConflictChoiceCancel: "同期の有効化はやめとくわ"
|
||||||
postForm: "投稿フォーム"
|
postForm: "投稿フォーム"
|
||||||
information: "情報"
|
information: "情報"
|
||||||
|
migrateOldSettings: "旧設定情報をお引っ越し"
|
||||||
|
migrateOldSettings_description: "通常これは自動で行われるはずなんやけど、なんかの理由で上手く移行できへんかったときは手動で移行処理をポチっとできるで。今の設定情報は上書きされるで。"
|
||||||
|
settingsMigrating: "設定を移行しとるで。ちょっと待っとってな... (後で、設定→その他→旧設定情報を移行 で手動で移行することもできるで)"
|
||||||
|
driveAboutTip: "ドライブでは、今までアップロードしたファイルがずらーっと表示されるで。<br>\nノートにファイルをもっかいのっけたり、あとで投稿するファイルをその辺に置いとくこともできるねん。<br>\n<b>ファイルをほかすと、前にそのファイルをのっけた全部の場所(ノート、ページ、アバター、バナー等)からも見えんくなるから気いつけてな。</b><br>\nフォルダを作って整理することもできるで。"
|
||||||
|
turnItOn: "オンにしとこ"
|
||||||
|
turnItOff: "オフでええわ"
|
||||||
|
emojiUnmute: "絵文字ミュートやめたる"
|
||||||
|
unmuteX: "{x}のミュートやめたる"
|
||||||
|
redisplayAllTips: "全部の「ヒントとコツ」をもっかい見して"
|
||||||
|
hideAllTips: "「ヒントとコツ」は全部表示せんでええ"
|
||||||
|
defaultImageCompressionLevel_description: "低くすると画質は保てるんやけど、ファイルサイズが増えるで。<br>高くするとファイルサイズは減らせるんやけど、画質が落ちるで。"
|
||||||
|
inMinutes: "分"
|
||||||
|
inDays: "日"
|
||||||
|
safeModeEnabled: "セーフモードがオンになってるで"
|
||||||
|
pluginsAreDisabledBecauseSafeMode: "セーフモードがオンやから、プラグインは全部無効化されてるで。"
|
||||||
|
customCssIsDisabledBecauseSafeMode: "セーフモードがオンやから、カスタムCSSは適用されてへんで。"
|
||||||
|
themeIsDefaultBecauseSafeMode: "セーフモードがオンの間はデフォルトのテーマを使うで。セーフモードをオフにれば元に戻るで。"
|
||||||
_chat:
|
_chat:
|
||||||
|
noMessagesYet: "まだメッセージはあらへんで"
|
||||||
|
individualChat_description: "特定のユーザーと一対一でチャットができるで。"
|
||||||
|
roomChat_description: "複数人でチャットできるで。\nあと、個人チャットを許可してへんユーザーとでも、相手がええって言うならチャットできるで。"
|
||||||
|
inviteUserToChat: "ユーザーを招待してチャットを始めてみ"
|
||||||
invitations: "来てや"
|
invitations: "来てや"
|
||||||
|
noInvitations: "招待はあらへんで"
|
||||||
noHistory: "履歴はないわ。"
|
noHistory: "履歴はないわ。"
|
||||||
|
noRooms: "ルームはあらへんで"
|
||||||
members: "メンバーはん"
|
members: "メンバーはん"
|
||||||
home: "ホーム"
|
home: "ホーム"
|
||||||
send: "送信"
|
send: "送信"
|
||||||
|
deleteRoom: "ルームをほかす"
|
||||||
|
chatNotAvailableForThisAccountOrServer: "このサーバー、もしくはこのアカウントでチャットが有効にされてへんで。"
|
||||||
|
chatIsReadOnlyForThisAccountOrServer: "このサーバー、もしくはこのアカウントでチャットが読み取り専用になっとるわ。新しく書き込んだり、チャットルームを作ったり参加したりはできへんで。"
|
||||||
|
chatNotAvailableInOtherAccount: "相手のアカウントでチャット機能が使えんくなっとるみたいやわ。"
|
||||||
|
cannotChatWithTheUser: "このユーザーとのチャットを開始できへんみたいやわ"
|
||||||
|
cannotChatWithTheUser_description: "チャットが使えん状態になっとるか、相手がチャットを開放してへんみたいやわ。"
|
||||||
|
youAreNotAMemberOfThisRoomButInvited: "あんたはこのルームの参加者ちゃうけど、招待が届いとるで。参加するんやったら、招待を承認してな。"
|
||||||
|
doYouAcceptInvitation: "招待を承認してもええんか?"
|
||||||
|
chatWithThisUser: "チャットしよか"
|
||||||
|
thisUserAllowsChatOnlyFromFollowers: "このユーザーはフォロワーからのチャットしか受け付けとらんみたいやわ。"
|
||||||
|
thisUserAllowsChatOnlyFromFollowing: "このユーザーは、このユーザーがフォローしとるユーザーからのチャットしか受け付けとらんみたいやわ。"
|
||||||
|
thisUserAllowsChatOnlyFromMutualFollowing: "このユーザーは相互フォローのユーザーからのチャットしか受け付けとらんみたいやわ。"
|
||||||
|
thisUserNotAllowedChatAnyone: "このユーザーは誰からのチャットも受け付けとらんみたいやわ。"
|
||||||
|
chatAllowedUsers: "チャットしてもええ相手"
|
||||||
|
chatAllowedUsers_note: "自分からチャットメッセージを送った相手やったらこの設定に関わらずチャットできるで。"
|
||||||
|
_chatAllowedUsers:
|
||||||
|
followers: "自分のフォロワーだけ"
|
||||||
|
following: "自分がフォローしとるユーザーだけ"
|
||||||
|
mutual: "相互フォローのユーザーだけ"
|
||||||
|
none: "誰もかもあかん"
|
||||||
|
_emojiPalette:
|
||||||
|
enableSyncBetweenDevicesForPalettes: "パレットのデバイス間同期をつけとく"
|
||||||
|
paletteForMain: "メインで使うパレット"
|
||||||
|
paletteForReaction: "リアクションで使うパレット"
|
||||||
_settings:
|
_settings:
|
||||||
|
driveBanner: "ドライブの管理と設定、使用量の確認、ファイルをアップロードするときの設定ができるで。"
|
||||||
|
pluginBanner: "プラグインを使うとクライアントの機能を拡張できるねん。プラグインのインストール、個別の設定と管理ができるで。"
|
||||||
|
notificationsBanner: "サーバーから受け取る通知の種類とか範囲、プッシュ通知の設定ができるで。"
|
||||||
webhook: "Webhook"
|
webhook: "Webhook"
|
||||||
|
serviceConnectionBanner: "外部のアプリ・サービスと連携するのに使うとるアクセストークンとかWebhookの管理と設定ができるで。"
|
||||||
|
accountDataBanner: "アカウントデータのアーカイブをエクスポート/インポートして管理できるで。"
|
||||||
|
muteAndBlockBanner: "見せんでええコンテンツの設定とか、特定のユーザーからのアクションを制限する設定と管理ができるで。"
|
||||||
|
accessibilityBanner: "クライアントの視覚や動作に関わるパーソナライズをして、よりええ感じに使えるように設定できるで。"
|
||||||
|
privacyBanner: "コンテンツの公開範囲、見つけやすさ、フォローの承認制とかアカウントのプライバシーに関わる設定ができるで。"
|
||||||
|
securityBanner: "パスワード、ログイン方法、認証アプリ、パスキーとかアカウントのセキュリティに関わる設定ができるで。"
|
||||||
|
preferencesBanner: "好みに応じた、クライアントの全体的な動作の設定ができるで。"
|
||||||
|
appearanceBanner: "好みに応じた、クライアントの見た目・表示方法に関わる設定ができるで。"
|
||||||
|
soundsBanner: "クライアントで流すサウンドの設定ができるで。"
|
||||||
|
makeEveryTextElementsSelectable: "全部のテキスト要素を選択できるようにする"
|
||||||
|
makeEveryTextElementsSelectable_description: "これをつけると、一部のシチュエーションでユーザビリティが低下するかもしれん。"
|
||||||
|
enablePullToRefresh_description: "マウスやったら、ホイールを押し込みながらドラッグしてな。"
|
||||||
|
realtimeMode_description: "サーバーと接続を確立して、リアルタイムでコンテンツを更新するで。通信量とバッテリーの消費が多くなるかもしれへん。"
|
||||||
|
contentsUpdateFrequency_description: "高いほどリアルタイムにコンテンツが更新されるんやけど、そのぶんパフォーマンスが低くなるし、通信量とバッテリーの消費も増えるねん。"
|
||||||
|
contentsUpdateFrequency_description2: "リアルタイムモードをつけてるんやったら、この設定がどうであれリアルタイムでコンテンツが更新されるで。"
|
||||||
|
_preferencesProfile:
|
||||||
|
profileNameDescription: "このデバイスはなんて呼んだらええんや?"
|
||||||
|
_preferencesBackup:
|
||||||
|
noBackupsFoundTitle: "バックアップが見つからへんね"
|
||||||
|
noBackupsFoundDescription: "自動で作られたバックアップは見つからんかったけど、バックアップファイルを手動で保存してるんやったら、それをインポートして復元できるで。"
|
||||||
|
selectBackupToRestore: "復元するバックアップを選んでや"
|
||||||
|
youNeedToNameYourProfileToEnableAutoBackup: "自動バックアップを有効するんやったらプロファイル名の設定が必要やな。"
|
||||||
|
autoPreferencesBackupIsNotEnabledForThisDevice: "このデバイスで設定の自動バックアップは有効になってへんで。"
|
||||||
|
backupFound: "設定のバックアップがあるみたいやわ"
|
||||||
_accountSettings:
|
_accountSettings:
|
||||||
requireSigninToViewContents: "ログインしてもらってからコンテンツ見てもらう"
|
requireSigninToViewContents: "ログインしてもらってからコンテンツ見てもらう"
|
||||||
requireSigninToViewContentsDescription1: "あなたが作成した全部のノートとかのコンテンツを見れるようにするのにログインがいるようにするで。クローラーにいろいろ収集されるんを防げるかもしれん。"
|
requireSigninToViewContentsDescription1: "あなたが作成した全部のノートとかのコンテンツを見れるようにするのにログインがいるようにするで。クローラーにいろいろ収集されるんを防げるかもしれん。"
|
||||||
|
@ -1324,6 +1411,7 @@ _accountSettings:
|
||||||
makeNotesHiddenBefore: "昔のノートを見れんようにする"
|
makeNotesHiddenBefore: "昔のノートを見れんようにする"
|
||||||
makeNotesHiddenBeforeDescription: "この機能が有効になってる間は、設定された日時より前、それか設定された時間が経ったノートがフォロワーのみ見れるようになるで。無効に戻すと、ノートの公開状態も戻るで。"
|
makeNotesHiddenBeforeDescription: "この機能が有効になってる間は、設定された日時より前、それか設定された時間が経ったノートがフォロワーのみ見れるようになるで。無効に戻すと、ノートの公開状態も戻るで。"
|
||||||
mayNotEffectForFederatedNotes: "リモートサーバーに連合されたノートには効果が及ばんかもしれん。"
|
mayNotEffectForFederatedNotes: "リモートサーバーに連合されたノートには効果が及ばんかもしれん。"
|
||||||
|
mayNotEffectSomeSituations: "これらの制限は簡易的なものやで。リモートサーバーでの閲覧とかモデレーション時とか、一部のシチュエーションでは適用されへんかもしれん。"
|
||||||
notesHavePassedSpecifiedPeriod: "決めた時間が経ったノート"
|
notesHavePassedSpecifiedPeriod: "決めた時間が経ったノート"
|
||||||
notesOlderThanSpecifiedDateAndTime: "決めた日時より前のノート"
|
notesOlderThanSpecifiedDateAndTime: "決めた日時より前のノート"
|
||||||
_abuseUserReport:
|
_abuseUserReport:
|
||||||
|
@ -1342,6 +1430,7 @@ _delivery:
|
||||||
manuallySuspended: "手動停止中"
|
manuallySuspended: "手動停止中"
|
||||||
goneSuspended: "サーバー削除のため停止中"
|
goneSuspended: "サーバー削除のため停止中"
|
||||||
autoSuspendedForNotResponding: "サーバー応答せえへんから停止中"
|
autoSuspendedForNotResponding: "サーバー応答せえへんから停止中"
|
||||||
|
softwareSuspended: "配信停止中のソフトウェアやから停止中"
|
||||||
_bubbleGame:
|
_bubbleGame:
|
||||||
howToPlay: "遊び方"
|
howToPlay: "遊び方"
|
||||||
hold: "ホールド"
|
hold: "ホールド"
|
||||||
|
@ -1468,11 +1557,21 @@ _serverSettings:
|
||||||
fanoutTimelineDbFallback: "データベースにフォールバックする"
|
fanoutTimelineDbFallback: "データベースにフォールバックする"
|
||||||
fanoutTimelineDbFallbackDescription: "有効にしたら、タイムラインがキャッシュん中に入ってないときにDBにもっかい問い合わせるフォールバック処理ってのをやっとくで。切ったらフォールバック処理をやらんからサーバーはもっと軽くなんねんけど、タイムラインの取得範囲がちょっと減るで。"
|
fanoutTimelineDbFallbackDescription: "有効にしたら、タイムラインがキャッシュん中に入ってないときにDBにもっかい問い合わせるフォールバック処理ってのをやっとくで。切ったらフォールバック処理をやらんからサーバーはもっと軽くなんねんけど、タイムラインの取得範囲がちょっと減るで。"
|
||||||
reactionsBufferingDescription: "有効にしたら、リアクション作るときのパフォーマンスがすっごい上がって、データベースへの負荷が減るで。代わりに、Redisのメモリ使用は増えるで。"
|
reactionsBufferingDescription: "有効にしたら、リアクション作るときのパフォーマンスがすっごい上がって、データベースへの負荷が減るで。代わりに、Redisのメモリ使用は増えるで。"
|
||||||
|
remoteNotesCleaning_description: "つけると、参照されてへん古いリモートの投稿を定期的にクリーンアップしてデータベースの肥大化を抑えてくれるで。"
|
||||||
inquiryUrl: "問い合わせ先URL"
|
inquiryUrl: "問い合わせ先URL"
|
||||||
inquiryUrlDescription: "サーバー運営者へのお問い合わせフォームのURLや、運営者の連絡先等が記載されたWebページのURLを指定するで。"
|
inquiryUrlDescription: "サーバー運営者へのお問い合わせフォームのURLや、運営者の連絡先等が記載されたWebページのURLを指定するで。"
|
||||||
openRegistration: "アカウントの作成をオープンにする"
|
openRegistration: "アカウントの作成をオープンにする"
|
||||||
openRegistrationWarning: "登録を解放するのはリスクが伴うで。サーバーをいっつも監視して、なんか起きたらすぐに対応できるんやったら、オンにしてもええと思う。"
|
openRegistrationWarning: "登録を解放するのはリスクが伴うで。サーバーをいっつも監視して、なんか起きたらすぐに対応できるんやったら、オンにしてもええと思う。"
|
||||||
thisSettingWillAutomaticallyOffWhenModeratorsInactive: "一定期間モデレーターがおらんかったら、スパムを防ぐためにこの設定は勝手に切られるで。"
|
thisSettingWillAutomaticallyOffWhenModeratorsInactive: "一定期間モデレーターがおらんかったら、スパムを防ぐためにこの設定は勝手に切られるで。"
|
||||||
|
deliverSuspendedSoftwareDescription: "脆弱性とかの理由で、サーバーのソフトウェアの名前とバージョンの範囲を決めて配信を止められるで。このバージョン情報はサーバーが提供したものやから、信頼性は保証されへん。バージョン指定には semver の範囲指定が使えるねんけど、>= 2024.3.1と指定すると 2024.3.1-custom.0 みたいなカスタムバージョンが含まれへんから、>= 2024.3.1-0 みたいに prerelease を指定するとええかもしれへんな。"
|
||||||
|
singleUserMode_description: "このサーバーを使うとるんが自分だけなんやったら、このモードを有効にすると動作がええ感じになるで。"
|
||||||
|
signToActivityPubGet_description: "通常はつけといてな。連合の通信に関わる問題があるんやったら、無効にすると改善するかもしれへんけど、逆にサーバーによっては通信ができんくなることがあるで。"
|
||||||
|
proxyRemoteFiles_description: "つけると、リモートのファイルをプロキシして提供するで。画像のサムネイル生成とかユーザーのプライバシー保護にええな。"
|
||||||
|
allowExternalApRedirect_description: "つけると、他のサーバーがうちのサーバーを通して第三者のコンテンツを照会できるようになるんやけど、コンテンツのなりすましが発生するかもしれへん。"
|
||||||
|
userGeneratedContentsVisibilityForVisitor_description: "モデレーションが行き届きにくい不適切なリモートコンテンツとかが、うちのサーバー経由で図らずもインターネットに公開されてまうことによるトラブルを防止できたりするで。"
|
||||||
|
userGeneratedContentsVisibilityForVisitor_description2: "サーバーで受け取ったリモートのコンテンツを含め、サーバー内の全部のコンテンツを何でもかんでもインターネットに公開するのはリスクを伴うねん。特に、分散型の特性を知らん閲覧者にとっては、リモートのコンテンツやったとしてもサーバー内で作られたコンテンツやと誤認してまうかもしれへんから、注意が必要やな。"
|
||||||
|
restartServerSetupWizardConfirm_title: "サーバーの初期設定ウィザードをやり直すん?"
|
||||||
|
restartServerSetupWizardConfirm_text: "現在の一部の設定はリセットされるで。"
|
||||||
_accountMigration:
|
_accountMigration:
|
||||||
moveFrom: "別のアカウントからこのアカウントに引っ越す"
|
moveFrom: "別のアカウントからこのアカウントに引っ越す"
|
||||||
moveFromSub: "別のアカウントへエイリアスを作る"
|
moveFromSub: "別のアカウントへエイリアスを作る"
|
||||||
|
@ -1769,6 +1868,7 @@ _role:
|
||||||
descriptionOfIsExplorable: "オンにしたらロールの面子一覧が「みつける」で公開されるし、ロールのタイムラインが使えるようになるで。"
|
descriptionOfIsExplorable: "オンにしたらロールの面子一覧が「みつける」で公開されるし、ロールのタイムラインが使えるようになるで。"
|
||||||
displayOrder: "表示順"
|
displayOrder: "表示順"
|
||||||
descriptionOfDisplayOrder: "数がでかいほど、UI上で先に表示されるで。"
|
descriptionOfDisplayOrder: "数がでかいほど、UI上で先に表示されるで。"
|
||||||
|
preserveAssignmentOnMoveAccount_description: "つけると、このロールがのっかったアカウントが引っ越したときに、引っ越し先アカウントにもこのロールがのっかるようになるで。"
|
||||||
canEditMembersByModerator: "モデレーターがメンバーいじるのを許す"
|
canEditMembersByModerator: "モデレーターがメンバーいじるのを許す"
|
||||||
descriptionOfCanEditMembersByModerator: "オンにすると、管理者だけやなくてモデレーターもこのロールにユーザーを入れたり抜いたりできるで。オフにすると管理者だけしかやれへんくなるで。"
|
descriptionOfCanEditMembersByModerator: "オンにすると、管理者だけやなくてモデレーターもこのロールにユーザーを入れたり抜いたりできるで。オフにすると管理者だけしかやれへんくなるで。"
|
||||||
priority: "優先度"
|
priority: "優先度"
|
||||||
|
@ -1809,6 +1909,8 @@ _role:
|
||||||
canImportFollowing: "フォローのインポートを許す"
|
canImportFollowing: "フォローのインポートを許す"
|
||||||
canImportMuting: "ミュートのインポートを許す"
|
canImportMuting: "ミュートのインポートを許す"
|
||||||
canImportUserLists: "リストのインポートを許す"
|
canImportUserLists: "リストのインポートを許す"
|
||||||
|
uploadableFileTypes_caption: "MIMEタイプを指定してや。改行で区切って複数指定もできるし、アスタリスク(*)でワイルドカード指定もできるで。(例: image/*)"
|
||||||
|
uploadableFileTypes_caption2: "ファイルによっては種別がわからんこともあるで。そないなファイルを許可するんやったら {x} を指定に追加してな。"
|
||||||
_condition:
|
_condition:
|
||||||
roleAssignedTo: "マニュアルロールにアサイン済み"
|
roleAssignedTo: "マニュアルロールにアサイン済み"
|
||||||
isLocal: "ローカルユーザー"
|
isLocal: "ローカルユーザー"
|
||||||
|
@ -2008,7 +2110,7 @@ _theme:
|
||||||
navIndicator: "サイドバーのインジケーター"
|
navIndicator: "サイドバーのインジケーター"
|
||||||
link: "リンク"
|
link: "リンク"
|
||||||
hashtag: "ハッシュタグ"
|
hashtag: "ハッシュタグ"
|
||||||
mention: "メンション"
|
mention: "あんた宛て"
|
||||||
mentionMe: "うち宛てのメンション"
|
mentionMe: "うち宛てのメンション"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
modalBg: "モーダルの背景"
|
modalBg: "モーダルの背景"
|
||||||
|
@ -2277,6 +2379,8 @@ _visibility:
|
||||||
disableFederation: "連合なし"
|
disableFederation: "連合なし"
|
||||||
disableFederationDescription: "他サーバーへは送らんとくわ"
|
disableFederationDescription: "他サーバーへは送らんとくわ"
|
||||||
_postForm:
|
_postForm:
|
||||||
|
quitInspiteOfThereAreUnuploadedFilesConfirm: "アップロードされてへんファイルがあるんやけど、ほかしてフォームを閉じてもええんか?"
|
||||||
|
uploaderTip: "ファイルはまだアップロードされてへんで。ファイルのメニューから、リネームとか画像のクロップ、ウォーターマークをのっける、圧縮するかどうかなんかを設定できるで。ファイルはノートを投稿するときに自動でアップロードされるで。"
|
||||||
replyPlaceholder: "このノートに返信..."
|
replyPlaceholder: "このノートに返信..."
|
||||||
quotePlaceholder: "このノートを引用..."
|
quotePlaceholder: "このノートを引用..."
|
||||||
channelPlaceholder: "チャンネルに投稿..."
|
channelPlaceholder: "チャンネルに投稿..."
|
||||||
|
@ -2428,6 +2532,7 @@ _notification:
|
||||||
newNote: "さらの投稿"
|
newNote: "さらの投稿"
|
||||||
unreadAntennaNote: "アンテナ {name}"
|
unreadAntennaNote: "アンテナ {name}"
|
||||||
roleAssigned: "ロールが付与されたで"
|
roleAssigned: "ロールが付与されたで"
|
||||||
|
chatRoomInvitationReceived: "チャットルームへ招待されたで"
|
||||||
emptyPushNotificationMessage: "プッシュ通知の更新をしといたで"
|
emptyPushNotificationMessage: "プッシュ通知の更新をしといたで"
|
||||||
achievementEarned: "実績を獲得しとるで"
|
achievementEarned: "実績を獲得しとるで"
|
||||||
testNotification: "通知テスト"
|
testNotification: "通知テスト"
|
||||||
|
@ -2447,7 +2552,7 @@ _notification:
|
||||||
all: "すべて"
|
all: "すべて"
|
||||||
note: "あんたらの新規投稿"
|
note: "あんたらの新規投稿"
|
||||||
follow: "フォロー"
|
follow: "フォロー"
|
||||||
mention: "メンション"
|
mention: "あんた宛て"
|
||||||
reply: "リプライ"
|
reply: "リプライ"
|
||||||
renote: "リノート"
|
renote: "リノート"
|
||||||
quote: "引用"
|
quote: "引用"
|
||||||
|
@ -2617,7 +2722,7 @@ _externalResourceInstaller:
|
||||||
_errors:
|
_errors:
|
||||||
_invalidParams:
|
_invalidParams:
|
||||||
title: ""
|
title: ""
|
||||||
description: ""
|
description: "外部サイトからデータを持ってくるのに欲しい情報が足らへんみたいやわ。URLは合っとる?"
|
||||||
_resourceTypeNotSupported:
|
_resourceTypeNotSupported:
|
||||||
title: ""
|
title: ""
|
||||||
description: ""
|
description: ""
|
||||||
|
@ -2647,8 +2752,12 @@ _dataSaver:
|
||||||
_avatar:
|
_avatar:
|
||||||
title: "アイコンの絵"
|
title: "アイコンの絵"
|
||||||
description: "アイコン画像のアニメが止まるで。普通の画像よりもデータ量がでかいから、もっと通信量を節約できるねん。"
|
description: "アイコン画像のアニメが止まるで。普通の画像よりもデータ量がでかいから、もっと通信量を節約できるねん。"
|
||||||
|
_urlPreviewThumbnail:
|
||||||
|
description: "URLプレビューのサムネイル画像が読み込まれへんくなるで。"
|
||||||
|
_disableUrlPreview:
|
||||||
|
description: "URLプレビュー機能を切るで。サムネイル画像だけと違って、リンク先の情報の読み込み自体を削減できるで。"
|
||||||
_code:
|
_code:
|
||||||
title: "コードハイライト"
|
title: "コードハイライトは表示せんでええ"
|
||||||
description: "MFMとかでコードハイライト記法が使われてるとき、タップするまで読み込まれへんくなるで。コードハイライトではハイライトする言語ごとにその決めてるファイルを読む必要はあんねんな。けどな、それは自動で読み込まれなくなるから、通信量を少なくできることができるねん。"
|
description: "MFMとかでコードハイライト記法が使われてるとき、タップするまで読み込まれへんくなるで。コードハイライトではハイライトする言語ごとにその決めてるファイルを読む必要はあんねんな。けどな、それは自動で読み込まれなくなるから、通信量を少なくできることができるねん。"
|
||||||
_hemisphere:
|
_hemisphere:
|
||||||
N: "北半球"
|
N: "北半球"
|
||||||
|
@ -2704,6 +2813,7 @@ _offlineScreen:
|
||||||
_urlPreviewSetting:
|
_urlPreviewSetting:
|
||||||
title: "URLプレビューの設定"
|
title: "URLプレビューの設定"
|
||||||
enable: "URLプレビューを有効にする"
|
enable: "URLプレビューを有効にする"
|
||||||
|
allowRedirectDescription: "入力されたURLがリダイレクトされるとき、そのリダイレクト先をたどってプレビューを表示するかどうかを設定できるで。無効にするとサーバーリソースを節約できるんやけど、リダイレクト先の内容は表示されへんくなるで。"
|
||||||
timeout: "プレビュー取得時のタイムアウト(ms)"
|
timeout: "プレビュー取得時のタイムアウト(ms)"
|
||||||
timeoutDescription: "プレビュー取得の所要時間がこの値を超えた場合、プレビューは生成されへんで。"
|
timeoutDescription: "プレビュー取得の所要時間がこの値を超えた場合、プレビューは生成されへんで。"
|
||||||
maximumContentLength: "Content-Lengthの最大値(byte)"
|
maximumContentLength: "Content-Lengthの最大値(byte)"
|
||||||
|
@ -2848,8 +2958,57 @@ _search:
|
||||||
searchScopeAll: "みんな"
|
searchScopeAll: "みんな"
|
||||||
searchScopeLocal: "ローカル"
|
searchScopeLocal: "ローカル"
|
||||||
searchScopeUser: "ユーザー指定"
|
searchScopeUser: "ユーザー指定"
|
||||||
|
pleaseEnterServerHost: "サーバーのホストはどないするん?"
|
||||||
|
pleaseSelectUser: "ユーザーを選んでや"
|
||||||
|
_serverSetupWizard:
|
||||||
|
installCompleted: "Misskeyのインストールが終わったで!"
|
||||||
|
firstCreateAccount: "最初は、管理者アカウントを作成しよか。"
|
||||||
|
accountCreated: "管理者アカウントができたで!"
|
||||||
|
youCanEasilyConfigureOptimalServerSettingsWithThisWizard: "このウィザードで簡単にええ感じのサーバーの設定ができるで。"
|
||||||
|
settingsYouMakeHereCanBeChangedLater: "ここでの設定は、あとからでも変えられるで。"
|
||||||
|
howWillYouUseMisskey: "Misskeyをどんな感じに使うん?"
|
||||||
|
_use:
|
||||||
|
single_youCanCreateMultipleAccounts: "お一人様サーバーとして運用するとしても、アカウントは必要に応じて複数作れるで。"
|
||||||
|
openServerAdvice: "不特定多数の利用者を受け入れるには相応のリスクがあるで。トラブルに対処できるよう、ちゃんとしたモデレーション体制で運営しいや。"
|
||||||
|
openServerAntiSpamAdvice: "うちのサーバーがスパムの踏み台にならへんように、reCAPTCHAとかのアンチボット機能を使う、みたいなセキュリティ対策もしっかり考えてな。"
|
||||||
|
howManyUsersDoYouExpect: "どれくらいの人数を考えとるん?"
|
||||||
|
largeScaleServerAdvice: "大規模なサーバーやったら、ロードバランシングとかデータベースのレプリケーションみたいな、高度なインフラストラクチャーの知識が必要になるかもしれへんわ。"
|
||||||
|
doYouConnectToFediverse: "Fediverseと接続するんやっけ?"
|
||||||
|
doYouConnectToFediverse_description1: "分散型サーバーでできたネットワーク(Fediverse)に繋げると、他のサーバーと相互にコンテンツのやり取りができるようになるで。"
|
||||||
|
doYouConnectToFediverse_description2: "Fediverseと接続することは「連合」とも呼ばれるな。"
|
||||||
|
youCanConfigureMoreFederationSettingsLater: "連合してもええサーバーの指定とか、高度な設定も後でできるで。"
|
||||||
|
remoteContentsCleaning_description: "連合すると、ぎょうさんコンテンツを受け取り続けることになるねん。自動クリーニングをつけると、参照されてない古いコンテンツを自動でサーバーからほかして、ストレージを節約できるで。"
|
||||||
|
adminInfo_description: "問い合わせを受け付けるのに使う管理者情報を設定しよか。"
|
||||||
|
adminInfo_mustBeFilled: "オープンサーバー、もしくは連合を入れとるんやったら必ず入力せなあかんで。"
|
||||||
|
followingSettingsAreRecommended: "こういう設定がええかもな"
|
||||||
|
settingsCompleted: "設定が終わったで!"
|
||||||
|
settingsCompleted_description: "お疲れさん。準備ができたから、さっそくサーバーを使い始められるで。"
|
||||||
|
settingsCompleted_description2: "細かいサーバー設定は、「コントロールパネル」を見てみてな。"
|
||||||
|
_donationRequest:
|
||||||
|
text1: "Misskeyは有志で開発されとる無料のソフトウェアやで。"
|
||||||
|
text2: "今後も開発を続けられるように、よかったらぜひカンパをお願いするわ。"
|
||||||
|
text3: "支援者向け特典もあるで!"
|
||||||
|
_uploader:
|
||||||
|
abortConfirm: "アップロードされてへんファイルがあるんやけど、やめてもええんか?"
|
||||||
|
doneConfirm: "アップロードされてへんファイルがあるんやけど、完了してもええんか?"
|
||||||
|
maxFileSizeIsX: "アップロードできるファイルサイズは{x}までやで。"
|
||||||
|
tip: "ファイルはまだアップロードされてへんで。このダイアログで、アップロードする前に確認・リネーム・圧縮・クロッピングとかをできるで。準備が出来たら、「アップロード」ボタンを押してアップロードしてな。"
|
||||||
|
_clientPerformanceIssueTip:
|
||||||
|
makeSureDisabledAdBlocker: "アドブロッカーを切ってみてや"
|
||||||
|
makeSureDisabledAdBlocker_description: "アドブロッカーはパフォーマンスに影響があるかもしれへん。OSの機能とかブラウザの機能・アドオンとかでアドブロッカーが有効になってないか確認してや。"
|
||||||
|
makeSureDisabledCustomCss: "カスタムCSSを無効にしてみてや"
|
||||||
|
makeSureDisabledCustomCss_description: "スタイルを上書きするとパフォーマンスに影響があるかもしれへん。カスタムCSSとか、スタイルを上書きする拡張機能が有効になってないか確認してや。"
|
||||||
|
makeSureDisabledAddons: "拡張機能を無効にしてみてや"
|
||||||
|
makeSureDisabledAddons_description: "なんかの拡張機能がクライアントの動作にちょっかいをかけてパフォーマンスに影響を与えてるかもしれへん。ブラウザの拡張機能を無効にして良くなるか確認してや。"
|
||||||
|
_clip:
|
||||||
|
tip: "クリップは、ノートをまとめられる機能やで。"
|
||||||
|
_userLists:
|
||||||
|
tip: "好きなユーザーを含むリストを作れるねん。作ったリストはタイムラインとして表示できるで。"
|
||||||
_watermarkEditor:
|
_watermarkEditor:
|
||||||
|
tip: "画像にクレジット情報とかのウォーターマークをのっけられるで。"
|
||||||
|
quitWithoutSaveConfirm: "保存せずに終わってもええんか?"
|
||||||
driveFileTypeWarn: "このファイルは対応しとらへん"
|
driveFileTypeWarn: "このファイルは対応しとらへん"
|
||||||
|
driveFileTypeWarnDescription: "画像ファイルを選んでや"
|
||||||
opacity: "不透明度"
|
opacity: "不透明度"
|
||||||
scale: "大きさ"
|
scale: "大きさ"
|
||||||
text: "テキスト"
|
text: "テキスト"
|
||||||
|
@ -2858,3 +3017,18 @@ _watermarkEditor:
|
||||||
image: "画像"
|
image: "画像"
|
||||||
advanced: "高度"
|
advanced: "高度"
|
||||||
angle: "角度"
|
angle: "角度"
|
||||||
|
_imageEffector:
|
||||||
|
discardChangesConfirm: "変更をせんで終わるか?"
|
||||||
|
_fxProps:
|
||||||
|
angle: "角度"
|
||||||
|
scale: "大きさ"
|
||||||
|
size: "大きさ"
|
||||||
|
color: "色"
|
||||||
|
opacity: "不透明度"
|
||||||
|
lightness: "明るさ"
|
||||||
|
_drafts:
|
||||||
|
cannotCreateDraftAnymore: "下書きはこれ以上は作れへんな。"
|
||||||
|
cannotCreateDraft: "この内容で下書きは作れへんな。"
|
||||||
|
delete: "下書きをほかす"
|
||||||
|
deleteAreYouSure: "下書きをほかしてもええか?"
|
||||||
|
noDrafts: "下書きはあらへん"
|
||||||
|
|
|
@ -44,6 +44,7 @@ showMore: "ಇನ್ನಷ್ಟು ನೋಡು"
|
||||||
youGotNewFollower: "ಹಿಂಬಾಲಿಸಿದರು"
|
youGotNewFollower: "ಹಿಂಬಾಲಿಸಿದರು"
|
||||||
receiveFollowRequest: "ಹಿಂಬಾಲನೆ ವಿನಂತಿ ಬಂದಿದೆ"
|
receiveFollowRequest: "ಹಿಂಬಾಲನೆ ವಿನಂತಿ ಬಂದಿದೆ"
|
||||||
followRequestAccepted: "ಹಿಂಬಾಲನೆ ವಿನಂತಿ ಸ್ವೀಕರಿಸಲಾಯಿತು"
|
followRequestAccepted: "ಹಿಂಬಾಲನೆ ವಿನಂತಿ ಸ್ವೀಕರಿಸಲಾಯಿತು"
|
||||||
|
mention: "ಹೆಸರಿಸಿದ"
|
||||||
mentions: "ಹೆಸರಿಸಿದ"
|
mentions: "ಹೆಸರಿಸಿದ"
|
||||||
directNotes: "ನೇರ ಟಿಪ್ಪಣಿಗಳು"
|
directNotes: "ನೇರ ಟಿಪ್ಪಣಿಗಳು"
|
||||||
importAndExport: "ಆಮದು/ರಫ್ತು"
|
importAndExport: "ಆಮದು/ರಫ್ತು"
|
||||||
|
@ -65,6 +66,9 @@ replies: "ಉತ್ತರಿಸು"
|
||||||
_email:
|
_email:
|
||||||
_follow:
|
_follow:
|
||||||
title: "ಹಿಂಬಾಲಿಸಿದರು"
|
title: "ಹಿಂಬಾಲಿಸಿದರು"
|
||||||
|
_theme:
|
||||||
|
keys:
|
||||||
|
mention: "ಹೆಸರಿಸಿದ"
|
||||||
_sfx:
|
_sfx:
|
||||||
notification: "ಅಧಿಸೂಚನೆಗಳು"
|
notification: "ಅಧಿಸೂಚನೆಗಳು"
|
||||||
_widgets:
|
_widgets:
|
||||||
|
@ -73,11 +77,14 @@ _widgets:
|
||||||
timeline: "ಸಮಯಸಾಲು"
|
timeline: "ಸಮಯಸಾಲು"
|
||||||
_cw:
|
_cw:
|
||||||
show: "ಇನ್ನಷ್ಟು ನೋಡು"
|
show: "ಇನ್ನಷ್ಟು ನೋಡು"
|
||||||
|
_visibility:
|
||||||
|
specified: "ನೇರ ಟಿಪ್ಪಣಿಗಳು"
|
||||||
_profile:
|
_profile:
|
||||||
username: "ಬಳಕೆಹೆಸರು"
|
username: "ಬಳಕೆಹೆಸರು"
|
||||||
_notification:
|
_notification:
|
||||||
youWereFollowed: "ಹಿಂಬಾಲಿಸಿದರು"
|
youWereFollowed: "ಹಿಂಬಾಲಿಸಿದರು"
|
||||||
_types:
|
_types:
|
||||||
|
mention: "ಹೆಸರಿಸಿದ"
|
||||||
login: "ಪ್ರವೇಶ"
|
login: "ಪ್ರವೇಶ"
|
||||||
_actions:
|
_actions:
|
||||||
reply: "ಉತ್ತರಿಸು"
|
reply: "ಉತ್ತರಿಸು"
|
||||||
|
@ -86,3 +93,4 @@ _deck:
|
||||||
notifications: "ಅಧಿಸೂಚನೆಗಳು"
|
notifications: "ಅಧಿಸೂಚನೆಗಳು"
|
||||||
tl: "ಸಮಯಸಾಲು"
|
tl: "ಸಮಯಸಾಲು"
|
||||||
mentions: "ಹೆಸರಿಸಿದ"
|
mentions: "ಹೆಸರಿಸಿದ"
|
||||||
|
direct: "ನೇರ ಟಿಪ್ಪಣಿಗಳು"
|
||||||
|
|
|
@ -745,7 +745,7 @@ _menuDisplay:
|
||||||
_theme:
|
_theme:
|
||||||
description: "설멩"
|
description: "설멩"
|
||||||
keys:
|
keys:
|
||||||
mention: "멘션"
|
mention: "받언 멘션"
|
||||||
renote: "리노트"
|
renote: "리노트"
|
||||||
_sfx:
|
_sfx:
|
||||||
note: "새 노트"
|
note: "새 노트"
|
||||||
|
@ -775,6 +775,7 @@ _cw:
|
||||||
_visibility:
|
_visibility:
|
||||||
home: "덜머리"
|
home: "덜머리"
|
||||||
followers: "팔로워"
|
followers: "팔로워"
|
||||||
|
specified: "쪽지 서기"
|
||||||
_postForm:
|
_postForm:
|
||||||
_placeholders:
|
_placeholders:
|
||||||
e: "옇다 서 주이소"
|
e: "옇다 서 주이소"
|
||||||
|
@ -809,7 +810,7 @@ _notification:
|
||||||
newNote: "새 걸"
|
newNote: "새 걸"
|
||||||
_types:
|
_types:
|
||||||
follow: "팔로잉"
|
follow: "팔로잉"
|
||||||
mention: "멘션"
|
mention: "받언 멘션"
|
||||||
renote: "리노트"
|
renote: "리노트"
|
||||||
quote: "따오기"
|
quote: "따오기"
|
||||||
reaction: "반엉"
|
reaction: "반엉"
|
||||||
|
@ -824,6 +825,7 @@ _deck:
|
||||||
antenna: "안테나"
|
antenna: "안테나"
|
||||||
list: "리스트"
|
list: "리스트"
|
||||||
mentions: "받언 멘션"
|
mentions: "받언 멘션"
|
||||||
|
direct: "쪽지 서기"
|
||||||
_webhookSettings:
|
_webhookSettings:
|
||||||
name: "이럼"
|
name: "이럼"
|
||||||
_abuseReport:
|
_abuseReport:
|
||||||
|
|
|
@ -1054,6 +1054,7 @@ permissionDeniedError: "작업이 거부되었습니다"
|
||||||
permissionDeniedErrorDescription: "이 작업을 수행할 권한이 없습니다."
|
permissionDeniedErrorDescription: "이 작업을 수행할 권한이 없습니다."
|
||||||
preset: "프리셋"
|
preset: "프리셋"
|
||||||
selectFromPresets: "프리셋에서 선택"
|
selectFromPresets: "프리셋에서 선택"
|
||||||
|
custom: "커스텀"
|
||||||
achievements: "도전 과제"
|
achievements: "도전 과제"
|
||||||
gotInvalidResponseError: "서버의 응답이 올바르지 않습니다"
|
gotInvalidResponseError: "서버의 응답이 올바르지 않습니다"
|
||||||
gotInvalidResponseErrorDescription: " 서버가 다운되었거나 점검중일 가능성이 있습니다. 잠시후에 다시 시도해 주십시오."
|
gotInvalidResponseErrorDescription: " 서버가 다운되었거나 점검중일 가능성이 있습니다. 잠시후에 다시 시도해 주십시오."
|
||||||
|
@ -1092,6 +1093,7 @@ prohibitedWordsDescription2: "공백으로 구분하면 AND 지정이 되며,
|
||||||
hiddenTags: "숨긴 해시태그"
|
hiddenTags: "숨긴 해시태그"
|
||||||
hiddenTagsDescription: "설정한 태그를 트렌드에 표시하지 않도록 합니다. 줄 바꿈으로 하나씩 나눠서 설정할 수 있습니다."
|
hiddenTagsDescription: "설정한 태그를 트렌드에 표시하지 않도록 합니다. 줄 바꿈으로 하나씩 나눠서 설정할 수 있습니다."
|
||||||
notesSearchNotAvailable: "노트 검색을 이용하실 수 없습니다."
|
notesSearchNotAvailable: "노트 검색을 이용하실 수 없습니다."
|
||||||
|
usersSearchNotAvailable: "유저 검색을 이용하실 수 없습니다."
|
||||||
license: "라이선스"
|
license: "라이선스"
|
||||||
unfavoriteConfirm: "즐겨찾기를 해제하시겠습니까?"
|
unfavoriteConfirm: "즐겨찾기를 해제하시겠습니까?"
|
||||||
myClips: "내 클립"
|
myClips: "내 클립"
|
||||||
|
@ -1243,7 +1245,7 @@ releaseToRefresh: "놓아서 새로고침"
|
||||||
refreshing: "새로고침 중"
|
refreshing: "새로고침 중"
|
||||||
pullDownToRefresh: "아래로 내려서 새로고침"
|
pullDownToRefresh: "아래로 내려서 새로고침"
|
||||||
useGroupedNotifications: "알림을 그룹화하고 표시"
|
useGroupedNotifications: "알림을 그룹화하고 표시"
|
||||||
signupPendingError: "메일 주소 확인중에 문제가 발생했습니다. 링크의 유효기간이 지났을 가능성이 있습니다."
|
emailVerificationFailedError: "메일 주소 확인에 실패했습니다. 확인에 필요한 URL의 유효기간이 지났을 가능성이 있습니다."
|
||||||
cwNotationRequired: "'내용을 숨기기'를 체크한 경우 주석을 써야 합니다."
|
cwNotationRequired: "'내용을 숨기기'를 체크한 경우 주석을 써야 합니다."
|
||||||
doReaction: "리액션 추가"
|
doReaction: "리액션 추가"
|
||||||
code: "문자열"
|
code: "문자열"
|
||||||
|
@ -1368,6 +1370,13 @@ redisplayAllTips: "모든 '팁과 유용한 정보'를 재표시"
|
||||||
hideAllTips: "모든 '팁과 유용한 정보'를 비표시"
|
hideAllTips: "모든 '팁과 유용한 정보'를 비표시"
|
||||||
defaultImageCompressionLevel: "기본 이미지 압축 정도"
|
defaultImageCompressionLevel: "기본 이미지 압축 정도"
|
||||||
defaultImageCompressionLevel_description: "낮추면 화질을 유지합니다만 파일 크기는 증가합니다. <br>높이면 파일 크기를 줄일 수 있습니다만 화질은 저하됩니다."
|
defaultImageCompressionLevel_description: "낮추면 화질을 유지합니다만 파일 크기는 증가합니다. <br>높이면 파일 크기를 줄일 수 있습니다만 화질은 저하됩니다."
|
||||||
|
inMinutes: "분"
|
||||||
|
inDays: "일"
|
||||||
|
safeModeEnabled: "세이프 모드가 활성화돼있습니다"
|
||||||
|
pluginsAreDisabledBecauseSafeMode: "세이프 모드가 활성화돼있기에 플러그인은 전부 비활성화됩니다."
|
||||||
|
customCssIsDisabledBecauseSafeMode: "세이프 모드가 활성화돼있기에 커스텀 CSS는 적용되지 않습니다."
|
||||||
|
themeIsDefaultBecauseSafeMode: "세이프 모드가 활성화돼있는 동안에는 기본 테마가 사용됩니다. 세이프 모드를 끄면 원래대로 돌아옵니다."
|
||||||
|
thankYouForTestingBeta: "베타 버전의 검증에 협력해 주셔서 감사합니다!"
|
||||||
_order:
|
_order:
|
||||||
newest: "최신 순"
|
newest: "최신 순"
|
||||||
oldest: "오래된 순"
|
oldest: "오래된 순"
|
||||||
|
@ -1459,6 +1468,7 @@ _settings:
|
||||||
contentsUpdateFrequency_description2: "실시간 모드가 켜져 있을 때는 이 설정과 상관없이 실시간으로 콘텐츠가 업데이트됩니다."
|
contentsUpdateFrequency_description2: "실시간 모드가 켜져 있을 때는 이 설정과 상관없이 실시간으로 콘텐츠가 업데이트됩니다."
|
||||||
showUrlPreview: "URL 미리보기 표시"
|
showUrlPreview: "URL 미리보기 표시"
|
||||||
showAvailableReactionsFirstInNote: "이용 가능한 리액션을 선두로 표시"
|
showAvailableReactionsFirstInNote: "이용 가능한 리액션을 선두로 표시"
|
||||||
|
showPageTabBarBottom: "페이지의 탭 바를 아래쪽에 표시"
|
||||||
_chat:
|
_chat:
|
||||||
showSenderName: "발신자 이름 표시"
|
showSenderName: "발신자 이름 표시"
|
||||||
sendOnEnter: "엔터로 보내기"
|
sendOnEnter: "엔터로 보내기"
|
||||||
|
@ -1632,6 +1642,10 @@ _serverSettings:
|
||||||
fanoutTimelineDbFallback: "데이터베이스를 예비로 사용하기"
|
fanoutTimelineDbFallback: "데이터베이스를 예비로 사용하기"
|
||||||
fanoutTimelineDbFallbackDescription: "활성화하면 타임라인의 캐시되어 있지 않은 부분에 대해 DB에 질의하여 정보를 가져옵니다. 비활성화하면 이를 실행하지 않음으로써 서버의 부하를 줄일 수 있지만, 타임라인에서 가져올 수 있는 게시물 범위가 한정됩니다."
|
fanoutTimelineDbFallbackDescription: "활성화하면 타임라인의 캐시되어 있지 않은 부분에 대해 DB에 질의하여 정보를 가져옵니다. 비활성화하면 이를 실행하지 않음으로써 서버의 부하를 줄일 수 있지만, 타임라인에서 가져올 수 있는 게시물 범위가 한정됩니다."
|
||||||
reactionsBufferingDescription: "활성화 한 경우, 리액션 작성 퍼포먼스가 대폭 향상되어 DB의 부하를 줄일 수 있으나, Redis의 메모리 사용량이 많아집니다."
|
reactionsBufferingDescription: "활성화 한 경우, 리액션 작성 퍼포먼스가 대폭 향상되어 DB의 부하를 줄일 수 있으나, Redis의 메모리 사용량이 많아집니다."
|
||||||
|
remoteNotesCleaning: "리모트 서버 노트 자동 정리 "
|
||||||
|
remoteNotesCleaning_description: "더 이상 사용되지 않는 오래된 리모트 노트를 정기적으로 정리하여, 데이터 베이스의 사용량을 절약할 수 있습니다."
|
||||||
|
remoteNotesCleaningMaxProcessingDuration: "리모트 노트 자동 정리 최대 실행 시간"
|
||||||
|
remoteNotesCleaningExpiryDaysForEachNotes: "리모트 노트 저장 최소 일수"
|
||||||
inquiryUrl: "문의처 URL"
|
inquiryUrl: "문의처 URL"
|
||||||
inquiryUrlDescription: "서버 운영자에게 보내는 문의 양식의 URL이나 운영자의 연락처 등이 적힌 웹 페이지의 URL을 설정합니다."
|
inquiryUrlDescription: "서버 운영자에게 보내는 문의 양식의 URL이나 운영자의 연락처 등이 적힌 웹 페이지의 URL을 설정합니다."
|
||||||
openRegistration: "회원 가입을 활성화 하기"
|
openRegistration: "회원 가입을 활성화 하기"
|
||||||
|
@ -1650,6 +1664,11 @@ _serverSettings:
|
||||||
userGeneratedContentsVisibilityForVisitor: "비이용자에 대한 유저 작성 콘텐츠의 공개 범위"
|
userGeneratedContentsVisibilityForVisitor: "비이용자에 대한 유저 작성 콘텐츠의 공개 범위"
|
||||||
userGeneratedContentsVisibilityForVisitor_description: "조정을 하기 힘든 부적절한 리모트 콘텐츠 등이 자신의 서버 경유로 의도치 않게 인터넷에 공개되는 문제의 방지 등에 도움을 줍니다."
|
userGeneratedContentsVisibilityForVisitor_description: "조정을 하기 힘든 부적절한 리모트 콘텐츠 등이 자신의 서버 경유로 의도치 않게 인터넷에 공개되는 문제의 방지 등에 도움을 줍니다."
|
||||||
userGeneratedContentsVisibilityForVisitor_description2: "서버에서 받은 리모트 콘텐츠를 포함해 서버 내의 모든 콘텐츠를 무조건 인터넷에 공개하는 것에는 위험이 따릅니다. 특히, 분산형 특성에 대해 모르는 열람자에게는 리모트 콘텐츠여도 서버 내에서 작성된 콘텐츠라고 잘못 인식할 수 있기에 주의가 필요합니다."
|
userGeneratedContentsVisibilityForVisitor_description2: "서버에서 받은 리모트 콘텐츠를 포함해 서버 내의 모든 콘텐츠를 무조건 인터넷에 공개하는 것에는 위험이 따릅니다. 특히, 분산형 특성에 대해 모르는 열람자에게는 리모트 콘텐츠여도 서버 내에서 작성된 콘텐츠라고 잘못 인식할 수 있기에 주의가 필요합니다."
|
||||||
|
restartServerSetupWizardConfirm_title: "서버의 초기 설정 위자드를 재시도하시겠습니까?"
|
||||||
|
restartServerSetupWizardConfirm_text: "현재 일부 설정은 리셋됩니다."
|
||||||
|
entrancePageStyle: "입구 페이지의 스타일"
|
||||||
|
showTimelineForVisitor: "타임라인 표시"
|
||||||
|
showActivitiesForVisitor: "액티비티 표시하기"
|
||||||
_userGeneratedContentsVisibilityForVisitor:
|
_userGeneratedContentsVisibilityForVisitor:
|
||||||
all: "모두 공개"
|
all: "모두 공개"
|
||||||
localOnly: "로컬 콘텐츠만 공개하고 리모트 콘텐츠는 비공개"
|
localOnly: "로컬 콘텐츠만 공개하고 리모트 콘텐츠는 비공개"
|
||||||
|
@ -1986,6 +2005,7 @@ _role:
|
||||||
descriptionOfRateLimitFactor: "작을수록 제한이 완화되고, 클수록 제한이 강화됩니다."
|
descriptionOfRateLimitFactor: "작을수록 제한이 완화되고, 클수록 제한이 강화됩니다."
|
||||||
canHideAds: "광고 숨기기"
|
canHideAds: "광고 숨기기"
|
||||||
canSearchNotes: "노트 검색 이용 가능 여부"
|
canSearchNotes: "노트 검색 이용 가능 여부"
|
||||||
|
canSearchUsers: "유저 검색 이용"
|
||||||
canUseTranslator: "번역 기능의 사용"
|
canUseTranslator: "번역 기능의 사용"
|
||||||
avatarDecorationLimit: "아바타 장식의 최대 붙임 개수"
|
avatarDecorationLimit: "아바타 장식의 최대 붙임 개수"
|
||||||
canImportAntennas: "안테나 가져오기 허용"
|
canImportAntennas: "안테나 가져오기 허용"
|
||||||
|
@ -2258,6 +2278,7 @@ _time:
|
||||||
minute: "분"
|
minute: "분"
|
||||||
hour: "시간"
|
hour: "시간"
|
||||||
day: "일"
|
day: "일"
|
||||||
|
month: "개월"
|
||||||
_2fa:
|
_2fa:
|
||||||
alreadyRegistered: "이미 설정이 완료되었습니다."
|
alreadyRegistered: "이미 설정이 완료되었습니다."
|
||||||
registerTOTP: "인증 앱 설정 시작"
|
registerTOTP: "인증 앱 설정 시작"
|
||||||
|
@ -3060,6 +3081,7 @@ _bootErrors:
|
||||||
otherOption1: "클라이언트 설정 및 캐시 삭제"
|
otherOption1: "클라이언트 설정 및 캐시 삭제"
|
||||||
otherOption2: "간편 클라이언트 실행"
|
otherOption2: "간편 클라이언트 실행"
|
||||||
otherOption3: "복구 툴 실행"
|
otherOption3: "복구 툴 실행"
|
||||||
|
otherOption4: "Misskey를 세이프 모드로 열기"
|
||||||
_search:
|
_search:
|
||||||
searchScopeAll: "전체"
|
searchScopeAll: "전체"
|
||||||
searchScopeLocal: "로컬"
|
searchScopeLocal: "로컬"
|
||||||
|
@ -3096,6 +3118,8 @@ _serverSetupWizard:
|
||||||
doYouConnectToFediverse_description1: "분산형 서버로 구성된 네트워크(Fediverse)에 접속하면 다른 서버와 서로 콘텐츠의 주고받기를 할 수 있습니다."
|
doYouConnectToFediverse_description1: "분산형 서버로 구성된 네트워크(Fediverse)에 접속하면 다른 서버와 서로 콘텐츠의 주고받기를 할 수 있습니다."
|
||||||
doYouConnectToFediverse_description2: "Fediverse에 접속하는 것을 '연합'이라고도 부릅니다."
|
doYouConnectToFediverse_description2: "Fediverse에 접속하는 것을 '연합'이라고도 부릅니다."
|
||||||
youCanConfigureMoreFederationSettingsLater: "나중에 연합 가능한 서버의 지정 등 고급 설정을 할 수 있습니다."
|
youCanConfigureMoreFederationSettingsLater: "나중에 연합 가능한 서버의 지정 등 고급 설정을 할 수 있습니다."
|
||||||
|
remoteContentsCleaning: "리모트 콘텐츠 자동 정리"
|
||||||
|
remoteContentsCleaning_description: "연합 중인 서버가 있는 경우, 리모트 서버에서 대단히 많은 콘텐츠를 받아오게 됩니다. 자동 정리 기능을 활성화하면, 오래되고 서버에서 더 이상 조회되지 않는 콘텐츠를 자동으로 서버에서 삭제하여, 스토리지를 절약할 수 있습니다."
|
||||||
adminInfo: "관리자 정보"
|
adminInfo: "관리자 정보"
|
||||||
adminInfo_description: "문의 접수를 위해 사용되는 관리자 정보를 설정합니다."
|
adminInfo_description: "문의 접수를 위해 사용되는 관리자 정보를 설정합니다."
|
||||||
adminInfo_mustBeFilled: "오픈 서버 혹은 연합이 켜져 있는 경우 반드시 입력해야 합니다."
|
adminInfo_mustBeFilled: "오픈 서버 혹은 연합이 켜져 있는 경우 반드시 입력해야 합니다."
|
||||||
|
@ -3148,10 +3172,10 @@ _watermarkEditor:
|
||||||
type: "종류"
|
type: "종류"
|
||||||
image: "이미지"
|
image: "이미지"
|
||||||
advanced: "고급"
|
advanced: "고급"
|
||||||
|
angle: "각도"
|
||||||
stripe: "줄무늬"
|
stripe: "줄무늬"
|
||||||
stripeWidth: "라인의 폭"
|
stripeWidth: "라인의 폭"
|
||||||
stripeFrequency: "라인의 수"
|
stripeFrequency: "라인의 수"
|
||||||
angle: "각도"
|
|
||||||
polkadot: "물방울 무늬"
|
polkadot: "물방울 무늬"
|
||||||
checker: "체크 무늬"
|
checker: "체크 무늬"
|
||||||
polkadotMainDotOpacity: "주요 물방울의 불투명도"
|
polkadotMainDotOpacity: "주요 물방울의 불투명도"
|
||||||
|
@ -3163,6 +3187,7 @@ _imageEffector:
|
||||||
title: "이펙트"
|
title: "이펙트"
|
||||||
addEffect: "이펙트를 추가"
|
addEffect: "이펙트를 추가"
|
||||||
discardChangesConfirm: "변경을 취소하고 종료하시겠습니까?"
|
discardChangesConfirm: "변경을 취소하고 종료하시겠습니까?"
|
||||||
|
nothingToConfigure: "설정 항목이 없습니다."
|
||||||
_fxs:
|
_fxs:
|
||||||
chromaticAberration: "색수차"
|
chromaticAberration: "색수차"
|
||||||
glitch: "글리치"
|
glitch: "글리치"
|
||||||
|
@ -3180,6 +3205,38 @@ _imageEffector:
|
||||||
checker: "체크 무늬"
|
checker: "체크 무늬"
|
||||||
blockNoise: "노이즈 방지"
|
blockNoise: "노이즈 방지"
|
||||||
tearing: "티어링"
|
tearing: "티어링"
|
||||||
|
_fxProps:
|
||||||
|
angle: "각도"
|
||||||
|
scale: "크기"
|
||||||
|
size: "크기"
|
||||||
|
color: "색"
|
||||||
|
opacity: "불투명도"
|
||||||
|
normalize: "노멀라이즈"
|
||||||
|
amount: "양"
|
||||||
|
lightness: "밝음"
|
||||||
|
contrast: "대비"
|
||||||
|
hue: "색조"
|
||||||
|
brightness: "밝기"
|
||||||
|
saturation: "채도"
|
||||||
|
max: "최대 값"
|
||||||
|
min: "최소 값"
|
||||||
|
direction: "방향"
|
||||||
|
phase: "위상"
|
||||||
|
frequency: "빈도"
|
||||||
|
strength: "강도"
|
||||||
|
glitchChannelShift: "글리치"
|
||||||
|
seed: "시드 값"
|
||||||
|
redComponent: "빨간색 요소"
|
||||||
|
greenComponent: "녹색 요소"
|
||||||
|
blueComponent: "파란색 요소"
|
||||||
|
threshold: "한계 값"
|
||||||
|
centerX: "X축 중심"
|
||||||
|
centerY: "Y축 중심"
|
||||||
|
zoomLinesSmoothing: "다듬기"
|
||||||
|
zoomLinesSmoothingDescription: "다듬기와 집중선 폭 설정은 같이 쓸 수 없습니다."
|
||||||
|
zoomLinesThreshold: "집중선 폭"
|
||||||
|
zoomLinesMaskSize: "중앙 값"
|
||||||
|
zoomLinesBlack: "검은색으로 하기"
|
||||||
drafts: "초안"
|
drafts: "초안"
|
||||||
_drafts:
|
_drafts:
|
||||||
select: "초안 선택"
|
select: "초안 선택"
|
||||||
|
|
|
@ -433,6 +433,7 @@ _cw:
|
||||||
_visibility:
|
_visibility:
|
||||||
home: "ໜ້າຫຼັກ"
|
home: "ໜ້າຫຼັກ"
|
||||||
followers: "ຜູ້ຕິດຕາມ"
|
followers: "ຜູ້ຕິດຕາມ"
|
||||||
|
specified: "ໂພສ Direct note"
|
||||||
_profile:
|
_profile:
|
||||||
name: "ຊື່"
|
name: "ຊື່"
|
||||||
username: "ຊື່ຜູ້ໃຊ້"
|
username: "ຊື່ຜູ້ໃຊ້"
|
||||||
|
@ -470,6 +471,7 @@ _deck:
|
||||||
list: "ລາຍການ"
|
list: "ລາຍການ"
|
||||||
channel: "ຊ່ອງ"
|
channel: "ຊ່ອງ"
|
||||||
mentions: "ກ່າວເຖິງເຈົ້າ"
|
mentions: "ກ່າວເຖິງເຈົ້າ"
|
||||||
|
direct: "ໂພສ Direct note"
|
||||||
_webhookSettings:
|
_webhookSettings:
|
||||||
name: "ຊື່"
|
name: "ຊື່"
|
||||||
_abuseReport:
|
_abuseReport:
|
||||||
|
|
|
@ -1019,6 +1019,7 @@ _cw:
|
||||||
_visibility:
|
_visibility:
|
||||||
home: "Startpagina"
|
home: "Startpagina"
|
||||||
followers: "Volgers"
|
followers: "Volgers"
|
||||||
|
specified: "Directe notities"
|
||||||
_profile:
|
_profile:
|
||||||
name: "Naam"
|
name: "Naam"
|
||||||
username: "Gebruikersnaam"
|
username: "Gebruikersnaam"
|
||||||
|
@ -1061,6 +1062,7 @@ _deck:
|
||||||
list: "Lijsten"
|
list: "Lijsten"
|
||||||
channel: "Kanalen"
|
channel: "Kanalen"
|
||||||
mentions: "Vermeldingen"
|
mentions: "Vermeldingen"
|
||||||
|
direct: "Directe notities"
|
||||||
_webhookSettings:
|
_webhookSettings:
|
||||||
name: "Naam"
|
name: "Naam"
|
||||||
active: "Ingeschakeld"
|
active: "Ingeschakeld"
|
||||||
|
|
|
@ -461,6 +461,8 @@ replies: "Svar"
|
||||||
renotes: "Renote"
|
renotes: "Renote"
|
||||||
surrender: "Avbryt"
|
surrender: "Avbryt"
|
||||||
information: "Informasjon"
|
information: "Informasjon"
|
||||||
|
inMinutes: "Minutter"
|
||||||
|
inDays: "Dager"
|
||||||
_chat:
|
_chat:
|
||||||
invitations: "Inviter"
|
invitations: "Inviter"
|
||||||
members: "Medlemmer"
|
members: "Medlemmer"
|
||||||
|
@ -740,3 +742,8 @@ _watermarkEditor:
|
||||||
text: "Tekst"
|
text: "Tekst"
|
||||||
type: "Type"
|
type: "Type"
|
||||||
image: "Bilder"
|
image: "Bilder"
|
||||||
|
_imageEffector:
|
||||||
|
_fxProps:
|
||||||
|
scale: "Størrelse"
|
||||||
|
size: "Størrelse"
|
||||||
|
color: "Farge"
|
||||||
|
|
|
@ -1040,6 +1040,8 @@ surrender: "Odrzuć"
|
||||||
gameRetry: "Spróbuj ponownie"
|
gameRetry: "Spróbuj ponownie"
|
||||||
postForm: "Formularz tworzenia wpisu"
|
postForm: "Formularz tworzenia wpisu"
|
||||||
information: "Informacje"
|
information: "Informacje"
|
||||||
|
inMinutes: "minuta"
|
||||||
|
inDays: "dzień"
|
||||||
_chat:
|
_chat:
|
||||||
invitations: "Zaproś"
|
invitations: "Zaproś"
|
||||||
noHistory: "Brak historii"
|
noHistory: "Brak historii"
|
||||||
|
@ -1591,3 +1593,10 @@ _watermarkEditor:
|
||||||
type: "Typ"
|
type: "Typ"
|
||||||
image: "Zdjęcia"
|
image: "Zdjęcia"
|
||||||
advanced: "Zaawansowane"
|
advanced: "Zaawansowane"
|
||||||
|
_imageEffector:
|
||||||
|
_fxProps:
|
||||||
|
scale: "Rozmiar"
|
||||||
|
size: "Rozmiar"
|
||||||
|
color: "Kolor"
|
||||||
|
opacity: "Przezroczystość"
|
||||||
|
lightness: "Rozjaśnij"
|
||||||
|
|
|
@ -1243,7 +1243,6 @@ releaseToRefresh: "Solte para atualizar"
|
||||||
refreshing: "Atualizando..."
|
refreshing: "Atualizando..."
|
||||||
pullDownToRefresh: "Puxe para baixo para atualizar"
|
pullDownToRefresh: "Puxe para baixo para atualizar"
|
||||||
useGroupedNotifications: "Agrupar notificações"
|
useGroupedNotifications: "Agrupar notificações"
|
||||||
signupPendingError: "Houve um problema ao verificar o endereço de email. O link pode ter expirado."
|
|
||||||
cwNotationRequired: "Se \"Esconder conteúdo\" está habilitado, uma descrição deve ser adicionada."
|
cwNotationRequired: "Se \"Esconder conteúdo\" está habilitado, uma descrição deve ser adicionada."
|
||||||
doReaction: "Adicionar reação"
|
doReaction: "Adicionar reação"
|
||||||
code: "Código"
|
code: "Código"
|
||||||
|
@ -1368,6 +1367,8 @@ redisplayAllTips: "Mostrar todas as \"Dicas e Truques\" novamente"
|
||||||
hideAllTips: "Ocultas todas as \"Dicas e Truques\""
|
hideAllTips: "Ocultas todas as \"Dicas e Truques\""
|
||||||
defaultImageCompressionLevel: "Nível de compressão de imagem padrão"
|
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."
|
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."
|
||||||
|
inMinutes: "Minuto(s)"
|
||||||
|
inDays: "Dia(s)"
|
||||||
_order:
|
_order:
|
||||||
newest: "Priorizar Mais Novos"
|
newest: "Priorizar Mais Novos"
|
||||||
oldest: "Priorizar Mais Antigos"
|
oldest: "Priorizar Mais Antigos"
|
||||||
|
@ -3148,10 +3149,10 @@ _watermarkEditor:
|
||||||
type: "Tipo"
|
type: "Tipo"
|
||||||
image: "imagem"
|
image: "imagem"
|
||||||
advanced: "Avançado"
|
advanced: "Avançado"
|
||||||
|
angle: "Ângulo"
|
||||||
stripe: "Listras"
|
stripe: "Listras"
|
||||||
stripeWidth: "Largura da linha"
|
stripeWidth: "Largura da linha"
|
||||||
stripeFrequency: "Número de linhas"
|
stripeFrequency: "Número de linhas"
|
||||||
angle: "Ângulo"
|
|
||||||
polkadot: "Bolinhas"
|
polkadot: "Bolinhas"
|
||||||
checker: "Xadrez"
|
checker: "Xadrez"
|
||||||
polkadotMainDotOpacity: "Opacidade da bolinha principal"
|
polkadotMainDotOpacity: "Opacidade da bolinha principal"
|
||||||
|
@ -3180,6 +3181,13 @@ _imageEffector:
|
||||||
checker: "Xadrez"
|
checker: "Xadrez"
|
||||||
blockNoise: "Bloquear Ruído"
|
blockNoise: "Bloquear Ruído"
|
||||||
tearing: "Descontinuidade"
|
tearing: "Descontinuidade"
|
||||||
|
_fxProps:
|
||||||
|
angle: "Ângulo"
|
||||||
|
scale: "Tamanho"
|
||||||
|
size: "Tamanho"
|
||||||
|
color: "Cor"
|
||||||
|
opacity: "Opacidade"
|
||||||
|
lightness: "Esclarecer"
|
||||||
drafts: "Rascunhos"
|
drafts: "Rascunhos"
|
||||||
_drafts:
|
_drafts:
|
||||||
select: "Selecionar Rascunho"
|
select: "Selecionar Rascunho"
|
||||||
|
|
|
@ -1302,6 +1302,7 @@ _cw:
|
||||||
_visibility:
|
_visibility:
|
||||||
home: "Acasă"
|
home: "Acasă"
|
||||||
followers: "Urmăritori"
|
followers: "Urmăritori"
|
||||||
|
specified: "Note directe"
|
||||||
_postForm:
|
_postForm:
|
||||||
replyPlaceholder: "Răspunde la această notă..."
|
replyPlaceholder: "Răspunde la această notă..."
|
||||||
quotePlaceholder: "Citează aceasta nota..."
|
quotePlaceholder: "Citează aceasta nota..."
|
||||||
|
@ -1356,6 +1357,7 @@ _deck:
|
||||||
list: "Liste"
|
list: "Liste"
|
||||||
channel: "Canale"
|
channel: "Canale"
|
||||||
mentions: "Mențiuni"
|
mentions: "Mențiuni"
|
||||||
|
direct: "Note directe"
|
||||||
roleTimeline: "Cronologia rolului"
|
roleTimeline: "Cronologia rolului"
|
||||||
_webhookSettings:
|
_webhookSettings:
|
||||||
name: "Nume"
|
name: "Nume"
|
||||||
|
@ -1398,3 +1400,7 @@ _watermarkEditor:
|
||||||
type: "Tip"
|
type: "Tip"
|
||||||
image: "Imagini"
|
image: "Imagini"
|
||||||
advanced: "Avansat"
|
advanced: "Avansat"
|
||||||
|
_imageEffector:
|
||||||
|
_fxProps:
|
||||||
|
scale: "Dimensiune"
|
||||||
|
size: "Dimensiune"
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
_lang_: "Русский"
|
_lang_: "Русский"
|
||||||
headlineMisskey: "Сеть, сплетённая из заметок"
|
headlineMisskey: "Сеть, сплетённая из заметок"
|
||||||
introMisskey: "Добро пожаловать! Misskey — это децентрализованный сервис микроблогов с открытым исходным кодом.\nПишите «заметки» — делитесь со всеми происходящим вокруг или рассказывайте о себе 📡\nСтавьте «реакции» — выражайте свои чувства и эмоции от заметок других 👍\nОткройте для себя новый мир 🚀"
|
introMisskey: "Добро пожаловать! Misskey — это децентрализованный сервис микроблогов с открытым исходным кодом.\nПишите «заметки» — делитесь со всеми происходящим вокруг или рассказывайте о себе 📡\nСтавьте «реакции» — выражайте свои чувства и эмоции от заметок других 👍\nОткройте для себя новый мир 🚀"
|
||||||
poweredByMisskeyDescription: "{name} – сервис на платформе с открытым исходным кодом <b>Misskey</b>, называемый экземпляром Misskey."
|
poweredByMisskeyDescription: "{name} – один из инстансов (также называемый экземпляром Misskey), использующий платформу с открытым исходным кодом <b>Misskey</b>."
|
||||||
monthAndDay: "{day}.{month}"
|
monthAndDay: "{day}.{month}"
|
||||||
search: "Поиск"
|
search: "Поиск"
|
||||||
reset: "Сброс"
|
reset: "Сброс"
|
||||||
|
@ -82,7 +82,7 @@ export: "Экспорт"
|
||||||
files: "Файлы"
|
files: "Файлы"
|
||||||
download: "Скачать"
|
download: "Скачать"
|
||||||
driveFileDeleteConfirm: "Удалить файл «{name}»? Заметки с ним также будут удалены."
|
driveFileDeleteConfirm: "Удалить файл «{name}»? Заметки с ним также будут удалены."
|
||||||
unfollowConfirm: "Удалить из подписок пользователя {name}?"
|
unfollowConfirm: "Отписаться от {name} ?"
|
||||||
exportRequested: "Вы запросили экспорт. Это может занять некоторое время. Результат будет добавлен на «Диск»."
|
exportRequested: "Вы запросили экспорт. Это может занять некоторое время. Результат будет добавлен на «Диск»."
|
||||||
importRequested: "Вы запросили импорт. Это может занять некоторое время."
|
importRequested: "Вы запросили импорт. Это может занять некоторое время."
|
||||||
lists: "Списки"
|
lists: "Списки"
|
||||||
|
@ -298,6 +298,7 @@ uploadFromUrl: "Загрузить по ссылке"
|
||||||
uploadFromUrlDescription: "Ссылка на файл, который хотите загрузить"
|
uploadFromUrlDescription: "Ссылка на файл, который хотите загрузить"
|
||||||
uploadFromUrlRequested: "Загрузка выбранного"
|
uploadFromUrlRequested: "Загрузка выбранного"
|
||||||
uploadFromUrlMayTakeTime: "Загрузка может занять некоторое время."
|
uploadFromUrlMayTakeTime: "Загрузка может занять некоторое время."
|
||||||
|
uploadNFiles: "Загрузить {n} файл"
|
||||||
explore: "Обзор"
|
explore: "Обзор"
|
||||||
messageRead: "Прочитали"
|
messageRead: "Прочитали"
|
||||||
noMoreHistory: "История закончилась"
|
noMoreHistory: "История закончилась"
|
||||||
|
@ -575,8 +576,10 @@ showFixedPostForm: "Показывать поле для ввода новой
|
||||||
showFixedPostFormInChannel: "Показывать поле для ввода новой заметки наверху ленты (каналы)"
|
showFixedPostFormInChannel: "Показывать поле для ввода новой заметки наверху ленты (каналы)"
|
||||||
withRepliesByDefaultForNewlyFollowed: "По умолчанию включайте ответы новых пользователей, на которых вы подписались, во временную шкалу"
|
withRepliesByDefaultForNewlyFollowed: "По умолчанию включайте ответы новых пользователей, на которых вы подписались, во временную шкалу"
|
||||||
newNoteRecived: "Появилась новая заметка"
|
newNoteRecived: "Появилась новая заметка"
|
||||||
|
newNote: "Новая заметка"
|
||||||
sounds: "Звуки"
|
sounds: "Звуки"
|
||||||
sound: "Звуки"
|
sound: "Звуки"
|
||||||
|
notificationSoundSettings: "Настройки звука уведомлений"
|
||||||
listen: "Слушать"
|
listen: "Слушать"
|
||||||
none: "Ничего"
|
none: "Ничего"
|
||||||
showInPage: "Показать страницу"
|
showInPage: "Показать страницу"
|
||||||
|
@ -791,6 +794,7 @@ wide: "Толстый"
|
||||||
narrow: "Тонкий"
|
narrow: "Тонкий"
|
||||||
reloadToApplySetting: "Это настройка вступает в силу при загрузке страницы. Перезагрузить сейчас?"
|
reloadToApplySetting: "Это настройка вступает в силу при загрузке страницы. Перезагрузить сейчас?"
|
||||||
needReloadToApply: "Изменения вступят в силу после перезагрузки страницы."
|
needReloadToApply: "Изменения вступят в силу после перезагрузки страницы."
|
||||||
|
needToRestartServerToApply: "Для вступления изменений в силу необходимо перезапустить сервер."
|
||||||
showTitlebar: "Показать заголовок"
|
showTitlebar: "Показать заголовок"
|
||||||
clearCache: "Очистить кэш"
|
clearCache: "Очистить кэш"
|
||||||
onlineUsersCount: "Пользователей сейчас в сети: {n}"
|
onlineUsersCount: "Пользователей сейчас в сети: {n}"
|
||||||
|
@ -1176,13 +1180,25 @@ unused: "Неиспользованное"
|
||||||
used: "Использован"
|
used: "Использован"
|
||||||
expired: "Срок действия приглашения истёк"
|
expired: "Срок действия приглашения истёк"
|
||||||
doYouAgree: "Согласны?"
|
doYouAgree: "Согласны?"
|
||||||
|
beSureToReadThisAsItIsImportant: "Это важно, поэтому, пожалуйста, прочтите это."
|
||||||
|
iHaveReadXCarefullyAndAgree: "Я прочитал(а) и согласен(сна) с условиями \"{x}"
|
||||||
|
dialog: "Диалог"
|
||||||
icon: "Аватар"
|
icon: "Аватар"
|
||||||
|
currentAnnouncements: "Текущие новости"
|
||||||
|
pastAnnouncements: "Предыдущие новости"
|
||||||
|
youHaveUnreadAnnouncements: "У вас есть непрочитанные уведомления"
|
||||||
replies: "Ответы"
|
replies: "Ответы"
|
||||||
renotes: "Репост"
|
renotes: "Репост"
|
||||||
loadReplies: "Показать ответы"
|
loadReplies: "Показать ответы"
|
||||||
|
loadConversation: "Загрузить беседу"
|
||||||
pinnedList: "Закреплённый список"
|
pinnedList: "Закреплённый список"
|
||||||
keepScreenOn: "Держать экран включённым"
|
keepScreenOn: "Держать экран включённым"
|
||||||
|
unnotifyNotes: "Отписаться от сообщений"
|
||||||
|
authentication: "Аутентификация"
|
||||||
|
authenticationRequiredToContinue: "Пожалуйста, пройдите аутентификацию, чтобы продолжить"
|
||||||
|
dateAndTime: "Дата и время"
|
||||||
showRenotes: "Показывать репосты"
|
showRenotes: "Показывать репосты"
|
||||||
|
edited: "Изменено"
|
||||||
mutualFollow: "Взаимные подписки"
|
mutualFollow: "Взаимные подписки"
|
||||||
followingOrFollower: "Подписки или подписчики"
|
followingOrFollower: "Подписки или подписчики"
|
||||||
fileAttachedOnly: "Только заметки с файлами"
|
fileAttachedOnly: "Только заметки с файлами"
|
||||||
|
@ -1193,30 +1209,74 @@ sourceCode: "Исходный код"
|
||||||
sourceCodeIsNotYetProvided: "Исходный код пока не доступен. Свяжитесь с администратором, чтобы исправить эту проблему."
|
sourceCodeIsNotYetProvided: "Исходный код пока не доступен. Свяжитесь с администратором, чтобы исправить эту проблему."
|
||||||
repositoryUrl: "Ссылка на репозиторий"
|
repositoryUrl: "Ссылка на репозиторий"
|
||||||
repositoryUrlDescription: "Если вы используете Misskey как есть (без изменений в исходном коде), введите https://github.com/misskey-dev/misskey"
|
repositoryUrlDescription: "Если вы используете Misskey как есть (без изменений в исходном коде), введите https://github.com/misskey-dev/misskey"
|
||||||
|
feedback: "Обратная связь"
|
||||||
privacyPolicy: "Политика Конфиденциальности"
|
privacyPolicy: "Политика Конфиденциальности"
|
||||||
privacyPolicyUrl: "Ссылка на Политику Конфиденциальности"
|
privacyPolicyUrl: "Ссылка на Политику Конфиденциальности"
|
||||||
|
tosAndPrivacyPolicy: "Условия использования и политика конфиденциальности"
|
||||||
|
avatarDecorations: "Украшения для аватара"
|
||||||
attach: "Прикрепить"
|
attach: "Прикрепить"
|
||||||
|
detachAll: "Убрать всё"
|
||||||
angle: "Угол"
|
angle: "Угол"
|
||||||
flip: "Переворот"
|
flip: "Переворот"
|
||||||
|
showAvatarDecorations: "Показать украшения для аватара"
|
||||||
|
pullDownToRefresh: "Опустите что бы обновить"
|
||||||
useGroupedNotifications: "Отображать уведомления сгруппировано"
|
useGroupedNotifications: "Отображать уведомления сгруппировано"
|
||||||
|
cwNotationRequired: "Если включена опция «Скрыть содержимое», необходимо написать аннотацию."
|
||||||
doReaction: "Добавить реакцию"
|
doReaction: "Добавить реакцию"
|
||||||
code: "Код"
|
code: "Код"
|
||||||
|
reloadRequiredToApplySettings: "Для применения настроек необходима обновить страницу."
|
||||||
remainingN: "Остаётся: {n}"
|
remainingN: "Остаётся: {n}"
|
||||||
|
overwriteContentConfirm: "Текущее содержимое будет перезаписано. Вы уверены?"
|
||||||
seasonalScreenEffect: "Эффект времени года на экране"
|
seasonalScreenEffect: "Эффект времени года на экране"
|
||||||
decorate: "Украсить"
|
decorate: "Украсить"
|
||||||
addMfmFunction: "Добавить MFM"
|
addMfmFunction: "Добавить MFM"
|
||||||
|
bubbleGame: "BubbleGame"
|
||||||
|
sfx: "Звуковые эффекты"
|
||||||
|
soundWillBePlayed: "Будет воспроизведен звук"
|
||||||
|
showReplay: "Показать повтор"
|
||||||
|
endReplay: "Конец повтора"
|
||||||
lastNDays: "Последние {n} сут"
|
lastNDays: "Последние {n} сут"
|
||||||
hemisphere: "Место проживания"
|
hemisphere: "Место проживания"
|
||||||
|
userSaysSomethingSensitive: "Сообщение, содержит конфиденциальные файлы от {name}"
|
||||||
enableHorizontalSwipe: "Смахните в сторону, чтобы сменить вкладки"
|
enableHorizontalSwipe: "Смахните в сторону, чтобы сменить вкладки"
|
||||||
surrender: "Этот пост не может быть отменен."
|
surrender: "Этот пост не может быть отменен."
|
||||||
|
gameRetry: "Повторить попытку"
|
||||||
|
notUsePleaseLeaveBlank: "Если не используется, оставьте пустым"
|
||||||
useNativeUIForVideoAudioPlayer: "Использовать интерфейс браузера при проигрывании видео и звука"
|
useNativeUIForVideoAudioPlayer: "Использовать интерфейс браузера при проигрывании видео и звука"
|
||||||
keepOriginalFilename: "Сохранять исходное имя файла"
|
keepOriginalFilename: "Сохранять исходное имя файла"
|
||||||
keepOriginalFilenameDescription: "Если вы выключите данную настройку, имена файлов будут автоматически заменены случайной строкой при загрузке."
|
keepOriginalFilenameDescription: "Если вы выключите данную настройку, имена файлов будут автоматически заменены случайной строкой при загрузке."
|
||||||
alwaysConfirmFollow: "Всегда подтверждать подписку"
|
alwaysConfirmFollow: "Всегда подтверждать подписку"
|
||||||
inquiry: "Связаться"
|
inquiry: "Связаться"
|
||||||
|
fromX: "Из {x}"
|
||||||
|
genEmbedCode: "Сгенерировать код для "
|
||||||
|
noteOfThisUser: "Список заметок этого пользователя"
|
||||||
|
clipNoteLimitExceeded: "К этому клипу больше нельзя добавить заметки"
|
||||||
|
performance: "Производительность"
|
||||||
|
modified: "Изменено"
|
||||||
|
signinWithPasskey: "Войдите в систему, используя свой пароль"
|
||||||
|
unknownWebAuthnKey: "Неизвестный ключ"
|
||||||
|
passkeyVerificationFailed: "Ошибка проверка ключа доступа "
|
||||||
messageToFollower: "Сообщение подписчикам"
|
messageToFollower: "Сообщение подписчикам"
|
||||||
|
testCaptchaWarning: "Эта функция предназначена для тестирования CAPTCHA. <strong>Не использовать это в рабочей среде</strong>"
|
||||||
|
prohibitedWordsForNameOfUser: "Запрещенные слова (имя пользователя)"
|
||||||
|
prohibitedWordsForNameOfUserDescription: "Если имя пользователя содержит строку из этого списка, изменение имени пользователя будет запрещено. На пользователей с правами модератора это ограничение не распространяется. Имена пользователей также проверяются путём замены всех букв в нижнем регистре"
|
||||||
|
yourNameContainsProhibitedWords: "Имя, которое вы пытаетесь изменить, содержит запрещенную строку символов"
|
||||||
|
yourNameContainsProhibitedWordsDescription: "Имя содержит запрещённую строку символов. Если вы хотите использовать это имя, обратитесь к администратору сервера"
|
||||||
|
thisContentsAreMarkedAsSigninRequiredByAuthor: "Автор сообщения установил требование в виде авторизации для просмотра"
|
||||||
|
lockdown: "Доступ ограничен"
|
||||||
|
pleaseSelectAccount: "Выберите свой аккаунт"
|
||||||
|
availableRoles: "Доступные роли"
|
||||||
|
federationDisabled: "Федерация отключена для этого сервера. Вы не можете взаимодействовать с пользователями на других серверах."
|
||||||
|
draft: "Черновик"
|
||||||
|
markAsSensitiveConfirm: "Отметить контент как чувствительный?"
|
||||||
|
preferences: "Основное"
|
||||||
|
resetToDefaultValue: "Сбросить настройки до стандартных"
|
||||||
|
syncBetweenDevices: "Синхронизировать между устройствами"
|
||||||
postForm: "Форма отправки"
|
postForm: "Форма отправки"
|
||||||
|
textCount: "Количество символов"
|
||||||
information: "Описание"
|
information: "Описание"
|
||||||
|
inMinutes: "мин"
|
||||||
|
inDays: "сут"
|
||||||
_chat:
|
_chat:
|
||||||
invitations: "Пригласить"
|
invitations: "Пригласить"
|
||||||
noHistory: "История пока пуста"
|
noHistory: "История пока пуста"
|
||||||
|
@ -1225,6 +1285,11 @@ _chat:
|
||||||
send: "Отправить"
|
send: "Отправить"
|
||||||
_settings:
|
_settings:
|
||||||
webhook: "Вебхук"
|
webhook: "Вебхук"
|
||||||
|
preferencesBanner: "Вы можете настроить общее поведение клиента по вашим предпочтениям"
|
||||||
|
timelineAndNote: "Лента и заметки"
|
||||||
|
_chat:
|
||||||
|
showSenderName: "Показывать имя отправителя"
|
||||||
|
sendOnEnter: "Использовать Enter для отправки"
|
||||||
_delivery:
|
_delivery:
|
||||||
stop: "Заморожено"
|
stop: "Заморожено"
|
||||||
_type:
|
_type:
|
||||||
|
@ -1501,6 +1566,12 @@ _achievements:
|
||||||
title: "Brain Diver"
|
title: "Brain Diver"
|
||||||
description: "Опубликована ссылка на песню «Brain Diver»"
|
description: "Опубликована ссылка на песню «Brain Diver»"
|
||||||
flavor: "Мисски-Мисски Ла-Ту-Ма"
|
flavor: "Мисски-Мисски Ла-Ту-Ма"
|
||||||
|
_bubbleGameExplodingHead:
|
||||||
|
title: "🤯"
|
||||||
|
description: "Самый большой объект в Bubble game"
|
||||||
|
_bubbleGameDoubleExplodingHead:
|
||||||
|
title: "Двойной🤯"
|
||||||
|
description: "Два самых больших объекта в Bubble game одновременно!"
|
||||||
_role:
|
_role:
|
||||||
new: "Новая роль"
|
new: "Новая роль"
|
||||||
edit: "Изменить роль"
|
edit: "Изменить роль"
|
||||||
|
@ -2200,3 +2271,12 @@ _watermarkEditor:
|
||||||
image: "Изображения"
|
image: "Изображения"
|
||||||
advanced: "Для продвинутых"
|
advanced: "Для продвинутых"
|
||||||
angle: "Угол"
|
angle: "Угол"
|
||||||
|
_imageEffector:
|
||||||
|
_fxProps:
|
||||||
|
angle: "Угол"
|
||||||
|
scale: "Размер"
|
||||||
|
size: "Размер"
|
||||||
|
color: "Цвет"
|
||||||
|
opacity: "Непрозрачность"
|
||||||
|
lightness: "Осветление"
|
||||||
|
drafts: "Черновик"
|
||||||
|
|
|
@ -913,6 +913,8 @@ flip: "Preklopiť"
|
||||||
lastNDays: "Posledných {n} dní"
|
lastNDays: "Posledných {n} dní"
|
||||||
postForm: "Napísať poznámku"
|
postForm: "Napísať poznámku"
|
||||||
information: "Informácie"
|
information: "Informácie"
|
||||||
|
inMinutes: "min"
|
||||||
|
inDays: "dní"
|
||||||
_chat:
|
_chat:
|
||||||
invitations: "Pozvať"
|
invitations: "Pozvať"
|
||||||
noHistory: "Žiadna história"
|
noHistory: "Žiadna história"
|
||||||
|
@ -1457,3 +1459,10 @@ _watermarkEditor:
|
||||||
type: "Typ"
|
type: "Typ"
|
||||||
image: "Obrázky"
|
image: "Obrázky"
|
||||||
advanced: "Rozšírené"
|
advanced: "Rozšírené"
|
||||||
|
_imageEffector:
|
||||||
|
_fxProps:
|
||||||
|
scale: "Veľkosť"
|
||||||
|
size: "Veľkosť"
|
||||||
|
color: "Farba"
|
||||||
|
opacity: "Priehľadnosť"
|
||||||
|
lightness: "Zosvetliť"
|
||||||
|
|
|
@ -646,6 +646,7 @@ _poll:
|
||||||
_visibility:
|
_visibility:
|
||||||
home: "Hem"
|
home: "Hem"
|
||||||
followers: "Följare"
|
followers: "Följare"
|
||||||
|
specified: "Direktnoter"
|
||||||
_profile:
|
_profile:
|
||||||
name: "Namn"
|
name: "Namn"
|
||||||
username: "Användarnamn"
|
username: "Användarnamn"
|
||||||
|
@ -692,6 +693,7 @@ _deck:
|
||||||
list: "Listor"
|
list: "Listor"
|
||||||
channel: "kanal"
|
channel: "kanal"
|
||||||
mentions: "Omnämningar"
|
mentions: "Omnämningar"
|
||||||
|
direct: "Direktnoter"
|
||||||
_webhookSettings:
|
_webhookSettings:
|
||||||
name: "Namn"
|
name: "Namn"
|
||||||
active: "Aktiverad"
|
active: "Aktiverad"
|
||||||
|
@ -714,3 +716,8 @@ _search:
|
||||||
_watermarkEditor:
|
_watermarkEditor:
|
||||||
scale: "Storlek"
|
scale: "Storlek"
|
||||||
image: "Bilder"
|
image: "Bilder"
|
||||||
|
_imageEffector:
|
||||||
|
_fxProps:
|
||||||
|
scale: "Storlek"
|
||||||
|
size: "Storlek"
|
||||||
|
color: "Färg"
|
||||||
|
|
|
@ -776,7 +776,7 @@ highlightSensitiveMedia: "ไฮไลท์สื่อที่มีเนื
|
||||||
verificationEmailSent: "ได้ส่งอีเมลยืนยันแล้ว กรุณาเข้าลิงก์ที่ระบุในอีเมลเพื่อทำการตั้งค่าให้เสร็จสิ้น"
|
verificationEmailSent: "ได้ส่งอีเมลยืนยันแล้ว กรุณาเข้าลิงก์ที่ระบุในอีเมลเพื่อทำการตั้งค่าให้เสร็จสิ้น"
|
||||||
notSet: "ไม่ได้ตั้งค่า"
|
notSet: "ไม่ได้ตั้งค่า"
|
||||||
emailVerified: "อีเมลได้รับการยืนยันแล้ว"
|
emailVerified: "อีเมลได้รับการยืนยันแล้ว"
|
||||||
noteFavoritesCount: "จำนวนโน้ตที่ชื่นชอบ"
|
noteFavoritesCount: "จำนวนโน้ตโปรด"
|
||||||
pageLikesCount: "จำนวนเพจที่ถูกใจ"
|
pageLikesCount: "จำนวนเพจที่ถูกใจ"
|
||||||
pageLikedCount: "จำนวนการกดถูกใจเพจที่ได้รับแล้ว"
|
pageLikedCount: "จำนวนการกดถูกใจเพจที่ได้รับแล้ว"
|
||||||
contact: "ติดต่อ"
|
contact: "ติดต่อ"
|
||||||
|
@ -1054,6 +1054,7 @@ permissionDeniedError: "การดำเนินถูกปฏิเสธ"
|
||||||
permissionDeniedErrorDescription: "บัญชีนี้ไม่มีสิทธิ์อนุญาตในการดำเนินการนี้"
|
permissionDeniedErrorDescription: "บัญชีนี้ไม่มีสิทธิ์อนุญาตในการดำเนินการนี้"
|
||||||
preset: "พรีเซ็ต"
|
preset: "พรีเซ็ต"
|
||||||
selectFromPresets: "เลือกจากการพรีเซ็ต"
|
selectFromPresets: "เลือกจากการพรีเซ็ต"
|
||||||
|
custom: "แบบกำหนดเอง"
|
||||||
achievements: "ความสำเร็จ"
|
achievements: "ความสำเร็จ"
|
||||||
gotInvalidResponseError: "การตอบสนองเซิร์ฟเวอร์ไม่ถูกต้อง"
|
gotInvalidResponseError: "การตอบสนองเซิร์ฟเวอร์ไม่ถูกต้อง"
|
||||||
gotInvalidResponseErrorDescription: "เซิร์ฟเวอร์อาจไม่สามารถเข้าถึงได้หรืออาจจะกำลังอยู่ในระหว่างปรับปรุง กรุณาลองใหม่อีกครั้งในภายหลังนะคะ"
|
gotInvalidResponseErrorDescription: "เซิร์ฟเวอร์อาจไม่สามารถเข้าถึงได้หรืออาจจะกำลังอยู่ในระหว่างปรับปรุง กรุณาลองใหม่อีกครั้งในภายหลังนะคะ"
|
||||||
|
@ -1092,6 +1093,7 @@ prohibitedWordsDescription2: "ถ้าแยกด้วยเว้นวร
|
||||||
hiddenTags: "แฮชแท็กที่ซ่อนอยู่"
|
hiddenTags: "แฮชแท็กที่ซ่อนอยู่"
|
||||||
hiddenTagsDescription: "เลือกแท็กที่จะไม่แสดงในรายการเทรนด์ สามารถลงทะเบียนหลายแท็กได้โดยขึ้นบรรทัดใหม่"
|
hiddenTagsDescription: "เลือกแท็กที่จะไม่แสดงในรายการเทรนด์ สามารถลงทะเบียนหลายแท็กได้โดยขึ้นบรรทัดใหม่"
|
||||||
notesSearchNotAvailable: "การค้นหาโน้ตไม่พร้อมใช้งาน"
|
notesSearchNotAvailable: "การค้นหาโน้ตไม่พร้อมใช้งาน"
|
||||||
|
usersSearchNotAvailable: "การค้นหาผู้ใช้ไม่พร้อมใช้งาน"
|
||||||
license: "ใบอนุญาต"
|
license: "ใบอนุญาต"
|
||||||
unfavoriteConfirm: "ลบออกจากรายการโปรดแน่ใจหรอ?"
|
unfavoriteConfirm: "ลบออกจากรายการโปรดแน่ใจหรอ?"
|
||||||
myClips: "คลิปของฉัน"
|
myClips: "คลิปของฉัน"
|
||||||
|
@ -1243,7 +1245,6 @@ releaseToRefresh: "ปล่อยเพื่อรีเฟรช"
|
||||||
refreshing: "กำลังรีเฟรช..."
|
refreshing: "กำลังรีเฟรช..."
|
||||||
pullDownToRefresh: "ดึงลงเพื่อรีเฟรช"
|
pullDownToRefresh: "ดึงลงเพื่อรีเฟรช"
|
||||||
useGroupedNotifications: "แสดงผลการแจ้งเตือนแบบกลุ่มแล้ว"
|
useGroupedNotifications: "แสดงผลการแจ้งเตือนแบบกลุ่มแล้ว"
|
||||||
signupPendingError: "มีปัญหาในการตรวจสอบที่อยู่อีเมลลิงก์อาจหมดอายุแล้ว"
|
|
||||||
cwNotationRequired: "หากเปิดใช้งาน “ซ่อนเนื้อหา” จะต้องระบุคำอธิบาย"
|
cwNotationRequired: "หากเปิดใช้งาน “ซ่อนเนื้อหา” จะต้องระบุคำอธิบาย"
|
||||||
doReaction: "เพิ่มรีแอคชั่น"
|
doReaction: "เพิ่มรีแอคชั่น"
|
||||||
code: "โค้ด"
|
code: "โค้ด"
|
||||||
|
@ -1368,6 +1369,13 @@ redisplayAllTips: "แสดงคำแนะนำและเคล็ดล
|
||||||
hideAllTips: "ซ่อนคำแนะนำและเคล็ดลับทั้งหมด"
|
hideAllTips: "ซ่อนคำแนะนำและเคล็ดลับทั้งหมด"
|
||||||
defaultImageCompressionLevel: "ความละเอียดเริ่มต้นสำหรับการบีบอัดภาพ"
|
defaultImageCompressionLevel: "ความละเอียดเริ่มต้นสำหรับการบีบอัดภาพ"
|
||||||
defaultImageCompressionLevel_description: "หากตั้งค่าต่ำ จะรักษาคุณภาพภาพได้ดีขึ้นแต่ขนาดไฟล์จะเพิ่มขึ้น<br>หากตั้งค่าสูง จะลดขนาดไฟล์ได้ แต่คุณภาพภาพจะลดลง"
|
defaultImageCompressionLevel_description: "หากตั้งค่าต่ำ จะรักษาคุณภาพภาพได้ดีขึ้นแต่ขนาดไฟล์จะเพิ่มขึ้น<br>หากตั้งค่าสูง จะลดขนาดไฟล์ได้ แต่คุณภาพภาพจะลดลง"
|
||||||
|
inMinutes: "นาที"
|
||||||
|
inDays: "วัน"
|
||||||
|
safeModeEnabled: "โหมดปลอดภัยถูกเปิดใช้งาน"
|
||||||
|
pluginsAreDisabledBecauseSafeMode: "เนื่องจากโหมดปลอดภัยถูกเปิดใช้งาน ปลั๊กอินทั้งหมดจึงถูกปิดใช้งาน"
|
||||||
|
customCssIsDisabledBecauseSafeMode: "เนื่องจากโหมดปลอดภัยถูกเปิดใช้งาน CSS แบบกำหนดเองจึงไม่ได้ถูกนำมาใช้"
|
||||||
|
themeIsDefaultBecauseSafeMode: "ในระหว่างที่โหมดปลอดภัยถูกเปิดใช้งาน จะใช้ธีมเริ่มต้น เมื่อปิดโหมดปลอดภัยจะกลับคืนดังเดิม"
|
||||||
|
thankYouForTestingBeta: "ขอบคุณที่ให้ความร่วมมือในการทดสอบเวอร์ชันเบต้า!"
|
||||||
_order:
|
_order:
|
||||||
newest: "เรียงจากใหม่ไปเก่า"
|
newest: "เรียงจากใหม่ไปเก่า"
|
||||||
oldest: "เรียงจากเก่าไปใหม่"
|
oldest: "เรียงจากเก่าไปใหม่"
|
||||||
|
@ -1431,7 +1439,7 @@ _settings:
|
||||||
api: "API"
|
api: "API"
|
||||||
webhook: "Webhook"
|
webhook: "Webhook"
|
||||||
serviceConnection: "การเชื่อมต่อกับบริการ"
|
serviceConnection: "การเชื่อมต่อกับบริการ"
|
||||||
serviceConnectionBanner: "สามารถจัดการและตั้งค่า Access Token และ Webhook เพื่อเชื่อมต่อกับแอปหรือบริการภายนอกได้"
|
serviceConnectionBanner: "สามารถจัดการและตั้งค่าโทเค็นการเข้าถึงและ Webhook เพื่อเชื่อมต่อกับแอปหรือบริการภายนอกได้"
|
||||||
accountData: "ข้อมูลบัญชี"
|
accountData: "ข้อมูลบัญชี"
|
||||||
accountDataBanner: "สามารถจัดการข้อมูลบัญชีได้โดยส่งออกหรือนำเข้าไฟล์เก็บถาวร"
|
accountDataBanner: "สามารถจัดการข้อมูลบัญชีได้โดยส่งออกหรือนำเข้าไฟล์เก็บถาวร"
|
||||||
muteAndBlockBanner: "สามารถตั้งค่าการซ่อนเนื้อหา และจำกัดการกระทำจากผู้ใช้เฉพาะรายได้"
|
muteAndBlockBanner: "สามารถตั้งค่าการซ่อนเนื้อหา และจำกัดการกระทำจากผู้ใช้เฉพาะรายได้"
|
||||||
|
@ -1459,6 +1467,7 @@ _settings:
|
||||||
contentsUpdateFrequency_description2: "เมื่อโหมดเรียลไทม์เปิดอยู่ เนื้อหาจะอัปเดตแบบเรียลไทม์โดยไม่ขึ้นกับการตั้งค่านี้"
|
contentsUpdateFrequency_description2: "เมื่อโหมดเรียลไทม์เปิดอยู่ เนื้อหาจะอัปเดตแบบเรียลไทม์โดยไม่ขึ้นกับการตั้งค่านี้"
|
||||||
showUrlPreview: "แสดงตัวอย่าง URL"
|
showUrlPreview: "แสดงตัวอย่าง URL"
|
||||||
showAvailableReactionsFirstInNote: "แสดงรีแอคชั่นที่ใช้ได้ไว้หน้าสุด"
|
showAvailableReactionsFirstInNote: "แสดงรีแอคชั่นที่ใช้ได้ไว้หน้าสุด"
|
||||||
|
showPageTabBarBottom: "แสดงแท็บบาร์ของเพจที่ด้านล่าง"
|
||||||
_chat:
|
_chat:
|
||||||
showSenderName: "แสดงชื่อผู้ส่ง"
|
showSenderName: "แสดงชื่อผู้ส่ง"
|
||||||
sendOnEnter: "กด Enter เพื่อส่ง"
|
sendOnEnter: "กด Enter เพื่อส่ง"
|
||||||
|
@ -1632,6 +1641,10 @@ _serverSettings:
|
||||||
fanoutTimelineDbFallback: "ฟอลแบ๊กกลับฐานข้อมูล"
|
fanoutTimelineDbFallback: "ฟอลแบ๊กกลับฐานข้อมูล"
|
||||||
fanoutTimelineDbFallbackDescription: "เมื่อเปิดใช้งาน หากไม่ได้แคชไทม์ไลน์ ไทม์ไลน์จะฟอลแบ๊กไปยังฐานข้อมูลสำหรับการ query เพิ่มเติม การปิดใช้งานจะช่วยลดภาระของเซิร์ฟเวอร์ด้วยการกำจัดกระบวนฟอลแบ๊ก แต่มันก็จะจำกัดช่วงเวลาไทม์ไลน์ที่สามารถดึงข้อมูลได้"
|
fanoutTimelineDbFallbackDescription: "เมื่อเปิดใช้งาน หากไม่ได้แคชไทม์ไลน์ ไทม์ไลน์จะฟอลแบ๊กไปยังฐานข้อมูลสำหรับการ query เพิ่มเติม การปิดใช้งานจะช่วยลดภาระของเซิร์ฟเวอร์ด้วยการกำจัดกระบวนฟอลแบ๊ก แต่มันก็จะจำกัดช่วงเวลาไทม์ไลน์ที่สามารถดึงข้อมูลได้"
|
||||||
reactionsBufferingDescription: "เมื่อเปิดใช้งานฟังก์ชันนี้ก็จะช่วยลด latency ในการสร้างปฏิกิริยา แต่อาจจะส่งผลให้ memory footprint ของ Redis เพิ่มขึ้นนะ"
|
reactionsBufferingDescription: "เมื่อเปิดใช้งานฟังก์ชันนี้ก็จะช่วยลด latency ในการสร้างปฏิกิริยา แต่อาจจะส่งผลให้ memory footprint ของ Redis เพิ่มขึ้นนะ"
|
||||||
|
remoteNotesCleaning: "การล้างข้อมูลโพสต์จากระยะไกลโดยอัตโนมัติ"
|
||||||
|
remoteNotesCleaning_description: "เมื่อเปิดใช้งาน จะทำการล้างโพสต์จากระยะไกลเก่าที่ไม่ถูกอ้างอิง เป็นระยะ เพื่อลดการขยายตัวของฐานข้อมูล"
|
||||||
|
remoteNotesCleaningMaxProcessingDuration: "ระยะเวลาสูงสุดของการประมวลผลการล้างข้อมูล"
|
||||||
|
remoteNotesCleaningExpiryDaysForEachNotes: "จำนวนวันที่ต้องเก็บโน้ตไว้อย่างน้อย"
|
||||||
inquiryUrl: "URL สำหรับการติดต่อสอบถาม"
|
inquiryUrl: "URL สำหรับการติดต่อสอบถาม"
|
||||||
inquiryUrlDescription: "ระบุ URL ของหน้าเว็บที่มีแบบฟอร์มสำหรับติดต่อผู้ดูแลเซิร์ฟเวอร์ หรือข้อมูลการติดต่อของผู้ดูแลเซิร์ฟเวอร์"
|
inquiryUrlDescription: "ระบุ URL ของหน้าเว็บที่มีแบบฟอร์มสำหรับติดต่อผู้ดูแลเซิร์ฟเวอร์ หรือข้อมูลการติดต่อของผู้ดูแลเซิร์ฟเวอร์"
|
||||||
openRegistration: "เปิดให้สร้างบัญชีได้"
|
openRegistration: "เปิดให้สร้างบัญชีได้"
|
||||||
|
@ -1650,6 +1663,8 @@ _serverSettings:
|
||||||
userGeneratedContentsVisibilityForVisitor: "ขอบเขตการเปิดเผยเนื้อหาที่ผู้ใช้สร้างต่อบุคคลที่ไม่ได้เข้าร่วม (แขก)"
|
userGeneratedContentsVisibilityForVisitor: "ขอบเขตการเปิดเผยเนื้อหาที่ผู้ใช้สร้างต่อบุคคลที่ไม่ได้เข้าร่วม (แขก)"
|
||||||
userGeneratedContentsVisibilityForVisitor_description: "ช่วยป้องกันปัญหาที่อาจเกิดขึ้นจากเนื้อหาระยะไกลที่ไม่เหมาะสม ซึ่งอาจถูกเผยแพร่ออกสู่อินเทอร์เน็ตโดยไม่ตั้งใจผ่านเซิร์ฟเวอร์ของตนเอง โดยเฉพาะในกรณีที่การดูแลควบคุมไม่ทั่วถึง"
|
userGeneratedContentsVisibilityForVisitor_description: "ช่วยป้องกันปัญหาที่อาจเกิดขึ้นจากเนื้อหาระยะไกลที่ไม่เหมาะสม ซึ่งอาจถูกเผยแพร่ออกสู่อินเทอร์เน็ตโดยไม่ตั้งใจผ่านเซิร์ฟเวอร์ของตนเอง โดยเฉพาะในกรณีที่การดูแลควบคุมไม่ทั่วถึง"
|
||||||
userGeneratedContentsVisibilityForVisitor_description2: "การเปิดเผยเนื้อหาทั้งหมดในเซิร์ฟเวอร์รวมทั้งเนื้อหาที่รับมาจากระยะไกลสู่สาธารณะบนอินเทอร์เน็ตโดยไม่มีข้อจำกัดใดๆ มีความเสี่ยงโดยเฉพาะอย่างยิ่งสำหรับผู้ชมที่ไม่เข้าใจลักษณะของระบบแบบกระจาย อาจทำให้เกิดความเข้าใจผิดคิดว่าเนื้อหาที่มาจากระยะไกลนั้นเป็นเนื้อหาที่สร้างขึ้นภายในเซิร์ฟเวอร์นี้ จึงควรใช้ความระมัดระวังอย่างมาก"
|
userGeneratedContentsVisibilityForVisitor_description2: "การเปิดเผยเนื้อหาทั้งหมดในเซิร์ฟเวอร์รวมทั้งเนื้อหาที่รับมาจากระยะไกลสู่สาธารณะบนอินเทอร์เน็ตโดยไม่มีข้อจำกัดใดๆ มีความเสี่ยงโดยเฉพาะอย่างยิ่งสำหรับผู้ชมที่ไม่เข้าใจลักษณะของระบบแบบกระจาย อาจทำให้เกิดความเข้าใจผิดคิดว่าเนื้อหาที่มาจากระยะไกลนั้นเป็นเนื้อหาที่สร้างขึ้นภายในเซิร์ฟเวอร์นี้ จึงควรใช้ความระมัดระวังอย่างมาก"
|
||||||
|
restartServerSetupWizardConfirm_title: "ต้องการเริ่มวิซาร์ดการตั้งค่าเซิร์ฟเวอร์ใหม่หรือไม่?"
|
||||||
|
restartServerSetupWizardConfirm_text: "การตั้งค่าบางส่วนในปัจจุบันจะถูกรีเซ็ต"
|
||||||
_userGeneratedContentsVisibilityForVisitor:
|
_userGeneratedContentsVisibilityForVisitor:
|
||||||
all: "ทั้งหมดสาธารณะ"
|
all: "ทั้งหมดสาธารณะ"
|
||||||
localOnly: "เผยแพร่เป็นสาธารณะเฉพาะเนื้อหาท้องถิ่น เนื้อหาระยะไกลให้เป็นส่วนตัว"
|
localOnly: "เผยแพร่เป็นสาธารณะเฉพาะเนื้อหาท้องถิ่น เนื้อหาระยะไกลให้เป็นส่วนตัว"
|
||||||
|
@ -1986,6 +2001,7 @@ _role:
|
||||||
descriptionOfRateLimitFactor: "ยิ่งตัวเลขน้อยก็ยิ่งจำกัดน้อย ยิ่งมากก็ยิ่งเข้มงวดมากขึ้น"
|
descriptionOfRateLimitFactor: "ยิ่งตัวเลขน้อยก็ยิ่งจำกัดน้อย ยิ่งมากก็ยิ่งเข้มงวดมากขึ้น"
|
||||||
canHideAds: "ซ่อนโฆษณา"
|
canHideAds: "ซ่อนโฆษณา"
|
||||||
canSearchNotes: "การใช้การค้นหาโน้ต"
|
canSearchNotes: "การใช้การค้นหาโน้ต"
|
||||||
|
canSearchUsers: "ค้นหาผู้ใช้"
|
||||||
canUseTranslator: "การใช้งานแปล"
|
canUseTranslator: "การใช้งานแปล"
|
||||||
avatarDecorationLimit: "จำนวนของตกแต่งไอคอนสูงสุดที่สามารถติดตั้งได้"
|
avatarDecorationLimit: "จำนวนของตกแต่งไอคอนสูงสุดที่สามารถติดตั้งได้"
|
||||||
canImportAntennas: "อนุญาตให้นำเข้าเสาอากาศ"
|
canImportAntennas: "อนุญาตให้นำเข้าเสาอากาศ"
|
||||||
|
@ -2258,6 +2274,7 @@ _time:
|
||||||
minute: "นาที"
|
minute: "นาที"
|
||||||
hour: "ชั่วโมง"
|
hour: "ชั่วโมง"
|
||||||
day: "วัน"
|
day: "วัน"
|
||||||
|
month: "เดือน"
|
||||||
_2fa:
|
_2fa:
|
||||||
alreadyRegistered: "คุณได้ลงทะเบียนอุปกรณ์ยืนยันตัวตนแบบ 2 ชั้นแล้ว"
|
alreadyRegistered: "คุณได้ลงทะเบียนอุปกรณ์ยืนยันตัวตนแบบ 2 ชั้นแล้ว"
|
||||||
registerTOTP: "ลงทะเบียนแอพตัวตรวจสอบสิทธิ์"
|
registerTOTP: "ลงทะเบียนแอพตัวตรวจสอบสิทธิ์"
|
||||||
|
@ -3060,6 +3077,7 @@ _bootErrors:
|
||||||
otherOption1: "ลบการตั้งค่าและแคชของไคลเอนต์"
|
otherOption1: "ลบการตั้งค่าและแคชของไคลเอนต์"
|
||||||
otherOption2: "เริ่มใช้งานไคลเอนต์แบบง่าย"
|
otherOption2: "เริ่มใช้งานไคลเอนต์แบบง่าย"
|
||||||
otherOption3: "เปิดเครื่องมือซ่อมแซม"
|
otherOption3: "เปิดเครื่องมือซ่อมแซม"
|
||||||
|
otherOption4: "เริ่มทำงาน Misskey ในโหมดปลอดภัย"
|
||||||
_search:
|
_search:
|
||||||
searchScopeAll: "ทั้งหมด"
|
searchScopeAll: "ทั้งหมด"
|
||||||
searchScopeLocal: "ท้องถิ่น"
|
searchScopeLocal: "ท้องถิ่น"
|
||||||
|
@ -3096,6 +3114,8 @@ _serverSetupWizard:
|
||||||
doYouConnectToFediverse_description1: "หากเชื่อมต่อกับเครือข่ายที่ประกอบด้วยเซิร์ฟเวอร์แบบกระจาย (Fediverse) จะสามารถแลกเปลี่ยนเนื้อหากับเซิร์ฟเวอร์อื่นๆ ได้"
|
doYouConnectToFediverse_description1: "หากเชื่อมต่อกับเครือข่ายที่ประกอบด้วยเซิร์ฟเวอร์แบบกระจาย (Fediverse) จะสามารถแลกเปลี่ยนเนื้อหากับเซิร์ฟเวอร์อื่นๆ ได้"
|
||||||
doYouConnectToFediverse_description2: "การเชื่อมต่อกับ Fediverse เรียกว่า “สหพันธ์”"
|
doYouConnectToFediverse_description2: "การเชื่อมต่อกับ Fediverse เรียกว่า “สหพันธ์”"
|
||||||
youCanConfigureMoreFederationSettingsLater: "หลังจากนี้ยังสามารถตั้งค่าแบบขั้นสูง เช่น การกำหนดเซิร์ฟเวอร์ที่อนุญาตให้สหพันธ์ต่อกันได้เพิ่มเติม"
|
youCanConfigureMoreFederationSettingsLater: "หลังจากนี้ยังสามารถตั้งค่าแบบขั้นสูง เช่น การกำหนดเซิร์ฟเวอร์ที่อนุญาตให้สหพันธ์ต่อกันได้เพิ่มเติม"
|
||||||
|
remoteContentsCleaning: "การล้างข้อมูลเนื้อหาที่ได้รับโดยอัตโนมัติ"
|
||||||
|
remoteContentsCleaning_description: "เมื่อมีการเชื่อมโยงสหพันธ์ จะได้รับเนื้อหาเป็นจำนวนมากอย่างต่อเนื่อง เมื่อเปิดใช้งานการล้างข้อมูลอัตโนมัติ จะทำการลบเนื้อหาเก่าที่ไม่ถูกอ้างอิง ไปจากเซิร์ฟเวอร์โดยอัตโนมัติ เพื่อประหยัดพื้นที่จัดเก็บข้อมูล"
|
||||||
adminInfo: "ข้อมูลผู้ดูแลระบ"
|
adminInfo: "ข้อมูลผู้ดูแลระบ"
|
||||||
adminInfo_description: "ตั้งค่าข้อมูลผู้ดูแลระบบที่จะใช้รับคำถามและติดต่อ"
|
adminInfo_description: "ตั้งค่าข้อมูลผู้ดูแลระบบที่จะใช้รับคำถามและติดต่อ"
|
||||||
adminInfo_mustBeFilled: "หากเปิดใช้เซิร์ฟเวอร์สาธารณะ หรือเปิดใช้งานสหพันธ์ จะต้องกรอกข้อมูลนี้"
|
adminInfo_mustBeFilled: "หากเปิดใช้เซิร์ฟเวอร์สาธารณะ หรือเปิดใช้งานสหพันธ์ จะต้องกรอกข้อมูลนี้"
|
||||||
|
@ -3148,10 +3168,10 @@ _watermarkEditor:
|
||||||
type: "รูปแบบ"
|
type: "รูปแบบ"
|
||||||
image: "รูปภาพ"
|
image: "รูปภาพ"
|
||||||
advanced: "ขั้นสูง"
|
advanced: "ขั้นสูง"
|
||||||
|
angle: "แองเกิล"
|
||||||
stripe: "ริ้ว"
|
stripe: "ริ้ว"
|
||||||
stripeWidth: "ความกว้างเส้น"
|
stripeWidth: "ความกว้างเส้น"
|
||||||
stripeFrequency: "จำนวนเส้น"
|
stripeFrequency: "จำนวนเส้น"
|
||||||
angle: "แองเกิล"
|
|
||||||
polkadot: "ลายจุด"
|
polkadot: "ลายจุด"
|
||||||
checker: "ช่องตาราง"
|
checker: "ช่องตาราง"
|
||||||
polkadotMainDotOpacity: "ความทึบของจุดหลัก"
|
polkadotMainDotOpacity: "ความทึบของจุดหลัก"
|
||||||
|
@ -3163,6 +3183,7 @@ _imageEffector:
|
||||||
title: "เอฟเฟกต์"
|
title: "เอฟเฟกต์"
|
||||||
addEffect: "เพิ่มเอฟเฟกต์"
|
addEffect: "เพิ่มเอฟเฟกต์"
|
||||||
discardChangesConfirm: "ต้องการทิ้งการเปลี่ยนแปลงแล้วออกหรือไม่?"
|
discardChangesConfirm: "ต้องการทิ้งการเปลี่ยนแปลงแล้วออกหรือไม่?"
|
||||||
|
nothingToConfigure: "ไม่มีอะไรให้ตั้งค่า"
|
||||||
_fxs:
|
_fxs:
|
||||||
chromaticAberration: "ความคลาดสี"
|
chromaticAberration: "ความคลาดสี"
|
||||||
glitch: "กลิตช์"
|
glitch: "กลิตช์"
|
||||||
|
@ -3180,6 +3201,38 @@ _imageEffector:
|
||||||
checker: "ช่องตาราง"
|
checker: "ช่องตาราง"
|
||||||
blockNoise: "บล็อกที่มีการรบกวน"
|
blockNoise: "บล็อกที่มีการรบกวน"
|
||||||
tearing: "ฉีกขาด"
|
tearing: "ฉีกขาด"
|
||||||
|
_fxProps:
|
||||||
|
angle: "แองเกิล"
|
||||||
|
scale: "ขนาด"
|
||||||
|
size: "ขนาด"
|
||||||
|
color: "สี"
|
||||||
|
opacity: "ความทึบแสง"
|
||||||
|
normalize: "นอร์มัลไลซ์"
|
||||||
|
amount: "จำนวน"
|
||||||
|
lightness: "สว่าง"
|
||||||
|
contrast: "คอนทราสต์"
|
||||||
|
hue: "HUE"
|
||||||
|
brightness: "ความสว่าง"
|
||||||
|
saturation: "ความอิ่มตัว"
|
||||||
|
max: "สูงสุด"
|
||||||
|
min: "ต่ำสุด"
|
||||||
|
direction: "ทิศทาง"
|
||||||
|
phase: "ระยะ"
|
||||||
|
frequency: "ความถี่"
|
||||||
|
strength: "ความแรง"
|
||||||
|
glitchChannelShift: "ความเคลื่อน"
|
||||||
|
seed: "ซีด"
|
||||||
|
redComponent: "ส่วนสีแดง"
|
||||||
|
greenComponent: "ส่วนสีเขียว"
|
||||||
|
blueComponent: "ส่วนสีน้ำเงิน"
|
||||||
|
threshold: "เทรชโฮลด์"
|
||||||
|
centerX: "กลาง X"
|
||||||
|
centerY: "กลาง Y"
|
||||||
|
zoomLinesSmoothing: "ทำให้สมูธ"
|
||||||
|
zoomLinesSmoothingDescription: "ตั้งให้สมูธไม่สามารถใช้ร่วมกับตั้งความกว้างเส้นรวมศูนย์ได้"
|
||||||
|
zoomLinesThreshold: "ความกว้างเส้นรวมศูนย์"
|
||||||
|
zoomLinesMaskSize: "ขนาดพื้นที่ตรงกลาง"
|
||||||
|
zoomLinesBlack: "ทำให้ดำ"
|
||||||
drafts: "ร่าง"
|
drafts: "ร่าง"
|
||||||
_drafts:
|
_drafts:
|
||||||
select: "เลือกฉบับร่าง"
|
select: "เลือกฉบับร่าง"
|
||||||
|
|
3311
locales/tr-TR.yml
3311
locales/tr-TR.yml
File diff suppressed because it is too large
Load diff
|
@ -919,6 +919,8 @@ flip: "Перевернути"
|
||||||
lastNDays: "Останні {n} днів"
|
lastNDays: "Останні {n} днів"
|
||||||
postForm: "Створення нотатки"
|
postForm: "Створення нотатки"
|
||||||
information: "Інформація"
|
information: "Інформація"
|
||||||
|
inMinutes: "х"
|
||||||
|
inDays: "д"
|
||||||
_chat:
|
_chat:
|
||||||
invitations: "Запросити"
|
invitations: "Запросити"
|
||||||
noHistory: "Історія порожня"
|
noHistory: "Історія порожня"
|
||||||
|
@ -1646,3 +1648,10 @@ _watermarkEditor:
|
||||||
type: "Тип"
|
type: "Тип"
|
||||||
image: "Зображення"
|
image: "Зображення"
|
||||||
advanced: "Розширені"
|
advanced: "Розширені"
|
||||||
|
_imageEffector:
|
||||||
|
_fxProps:
|
||||||
|
scale: "Розмір"
|
||||||
|
size: "Розмір"
|
||||||
|
color: "Колір"
|
||||||
|
opacity: "Непрозорість"
|
||||||
|
lightness: "Яскравість"
|
||||||
|
|
|
@ -903,7 +903,7 @@ _theme:
|
||||||
header: "Sarlavha"
|
header: "Sarlavha"
|
||||||
navBg: "Yon panel foni"
|
navBg: "Yon panel foni"
|
||||||
navFg: "Yon panel matni"
|
navFg: "Yon panel matni"
|
||||||
mention: "Murojat"
|
mention: "Eslatib o'tish"
|
||||||
renote: "Qayta qayd etish"
|
renote: "Qayta qayd etish"
|
||||||
divider: "Ajratrmoq"
|
divider: "Ajratrmoq"
|
||||||
fgHighlighted: "Belgilangan matn"
|
fgHighlighted: "Belgilangan matn"
|
||||||
|
@ -1045,7 +1045,7 @@ _notification:
|
||||||
_types:
|
_types:
|
||||||
all: "Barchasi"
|
all: "Barchasi"
|
||||||
follow: "Obuna bo‘lish"
|
follow: "Obuna bo‘lish"
|
||||||
mention: "Murojat"
|
mention: "Eslatib o'tish"
|
||||||
renote: "Qayta qayd etish"
|
renote: "Qayta qayd etish"
|
||||||
quote: "Iqtibos keltirish"
|
quote: "Iqtibos keltirish"
|
||||||
reaction: "Reaktsiyalar"
|
reaction: "Reaktsiyalar"
|
||||||
|
@ -1102,3 +1102,7 @@ _watermarkEditor:
|
||||||
type: "turi"
|
type: "turi"
|
||||||
image: "Rasmlar"
|
image: "Rasmlar"
|
||||||
advanced: "Murakkab"
|
advanced: "Murakkab"
|
||||||
|
_imageEffector:
|
||||||
|
_fxProps:
|
||||||
|
color: "Rang"
|
||||||
|
lightness: "Yoritish"
|
||||||
|
|
|
@ -1196,7 +1196,6 @@ showAvatarDecorations: "Hiển thị trang trí ảnh đại diện"
|
||||||
releaseToRefresh: "Thả để làm mới"
|
releaseToRefresh: "Thả để làm mới"
|
||||||
refreshing: "Đang làm mới"
|
refreshing: "Đang làm mới"
|
||||||
pullDownToRefresh: "Kéo xuống để làm mới"
|
pullDownToRefresh: "Kéo xuống để làm mới"
|
||||||
signupPendingError: "Đã xảy ra sự cố khi xác minh địa chỉ email của bạn. Liên kết có thể đã hết hạn."
|
|
||||||
cwNotationRequired: "Nếu \"Ẩn nội dung\" được bật thì cần phải có chú thích."
|
cwNotationRequired: "Nếu \"Ẩn nội dung\" được bật thì cần phải có chú thích."
|
||||||
decorate: "Trang trí"
|
decorate: "Trang trí"
|
||||||
lastNDays: "{n} ngày trước"
|
lastNDays: "{n} ngày trước"
|
||||||
|
@ -1221,6 +1220,8 @@ information: "Giới thiệu"
|
||||||
chat: "Trò chuyện"
|
chat: "Trò chuyện"
|
||||||
migrateOldSettings: "Di chuyển cài đặt cũ"
|
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."
|
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"
|
||||||
_chat:
|
_chat:
|
||||||
invitations: "Mời"
|
invitations: "Mời"
|
||||||
noHistory: "Không có dữ liệu"
|
noHistory: "Không có dữ liệu"
|
||||||
|
@ -2089,3 +2090,11 @@ _watermarkEditor:
|
||||||
image: "Hình ảnh"
|
image: "Hình ảnh"
|
||||||
advanced: "Nâng cao"
|
advanced: "Nâng cao"
|
||||||
angle: "Góc"
|
angle: "Góc"
|
||||||
|
_imageEffector:
|
||||||
|
_fxProps:
|
||||||
|
angle: "Góc"
|
||||||
|
scale: "Kích thước"
|
||||||
|
size: "Kích thước"
|
||||||
|
color: "Màu sắc"
|
||||||
|
opacity: "Độ trong suốt"
|
||||||
|
lightness: "Độ sáng"
|
||||||
|
|
|
@ -1054,6 +1054,7 @@ permissionDeniedError: "操作被拒绝"
|
||||||
permissionDeniedErrorDescription: "本账户没有执行该操作的权限。"
|
permissionDeniedErrorDescription: "本账户没有执行该操作的权限。"
|
||||||
preset: "预设值"
|
preset: "预设值"
|
||||||
selectFromPresets: "从预设值中选择"
|
selectFromPresets: "从预设值中选择"
|
||||||
|
custom: "自定义"
|
||||||
achievements: "成就"
|
achievements: "成就"
|
||||||
gotInvalidResponseError: "服务器无应答"
|
gotInvalidResponseError: "服务器无应答"
|
||||||
gotInvalidResponseErrorDescription: "您的网络连接可能出现了问题, 或是远程服务器暂时不可用. 请稍后重试。"
|
gotInvalidResponseErrorDescription: "您的网络连接可能出现了问题, 或是远程服务器暂时不可用. 请稍后重试。"
|
||||||
|
@ -1092,6 +1093,7 @@ prohibitedWordsDescription2: "AND 条件用空格分隔,正则表达式用斜
|
||||||
hiddenTags: "隐藏标签"
|
hiddenTags: "隐藏标签"
|
||||||
hiddenTagsDescription: "设定的标签将不会在时间线上显示。可使用换行来设置多个标签。"
|
hiddenTagsDescription: "设定的标签将不会在时间线上显示。可使用换行来设置多个标签。"
|
||||||
notesSearchNotAvailable: "帖子检索不可用"
|
notesSearchNotAvailable: "帖子检索不可用"
|
||||||
|
usersSearchNotAvailable: "用户检索不可用"
|
||||||
license: "许可信息"
|
license: "许可信息"
|
||||||
unfavoriteConfirm: "确定要取消收藏吗?"
|
unfavoriteConfirm: "确定要取消收藏吗?"
|
||||||
myClips: "我的便签"
|
myClips: "我的便签"
|
||||||
|
@ -1143,7 +1145,7 @@ channelArchiveConfirmTitle: "要将 {name} 归档吗?"
|
||||||
channelArchiveConfirmDescription: "归档后,在频道列表与搜索结果中不会显示,也无法发布新的贴文。"
|
channelArchiveConfirmDescription: "归档后,在频道列表与搜索结果中不会显示,也无法发布新的贴文。"
|
||||||
thisChannelArchived: "该频道已被归档。"
|
thisChannelArchived: "该频道已被归档。"
|
||||||
displayOfNote: "显示帖子"
|
displayOfNote: "显示帖子"
|
||||||
initialAccountSetting: "初始设置"
|
initialAccountSetting: "初始设定"
|
||||||
youFollowing: "正在关注"
|
youFollowing: "正在关注"
|
||||||
preventAiLearning: "拒绝接受生成式 AI 的学习"
|
preventAiLearning: "拒绝接受生成式 AI 的学习"
|
||||||
preventAiLearningDescription: "要求文章生成 AI 或图像生成 AI 不能够以发布的帖子和图像等内容作为学习对象。这是通过在 HTML 响应中包含 noai 标志来实现的,这不能完全阻止 AI 学习你的发布内容,并不是所有 AI 都会遵守这类请求。"
|
preventAiLearningDescription: "要求文章生成 AI 或图像生成 AI 不能够以发布的帖子和图像等内容作为学习对象。这是通过在 HTML 响应中包含 noai 标志来实现的,这不能完全阻止 AI 学习你的发布内容,并不是所有 AI 都会遵守这类请求。"
|
||||||
|
@ -1243,7 +1245,7 @@ releaseToRefresh: "松开以刷新"
|
||||||
refreshing: "刷新中"
|
refreshing: "刷新中"
|
||||||
pullDownToRefresh: "下拉以刷新"
|
pullDownToRefresh: "下拉以刷新"
|
||||||
useGroupedNotifications: "分组显示通知"
|
useGroupedNotifications: "分组显示通知"
|
||||||
signupPendingError: "确认电子邮件时出现错误。链接可能已过期。"
|
emailVerificationFailedError: "确认电子邮件时出现错误。链接可能已过期。"
|
||||||
cwNotationRequired: "在启用「隐藏内容」时必须输入注释"
|
cwNotationRequired: "在启用「隐藏内容」时必须输入注释"
|
||||||
doReaction: "回应"
|
doReaction: "回应"
|
||||||
code: "代码"
|
code: "代码"
|
||||||
|
@ -1318,7 +1320,7 @@ confirmOnReact: "发送回应前需要确认"
|
||||||
reactAreYouSure: "要用「{emoji}」进行回应吗?"
|
reactAreYouSure: "要用「{emoji}」进行回应吗?"
|
||||||
markAsSensitiveConfirm: "要将此媒体标记为敏感吗?"
|
markAsSensitiveConfirm: "要将此媒体标记为敏感吗?"
|
||||||
unmarkAsSensitiveConfirm: "要将此媒体解除敏感标记吗?"
|
unmarkAsSensitiveConfirm: "要将此媒体解除敏感标记吗?"
|
||||||
preferences: "设置"
|
preferences: "偏好设置"
|
||||||
accessibility: "辅助功能"
|
accessibility: "辅助功能"
|
||||||
preferencesProfile: "设置的配置"
|
preferencesProfile: "设置的配置"
|
||||||
copyPreferenceId: "复制设置 ID"
|
copyPreferenceId: "复制设置 ID"
|
||||||
|
@ -1368,6 +1370,13 @@ redisplayAllTips: "重新显示所有的提示和技巧"
|
||||||
hideAllTips: "隐藏所有的提示和技巧"
|
hideAllTips: "隐藏所有的提示和技巧"
|
||||||
defaultImageCompressionLevel: "默认图像压缩等级"
|
defaultImageCompressionLevel: "默认图像压缩等级"
|
||||||
defaultImageCompressionLevel_description: "较低的等级可以保持画质,但会增加文件大小。<br>较高的等级可以减少文件大小,但相对应的画质将会降低。"
|
defaultImageCompressionLevel_description: "较低的等级可以保持画质,但会增加文件大小。<br>较高的等级可以减少文件大小,但相对应的画质将会降低。"
|
||||||
|
inMinutes: "分"
|
||||||
|
inDays: "日"
|
||||||
|
safeModeEnabled: "已启用安全模式"
|
||||||
|
pluginsAreDisabledBecauseSafeMode: "因启用了安全模式,所有插件均已被禁用。"
|
||||||
|
customCssIsDisabledBecauseSafeMode: "因启用了安全模式,无法应用自定义 CSS。"
|
||||||
|
themeIsDefaultBecauseSafeMode: "启用安全模式时将使用默认主题。关闭安全模式后将还原。"
|
||||||
|
thankYouForTestingBeta: "感谢您协助测试 beta 版!"
|
||||||
_order:
|
_order:
|
||||||
newest: "从新到旧"
|
newest: "从新到旧"
|
||||||
oldest: "从旧到新"
|
oldest: "从旧到新"
|
||||||
|
@ -1459,6 +1468,7 @@ _settings:
|
||||||
contentsUpdateFrequency_description2: "当实时模式开启时,无论此设置如何,内容都会实时更新。"
|
contentsUpdateFrequency_description2: "当实时模式开启时,无论此设置如何,内容都会实时更新。"
|
||||||
showUrlPreview: "显示 URL 预览"
|
showUrlPreview: "显示 URL 预览"
|
||||||
showAvailableReactionsFirstInNote: "在顶部显示可用的回应"
|
showAvailableReactionsFirstInNote: "在顶部显示可用的回应"
|
||||||
|
showPageTabBarBottom: "在下方显示页面标签栏"
|
||||||
_chat:
|
_chat:
|
||||||
showSenderName: "显示发送者的名字"
|
showSenderName: "显示发送者的名字"
|
||||||
sendOnEnter: "回车键发送"
|
sendOnEnter: "回车键发送"
|
||||||
|
@ -1536,7 +1546,7 @@ _announcement:
|
||||||
silenceDescription: "开启后,此条公告将不会发送通知,也不强制用户阅读。"
|
silenceDescription: "开启后,此条公告将不会发送通知,也不强制用户阅读。"
|
||||||
_initialAccountSetting:
|
_initialAccountSetting:
|
||||||
accountCreated: "账户创建完成了!"
|
accountCreated: "账户创建完成了!"
|
||||||
letsStartAccountSetup: "来进行帐户的初始设置吧。"
|
letsStartAccountSetup: "马上来进行账户的初始设定吧。"
|
||||||
letsFillYourProfile: "首先,来设定你的个人档案吧!"
|
letsFillYourProfile: "首先,来设定你的个人档案吧!"
|
||||||
profileSetting: "个人资料设置"
|
profileSetting: "个人资料设置"
|
||||||
privacySetting: "隐私设置"
|
privacySetting: "隐私设置"
|
||||||
|
@ -1548,7 +1558,7 @@ _initialAccountSetting:
|
||||||
haveFun: "希望 {name} 在这里玩得开心!"
|
haveFun: "希望 {name} 在这里玩得开心!"
|
||||||
youCanContinueTutorial: "您可以继续了解 {name}(Misskey) 的使用教程,也可以在此停止教程并立即开始使用它。\n"
|
youCanContinueTutorial: "您可以继续了解 {name}(Misskey) 的使用教程,也可以在此停止教程并立即开始使用它。\n"
|
||||||
startTutorial: "开始教学"
|
startTutorial: "开始教学"
|
||||||
skipAreYouSure: "要跳过初始设置吗?"
|
skipAreYouSure: "要跳过初始设定吗?"
|
||||||
laterAreYouSure: "要稍后再进行初始设定吗?"
|
laterAreYouSure: "要稍后再进行初始设定吗?"
|
||||||
_initialTutorial:
|
_initialTutorial:
|
||||||
launchTutorial: "观看教学"
|
launchTutorial: "观看教学"
|
||||||
|
@ -1632,6 +1642,10 @@ _serverSettings:
|
||||||
fanoutTimelineDbFallback: "回退到数据库"
|
fanoutTimelineDbFallback: "回退到数据库"
|
||||||
fanoutTimelineDbFallbackDescription: "当启用时,若时间线未被缓存,则将额外查询数据库。禁用该功能可通过不执行回退处理进一步减少服务器负载,但会限制可检索的时间线范围。"
|
fanoutTimelineDbFallbackDescription: "当启用时,若时间线未被缓存,则将额外查询数据库。禁用该功能可通过不执行回退处理进一步减少服务器负载,但会限制可检索的时间线范围。"
|
||||||
reactionsBufferingDescription: "开启时可显著提高发送回应时的性能,及减轻数据库负荷。但 Redis 的内存用量会相应增加。"
|
reactionsBufferingDescription: "开启时可显著提高发送回应时的性能,及减轻数据库负荷。但 Redis 的内存用量会相应增加。"
|
||||||
|
remoteNotesCleaning: "自动清理远程投稿"
|
||||||
|
remoteNotesCleaning_description: "启用后,将自动清理已无法找到的旧的远程投稿,可减缓数据库的增长。"
|
||||||
|
remoteNotesCleaningMaxProcessingDuration: "最长清理持续时间"
|
||||||
|
remoteNotesCleaningExpiryDaysForEachNotes: "最短帖子保留期限"
|
||||||
inquiryUrl: "联络地址"
|
inquiryUrl: "联络地址"
|
||||||
inquiryUrlDescription: "用来指定诸如向服务运营商咨询的论坛地址,或记载了运营商联系方式之类的网页地址。"
|
inquiryUrlDescription: "用来指定诸如向服务运营商咨询的论坛地址,或记载了运营商联系方式之类的网页地址。"
|
||||||
openRegistration: "开放注册"
|
openRegistration: "开放注册"
|
||||||
|
@ -1650,6 +1664,11 @@ _serverSettings:
|
||||||
userGeneratedContentsVisibilityForVisitor: "用户生成内容对非用户的可见性"
|
userGeneratedContentsVisibilityForVisitor: "用户生成内容对非用户的可见性"
|
||||||
userGeneratedContentsVisibilityForVisitor_description: "对于防止难以审核的不适当的远程内容等,通过自己的服务器无意中在互联网上公开等问题很有用。"
|
userGeneratedContentsVisibilityForVisitor_description: "对于防止难以审核的不适当的远程内容等,通过自己的服务器无意中在互联网上公开等问题很有用。"
|
||||||
userGeneratedContentsVisibilityForVisitor_description2: "包含服务器接收到的远程内容在内,无条件将服务器上的所有内容公开在互联网上存在风险。特别是对去中心化的特性不是很了解的访问者有可能将远程服务器上的内容误认为是在此服务器内生成的,需要特别留意。"
|
userGeneratedContentsVisibilityForVisitor_description2: "包含服务器接收到的远程内容在内,无条件将服务器上的所有内容公开在互联网上存在风险。特别是对去中心化的特性不是很了解的访问者有可能将远程服务器上的内容误认为是在此服务器内生成的,需要特别留意。"
|
||||||
|
restartServerSetupWizardConfirm_title: "要重新开始服务器初始设定向导吗?"
|
||||||
|
restartServerSetupWizardConfirm_text: "现有的部分设定将重置。"
|
||||||
|
entrancePageStyle: "入口页面样式"
|
||||||
|
showTimelineForVisitor: "显示时间线"
|
||||||
|
showActivitiesForVisitor: "显示活动"
|
||||||
_userGeneratedContentsVisibilityForVisitor:
|
_userGeneratedContentsVisibilityForVisitor:
|
||||||
all: "全部公开"
|
all: "全部公开"
|
||||||
localOnly: "仅公开本地内容,隐藏远程内容"
|
localOnly: "仅公开本地内容,隐藏远程内容"
|
||||||
|
@ -1927,7 +1946,7 @@ _role:
|
||||||
name: "角色名称"
|
name: "角色名称"
|
||||||
description: "角色描述"
|
description: "角色描述"
|
||||||
permission: "角色权限"
|
permission: "角色权限"
|
||||||
descriptionOfPermission: "<b>监察员</b>可以执行基本地审核操作。\n<b>管理员</b>可以更改服务器的所有设置。"
|
descriptionOfPermission: "<b>监察员</b>可以执行基本的审核操作。\n<b>管理员</b>可以更改实例的所有设置。"
|
||||||
assignTarget: "授权对象"
|
assignTarget: "授权对象"
|
||||||
descriptionOfAssignTarget: "<b>手动</b>指手动选择谁被包括在这个角色中。\n<b>符合条件</b>指设置条件以自动包括符合条件的用户。"
|
descriptionOfAssignTarget: "<b>手动</b>指手动选择谁被包括在这个角色中。\n<b>符合条件</b>指设置条件以自动包括符合条件的用户。"
|
||||||
manual: "手动"
|
manual: "手动"
|
||||||
|
@ -1986,6 +2005,7 @@ _role:
|
||||||
descriptionOfRateLimitFactor: "值越小限制越少,值越大限制越多。"
|
descriptionOfRateLimitFactor: "值越小限制越少,值越大限制越多。"
|
||||||
canHideAds: "可以隐藏广告"
|
canHideAds: "可以隐藏广告"
|
||||||
canSearchNotes: "是否可以搜索帖子"
|
canSearchNotes: "是否可以搜索帖子"
|
||||||
|
canSearchUsers: "使用用户检索"
|
||||||
canUseTranslator: "使用翻译功能"
|
canUseTranslator: "使用翻译功能"
|
||||||
avatarDecorationLimit: "可添加头像挂件的最大个数"
|
avatarDecorationLimit: "可添加头像挂件的最大个数"
|
||||||
canImportAntennas: "允许导入天线"
|
canImportAntennas: "允许导入天线"
|
||||||
|
@ -2258,6 +2278,7 @@ _time:
|
||||||
minute: "分"
|
minute: "分"
|
||||||
hour: "小时"
|
hour: "小时"
|
||||||
day: "日"
|
day: "日"
|
||||||
|
month: "个月"
|
||||||
_2fa:
|
_2fa:
|
||||||
alreadyRegistered: "此设备已被注册"
|
alreadyRegistered: "此设备已被注册"
|
||||||
registerTOTP: "开始设置验证器"
|
registerTOTP: "开始设置验证器"
|
||||||
|
@ -3060,6 +3081,7 @@ _bootErrors:
|
||||||
otherOption1: "清除客户端设定与缓存"
|
otherOption1: "清除客户端设定与缓存"
|
||||||
otherOption2: "使用简易客户端"
|
otherOption2: "使用简易客户端"
|
||||||
otherOption3: "启动修复工具"
|
otherOption3: "启动修复工具"
|
||||||
|
otherOption4: "以安全模式启动 Misskey"
|
||||||
_search:
|
_search:
|
||||||
searchScopeAll: "全部"
|
searchScopeAll: "全部"
|
||||||
searchScopeLocal: "本地"
|
searchScopeLocal: "本地"
|
||||||
|
@ -3096,6 +3118,8 @@ _serverSetupWizard:
|
||||||
doYouConnectToFediverse_description1: "若加入由分散性服务器所构成的网络(Fediverse),将能与其它服务器交换内容。"
|
doYouConnectToFediverse_description1: "若加入由分散性服务器所构成的网络(Fediverse),将能与其它服务器交换内容。"
|
||||||
doYouConnectToFediverse_description2: "加入 Fediverse 在这里被称为「联合」。"
|
doYouConnectToFediverse_description2: "加入 Fediverse 在这里被称为「联合」。"
|
||||||
youCanConfigureMoreFederationSettingsLater: "可在之后进行如哪些服务器可以进行联合等高级设置。"
|
youCanConfigureMoreFederationSettingsLater: "可在之后进行如哪些服务器可以进行联合等高级设置。"
|
||||||
|
remoteContentsCleaning: "自动清理传入内容"
|
||||||
|
remoteContentsCleaning_description: "加入联合后,服务器将持续接收大量内容。打开自动清理后,将自动删除无法找到的旧内容,可节省存储空间。"
|
||||||
adminInfo: "管理员信息"
|
adminInfo: "管理员信息"
|
||||||
adminInfo_description: "设置用于接受询问的管理员信息。"
|
adminInfo_description: "设置用于接受询问的管理员信息。"
|
||||||
adminInfo_mustBeFilled: "开放服务器或开启了联合的情况下必须输入。"
|
adminInfo_mustBeFilled: "开放服务器或开启了联合的情况下必须输入。"
|
||||||
|
@ -3148,10 +3172,10 @@ _watermarkEditor:
|
||||||
type: "类型"
|
type: "类型"
|
||||||
image: "图片"
|
image: "图片"
|
||||||
advanced: "高级"
|
advanced: "高级"
|
||||||
|
angle: "角度"
|
||||||
stripe: "条纹"
|
stripe: "条纹"
|
||||||
stripeWidth: "线条宽度"
|
stripeWidth: "线条宽度"
|
||||||
stripeFrequency: "线条数量"
|
stripeFrequency: "线条数量"
|
||||||
angle: "角度"
|
|
||||||
polkadot: "波点"
|
polkadot: "波点"
|
||||||
checker: "检查"
|
checker: "检查"
|
||||||
polkadotMainDotOpacity: "主波点的不透明度"
|
polkadotMainDotOpacity: "主波点的不透明度"
|
||||||
|
@ -3163,6 +3187,7 @@ _imageEffector:
|
||||||
title: "效果"
|
title: "效果"
|
||||||
addEffect: "添加效果"
|
addEffect: "添加效果"
|
||||||
discardChangesConfirm: "丢弃当前设置并退出?"
|
discardChangesConfirm: "丢弃当前设置并退出?"
|
||||||
|
nothingToConfigure: "还没有设置"
|
||||||
_fxs:
|
_fxs:
|
||||||
chromaticAberration: "色差"
|
chromaticAberration: "色差"
|
||||||
glitch: "故障"
|
glitch: "故障"
|
||||||
|
@ -3180,6 +3205,38 @@ _imageEffector:
|
||||||
checker: "检查"
|
checker: "检查"
|
||||||
blockNoise: "块状噪点"
|
blockNoise: "块状噪点"
|
||||||
tearing: "撕裂"
|
tearing: "撕裂"
|
||||||
|
_fxProps:
|
||||||
|
angle: "角度"
|
||||||
|
scale: "大小"
|
||||||
|
size: "大小"
|
||||||
|
color: "颜色"
|
||||||
|
opacity: "不透明度"
|
||||||
|
normalize: "标准化"
|
||||||
|
amount: "数量"
|
||||||
|
lightness: "浅色"
|
||||||
|
contrast: "对比度"
|
||||||
|
hue: "色调"
|
||||||
|
brightness: "亮度"
|
||||||
|
saturation: "饱和度"
|
||||||
|
max: "最大值"
|
||||||
|
min: "最小值"
|
||||||
|
direction: "方向"
|
||||||
|
phase: "相位"
|
||||||
|
frequency: "频率"
|
||||||
|
strength: "强度"
|
||||||
|
glitchChannelShift: "错位"
|
||||||
|
seed: "种子"
|
||||||
|
redComponent: "红色成分"
|
||||||
|
greenComponent: "绿色成分"
|
||||||
|
blueComponent: "蓝色成分"
|
||||||
|
threshold: "阈值"
|
||||||
|
centerX: "中心 X "
|
||||||
|
centerY: "中心 Y"
|
||||||
|
zoomLinesSmoothing: "平滑"
|
||||||
|
zoomLinesSmoothingDescription: "平滑和集中线宽度设置不能同时使用。"
|
||||||
|
zoomLinesThreshold: "集中线宽度"
|
||||||
|
zoomLinesMaskSize: "中心直径"
|
||||||
|
zoomLinesBlack: "变成黑色"
|
||||||
drafts: "草稿"
|
drafts: "草稿"
|
||||||
_drafts:
|
_drafts:
|
||||||
select: "选择草稿"
|
select: "选择草稿"
|
||||||
|
|
|
@ -638,7 +638,7 @@ inboxUrl: "收件夾 URL"
|
||||||
addedRelays: "已加入的中繼器"
|
addedRelays: "已加入的中繼器"
|
||||||
serviceworkerInfo: "如要使用推播通知,需要啟用此選項並設定金鑰。"
|
serviceworkerInfo: "如要使用推播通知,需要啟用此選項並設定金鑰。"
|
||||||
deletedNote: "已刪除的貼文"
|
deletedNote: "已刪除的貼文"
|
||||||
invisibleNote: "私人貼文"
|
invisibleNote: "私密的貼文"
|
||||||
enableInfiniteScroll: "啟用自動滾動頁面模式"
|
enableInfiniteScroll: "啟用自動滾動頁面模式"
|
||||||
visibility: "可見性"
|
visibility: "可見性"
|
||||||
poll: "票選活動"
|
poll: "票選活動"
|
||||||
|
@ -1054,6 +1054,7 @@ permissionDeniedError: "操作被拒絕"
|
||||||
permissionDeniedErrorDescription: "此帳戶沒有執行這個操作的權限。"
|
permissionDeniedErrorDescription: "此帳戶沒有執行這個操作的權限。"
|
||||||
preset: "預設值"
|
preset: "預設值"
|
||||||
selectFromPresets: "從預設值中選擇"
|
selectFromPresets: "從預設值中選擇"
|
||||||
|
custom: "自訂"
|
||||||
achievements: "成就"
|
achievements: "成就"
|
||||||
gotInvalidResponseError: "伺服器的回應無效"
|
gotInvalidResponseError: "伺服器的回應無效"
|
||||||
gotInvalidResponseErrorDescription: "伺服器可能已關閉或者在維護中,請稍後再試。"
|
gotInvalidResponseErrorDescription: "伺服器可能已關閉或者在維護中,請稍後再試。"
|
||||||
|
@ -1092,6 +1093,7 @@ prohibitedWordsDescription2: "空格代表「以及」(AND),斜線包圍
|
||||||
hiddenTags: "隱藏標籤"
|
hiddenTags: "隱藏標籤"
|
||||||
hiddenTagsDescription: "設定的標籤不會在趨勢中顯示,換行可以設定多個標籤。"
|
hiddenTagsDescription: "設定的標籤不會在趨勢中顯示,換行可以設定多個標籤。"
|
||||||
notesSearchNotAvailable: "無法使用搜尋貼文功能。"
|
notesSearchNotAvailable: "無法使用搜尋貼文功能。"
|
||||||
|
usersSearchNotAvailable: "無法使用使用者搜尋功能。"
|
||||||
license: "授權"
|
license: "授權"
|
||||||
unfavoriteConfirm: "要取消收錄我的最愛嗎?"
|
unfavoriteConfirm: "要取消收錄我的最愛嗎?"
|
||||||
myClips: "我的摘錄"
|
myClips: "我的摘錄"
|
||||||
|
@ -1243,7 +1245,7 @@ releaseToRefresh: "放開以更新內容"
|
||||||
refreshing: "載入更新中"
|
refreshing: "載入更新中"
|
||||||
pullDownToRefresh: "往下拉來更新內容"
|
pullDownToRefresh: "往下拉來更新內容"
|
||||||
useGroupedNotifications: "分組顯示通知訊息"
|
useGroupedNotifications: "分組顯示通知訊息"
|
||||||
signupPendingError: "驗證您的電子郵件地址時出現問題。連結可能已過期。"
|
emailVerificationFailedError: "驗證您的電子郵件地址時出現問題。連結可能已過期。"
|
||||||
cwNotationRequired: "如果開啟「隱藏內容」,則需要註解說明。"
|
cwNotationRequired: "如果開啟「隱藏內容」,則需要註解說明。"
|
||||||
doReaction: "做出反應"
|
doReaction: "做出反應"
|
||||||
code: "程式碼"
|
code: "程式碼"
|
||||||
|
@ -1368,6 +1370,13 @@ redisplayAllTips: "重新顯示所有「提示與技巧」"
|
||||||
hideAllTips: "隱藏所有「提示與技巧」"
|
hideAllTips: "隱藏所有「提示與技巧」"
|
||||||
defaultImageCompressionLevel: "預設的影像壓縮程度"
|
defaultImageCompressionLevel: "預設的影像壓縮程度"
|
||||||
defaultImageCompressionLevel_description: "低的話可以保留畫質,但是會增加檔案的大小。<br>高的話可以減少檔案大小,但是會降低畫質。"
|
defaultImageCompressionLevel_description: "低的話可以保留畫質,但是會增加檔案的大小。<br>高的話可以減少檔案大小,但是會降低畫質。"
|
||||||
|
inMinutes: "分鐘"
|
||||||
|
inDays: "日"
|
||||||
|
safeModeEnabled: "啟用安全模式"
|
||||||
|
pluginsAreDisabledBecauseSafeMode: "由於啟用安全模式,所有的外掛都被停用。"
|
||||||
|
customCssIsDisabledBecauseSafeMode: "由於啟用安全模式,所有的客製 CSS 都被停用。"
|
||||||
|
themeIsDefaultBecauseSafeMode: "在安全模式啟用期間將使用預設主題。關閉安全模式後會恢復原本的設定。"
|
||||||
|
thankYouForTestingBeta: "感謝您協助驗證 beta 版!"
|
||||||
_order:
|
_order:
|
||||||
newest: "最新的在前"
|
newest: "最新的在前"
|
||||||
oldest: "最舊的在前"
|
oldest: "最舊的在前"
|
||||||
|
@ -1459,6 +1468,7 @@ _settings:
|
||||||
contentsUpdateFrequency_description2: "當即時模式開啟時,不論此設定為何,內容都會即時更新。"
|
contentsUpdateFrequency_description2: "當即時模式開啟時,不論此設定為何,內容都會即時更新。"
|
||||||
showUrlPreview: "顯示網址預覽"
|
showUrlPreview: "顯示網址預覽"
|
||||||
showAvailableReactionsFirstInNote: "將可用的反應顯示在頂部"
|
showAvailableReactionsFirstInNote: "將可用的反應顯示在頂部"
|
||||||
|
showPageTabBarBottom: "在底部顯示頁面的標籤列"
|
||||||
_chat:
|
_chat:
|
||||||
showSenderName: "顯示發送者的名稱"
|
showSenderName: "顯示發送者的名稱"
|
||||||
sendOnEnter: "按下 Enter 發送訊息"
|
sendOnEnter: "按下 Enter 發送訊息"
|
||||||
|
@ -1543,7 +1553,7 @@ _initialAccountSetting:
|
||||||
theseSettingsCanEditLater: "這裡的設定可以在之後變更。"
|
theseSettingsCanEditLater: "這裡的設定可以在之後變更。"
|
||||||
youCanEditMoreSettingsInSettingsPageLater: "除此之外,還可以在「設定」頁面進行各種設定。之後請確認看看。"
|
youCanEditMoreSettingsInSettingsPageLater: "除此之外,還可以在「設定」頁面進行各種設定。之後請確認看看。"
|
||||||
followUsers: "為了構築時間軸,試著追隨您感興趣的使用者吧。"
|
followUsers: "為了構築時間軸,試著追隨您感興趣的使用者吧。"
|
||||||
pushNotificationDescription: "啟用推送通知後,就可以在裝置上接收來自{name}的通知了。"
|
pushNotificationDescription: "啟用推送通知後,就可以在裝置上接收來自 {name} 的通知了。"
|
||||||
initialAccountSettingCompleted: "初始設定完成了!"
|
initialAccountSettingCompleted: "初始設定完成了!"
|
||||||
haveFun: "盡情享受{name}吧!"
|
haveFun: "盡情享受{name}吧!"
|
||||||
youCanContinueTutorial: "您可以繼續學習如何使用{name}(Misskey),也可以就此打住,立即開始使用。"
|
youCanContinueTutorial: "您可以繼續學習如何使用{name}(Misskey),也可以就此打住,立即開始使用。"
|
||||||
|
@ -1632,6 +1642,10 @@ _serverSettings:
|
||||||
fanoutTimelineDbFallback: "資料庫的回退"
|
fanoutTimelineDbFallback: "資料庫的回退"
|
||||||
fanoutTimelineDbFallbackDescription: "若啟用,在時間軸沒有快取的情況下將執行回退處理以額外查詢資料庫。若停用,可以透過不執行回退處理來進一步減少伺服器的負荷,但會限制可取得的時間軸範圍。"
|
fanoutTimelineDbFallbackDescription: "若啟用,在時間軸沒有快取的情況下將執行回退處理以額外查詢資料庫。若停用,可以透過不執行回退處理來進一步減少伺服器的負荷,但會限制可取得的時間軸範圍。"
|
||||||
reactionsBufferingDescription: "啟用時,可以顯著提高建立反應時的效能並減少資料庫的負載。 但是,Redis 記憶體使用量會增加。"
|
reactionsBufferingDescription: "啟用時,可以顯著提高建立反應時的效能並減少資料庫的負載。 但是,Redis 記憶體使用量會增加。"
|
||||||
|
remoteNotesCleaning: "自動清除遠端發佈內容"
|
||||||
|
remoteNotesCleaning_description: "啟用後,系統會定期清理未被參照的舊遠端貼文,以抑制資料庫的膨脹。"
|
||||||
|
remoteNotesCleaningMaxProcessingDuration: "清理作業的最長持續時間"
|
||||||
|
remoteNotesCleaningExpiryDaysForEachNotes: "貼文最短保留天數"
|
||||||
inquiryUrl: "聯絡表單網址"
|
inquiryUrl: "聯絡表單網址"
|
||||||
inquiryUrlDescription: "指定伺服器運營者的聯絡表單網址,或包含運營者聯絡資訊網頁的網址。"
|
inquiryUrlDescription: "指定伺服器運營者的聯絡表單網址,或包含運營者聯絡資訊網頁的網址。"
|
||||||
openRegistration: "允許建立帳戶"
|
openRegistration: "允許建立帳戶"
|
||||||
|
@ -1650,6 +1664,11 @@ _serverSettings:
|
||||||
userGeneratedContentsVisibilityForVisitor: "使用者建立的內容對訪客的公開範圍"
|
userGeneratedContentsVisibilityForVisitor: "使用者建立的內容對訪客的公開範圍"
|
||||||
userGeneratedContentsVisibilityForVisitor_description: "這有助於防止一些問題的發生,例如未經適當審核的不適當遠端內容無意中透過您自己的伺服器發佈到網際網路上。"
|
userGeneratedContentsVisibilityForVisitor_description: "這有助於防止一些問題的發生,例如未經適當審核的不適當遠端內容無意中透過您自己的伺服器發佈到網際網路上。"
|
||||||
userGeneratedContentsVisibilityForVisitor_description2: "包括伺服器接收到的遠端內容在內,無條件地將伺服器內所有內容公開到網際網路上是具有風險的。特別是對於不了解分散式架構特性的瀏覽者來說,他們可能會誤以為這些遠端內容是由該伺服器所創建的,因此需要特別留意。"
|
userGeneratedContentsVisibilityForVisitor_description2: "包括伺服器接收到的遠端內容在內,無條件地將伺服器內所有內容公開到網際網路上是具有風險的。特別是對於不了解分散式架構特性的瀏覽者來說,他們可能會誤以為這些遠端內容是由該伺服器所創建的,因此需要特別留意。"
|
||||||
|
restartServerSetupWizardConfirm_title: "要重新執行伺服器的初始設定精靈嗎?"
|
||||||
|
restartServerSetupWizardConfirm_text: "當前的部分設定將會被重設。"
|
||||||
|
entrancePageStyle: "入口頁面的樣式"
|
||||||
|
showTimelineForVisitor: "顯示時間軸"
|
||||||
|
showActivitiesForVisitor: "顯示活動"
|
||||||
_userGeneratedContentsVisibilityForVisitor:
|
_userGeneratedContentsVisibilityForVisitor:
|
||||||
all: "全部公開\n"
|
all: "全部公開\n"
|
||||||
localOnly: "僅公開本地內容,遠端內容則不公開\n"
|
localOnly: "僅公開本地內容,遠端內容則不公開\n"
|
||||||
|
@ -1986,6 +2005,7 @@ _role:
|
||||||
descriptionOfRateLimitFactor: "值越小限制越少,值越大限制越多。"
|
descriptionOfRateLimitFactor: "值越小限制越少,值越大限制越多。"
|
||||||
canHideAds: "不顯示廣告"
|
canHideAds: "不顯示廣告"
|
||||||
canSearchNotes: "可否搜尋貼文"
|
canSearchNotes: "可否搜尋貼文"
|
||||||
|
canSearchUsers: "可使用使用者搜尋功能"
|
||||||
canUseTranslator: "使用翻譯功能"
|
canUseTranslator: "使用翻譯功能"
|
||||||
avatarDecorationLimit: "頭像可掛上的最大裝飾數量"
|
avatarDecorationLimit: "頭像可掛上的最大裝飾數量"
|
||||||
canImportAntennas: "允許匯入天線"
|
canImportAntennas: "允許匯入天線"
|
||||||
|
@ -2258,6 +2278,7 @@ _time:
|
||||||
minute: "分鐘"
|
minute: "分鐘"
|
||||||
hour: "小時"
|
hour: "小時"
|
||||||
day: "日"
|
day: "日"
|
||||||
|
month: "個月"
|
||||||
_2fa:
|
_2fa:
|
||||||
alreadyRegistered: "此裝置已被註冊過了"
|
alreadyRegistered: "此裝置已被註冊過了"
|
||||||
registerTOTP: "開始設定驗證應用程式"
|
registerTOTP: "開始設定驗證應用程式"
|
||||||
|
@ -3060,6 +3081,7 @@ _bootErrors:
|
||||||
otherOption1: "刪除用戶端設定和快取"
|
otherOption1: "刪除用戶端設定和快取"
|
||||||
otherOption2: "啟動簡易用戶端"
|
otherOption2: "啟動簡易用戶端"
|
||||||
otherOption3: "啟動修復工具"
|
otherOption3: "啟動修復工具"
|
||||||
|
otherOption4: "以安全模式啟動 Misskey"
|
||||||
_search:
|
_search:
|
||||||
searchScopeAll: "全部"
|
searchScopeAll: "全部"
|
||||||
searchScopeLocal: "本地"
|
searchScopeLocal: "本地"
|
||||||
|
@ -3096,6 +3118,8 @@ _serverSetupWizard:
|
||||||
doYouConnectToFediverse_description1: "連接到由分散型伺服器構成的網絡(聯邦宇宙)後,您可以與其他伺服器進行內容的互相交流。\n"
|
doYouConnectToFediverse_description1: "連接到由分散型伺服器構成的網絡(聯邦宇宙)後,您可以與其他伺服器進行內容的互相交流。\n"
|
||||||
doYouConnectToFediverse_description2: "連接到聯邦宇宙被稱為「聯邦」。\n"
|
doYouConnectToFediverse_description2: "連接到聯邦宇宙被稱為「聯邦」。\n"
|
||||||
youCanConfigureMoreFederationSettingsLater: "您可以在稍後進行更高級的設定,例如指定可以聯繫的伺服器等。\n"
|
youCanConfigureMoreFederationSettingsLater: "您可以在稍後進行更高級的設定,例如指定可以聯繫的伺服器等。\n"
|
||||||
|
remoteContentsCleaning: "自動清理接收的內容"
|
||||||
|
remoteContentsCleaning_description: "進行聯邦後,會持續接收大量內容。啟用自動清理功能後,系統會自動從伺服器中刪除未被參照的過時內容,以節省儲存空間。"
|
||||||
adminInfo: "管理員資訊"
|
adminInfo: "管理員資訊"
|
||||||
adminInfo_description: "設定用於接收查詢的管理者資訊。\n"
|
adminInfo_description: "設定用於接收查詢的管理者資訊。\n"
|
||||||
adminInfo_mustBeFilled: "當設置為開放伺服器或啟用聯邦時,必須填寫此資訊。\n"
|
adminInfo_mustBeFilled: "當設置為開放伺服器或啟用聯邦時,必須填寫此資訊。\n"
|
||||||
|
@ -3148,10 +3172,10 @@ _watermarkEditor:
|
||||||
type: "類型"
|
type: "類型"
|
||||||
image: "圖片"
|
image: "圖片"
|
||||||
advanced: "進階"
|
advanced: "進階"
|
||||||
|
angle: "角度"
|
||||||
stripe: "條紋"
|
stripe: "條紋"
|
||||||
stripeWidth: "線條寬度"
|
stripeWidth: "線條寬度"
|
||||||
stripeFrequency: "線條數量"
|
stripeFrequency: "線條數量"
|
||||||
angle: "角度"
|
|
||||||
polkadot: "波卡圓點"
|
polkadot: "波卡圓點"
|
||||||
checker: "棋盤格"
|
checker: "棋盤格"
|
||||||
polkadotMainDotOpacity: "主圓點的不透明度"
|
polkadotMainDotOpacity: "主圓點的不透明度"
|
||||||
|
@ -3163,6 +3187,7 @@ _imageEffector:
|
||||||
title: "特效"
|
title: "特效"
|
||||||
addEffect: "新增特效"
|
addEffect: "新增特效"
|
||||||
discardChangesConfirm: "捨棄更改並退出嗎?"
|
discardChangesConfirm: "捨棄更改並退出嗎?"
|
||||||
|
nothingToConfigure: "無可設定的項目"
|
||||||
_fxs:
|
_fxs:
|
||||||
chromaticAberration: "色差"
|
chromaticAberration: "色差"
|
||||||
glitch: "異常雜訊效果"
|
glitch: "異常雜訊效果"
|
||||||
|
@ -3180,6 +3205,38 @@ _imageEffector:
|
||||||
checker: "棋盤格"
|
checker: "棋盤格"
|
||||||
blockNoise: "阻擋雜訊"
|
blockNoise: "阻擋雜訊"
|
||||||
tearing: "撕裂"
|
tearing: "撕裂"
|
||||||
|
_fxProps:
|
||||||
|
angle: "角度"
|
||||||
|
scale: "大小"
|
||||||
|
size: "大小"
|
||||||
|
color: "顏色"
|
||||||
|
opacity: "透明度"
|
||||||
|
normalize: "正規化"
|
||||||
|
amount: "數量"
|
||||||
|
lightness: "亮度"
|
||||||
|
contrast: "對比度"
|
||||||
|
hue: "色相"
|
||||||
|
brightness: "亮度"
|
||||||
|
saturation: "彩度"
|
||||||
|
max: "最大值"
|
||||||
|
min: "最小值"
|
||||||
|
direction: "方向"
|
||||||
|
phase: "相位"
|
||||||
|
frequency: "頻率"
|
||||||
|
strength: "強度"
|
||||||
|
glitchChannelShift: "偏移"
|
||||||
|
seed: "種子值"
|
||||||
|
redComponent: "紅色成分"
|
||||||
|
greenComponent: "綠色成分"
|
||||||
|
blueComponent: "青色成分"
|
||||||
|
threshold: "閾值"
|
||||||
|
centerX: "X中心座標"
|
||||||
|
centerY: "Y中心座標"
|
||||||
|
zoomLinesSmoothing: "平滑化"
|
||||||
|
zoomLinesSmoothingDescription: "平滑化與集中線寬度設定不能同時使用。"
|
||||||
|
zoomLinesThreshold: "集中線的寬度"
|
||||||
|
zoomLinesMaskSize: "中心直徑"
|
||||||
|
zoomLinesBlack: "變成黑色"
|
||||||
drafts: "草稿\n"
|
drafts: "草稿\n"
|
||||||
_drafts:
|
_drafts:
|
||||||
select: "選擇草槁"
|
select: "選擇草槁"
|
||||||
|
|
26
package.json
26
package.json
|
@ -1,12 +1,12 @@
|
||||||
{
|
{
|
||||||
"name": "misskey",
|
"name": "misskey",
|
||||||
"version": "2025.8.0-alpha.0",
|
"version": "2025.9.0-alpha.2",
|
||||||
"codename": "nasubi",
|
"codename": "nasubi",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/misskey-dev/misskey.git"
|
"url": "https://github.com/misskey-dev/misskey.git"
|
||||||
},
|
},
|
||||||
"packageManager": "pnpm@10.13.1",
|
"packageManager": "pnpm@10.15.0",
|
||||||
"workspaces": [
|
"workspaces": [
|
||||||
"packages/frontend-shared",
|
"packages/frontend-shared",
|
||||||
"packages/frontend",
|
"packages/frontend",
|
||||||
|
@ -27,6 +27,7 @@
|
||||||
"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",
|
"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": "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:test": "ncp ./.github/misskey/test.yml ./.config/test.yml && cd packages/backend && cross-env NODE_ENV=test node ./built/boot/entry.js",
|
||||||
|
"cli": "cd packages/backend && pnpm cli",
|
||||||
"init": "pnpm migrate",
|
"init": "pnpm migrate",
|
||||||
"migrate": "cd packages/backend && pnpm migrate",
|
"migrate": "cd packages/backend && pnpm migrate",
|
||||||
"revert": "cd packages/backend && pnpm revert",
|
"revert": "cd packages/backend && pnpm revert",
|
||||||
|
@ -52,8 +53,8 @@
|
||||||
"lodash": "4.17.21"
|
"lodash": "4.17.21"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"cssnano": "7.1.0",
|
"cssnano": "7.1.1",
|
||||||
"esbuild": "0.25.6",
|
"esbuild": "0.25.9",
|
||||||
"execa": "9.6.0",
|
"execa": "9.6.0",
|
||||||
"fast-glob": "3.3.3",
|
"fast-glob": "3.3.3",
|
||||||
"glob": "11.0.3",
|
"glob": "11.0.3",
|
||||||
|
@ -62,20 +63,21 @@
|
||||||
"postcss": "8.5.6",
|
"postcss": "8.5.6",
|
||||||
"tar": "7.4.3",
|
"tar": "7.4.3",
|
||||||
"terser": "5.43.1",
|
"terser": "5.43.1",
|
||||||
"typescript": "5.8.3"
|
"typescript": "5.9.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@misskey-dev/eslint-plugin": "2.1.0",
|
"@misskey-dev/eslint-plugin": "2.1.0",
|
||||||
"@types/node": "22.16.4",
|
"@types/js-yaml": "4.0.9",
|
||||||
"@typescript-eslint/eslint-plugin": "8.37.0",
|
"@types/node": "22.17.2",
|
||||||
"@typescript-eslint/parser": "8.37.0",
|
"@typescript-eslint/eslint-plugin": "8.40.0",
|
||||||
|
"@typescript-eslint/parser": "8.40.0",
|
||||||
"cross-env": "7.0.3",
|
"cross-env": "7.0.3",
|
||||||
"cypress": "14.5.2",
|
"cypress": "14.5.4",
|
||||||
"eslint": "9.31.0",
|
"eslint": "9.34.0",
|
||||||
"globals": "16.3.0",
|
"globals": "16.3.0",
|
||||||
"ncp": "2.0.0",
|
"ncp": "2.0.0",
|
||||||
"pnpm": "10.13.1",
|
"pnpm": "10.15.0",
|
||||||
"start-server-and-test": "2.0.12"
|
"start-server-and-test": "2.0.13"
|
||||||
},
|
},
|
||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
"@tensorflow/tfjs-core": "4.22.0"
|
"@tensorflow/tfjs-core": "4.22.0"
|
||||||
|
|
|
@ -7,7 +7,7 @@ export class RemoteNotesCleaning1753863104203 {
|
||||||
name = 'RemoteNotesCleaning1753863104203'
|
name = 'RemoteNotesCleaning1753863104203'
|
||||||
|
|
||||||
async up(queryRunner) {
|
async up(queryRunner) {
|
||||||
await queryRunner.query(`ALTER TABLE "meta" ADD "enableRemoteNotesCleaning" boolean NOT NULL DEFAULT true`);
|
await queryRunner.query(`ALTER TABLE "meta" ADD "enableRemoteNotesCleaning" boolean NOT NULL DEFAULT false`);
|
||||||
await queryRunner.query('ALTER TABLE "meta" ADD "remoteNotesCleaningMaxProcessingDurationInMinutes" integer NOT NULL DEFAULT \'60\'');
|
await queryRunner.query('ALTER TABLE "meta" ADD "remoteNotesCleaningMaxProcessingDurationInMinutes" integer NOT NULL DEFAULT \'60\'');
|
||||||
await queryRunner.query('ALTER TABLE "meta" ADD "remoteNotesCleaningExpiryDaysForEachNotes" integer NOT NULL DEFAULT \'90\'');
|
await queryRunner.query('ALTER TABLE "meta" ADD "remoteNotesCleaningExpiryDaysForEachNotes" integer NOT NULL DEFAULT \'90\'');
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||||
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
*/
|
||||||
|
|
||||||
|
export class TweakDefaultFederationSettings1754019326356 {
|
||||||
|
name = 'TweakDefaultFederationSettings1754019326356'
|
||||||
|
|
||||||
|
async up(queryRunner) {
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" ALTER COLUMN "federation" SET DEFAULT 'none'`);
|
||||||
|
}
|
||||||
|
|
||||||
|
async down(queryRunner) {
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" ALTER COLUMN "federation" SET DEFAULT 'all'`);
|
||||||
|
}
|
||||||
|
}
|
58
packages/backend/migration/1755168347001-PageCountInNote.js
Normal file
58
packages/backend/migration/1755168347001-PageCountInNote.js
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||||
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
*/
|
||||||
|
|
||||||
|
export class PageCountInNote1755168347001 {
|
||||||
|
name = 'PageCountInNote1755168347001'
|
||||||
|
|
||||||
|
async up(queryRunner) {
|
||||||
|
await queryRunner.query(`ALTER TABLE "note" ADD "pageCount" smallint NOT NULL DEFAULT '0'`);
|
||||||
|
|
||||||
|
// Update existing notes
|
||||||
|
// block_list CTE collects all page blocks on the pages including child blocks in the section blocks.
|
||||||
|
// The clipped_notes CTE counts how many distinct pages each note block is referenced in.
|
||||||
|
// Finally, we update the note table with the count of pages for each referenced note.
|
||||||
|
await queryRunner.query(`
|
||||||
|
WITH RECURSIVE block_list AS (
|
||||||
|
(
|
||||||
|
SELECT
|
||||||
|
page.id as page_id,
|
||||||
|
block as block
|
||||||
|
FROM page
|
||||||
|
CROSS JOIN LATERAL jsonb_array_elements(page.content) block
|
||||||
|
WHERE block->>'type' = 'note' OR block->>'type' = 'section'
|
||||||
|
)
|
||||||
|
UNION ALL
|
||||||
|
(
|
||||||
|
SELECT
|
||||||
|
block_list.page_id,
|
||||||
|
child_block AS block
|
||||||
|
FROM LATERAL (
|
||||||
|
SELECT page_id, block
|
||||||
|
FROM block_list
|
||||||
|
WHERE block_list.block->>'type' = 'section'
|
||||||
|
) block_list
|
||||||
|
CROSS JOIN LATERAL jsonb_array_elements(block_list.block->'children') child_block
|
||||||
|
WHERE child_block->>'type' = 'note' OR child_block->>'type' = 'section'
|
||||||
|
)
|
||||||
|
),
|
||||||
|
clipped_notes AS (
|
||||||
|
SELECT
|
||||||
|
(block->>'note') AS note_id,
|
||||||
|
COUNT(distinct block_list.page_id) AS count
|
||||||
|
FROM block_list
|
||||||
|
WHERE block_list.block->>'type' = 'note'
|
||||||
|
GROUP BY block->>'note'
|
||||||
|
)
|
||||||
|
UPDATE note
|
||||||
|
SET "pageCount" = clipped_notes.count
|
||||||
|
FROM clipped_notes
|
||||||
|
WHERE note.id = clipped_notes.note_id;
|
||||||
|
`);
|
||||||
|
}
|
||||||
|
|
||||||
|
async down(queryRunner) {
|
||||||
|
await queryRunner.query(`ALTER TABLE "note" DROP COLUMN "pageCount"`);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||||
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
*/
|
||||||
|
|
||||||
|
export class EntrancePageStyle1755574887486 {
|
||||||
|
name = 'EntrancePageStyle1755574887486'
|
||||||
|
|
||||||
|
async up(queryRunner) {
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" ADD "clientOptions" jsonb NOT NULL DEFAULT '{}'`);
|
||||||
|
}
|
||||||
|
|
||||||
|
async down(queryRunner) {
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "clientOptions"`);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||||
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
*/
|
||||||
|
|
||||||
|
export class NonCascadingPageEyeCatching1756062689648 {
|
||||||
|
name = 'NonCascadingPageEyeCatching1756062689648'
|
||||||
|
|
||||||
|
async up(queryRunner) {
|
||||||
|
await queryRunner.query(`ALTER TABLE "page" DROP CONSTRAINT "FK_a9ca79ad939bf06066b81c9d3aa"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "page" ADD CONSTRAINT "FK_a9ca79ad939bf06066b81c9d3aa" FOREIGN KEY ("eyeCatchingImageId") REFERENCES "drive_file"("id") ON DELETE SET NULL ON UPDATE NO ACTION`);
|
||||||
|
}
|
||||||
|
|
||||||
|
async down(queryRunner) {
|
||||||
|
await queryRunner.query(`ALTER TABLE "page" DROP CONSTRAINT "FK_a9ca79ad939bf06066b81c9d3aa"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "page" ADD CONSTRAINT "FK_a9ca79ad939bf06066b81c9d3aa" FOREIGN KEY ("eyeCatchingImageId") REFERENCES "drive_file"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
}
|
||||||
|
}
|
|
@ -11,6 +11,7 @@
|
||||||
"start:test": "cross-env NODE_ENV=test 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",
|
"migrate": "pnpm typeorm migration:run -d ormconfig.js",
|
||||||
"revert": "pnpm typeorm migration:revert -d ormconfig.js",
|
"revert": "pnpm typeorm migration:revert -d ormconfig.js",
|
||||||
|
"cli": "node ./built/boot/cli.js",
|
||||||
"check:connect": "node ./scripts/check_connect.js",
|
"check:connect": "node ./scripts/check_connect.js",
|
||||||
"build": "swc src -d built -D --strip-leading-paths",
|
"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",
|
"build:test": "swc test-server -d built-test -D --config-file test-server/.swcrc --strip-leading-paths",
|
||||||
|
@ -38,17 +39,17 @@
|
||||||
},
|
},
|
||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
"@swc/core-android-arm64": "1.3.11",
|
"@swc/core-android-arm64": "1.3.11",
|
||||||
"@swc/core-darwin-arm64": "1.12.0",
|
"@swc/core-darwin-arm64": "1.13.4",
|
||||||
"@swc/core-darwin-x64": "1.12.0",
|
"@swc/core-darwin-x64": "1.13.4",
|
||||||
"@swc/core-freebsd-x64": "1.3.11",
|
"@swc/core-freebsd-x64": "1.3.11",
|
||||||
"@swc/core-linux-arm-gnueabihf": "1.12.0",
|
"@swc/core-linux-arm-gnueabihf": "1.13.4",
|
||||||
"@swc/core-linux-arm64-gnu": "1.12.0",
|
"@swc/core-linux-arm64-gnu": "1.13.4",
|
||||||
"@swc/core-linux-arm64-musl": "1.12.0",
|
"@swc/core-linux-arm64-musl": "1.13.4",
|
||||||
"@swc/core-linux-x64-gnu": "1.12.0",
|
"@swc/core-linux-x64-gnu": "1.13.4",
|
||||||
"@swc/core-linux-x64-musl": "1.12.0",
|
"@swc/core-linux-x64-musl": "1.13.4",
|
||||||
"@swc/core-win32-arm64-msvc": "1.12.0",
|
"@swc/core-win32-arm64-msvc": "1.13.4",
|
||||||
"@swc/core-win32-ia32-msvc": "1.12.0",
|
"@swc/core-win32-ia32-msvc": "1.13.4",
|
||||||
"@swc/core-win32-x64-msvc": "1.12.0",
|
"@swc/core-win32-x64-msvc": "1.13.4",
|
||||||
"@tensorflow/tfjs": "4.22.0",
|
"@tensorflow/tfjs": "4.22.0",
|
||||||
"@tensorflow/tfjs-node": "4.22.0",
|
"@tensorflow/tfjs-node": "4.22.0",
|
||||||
"bufferutil": "4.0.9",
|
"bufferutil": "4.0.9",
|
||||||
|
@ -68,9 +69,9 @@
|
||||||
"utf-8-validate": "6.0.5"
|
"utf-8-validate": "6.0.5"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@aws-sdk/client-s3": "3.826.0",
|
"@aws-sdk/client-s3": "3.873.0",
|
||||||
"@aws-sdk/lib-storage": "3.826.0",
|
"@aws-sdk/lib-storage": "3.873.0",
|
||||||
"@discordapp/twemoji": "15.1.0",
|
"@discordapp/twemoji": "16.0.1",
|
||||||
"@fastify/accepts": "5.0.2",
|
"@fastify/accepts": "5.0.2",
|
||||||
"@fastify/cookie": "11.0.2",
|
"@fastify/cookie": "11.0.2",
|
||||||
"@fastify/cors": "10.1.0",
|
"@fastify/cors": "10.1.0",
|
||||||
|
@ -80,20 +81,20 @@
|
||||||
"@fastify/static": "8.2.0",
|
"@fastify/static": "8.2.0",
|
||||||
"@fastify/view": "10.0.2",
|
"@fastify/view": "10.0.2",
|
||||||
"@misskey-dev/sharp-read-bmp": "1.2.0",
|
"@misskey-dev/sharp-read-bmp": "1.2.0",
|
||||||
"@misskey-dev/summaly": "5.2.1",
|
"@misskey-dev/summaly": "5.2.3",
|
||||||
"@napi-rs/canvas": "0.1.71",
|
"@napi-rs/canvas": "0.1.77",
|
||||||
"@nestjs/common": "11.1.3",
|
"@nestjs/common": "11.1.6",
|
||||||
"@nestjs/core": "11.1.3",
|
"@nestjs/core": "11.1.6",
|
||||||
"@nestjs/testing": "11.1.3",
|
"@nestjs/testing": "11.1.6",
|
||||||
"@peertube/http-signature": "1.7.0",
|
"@peertube/http-signature": "1.7.0",
|
||||||
"@sentry/node": "8.55.0",
|
"@sentry/node": "8.55.0",
|
||||||
"@sentry/profiling-node": "8.55.0",
|
"@sentry/profiling-node": "8.55.0",
|
||||||
"@simplewebauthn/server": "12.0.0",
|
"@simplewebauthn/server": "12.0.0",
|
||||||
"@sinonjs/fake-timers": "11.3.1",
|
"@sinonjs/fake-timers": "11.3.1",
|
||||||
"@smithy/node-http-handler": "2.5.0",
|
"@smithy/node-http-handler": "2.5.0",
|
||||||
"@swc/cli": "0.7.7",
|
"@swc/cli": "0.7.8",
|
||||||
"@swc/core": "1.12.0",
|
"@swc/core": "1.13.4",
|
||||||
"@twemoji/parser": "15.1.1",
|
"@twemoji/parser": "16.0.0",
|
||||||
"@types/redis-info": "3.0.3",
|
"@types/redis-info": "3.0.3",
|
||||||
"accepts": "1.3.8",
|
"accepts": "1.3.8",
|
||||||
"ajv": "8.17.1",
|
"ajv": "8.17.1",
|
||||||
|
@ -102,10 +103,10 @@
|
||||||
"bcryptjs": "2.4.3",
|
"bcryptjs": "2.4.3",
|
||||||
"blurhash": "2.0.5",
|
"blurhash": "2.0.5",
|
||||||
"body-parser": "1.20.3",
|
"body-parser": "1.20.3",
|
||||||
"bullmq": "5.53.2",
|
"bullmq": "5.58.1",
|
||||||
"cacheable-lookup": "7.0.0",
|
"cacheable-lookup": "7.0.0",
|
||||||
"cbor": "9.0.2",
|
"cbor": "9.0.2",
|
||||||
"chalk": "5.4.1",
|
"chalk": "5.6.0",
|
||||||
"chalk-template": "1.1.0",
|
"chalk-template": "1.1.0",
|
||||||
"chokidar": "4.0.3",
|
"chokidar": "4.0.3",
|
||||||
"cli-highlight": "2.1.11",
|
"cli-highlight": "2.1.11",
|
||||||
|
@ -113,18 +114,18 @@
|
||||||
"content-disposition": "0.5.4",
|
"content-disposition": "0.5.4",
|
||||||
"date-fns": "2.30.0",
|
"date-fns": "2.30.0",
|
||||||
"deep-email-validator": "0.1.21",
|
"deep-email-validator": "0.1.21",
|
||||||
"fastify": "5.3.3",
|
"fastify": "5.5.0",
|
||||||
"fastify-raw-body": "5.0.0",
|
"fastify-raw-body": "5.0.0",
|
||||||
"feed": "4.2.2",
|
"feed": "4.2.2",
|
||||||
"file-type": "19.6.0",
|
"file-type": "19.6.0",
|
||||||
"fluent-ffmpeg": "2.1.3",
|
"fluent-ffmpeg": "2.1.3",
|
||||||
"form-data": "4.0.3",
|
"form-data": "4.0.4",
|
||||||
"got": "14.4.7",
|
"got": "14.4.7",
|
||||||
"happy-dom": "16.8.1",
|
"happy-dom": "16.8.1",
|
||||||
"hpagent": "1.2.0",
|
"hpagent": "1.2.0",
|
||||||
"htmlescape": "1.1.1",
|
"htmlescape": "1.1.1",
|
||||||
"http-link-header": "1.1.3",
|
"http-link-header": "1.1.3",
|
||||||
"ioredis": "5.6.1",
|
"ioredis": "5.7.0",
|
||||||
"ip-cidr": "4.0.2",
|
"ip-cidr": "4.0.2",
|
||||||
"ipaddr.js": "2.2.0",
|
"ipaddr.js": "2.2.0",
|
||||||
"is-svg": "5.1.0",
|
"is-svg": "5.1.0",
|
||||||
|
@ -134,9 +135,9 @@
|
||||||
"jsonld": "8.3.3",
|
"jsonld": "8.3.3",
|
||||||
"jsrsasign": "11.1.0",
|
"jsrsasign": "11.1.0",
|
||||||
"juice": "11.0.1",
|
"juice": "11.0.1",
|
||||||
"meilisearch": "0.51.0",
|
"meilisearch": "0.52.0",
|
||||||
"mfm-js": "0.24.0",
|
"mfm-js": "0.25.0",
|
||||||
"microformats-parser": "2.0.3",
|
"microformats-parser": "2.0.4",
|
||||||
"mime-types": "2.1.35",
|
"mime-types": "2.1.35",
|
||||||
"misskey-js": "workspace:*",
|
"misskey-js": "workspace:*",
|
||||||
"misskey-reversi": "workspace:*",
|
"misskey-reversi": "workspace:*",
|
||||||
|
@ -150,9 +151,9 @@
|
||||||
"oauth2orize": "1.12.0",
|
"oauth2orize": "1.12.0",
|
||||||
"oauth2orize-pkce": "0.1.2",
|
"oauth2orize-pkce": "0.1.2",
|
||||||
"os-utils": "0.0.14",
|
"os-utils": "0.0.14",
|
||||||
"otpauth": "9.4.0",
|
"otpauth": "9.4.1",
|
||||||
"parse5": "7.3.0",
|
"parse5": "7.3.0",
|
||||||
"pg": "8.16.0",
|
"pg": "8.16.3",
|
||||||
"pkce-challenge": "4.1.0",
|
"pkce-challenge": "4.1.0",
|
||||||
"probe-image-size": "7.2.3",
|
"probe-image-size": "7.2.3",
|
||||||
"promise-limit": "2.7.0",
|
"promise-limit": "2.7.0",
|
||||||
|
@ -174,25 +175,25 @@
|
||||||
"slacc": "0.0.10",
|
"slacc": "0.0.10",
|
||||||
"strict-event-emitter-types": "2.0.0",
|
"strict-event-emitter-types": "2.0.0",
|
||||||
"stringz": "2.1.0",
|
"stringz": "2.1.0",
|
||||||
"systeminformation": "5.27.1",
|
"systeminformation": "5.27.7",
|
||||||
"tinycolor2": "1.6.0",
|
"tinycolor2": "1.6.0",
|
||||||
"tmp": "0.2.3",
|
"tmp": "0.2.5",
|
||||||
"tsc-alias": "1.8.16",
|
"tsc-alias": "1.8.16",
|
||||||
"tsconfig-paths": "4.2.0",
|
"tsconfig-paths": "4.2.0",
|
||||||
"typeorm": "0.3.24",
|
"typeorm": "0.3.26",
|
||||||
"typescript": "5.8.3",
|
"typescript": "5.9.2",
|
||||||
"ulid": "2.4.0",
|
"ulid": "2.4.0",
|
||||||
"vary": "1.1.2",
|
"vary": "1.1.2",
|
||||||
"web-push": "3.6.7",
|
"web-push": "3.6.7",
|
||||||
"ws": "8.18.2",
|
"ws": "8.18.3",
|
||||||
"xev": "3.0.2"
|
"xev": "3.0.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@jest/globals": "29.7.0",
|
"@jest/globals": "29.7.0",
|
||||||
"@nestjs/platform-express": "10.4.19",
|
"@nestjs/platform-express": "10.4.20",
|
||||||
"@sentry/vue": "9.28.0",
|
"@sentry/vue": "9.46.0",
|
||||||
"@simplewebauthn/types": "12.0.0",
|
"@simplewebauthn/types": "12.0.0",
|
||||||
"@swc/jest": "0.2.38",
|
"@swc/jest": "0.2.39",
|
||||||
"@types/accepts": "1.3.7",
|
"@types/accepts": "1.3.7",
|
||||||
"@types/archiver": "6.0.3",
|
"@types/archiver": "6.0.3",
|
||||||
"@types/bcryptjs": "2.4.6",
|
"@types/bcryptjs": "2.4.6",
|
||||||
|
@ -209,12 +210,12 @@
|
||||||
"@types/jsrsasign": "10.5.15",
|
"@types/jsrsasign": "10.5.15",
|
||||||
"@types/mime-types": "2.1.4",
|
"@types/mime-types": "2.1.4",
|
||||||
"@types/ms": "0.7.34",
|
"@types/ms": "0.7.34",
|
||||||
"@types/node": "22.15.31",
|
"@types/node": "22.17.2",
|
||||||
"@types/nodemailer": "6.4.17",
|
"@types/nodemailer": "6.4.19",
|
||||||
"@types/oauth": "0.9.6",
|
"@types/oauth": "0.9.6",
|
||||||
"@types/oauth2orize": "1.11.5",
|
"@types/oauth2orize": "1.11.5",
|
||||||
"@types/oauth2orize-pkce": "0.1.2",
|
"@types/oauth2orize-pkce": "0.1.2",
|
||||||
"@types/pg": "8.15.4",
|
"@types/pg": "8.15.5",
|
||||||
"@types/pug": "2.0.10",
|
"@types/pug": "2.0.10",
|
||||||
"@types/qrcode": "1.5.5",
|
"@types/qrcode": "1.5.5",
|
||||||
"@types/random-seed": "0.3.5",
|
"@types/random-seed": "0.3.5",
|
||||||
|
@ -230,11 +231,11 @@
|
||||||
"@types/vary": "1.1.3",
|
"@types/vary": "1.1.3",
|
||||||
"@types/web-push": "3.6.4",
|
"@types/web-push": "3.6.4",
|
||||||
"@types/ws": "8.18.1",
|
"@types/ws": "8.18.1",
|
||||||
"@typescript-eslint/eslint-plugin": "8.34.0",
|
"@typescript-eslint/eslint-plugin": "8.40.0",
|
||||||
"@typescript-eslint/parser": "8.34.0",
|
"@typescript-eslint/parser": "8.40.0",
|
||||||
"aws-sdk-client-mock": "4.1.0",
|
"aws-sdk-client-mock": "4.1.0",
|
||||||
"cross-env": "7.0.3",
|
"cross-env": "7.0.3",
|
||||||
"eslint-plugin-import": "2.31.0",
|
"eslint-plugin-import": "2.32.0",
|
||||||
"execa": "8.0.1",
|
"execa": "8.0.1",
|
||||||
"fkill": "9.0.0",
|
"fkill": "9.0.0",
|
||||||
"jest": "29.7.0",
|
"jest": "29.7.0",
|
||||||
|
@ -242,6 +243,6 @@
|
||||||
"nodemon": "3.1.10",
|
"nodemon": "3.1.10",
|
||||||
"pid-port": "1.0.2",
|
"pid-port": "1.0.2",
|
||||||
"simple-oauth2": "5.1.0",
|
"simple-oauth2": "5.1.0",
|
||||||
"supertest": "7.1.1"
|
"supertest": "7.1.4"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,7 +42,7 @@ async function killProc() {
|
||||||
'./node_modules/nodemon/bin/nodemon.js',
|
'./node_modules/nodemon/bin/nodemon.js',
|
||||||
[
|
[
|
||||||
'-w', 'src',
|
'-w', 'src',
|
||||||
'-e', 'ts,js,mjs,cjs,json',
|
'-e', 'ts,js,mjs,cjs,json,pug',
|
||||||
'--exec', 'pnpm', 'run', 'build',
|
'--exec', 'pnpm', 'run', 'build',
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
|
|
49
packages/backend/src/boot/cli.ts
Normal file
49
packages/backend/src/boot/cli.ts
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||||
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
*/
|
||||||
|
|
||||||
|
import 'reflect-metadata';
|
||||||
|
import { EventEmitter } from 'node:events';
|
||||||
|
import { NestFactory } from '@nestjs/core';
|
||||||
|
import { CommandModule } from '@/cli/CommandModule.js';
|
||||||
|
import { NestLogger } from '@/NestLogger.js';
|
||||||
|
import { CommandService } from '@/cli/CommandService.js';
|
||||||
|
|
||||||
|
process.title = 'Misskey Cli';
|
||||||
|
|
||||||
|
Error.stackTraceLimit = Infinity;
|
||||||
|
EventEmitter.defaultMaxListeners = 128;
|
||||||
|
|
||||||
|
const app = await NestFactory.createApplicationContext(CommandModule, {
|
||||||
|
logger: new NestLogger(),
|
||||||
|
});
|
||||||
|
|
||||||
|
const commandService = app.get(CommandService);
|
||||||
|
|
||||||
|
const command = process.argv[2] ?? 'help';
|
||||||
|
|
||||||
|
switch (command) {
|
||||||
|
case 'help': {
|
||||||
|
console.log('Available commands:');
|
||||||
|
console.log(' help - Displays this help message');
|
||||||
|
console.log(' reset-captcha - Resets the captcha');
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'ping': {
|
||||||
|
await commandService.ping();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'reset-captcha': {
|
||||||
|
await commandService.resetCaptcha();
|
||||||
|
console.log('Captcha has been reset.');
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
console.error(`Unrecognized command: ${command}`);
|
||||||
|
console.error('Use "help" to see available commands.');
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
process.exit(0);
|
23
packages/backend/src/cli/CommandModule.ts
Normal file
23
packages/backend/src/cli/CommandModule.ts
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||||
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { Module } from '@nestjs/common';
|
||||||
|
import { CoreModule } from '@/core/CoreModule.js';
|
||||||
|
import { GlobalModule } from '@/GlobalModule.js';
|
||||||
|
import { CommandService } from './CommandService.js';
|
||||||
|
|
||||||
|
@Module({
|
||||||
|
imports: [
|
||||||
|
GlobalModule,
|
||||||
|
CoreModule,
|
||||||
|
],
|
||||||
|
providers: [
|
||||||
|
CommandService,
|
||||||
|
],
|
||||||
|
exports: [
|
||||||
|
CommandService,
|
||||||
|
],
|
||||||
|
})
|
||||||
|
export class CommandModule {}
|
49
packages/backend/src/cli/CommandService.ts
Normal file
49
packages/backend/src/cli/CommandService.ts
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||||
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { Inject, Injectable } from '@nestjs/common';
|
||||||
|
import type { Config } from '@/config.js';
|
||||||
|
import { DI } from '@/di-symbols.js';
|
||||||
|
import type Logger from '@/logger.js';
|
||||||
|
import { bindThis } from '@/decorators.js';
|
||||||
|
import { MetaService } from '@/core/MetaService.js';
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class CommandService {
|
||||||
|
private logger: Logger;
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
@Inject(DI.config)
|
||||||
|
private config: Config,
|
||||||
|
|
||||||
|
private metaService: MetaService,
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@bindThis
|
||||||
|
public async ping() {
|
||||||
|
console.log('pong');
|
||||||
|
}
|
||||||
|
|
||||||
|
@bindThis
|
||||||
|
public async resetCaptcha() {
|
||||||
|
await this.metaService.update({
|
||||||
|
enableHcaptcha: false,
|
||||||
|
hcaptchaSiteKey: null,
|
||||||
|
hcaptchaSecretKey: null,
|
||||||
|
enableMcaptcha: false,
|
||||||
|
mcaptchaSitekey: null,
|
||||||
|
mcaptchaSecretKey: null,
|
||||||
|
mcaptchaInstanceUrl: null,
|
||||||
|
enableRecaptcha: false,
|
||||||
|
recaptchaSiteKey: null,
|
||||||
|
recaptchaSecretKey: null,
|
||||||
|
enableTurnstile: false,
|
||||||
|
turnstileSiteKey: null,
|
||||||
|
turnstileSecretKey: null,
|
||||||
|
enableTestcaptcha: false,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
|
@ -184,9 +184,9 @@ export type Config = {
|
||||||
authUrl: string;
|
authUrl: string;
|
||||||
driveUrl: string;
|
driveUrl: string;
|
||||||
userAgent: string;
|
userAgent: string;
|
||||||
frontendEntry: string;
|
frontendEntry: { file: string | null };
|
||||||
frontendManifestExists: boolean;
|
frontendManifestExists: boolean;
|
||||||
frontendEmbedEntry: string;
|
frontendEmbedEntry: { file: string | null };
|
||||||
frontendEmbedManifestExists: boolean;
|
frontendEmbedManifestExists: boolean;
|
||||||
mediaProxy: string;
|
mediaProxy: string;
|
||||||
externalMediaProxyEnabled: boolean;
|
externalMediaProxyEnabled: boolean;
|
||||||
|
@ -235,10 +235,10 @@ export function loadConfig(): Config {
|
||||||
const frontendEmbedManifestExists = fs.existsSync(_dirname + '/../../../built/_frontend_embed_vite_/manifest.json');
|
const frontendEmbedManifestExists = fs.existsSync(_dirname + '/../../../built/_frontend_embed_vite_/manifest.json');
|
||||||
const frontendManifest = frontendManifestExists ?
|
const frontendManifest = frontendManifestExists ?
|
||||||
JSON.parse(fs.readFileSync(`${_dirname}/../../../built/_frontend_vite_/manifest.json`, 'utf-8'))
|
JSON.parse(fs.readFileSync(`${_dirname}/../../../built/_frontend_vite_/manifest.json`, 'utf-8'))
|
||||||
: { 'src/_boot_.ts': { file: 'src/_boot_.ts' } };
|
: { 'src/_boot_.ts': { file: null } };
|
||||||
const frontendEmbedManifest = frontendEmbedManifestExists ?
|
const frontendEmbedManifest = frontendEmbedManifestExists ?
|
||||||
JSON.parse(fs.readFileSync(`${_dirname}/../../../built/_frontend_embed_vite_/manifest.json`, 'utf-8'))
|
JSON.parse(fs.readFileSync(`${_dirname}/../../../built/_frontend_embed_vite_/manifest.json`, 'utf-8'))
|
||||||
: { 'src/boot.ts': { file: 'src/boot.ts' } };
|
: { 'src/boot.ts': { file: null } };
|
||||||
|
|
||||||
const config = yaml.load(fs.readFileSync(path, 'utf-8')) as Source;
|
const config = yaml.load(fs.readFileSync(path, 'utf-8')) as Source;
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,7 @@ export class AiService {
|
||||||
}
|
}
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
public async detectSensitive(path: string): Promise<nsfw.PredictionType[] | null> {
|
public async detectSensitive(source: string | Buffer): Promise<nsfw.PredictionType[] | null> {
|
||||||
try {
|
try {
|
||||||
if (isSupportedCpu === undefined) {
|
if (isSupportedCpu === undefined) {
|
||||||
isSupportedCpu = await this.computeIsSupportedCpu();
|
isSupportedCpu = await this.computeIsSupportedCpu();
|
||||||
|
@ -51,7 +51,7 @@ export class AiService {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
const buffer = await fs.promises.readFile(path);
|
const buffer = source instanceof Buffer ? source : await fs.promises.readFile(source);
|
||||||
const image = await tf.node.decodeImage(buffer, 3) as any;
|
const image = await tf.node.decodeImage(buffer, 3) as any;
|
||||||
try {
|
try {
|
||||||
const predictions = await this.model.classify(image);
|
const predictions = await this.model.classify(image);
|
||||||
|
|
|
@ -78,6 +78,7 @@ import { ChannelFollowingService } from './ChannelFollowingService.js';
|
||||||
import { ChatService } from './ChatService.js';
|
import { ChatService } from './ChatService.js';
|
||||||
import { RegistryApiService } from './RegistryApiService.js';
|
import { RegistryApiService } from './RegistryApiService.js';
|
||||||
import { ReversiService } from './ReversiService.js';
|
import { ReversiService } from './ReversiService.js';
|
||||||
|
import { PageService } from './PageService.js';
|
||||||
|
|
||||||
import { ChartLoggerService } from './chart/ChartLoggerService.js';
|
import { ChartLoggerService } from './chart/ChartLoggerService.js';
|
||||||
import FederationChart from './chart/charts/federation.js';
|
import FederationChart from './chart/charts/federation.js';
|
||||||
|
@ -227,6 +228,7 @@ const $ChannelFollowingService: Provider = { provide: 'ChannelFollowingService',
|
||||||
const $ChatService: Provider = { provide: 'ChatService', useExisting: ChatService };
|
const $ChatService: Provider = { provide: 'ChatService', useExisting: ChatService };
|
||||||
const $RegistryApiService: Provider = { provide: 'RegistryApiService', useExisting: RegistryApiService };
|
const $RegistryApiService: Provider = { provide: 'RegistryApiService', useExisting: RegistryApiService };
|
||||||
const $ReversiService: Provider = { provide: 'ReversiService', useExisting: ReversiService };
|
const $ReversiService: Provider = { provide: 'ReversiService', useExisting: ReversiService };
|
||||||
|
const $PageService: Provider = { provide: 'PageService', useExisting: PageService };
|
||||||
|
|
||||||
const $ChartLoggerService: Provider = { provide: 'ChartLoggerService', useExisting: ChartLoggerService };
|
const $ChartLoggerService: Provider = { provide: 'ChartLoggerService', useExisting: ChartLoggerService };
|
||||||
const $FederationChart: Provider = { provide: 'FederationChart', useExisting: FederationChart };
|
const $FederationChart: Provider = { provide: 'FederationChart', useExisting: FederationChart };
|
||||||
|
@ -379,6 +381,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
|
||||||
ChatService,
|
ChatService,
|
||||||
RegistryApiService,
|
RegistryApiService,
|
||||||
ReversiService,
|
ReversiService,
|
||||||
|
PageService,
|
||||||
|
|
||||||
ChartLoggerService,
|
ChartLoggerService,
|
||||||
FederationChart,
|
FederationChart,
|
||||||
|
@ -527,6 +530,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
|
||||||
$ChatService,
|
$ChatService,
|
||||||
$RegistryApiService,
|
$RegistryApiService,
|
||||||
$ReversiService,
|
$ReversiService,
|
||||||
|
$PageService,
|
||||||
|
|
||||||
$ChartLoggerService,
|
$ChartLoggerService,
|
||||||
$FederationChart,
|
$FederationChart,
|
||||||
|
@ -676,6 +680,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
|
||||||
ChatService,
|
ChatService,
|
||||||
RegistryApiService,
|
RegistryApiService,
|
||||||
ReversiService,
|
ReversiService,
|
||||||
|
PageService,
|
||||||
|
|
||||||
FederationChart,
|
FederationChart,
|
||||||
NotesChart,
|
NotesChart,
|
||||||
|
@ -822,6 +827,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
|
||||||
$ChatService,
|
$ChatService,
|
||||||
$RegistryApiService,
|
$RegistryApiService,
|
||||||
$ReversiService,
|
$ReversiService,
|
||||||
|
$PageService,
|
||||||
|
|
||||||
$FederationChart,
|
$FederationChart,
|
||||||
$NotesChart,
|
$NotesChart,
|
||||||
|
|
|
@ -21,6 +21,7 @@ import { LoggerService } from '@/core/LoggerService.js';
|
||||||
import type Logger from '@/logger.js';
|
import type Logger from '@/logger.js';
|
||||||
import { bindThis } from '@/decorators.js';
|
import { bindThis } from '@/decorators.js';
|
||||||
import type { PredictionType } from 'nsfwjs';
|
import type { PredictionType } from 'nsfwjs';
|
||||||
|
import { isMimeImage } from '@/misc/is-mime-image.js';
|
||||||
|
|
||||||
export type FileInfo = {
|
export type FileInfo = {
|
||||||
size: number;
|
size: number;
|
||||||
|
@ -204,16 +205,7 @@ export class FileInfoService {
|
||||||
return [sensitive, porn];
|
return [sensitive, porn];
|
||||||
}
|
}
|
||||||
|
|
||||||
if ([
|
if (analyzeVideo && (mime === 'image/apng' || mime.startsWith('video/'))) {
|
||||||
'image/jpeg',
|
|
||||||
'image/png',
|
|
||||||
'image/webp',
|
|
||||||
].includes(mime)) {
|
|
||||||
const result = await this.aiService.detectSensitive(source);
|
|
||||||
if (result) {
|
|
||||||
[sensitive, porn] = judgePrediction(result);
|
|
||||||
}
|
|
||||||
} else if (analyzeVideo && (mime === 'image/apng' || mime.startsWith('video/'))) {
|
|
||||||
const [outDir, disposeOutDir] = await createTempDir();
|
const [outDir, disposeOutDir] = await createTempDir();
|
||||||
try {
|
try {
|
||||||
const command = FFmpeg()
|
const command = FFmpeg()
|
||||||
|
@ -281,6 +273,23 @@ export class FileInfoService {
|
||||||
} finally {
|
} finally {
|
||||||
disposeOutDir();
|
disposeOutDir();
|
||||||
}
|
}
|
||||||
|
} else if (isMimeImage(mime, 'sharp-convertible-image-with-bmp')) {
|
||||||
|
/*
|
||||||
|
* tfjs-node は限られた画像形式しか受け付けないため、sharp で PNG に変換する
|
||||||
|
* せっかくなので内部処理で使われる最大サイズの299x299に事前にリサイズする
|
||||||
|
*/
|
||||||
|
const png = await (await sharpBmp(source, mime))
|
||||||
|
.resize(299, 299, {
|
||||||
|
withoutEnlargement: false,
|
||||||
|
})
|
||||||
|
.rotate()
|
||||||
|
.flatten({ background: { r: 119, g: 119, b: 119 } }) // 透過部分を18%グレーで塗りつぶす
|
||||||
|
.png()
|
||||||
|
.toBuffer();
|
||||||
|
const result = await this.aiService.detectSensitive(png);
|
||||||
|
if (result) {
|
||||||
|
[sensitive, porn] = judgePrediction(result);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return [sensitive, porn];
|
return [sensitive, porn];
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
import * as http from 'node:http';
|
import * as http from 'node:http';
|
||||||
import * as https from 'node:https';
|
import * as https from 'node:https';
|
||||||
import * as net from 'node:net';
|
import * as net from 'node:net';
|
||||||
|
import * as stream from 'node:stream';
|
||||||
import ipaddr from 'ipaddr.js';
|
import ipaddr from 'ipaddr.js';
|
||||||
import CacheableLookup from 'cacheable-lookup';
|
import CacheableLookup from 'cacheable-lookup';
|
||||||
import fetch from 'node-fetch';
|
import fetch from 'node-fetch';
|
||||||
|
@ -26,12 +27,6 @@ export type HttpRequestSendOptions = {
|
||||||
validators?: ((res: Response) => void)[];
|
validators?: ((res: Response) => void)[];
|
||||||
};
|
};
|
||||||
|
|
||||||
declare module 'node:http' {
|
|
||||||
interface Agent {
|
|
||||||
createConnection(options: net.NetConnectOpts, callback?: (err: unknown, stream: net.Socket) => void): net.Socket;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class HttpRequestServiceAgent extends http.Agent {
|
class HttpRequestServiceAgent extends http.Agent {
|
||||||
constructor(
|
constructor(
|
||||||
private config: Config,
|
private config: Config,
|
||||||
|
@ -41,11 +36,11 @@ class HttpRequestServiceAgent extends http.Agent {
|
||||||
}
|
}
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
public createConnection(options: net.NetConnectOpts, callback?: (err: unknown, stream: net.Socket) => void): net.Socket {
|
public createConnection(options: http.ClientRequestArgs, callback?: (err: Error | null, stream: stream.Duplex) => void): stream.Duplex {
|
||||||
const socket = super.createConnection(options, callback)
|
const socket = super.createConnection(options, callback)
|
||||||
.on('connect', () => {
|
.on('connect', () => {
|
||||||
const address = socket.remoteAddress;
|
if (socket instanceof net.Socket && process.env.NODE_ENV === 'production') {
|
||||||
if (process.env.NODE_ENV === 'production') {
|
const address = socket.remoteAddress;
|
||||||
if (address && ipaddr.isValid(address)) {
|
if (address && ipaddr.isValid(address)) {
|
||||||
if (this.isPrivateIp(address)) {
|
if (this.isPrivateIp(address)) {
|
||||||
socket.destroy(new Error(`Blocked address: ${address}`));
|
socket.destroy(new Error(`Blocked address: ${address}`));
|
||||||
|
@ -80,11 +75,11 @@ class HttpsRequestServiceAgent extends https.Agent {
|
||||||
}
|
}
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
public createConnection(options: net.NetConnectOpts, callback?: (err: unknown, stream: net.Socket) => void): net.Socket {
|
public createConnection(options: http.ClientRequestArgs, callback?: (err: Error | null, stream: stream.Duplex) => void): stream.Duplex {
|
||||||
const socket = super.createConnection(options, callback)
|
const socket = super.createConnection(options, callback)
|
||||||
.on('connect', () => {
|
.on('connect', () => {
|
||||||
const address = socket.remoteAddress;
|
if (socket instanceof net.Socket && process.env.NODE_ENV === 'production') {
|
||||||
if (process.env.NODE_ENV === 'production') {
|
const address = socket.remoteAddress;
|
||||||
if (address && ipaddr.isValid(address)) {
|
if (address && ipaddr.isValid(address)) {
|
||||||
if (this.isPrivateIp(address)) {
|
if (this.isPrivateIp(address)) {
|
||||||
socket.destroy(new Error(`Blocked address: ${address}`));
|
socket.destroy(new Error(`Blocked address: ${address}`));
|
||||||
|
|
223
packages/backend/src/core/PageService.ts
Normal file
223
packages/backend/src/core/PageService.ts
Normal file
|
@ -0,0 +1,223 @@
|
||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||||
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { Inject, Injectable } from '@nestjs/common';
|
||||||
|
import { DataSource, In, Not } from 'typeorm';
|
||||||
|
import { DI } from '@/di-symbols.js';
|
||||||
|
import {
|
||||||
|
type NotesRepository,
|
||||||
|
MiPage,
|
||||||
|
type PagesRepository,
|
||||||
|
MiDriveFile,
|
||||||
|
type UsersRepository,
|
||||||
|
MiNote,
|
||||||
|
} from '@/models/_.js';
|
||||||
|
import { bindThis } from '@/decorators.js';
|
||||||
|
import { RoleService } from '@/core/RoleService.js';
|
||||||
|
import { IdService } from '@/core/IdService.js';
|
||||||
|
import type { MiUser } from '@/models/User.js';
|
||||||
|
import { IdentifiableError } from '@/misc/identifiable-error.js';
|
||||||
|
import { ModerationLogService } from '@/core/ModerationLogService.js';
|
||||||
|
|
||||||
|
export interface PageBody {
|
||||||
|
title: string;
|
||||||
|
name: string;
|
||||||
|
summary: string | null;
|
||||||
|
content: Array<Record<string, any>>;
|
||||||
|
variables: Array<Record<string, any>>;
|
||||||
|
script: string;
|
||||||
|
eyeCatchingImage?: MiDriveFile | null;
|
||||||
|
font: string;
|
||||||
|
alignCenter: boolean;
|
||||||
|
hideTitleWhenPinned: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class PageService {
|
||||||
|
constructor(
|
||||||
|
@Inject(DI.db)
|
||||||
|
private db: DataSource,
|
||||||
|
|
||||||
|
@Inject(DI.pagesRepository)
|
||||||
|
private pagesRepository: PagesRepository,
|
||||||
|
|
||||||
|
@Inject(DI.notesRepository)
|
||||||
|
private notesRepository: NotesRepository,
|
||||||
|
|
||||||
|
@Inject(DI.usersRepository)
|
||||||
|
private usersRepository: UsersRepository,
|
||||||
|
|
||||||
|
private roleService: RoleService,
|
||||||
|
private moderationLogService: ModerationLogService,
|
||||||
|
private idService: IdService,
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@bindThis
|
||||||
|
public async create(
|
||||||
|
me: MiUser,
|
||||||
|
body: PageBody,
|
||||||
|
): Promise<MiPage> {
|
||||||
|
await this.pagesRepository.findBy({
|
||||||
|
userId: me.id,
|
||||||
|
name: body.name,
|
||||||
|
}).then(result => {
|
||||||
|
if (result.length > 0) {
|
||||||
|
throw new IdentifiableError('1a79e38e-3d83-4423-845b-a9d83ff93b61');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const page = await this.pagesRepository.insertOne(new MiPage({
|
||||||
|
id: this.idService.gen(),
|
||||||
|
updatedAt: new Date(),
|
||||||
|
title: body.title,
|
||||||
|
name: body.name,
|
||||||
|
summary: body.summary,
|
||||||
|
content: body.content,
|
||||||
|
variables: body.variables,
|
||||||
|
script: body.script,
|
||||||
|
eyeCatchingImageId: body.eyeCatchingImage ? body.eyeCatchingImage.id : null,
|
||||||
|
userId: me.id,
|
||||||
|
visibility: 'public',
|
||||||
|
alignCenter: body.alignCenter,
|
||||||
|
hideTitleWhenPinned: body.hideTitleWhenPinned,
|
||||||
|
font: body.font,
|
||||||
|
}));
|
||||||
|
|
||||||
|
const referencedNotes = this.collectReferencedNotes(page.content);
|
||||||
|
if (referencedNotes.length > 0) {
|
||||||
|
await this.notesRepository.increment({ id: In(referencedNotes) }, 'pageCount', 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return page;
|
||||||
|
}
|
||||||
|
|
||||||
|
@bindThis
|
||||||
|
public async update(
|
||||||
|
me: MiUser,
|
||||||
|
pageId: MiPage['id'],
|
||||||
|
body: Partial<PageBody>,
|
||||||
|
): Promise<void> {
|
||||||
|
await this.db.transaction(async (transaction) => {
|
||||||
|
const page = await transaction.findOne(MiPage, {
|
||||||
|
where: {
|
||||||
|
id: pageId,
|
||||||
|
},
|
||||||
|
lock: { mode: 'for_no_key_update' },
|
||||||
|
});
|
||||||
|
|
||||||
|
if (page == null) {
|
||||||
|
throw new IdentifiableError('66aefd3c-fdb2-4a71-85ae-cc18bea85d3f');
|
||||||
|
}
|
||||||
|
if (page.userId !== me.id) {
|
||||||
|
throw new IdentifiableError('d0017699-8256-46f1-aed4-bc03bed73616');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (body.name != null) {
|
||||||
|
await transaction.findBy(MiPage, {
|
||||||
|
id: Not(pageId),
|
||||||
|
userId: me.id,
|
||||||
|
name: body.name,
|
||||||
|
}).then(result => {
|
||||||
|
if (result.length > 0) {
|
||||||
|
throw new IdentifiableError('d05bfe24-24b6-4ea2-a3ec-87cc9bf4daa4');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
await transaction.update(MiPage, page.id, {
|
||||||
|
updatedAt: new Date(),
|
||||||
|
title: body.title,
|
||||||
|
name: body.name,
|
||||||
|
summary: body.summary === undefined ? page.summary : body.summary,
|
||||||
|
content: body.content,
|
||||||
|
variables: body.variables,
|
||||||
|
script: body.script,
|
||||||
|
alignCenter: body.alignCenter,
|
||||||
|
hideTitleWhenPinned: body.hideTitleWhenPinned,
|
||||||
|
font: body.font,
|
||||||
|
eyeCatchingImageId: body.eyeCatchingImage === undefined ? undefined : (body.eyeCatchingImage?.id ?? null),
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log("page.content", page.content);
|
||||||
|
|
||||||
|
if (body.content != null) {
|
||||||
|
const beforeReferencedNotes = this.collectReferencedNotes(page.content);
|
||||||
|
const afterReferencedNotes = this.collectReferencedNotes(body.content);
|
||||||
|
|
||||||
|
const removedNotes = beforeReferencedNotes.filter(noteId => !afterReferencedNotes.includes(noteId));
|
||||||
|
const addedNotes = afterReferencedNotes.filter(noteId => !beforeReferencedNotes.includes(noteId));
|
||||||
|
|
||||||
|
if (removedNotes.length > 0) {
|
||||||
|
await transaction.decrement(MiNote, { id: In(removedNotes) }, 'pageCount', 1);
|
||||||
|
}
|
||||||
|
if (addedNotes.length > 0) {
|
||||||
|
await transaction.increment(MiNote, { id: In(addedNotes) }, 'pageCount', 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@bindThis
|
||||||
|
public async delete(me: MiUser, pageId: MiPage['id']): Promise<void> {
|
||||||
|
await this.db.transaction(async (transaction) => {
|
||||||
|
const page = await transaction.findOne(MiPage, {
|
||||||
|
where: {
|
||||||
|
id: pageId,
|
||||||
|
},
|
||||||
|
lock: { mode: 'pessimistic_write' }, // same lock level as DELETE
|
||||||
|
});
|
||||||
|
|
||||||
|
if (page == null) {
|
||||||
|
throw new IdentifiableError('66aefd3c-fdb2-4a71-85ae-cc18bea85d3f');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!await this.roleService.isModerator(me) && page.userId !== me.id) {
|
||||||
|
throw new IdentifiableError('d0017699-8256-46f1-aed4-bc03bed73616');
|
||||||
|
}
|
||||||
|
|
||||||
|
await transaction.delete(MiPage, page.id);
|
||||||
|
|
||||||
|
if (page.userId !== me.id) {
|
||||||
|
const user = await this.usersRepository.findOneByOrFail({ id: page.userId });
|
||||||
|
this.moderationLogService.log(me, 'deletePage', {
|
||||||
|
pageId: page.id,
|
||||||
|
pageUserId: page.userId,
|
||||||
|
pageUserUsername: user.username,
|
||||||
|
page,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const referencedNotes = this.collectReferencedNotes(page.content);
|
||||||
|
if (referencedNotes.length > 0) {
|
||||||
|
await transaction.decrement(MiNote, { id: In(referencedNotes) }, 'pageCount', 1);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
collectReferencedNotes(content: MiPage['content']): string[] {
|
||||||
|
const referencingNotes = new Set<string>();
|
||||||
|
const recursiveCollect = (content: unknown[]) => {
|
||||||
|
for (const contentElement of content) {
|
||||||
|
if (typeof contentElement === 'object'
|
||||||
|
&& contentElement !== null
|
||||||
|
&& 'type' in contentElement) {
|
||||||
|
if (contentElement.type === 'note'
|
||||||
|
&& 'note' in contentElement
|
||||||
|
&& typeof contentElement.note === 'string') {
|
||||||
|
referencingNotes.add(contentElement.note);
|
||||||
|
}
|
||||||
|
if (contentElement.type === 'section'
|
||||||
|
&& 'children' in contentElement
|
||||||
|
&& Array.isArray(contentElement.children)) {
|
||||||
|
recursiveCollect(contentElement.children);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
recursiveCollect(content);
|
||||||
|
return [...referencingNotes];
|
||||||
|
}
|
||||||
|
}
|
|
@ -103,6 +103,7 @@ export class QueueService {
|
||||||
for (const def of REPEATABLE_SYSTEM_JOB_DEF) {
|
for (const def of REPEATABLE_SYSTEM_JOB_DEF) {
|
||||||
this.systemQueue.upsertJobScheduler(def.name, {
|
this.systemQueue.upsertJobScheduler(def.name, {
|
||||||
pattern: def.pattern,
|
pattern: def.pattern,
|
||||||
|
immediately: false,
|
||||||
}, {
|
}, {
|
||||||
name: def.name,
|
name: def.name,
|
||||||
opts: {
|
opts: {
|
||||||
|
@ -810,6 +811,13 @@ export class QueueService {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@bindThis
|
||||||
|
public async queueGetJobLogs(queueType: typeof QUEUE_TYPES[number], jobId: string) {
|
||||||
|
const queue = this.getQueue(queueType);
|
||||||
|
const result = await queue.getJobLogs(jobId);
|
||||||
|
return result.logs;
|
||||||
|
}
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
public async queueGetJobs(queueType: typeof QUEUE_TYPES[number], jobTypes: JobType[], search?: string) {
|
public async queueGetJobs(queueType: typeof QUEUE_TYPES[number], jobTypes: JobType[], search?: string) {
|
||||||
const RETURN_LIMIT = 100;
|
const RETURN_LIMIT = 100;
|
||||||
|
|
|
@ -31,6 +31,7 @@ import { FanoutTimelineService } from '@/core/FanoutTimelineService.js';
|
||||||
import { NotificationService } from '@/core/NotificationService.js';
|
import { NotificationService } from '@/core/NotificationService.js';
|
||||||
import type { OnApplicationShutdown, OnModuleInit } from '@nestjs/common';
|
import type { OnApplicationShutdown, OnModuleInit } from '@nestjs/common';
|
||||||
|
|
||||||
|
// misskey-js の rolePolicies と同期すべし
|
||||||
export type RolePolicies = {
|
export type RolePolicies = {
|
||||||
gtlAvailable: boolean;
|
gtlAvailable: boolean;
|
||||||
ltlAvailable: boolean;
|
ltlAvailable: boolean;
|
||||||
|
@ -43,6 +44,7 @@ export type RolePolicies = {
|
||||||
canManageCustomEmojis: boolean;
|
canManageCustomEmojis: boolean;
|
||||||
canManageAvatarDecorations: boolean;
|
canManageAvatarDecorations: boolean;
|
||||||
canSearchNotes: boolean;
|
canSearchNotes: boolean;
|
||||||
|
canSearchUsers: boolean;
|
||||||
canUseTranslator: boolean;
|
canUseTranslator: boolean;
|
||||||
canHideAds: boolean;
|
canHideAds: boolean;
|
||||||
driveCapacityMb: number;
|
driveCapacityMb: number;
|
||||||
|
@ -82,6 +84,7 @@ export const DEFAULT_POLICIES: RolePolicies = {
|
||||||
canManageCustomEmojis: false,
|
canManageCustomEmojis: false,
|
||||||
canManageAvatarDecorations: false,
|
canManageAvatarDecorations: false,
|
||||||
canSearchNotes: false,
|
canSearchNotes: false,
|
||||||
|
canSearchUsers: true,
|
||||||
canUseTranslator: true,
|
canUseTranslator: true,
|
||||||
canHideAds: false,
|
canHideAds: false,
|
||||||
driveCapacityMb: 100,
|
driveCapacityMb: 100,
|
||||||
|
@ -402,6 +405,7 @@ export class RoleService implements OnApplicationShutdown, OnModuleInit {
|
||||||
canManageCustomEmojis: calc('canManageCustomEmojis', vs => vs.some(v => v === true)),
|
canManageCustomEmojis: calc('canManageCustomEmojis', vs => vs.some(v => v === true)),
|
||||||
canManageAvatarDecorations: calc('canManageAvatarDecorations', vs => vs.some(v => v === true)),
|
canManageAvatarDecorations: calc('canManageAvatarDecorations', vs => vs.some(v => v === true)),
|
||||||
canSearchNotes: calc('canSearchNotes', vs => vs.some(v => v === true)),
|
canSearchNotes: calc('canSearchNotes', vs => vs.some(v => v === true)),
|
||||||
|
canSearchUsers: calc('canSearchUsers', vs => vs.some(v => v === true)),
|
||||||
canUseTranslator: calc('canUseTranslator', vs => vs.some(v => v === true)),
|
canUseTranslator: calc('canUseTranslator', vs => vs.some(v => v === true)),
|
||||||
canHideAds: calc('canHideAds', vs => vs.some(v => v === true)),
|
canHideAds: calc('canHideAds', vs => vs.some(v => v === true)),
|
||||||
driveCapacityMb: calc('driveCapacityMb', vs => Math.max(...vs)),
|
driveCapacityMb: calc('driveCapacityMb', vs => Math.max(...vs)),
|
||||||
|
|
|
@ -227,9 +227,9 @@ export class SearchService {
|
||||||
|
|
||||||
if (opts.host) {
|
if (opts.host) {
|
||||||
if (opts.host === '.') {
|
if (opts.host === '.') {
|
||||||
query.andWhere('user.host IS NULL');
|
query.andWhere('note.userHost IS NULL');
|
||||||
} else {
|
} else {
|
||||||
query.andWhere('user.host = :host', { host: opts.host });
|
query.andWhere('note.userHost = :host', { host: opts.host });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -85,6 +85,7 @@ function generateDummyNote(override?: Partial<MiNote>): MiNote {
|
||||||
renoteCount: 10,
|
renoteCount: 10,
|
||||||
repliesCount: 5,
|
repliesCount: 5,
|
||||||
clippedCount: 0,
|
clippedCount: 0,
|
||||||
|
pageCount: 0,
|
||||||
reactions: {},
|
reactions: {},
|
||||||
visibility: 'public',
|
visibility: 'public',
|
||||||
uri: null,
|
uri: null,
|
||||||
|
@ -243,7 +244,6 @@ export class WebhookTestService {
|
||||||
case 'reaction':
|
case 'reaction':
|
||||||
return;
|
return;
|
||||||
default: {
|
default: {
|
||||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
||||||
const _exhaustiveAssertion: never = params.type;
|
const _exhaustiveAssertion: never = params.type;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -326,7 +326,6 @@ export class WebhookTestService {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default: {
|
default: {
|
||||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
||||||
const _exhaustiveAssertion: never = params.type;
|
const _exhaustiveAssertion: never = params.type;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -411,7 +410,7 @@ export class WebhookTestService {
|
||||||
name: user.name,
|
name: user.name,
|
||||||
username: user.username,
|
username: user.username,
|
||||||
host: user.host,
|
host: user.host,
|
||||||
avatarUrl: user.avatarId == null ? null : user.avatarUrl,
|
avatarUrl: (user.avatarId == null ? null : user.avatarUrl) ?? '',
|
||||||
avatarBlurhash: user.avatarId == null ? null : user.avatarBlurhash,
|
avatarBlurhash: user.avatarId == null ? null : user.avatarBlurhash,
|
||||||
avatarDecorations: user.avatarDecorations.map(it => ({
|
avatarDecorations: user.avatarDecorations.map(it => ({
|
||||||
id: it.id,
|
id: it.id,
|
||||||
|
|
|
@ -54,12 +54,13 @@ export class ChatEntityService {
|
||||||
|
|
||||||
const message = typeof src === 'object' ? src : await this.chatMessagesRepository.findOneByOrFail({ id: src });
|
const message = typeof src === 'object' ? src : await this.chatMessagesRepository.findOneByOrFail({ id: src });
|
||||||
|
|
||||||
const reactions: { user: Packed<'UserLite'>; reaction: string; }[] = [];
|
// userは削除されている可能性があるのでnull許容
|
||||||
|
const reactions: { user: Packed<'UserLite'> | null; reaction: string; }[] = [];
|
||||||
|
|
||||||
for (const record of message.reactions) {
|
for (const record of message.reactions) {
|
||||||
const [userId, reaction] = record.split('/');
|
const [userId, reaction] = record.split('/');
|
||||||
reactions.push({
|
reactions.push({
|
||||||
user: packedUsers?.get(userId) ?? await this.userEntityService.pack(userId),
|
user: packedUsers?.get(userId) ?? await this.userEntityService.pack(userId).catch(() => null),
|
||||||
reaction,
|
reaction,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -76,7 +77,7 @@ export class ChatEntityService {
|
||||||
toRoom: message.toRoomId ? (packedRooms?.get(message.toRoomId) ?? await this.packRoom(message.toRoom ?? message.toRoomId, me)) : undefined,
|
toRoom: message.toRoomId ? (packedRooms?.get(message.toRoomId) ?? await this.packRoom(message.toRoom ?? message.toRoomId, me)) : undefined,
|
||||||
fileId: message.fileId,
|
fileId: message.fileId,
|
||||||
file: message.fileId ? (packedFiles?.get(message.fileId) ?? await this.driveFileEntityService.pack(message.file ?? message.fileId)) : null,
|
file: message.fileId ? (packedFiles?.get(message.fileId) ?? await this.driveFileEntityService.pack(message.file ?? message.fileId)) : null,
|
||||||
reactions,
|
reactions: reactions.filter((r): r is { user: Packed<'UserLite'>; reaction: string; } => r.user != null),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -108,6 +109,7 @@ export class ChatEntityService {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: packedUsersに削除されたユーザーもnullとして含める
|
||||||
const [packedUsers, packedFiles, packedRooms] = await Promise.all([
|
const [packedUsers, packedFiles, packedRooms] = await Promise.all([
|
||||||
this.userEntityService.packMany(users, me)
|
this.userEntityService.packMany(users, me)
|
||||||
.then(users => new Map(users.map(u => [u.id, u]))),
|
.then(users => new Map(users.map(u => [u.id, u]))),
|
||||||
|
@ -183,12 +185,13 @@ export class ChatEntityService {
|
||||||
|
|
||||||
const message = typeof src === 'object' ? src : await this.chatMessagesRepository.findOneByOrFail({ id: src });
|
const message = typeof src === 'object' ? src : await this.chatMessagesRepository.findOneByOrFail({ id: src });
|
||||||
|
|
||||||
const reactions: { user: Packed<'UserLite'>; reaction: string; }[] = [];
|
// userは削除されている可能性があるのでnull許容
|
||||||
|
const reactions: { user: Packed<'UserLite'> | null; reaction: string; }[] = [];
|
||||||
|
|
||||||
for (const record of message.reactions) {
|
for (const record of message.reactions) {
|
||||||
const [userId, reaction] = record.split('/');
|
const [userId, reaction] = record.split('/');
|
||||||
reactions.push({
|
reactions.push({
|
||||||
user: packedUsers?.get(userId) ?? await this.userEntityService.pack(userId),
|
user: packedUsers?.get(userId) ?? await this.userEntityService.pack(userId).catch(() => null),
|
||||||
reaction,
|
reaction,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -202,7 +205,7 @@ export class ChatEntityService {
|
||||||
toRoomId: message.toRoomId!,
|
toRoomId: message.toRoomId!,
|
||||||
fileId: message.fileId,
|
fileId: message.fileId,
|
||||||
file: message.fileId ? (packedFiles?.get(message.fileId) ?? await this.driveFileEntityService.pack(message.file ?? message.fileId)) : null,
|
file: message.fileId ? (packedFiles?.get(message.fileId) ?? await this.driveFileEntityService.pack(message.file ?? message.fileId)) : null,
|
||||||
reactions,
|
reactions: reactions.filter((r): r is { user: Packed<'UserLite'>; reaction: string; } => r.user != null),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -109,6 +109,7 @@ export class MetaEntityService {
|
||||||
maxNoteTextLength: MAX_NOTE_TEXT_LENGTH,
|
maxNoteTextLength: MAX_NOTE_TEXT_LENGTH,
|
||||||
defaultLightTheme,
|
defaultLightTheme,
|
||||||
defaultDarkTheme,
|
defaultDarkTheme,
|
||||||
|
clientOptions: instance.clientOptions,
|
||||||
ads: ads.map(ad => ({
|
ads: ads.map(ad => ({
|
||||||
id: ad.id,
|
id: ad.id,
|
||||||
url: ad.url,
|
url: ad.url,
|
||||||
|
|
|
@ -49,15 +49,12 @@ export class NoteReactionEntityService implements OnModuleInit {
|
||||||
public async pack(
|
public async pack(
|
||||||
src: MiNoteReaction['id'] | MiNoteReaction,
|
src: MiNoteReaction['id'] | MiNoteReaction,
|
||||||
me?: { id: MiUser['id'] } | null | undefined,
|
me?: { id: MiUser['id'] } | null | undefined,
|
||||||
options?: {
|
options?: object,
|
||||||
withNote: boolean;
|
|
||||||
},
|
|
||||||
hints?: {
|
hints?: {
|
||||||
packedUser?: Packed<'UserLite'>
|
packedUser?: Packed<'UserLite'>
|
||||||
},
|
},
|
||||||
): Promise<Packed<'NoteReaction'>> {
|
): Promise<Packed<'NoteReaction'>> {
|
||||||
const opts = Object.assign({
|
const opts = Object.assign({
|
||||||
withNote: false,
|
|
||||||
}, options);
|
}, options);
|
||||||
|
|
||||||
const reaction = typeof src === 'object' ? src : await this.noteReactionsRepository.findOneByOrFail({ id: src });
|
const reaction = typeof src === 'object' ? src : await this.noteReactionsRepository.findOneByOrFail({ id: src });
|
||||||
|
@ -67,9 +64,6 @@ export class NoteReactionEntityService implements OnModuleInit {
|
||||||
createdAt: this.idService.parse(reaction.id).date.toISOString(),
|
createdAt: this.idService.parse(reaction.id).date.toISOString(),
|
||||||
user: hints?.packedUser ?? await this.userEntityService.pack(reaction.user ?? reaction.userId, me),
|
user: hints?.packedUser ?? await this.userEntityService.pack(reaction.user ?? reaction.userId, me),
|
||||||
type: this.reactionService.convertLegacyReaction(reaction.reaction),
|
type: this.reactionService.convertLegacyReaction(reaction.reaction),
|
||||||
...(opts.withNote ? {
|
|
||||||
note: await this.noteEntityService.pack(reaction.note ?? reaction.noteId, me),
|
|
||||||
} : {}),
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -77,16 +71,50 @@ export class NoteReactionEntityService implements OnModuleInit {
|
||||||
public async packMany(
|
public async packMany(
|
||||||
reactions: MiNoteReaction[],
|
reactions: MiNoteReaction[],
|
||||||
me?: { id: MiUser['id'] } | null | undefined,
|
me?: { id: MiUser['id'] } | null | undefined,
|
||||||
options?: {
|
options?: object,
|
||||||
withNote: boolean;
|
|
||||||
},
|
|
||||||
): Promise<Packed<'NoteReaction'>[]> {
|
): Promise<Packed<'NoteReaction'>[]> {
|
||||||
const opts = Object.assign({
|
const opts = Object.assign({
|
||||||
withNote: false,
|
|
||||||
}, options);
|
}, options);
|
||||||
const _users = reactions.map(({ user, userId }) => user ?? userId);
|
const _users = reactions.map(({ user, userId }) => user ?? userId);
|
||||||
const _userMap = await this.userEntityService.packMany(_users, me)
|
const _userMap = await this.userEntityService.packMany(_users, me)
|
||||||
.then(users => new Map(users.map(u => [u.id, u])));
|
.then(users => new Map(users.map(u => [u.id, u])));
|
||||||
return Promise.all(reactions.map(reaction => this.pack(reaction, me, opts, { packedUser: _userMap.get(reaction.userId) })));
|
return Promise.all(reactions.map(reaction => this.pack(reaction, me, opts, { packedUser: _userMap.get(reaction.userId) })));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@bindThis
|
||||||
|
public async packWithNote(
|
||||||
|
src: MiNoteReaction['id'] | MiNoteReaction,
|
||||||
|
me?: { id: MiUser['id'] } | null | undefined,
|
||||||
|
options?: object,
|
||||||
|
hints?: {
|
||||||
|
packedUser?: Packed<'UserLite'>
|
||||||
|
},
|
||||||
|
): Promise<Packed<'NoteReactionWithNote'>> {
|
||||||
|
const opts = Object.assign({
|
||||||
|
}, options);
|
||||||
|
|
||||||
|
const reaction = typeof src === 'object' ? src : await this.noteReactionsRepository.findOneByOrFail({ id: src });
|
||||||
|
|
||||||
|
return {
|
||||||
|
id: reaction.id,
|
||||||
|
createdAt: this.idService.parse(reaction.id).date.toISOString(),
|
||||||
|
user: hints?.packedUser ?? await this.userEntityService.pack(reaction.user ?? reaction.userId, me),
|
||||||
|
type: this.reactionService.convertLegacyReaction(reaction.reaction),
|
||||||
|
note: await this.noteEntityService.pack(reaction.note ?? reaction.noteId, me),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@bindThis
|
||||||
|
public async packManyWithNote(
|
||||||
|
reactions: MiNoteReaction[],
|
||||||
|
me?: { id: MiUser['id'] } | null | undefined,
|
||||||
|
options?: object,
|
||||||
|
): Promise<Packed<'NoteReactionWithNote'>[]> {
|
||||||
|
const opts = Object.assign({
|
||||||
|
}, options);
|
||||||
|
const _users = reactions.map(({ user, userId }) => user ?? userId);
|
||||||
|
const _userMap = await this.userEntityService.packMany(_users, me)
|
||||||
|
.then(users => new Map(users.map(u => [u.id, u])));
|
||||||
|
return Promise.all(reactions.map(reaction => this.packWithNote(reaction, me, opts, { packedUser: _userMap.get(reaction.userId) })));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -471,8 +471,8 @@ export class UserEntityService implements OnModuleInit {
|
||||||
(profile.followersVisibility === 'followers') && (relation && relation.isFollowing) ? user.followersCount :
|
(profile.followersVisibility === 'followers') && (relation && relation.isFollowing) ? user.followersCount :
|
||||||
null;
|
null;
|
||||||
|
|
||||||
const isModerator = isMe && isDetailed ? this.roleService.isModerator(user) : null;
|
const isModerator = isMe && isDetailed ? this.roleService.isModerator(user) : undefined;
|
||||||
const isAdmin = isMe && isDetailed ? this.roleService.isAdministrator(user) : null;
|
const isAdmin = isMe && isDetailed ? this.roleService.isAdministrator(user) : undefined;
|
||||||
const unreadAnnouncements = isMe && isDetailed ?
|
const unreadAnnouncements = isMe && isDetailed ?
|
||||||
(await this.announcementService.getUnreadAnnouncements(user)).map((announcement) => ({
|
(await this.announcementService.getUnreadAnnouncements(user)).map((announcement) => ({
|
||||||
createdAt: this.idService.parse(announcement.id).date.toISOString(),
|
createdAt: this.idService.parse(announcement.id).date.toISOString(),
|
||||||
|
@ -481,6 +481,7 @@ export class UserEntityService implements OnModuleInit {
|
||||||
|
|
||||||
const notificationsInfo = isMe && isDetailed ? await this.getNotificationsInfo(user.id) : null;
|
const notificationsInfo = isMe && isDetailed ? await this.getNotificationsInfo(user.id) : null;
|
||||||
|
|
||||||
|
// TODO: 例えば avatarUrl: true など間違った型を設定しても型エラーにならないのをどうにかする(ジェネリクス使わない方法で実装するしかなさそう?)
|
||||||
const packed = {
|
const packed = {
|
||||||
id: user.id,
|
id: user.id,
|
||||||
name: user.name,
|
name: user.name,
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -22,7 +22,7 @@ import { packedFollowingSchema } from '@/models/json-schema/following.js';
|
||||||
import { packedMutingSchema } from '@/models/json-schema/muting.js';
|
import { packedMutingSchema } from '@/models/json-schema/muting.js';
|
||||||
import { packedRenoteMutingSchema } from '@/models/json-schema/renote-muting.js';
|
import { packedRenoteMutingSchema } from '@/models/json-schema/renote-muting.js';
|
||||||
import { packedBlockingSchema } from '@/models/json-schema/blocking.js';
|
import { packedBlockingSchema } from '@/models/json-schema/blocking.js';
|
||||||
import { packedNoteReactionSchema } from '@/models/json-schema/note-reaction.js';
|
import { packedNoteReactionSchema, packedNoteReactionWithNoteSchema } from '@/models/json-schema/note-reaction.js';
|
||||||
import { packedHashtagSchema } from '@/models/json-schema/hashtag.js';
|
import { packedHashtagSchema } from '@/models/json-schema/hashtag.js';
|
||||||
import { packedInviteCodeSchema } from '@/models/json-schema/invite-code.js';
|
import { packedInviteCodeSchema } from '@/models/json-schema/invite-code.js';
|
||||||
import { packedPageBlockSchema, packedPageSchema } from '@/models/json-schema/page.js';
|
import { packedPageBlockSchema, packedPageSchema } from '@/models/json-schema/page.js';
|
||||||
|
@ -65,6 +65,7 @@ import {
|
||||||
packedMetaDetailedSchema,
|
packedMetaDetailedSchema,
|
||||||
packedMetaLiteSchema,
|
packedMetaLiteSchema,
|
||||||
} from '@/models/json-schema/meta.js';
|
} from '@/models/json-schema/meta.js';
|
||||||
|
import { packedUserWebhookSchema } from '@/models/json-schema/user-webhook.js';
|
||||||
import { packedSystemWebhookSchema } from '@/models/json-schema/system-webhook.js';
|
import { packedSystemWebhookSchema } from '@/models/json-schema/system-webhook.js';
|
||||||
import { packedAbuseReportNotificationRecipientSchema } from '@/models/json-schema/abuse-report-notification-recipient.js';
|
import { packedAbuseReportNotificationRecipientSchema } from '@/models/json-schema/abuse-report-notification-recipient.js';
|
||||||
import { packedChatMessageSchema, packedChatMessageLiteSchema, packedChatMessageLiteForRoomSchema, packedChatMessageLiteFor1on1Schema } from '@/models/json-schema/chat-message.js';
|
import { packedChatMessageSchema, packedChatMessageLiteSchema, packedChatMessageLiteForRoomSchema, packedChatMessageLiteFor1on1Schema } from '@/models/json-schema/chat-message.js';
|
||||||
|
@ -92,6 +93,7 @@ export const refs = {
|
||||||
Note: packedNoteSchema,
|
Note: packedNoteSchema,
|
||||||
NoteDraft: packedNoteDraftSchema,
|
NoteDraft: packedNoteDraftSchema,
|
||||||
NoteReaction: packedNoteReactionSchema,
|
NoteReaction: packedNoteReactionSchema,
|
||||||
|
NoteReactionWithNote: packedNoteReactionWithNoteSchema,
|
||||||
NoteFavorite: packedNoteFavoriteSchema,
|
NoteFavorite: packedNoteFavoriteSchema,
|
||||||
Notification: packedNotificationSchema,
|
Notification: packedNotificationSchema,
|
||||||
DriveFile: packedDriveFileSchema,
|
DriveFile: packedDriveFileSchema,
|
||||||
|
@ -133,6 +135,7 @@ export const refs = {
|
||||||
MetaLite: packedMetaLiteSchema,
|
MetaLite: packedMetaLiteSchema,
|
||||||
MetaDetailedOnly: packedMetaDetailedOnlySchema,
|
MetaDetailedOnly: packedMetaDetailedOnlySchema,
|
||||||
MetaDetailed: packedMetaDetailedSchema,
|
MetaDetailed: packedMetaDetailedSchema,
|
||||||
|
UserWebhook: packedUserWebhookSchema,
|
||||||
SystemWebhook: packedSystemWebhookSchema,
|
SystemWebhook: packedSystemWebhookSchema,
|
||||||
AbuseReportNotificationRecipient: packedAbuseReportNotificationRecipientSchema,
|
AbuseReportNotificationRecipient: packedAbuseReportNotificationRecipientSchema,
|
||||||
ChatMessage: packedChatMessageSchema,
|
ChatMessage: packedChatMessageSchema,
|
||||||
|
|
|
@ -654,7 +654,7 @@ export class MiMeta {
|
||||||
|
|
||||||
@Column('varchar', {
|
@Column('varchar', {
|
||||||
length: 128,
|
length: 128,
|
||||||
default: 'all',
|
default: 'none',
|
||||||
})
|
})
|
||||||
public federation: 'all' | 'specified' | 'none';
|
public federation: 'all' | 'specified' | 'none';
|
||||||
|
|
||||||
|
@ -703,7 +703,7 @@ export class MiMeta {
|
||||||
public allowExternalApRedirect: boolean;
|
public allowExternalApRedirect: boolean;
|
||||||
|
|
||||||
@Column('boolean', {
|
@Column('boolean', {
|
||||||
default: true,
|
default: false,
|
||||||
})
|
})
|
||||||
public enableRemoteNotesCleaning: boolean;
|
public enableRemoteNotesCleaning: boolean;
|
||||||
|
|
||||||
|
@ -716,6 +716,11 @@ export class MiMeta {
|
||||||
default: 90, // days
|
default: 90, // days
|
||||||
})
|
})
|
||||||
public remoteNotesCleaningExpiryDaysForEachNotes: number;
|
public remoteNotesCleaningExpiryDaysForEachNotes: number;
|
||||||
|
|
||||||
|
@Column('jsonb', {
|
||||||
|
default: { },
|
||||||
|
})
|
||||||
|
public clientOptions: Record<string, any>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export type SoftwareSuspension = {
|
export type SoftwareSuspension = {
|
||||||
|
|
|
@ -114,6 +114,13 @@ export class MiNote {
|
||||||
})
|
})
|
||||||
public clippedCount: number;
|
public clippedCount: number;
|
||||||
|
|
||||||
|
// The number of note page blocks referencing this note.
|
||||||
|
// This column is used by Remote Note Cleaning and manually updated rather than automatically with triggers.
|
||||||
|
@Column('smallint', {
|
||||||
|
default: 0,
|
||||||
|
})
|
||||||
|
public pageCount: number;
|
||||||
|
|
||||||
@Column('jsonb', {
|
@Column('jsonb', {
|
||||||
default: {},
|
default: {},
|
||||||
})
|
})
|
||||||
|
|
|
@ -10,6 +10,7 @@ import { MiAccessToken } from './AccessToken.js';
|
||||||
import { MiRole } from './Role.js';
|
import { MiRole } from './Role.js';
|
||||||
import { MiDriveFile } from './DriveFile.js';
|
import { MiDriveFile } from './DriveFile.js';
|
||||||
|
|
||||||
|
// misskey-js の notificationTypes と同期すべし
|
||||||
export type MiNotification = {
|
export type MiNotification = {
|
||||||
type: 'note';
|
type: 'note';
|
||||||
id: string;
|
id: string;
|
||||||
|
|
|
@ -69,7 +69,7 @@ export class MiPage {
|
||||||
public eyeCatchingImageId: MiDriveFile['id'] | null;
|
public eyeCatchingImageId: MiDriveFile['id'] | null;
|
||||||
|
|
||||||
@ManyToOne(type => MiDriveFile, {
|
@ManyToOne(type => MiDriveFile, {
|
||||||
onDelete: 'CASCADE',
|
onDelete: 'SET NULL',
|
||||||
})
|
})
|
||||||
@JoinColumn()
|
@JoinColumn()
|
||||||
public eyeCatchingImage: MiDriveFile | null;
|
public eyeCatchingImage: MiDriveFile | null;
|
||||||
|
|
|
@ -71,6 +71,10 @@ export const packedMetaLiteSchema = {
|
||||||
type: 'string',
|
type: 'string',
|
||||||
optional: false, nullable: true,
|
optional: false, nullable: true,
|
||||||
},
|
},
|
||||||
|
clientOptions: {
|
||||||
|
type: 'object',
|
||||||
|
optional: false, nullable: false,
|
||||||
|
},
|
||||||
disableRegistration: {
|
disableRegistration: {
|
||||||
type: 'boolean',
|
type: 'boolean',
|
||||||
optional: false, nullable: false,
|
optional: false, nullable: false,
|
||||||
|
|
|
@ -10,7 +10,6 @@ export const packedNoteReactionSchema = {
|
||||||
type: 'string',
|
type: 'string',
|
||||||
optional: false, nullable: false,
|
optional: false, nullable: false,
|
||||||
format: 'id',
|
format: 'id',
|
||||||
example: 'xxxxxxxxxx',
|
|
||||||
},
|
},
|
||||||
createdAt: {
|
createdAt: {
|
||||||
type: 'string',
|
type: 'string',
|
||||||
|
@ -28,3 +27,33 @@ export const packedNoteReactionSchema = {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
|
export const packedNoteReactionWithNoteSchema = {
|
||||||
|
type: 'object',
|
||||||
|
properties: {
|
||||||
|
id: {
|
||||||
|
type: 'string',
|
||||||
|
optional: false, nullable: false,
|
||||||
|
format: 'id',
|
||||||
|
},
|
||||||
|
createdAt: {
|
||||||
|
type: 'string',
|
||||||
|
optional: false, nullable: false,
|
||||||
|
format: 'date-time',
|
||||||
|
},
|
||||||
|
user: {
|
||||||
|
type: 'object',
|
||||||
|
optional: false, nullable: false,
|
||||||
|
ref: 'UserLite',
|
||||||
|
},
|
||||||
|
type: {
|
||||||
|
type: 'string',
|
||||||
|
optional: false, nullable: false,
|
||||||
|
},
|
||||||
|
note: {
|
||||||
|
type: 'object',
|
||||||
|
optional: false, nullable: false,
|
||||||
|
ref: 'Note',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
} as const;
|
||||||
|
|
|
@ -212,6 +212,10 @@ export const packedRolePoliciesSchema = {
|
||||||
type: 'boolean',
|
type: 'boolean',
|
||||||
optional: false, nullable: false,
|
optional: false, nullable: false,
|
||||||
},
|
},
|
||||||
|
canSearchUsers: {
|
||||||
|
type: 'boolean',
|
||||||
|
optional: false, nullable: false,
|
||||||
|
},
|
||||||
canUseTranslator: {
|
canUseTranslator: {
|
||||||
type: 'boolean',
|
type: 'boolean',
|
||||||
optional: false, nullable: false,
|
optional: false, nullable: false,
|
||||||
|
|
55
packages/backend/src/models/json-schema/user-webhook.ts
Normal file
55
packages/backend/src/models/json-schema/user-webhook.ts
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||||
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { webhookEventTypes } from '@/models/Webhook.js';
|
||||||
|
|
||||||
|
export const packedUserWebhookSchema = {
|
||||||
|
type: 'object',
|
||||||
|
properties: {
|
||||||
|
id: {
|
||||||
|
type: 'string',
|
||||||
|
format: 'id',
|
||||||
|
optional: false, nullable: false,
|
||||||
|
},
|
||||||
|
userId: {
|
||||||
|
type: 'string',
|
||||||
|
format: 'id',
|
||||||
|
optional: false, nullable: false,
|
||||||
|
},
|
||||||
|
name: {
|
||||||
|
type: 'string',
|
||||||
|
optional: false, nullable: false,
|
||||||
|
},
|
||||||
|
on: {
|
||||||
|
type: 'array',
|
||||||
|
items: {
|
||||||
|
type: 'string',
|
||||||
|
optional: false, nullable: false,
|
||||||
|
enum: webhookEventTypes,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
url: {
|
||||||
|
type: 'string',
|
||||||
|
optional: false, nullable: false,
|
||||||
|
},
|
||||||
|
secret: {
|
||||||
|
type: 'string',
|
||||||
|
optional: false, nullable: false,
|
||||||
|
},
|
||||||
|
active: {
|
||||||
|
type: 'boolean',
|
||||||
|
optional: false, nullable: false,
|
||||||
|
},
|
||||||
|
latestSentAt: {
|
||||||
|
type: 'string',
|
||||||
|
format: 'date-time',
|
||||||
|
optional: false, nullable: true,
|
||||||
|
},
|
||||||
|
latestStatus: {
|
||||||
|
type: 'integer',
|
||||||
|
optional: false, nullable: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
} as const;
|
|
@ -65,7 +65,7 @@ export const packedUserLiteSchema = {
|
||||||
avatarUrl: {
|
avatarUrl: {
|
||||||
type: 'string',
|
type: 'string',
|
||||||
format: 'url',
|
format: 'url',
|
||||||
nullable: true, optional: false,
|
nullable: false, optional: false,
|
||||||
},
|
},
|
||||||
avatarBlurhash: {
|
avatarBlurhash: {
|
||||||
type: 'string',
|
type: 'string',
|
||||||
|
@ -465,11 +465,11 @@ export const packedMeDetailedOnlySchema = {
|
||||||
},
|
},
|
||||||
isModerator: {
|
isModerator: {
|
||||||
type: 'boolean',
|
type: 'boolean',
|
||||||
nullable: true, optional: false,
|
nullable: false, optional: false,
|
||||||
},
|
},
|
||||||
isAdmin: {
|
isAdmin: {
|
||||||
type: 'boolean',
|
type: 'boolean',
|
||||||
nullable: true, optional: false,
|
nullable: false, optional: false,
|
||||||
},
|
},
|
||||||
injectFeaturedNote: {
|
injectFeaturedNote: {
|
||||||
type: 'boolean',
|
type: 'boolean',
|
||||||
|
@ -591,7 +591,7 @@ export const packedMeDetailedOnlySchema = {
|
||||||
},
|
},
|
||||||
mutedInstances: {
|
mutedInstances: {
|
||||||
type: 'array',
|
type: 'array',
|
||||||
nullable: true, optional: false,
|
nullable: false, optional: false,
|
||||||
items: {
|
items: {
|
||||||
type: 'string',
|
type: 'string',
|
||||||
nullable: false, optional: false,
|
nullable: false, optional: false,
|
||||||
|
|
|
@ -5,9 +5,9 @@
|
||||||
|
|
||||||
import { setTimeout } from 'node:timers/promises';
|
import { setTimeout } from 'node:timers/promises';
|
||||||
import { Inject, Injectable } from '@nestjs/common';
|
import { Inject, Injectable } from '@nestjs/common';
|
||||||
import { And, In, IsNull, LessThan, MoreThan, Not } from 'typeorm';
|
import { DataSource, IsNull, LessThan, QueryFailedError, Not } from 'typeorm';
|
||||||
import { DI } from '@/di-symbols.js';
|
import { DI } from '@/di-symbols.js';
|
||||||
import type { MiMeta, MiNote, NoteFavoritesRepository, NotesRepository, UserNotePiningsRepository } from '@/models/_.js';
|
import type { MiMeta, MiNote, NotesRepository } from '@/models/_.js';
|
||||||
import type Logger from '@/logger.js';
|
import type Logger from '@/logger.js';
|
||||||
import { bindThis } from '@/decorators.js';
|
import { bindThis } from '@/decorators.js';
|
||||||
import { IdService } from '@/core/IdService.js';
|
import { IdService } from '@/core/IdService.js';
|
||||||
|
@ -25,11 +25,8 @@ export class CleanRemoteNotesProcessorService {
|
||||||
@Inject(DI.notesRepository)
|
@Inject(DI.notesRepository)
|
||||||
private notesRepository: NotesRepository,
|
private notesRepository: NotesRepository,
|
||||||
|
|
||||||
@Inject(DI.noteFavoritesRepository)
|
@Inject(DI.db)
|
||||||
private noteFavoritesRepository: NoteFavoritesRepository,
|
private db: DataSource,
|
||||||
|
|
||||||
@Inject(DI.userNotePiningsRepository)
|
|
||||||
private userNotePiningsRepository: UserNotePiningsRepository,
|
|
||||||
|
|
||||||
private idService: IdService,
|
private idService: IdService,
|
||||||
private queueLoggerService: QueueLoggerService,
|
private queueLoggerService: QueueLoggerService,
|
||||||
|
@ -37,12 +34,22 @@ export class CleanRemoteNotesProcessorService {
|
||||||
this.logger = this.queueLoggerService.logger.createSubLogger('clean-remote-notes');
|
this.logger = this.queueLoggerService.logger.createSubLogger('clean-remote-notes');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@bindThis
|
||||||
|
private computeProgress(minId: string, maxId: string, cursorLeft: string) {
|
||||||
|
const minTs = this.idService.parse(minId).date.getTime();
|
||||||
|
const maxTs = this.idService.parse(maxId).date.getTime();
|
||||||
|
const cursorTs = this.idService.parse(cursorLeft).date.getTime();
|
||||||
|
|
||||||
|
return ((cursorTs - minTs) / (maxTs - minTs)) * 100;
|
||||||
|
}
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
public async process(job: Bull.Job<Record<string, unknown>>): Promise<{
|
public async process(job: Bull.Job<Record<string, unknown>>): Promise<{
|
||||||
deletedCount: number;
|
deletedCount: number;
|
||||||
oldest: number | null;
|
oldest: number | null;
|
||||||
newest: number | null;
|
newest: number | null;
|
||||||
skipped?: boolean;
|
skipped: boolean;
|
||||||
|
transientErrors: number;
|
||||||
}> {
|
}> {
|
||||||
if (!this.meta.enableRemoteNotesCleaning) {
|
if (!this.meta.enableRemoteNotesCleaning) {
|
||||||
this.logger.info('Remote notes cleaning is disabled, skipping...');
|
this.logger.info('Remote notes cleaning is disabled, skipping...');
|
||||||
|
@ -51,6 +58,7 @@ export class CleanRemoteNotesProcessorService {
|
||||||
oldest: null,
|
oldest: null,
|
||||||
newest: null,
|
newest: null,
|
||||||
skipped: true,
|
skipped: true,
|
||||||
|
transientErrors: 0,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -59,7 +67,107 @@ export class CleanRemoteNotesProcessorService {
|
||||||
const maxDuration = this.meta.remoteNotesCleaningMaxProcessingDurationInMinutes * 60 * 1000; // Convert minutes to milliseconds
|
const maxDuration = this.meta.remoteNotesCleaningMaxProcessingDurationInMinutes * 60 * 1000; // Convert minutes to milliseconds
|
||||||
const startAt = Date.now();
|
const startAt = Date.now();
|
||||||
|
|
||||||
const MAX_NOTE_COUNT_PER_QUERY = 50;
|
//#region queries
|
||||||
|
// The date limit for the newest note to be considered for deletion.
|
||||||
|
// All notes newer than this limit will always be retained.
|
||||||
|
const newestLimit = this.idService.gen(Date.now() - (1000 * 60 * 60 * 24 * this.meta.remoteNotesCleaningExpiryDaysForEachNotes));
|
||||||
|
|
||||||
|
// The condition for removing the notes.
|
||||||
|
// The note must be:
|
||||||
|
// - old enough (older than the newestLimit)
|
||||||
|
// - a remote note (userHost is not null).
|
||||||
|
// - not have clipped
|
||||||
|
// - not have pinned on the user profile
|
||||||
|
// - not has been favorite by any user
|
||||||
|
const removalCriteria = [
|
||||||
|
'note."id" < :newestLimit',
|
||||||
|
'note."clippedCount" = 0',
|
||||||
|
'note."pageCount" = 0',
|
||||||
|
'note."userHost" IS NOT NULL',
|
||||||
|
'NOT EXISTS (SELECT 1 FROM user_note_pining WHERE "noteId" = note."id")',
|
||||||
|
'NOT EXISTS (SELECT 1 FROM note_favorite WHERE "noteId" = note."id")',
|
||||||
|
'NOT EXISTS (SELECT 1 FROM note_reaction INNER JOIN "user" ON note_reaction."userId" = "user".id WHERE note_reaction."noteId" = note."id" AND "user"."host" IS NULL)',
|
||||||
|
].join(' AND ');
|
||||||
|
|
||||||
|
const minId = (await this.notesRepository.createQueryBuilder('note')
|
||||||
|
.select('MIN(note.id)', 'minId')
|
||||||
|
.where({
|
||||||
|
id: LessThan(newestLimit),
|
||||||
|
userHost: Not(IsNull()),
|
||||||
|
replyId: IsNull(),
|
||||||
|
renoteId: IsNull(),
|
||||||
|
})
|
||||||
|
.getRawOne<{ minId?: MiNote['id'] }>())?.minId;
|
||||||
|
|
||||||
|
if (!minId) {
|
||||||
|
this.logger.info('No notes can possibly be deleted, skipping...');
|
||||||
|
return {
|
||||||
|
deletedCount: 0,
|
||||||
|
oldest: null,
|
||||||
|
newest: null,
|
||||||
|
skipped: false,
|
||||||
|
transientErrors: 0,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// start with a conservative limit and adjust it based on the query duration
|
||||||
|
const minimumLimit = 10;
|
||||||
|
let currentLimit = 100;
|
||||||
|
let cursorLeft = '0';
|
||||||
|
|
||||||
|
const candidateNotesCteName = 'candidate_notes';
|
||||||
|
|
||||||
|
// tree walk down all root notes, short-circuit when the first unremovable note is found
|
||||||
|
const candidateNotesQueryBase = this.notesRepository.createQueryBuilder('note')
|
||||||
|
.select('note."id"', 'id')
|
||||||
|
.addSelect('note."replyId"', 'replyId')
|
||||||
|
.addSelect('note."renoteId"', 'renoteId')
|
||||||
|
.addSelect('note."id"', 'rootId')
|
||||||
|
.addSelect('TRUE', 'isRemovable')
|
||||||
|
.addSelect('TRUE', 'isBase')
|
||||||
|
.where('note."id" > :cursorLeft')
|
||||||
|
.andWhere(removalCriteria)
|
||||||
|
.andWhere({ replyId: IsNull(), renoteId: IsNull() });
|
||||||
|
|
||||||
|
const candidateNotesQueryInductive = this.notesRepository.createQueryBuilder('note')
|
||||||
|
.select('note.id', 'id')
|
||||||
|
.addSelect('note."replyId"', 'replyId')
|
||||||
|
.addSelect('note."renoteId"', 'renoteId')
|
||||||
|
.addSelect('parent."rootId"', 'rootId')
|
||||||
|
.addSelect(removalCriteria, 'isRemovable')
|
||||||
|
.addSelect('FALSE', 'isBase')
|
||||||
|
.innerJoin(candidateNotesCteName, 'parent', 'parent."id" = note."replyId" OR parent."id" = note."renoteId"')
|
||||||
|
.where('parent."isRemovable" = TRUE');
|
||||||
|
|
||||||
|
// A note tree can be deleted if there are no unremovable rows with the same rootId.
|
||||||
|
//
|
||||||
|
// `candidate_notes` will have the following structure after recursive query (some columns omitted):
|
||||||
|
// After performing a LEFT JOIN with `candidate_notes` as `unremovable`,
|
||||||
|
// the note tree containing unremovable notes will be anti-joined.
|
||||||
|
// For removable rows, the `unremovable` columns will have `NULL` values.
|
||||||
|
// | id | rootId | isRemovable |
|
||||||
|
// |-----|--------|-------------|
|
||||||
|
// | aaa | aaa | TRUE |
|
||||||
|
// | bbb | aaa | FALSE |
|
||||||
|
// | ccc | aaa | FALSE |
|
||||||
|
// | ddd | ddd | TRUE |
|
||||||
|
// | eee | ddd | TRUE |
|
||||||
|
// | fff | fff | TRUE |
|
||||||
|
// | ggg | ggg | FALSE |
|
||||||
|
//
|
||||||
|
const candidateNotesQuery = this.db.createQueryBuilder()
|
||||||
|
.select(`"${candidateNotesCteName}"."id"`, 'id')
|
||||||
|
.addSelect('unremovable."id" IS NULL', 'isRemovable')
|
||||||
|
.addSelect(`BOOL_OR("${candidateNotesCteName}"."isBase")`, 'isBase')
|
||||||
|
.addCommonTableExpression(
|
||||||
|
`((SELECT "base".* FROM (${candidateNotesQueryBase.orderBy('note.id', 'ASC').limit(currentLimit).getQuery()}) AS "base") UNION ${candidateNotesQueryInductive.getQuery()})`,
|
||||||
|
candidateNotesCteName,
|
||||||
|
{ recursive: true },
|
||||||
|
)
|
||||||
|
.from(candidateNotesCteName, candidateNotesCteName)
|
||||||
|
.leftJoin(candidateNotesCteName, 'unremovable', `unremovable."rootId" = "${candidateNotesCteName}"."rootId" AND unremovable."isRemovable" = FALSE`)
|
||||||
|
.groupBy(`"${candidateNotesCteName}"."id"`)
|
||||||
|
.addGroupBy('unremovable."id" IS NULL');
|
||||||
|
|
||||||
const stats = {
|
const stats = {
|
||||||
deletedCount: 0,
|
deletedCount: 0,
|
||||||
|
@ -67,101 +175,107 @@ export class CleanRemoteNotesProcessorService {
|
||||||
newest: null as number | null,
|
newest: null as number | null,
|
||||||
};
|
};
|
||||||
|
|
||||||
let cursor: MiNote['id'] = this.idService.gen(Date.now() - (1000 * 60 * 60 * 24 * this.meta.remoteNotesCleaningExpiryDaysForEachNotes));
|
let lowThroughputWarned = false;
|
||||||
|
let transientErrors = 0;
|
||||||
while (true) {
|
for (;;) {
|
||||||
|
//#region check time
|
||||||
const batchBeginAt = Date.now();
|
const batchBeginAt = Date.now();
|
||||||
|
|
||||||
let notes: Pick<MiNote, 'id'>[] = await this.notesRepository.find({
|
const elapsed = batchBeginAt - startAt;
|
||||||
where: {
|
|
||||||
id: LessThan(cursor),
|
|
||||||
userHost: Not(IsNull()),
|
|
||||||
clippedCount: 0,
|
|
||||||
renoteCount: 0,
|
|
||||||
},
|
|
||||||
take: MAX_NOTE_COUNT_PER_QUERY,
|
|
||||||
order: {
|
|
||||||
// 新しい順
|
|
||||||
// https://github.com/misskey-dev/misskey/pull/16292#issuecomment-3139376314
|
|
||||||
id: -1,
|
|
||||||
},
|
|
||||||
select: ['id'],
|
|
||||||
});
|
|
||||||
|
|
||||||
const fetchedCount = notes.length;
|
const progress = this.computeProgress(minId, newestLimit, cursorLeft > minId ? cursorLeft : minId);
|
||||||
|
|
||||||
for (const note of notes) {
|
|
||||||
if (note.id < cursor) {
|
|
||||||
cursor = note.id;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const pinings = notes.length === 0 ? [] : await this.userNotePiningsRepository.find({
|
|
||||||
where: {
|
|
||||||
noteId: In(notes.map(note => note.id)),
|
|
||||||
},
|
|
||||||
select: ['noteId'],
|
|
||||||
});
|
|
||||||
|
|
||||||
notes = notes.filter(note => {
|
|
||||||
return !pinings.some(pining => pining.noteId === note.id);
|
|
||||||
});
|
|
||||||
|
|
||||||
const favorites = notes.length === 0 ? [] : await this.noteFavoritesRepository.find({
|
|
||||||
where: {
|
|
||||||
noteId: In(notes.map(note => note.id)),
|
|
||||||
},
|
|
||||||
select: ['noteId'],
|
|
||||||
});
|
|
||||||
|
|
||||||
notes = notes.filter(note => {
|
|
||||||
return !favorites.some(favorite => favorite.noteId === note.id);
|
|
||||||
});
|
|
||||||
|
|
||||||
const replies = notes.length === 0 ? [] : await this.notesRepository.find({
|
|
||||||
where: {
|
|
||||||
replyId: In(notes.map(note => note.id)),
|
|
||||||
userHost: IsNull(),
|
|
||||||
},
|
|
||||||
select: ['replyId'],
|
|
||||||
});
|
|
||||||
|
|
||||||
notes = notes.filter(note => {
|
|
||||||
return !replies.some(reply => reply.replyId === note.id);
|
|
||||||
});
|
|
||||||
|
|
||||||
if (notes.length > 0) {
|
|
||||||
await this.notesRepository.delete(notes.map(note => note.id));
|
|
||||||
|
|
||||||
for (const note of notes) {
|
|
||||||
const t = this.idService.parse(note.id).date.getTime();
|
|
||||||
if (stats.oldest === null || t < stats.oldest) {
|
|
||||||
stats.oldest = t;
|
|
||||||
}
|
|
||||||
if (stats.newest === null || t > stats.newest) {
|
|
||||||
stats.newest = t;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
stats.deletedCount += notes.length;
|
|
||||||
}
|
|
||||||
|
|
||||||
job.log(`Deleted ${notes.length} of ${fetchedCount}; ${Date.now() - batchBeginAt}ms`);
|
|
||||||
|
|
||||||
const elapsed = Date.now() - startAt;
|
|
||||||
|
|
||||||
if (elapsed >= maxDuration) {
|
if (elapsed >= maxDuration) {
|
||||||
this.logger.info(`Reached maximum duration of ${maxDuration}ms, stopping...`);
|
job.log(`Reached maximum duration of ${maxDuration}ms, stopping... (last cursor: ${cursorLeft}, final progress ${progress}%)`);
|
||||||
job.log('Reached maximum duration, stopping cleaning.');
|
|
||||||
job.updateProgress(100);
|
job.updateProgress(100);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
job.updateProgress((elapsed / maxDuration) * 100);
|
const wallClockUsage = elapsed / maxDuration;
|
||||||
|
if (wallClockUsage > 0.5 && progress < 50 && !lowThroughputWarned) {
|
||||||
|
const msg = `Not projected to finish in time! (wall clock usage ${wallClockUsage * 100}% at ${progress}%, current limit ${currentLimit})`;
|
||||||
|
this.logger.warn(msg);
|
||||||
|
job.log(msg);
|
||||||
|
lowThroughputWarned = true;
|
||||||
|
}
|
||||||
|
job.updateProgress(progress);
|
||||||
|
//#endregion
|
||||||
|
|
||||||
await setTimeout(1000 * 5); // Wait a moment to avoid overwhelming the db
|
const queryBegin = performance.now();
|
||||||
|
let noteIds = null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
noteIds = await candidateNotesQuery.setParameters(
|
||||||
|
{ newestLimit, cursorLeft },
|
||||||
|
).getRawMany<{ id: MiNote['id'], isRemovable: boolean, isBase: boolean }>();
|
||||||
|
} catch (e) {
|
||||||
|
if (currentLimit > minimumLimit && e instanceof QueryFailedError && e.driverError?.code === '57014') {
|
||||||
|
// Statement timeout (maybe suddenly hit a large note tree), reduce the limit and try again
|
||||||
|
// continuous failures will eventually converge to currentLimit == minimumLimit and then throw
|
||||||
|
currentLimit = Math.max(minimumLimit, Math.floor(currentLimit * 0.25));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (noteIds.length === 0) {
|
||||||
|
job.log('No more notes to clean.');
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
const queryDuration = performance.now() - queryBegin;
|
||||||
|
// try to adjust such that each query takes about 1~5 seconds and reasonable NodeJS heap so the task stays responsive
|
||||||
|
// this should not oscillate..
|
||||||
|
if (queryDuration > 5000 || noteIds.length > 5000) {
|
||||||
|
currentLimit = Math.floor(currentLimit * 0.5);
|
||||||
|
} else if (queryDuration < 1000 && noteIds.length < 1000) {
|
||||||
|
currentLimit = Math.floor(currentLimit * 1.5);
|
||||||
|
}
|
||||||
|
// clamp to a sane range
|
||||||
|
currentLimit = Math.min(Math.max(currentLimit, minimumLimit), 5000);
|
||||||
|
|
||||||
|
const deletableNoteIds = noteIds.filter(result => result.isRemovable).map(result => result.id);
|
||||||
|
if (deletableNoteIds.length > 0) {
|
||||||
|
try {
|
||||||
|
await this.notesRepository.delete(deletableNoteIds);
|
||||||
|
|
||||||
|
for (const id of deletableNoteIds) {
|
||||||
|
const t = this.idService.parse(id).date.getTime();
|
||||||
|
if (stats.oldest === null || t < stats.oldest) {
|
||||||
|
stats.oldest = t;
|
||||||
|
}
|
||||||
|
if (stats.newest === null || t > stats.newest) {
|
||||||
|
stats.newest = t;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stats.deletedCount += deletableNoteIds.length;
|
||||||
|
} catch (e) {
|
||||||
|
// check for integrity violation errors (class 23) that might have occurred between the check and the delete
|
||||||
|
// we can safely continue to the next batch
|
||||||
|
if (e instanceof QueryFailedError && e.driverError?.code?.startsWith('23')) {
|
||||||
|
transientErrors++;
|
||||||
|
job.log(`Error deleting notes: ${e} (transient race condition?)`);
|
||||||
|
} else {
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cursorLeft = noteIds.filter(result => result.isBase).reduce((max, { id }) => id > max ? id : max, cursorLeft);
|
||||||
|
|
||||||
|
job.log(`Deleted ${noteIds.length} notes; ${Date.now() - batchBeginAt}ms`);
|
||||||
|
|
||||||
|
if (process.env.NODE_ENV !== 'test') {
|
||||||
|
await setTimeout(Math.min(1000 * 5, queryDuration)); // Wait a moment to avoid overwhelming the db
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
if (transientErrors > 0) {
|
||||||
|
const msg = `${transientErrors} transient errors occurred while cleaning remote notes. You may need a second pass to complete the cleaning.`;
|
||||||
|
this.logger.warn(msg);
|
||||||
|
job.log(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.logger.succ('cleaning of remote notes completed.');
|
this.logger.succ('cleaning of remote notes completed.');
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
@ -169,6 +283,7 @@ export class CleanRemoteNotesProcessorService {
|
||||||
oldest: stats.oldest,
|
oldest: stats.oldest,
|
||||||
newest: stats.newest,
|
newest: stats.newest,
|
||||||
skipped: false,
|
skipped: false,
|
||||||
|
transientErrors,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
import { Inject, Injectable } from '@nestjs/common';
|
import { Inject, Injectable } from '@nestjs/common';
|
||||||
import { MoreThan } from 'typeorm';
|
import { MoreThan } from 'typeorm';
|
||||||
import { DI } from '@/di-symbols.js';
|
import { DI } from '@/di-symbols.js';
|
||||||
import type { DriveFilesRepository, NotesRepository, UserProfilesRepository, UsersRepository } from '@/models/_.js';
|
import type { DriveFilesRepository, NotesRepository, PagesRepository, UserProfilesRepository, UsersRepository } from '@/models/_.js';
|
||||||
import type Logger from '@/logger.js';
|
import type Logger from '@/logger.js';
|
||||||
import { DriveService } from '@/core/DriveService.js';
|
import { DriveService } from '@/core/DriveService.js';
|
||||||
import type { MiDriveFile } from '@/models/DriveFile.js';
|
import type { MiDriveFile } from '@/models/DriveFile.js';
|
||||||
|
@ -14,6 +14,7 @@ import type { MiNote } from '@/models/Note.js';
|
||||||
import { EmailService } from '@/core/EmailService.js';
|
import { EmailService } from '@/core/EmailService.js';
|
||||||
import { bindThis } from '@/decorators.js';
|
import { bindThis } from '@/decorators.js';
|
||||||
import { SearchService } from '@/core/SearchService.js';
|
import { SearchService } from '@/core/SearchService.js';
|
||||||
|
import { PageService } from '@/core/PageService.js';
|
||||||
import { QueueLoggerService } from '../QueueLoggerService.js';
|
import { QueueLoggerService } from '../QueueLoggerService.js';
|
||||||
import type * as Bull from 'bullmq';
|
import type * as Bull from 'bullmq';
|
||||||
import type { DbUserDeleteJobData } from '../types.js';
|
import type { DbUserDeleteJobData } from '../types.js';
|
||||||
|
@ -35,7 +36,11 @@ export class DeleteAccountProcessorService {
|
||||||
@Inject(DI.driveFilesRepository)
|
@Inject(DI.driveFilesRepository)
|
||||||
private driveFilesRepository: DriveFilesRepository,
|
private driveFilesRepository: DriveFilesRepository,
|
||||||
|
|
||||||
|
@Inject(DI.pagesRepository)
|
||||||
|
private pagesRepository: PagesRepository,
|
||||||
|
|
||||||
private driveService: DriveService,
|
private driveService: DriveService,
|
||||||
|
private pageService: PageService,
|
||||||
private emailService: EmailService,
|
private emailService: EmailService,
|
||||||
private queueLoggerService: QueueLoggerService,
|
private queueLoggerService: QueueLoggerService,
|
||||||
private searchService: SearchService,
|
private searchService: SearchService,
|
||||||
|
@ -112,6 +117,28 @@ export class DeleteAccountProcessorService {
|
||||||
this.logger.succ('All of files deleted');
|
this.logger.succ('All of files deleted');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
// delete pages. Necessary for decrementing pageCount of notes.
|
||||||
|
while (true) {
|
||||||
|
const pages = await this.pagesRepository.find({
|
||||||
|
where: {
|
||||||
|
userId: user.id,
|
||||||
|
},
|
||||||
|
take: 100,
|
||||||
|
order: {
|
||||||
|
id: 1,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (pages.length === 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
for (const page of pages) {
|
||||||
|
await this.pageService.delete(user, page.id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
{ // Send email notification
|
{ // Send email notification
|
||||||
const profile = await this.userProfilesRepository.findOneByOrFail({ userId: user.id });
|
const profile = await this.userProfilesRepository.findOneByOrFail({ userId: user.id });
|
||||||
if (profile.email && profile.emailVerified) {
|
if (profile.email && profile.emailVerified) {
|
||||||
|
|
|
@ -238,30 +238,6 @@ export class ServerService implements OnApplicationShutdown {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
fastify.get<{ Params: { code: string } }>('/verify-email/:code', async (request, reply) => {
|
|
||||||
const profile = await this.userProfilesRepository.findOneBy({
|
|
||||||
emailVerifyCode: request.params.code,
|
|
||||||
});
|
|
||||||
|
|
||||||
if (profile != null) {
|
|
||||||
await this.userProfilesRepository.update({ userId: profile.userId }, {
|
|
||||||
emailVerified: true,
|
|
||||||
emailVerifyCode: null,
|
|
||||||
});
|
|
||||||
|
|
||||||
this.globalEventService.publishMainStream(profile.userId, 'meUpdated', await this.userEntityService.pack(profile.userId, { id: profile.userId }, {
|
|
||||||
schema: 'MeDetailed',
|
|
||||||
includeSecrets: true,
|
|
||||||
}));
|
|
||||||
|
|
||||||
reply.code(200).send('Verification succeeded! メールアドレスの認証に成功しました。');
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
reply.code(404).send('Verification failed. Please try again. メールアドレスの認証に失敗しました。もう一度お試しください');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
fastify.register(this.clientServerService.createServer);
|
fastify.register(this.clientServerService.createServer);
|
||||||
|
|
||||||
this.streamingApiServerService.attach(fastify.server);
|
this.streamingApiServerService.attach(fastify.server);
|
||||||
|
|
|
@ -176,6 +176,17 @@ export class ApiServerService {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
fastify.all('/clear-browser-cache', (request, reply) => {
|
||||||
|
if (['GET', 'POST'].includes(request.method)) {
|
||||||
|
reply.header('Clear-Site-Data', '"cache", "prefetchCache", "prerenderCache", "executionContexts"');
|
||||||
|
reply.code(204);
|
||||||
|
reply.send();
|
||||||
|
} else {
|
||||||
|
reply.code(405);
|
||||||
|
reply.send();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// Make sure any unknown path under /api returns HTTP 404 Not Found,
|
// Make sure any unknown path under /api returns HTTP 404 Not Found,
|
||||||
// because otherwise ClientServerService will return the base client HTML
|
// because otherwise ClientServerService will return the base client HTML
|
||||||
// page with HTTP 200.
|
// page with HTTP 200.
|
||||||
|
|
|
@ -70,6 +70,7 @@ export * as 'admin/queue/inbox-delayed' from './endpoints/admin/queue/inbox-dela
|
||||||
export * as 'admin/queue/retry-job' from './endpoints/admin/queue/retry-job.js';
|
export * as 'admin/queue/retry-job' from './endpoints/admin/queue/retry-job.js';
|
||||||
export * as 'admin/queue/remove-job' from './endpoints/admin/queue/remove-job.js';
|
export * as 'admin/queue/remove-job' from './endpoints/admin/queue/remove-job.js';
|
||||||
export * as 'admin/queue/show-job' from './endpoints/admin/queue/show-job.js';
|
export * as 'admin/queue/show-job' from './endpoints/admin/queue/show-job.js';
|
||||||
|
export * as 'admin/queue/show-job-logs' from './endpoints/admin/queue/show-job-logs.js';
|
||||||
export * as 'admin/queue/promote-jobs' from './endpoints/admin/queue/promote-jobs.js';
|
export * as 'admin/queue/promote-jobs' from './endpoints/admin/queue/promote-jobs.js';
|
||||||
export * as 'admin/queue/jobs' from './endpoints/admin/queue/jobs.js';
|
export * as 'admin/queue/jobs' from './endpoints/admin/queue/jobs.js';
|
||||||
export * as 'admin/queue/stats' from './endpoints/admin/queue/stats.js';
|
export * as 'admin/queue/stats' from './endpoints/admin/queue/stats.js';
|
||||||
|
@ -411,6 +412,7 @@ export * as 'users/search' from './endpoints/users/search.js';
|
||||||
export * as 'users/search-by-username-and-host' from './endpoints/users/search-by-username-and-host.js';
|
export * as 'users/search-by-username-and-host' from './endpoints/users/search-by-username-and-host.js';
|
||||||
export * as 'users/show' from './endpoints/users/show.js';
|
export * as 'users/show' from './endpoints/users/show.js';
|
||||||
export * as 'users/update-memo' from './endpoints/users/update-memo.js';
|
export * as 'users/update-memo' from './endpoints/users/update-memo.js';
|
||||||
|
export * as 'verify-email' from './endpoints/verify-email.js';
|
||||||
export * as 'chat/messages/create-to-user' from './endpoints/chat/messages/create-to-user.js';
|
export * as 'chat/messages/create-to-user' from './endpoints/chat/messages/create-to-user.js';
|
||||||
export * as 'chat/messages/create-to-room' from './endpoints/chat/messages/create-to-room.js';
|
export * as 'chat/messages/create-to-room' from './endpoints/chat/messages/create-to-room.js';
|
||||||
export * as 'chat/messages/delete' from './endpoints/chat/messages/delete.js';
|
export * as 'chat/messages/delete' from './endpoints/chat/messages/delete.js';
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue