Compare commits
429 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 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 | |||
| da06f75455 | |||
| d624da9c1a | |||
| 4c520fa693 | |||
| a7d1c94f48 | |||
| 4f5d3f6f7d | |||
| 4be0045826 | |||
| 18daf43f70 | |||
| 862a6fae79 | |||
| a45e89c300 | |||
| 35888eb8f4 | |||
| f2a23fb55e | |||
| 414d5958c1 | |||
| 8c65d8d020 | |||
| 927aa9dc3d | |||
| 1dec8b2329 | |||
| b0493abe93 | |||
| 4f653f2fbc | |||
| b660769288 | |||
| 48246bd166 | |||
| 73419e8a61 | |||
| 9852196ddc | |||
| 598641de48 | |||
| 4d643c77c5 | |||
| a686592734 | |||
| 0619dba04d | |||
| fbd6b67f1f | |||
| e5c2be15f7 | |||
| 1b791258ce | |||
| 49cac2f72b | |||
| 5d5aa09459 | |||
| e1834beae8 | |||
| 6f6fdfe28e | |||
| ad7bf096e1 | |||
| 08cc5a99bb | |||
| f954b1e276 | |||
| 5ecaf5095e | |||
| d2c4f79886 | |||
| e26369ed48 | |||
| c165749a29 | |||
| c4fdf5a47c | |||
| 288f0abeac | |||
| 89ed8be8ff | |||
| a8abb03d17 | |||
| c2a01551a7 | |||
| 553ccff77c | |||
| 9dddc84750 | |||
| 004cfd5e4b | |||
| 40a35968f0 | |||
| e6ec15e397 | |||
| 8430256f22 | |||
| abde15979b | |||
| f128682200 | |||
| cc4cdd1ec0 | |||
| 075df75afa | |||
| 64eb338d65 | |||
| d986da745b | |||
| 50f5b29290 | |||
| a460bb7913 | |||
| 7cf1eccd04 | |||
| 73397e1b7e | |||
| bf17092b41 | |||
| 6d1018f42b | |||
| 7667011266 | |||
| a45ccc18b4 | |||
| c29a4d9503 | |||
| 5caf2b27cf | |||
| dd87d26bdc | |||
| b7a6301c2e | |||
| 73e8d950df | |||
| 45033974f7 | |||
| 7acfbc23d6 | |||
| a9a746edce | |||
| 179d990c39 | |||
| 7c44881ca8 | |||
| ccbc4cffaa | |||
| 706244925d | |||
| 09a5e4b10a | |||
| c48acad04b | |||
| 5d3bb02f4b | |||
| 933e252687 | |||
| f1deb89e34 | |||
| 8bc822d829 | |||
| c215cccf1d | |||
| 0685bdf05c | |||
| 3394ed2122 | |||
| c5a440cf22 | |||
| 3c6f07fc8c | |||
| 3c5ed0ffbb | |||
| b8e8f3ad25 | |||
| 012b2a9764 | |||
| dfbc40f868 | |||
| 32ddaa0cf8 | |||
| bf6e218355 | |||
| 19ef6c0b14 | |||
| 535b86f05e | |||
| 01a94eaecb | |||
| 9a28fa0534 | |||
| 899273554a | |||
| bf57557ba3 | |||
| 8fda4fefaf | |||
| f1983d1aa5 | |||
| 60649f4d66 | |||
| 525a330637 | |||
| b455e63da7 | |||
| 5626677e86 | |||
| c424554d4a | |||
| eee9a5f853 | |||
| 4d72d6caf4 | |||
| b752dc72e5 | |||
| 06d31c0b78 | |||
| 32d4c312ef | |||
| 36fde67992 | |||
| 43abbce2af | |||
| 684424f26a | |||
| 36989e0cd3 | |||
| d518682e73 | |||
| 0ada970337 | |||
| a812dfe853 | |||
| 2baec208f5 | |||
| 4093616e23 | |||
| 062d5170df | |||
| a279bd4d49 | |||
| 978ae706eb | |||
| 824643a44e | |||
| 213c569242 | |||
| a1cf2d3074 | |||
| 4ea7c76c02 | |||
| 1782a353d3 | |||
| c69a13b592 | |||
| 40e35c051a | |||
| b93717be33 | |||
| fe805fb7f0 | |||
| e9af9d4451 | |||
| ce90fee586 | |||
| 5bec8ba6b0 | |||
| 3dbfd80d65 | |||
| b33eeb1366 | |||
| 420756d744 | |||
| 32d721abf1 | |||
| 8ea6aa2ef3 | |||
| bc07b79a23 | |||
| aae7961540 | |||
| 1ad32990cb | |||
| 89db7b3fa8 | |||
| 151121a567 | |||
| 966e0812f5 | |||
| d378156212 | |||
| 568021498f | |||
| 8f66ffc14d | |||
| 63e8935c86 | |||
| b16a05b9a7 | |||
| 090262f3c6 | |||
| bc5a33d87f | |||
| 0ffd9e267a | |||
| 81bc27d804 | |||
| f50abed98d | |||
| 8ab574a31a | |||
| 9a3219f12e | |||
| b5767c315a | |||
| ac9206f192 | |||
| e2b38edb3a | |||
| c5dc0fd51b | |||
| dda2ad6bcd | |||
| a5429ebeee | |||
| 1c3604c7fb | |||
| 4906f1f45c | |||
| 6506429f09 | |||
| 9bd5f887de | |||
| be35fe468b | |||
| 4b9b3ced01 | |||
| 20b8148ddf | |||
| 019dfbdc1c | |||
| 95ea62f222 | |||
| fde67dca74 | |||
| a603a4970e | |||
| f37a1e84bd | |||
| 6c9e055aae | |||
| a971e44cee | |||
| c6808f1eb6 | |||
| 2a78360588 | |||
| 65ba33867b | |||
| b55cc03621 | |||
| 80f73c6712 | |||
| 60fc9a5195 | |||
| b43dfa260b | |||
| e3b57a118d | |||
| fdcb6a09a9 | |||
| 218df19d9c | |||
| b766589c00 | |||
| d94bdff639 | |||
| 3a4288fe24 | |||
| 12c71de4c7 | |||
| b7aa013a41 | |||
| 3ff2e6b299 | |||
| cd9322a824 | |||
| 9fdc3c5def | |||
| 4af8c7f8b0 | |||
| ed29a3613b | |||
| 810a609df4 | |||
| 5537558fa7 | |||
| 26215b7466 | |||
| 0a0247a678 | |||
| 93d17aff6c | |||
| 3bc81522c6 | |||
| 2a077de148 | |||
| 3eb64ccf7a | |||
| 47fede5e5c | |||
| b48a25ea77 | |||
| 51e7081c9d | |||
| 982ae9238d | |||
| d40c083233 | |||
| 8f025c447b | |||
| 9dc423afd4 | |||
| 5893a95c99 | |||
| f4167ae7f1 | |||
| 63db879bcc | |||
| bd17b465c3 | |||
| 6b1fbf6819 | |||
| 021c332097 | |||
| 5bdbff19ae | |||
| 070a4516fc | |||
| c5d33661b2 | |||
| 777ca15083 | |||
| 21344f7695 | |||
| 4254f52ced | |||
| f14787bd10 | |||
| 14cbc78031 | |||
| 62e333191d | |||
| 0c2d799acd | |||
| aa4c7a1313 | |||
| 743995e469 | |||
| 0254570fbf | |||
| 9f196bbf75 |
@@ -13,3 +13,7 @@ trim_trailing_whitespace = false
|
||||
|
||||
[*.{yml,yaml}]
|
||||
indent_style = space
|
||||
|
||||
[packages/backend/migration/*.js]
|
||||
indent_style = space
|
||||
indent_size = 4
|
||||
|
||||
@@ -1 +1 @@
|
||||
20.10.0
|
||||
22.15.0
|
||||
|
||||
@@ -15,3 +15,5 @@ redis:
|
||||
host: 127.0.0.1
|
||||
port: 56312
|
||||
id: aidx
|
||||
|
||||
proxyRemoteFiles: true
|
||||
|
||||
@@ -16,7 +16,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4.2.2
|
||||
uses: actions/checkout@v4.3.0
|
||||
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v4.1.0
|
||||
|
||||
@@ -12,7 +12,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout head
|
||||
uses: actions/checkout@v4.2.2
|
||||
uses: actions/checkout@v4.3.0
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4.4.0
|
||||
with:
|
||||
|
||||
@@ -18,7 +18,7 @@ jobs:
|
||||
if: ${{ github.event.pull_request.mergeable == null || github.event.pull_request.mergeable == true }}
|
||||
steps:
|
||||
- name: checkout
|
||||
uses: actions/checkout@v4.2.2
|
||||
uses: actions/checkout@v4.3.0
|
||||
with:
|
||||
submodules: true
|
||||
persist-credentials: false
|
||||
@@ -66,7 +66,7 @@ jobs:
|
||||
if: ${{ github.event.pull_request.mergeable == null || github.event.pull_request.mergeable == true }}
|
||||
steps:
|
||||
- name: checkout
|
||||
uses: actions/checkout@v4.2.2
|
||||
uses: actions/checkout@v4.3.0
|
||||
with:
|
||||
submodules: true
|
||||
persist-credentials: false
|
||||
|
||||
@@ -20,7 +20,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4.2.2
|
||||
uses: actions/checkout@v4.3.0
|
||||
- name: Check version
|
||||
run: |
|
||||
if [ "$(jq -r '.version' package.json)" != "$(jq -r '.version' packages/misskey-js/package.json)" ]; then
|
||||
|
||||
@@ -12,7 +12,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4.2.2
|
||||
uses: actions/checkout@v4.3.0
|
||||
- name: Check
|
||||
run: |
|
||||
counter=0
|
||||
@@ -50,6 +50,7 @@ jobs:
|
||||
"packages/backend/test"
|
||||
"packages/frontend-shared/@types"
|
||||
"packages/frontend-shared/js"
|
||||
"packages/frontend-builder"
|
||||
"packages/frontend/.storybook"
|
||||
"packages/frontend/@types"
|
||||
"packages/frontend/lib"
|
||||
|
||||
@@ -10,7 +10,7 @@ jobs:
|
||||
check_copyright_year:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4.2.2
|
||||
- uses: actions/checkout@v4.3.0
|
||||
- run: |
|
||||
if [ "$(grep Copyright COPYING | sed -e 's/.*2014-\([0-9]*\) .*/\1/g')" -ne "$(date +%Y)" ]; then
|
||||
echo "Please change copyright year!"
|
||||
|
||||
@@ -28,7 +28,7 @@ jobs:
|
||||
wait_time: ${{ steps.get-wait-time.outputs.wait_time }}
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4.2.2
|
||||
uses: actions/checkout@v4.3.0
|
||||
|
||||
- name: Check allowed users
|
||||
id: check-allowed-users
|
||||
|
||||
@@ -27,7 +27,7 @@ jobs:
|
||||
platform=${{ matrix.platform }}
|
||||
echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV
|
||||
- name: Check out the repo
|
||||
uses: actions/checkout@v4.2.2
|
||||
uses: actions/checkout@v4.3.0
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
- name: Log in to Docker Hub
|
||||
|
||||
@@ -32,7 +32,7 @@ jobs:
|
||||
platform=${{ matrix.platform }}
|
||||
echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV
|
||||
- name: Check out the repo
|
||||
uses: actions/checkout@v4.2.2
|
||||
uses: actions/checkout@v4.3.0
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
- name: Docker meta
|
||||
|
||||
@@ -15,7 +15,7 @@ jobs:
|
||||
DOCKER_CONTENT_TRUST: 1
|
||||
DOCKLE_VERSION: 0.4.14
|
||||
steps:
|
||||
- uses: actions/checkout@v4.2.2
|
||||
- uses: actions/checkout@v4.3.0
|
||||
- name: Download and install dockle v${{ env.DOCKLE_VERSION }}
|
||||
run: |
|
||||
curl -L -o dockle.deb "https://github.com/goodwithtech/dockle/releases/download/v${DOCKLE_VERSION}/dockle_${DOCKLE_VERSION}_Linux-64bit.deb"
|
||||
@@ -25,7 +25,7 @@ jobs:
|
||||
cp ./compose_example.yml ./compose.yml
|
||||
- run: |
|
||||
docker compose up -d web
|
||||
docker tag "$(docker compose images web | awk 'OFS=":" {print $4}' | tail -n +2)" misskey-web:latest
|
||||
docker tag "$(docker compose images --format json web | jq -r '.[] | .ID')" misskey-web:latest
|
||||
- run: |
|
||||
cmd="dockle --exit-code 1 misskey-web:latest ${image_name}"
|
||||
echo "> ${cmd}"
|
||||
|
||||
@@ -25,7 +25,7 @@ jobs:
|
||||
ref: refs/pull/${{ github.event.number }}/merge
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4.2.2
|
||||
- uses: actions/checkout@v4.3.0
|
||||
with:
|
||||
ref: ${{ matrix.ref }}
|
||||
submodules: true
|
||||
|
||||
@@ -9,6 +9,7 @@ on:
|
||||
- packages/backend/**
|
||||
- packages/frontend/**
|
||||
- packages/frontend-shared/**
|
||||
- packages/frontend-builder/**
|
||||
- packages/frontend-embed/**
|
||||
- packages/icons-subsetter/**
|
||||
- packages/sw/**
|
||||
@@ -22,6 +23,7 @@ on:
|
||||
- packages/backend/**
|
||||
- packages/frontend/**
|
||||
- packages/frontend-shared/**
|
||||
- packages/frontend-builder/**
|
||||
- packages/frontend-embed/**
|
||||
- packages/icons-subsetter/**
|
||||
- packages/sw/**
|
||||
@@ -34,7 +36,7 @@ jobs:
|
||||
pnpm_install:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4.2.2
|
||||
- uses: actions/checkout@v4.3.0
|
||||
with:
|
||||
fetch-depth: 0
|
||||
submodules: true
|
||||
@@ -56,6 +58,7 @@ jobs:
|
||||
- backend
|
||||
- frontend
|
||||
- frontend-shared
|
||||
- frontend-builder
|
||||
- frontend-embed
|
||||
- icons-subsetter
|
||||
- sw
|
||||
@@ -66,7 +69,7 @@ jobs:
|
||||
eslint-cache-version: v1
|
||||
eslint-cache-path: ${{ github.workspace }}/node_modules/.cache/eslint-${{ matrix.workspace }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4.2.2
|
||||
- uses: actions/checkout@v4.3.0
|
||||
with:
|
||||
fetch-depth: 0
|
||||
submodules: true
|
||||
@@ -78,7 +81,7 @@ jobs:
|
||||
cache: 'pnpm'
|
||||
- run: pnpm i --frozen-lockfile
|
||||
- name: Restore eslint cache
|
||||
uses: actions/cache@v4.2.3
|
||||
uses: actions/cache@v4.2.4
|
||||
with:
|
||||
path: ${{ env.eslint-cache-path }}
|
||||
key: eslint-${{ env.eslint-cache-version }}-${{ matrix.workspace }}-${{ hashFiles('**/pnpm-lock.yaml') }}-${{ github.ref_name }}-${{ github.sha }}
|
||||
@@ -96,7 +99,7 @@ jobs:
|
||||
- sw
|
||||
- misskey-js
|
||||
steps:
|
||||
- uses: actions/checkout@v4.2.2
|
||||
- uses: actions/checkout@v4.3.0
|
||||
with:
|
||||
fetch-depth: 0
|
||||
submodules: true
|
||||
|
||||
@@ -14,7 +14,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
continue-on-error: true
|
||||
steps:
|
||||
- uses: actions/checkout@v4.2.2
|
||||
- uses: actions/checkout@v4.3.0
|
||||
with:
|
||||
fetch-depth: 0
|
||||
submodules: true
|
||||
|
||||
@@ -16,7 +16,7 @@ jobs:
|
||||
id-token: write
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4.2.2
|
||||
- uses: actions/checkout@v4.3.0
|
||||
with:
|
||||
submodules: true
|
||||
- name: Setup pnpm
|
||||
@@ -26,6 +26,8 @@ jobs:
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
cache: 'pnpm'
|
||||
# see https://docs.github.com/actions/use-cases-and-examples/publishing-packages/publishing-nodejs-packages#publishing-packages-to-the-npm-registry
|
||||
registry-url: 'https://registry.npmjs.org'
|
||||
- name: Publish package
|
||||
run: |
|
||||
pnpm i --frozen-lockfile
|
||||
|
||||
@@ -22,12 +22,12 @@ jobs:
|
||||
NODE_OPTIONS: "--max_old_space_size=7168"
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4.2.2
|
||||
- uses: actions/checkout@v4.3.0
|
||||
if: github.event_name != 'pull_request_target'
|
||||
with:
|
||||
fetch-depth: 0
|
||||
submodules: true
|
||||
- uses: actions/checkout@v4.2.2
|
||||
- uses: actions/checkout@v4.3.0
|
||||
if: github.event_name == 'pull_request_target'
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
@@ -18,6 +18,14 @@ on:
|
||||
- packages/misskey-js/**
|
||||
- .github/workflows/test-backend.yml
|
||||
- .github/misskey/test.yml
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
force_ffmpeg_cache_update:
|
||||
description: 'Force update ffmpeg cache'
|
||||
required: false
|
||||
default: false
|
||||
type: boolean
|
||||
|
||||
jobs:
|
||||
unit:
|
||||
name: Unit tests (backend)
|
||||
@@ -42,12 +50,27 @@ jobs:
|
||||
- 56312:6379
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4.2.2
|
||||
- uses: actions/checkout@v4.3.0
|
||||
with:
|
||||
submodules: true
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v4.1.0
|
||||
- name: Get current date
|
||||
id: current-date
|
||||
run: echo "today=$(date +'%Y-%m-%d')" >> $GITHUB_OUTPUT
|
||||
- name: Setup and Restore ffmpeg/ffprobe Cache
|
||||
id: cache-ffmpeg
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: |
|
||||
/usr/local/bin/ffmpeg
|
||||
/usr/local/bin/ffprobe
|
||||
# daily cache
|
||||
key: ${{ runner.os }}-ffmpeg-${{ steps.current-date.outputs.today }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-ffmpeg-${{ steps.current-date.outputs.today }}
|
||||
- name: Install FFmpeg
|
||||
if: steps.cache-ffmpeg.outputs.cache-hit != 'true' || github.event.inputs.force_ffmpeg_cache_update == true
|
||||
run: |
|
||||
for i in {1..3}; do
|
||||
echo "Attempt $i: Installing FFmpeg..."
|
||||
@@ -86,6 +109,7 @@ jobs:
|
||||
name: E2E tests (backend)
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
node-version-file:
|
||||
- .node-version
|
||||
@@ -105,7 +129,7 @@ jobs:
|
||||
- 56312:6379
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4.2.2
|
||||
- uses: actions/checkout@v4.3.0
|
||||
with:
|
||||
submodules: true
|
||||
- name: Setup pnpm
|
||||
@@ -129,3 +153,47 @@ jobs:
|
||||
with:
|
||||
token: ${{ secrets.CODECOV_TOKEN }}
|
||||
files: ./packages/backend/coverage/coverage-final.json
|
||||
|
||||
migration:
|
||||
name: Migration tests (backend)
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
node-version-file:
|
||||
- .node-version
|
||||
#- .github/min.node-version
|
||||
|
||||
services:
|
||||
postgres:
|
||||
image: postgres:15
|
||||
ports:
|
||||
- 54312:5432
|
||||
env:
|
||||
POSTGRES_DB: test-misskey
|
||||
POSTGRES_HOST_AUTH_METHOD: trust
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4.3.0
|
||||
with:
|
||||
submodules: true
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v4.1.0
|
||||
- name: Get current date
|
||||
id: current-date
|
||||
run: echo "today=$(date +'%Y-%m-%d')" >> $GITHUB_OUTPUT
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@v4.4.0
|
||||
with:
|
||||
node-version-file: ${{ matrix.node-version-file }}
|
||||
cache: 'pnpm'
|
||||
- run: pnpm i --frozen-lockfile
|
||||
- name: Check pnpm-lock.yaml
|
||||
run: git diff --exit-code pnpm-lock.yaml
|
||||
- name: Copy Configure
|
||||
run: cp .github/misskey/test.yml .config
|
||||
- name: Build
|
||||
run: pnpm build
|
||||
- name: Run migrations
|
||||
run: MISSKEY_CONFIG_YML=test.yml pnpm --filter backend migrate
|
||||
- name: Check no migrations are remaining
|
||||
run: MISSKEY_CONFIG_YML=test.yml pnpm --filter backend check-migrations
|
||||
|
||||
@@ -14,6 +14,13 @@ on:
|
||||
- packages/backend/**
|
||||
- packages/misskey-js/**
|
||||
- .github/workflows/test-federation.yml
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
force_ffmpeg_cache_update:
|
||||
description: 'Force update ffmpeg cache'
|
||||
required: false
|
||||
default: false
|
||||
type: boolean
|
||||
|
||||
jobs:
|
||||
test:
|
||||
@@ -30,7 +37,22 @@ jobs:
|
||||
submodules: true
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v4.1.0
|
||||
- name: Get current date
|
||||
id: current-date
|
||||
run: echo "today=$(date +'%Y-%m-%d')" >> $GITHUB_OUTPUT
|
||||
- name: Setup and Restore ffmpeg/ffprobe Cache
|
||||
id: cache-ffmpeg
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: |
|
||||
/usr/local/bin/ffmpeg
|
||||
/usr/local/bin/ffprobe
|
||||
# daily cache
|
||||
key: ${{ runner.os }}-ffmpeg-${{ steps.current-date.outputs.today }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-ffmpeg-${{ steps.current-date.outputs.today }}
|
||||
- name: Install FFmpeg
|
||||
if: steps.cache-ffmpeg.outputs.cache-hit != 'true' || github.event.inputs.force_ffmpeg_cache_update == true
|
||||
run: |
|
||||
for i in {1..3}; do
|
||||
echo "Attempt $i: Installing FFmpeg..."
|
||||
|
||||
@@ -28,7 +28,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4.2.2
|
||||
- uses: actions/checkout@v4.3.0
|
||||
with:
|
||||
submodules: true
|
||||
- name: Setup pnpm
|
||||
@@ -76,7 +76,7 @@ jobs:
|
||||
- 56312:6379
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4.2.2
|
||||
- uses: actions/checkout@v4.3.0
|
||||
with:
|
||||
submodules: true
|
||||
# https://github.com/cypress-io/cypress-docker-images/issues/150
|
||||
|
||||
@@ -22,7 +22,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4.2.2
|
||||
uses: actions/checkout@v4.3.0
|
||||
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v4.1.0
|
||||
|
||||
@@ -16,7 +16,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4.2.2
|
||||
- uses: actions/checkout@v4.3.0
|
||||
with:
|
||||
submodules: true
|
||||
- name: Setup pnpm
|
||||
|
||||
@@ -17,7 +17,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4.2.2
|
||||
- uses: actions/checkout@v4.3.0
|
||||
with:
|
||||
submodules: true
|
||||
- name: Setup pnpm
|
||||
|
||||
Vendored
+5
-1
@@ -6,8 +6,12 @@
|
||||
"files.associations": {
|
||||
"*.test.ts": "typescript"
|
||||
},
|
||||
"jest.jestCommandLine": "pnpm run jest",
|
||||
"jest.runMode": "on-demand",
|
||||
"jest.virtualFolders": [
|
||||
{ "name": "backend unit", "jestCommandLine": "pnpm -F backend run test" },
|
||||
{ "name": "backend e2e", "jestCommandLine": "pnpm -F backend run test:e2e"},
|
||||
{ "name": "misskey-js", "jestCommandLine": "pnpm -F misskey-js run jest" }
|
||||
],
|
||||
"editor.codeActionsOnSave": {
|
||||
"source.fixAll": "explicit"
|
||||
},
|
||||
|
||||
+168
-1
@@ -1,3 +1,168 @@
|
||||
## 2025.8.0
|
||||
|
||||
### Note
|
||||
- サポートされるNode.jsの最小バージョンが**22.15.0**になりました
|
||||
|
||||
### General
|
||||
- ノートを削除した際、関連するノートが同時に削除されないようになりました
|
||||
- APIで、「replyIdが存在しているのにreplyがnull」や「renoteIdが存在しているのにrenoteがnull」であるという、今までにはなかったパターンが表れることになります
|
||||
- 定期的に参照されていない古いリモートの投稿を削除する機能が実装されました(コントロールパネル→パフォーマンス→Remote Notes Cleaning)
|
||||
- 既存のサーバーでは**デフォルトでオフ**、新規サーバーでは**デフォルトでオン**になります
|
||||
- データベースの肥大化を防止することが可能です
|
||||
- 既存のサーバーで当機能を有効化した場合は、処理量が多くなるため、一時的にストレージ使用量が増加する可能性があります。
|
||||
- 増加量を抑えるには、最大処理継続時間をデフォルトより短くしてください。
|
||||
- データベースサイズへの効果が見られない場合はautovacuumが有効になっているか確認してください
|
||||
- ハイパーリンクによる参照は検知できないためリンク切れとなります。
|
||||
- 現時点では、2023-10-01以前にクリップされたリモートのノートは検知しないため削除対象となります。
|
||||
- サーバーの初期設定が完了するまでは連合がオンにならないようになりました
|
||||
- 日本語における公開範囲名称の「ダイレクト」が「指名」に改称されました
|
||||
- 実際の動作に即した名称になり、馴染みのない人でも理解しやすくなりました
|
||||
- 他サービスにおける「ダイレクトメッセージ」に相当するMisskeyの機能は「チャット」ですが(過去のバージョンのMisskeyでも、当該機能は「チャット」ではなく「ダイレクトメッセージ」でした)、「ダイレクト投稿」という名称の機能が存在するとそちらがダイレクトメッセージ機能であるような誤解を生んでいました
|
||||
- 今後、「チャット」の名称を「ダイレクトメッセージ」に戻す可能性があります
|
||||
- mfm.jsをアップデートしました
|
||||
- Enhance: Unicode 15.1 および 16.0 に収録されている絵文字に対応
|
||||
- Enhance: acctに `.` が入っているユーザーのメンションに対応
|
||||
- Fix: Unicode絵文字に隣接する異体字セレクタ(`U+FE0F`)が絵文字として認識される問題を修正
|
||||
- Enhance: ユーザー検索をロールポリシーで制限できるように
|
||||
|
||||
### 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: 依存ソフトウェアの更新
|
||||
- Enhance: ノートを非表示にする相対期間を1ヶ月単位で自由に指定できるように
|
||||
- Enhance: メールアドレス確認画面のUIを改善
|
||||
- Fix: 投稿フォームでファイルのアップロードが中止または失敗した際のハンドリングを修正
|
||||
- Fix: 一部の設定検索結果が存在しないパスになる問題を修正
|
||||
(Cherry-picked from https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/1171)
|
||||
- Fix: テーマエディタが動作しない問題を修正
|
||||
- Fix: チャンネルのハイライトページにノートが表示されない問題を修正
|
||||
- Fix: カラムの名前が正しくリスト/チャンネルの名前にならない問題を修正
|
||||
- Fix: 複数のメンションを1行に記述した場合に、サジェストが正しく表示されない問題を修正
|
||||
- Fix: メンションとしての条件を満たしていても、特定の条件(`-`が含まれる場合など)で正しくサジェストされない問題を一部修正
|
||||
- Fix: ユーザーの前後ノートを閲覧する機能が動作しない問題を修正
|
||||
- Fix: 照会ダイアログでap/showでローカルユーザーを解決した際@username@nullに飛ばされる問題を修正
|
||||
- Fix: アイコンのデコレーションを付ける際にデコレーションが表示されなくなる問題を修正
|
||||
- Fix: 管理中アカウント一覧で正しい表示が行われない問題を修正
|
||||
- Fix: lookupページでリモートURLを指定した際に正しく動作しない問題を修正
|
||||
|
||||
### Server
|
||||
- Feat: サーバー管理コマンド
|
||||
- `pnpm cli foo` の形式で実行可能です
|
||||
- 現在以下のコマンドが利用可能です
|
||||
- `reset-captcha` - CAPTCHA設定をリセットします
|
||||
- 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
|
||||
|
||||
### Note
|
||||
- Node.jsの最小バージョンを20.10.0から20.18.1に引き上げました
|
||||
- なお、特に必要がない限りNode.jsは推奨バージョンであるv22を使用するようにしてください
|
||||
|
||||
### General
|
||||
- Feat: ノートの下書き機能
|
||||
- Feat: クリップ内でノートを検索できるように
|
||||
- Feat: Playを検索できるように
|
||||
- Feat: モデレーションにおいて、特定のドライブファイルを添付しているチャットメッセージを一覧できるように
|
||||
- Enhance: ウォーターマーク機能をロールで制御可能に
|
||||
|
||||
### Client
|
||||
- Note: 「自動でもっと見る」オプションは無効になっています
|
||||
- Feat: モデログを検索できるように
|
||||
- Enhance: 設定の自動バックアップをオンにした直後に自動バックアップするように
|
||||
- Enhance: ファイルアップロード前にキャプション設定を行えるように
|
||||
- Enhance: ファイルアップロード時にセンシティブ設定されているか表示するように
|
||||
- Enhance: 投稿フォームにファイルをペースト/ドロップした際のUXを改善
|
||||
- Enhance: ページネーション(一覧表示)の並び順を逆にできるように
|
||||
- Enhance: ページネーション(一覧表示)の基準日時を指定できるように
|
||||
- Enhance: レンダリングパフォーマンスの向上
|
||||
- Fix: ファイルがドライブの既定アップロード先に指定したフォルダにアップロードされない問題を修正
|
||||
- Fix: プラグインをアンインストールしてもセーブデータが残る問題を修正
|
||||
- Fix: 数時間後Misskeyのタブに戻った際に、タブがスロットリングされている間の更新アニメーションを延々見せ続けられる問題を修正
|
||||
- Fix: 非ログイン時のハイライトノートの画像がCWの有無を考慮せず表示される問題を修正
|
||||
- Fix: レンジ選択・ドロップダウンにて、操作を無効にすべきところで無効にならない問題を修正
|
||||
- Fix: Pull to refreshが有効なときに横スクロールができない問題を修正
|
||||
|
||||
### Server
|
||||
- Enhance: sinceId/untilIdが指定可能なエンドポイントにおいて、sinceDate/untilDateも指定可能に
|
||||
- Enhance: メールの送信者としてサーバー名を表示するように (サーバー名が設定されている場合)
|
||||
- Fix: ジョブキューのProgressの値を正しく計算する
|
||||
|
||||
|
||||
## 2025.6.3
|
||||
|
||||
### Client
|
||||
- Fix: キャッシュを削除しないとクライアントが使用できないことがある問題を修正
|
||||
|
||||
## 2025.6.2
|
||||
|
||||
### Client
|
||||
- Fix: キャッシュを削除しないとクライアントが使用できないことがある問題を修正
|
||||
- 翻訳の更新
|
||||
|
||||
## 2025.6.1
|
||||
|
||||
### Note
|
||||
- AiScript Misskey拡張API(Misskey Webプラグイン)の[note_view_interruptor](https://misskey-hub.net/ja/docs/for-developers/plugin/plugin-api-reference/#pluginregister_note_view_interruptorfn)は不具合の影響により現在一時的に無効化されています。
|
||||
- Misskey Web投稿フォームのプレビュー切り替えは「...」メニュー内に配置されました
|
||||
|
||||
### Client
|
||||
- Feat: 画像にウォーターマークを付与できるようになりました
|
||||
- Feat: 画像の加工ができるようになりました(実験的)
|
||||
- Enhance: ノートのリアクション一覧で、押せるリアクションを優先して表示できるようにするオプションを追加
|
||||
- Enhance: 全てのチャットメッセージを既読にできるように(設定→その他)
|
||||
- Enhance: ミュートした絵文字をデバイス間で同期できるように
|
||||
- Fix: ドライブファイルの選択が不安定な問題を修正
|
||||
- Fix: コントロールパネルのファイル欄などのデザインが崩れている問題を修正
|
||||
- Fix: ユーザーの検索結果を追加で読み込むことができない問題を修正
|
||||
- Fix: タッチ操作時にチャートのツールチップが消えなくなる場合がある問題を修正
|
||||
- Fix: ウェルカムタイムラインでリアクションが表示されない問題を修正
|
||||
- Fix: デッキのタイムラインカラムで新着ノート時のサウンドが再生されない問題を修正
|
||||
|
||||
### Server
|
||||
- Feat: 全てのチャットメッセージを既読にするAPIを追加(chat/read-all)
|
||||
- Fix: アカウント削除が正常に行われないことがあった問題を修正
|
||||
- Fix: outboxのページネーションが正しく行われない問題を修正
|
||||
|
||||
### Misskey.js
|
||||
- Fix: misskey-jsの drive/file/create でファイルアップロードができない問題を修正
|
||||
|
||||
## 2025.6.0
|
||||
|
||||
### Client
|
||||
- Enhance: 非同期的なコンポーネントの読み込み時のハンドリングを強化
|
||||
- Fix: リアクションの一部の絵文字が重複して表示されることがある問題を修正
|
||||
- Fix: 非利用者に対するユーザー作成コンテンツの公開範囲が全て非公開になっている場合にログインできない問題を修正
|
||||
|
||||
### Server
|
||||
- Fix: 非利用者に対するユーザー作成コンテンツの公開範囲が全て非公開になっている場合でもusers/showを許可するように
|
||||
|
||||
## 2025.5.1
|
||||
|
||||
### Note
|
||||
@@ -39,6 +204,7 @@
|
||||
- Feat: 絵文字をミュート可能にする機能
|
||||
- 絵文字(ユニコードの絵文字・カスタム絵文字)毎にミュートし、不可視化することができるようになりました
|
||||
- Feat: モバイルデバイスで折りたたまれたUIの展開表示に全画面ページを使用できるように(実験的)
|
||||
- Enhance: 設定の同期をオンにするときに競合したときに値をマージできるように
|
||||
- Enhance: メモリ使用量を軽減しました
|
||||
- Enhance: 画像の高品質なプレースホルダを無効化してパフォーマンスを向上させるオプションを追加
|
||||
- Enhance: 招待されているが参加していないルームを開いたときに、招待を承認するかどうか尋ねるように
|
||||
@@ -53,6 +219,7 @@
|
||||
- フロントエンドの読み込みサイズを軽量化しました
|
||||
- ほとんどの言語のハイライトは問題なく行えますが、互換性の問題により一部の言語が正常にハイライトできなくなる可能性があります。詳しくは https://shiki.style/references/engine-js-compat をご覧ください。
|
||||
- Fix: チャットに動画ファイルを送付すると、動画の表示が崩れてしまい視聴出来ない問題を修正
|
||||
- Fix: アカウント依存かつ初期状態である設定値をサーバー同期しようとした際に正しくコンフリクト検出されない問題を修正
|
||||
- Fix: "時計"ウィジェット(Clock)において、Transparent設定が有効でも、その背景が透過されない問題を修正
|
||||
- Fix: 一定時間操作がなかったら動画プレイヤーのコントロールを隠すように
|
||||
- Fix: Twitchのクリップがプレイヤーで再生できない問題を修正
|
||||
@@ -70,7 +237,7 @@
|
||||
- Fix: ミュート対象ユーザーが引用されているノートがRNされたときにミュートを貫通してしまう問題を修正 #16009
|
||||
- Fix: 連合モードが「なし」の場合に、生成されるHTML内のactivity jsonへのリンクタグを省略するように
|
||||
- Fix: コントロールパネルから招待コードを作成すると作成者の情報が記録されない問題を修正
|
||||
|
||||
- Fix: コントロールパネルのジョブキューページからPausedなジョブ一覧を閲覧できない問題を修正
|
||||
|
||||
## 2025.5.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);
|
||||
```
|
||||
|
||||
## 考え方
|
||||
### DRYに囚われるな
|
||||
必要なのは一般化ではなく抽象化と考えます。
|
||||
盲信せず、誤った・不必要な共通化は避け、それが自然だと感じる場合は重複させる勇気を持ちましょう。
|
||||
|
||||
### Misskeyを複雑にしない実装
|
||||
それがいくら複雑であっても、Misskey固有のコンテキストと関心が分離されている(もしくは事実上分離されていると見做すことができる)実装であれば、それはMisskeyのコードベースに対する複雑性に影響を与えないと考えます。
|
||||
|
||||
例えるなら、VueやAiScriptといったMisskeyが使用しているライブラリの内部実装がいくら複雑だったとしても、「それを使用しているからMisskeyの実装は複雑である」ということにはならないのと同じです。
|
||||
|
||||
Misskeyのドメイン知識から関心が分離されているということは、Misskeyの実装について考える時にそれらの内部実装を考慮する必要が無く、認知負荷を増やさないからです。
|
||||
|
||||
また重要な点は、その実装が、Misskeyリポジトリの外部にあるか・内部にあるかということや、Misskeyがメンテナンスするものか・第三者がメンテナンスするものかといったことは複雑性を考える上ではほとんど無視できるという点です。
|
||||
|
||||
もちろんその実装がMisskeyリポジトリにあり、Misskeyがメンテナンスしなければならないものは、保守のコストはかかります。
|
||||
しかし、Misskeyの本質的な設計・実装という観点で見たときは、その実装は実質的に外部ライブラリのように振る舞います。
|
||||
換言すれば「たまたまMisskeyの開発者と同じ人たちがメンテナンスしているし、たまたまMisskeyのリポジトリ内に置いてあるだけの外部ライブラリ」です。
|
||||
|
||||
そのため、実装をなるべくMisskeyのドメイン知識から独立したものにすれば、Misskeyのコードベースの複雑性を上げることなく機能実装を行うことができ、お得であると言えます。
|
||||
もちろんそれにこだわって、些細な実装でもそのように分離してしまうとかえって認知負荷が増えたり、実装量が増えてメリットをデメリットが上回る場合もあるので、ケースバイケースではあります。
|
||||
|
||||
@@ -18,10 +18,12 @@ WORKDIR /misskey
|
||||
|
||||
COPY --link ["pnpm-lock.yaml", "pnpm-workspace.yaml", "package.json", "./"]
|
||||
COPY --link ["scripts", "./scripts"]
|
||||
COPY --link ["patches", "./patches"]
|
||||
COPY --link ["packages/backend/package.json", "./packages/backend/"]
|
||||
COPY --link ["packages/frontend-shared/package.json", "./packages/frontend-shared/"]
|
||||
COPY --link ["packages/frontend/package.json", "./packages/frontend/"]
|
||||
COPY --link ["packages/frontend-embed/package.json", "./packages/frontend-embed/"]
|
||||
COPY --link ["packages/frontend-builder/package.json", "./packages/frontend-builder/"]
|
||||
COPY --link ["packages/icons-subsetter/package.json", "./packages/icons-subsetter/"]
|
||||
COPY --link ["packages/sw/package.json", "./packages/sw/"]
|
||||
COPY --link ["packages/misskey-js/package.json", "./packages/misskey-js/"]
|
||||
@@ -53,6 +55,7 @@ WORKDIR /misskey
|
||||
|
||||
COPY --link ["pnpm-lock.yaml", "pnpm-workspace.yaml", "package.json", "./"]
|
||||
COPY --link ["scripts", "./scripts"]
|
||||
COPY --link ["patches", "./patches"]
|
||||
COPY --link ["packages/backend/package.json", "./packages/backend/"]
|
||||
COPY --link ["packages/misskey-js/package.json", "./packages/misskey-js/"]
|
||||
COPY --link ["packages/misskey-reversi/package.json", "./packages/misskey-reversi/"]
|
||||
|
||||
@@ -34,7 +34,6 @@ describe('Before setup instance', () => {
|
||||
|
||||
cy.intercept('POST', '/api/admin/update-meta').as('update-meta');
|
||||
|
||||
cy.get('[data-cy-next]').click();
|
||||
cy.get('[data-cy-next]').click();
|
||||
cy.get('[data-cy-server-name] input').type('Testskey');
|
||||
cy.get('[data-cy-server-setup-wizard-apply]').click();
|
||||
@@ -79,6 +78,8 @@ describe('After setup instance', () => {
|
||||
cy.get('[data-cy-signup-password] input').type('alice1234');
|
||||
cy.get('[data-cy-signup-submit]').should('be.disabled');
|
||||
cy.get('[data-cy-signup-password-retype] input').type('alice1234');
|
||||
cy.get('[data-cy-signup-submit]').should('be.disabled');
|
||||
cy.get('[data-cy-signup-invitation-code] input').type('test-invitation-code');
|
||||
cy.get('[data-cy-signup-submit]').should('not.be.disabled');
|
||||
cy.get('[data-cy-signup-submit]').click();
|
||||
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
*/
|
||||
|
||||
/* eslint-disable @typescript-eslint/explicit-function-return-type */
|
||||
import { action } from '@storybook/addon-actions';
|
||||
import { StoryObj } from '@storybook/vue3';
|
||||
import { action } from 'storybook/actions';
|
||||
import type { StoryObj } from '@storybook/vue3';
|
||||
import { HttpResponse, http } from 'msw';
|
||||
import { abuseUserReport } from '../packages/frontend/.storybook/fakes.js';
|
||||
import { commonHandlers } from '../packages/frontend/.storybook/mocks.js';
|
||||
|
||||
+17
-1
@@ -68,7 +68,7 @@ receiveFollowRequest: "تلقيت طلب متابعة"
|
||||
followRequestAccepted: "قُبل طلب المتابعة"
|
||||
mention: "أشر الى"
|
||||
mentions: "الإشارات"
|
||||
directNotes: "الملاحظات المباشرة"
|
||||
directNotes: "رسالة خاصة"
|
||||
importAndExport: "إستورد / صدر"
|
||||
import: "استيراد"
|
||||
export: "تصدير"
|
||||
@@ -1008,6 +1008,8 @@ lastNDays: "آخر {n} أيام"
|
||||
surrender: "ألغِ"
|
||||
postForm: "أنشئ ملاحظة"
|
||||
information: "عن"
|
||||
inMinutes: "د"
|
||||
inDays: "ي"
|
||||
_chat:
|
||||
invitations: "دعوة"
|
||||
noHistory: "السجل فارغ"
|
||||
@@ -1589,3 +1591,17 @@ _search:
|
||||
searchScopeAll: "الكل"
|
||||
searchScopeLocal: "المحلي"
|
||||
searchScopeUser: "مستخدم محدد"
|
||||
_watermarkEditor:
|
||||
opacity: "الشفافية"
|
||||
scale: "الحجم"
|
||||
text: "نص"
|
||||
position: "الموضع"
|
||||
type: "نوع"
|
||||
image: "صور"
|
||||
advanced: "متقدم"
|
||||
_imageEffector:
|
||||
_fxProps:
|
||||
scale: "الحجم"
|
||||
size: "الحجم"
|
||||
color: "اللون"
|
||||
opacity: "الشفافية"
|
||||
|
||||
@@ -848,6 +848,8 @@ sourceCode: "সোর্স কোড"
|
||||
flip: "উল্টান"
|
||||
postForm: "নোট লিখুন"
|
||||
information: "আপনার সম্পর্কে"
|
||||
inMinutes: "মিনিট"
|
||||
inDays: "দিন"
|
||||
_chat:
|
||||
invitations: "আমন্ত্রণ"
|
||||
noHistory: "কোনো ইতিহাস নেই"
|
||||
@@ -1349,3 +1351,16 @@ _remoteLookupErrors:
|
||||
_search:
|
||||
searchScopeAll: "সবগুলো"
|
||||
searchScopeLocal: "স্থানীয়"
|
||||
_watermarkEditor:
|
||||
opacity: "অস্বচ্ছতা"
|
||||
scale: "আকার"
|
||||
text: "লেখা"
|
||||
image: "ছবি"
|
||||
advanced: "উন্নত"
|
||||
_imageEffector:
|
||||
_fxProps:
|
||||
scale: "আকার"
|
||||
size: "আকার"
|
||||
color: "রং"
|
||||
opacity: "অস্বচ্ছতা"
|
||||
lightness: "উজ্জ্বল করুন"
|
||||
|
||||
+141
-3
@@ -327,6 +327,7 @@ dark: "Fosc"
|
||||
lightThemes: "Temes clars"
|
||||
darkThemes: "Temes foscos"
|
||||
syncDeviceDarkMode: "Sincronitza el mode fosc amb la configuració del dispositiu"
|
||||
switchDarkModeManuallyWhenSyncEnabledConfirm: "\"{x}\" es troba activat. Vols desactivar la sincronització i canviar de mode manualment?"
|
||||
drive: "Disc"
|
||||
fileName: "Nom del Fitxer"
|
||||
selectFile: "Selecciona un fitxer"
|
||||
@@ -895,7 +896,7 @@ searchResult: "Resultats de la cerca"
|
||||
hashtags: "Etiquetes"
|
||||
troubleshooting: "Solucionar problemes"
|
||||
useBlurEffect: "Fes servir efectes de desenfocament a la interfície"
|
||||
learnMore: "Saber més "
|
||||
learnMore: "Saber-ne més "
|
||||
misskeyUpdated: "Misskey s'ha actualitzat "
|
||||
whatIsNew: "Mostra canvis"
|
||||
translate: "Traduir "
|
||||
@@ -1053,6 +1054,7 @@ permissionDeniedError: "Operació no permesa "
|
||||
permissionDeniedErrorDescription: "Aquest compte no té suficients permisos per dur a terme aquesta acció "
|
||||
preset: "Predefinit"
|
||||
selectFromPresets: "Escull des dels predefinits"
|
||||
custom: "Personalitzat"
|
||||
achievements: "Assoliments"
|
||||
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."
|
||||
@@ -1091,6 +1093,7 @@ prohibitedWordsDescription2: "Fent servir espais crearà expressions AND si l'ex
|
||||
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."
|
||||
notesSearchNotAvailable: "La cerca de notes no es troba disponible."
|
||||
usersSearchNotAvailable: "La cerca d'usuaris no està disponible."
|
||||
license: "Llicència"
|
||||
unfavoriteConfirm: "Esborrar dels favorits?"
|
||||
myClips: "Els meus retalls"
|
||||
@@ -1242,7 +1245,7 @@ releaseToRefresh: "Deixar anar per actualitzar"
|
||||
refreshing: "Recarregant..."
|
||||
pullDownToRefresh: "Llisca cap a baix per recarregar"
|
||||
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ó "
|
||||
doReaction: "Afegeix una reacció "
|
||||
code: "Codi"
|
||||
@@ -1312,6 +1315,7 @@ availableRoles: "Roles disponibles "
|
||||
acknowledgeNotesAndEnable: "Activa'l després de comprendre els possibles perills."
|
||||
federationSpecified: "Aquest servidor treballa amb una federació de llistes blanques. No pot interactuar amb altres servidors que no siguin els especificats per l'administrador."
|
||||
federationDisabled: "La unió es troba deshabilitada en aquest servidor. No es pot interactuar amb usuaris d'altres servidors."
|
||||
draft: "Esborrany "
|
||||
confirmOnReact: "Confirmar en reaccionar"
|
||||
reactAreYouSure: "Vols reaccionar amb \"{emoji}\"?"
|
||||
markAsSensitiveConfirm: "Vols marcar aquest contingut com a sensible?"
|
||||
@@ -1329,6 +1333,7 @@ restore: "Restaurar "
|
||||
syncBetweenDevices: "Sincronització entre dispositius"
|
||||
preferenceSyncConflictTitle: "Els valors de la configuració ja existeixen al dispositiu"
|
||||
preferenceSyncConflictText: "Un element de la configuració amb sincronització activada desa els seus valors al servidor, però s'ha trobat un valor a la configuració desat al servidor per aquest element de la configuració. Quin valor us sobreescriure?"
|
||||
preferenceSyncConflictChoiceMerge: "Integració "
|
||||
preferenceSyncConflictChoiceServer: "Valors de configuració del servidor"
|
||||
preferenceSyncConflictChoiceDevice: "Punts d'ajustos del dispositiu "
|
||||
preferenceSyncConflictChoiceCancel: "Cancel·lar l'activació de la sincronització "
|
||||
@@ -1348,7 +1353,7 @@ embed: "Incrustar"
|
||||
settingsMigrating: "Estem migrant la teva configuració. Si us plau espera un moment... (També pots fer la migració més tard, manualment, anant a Preferències → Altres → Migrar configuració antiga)"
|
||||
readonly: "Només lectura"
|
||||
goToDeck: "Tornar al tauler"
|
||||
federationJobs: "Treballs sindicats "
|
||||
federationJobs: "Treballs de federació"
|
||||
driveAboutTip: "Al Disc veure's una llista de tots els arxius que has anat pujant.<br>\nPots tornar-los a fer servir adjuntant-los a notes noves o pots adelantar-te i pujar arxius per publicar-los més tard!<br>\n<b>Tingués en compte que si esborres un arxiu també desapareixerà de tots els llocs on l'has fet servir (notes, pàgines, avatars, imatges de capçalera, etc.)</b><br>\nTambé pots crear carpetes per organitzar les."
|
||||
scrollToClose: "Desplaçar per tancar"
|
||||
advice: "Consell"
|
||||
@@ -1363,6 +1368,18 @@ abort: "Cancel·lar"
|
||||
tip: "Trucs i consells"
|
||||
redisplayAllTips: "Torna ha mostrat tots els trucs i consells"
|
||||
hideAllTips: "Amagar tots els trucs i consells"
|
||||
defaultImageCompressionLevel: "Nivell de comprensió de la imatge per defecte"
|
||||
defaultImageCompressionLevel_description: "Baixa, conserva la qualitat de la imatge però la mida de l'arxiu és més gran. <br>Alta, redueix la mida de l'arxiu però també la qualitat de la imatge."
|
||||
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:
|
||||
newest: "Més recent"
|
||||
oldest: "Antigues primer"
|
||||
_chat:
|
||||
noMessagesYet: "Encara no tens missatges "
|
||||
newMessage: "Missatge nou"
|
||||
@@ -1450,6 +1467,8 @@ _settings:
|
||||
contentsUpdateFrequency_description: "Com més alt sigui l'adquisició de contingut en temps real, més baixa el rendiment i més consum de dades i bateria."
|
||||
contentsUpdateFrequency_description2: "Quan s'activa el mode en temps real, el contingut s'actualitza en temps real, independentment d'aquesta configuració."
|
||||
showUrlPreview: "Mostrar vista prèvia d'URL"
|
||||
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:
|
||||
showSenderName: "Mostrar el nom del remitent"
|
||||
sendOnEnter: "Introdueix per enviar"
|
||||
@@ -1623,6 +1642,10 @@ _serverSettings:
|
||||
fanoutTimelineDbFallback: "Carregar de la base de dades"
|
||||
fanoutTimelineDbFallbackDescription: "Quan s'activa, la línia de temps fa servir la base de dades per consultes adicionals si la línia de temps no es troba a la memòria cau. Si és desactiva la càrrega del servidor és veure reduïda, però també és reduirà el nombre de línies de temps que és poden obtenir."
|
||||
reactionsBufferingDescription: "Quan s'activa aquesta opció millora bastant el rendiment en recuperar les línies de temps reduint la càrrega de la base. Com a contrapunt, augmentarà l'ús de memòria de Redís. Desactiva aquesta opció en cas de tenir un servidor amb poca memòria o si tens problemes d'inestabilitat."
|
||||
remoteNotesCleaning: "Neteja automàtica de notes remotes"
|
||||
remoteNotesCleaning_description: "Quan activis aquesta opció, periòdicament es netejaran les notes remotes que no es consultin, això evitarà que la base de dades se"
|
||||
remoteNotesCleaningMaxProcessingDuration: "D'oració màxima del temps de funcionament del procés de neteja"
|
||||
remoteNotesCleaningExpiryDaysForEachNotes: "Duració mínima de conservació de les notes"
|
||||
inquiryUrl: "URL de consulta "
|
||||
inquiryUrlDescription: "Escriu adreça URL per al formulari de consulta per al mantenidor del servidor o una pàgina web amb el contacte d'informació."
|
||||
openRegistration: "Registres oberts"
|
||||
@@ -1641,6 +1664,11 @@ _serverSettings:
|
||||
userGeneratedContentsVisibilityForVisitor: "L'abast de la publicació del contingut generat per l'usuari"
|
||||
userGeneratedContentsVisibilityForVisitor_description: "Això ajuda a evitar problemes com que continguts remots inadequats que no hagin estat moderats correctament es publiquin a internet mitjançant el teu servidor."
|
||||
userGeneratedContentsVisibilityForVisitor_description2: "La publicació incondicional de tots els continguts del servidor a internet, incloent-hi els continguts remots rebuts pel servidor, comporta riscos. Això és extremadament important per els espectadors que desconeixen el caràcter descentralitzat dels continguts, ja que poden percebre erroneament els continguts remots com contingut generat per el propi servidor."
|
||||
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:
|
||||
all: "Tot obert al públic "
|
||||
localOnly: "Només es publiquen els continguts locals, el contingut remot es manté privat"
|
||||
@@ -1977,6 +2005,7 @@ _role:
|
||||
descriptionOfRateLimitFactor: "Límits baixos són menys restrictius, límits alts són més restrictius."
|
||||
canHideAds: "Pot amagar la publicitat"
|
||||
canSearchNotes: "Pot cercar notes"
|
||||
canSearchUsers: "Pot cercar usuaris"
|
||||
canUseTranslator: "Pot fer servir el traductor"
|
||||
avatarDecorationLimit: "Nombre màxim de decoracions que es poden aplicar els avatars"
|
||||
canImportAntennas: "Autoritza la importació d'antenes "
|
||||
@@ -1988,6 +2017,8 @@ _role:
|
||||
uploadableFileTypes: "Tipus de fitxers que en podeu pujar"
|
||||
uploadableFileTypes_caption: "Especifica el tipus MIME. Es poden especificar diferents tipus MIME separats amb una nova línia, i es poden especificar comodins amb asteriscs (*). (Per exemple: image/*)"
|
||||
uploadableFileTypes_caption2: "Pot que no sigui possible determinar el tipus MIME d'alguns arxius. Per permetre aquests tipus d'arxius afegeix {x} a les especificacions."
|
||||
noteDraftLimit: "Nombre possible d'esborranys de notes al servidor"
|
||||
watermarkAvailable: "Pots fer servir la marca d'aigua"
|
||||
_condition:
|
||||
roleAssignedTo: "Assignat a rols manuals"
|
||||
isLocal: "Usuari local"
|
||||
@@ -2147,6 +2178,7 @@ _theme:
|
||||
install: "Instal·lar un tema"
|
||||
manage: "Gestionar els temes "
|
||||
code: "Codi del tema"
|
||||
copyThemeCode: "Copiar el codi del tema"
|
||||
description: "Descripció"
|
||||
installed: "{name} Instal·lat "
|
||||
installedThemes: "Temes instal·lats "
|
||||
@@ -2246,6 +2278,7 @@ _time:
|
||||
minute: "Minut(s)"
|
||||
hour: "Hor(a)(es)"
|
||||
day: "Di(a)(es)"
|
||||
month: "Mes(os)"
|
||||
_2fa:
|
||||
alreadyRegistered: "J has registrat un dispositiu d'autenticació de doble factor."
|
||||
registerTOTP: "Registrar una aplicació autenticadora"
|
||||
@@ -2460,6 +2493,8 @@ _visibility:
|
||||
disableFederation: "Sense federar"
|
||||
disableFederationDescription: "No enviar a altres servidors"
|
||||
_postForm:
|
||||
quitInspiteOfThereAreUnuploadedFilesConfirm: "Hi ha arxius que no s'han carregat, vols descartar-los i tancar el formulari?"
|
||||
uploaderTip: "L'arxiu encara no s'ha carregat. Des del menú arxiu pots canviar el nom, retallar imatges, posar marques d'aigua i comprimir o no l'arxiu. Els arxius es carreguen automàticament quan públiques una nota."
|
||||
replyPlaceholder: "Contestar..."
|
||||
quotePlaceholder: "Citar..."
|
||||
channelPlaceholder: "Publicar a un canal..."
|
||||
@@ -2793,6 +2828,7 @@ _fileViewer:
|
||||
url: "URL"
|
||||
uploadedAt: "Pujat el"
|
||||
attachedNotes: "Notes amb aquest fitxer"
|
||||
usage: "Ús "
|
||||
thisPageCanBeSeenFromTheAuthor: "Aquesta pàgina només la pot veure l'usuari que ha pujat aquest fitxer."
|
||||
_externalResourceInstaller:
|
||||
title: "Instal·lar des d'un lloc extern"
|
||||
@@ -3045,6 +3081,7 @@ _bootErrors:
|
||||
otherOption1: "Esborrar la configuració i la memòria cau del client"
|
||||
otherOption2: "Iniciar client senzill"
|
||||
otherOption3: "Iniciar l'eina de reparació "
|
||||
otherOption4: "Iniciar Misskey en mode segur"
|
||||
_search:
|
||||
searchScopeAll: "Tot"
|
||||
searchScopeLocal: "Local"
|
||||
@@ -3081,6 +3118,9 @@ _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_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."
|
||||
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."
|
||||
remoteContentsCleaning_description2: "Alguns mètodes de referència, com els enllaços, no poden ser detectats pel sistema."
|
||||
adminInfo: "Informació de l'administrador "
|
||||
adminInfo_description: "Estableix la informació de l'administrador que es farà servir per rebre consultes."
|
||||
adminInfo_mustBeFilled: "Aquesta informació ha de ser omplerta si el servidor té els registres oberts o la federació es troba activada."
|
||||
@@ -3096,6 +3136,7 @@ _serverSetupWizard:
|
||||
text2: "Si ho desitges, agrairíem molt la teva donació per poder seguir desenvolupant el projecte."
|
||||
text3: "També hi ha privilegis especials per als donants!"
|
||||
_uploader:
|
||||
editImage: "Edició d'imatges"
|
||||
compressedToX: "Comprimit a {x}"
|
||||
savedXPercent: "{x}% d'estalvi "
|
||||
abortConfirm: "Hi ha un arxiu que no s'ha pujat, vols cancel·lar?"
|
||||
@@ -3115,3 +3156,100 @@ _clip:
|
||||
tip: "Clip és una funció que permet organitzar les teves notes."
|
||||
_userLists:
|
||||
tip: "Es poden crear llistes amb qualsevol usuari. La llista creada es pot mostrar com una línia de temps."
|
||||
watermark: "Marca d'aigua "
|
||||
defaultPreset: "Per defecte"
|
||||
_watermarkEditor:
|
||||
tip: "A la imatge es pot afegir una marca d'aigua com informació sobre drets."
|
||||
quitWithoutSaveConfirm: "Sortir sense desar?"
|
||||
driveFileTypeWarn: "Aquest arxiu no és compatible"
|
||||
driveFileTypeWarnDescription: "Selecciona un arxiu d'imatge "
|
||||
title: "Editar la marca d'aigua "
|
||||
cover: "Cobrir-ho tot"
|
||||
repeat: "Repetir"
|
||||
opacity: "Opacitat"
|
||||
scale: "Mida"
|
||||
text: "Text"
|
||||
position: "Posició "
|
||||
type: "Tipus"
|
||||
image: "Imatges"
|
||||
advanced: "Avançat"
|
||||
angle: "Angle"
|
||||
stripe: "Bandes"
|
||||
stripeWidth: "Amplada de la banda"
|
||||
stripeFrequency: "Freqüència de la banda"
|
||||
polkadot: "Lunars"
|
||||
checker: "Escacs"
|
||||
polkadotMainDotOpacity: "Opacitat del lunar principal"
|
||||
polkadotMainDotRadius: "Mida del lunar principal"
|
||||
polkadotSubDotOpacity: "Opacitat del lunar secundari"
|
||||
polkadotSubDotRadius: "Mida del lunar secundari"
|
||||
polkadotSubDotDivisions: "Nombre de punts secundaris"
|
||||
_imageEffector:
|
||||
title: "Efecte"
|
||||
addEffect: "Afegeix un efecte"
|
||||
discardChangesConfirm: "Vols descartar els canvis i sortir?"
|
||||
nothingToConfigure: "No hi ha opcions de configuració disponibles"
|
||||
_fxs:
|
||||
chromaticAberration: "Aberració cromàtica"
|
||||
glitch: "Glitch"
|
||||
mirror: "Mirall"
|
||||
invert: "Inversió cromàtica "
|
||||
grayscale: "Monocrom "
|
||||
colorAdjust: "Correcció de color"
|
||||
colorClamp: "Compressió cromàtica "
|
||||
colorClampAdvanced: "Compressió de cromàtica avançada "
|
||||
distort: "Distorsió "
|
||||
threshold: "Binarització"
|
||||
zoomLines: "Saturació de línies "
|
||||
stripe: "Bandes"
|
||||
polkadot: "Lunars"
|
||||
checker: "Escacs"
|
||||
blockNoise: "Bloqueig de soroll"
|
||||
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:
|
||||
select: "Seleccionar esborrany"
|
||||
cannotCreateDraftAnymore: "S'ha sobrepassat el nombre màxim d'esborranys que es poden crear."
|
||||
cannotCreateDraft: "Amb aquest contingut no es poden crear esborranys."
|
||||
delete: "Esborrar esborranys"
|
||||
deleteAreYouSure: "Vols esborrar els esborranys?"
|
||||
noDrafts: "No hi ha esborranys"
|
||||
replyTo: "Respondre a {user}"
|
||||
quoteOf: "Citar les notes de {user}"
|
||||
postTo: "Destinat a {channel}"
|
||||
saveToDraft: "Desar com a esborrany"
|
||||
restoreFromDraft: "Restaurar des dels esborranys"
|
||||
restore: "Restaurar esborrany"
|
||||
listDrafts: "Llistat d'esborranys"
|
||||
|
||||
+18
-1
@@ -1107,6 +1107,8 @@ lastNDays: "Posledních {n} dnů"
|
||||
surrender: "Zrušit"
|
||||
postForm: "Formulář pro odeslání"
|
||||
information: "Informace"
|
||||
inMinutes: "Minut"
|
||||
inDays: "Dnů"
|
||||
_chat:
|
||||
invitations: "Pozvat"
|
||||
noHistory: "Žádná historie"
|
||||
@@ -2002,7 +2004,7 @@ _deck:
|
||||
list: "Seznamy"
|
||||
channel: "Kanály"
|
||||
mentions: "Zmínění"
|
||||
direct: "Přímý"
|
||||
direct: "Přímé poznámky"
|
||||
roleTimeline: "Časová osa role"
|
||||
_dialog:
|
||||
charactersExceeded: "Překročili jste maximální počet znaků! V současné době je na hodnotě {current} z {max}."
|
||||
@@ -2043,3 +2045,18 @@ _search:
|
||||
searchScopeAll: "Vše"
|
||||
searchScopeLocal: "Místní"
|
||||
searchScopeUser: "Upřesnit uživatele"
|
||||
_watermarkEditor:
|
||||
opacity: "Průhlednost"
|
||||
scale: "Velikost"
|
||||
text: "Text"
|
||||
position: "Pozice"
|
||||
type: "Typ"
|
||||
image: "Obrázky"
|
||||
advanced: "Pokročilé"
|
||||
_imageEffector:
|
||||
_fxProps:
|
||||
scale: "Velikost"
|
||||
size: "Velikost"
|
||||
color: "Barva"
|
||||
opacity: "Průhlednost"
|
||||
lightness: "Zesvětlit"
|
||||
|
||||
+194
-2
@@ -298,6 +298,7 @@ uploadFromUrl: "Von einer URL hochladen"
|
||||
uploadFromUrlDescription: "URL der hochzuladenden Datei"
|
||||
uploadFromUrlRequested: "Upload angefordert"
|
||||
uploadFromUrlMayTakeTime: "Es kann eine Weile dauern, bis das Hochladen abgeschlossen ist."
|
||||
uploadNFiles: "Lade {n} Dateien hoch"
|
||||
explore: "Erkunden"
|
||||
messageRead: "Gelesen"
|
||||
noMoreHistory: "Kein weiterer Verlauf vorhanden"
|
||||
@@ -326,6 +327,7 @@ dark: "Dunkel"
|
||||
lightThemes: "Helle Farbschemata"
|
||||
darkThemes: "Dunkle Farbschemata"
|
||||
syncDeviceDarkMode: "Einstellung deines Geräts übernehmen"
|
||||
switchDarkModeManuallyWhenSyncEnabledConfirm: "\"{x}\" ist eingeschaltet. Möchtest du die Synchronisation ausschalten und den Modus manuell wechseln?"
|
||||
drive: "Drive"
|
||||
fileName: "Dateiname"
|
||||
selectFile: "Datei auswählen"
|
||||
@@ -575,8 +577,10 @@ showFixedPostForm: "Bereich zum Schreiben neuer Notizen am Anfang der Chronik an
|
||||
showFixedPostFormInChannel: "Bereich zum Schreiben neuer Notizen am Anfang der Chronik anzeigen (Kanäle)"
|
||||
withRepliesByDefaultForNewlyFollowed: "Standardmäßig Antworten von neu gefolgten Benutzern in der Chronik anzeigen"
|
||||
newNoteRecived: "Es gibt neue Notizen"
|
||||
newNote: "Neue Notiz"
|
||||
sounds: "Töne"
|
||||
sound: "Töne"
|
||||
notificationSoundSettings: "Benachrichtigungston festlegen"
|
||||
listen: "Anhören"
|
||||
none: "Nichts"
|
||||
showInPage: "In einer Seite anzeigen"
|
||||
@@ -791,6 +795,7 @@ wide: "Breit"
|
||||
narrow: "Schmal"
|
||||
reloadToApplySetting: "Diese Einstellung tritt nach einer Aktualisierung der Seite in Kraft. Jetzt aktualisieren?"
|
||||
needReloadToApply: "Diese Einstellung tritt nach einer Aktualisierung der Seite in Kraft."
|
||||
needToRestartServerToApply: "Diese Einstellung tritt nach einem Neustart des Servers in Kraft."
|
||||
showTitlebar: "Titelleiste anzeigen"
|
||||
clearCache: "Cache leeren"
|
||||
onlineUsersCount: "{n} Benutzer sind online"
|
||||
@@ -997,6 +1002,7 @@ failedToUpload: "Hochladen fehlgeschlagen"
|
||||
cannotUploadBecauseInappropriate: "Diese Datei kann nicht hochgeladen werden, da Anteile der Datei als möglicherweise unangebracht festgestellt wurden."
|
||||
cannotUploadBecauseNoFreeSpace: "Die Datei konnte nicht hochgeladen werden, da dein Drive-Speicherplatz aufgebraucht ist."
|
||||
cannotUploadBecauseExceedsFileSizeLimit: "Diese Datei kann wegen Überschreitung der Maximalgröße nicht hochgeladen werden."
|
||||
cannotUploadBecauseUnallowedFileType: "Hochladen nicht möglich wegen unzulässigem Dateityp."
|
||||
beta: "Beta"
|
||||
enableAutoSensitive: "Automarkierung sensibler Medien"
|
||||
enableAutoSensitiveDescription: "Setzt soweit möglich durch Verwendung von Machine Learning automatisch Markierungen für sensible Medien. Auch wenn du diese Option deaktiviert hast, ist sie möglicherweise auf Instanzebene aktiviert."
|
||||
@@ -1237,7 +1243,6 @@ releaseToRefresh: "Zum Aktualisieren loslassen"
|
||||
refreshing: "Wird aktualisiert..."
|
||||
pullDownToRefresh: "Zum Aktualisieren ziehen"
|
||||
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."
|
||||
doReaction: "Reagieren"
|
||||
code: "Code"
|
||||
@@ -1307,6 +1312,7 @@ availableRoles: "Verfügbare Rollen"
|
||||
acknowledgeNotesAndEnable: "Schalten Sie dies erst ein, wenn Sie die Vorsichtsmaßnahmen verstanden haben."
|
||||
federationSpecified: "Dieser Server arbeitet mit Whitelist-Föderation. Er kann nicht mit anderen als den vom Administrator angegebenen Servern interagieren."
|
||||
federationDisabled: "Föderation ist auf diesem Server deaktiviert. Es ist nicht möglich, mit Benutzern auf anderen Servern zu interagieren."
|
||||
draft: "Entwurf"
|
||||
confirmOnReact: "Reagieren bestätigen"
|
||||
reactAreYouSure: "Willst du eine \"{emoji}\"-Reaktion hinzufügen?"
|
||||
markAsSensitiveConfirm: "Möchtest du dieses Medium als sensibel kennzeichnen?"
|
||||
@@ -1324,6 +1330,7 @@ restore: "Wiederherstellen"
|
||||
syncBetweenDevices: "Zwischen Geräten synchronisieren"
|
||||
preferenceSyncConflictTitle: "Der konfigurierte Wert ist auf dem Server bereits vorhanden."
|
||||
preferenceSyncConflictText: "Die Einstellungen mit aktivierter Synchronisierung werden ihre Werte auf dem Server speichern. Es gibt jedoch bereits Werte auf dem Server. Welche Einstellungswerte sollen überschrieben werden?"
|
||||
preferenceSyncConflictChoiceMerge: "Zusammenführen"
|
||||
preferenceSyncConflictChoiceServer: "Konfigurierte Werte auf dem Server"
|
||||
preferenceSyncConflictChoiceDevice: "Konfigurierte Werte auf dem Gerät"
|
||||
preferenceSyncConflictChoiceCancel: "Einrichten der Synchronisierung abbrechen"
|
||||
@@ -1340,12 +1347,31 @@ right: "Rechts"
|
||||
bottom: "Unten"
|
||||
top: "Oben"
|
||||
embed: "Einbetten"
|
||||
settingsMigrating: "Ihre Einstellungen werden gerade migriert, Bitte warten Sie einen Moment... (Sie können die Einstellungen später auch manuell migrieren, indem Sie zu Einstellungen → Sonstiges → Alte Einstellungen migrieren gehen)"
|
||||
settingsMigrating: "Deine Einstellungen werden gerade migriert. Bitte warte einen Moment... (Du kannst die Einstellungen später auch manuell migrieren, indem du zu Einstellungen → Anderes → Alte Einstellungen migrieren gehst)"
|
||||
readonly: "Nur Lesezugriff"
|
||||
goToDeck: "Zurück zum Deck"
|
||||
federationJobs: "Föderation Jobs"
|
||||
driveAboutTip: "In Drive sehen Sie eine Liste der Dateien, die Sie in der Vergangenheit hochgeladen haben. <br>\nSie können diese Dateien wiederverwenden um sie zu beispiel an Notizen anzuhängen, oder sie können Dateien vorab hochzuladen, um sie später zu versenden! <br>\n<b>Wenn Sie eine Datei löschen, verschwindet sie auch von allen Stellen, an denen Sie sie verwendet haben (Notizen, Seiten, Avatare, Banner usw.).</b><br>\nSie können auch Ordner erstellen, um sie zu organisieren."
|
||||
scrollToClose: "Zum Schließen scrollen"
|
||||
advice: "Tipps"
|
||||
realtimeMode: "Echtzeit-Modus"
|
||||
turnItOn: "Einschalten"
|
||||
turnItOff: "Ausschalten"
|
||||
emojiMute: "Emoji stummschalten"
|
||||
emojiUnmute: "Emoji-Stummschaltung aufheben"
|
||||
muteX: "{x} stummschalten"
|
||||
unmuteX: "Stummschaltung von {x} aufheben"
|
||||
abort: "Abbrechen"
|
||||
tip: "Tipps und Tricks"
|
||||
redisplayAllTips: "Alle „Tipps und Tricks“ wieder anzeigen"
|
||||
hideAllTips: "Alle „Tipps und Tricks“ ausblenden"
|
||||
defaultImageCompressionLevel: "Standard-Bildkomprimierungsstufe"
|
||||
defaultImageCompressionLevel_description: "Ein niedrigerer Wert erhält die Bildqualität, erhöht aber die Dateigröße. <br>Höhere Werte reduzieren die Dateigröße, verringern aber die Bildqualität."
|
||||
inMinutes: "Minute(n)"
|
||||
inDays: "Tag(en)"
|
||||
_order:
|
||||
newest: "Neueste zuerst"
|
||||
oldest: "Älteste zuerst"
|
||||
_chat:
|
||||
noMessagesYet: "Noch keine Nachrichten"
|
||||
newMessage: "Neue Nachricht"
|
||||
@@ -1379,6 +1405,8 @@ _chat:
|
||||
chatNotAvailableInOtherAccount: "Die Chatfunktion wurde vom anderen Benutzer deaktiviert."
|
||||
cannotChatWithTheUser: "Starten eines Chats mit diesem Benutzer nicht möglich"
|
||||
cannotChatWithTheUser_description: "Der Chat ist entweder nicht verfügbar oder die andere Seite hat den Chat nicht aktiviert."
|
||||
youAreNotAMemberOfThisRoomButInvited: "Du bist kein Teilnehmer in diesem Raum, aber du hast eine Einladung erhalten. Bitte nimm die Einladung an, um beizutreten."
|
||||
doYouAcceptInvitation: "Nimmst du die Einladung an?"
|
||||
chatWithThisUser: "Mit dem Benutzer chatten"
|
||||
thisUserAllowsChatOnlyFromFollowers: "Dieser Benutzer nimmt nur Chats von Followern an."
|
||||
thisUserAllowsChatOnlyFromFollowing: "Dieser Benutzer nimmt nur Chats von Benutzern an, denen er folgt."
|
||||
@@ -1418,12 +1446,20 @@ _settings:
|
||||
makeEveryTextElementsSelectable: "Alle Textelemente auswählbar machen"
|
||||
makeEveryTextElementsSelectable_description: "Die Aktivierung kann in manchen Situationen die Benutzerfreundlichkeit beeinträchtigen."
|
||||
useStickyIcons: "Icons beim Scrollen folgen lassen"
|
||||
enableHighQualityImagePlaceholders: "Zeige Platzhalter für Bilder in hoher Qualität an"
|
||||
uiAnimations: "Animationen der Benutzeroberfläche"
|
||||
showNavbarSubButtons: "Unterschaltflächen in der Navigationsleiste anzeigen"
|
||||
ifOn: "Wenn eingeschaltet"
|
||||
ifOff: "Wenn ausgeschaltet"
|
||||
enableSyncThemesBetweenDevices: "Synchronisierung von installierten Themen auf verschiedenen Endgeräten"
|
||||
enablePullToRefresh: "Ziehen zum Aktualisieren"
|
||||
enablePullToRefresh_description: "Bei Benutzung einer Maus, mit gedrücktem Mausrad ziehen"
|
||||
realtimeMode_description: "Stellt eine Verbindung mit dem Server her und aktualisiert die Inhalte in Echtzeit. Kann zu mehr Datenverkehr einem höheren Akkuverbrauch führen."
|
||||
contentsUpdateFrequency: "Häufigkeit des Abrufs von Inhalten"
|
||||
contentsUpdateFrequency_description: "Je höher der Wert, desto häufiger werden die Inhalte aktualisiert, aber die Leistung sinkt und der Datenverkehr und der Akkuverbrauch steigen."
|
||||
contentsUpdateFrequency_description2: "Wenn der Echtzeitmodus aktiviert ist, werden die Inhalte unabhängig von dieser Einstellung in Echtzeit aktualisiert."
|
||||
showUrlPreview: "URL-Vorschau anzeigen"
|
||||
showAvailableReactionsFirstInNote: "Zeige die verfügbaren Reaktionen im oberen Bereich an."
|
||||
_chat:
|
||||
showSenderName: "Name des Absenders anzeigen"
|
||||
sendOnEnter: "Eingabetaste sendet Nachricht"
|
||||
@@ -1604,6 +1640,21 @@ _serverSettings:
|
||||
thisSettingWillAutomaticallyOffWhenModeratorsInactive: "Wenn über einen bestimmten Zeitraum keine Moderatorenaktivität festgestellt wird, wird diese Einstellung automatisch deaktiviert, um Spam zu verhindern."
|
||||
deliverSuspendedSoftware: "Software, die nicht mehr beliefert wird"
|
||||
deliverSuspendedSoftwareDescription: "Sie können eine Auswahl von Namen und Versionen verschiedener Serversoftware angeben, um die Zustellung zu stoppen, z. B. aufgrund von Sicherheitslücken. Diese Versionsinformationen werden vom Server bereitgestellt und ihre Zuverlässigkeit ist nicht garantiert. Es wird jedoch empfohlen, eine Vorabversion anzugeben, wie z. B. >= 2024.3.1-0, da die Angabe >= 2024.3.1 keine benutzerdefinierten Versionen wie 2024.3.1-custom.0 einschließt."
|
||||
singleUserMode: "Einzelbenutzermodus"
|
||||
singleUserMode_description: "Wenn du der einzige Benutzer dieses Servers bist, optimiert die Aktivierung dieses Modus die Leistung des Servers."
|
||||
signToActivityPubGet: "ActivityPub-GET-Anfragen signieren"
|
||||
signToActivityPubGet_description: "Normalerweise sollte diese Option aktiviert sein. Die Deaktivierung kann Probleme im Zusammenhang mit der Föderation beheben, aber andererseits könnte sie die Föderation mit einigen anderen Servern deaktivieren."
|
||||
proxyRemoteFiles: "Proxy für Dateien fremder Instanzen"
|
||||
proxyRemoteFiles_description: "Wenn diese Einstellung aktiviert ist, werden fremde Dateien über einen Proxyserver übertragen und bereitgestellt. Dies hilft bei der Erstellung von Vorschaubildern und schützt die Privatsphäre der Benutzer."
|
||||
allowExternalApRedirect: "Weiterleitungen für Anfragen über ActivityPub zulassen"
|
||||
allowExternalApRedirect_description: "Wenn diese Option aktiviert ist, können andere Server Inhalte von Drittanbietern über diesen Server abfragen, was jedoch zu Content-Spoofing führen kann."
|
||||
userGeneratedContentsVisibilityForVisitor: "Sichtbarkeit von nutzergenerierten Inhalten für Gäste"
|
||||
userGeneratedContentsVisibilityForVisitor_description: "Dies ist nützlich, um zu verhindern, dass unangemessene Inhalte, die nicht gut moderiert sind, ungewollt über deinen eigenen Server im Internet veröffentlicht werden."
|
||||
userGeneratedContentsVisibilityForVisitor_description2: "Die uneingeschränkte Veröffentlichung aller Inhalte des Servers im Internet, einschließlich der vom Server empfangenen Fremdinhalte, birgt Risiken. Dies ist besonders wichtig für Betrachter, die sich des dezentralen Charakters der Inhalte nicht bewusst sind, da sie selbst fremde Inhalte fälschlicherweise als auf dem Server erstellte Inhalte wahrnehmen könnten."
|
||||
_userGeneratedContentsVisibilityForVisitor:
|
||||
all: "Alles ist öffentlich"
|
||||
localOnly: "Nur lokale Inhalte werden veröffentlicht, fremde Inhalte bleiben privat"
|
||||
none: "Alles ist privat"
|
||||
_accountMigration:
|
||||
moveFrom: "Von einem anderen Konto zu diesem migrieren"
|
||||
moveFromSub: "Alias für ein anderes Konto erstellen"
|
||||
@@ -1944,6 +1995,11 @@ _role:
|
||||
canImportMuting: "Importieren von Stummgeschalteten zulassen"
|
||||
canImportUserLists: "Importieren von Listen erlauben"
|
||||
chatAvailability: "Chatten erlauben"
|
||||
uploadableFileTypes: "Hochladbare Dateitypen"
|
||||
uploadableFileTypes_caption: "Gibt die zulässigen MIME-/Dateitypen an. Mehrere MIME-Typen können durch einen Zeilenumbruch getrennt angegeben werden, und Platzhalter können mit einem Sternchen (*) angegeben werden. (z. B. image/*)"
|
||||
uploadableFileTypes_caption2: "Bei manchen Dateien ist es nicht möglich, den Typ zu bestimmen. Um solche Dateien zuzulassen, füge {x} der Spezifikation hinzu."
|
||||
noteDraftLimit: "Anzahl der möglichen Entwürfe für serverseitige Notizen"
|
||||
watermarkAvailable: "Kann die Wasserzeichenfunktion verwenden"
|
||||
_condition:
|
||||
roleAssignedTo: "Manuellen Rollen zugewiesen"
|
||||
isLocal: "Lokaler Benutzer"
|
||||
@@ -2103,6 +2159,7 @@ _theme:
|
||||
install: "Farbschemata installieren"
|
||||
manage: "Farbschemaverwaltung"
|
||||
code: "Farbschemencode"
|
||||
copyThemeCode: "Farbschemencode kopieren"
|
||||
description: "Beschreibung"
|
||||
installed: "{name} wurde installiert"
|
||||
installedThemes: "Installierte Farbschemata"
|
||||
@@ -2416,6 +2473,8 @@ _visibility:
|
||||
disableFederation: "Deföderieren"
|
||||
disableFederationDescription: "Nicht an andere Instanzen übertragen"
|
||||
_postForm:
|
||||
quitInspiteOfThereAreUnuploadedFilesConfirm: "Es gibt Dateien, die nicht hochgeladen wurden. Möchtest du diese verwerfen und das Formular schließen?"
|
||||
uploaderTip: "Die Datei wurde noch nicht hochgeladen. Über das Dateimenü kannst du sie umbenennen, das Bild zuschneiden, ein Wasserzeichen hinzufügen, komprimieren usw. Die Datei wird automatisch hochgeladen, wenn du eine Notiz veröffentlichst."
|
||||
replyPlaceholder: "Dieser Notiz antworten …"
|
||||
quotePlaceholder: "Diese Notiz zitieren …"
|
||||
channelPlaceholder: "In einen Kanal senden"
|
||||
@@ -2796,6 +2855,12 @@ _dataSaver:
|
||||
_avatar:
|
||||
title: "Animierte Profilbilder deaktivieren"
|
||||
description: "Die Animation von Profilbildern wird angehalten. Da animierte Bilder eine größere Dateigröße haben können als normale Bilder, kann dies den Datenverkehr weiter reduzieren."
|
||||
_urlPreviewThumbnail:
|
||||
title: "URL-Vorschaubilder ausblenden"
|
||||
description: "URL-Vorschaubilder werden nicht mehr geladen."
|
||||
_disableUrlPreview:
|
||||
title: "URL-Vorschau deaktivieren"
|
||||
description: "Deaktiviert die URL-Vorschaufunktion. Anders als bei reinen Vorschaubildern wird dadurch das Laden der verlinkten Informationen selbst reduziert."
|
||||
_code:
|
||||
title: "Code-Hervorhebungen ausblenden"
|
||||
description: "Wenn Code-Hervorhebungen in MFM usw. verwendet werden, werden sie erst geladen, wenn sie angetippt werden. Die Syntaxhervorhebung erfordert das Herunterladen der Definitionsdateien für jede Programmiersprache. Es ist daher zu erwarten, dass die Deaktivierung des automatischen Ladens dieser Dateien die Menge des Datenverkehrs reduziert."
|
||||
@@ -2853,6 +2918,8 @@ _offlineScreen:
|
||||
_urlPreviewSetting:
|
||||
title: "Einstellungen der URL-Vorschau"
|
||||
enable: "URL-Vorschau aktivieren"
|
||||
allowRedirect: "Umleitung von URL-Vorschauen erlauben"
|
||||
allowRedirectDescription: "Wenn für eine URL eine Umleitung festgelegt ist, kann diese Funktion aktiviert werden, um der Umleitung zu folgen und eine Vorschau des umgeleiteten Inhalts anzuzeigen. Die Deaktivierung spart Serverressourcen, aber der Inhalt des Weiterleitungsziels wird nicht angezeigt."
|
||||
timeout: "Zeitüberschreitung beim Abrufen der Vorschau (ms)"
|
||||
timeoutDescription: "Übersteigt die für die Vorschau benötigte Zeit diesen Wert, wird keine Vorschau generiert."
|
||||
maximumContentLength: "Maximale Content-Length (Bytes)"
|
||||
@@ -3001,3 +3068,128 @@ _search:
|
||||
pleaseEnterServerHost: "Gib den Server-Host ein"
|
||||
pleaseSelectUser: "Benutzer auswählen"
|
||||
serverHostPlaceholder: "Beispiel: misskey.example.com"
|
||||
_serverSetupWizard:
|
||||
installCompleted: "Die Installation von Misskey ist abgeschlossen!"
|
||||
firstCreateAccount: "Erstelle zunächst ein Administratorkonto."
|
||||
accountCreated: "Ein Administratorkonto wurde angelegt!"
|
||||
serverSetting: "Servereinstellungen"
|
||||
youCanEasilyConfigureOptimalServerSettingsWithThisWizard: "Mit diesem Assistenten lässt sich die optimale Serverkonfiguration leicht einrichten."
|
||||
settingsYouMakeHereCanBeChangedLater: "Die Einstellungen hier können später geändert werden."
|
||||
howWillYouUseMisskey: "Wie wirst du Misskey verwenden?"
|
||||
_use:
|
||||
single: "Ein-Personen-Server"
|
||||
single_description: "Verwende den Server alleine als deinen eigenen."
|
||||
single_youCanCreateMultipleAccounts: "Bei Bedarf können mehrere Konten eingerichtet werden, auch wenn es sich um einen Ein-Personen-Server handelt."
|
||||
group: "Gruppenserver"
|
||||
group_description: "Lade andere vertrauenswürdige Benutzer ein und verwende es mit mehreren Personen."
|
||||
open: "Offener Server"
|
||||
open_description: "Registrierung für alle öffnen."
|
||||
openServerAdvice: "Die Aufnahme einer unbestimmten Anzahl von Nutzern birgt Risiken. Es wird empfohlen, mit einem zuverlässigen Moderationssystem zu arbeiten, um eventuell auftretende Probleme behandeln zu können."
|
||||
openServerAntiSpamAdvice: "Große Sorgfalt muss auch auf die Sicherheit gelegt werden, z. B. durch die Aktivierung von Anti-Bot-Funktionen wie reCAPTCHA, um sicherzustellen, dass der Server nicht zum Verbreiten von Spam genutzt wird."
|
||||
howManyUsersDoYouExpect: "Mit wie vielen Benutzern rechnest du?"
|
||||
_scale:
|
||||
small: "Weniger als 100 (kleiner Maßstab)"
|
||||
medium: "Mehr als 100 und weniger als 1000 Benutzer (mittelgroß)"
|
||||
large: "Mehr als 1000 (großer Maßstab)"
|
||||
largeScaleServerAdvice: "Für große Server sind unter Umständen fortgeschrittene Kenntnisse erforderlich, z. B. Lastverteilung und Datenbankreplikation."
|
||||
doYouConnectToFediverse: "Mit dem Fediverse verbinden?"
|
||||
doYouConnectToFediverse_description1: "Bei Anschluss an ein Netz von verteilten Servern (Fediverse) können Inhalte mit anderen Servern ausgetauscht werden."
|
||||
doYouConnectToFediverse_description2: "Die Verbindung mit dem Fediverse wird auch als „Föderation“ bezeichnet."
|
||||
youCanConfigureMoreFederationSettingsLater: "Erweiterte Einstellungen, wie z. B. die Angabe von föderierbaren Servern, können später vorgenommen werden."
|
||||
adminInfo: "Administrator-Informationen"
|
||||
adminInfo_description: "Legt die Administrator-Informationen fest, die für den Empfang von Anfragen verwendet werden."
|
||||
adminInfo_mustBeFilled: "Dies ist auf einem offenen Server oder bei aktivierter Föderation erforderlich."
|
||||
followingSettingsAreRecommended: "Die folgenden Einstellungen werden empfohlen"
|
||||
applyTheseSettings: "Diese Einstellungen anwenden"
|
||||
skipSettings: "Konfiguration überspringen"
|
||||
settingsCompleted: "Einrichtung abgeschlossen!"
|
||||
settingsCompleted_description: "Vielen Dank für deine Zeit. Jetzt, wo alles fertig ist, kannst du den Server sofort benutzen."
|
||||
settingsCompleted_description2: "Detaillierte Servereinstellungen können über die „Systemsteuerung“ vorgenommen werden."
|
||||
donationRequest: "Spendenaufruf"
|
||||
_donationRequest:
|
||||
text1: "Misskey ist eine freie Software, die von Freiwilligen entwickelt wird."
|
||||
text2: "Wir würden uns über deine Unterstützung freuen, damit wir dieses Projekt auch in Zukunft weiterentwickeln können."
|
||||
text3: "Für Unterstützer gibt es auch besondere Vorteile!"
|
||||
_uploader:
|
||||
editImage: "Bild bearbeiten"
|
||||
compressedToX: "Komprimiert zu {x}"
|
||||
savedXPercent: "{x}% gespart"
|
||||
abortConfirm: "Einige Dateien wurden nicht hochgeladen. Möchtest du den Vorgang abbrechen?"
|
||||
doneConfirm: "Einige Dateien wurden nicht hochgeladen. Möchtest du den Vorgang fortsetzen?"
|
||||
maxFileSizeIsX: "Die maximale Dateigröße, die hochgeladen werden kann, beträgt {x}."
|
||||
allowedTypes: "Hochladbare Dateitypen"
|
||||
tip: "Die Datei ist noch nicht hochgeladen worden. In diesem Dialog kannst du die Datei vor dem Hochladen anzeigen, umbenennen, komprimieren und zuschneiden. Wenn du fertig bist, klicke auf „Hochladen“, um den Upload zu starten."
|
||||
_clientPerformanceIssueTip:
|
||||
makeSureDisabledAdBlocker: "Deaktiviere deinen Adblocker"
|
||||
makeSureDisabledAdBlocker_description: "Adblocker können die Leistung beeinträchtigen; vergewissere dich, ob in deinem Betriebssystem, Browser oder deinen Add-ons Adblocker aktiviert sind."
|
||||
makeSureDisabledCustomCss: "Benutzerdefiniertes CSS deaktivieren"
|
||||
makeSureDisabledCustomCss_description: "Das Überschreiben von Stilen kann die Leistung beeinträchtigen. Stelle daher sicher, dass du kein benutzerdefiniertes CSS oder Erweiterungen aktiviert hast, die Stile überschreiben."
|
||||
makeSureDisabledAddons: "Erweiterungen deaktivieren"
|
||||
makeSureDisabledAddons_description: "Einige Erweiterungen können das Verhalten des Clients stören und die Leistung beeinträchtigen. Deaktiviere die Browser-Erweiterungen und prüfe, ob sich die Situation dadurch verbessert."
|
||||
_clip:
|
||||
tip: "Clips sind eine Funktion, mit der du Notizen gruppieren kannst."
|
||||
_userLists:
|
||||
tip: "Es können Listen mit beliebigen Benutzern erstellt werden. Die erstellte Liste kann als eigene Chronik angezeigt werden."
|
||||
watermark: "Wasserzeichen"
|
||||
defaultPreset: "Standard-Voreinstellungen"
|
||||
_watermarkEditor:
|
||||
tip: "Dem Bild kann ein Wasserzeichen, z. B. eine Quellenangabe, hinzugefügt werden."
|
||||
quitWithoutSaveConfirm: "Nicht gespeicherte Änderungen verwerfen?"
|
||||
driveFileTypeWarn: "Diese Datei wird nicht unterstützt"
|
||||
driveFileTypeWarnDescription: "Bilddatei auswählen"
|
||||
title: "Wasserzeichen bearbeiten"
|
||||
cover: "Alles bedecken"
|
||||
opacity: "Transparenz"
|
||||
scale: "Größe"
|
||||
text: "Text"
|
||||
position: "Position"
|
||||
type: "Art"
|
||||
image: "Bilder"
|
||||
advanced: "Fortgeschritten"
|
||||
angle: "Winkel"
|
||||
stripe: "Streifen"
|
||||
stripeWidth: "Linienbreite"
|
||||
stripeFrequency: "Linienanzahl"
|
||||
polkadot: "Punktmuster"
|
||||
polkadotMainDotOpacity: "Deckkraft des Hauptpunktes"
|
||||
polkadotMainDotRadius: "Größe des Hauptpunktes"
|
||||
polkadotSubDotOpacity: "Deckkraft des Unterpunktes"
|
||||
polkadotSubDotRadius: "Größe des Unterpunktes"
|
||||
polkadotSubDotDivisions: "Anzahl der Unterpunkte"
|
||||
_imageEffector:
|
||||
title: "Effekte"
|
||||
addEffect: "Effekte hinzufügen"
|
||||
discardChangesConfirm: "Änderungen verwerfen und beenden?"
|
||||
_fxs:
|
||||
chromaticAberration: "Chromatische Abweichung"
|
||||
glitch: "Glitch"
|
||||
mirror: "Spiegeln"
|
||||
invert: "Farben umkehren"
|
||||
grayscale: "Schwarzweiß"
|
||||
colorAdjust: "Farbkorrektur"
|
||||
colorClamp: "Farbkomprimierung"
|
||||
colorClampAdvanced: "Farbkomprimierung (erweitert)"
|
||||
distort: "Verzerrung"
|
||||
stripe: "Streifen"
|
||||
polkadot: "Punktmuster"
|
||||
_fxProps:
|
||||
angle: "Winkel"
|
||||
scale: "Größe"
|
||||
size: "Größe"
|
||||
color: "Farbe"
|
||||
opacity: "Transparenz"
|
||||
lightness: "Erhellen"
|
||||
drafts: "Entwurf"
|
||||
_drafts:
|
||||
select: "Entwurf auswählen"
|
||||
cannotCreateDraftAnymore: "Die Anzahl der Entwürfe, die erstellt werden können, wurde überschritten."
|
||||
cannotCreateDraft: "Mit diesem Inhalt kann kein Entwurf erstellt werden."
|
||||
delete: "Entwurf löschen"
|
||||
deleteAreYouSure: "Entwurf löschen?"
|
||||
noDrafts: "Keine Entwürfe"
|
||||
replyTo: "Antwort an {user}"
|
||||
quoteOf: "Zitat von {user}s Notiz"
|
||||
saveToDraft: "Als Entwurf speichern"
|
||||
restoreFromDraft: "Aus Entwurf wiederherstellen"
|
||||
restore: "Wiederherstellen"
|
||||
listDrafts: "Liste der Entwürfe"
|
||||
|
||||
@@ -353,6 +353,7 @@ _visibility:
|
||||
home: "Κεντρικό"
|
||||
homeDescription: "Δημοσίευση στο κεντρικό χρονολόγιο μόνο"
|
||||
followers: "Ακολουθούν"
|
||||
specified: "Απευθείας σημειώματα"
|
||||
_profile:
|
||||
name: "Όνομα"
|
||||
username: "Όνομα μέλους"
|
||||
@@ -395,6 +396,7 @@ _deck:
|
||||
antenna: "Αντένες"
|
||||
list: "Λίστα"
|
||||
mentions: "Επισημάνσεις"
|
||||
direct: "Απευθείας σημειώματα"
|
||||
_webhookSettings:
|
||||
name: "Όνομα"
|
||||
_moderationLogTypes:
|
||||
@@ -403,3 +405,5 @@ _reversi:
|
||||
total: "Σύνολο"
|
||||
_search:
|
||||
searchScopeLocal: "Τοπικό"
|
||||
_watermarkEditor:
|
||||
image: "Εικόνες"
|
||||
|
||||
+154
-18
@@ -81,7 +81,7 @@ import: "Import"
|
||||
export: "Export"
|
||||
files: "Files"
|
||||
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}?"
|
||||
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."
|
||||
@@ -327,6 +327,7 @@ dark: "Dark"
|
||||
lightThemes: "Light themes"
|
||||
darkThemes: "Dark themes"
|
||||
syncDeviceDarkMode: "Sync Dark Mode with your device settings"
|
||||
switchDarkModeManuallyWhenSyncEnabledConfirm: "\"{x}\" is turned on. Would you like to turn off synchronization and switch modes manually?"
|
||||
drive: "Drive"
|
||||
fileName: "Filename"
|
||||
selectFile: "Select a file"
|
||||
@@ -1053,6 +1054,7 @@ permissionDeniedError: "Operation denied"
|
||||
permissionDeniedErrorDescription: "This account does not have the permission to perform this action."
|
||||
preset: "Preset"
|
||||
selectFromPresets: "Choose from presets"
|
||||
custom: "Custom"
|
||||
achievements: "Achievements"
|
||||
gotInvalidResponseError: "Invalid server response"
|
||||
gotInvalidResponseErrorDescription: "The server may be unreachable or undergoing maintenance. Please try again later."
|
||||
@@ -1091,6 +1093,7 @@ prohibitedWordsDescription2: "Using spaces will create AND expressions and surro
|
||||
hiddenTags: "Hidden hashtags"
|
||||
hiddenTagsDescription: "Select tags which will not shown on trend list.\nMultiple tags could be registered by lines."
|
||||
notesSearchNotAvailable: "Note search is unavailable."
|
||||
usersSearchNotAvailable: "User search is not available."
|
||||
license: "License"
|
||||
unfavoriteConfirm: "Really remove from favorites?"
|
||||
myClips: "My clips"
|
||||
@@ -1215,8 +1218,8 @@ showRepliesToOthersInTimeline: "Show replies to others in timeline"
|
||||
hideRepliesToOthersInTimeline: "Hide replies to others from timeline"
|
||||
showRepliesToOthersInTimelineAll: "Show 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?"
|
||||
confirmHideRepliesAll: "This operation is irreversible. Would you really like to hide 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: "Are you sure you want to hide replies from everyone you follow in your timeline? This action is irreversible."
|
||||
externalServices: "External Services"
|
||||
sourceCode: "Source code"
|
||||
sourceCodeIsNotYetProvided: "Source code is not yet available. Contact the administrator to fix this problem."
|
||||
@@ -1242,7 +1245,7 @@ releaseToRefresh: "Release to refresh"
|
||||
refreshing: "Refreshing..."
|
||||
pullDownToRefresh: "Pull down to refresh"
|
||||
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."
|
||||
doReaction: "Add reaction"
|
||||
code: "Code"
|
||||
@@ -1301,7 +1304,7 @@ passkeyVerificationSucceededButPasswordlessLoginDisabled: "Passkey verification
|
||||
messageToFollower: "Message to followers"
|
||||
target: "Target"
|
||||
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."
|
||||
yourNameContainsProhibitedWords: "Your name contains prohibited words"
|
||||
yourNameContainsProhibitedWordsDescription: "If you wish to use this name, please contact your server administrator."
|
||||
@@ -1312,6 +1315,7 @@ availableRoles: "Available roles"
|
||||
acknowledgeNotesAndEnable: "Turn on after understanding the precautions."
|
||||
federationSpecified: "This server is operated in a whitelist federation. Interacting with servers other than those designated by the administrator is not allowed."
|
||||
federationDisabled: "Federation is disabled on this server. You cannot interact with users on other servers."
|
||||
draft: "Drafts"
|
||||
confirmOnReact: "Confirm when reacting"
|
||||
reactAreYouSure: "Would you like to add a \"{emoji}\" reaction?"
|
||||
markAsSensitiveConfirm: "Do you want to set this media as sensitive?"
|
||||
@@ -1329,6 +1333,7 @@ restore: "Restore"
|
||||
syncBetweenDevices: "Sync between devices"
|
||||
preferenceSyncConflictTitle: "The configured value exists on the server."
|
||||
preferenceSyncConflictText: "The sync enabled settings will save their values to the server. However, there are existing values on the server. Which set of values would you like to overwrite?"
|
||||
preferenceSyncConflictChoiceMerge: "Merge"
|
||||
preferenceSyncConflictChoiceServer: "Configured value on server"
|
||||
preferenceSyncConflictChoiceDevice: "Configured value on device"
|
||||
preferenceSyncConflictChoiceCancel: "Cancel enabling sync"
|
||||
@@ -1363,6 +1368,18 @@ abort: "Abort"
|
||||
tip: "Tips & Tricks"
|
||||
redisplayAllTips: "Show all “Tips & Tricks” again"
|
||||
hideAllTips: "Hide all \"Tips & Tricks\""
|
||||
defaultImageCompressionLevel: "Default image compression level"
|
||||
defaultImageCompressionLevel_description: "Lower level preserves image quality but increases file size.<br>Higher level reduce file size, but reduce image quality."
|
||||
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:
|
||||
newest: "Newest First"
|
||||
oldest: "Oldest First"
|
||||
_chat:
|
||||
noMessagesYet: "No messages yet"
|
||||
newMessage: "New message"
|
||||
@@ -1392,7 +1409,7 @@ _chat:
|
||||
muteThisRoom: "Mute room"
|
||||
deleteRoom: "Delete room"
|
||||
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."
|
||||
cannotChatWithTheUser: "Cannot start a chat with this user"
|
||||
cannotChatWithTheUser_description: "Chat is either unavailable or the other party has not enabled chat."
|
||||
@@ -1450,6 +1467,8 @@ _settings:
|
||||
contentsUpdateFrequency_description: "The higher the value the more the content updates but it lowers the performance and increases the traffic and memory consumption."
|
||||
contentsUpdateFrequency_description2: "When real-time mode is on, content is updated in real time regardless of this setting."
|
||||
showUrlPreview: "Show URL preview"
|
||||
showAvailableReactionsFirstInNote: "Show available reactions at the top."
|
||||
showPageTabBarBottom: "Show page tab bar at the bottom"
|
||||
_chat:
|
||||
showSenderName: "Show sender's name"
|
||||
sendOnEnter: "Press Enter to send"
|
||||
@@ -1489,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."
|
||||
_delivery:
|
||||
status: "Delivery status"
|
||||
stop: "Suspended"
|
||||
stop: "Suspend"
|
||||
resume: "Delivery resume"
|
||||
_type:
|
||||
none: "Publishing"
|
||||
@@ -1623,6 +1642,10 @@ _serverSettings:
|
||||
fanoutTimelineDbFallback: "Fallback to database"
|
||||
fanoutTimelineDbFallbackDescription: "When enabled, the timeline will fall back to the database for additional queries if the timeline is not cached. Disabling it further reduces the server load by eliminating the fallback process, but limits the range of timelines that can be retrieved."
|
||||
reactionsBufferingDescription: "When enabled, performance during reaction creation will be greatly improved, reducing the load on the database. However, Redis memory usage will increase."
|
||||
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"
|
||||
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"
|
||||
@@ -1641,6 +1664,10 @@ _serverSettings:
|
||||
userGeneratedContentsVisibilityForVisitor: "Visibility of user-generated content to guests"
|
||||
userGeneratedContentsVisibilityForVisitor_description: "This is useful for preventing problems caused by inappropriate remote content that is not well moderated from being unintentionally published on the Internet via your own server."
|
||||
userGeneratedContentsVisibilityForVisitor_description2: "Unconditionally publishing all content on the server to the Internet, including remote content received by the server is risky. This is especially important for guests who are unaware of the distributed nature of the content, as they may mistakenly believe that even remote content is content created by users on the server."
|
||||
restartServerSetupWizardConfirm_title: "Restart server setup wizard?"
|
||||
restartServerSetupWizardConfirm_text: "Some current settings will be reset."
|
||||
entrancePageStyle: "Entrance page style"
|
||||
showTimelineForVisitor: "Show timeline"
|
||||
_userGeneratedContentsVisibilityForVisitor:
|
||||
all: "Everything is public"
|
||||
localOnly: "Only local content is published, remote content is kept private"
|
||||
@@ -1977,17 +2004,20 @@ _role:
|
||||
descriptionOfRateLimitFactor: "Lower rate limits are less restrictive, higher ones more restrictive. "
|
||||
canHideAds: "Can hide ads"
|
||||
canSearchNotes: "Usage of note search"
|
||||
canSearchUsers: "User search"
|
||||
canUseTranslator: "Translator usage"
|
||||
avatarDecorationLimit: "Maximum number of avatar decorations that can be applied"
|
||||
canImportAntennas: "Allow importing antennas"
|
||||
canImportBlocking: "Allow importing blocking"
|
||||
canImportFollowing: "Allow importing following"
|
||||
canImportMuting: "Allow importing muting"
|
||||
canImportUserLists: "Allow importing lists"
|
||||
chatAvailability: "Allow Chat"
|
||||
avatarDecorationLimit: "Maximum number of avatar decorations"
|
||||
canImportAntennas: "Can import antennas"
|
||||
canImportBlocking: "Can import blocking"
|
||||
canImportFollowing: "Can import following"
|
||||
canImportMuting: "Can import muting"
|
||||
canImportUserLists: "Can import lists"
|
||||
chatAvailability: "Chat"
|
||||
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_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"
|
||||
watermarkAvailable: "Watermark function"
|
||||
_condition:
|
||||
roleAssignedTo: "Assigned to manual roles"
|
||||
isLocal: "Local user"
|
||||
@@ -2147,6 +2177,7 @@ _theme:
|
||||
install: "Install a theme"
|
||||
manage: "Manage themes"
|
||||
code: "Theme code"
|
||||
copyThemeCode: "Copy theme code"
|
||||
description: "Description"
|
||||
installed: "{name} has been installed"
|
||||
installedThemes: "Installed themes"
|
||||
@@ -2246,6 +2277,7 @@ _time:
|
||||
minute: "Minute(s)"
|
||||
hour: "Hour(s)"
|
||||
day: "Day(s)"
|
||||
month: "Month(s)"
|
||||
_2fa:
|
||||
alreadyRegistered: "You have already registered a 2-factor authentication device."
|
||||
registerTOTP: "Register authenticator app"
|
||||
@@ -2318,7 +2350,7 @@ _permissions:
|
||||
"read:admin:index-stats": "View database index stats"
|
||||
"read:admin:table-stats": "View database table stats"
|
||||
"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:resolve-abuse-user-report": "Resolve user report"
|
||||
"write:admin:send-email": "Send email"
|
||||
@@ -2329,7 +2361,7 @@ _permissions:
|
||||
"write:admin:unset-user-avatar": "Remove user avatar"
|
||||
"write:admin:unset-user-banner": "Remove user banner"
|
||||
"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:roles": "Manage roles"
|
||||
"read:admin:roles": "View roles"
|
||||
@@ -2460,6 +2492,8 @@ _visibility:
|
||||
disableFederation: "Defederate"
|
||||
disableFederationDescription: "Don't transmit to other instances"
|
||||
_postForm:
|
||||
quitInspiteOfThereAreUnuploadedFilesConfirm: "There are files that have not been uploaded, do you want to discard them and close the form?"
|
||||
uploaderTip: "The file has not yet been uploaded. From the file menu, you can rename, crop images, watermark and compress or uncompress the file. Files are automatically uploaded when you publish a note."
|
||||
replyPlaceholder: "Reply to this note..."
|
||||
quotePlaceholder: "Quote this note..."
|
||||
channelPlaceholder: "Post to a channel..."
|
||||
@@ -2759,7 +2793,7 @@ _moderationLogTypes:
|
||||
resetPassword: "Password reset"
|
||||
suspendRemoteInstance: "Remote instance suspended"
|
||||
unsuspendRemoteInstance: "Remote instance unsuspended"
|
||||
updateRemoteInstanceNote: "Moderation note updated for remote instance."
|
||||
updateRemoteInstanceNote: "Updated moderation note for remote servers"
|
||||
markSensitiveDriveFile: "File marked as sensitive"
|
||||
unmarkSensitiveDriveFile: "File unmarked as sensitive"
|
||||
resolveAbuseReport: "Report resolved"
|
||||
@@ -2793,6 +2827,7 @@ _fileViewer:
|
||||
url: "URL"
|
||||
uploadedAt: "Uploaded at"
|
||||
attachedNotes: "Attached notes"
|
||||
usage: "Used"
|
||||
thisPageCanBeSeenFromTheAuthor: "This page can only be seen by the user who uploaded this file."
|
||||
_externalResourceInstaller:
|
||||
title: "Install from external site"
|
||||
@@ -2966,7 +3001,7 @@ _customEmojisManager:
|
||||
markAsDeleteTargetRanges: "Mark rows in the selection as a target to delete"
|
||||
alertUpdateEmojisNothingDescription: "There are no updated Emojis."
|
||||
alertDeleteEmojisNothingDescription: "There are no Emojis to be deleted."
|
||||
confirmMovePage: ""
|
||||
confirmMovePage: "Would you like to move pages?"
|
||||
confirmChangeView: ""
|
||||
confirmUpdateEmojisDescription: "Update {count} Emoji(s). Are you sure to continue?"
|
||||
confirmDeleteEmojisDescription: "Delete checked {count} Emoji(s). Are you sure to continue?"
|
||||
@@ -3045,6 +3080,7 @@ _bootErrors:
|
||||
otherOption1: "Delete client settings and cache"
|
||||
otherOption2: "Start the simple client"
|
||||
otherOption3: "Launch the repair tool"
|
||||
otherOption4: "Launch Misskey in safe mode"
|
||||
_search:
|
||||
searchScopeAll: "All"
|
||||
searchScopeLocal: "Local"
|
||||
@@ -3081,6 +3117,8 @@ _serverSetupWizard:
|
||||
doYouConnectToFediverse_description1: "When connected to a network of distributed servers (Fediverse) content can be exchanged with other servers."
|
||||
doYouConnectToFediverse_description2: "Connecting with the Fediverse is also called \"federation\""
|
||||
youCanConfigureMoreFederationSettingsLater: "Advanced settings such as specifying federated servers can be configured later."
|
||||
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_description: "Sets the administrator information used to receive inquiries."
|
||||
adminInfo_mustBeFilled: "Must be entered if public server or federation is on."
|
||||
@@ -3096,6 +3134,7 @@ _serverSetupWizard:
|
||||
text2: "We would appreciate your support so that we can continue to develop this software further into the future."
|
||||
text3: "There are also special benefits for supporters!"
|
||||
_uploader:
|
||||
editImage: "Edit Image"
|
||||
compressedToX: "Compressed to {x}"
|
||||
savedXPercent: "Saving {x}%"
|
||||
abortConfirm: "Some files have not been uploaded, do you want to abort?"
|
||||
@@ -3115,3 +3154,100 @@ _clip:
|
||||
tip: "Clip is a feature that allows you to organize your notes."
|
||||
_userLists:
|
||||
tip: "Lists can contain any user you specify when creating, the created list can then be displayed as a timeline showing only the specified users."
|
||||
watermark: "Watermark"
|
||||
defaultPreset: "Default Preset"
|
||||
_watermarkEditor:
|
||||
tip: "A watermark, such as credit information, can be added to the image."
|
||||
quitWithoutSaveConfirm: "Discard unsaved changes?"
|
||||
driveFileTypeWarn: "This file is not supported"
|
||||
driveFileTypeWarnDescription: "Choose an image file"
|
||||
title: "Edit Watermark"
|
||||
cover: "Cover everything"
|
||||
repeat: "spread all over"
|
||||
opacity: "Opacity"
|
||||
scale: "Size"
|
||||
text: "Text"
|
||||
position: "Position"
|
||||
type: "Type"
|
||||
image: "Images"
|
||||
advanced: "Advanced"
|
||||
angle: "Angle"
|
||||
stripe: "Stripes"
|
||||
stripeWidth: "Line width"
|
||||
stripeFrequency: "Lines count"
|
||||
polkadot: "Polkadot"
|
||||
checker: "Checker"
|
||||
polkadotMainDotOpacity: "Opacity of the main dot"
|
||||
polkadotMainDotRadius: "Size of the main dot"
|
||||
polkadotSubDotOpacity: "Opacity of the secondary dot"
|
||||
polkadotSubDotRadius: "Size of the secondary dot"
|
||||
polkadotSubDotDivisions: "Number of sub-dots."
|
||||
_imageEffector:
|
||||
title: "Effects"
|
||||
addEffect: "Add Effects"
|
||||
discardChangesConfirm: "Are you sure you want to leave? You have unsaved changes."
|
||||
nothingToConfigure: "No configurable options available"
|
||||
_fxs:
|
||||
chromaticAberration: "Chromatic Aberration"
|
||||
glitch: "Glitch"
|
||||
mirror: "Mirror"
|
||||
invert: "Invert Colors"
|
||||
grayscale: "Grayscale"
|
||||
colorAdjust: "Color Correction"
|
||||
colorClamp: "Color Compression"
|
||||
colorClampAdvanced: "Color Compression (Advanced)"
|
||||
distort: "Distortion"
|
||||
threshold: "Binarize"
|
||||
zoomLines: "Saturated lines"
|
||||
stripe: "Stripes"
|
||||
polkadot: "Polkadot"
|
||||
checker: "Checker"
|
||||
blockNoise: "Block Noise"
|
||||
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:
|
||||
select: "Select Draft"
|
||||
cannotCreateDraftAnymore: "The number of drafts that can be created has been exceeded."
|
||||
cannotCreateDraft: "You cannot create a draft with this content."
|
||||
delete: "Delete Draft"
|
||||
deleteAreYouSure: "Delete draft?"
|
||||
noDrafts: "No drafts"
|
||||
replyTo: "Reply to {user}"
|
||||
quoteOf: "Citation to {user}'s note"
|
||||
postTo: "Posting to {channel}"
|
||||
saveToDraft: "Save to Draft"
|
||||
restoreFromDraft: "Restore from Draft"
|
||||
restore: "Restore"
|
||||
listDrafts: "List of Drafts"
|
||||
|
||||
+597
-72
File diff suppressed because it is too large
Load Diff
+20
-1
@@ -1208,7 +1208,6 @@ releaseToRefresh: "Relâcher pour rafraîchir"
|
||||
refreshing: "Rafraîchissement..."
|
||||
pullDownToRefresh: "Tirer vers le bas pour rafraîchir"
|
||||
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."
|
||||
doReaction: "Réagir"
|
||||
code: "Code"
|
||||
@@ -1272,6 +1271,8 @@ pleaseSelectAccount: "Sélectionner un compte"
|
||||
availableRoles: "Rôles disponibles"
|
||||
postForm: "Formulaire de publication"
|
||||
information: "Informations"
|
||||
inMinutes: "min"
|
||||
inDays: "j"
|
||||
_chat:
|
||||
invitations: "Inviter"
|
||||
noHistory: "Pas d'historique"
|
||||
@@ -2360,3 +2361,21 @@ _search:
|
||||
searchScopeAll: "Tous"
|
||||
searchScopeLocal: "Local"
|
||||
searchScopeUser: "Spécifier l'utilisateur·rice"
|
||||
_watermarkEditor:
|
||||
driveFileTypeWarn: "Ce fichier n'est pas pris en charge"
|
||||
opacity: "Transparence"
|
||||
scale: "Taille"
|
||||
text: "Texte"
|
||||
position: "Position"
|
||||
type: "Type"
|
||||
image: "Images"
|
||||
advanced: "Avancé"
|
||||
angle: "Angle"
|
||||
_imageEffector:
|
||||
_fxProps:
|
||||
angle: "Angle"
|
||||
scale: "Taille"
|
||||
size: "Taille"
|
||||
color: "Couleur"
|
||||
opacity: "Transparence"
|
||||
lightness: "Clair"
|
||||
|
||||
+15
-13
@@ -73,7 +73,7 @@ export default function generateDTS() {
|
||||
ts.NodeFlags.Const,
|
||||
),
|
||||
),
|
||||
ts.factory.createInterfaceDeclaration(
|
||||
ts.factory.createTypeAliasDeclaration(
|
||||
[ts.factory.createToken(ts.SyntaxKind.ExportKeyword)],
|
||||
ts.factory.createIdentifier('ParameterizedString'),
|
||||
[
|
||||
@@ -84,20 +84,22 @@ export default function generateDTS() {
|
||||
ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword),
|
||||
),
|
||||
],
|
||||
undefined,
|
||||
[
|
||||
ts.factory.createPropertySignature(
|
||||
undefined,
|
||||
ts.factory.createComputedPropertyName(
|
||||
ts.factory.createIdentifier('kParameters'),
|
||||
),
|
||||
undefined,
|
||||
ts.factory.createTypeReferenceNode(
|
||||
ts.factory.createIdentifier('T'),
|
||||
ts.factory.createIntersectionTypeNode([
|
||||
ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword),
|
||||
ts.factory.createTypeLiteralNode([
|
||||
ts.factory.createPropertySignature(
|
||||
undefined,
|
||||
ts.factory.createComputedPropertyName(
|
||||
ts.factory.createIdentifier('kParameters'),
|
||||
),
|
||||
undefined,
|
||||
ts.factory.createTypeReferenceNode(
|
||||
ts.factory.createIdentifier('T'),
|
||||
undefined,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
])
|
||||
]),
|
||||
),
|
||||
ts.factory.createInterfaceDeclaration(
|
||||
[ts.factory.createToken(ts.SyntaxKind.ExportKeyword)],
|
||||
|
||||
+29
-3
@@ -5,9 +5,13 @@ introMisskey: "Selamat datang! Misskey adalah perangkat mikroblog tercatu bersif
|
||||
poweredByMisskeyDescription: "{name} adalah sebuah layanan (instance) yang menggunakan platform sumber terbuka <b>Misskey</b>."
|
||||
monthAndDay: "{day} {month}"
|
||||
search: "Penelusuran"
|
||||
reset: "Reset"
|
||||
notifications: "Notifikasi"
|
||||
username: "Nama Pengguna"
|
||||
password: "Kata sandi"
|
||||
initialPasswordForSetup: "Kata sandi untuk memulai konfigurasi awal"
|
||||
initialPasswordIsIncorrect: "Kata sandi untuk memulai konfigurasi awal salah."
|
||||
initialPasswordForSetupDescription: "Jika Anda menginstal Misskey sendiri, gunakan kata sandi yang Anda masukkan di berkas konfigurasi.\nJika Anda menggunakan layanan hosting Misskey, gunakan kata sandi yang diberikan.\nJika Anda belum mengatur kata sandi, biarkan kosong dan lanjutkan."
|
||||
forgotPassword: "Lupa Kata Sandi"
|
||||
fetchingAsApObject: "Mengambil data dari Fediverse..."
|
||||
ok: "OK"
|
||||
@@ -45,6 +49,7 @@ pin: "Sematkan ke profil"
|
||||
unpin: "Lepas sematan dari profil"
|
||||
copyContent: "Salin konten"
|
||||
copyLink: "Salin tautan"
|
||||
copyRemoteLink: "Salin tautan jarak jauh"
|
||||
copyLinkRenote: "Salin tautan renote"
|
||||
delete: "Hapus"
|
||||
deleteAndEdit: "Hapus dan sunting"
|
||||
@@ -212,8 +217,10 @@ perDay: "per Hari"
|
||||
stopActivityDelivery: "Berhenti mengirim aktivitas"
|
||||
blockThisInstance: "Blokir instansi ini"
|
||||
silenceThisInstance: "Senyapkan instansi ini"
|
||||
mediaSilenceThisInstance: "Server media senyap"
|
||||
operations: "Tindakan"
|
||||
software: "Perangkat lunak"
|
||||
softwareName: "Nama Perangkat Lunak"
|
||||
version: "Versi"
|
||||
metadata: "Metadata"
|
||||
withNFiles: "{n} berkas"
|
||||
@@ -1040,7 +1047,7 @@ disableFederationConfirmWarn: "Mematikan federasi tidak membuat kiriman menjadi
|
||||
disableFederationOk: "Matikan federasi"
|
||||
invitationRequiredToRegister: "Instansi ini dalam mode undangan-saja. Kamu harus memasukkan kode undangan yang valid untuk mendaftar."
|
||||
emailNotSupported: "Instansi ini tidak mendukung mengirim surel"
|
||||
postToTheChannel: "Catat ke kanal"
|
||||
postToTheChannel: "Buat Catatan ke Kanal"
|
||||
cannotBeChangedLater: "Hal ini nantinya tidak dapat diubah lagi."
|
||||
reactionAcceptance: "Penerimaan reaksi"
|
||||
likeOnly: "Hanya suka"
|
||||
@@ -1205,7 +1212,6 @@ releaseToRefresh: "Lepaskan untuk memuat ulang"
|
||||
refreshing: "Sedang memuat ulang..."
|
||||
pullDownToRefresh: "Tarik ke bawah untuk memuat ulang"
|
||||
useGroupedNotifications: "Tampilkan notifikasi secara dikelompokkan"
|
||||
signupPendingError: "Terdapat masalah ketika memverifikasi alamat surel. Tautan kemungkinan telah kedaluwarsa."
|
||||
cwNotationRequired: "Jika \"Sembunyikan konten\" diaktifkan, deskripsi harus disediakan."
|
||||
doReaction: "Tambahkan reaksi"
|
||||
code: "Kode"
|
||||
@@ -1256,6 +1262,8 @@ thereAreNChanges: "Ada {n} perubahan"
|
||||
prohibitedWordsForNameOfUser: "Kata yang dilarang untuk nama pengguna"
|
||||
postForm: "Buat catatan"
|
||||
information: "Informasi"
|
||||
inMinutes: "menit"
|
||||
inDays: "hari"
|
||||
_chat:
|
||||
invitations: "Undang"
|
||||
noHistory: "Tidak ada riwayat"
|
||||
@@ -2400,7 +2408,7 @@ _deck:
|
||||
main: "Utama"
|
||||
widgets: "Widget"
|
||||
notifications: "Notifikasi"
|
||||
tl: "Lini masa"
|
||||
tl: "Beranda"
|
||||
antenna: "Antena"
|
||||
list: "Daftar"
|
||||
channel: "Kanal"
|
||||
@@ -2608,3 +2616,21 @@ _search:
|
||||
searchScopeAll: "Semua"
|
||||
searchScopeLocal: "Lokal"
|
||||
searchScopeUser: "Pengguna spesifik"
|
||||
_watermarkEditor:
|
||||
driveFileTypeWarn: "Berkas ini tidak didukung"
|
||||
opacity: "Opasitas"
|
||||
scale: "Ukuran"
|
||||
text: "Teks"
|
||||
position: "Posisi"
|
||||
type: "Tipe"
|
||||
image: "Gambar"
|
||||
advanced: "Tingkat lanjut"
|
||||
angle: "Sudut"
|
||||
_imageEffector:
|
||||
_fxProps:
|
||||
angle: "Sudut"
|
||||
scale: "Ukuran"
|
||||
size: "Ukuran"
|
||||
color: "Warna"
|
||||
opacity: "Opasitas"
|
||||
lightness: "Menerangkan"
|
||||
|
||||
Vendored
+446
-16
@@ -2,9 +2,9 @@
|
||||
// This file is generated by locales/generateDTS.js
|
||||
// Do not edit this file directly.
|
||||
declare const kParameters: unique symbol;
|
||||
export interface ParameterizedString<T extends string = string> {
|
||||
export type ParameterizedString<T extends string = string> = string & {
|
||||
[kParameters]: T;
|
||||
}
|
||||
};
|
||||
export interface ILocale {
|
||||
[_: string]: string | ParameterizedString | ILocale;
|
||||
}
|
||||
@@ -315,11 +315,11 @@ export interface Locale extends ILocale {
|
||||
*/
|
||||
"mention": string;
|
||||
/**
|
||||
* あなた宛て
|
||||
* メンション
|
||||
*/
|
||||
"mentions": string;
|
||||
/**
|
||||
* ダイレクト投稿
|
||||
* 指名
|
||||
*/
|
||||
"directNotes": string;
|
||||
/**
|
||||
@@ -2567,11 +2567,11 @@ export interface Locale extends ILocale {
|
||||
*/
|
||||
"serviceworkerInfo": string;
|
||||
/**
|
||||
* 削除された投稿
|
||||
* 削除されたノート
|
||||
*/
|
||||
"deletedNote": string;
|
||||
/**
|
||||
* 非公開の投稿
|
||||
* 非公開のノート
|
||||
*/
|
||||
"invisibleNote": string;
|
||||
/**
|
||||
@@ -4234,6 +4234,10 @@ export interface Locale extends ILocale {
|
||||
* プリセットから選択
|
||||
*/
|
||||
"selectFromPresets": string;
|
||||
/**
|
||||
* カスタム
|
||||
*/
|
||||
"custom": string;
|
||||
/**
|
||||
* 実績
|
||||
*/
|
||||
@@ -4386,6 +4390,10 @@ export interface Locale extends ILocale {
|
||||
* ノート検索は利用できません。
|
||||
*/
|
||||
"notesSearchNotAvailable": string;
|
||||
/**
|
||||
* ユーザー検索は利用できません。
|
||||
*/
|
||||
"usersSearchNotAvailable": string;
|
||||
/**
|
||||
* ライセンス
|
||||
*/
|
||||
@@ -4993,7 +5001,7 @@ export interface Locale extends ILocale {
|
||||
/**
|
||||
* メールアドレスの確認中に問題が発生しました。リンクの有効期限が切れている可能性があります。
|
||||
*/
|
||||
"signupPendingError": string;
|
||||
"emailVerificationFailedError": string;
|
||||
/**
|
||||
* 「内容を隠す」がオンの場合は注釈の記述が必要です。
|
||||
*/
|
||||
@@ -5231,7 +5239,7 @@ export interface Locale extends ILocale {
|
||||
*/
|
||||
"prohibitedWordsForNameOfUser": string;
|
||||
/**
|
||||
* このリストに含まれる文字列がユーザーの名前に含まれる場合、ユーザーの名前の変更を拒否します。モデレーター権限を持つユーザーはこの制限の影響を受けません。
|
||||
* このリストに含まれる文字列がユーザーの名前に含まれる場合、ユーザーの名前の変更を拒否します。モデレーター権限を持つユーザーはこの制限の影響を受けません。ユーザー名(username)に対しても全て小文字に置き換えて検査します。
|
||||
*/
|
||||
"prohibitedWordsForNameOfUserDescription": string;
|
||||
/**
|
||||
@@ -5270,6 +5278,10 @@ export interface Locale extends ILocale {
|
||||
* このサーバーは連合が無効化されています。他のサーバーのユーザーとやり取りすることはできません。
|
||||
*/
|
||||
"federationDisabled": string;
|
||||
/**
|
||||
* 下書き
|
||||
*/
|
||||
"draft": string;
|
||||
/**
|
||||
* リアクションする際に確認する
|
||||
*/
|
||||
@@ -5335,15 +5347,19 @@ export interface Locale extends ILocale {
|
||||
*/
|
||||
"preferenceSyncConflictTitle": string;
|
||||
/**
|
||||
* 同期が有効にされた設定項目は設定値をサーバーに保存しますが、この設定項目のサーバーに保存された設定値が見つかりました。どちらの設定値で上書きしますか?
|
||||
* 同期が有効にされた設定項目は設定値をサーバーに保存しますが、この設定項目のサーバーに保存された設定値が見つかりました。どうしますか?
|
||||
*/
|
||||
"preferenceSyncConflictText": string;
|
||||
/**
|
||||
* サーバーの設定値
|
||||
* 統合する
|
||||
*/
|
||||
"preferenceSyncConflictChoiceMerge": string;
|
||||
/**
|
||||
* サーバーの設定値で上書き
|
||||
*/
|
||||
"preferenceSyncConflictChoiceServer": string;
|
||||
/**
|
||||
* デバイスの設定値
|
||||
* デバイスの設定値で上書き
|
||||
*/
|
||||
"preferenceSyncConflictChoiceDevice": string;
|
||||
/**
|
||||
@@ -5481,6 +5497,48 @@ export interface Locale extends ILocale {
|
||||
* デフォルトの画像圧縮度
|
||||
*/
|
||||
"defaultImageCompressionLevel": string;
|
||||
/**
|
||||
* 低くすると画質を保てますが、ファイルサイズは増加します。<br>高くするとファイルサイズを減らせますが、画質は低下します。
|
||||
*/
|
||||
"defaultImageCompressionLevel_description": string;
|
||||
/**
|
||||
* 分
|
||||
*/
|
||||
"inMinutes": string;
|
||||
/**
|
||||
* 日
|
||||
*/
|
||||
"inDays": string;
|
||||
/**
|
||||
* セーフモードが有効です
|
||||
*/
|
||||
"safeModeEnabled": string;
|
||||
/**
|
||||
* セーフモードが有効なため、プラグインはすべて無効化されています。
|
||||
*/
|
||||
"pluginsAreDisabledBecauseSafeMode": string;
|
||||
/**
|
||||
* セーフモードが有効なため、カスタムCSSは適用されていません。
|
||||
*/
|
||||
"customCssIsDisabledBecauseSafeMode": string;
|
||||
/**
|
||||
* セーフモードが有効な間はデフォルトのテーマが使用されます。セーフモードをオフにすると元に戻ります。
|
||||
*/
|
||||
"themeIsDefaultBecauseSafeMode": string;
|
||||
/**
|
||||
* ベータ版の検証にご協力いただきありがとうございます!
|
||||
*/
|
||||
"thankYouForTestingBeta": string;
|
||||
"_order": {
|
||||
/**
|
||||
* 新しい順
|
||||
*/
|
||||
"newest": string;
|
||||
/**
|
||||
* 古い順
|
||||
*/
|
||||
"oldest": string;
|
||||
};
|
||||
"_chat": {
|
||||
/**
|
||||
* まだメッセージはありません
|
||||
@@ -5821,6 +5879,14 @@ export interface Locale extends ILocale {
|
||||
* URLプレビューを表示する
|
||||
*/
|
||||
"showUrlPreview": string;
|
||||
/**
|
||||
* 利用できるリアクションを先頭に表示
|
||||
*/
|
||||
"showAvailableReactionsFirstInNote": string;
|
||||
/**
|
||||
* ページのタブバーを下部に表示
|
||||
*/
|
||||
"showPageTabBarBottom": string;
|
||||
"_chat": {
|
||||
/**
|
||||
* 送信者の名前を表示
|
||||
@@ -6303,7 +6369,7 @@ export interface Locale extends ILocale {
|
||||
*/
|
||||
"followers": string;
|
||||
/**
|
||||
* 指定したユーザーにのみ公開され、また相手に通知が入ります。ダイレクトメッセージのかわりにお使いいただけます。
|
||||
* 指定したユーザーにのみ公開され、また相手に通知が入ります。
|
||||
*/
|
||||
"direct": string;
|
||||
/**
|
||||
@@ -6311,7 +6377,7 @@ export interface Locale extends ILocale {
|
||||
*/
|
||||
"doNotSendConfidencialOnDirect1": string;
|
||||
/**
|
||||
* 送信先のサーバーの管理者は投稿内容を見ることが可能なので、信頼できないサーバーのユーザーにダイレクト投稿を送信する場合は、機密情報の扱いに注意が必要です。
|
||||
* 送信先のサーバーの管理者は投稿内容を見ることが可能なので、信頼できないサーバーのユーザーが含まれる限定公開のノートを作成する際は、機密情報の扱いに注意が必要です。
|
||||
*/
|
||||
"doNotSendConfidencialOnDirect2": string;
|
||||
/**
|
||||
@@ -6460,6 +6526,22 @@ export interface Locale extends ILocale {
|
||||
* 有効にすると、リアクション作成時のパフォーマンスが大幅に向上し、データベースへの負荷を軽減することが可能です。ただし、Redisのメモリ使用量は増加します。
|
||||
*/
|
||||
"reactionsBufferingDescription": string;
|
||||
/**
|
||||
* リモート投稿の自動クリーニング
|
||||
*/
|
||||
"remoteNotesCleaning": string;
|
||||
/**
|
||||
* 有効にすると、参照されていない古いリモートの投稿を定期的にクリーンアップしてデータベースの肥大化を抑制します。
|
||||
*/
|
||||
"remoteNotesCleaning_description": string;
|
||||
/**
|
||||
* 最大クリーニング処理継続時間
|
||||
*/
|
||||
"remoteNotesCleaningMaxProcessingDuration": string;
|
||||
/**
|
||||
* 最低ノート保持日数
|
||||
*/
|
||||
"remoteNotesCleaningExpiryDaysForEachNotes": string;
|
||||
/**
|
||||
* 問い合わせ先URL
|
||||
*/
|
||||
@@ -6532,6 +6614,26 @@ export interface Locale extends ILocale {
|
||||
* サーバーで受信したリモートのコンテンツを含め、サーバー内の全てのコンテンツを無条件でインターネットに公開することはリスクが伴います。特に、分散型の特性を知らない閲覧者にとっては、リモートのコンテンツであってもサーバー内で作成されたコンテンツであると誤って認識してしまう可能性があるため、注意が必要です。
|
||||
*/
|
||||
"userGeneratedContentsVisibilityForVisitor_description2": string;
|
||||
/**
|
||||
* サーバーの初期設定ウィザードをやり直しますか?
|
||||
*/
|
||||
"restartServerSetupWizardConfirm_title": string;
|
||||
/**
|
||||
* 現在の一部の設定はリセットされます。
|
||||
*/
|
||||
"restartServerSetupWizardConfirm_text": string;
|
||||
/**
|
||||
* エントランスページのスタイル
|
||||
*/
|
||||
"entrancePageStyle": string;
|
||||
/**
|
||||
* タイムラインを表示する
|
||||
*/
|
||||
"showTimelineForVisitor": string;
|
||||
/**
|
||||
* アクティビティを表示する
|
||||
*/
|
||||
"showActivitiesForVisitor": string;
|
||||
"_userGeneratedContentsVisibilityForVisitor": {
|
||||
/**
|
||||
* 全て公開
|
||||
@@ -7721,6 +7823,10 @@ export interface Locale extends ILocale {
|
||||
* ノート検索の利用
|
||||
*/
|
||||
"canSearchNotes": string;
|
||||
/**
|
||||
* ユーザー検索の利用
|
||||
*/
|
||||
"canSearchUsers": string;
|
||||
/**
|
||||
* 翻訳機能の利用
|
||||
*/
|
||||
@@ -7765,6 +7871,14 @@ export interface Locale extends ILocale {
|
||||
* ファイルによっては種別を判定できないことがあります。そのようなファイルを許可する場合は {x} を指定に追加してください。
|
||||
*/
|
||||
"uploadableFileTypes_caption2": ParameterizedString<"x">;
|
||||
/**
|
||||
* サーバーサイドのノートの下書きの作成可能数
|
||||
*/
|
||||
"noteDraftLimit": string;
|
||||
/**
|
||||
* ウォーターマーク機能の使用可否
|
||||
*/
|
||||
"watermarkAvailable": string;
|
||||
};
|
||||
"_condition": {
|
||||
/**
|
||||
@@ -8354,6 +8468,10 @@ export interface Locale extends ILocale {
|
||||
* テーマコード
|
||||
*/
|
||||
"code": string;
|
||||
/**
|
||||
* テーマコードをコピー
|
||||
*/
|
||||
"copyThemeCode": string;
|
||||
/**
|
||||
* 説明
|
||||
*/
|
||||
@@ -8738,6 +8856,10 @@ export interface Locale extends ILocale {
|
||||
* 日
|
||||
*/
|
||||
"day": string;
|
||||
/**
|
||||
* ヶ月
|
||||
*/
|
||||
"month": string;
|
||||
};
|
||||
"_2fa": {
|
||||
/**
|
||||
@@ -9555,7 +9677,7 @@ export interface Locale extends ILocale {
|
||||
*/
|
||||
"followersDescription": string;
|
||||
/**
|
||||
* ダイレクト
|
||||
* 指名
|
||||
*/
|
||||
"specified": string;
|
||||
/**
|
||||
@@ -9572,6 +9694,14 @@ export interface Locale extends ILocale {
|
||||
"disableFederationDescription": string;
|
||||
};
|
||||
"_postForm": {
|
||||
/**
|
||||
* アップロードされていないファイルがありますが、破棄してフォームを閉じますか?
|
||||
*/
|
||||
"quitInspiteOfThereAreUnuploadedFilesConfirm": string;
|
||||
/**
|
||||
* ファイルはまだアップロードされていません。ファイルのメニューから、リネームや画像のクロップ、ウォーターマークの付与、圧縮の有無などを設定できます。ファイルはノート投稿時に自動でアップロードされます。
|
||||
*/
|
||||
"uploaderTip": string;
|
||||
/**
|
||||
* このノートに返信...
|
||||
*/
|
||||
@@ -10436,11 +10566,11 @@ export interface Locale extends ILocale {
|
||||
*/
|
||||
"channel": string;
|
||||
/**
|
||||
* あなた宛て
|
||||
* メンション
|
||||
*/
|
||||
"mentions": string;
|
||||
/**
|
||||
* ダイレクト
|
||||
* 指名
|
||||
*/
|
||||
"direct": string;
|
||||
/**
|
||||
@@ -10848,6 +10978,10 @@ export interface Locale extends ILocale {
|
||||
* 添付されているノート
|
||||
*/
|
||||
"attachedNotes": string;
|
||||
/**
|
||||
* 利用
|
||||
*/
|
||||
"usage": string;
|
||||
/**
|
||||
* このページは、このファイルをアップロードしたユーザーしか閲覧できません。
|
||||
*/
|
||||
@@ -11757,6 +11891,10 @@ export interface Locale extends ILocale {
|
||||
* 修復ツールを起動
|
||||
*/
|
||||
"otherOption3": string;
|
||||
/**
|
||||
* Misskeyをセーフモードで起動
|
||||
*/
|
||||
"otherOption4": string;
|
||||
};
|
||||
"_search": {
|
||||
/**
|
||||
@@ -11893,6 +12031,18 @@ export interface Locale extends ILocale {
|
||||
* 連合可能なサーバーの指定など、高度な設定も後ほど可能です。
|
||||
*/
|
||||
"youCanConfigureMoreFederationSettingsLater": string;
|
||||
/**
|
||||
* リモートコンテンツの自動クリーニング
|
||||
*/
|
||||
"remoteContentsCleaning": string;
|
||||
/**
|
||||
* 連合を行うと、継続して多くのコンテンツを受信します。自動クリーニングを有効にすると、参照されていない古くなったリモートコンテンツを自動でサーバーから削除し、ストレージを節約できます。
|
||||
*/
|
||||
"remoteContentsCleaning_description": string;
|
||||
/**
|
||||
* ローカル内リモートコンテンツへのハイパーリンクはリンク切れとなります。
|
||||
*/
|
||||
"remoteContentsCleaning_description2": string;
|
||||
/**
|
||||
* 管理者情報
|
||||
*/
|
||||
@@ -11949,6 +12099,10 @@ export interface Locale extends ILocale {
|
||||
};
|
||||
};
|
||||
"_uploader": {
|
||||
/**
|
||||
* 画像の編集
|
||||
*/
|
||||
"editImage": string;
|
||||
/**
|
||||
* {x}に圧縮
|
||||
*/
|
||||
@@ -12033,6 +12187,18 @@ export interface Locale extends ILocale {
|
||||
* 画像にクレジット情報などのウォーターマークを追加することができます。
|
||||
*/
|
||||
"tip": string;
|
||||
/**
|
||||
* 保存せずに終了しますか?
|
||||
*/
|
||||
"quitWithoutSaveConfirm": string;
|
||||
/**
|
||||
* このファイルは対応していません
|
||||
*/
|
||||
"driveFileTypeWarn": string;
|
||||
/**
|
||||
* 画像ファイルを選択してください
|
||||
*/
|
||||
"driveFileTypeWarnDescription": string;
|
||||
/**
|
||||
* ウォーターマークの編集
|
||||
*/
|
||||
@@ -12069,6 +12235,54 @@ export interface Locale extends ILocale {
|
||||
* 画像
|
||||
*/
|
||||
"image": string;
|
||||
/**
|
||||
* 高度
|
||||
*/
|
||||
"advanced": string;
|
||||
/**
|
||||
* 角度
|
||||
*/
|
||||
"angle": string;
|
||||
/**
|
||||
* ストライプ
|
||||
*/
|
||||
"stripe": string;
|
||||
/**
|
||||
* ラインの幅
|
||||
*/
|
||||
"stripeWidth": string;
|
||||
/**
|
||||
* ラインの数
|
||||
*/
|
||||
"stripeFrequency": string;
|
||||
/**
|
||||
* ポルカドット
|
||||
*/
|
||||
"polkadot": string;
|
||||
/**
|
||||
* チェッカー
|
||||
*/
|
||||
"checker": string;
|
||||
/**
|
||||
* メインドットの不透明度
|
||||
*/
|
||||
"polkadotMainDotOpacity": string;
|
||||
/**
|
||||
* メインドットの大きさ
|
||||
*/
|
||||
"polkadotMainDotRadius": string;
|
||||
/**
|
||||
* サブドットの不透明度
|
||||
*/
|
||||
"polkadotSubDotOpacity": string;
|
||||
/**
|
||||
* サブドットの大きさ
|
||||
*/
|
||||
"polkadotSubDotRadius": string;
|
||||
/**
|
||||
* サブドットの数
|
||||
*/
|
||||
"polkadotSubDotDivisions": string;
|
||||
};
|
||||
"_imageEffector": {
|
||||
/**
|
||||
@@ -12079,6 +12293,14 @@ export interface Locale extends ILocale {
|
||||
* エフェクトを追加
|
||||
*/
|
||||
"addEffect": string;
|
||||
/**
|
||||
* 変更を破棄して終了しますか?
|
||||
*/
|
||||
"discardChangesConfirm": string;
|
||||
/**
|
||||
* 設定項目はありません
|
||||
*/
|
||||
"nothingToConfigure": string;
|
||||
"_fxs": {
|
||||
/**
|
||||
* 色収差
|
||||
@@ -12100,6 +12322,10 @@ export interface Locale extends ILocale {
|
||||
* 白黒
|
||||
*/
|
||||
"grayscale": string;
|
||||
/**
|
||||
* 色調補正
|
||||
*/
|
||||
"colorAdjust": string;
|
||||
/**
|
||||
* 色の圧縮
|
||||
*/
|
||||
@@ -12120,7 +12346,211 @@ export interface Locale extends ILocale {
|
||||
* 集中線
|
||||
*/
|
||||
"zoomLines": string;
|
||||
/**
|
||||
* ストライプ
|
||||
*/
|
||||
"stripe": string;
|
||||
/**
|
||||
* ポルカドット
|
||||
*/
|
||||
"polkadot": string;
|
||||
/**
|
||||
* チェッカー
|
||||
*/
|
||||
"checker": string;
|
||||
/**
|
||||
* ブロックノイズ
|
||||
*/
|
||||
"blockNoise": 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;
|
||||
};
|
||||
};
|
||||
/**
|
||||
* 下書き
|
||||
*/
|
||||
"drafts": string;
|
||||
"_drafts": {
|
||||
/**
|
||||
* 下書きを選択
|
||||
*/
|
||||
"select": string;
|
||||
/**
|
||||
* 下書きの作成可能数を超えています。
|
||||
*/
|
||||
"cannotCreateDraftAnymore": string;
|
||||
/**
|
||||
* この内容では下書きを作成できません。
|
||||
*/
|
||||
"cannotCreateDraft": string;
|
||||
/**
|
||||
* 下書きを削除
|
||||
*/
|
||||
"delete": string;
|
||||
/**
|
||||
* 下書きを削除しますか?
|
||||
*/
|
||||
"deleteAreYouSure": string;
|
||||
/**
|
||||
* 下書きはありません
|
||||
*/
|
||||
"noDrafts": string;
|
||||
/**
|
||||
* {user}への返信
|
||||
*/
|
||||
"replyTo": ParameterizedString<"user">;
|
||||
/**
|
||||
* {user}のノートへの引用
|
||||
*/
|
||||
"quoteOf": ParameterizedString<"user">;
|
||||
/**
|
||||
* {channel}への投稿
|
||||
*/
|
||||
"postTo": ParameterizedString<"channel">;
|
||||
/**
|
||||
* 下書きへ保存
|
||||
*/
|
||||
"saveToDraft": string;
|
||||
/**
|
||||
* 下書きから復元
|
||||
*/
|
||||
"restoreFromDraft": string;
|
||||
/**
|
||||
* 復元
|
||||
*/
|
||||
"restore": string;
|
||||
/**
|
||||
* 下書き一覧
|
||||
*/
|
||||
"listDrafts": string;
|
||||
};
|
||||
}
|
||||
declare const locales: {
|
||||
|
||||
@@ -36,6 +36,7 @@ const languages = [
|
||||
'ru-RU',
|
||||
'sk-SK',
|
||||
'th-TH',
|
||||
'tr-TR',
|
||||
'ug-CN',
|
||||
'uk-UA',
|
||||
'vi-VN',
|
||||
|
||||
+145
-4
@@ -327,6 +327,7 @@ dark: "Scuro"
|
||||
lightThemes: "Tema Chiaro"
|
||||
darkThemes: "Tema Scuro"
|
||||
syncDeviceDarkMode: "Sincronizza il tema scuro con le impostazioni del dispositivo"
|
||||
switchDarkModeManuallyWhenSyncEnabledConfirm: "({x}) è attiva. Vuoi disattivare la sincronizzazione e passare alla modalità manuale?"
|
||||
drive: "Drive"
|
||||
fileName: "Nome dell'allegato"
|
||||
selectFile: "Scelta allegato"
|
||||
@@ -581,7 +582,7 @@ sounds: "Impostazioni suoni"
|
||||
sound: "Suono"
|
||||
notificationSoundSettings: "Preferenze di notifica"
|
||||
listen: "Ascolta"
|
||||
none: "Nessuno"
|
||||
none: "Nessuna"
|
||||
showInPage: "Visualizza in pagina"
|
||||
popout: "Finestra pop-out"
|
||||
volume: "Volume"
|
||||
@@ -1053,6 +1054,7 @@ permissionDeniedError: "Errore, attività non autorizzata"
|
||||
permissionDeniedErrorDescription: "Non si dispone dell'autorizzazione per eseguire questa operazione."
|
||||
preset: "Preimpostato"
|
||||
selectFromPresets: "Seleziona preimpostato"
|
||||
custom: "Personalizzato"
|
||||
achievements: "Conquiste"
|
||||
gotInvalidResponseError: "Risposta del server non valida"
|
||||
gotInvalidResponseErrorDescription: "Il server potrebbe essere irraggiungibile o in manutenzione. Riprova più tardi."
|
||||
@@ -1091,6 +1093,7 @@ prohibitedWordsDescription2: "Gli spazi creano la relazione \"E\" tra parole (qu
|
||||
hiddenTags: "Hashtag nascosti"
|
||||
hiddenTagsDescription: "Impedire la visualizzazione del tag impostato nei trend. Puoi impostare più valori, uno per riga."
|
||||
notesSearchNotAvailable: "Non è possibile cercare tra le Note."
|
||||
usersSearchNotAvailable: "La ricerca profili non è disponibile."
|
||||
license: "Licenza"
|
||||
unfavoriteConfirm: "Vuoi davvero rimuovere la preferenza?"
|
||||
myClips: "Le mie Clip"
|
||||
@@ -1197,7 +1200,7 @@ replies: "Risposte"
|
||||
renotes: "Rinota"
|
||||
loadReplies: "Leggi le risposte"
|
||||
loadConversation: "Leggi la conversazione"
|
||||
pinnedList: "Elenco in primo piano"
|
||||
pinnedList: "Lista in primo piano"
|
||||
keepScreenOn: "Mantenere lo schermo acceso"
|
||||
verifiedLink: "Abbiamo confermato la validità di questo collegamento"
|
||||
notifyNotes: "Notifica nuove Note"
|
||||
@@ -1242,7 +1245,7 @@ releaseToRefresh: "Rilascia per aggiornare"
|
||||
refreshing: "Aggiornamento..."
|
||||
pullDownToRefresh: "Trascinare per aggiornare"
|
||||
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."
|
||||
doReaction: "Reagisci"
|
||||
code: "Codice"
|
||||
@@ -1312,6 +1315,7 @@ availableRoles: "Ruoli disponibili"
|
||||
acknowledgeNotesAndEnable: "Attivare dopo averne compreso il comportamento."
|
||||
federationSpecified: "Questo server è federato solo con istanze specifiche del Fediverso. Puoi interagire solo con quelle scelte dall'amministrazione."
|
||||
federationDisabled: "Questo server ha la federazione disabilitata. Non puoi interagire con profili provenienti da altri server."
|
||||
draft: "Bozza"
|
||||
confirmOnReact: "Confermare le reazioni"
|
||||
reactAreYouSure: "Vuoi davvero reagire con {emoji} ?"
|
||||
markAsSensitiveConfirm: "Vuoi davvero indicare questo contenuto multimediale come esplicito?"
|
||||
@@ -1329,6 +1333,7 @@ restore: "Ripristina"
|
||||
syncBetweenDevices: "Sincronizzazione tra i dispositivi"
|
||||
preferenceSyncConflictTitle: "Sul server esiste già il valore impostato"
|
||||
preferenceSyncConflictText: "Le impostazione sincronizzata salverà il valore sul server. Però, bada che esiste già un valore sul server. Quale vorresti sovrascrivere?"
|
||||
preferenceSyncConflictChoiceMerge: "Integra"
|
||||
preferenceSyncConflictChoiceServer: "Valore del server"
|
||||
preferenceSyncConflictChoiceDevice: "Valore del dispositivo"
|
||||
preferenceSyncConflictChoiceCancel: "Annulla la sincronizzazione"
|
||||
@@ -1340,7 +1345,7 @@ information: "Informazioni"
|
||||
chat: "Chat"
|
||||
migrateOldSettings: "Migrare le vecchie impostazioni"
|
||||
migrateOldSettings_description: "Di solito, viene fatto automaticamente. Se per qualche motivo non fossero migrate con successo, è possibile avviare il processo di migrazione manualmente, sovrascrivendo le configurazioni attuali."
|
||||
compress: "Comprimi"
|
||||
compress: "Compressione"
|
||||
right: "Destra"
|
||||
bottom: "Sotto"
|
||||
top: "Sopra"
|
||||
@@ -1349,6 +1354,7 @@ settingsMigrating: "Migrazione delle impostazioni. Attendere prego ... (Puoi anc
|
||||
readonly: "Sola lettura"
|
||||
goToDeck: "Torna al Deck"
|
||||
federationJobs: "Coda di federazione"
|
||||
driveAboutTip: "Il Drive mostra l'elenco di file caricati in passato. Puoi organizzarli in cartelle, riusarli allegandoli ad altre note, o caricarli in anticipo e poi pubblicarli in un secondo momento. Tieni presente che se elimini un file, non sarà più visibile in nessuno degli oggetti a cui è allegato (Note, pagine, avatar, banner, ecc.)"
|
||||
scrollToClose: "Scorri per chiudere"
|
||||
advice: "Consiglio"
|
||||
realtimeMode: "Modalità in tempo reale"
|
||||
@@ -1362,6 +1368,18 @@ abort: "Annulla"
|
||||
tip: "Suggerimento"
|
||||
redisplayAllTips: "Mostra tutti i suggerimenti"
|
||||
hideAllTips: "Nascondi tutti i suggerimenti"
|
||||
defaultImageCompressionLevel: "Livello predefinito di compressione immagini"
|
||||
defaultImageCompressionLevel_description: "La compressione diminuisce la qualità dell'immagine, poca compressione mantiene alta qualità delle immagini. Aumentandola, si riducono le dimensioni del file, a discapito della qualità dell'immagine."
|
||||
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:
|
||||
noMessagesYet: "Ancora nessun messaggio"
|
||||
newMessage: "Nuovo messaggio"
|
||||
@@ -1449,6 +1467,8 @@ _settings:
|
||||
contentsUpdateFrequency_description: "Se l'impostazione è alta, verranno aggiornati più frequentemente, consumando più dati e più batteria."
|
||||
contentsUpdateFrequency_description2: "Quando la modalità è in tempo reale, arriveranno a prescindere."
|
||||
showUrlPreview: "Mostra anteprima dell'URL"
|
||||
showAvailableReactionsFirstInNote: "Mostra le reazioni disponibili in alto"
|
||||
showPageTabBarBottom: "Visualizza le schede della pagina nella parte inferiore"
|
||||
_chat:
|
||||
showSenderName: "Mostra il nome del mittente"
|
||||
sendOnEnter: "Invio spedisce"
|
||||
@@ -1622,6 +1642,10 @@ _serverSettings:
|
||||
fanoutTimelineDbFallback: "Elaborazione dati alternativa"
|
||||
fanoutTimelineDbFallbackDescription: "Attivando l'elaborazione alternativa, verrà interrogato ulteriormente il database se la timeline non è nella cache. \nDisattivando, si può ridurre ulteriormente il carico del server, evitando l'elaborazione alternativa, ma limitando l'intervallo recuperabile delle timeline."
|
||||
reactionsBufferingDescription: "Attivando questa opzione, puoi migliorare significativamente le prestazioni durante la creazione delle reazioni e ridurre il carico sul database. Tuttavia, aumenterà l'impiego di memoria Redis."
|
||||
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"
|
||||
inquiryUrlDescription: "Specificare l'URL al modulo di contatto, oppure le informazioni con i dati di contatto dell'amministrazione."
|
||||
openRegistration: "Registrazioni aperte"
|
||||
@@ -1640,6 +1664,11 @@ _serverSettings:
|
||||
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_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:
|
||||
all: "Tutto pubblico"
|
||||
localOnly: "Pubblica solo contenuti locali, mantieni privati i contenuti remoti"
|
||||
@@ -1976,6 +2005,7 @@ _role:
|
||||
descriptionOfRateLimitFactor: "I rapporti più bassi sono meno restrittivi, quelli più alti lo sono di più."
|
||||
canHideAds: "Nascondere i banner"
|
||||
canSearchNotes: "Ricercare nelle Note"
|
||||
canSearchUsers: "Può cercare profili"
|
||||
canUseTranslator: "Tradurre le Note"
|
||||
avatarDecorationLimit: "Numero massimo di decorazioni foto profilo installabili"
|
||||
canImportAntennas: "Può importare Antenne"
|
||||
@@ -1987,6 +2017,8 @@ _role:
|
||||
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_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:
|
||||
roleAssignedTo: "Assegnato a ruoli manualmente"
|
||||
isLocal: "Profilo locale"
|
||||
@@ -2146,6 +2178,7 @@ _theme:
|
||||
install: "Installa un tema"
|
||||
manage: "Gestione dei temi"
|
||||
code: "Codice tema"
|
||||
copyThemeCode: "Copia il codice del Tema"
|
||||
description: "Descrizione"
|
||||
installed: "{name} è installato"
|
||||
installedThemes: "Temi installati"
|
||||
@@ -2245,6 +2278,7 @@ _time:
|
||||
minute: "min"
|
||||
hour: "ore"
|
||||
day: "giorni"
|
||||
month: "Mese"
|
||||
_2fa:
|
||||
alreadyRegistered: "La configurazione è stata già completata."
|
||||
registerTOTP: "Registra una App di autenticazione a due fattori (2FA/MFA)"
|
||||
@@ -2459,6 +2493,8 @@ _visibility:
|
||||
disableFederation: "Senza federazione"
|
||||
disableFederationDescription: "Non spedire attività alle altre istanze remote"
|
||||
_postForm:
|
||||
quitInspiteOfThereAreUnuploadedFilesConfirm: "Alcuni file non sono stati caricati. Vuoi annullare l'operazione?"
|
||||
uploaderTip: "Il file non è ancora stato caricato. Nel menu file (tre puntini), puoi ritagliare l'immagine, mettere la filigrana, decidere la presenza o l'assenza di compressione... Il file verrà caricato automaticamente quando pubblichi la Nota."
|
||||
replyPlaceholder: "Rispondi a questa nota..."
|
||||
quotePlaceholder: "Cita questa nota..."
|
||||
channelPlaceholder: "Pubblica sul canale..."
|
||||
@@ -2792,6 +2828,7 @@ _fileViewer:
|
||||
url: "URL"
|
||||
uploadedAt: "Caricato il"
|
||||
attachedNotes: "Note a cui è allegato"
|
||||
usage: "In uso"
|
||||
thisPageCanBeSeenFromTheAuthor: "Questa pagina può essere vista solo da chi ha caricato il file."
|
||||
_externalResourceInstaller:
|
||||
title: "Installa da sito esterno"
|
||||
@@ -2902,6 +2939,8 @@ _offlineScreen:
|
||||
_urlPreviewSetting:
|
||||
title: "Impostazioni per l'anteprima delle URL"
|
||||
enable: "Attiva l'anteprima delle URL"
|
||||
allowRedirect: "Segui i reindirizzamenti per visualizzare le anteprime"
|
||||
allowRedirectDescription: "Se la URL inserita contiene un reindirizzamento, decidi di seguire il reindirizzamento fino alla destinazione, visualizzandone l'anteprima. Disabilitando questa opzione si risparmiano risorse del server, ma il contenuto effettivo dal reindirizzamento, non verrà visualizzato."
|
||||
timeout: "Timeout dell'anteprima in millisecondi"
|
||||
timeoutDescription: "Impegna al massimo il tempo indicato, altrimenti ignora l'anteprima"
|
||||
maximumContentLength: "Grandezza del contenuto (Content-Length in byte)"
|
||||
@@ -3042,6 +3081,7 @@ _bootErrors:
|
||||
otherOption1: "Nelle impostazioni, cancellare le impostazioni del client e svuotare la cache"
|
||||
otherOption2: "Avviare il client predefinito"
|
||||
otherOption3: "Avviare lo strumento di riparazione"
|
||||
otherOption4: "Avvia Misskey in modalità sicura"
|
||||
_search:
|
||||
searchScopeAll: "Tutte"
|
||||
searchScopeLocal: "Locale"
|
||||
@@ -3078,6 +3118,9 @@ _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_description2: "Connettersi al Fediverso è anche detto \"federazione\"."
|
||||
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."
|
||||
remoteContentsCleaning_description2: "Alcuni metodi di riferimento, come i collegamenti ipertestuali, non possono essere rilevati sul sistema."
|
||||
adminInfo: "Informazioni sull'amministratore"
|
||||
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."
|
||||
@@ -3093,6 +3136,7 @@ _serverSetupWizard:
|
||||
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!"
|
||||
_uploader:
|
||||
editImage: "Modifica immagine"
|
||||
compressedToX: "Compresso in {x}"
|
||||
savedXPercent: "{x}% risparmiati"
|
||||
abortConfirm: "Alcuni file non sono stati caricati. Vuoi annullare l'operazione?"
|
||||
@@ -3112,3 +3156,100 @@ _clip:
|
||||
tip: "Le clip sono una funzionalità che consente di raggruppare le Note."
|
||||
_userLists:
|
||||
tip: "Puoi creare un elenco di Note create da qualsiasi profilo. L'elenco è visualizzato come una sequenza temporale."
|
||||
watermark: "Filigrana"
|
||||
defaultPreset: "Impostazioni predefinite"
|
||||
_watermarkEditor:
|
||||
tip: "Puoi aggiungere una filigrana, ad esempio con i crediti alle tue immagini."
|
||||
quitWithoutSaveConfirm: "Uscire senza salvare?"
|
||||
driveFileTypeWarn: "Formato file non supportato"
|
||||
driveFileTypeWarnDescription: "Per favore seleziona un file immagine"
|
||||
title: "Modifica la filigrana"
|
||||
cover: "Coprire tutto"
|
||||
repeat: "Disposizione"
|
||||
opacity: "Opacità"
|
||||
scale: "Dimensioni"
|
||||
text: "Testo"
|
||||
position: "Posizione"
|
||||
type: "Tipo"
|
||||
image: "Immagini"
|
||||
advanced: "Avanzato"
|
||||
angle: "Angolo"
|
||||
stripe: "Strisce"
|
||||
stripeWidth: "Larghezza della linea"
|
||||
stripeFrequency: "Il numero di linee"
|
||||
polkadot: "A pallini"
|
||||
checker: "revisore"
|
||||
polkadotMainDotOpacity: "Opacità del punto principale"
|
||||
polkadotMainDotRadius: "Dimensione del punto principale"
|
||||
polkadotSubDotOpacity: "Opacità del punto secondario"
|
||||
polkadotSubDotRadius: "Dimensione del punto secondario"
|
||||
polkadotSubDotDivisions: "Quantità di punti secondari"
|
||||
_imageEffector:
|
||||
title: "Effetto"
|
||||
addEffect: "Aggiungi effetto"
|
||||
discardChangesConfirm: "Scarta le modifiche ed esci?"
|
||||
nothingToConfigure: "Nessuna impostazione configurabile."
|
||||
_fxs:
|
||||
chromaticAberration: "Aberrazione cromatica"
|
||||
glitch: "Glitch"
|
||||
mirror: "Specchio"
|
||||
invert: "Inversione colore"
|
||||
grayscale: "Bianco e nero"
|
||||
colorAdjust: "Correzione Colore"
|
||||
colorClamp: "Compressione del colore"
|
||||
colorClampAdvanced: "Compressione del colore (avanzata)"
|
||||
distort: "Distorsione"
|
||||
threshold: "Soglia"
|
||||
zoomLines: "Linea di saturazione"
|
||||
stripe: "Strisce"
|
||||
polkadot: "A pallini"
|
||||
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:
|
||||
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"
|
||||
listDrafts: "Elenco bozze"
|
||||
|
||||
+126
-14
@@ -74,8 +74,8 @@ youGotNewFollower: "フォローされました"
|
||||
receiveFollowRequest: "フォローリクエストされました"
|
||||
followRequestAccepted: "フォローが承認されました"
|
||||
mention: "メンション"
|
||||
mentions: "あなた宛て"
|
||||
directNotes: "ダイレクト投稿"
|
||||
mentions: "メンション"
|
||||
directNotes: "指名"
|
||||
importAndExport: "インポートとエクスポート"
|
||||
import: "インポート"
|
||||
export: "エクスポート"
|
||||
@@ -637,8 +637,8 @@ addRelay: "リレーの追加"
|
||||
inboxUrl: "inboxのURL"
|
||||
addedRelays: "追加済みのリレー"
|
||||
serviceworkerInfo: "プッシュ通知を行うには有効にする必要があります。"
|
||||
deletedNote: "削除された投稿"
|
||||
invisibleNote: "非公開の投稿"
|
||||
deletedNote: "削除されたノート"
|
||||
invisibleNote: "非公開のノート"
|
||||
enableInfiniteScroll: "自動でもっと見る"
|
||||
visibility: "公開範囲"
|
||||
poll: "アンケート"
|
||||
@@ -1054,6 +1054,7 @@ permissionDeniedError: "操作が拒否されました"
|
||||
permissionDeniedErrorDescription: "このアカウントにはこの操作を行うための権限がありません。"
|
||||
preset: "プリセット"
|
||||
selectFromPresets: "プリセットから選択"
|
||||
custom: "カスタム"
|
||||
achievements: "実績"
|
||||
gotInvalidResponseError: "サーバーの応答が無効です"
|
||||
gotInvalidResponseErrorDescription: "サーバーがダウンまたはメンテナンスしている可能性があります。しばらくしてから再度お試しください。"
|
||||
@@ -1092,6 +1093,7 @@ prohibitedWordsDescription2: "スペースで区切るとAND指定になり、
|
||||
hiddenTags: "非表示ハッシュタグ"
|
||||
hiddenTagsDescription: "設定したタグをトレンドに表示させないようにします。改行で区切って複数設定できます。"
|
||||
notesSearchNotAvailable: "ノート検索は利用できません。"
|
||||
usersSearchNotAvailable: "ユーザー検索は利用できません。"
|
||||
license: "ライセンス"
|
||||
unfavoriteConfirm: "お気に入り解除しますか?"
|
||||
myClips: "自分のクリップ"
|
||||
@@ -1243,7 +1245,7 @@ releaseToRefresh: "離してリロード"
|
||||
refreshing: "リロード中"
|
||||
pullDownToRefresh: "引っ張ってリロード"
|
||||
useGroupedNotifications: "通知をグルーピング"
|
||||
signupPendingError: "メールアドレスの確認中に問題が発生しました。リンクの有効期限が切れている可能性があります。"
|
||||
emailVerificationFailedError: "メールアドレスの確認中に問題が発生しました。リンクの有効期限が切れている可能性があります。"
|
||||
cwNotationRequired: "「内容を隠す」がオンの場合は注釈の記述が必要です。"
|
||||
doReaction: "リアクションする"
|
||||
code: "コード"
|
||||
@@ -1303,7 +1305,7 @@ messageToFollower: "フォロワーへのメッセージ"
|
||||
target: "対象"
|
||||
testCaptchaWarning: "CAPTCHAのテストを目的とした機能です。<strong>本番環境で使用しないでください。</strong>"
|
||||
prohibitedWordsForNameOfUser: "禁止ワード(ユーザーの名前)"
|
||||
prohibitedWordsForNameOfUserDescription: "このリストに含まれる文字列がユーザーの名前に含まれる場合、ユーザーの名前の変更を拒否します。モデレーター権限を持つユーザーはこの制限の影響を受けません。"
|
||||
prohibitedWordsForNameOfUserDescription: "このリストに含まれる文字列がユーザーの名前に含まれる場合、ユーザーの名前の変更を拒否します。モデレーター権限を持つユーザーはこの制限の影響を受けません。ユーザー名(username)に対しても全て小文字に置き換えて検査します。"
|
||||
yourNameContainsProhibitedWords: "変更しようとした名前に禁止された文字列が含まれています"
|
||||
yourNameContainsProhibitedWordsDescription: "名前に禁止されている文字列が含まれています。この名前を使用したい場合は、サーバー管理者にお問い合わせください。"
|
||||
thisContentsAreMarkedAsSigninRequiredByAuthor: "投稿者により、表示にはログインが必要と設定されています"
|
||||
@@ -1313,6 +1315,7 @@ availableRoles: "利用可能なロール"
|
||||
acknowledgeNotesAndEnable: "注意事項を理解した上でオンにします。"
|
||||
federationSpecified: "このサーバーはホワイトリスト連合で運用されています。管理者が指定したサーバー以外とやり取りすることはできません。"
|
||||
federationDisabled: "このサーバーは連合が無効化されています。他のサーバーのユーザーとやり取りすることはできません。"
|
||||
draft: "下書き"
|
||||
confirmOnReact: "リアクションする際に確認する"
|
||||
reactAreYouSure: "\" {emoji} \" をリアクションしますか?"
|
||||
markAsSensitiveConfirm: "このメディアをセンシティブとして設定しますか?"
|
||||
@@ -1329,9 +1332,10 @@ skip: "スキップ"
|
||||
restore: "復元"
|
||||
syncBetweenDevices: "デバイス間で同期"
|
||||
preferenceSyncConflictTitle: "サーバーに設定値が存在します"
|
||||
preferenceSyncConflictText: "同期が有効にされた設定項目は設定値をサーバーに保存しますが、この設定項目のサーバーに保存された設定値が見つかりました。どちらの設定値で上書きしますか?"
|
||||
preferenceSyncConflictChoiceServer: "サーバーの設定値"
|
||||
preferenceSyncConflictChoiceDevice: "デバイスの設定値"
|
||||
preferenceSyncConflictText: "同期が有効にされた設定項目は設定値をサーバーに保存しますが、この設定項目のサーバーに保存された設定値が見つかりました。どうしますか?"
|
||||
preferenceSyncConflictChoiceMerge: "統合する"
|
||||
preferenceSyncConflictChoiceServer: "サーバーの設定値で上書き"
|
||||
preferenceSyncConflictChoiceDevice: "デバイスの設定値で上書き"
|
||||
preferenceSyncConflictChoiceCancel: "同期の有効化をキャンセル"
|
||||
paste: "ペースト"
|
||||
emojiPalette: "絵文字パレット"
|
||||
@@ -1365,6 +1369,18 @@ tip: "ヒントとコツ"
|
||||
redisplayAllTips: "全ての「ヒントとコツ」を再表示"
|
||||
hideAllTips: "全ての「ヒントとコツ」を非表示"
|
||||
defaultImageCompressionLevel: "デフォルトの画像圧縮度"
|
||||
defaultImageCompressionLevel_description: "低くすると画質を保てますが、ファイルサイズは増加します。<br>高くするとファイルサイズを減らせますが、画質は低下します。"
|
||||
inMinutes: "分"
|
||||
inDays: "日"
|
||||
safeModeEnabled: "セーフモードが有効です"
|
||||
pluginsAreDisabledBecauseSafeMode: "セーフモードが有効なため、プラグインはすべて無効化されています。"
|
||||
customCssIsDisabledBecauseSafeMode: "セーフモードが有効なため、カスタムCSSは適用されていません。"
|
||||
themeIsDefaultBecauseSafeMode: "セーフモードが有効な間はデフォルトのテーマが使用されます。セーフモードをオフにすると元に戻ります。"
|
||||
thankYouForTestingBeta: "ベータ版の検証にご協力いただきありがとうございます!"
|
||||
|
||||
_order:
|
||||
newest: "新しい順"
|
||||
oldest: "古い順"
|
||||
|
||||
_chat:
|
||||
noMessagesYet: "まだメッセージはありません"
|
||||
@@ -1455,6 +1471,8 @@ _settings:
|
||||
contentsUpdateFrequency_description: "高いほどリアルタイムにコンテンツが更新されますが、パフォーマンスが低下し、通信量とバッテリーの消費が多くなります。"
|
||||
contentsUpdateFrequency_description2: "リアルタイムモードがオンのときは、この設定に関わらずリアルタイムでコンテンツが更新されます。"
|
||||
showUrlPreview: "URLプレビューを表示する"
|
||||
showAvailableReactionsFirstInNote: "利用できるリアクションを先頭に表示"
|
||||
showPageTabBarBottom: "ページのタブバーを下部に表示"
|
||||
|
||||
_chat:
|
||||
showSenderName: "送信者の名前を表示"
|
||||
@@ -1595,9 +1613,9 @@ _initialTutorial:
|
||||
public: "すべてのユーザーに公開。"
|
||||
home: "ホームタイムラインのみに公開。フォロワー・プロフィールを見に来た人・リノートから、他のユーザーも見ることができます。"
|
||||
followers: "フォロワーにのみ公開。本人以外がリノートすることはできず、またフォロワー以外は閲覧できません。"
|
||||
direct: "指定したユーザーにのみ公開され、また相手に通知が入ります。ダイレクトメッセージのかわりにお使いいただけます。"
|
||||
direct: "指定したユーザーにのみ公開され、また相手に通知が入ります。"
|
||||
doNotSendConfidencialOnDirect1: "機密情報は送信する際は注意してください。"
|
||||
doNotSendConfidencialOnDirect2: "送信先のサーバーの管理者は投稿内容を見ることが可能なので、信頼できないサーバーのユーザーにダイレクト投稿を送信する場合は、機密情報の扱いに注意が必要です。"
|
||||
doNotSendConfidencialOnDirect2: "送信先のサーバーの管理者は投稿内容を見ることが可能なので、信頼できないサーバーのユーザーが含まれる限定公開のノートを作成する際は、機密情報の扱いに注意が必要です。"
|
||||
localOnly: "他のサーバーに投稿を連合しません。上記の公開範囲に関わらず、他のサーバーのユーザーは、この設定がついたノートを直接閲覧することができなくなります。"
|
||||
_cw:
|
||||
title: "内容を隠す(CW)"
|
||||
@@ -1641,6 +1659,10 @@ _serverSettings:
|
||||
fanoutTimelineDbFallback: "データベースへのフォールバック"
|
||||
fanoutTimelineDbFallbackDescription: "有効にすると、タイムラインがキャッシュされていない場合にDBへ追加で問い合わせを行うフォールバック処理を行います。無効にすると、フォールバック処理を行わないことでさらにサーバーの負荷を軽減することができますが、タイムラインが取得できる範囲に制限が生じます。"
|
||||
reactionsBufferingDescription: "有効にすると、リアクション作成時のパフォーマンスが大幅に向上し、データベースへの負荷を軽減することが可能です。ただし、Redisのメモリ使用量は増加します。"
|
||||
remoteNotesCleaning: "リモート投稿の自動クリーニング"
|
||||
remoteNotesCleaning_description: "有効にすると、参照されていない古いリモートの投稿を定期的にクリーンアップしてデータベースの肥大化を抑制します。"
|
||||
remoteNotesCleaningMaxProcessingDuration: "最大クリーニング処理継続時間"
|
||||
remoteNotesCleaningExpiryDaysForEachNotes: "最低ノート保持日数"
|
||||
inquiryUrl: "問い合わせ先URL"
|
||||
inquiryUrlDescription: "サーバー運営者へのお問い合わせフォームのURLや、運営者の連絡先等が記載されたWebページのURLを指定します。"
|
||||
openRegistration: "アカウントの作成をオープンにする"
|
||||
@@ -1659,6 +1681,11 @@ _serverSettings:
|
||||
userGeneratedContentsVisibilityForVisitor: "非利用者に対するユーザー作成コンテンツの公開範囲"
|
||||
userGeneratedContentsVisibilityForVisitor_description: "モデレーションが行き届きにくい不適切なリモートコンテンツなどが、自サーバー経由で図らずもインターネットに公開されてしまうことによるトラブル防止などに役立ちます。"
|
||||
userGeneratedContentsVisibilityForVisitor_description2: "サーバーで受信したリモートのコンテンツを含め、サーバー内の全てのコンテンツを無条件でインターネットに公開することはリスクが伴います。特に、分散型の特性を知らない閲覧者にとっては、リモートのコンテンツであってもサーバー内で作成されたコンテンツであると誤って認識してしまう可能性があるため、注意が必要です。"
|
||||
restartServerSetupWizardConfirm_title: "サーバーの初期設定ウィザードをやり直しますか?"
|
||||
restartServerSetupWizardConfirm_text: "現在の一部の設定はリセットされます。"
|
||||
entrancePageStyle: "エントランスページのスタイル"
|
||||
showTimelineForVisitor: "タイムラインを表示する"
|
||||
showActivitiesForVisitor: "アクティビティを表示する"
|
||||
|
||||
_userGeneratedContentsVisibilityForVisitor:
|
||||
all: "全て公開"
|
||||
@@ -1999,6 +2026,7 @@ _role:
|
||||
descriptionOfRateLimitFactor: "小さいほど制限が緩和され、大きいほど制限が強化されます。"
|
||||
canHideAds: "広告の非表示"
|
||||
canSearchNotes: "ノート検索の利用"
|
||||
canSearchUsers: "ユーザー検索の利用"
|
||||
canUseTranslator: "翻訳機能の利用"
|
||||
avatarDecorationLimit: "アイコンデコレーションの最大取付個数"
|
||||
canImportAntennas: "アンテナのインポートを許可"
|
||||
@@ -2010,6 +2038,8 @@ _role:
|
||||
uploadableFileTypes: "アップロード可能なファイル種別"
|
||||
uploadableFileTypes_caption: "MIMEタイプを指定します。改行で区切って複数指定できるほか、アスタリスク(*)でワイルドカード指定できます。(例: image/*)"
|
||||
uploadableFileTypes_caption2: "ファイルによっては種別を判定できないことがあります。そのようなファイルを許可する場合は {x} を指定に追加してください。"
|
||||
noteDraftLimit: "サーバーサイドのノートの下書きの作成可能数"
|
||||
watermarkAvailable: "ウォーターマーク機能の使用可否"
|
||||
_condition:
|
||||
roleAssignedTo: "マニュアルロールにアサイン済み"
|
||||
isLocal: "ローカルユーザー"
|
||||
@@ -2190,6 +2220,7 @@ _theme:
|
||||
install: "テーマのインストール"
|
||||
manage: "テーマの管理"
|
||||
code: "テーマコード"
|
||||
copyThemeCode: "テーマコードをコピー"
|
||||
description: "説明"
|
||||
installed: "{name}をインストールしました"
|
||||
installedThemes: "インストールされたテーマ"
|
||||
@@ -2295,6 +2326,7 @@ _time:
|
||||
minute: "分"
|
||||
hour: "時間"
|
||||
day: "日"
|
||||
month: "ヶ月"
|
||||
|
||||
_2fa:
|
||||
alreadyRegistered: "既に設定は完了しています。"
|
||||
@@ -2513,12 +2545,14 @@ _visibility:
|
||||
homeDescription: "ホームタイムラインのみに公開"
|
||||
followers: "フォロワー"
|
||||
followersDescription: "自分のフォロワーのみに公開"
|
||||
specified: "ダイレクト"
|
||||
specified: "指名"
|
||||
specifiedDescription: "指定したユーザーのみに公開"
|
||||
disableFederation: "連合なし"
|
||||
disableFederationDescription: "他サーバーへの配信を行いません"
|
||||
|
||||
_postForm:
|
||||
quitInspiteOfThereAreUnuploadedFilesConfirm: "アップロードされていないファイルがありますが、破棄してフォームを閉じますか?"
|
||||
uploaderTip: "ファイルはまだアップロードされていません。ファイルのメニューから、リネームや画像のクロップ、ウォーターマークの付与、圧縮の有無などを設定できます。ファイルはノート投稿時に自動でアップロードされます。"
|
||||
replyPlaceholder: "このノートに返信..."
|
||||
quotePlaceholder: "このノートを引用..."
|
||||
channelPlaceholder: "チャンネルに投稿..."
|
||||
@@ -2757,8 +2791,8 @@ _deck:
|
||||
antenna: "アンテナ"
|
||||
list: "リスト"
|
||||
channel: "チャンネル"
|
||||
mentions: "あなた宛て"
|
||||
direct: "ダイレクト"
|
||||
mentions: "メンション"
|
||||
direct: "指名"
|
||||
roleTimeline: "ロールタイムライン"
|
||||
chat: "チャット"
|
||||
|
||||
@@ -2873,6 +2907,7 @@ _fileViewer:
|
||||
url: "URL"
|
||||
uploadedAt: "追加日"
|
||||
attachedNotes: "添付されているノート"
|
||||
usage: "利用"
|
||||
thisPageCanBeSeenFromTheAuthor: "このページは、このファイルをアップロードしたユーザーしか閲覧できません。"
|
||||
|
||||
_externalResourceInstaller:
|
||||
@@ -3142,6 +3177,7 @@ _bootErrors:
|
||||
otherOption1: "クライアント設定とキャッシュを削除"
|
||||
otherOption2: "簡易クライアントを起動"
|
||||
otherOption3: "修復ツールを起動"
|
||||
otherOption4: "Misskeyをセーフモードで起動"
|
||||
|
||||
_search:
|
||||
searchScopeAll: "全て"
|
||||
@@ -3180,6 +3216,9 @@ _serverSetupWizard:
|
||||
doYouConnectToFediverse_description1: "分散型サーバーで構成されるネットワーク(Fediverse)に接続すると、他のサーバーと相互にコンテンツのやり取りが可能です。"
|
||||
doYouConnectToFediverse_description2: "Fediverseと接続することは「連合」とも呼ばれます。"
|
||||
youCanConfigureMoreFederationSettingsLater: "連合可能なサーバーの指定など、高度な設定も後ほど可能です。"
|
||||
remoteContentsCleaning: "リモートコンテンツの自動クリーニング"
|
||||
remoteContentsCleaning_description: "連合を行うと、継続して多くのコンテンツを受信します。自動クリーニングを有効にすると、参照されていない古くなったリモートコンテンツを自動でサーバーから削除し、ストレージを節約できます。"
|
||||
remoteContentsCleaning_description2: "ローカル内リモートコンテンツへのハイパーリンクはリンク切れとなります。"
|
||||
adminInfo: "管理者情報"
|
||||
adminInfo_description: "問い合わせを受け付けるために使用される管理者情報を設定します。"
|
||||
adminInfo_mustBeFilled: "オープンサーバー、または連合がオンの場合は必ず入力が必要です。"
|
||||
@@ -3196,6 +3235,7 @@ _serverSetupWizard:
|
||||
text3: "支援者向け特典もあります!"
|
||||
|
||||
_uploader:
|
||||
editImage: "画像の編集"
|
||||
compressedToX: "{x}に圧縮"
|
||||
savedXPercent: "{x}%節約"
|
||||
abortConfirm: "アップロードされていないファイルがありますが、中止しますか?"
|
||||
@@ -3223,6 +3263,9 @@ watermark: "ウォーターマーク"
|
||||
defaultPreset: "デフォルトのプリセット"
|
||||
_watermarkEditor:
|
||||
tip: "画像にクレジット情報などのウォーターマークを追加することができます。"
|
||||
quitWithoutSaveConfirm: "保存せずに終了しますか?"
|
||||
driveFileTypeWarn: "このファイルは対応していません"
|
||||
driveFileTypeWarnDescription: "画像ファイルを選択してください"
|
||||
title: "ウォーターマークの編集"
|
||||
cover: "全体に被せる"
|
||||
repeat: "敷き詰める"
|
||||
@@ -3232,10 +3275,24 @@ _watermarkEditor:
|
||||
position: "位置"
|
||||
type: "タイプ"
|
||||
image: "画像"
|
||||
advanced: "高度"
|
||||
angle: "角度"
|
||||
stripe: "ストライプ"
|
||||
stripeWidth: "ラインの幅"
|
||||
stripeFrequency: "ラインの数"
|
||||
polkadot: "ポルカドット"
|
||||
checker: "チェッカー"
|
||||
polkadotMainDotOpacity: "メインドットの不透明度"
|
||||
polkadotMainDotRadius: "メインドットの大きさ"
|
||||
polkadotSubDotOpacity: "サブドットの不透明度"
|
||||
polkadotSubDotRadius: "サブドットの大きさ"
|
||||
polkadotSubDotDivisions: "サブドットの数"
|
||||
|
||||
_imageEffector:
|
||||
title: "エフェクト"
|
||||
addEffect: "エフェクトを追加"
|
||||
discardChangesConfirm: "変更を破棄して終了しますか?"
|
||||
nothingToConfigure: "設定項目はありません"
|
||||
|
||||
_fxs:
|
||||
chromaticAberration: "色収差"
|
||||
@@ -3243,8 +3300,63 @@ _imageEffector:
|
||||
mirror: "ミラー"
|
||||
invert: "色の反転"
|
||||
grayscale: "白黒"
|
||||
colorAdjust: "色調補正"
|
||||
colorClamp: "色の圧縮"
|
||||
colorClampAdvanced: "色の圧縮(高度)"
|
||||
distort: "歪み"
|
||||
threshold: "二値化"
|
||||
zoomLines: "集中線"
|
||||
stripe: "ストライプ"
|
||||
polkadot: "ポルカドット"
|
||||
checker: "チェッカー"
|
||||
blockNoise: "ブロックノイズ"
|
||||
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:
|
||||
select: "下書きを選択"
|
||||
cannotCreateDraftAnymore: "下書きの作成可能数を超えています。"
|
||||
cannotCreateDraft: "この内容では下書きを作成できません。"
|
||||
delete: "下書きを削除"
|
||||
deleteAreYouSure: "下書きを削除しますか?"
|
||||
noDrafts: "下書きはありません"
|
||||
replyTo: "{user}への返信"
|
||||
quoteOf: "{user}のノートへの引用"
|
||||
postTo: "{channel}への投稿"
|
||||
saveToDraft: "下書きへ保存"
|
||||
restoreFromDraft: "下書きから復元"
|
||||
restore: "復元"
|
||||
listDrafts: "下書き一覧"
|
||||
|
||||
+189
-5
@@ -300,6 +300,7 @@ uploadFromUrlMayTakeTime: "アップロード終わるんにちょい時間か
|
||||
explore: "みつける"
|
||||
messageRead: "もう読んだ"
|
||||
noMoreHistory: "これより昔のんはあらへんで"
|
||||
startChat: "チャットを始めよか"
|
||||
nUsersRead: "{n}人が読んでもうた"
|
||||
agreeTo: "{0}に同意したで"
|
||||
agree: "せやな"
|
||||
@@ -324,6 +325,7 @@ dark: "ダーク"
|
||||
lightThemes: "デイゲーム"
|
||||
darkThemes: "ナイトゲーム"
|
||||
syncDeviceDarkMode: "デバイスのダークモードと一緒にする"
|
||||
switchDarkModeManuallyWhenSyncEnabledConfirm: "「{x}」がオンになってるで。同期をオフにして手動でモードを切り替えることにします?"
|
||||
drive: "ドライブ"
|
||||
fileName: "ファイル名"
|
||||
selectFile: "ファイル選んでや"
|
||||
@@ -422,6 +424,7 @@ antennaExcludeBots: "Botアカウントを除外"
|
||||
antennaKeywordsDescription: "スペースで区切ったるとAND指定で、改行で区切ったるとOR指定や"
|
||||
notifyAntenna: "新しいノートを通知すんで"
|
||||
withFileAntenna: "なんか添付されたノートだけ"
|
||||
excludeNotesInSensitiveChannel: "センシティブなチャンネルのノートは入れんとくわ"
|
||||
enableServiceworker: "ブラウザにプッシュ通知が行くようにする"
|
||||
antennaUsersDescription: "ユーザー名を改行で区切ったってな"
|
||||
caseSensitive: "大文字と小文字は別もんや"
|
||||
@@ -693,6 +696,7 @@ userSaysSomethingAbout: "{name}が「{word}」についてなんか言うてた
|
||||
makeActive: "使うで"
|
||||
display: "表示"
|
||||
copy: "コピー"
|
||||
copiedToClipboard: "クリップボードにコピーされたで"
|
||||
metrics: "メトリクス"
|
||||
overview: "概要"
|
||||
logs: "ログ"
|
||||
@@ -787,6 +791,7 @@ wide: "広い"
|
||||
narrow: "狭い"
|
||||
reloadToApplySetting: "設定はページリロード後に反映されるで。今リロードしとくか?"
|
||||
needReloadToApply: "反映には再起動せなあかんで"
|
||||
needToRestartServerToApply: "反映にはサーバーを再起動せなあかんのよ。"
|
||||
showTitlebar: "タイトルバーを見せる"
|
||||
clearCache: "キャッシュをほかす"
|
||||
onlineUsersCount: "{n}人が起きとるで"
|
||||
@@ -974,6 +979,7 @@ document: "ドキュメント"
|
||||
numberOfPageCache: "ページ、どんだけキャッシュすんの?"
|
||||
numberOfPageCacheDescription: "増やすと使いやすくなるけど、負荷とメモリ使用量が増えてくで。一長一短やな。"
|
||||
logoutConfirm: "ログアウトしまっか?"
|
||||
logoutWillClearClientData: "ログアウトするとクライアントの設定情報がブラウザから消されてまうで。再ログイン時に設定情報を復元できるようにするためには、設定の自動バックアップを有効にするとええで。"
|
||||
lastActiveDate: "最後に使った日時"
|
||||
statusbar: "ステータスバー"
|
||||
pleaseSelect: "選んだってやー"
|
||||
@@ -992,6 +998,7 @@ failedToUpload: "アップロードに失敗してもうたわ…"
|
||||
cannotUploadBecauseInappropriate: "きわどい内容を含むかもしれへんって言われたからアップロードできへんわ。"
|
||||
cannotUploadBecauseNoFreeSpace: "ドライブがもうパンパンやからアップロードできへんわ。"
|
||||
cannotUploadBecauseExceedsFileSizeLimit: "ファイルが思うたよりも大きいさかいアップロードできへんでこれ。"
|
||||
cannotUploadBecauseUnallowedFileType: "許可されてへんファイル種別やからアップロードできへんっぽい。"
|
||||
beta: "ベータ"
|
||||
enableAutoSensitive: "自動できわどいか判断する"
|
||||
enableAutoSensitiveDescription: "使える時は、機械学習を使って自動でメディアにNSFWフラグを設定するで。この機能をオフにしても、サーバーによっては自動で設定されることがあるで。"
|
||||
@@ -1232,7 +1239,6 @@ releaseToRefresh: "離したらリロード"
|
||||
refreshing: "リロードしとる"
|
||||
pullDownToRefresh: "引っ張ってリロードするで"
|
||||
useGroupedNotifications: "通知をグループ分けして出すで"
|
||||
signupPendingError: "メアド確認してたらなんか変なことなったわ。リンクの期限切れてるかもしれん。"
|
||||
cwNotationRequired: "「内容を隠す」んやったら注釈書かなアカンで。"
|
||||
doReaction: "ツッコむで"
|
||||
code: "コード"
|
||||
@@ -1304,16 +1310,97 @@ federationSpecified: "このサーバーはホワイトリスト連合で運用
|
||||
federationDisabled: "このサーバーは連合が無効化されてるで。他のサーバーのユーザーとやり取りすることはできひんで。"
|
||||
confirmOnReact: "ツッコむときに確認とる"
|
||||
reactAreYouSure: "\" {emoji} \" でツッコむ?"
|
||||
markAsSensitiveConfirm: "このメディアをきわどい扱いしときますか?"
|
||||
unmarkAsSensitiveConfirm: "このメディアはやっぱきわどくなかったってことでええんか?"
|
||||
noName: "名前はあらへんで"
|
||||
preferenceSyncConflictTitle: "サーバーに設定値があるみたいやわ"
|
||||
preferenceSyncConflictText: "同期が有効にされた設定項目は設定値をサーバーに保存するねんけど、この設定項目はサーバーに保存されたやつがあるみたいやわ。どないするん?"
|
||||
preferenceSyncConflictChoiceMerge: "ガッチャンコしよか"
|
||||
preferenceSyncConflictChoiceCancel: "同期の有効化はやめとくわ"
|
||||
postForm: "投稿フォーム"
|
||||
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:
|
||||
noMessagesYet: "まだメッセージはあらへんで"
|
||||
individualChat_description: "特定のユーザーと一対一でチャットができるで。"
|
||||
roomChat_description: "複数人でチャットできるで。\nあと、個人チャットを許可してへんユーザーとでも、相手がええって言うならチャットできるで。"
|
||||
inviteUserToChat: "ユーザーを招待してチャットを始めてみ"
|
||||
invitations: "来てや"
|
||||
noInvitations: "招待はあらへんで"
|
||||
noHistory: "履歴はないわ。"
|
||||
noRooms: "ルームはあらへんで"
|
||||
members: "メンバーはん"
|
||||
home: "ホーム"
|
||||
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:
|
||||
driveBanner: "ドライブの管理と設定、使用量の確認、ファイルをアップロードするときの設定ができるで。"
|
||||
pluginBanner: "プラグインを使うとクライアントの機能を拡張できるねん。プラグインのインストール、個別の設定と管理ができるで。"
|
||||
notificationsBanner: "サーバーから受け取る通知の種類とか範囲、プッシュ通知の設定ができるで。"
|
||||
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:
|
||||
requireSigninToViewContents: "ログインしてもらってからコンテンツ見てもらう"
|
||||
requireSigninToViewContentsDescription1: "あなたが作成した全部のノートとかのコンテンツを見れるようにするのにログインがいるようにするで。クローラーにいろいろ収集されるんを防げるかもしれん。"
|
||||
@@ -1324,6 +1411,7 @@ _accountSettings:
|
||||
makeNotesHiddenBefore: "昔のノートを見れんようにする"
|
||||
makeNotesHiddenBeforeDescription: "この機能が有効になってる間は、設定された日時より前、それか設定された時間が経ったノートがフォロワーのみ見れるようになるで。無効に戻すと、ノートの公開状態も戻るで。"
|
||||
mayNotEffectForFederatedNotes: "リモートサーバーに連合されたノートには効果が及ばんかもしれん。"
|
||||
mayNotEffectSomeSituations: "これらの制限は簡易的なものやで。リモートサーバーでの閲覧とかモデレーション時とか、一部のシチュエーションでは適用されへんかもしれん。"
|
||||
notesHavePassedSpecifiedPeriod: "決めた時間が経ったノート"
|
||||
notesOlderThanSpecifiedDateAndTime: "決めた日時より前のノート"
|
||||
_abuseUserReport:
|
||||
@@ -1342,6 +1430,7 @@ _delivery:
|
||||
manuallySuspended: "手動停止中"
|
||||
goneSuspended: "サーバー削除のため停止中"
|
||||
autoSuspendedForNotResponding: "サーバー応答せえへんから停止中"
|
||||
softwareSuspended: "配信停止中のソフトウェアやから停止中"
|
||||
_bubbleGame:
|
||||
howToPlay: "遊び方"
|
||||
hold: "ホールド"
|
||||
@@ -1468,11 +1557,21 @@ _serverSettings:
|
||||
fanoutTimelineDbFallback: "データベースにフォールバックする"
|
||||
fanoutTimelineDbFallbackDescription: "有効にしたら、タイムラインがキャッシュん中に入ってないときにDBにもっかい問い合わせるフォールバック処理ってのをやっとくで。切ったらフォールバック処理をやらんからサーバーはもっと軽くなんねんけど、タイムラインの取得範囲がちょっと減るで。"
|
||||
reactionsBufferingDescription: "有効にしたら、リアクション作るときのパフォーマンスがすっごい上がって、データベースへの負荷が減るで。代わりに、Redisのメモリ使用は増えるで。"
|
||||
remoteNotesCleaning_description: "つけると、参照されてへん古いリモートの投稿を定期的にクリーンアップしてデータベースの肥大化を抑えてくれるで。"
|
||||
inquiryUrl: "問い合わせ先URL"
|
||||
inquiryUrlDescription: "サーバー運営者へのお問い合わせフォームのURLや、運営者の連絡先等が記載されたWebページのURLを指定するで。"
|
||||
openRegistration: "アカウントの作成をオープンにする"
|
||||
openRegistrationWarning: "登録を解放するのはリスクが伴うで。サーバーをいっつも監視して、なんか起きたらすぐに対応できるんやったら、オンにしてもええと思う。"
|
||||
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:
|
||||
moveFrom: "別のアカウントからこのアカウントに引っ越す"
|
||||
moveFromSub: "別のアカウントへエイリアスを作る"
|
||||
@@ -1769,6 +1868,7 @@ _role:
|
||||
descriptionOfIsExplorable: "オンにしたらロールの面子一覧が「みつける」で公開されるし、ロールのタイムラインが使えるようになるで。"
|
||||
displayOrder: "表示順"
|
||||
descriptionOfDisplayOrder: "数がでかいほど、UI上で先に表示されるで。"
|
||||
preserveAssignmentOnMoveAccount_description: "つけると、このロールがのっかったアカウントが引っ越したときに、引っ越し先アカウントにもこのロールがのっかるようになるで。"
|
||||
canEditMembersByModerator: "モデレーターがメンバーいじるのを許す"
|
||||
descriptionOfCanEditMembersByModerator: "オンにすると、管理者だけやなくてモデレーターもこのロールにユーザーを入れたり抜いたりできるで。オフにすると管理者だけしかやれへんくなるで。"
|
||||
priority: "優先度"
|
||||
@@ -1809,6 +1909,8 @@ _role:
|
||||
canImportFollowing: "フォローのインポートを許す"
|
||||
canImportMuting: "ミュートのインポートを許す"
|
||||
canImportUserLists: "リストのインポートを許す"
|
||||
uploadableFileTypes_caption: "MIMEタイプを指定してや。改行で区切って複数指定もできるし、アスタリスク(*)でワイルドカード指定もできるで。(例: image/*)"
|
||||
uploadableFileTypes_caption2: "ファイルによっては種別がわからんこともあるで。そないなファイルを許可するんやったら {x} を指定に追加してな。"
|
||||
_condition:
|
||||
roleAssignedTo: "マニュアルロールにアサイン済み"
|
||||
isLocal: "ローカルユーザー"
|
||||
@@ -2008,7 +2110,7 @@ _theme:
|
||||
navIndicator: "サイドバーのインジケーター"
|
||||
link: "リンク"
|
||||
hashtag: "ハッシュタグ"
|
||||
mention: "メンション"
|
||||
mention: "あんた宛て"
|
||||
mentionMe: "うち宛てのメンション"
|
||||
renote: "Renote"
|
||||
modalBg: "モーダルの背景"
|
||||
@@ -2277,6 +2379,8 @@ _visibility:
|
||||
disableFederation: "連合なし"
|
||||
disableFederationDescription: "他サーバーへは送らんとくわ"
|
||||
_postForm:
|
||||
quitInspiteOfThereAreUnuploadedFilesConfirm: "アップロードされてへんファイルがあるんやけど、ほかしてフォームを閉じてもええんか?"
|
||||
uploaderTip: "ファイルはまだアップロードされてへんで。ファイルのメニューから、リネームとか画像のクロップ、ウォーターマークをのっける、圧縮するかどうかなんかを設定できるで。ファイルはノートを投稿するときに自動でアップロードされるで。"
|
||||
replyPlaceholder: "このノートに返信..."
|
||||
quotePlaceholder: "このノートを引用..."
|
||||
channelPlaceholder: "チャンネルに投稿..."
|
||||
@@ -2428,6 +2532,7 @@ _notification:
|
||||
newNote: "さらの投稿"
|
||||
unreadAntennaNote: "アンテナ {name}"
|
||||
roleAssigned: "ロールが付与されたで"
|
||||
chatRoomInvitationReceived: "チャットルームへ招待されたで"
|
||||
emptyPushNotificationMessage: "プッシュ通知の更新をしといたで"
|
||||
achievementEarned: "実績を獲得しとるで"
|
||||
testNotification: "通知テスト"
|
||||
@@ -2447,7 +2552,7 @@ _notification:
|
||||
all: "すべて"
|
||||
note: "あんたらの新規投稿"
|
||||
follow: "フォロー"
|
||||
mention: "メンション"
|
||||
mention: "あんた宛て"
|
||||
reply: "リプライ"
|
||||
renote: "リノート"
|
||||
quote: "引用"
|
||||
@@ -2617,7 +2722,7 @@ _externalResourceInstaller:
|
||||
_errors:
|
||||
_invalidParams:
|
||||
title: ""
|
||||
description: ""
|
||||
description: "外部サイトからデータを持ってくるのに欲しい情報が足らへんみたいやわ。URLは合っとる?"
|
||||
_resourceTypeNotSupported:
|
||||
title: ""
|
||||
description: ""
|
||||
@@ -2647,8 +2752,12 @@ _dataSaver:
|
||||
_avatar:
|
||||
title: "アイコンの絵"
|
||||
description: "アイコン画像のアニメが止まるで。普通の画像よりもデータ量がでかいから、もっと通信量を節約できるねん。"
|
||||
_urlPreviewThumbnail:
|
||||
description: "URLプレビューのサムネイル画像が読み込まれへんくなるで。"
|
||||
_disableUrlPreview:
|
||||
description: "URLプレビュー機能を切るで。サムネイル画像だけと違って、リンク先の情報の読み込み自体を削減できるで。"
|
||||
_code:
|
||||
title: "コードハイライト"
|
||||
title: "コードハイライトは表示せんでええ"
|
||||
description: "MFMとかでコードハイライト記法が使われてるとき、タップするまで読み込まれへんくなるで。コードハイライトではハイライトする言語ごとにその決めてるファイルを読む必要はあんねんな。けどな、それは自動で読み込まれなくなるから、通信量を少なくできることができるねん。"
|
||||
_hemisphere:
|
||||
N: "北半球"
|
||||
@@ -2704,6 +2813,7 @@ _offlineScreen:
|
||||
_urlPreviewSetting:
|
||||
title: "URLプレビューの設定"
|
||||
enable: "URLプレビューを有効にする"
|
||||
allowRedirectDescription: "入力されたURLがリダイレクトされるとき、そのリダイレクト先をたどってプレビューを表示するかどうかを設定できるで。無効にするとサーバーリソースを節約できるんやけど、リダイレクト先の内容は表示されへんくなるで。"
|
||||
timeout: "プレビュー取得時のタイムアウト(ms)"
|
||||
timeoutDescription: "プレビュー取得の所要時間がこの値を超えた場合、プレビューは生成されへんで。"
|
||||
maximumContentLength: "Content-Lengthの最大値(byte)"
|
||||
@@ -2848,3 +2958,77 @@ _search:
|
||||
searchScopeAll: "みんな"
|
||||
searchScopeLocal: "ローカル"
|
||||
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:
|
||||
tip: "画像にクレジット情報とかのウォーターマークをのっけられるで。"
|
||||
quitWithoutSaveConfirm: "保存せずに終わってもええんか?"
|
||||
driveFileTypeWarn: "このファイルは対応しとらへん"
|
||||
driveFileTypeWarnDescription: "画像ファイルを選んでや"
|
||||
opacity: "不透明度"
|
||||
scale: "大きさ"
|
||||
text: "テキスト"
|
||||
position: "位置"
|
||||
type: "タイプ"
|
||||
image: "画像"
|
||||
advanced: "高度"
|
||||
angle: "角度"
|
||||
_imageEffector:
|
||||
discardChangesConfirm: "変更をせんで終わるか?"
|
||||
_fxProps:
|
||||
angle: "角度"
|
||||
scale: "大きさ"
|
||||
size: "大きさ"
|
||||
color: "色"
|
||||
opacity: "不透明度"
|
||||
lightness: "明るさ"
|
||||
_drafts:
|
||||
cannotCreateDraftAnymore: "下書きはこれ以上は作れへんな。"
|
||||
cannotCreateDraft: "この内容で下書きは作れへんな。"
|
||||
delete: "下書きをほかす"
|
||||
deleteAreYouSure: "下書きをほかしてもええか?"
|
||||
noDrafts: "下書きはあらへん"
|
||||
|
||||
@@ -44,6 +44,7 @@ showMore: "ಇನ್ನಷ್ಟು ನೋಡು"
|
||||
youGotNewFollower: "ಹಿಂಬಾಲಿಸಿದರು"
|
||||
receiveFollowRequest: "ಹಿಂಬಾಲನೆ ವಿನಂತಿ ಬಂದಿದೆ"
|
||||
followRequestAccepted: "ಹಿಂಬಾಲನೆ ವಿನಂತಿ ಸ್ವೀಕರಿಸಲಾಯಿತು"
|
||||
mention: "ಹೆಸರಿಸಿದ"
|
||||
mentions: "ಹೆಸರಿಸಿದ"
|
||||
directNotes: "ನೇರ ಟಿಪ್ಪಣಿಗಳು"
|
||||
importAndExport: "ಆಮದು/ರಫ್ತು"
|
||||
@@ -65,6 +66,9 @@ replies: "ಉತ್ತರಿಸು"
|
||||
_email:
|
||||
_follow:
|
||||
title: "ಹಿಂಬಾಲಿಸಿದರು"
|
||||
_theme:
|
||||
keys:
|
||||
mention: "ಹೆಸರಿಸಿದ"
|
||||
_sfx:
|
||||
notification: "ಅಧಿಸೂಚನೆಗಳು"
|
||||
_widgets:
|
||||
@@ -73,11 +77,14 @@ _widgets:
|
||||
timeline: "ಸಮಯಸಾಲು"
|
||||
_cw:
|
||||
show: "ಇನ್ನಷ್ಟು ನೋಡು"
|
||||
_visibility:
|
||||
specified: "ನೇರ ಟಿಪ್ಪಣಿಗಳು"
|
||||
_profile:
|
||||
username: "ಬಳಕೆಹೆಸರು"
|
||||
_notification:
|
||||
youWereFollowed: "ಹಿಂಬಾಲಿಸಿದರು"
|
||||
_types:
|
||||
mention: "ಹೆಸರಿಸಿದ"
|
||||
login: "ಪ್ರವೇಶ"
|
||||
_actions:
|
||||
reply: "ಉತ್ತರಿಸು"
|
||||
@@ -86,3 +93,4 @@ _deck:
|
||||
notifications: "ಅಧಿಸೂಚನೆಗಳು"
|
||||
tl: "ಸಮಯಸಾಲು"
|
||||
mentions: "ಹೆಸರಿಸಿದ"
|
||||
direct: "ನೇರ ಟಿಪ್ಪಣಿಗಳು"
|
||||
|
||||
+6
-2
@@ -745,7 +745,7 @@ _menuDisplay:
|
||||
_theme:
|
||||
description: "설멩"
|
||||
keys:
|
||||
mention: "멘션"
|
||||
mention: "받언 멘션"
|
||||
renote: "리노트"
|
||||
_sfx:
|
||||
note: "새 노트"
|
||||
@@ -775,6 +775,7 @@ _cw:
|
||||
_visibility:
|
||||
home: "덜머리"
|
||||
followers: "팔로워"
|
||||
specified: "쪽지 서기"
|
||||
_postForm:
|
||||
_placeholders:
|
||||
e: "옇다 서 주이소"
|
||||
@@ -809,7 +810,7 @@ _notification:
|
||||
newNote: "새 걸"
|
||||
_types:
|
||||
follow: "팔로잉"
|
||||
mention: "멘션"
|
||||
mention: "받언 멘션"
|
||||
renote: "리노트"
|
||||
quote: "따오기"
|
||||
reaction: "반엉"
|
||||
@@ -824,6 +825,7 @@ _deck:
|
||||
antenna: "안테나"
|
||||
list: "리스트"
|
||||
mentions: "받언 멘션"
|
||||
direct: "쪽지 서기"
|
||||
_webhookSettings:
|
||||
name: "이럼"
|
||||
_abuseReport:
|
||||
@@ -848,3 +850,5 @@ _remoteLookupErrors:
|
||||
_search:
|
||||
searchScopeAll: "말캉"
|
||||
searchScopeUser: "사용자 지정"
|
||||
_watermarkEditor:
|
||||
image: "이미지"
|
||||
|
||||
+253
-1
@@ -298,6 +298,7 @@ uploadFromUrl: "URL 업로드"
|
||||
uploadFromUrlDescription: "업로드하려는 파일의 URL"
|
||||
uploadFromUrlRequested: "업로드를 요청했습니다"
|
||||
uploadFromUrlMayTakeTime: "업로드가 완료될 때까지 시간이 소요될 수 있습니다."
|
||||
uploadNFiles: "{n}개의 파일을 업로"
|
||||
explore: "둘러보기"
|
||||
messageRead: "읽음"
|
||||
noMoreHistory: "이것보다 과거의 기록이 없습니다"
|
||||
@@ -326,6 +327,7 @@ dark: "다크"
|
||||
lightThemes: "밝은 테마"
|
||||
darkThemes: "어두운 테마"
|
||||
syncDeviceDarkMode: "디바이스의 다크 모드 설정과 동기화"
|
||||
switchDarkModeManuallyWhenSyncEnabledConfirm: "'{x}'가 켜져 있습니다. 동기화를 끄고 수동으로 모드를 변경하겠습니까?"
|
||||
drive: "드라이브"
|
||||
fileName: "파일명"
|
||||
selectFile: "파일 선택"
|
||||
@@ -575,8 +577,10 @@ showFixedPostForm: "타임라인 상단에 글 입력란을 표시"
|
||||
showFixedPostFormInChannel: "채널 타임라인 상단에 글 입력란을 표시"
|
||||
withRepliesByDefaultForNewlyFollowed: "팔로우 할 때 기본적으로 답글을 타임라인에 나오게 하기"
|
||||
newNoteRecived: "새 노트가 있습니다"
|
||||
newNote: "새로운 노트"
|
||||
sounds: "소리"
|
||||
sound: "소리"
|
||||
notificationSoundSettings: "알림 설정"
|
||||
listen: "듣기"
|
||||
none: "없음"
|
||||
showInPage: "페이지로 보기"
|
||||
@@ -791,6 +795,7 @@ wide: "넓게"
|
||||
narrow: "좁게"
|
||||
reloadToApplySetting: "이 설정을 적용하려면 페이지를 새로고침해야 합니다. 바로 새로고침하시겠습니까?"
|
||||
needReloadToApply: "변경 사항은 새로고침하면 적용됩니다."
|
||||
needToRestartServerToApply: "변경 사항은 새로고침이 필요합니다."
|
||||
showTitlebar: "타이틀 바를 표시하기"
|
||||
clearCache: "캐시 비우기"
|
||||
onlineUsersCount: "{n}명이 접속 중"
|
||||
@@ -997,6 +1002,7 @@ failedToUpload: "업로드 실패"
|
||||
cannotUploadBecauseInappropriate: "이 파일은 부적절한 내용을 포함한다고 판단되어 업로드할 수 없습니다."
|
||||
cannotUploadBecauseNoFreeSpace: "드라이브 용량이 부족하여 업로드할 수 없습니다."
|
||||
cannotUploadBecauseExceedsFileSizeLimit: "파일 크기가 너무 크기 때문에 업로드할 수 없습니다."
|
||||
cannotUploadBecauseUnallowedFileType: "허가되지 않은 유형의 파일이기에 업로드할 수 없습니다."
|
||||
beta: "베타"
|
||||
enableAutoSensitive: "자동 NSFW 탐지"
|
||||
enableAutoSensitiveDescription: "이용 가능할 경우 기계학습을 통해 자동으로 미디어 NSFW를 설정합니다. 이 기능을 해제하더라도, 서버 정책에 따라 자동으로 설정될 수 있습니다."
|
||||
@@ -1048,6 +1054,7 @@ permissionDeniedError: "작업이 거부되었습니다"
|
||||
permissionDeniedErrorDescription: "이 작업을 수행할 권한이 없습니다."
|
||||
preset: "프리셋"
|
||||
selectFromPresets: "프리셋에서 선택"
|
||||
custom: "커스텀"
|
||||
achievements: "도전 과제"
|
||||
gotInvalidResponseError: "서버의 응답이 올바르지 않습니다"
|
||||
gotInvalidResponseErrorDescription: " 서버가 다운되었거나 점검중일 가능성이 있습니다. 잠시후에 다시 시도해 주십시오."
|
||||
@@ -1086,6 +1093,7 @@ prohibitedWordsDescription2: "공백으로 구분하면 AND 지정이 되며,
|
||||
hiddenTags: "숨긴 해시태그"
|
||||
hiddenTagsDescription: "설정한 태그를 트렌드에 표시하지 않도록 합니다. 줄 바꿈으로 하나씩 나눠서 설정할 수 있습니다."
|
||||
notesSearchNotAvailable: "노트 검색을 이용하실 수 없습니다."
|
||||
usersSearchNotAvailable: "유저 검색을 이용하실 수 없습니다."
|
||||
license: "라이선스"
|
||||
unfavoriteConfirm: "즐겨찾기를 해제하시겠습니까?"
|
||||
myClips: "내 클립"
|
||||
@@ -1237,7 +1245,7 @@ releaseToRefresh: "놓아서 새로고침"
|
||||
refreshing: "새로고침 중"
|
||||
pullDownToRefresh: "아래로 내려서 새로고침"
|
||||
useGroupedNotifications: "알림을 그룹화하고 표시"
|
||||
signupPendingError: "메일 주소 확인중에 문제가 발생했습니다. 링크의 유효기간이 지났을 가능성이 있습니다."
|
||||
emailVerificationFailedError: "메일 주소 확인에 실패했습니다. 확인에 필요한 URL의 유효기간이 지났을 가능성이 있습니다."
|
||||
cwNotationRequired: "'내용을 숨기기'를 체크한 경우 주석을 써야 합니다."
|
||||
doReaction: "리액션 추가"
|
||||
code: "문자열"
|
||||
@@ -1307,6 +1315,7 @@ availableRoles: "사용 가능한 역할"
|
||||
acknowledgeNotesAndEnable: "활성화 하기 전에 주의 사항을 확인했습니다."
|
||||
federationSpecified: "이 서버는 화이트 리스트 제도로 운영 중 입니다. 정해진 리모트 서버가 아닌 경우 연합되지 않습니다."
|
||||
federationDisabled: "이 서버는 연합을 하지 않고 있습니다. 리모트 서버 유저와 통신을 할 수 없습니다."
|
||||
draft: "초안"
|
||||
confirmOnReact: "리액션할 때 확인"
|
||||
reactAreYouSure: "\" {emoji} \"로 리액션하시겠습니까?"
|
||||
markAsSensitiveConfirm: "이 미디어를 민감한 미디어로 설정하시겠습니까?"
|
||||
@@ -1324,6 +1333,7 @@ restore: "복원"
|
||||
syncBetweenDevices: "장치간 동기화"
|
||||
preferenceSyncConflictTitle: "서버에 설정값이 존재합니다."
|
||||
preferenceSyncConflictText: "동기화를 활성화 한 항목의 설정 값은 서버에 저장되지만, 해당 항목은 이미 서버에 설정 값이 저장되어져 있습니다. 어느 쪽의 설정 값을 덮어씌울까요?"
|
||||
preferenceSyncConflictChoiceMerge: "병합"
|
||||
preferenceSyncConflictChoiceServer: "서버 설정값"
|
||||
preferenceSyncConflictChoiceDevice: "장치 설정값"
|
||||
preferenceSyncConflictChoiceCancel: "동기화 취소"
|
||||
@@ -1346,6 +1356,30 @@ goToDeck: "덱으로 돌아가기"
|
||||
federationJobs: "연합 작업"
|
||||
driveAboutTip: "드라이브는 이전에 업로드한 파일 목록을 표시해요. <br>\n노트에 첨부할 때 다시 사용하거나 나중에 게시할 파일을 미리 업로드할 수 있어요. <br>\n<b>파일을 삭제하면, 지금까지 그 파일을 사용한 모든 장소(노트, 페이지, 아바타, 배너 등)에서도 보이지 않게 되므로 주의해 주세요. 폴더를 만들고 정리할 수도 있어요.</b><br>"
|
||||
scrollToClose: "스크롤하여 닫기"
|
||||
advice: "참고"
|
||||
realtimeMode: "실시간 모드"
|
||||
turnItOn: "켜기"
|
||||
turnItOff: "끄기"
|
||||
emojiMute: "이모티콘 뮤트"
|
||||
emojiUnmute: "이모티콘 뮤트 해제"
|
||||
muteX: "{x}를 뮤트"
|
||||
unmuteX: "{x}의 뮤트를 해제"
|
||||
abort: "중지"
|
||||
tip: "팁과 유용한 정보"
|
||||
redisplayAllTips: "모든 '팁과 유용한 정보'를 재표시"
|
||||
hideAllTips: "모든 '팁과 유용한 정보'를 비표시"
|
||||
defaultImageCompressionLevel: "기본 이미지 압축 정도"
|
||||
defaultImageCompressionLevel_description: "낮추면 화질을 유지합니다만 파일 크기는 증가합니다. <br>높이면 파일 크기를 줄일 수 있습니다만 화질은 저하됩니다."
|
||||
inMinutes: "분"
|
||||
inDays: "일"
|
||||
safeModeEnabled: "세이프 모드가 활성화돼있습니다"
|
||||
pluginsAreDisabledBecauseSafeMode: "세이프 모드가 활성화돼있기에 플러그인은 전부 비활성화됩니다."
|
||||
customCssIsDisabledBecauseSafeMode: "세이프 모드가 활성화돼있기에 커스텀 CSS는 적용되지 않습니다."
|
||||
themeIsDefaultBecauseSafeMode: "세이프 모드가 활성화돼있는 동안에는 기본 테마가 사용됩니다. 세이프 모드를 끄면 원래대로 돌아옵니다."
|
||||
thankYouForTestingBeta: "베타 버전의 검증에 협력해 주셔서 감사합니다!"
|
||||
_order:
|
||||
newest: "최신 순"
|
||||
oldest: "오래된 순"
|
||||
_chat:
|
||||
noMessagesYet: "아직 메시지가 없습니다"
|
||||
newMessage: "새로운 메시지"
|
||||
@@ -1379,6 +1413,8 @@ _chat:
|
||||
chatNotAvailableInOtherAccount: "상대방 계정에서 채팅 기능을 사용할 수 없는 상태입니다."
|
||||
cannotChatWithTheUser: "이 유저와 채팅을 시작할 수 없습니다"
|
||||
cannotChatWithTheUser_description: "채팅을 사용할 수 없는 상태이거나 상대방이 채팅을 열지 않은 상태입니다."
|
||||
youAreNotAMemberOfThisRoomButInvited: "당신은 이 룸의 참가자가 아닙니다만 초대 신청을 받으셨습니다. 참가하려면 초대를 수락해주십시오."
|
||||
doYouAcceptInvitation: "초대를 수락하시겠습니까?"
|
||||
chatWithThisUser: "채팅하기"
|
||||
thisUserAllowsChatOnlyFromFollowers: "이 유저는 팔로워만 채팅을 할 수 있습니다."
|
||||
thisUserAllowsChatOnlyFromFollowing: "이 유저는 이 유저가 팔로우하는 유저만 채팅을 허용합니다."
|
||||
@@ -1418,12 +1454,21 @@ _settings:
|
||||
makeEveryTextElementsSelectable: "모든 텍스트 요소를 선택할 수 있도록 함"
|
||||
makeEveryTextElementsSelectable_description: "활성화 시, 일부 동작에서 유저의 접근성이 나빠질 수도 있습니다."
|
||||
useStickyIcons: "아이콘이 스크롤을 따라가도록 하기"
|
||||
enableHighQualityImagePlaceholders: "고화질 이미지의 플레이스홀더를 표시"
|
||||
uiAnimations: "UI 애니메이션"
|
||||
showNavbarSubButtons: "내비게이션 바에 보조 버튼 표시"
|
||||
ifOn: "켜져 있을 때"
|
||||
ifOff: "꺼져 있을 때"
|
||||
enableSyncThemesBetweenDevices: "기기 간 설치한 테마 동기화"
|
||||
enablePullToRefresh: "계속해서 갱신"
|
||||
enablePullToRefresh_description: "마우스에서 휠을 누르면서 드래그해요."
|
||||
realtimeMode_description: "서버에 접속하고 실시간으로 콘텐츠를 업데이트합니다. 데이터 사용량과 배터리의 소비가 증가할 수 있습니다."
|
||||
contentsUpdateFrequency: "콘텐츠의 업데이트 빈도"
|
||||
contentsUpdateFrequency_description: "높을수록 실시간으로 콘텐츠가 업데이트됩니다만, 성능이 저하되고 데이터 사용량과 배터리의 소비가 증가합니다."
|
||||
contentsUpdateFrequency_description2: "실시간 모드가 켜져 있을 때는 이 설정과 상관없이 실시간으로 콘텐츠가 업데이트됩니다."
|
||||
showUrlPreview: "URL 미리보기 표시"
|
||||
showAvailableReactionsFirstInNote: "이용 가능한 리액션을 선두로 표시"
|
||||
showPageTabBarBottom: "페이지의 탭 바를 아래쪽에 표시"
|
||||
_chat:
|
||||
showSenderName: "발신자 이름 표시"
|
||||
sendOnEnter: "엔터로 보내기"
|
||||
@@ -1597,6 +1642,10 @@ _serverSettings:
|
||||
fanoutTimelineDbFallback: "데이터베이스를 예비로 사용하기"
|
||||
fanoutTimelineDbFallbackDescription: "활성화하면 타임라인의 캐시되어 있지 않은 부분에 대해 DB에 질의하여 정보를 가져옵니다. 비활성화하면 이를 실행하지 않음으로써 서버의 부하를 줄일 수 있지만, 타임라인에서 가져올 수 있는 게시물 범위가 한정됩니다."
|
||||
reactionsBufferingDescription: "활성화 한 경우, 리액션 작성 퍼포먼스가 대폭 향상되어 DB의 부하를 줄일 수 있으나, Redis의 메모리 사용량이 많아집니다."
|
||||
remoteNotesCleaning: "리모트 서버 노트 자동 정리 "
|
||||
remoteNotesCleaning_description: "더 이상 사용되지 않는 오래된 리모트 노트를 정기적으로 정리하여, 데이터 베이스의 사용량을 절약할 수 있습니다."
|
||||
remoteNotesCleaningMaxProcessingDuration: "리모트 노트 자동 정리 최대 실행 시간"
|
||||
remoteNotesCleaningExpiryDaysForEachNotes: "리모트 노트 저장 최소 일수"
|
||||
inquiryUrl: "문의처 URL"
|
||||
inquiryUrlDescription: "서버 운영자에게 보내는 문의 양식의 URL이나 운영자의 연락처 등이 적힌 웹 페이지의 URL을 설정합니다."
|
||||
openRegistration: "회원 가입을 활성화 하기"
|
||||
@@ -1604,6 +1653,26 @@ _serverSettings:
|
||||
thisSettingWillAutomaticallyOffWhenModeratorsInactive: "일정 기간동안 모더레이터의 활동이 감지되지 않는 경우, 스팸 방지를 위해 이 설정은 자동으로 꺼집니다."
|
||||
deliverSuspendedSoftware: "전달 정지 중인 소프트웨어"
|
||||
deliverSuspendedSoftwareDescription: "취약성 등의 이유로 서버의 소프트웨어 이름 및 버전 범위를 지정하여 전달을 정지할 수 있어요. 이 버전 정보는 서버가 제공한 것이며 신뢰성은 보장되지 않아요. 버전 지정에는 semver의 범위 지정을 사용할 수 있지만, >= 2024.3.1로 지정하면 2024.3.1-custom.0과 같은 custom.0과 같은 custom 버전이 포함되지 않기 때문에 >= 2024.3.1-0과 같이 prerelease를 지정하는 것이 좋아요."
|
||||
singleUserMode: "1인 모드"
|
||||
singleUserMode_description: "이 서버의 이용자가 자신 뿐인 경우, 이 모드를 활성화하면 동작이 최적화됩니다."
|
||||
signToActivityPubGet: "GET 요청에 사인"
|
||||
signToActivityPubGet_description: "보통의 경우 활성화해 주십시오. 연합의 통신에 관한 문제가 있는 경우, 비활성화하면 개선되는 경우도 있습니다만, 서버에 따라서는 통신이 불가능해지는 경우도 있습니다."
|
||||
proxyRemoteFiles: "리모트 파일 프록시"
|
||||
proxyRemoteFiles_description: "활성화하면 리모트 파일을 프록시로 제공합니다. 이미지의 섬네일 생성이나 유저의 개인정보 보호에 도움을 줍니다."
|
||||
allowExternalApRedirect: "ActivityPub 경유 조회에 리디렉션 허가"
|
||||
allowExternalApRedirect_description: "활성화하면 다른 서버가 이 서버를 통해 제3자의 콘텐츠를 조회할 수 있습니다만, 콘텐츠의 사칭 문제가 생길 수 있습니다."
|
||||
userGeneratedContentsVisibilityForVisitor: "비이용자에 대한 유저 작성 콘텐츠의 공개 범위"
|
||||
userGeneratedContentsVisibilityForVisitor_description: "조정을 하기 힘든 부적절한 리모트 콘텐츠 등이 자신의 서버 경유로 의도치 않게 인터넷에 공개되는 문제의 방지 등에 도움을 줍니다."
|
||||
userGeneratedContentsVisibilityForVisitor_description2: "서버에서 받은 리모트 콘텐츠를 포함해 서버 내의 모든 콘텐츠를 무조건 인터넷에 공개하는 것에는 위험이 따릅니다. 특히, 분산형 특성에 대해 모르는 열람자에게는 리모트 콘텐츠여도 서버 내에서 작성된 콘텐츠라고 잘못 인식할 수 있기에 주의가 필요합니다."
|
||||
restartServerSetupWizardConfirm_title: "서버의 초기 설정 위자드를 재시도하시겠습니까?"
|
||||
restartServerSetupWizardConfirm_text: "현재 일부 설정은 리셋됩니다."
|
||||
entrancePageStyle: "입구 페이지의 스타일"
|
||||
showTimelineForVisitor: "타임라인 표시"
|
||||
showActivitiesForVisitor: "액티비티 표시하기"
|
||||
_userGeneratedContentsVisibilityForVisitor:
|
||||
all: "모두 공개"
|
||||
localOnly: "로컬 콘텐츠만 공개하고 리모트 콘텐츠는 비공개"
|
||||
none: "모두 비공개"
|
||||
_accountMigration:
|
||||
moveFrom: "다른 계정에서 이 계정으로 이사"
|
||||
moveFromSub: "다른 계정에 대한 별칭을 생성"
|
||||
@@ -1936,6 +2005,7 @@ _role:
|
||||
descriptionOfRateLimitFactor: "작을수록 제한이 완화되고, 클수록 제한이 강화됩니다."
|
||||
canHideAds: "광고 숨기기"
|
||||
canSearchNotes: "노트 검색 이용 가능 여부"
|
||||
canSearchUsers: "유저 검색 이용"
|
||||
canUseTranslator: "번역 기능의 사용"
|
||||
avatarDecorationLimit: "아바타 장식의 최대 붙임 개수"
|
||||
canImportAntennas: "안테나 가져오기 허용"
|
||||
@@ -1944,6 +2014,11 @@ _role:
|
||||
canImportMuting: "뮤트 목록 가져오기 허용"
|
||||
canImportUserLists: "리스트 목록 가져오기 허용"
|
||||
chatAvailability: "채팅을 허락"
|
||||
uploadableFileTypes: "업로드 가능한 파일 유형"
|
||||
uploadableFileTypes_caption: "MIME 유형을 "
|
||||
uploadableFileTypes_caption2: "파일에 따라서는 유형을 검사하지 못하는 경우가 있습니다. 그러한 파일을 허가하는 경우에는 {x}를 지정으로 추가해주십시오."
|
||||
noteDraftLimit: "서버측 노트 초안 작성 가능 수"
|
||||
watermarkAvailable: "워터마크 기능의 사용 여부"
|
||||
_condition:
|
||||
roleAssignedTo: "수동 역할에 이미 할당됨"
|
||||
isLocal: "로컬 유저"
|
||||
@@ -2103,6 +2178,7 @@ _theme:
|
||||
install: "테마 설치"
|
||||
manage: "테마 관리"
|
||||
code: "테마 코드"
|
||||
copyThemeCode: "테마 코드 복사"
|
||||
description: "설명"
|
||||
installed: "{name} 테마가 설치되었습니다"
|
||||
installedThemes: "설치된 테마"
|
||||
@@ -2202,6 +2278,7 @@ _time:
|
||||
minute: "분"
|
||||
hour: "시간"
|
||||
day: "일"
|
||||
month: "개월"
|
||||
_2fa:
|
||||
alreadyRegistered: "이미 설정이 완료되었습니다."
|
||||
registerTOTP: "인증 앱 설정 시작"
|
||||
@@ -2416,6 +2493,8 @@ _visibility:
|
||||
disableFederation: "연합에 보내지 않기"
|
||||
disableFederationDescription: "다른 서버로 보내지 않습니다"
|
||||
_postForm:
|
||||
quitInspiteOfThereAreUnuploadedFilesConfirm: "업로드되지 않은 파일이 있습니다만, 없애고 폼을 닫겠습니까?"
|
||||
uploaderTip: "파일이 아직 업로드돼있지 않습니다. 파일 메뉴에서 이름 바꾸기나 이미지의 자르기, 워터마크 넣기, 압축의 유무 등을 설정할 수 있습니다. 파일은 노트 게시 시 자동으로 업로드됩니다."
|
||||
replyPlaceholder: "이 노트에 답글..."
|
||||
quotePlaceholder: "이 노트를 인용..."
|
||||
channelPlaceholder: "채널에 게시하기..."
|
||||
@@ -2749,6 +2828,7 @@ _fileViewer:
|
||||
url: "URL"
|
||||
uploadedAt: "업로드 날짜"
|
||||
attachedNotes: "첨부된 노트"
|
||||
usage: "이용"
|
||||
thisPageCanBeSeenFromTheAuthor: "이 페이지는 파일 소유자만 열람할 수 있습니다"
|
||||
_externalResourceInstaller:
|
||||
title: "외부 사이트로부터 설치"
|
||||
@@ -2796,6 +2876,12 @@ _dataSaver:
|
||||
_avatar:
|
||||
title: "아이콘 이미지"
|
||||
description: "아이콘 이미지의 애니메이션을 멈춥니다. 애니메이션 이미지는 일반 이미지보다 파일 크기가 클 수 있으므로 데이터 사용량을 더 줄일 수 있습니다."
|
||||
_urlPreviewThumbnail:
|
||||
title: "URL 미리보기의 섬네일을 비표시"
|
||||
description: "URL 미리보기의 섬네일 이미지를 불러올 수 없게 됩니다."
|
||||
_disableUrlPreview:
|
||||
title: "URL 미리보기 비활성화"
|
||||
description: "URL 미리보기 기능을 비활성화합니다. 섬네일 이미지와 달리 링크 정보 불러오기 자체를 줄일 수 있습니다."
|
||||
_code:
|
||||
title: "문자열 강조"
|
||||
description: "MFM 등으로 문자열 강조 기법을 사용할 때 누르기 전에는 불러오지 않습니다. 문자열 강조에서는 강조할 언어마다 그 정의 파일을 불러와야 하지만 이를 자동으로 불러오지 않으므로 데이터 사용량을 줄일 수 있습니다."
|
||||
@@ -2853,6 +2939,8 @@ _offlineScreen:
|
||||
_urlPreviewSetting:
|
||||
title: "URL 미리보기 설정"
|
||||
enable: "URL 미리보기 활성화"
|
||||
allowRedirect: "미리보기 위치의 리디렉션 허가"
|
||||
allowRedirectDescription: "입력된 URL이 리디렉션될 경우, 그 리디렉션 위치를 따라 미리보기를 표시할 것인지 설정합니다. 비활성화하면 서버 리소스를 절약할 수 있습니다만, 리디렉션 위치의 내용은 표시되지 않습니다."
|
||||
timeout: "미리보기를 불러올 때의 타임아웃 (ms)"
|
||||
timeoutDescription: "미리보기를 로딩하는데 걸리는 시간이 정한 시간보다 오래 걸리는 경우, 미리보기를 생성하지 않습니다."
|
||||
maximumContentLength: "Content-Length의 최대치 (byte)"
|
||||
@@ -2993,6 +3081,7 @@ _bootErrors:
|
||||
otherOption1: "클라이언트 설정 및 캐시 삭제"
|
||||
otherOption2: "간편 클라이언트 실행"
|
||||
otherOption3: "복구 툴 실행"
|
||||
otherOption4: "Misskey를 세이프 모드로 열기"
|
||||
_search:
|
||||
searchScopeAll: "전체"
|
||||
searchScopeLocal: "로컬"
|
||||
@@ -3001,3 +3090,166 @@ _search:
|
||||
pleaseEnterServerHost: "서버의 호스트를 입력해 주세요."
|
||||
pleaseSelectUser: "유저를 선택해주세요"
|
||||
serverHostPlaceholder: "예: misskey.example.com"
|
||||
_serverSetupWizard:
|
||||
installCompleted: "Misskey의 설치가 완료됐습니다!"
|
||||
firstCreateAccount: "먼저 관리자 계정을 만듭시다."
|
||||
accountCreated: "관리자 계정이 만들어졌습니다!"
|
||||
serverSetting: "서버 설정"
|
||||
youCanEasilyConfigureOptimalServerSettingsWithThisWizard: "이 위자드로 쉽게 최적화된 서버의 설정을 할 수 있습니다."
|
||||
settingsYouMakeHereCanBeChangedLater: "이 설정은 나중에 변경 가능합니다."
|
||||
howWillYouUseMisskey: "Misskey를 어떻게 사용하십니까?"
|
||||
_use:
|
||||
single: "1인 서버"
|
||||
single_description: "자신 전용 서버로 혼자서 사용"
|
||||
single_youCanCreateMultipleAccounts: "1인 서버로 운영하는 경우에도 계정은 필요에 따라 여러 개 만들 수 있습니다."
|
||||
group: "그룹 서버"
|
||||
group_description: "신뢰 가능한 다른 유저를 초대해 여러 명이 사용"
|
||||
open: "오픈 서버"
|
||||
open_description: "불특정 다수의 유저를 받아들이는 운영을 함"
|
||||
openServerAdvice: "불특정 다수의 유저를 받아들이는 것에는 위험이 따릅니다. 문제에 대처할 수 있도록 확실한 조정 체제로 운영하는 것을 권장합니다."
|
||||
openServerAntiSpamAdvice: "자신의 서버가 스팸으로 사용되지 않게끔 reCAPTCHA라는 안티 봇 기능을 활성화하는 등 보안에 대해서도 세심한 주의가 필요합니다."
|
||||
howManyUsersDoYouExpect: "어느 정도의 인원으로 생각 중이십니까?"
|
||||
_scale:
|
||||
small: "100명 이하(소규모)"
|
||||
medium: "100명 이상 1000명 이하(중간 규모)"
|
||||
large: "1000명 이상(대규모)"
|
||||
largeScaleServerAdvice: "대규모 서버에서는 부하분산이나 데이터베이스의 복제 등 높은 인프라스트럭처 지식이 필요할 수 있습니다."
|
||||
doYouConnectToFediverse: "Fediverse에 접속하시겠습니까?"
|
||||
doYouConnectToFediverse_description1: "분산형 서버로 구성된 네트워크(Fediverse)에 접속하면 다른 서버와 서로 콘텐츠의 주고받기를 할 수 있습니다."
|
||||
doYouConnectToFediverse_description2: "Fediverse에 접속하는 것을 '연합'이라고도 부릅니다."
|
||||
youCanConfigureMoreFederationSettingsLater: "나중에 연합 가능한 서버의 지정 등 고급 설정을 할 수 있습니다."
|
||||
remoteContentsCleaning: "리모트 콘텐츠 자동 정리"
|
||||
remoteContentsCleaning_description: "연합 중인 서버가 있는 경우, 리모트 서버에서 대단히 많은 콘텐츠를 받아오게 됩니다. 자동 정리 기능을 활성화하면, 오래되고 서버에서 더 이상 조회되지 않는 콘텐츠를 자동으로 서버에서 삭제하여, 스토리지를 절약할 수 있습니다."
|
||||
remoteContentsCleaning_description2: "로컬 내 원격 콘텐츠로의 하이퍼링크는 깨진 링크로 됩니다."
|
||||
adminInfo: "관리자 정보"
|
||||
adminInfo_description: "문의 접수를 위해 사용되는 관리자 정보를 설정합니다."
|
||||
adminInfo_mustBeFilled: "오픈 서버 혹은 연합이 켜져 있는 경우 반드시 입력해야 합니다."
|
||||
followingSettingsAreRecommended: "아래의 설정이 권장됩니다."
|
||||
applyTheseSettings: "이 설정을 적용"
|
||||
skipSettings: "설정 건너뛰기"
|
||||
settingsCompleted: "설정이 완료됐습니다!"
|
||||
settingsCompleted_description: "수고하셨습니다. 준비를 마쳤으므로 바로 서버의 이용을 시작하실 수 있습니다."
|
||||
settingsCompleted_description2: "상세한 서버 설정은 '제어판'에서 하실 수 있습니다."
|
||||
donationRequest: "기부 요청"
|
||||
_donationRequest:
|
||||
text1: "Misskey는 자원봉사자들에 의해 개발되는 무료 소프트웨어입니다."
|
||||
text2: "앞으로도 계속해서 개발을 할 수 있도록 괜찮으시다면 부디 기부를 부탁드립니다."
|
||||
text3: "지원자 대상 특전도 있습니다!"
|
||||
_uploader:
|
||||
editImage: "이미지 편집"
|
||||
compressedToX: "{x}로 압축"
|
||||
savedXPercent: "{x}% 절약"
|
||||
abortConfirm: "업로드되지 않은 파일이 있습니다만, 그만 두시겠습니까?"
|
||||
doneConfirm: "업로드되지 않은 파일이 있습니다만, 완료하시겠습니까?"
|
||||
maxFileSizeIsX: "업로드 가능한 최대 파일 크기는 {x}입니다."
|
||||
allowedTypes: "업로드 가능한 파일 유형"
|
||||
tip: "파일은 아직 업로드되지 않았습니다. 이 다이얼로그에서 업로드 전의 확인, 이름 바꾸기, 압축, 자르기 등을 하실 수 있습니다. 준비가 되셨다면 '업로드' 버튼을 클릭해 업로드를 시작하실 수 있습니다."
|
||||
_clientPerformanceIssueTip:
|
||||
title: "배터리 소비가 심하다고 생각되시면"
|
||||
makeSureDisabledAdBlocker: "광고 차단을 비활성화해 주십시오."
|
||||
makeSureDisabledAdBlocker_description: "광고 차단은 성능에 영향을 미칠 수 있습니다. OS의 기능이나 브라우저의 기능, 애드온 등으로 광고 차단이 활성화돼있지 않은지 확인해 주십시오."
|
||||
makeSureDisabledCustomCss: "커스텀 CSS를 무효로 해주십시오."
|
||||
makeSureDisabledCustomCss_description: "스타일을 덮어쓰기하면 성능에 영향을 미칠 수 있습니다. 커스텀 CSS나 스타일을 덮어쓰기하는 확장 기능이 유효로 돼있는지 확인해주십시오."
|
||||
makeSureDisabledAddons: "확장 기능을 비활성화해 주십시오."
|
||||
makeSureDisabledAddons_description: "일부 확장 기능은 클라이언트의 동작에 간섭해 성능에 영향을 미칠 수 있습니다. 브라우저의 확장 기능을 비활성화해 개선할지 확인해주십시오."
|
||||
_clip:
|
||||
tip: "클립은 노트를 정리할 수 있는 기능입니다."
|
||||
_userLists:
|
||||
tip: "임의의 유저가 포함된 리스트를 작성할 수 있습니다. 작성한 리스트는 타임라인으로 표시가 가능합니다."
|
||||
watermark: "워터마크"
|
||||
defaultPreset: "기본 프리셋"
|
||||
_watermarkEditor:
|
||||
tip: "이미지에 크레딧 정보 등의 워터마크를 추가할 수 있습니다."
|
||||
quitWithoutSaveConfirm: "보존하지 않고 종료하시겠습니까?"
|
||||
driveFileTypeWarn: "이 파이"
|
||||
driveFileTypeWarnDescription: "이미지 파일을 선택해주십시오."
|
||||
title: "워터마크 편집"
|
||||
cover: "전체에 붙이기"
|
||||
repeat: "전면에 깔기"
|
||||
opacity: "불투명도"
|
||||
scale: "크기"
|
||||
text: "텍스트"
|
||||
position: "위치"
|
||||
type: "종류"
|
||||
image: "이미지"
|
||||
advanced: "고급"
|
||||
angle: "각도"
|
||||
stripe: "줄무늬"
|
||||
stripeWidth: "라인의 폭"
|
||||
stripeFrequency: "라인의 수"
|
||||
polkadot: "물방울 무늬"
|
||||
checker: "체크 무늬"
|
||||
polkadotMainDotOpacity: "주요 물방울의 불투명도"
|
||||
polkadotMainDotRadius: "주요 물방울의 크기"
|
||||
polkadotSubDotOpacity: "서브 물방울의 불투명도"
|
||||
polkadotSubDotRadius: "서브 물방울의 크기"
|
||||
polkadotSubDotDivisions: "서브 물방울의 수"
|
||||
_imageEffector:
|
||||
title: "이펙트"
|
||||
addEffect: "이펙트를 추가"
|
||||
discardChangesConfirm: "변경을 취소하고 종료하시겠습니까?"
|
||||
nothingToConfigure: "설정 항목이 없습니다."
|
||||
_fxs:
|
||||
chromaticAberration: "색수차"
|
||||
glitch: "글리치"
|
||||
mirror: "미러"
|
||||
invert: "색 반전"
|
||||
grayscale: "흑백"
|
||||
colorAdjust: "색조 보정"
|
||||
colorClamp: "색 압축"
|
||||
colorClampAdvanced: "색 압축(고급)"
|
||||
distort: "뒤틀림"
|
||||
threshold: "이진화"
|
||||
zoomLines: "집중선"
|
||||
stripe: "줄무늬"
|
||||
polkadot: "물방울 무늬"
|
||||
checker: "체크 무늬"
|
||||
blockNoise: "노이즈 방지"
|
||||
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:
|
||||
select: "초안 선택"
|
||||
cannotCreateDraftAnymore: "초안 작성 가능 수를 초과했습니다."
|
||||
cannotCreateDraft: "이 내용으로는 초안을 작성할 수 없습니다. "
|
||||
delete: "초안 삭제\n"
|
||||
deleteAreYouSure: "초안을 삭제하시겠습니까?"
|
||||
noDrafts: "초안 없음\n"
|
||||
replyTo: "{user}에 회신"
|
||||
quoteOf: "{user} 노트에 인용"
|
||||
postTo: "{channel}에 게시"
|
||||
saveToDraft: "초안에 저장"
|
||||
restoreFromDraft: "초안에서 복원\n"
|
||||
restore: "복원"
|
||||
listDrafts: "초안 목록"
|
||||
|
||||
@@ -433,6 +433,7 @@ _cw:
|
||||
_visibility:
|
||||
home: "ໜ້າຫຼັກ"
|
||||
followers: "ຜູ້ຕິດຕາມ"
|
||||
specified: "ໂພສ Direct note"
|
||||
_profile:
|
||||
name: "ຊື່"
|
||||
username: "ຊື່ຜູ້ໃຊ້"
|
||||
@@ -470,6 +471,7 @@ _deck:
|
||||
list: "ລາຍການ"
|
||||
channel: "ຊ່ອງ"
|
||||
mentions: "ກ່າວເຖິງເຈົ້າ"
|
||||
direct: "ໂພສ Direct note"
|
||||
_webhookSettings:
|
||||
name: "ຊື່"
|
||||
_abuseReport:
|
||||
@@ -483,3 +485,5 @@ _remoteLookupErrors:
|
||||
title: "ບໍ່ພົບ"
|
||||
_search:
|
||||
searchScopeAll: "ທັງໝົດ"
|
||||
_watermarkEditor:
|
||||
image: "ຮູບພາບ"
|
||||
|
||||
@@ -1019,6 +1019,7 @@ _cw:
|
||||
_visibility:
|
||||
home: "Startpagina"
|
||||
followers: "Volgers"
|
||||
specified: "Directe notities"
|
||||
_profile:
|
||||
name: "Naam"
|
||||
username: "Gebruikersnaam"
|
||||
@@ -1061,6 +1062,7 @@ _deck:
|
||||
list: "Lijsten"
|
||||
channel: "Kanalen"
|
||||
mentions: "Vermeldingen"
|
||||
direct: "Directe notities"
|
||||
_webhookSettings:
|
||||
name: "Naam"
|
||||
active: "Ingeschakeld"
|
||||
@@ -1078,3 +1080,6 @@ _remoteLookupErrors:
|
||||
title: "Niet gevonden"
|
||||
_search:
|
||||
searchScopeAll: "Alle"
|
||||
_watermarkEditor:
|
||||
image: "Afbeeldingen"
|
||||
advanced: "Geavanceerd"
|
||||
|
||||
@@ -461,6 +461,8 @@ replies: "Svar"
|
||||
renotes: "Renote"
|
||||
surrender: "Avbryt"
|
||||
information: "Informasjon"
|
||||
inMinutes: "Minutter"
|
||||
inDays: "Dager"
|
||||
_chat:
|
||||
invitations: "Inviter"
|
||||
members: "Medlemmer"
|
||||
@@ -735,3 +737,13 @@ _remoteLookupErrors:
|
||||
title: "Ikke funnet"
|
||||
_search:
|
||||
searchScopeAll: "Alle"
|
||||
_watermarkEditor:
|
||||
scale: "Størrelse"
|
||||
text: "Tekst"
|
||||
type: "Type"
|
||||
image: "Bilder"
|
||||
_imageEffector:
|
||||
_fxProps:
|
||||
scale: "Størrelse"
|
||||
size: "Størrelse"
|
||||
color: "Farge"
|
||||
|
||||
@@ -1040,6 +1040,8 @@ surrender: "Odrzuć"
|
||||
gameRetry: "Spróbuj ponownie"
|
||||
postForm: "Formularz tworzenia wpisu"
|
||||
information: "Informacje"
|
||||
inMinutes: "minuta"
|
||||
inDays: "dzień"
|
||||
_chat:
|
||||
invitations: "Zaproś"
|
||||
noHistory: "Brak historii"
|
||||
@@ -1584,3 +1586,17 @@ _remoteLookupErrors:
|
||||
_search:
|
||||
searchScopeAll: "Wszystkie"
|
||||
searchScopeLocal: "Lokalne"
|
||||
_watermarkEditor:
|
||||
opacity: "Przezroczystość"
|
||||
scale: "Rozmiar"
|
||||
text: "Tekst"
|
||||
type: "Typ"
|
||||
image: "Zdjęcia"
|
||||
advanced: "Zaawansowane"
|
||||
_imageEffector:
|
||||
_fxProps:
|
||||
scale: "Rozmiar"
|
||||
size: "Rozmiar"
|
||||
color: "Kolor"
|
||||
opacity: "Przezroczystość"
|
||||
lightness: "Rozjaśnij"
|
||||
|
||||
+122
-3
@@ -298,6 +298,7 @@ uploadFromUrl: "Enviar por URL"
|
||||
uploadFromUrlDescription: "URL do arquivo que você deseja enviar"
|
||||
uploadFromUrlRequested: "Upload solicitado"
|
||||
uploadFromUrlMayTakeTime: "Pode levar algum tempo para que o upload seja concluído."
|
||||
uploadNFiles: "Enviar {n} arquivos"
|
||||
explore: "Explorar"
|
||||
messageRead: "Lida"
|
||||
noMoreHistory: "Não existe histórico anterior"
|
||||
@@ -326,6 +327,7 @@ dark: "Escuro"
|
||||
lightThemes: "Tema claro"
|
||||
darkThemes: "Tema escuro"
|
||||
syncDeviceDarkMode: "Sincronize com o modo escuro do dispositivo"
|
||||
switchDarkModeManuallyWhenSyncEnabledConfirm: "\"{x}\" está ativado. Você gostaria de desligar a sincronização e alterar manualmente?"
|
||||
drive: "Drive"
|
||||
fileName: "Nome do Ficheiro"
|
||||
selectFile: "Selecione os arquivos"
|
||||
@@ -444,7 +446,7 @@ exploreUsersCount: "Há um utilizador de {count}"
|
||||
exploreFediverse: "Explorar Fediverse"
|
||||
popularTags: "Tags populares"
|
||||
userList: "Listas"
|
||||
about: "Informações"
|
||||
about: "Sobre"
|
||||
aboutMisskey: "Sobre Misskey"
|
||||
administrator: "Administrador"
|
||||
token: "Símbolo"
|
||||
@@ -578,6 +580,7 @@ newNoteRecived: "Nova nota recebida"
|
||||
newNote: "Nova Nota"
|
||||
sounds: "Sons"
|
||||
sound: "Sons"
|
||||
notificationSoundSettings: "Configurações de som de notificações"
|
||||
listen: "Ouvir"
|
||||
none: "Nenhum"
|
||||
showInPage: "Ver na página"
|
||||
@@ -999,6 +1002,7 @@ failedToUpload: "Falha ao enviar"
|
||||
cannotUploadBecauseInappropriate: "Esse arquivo não pôde ser enviado porque partes dele foram detectadas como potencialmente inapropriadas."
|
||||
cannotUploadBecauseNoFreeSpace: "Envio falhou devido à falta de capacidade no Drive."
|
||||
cannotUploadBecauseExceedsFileSizeLimit: "Não é possível realizar o upload deste arquivo porque ele excede o tamanho máximo permitido."
|
||||
cannotUploadBecauseUnallowedFileType: "Não foi possível fazer o envio, pois o formato do arquivo não foi autorizado."
|
||||
beta: "Beta"
|
||||
enableAutoSensitive: "Marcar automaticamente como conteúdo sensível"
|
||||
enableAutoSensitiveDescription: "Quando disponível, a marcação de mídia sensível será automaticamente atribuído ao conteúdo de mídia usando aprendizado de máquina. Mesmo que você desative essa função, em alguns servidores, isso pode ser configurado automaticamente."
|
||||
@@ -1239,7 +1243,6 @@ releaseToRefresh: "Solte para atualizar"
|
||||
refreshing: "Atualizando..."
|
||||
pullDownToRefresh: "Puxe para baixo para atualizar"
|
||||
useGroupedNotifications: "Agrupar notificações"
|
||||
signupPendingError: "Houve um problema ao verificar o endereço de email. O link pode ter expirado."
|
||||
cwNotationRequired: "Se \"Esconder conteúdo\" está habilitado, uma descrição deve ser adicionada."
|
||||
doReaction: "Adicionar reação"
|
||||
code: "Código"
|
||||
@@ -1309,6 +1312,7 @@ availableRoles: "Cargos disponíveis"
|
||||
acknowledgeNotesAndEnable: "Ative após compreender as precauções."
|
||||
federationSpecified: "Esse servidor opera com uma lista branca de federação. Interagir com servidores diferentes daqueles designados pela administração não é permitido."
|
||||
federationDisabled: "Federação está desabilitada nesse servidor. Você não pode interagir com usuários de outros servidores."
|
||||
draft: "Rascunhos"
|
||||
confirmOnReact: "Confirmar ao reagir"
|
||||
reactAreYouSure: "Você deseja adicionar uma reação \"{emoji}\"?"
|
||||
markAsSensitiveConfirm: "Você deseja definir essa mídia como sensível?"
|
||||
@@ -1326,6 +1330,7 @@ restore: "Redefinir"
|
||||
syncBetweenDevices: "Sincronizar entre dispositivos"
|
||||
preferenceSyncConflictTitle: "O valor configurado já existe no servidor."
|
||||
preferenceSyncConflictText: "As preferências com a sincronização ativada irão salvar os seus valores no servidor. Porém, já existem valores no servidor. Qual conjunto de valores você deseja sobrescrever?"
|
||||
preferenceSyncConflictChoiceMerge: "Combinar"
|
||||
preferenceSyncConflictChoiceServer: "Valor configurado no servidor"
|
||||
preferenceSyncConflictChoiceDevice: "Valor configurado no dispositivo"
|
||||
preferenceSyncConflictChoiceCancel: "Cancelar a habilitação de sincronização"
|
||||
@@ -1333,7 +1338,7 @@ paste: "Colar"
|
||||
emojiPalette: "Paleta de emojis"
|
||||
postForm: "Campo de postagem"
|
||||
textCount: "Contagem de caracteres"
|
||||
information: "Informações"
|
||||
information: "Sobre"
|
||||
chat: "Conversas"
|
||||
migrateOldSettings: "Migrar configurações antigas de cliente"
|
||||
migrateOldSettings_description: "Isso deve ser feito automaticamente. Caso o processo de migração tenha falhado, você pode acioná-lo manualmente. As informações atuais de migração serão substituídas."
|
||||
@@ -1356,6 +1361,17 @@ emojiMute: "Silenciar emoji"
|
||||
emojiUnmute: "Reativar emoji"
|
||||
muteX: "Silenciar {x}"
|
||||
unmuteX: "Reativar {x}"
|
||||
abort: "Abortar"
|
||||
tip: "Dicas e Truques"
|
||||
redisplayAllTips: "Mostrar todas as \"Dicas e Truques\" novamente"
|
||||
hideAllTips: "Ocultas todas as \"Dicas e Truques\""
|
||||
defaultImageCompressionLevel: "Nível de compressão de imagem padrão"
|
||||
defaultImageCompressionLevel_description: "Alto, reduz o tamanho do arquivo mas, também, a qualidade da imagem.<br>Alto, reduz o tamanho do arquivo mas, também, a qualidade da imagem."
|
||||
inMinutes: "Minuto(s)"
|
||||
inDays: "Dia(s)"
|
||||
_order:
|
||||
newest: "Priorizar Mais Novos"
|
||||
oldest: "Priorizar Mais Antigos"
|
||||
_chat:
|
||||
noMessagesYet: "Ainda não há mensagens"
|
||||
newMessage: "Nova mensagem"
|
||||
@@ -1442,6 +1458,8 @@ _settings:
|
||||
contentsUpdateFrequency: "Frequência da obtenção de conteúdo"
|
||||
contentsUpdateFrequency_description: "Quanto maior o valor, mais o conteúdo atualiza. Porém, há uma diminuição do desempenho e aumento do tráfego e consumo de memória."
|
||||
contentsUpdateFrequency_description2: "Quando o modo tempo-real está ativado, o conteúdo é atualizado em tempo real, ignorando essa opção."
|
||||
showUrlPreview: "Exibir prévia de URL"
|
||||
showAvailableReactionsFirstInNote: "Exibir reações disponíveis no topo."
|
||||
_chat:
|
||||
showSenderName: "Exibir nome de usuário do remetente"
|
||||
sendOnEnter: "Pressionar Enter para enviar"
|
||||
@@ -1977,6 +1995,11 @@ _role:
|
||||
canImportMuting: "Permitir importação de silenciamentos"
|
||||
canImportUserLists: "Permitir importação de listas"
|
||||
chatAvailability: "Permitir Conversas"
|
||||
uploadableFileTypes: "Tipos de arquivo enviáveis"
|
||||
uploadableFileTypes_caption: "Especifica tipos MIME permitidos. Múltiplos tipos MIME podem ser especificados separando-os por linha. Curingas podem ser especificados com um asterisco (*). (exemplo, image/*)"
|
||||
uploadableFileTypes_caption2: "Alguns tipos de arquivos podem não ser detectados. Para permiti-los, adicione {x} à especificação."
|
||||
noteDraftLimit: "Limite de rascunhos possíveis"
|
||||
watermarkAvailable: "Disponibilidade da função de marca d'água"
|
||||
_condition:
|
||||
roleAssignedTo: "Atribuído a cargos manuais"
|
||||
isLocal: "Usuário local"
|
||||
@@ -2136,6 +2159,7 @@ _theme:
|
||||
install: "Instalar um tema"
|
||||
manage: "Gerenciar temas"
|
||||
code: "Código do tema"
|
||||
copyThemeCode: "Copiar código do tema"
|
||||
description: "Descrição"
|
||||
installed: "{name} foi instalado"
|
||||
installedThemes: "Temas instalados"
|
||||
@@ -2449,6 +2473,8 @@ _visibility:
|
||||
disableFederation: "Defederar"
|
||||
disableFederationDescription: "Não transmitir às outras instâncias"
|
||||
_postForm:
|
||||
quitInspiteOfThereAreUnuploadedFilesConfirm: "Há arquivos que não foram enviados, gostaria de descartá-los e fechar o editor?"
|
||||
uploaderTip: "O arquivo ainda não foi enviado. No menu do arquivo, você pode renomear, cortar, adicionar uma marca d'água, comprimir ou descomprimir um arquivo. Arquivos serão enviados automaticamente ao publicar a nota."
|
||||
replyPlaceholder: "Responder a essa nota..."
|
||||
quotePlaceholder: "Citar essa nota..."
|
||||
channelPlaceholder: "Postar em canal..."
|
||||
@@ -2782,6 +2808,7 @@ _fileViewer:
|
||||
url: "URL"
|
||||
uploadedAt: "Adicionado em"
|
||||
attachedNotes: "Notas anexadas"
|
||||
usage: "Usado"
|
||||
thisPageCanBeSeenFromTheAuthor: "Essa página só pode ser vista pelo usuário que enviou esse arquivo."
|
||||
_externalResourceInstaller:
|
||||
title: "Instalar de site externo"
|
||||
@@ -2829,6 +2856,12 @@ _dataSaver:
|
||||
_avatar:
|
||||
title: "Imagem do avatar"
|
||||
description: "Parar animação de avatares. Imagens animadas podem ter um arquivo mais pesado do que imagens normais, potencialmente levando a reduções no tráfego de dados."
|
||||
_urlPreviewThumbnail:
|
||||
title: "Esconder miniaturas em prévias de URL"
|
||||
description: "Miniaturas em prévias de URL não serão carregadas."
|
||||
_disableUrlPreview:
|
||||
title: "Desabilitar prévias de URL"
|
||||
description: "Desabilita a função de prévias de URL. Diferente das miniaturas, essa função impede o carregamento de toda informação do link."
|
||||
_code:
|
||||
title: "Destaque de código"
|
||||
description: "Se as notações de formatação de código forem utilizadas em MFM, elas não irão carregar até serem selecionadas. Destaque de código exige baixar arquivos de alta definição para cada linguagem de programação. Logo, desabilitar o carregamento automático desses arquivos diminui a quantidade de informação comunicada."
|
||||
@@ -2886,6 +2919,8 @@ _offlineScreen:
|
||||
_urlPreviewSetting:
|
||||
title: "Configurações da prévia de URL"
|
||||
enable: "Habilitar prévia de URL"
|
||||
allowRedirect: "Permitir redirecionamentos de URL em prévias."
|
||||
allowRedirectDescription: "Se um URL tem um redirecionamento, você pode habilitar essa função para segui-lo e exibir a prévia do conteúdo redirecionado. Desabilitar isso irá economizar recursos, mas o conteúdo não será exibido."
|
||||
timeout: "Tempo máximo para obter a prévia (ms)"
|
||||
timeoutDescription: "Se demorar mais que esse valor para obter uma prévia, ela não será gerada."
|
||||
maximumContentLength: "Content-Length máximo (em bytes)"
|
||||
@@ -3076,6 +3111,15 @@ _serverSetupWizard:
|
||||
text1: "Misskey é software aberto desenvolvido por voluntários."
|
||||
text2: "Nós apreciaríamos o seu apoio para podermos continuar o desenvolvimento desse software no futuro."
|
||||
text3: "Também há benefícios especiais para apoiadores!"
|
||||
_uploader:
|
||||
editImage: "Editar Imagem"
|
||||
compressedToX: "Comprimido para {x}"
|
||||
savedXPercent: "Salvando {x}%"
|
||||
abortConfirm: "Alguns arquivos não foram enviados, deseja abortar?"
|
||||
doneConfirm: "Alguns arquivos não foram enviados, deseja continuar mesmo assim?"
|
||||
maxFileSizeIsX: "O tamanho máximo de arquivos enviados é {x}"
|
||||
allowedTypes: "Tipos de arquivo enviáveis"
|
||||
tip: "O arquivo não foi enviado. Então, esse diálogo permite que você confirme, renomeie, comprima e recorte o arquivo antes de enviar. Quando estiver pronto, você pode enviar apertando o botão \"Enviar\"."
|
||||
_clientPerformanceIssueTip:
|
||||
title: "Dicas de desempenho"
|
||||
makeSureDisabledAdBlocker: "Desative o seu bloqueador de anúncios"
|
||||
@@ -3084,3 +3128,78 @@ _clientPerformanceIssueTip:
|
||||
makeSureDisabledCustomCss_description: "Substituir o estilo da página pode afetar o desempenho. Certifique-se que o CSS personalizado ou extensões que modifiquem o estilo da página estejam desabilitados."
|
||||
makeSureDisabledAddons: "Desabilite extensões"
|
||||
makeSureDisabledAddons_description: "Algumas extensões podem afetar comportamentos do cliente e afetar o desempenho. Por favor, desative as extensões do seu navegador e veja se isso melhora a situação."
|
||||
_clip:
|
||||
tip: "Clip é uma função que permite organização das suas notas."
|
||||
_userLists:
|
||||
tip: "Listas podem conter qualquer usuário que você especificar em sua criação. A lista criada aparece como uma linha do tempo exibindo usuários selecionados."
|
||||
watermark: "Marca d'água"
|
||||
defaultPreset: "Predefinição Padrão"
|
||||
_watermarkEditor:
|
||||
tip: "Uma marca d'água, como informação de autoria, pode ser adicionada à imagem."
|
||||
quitWithoutSaveConfirm: "Descartar mudanças?"
|
||||
driveFileTypeWarn: "Esse arquivo não é compatível"
|
||||
driveFileTypeWarnDescription: "Escolha um arquivo de imagem"
|
||||
title: "Editar marca d'água"
|
||||
cover: "Cobrir tudo"
|
||||
repeat: "Espalhar pelo conteúdo"
|
||||
opacity: "Opacidade"
|
||||
scale: "Tamanho"
|
||||
text: "Texto"
|
||||
position: "Posição"
|
||||
type: "Tipo"
|
||||
image: "imagem"
|
||||
advanced: "Avançado"
|
||||
angle: "Ângulo"
|
||||
stripe: "Listras"
|
||||
stripeWidth: "Largura da linha"
|
||||
stripeFrequency: "Número de linhas"
|
||||
polkadot: "Bolinhas"
|
||||
checker: "Xadrez"
|
||||
polkadotMainDotOpacity: "Opacidade da bolinha principal"
|
||||
polkadotMainDotRadius: "Raio da bolinha principal"
|
||||
polkadotSubDotOpacity: "Opacidade da bolinha secundária"
|
||||
polkadotSubDotRadius: "Raio das bolinhas adicionais"
|
||||
polkadotSubDotDivisions: "Número de bolinhas adicionais"
|
||||
_imageEffector:
|
||||
title: "Efeitos"
|
||||
addEffect: "Adicionar efeitos"
|
||||
discardChangesConfirm: "Tem certeza que deseja sair? Há mudanças não salvas."
|
||||
_fxs:
|
||||
chromaticAberration: "Aberração cromática"
|
||||
glitch: "Glitch"
|
||||
mirror: "Espelho"
|
||||
invert: "Inverter Cores"
|
||||
grayscale: "Tons de Cinza"
|
||||
colorAdjust: "Correção de Cores"
|
||||
colorClamp: "Compressão de Cores"
|
||||
colorClampAdvanced: "Compressão Avançada de Cores"
|
||||
distort: "Distorção"
|
||||
threshold: "Limiarização Binária"
|
||||
zoomLines: "Linhas de Ação"
|
||||
stripe: "Listras"
|
||||
polkadot: "Bolinhas"
|
||||
checker: "Xadrez"
|
||||
blockNoise: "Bloquear Ruído"
|
||||
tearing: "Descontinuidade"
|
||||
_fxProps:
|
||||
angle: "Ângulo"
|
||||
scale: "Tamanho"
|
||||
size: "Tamanho"
|
||||
color: "Cor"
|
||||
opacity: "Opacidade"
|
||||
lightness: "Esclarecer"
|
||||
drafts: "Rascunhos"
|
||||
_drafts:
|
||||
select: "Selecionar Rascunho"
|
||||
cannotCreateDraftAnymore: "O número máximo de rascunhos foi excedido."
|
||||
cannotCreateDraft: "Você não pode criar um rascunho com esse conteúdo."
|
||||
delete: "Excluir Rascunho"
|
||||
deleteAreYouSure: "Excluir rascunho?"
|
||||
noDrafts: "Sem rascunhos"
|
||||
replyTo: "Resposta a {user}"
|
||||
quoteOf: "Citação à nota de {user}"
|
||||
postTo: "Publicando em {channel}"
|
||||
saveToDraft: "Salvar como Rascunho"
|
||||
restoreFromDraft: "Restaurar de Rascunho"
|
||||
restore: "Redefinir"
|
||||
listDrafts: "Lista de Rascunhos"
|
||||
|
||||
@@ -1302,6 +1302,7 @@ _cw:
|
||||
_visibility:
|
||||
home: "Acasă"
|
||||
followers: "Urmăritori"
|
||||
specified: "Note directe"
|
||||
_postForm:
|
||||
replyPlaceholder: "Răspunde la această notă..."
|
||||
quotePlaceholder: "Citează aceasta nota..."
|
||||
@@ -1356,6 +1357,7 @@ _deck:
|
||||
list: "Liste"
|
||||
channel: "Canale"
|
||||
mentions: "Mențiuni"
|
||||
direct: "Note directe"
|
||||
roleTimeline: "Cronologia rolului"
|
||||
_webhookSettings:
|
||||
name: "Nume"
|
||||
@@ -1391,3 +1393,14 @@ _search:
|
||||
searchScopeLocal: "Local"
|
||||
searchScopeUser: "Utilizator specific"
|
||||
serverHostPlaceholder: "Exemplu: misskey.example.com"
|
||||
_watermarkEditor:
|
||||
scale: "Dimensiune"
|
||||
text: "Text"
|
||||
position: "Poziție"
|
||||
type: "Tip"
|
||||
image: "Imagini"
|
||||
advanced: "Avansat"
|
||||
_imageEffector:
|
||||
_fxProps:
|
||||
scale: "Dimensiune"
|
||||
size: "Dimensiune"
|
||||
|
||||
+76
-2
@@ -2,7 +2,7 @@
|
||||
_lang_: "Русский"
|
||||
headlineMisskey: "Сеть, сплетённая из заметок"
|
||||
introMisskey: "Добро пожаловать! Misskey — это децентрализованный сервис микроблогов с открытым исходным кодом.\nПишите «заметки» — делитесь со всеми происходящим вокруг или рассказывайте о себе 📡\nСтавьте «реакции» — выражайте свои чувства и эмоции от заметок других 👍\nОткройте для себя новый мир 🚀"
|
||||
poweredByMisskeyDescription: "{name} – сервис на платформе с открытым исходным кодом <b>Misskey</b>, называемый экземпляром Misskey."
|
||||
poweredByMisskeyDescription: "{name} – один из инстансов (также называемый экземпляром Misskey), использующий платформу с открытым исходным кодом <b>Misskey</b>."
|
||||
monthAndDay: "{day}.{month}"
|
||||
search: "Поиск"
|
||||
reset: "Сброс"
|
||||
@@ -82,7 +82,7 @@ export: "Экспорт"
|
||||
files: "Файлы"
|
||||
download: "Скачать"
|
||||
driveFileDeleteConfirm: "Удалить файл «{name}»? Заметки с ним также будут удалены."
|
||||
unfollowConfirm: "Удалить из подписок пользователя {name}?"
|
||||
unfollowConfirm: "Отписаться от {name} ?"
|
||||
exportRequested: "Вы запросили экспорт. Это может занять некоторое время. Результат будет добавлен на «Диск»."
|
||||
importRequested: "Вы запросили импорт. Это может занять некоторое время."
|
||||
lists: "Списки"
|
||||
@@ -298,6 +298,7 @@ uploadFromUrl: "Загрузить по ссылке"
|
||||
uploadFromUrlDescription: "Ссылка на файл, который хотите загрузить"
|
||||
uploadFromUrlRequested: "Загрузка выбранного"
|
||||
uploadFromUrlMayTakeTime: "Загрузка может занять некоторое время."
|
||||
uploadNFiles: "Загрузить {n} файл"
|
||||
explore: "Обзор"
|
||||
messageRead: "Прочитали"
|
||||
noMoreHistory: "История закончилась"
|
||||
@@ -575,8 +576,10 @@ showFixedPostForm: "Показывать поле для ввода новой
|
||||
showFixedPostFormInChannel: "Показывать поле для ввода новой заметки наверху ленты (каналы)"
|
||||
withRepliesByDefaultForNewlyFollowed: "По умолчанию включайте ответы новых пользователей, на которых вы подписались, во временную шкалу"
|
||||
newNoteRecived: "Появилась новая заметка"
|
||||
newNote: "Новая заметка"
|
||||
sounds: "Звуки"
|
||||
sound: "Звуки"
|
||||
notificationSoundSettings: "Настройки звука уведомлений"
|
||||
listen: "Слушать"
|
||||
none: "Ничего"
|
||||
showInPage: "Показать страницу"
|
||||
@@ -791,6 +794,7 @@ wide: "Толстый"
|
||||
narrow: "Тонкий"
|
||||
reloadToApplySetting: "Это настройка вступает в силу при загрузке страницы. Перезагрузить сейчас?"
|
||||
needReloadToApply: "Изменения вступят в силу после перезагрузки страницы."
|
||||
needToRestartServerToApply: "Для вступления изменений в силу необходимо перезапустить сервер."
|
||||
showTitlebar: "Показать заголовок"
|
||||
clearCache: "Очистить кэш"
|
||||
onlineUsersCount: "Пользователей сейчас в сети: {n}"
|
||||
@@ -1176,13 +1180,25 @@ unused: "Неиспользованное"
|
||||
used: "Использован"
|
||||
expired: "Срок действия приглашения истёк"
|
||||
doYouAgree: "Согласны?"
|
||||
beSureToReadThisAsItIsImportant: "Это важно, поэтому, пожалуйста, прочтите это."
|
||||
iHaveReadXCarefullyAndAgree: "Я прочитал(а) и согласен(сна) с условиями \"{x}"
|
||||
dialog: "Диалог"
|
||||
icon: "Аватар"
|
||||
currentAnnouncements: "Текущие новости"
|
||||
pastAnnouncements: "Предыдущие новости"
|
||||
youHaveUnreadAnnouncements: "У вас есть непрочитанные уведомления"
|
||||
replies: "Ответы"
|
||||
renotes: "Репост"
|
||||
loadReplies: "Показать ответы"
|
||||
loadConversation: "Загрузить беседу"
|
||||
pinnedList: "Закреплённый список"
|
||||
keepScreenOn: "Держать экран включённым"
|
||||
unnotifyNotes: "Отписаться от сообщений"
|
||||
authentication: "Аутентификация"
|
||||
authenticationRequiredToContinue: "Пожалуйста, пройдите аутентификацию, чтобы продолжить"
|
||||
dateAndTime: "Дата и время"
|
||||
showRenotes: "Показывать репосты"
|
||||
edited: "Изменено"
|
||||
mutualFollow: "Взаимные подписки"
|
||||
followingOrFollower: "Подписки или подписчики"
|
||||
fileAttachedOnly: "Только заметки с файлами"
|
||||
@@ -1193,30 +1209,70 @@ sourceCode: "Исходный код"
|
||||
sourceCodeIsNotYetProvided: "Исходный код пока не доступен. Свяжитесь с администратором, чтобы исправить эту проблему."
|
||||
repositoryUrl: "Ссылка на репозиторий"
|
||||
repositoryUrlDescription: "Если вы используете Misskey как есть (без изменений в исходном коде), введите https://github.com/misskey-dev/misskey"
|
||||
feedback: "Обратная связь"
|
||||
privacyPolicy: "Политика Конфиденциальности"
|
||||
privacyPolicyUrl: "Ссылка на Политику Конфиденциальности"
|
||||
tosAndPrivacyPolicy: "Условия использования и политика конфиденциальности"
|
||||
avatarDecorations: "Украшения для аватара"
|
||||
attach: "Прикрепить"
|
||||
angle: "Угол"
|
||||
flip: "Переворот"
|
||||
showAvatarDecorations: "Показать украшения для аватара"
|
||||
pullDownToRefresh: "Опустите что бы обновить"
|
||||
useGroupedNotifications: "Отображать уведомления сгруппировано"
|
||||
cwNotationRequired: "Если включена опция «Скрыть содержимое», необходимо написать аннотацию."
|
||||
doReaction: "Добавить реакцию"
|
||||
code: "Код"
|
||||
reloadRequiredToApplySettings: "Для применения настроек необходима обновить страницу."
|
||||
remainingN: "Остаётся: {n}"
|
||||
overwriteContentConfirm: "Текущее содержимое будет перезаписано. Вы уверены?"
|
||||
seasonalScreenEffect: "Эффект времени года на экране"
|
||||
decorate: "Украсить"
|
||||
addMfmFunction: "Добавить MFM"
|
||||
bubbleGame: "BubbleGame"
|
||||
sfx: "Звуковые эффекты"
|
||||
soundWillBePlayed: "Будет воспроизведен звук"
|
||||
showReplay: "Показать повтор"
|
||||
endReplay: "Конец повтора"
|
||||
lastNDays: "Последние {n} сут"
|
||||
hemisphere: "Место проживания"
|
||||
userSaysSomethingSensitive: "Сообщение, содержит конфиденциальные файлы от {name}"
|
||||
enableHorizontalSwipe: "Смахните в сторону, чтобы сменить вкладки"
|
||||
surrender: "Этот пост не может быть отменен."
|
||||
gameRetry: "Повторить попытку"
|
||||
notUsePleaseLeaveBlank: "Если не используется, оставьте пустым"
|
||||
useNativeUIForVideoAudioPlayer: "Использовать интерфейс браузера при проигрывании видео и звука"
|
||||
keepOriginalFilename: "Сохранять исходное имя файла"
|
||||
keepOriginalFilenameDescription: "Если вы выключите данную настройку, имена файлов будут автоматически заменены случайной строкой при загрузке."
|
||||
alwaysConfirmFollow: "Всегда подтверждать подписку"
|
||||
inquiry: "Связаться"
|
||||
fromX: "Из {x}"
|
||||
genEmbedCode: "Сгенерировать код для "
|
||||
noteOfThisUser: "Список заметок этого пользователя"
|
||||
clipNoteLimitExceeded: "К этому клипу больше нельзя добавить заметки"
|
||||
performance: "Производительность"
|
||||
modified: "Изменено"
|
||||
signinWithPasskey: "Войдите в систему, используя свой пароль"
|
||||
unknownWebAuthnKey: "Не известный ключ "
|
||||
passkeyVerificationFailed: "Ошибка проверка ключа доступа "
|
||||
messageToFollower: "Сообщение подписчикам"
|
||||
testCaptchaWarning: "Эта функция предназначена для тестирования CAPTCHA. <strong>Не использовать это в рабочей среде</strong>"
|
||||
prohibitedWordsForNameOfUser: "Запрещенные слова (имя пользователя)"
|
||||
prohibitedWordsForNameOfUserDescription: "Если имя пользователя содержит строку из этого списка, изменение имени пользователя будет запрещено. На пользователей с правами модератора это ограничение не распространяется. Имена пользователей также проверяются путём замены всех букв в нижнем регистре"
|
||||
yourNameContainsProhibitedWords: "Имя, которое вы пытаетесь изменить, содержит запрещенную строку символов"
|
||||
yourNameContainsProhibitedWordsDescription: "Имя содержит запрещённую строку символов. Если вы хотите использовать это имя, обратитесь к администратору сервера"
|
||||
thisContentsAreMarkedAsSigninRequiredByAuthor: "Автор сообщения установил требование в виде авторизации для просмотра"
|
||||
lockdown: "Доступ ограничен"
|
||||
pleaseSelectAccount: "Выберите свой аккаунт"
|
||||
availableRoles: "Доступные роли"
|
||||
federationDisabled: "Федерация отключена для этого сервера. Вы не можете взаимодействовать с пользователями на других серверах."
|
||||
draft: "Черновик"
|
||||
markAsSensitiveConfirm: "Отметить контент как чувствительный?"
|
||||
resetToDefaultValue: "Сбросить настройки до стандартных"
|
||||
postForm: "Форма отправки"
|
||||
information: "Описание"
|
||||
inMinutes: "мин"
|
||||
inDays: "сут"
|
||||
_chat:
|
||||
invitations: "Пригласить"
|
||||
noHistory: "История пока пуста"
|
||||
@@ -2191,3 +2247,21 @@ _search:
|
||||
searchScopeAll: "Все"
|
||||
searchScopeLocal: "Местная"
|
||||
searchScopeUser: "Указанный пользователь"
|
||||
_watermarkEditor:
|
||||
opacity: "Непрозрачность"
|
||||
scale: "Размер"
|
||||
text: "Текст"
|
||||
position: "Позиция"
|
||||
type: "Тип"
|
||||
image: "Изображения"
|
||||
advanced: "Для продвинутых"
|
||||
angle: "Угол"
|
||||
_imageEffector:
|
||||
_fxProps:
|
||||
angle: "Угол"
|
||||
scale: "Размер"
|
||||
size: "Размер"
|
||||
color: "Цвет"
|
||||
opacity: "Непрозрачность"
|
||||
lightness: "Осветление"
|
||||
drafts: "Черновик"
|
||||
|
||||
@@ -913,6 +913,8 @@ flip: "Preklopiť"
|
||||
lastNDays: "Posledných {n} dní"
|
||||
postForm: "Napísať poznámku"
|
||||
information: "Informácie"
|
||||
inMinutes: "min"
|
||||
inDays: "dní"
|
||||
_chat:
|
||||
invitations: "Pozvať"
|
||||
noHistory: "Žiadna história"
|
||||
@@ -1450,3 +1452,17 @@ _remoteLookupErrors:
|
||||
_search:
|
||||
searchScopeAll: "Všetko"
|
||||
searchScopeLocal: "Lokálne"
|
||||
_watermarkEditor:
|
||||
opacity: "Priehľadnosť"
|
||||
scale: "Veľkosť"
|
||||
text: "Text"
|
||||
type: "Typ"
|
||||
image: "Obrázky"
|
||||
advanced: "Rozšírené"
|
||||
_imageEffector:
|
||||
_fxProps:
|
||||
scale: "Veľkosť"
|
||||
size: "Veľkosť"
|
||||
color: "Farba"
|
||||
opacity: "Priehľadnosť"
|
||||
lightness: "Zosvetliť"
|
||||
|
||||
@@ -646,6 +646,7 @@ _poll:
|
||||
_visibility:
|
||||
home: "Hem"
|
||||
followers: "Följare"
|
||||
specified: "Direktnoter"
|
||||
_profile:
|
||||
name: "Namn"
|
||||
username: "Användarnamn"
|
||||
@@ -692,6 +693,7 @@ _deck:
|
||||
list: "Listor"
|
||||
channel: "kanal"
|
||||
mentions: "Omnämningar"
|
||||
direct: "Direktnoter"
|
||||
_webhookSettings:
|
||||
name: "Namn"
|
||||
active: "Aktiverad"
|
||||
@@ -711,3 +713,11 @@ _selfXssPrevention:
|
||||
warning: "VARNING"
|
||||
_search:
|
||||
searchScopeAll: "Allt"
|
||||
_watermarkEditor:
|
||||
scale: "Storlek"
|
||||
image: "Bilder"
|
||||
_imageEffector:
|
||||
_fxProps:
|
||||
scale: "Storlek"
|
||||
size: "Storlek"
|
||||
color: "Färg"
|
||||
|
||||
+591
-65
File diff suppressed because it is too large
Load Diff
+3052
-261
File diff suppressed because it is too large
Load Diff
@@ -8,6 +8,9 @@ search: "Пошук"
|
||||
notifications: "Сповіщення"
|
||||
username: "Ім'я користувача"
|
||||
password: "Пароль"
|
||||
initialPasswordForSetup: "Початковий пароль для налаштування"
|
||||
initialPasswordIsIncorrect: "Початковий пароль для налаштування неправильний"
|
||||
initialPasswordForSetupDescription: "Використайте пароль, вказаний у конфігураційному файлі, якщо ви встановлювали Misskey власноруч.\nЯкщо використовуєте сервіси хостингу Misskey, використайте наданий пароль.\nЯкщо ви не маєте паролю, лишіть порожнім щоб продовжити. "
|
||||
forgotPassword: "Я забув пароль"
|
||||
fetchingAsApObject: "Отримуємо з федіверсу..."
|
||||
ok: "OK"
|
||||
@@ -45,6 +48,7 @@ pin: "Закріпити"
|
||||
unpin: "Відкріпити"
|
||||
copyContent: "Скопіювати контент"
|
||||
copyLink: "Скопіювати посилання"
|
||||
copyRemoteLink: "Копіювати віддалене посилання"
|
||||
delete: "Видалити"
|
||||
deleteAndEdit: "Видалити й редагувати"
|
||||
deleteAndEditConfirm: "Ви впевнені, що хочете видалити цю нотатку та відредагувати її? Ви втратите всі реакції, поширення та відповіді на неї."
|
||||
@@ -57,6 +61,7 @@ copyUserId: "Копіювати ID користувача"
|
||||
copyNoteId: "блокнот ID користувача"
|
||||
copyFileId: "Скопіювати ідентифікатор файлу."
|
||||
searchUser: "Пошук користувачів"
|
||||
searchThisUsersNotes: "Пошук нотаток користувача"
|
||||
reply: "Відповісти"
|
||||
loadMore: "Показати більше"
|
||||
showMore: "Показати більше"
|
||||
@@ -105,9 +110,11 @@ enterEmoji: "Введіть емодзі"
|
||||
renote: "Поширити"
|
||||
unrenote: "Відміна поширення"
|
||||
renoted: "Поширити запис."
|
||||
renotedToX: "Поширено до {name}"
|
||||
cantRenote: "Неможливо поширити."
|
||||
cantReRenote: "Поширення не можливо поширити."
|
||||
quote: "Цитата"
|
||||
inChannelRenote: "Поширено у канал"
|
||||
pinnedNote: "Закріплений запис"
|
||||
pinned: "Закріпити"
|
||||
you: "Ви"
|
||||
@@ -116,6 +123,7 @@ sensitive: "NSFW"
|
||||
add: "Додати"
|
||||
reaction: "Реакції"
|
||||
reactions: "Реакції"
|
||||
emojiPicker: "Вибір реакції"
|
||||
reactionSettingDescription2: "Перемістити щоб змінити порядок, Клацнути мишою щоб видалити, Натиснути \"+\" щоб додати."
|
||||
rememberNoteVisibility: "Пам’ятати параметри видимісті"
|
||||
attachCancel: "Видалити вкладення"
|
||||
@@ -289,7 +297,9 @@ folderName: "Ім'я теки"
|
||||
createFolder: "Створити теку"
|
||||
renameFolder: "Перейменувати теку"
|
||||
deleteFolder: "Видалити теку"
|
||||
folder: "Тека"
|
||||
addFile: "Додати файл"
|
||||
showFile: "Показати файл"
|
||||
emptyDrive: "Диск порожній"
|
||||
emptyFolder: "Тека порожня"
|
||||
unableToDelete: "Видалення неможливе"
|
||||
@@ -302,6 +312,7 @@ copyUrl: "Копіювати URL"
|
||||
rename: "Перейменувати"
|
||||
avatar: "Аватар"
|
||||
banner: "Банер"
|
||||
displayOfSensitiveMedia: "Показ чутливого медіа"
|
||||
whenServerDisconnected: "Коли зв’язок із сервером втрачено"
|
||||
disconnectedFromServer: "Зв’язок із сервером було перервано"
|
||||
reload: "Оновити"
|
||||
@@ -348,8 +359,11 @@ hcaptcha: "hCaptcha"
|
||||
enableHcaptcha: "Увімкнути hCaptcha"
|
||||
hcaptchaSiteKey: "Ключ сайту"
|
||||
hcaptchaSecretKey: "Секретний ключ"
|
||||
mcaptcha: "MCaptcha"
|
||||
enableMcaptcha: "Увімкнути MCaptcha"
|
||||
mcaptchaSiteKey: "Ключ сайту"
|
||||
mcaptchaSecretKey: "Секретний ключ"
|
||||
mcaptchaInstanceUrl: "Посилання на сервер MCaptcha"
|
||||
recaptcha: "reCAPTCHA"
|
||||
enableRecaptcha: "Увімкнути reCAPTCHA"
|
||||
recaptchaSiteKey: "Ключ сайту"
|
||||
@@ -905,6 +919,8 @@ flip: "Перевернути"
|
||||
lastNDays: "Останні {n} днів"
|
||||
postForm: "Створення нотатки"
|
||||
information: "Інформація"
|
||||
inMinutes: "х"
|
||||
inDays: "д"
|
||||
_chat:
|
||||
invitations: "Запросити"
|
||||
noHistory: "Історія порожня"
|
||||
@@ -1625,3 +1641,17 @@ _remoteLookupErrors:
|
||||
_search:
|
||||
searchScopeAll: "Всі"
|
||||
searchScopeLocal: "Локальна"
|
||||
_watermarkEditor:
|
||||
opacity: "Непрозорість"
|
||||
scale: "Розмір"
|
||||
text: "Текст"
|
||||
type: "Тип"
|
||||
image: "Зображення"
|
||||
advanced: "Розширені"
|
||||
_imageEffector:
|
||||
_fxProps:
|
||||
scale: "Розмір"
|
||||
size: "Розмір"
|
||||
color: "Колір"
|
||||
opacity: "Непрозорість"
|
||||
lightness: "Яскравість"
|
||||
|
||||
+11
-2
@@ -903,7 +903,7 @@ _theme:
|
||||
header: "Sarlavha"
|
||||
navBg: "Yon panel foni"
|
||||
navFg: "Yon panel matni"
|
||||
mention: "Murojat"
|
||||
mention: "Eslatib o'tish"
|
||||
renote: "Qayta qayd etish"
|
||||
divider: "Ajratrmoq"
|
||||
fgHighlighted: "Belgilangan matn"
|
||||
@@ -1045,7 +1045,7 @@ _notification:
|
||||
_types:
|
||||
all: "Barchasi"
|
||||
follow: "Obuna bo‘lish"
|
||||
mention: "Murojat"
|
||||
mention: "Eslatib o'tish"
|
||||
renote: "Qayta qayd etish"
|
||||
quote: "Iqtibos keltirish"
|
||||
reaction: "Reaktsiyalar"
|
||||
@@ -1097,3 +1097,12 @@ _remoteLookupErrors:
|
||||
_search:
|
||||
searchScopeAll: "Barcha"
|
||||
searchScopeLocal: "Mahalliy"
|
||||
_watermarkEditor:
|
||||
text: "Matn"
|
||||
type: "turi"
|
||||
image: "Rasmlar"
|
||||
advanced: "Murakkab"
|
||||
_imageEffector:
|
||||
_fxProps:
|
||||
color: "Rang"
|
||||
lightness: "Yoritish"
|
||||
|
||||
+25
-1
@@ -220,6 +220,7 @@ silenceThisInstance: "Máy chủ im lặng"
|
||||
mediaSilenceThisInstance: "Tắt nội dung đa phương tiện từ máy chủ này"
|
||||
operations: "Vận hành"
|
||||
software: "Phần mềm"
|
||||
softwareName: "Tên phần mềm"
|
||||
version: "Phiên bản"
|
||||
metadata: "Metadata"
|
||||
withNFiles: "{n} tập tin"
|
||||
@@ -1195,7 +1196,6 @@ showAvatarDecorations: "Hiển thị trang trí ảnh đại diện"
|
||||
releaseToRefresh: "Thả để làm mới"
|
||||
refreshing: "Đang làm mới"
|
||||
pullDownToRefresh: "Kéo xuống để làm mới"
|
||||
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."
|
||||
decorate: "Trang trí"
|
||||
lastNDays: "{n} ngày trước"
|
||||
@@ -1211,18 +1211,25 @@ federationDisabled: "Liên kết bị vô hiệu hóa trên máy chủ này. B
|
||||
reactAreYouSure: "Bạn có muốn phản hồi với \" {emoji} \" không?"
|
||||
preferences: "Thiết lập môi trường"
|
||||
accessibility: "Khả năng tiếp cận"
|
||||
preferencesProfile: "Hồ sơ sở thích"
|
||||
preferenceSyncConflictTitle: "Cài đặt tồn tại trên máy chủ"
|
||||
preferenceSyncConflictText: "Các thiết lập đồng bộ hóa được bật sẽ lưu các giá trị của chúng vào máy chủ. Tuy nhiên, có những giá trị hiện có trên máy chủ. Bạn muốn ghi đè lên bộ giá trị nào?"
|
||||
paste: "dán"
|
||||
postForm: "Mẫu đăng"
|
||||
information: "Giới thiệu"
|
||||
chat: "Trò chuyện"
|
||||
migrateOldSettings: "Di chuyển cài đặt cũ"
|
||||
migrateOldSettings_description: "Thông thường, quá trình này diễn ra tự động, nhưng nếu vì lý do nào đó mà quá trình di chuyển không thành công, bạn có thể kích hoạt thủ công quy trình di chuyển, quá trình này sẽ ghi đè lên thông tin cấu hình hiện tại của bạn."
|
||||
inMinutes: "phút"
|
||||
inDays: "ngày"
|
||||
_chat:
|
||||
invitations: "Mời"
|
||||
noHistory: "Không có dữ liệu"
|
||||
members: "Thành viên"
|
||||
home: "Trang chính"
|
||||
send: "Gửi"
|
||||
_settings:
|
||||
preferencesBanner: "Bạn có thể cấu hình hành vi chung của máy khách theo sở thích của mình."
|
||||
_accountSettings:
|
||||
requireSigninToViewContents: "Yêu cầu đăng nhập để xem nội dung"
|
||||
requireSigninToViewContentsDescription1: "Yêu cầu đăng nhập để xem tất cả ghi chú và nội dung khác mà bạn tạo. Điều này được kỳ vọng sẽ có hiệu quả trong việc ngăn chặn thông tin bị thu thập bởi các trình thu thập thông tin."
|
||||
@@ -2074,3 +2081,20 @@ _search:
|
||||
searchScopeAll: "Tất cả"
|
||||
searchScopeLocal: "Máy chủ này"
|
||||
searchScopeUser: "Người dùng chỉ định"
|
||||
_watermarkEditor:
|
||||
opacity: "Độ trong suốt"
|
||||
scale: "Kích thước"
|
||||
text: "Văn bản"
|
||||
position: "Vị trí"
|
||||
type: "Loại"
|
||||
image: "Hình ảnh"
|
||||
advanced: "Nâng cao"
|
||||
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"
|
||||
|
||||
+158
-10
@@ -327,6 +327,7 @@ dark: "深色"
|
||||
lightThemes: "浅色主题"
|
||||
darkThemes: "深色主题"
|
||||
syncDeviceDarkMode: "将深色模式与设备设置同步"
|
||||
switchDarkModeManuallyWhenSyncEnabledConfirm: "「{x}」已开启。要关闭同步并手动切换模式吗?"
|
||||
drive: "网盘"
|
||||
fileName: "文件名称"
|
||||
selectFile: "选择文件"
|
||||
@@ -1053,6 +1054,7 @@ permissionDeniedError: "操作被拒绝"
|
||||
permissionDeniedErrorDescription: "本账户没有执行该操作的权限。"
|
||||
preset: "预设值"
|
||||
selectFromPresets: "从预设值中选择"
|
||||
custom: "自定义"
|
||||
achievements: "成就"
|
||||
gotInvalidResponseError: "服务器无应答"
|
||||
gotInvalidResponseErrorDescription: "您的网络连接可能出现了问题, 或是远程服务器暂时不可用. 请稍后重试。"
|
||||
@@ -1091,6 +1093,7 @@ prohibitedWordsDescription2: "AND 条件用空格分隔,正则表达式用斜
|
||||
hiddenTags: "隐藏标签"
|
||||
hiddenTagsDescription: "设定的标签将不会在时间线上显示。可使用换行来设置多个标签。"
|
||||
notesSearchNotAvailable: "帖子检索不可用"
|
||||
usersSearchNotAvailable: "用户检索不可用"
|
||||
license: "许可信息"
|
||||
unfavoriteConfirm: "确定要取消收藏吗?"
|
||||
myClips: "我的便签"
|
||||
@@ -1142,7 +1145,7 @@ channelArchiveConfirmTitle: "要将 {name} 归档吗?"
|
||||
channelArchiveConfirmDescription: "归档后,在频道列表与搜索结果中不会显示,也无法发布新的贴文。"
|
||||
thisChannelArchived: "该频道已被归档。"
|
||||
displayOfNote: "显示帖子"
|
||||
initialAccountSetting: "初始设置"
|
||||
initialAccountSetting: "初始设定"
|
||||
youFollowing: "正在关注"
|
||||
preventAiLearning: "拒绝接受生成式 AI 的学习"
|
||||
preventAiLearningDescription: "要求文章生成 AI 或图像生成 AI 不能够以发布的帖子和图像等内容作为学习对象。这是通过在 HTML 响应中包含 noai 标志来实现的,这不能完全阻止 AI 学习你的发布内容,并不是所有 AI 都会遵守这类请求。"
|
||||
@@ -1242,7 +1245,7 @@ releaseToRefresh: "松开以刷新"
|
||||
refreshing: "刷新中"
|
||||
pullDownToRefresh: "下拉以刷新"
|
||||
useGroupedNotifications: "分组显示通知"
|
||||
signupPendingError: "确认电子邮件时出现错误。链接可能已过期。"
|
||||
emailVerificationFailedError: "确认电子邮件时出现错误。链接可能已过期。"
|
||||
cwNotationRequired: "在启用「隐藏内容」时必须输入注释"
|
||||
doReaction: "回应"
|
||||
code: "代码"
|
||||
@@ -1312,11 +1315,12 @@ availableRoles: "可用角色"
|
||||
acknowledgeNotesAndEnable: "理解注意事项后再开启。"
|
||||
federationSpecified: "此服务器已开启联合白名单。只能与管理员指定的服务器通信。"
|
||||
federationDisabled: "此服务器已禁用联合。无法与其它服务器上的用户通信。"
|
||||
draft: "草稿"
|
||||
confirmOnReact: "发送回应前需要确认"
|
||||
reactAreYouSure: "要用「{emoji}」进行回应吗?"
|
||||
markAsSensitiveConfirm: "要将此媒体标记为敏感吗?"
|
||||
unmarkAsSensitiveConfirm: "要将此媒体解除敏感标记吗?"
|
||||
preferences: "设置"
|
||||
preferences: "偏好设置"
|
||||
accessibility: "辅助功能"
|
||||
preferencesProfile: "设置的配置"
|
||||
copyPreferenceId: "复制设置 ID"
|
||||
@@ -1329,6 +1333,7 @@ restore: "恢复"
|
||||
syncBetweenDevices: "设备间同步"
|
||||
preferenceSyncConflictTitle: "服务器上已存在设定值"
|
||||
preferenceSyncConflictText: "服务器上已有此设置的设定值。要覆盖哪个设定值?"
|
||||
preferenceSyncConflictChoiceMerge: "合并"
|
||||
preferenceSyncConflictChoiceServer: "服务器上的设定值"
|
||||
preferenceSyncConflictChoiceDevice: "设备上的设定值"
|
||||
preferenceSyncConflictChoiceCancel: "取消同步"
|
||||
@@ -1360,6 +1365,21 @@ emojiUnmute: "解除隐藏表情符号"
|
||||
muteX: "隐藏{x}"
|
||||
unmuteX: "解除隐藏{x}"
|
||||
abort: "中止"
|
||||
tip: "提示和技巧"
|
||||
redisplayAllTips: "重新显示所有的提示和技巧"
|
||||
hideAllTips: "隐藏所有的提示和技巧"
|
||||
defaultImageCompressionLevel: "默认图像压缩等级"
|
||||
defaultImageCompressionLevel_description: "较低的等级可以保持画质,但会增加文件大小。<br>较高的等级可以减少文件大小,但相对应的画质将会降低。"
|
||||
inMinutes: "分"
|
||||
inDays: "日"
|
||||
safeModeEnabled: "已启用安全模式"
|
||||
pluginsAreDisabledBecauseSafeMode: "因启用了安全模式,所有插件均已被禁用。"
|
||||
customCssIsDisabledBecauseSafeMode: "因启用了安全模式,无法应用自定义 CSS。"
|
||||
themeIsDefaultBecauseSafeMode: "启用安全模式时将使用默认主题。关闭安全模式后将还原。"
|
||||
thankYouForTestingBeta: "感谢您协助测试 beta 版!"
|
||||
_order:
|
||||
newest: "从新到旧"
|
||||
oldest: "从旧到新"
|
||||
_chat:
|
||||
noMessagesYet: "还没有消息"
|
||||
newMessage: "新消息"
|
||||
@@ -1447,6 +1467,8 @@ _settings:
|
||||
contentsUpdateFrequency_description: "设置越高,内容更新越实时,但性能会降低,并且会消耗更多的流量和电池。"
|
||||
contentsUpdateFrequency_description2: "当实时模式开启时,无论此设置如何,内容都会实时更新。"
|
||||
showUrlPreview: "显示 URL 预览"
|
||||
showAvailableReactionsFirstInNote: "在顶部显示可用的回应"
|
||||
showPageTabBarBottom: "在下方显示页面标签栏"
|
||||
_chat:
|
||||
showSenderName: "显示发送者的名字"
|
||||
sendOnEnter: "回车键发送"
|
||||
@@ -1524,7 +1546,7 @@ _announcement:
|
||||
silenceDescription: "开启后,此条公告将不会发送通知,也不强制用户阅读。"
|
||||
_initialAccountSetting:
|
||||
accountCreated: "账户创建完成了!"
|
||||
letsStartAccountSetup: "来进行帐户的初始设置吧。"
|
||||
letsStartAccountSetup: "马上来进行账户的初始设定吧。"
|
||||
letsFillYourProfile: "首先,来设定你的个人档案吧!"
|
||||
profileSetting: "个人资料设置"
|
||||
privacySetting: "隐私设置"
|
||||
@@ -1536,7 +1558,7 @@ _initialAccountSetting:
|
||||
haveFun: "希望 {name} 在这里玩得开心!"
|
||||
youCanContinueTutorial: "您可以继续了解 {name}(Misskey) 的使用教程,也可以在此停止教程并立即开始使用它。\n"
|
||||
startTutorial: "开始教学"
|
||||
skipAreYouSure: "要跳过初始设置吗?"
|
||||
skipAreYouSure: "要跳过初始设定吗?"
|
||||
laterAreYouSure: "要稍后再进行初始设定吗?"
|
||||
_initialTutorial:
|
||||
launchTutorial: "观看教学"
|
||||
@@ -1620,10 +1642,14 @@ _serverSettings:
|
||||
fanoutTimelineDbFallback: "回退到数据库"
|
||||
fanoutTimelineDbFallbackDescription: "当启用时,若时间线未被缓存,则将额外查询数据库。禁用该功能可通过不执行回退处理进一步减少服务器负载,但会限制可检索的时间线范围。"
|
||||
reactionsBufferingDescription: "开启时可显著提高发送回应时的性能,及减轻数据库负荷。但 Redis 的内存用量会相应增加。"
|
||||
remoteNotesCleaning: "自动清理远程投稿"
|
||||
remoteNotesCleaning_description: "启用后,将自动清理已无法找到的旧的远程投稿,可减缓数据库的增长。"
|
||||
remoteNotesCleaningMaxProcessingDuration: "最长清理持续时间"
|
||||
remoteNotesCleaningExpiryDaysForEachNotes: "最短帖子保留期限"
|
||||
inquiryUrl: "联络地址"
|
||||
inquiryUrlDescription: "用来指定诸如向服务运营商咨询的论坛地址,或记载了运营商联系方式之类的网页地址。"
|
||||
openRegistration: "开放注册"
|
||||
openRegistrationWarning: "开放注册有风险。建议仅当能够持续监控服务器并在出现问题时能够立即响应时才打开它。"
|
||||
openRegistrationWarning: "开放注册有风险。建议仅当能够持续监控服务器,并在出现问题时能够立即响应时才打开它。"
|
||||
thisSettingWillAutomaticallyOffWhenModeratorsInactive: "若在一段时间内没有检测到管理活动,为防止垃圾信息,此设定将自动关闭。"
|
||||
deliverSuspendedSoftware: "停止投递的软件"
|
||||
deliverSuspendedSoftwareDescription: "可因安全漏洞之类的原因,停止向指定的服务器及服务器版本送信。版本信息由服务器提供,不保证可靠性。可使用 semver 范围来指定版本,但指定 >= 2024.3.1 将不包括如 2024.3.1-custom.0 等自定义版本,因此建议像 >= 2024.3.1-0 这样指定 prerelease 版本。"
|
||||
@@ -1636,8 +1662,13 @@ _serverSettings:
|
||||
allowExternalApRedirect: "允许通过 ActivityPub 重定向查询"
|
||||
allowExternalApRedirect_description: "启用时,将允许其它服务器通过此服务器查询第三方内容,但有可能导致内容欺骗。"
|
||||
userGeneratedContentsVisibilityForVisitor: "用户生成内容对非用户的可见性"
|
||||
userGeneratedContentsVisibilityForVisitor_description: "这对于防止诸如难以审核的不适当的远程内容通过您自己的服务器无意中在互联网上公开等问题很有用。"
|
||||
userGeneratedContentsVisibilityForVisitor_description: "对于防止难以审核的不适当的远程内容等,通过自己的服务器无意中在互联网上公开等问题很有用。"
|
||||
userGeneratedContentsVisibilityForVisitor_description2: "包含服务器接收到的远程内容在内,无条件将服务器上的所有内容公开在互联网上存在风险。特别是对去中心化的特性不是很了解的访问者有可能将远程服务器上的内容误认为是在此服务器内生成的,需要特别留意。"
|
||||
restartServerSetupWizardConfirm_title: "要重新开始服务器初始设定向导吗?"
|
||||
restartServerSetupWizardConfirm_text: "现有的部分设定将重置。"
|
||||
entrancePageStyle: "入口页面样式"
|
||||
showTimelineForVisitor: "显示时间线"
|
||||
showActivitiesForVisitor: "显示活动"
|
||||
_userGeneratedContentsVisibilityForVisitor:
|
||||
all: "全部公开"
|
||||
localOnly: "仅公开本地内容,隐藏远程内容"
|
||||
@@ -1915,7 +1946,7 @@ _role:
|
||||
name: "角色名称"
|
||||
description: "角色描述"
|
||||
permission: "角色权限"
|
||||
descriptionOfPermission: "<b>监察员</b>可以执行基本地审核操作。\n<b>管理员</b>可以更改服务器的所有设置。"
|
||||
descriptionOfPermission: "<b>监察员</b>可以执行基本的审核操作。\n<b>管理员</b>可以更改实例的所有设置。"
|
||||
assignTarget: "授权对象"
|
||||
descriptionOfAssignTarget: "<b>手动</b>指手动选择谁被包括在这个角色中。\n<b>符合条件</b>指设置条件以自动包括符合条件的用户。"
|
||||
manual: "手动"
|
||||
@@ -1974,6 +2005,7 @@ _role:
|
||||
descriptionOfRateLimitFactor: "值越小限制越少,值越大限制越多。"
|
||||
canHideAds: "可以隐藏广告"
|
||||
canSearchNotes: "是否可以搜索帖子"
|
||||
canSearchUsers: "使用用户检索"
|
||||
canUseTranslator: "使用翻译功能"
|
||||
avatarDecorationLimit: "可添加头像挂件的最大个数"
|
||||
canImportAntennas: "允许导入天线"
|
||||
@@ -1985,6 +2017,8 @@ _role:
|
||||
uploadableFileTypes: "可上传的文件类型"
|
||||
uploadableFileTypes_caption: "指定 MIME 类型。可用换行指定多个类型,也可以用星号(*)作为通配符。(如 image/*)"
|
||||
uploadableFileTypes_caption2: "文件根据文件的不同,可能无法判断其类型。若要允许此类文件,请在指定中添加 {x}。"
|
||||
noteDraftLimit: "可在服务器上创建多少草稿"
|
||||
watermarkAvailable: "能否使用水印功能"
|
||||
_condition:
|
||||
roleAssignedTo: "已分配给手动角色"
|
||||
isLocal: "是本地用户"
|
||||
@@ -2135,7 +2169,7 @@ _wordMute:
|
||||
muteWordsDescription: "AND 条件用空格分隔,OR 条件用换行符分隔。"
|
||||
muteWordsDescription2: "正则表达式用斜线包裹"
|
||||
_instanceMute:
|
||||
instanceMuteDescription: "隐藏服务器中的所有帖子和转帖,包括这些服务器上的用户回复。"
|
||||
instanceMuteDescription: "隐藏服务器中所有的帖子和转帖,包括这些服务器上用户的回复。"
|
||||
instanceMuteDescription2: "一行一个"
|
||||
title: "下面实例中的帖子将被隐藏。"
|
||||
heading: "已隐藏的服务器"
|
||||
@@ -2144,6 +2178,7 @@ _theme:
|
||||
install: "安装主题"
|
||||
manage: "主题管理"
|
||||
code: "主题代码"
|
||||
copyThemeCode: "复制主题代码"
|
||||
description: "描述"
|
||||
installed: "{name} 已安装"
|
||||
installedThemes: "已安装的主题"
|
||||
@@ -2243,6 +2278,7 @@ _time:
|
||||
minute: "分"
|
||||
hour: "小时"
|
||||
day: "日"
|
||||
month: "个月"
|
||||
_2fa:
|
||||
alreadyRegistered: "此设备已被注册"
|
||||
registerTOTP: "开始设置验证器"
|
||||
@@ -2457,6 +2493,8 @@ _visibility:
|
||||
disableFederation: "不参与联合"
|
||||
disableFederationDescription: "不发送到其他服务器"
|
||||
_postForm:
|
||||
quitInspiteOfThereAreUnuploadedFilesConfirm: "还有未上传的文件,要丢弃并关闭窗口吗?"
|
||||
uploaderTip: "文件还未上传。可以在文件菜单中进行重命名、裁剪、添加水印、设置是否压缩等操作。文件将在发帖时自动上传。"
|
||||
replyPlaceholder: "回复这个帖子..."
|
||||
quotePlaceholder: "引用这个帖子..."
|
||||
channelPlaceholder: "发布到频道…"
|
||||
@@ -2483,7 +2521,7 @@ _profile:
|
||||
avatarDecorationMax: "最多可添加 {max} 个挂件"
|
||||
followedMessage: "被关注时显示的消息"
|
||||
followedMessageDescription: "可以设置被关注时向对方显示的短消息。"
|
||||
followedMessageDescriptionForLockedAccount: "需要批准才能关注的情况下,消息是在请求被批准后显示。"
|
||||
followedMessageDescriptionForLockedAccount: "需要批准才能关注的情况下,消息会在请求被批准后显示。"
|
||||
_exportOrImport:
|
||||
allNotes: "所有帖子"
|
||||
favoritedNotes: "收藏的帖子"
|
||||
@@ -2790,6 +2828,7 @@ _fileViewer:
|
||||
url: "URL"
|
||||
uploadedAt: "添加日期"
|
||||
attachedNotes: "附加到的帖子"
|
||||
usage: "使用"
|
||||
thisPageCanBeSeenFromTheAuthor: "此页只能被该文件的上传者查看。"
|
||||
_externalResourceInstaller:
|
||||
title: "从外部站点安装"
|
||||
@@ -2900,6 +2939,8 @@ _offlineScreen:
|
||||
_urlPreviewSetting:
|
||||
title: "设置 URL 预览"
|
||||
enable: "启用 URL 预览"
|
||||
allowRedirect: "允许预览目标的重定向"
|
||||
allowRedirectDescription: "如果输入的 URL 被重定向,可设置是否跟随重定向目标并显示预览。禁用此选项将节省服务器资源,但重定向目标的内容将不会显示。"
|
||||
timeout: "超时阈值(ms)"
|
||||
timeoutDescription: "如果获取预览所用时间超过这个值,则不生成预览。"
|
||||
maximumContentLength: "Content-Length 的最大值(byte)"
|
||||
@@ -3040,6 +3081,7 @@ _bootErrors:
|
||||
otherOption1: "清除客户端设定与缓存"
|
||||
otherOption2: "使用简易客户端"
|
||||
otherOption3: "启动修复工具"
|
||||
otherOption4: "以安全模式启动 Misskey"
|
||||
_search:
|
||||
searchScopeAll: "全部"
|
||||
searchScopeLocal: "本地"
|
||||
@@ -3076,6 +3118,9 @@ _serverSetupWizard:
|
||||
doYouConnectToFediverse_description1: "若加入由分散性服务器所构成的网络(Fediverse),将能与其它服务器交换内容。"
|
||||
doYouConnectToFediverse_description2: "加入 Fediverse 在这里被称为「联合」。"
|
||||
youCanConfigureMoreFederationSettingsLater: "可在之后进行如哪些服务器可以进行联合等高级设置。"
|
||||
remoteContentsCleaning: "自动清理传入内容"
|
||||
remoteContentsCleaning_description: "加入联合后,服务器将持续接收大量内容。打开自动清理后,将自动删除无法找到的旧内容,可节省存储空间。"
|
||||
remoteContentsCleaning_description2: "如超链接之类的某些引用方法无法被系统检测到。"
|
||||
adminInfo: "管理员信息"
|
||||
adminInfo_description: "设置用于接受询问的管理员信息。"
|
||||
adminInfo_mustBeFilled: "开放服务器或开启了联合的情况下必须输入。"
|
||||
@@ -3091,12 +3136,14 @@ _serverSetupWizard:
|
||||
text2: "为了今后也能继续开发,如果可以的话,请考虑一下捐助。"
|
||||
text3: "也有面向支援者的特典!"
|
||||
_uploader:
|
||||
editImage: "编辑图像"
|
||||
compressedToX: "压缩 {x}"
|
||||
savedXPercent: "节省了 {x}% 的空间"
|
||||
abortConfirm: "还有未上传的文件,要中止吗?"
|
||||
doneConfirm: "还有未上传的文件,要完成吗?"
|
||||
maxFileSizeIsX: "可上传最大 {x} 的文件。"
|
||||
allowedTypes: "可上传的文件类型"
|
||||
tip: "文件还没有被上传。可在此对话框中进行上传前确认、重命名、压缩、裁剪等操作。准备完成后,点击「上传」即可开始上传。"
|
||||
_clientPerformanceIssueTip:
|
||||
title: "如果觉得电池耗电过高"
|
||||
makeSureDisabledAdBlocker: "请关闭广告拦截器"
|
||||
@@ -3105,3 +3152,104 @@ _clientPerformanceIssueTip:
|
||||
makeSureDisabledCustomCss_description: "覆盖样式可能会影响性能。请确保没有启用任何自定义 CSS 或覆盖样式的扩展。"
|
||||
makeSureDisabledAddons: "请关闭扩展"
|
||||
makeSureDisabledAddons_description: "某些扩展可能会干扰客户端的运行并影响性能。尝试禁用浏览器扩展并查看是否有改善。"
|
||||
_clip:
|
||||
tip: "便签功能可以将帖子合并在一起。"
|
||||
_userLists:
|
||||
tip: "可创建包含任意用户的列表。已创建的列表可作为时间线查看。"
|
||||
watermark: "水印"
|
||||
defaultPreset: "默认预设"
|
||||
_watermarkEditor:
|
||||
tip: "可在图像内增加包含作者等信息的水印。"
|
||||
quitWithoutSaveConfirm: "不保存就退出吗?"
|
||||
driveFileTypeWarn: "不支持此文件"
|
||||
driveFileTypeWarnDescription: "请选择图像文件"
|
||||
title: "编辑水印"
|
||||
cover: "覆盖全体"
|
||||
repeat: "平铺"
|
||||
opacity: "不透明度"
|
||||
scale: "大小"
|
||||
text: "文本"
|
||||
position: "位置"
|
||||
type: "类型"
|
||||
image: "图片"
|
||||
advanced: "高级"
|
||||
angle: "角度"
|
||||
stripe: "条纹"
|
||||
stripeWidth: "线条宽度"
|
||||
stripeFrequency: "线条数量"
|
||||
polkadot: "波点"
|
||||
checker: "检查"
|
||||
polkadotMainDotOpacity: "主波点的不透明度"
|
||||
polkadotMainDotRadius: "主波点的大小"
|
||||
polkadotSubDotOpacity: "副波点的不透明度"
|
||||
polkadotSubDotRadius: "副波点的大小"
|
||||
polkadotSubDotDivisions: "副波点的数量"
|
||||
_imageEffector:
|
||||
title: "效果"
|
||||
addEffect: "添加效果"
|
||||
discardChangesConfirm: "丢弃当前设置并退出?"
|
||||
nothingToConfigure: "还没有设置"
|
||||
_fxs:
|
||||
chromaticAberration: "色差"
|
||||
glitch: "故障"
|
||||
mirror: "镜像"
|
||||
invert: "反转颜色"
|
||||
grayscale: "黑白"
|
||||
colorAdjust: "色彩校正"
|
||||
colorClamp: "颜色限制"
|
||||
colorClampAdvanced: "颜色限制(高级)"
|
||||
distort: "失真"
|
||||
threshold: "二值化"
|
||||
zoomLines: "集中线"
|
||||
stripe: "条纹"
|
||||
polkadot: "波点"
|
||||
checker: "检查"
|
||||
blockNoise: "块状噪点"
|
||||
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:
|
||||
select: "选择草稿"
|
||||
cannotCreateDraftAnymore: "已超过可创建的草稿数量。"
|
||||
cannotCreateDraft: "此内容无法创建草稿。"
|
||||
delete: "删除草稿"
|
||||
deleteAreYouSure: "要删除草稿吗?"
|
||||
noDrafts: "没有草稿"
|
||||
replyTo: "回复给 {user}"
|
||||
quoteOf: "对 {user} 帖子的引用"
|
||||
postTo: "向 {channel} 的投稿"
|
||||
saveToDraft: "保存到草稿"
|
||||
restoreFromDraft: "从草稿恢复"
|
||||
restore: "恢复"
|
||||
listDrafts: "草稿一览"
|
||||
|
||||
+141
-3
@@ -327,6 +327,7 @@ dark: "深色"
|
||||
lightThemes: "淺色佈景主題"
|
||||
darkThemes: "深色佈景主題"
|
||||
syncDeviceDarkMode: "與裝置的深色模式同步"
|
||||
switchDarkModeManuallyWhenSyncEnabledConfirm: "「{x}」已開啟。要關閉同步並手動切換模式嗎?\n"
|
||||
drive: "雲端硬碟"
|
||||
fileName: "檔案名稱"
|
||||
selectFile: "選擇檔案"
|
||||
@@ -637,7 +638,7 @@ inboxUrl: "收件夾 URL"
|
||||
addedRelays: "已加入的中繼器"
|
||||
serviceworkerInfo: "如要使用推播通知,需要啟用此選項並設定金鑰。"
|
||||
deletedNote: "已刪除的貼文"
|
||||
invisibleNote: "私人貼文"
|
||||
invisibleNote: "私密的貼文"
|
||||
enableInfiniteScroll: "啟用自動滾動頁面模式"
|
||||
visibility: "可見性"
|
||||
poll: "票選活動"
|
||||
@@ -1053,6 +1054,7 @@ permissionDeniedError: "操作被拒絕"
|
||||
permissionDeniedErrorDescription: "此帳戶沒有執行這個操作的權限。"
|
||||
preset: "預設值"
|
||||
selectFromPresets: "從預設值中選擇"
|
||||
custom: "自訂"
|
||||
achievements: "成就"
|
||||
gotInvalidResponseError: "伺服器的回應無效"
|
||||
gotInvalidResponseErrorDescription: "伺服器可能已關閉或者在維護中,請稍後再試。"
|
||||
@@ -1091,6 +1093,7 @@ prohibitedWordsDescription2: "空格代表「以及」(AND),斜線包圍
|
||||
hiddenTags: "隱藏標籤"
|
||||
hiddenTagsDescription: "設定的標籤不會在趨勢中顯示,換行可以設定多個標籤。"
|
||||
notesSearchNotAvailable: "無法使用搜尋貼文功能。"
|
||||
usersSearchNotAvailable: "無法使用使用者搜尋功能。"
|
||||
license: "授權"
|
||||
unfavoriteConfirm: "要取消收錄我的最愛嗎?"
|
||||
myClips: "我的摘錄"
|
||||
@@ -1242,7 +1245,7 @@ releaseToRefresh: "放開以更新內容"
|
||||
refreshing: "載入更新中"
|
||||
pullDownToRefresh: "往下拉來更新內容"
|
||||
useGroupedNotifications: "分組顯示通知訊息"
|
||||
signupPendingError: "驗證您的電子郵件地址時出現問題。連結可能已過期。"
|
||||
emailVerificationFailedError: "驗證您的電子郵件地址時出現問題。連結可能已過期。"
|
||||
cwNotationRequired: "如果開啟「隱藏內容」,則需要註解說明。"
|
||||
doReaction: "做出反應"
|
||||
code: "程式碼"
|
||||
@@ -1312,6 +1315,7 @@ availableRoles: "可用角色"
|
||||
acknowledgeNotesAndEnable: "了解注意事項後再開啟。"
|
||||
federationSpecified: "此伺服器以白名單聯邦的方式運作。除了管理員指定的伺服器外,它無法與其他伺服器互動。"
|
||||
federationDisabled: "此伺服器未開啟站台聯邦。無法與其他伺服器上的使用者互動。"
|
||||
draft: "草稿\n"
|
||||
confirmOnReact: "在做出反應前先確認"
|
||||
reactAreYouSure: "用「 {emoji} 」反應嗎?"
|
||||
markAsSensitiveConfirm: "要將這個媒體設定為敏感嗎?"
|
||||
@@ -1329,6 +1333,7 @@ restore: "還原"
|
||||
syncBetweenDevices: "裝置之間的同步化"
|
||||
preferenceSyncConflictTitle: "伺服器上存在設定值"
|
||||
preferenceSyncConflictText: "已啟用同步的設定項目會將設定值儲存至伺服器,並已找到該設定項目在伺服器上儲存的設定值。請選擇要使用哪個設定值進行覆寫。"
|
||||
preferenceSyncConflictChoiceMerge: "合併至"
|
||||
preferenceSyncConflictChoiceServer: "伺服器設定值"
|
||||
preferenceSyncConflictChoiceDevice: "裝置的設定值"
|
||||
preferenceSyncConflictChoiceCancel: "取消啟用同步"
|
||||
@@ -1363,6 +1368,18 @@ abort: "取消"
|
||||
tip: "提示與技巧"
|
||||
redisplayAllTips: "重新顯示所有「提示與技巧」"
|
||||
hideAllTips: "隱藏所有「提示與技巧」"
|
||||
defaultImageCompressionLevel: "預設的影像壓縮程度"
|
||||
defaultImageCompressionLevel_description: "低的話可以保留畫質,但是會增加檔案的大小。<br>高的話可以減少檔案大小,但是會降低畫質。"
|
||||
inMinutes: "分鐘"
|
||||
inDays: "日"
|
||||
safeModeEnabled: "啟用安全模式"
|
||||
pluginsAreDisabledBecauseSafeMode: "由於啟用安全模式,所有的外掛都被停用。"
|
||||
customCssIsDisabledBecauseSafeMode: "由於啟用安全模式,所有的客製 CSS 都被停用。"
|
||||
themeIsDefaultBecauseSafeMode: "在安全模式啟用期間將使用預設主題。關閉安全模式後會恢復原本的設定。"
|
||||
thankYouForTestingBeta: "感謝您協助驗證 beta 版!"
|
||||
_order:
|
||||
newest: "最新的在前"
|
||||
oldest: "最舊的在前"
|
||||
_chat:
|
||||
noMessagesYet: "尚無訊息"
|
||||
newMessage: "新訊息"
|
||||
@@ -1450,6 +1467,8 @@ _settings:
|
||||
contentsUpdateFrequency_description: "頻率越高,內容更新越即時,但可能會降低效能,並增加資料傳輸量與電池消耗。\n"
|
||||
contentsUpdateFrequency_description2: "當即時模式開啟時,不論此設定為何,內容都會即時更新。"
|
||||
showUrlPreview: "顯示網址預覽"
|
||||
showAvailableReactionsFirstInNote: "將可用的反應顯示在頂部"
|
||||
showPageTabBarBottom: "在底部顯示頁面的標籤列"
|
||||
_chat:
|
||||
showSenderName: "顯示發送者的名稱"
|
||||
sendOnEnter: "按下 Enter 發送訊息"
|
||||
@@ -1534,7 +1553,7 @@ _initialAccountSetting:
|
||||
theseSettingsCanEditLater: "這裡的設定可以在之後變更。"
|
||||
youCanEditMoreSettingsInSettingsPageLater: "除此之外,還可以在「設定」頁面進行各種設定。之後請確認看看。"
|
||||
followUsers: "為了構築時間軸,試著追隨您感興趣的使用者吧。"
|
||||
pushNotificationDescription: "啟用推送通知後,就可以在裝置上接收來自{name}的通知了。"
|
||||
pushNotificationDescription: "啟用推送通知後,就可以在裝置上接收來自 {name} 的通知了。"
|
||||
initialAccountSettingCompleted: "初始設定完成了!"
|
||||
haveFun: "盡情享受{name}吧!"
|
||||
youCanContinueTutorial: "您可以繼續學習如何使用{name}(Misskey),也可以就此打住,立即開始使用。"
|
||||
@@ -1623,6 +1642,10 @@ _serverSettings:
|
||||
fanoutTimelineDbFallback: "資料庫的回退"
|
||||
fanoutTimelineDbFallbackDescription: "若啟用,在時間軸沒有快取的情況下將執行回退處理以額外查詢資料庫。若停用,可以透過不執行回退處理來進一步減少伺服器的負荷,但會限制可取得的時間軸範圍。"
|
||||
reactionsBufferingDescription: "啟用時,可以顯著提高建立反應時的效能並減少資料庫的負載。 但是,Redis 記憶體使用量會增加。"
|
||||
remoteNotesCleaning: "自動清除遠端發佈內容"
|
||||
remoteNotesCleaning_description: "啟用後,系統會定期清理未被參照的舊遠端貼文,以抑制資料庫的膨脹。"
|
||||
remoteNotesCleaningMaxProcessingDuration: "清理作業的最長持續時間"
|
||||
remoteNotesCleaningExpiryDaysForEachNotes: "貼文最短保留天數"
|
||||
inquiryUrl: "聯絡表單網址"
|
||||
inquiryUrlDescription: "指定伺服器運營者的聯絡表單網址,或包含運營者聯絡資訊網頁的網址。"
|
||||
openRegistration: "允許建立帳戶"
|
||||
@@ -1641,6 +1664,11 @@ _serverSettings:
|
||||
userGeneratedContentsVisibilityForVisitor: "使用者建立的內容對訪客的公開範圍"
|
||||
userGeneratedContentsVisibilityForVisitor_description: "這有助於防止一些問題的發生,例如未經適當審核的不適當遠端內容無意中透過您自己的伺服器發佈到網際網路上。"
|
||||
userGeneratedContentsVisibilityForVisitor_description2: "包括伺服器接收到的遠端內容在內,無條件地將伺服器內所有內容公開到網際網路上是具有風險的。特別是對於不了解分散式架構特性的瀏覽者來說,他們可能會誤以為這些遠端內容是由該伺服器所創建的,因此需要特別留意。"
|
||||
restartServerSetupWizardConfirm_title: "要重新執行伺服器的初始設定精靈嗎?"
|
||||
restartServerSetupWizardConfirm_text: "當前的部分設定將會被重設。"
|
||||
entrancePageStyle: "入口頁面的樣式"
|
||||
showTimelineForVisitor: "顯示時間軸"
|
||||
showActivitiesForVisitor: "顯示活動"
|
||||
_userGeneratedContentsVisibilityForVisitor:
|
||||
all: "全部公開\n"
|
||||
localOnly: "僅公開本地內容,遠端內容則不公開\n"
|
||||
@@ -1977,6 +2005,7 @@ _role:
|
||||
descriptionOfRateLimitFactor: "值越小限制越少,值越大限制越多。"
|
||||
canHideAds: "不顯示廣告"
|
||||
canSearchNotes: "可否搜尋貼文"
|
||||
canSearchUsers: "可使用使用者搜尋功能"
|
||||
canUseTranslator: "使用翻譯功能"
|
||||
avatarDecorationLimit: "頭像可掛上的最大裝飾數量"
|
||||
canImportAntennas: "允許匯入天線"
|
||||
@@ -1988,6 +2017,8 @@ _role:
|
||||
uploadableFileTypes: "可上傳的檔案類型"
|
||||
uploadableFileTypes_caption: "請指定 MIME 類型。可以用換行區隔多個類型,也可以使用星號(*)作為萬用字元進行指定。(例如:image/*)\n"
|
||||
uploadableFileTypes_caption2: "有些檔案可能無法判斷其類型。若要允許這類檔案,請在指定中加入 {x}。"
|
||||
noteDraftLimit: "伺服器端可建立的貼文草稿數量上限\n"
|
||||
watermarkAvailable: "浮水印功能是否可用"
|
||||
_condition:
|
||||
roleAssignedTo: "手動指派角色完成"
|
||||
isLocal: "本地使用者"
|
||||
@@ -2147,6 +2178,7 @@ _theme:
|
||||
install: "安裝佈景主題"
|
||||
manage: "管理佈景主題"
|
||||
code: "佈景主題代碼"
|
||||
copyThemeCode: "複製主題代碼"
|
||||
description: "描述"
|
||||
installed: "{name}已安裝"
|
||||
installedThemes: "已經安裝的佈景主題"
|
||||
@@ -2246,6 +2278,7 @@ _time:
|
||||
minute: "分鐘"
|
||||
hour: "小時"
|
||||
day: "日"
|
||||
month: "個月"
|
||||
_2fa:
|
||||
alreadyRegistered: "此裝置已被註冊過了"
|
||||
registerTOTP: "開始設定驗證應用程式"
|
||||
@@ -2460,6 +2493,8 @@ _visibility:
|
||||
disableFederation: "停用聯邦"
|
||||
disableFederationDescription: "不發送到其他伺服器"
|
||||
_postForm:
|
||||
quitInspiteOfThereAreUnuploadedFilesConfirm: "尚有未上傳的檔案,確定要放棄並關閉表單嗎?"
|
||||
uploaderTip: "檔案尚未上傳。您可以從檔案選單中設定重新命名、裁切圖片、加上浮水印、是否壓縮等選項。檔案會在發布貼文時自動上傳。\n"
|
||||
replyPlaceholder: "回覆此貼文..."
|
||||
quotePlaceholder: "引用此貼文..."
|
||||
channelPlaceholder: "發佈到頻道"
|
||||
@@ -2793,6 +2828,7 @@ _fileViewer:
|
||||
url: "URL"
|
||||
uploadedAt: "加入日期"
|
||||
attachedNotes: "含有附件的貼文"
|
||||
usage: "使用情況"
|
||||
thisPageCanBeSeenFromTheAuthor: "本頁面僅限上傳了這個檔案的使用者可以檢視。"
|
||||
_externalResourceInstaller:
|
||||
title: "從外部網站安裝"
|
||||
@@ -3045,6 +3081,7 @@ _bootErrors:
|
||||
otherOption1: "刪除用戶端設定和快取"
|
||||
otherOption2: "啟動簡易用戶端"
|
||||
otherOption3: "啟動修復工具"
|
||||
otherOption4: "以安全模式啟動 Misskey"
|
||||
_search:
|
||||
searchScopeAll: "全部"
|
||||
searchScopeLocal: "本地"
|
||||
@@ -3081,6 +3118,9 @@ _serverSetupWizard:
|
||||
doYouConnectToFediverse_description1: "連接到由分散型伺服器構成的網絡(聯邦宇宙)後,您可以與其他伺服器進行內容的互相交流。\n"
|
||||
doYouConnectToFediverse_description2: "連接到聯邦宇宙被稱為「聯邦」。\n"
|
||||
youCanConfigureMoreFederationSettingsLater: "您可以在稍後進行更高級的設定,例如指定可以聯繫的伺服器等。\n"
|
||||
remoteContentsCleaning: "自動清理接收的內容"
|
||||
remoteContentsCleaning_description: "進行聯邦後,會持續接收大量內容。啟用自動清理功能後,系統會自動從伺服器中刪除未被參照的過時內容,以節省儲存空間。"
|
||||
remoteContentsCleaning_description2: "有些引用方式系統上無法檢測到,例如超連結。"
|
||||
adminInfo: "管理員資訊"
|
||||
adminInfo_description: "設定用於接收查詢的管理者資訊。\n"
|
||||
adminInfo_mustBeFilled: "當設置為開放伺服器或啟用聯邦時,必須填寫此資訊。\n"
|
||||
@@ -3096,6 +3136,7 @@ _serverSetupWizard:
|
||||
text2: "為了能夠繼續開發,若您願意的話,請考慮進行捐款。\n"
|
||||
text3: "也有提供支援者專屬的特典!\n"
|
||||
_uploader:
|
||||
editImage: "編輯圖片"
|
||||
compressedToX: "壓縮為 {x}"
|
||||
savedXPercent: "節省了 {x}%"
|
||||
abortConfirm: "有些檔案尚未上傳,您要中止嗎?"
|
||||
@@ -3115,3 +3156,100 @@ _clip:
|
||||
tip: "摘錄是一項可以用來整理貼文的功能。"
|
||||
_userLists:
|
||||
tip: "您可以建立包含任意使用者的清單。建立後的清單可以作為時間軸顯示。\n"
|
||||
watermark: "浮水印"
|
||||
defaultPreset: "預設值"
|
||||
_watermarkEditor:
|
||||
tip: "可以在圖片中以浮水印加上出處等資訊。"
|
||||
quitWithoutSaveConfirm: "不儲存就退出嗎?"
|
||||
driveFileTypeWarn: "不支援此檔案"
|
||||
driveFileTypeWarnDescription: "請選擇圖片檔案"
|
||||
title: "編輯浮水印"
|
||||
cover: "覆蓋整體"
|
||||
repeat: "佈局"
|
||||
opacity: "透明度"
|
||||
scale: "大小"
|
||||
text: "文字"
|
||||
position: "位置"
|
||||
type: "類型"
|
||||
image: "圖片"
|
||||
advanced: "進階"
|
||||
angle: "角度"
|
||||
stripe: "條紋"
|
||||
stripeWidth: "線條寬度"
|
||||
stripeFrequency: "線條數量"
|
||||
polkadot: "波卡圓點"
|
||||
checker: "棋盤格"
|
||||
polkadotMainDotOpacity: "主圓點的不透明度"
|
||||
polkadotMainDotRadius: "主圓點的尺寸"
|
||||
polkadotSubDotOpacity: "子圓點的不透明度"
|
||||
polkadotSubDotRadius: "子圓點的尺寸"
|
||||
polkadotSubDotDivisions: "子圓點的數量"
|
||||
_imageEffector:
|
||||
title: "特效"
|
||||
addEffect: "新增特效"
|
||||
discardChangesConfirm: "捨棄更改並退出嗎?"
|
||||
nothingToConfigure: "無可設定的項目"
|
||||
_fxs:
|
||||
chromaticAberration: "色差"
|
||||
glitch: "異常雜訊效果"
|
||||
mirror: "鏡像"
|
||||
invert: "反轉色彩"
|
||||
grayscale: "黑白"
|
||||
colorAdjust: "色彩校正"
|
||||
colorClamp: "壓縮色彩"
|
||||
colorClampAdvanced: "壓縮色彩(進階)"
|
||||
distort: "變形"
|
||||
threshold: "閾值"
|
||||
zoomLines: "速度線"
|
||||
stripe: "條紋"
|
||||
polkadot: "波卡圓點"
|
||||
checker: "棋盤格"
|
||||
blockNoise: "阻擋雜訊"
|
||||
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:
|
||||
select: "選擇草槁"
|
||||
cannotCreateDraftAnymore: "已超出可建立的草稿數量上限。\n"
|
||||
cannotCreateDraft: "無法以此內容建立草稿。\n"
|
||||
delete: "刪除草稿"
|
||||
deleteAreYouSure: "確定要刪除草稿嗎?\n"
|
||||
noDrafts: "沒有草稿。\n"
|
||||
replyTo: "回覆給 {user}\n"
|
||||
quoteOf: "引用自 {user} 的貼文\n"
|
||||
postTo: "發佈到 {channel}\n"
|
||||
saveToDraft: "儲存為草稿"
|
||||
restoreFromDraft: "從草稿復原\n"
|
||||
restore: "還原"
|
||||
listDrafts: "草稿清單"
|
||||
|
||||
+21
-17
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "misskey",
|
||||
"version": "2025.5.1-beta.5",
|
||||
"version": "2025.8.0-beta.6",
|
||||
"codename": "nasubi",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/misskey-dev/misskey.git"
|
||||
},
|
||||
"packageManager": "pnpm@10.11.0",
|
||||
"packageManager": "pnpm@10.15.0",
|
||||
"workspaces": [
|
||||
"packages/frontend-shared",
|
||||
"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",
|
||||
"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",
|
||||
"cli": "cd packages/backend && pnpm cli",
|
||||
"init": "pnpm migrate",
|
||||
"migrate": "cd packages/backend && pnpm migrate",
|
||||
"revert": "cd packages/backend && pnpm revert",
|
||||
@@ -52,30 +53,30 @@
|
||||
"lodash": "4.17.21"
|
||||
},
|
||||
"dependencies": {
|
||||
"cssnano": "7.0.7",
|
||||
"esbuild": "0.25.4",
|
||||
"execa": "9.5.3",
|
||||
"cssnano": "7.1.1",
|
||||
"esbuild": "0.25.9",
|
||||
"execa": "9.6.0",
|
||||
"fast-glob": "3.3.3",
|
||||
"glob": "11.0.2",
|
||||
"glob": "11.0.3",
|
||||
"ignore-walk": "7.0.0",
|
||||
"js-yaml": "4.1.0",
|
||||
"postcss": "8.5.3",
|
||||
"postcss": "8.5.6",
|
||||
"tar": "7.4.3",
|
||||
"terser": "5.39.2",
|
||||
"typescript": "5.8.3"
|
||||
"terser": "5.43.1",
|
||||
"typescript": "5.9.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@misskey-dev/eslint-plugin": "2.1.0",
|
||||
"@types/node": "22.15.21",
|
||||
"@typescript-eslint/eslint-plugin": "8.32.1",
|
||||
"@typescript-eslint/parser": "8.32.1",
|
||||
"@types/node": "22.17.2",
|
||||
"@typescript-eslint/eslint-plugin": "8.40.0",
|
||||
"@typescript-eslint/parser": "8.40.0",
|
||||
"cross-env": "7.0.3",
|
||||
"cypress": "14.4.0",
|
||||
"eslint": "9.27.0",
|
||||
"globals": "16.1.0",
|
||||
"cypress": "14.5.4",
|
||||
"eslint": "9.34.0",
|
||||
"globals": "16.3.0",
|
||||
"ncp": "2.0.0",
|
||||
"pnpm": "10.11.0",
|
||||
"start-server-and-test": "2.0.12"
|
||||
"pnpm": "10.15.0",
|
||||
"start-server-and-test": "2.0.13"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@tensorflow/tfjs-core": "4.22.0"
|
||||
@@ -83,6 +84,9 @@
|
||||
"pnpm": {
|
||||
"overrides": {
|
||||
"@aiscript-dev/aiscript-languageserver": "-"
|
||||
},
|
||||
"patchedDependencies": {
|
||||
"typeorm": "patches/typeorm.patch"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,6 +25,7 @@ export default [
|
||||
},
|
||||
},
|
||||
rules: {
|
||||
'@typescript-eslint/no-unused-vars': 'off',
|
||||
'import/order': ['warn', {
|
||||
groups: [
|
||||
'builtin',
|
||||
|
||||
@@ -0,0 +1,91 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
export class CreateNoteDraft1736686850345 {
|
||||
name = 'CreateNoteDraft1736686850345'
|
||||
|
||||
async up(queryRunner) {
|
||||
await queryRunner.query(`
|
||||
CREATE TABLE "note_draft" (
|
||||
"id" varchar NOT NULL,
|
||||
"replyId" varchar NULL,
|
||||
"renoteId" varchar NULL,
|
||||
"text" text NULL,
|
||||
"cw" varchar(512) NULL,
|
||||
"userId" varchar NOT NULL,
|
||||
"localOnly" boolean DEFAULT false,
|
||||
"reactionAcceptance" varchar(64) NULL,
|
||||
"visibility" varchar NOT NULL,
|
||||
"fileIds" varchar[] DEFAULT '{}',
|
||||
"visibleUserIds" varchar[] DEFAULT '{}',
|
||||
"hashtag" varchar(128) NULL,
|
||||
"channelId" varchar NULL,
|
||||
"hasPoll" boolean DEFAULT false,
|
||||
"pollChoices" varchar(256)[] DEFAULT '{}',
|
||||
"pollMultiple" boolean NULL,
|
||||
"pollExpiresAt" TIMESTAMP WITH TIME ZONE NULL,
|
||||
"pollExpiredAfter" bigint NULL,
|
||||
PRIMARY KEY ("id")
|
||||
)`);
|
||||
|
||||
await queryRunner.query(`
|
||||
CREATE INDEX "IDX_NOTE_DRAFT_REPLY_ID" ON "note_draft" ("replyId")
|
||||
`);
|
||||
|
||||
await queryRunner.query(`
|
||||
CREATE INDEX "IDX_NOTE_DRAFT_RENOTE_ID" ON "note_draft" ("renoteId")
|
||||
`);
|
||||
|
||||
await queryRunner.query(`
|
||||
CREATE INDEX "IDX_NOTE_DRAFT_USER_ID" ON "note_draft" ("userId")
|
||||
`);
|
||||
|
||||
await queryRunner.query(`
|
||||
CREATE INDEX "IDX_NOTE_DRAFT_FILE_IDS" ON "note_draft" USING GIN ("fileIds")
|
||||
`);
|
||||
|
||||
await queryRunner.query(`
|
||||
CREATE INDEX "IDX_NOTE_DRAFT_VISIBLE_USER_IDS" ON "note_draft" USING GIN ("visibleUserIds")
|
||||
`);
|
||||
|
||||
await queryRunner.query(`
|
||||
CREATE INDEX "IDX_NOTE_DRAFT_CHANNEL_ID" ON "note_draft" ("channelId")
|
||||
`);
|
||||
|
||||
await queryRunner.query(`
|
||||
ALTER TABLE "note_draft"
|
||||
ADD CONSTRAINT "FK_NOTE_DRAFT_REPLY_ID" FOREIGN KEY ("replyId") REFERENCES "note"("id") ON DELETE CASCADE
|
||||
`);
|
||||
|
||||
await queryRunner.query(`
|
||||
ALTER TABLE "note_draft"
|
||||
ADD CONSTRAINT "FK_NOTE_DRAFT_RENOTE_ID" FOREIGN KEY ("renoteId") REFERENCES "note"("id") ON DELETE CASCADE
|
||||
`);
|
||||
|
||||
await queryRunner.query(`
|
||||
ALTER TABLE "note_draft"
|
||||
ADD CONSTRAINT "FK_NOTE_DRAFT_USER_ID" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE
|
||||
`);
|
||||
|
||||
await queryRunner.query(`
|
||||
ALTER TABLE "note_draft"
|
||||
ADD CONSTRAINT "FK_NOTE_DRAFT_CHANNEL_ID" FOREIGN KEY ("channelId") REFERENCES "channel"("id") ON DELETE CASCADE
|
||||
`);
|
||||
}
|
||||
|
||||
async down(queryRunner) {
|
||||
await queryRunner.query(`ALTER TABLE "note_draft" DROP CONSTRAINT "FK_NOTE_DRAFT_CHANNEL_ID"`);
|
||||
await queryRunner.query(`ALTER TABLE "note_draft" DROP CONSTRAINT "FK_NOTE_DRAFT_USER_ID"`);
|
||||
await queryRunner.query(`ALTER TABLE "note_draft" DROP CONSTRAINT "FK_NOTE_DRAFT_RENOTE_ID"`);
|
||||
await queryRunner.query(`ALTER TABLE "note_draft" DROP CONSTRAINT "FK_NOTE_DRAFT_REPLY_ID"`);
|
||||
await queryRunner.query(`DROP INDEX "IDX_NOTE_DRAFT_CHANNEL_ID"`);
|
||||
await queryRunner.query(`DROP INDEX "IDX_NOTE_DRAFT_VISIBLE_USER_IDS"`);
|
||||
await queryRunner.query(`DROP INDEX "IDX_NOTE_DRAFT_FILE_IDS"`);
|
||||
await queryRunner.query(`DROP INDEX "IDX_NOTE_DRAFT_USER_ID"`);
|
||||
await queryRunner.query(`DROP INDEX "IDX_NOTE_DRAFT_RENOTE_ID"`);
|
||||
await queryRunner.query(`DROP INDEX "IDX_NOTE_DRAFT_REPLY_ID"`);
|
||||
await queryRunner.query(`DROP TABLE "note_draft"`);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
export class FixAvatarUrl1750729939704 {
|
||||
name = 'FixAvatarUrl1750729939704'
|
||||
|
||||
async up(queryRunner) {
|
||||
await queryRunner.query(`ALTER TABLE "user" ALTER COLUMN "avatarUrl" TYPE character varying(1024)`);
|
||||
}
|
||||
|
||||
async down(queryRunner) {
|
||||
await queryRunner.query(`ALTER TABLE "user" ALTER COLUMN "avatarUrl" TYPE character varying(512)`);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
export class NoActionOnDraftRelation1752502434151 {
|
||||
name = 'NoActionOnDraftRelation1752502434151'
|
||||
|
||||
async up(queryRunner) {
|
||||
await queryRunner.query(`ALTER TABLE "note_draft" DROP CONSTRAINT "FK_NOTE_DRAFT_CHANNEL_ID"`);
|
||||
await queryRunner.query(`ALTER TABLE "note_draft" DROP CONSTRAINT "FK_NOTE_DRAFT_USER_ID"`);
|
||||
await queryRunner.query(`ALTER TABLE "note_draft" DROP CONSTRAINT "FK_NOTE_DRAFT_RENOTE_ID"`);
|
||||
await queryRunner.query(`ALTER TABLE "note_draft" DROP CONSTRAINT "FK_NOTE_DRAFT_REPLY_ID"`);
|
||||
await queryRunner.query(`ALTER TABLE "note_draft" ADD CONSTRAINT "FK_e4983f28b4b18b03491536052f5" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||
}
|
||||
|
||||
async down(queryRunner) {
|
||||
await queryRunner.query(`ALTER TABLE "note_draft" DROP CONSTRAINT "FK_e4983f28b4b18b03491536052f5"`);
|
||||
await queryRunner.query(`ALTER TABLE "note_draft" ADD CONSTRAINT "FK_NOTE_DRAFT_REPLY_ID" FOREIGN KEY ("replyId") REFERENCES "note"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||
await queryRunner.query(`ALTER TABLE "note_draft" ADD CONSTRAINT "FK_NOTE_DRAFT_RENOTE_ID" FOREIGN KEY ("renoteId") REFERENCES "note"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||
await queryRunner.query(`ALTER TABLE "note_draft" ADD CONSTRAINT "FK_NOTE_DRAFT_USER_ID" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||
await queryRunner.query(`ALTER TABLE "note_draft" ADD CONSTRAINT "FK_NOTE_DRAFT_CHANNEL_ID" FOREIGN KEY ("channelId") REFERENCES "channel"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
export class MigrationCleanup1752509043847 {
|
||||
name = 'MigrationCleanup1752509043847'
|
||||
|
||||
async up(queryRunner) {
|
||||
// 1745378064470-composite-note-index.js created a index ON "note" ("userId", "id" DESC) as IDX_724b311e6f883751f261ebe378 but should be named IDX_a6f649630f55af3888e5a42919
|
||||
await queryRunner.query(`ALTER INDEX "IDX_724b311e6f883751f261ebe378" RENAME TO "IDX_a6f649630f55af3888e5a42919"`);
|
||||
|
||||
// 1713656541000-abuse-report-notification.js generated system_webhook with hand-written SQL with CURRENT_TIMESTAMP as the default value, but its representation in TypeORM is `now()`
|
||||
// see https://github.com/typeorm/typeorm/blob/f351757a15b9d2bd9d4222c69dcfd2316f46b5d1/src/driver/postgres/PostgresDriver.ts#L1575
|
||||
await queryRunner.query(`ALTER TABLE "system_webhook" ALTER COLUMN "updatedAt" SET DEFAULT now()`);
|
||||
|
||||
// 1702718871541-ffVisibility.js defined a enum type "user_profile_followersVisibility_enum" but it should be "user_profile_followersvisibility_enum" (lowercase 'v') in typeorm
|
||||
await queryRunner.query(`ALTER TYPE "public"."user_profile_followersVisibility_enum" RENAME TO "user_profile_followersvisibility_enum"`);
|
||||
|
||||
// 1713656541000-abuse-report-notification.js generated abuse_report_notification_recipient with hand-written SQL with CURRENT_TIMESTAMP as the default value, but its representation in TypeORM is `now()`
|
||||
await queryRunner.query(`ALTER TABLE "abuse_report_notification_recipient" ALTER COLUMN "updatedAt" SET DEFAULT now()`);
|
||||
|
||||
// 1690796169261-play-visibility.js added visibility column to flash table but it forgot to set NOT NULL constraint
|
||||
await queryRunner.query(`ALTER TABLE "flash" ALTER COLUMN "visibility" SET NOT NULL`);
|
||||
|
||||
// 1736686850345-createNoteDraft.js created note_draft with hand-written SQL but several types and comments are not correctly defined
|
||||
await queryRunner.query(`CREATE TYPE "public"."note_draft_visibility_enum" AS ENUM('public', 'home', 'followers', 'specified')`);
|
||||
await queryRunner.query(`ALTER TABLE "note_draft" ALTER COLUMN "id" SET DATA TYPE character varying(32)`);
|
||||
await queryRunner.query(`ALTER TABLE "note_draft" ALTER COLUMN "replyId" SET DATA TYPE character varying(32)`);
|
||||
await queryRunner.query(`ALTER TABLE "note_draft" ALTER COLUMN "renoteId" SET DATA TYPE character varying(32)`);
|
||||
await queryRunner.query(`ALTER TABLE "note_draft" ALTER COLUMN "userId" SET DATA TYPE character varying(32)`);
|
||||
await queryRunner.query(`ALTER TABLE "note_draft" ALTER COLUMN "channelId" SET DATA TYPE character varying(32)`);
|
||||
await queryRunner.query(`ALTER TABLE "note_draft" ALTER COLUMN "fileIds" SET DATA TYPE character varying(32) array`);
|
||||
await queryRunner.query(`ALTER TABLE "note_draft" ALTER COLUMN "visibleUserIds" SET DATA TYPE character varying(32) array`);
|
||||
await queryRunner.query(`ALTER TABLE "note_draft" ALTER COLUMN "visibility" SET DATA TYPE "public"."note_draft_visibility_enum" USING visibility::note_draft_visibility_enum`);
|
||||
await queryRunner.query(`COMMENT ON COLUMN "note_draft"."replyId" IS 'The ID of reply target.'`);
|
||||
await queryRunner.query(`COMMENT ON COLUMN "note_draft"."renoteId" IS 'The ID of renote target.'`);
|
||||
await queryRunner.query(`COMMENT ON COLUMN "note_draft"."userId" IS 'The ID of author.'`);
|
||||
await queryRunner.query(`COMMENT ON COLUMN "note_draft"."channelId" IS 'The ID of source channel.'`);
|
||||
await queryRunner.query(`ALTER TABLE "note_draft" ALTER COLUMN "fileIds" SET NOT NULL`);
|
||||
await queryRunner.query(`ALTER TABLE "note_draft" ALTER COLUMN "hasPoll" SET NOT NULL`);
|
||||
await queryRunner.query(`ALTER TABLE "note_draft" ALTER COLUMN "pollChoices" SET NOT NULL`);
|
||||
await queryRunner.query(`ALTER TABLE "note_draft" ALTER COLUMN "pollMultiple" SET NOT NULL`);
|
||||
await queryRunner.query(`ALTER TABLE "note_draft" ALTER COLUMN "localOnly" SET NOT NULL`);
|
||||
await queryRunner.query(`ALTER TABLE "note_draft" ALTER COLUMN "visibleUserIds" SET NOT NULL`);
|
||||
}
|
||||
|
||||
async down(queryRunner) {
|
||||
await queryRunner.query(`ALTER TABLE "note_draft" ALTER COLUMN "visibleUserIds" DROP NOT NULL`);
|
||||
await queryRunner.query(`ALTER TABLE "note_draft" ALTER COLUMN "localOnly" DROP NOT NULL`);
|
||||
await queryRunner.query(`ALTER TABLE "note_draft" ALTER COLUMN "pollMultiple" DROP NOT NULL`);
|
||||
await queryRunner.query(`ALTER TABLE "note_draft" ALTER COLUMN "pollChoices" DROP NOT NULL`);
|
||||
await queryRunner.query(`ALTER TABLE "note_draft" ALTER COLUMN "hasPoll" DROP NOT NULL`);
|
||||
await queryRunner.query(`ALTER TABLE "note_draft" ALTER COLUMN "fileIds" DROP NOT NULL`);
|
||||
await queryRunner.query(`COMMENT ON COLUMN "note_draft"."channelId" IS NULL`);
|
||||
await queryRunner.query(`COMMENT ON COLUMN "note_draft"."userId" IS 'The ID of author.'`);
|
||||
await queryRunner.query(`COMMENT ON COLUMN "note_draft"."renoteId" IS NULL`);
|
||||
await queryRunner.query(`COMMENT ON COLUMN "note_draft"."replyId" IS NULL`);
|
||||
await queryRunner.query(`ALTER TABLE "note_draft" ALTER COLUMN "visibility" SET DATA TYPE varchar`);
|
||||
await queryRunner.query(`ALTER TABLE "note_draft" ALTER COLUMN "visibleUserIds" SET DATA TYPE varchar[]`);
|
||||
await queryRunner.query(`ALTER TABLE "note_draft" ALTER COLUMN "fileIds" SET DATA TYPE varchar[]`);
|
||||
await queryRunner.query(`ALTER TABLE "note_draft" ALTER COLUMN "channelId" SET DATA TYPE varchar`);
|
||||
await queryRunner.query(`ALTER TABLE "note_draft" ALTER COLUMN "userId" SET DATA TYPE varchar`);
|
||||
await queryRunner.query(`ALTER TABLE "note_draft" ALTER COLUMN "renoteId" SET DATA TYPE varchar`);
|
||||
await queryRunner.query(`ALTER TABLE "note_draft" ALTER COLUMN "replyId" SET DATA TYPE varchar`);
|
||||
await queryRunner.query(`ALTER TABLE "note_draft" ALTER COLUMN "id" SET DATA TYPE varchar`);
|
||||
await queryRunner.query(`DROP TYPE "public"."note_draft_visibility_enum"`);
|
||||
|
||||
await queryRunner.query(`ALTER TABLE "flash" ALTER COLUMN "visibility" DROP NOT NULL`);
|
||||
|
||||
await queryRunner.query(`ALTER TABLE "abuse_report_notification_recipient" ALTER COLUMN "updatedAt" SET DEFAULT CURRENT_TIMESTAMP`);
|
||||
|
||||
await queryRunner.query(`ALTER TYPE "public"."user_profile_followersvisibility_enum" RENAME TO "user_profile_followersVisibility_enum"`);
|
||||
|
||||
await queryRunner.query(`ALTER TABLE "system_webhook" ALTER COLUMN "updatedAt" SET DEFAULT CURRENT_TIMESTAMP`);
|
||||
|
||||
await queryRunner.query(`ALTER INDEX "IDX_a6f649630f55af3888e5a42919" RENAME TO "IDX_724b311e6f883751f261ebe378"`);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
export class RemoteNotesCleaning1753863104203 {
|
||||
name = 'RemoteNotesCleaning1753863104203'
|
||||
|
||||
async up(queryRunner) {
|
||||
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 "remoteNotesCleaningExpiryDaysForEachNotes" integer NOT NULL DEFAULT \'90\'');
|
||||
}
|
||||
|
||||
async down(queryRunner) {
|
||||
await queryRunner.query('ALTER TABLE "meta" DROP COLUMN "remoteNotesCleaningExpiryDaysForEachNotes"');
|
||||
await queryRunner.query('ALTER TABLE "meta" DROP COLUMN "remoteNotesCleaningMaxProcessingDurationInMinutes"');
|
||||
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "enableRemoteNotesCleaning"`);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
export class RemoveNoteConstraints1753868431598 {
|
||||
name = 'RemoveNoteConstraints1753868431598'
|
||||
|
||||
async up(queryRunner) {
|
||||
await queryRunner.query(`ALTER TABLE "note" DROP CONSTRAINT "FK_52ccc804d7c69037d558bac4c96"`);
|
||||
await queryRunner.query(`ALTER TABLE "note" DROP CONSTRAINT "FK_17cb3553c700a4985dff5a30ff5"`);
|
||||
}
|
||||
|
||||
async down(queryRunner) {
|
||||
await queryRunner.query(`ALTER TABLE "note" ADD CONSTRAINT "FK_17cb3553c700a4985dff5a30ff5" FOREIGN KEY ("replyId") REFERENCES "note"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||
await queryRunner.query(`ALTER TABLE "note" ADD CONSTRAINT "FK_52ccc804d7c69037d558bac4c96" FOREIGN KEY ("renoteId") REFERENCES "note"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||
}
|
||||
}
|
||||
@@ -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'`);
|
||||
}
|
||||
}
|
||||
@@ -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`);
|
||||
}
|
||||
}
|
||||
@@ -4,13 +4,14 @@
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"engines": {
|
||||
"node": "^20.10.0 || ^22.0.0"
|
||||
"node": "^22.15.0"
|
||||
},
|
||||
"scripts": {
|
||||
"start": "node ./built/boot/entry.js",
|
||||
"start:test": "cross-env NODE_ENV=test node ./built/boot/entry.js",
|
||||
"migrate": "pnpm typeorm migration:run -d ormconfig.js",
|
||||
"revert": "pnpm typeorm migration:revert -d ormconfig.js",
|
||||
"cli": "node ./built/boot/cli.js",
|
||||
"check:connect": "node ./scripts/check_connect.js",
|
||||
"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",
|
||||
@@ -33,21 +34,22 @@
|
||||
"test:fed": "pnpm jest:fed",
|
||||
"test-and-coverage": "pnpm jest-and-coverage",
|
||||
"test-and-coverage:e2e": "pnpm build && pnpm build:test && pnpm jest-and-coverage:e2e",
|
||||
"check-migrations": "node scripts/check_migrations_clean.js",
|
||||
"generate-api-json": "node ./scripts/generate_api_json.js"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@swc/core-android-arm64": "1.3.11",
|
||||
"@swc/core-darwin-arm64": "1.11.29",
|
||||
"@swc/core-darwin-x64": "1.11.29",
|
||||
"@swc/core-darwin-arm64": "1.13.4",
|
||||
"@swc/core-darwin-x64": "1.13.4",
|
||||
"@swc/core-freebsd-x64": "1.3.11",
|
||||
"@swc/core-linux-arm-gnueabihf": "1.11.29",
|
||||
"@swc/core-linux-arm64-gnu": "1.11.29",
|
||||
"@swc/core-linux-arm64-musl": "1.11.29",
|
||||
"@swc/core-linux-x64-gnu": "1.11.29",
|
||||
"@swc/core-linux-x64-musl": "1.11.29",
|
||||
"@swc/core-win32-arm64-msvc": "1.11.29",
|
||||
"@swc/core-win32-ia32-msvc": "1.11.29",
|
||||
"@swc/core-win32-x64-msvc": "1.11.29",
|
||||
"@swc/core-linux-arm-gnueabihf": "1.13.4",
|
||||
"@swc/core-linux-arm64-gnu": "1.13.4",
|
||||
"@swc/core-linux-arm64-musl": "1.13.4",
|
||||
"@swc/core-linux-x64-gnu": "1.13.4",
|
||||
"@swc/core-linux-x64-musl": "1.13.4",
|
||||
"@swc/core-win32-arm64-msvc": "1.13.4",
|
||||
"@swc/core-win32-ia32-msvc": "1.13.4",
|
||||
"@swc/core-win32-x64-msvc": "1.13.4",
|
||||
"@tensorflow/tfjs": "4.22.0",
|
||||
"@tensorflow/tfjs-node": "4.22.0",
|
||||
"bufferutil": "4.0.9",
|
||||
@@ -67,9 +69,9 @@
|
||||
"utf-8-validate": "6.0.5"
|
||||
},
|
||||
"dependencies": {
|
||||
"@aws-sdk/client-s3": "3.817.0",
|
||||
"@aws-sdk/lib-storage": "3.817.0",
|
||||
"@discordapp/twemoji": "15.1.0",
|
||||
"@aws-sdk/client-s3": "3.873.0",
|
||||
"@aws-sdk/lib-storage": "3.873.0",
|
||||
"@discordapp/twemoji": "16.0.1",
|
||||
"@fastify/accepts": "5.0.2",
|
||||
"@fastify/cookie": "11.0.2",
|
||||
"@fastify/cors": "10.1.0",
|
||||
@@ -79,20 +81,20 @@
|
||||
"@fastify/static": "8.2.0",
|
||||
"@fastify/view": "10.0.2",
|
||||
"@misskey-dev/sharp-read-bmp": "1.2.0",
|
||||
"@misskey-dev/summaly": "5.2.1",
|
||||
"@napi-rs/canvas": "0.1.70",
|
||||
"@nestjs/common": "11.1.2",
|
||||
"@nestjs/core": "11.1.2",
|
||||
"@nestjs/testing": "11.1.2",
|
||||
"@misskey-dev/summaly": "5.2.3",
|
||||
"@napi-rs/canvas": "0.1.77",
|
||||
"@nestjs/common": "11.1.6",
|
||||
"@nestjs/core": "11.1.6",
|
||||
"@nestjs/testing": "11.1.6",
|
||||
"@peertube/http-signature": "1.7.0",
|
||||
"@sentry/node": "8.55.0",
|
||||
"@sentry/profiling-node": "8.55.0",
|
||||
"@simplewebauthn/server": "12.0.0",
|
||||
"@sinonjs/fake-timers": "11.3.1",
|
||||
"@smithy/node-http-handler": "2.5.0",
|
||||
"@swc/cli": "0.7.7",
|
||||
"@swc/core": "1.11.29",
|
||||
"@twemoji/parser": "15.1.1",
|
||||
"@swc/cli": "0.7.8",
|
||||
"@swc/core": "1.13.4",
|
||||
"@twemoji/parser": "16.0.0",
|
||||
"@types/redis-info": "3.0.3",
|
||||
"accepts": "1.3.8",
|
||||
"ajv": "8.17.1",
|
||||
@@ -101,10 +103,10 @@
|
||||
"bcryptjs": "2.4.3",
|
||||
"blurhash": "2.0.5",
|
||||
"body-parser": "1.20.3",
|
||||
"bullmq": "5.53.0",
|
||||
"bullmq": "5.58.1",
|
||||
"cacheable-lookup": "7.0.0",
|
||||
"cbor": "9.0.2",
|
||||
"chalk": "5.4.1",
|
||||
"chalk": "5.6.0",
|
||||
"chalk-template": "1.1.0",
|
||||
"chokidar": "4.0.3",
|
||||
"cli-highlight": "2.1.11",
|
||||
@@ -112,18 +114,18 @@
|
||||
"content-disposition": "0.5.4",
|
||||
"date-fns": "2.30.0",
|
||||
"deep-email-validator": "0.1.21",
|
||||
"fastify": "5.3.3",
|
||||
"fastify": "5.5.0",
|
||||
"fastify-raw-body": "5.0.0",
|
||||
"feed": "4.2.2",
|
||||
"file-type": "19.6.0",
|
||||
"fluent-ffmpeg": "2.1.3",
|
||||
"form-data": "4.0.2",
|
||||
"form-data": "4.0.4",
|
||||
"got": "14.4.7",
|
||||
"happy-dom": "16.8.1",
|
||||
"hpagent": "1.2.0",
|
||||
"htmlescape": "1.1.1",
|
||||
"http-link-header": "1.1.3",
|
||||
"ioredis": "5.6.1",
|
||||
"ioredis": "5.7.0",
|
||||
"ip-cidr": "4.0.2",
|
||||
"ipaddr.js": "2.2.0",
|
||||
"is-svg": "5.1.0",
|
||||
@@ -133,9 +135,9 @@
|
||||
"jsonld": "8.3.3",
|
||||
"jsrsasign": "11.1.0",
|
||||
"juice": "11.0.1",
|
||||
"meilisearch": "0.50.0",
|
||||
"mfm-js": "0.24.0",
|
||||
"microformats-parser": "2.0.2",
|
||||
"meilisearch": "0.52.0",
|
||||
"mfm-js": "0.25.0",
|
||||
"microformats-parser": "2.0.4",
|
||||
"mime-types": "2.1.35",
|
||||
"misskey-js": "workspace:*",
|
||||
"misskey-reversi": "workspace:*",
|
||||
@@ -149,9 +151,9 @@
|
||||
"oauth2orize": "1.12.0",
|
||||
"oauth2orize-pkce": "0.1.2",
|
||||
"os-utils": "0.0.14",
|
||||
"otpauth": "9.4.0",
|
||||
"otpauth": "9.4.1",
|
||||
"parse5": "7.3.0",
|
||||
"pg": "8.16.0",
|
||||
"pg": "8.16.3",
|
||||
"pkce-challenge": "4.1.0",
|
||||
"probe-image-size": "7.2.3",
|
||||
"promise-limit": "2.7.0",
|
||||
@@ -173,31 +175,31 @@
|
||||
"slacc": "0.0.10",
|
||||
"strict-event-emitter-types": "2.0.0",
|
||||
"stringz": "2.1.0",
|
||||
"systeminformation": "5.27.1",
|
||||
"systeminformation": "5.27.7",
|
||||
"tinycolor2": "1.6.0",
|
||||
"tmp": "0.2.3",
|
||||
"tmp": "0.2.5",
|
||||
"tsc-alias": "1.8.16",
|
||||
"tsconfig-paths": "4.2.0",
|
||||
"typeorm": "0.3.24",
|
||||
"typescript": "5.8.3",
|
||||
"typeorm": "0.3.26",
|
||||
"typescript": "5.9.2",
|
||||
"ulid": "2.4.0",
|
||||
"vary": "1.1.2",
|
||||
"web-push": "3.6.7",
|
||||
"ws": "8.18.2",
|
||||
"ws": "8.18.3",
|
||||
"xev": "3.0.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@jest/globals": "29.7.0",
|
||||
"@nestjs/platform-express": "10.4.18",
|
||||
"@sentry/vue": "9.22.0",
|
||||
"@nestjs/platform-express": "10.4.20",
|
||||
"@sentry/vue": "9.46.0",
|
||||
"@simplewebauthn/types": "12.0.0",
|
||||
"@swc/jest": "0.2.38",
|
||||
"@swc/jest": "0.2.39",
|
||||
"@types/accepts": "1.3.7",
|
||||
"@types/archiver": "6.0.3",
|
||||
"@types/bcryptjs": "2.4.6",
|
||||
"@types/body-parser": "1.19.5",
|
||||
"@types/body-parser": "1.19.6",
|
||||
"@types/color-convert": "2.0.4",
|
||||
"@types/content-disposition": "0.5.8",
|
||||
"@types/content-disposition": "0.5.9",
|
||||
"@types/fluent-ffmpeg": "2.1.27",
|
||||
"@types/htmlescape": "1.1.3",
|
||||
"@types/http-link-header": "1.0.7",
|
||||
@@ -208,12 +210,12 @@
|
||||
"@types/jsrsasign": "10.5.15",
|
||||
"@types/mime-types": "2.1.4",
|
||||
"@types/ms": "0.7.34",
|
||||
"@types/node": "22.15.21",
|
||||
"@types/nodemailer": "6.4.17",
|
||||
"@types/node": "22.17.2",
|
||||
"@types/nodemailer": "6.4.19",
|
||||
"@types/oauth": "0.9.6",
|
||||
"@types/oauth2orize": "1.11.5",
|
||||
"@types/oauth2orize-pkce": "0.1.2",
|
||||
"@types/pg": "8.15.2",
|
||||
"@types/pg": "8.15.5",
|
||||
"@types/pug": "2.0.10",
|
||||
"@types/qrcode": "1.5.5",
|
||||
"@types/random-seed": "0.3.5",
|
||||
@@ -229,11 +231,11 @@
|
||||
"@types/vary": "1.1.3",
|
||||
"@types/web-push": "3.6.4",
|
||||
"@types/ws": "8.18.1",
|
||||
"@typescript-eslint/eslint-plugin": "8.32.1",
|
||||
"@typescript-eslint/parser": "8.32.1",
|
||||
"@typescript-eslint/eslint-plugin": "8.40.0",
|
||||
"@typescript-eslint/parser": "8.40.0",
|
||||
"aws-sdk-client-mock": "4.1.0",
|
||||
"cross-env": "7.0.3",
|
||||
"eslint-plugin-import": "2.31.0",
|
||||
"eslint-plugin-import": "2.32.0",
|
||||
"execa": "8.0.1",
|
||||
"fkill": "9.0.0",
|
||||
"jest": "29.7.0",
|
||||
@@ -241,6 +243,6 @@
|
||||
"nodemon": "3.1.10",
|
||||
"pid-port": "1.0.2",
|
||||
"simple-oauth2": "5.1.0",
|
||||
"supertest": "7.1.1"
|
||||
"supertest": "7.1.4"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
// This script checks if the database migrations has been generated correctly.
|
||||
|
||||
import dataSource from '../ormconfig.js';
|
||||
|
||||
await dataSource.initialize();
|
||||
|
||||
const sqlInMemory = await dataSource.driver.createSchemaBuilder().log();
|
||||
|
||||
if (sqlInMemory.upQueries.length > 0 || sqlInMemory.downQueries.length > 0) {
|
||||
console.error('There are several pending migrations. Please make sure you have generated the migrations correctly, or configured entities class correctly.');
|
||||
for (const query of sqlInMemory.upQueries) {
|
||||
console.error(`- ${query.query}`);
|
||||
}
|
||||
for (const query of sqlInMemory.downQueries) {
|
||||
console.error(`- ${query.query}`);
|
||||
}
|
||||
process.exit(1);
|
||||
} else {
|
||||
console.log('All migrations are clean.');
|
||||
process.exit(0);
|
||||
}
|
||||
@@ -42,7 +42,7 @@ async function killProc() {
|
||||
'./node_modules/nodemon/bin/nodemon.js',
|
||||
[
|
||||
'-w', 'src',
|
||||
'-e', 'ts,js,mjs,cjs,json',
|
||||
'-e', 'ts,js,mjs,cjs,json,pug',
|
||||
'--exec', 'pnpm', 'run', 'build',
|
||||
],
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
@@ -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 {}
|
||||
@@ -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;
|
||||
driveUrl: string;
|
||||
userAgent: string;
|
||||
frontendEntry: string;
|
||||
frontendEntry: { file: string | null };
|
||||
frontendManifestExists: boolean;
|
||||
frontendEmbedEntry: string;
|
||||
frontendEmbedEntry: { file: string | null };
|
||||
frontendEmbedManifestExists: boolean;
|
||||
mediaProxy: string;
|
||||
externalMediaProxyEnabled: boolean;
|
||||
@@ -235,10 +235,10 @@ export function loadConfig(): Config {
|
||||
const frontendEmbedManifestExists = fs.existsSync(_dirname + '/../../../built/_frontend_embed_vite_/manifest.json');
|
||||
const frontendManifest = frontendManifestExists ?
|
||||
JSON.parse(fs.readFileSync(`${_dirname}/../../../built/_frontend_vite_/manifest.json`, 'utf-8'))
|
||||
: { 'src/_boot_.ts': { file: 'src/_boot_.ts' } };
|
||||
: { 'src/_boot_.ts': { file: null } };
|
||||
const frontendEmbedManifest = frontendEmbedManifestExists ?
|
||||
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;
|
||||
|
||||
|
||||
@@ -331,6 +331,16 @@ export class ChatService {
|
||||
await redisPipeline.exec();
|
||||
}
|
||||
|
||||
@bindThis
|
||||
public async readAllChatMessages(
|
||||
readerId: MiUser['id'],
|
||||
): Promise<void> {
|
||||
const redisPipeline = this.redisClient.pipeline();
|
||||
// TODO: newUserChatMessageExists とか newRoomChatMessageExists も消したい(けどキーの列挙が必要になって面倒)
|
||||
redisPipeline.del(`newChatMessagesExists:${readerId}`);
|
||||
await redisPipeline.exec();
|
||||
}
|
||||
|
||||
@bindThis
|
||||
public findMessageById(messageId: MiChatMessage['id']) {
|
||||
return this.chatMessagesRepository.findOneBy({ id: messageId });
|
||||
|
||||
@@ -44,6 +44,7 @@ import { ModerationLogService } from './ModerationLogService.js';
|
||||
import { NoteCreateService } from './NoteCreateService.js';
|
||||
import { NoteDeleteService } from './NoteDeleteService.js';
|
||||
import { NotePiningService } from './NotePiningService.js';
|
||||
import { NoteDraftService } from './NoteDraftService.js';
|
||||
import { NotificationService } from './NotificationService.js';
|
||||
import { PollService } from './PollService.js';
|
||||
import { PushNotificationService } from './PushNotificationService.js';
|
||||
@@ -77,6 +78,7 @@ import { ChannelFollowingService } from './ChannelFollowingService.js';
|
||||
import { ChatService } from './ChatService.js';
|
||||
import { RegistryApiService } from './RegistryApiService.js';
|
||||
import { ReversiService } from './ReversiService.js';
|
||||
import { PageService } from './PageService.js';
|
||||
|
||||
import { ChartLoggerService } from './chart/ChartLoggerService.js';
|
||||
import FederationChart from './chart/charts/federation.js';
|
||||
@@ -118,6 +120,7 @@ import { RenoteMutingEntityService } from './entities/RenoteMutingEntityService.
|
||||
import { NoteEntityService } from './entities/NoteEntityService.js';
|
||||
import { NoteFavoriteEntityService } from './entities/NoteFavoriteEntityService.js';
|
||||
import { NoteReactionEntityService } from './entities/NoteReactionEntityService.js';
|
||||
import { NoteDraftEntityService } from './entities/NoteDraftEntityService.js';
|
||||
import { NotificationEntityService } from './entities/NotificationEntityService.js';
|
||||
import { PageEntityService } from './entities/PageEntityService.js';
|
||||
import { PageLikeEntityService } from './entities/PageLikeEntityService.js';
|
||||
@@ -185,6 +188,7 @@ const $ModerationLogService: Provider = { provide: 'ModerationLogService', useEx
|
||||
const $NoteCreateService: Provider = { provide: 'NoteCreateService', useExisting: NoteCreateService };
|
||||
const $NoteDeleteService: Provider = { provide: 'NoteDeleteService', useExisting: NoteDeleteService };
|
||||
const $NotePiningService: Provider = { provide: 'NotePiningService', useExisting: NotePiningService };
|
||||
const $NoteDraftService: Provider = { provide: 'NoteDraftService', useExisting: NoteDraftService };
|
||||
const $NotificationService: Provider = { provide: 'NotificationService', useExisting: NotificationService };
|
||||
const $PollService: Provider = { provide: 'PollService', useExisting: PollService };
|
||||
const $SystemAccountService: Provider = { provide: 'SystemAccountService', useExisting: SystemAccountService };
|
||||
@@ -224,6 +228,7 @@ const $ChannelFollowingService: Provider = { provide: 'ChannelFollowingService',
|
||||
const $ChatService: Provider = { provide: 'ChatService', useExisting: ChatService };
|
||||
const $RegistryApiService: Provider = { provide: 'RegistryApiService', useExisting: RegistryApiService };
|
||||
const $ReversiService: Provider = { provide: 'ReversiService', useExisting: ReversiService };
|
||||
const $PageService: Provider = { provide: 'PageService', useExisting: PageService };
|
||||
|
||||
const $ChartLoggerService: Provider = { provide: 'ChartLoggerService', useExisting: ChartLoggerService };
|
||||
const $FederationChart: Provider = { provide: 'FederationChart', useExisting: FederationChart };
|
||||
@@ -266,6 +271,7 @@ const $RenoteMutingEntityService: Provider = { provide: 'RenoteMutingEntityServi
|
||||
const $NoteEntityService: Provider = { provide: 'NoteEntityService', useExisting: NoteEntityService };
|
||||
const $NoteFavoriteEntityService: Provider = { provide: 'NoteFavoriteEntityService', useExisting: NoteFavoriteEntityService };
|
||||
const $NoteReactionEntityService: Provider = { provide: 'NoteReactionEntityService', useExisting: NoteReactionEntityService };
|
||||
const $NoteDraftEntityService: Provider = { provide: 'NoteDraftEntityService', useExisting: NoteDraftEntityService };
|
||||
const $NotificationEntityService: Provider = { provide: 'NotificationEntityService', useExisting: NotificationEntityService };
|
||||
const $PageEntityService: Provider = { provide: 'PageEntityService', useExisting: PageEntityService };
|
||||
const $PageLikeEntityService: Provider = { provide: 'PageLikeEntityService', useExisting: PageLikeEntityService };
|
||||
@@ -335,6 +341,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
|
||||
NoteCreateService,
|
||||
NoteDeleteService,
|
||||
NotePiningService,
|
||||
NoteDraftService,
|
||||
NotificationService,
|
||||
PollService,
|
||||
SystemAccountService,
|
||||
@@ -374,6 +381,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
|
||||
ChatService,
|
||||
RegistryApiService,
|
||||
ReversiService,
|
||||
PageService,
|
||||
|
||||
ChartLoggerService,
|
||||
FederationChart,
|
||||
@@ -416,6 +424,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
|
||||
NoteEntityService,
|
||||
NoteFavoriteEntityService,
|
||||
NoteReactionEntityService,
|
||||
NoteDraftEntityService,
|
||||
NotificationEntityService,
|
||||
PageEntityService,
|
||||
PageLikeEntityService,
|
||||
@@ -481,6 +490,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
|
||||
$NoteCreateService,
|
||||
$NoteDeleteService,
|
||||
$NotePiningService,
|
||||
$NoteDraftService,
|
||||
$NotificationService,
|
||||
$PollService,
|
||||
$SystemAccountService,
|
||||
@@ -520,6 +530,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
|
||||
$ChatService,
|
||||
$RegistryApiService,
|
||||
$ReversiService,
|
||||
$PageService,
|
||||
|
||||
$ChartLoggerService,
|
||||
$FederationChart,
|
||||
@@ -562,6 +573,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
|
||||
$NoteEntityService,
|
||||
$NoteFavoriteEntityService,
|
||||
$NoteReactionEntityService,
|
||||
$NoteDraftEntityService,
|
||||
$NotificationEntityService,
|
||||
$PageEntityService,
|
||||
$PageLikeEntityService,
|
||||
@@ -628,6 +640,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
|
||||
NoteCreateService,
|
||||
NoteDeleteService,
|
||||
NotePiningService,
|
||||
NoteDraftService,
|
||||
NotificationService,
|
||||
PollService,
|
||||
SystemAccountService,
|
||||
@@ -667,6 +680,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
|
||||
ChatService,
|
||||
RegistryApiService,
|
||||
ReversiService,
|
||||
PageService,
|
||||
|
||||
FederationChart,
|
||||
NotesChart,
|
||||
@@ -708,6 +722,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
|
||||
NoteEntityService,
|
||||
NoteFavoriteEntityService,
|
||||
NoteReactionEntityService,
|
||||
NoteDraftEntityService,
|
||||
NotificationEntityService,
|
||||
PageEntityService,
|
||||
PageLikeEntityService,
|
||||
@@ -773,6 +788,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
|
||||
$NoteCreateService,
|
||||
$NoteDeleteService,
|
||||
$NotePiningService,
|
||||
$NoteDraftService,
|
||||
$NotificationService,
|
||||
$PollService,
|
||||
$SystemAccountService,
|
||||
@@ -811,6 +827,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
|
||||
$ChatService,
|
||||
$RegistryApiService,
|
||||
$ReversiService,
|
||||
$PageService,
|
||||
|
||||
$FederationChart,
|
||||
$NotesChart,
|
||||
@@ -852,6 +869,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
|
||||
$NoteEntityService,
|
||||
$NoteFavoriteEntityService,
|
||||
$NoteReactionEntityService,
|
||||
$NoteDraftEntityService,
|
||||
$NotificationEntityService,
|
||||
$PageEntityService,
|
||||
$PageLikeEntityService,
|
||||
|
||||
@@ -803,14 +803,14 @@ export class DriveService {
|
||||
await Promise.all(promises);
|
||||
}
|
||||
|
||||
this.deletePostProcess(file, isExpired, deleter);
|
||||
await this.deletePostProcess(file, isExpired, deleter);
|
||||
}
|
||||
|
||||
@bindThis
|
||||
private async deletePostProcess(file: MiDriveFile, isExpired = false, deleter?: MiUser) {
|
||||
// リモートファイル期限切れ削除後は直リンクにする
|
||||
if (isExpired && file.userHost !== null && file.uri != null) {
|
||||
this.driveFilesRepository.update(file.id, {
|
||||
await this.driveFilesRepository.update(file.id, {
|
||||
isLink: true,
|
||||
url: file.uri,
|
||||
thumbnailUrl: null,
|
||||
@@ -822,7 +822,7 @@ export class DriveService {
|
||||
webpublicAccessKey: 'webpublic-' + randomUUID(),
|
||||
});
|
||||
} else {
|
||||
this.driveFilesRepository.delete(file.id);
|
||||
await this.driveFilesRepository.delete(file.id);
|
||||
}
|
||||
|
||||
this.driveChart.update(file, false);
|
||||
|
||||
@@ -145,7 +145,10 @@ export class EmailService {
|
||||
try {
|
||||
// TODO: htmlサニタイズ
|
||||
const info = await transporter.sendMail({
|
||||
from: this.meta.email!,
|
||||
from: this.meta.name ? {
|
||||
name: this.meta.name,
|
||||
address: this.meta.email!,
|
||||
} : this.meta.email!,
|
||||
to: to,
|
||||
subject: subject,
|
||||
text: text,
|
||||
|
||||
@@ -20,6 +20,8 @@ import { CacheService } from '@/core/CacheService.js';
|
||||
import { isReply } from '@/misc/is-reply.js';
|
||||
import { isInstanceMuted } from '@/misc/is-instance-muted.js';
|
||||
|
||||
type NoteFilter = (note: MiNote) => boolean;
|
||||
|
||||
type TimelineOptions = {
|
||||
untilId: string | null,
|
||||
sinceId: string | null,
|
||||
@@ -28,7 +30,7 @@ type TimelineOptions = {
|
||||
me?: { id: MiUser['id'] } | undefined | null,
|
||||
useDbFallback: boolean,
|
||||
redisTimelines: FanoutTimelineName[],
|
||||
noteFilter?: (note: MiNote) => boolean,
|
||||
noteFilter?: NoteFilter,
|
||||
alwaysIncludeMyNotes?: boolean;
|
||||
ignoreAuthorFromBlock?: boolean;
|
||||
ignoreAuthorFromMute?: boolean;
|
||||
@@ -79,7 +81,7 @@ export class FanoutTimelineEndpointService {
|
||||
const shouldFallbackToDb = noteIds.length === 0 || ps.sinceId != null && ps.sinceId < oldestNoteId;
|
||||
|
||||
if (!shouldFallbackToDb) {
|
||||
let filter = ps.noteFilter ?? (_note => true);
|
||||
let filter = ps.noteFilter ?? (_note => true) as NoteFilter;
|
||||
|
||||
if (ps.alwaysIncludeMyNotes && ps.me) {
|
||||
const me = ps.me;
|
||||
@@ -145,15 +147,11 @@ export class FanoutTimelineEndpointService {
|
||||
{
|
||||
const parentFilter = filter;
|
||||
filter = (note) => {
|
||||
const noteJoined = note as MiNote & {
|
||||
renoteUser: MiUser | null;
|
||||
replyUser: MiUser | null;
|
||||
};
|
||||
if (!ps.ignoreAuthorFromUserSuspension) {
|
||||
if (note.user!.isSuspended) return false;
|
||||
}
|
||||
if (note.userId !== note.renoteUserId && noteJoined.renoteUser?.isSuspended) return false;
|
||||
if (note.userId !== note.replyUserId && noteJoined.replyUser?.isSuspended) return false;
|
||||
if (note.userId !== note.renoteUserId && note.renote?.user?.isSuspended) return false;
|
||||
if (note.userId !== note.replyUserId && note.reply?.user?.isSuspended) return false;
|
||||
|
||||
return parentFilter(note);
|
||||
};
|
||||
@@ -200,7 +198,7 @@ export class FanoutTimelineEndpointService {
|
||||
return await ps.dbFallback(ps.untilId, ps.sinceId, ps.limit);
|
||||
}
|
||||
|
||||
private async getAndFilterFromDb(noteIds: string[], noteFilter: (note: MiNote) => boolean, idCompare: (a: string, b: string) => number): Promise<MiNote[]> {
|
||||
private async getAndFilterFromDb(noteIds: string[], noteFilter: NoteFilter, idCompare: (a: string, b: string) => number): Promise<MiNote[]> {
|
||||
const query = this.notesRepository.createQueryBuilder('note')
|
||||
.where('note.id IN (:...noteIds)', { noteIds: noteIds })
|
||||
.innerJoinAndSelect('note.user', 'user')
|
||||
|
||||
@@ -4,8 +4,11 @@
|
||||
*/
|
||||
|
||||
import { Inject, Injectable } from '@nestjs/common';
|
||||
import { Brackets } from 'typeorm';
|
||||
import { DI } from '@/di-symbols.js';
|
||||
import { type FlashsRepository } from '@/models/_.js';
|
||||
import { type FlashLikesRepository, MiUser, type FlashsRepository } from '@/models/_.js';
|
||||
import { QueryService } from '@/core/QueryService.js';
|
||||
import { sqlLikeEscape } from '@/misc/sql-like-escape.js';
|
||||
|
||||
/**
|
||||
* MisskeyPlay関係のService
|
||||
@@ -15,6 +18,11 @@ export class FlashService {
|
||||
constructor(
|
||||
@Inject(DI.flashsRepository)
|
||||
private flashRepository: FlashsRepository,
|
||||
|
||||
@Inject(DI.flashLikesRepository)
|
||||
private flashLikesRepository: FlashLikesRepository,
|
||||
|
||||
private queryService: QueryService,
|
||||
) {
|
||||
}
|
||||
|
||||
@@ -37,4 +45,43 @@ export class FlashService {
|
||||
|
||||
return await builder.getMany();
|
||||
}
|
||||
|
||||
public async myLikes(meId: MiUser['id'], opts: { sinceId?: string, untilId?: string, sinceDate?: number, untilDate?: number, limit?: number, search?: string | null }) {
|
||||
const query = this.queryService.makePaginationQuery(this.flashLikesRepository.createQueryBuilder('like'), opts.sinceId, opts.untilId, opts.sinceDate, opts.untilDate)
|
||||
.andWhere('like.userId = :meId', { meId })
|
||||
.leftJoinAndSelect('like.flash', 'flash');
|
||||
|
||||
if (opts.search != null) {
|
||||
for (const word of opts.search.trim().split(' ')) {
|
||||
query.andWhere(new Brackets(qb => {
|
||||
qb.orWhere('flash.title ILIKE :search', { search: `%${sqlLikeEscape(word)}%` });
|
||||
qb.orWhere('flash.summary ILIKE :search', { search: `%${sqlLikeEscape(word)}%` });
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
||||
const likes = await query
|
||||
.limit(opts.limit)
|
||||
.getMany();
|
||||
|
||||
return likes;
|
||||
}
|
||||
|
||||
public async search(searchQuery: string, opts: { sinceId?: string, untilId?: string, sinceDate?: number, untilDate?: number, limit?: number }) {
|
||||
const query = this.queryService.makePaginationQuery(this.flashRepository.createQueryBuilder('flash'), opts.sinceId, opts.untilId, opts.sinceDate, opts.untilDate)
|
||||
.andWhere('flash.visibility = \'public\'');
|
||||
|
||||
for (const word of searchQuery.trim().split(' ')) {
|
||||
query.andWhere(new Brackets(qb => {
|
||||
qb.orWhere('flash.title ILIKE :search', { search: `%${sqlLikeEscape(word)}%` });
|
||||
qb.orWhere('flash.summary ILIKE :search', { search: `%${sqlLikeEscape(word)}%` });
|
||||
}));
|
||||
}
|
||||
|
||||
const result = await query
|
||||
.limit(opts.limit)
|
||||
.getMany();
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
import * as http from 'node:http';
|
||||
import * as https from 'node:https';
|
||||
import * as net from 'node:net';
|
||||
import * as stream from 'node:stream';
|
||||
import ipaddr from 'ipaddr.js';
|
||||
import CacheableLookup from 'cacheable-lookup';
|
||||
import fetch from 'node-fetch';
|
||||
@@ -26,12 +27,6 @@ export type HttpRequestSendOptions = {
|
||||
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 {
|
||||
constructor(
|
||||
private config: Config,
|
||||
@@ -41,11 +36,11 @@ class HttpRequestServiceAgent extends http.Agent {
|
||||
}
|
||||
|
||||
@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)
|
||||
.on('connect', () => {
|
||||
const address = socket.remoteAddress;
|
||||
if (process.env.NODE_ENV === 'production') {
|
||||
if (socket instanceof net.Socket && process.env.NODE_ENV === 'production') {
|
||||
const address = socket.remoteAddress;
|
||||
if (address && ipaddr.isValid(address)) {
|
||||
if (this.isPrivateIp(address)) {
|
||||
socket.destroy(new Error(`Blocked address: ${address}`));
|
||||
@@ -80,11 +75,11 @@ class HttpsRequestServiceAgent extends https.Agent {
|
||||
}
|
||||
|
||||
@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)
|
||||
.on('connect', () => {
|
||||
const address = socket.remoteAddress;
|
||||
if (process.env.NODE_ENV === 'production') {
|
||||
if (socket instanceof net.Socket && process.env.NODE_ENV === 'production') {
|
||||
const address = socket.remoteAddress;
|
||||
if (address && ipaddr.isValid(address)) {
|
||||
if (this.isPrivateIp(address)) {
|
||||
socket.destroy(new Error(`Blocked address: ${address}`));
|
||||
|
||||
@@ -421,7 +421,7 @@ export class NoteCreateService implements OnApplicationShutdown {
|
||||
emojis,
|
||||
userId: user.id,
|
||||
localOnly: data.localOnly!,
|
||||
reactionAcceptance: data.reactionAcceptance,
|
||||
reactionAcceptance: data.reactionAcceptance ?? null,
|
||||
visibility: data.visibility as any,
|
||||
visibleUserIds: data.visibility === 'specified'
|
||||
? data.visibleUsers
|
||||
@@ -483,7 +483,11 @@ export class NoteCreateService implements OnApplicationShutdown {
|
||||
await this.notesRepository.insert(insert);
|
||||
}
|
||||
|
||||
return insert;
|
||||
return {
|
||||
...insert,
|
||||
reply: data.reply ?? null,
|
||||
renote: data.renote ?? null,
|
||||
};
|
||||
} catch (e) {
|
||||
// duplicate key error
|
||||
if (isDuplicateKeyValueError(e)) {
|
||||
|
||||
@@ -62,7 +62,6 @@ export class NoteDeleteService {
|
||||
*/
|
||||
async delete(user: { id: MiUser['id']; uri: MiUser['uri']; host: MiUser['host']; isBot: MiUser['isBot']; }, note: MiNote, quiet = false, deleter?: MiUser) {
|
||||
const deletedAt = new Date();
|
||||
const cascadingNotes = await this.findCascadingNotes(note);
|
||||
|
||||
if (note.replyId) {
|
||||
await this.notesRepository.decrement({ id: note.replyId }, 'repliesCount', 1);
|
||||
@@ -90,15 +89,6 @@ export class NoteDeleteService {
|
||||
|
||||
this.deliverToConcerned(user, note, content);
|
||||
}
|
||||
|
||||
// also deliver delete activity to cascaded notes
|
||||
const federatedLocalCascadingNotes = (cascadingNotes).filter(note => !note.localOnly && note.userHost == null); // filter out local-only notes
|
||||
for (const cascadingNote of federatedLocalCascadingNotes) {
|
||||
if (!cascadingNote.user) continue;
|
||||
if (!this.userEntityService.isLocalUser(cascadingNote.user)) continue;
|
||||
const content = this.apRendererService.addContext(this.apRendererService.renderDelete(this.apRendererService.renderTombstone(`${this.config.url}/notes/${cascadingNote.id}`), cascadingNote.user));
|
||||
this.deliverToConcerned(cascadingNote.user, cascadingNote, content);
|
||||
}
|
||||
//#endregion
|
||||
|
||||
this.notesChart.update(note, false);
|
||||
@@ -118,9 +108,6 @@ export class NoteDeleteService {
|
||||
}
|
||||
}
|
||||
|
||||
for (const cascadingNote of cascadingNotes) {
|
||||
this.searchService.unindexNote(cascadingNote);
|
||||
}
|
||||
this.searchService.unindexNote(note);
|
||||
|
||||
await this.notesRepository.delete({
|
||||
@@ -140,29 +127,6 @@ export class NoteDeleteService {
|
||||
}
|
||||
}
|
||||
|
||||
@bindThis
|
||||
private async findCascadingNotes(note: MiNote): Promise<MiNote[]> {
|
||||
const recursive = async (noteId: string): Promise<MiNote[]> => {
|
||||
const query = this.notesRepository.createQueryBuilder('note')
|
||||
.where('note.replyId = :noteId', { noteId })
|
||||
.orWhere(new Brackets(q => {
|
||||
q.where('note.renoteId = :noteId', { noteId })
|
||||
.andWhere('note.text IS NOT NULL');
|
||||
}))
|
||||
.leftJoinAndSelect('note.user', 'user');
|
||||
const replies = await query.getMany();
|
||||
|
||||
return [
|
||||
replies,
|
||||
...await Promise.all(replies.map(reply => recursive(reply.id))),
|
||||
].flat();
|
||||
};
|
||||
|
||||
const cascadingNotes: MiNote[] = await recursive(note.id);
|
||||
|
||||
return cascadingNotes;
|
||||
}
|
||||
|
||||
@bindThis
|
||||
private async getMentionedRemoteUsers(note: MiNote) {
|
||||
const where = [] as any[];
|
||||
|
||||
@@ -0,0 +1,314 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
import { Inject, Injectable } from '@nestjs/common';
|
||||
import { In } from 'typeorm';
|
||||
import type { noteVisibilities, noteReactionAcceptances } from '@/types.js';
|
||||
import { DI } from '@/di-symbols.js';
|
||||
import type { MiNoteDraft, NoteDraftsRepository, MiNote, MiDriveFile, MiChannel, UsersRepository, DriveFilesRepository, NotesRepository, BlockingsRepository, ChannelsRepository } from '@/models/_.js';
|
||||
import { bindThis } from '@/decorators.js';
|
||||
import { RoleService } from '@/core/RoleService.js';
|
||||
import { IdService } from '@/core/IdService.js';
|
||||
import type { MiLocalUser, MiUser } from '@/models/User.js';
|
||||
import { IPoll } from '@/models/Poll.js';
|
||||
import { IdentifiableError } from '@/misc/identifiable-error.js';
|
||||
import { isRenote, isQuote } from '@/misc/is-renote.js';
|
||||
import { NoteEntityService } from '@/core/entities/NoteEntityService.js';
|
||||
|
||||
export type NoteDraftOptions = {
|
||||
replyId?: MiNote['id'] | null;
|
||||
renoteId?: MiNote['id'] | null;
|
||||
text?: string | null;
|
||||
cw?: string | null;
|
||||
localOnly?: boolean | null;
|
||||
reactionAcceptance?: typeof noteReactionAcceptances[number];
|
||||
visibility?: typeof noteVisibilities[number];
|
||||
fileIds?: MiDriveFile['id'][];
|
||||
visibleUserIds?: MiUser['id'][];
|
||||
hashtag?: string;
|
||||
channelId?: MiChannel['id'] | null;
|
||||
poll?: (IPoll & { expiredAfter?: number | null }) | null;
|
||||
};
|
||||
|
||||
@Injectable()
|
||||
export class NoteDraftService {
|
||||
constructor(
|
||||
@Inject(DI.blockingsRepository)
|
||||
private blockingsRepository: BlockingsRepository,
|
||||
|
||||
@Inject(DI.noteDraftsRepository)
|
||||
private noteDraftsRepository: NoteDraftsRepository,
|
||||
|
||||
@Inject(DI.notesRepository)
|
||||
private notesRepository: NotesRepository,
|
||||
|
||||
@Inject(DI.usersRepository)
|
||||
private usersRepository: UsersRepository,
|
||||
|
||||
@Inject(DI.driveFilesRepository)
|
||||
private driveFilesRepository: DriveFilesRepository,
|
||||
|
||||
@Inject(DI.channelsRepository)
|
||||
private channelsRepository: ChannelsRepository,
|
||||
|
||||
private roleService: RoleService,
|
||||
private idService: IdService,
|
||||
private noteEntityService: NoteEntityService,
|
||||
) {
|
||||
}
|
||||
|
||||
@bindThis
|
||||
public async get(me: MiLocalUser, draftId: MiNoteDraft['id']): Promise<MiNoteDraft | null> {
|
||||
const draft = await this.noteDraftsRepository.findOneBy({
|
||||
id: draftId,
|
||||
userId: me.id,
|
||||
});
|
||||
|
||||
return draft;
|
||||
}
|
||||
|
||||
@bindThis
|
||||
public async create(me: MiLocalUser, data: NoteDraftOptions): Promise<MiNoteDraft> {
|
||||
//#region check draft limit
|
||||
|
||||
const currentCount = await this.noteDraftsRepository.countBy({
|
||||
userId: me.id,
|
||||
});
|
||||
if (currentCount >= (await this.roleService.getUserPolicies(me.id)).noteDraftLimit) {
|
||||
throw new IdentifiableError('9ee33bbe-fde3-4c71-9b51-e50492c6b9c8', 'Too many drafts');
|
||||
}
|
||||
//#endregion
|
||||
|
||||
if (data.poll) {
|
||||
if (typeof data.poll.expiresAt === 'number') {
|
||||
if (data.poll.expiresAt < Date.now()) {
|
||||
throw new IdentifiableError('04da457d-b083-4055-9082-955525eda5a5', 'Cannot create expired poll');
|
||||
}
|
||||
} else if (typeof data.poll.expiredAfter === 'number') {
|
||||
data.poll.expiresAt = new Date(Date.now() + data.poll.expiredAfter);
|
||||
}
|
||||
}
|
||||
|
||||
const appliedDraft = await this.checkAndSetDraftNoteOptions(me, this.noteDraftsRepository.create(), data);
|
||||
|
||||
appliedDraft.id = this.idService.gen();
|
||||
appliedDraft.userId = me.id;
|
||||
const draft = this.noteDraftsRepository.save(appliedDraft);
|
||||
|
||||
return draft;
|
||||
}
|
||||
|
||||
@bindThis
|
||||
public async update(me: MiLocalUser, draftId: MiNoteDraft['id'], data: NoteDraftOptions): Promise<MiNoteDraft> {
|
||||
const draft = await this.noteDraftsRepository.findOneBy({
|
||||
id: draftId,
|
||||
userId: me.id,
|
||||
});
|
||||
|
||||
if (draft == null) {
|
||||
throw new IdentifiableError('49cd6b9d-848e-41ee-b0b9-adaca711a6b1', 'No such note draft');
|
||||
}
|
||||
|
||||
if (data.poll) {
|
||||
if (typeof data.poll.expiresAt === 'number') {
|
||||
if (data.poll.expiresAt < Date.now()) {
|
||||
throw new IdentifiableError('04da457d-b083-4055-9082-955525eda5a5', 'Cannot create expired poll');
|
||||
}
|
||||
} else if (typeof data.poll.expiredAfter === 'number') {
|
||||
data.poll.expiresAt = new Date(Date.now() + data.poll.expiredAfter);
|
||||
}
|
||||
}
|
||||
|
||||
const appliedDraft = await this.checkAndSetDraftNoteOptions(me, draft, data);
|
||||
|
||||
return await this.noteDraftsRepository.save(appliedDraft);
|
||||
}
|
||||
|
||||
@bindThis
|
||||
public async delete(me: MiLocalUser, draftId: MiNoteDraft['id']): Promise<void> {
|
||||
const draft = await this.noteDraftsRepository.findOneBy({
|
||||
id: draftId,
|
||||
userId: me.id,
|
||||
});
|
||||
|
||||
if (draft == null) {
|
||||
throw new IdentifiableError('49cd6b9d-848e-41ee-b0b9-adaca711a6b1', 'No such note draft');
|
||||
}
|
||||
|
||||
await this.noteDraftsRepository.delete(draft.id);
|
||||
}
|
||||
|
||||
@bindThis
|
||||
public async getDraft(me: MiLocalUser, draftId: MiNoteDraft['id']): Promise<MiNoteDraft> {
|
||||
const draft = await this.noteDraftsRepository.findOneBy({
|
||||
id: draftId,
|
||||
userId: me.id,
|
||||
});
|
||||
|
||||
if (draft == null) {
|
||||
throw new IdentifiableError('49cd6b9d-848e-41ee-b0b9-adaca711a6b1', 'No such note draft');
|
||||
}
|
||||
|
||||
return draft;
|
||||
}
|
||||
|
||||
// 関連エンティティを取得し紐づける部分を共通化する
|
||||
@bindThis
|
||||
public async checkAndSetDraftNoteOptions(
|
||||
me: MiLocalUser,
|
||||
draft: MiNoteDraft,
|
||||
data: NoteDraftOptions,
|
||||
): Promise<MiNoteDraft> {
|
||||
data.visibility ??= 'public';
|
||||
data.localOnly ??= false;
|
||||
if (data.reactionAcceptance === undefined) data.reactionAcceptance = null;
|
||||
if (data.channelId != null) {
|
||||
data.visibility = 'public';
|
||||
data.visibleUserIds = [];
|
||||
data.localOnly = true;
|
||||
}
|
||||
|
||||
let appliedDraft = draft;
|
||||
|
||||
//#region visibleUsers
|
||||
let visibleUsers: MiUser[] = [];
|
||||
if (data.visibleUserIds != null) {
|
||||
visibleUsers = await this.usersRepository.findBy({
|
||||
id: In(data.visibleUserIds),
|
||||
});
|
||||
}
|
||||
//#endregion
|
||||
|
||||
//#region files
|
||||
let files: MiDriveFile[] = [];
|
||||
const fileIds = data.fileIds ?? null;
|
||||
if (fileIds != null) {
|
||||
files = await this.driveFilesRepository.createQueryBuilder('file')
|
||||
.where('file.userId = :userId AND file.id IN (:...fileIds)', {
|
||||
userId: me.id,
|
||||
fileIds: fileIds,
|
||||
})
|
||||
.orderBy('array_position(ARRAY[:...fileIds], "id"::text)')
|
||||
.setParameters({ fileIds })
|
||||
.getMany();
|
||||
|
||||
if (files.length !== fileIds.length) {
|
||||
throw new IdentifiableError('b6992544-63e7-67f0-fa7f-32444b1b5306', 'No such drive file');
|
||||
}
|
||||
}
|
||||
//#endregion
|
||||
|
||||
//#region renote
|
||||
let renote: MiNote | null = null;
|
||||
if (data.renoteId != null) {
|
||||
renote = await this.notesRepository.findOneBy({ id: data.renoteId });
|
||||
|
||||
if (renote == null) {
|
||||
throw new IdentifiableError('64929870-2540-4d11-af41-3b484d78c956', 'No such renote');
|
||||
} else if (isRenote(renote) && !isQuote(renote)) {
|
||||
throw new IdentifiableError('76cc5583-5a14-4ad3-8717-0298507e32db', 'Cannot renote');
|
||||
}
|
||||
|
||||
// Check blocking
|
||||
if (renote.userId !== me.id) {
|
||||
const blockExist = await this.blockingsRepository.exists({
|
||||
where: {
|
||||
blockerId: renote.userId,
|
||||
blockeeId: me.id,
|
||||
},
|
||||
});
|
||||
if (blockExist) {
|
||||
throw new IdentifiableError('075ca298-e6e7-485a-b570-51a128bb5168', 'You have been blocked by the user');
|
||||
}
|
||||
}
|
||||
|
||||
if (renote.visibility === 'followers' && renote.userId !== me.id) {
|
||||
// 他人のfollowers noteはreject
|
||||
throw new IdentifiableError('81eb8188-aea1-4e35-9a8f-3334a3be9855', 'Cannot Renote Due to Visibility');
|
||||
} else if (renote.visibility === 'specified') {
|
||||
// specified / direct noteはreject
|
||||
throw new IdentifiableError('81eb8188-aea1-4e35-9a8f-3334a3be9855', 'Cannot Renote Due to Visibility');
|
||||
}
|
||||
|
||||
if (renote.channelId && renote.channelId !== data.channelId) {
|
||||
// チャンネルのノートに対しリノート要求がきたとき、チャンネル外へのリノート可否をチェック
|
||||
// リノートのユースケースのうち、チャンネル内→チャンネル外は少数だと考えられるため、JOINはせず必要な時に都度取得する
|
||||
const renoteChannel = await this.channelsRepository.findOneBy({ id: renote.channelId });
|
||||
if (renoteChannel == null) {
|
||||
// リノートしたいノートが書き込まれているチャンネルがない
|
||||
throw new IdentifiableError('6815399a-6f13-4069-b60d-ed5156249d12', 'No such channel');
|
||||
} else if (!renoteChannel.allowRenoteToExternal) {
|
||||
// リノート作成のリクエストだが、対象チャンネルがリノート禁止だった場合
|
||||
throw new IdentifiableError('ed1952ac-2d26-4957-8b30-2deda76bedf7', 'Cannot Renote to External');
|
||||
}
|
||||
}
|
||||
}
|
||||
//#endregion
|
||||
|
||||
//#region reply
|
||||
let reply: MiNote | null = null;
|
||||
if (data.replyId != null) {
|
||||
// Fetch reply
|
||||
reply = await this.notesRepository.findOneBy({ id: data.replyId });
|
||||
|
||||
if (reply == null) {
|
||||
throw new IdentifiableError('c4721841-22fc-4bb7-ad3d-897ef1d375b5', 'No such reply');
|
||||
} else if (isRenote(reply) && !isQuote(reply)) {
|
||||
throw new IdentifiableError('e6c10b57-2c09-4da3-bd4d-eda05d51d140', 'Cannot reply To Pure Renote');
|
||||
} else if (!await this.noteEntityService.isVisibleForMe(reply, me.id)) {
|
||||
throw new IdentifiableError('593c323c-6b6a-4501-a25c-2f36bd2a93d6', 'Cannot reply To Invisible Note');
|
||||
} else if (reply.visibility === 'specified' && data.visibility !== 'specified') {
|
||||
throw new IdentifiableError('215dbc76-336c-4d2a-9605-95766ba7dab0', 'Cannot reply To Specified Note With Extended Visibility');
|
||||
}
|
||||
|
||||
// Check blocking
|
||||
if (reply.userId !== me.id) {
|
||||
const blockExist = await this.blockingsRepository.exists({
|
||||
where: {
|
||||
blockerId: reply.userId,
|
||||
blockeeId: me.id,
|
||||
},
|
||||
});
|
||||
if (blockExist) {
|
||||
throw new IdentifiableError('075ca298-e6e7-485a-b570-51a128bb5168', 'You have been blocked by the user');
|
||||
}
|
||||
}
|
||||
}
|
||||
//#endregion
|
||||
|
||||
//#region channel
|
||||
let channel: MiChannel | null = null;
|
||||
if (data.channelId != null) {
|
||||
channel = await this.channelsRepository.findOneBy({ id: data.channelId, isArchived: false });
|
||||
|
||||
if (channel == null) {
|
||||
throw new IdentifiableError('6815399a-6f13-4069-b60d-ed5156249d12', 'No such channel');
|
||||
}
|
||||
}
|
||||
//#endregion
|
||||
|
||||
appliedDraft = {
|
||||
...appliedDraft,
|
||||
visibility: data.visibility,
|
||||
cw: data.cw ?? null,
|
||||
fileIds: fileIds ?? [],
|
||||
replyId: data.replyId ?? null,
|
||||
renoteId: data.renoteId ?? null,
|
||||
channelId: data.channelId ?? null,
|
||||
text: data.text ?? null,
|
||||
hashtag: data.hashtag ?? null,
|
||||
hasPoll: data.poll != null,
|
||||
pollChoices: data.poll ? data.poll.choices : [],
|
||||
pollMultiple: data.poll ? data.poll.multiple : false,
|
||||
pollExpiresAt: data.poll ? data.poll.expiresAt : null,
|
||||
pollExpiredAfter: data.poll ? data.poll.expiredAfter ?? null : null,
|
||||
visibleUserIds: data.visibleUserIds ?? [],
|
||||
localOnly: data.localOnly,
|
||||
reactionAcceptance: data.reactionAcceptance,
|
||||
} satisfies MiNoteDraft;
|
||||
|
||||
return appliedDraft;
|
||||
}
|
||||
}
|
||||
@@ -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];
|
||||
}
|
||||
}
|
||||
@@ -360,7 +360,7 @@ export class QueryService {
|
||||
public generateSuspendedUserQueryForNote(q: SelectQueryBuilder<any>, excludeAuthor?: boolean): void {
|
||||
if (excludeAuthor) {
|
||||
const brakets = (user: string) => new Brackets(qb => qb
|
||||
.where(`note.${user}Id IS NULL`)
|
||||
.where(`${user}.id IS NULL`) // そもそもreplyやrenoteではない、もしくはleftjoinなどでuserが存在しなかった場合を考慮
|
||||
.orWhere(`user.id = ${user}.id`)
|
||||
.orWhere(`${user}.isSuspended = FALSE`));
|
||||
q
|
||||
@@ -368,7 +368,7 @@ export class QueryService {
|
||||
.andWhere(brakets('renoteUser'));
|
||||
} else {
|
||||
const brakets = (user: string) => new Brackets(qb => qb
|
||||
.where(`note.${user}Id IS NULL`)
|
||||
.where(`${user}.id IS NULL`) // そもそもreplyやrenoteではない、もしくはleftjoinなどでuserが存在しなかった場合を考慮
|
||||
.orWhere(`${user}.isSuspended = FALSE`));
|
||||
q
|
||||
.andWhere('user.isSuspended = FALSE')
|
||||
|
||||
@@ -17,6 +17,7 @@ import { bindThis } from '@/decorators.js';
|
||||
import type { Antenna } from '@/server/api/endpoints/i/import-antennas.js';
|
||||
import { ApRequestCreator } from '@/core/activitypub/ApRequestService.js';
|
||||
import { type SystemWebhookPayload } from '@/core/SystemWebhookService.js';
|
||||
import type { Packed } from '@/misc/json-schema.js';
|
||||
import { type UserWebhookPayload } from './UserWebhookService.js';
|
||||
import type {
|
||||
DbJobData,
|
||||
@@ -39,7 +40,6 @@ import type {
|
||||
} from './QueueModule.js';
|
||||
import type httpSignature from '@peertube/http-signature';
|
||||
import type * as Bull from 'bullmq';
|
||||
import type { Packed } from '@/misc/json-schema.js';
|
||||
|
||||
export const QUEUE_TYPES = [
|
||||
'system',
|
||||
@@ -53,6 +53,37 @@ export const QUEUE_TYPES = [
|
||||
'systemWebhookDeliver',
|
||||
] as const;
|
||||
|
||||
const REPEATABLE_SYSTEM_JOB_DEF = [{
|
||||
name: 'tickCharts',
|
||||
pattern: '55 * * * *',
|
||||
}, {
|
||||
name: 'resyncCharts',
|
||||
pattern: '0 0 * * *',
|
||||
}, {
|
||||
name: 'cleanCharts',
|
||||
pattern: '0 0 * * *',
|
||||
}, {
|
||||
name: 'aggregateRetention',
|
||||
pattern: '0 0 * * *',
|
||||
}, {
|
||||
name: 'clean',
|
||||
pattern: '0 0 * * *',
|
||||
}, {
|
||||
name: 'checkExpiredMutings',
|
||||
pattern: '*/5 * * * *',
|
||||
}, {
|
||||
name: 'bakeBufferedReactions',
|
||||
pattern: '0 0 * * *',
|
||||
}, {
|
||||
name: 'checkModeratorsActivity',
|
||||
// 毎時30分に起動
|
||||
pattern: '30 * * * *',
|
||||
}, {
|
||||
name: 'cleanRemoteNotes',
|
||||
// 毎日午前4時に起動(最も人の少ない時間帯)
|
||||
pattern: '0 4 * * *',
|
||||
}];
|
||||
|
||||
@Injectable()
|
||||
export class QueueService {
|
||||
constructor(
|
||||
@@ -69,61 +100,31 @@ export class QueueService {
|
||||
@Inject('queue:userWebhookDeliver') public userWebhookDeliverQueue: UserWebhookDeliverQueue,
|
||||
@Inject('queue:systemWebhookDeliver') public systemWebhookDeliverQueue: SystemWebhookDeliverQueue,
|
||||
) {
|
||||
this.systemQueue.add('tickCharts', {
|
||||
}, {
|
||||
repeat: { pattern: '55 * * * *' },
|
||||
removeOnComplete: 10,
|
||||
removeOnFail: 30,
|
||||
});
|
||||
for (const def of REPEATABLE_SYSTEM_JOB_DEF) {
|
||||
this.systemQueue.upsertJobScheduler(def.name, {
|
||||
pattern: def.pattern,
|
||||
immediately: false,
|
||||
}, {
|
||||
name: def.name,
|
||||
opts: {
|
||||
// 期限ではなくcountで設定したいが、ジョブごとではなくキュー全体でカウントされるため、高頻度で実行されるジョブによって低頻度で実行されるジョブのログが消えることになる
|
||||
removeOnComplete: {
|
||||
age: 3600 * 24 * 7, // keep up to 7 days
|
||||
},
|
||||
removeOnFail: {
|
||||
age: 3600 * 24 * 7, // keep up to 7 days
|
||||
},
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
this.systemQueue.add('resyncCharts', {
|
||||
}, {
|
||||
repeat: { pattern: '0 0 * * *' },
|
||||
removeOnComplete: 10,
|
||||
removeOnFail: 30,
|
||||
});
|
||||
|
||||
this.systemQueue.add('cleanCharts', {
|
||||
}, {
|
||||
repeat: { pattern: '0 0 * * *' },
|
||||
removeOnComplete: 10,
|
||||
removeOnFail: 30,
|
||||
});
|
||||
|
||||
this.systemQueue.add('aggregateRetention', {
|
||||
}, {
|
||||
repeat: { pattern: '0 0 * * *' },
|
||||
removeOnComplete: 10,
|
||||
removeOnFail: 30,
|
||||
});
|
||||
|
||||
this.systemQueue.add('clean', {
|
||||
}, {
|
||||
repeat: { pattern: '0 0 * * *' },
|
||||
removeOnComplete: 10,
|
||||
removeOnFail: 30,
|
||||
});
|
||||
|
||||
this.systemQueue.add('checkExpiredMutings', {
|
||||
}, {
|
||||
repeat: { pattern: '*/5 * * * *' },
|
||||
removeOnComplete: 10,
|
||||
removeOnFail: 30,
|
||||
});
|
||||
|
||||
this.systemQueue.add('bakeBufferedReactions', {
|
||||
}, {
|
||||
repeat: { pattern: '0 0 * * *' },
|
||||
removeOnComplete: 10,
|
||||
removeOnFail: 30,
|
||||
});
|
||||
|
||||
this.systemQueue.add('checkModeratorsActivity', {
|
||||
}, {
|
||||
// 毎時30分に起動
|
||||
repeat: { pattern: '30 * * * *' },
|
||||
removeOnComplete: 10,
|
||||
removeOnFail: 30,
|
||||
// 古いバージョンで作成され現在使われなくなったrepeatableジョブをクリーンアップ
|
||||
this.systemQueue.getJobSchedulers().then(schedulers => {
|
||||
for (const scheduler of schedulers) {
|
||||
if (!REPEATABLE_SYSTEM_JOB_DEF.some(def => def.name === scheduler.key)) {
|
||||
this.systemQueue.removeJobScheduler(scheduler.key);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -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
|
||||
public async queueGetJobs(queueType: typeof QUEUE_TYPES[number], jobTypes: JobType[], search?: string) {
|
||||
const RETURN_LIMIT = 100;
|
||||
|
||||
@@ -43,6 +43,7 @@ export type RolePolicies = {
|
||||
canManageCustomEmojis: boolean;
|
||||
canManageAvatarDecorations: boolean;
|
||||
canSearchNotes: boolean;
|
||||
canSearchUsers: boolean;
|
||||
canUseTranslator: boolean;
|
||||
canHideAds: boolean;
|
||||
driveCapacityMb: number;
|
||||
@@ -66,6 +67,8 @@ export type RolePolicies = {
|
||||
canImportUserLists: boolean;
|
||||
chatAvailability: 'available' | 'readonly' | 'unavailable';
|
||||
uploadableFileTypes: string[];
|
||||
noteDraftLimit: number;
|
||||
watermarkAvailable: boolean;
|
||||
};
|
||||
|
||||
export const DEFAULT_POLICIES: RolePolicies = {
|
||||
@@ -80,6 +83,7 @@ export const DEFAULT_POLICIES: RolePolicies = {
|
||||
canManageCustomEmojis: false,
|
||||
canManageAvatarDecorations: false,
|
||||
canSearchNotes: false,
|
||||
canSearchUsers: true,
|
||||
canUseTranslator: true,
|
||||
canHideAds: false,
|
||||
driveCapacityMb: 100,
|
||||
@@ -109,6 +113,8 @@ export const DEFAULT_POLICIES: RolePolicies = {
|
||||
'video/*',
|
||||
'audio/*',
|
||||
],
|
||||
noteDraftLimit: 10,
|
||||
watermarkAvailable: true,
|
||||
};
|
||||
|
||||
@Injectable()
|
||||
@@ -398,6 +404,7 @@ export class RoleService implements OnApplicationShutdown, OnModuleInit {
|
||||
canManageCustomEmojis: calc('canManageCustomEmojis', vs => vs.some(v => v === true)),
|
||||
canManageAvatarDecorations: calc('canManageAvatarDecorations', 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)),
|
||||
canHideAds: calc('canHideAds', vs => vs.some(v => v === true)),
|
||||
driveCapacityMb: calc('driveCapacityMb', vs => Math.max(...vs)),
|
||||
@@ -430,6 +437,8 @@ export class RoleService implements OnApplicationShutdown, OnModuleInit {
|
||||
}
|
||||
return [...set];
|
||||
}),
|
||||
noteDraftLimit: calc('noteDraftLimit', vs => Math.max(...vs)),
|
||||
watermarkAvailable: calc('watermarkAvailable', vs => vs.some(v => v === true)),
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -227,9 +227,9 @@ export class SearchService {
|
||||
|
||||
if (opts.host) {
|
||||
if (opts.host === '.') {
|
||||
query.andWhere('user.host IS NULL');
|
||||
query.andWhere('note.userHost IS NULL');
|
||||
} else {
|
||||
query.andWhere('user.host = :host', { host: opts.host });
|
||||
query.andWhere('note.userHost = :host', { host: opts.host });
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -93,6 +93,11 @@ export class SignupService {
|
||||
if (isPreserved) {
|
||||
throw new Error('USED_USERNAME');
|
||||
}
|
||||
|
||||
const hasProhibitedWords = this.utilityService.isKeyWordIncluded(username.toLowerCase(), this.meta.prohibitedWordsForNameOfUser);
|
||||
if (hasProhibitedWords) {
|
||||
throw new Error('USED_USERNAME');
|
||||
}
|
||||
}
|
||||
|
||||
const keyPair = await new Promise<string[]>((res, rej) =>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user