Compare commits
410 Commits
13.12.0-be
...
fix-storyb
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5d4ab609f5 | ||
|
|
0370b4dfab | ||
|
|
a516557bb6 | ||
|
|
b6a432fd7b | ||
|
|
7c4e2b658d | ||
|
|
bb2eb57a35 | ||
|
|
698fa84b5a | ||
|
|
2184323ae7 | ||
|
|
0ba5edc6aa | ||
|
|
3fde3fbc4d | ||
|
|
cd9affd568 | ||
|
|
24a0063af0 | ||
|
|
74e565b71c | ||
|
|
b97694b083 | ||
|
|
6ed7d1a76e | ||
|
|
c277934328 | ||
|
|
9845ccec5b | ||
|
|
cf3e39178b | ||
|
|
48d3341462 | ||
|
|
791ae608a5 | ||
|
|
f4d1fcaf67 | ||
|
|
239ea39d6f | ||
|
|
63e21a4ee3 | ||
|
|
1a096c557e | ||
|
|
53b1684c39 | ||
|
|
9dd53527ca | ||
|
|
59046d583d | ||
|
|
5059d4d7e1 | ||
|
|
74a05ec739 | ||
|
|
60366a4558 | ||
|
|
7ec07d5fd2 | ||
|
|
5b8fa25a12 | ||
|
|
51df3de66d | ||
|
|
246d167c81 | ||
|
|
d2764944cf | ||
|
|
ac6d6fdeb8 | ||
|
|
6a015341ef | ||
|
|
3796da6836 | ||
|
|
36d5deeb61 | ||
|
|
e40a0b98e4 | ||
|
|
0fbb46c981 | ||
|
|
081a14d6f3 | ||
|
|
b056e8f5eb | ||
|
|
15683370f0 | ||
|
|
644023316e | ||
|
|
c2d7008cff | ||
|
|
bd843863d0 | ||
|
|
8ec96ad1e0 | ||
|
|
4f876c9e8d | ||
|
|
3c6175d959 | ||
|
|
1f181536ae | ||
|
|
383d6a2485 | ||
|
|
588465566b | ||
|
|
b318789354 | ||
|
|
0b8e0fa91b | ||
|
|
8daca59ca6 | ||
|
|
d84796588c | ||
|
|
4c879b3a33 | ||
|
|
eacc90debc | ||
|
|
2606167f0d | ||
|
|
f76b3edbdd | ||
|
|
aef7b0238b | ||
|
|
cbb58b1cfc | ||
|
|
bc4d27410c | ||
|
|
d5c4e77c44 | ||
|
|
e987af4e4f | ||
|
|
bc61f37faa | ||
|
|
c065b97140 | ||
|
|
0137af892a | ||
|
|
06bf5c1ff1 | ||
|
|
9e955d20c4 | ||
|
|
165c53a547 | ||
|
|
3597da5c49 | ||
|
|
4a7da723b3 | ||
|
|
d2f8ed95aa | ||
|
|
6b2c92cb68 | ||
|
|
dc8763215a | ||
|
|
9959f5bd04 | ||
|
|
be143f91b2 | ||
|
|
ac4245dce1 | ||
|
|
1ab9f096c3 | ||
|
|
8f94b36732 | ||
|
|
22227fa641 | ||
|
|
92d9946f59 | ||
|
|
526fa8bf3f | ||
|
|
aa92df4e50 | ||
|
|
61e7eb8ff1 | ||
|
|
84d3a06637 | ||
|
|
60cddf87d8 | ||
|
|
6157616b37 | ||
|
|
af3258dc79 | ||
|
|
734c41aba5 | ||
|
|
a1327fa9e1 | ||
|
|
1b1f82a2e2 | ||
|
|
d48172e9d1 | ||
|
|
58a898dfe0 | ||
|
|
d23ad8b511 | ||
|
|
8099bc24e1 | ||
|
|
ef354e94f2 | ||
|
|
7bb8c71543 | ||
|
|
a2c0573f84 | ||
|
|
5d922e3084 | ||
|
|
f0b5860b9c | ||
|
|
fd4c43786a | ||
|
|
60cc7f62e6 | ||
|
|
dc27ba6f03 | ||
|
|
3fe1c862f6 | ||
|
|
33a2c0b59e | ||
|
|
e8c5117b2d | ||
|
|
e2261b63e9 | ||
|
|
8c7bcdf998 | ||
|
|
f5dfb64a52 | ||
|
|
fa7fd9ce25 | ||
|
|
63971f1cd8 | ||
|
|
b1313fbca8 | ||
|
|
f1b0c54f6e | ||
|
|
94c09f1441 | ||
|
|
46222d0258 | ||
|
|
c59a30ec09 | ||
|
|
f3a16bcd6d | ||
|
|
f69627939b | ||
|
|
e8420ad90b | ||
|
|
6182a1cb2c | ||
|
|
308ab8f177 | ||
|
|
359fbd78c1 | ||
|
|
dd733ec1d0 | ||
|
|
5e680500e5 | ||
|
|
0465e74521 | ||
|
|
34a32a8334 | ||
|
|
3941c73db0 | ||
|
|
703f3a8e37 | ||
|
|
6032c2be1c | ||
|
|
13870c63b0 | ||
|
|
88083925ce | ||
|
|
95b2148bfe | ||
|
|
8ccf954065 | ||
|
|
e456c6a9c1 | ||
|
|
68c5426fd5 | ||
|
|
29856a9129 | ||
|
|
f4943bc5bb | ||
|
|
aeb8955ca2 | ||
|
|
981e6f996e | ||
|
|
8263cc0094 | ||
|
|
fa051a2a5f | ||
|
|
ce252143c3 | ||
|
|
259be258aa | ||
|
|
2d5bb40ad0 | ||
|
|
db7fb1c688 | ||
|
|
6b0685a25c | ||
|
|
618d07158a | ||
|
|
a63a417fd4 | ||
|
|
4443dba717 | ||
|
|
565c502bbf | ||
|
|
9e716fd813 | ||
|
|
34e1b52b38 | ||
|
|
0cb3c7481c | ||
|
|
db623dda22 | ||
|
|
1177528c25 | ||
|
|
a7abf941c0 | ||
|
|
5230ec883e | ||
|
|
482b00df77 | ||
|
|
91d790bbb6 | ||
|
|
40295ae57d | ||
|
|
3857cd589f | ||
|
|
9eaca966a4 | ||
|
|
8bdf0dd135 | ||
|
|
eedc8049db | ||
|
|
23f272cc7d | ||
|
|
15450b18e8 | ||
|
|
50aeaf7498 | ||
|
|
861bfa06a8 | ||
|
|
3b30ee3130 | ||
|
|
f6830885d7 | ||
|
|
ff56511638 | ||
|
|
337dd97b49 | ||
|
|
146e89edd0 | ||
|
|
cd82748889 | ||
|
|
2c0b10b0ee | ||
|
|
6c09361ec6 | ||
|
|
3089a86c8e | ||
|
|
ec2f05d4f7 | ||
|
|
31a8129cb9 | ||
|
|
8cc6c2c864 | ||
|
|
a4de927df8 | ||
|
|
a2c77a0944 | ||
|
|
d8a564c6a0 | ||
|
|
ff94b64c91 | ||
|
|
1cc616b86c | ||
|
|
6addf9002c | ||
|
|
6dd219b6c7 | ||
|
|
a535142e82 | ||
|
|
9521519cb8 | ||
|
|
e11f82c300 | ||
|
|
aba0755880 | ||
|
|
821bb1c476 | ||
|
|
14da0a65f7 | ||
|
|
8e5d31eb5c | ||
|
|
f8f3304164 | ||
|
|
d7efdd7123 | ||
|
|
4256e20a7f | ||
|
|
f2d9e3105d | ||
|
|
a6cd97ca9a | ||
|
|
a4a171781b | ||
|
|
8e8e3dbe4e | ||
|
|
de71845b35 | ||
|
|
a3a47b8d35 | ||
|
|
f091007882 | ||
|
|
8f14b42e81 | ||
|
|
8b33a70fc4 | ||
|
|
dc031b1d07 | ||
|
|
f551b6d15e | ||
|
|
0a2ac58b82 | ||
|
|
3c07d3fc08 | ||
|
|
c6ea7f754c | ||
|
|
101e8d7adb | ||
|
|
19b96ff650 | ||
|
|
bd66a3f148 | ||
|
|
7f235275c9 | ||
|
|
3097bb6c7d | ||
|
|
f469f555e8 | ||
|
|
115167e6da | ||
|
|
a1200ad886 | ||
|
|
25d1b66ca4 | ||
|
|
c5f9b1c224 | ||
|
|
8c66fad96b | ||
|
|
afa4cd9112 | ||
|
|
f930eaee02 | ||
|
|
b35b9bc27f | ||
|
|
4790ddfad6 | ||
|
|
b6f21b6edb | ||
|
|
fd7b77c542 | ||
|
|
7cbd852fe5 | ||
|
|
a80003cde5 | ||
|
|
fb54c58a66 | ||
|
|
3a924f3dc6 | ||
|
|
11d22c7b73 | ||
|
|
a879607479 | ||
|
|
98aef974df | ||
|
|
cf46816687 | ||
|
|
eee1e74174 | ||
|
|
8050f89d7e | ||
|
|
406e5d297b | ||
|
|
10634b3615 | ||
|
|
fd03e2e1a7 | ||
|
|
6cc86272f3 | ||
|
|
06b1250d47 | ||
|
|
31a7350a10 | ||
|
|
4129ac157a | ||
|
|
30cb791e93 | ||
|
|
1c57983bfd | ||
|
|
bdf08c8a54 | ||
|
|
0513ff8b4e | ||
|
|
62fe3bfb54 | ||
|
|
38a1d6693a | ||
|
|
d2eec3a9e4 | ||
|
|
1de774fa3d | ||
|
|
ed902658a9 | ||
|
|
acdcd7c623 | ||
|
|
b0344e07c4 | ||
|
|
9a6ce1e867 | ||
|
|
22a6bd6b22 | ||
|
|
38e6f3f776 | ||
|
|
ca75afe065 | ||
|
|
915ed39715 | ||
|
|
81fd94e635 | ||
|
|
05507a4bea | ||
|
|
d177f97928 | ||
|
|
30cb03a40d | ||
|
|
c685989e67 | ||
|
|
ee3f408c7d | ||
|
|
1eb35dd5bc | ||
|
|
15db0b8812 | ||
|
|
1b78c6a309 | ||
|
|
c713af8e23 | ||
|
|
bd6666173a | ||
|
|
02715f5d14 | ||
|
|
acd5e0b8f6 | ||
|
|
be2142bb13 | ||
|
|
4a703d7cf6 | ||
|
|
95470a40a7 | ||
|
|
56d4658b36 | ||
|
|
f68008b002 | ||
|
|
6a5ef5b6f2 | ||
|
|
95b9284e79 | ||
|
|
8317772436 | ||
|
|
0c0ae6ff90 | ||
|
|
d63b943116 | ||
|
|
dddbc1c894 | ||
|
|
f68c743f39 | ||
|
|
59255e11b8 | ||
|
|
3804c6e7ad | ||
|
|
527a13b77d | ||
|
|
a3423bad60 | ||
|
|
e3f9144608 | ||
|
|
231506772a | ||
|
|
db1098a180 | ||
|
|
7ce569424a | ||
|
|
9b5b3a4d1b | ||
|
|
6173cebdca | ||
|
|
6bb82cda37 | ||
|
|
dd60f1a533 | ||
|
|
45263f4cd0 | ||
|
|
747d323584 | ||
|
|
e707aadbcc | ||
|
|
7b012967d9 | ||
|
|
e126083e10 | ||
|
|
cbca48846c | ||
|
|
ca2ed0a59b | ||
|
|
5d22e113b2 | ||
|
|
ed3c137543 | ||
|
|
a35f0d43e4 | ||
|
|
153eed7d71 | ||
|
|
0d8e1c5421 | ||
|
|
d10d5a8d53 | ||
|
|
23f106a0c1 | ||
|
|
a7ee4aabcb | ||
|
|
d867fc00b6 | ||
|
|
60f504bbe2 | ||
|
|
f4e6d73a8a | ||
|
|
c066013c57 | ||
|
|
86f952e659 | ||
|
|
d36e44bc57 | ||
|
|
93629fb29d | ||
|
|
9ff088a830 | ||
|
|
55190e6b8b | ||
|
|
38391010af | ||
|
|
3d94dec7a9 | ||
|
|
636428c72e | ||
|
|
0717afc312 | ||
|
|
3d4a90b08a | ||
|
|
7cc555fd28 | ||
|
|
238d0fa667 | ||
|
|
30ff4592cc | ||
|
|
a979fb9207 | ||
|
|
f15f60d5b9 | ||
|
|
8c97c54cfa | ||
|
|
89a3195dfd | ||
|
|
1eaf287b9c | ||
|
|
9166a58c5f | ||
|
|
eef368abd0 | ||
|
|
f983e44d9e | ||
|
|
5be6438bbc | ||
|
|
d2e6b17a26 | ||
|
|
d1c2e4aaa0 | ||
|
|
6f1994c665 | ||
|
|
055dc6bb66 | ||
|
|
f06339b970 | ||
|
|
3370419b0a | ||
|
|
9bd4ad0fc1 | ||
|
|
23994d8f4e | ||
|
|
bb3c85d3a1 | ||
|
|
8328a66104 | ||
|
|
909ec8c38d | ||
|
|
b01a1b3c17 | ||
|
|
cbb779f60c | ||
|
|
8ddae83c40 | ||
|
|
1cc106b8de | ||
|
|
16eedb86a5 | ||
|
|
2b26a2f5e4 | ||
|
|
a65fa684ce | ||
|
|
0758c56c53 | ||
|
|
3c0dccc8b9 | ||
|
|
e18feb4183 | ||
|
|
9e464eaa63 | ||
|
|
8b352e4e56 | ||
|
|
26d85c8bed | ||
|
|
df924d18f1 | ||
|
|
177359689e | ||
|
|
b380dc53e1 | ||
|
|
8c30ca50a8 | ||
|
|
69afd0480e | ||
|
|
6d4d9f417b | ||
|
|
11ea1a2811 | ||
|
|
c15b75e477 | ||
|
|
ea9a95cd98 | ||
|
|
ed634b4b3d | ||
|
|
f9f115b66d | ||
|
|
02059fdee4 | ||
|
|
37c119e1f5 | ||
|
|
d75a7fd421 | ||
|
|
adf66154d2 | ||
|
|
9557579b67 | ||
|
|
341c42ebb9 | ||
|
|
574cfdfda6 | ||
|
|
0729678398 | ||
|
|
b545146bf9 | ||
|
|
7ae1d6511a | ||
|
|
0c4c4e7202 | ||
|
|
6a25015a78 | ||
|
|
ae5a72a2df | ||
|
|
baa45859c1 | ||
|
|
461f761aa6 | ||
|
|
6894e42674 | ||
|
|
22d6c7fe8a | ||
|
|
9e70b02648 | ||
|
|
64f5b2daa2 | ||
|
|
b2f6c67aa9 | ||
|
|
1c0ec222b4 | ||
|
|
80619260c1 | ||
|
|
e382f74bb3 | ||
|
|
c8343b2750 | ||
|
|
7feca2a60a | ||
|
|
aa28ddf762 | ||
|
|
5c54e12099 | ||
|
|
b16d7cc6c4 | ||
|
|
8f36a80775 | ||
|
|
a6e7c196ee | ||
|
|
a531b8aeee | ||
|
|
3510768fd5 | ||
|
|
34e958c3a7 |
@@ -103,6 +103,7 @@ redis:
|
|||||||
# port: 7700
|
# port: 7700
|
||||||
# apiKey: ''
|
# apiKey: ''
|
||||||
# ssl: true
|
# ssl: true
|
||||||
|
# index: ''
|
||||||
|
|
||||||
# ┌───────────────┐
|
# ┌───────────────┐
|
||||||
#───┘ ID generation └───────────────────────────────────────────
|
#───┘ ID generation └───────────────────────────────────────────
|
||||||
|
|||||||
@@ -103,6 +103,7 @@ redis:
|
|||||||
# port: 7700
|
# port: 7700
|
||||||
# apiKey: ''
|
# apiKey: ''
|
||||||
# ssl: true
|
# ssl: true
|
||||||
|
# index: ''
|
||||||
|
|
||||||
# ┌───────────────┐
|
# ┌───────────────┐
|
||||||
#───┘ ID generation └───────────────────────────────────────────
|
#───┘ ID generation └───────────────────────────────────────────
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
"features": {
|
"features": {
|
||||||
"ghcr.io/devcontainers-contrib/features/pnpm:2": {},
|
"ghcr.io/devcontainers-contrib/features/pnpm:2": {},
|
||||||
"ghcr.io/devcontainers/features/node:1": {
|
"ghcr.io/devcontainers/features/node:1": {
|
||||||
"version": "18.16.0"
|
"version": "20.3.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"forwardPorts": [3000],
|
"forwardPorts": [3000],
|
||||||
|
|||||||
@@ -103,6 +103,7 @@ redis:
|
|||||||
# port: 7700
|
# port: 7700
|
||||||
# apiKey: ''
|
# apiKey: ''
|
||||||
# ssl: true
|
# ssl: true
|
||||||
|
# index: ''
|
||||||
|
|
||||||
# ┌───────────────┐
|
# ┌───────────────┐
|
||||||
#───┘ ID generation └───────────────────────────────────────────
|
#───┘ ID generation └───────────────────────────────────────────
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ version: '3.8'
|
|||||||
|
|
||||||
services:
|
services:
|
||||||
app:
|
app:
|
||||||
build:
|
build:
|
||||||
context: .
|
context: .
|
||||||
dockerfile: Dockerfile
|
dockerfile: Dockerfile
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,10 @@ indent_size = 2
|
|||||||
charset = utf-8
|
charset = utf-8
|
||||||
insert_final_newline = true
|
insert_final_newline = true
|
||||||
end_of_line = lf
|
end_of_line = lf
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
|
||||||
|
[*.md]
|
||||||
|
trim_trailing_whitespace = false
|
||||||
|
|
||||||
[*.{yml,yaml}]
|
[*.{yml,yaml}]
|
||||||
indent_style = space
|
indent_style = space
|
||||||
|
|||||||
24
.github/ISSUE_TEMPLATE/01_bug-report.md
vendored
24
.github/ISSUE_TEMPLATE/01_bug-report.md
vendored
@@ -39,8 +39,22 @@ Please include errors from the developer console and/or server log files if you
|
|||||||
<!-- Tell us where on the platform it happens -->
|
<!-- Tell us where on the platform it happens -->
|
||||||
<!-- DO NOT WRITE "latest". Please provide the specific version. -->
|
<!-- DO NOT WRITE "latest". Please provide the specific version. -->
|
||||||
|
|
||||||
Misskey version:
|
### 💻 Frontend
|
||||||
PostgreSQL version:
|
* Model and OS of the device(s):
|
||||||
Redis version:
|
<!-- Example: MacBook Pro (14inch, 2021), macOS Ventura 13.4 -->
|
||||||
Your OS:
|
* Browser:
|
||||||
Your browser:
|
<!-- Example: Chrome 113.0.5672.126 -->
|
||||||
|
* Server URL:
|
||||||
|
<!-- Example: misskey.io -->
|
||||||
|
* Misskey:
|
||||||
|
13.x.x
|
||||||
|
|
||||||
|
### 🛰 Backend (for server admin)
|
||||||
|
<!-- If you are using a managed service, put that after the version. -->
|
||||||
|
|
||||||
|
* Installation Method or Hosting Service: <!-- Example: docker compose, k8s/docker, systemd, "Misskey install shell script", development environment -->
|
||||||
|
* Misskey: 13.x.x
|
||||||
|
* Node: 20.x.x
|
||||||
|
* PostgreSQL: 15.x.x
|
||||||
|
* Redis: 7.x.x
|
||||||
|
* OS and Architecture: <!-- Example: Ubuntu 22.04.2 LTS aarch64 -->
|
||||||
|
|||||||
1
.github/reviewer-lottery.yml
vendored
1
.github/reviewer-lottery.yml
vendored
@@ -6,5 +6,4 @@ groups:
|
|||||||
- syuilo
|
- syuilo
|
||||||
- acid-chicken
|
- acid-chicken
|
||||||
- EbiseLutica
|
- EbiseLutica
|
||||||
- rinsuki
|
|
||||||
- tamaina
|
- tamaina
|
||||||
|
|||||||
58
.github/workflows/storybook.yml
vendored
58
.github/workflows/storybook.yml
vendored
@@ -2,8 +2,10 @@ name: Storybook
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches-ignore:
|
branches:
|
||||||
- l10n_develop
|
- master
|
||||||
|
- develop
|
||||||
|
pull_request_target:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
@@ -14,15 +16,28 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3.3.0
|
- uses: actions/checkout@v3.3.0
|
||||||
|
if: github.event_name != 'pull_request_target'
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
submodules: true
|
submodules: true
|
||||||
|
- uses: actions/checkout@v3.3.0
|
||||||
|
if: github.event_name == 'pull_request_target'
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
submodules: true
|
||||||
|
ref: "refs/pull/${{ github.event.number }}/merge"
|
||||||
|
- name: Checkout actual HEAD
|
||||||
|
if: github.event_name == 'pull_request_target'
|
||||||
|
id: rev
|
||||||
|
run: |
|
||||||
|
echo "base=$(git rev-list --parents -n1 HEAD | cut -d" " -f2)" >> $GITHUB_OUTPUT
|
||||||
|
git checkout $(git rev-list --parents -n1 HEAD | cut -d" " -f3)
|
||||||
- name: Install pnpm
|
- name: Install pnpm
|
||||||
uses: pnpm/action-setup@v2
|
uses: pnpm/action-setup@v2
|
||||||
with:
|
with:
|
||||||
version: 8
|
version: 8
|
||||||
run_install: false
|
run_install: false
|
||||||
- name: Use Node.js 18.x
|
- name: Use Node.js 20.x
|
||||||
uses: actions/setup-node@v3.6.0
|
uses: actions/setup-node@v3.6.0
|
||||||
with:
|
with:
|
||||||
node-version-file: '.node-version'
|
node-version-file: '.node-version'
|
||||||
@@ -36,13 +51,13 @@ jobs:
|
|||||||
- name: Build storybook
|
- name: Build storybook
|
||||||
run: pnpm --filter frontend build-storybook
|
run: pnpm --filter frontend build-storybook
|
||||||
- name: Publish to Chromatic
|
- name: Publish to Chromatic
|
||||||
if: github.ref == 'refs/heads/master'
|
if: github.event_name != 'pull_request_target' && github.ref == 'refs/heads/master'
|
||||||
run: pnpm --filter frontend chromatic --exit-once-uploaded -d storybook-static
|
run: pnpm --filter frontend chromatic --exit-once-uploaded -d storybook-static
|
||||||
env:
|
env:
|
||||||
CHROMATIC_PROJECT_TOKEN: ${{ secrets.CHROMATIC_PROJECT_TOKEN }}
|
CHROMATIC_PROJECT_TOKEN: ${{ secrets.CHROMATIC_PROJECT_TOKEN }}
|
||||||
- name: Publish to Chromatic
|
- name: Publish to Chromatic
|
||||||
if: github.ref != 'refs/heads/master'
|
if: github.event_name != 'pull_request_target' && github.ref != 'refs/heads/master'
|
||||||
id: chromatic
|
id: chromatic_push
|
||||||
run: |
|
run: |
|
||||||
DIFF="${{ github.event.before }} HEAD"
|
DIFF="${{ github.event.before }} HEAD"
|
||||||
if [ "$DIFF" = "0000000000000000000000000000000000000000 HEAD" ]; then
|
if [ "$DIFF" = "0000000000000000000000000000000000000000 HEAD" ]; then
|
||||||
@@ -52,12 +67,35 @@ jobs:
|
|||||||
if [ "$CHROMATIC_PARAMETER" = " --skip" ]; then
|
if [ "$CHROMATIC_PARAMETER" = " --skip" ]; then
|
||||||
echo "skip=true" >> $GITHUB_OUTPUT
|
echo "skip=true" >> $GITHUB_OUTPUT
|
||||||
fi
|
fi
|
||||||
pnpm --filter frontend chromatic --exit-once-uploaded -d storybook-static $(echo "$CHROMATIC_PARAMETER")
|
if pnpm --filter frontend chromatic -d storybook-static $(echo "$CHROMATIC_PARAMETER"); then
|
||||||
|
echo "success=true" >> $GITHUB_OUTPUT
|
||||||
|
else
|
||||||
|
echo "success=false" >> $GITHUB_OUTPUT
|
||||||
|
fi
|
||||||
env:
|
env:
|
||||||
CHROMATIC_PROJECT_TOKEN: ${{ secrets.CHROMATIC_PROJECT_TOKEN }}
|
CHROMATIC_PROJECT_TOKEN: ${{ secrets.CHROMATIC_PROJECT_TOKEN }}
|
||||||
- name: Notify that Chromatic will skip testing
|
- name: Publish to Chromatic
|
||||||
|
if: github.event_name == 'pull_request_target'
|
||||||
|
id: chromatic_pull_request
|
||||||
|
run: |
|
||||||
|
DIFF="${{ steps.rev.outputs.base }} HEAD"
|
||||||
|
if [ "$DIFF" = "0000000000000000000000000000000000000000 HEAD" ]; then
|
||||||
|
DIFF="HEAD"
|
||||||
|
fi
|
||||||
|
CHROMATIC_PARAMETER="$(node packages/frontend/.storybook/changes.js $(git diff-tree --no-commit-id --name-only -r $(echo "$DIFF") | xargs))"
|
||||||
|
if [ "$CHROMATIC_PARAMETER" = " --skip" ]; then
|
||||||
|
echo "skip=true" >> $GITHUB_OUTPUT
|
||||||
|
fi
|
||||||
|
BRANCH="${{ github.event.pull_request.head.user.login }}:${{ github.event.pull_request.head.ref }}"
|
||||||
|
if [ "$BRANCH" = "misskey-dev:${{ github.event.pull_request.head.ref }}" ]; then
|
||||||
|
BRANCH="${{ github.event.pull_request.head.ref }}"
|
||||||
|
fi
|
||||||
|
pnpm --filter frontend chromatic --exit-once-uploaded -d storybook-static --branch-name $BRANCH $(echo "$CHROMATIC_PARAMETER")
|
||||||
|
env:
|
||||||
|
CHROMATIC_PROJECT_TOKEN: ${{ secrets.CHROMATIC_PROJECT_TOKEN }}
|
||||||
|
- name: Notify that Chromatic detects changes
|
||||||
uses: actions/github-script@v6.4.0
|
uses: actions/github-script@v6.4.0
|
||||||
if: github.ref != 'refs/heads/master' && github.ref != 'refs/heads/develop' && steps.chromatic.outputs.skip == 'true'
|
if: github.event_name != 'pull_request_target' && steps.chromatic_push.outputs.success == 'false'
|
||||||
with:
|
with:
|
||||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
script: |
|
script: |
|
||||||
@@ -65,7 +103,7 @@ jobs:
|
|||||||
owner: context.repo.owner,
|
owner: context.repo.owner,
|
||||||
repo: context.repo.repo,
|
repo: context.repo.repo,
|
||||||
commit_sha: context.sha,
|
commit_sha: context.sha,
|
||||||
body: 'Chromatic will skip testing but you may still have to [review the changes on Chromatic](https://www.chromatic.com/pullrequests?appId=6428f7d7b962f0b79f97d6e4).'
|
body: 'Chromatic detects changes. Please [review the changes on Chromatic](https://www.chromatic.com/builds?appId=6428f7d7b962f0b79f97d6e4).'
|
||||||
})
|
})
|
||||||
- name: Upload Artifacts
|
- name: Upload Artifacts
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v3
|
||||||
|
|||||||
2
.github/workflows/test-backend.yml
vendored
2
.github/workflows/test-backend.yml
vendored
@@ -13,7 +13,7 @@ jobs:
|
|||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
node-version: [18.x]
|
node-version: [20.x]
|
||||||
|
|
||||||
services:
|
services:
|
||||||
postgres:
|
postgres:
|
||||||
|
|||||||
4
.github/workflows/test-frontend.yml
vendored
4
.github/workflows/test-frontend.yml
vendored
@@ -13,7 +13,7 @@ jobs:
|
|||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
node-version: [18.x]
|
node-version: [20.x]
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3.3.0
|
- uses: actions/checkout@v3.3.0
|
||||||
@@ -51,7 +51,7 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
node-version: [18.x]
|
node-version: [20.x]
|
||||||
browser: [chrome]
|
browser: [chrome]
|
||||||
|
|
||||||
services:
|
services:
|
||||||
|
|||||||
2
.github/workflows/test-misskey-js.yml
vendored
2
.github/workflows/test-misskey-js.yml
vendored
@@ -16,7 +16,7 @@ jobs:
|
|||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
node-version: [18.x]
|
node-version: [20.x]
|
||||||
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
|
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
|||||||
2
.github/workflows/test-production.yml
vendored
2
.github/workflows/test-production.yml
vendored
@@ -16,7 +16,7 @@ jobs:
|
|||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
node-version: [18.x]
|
node-version: [20.x]
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3.3.0
|
- uses: actions/checkout@v3.3.0
|
||||||
|
|||||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -64,3 +64,6 @@ temp
|
|||||||
*.blend3
|
*.blend3
|
||||||
*.blend4
|
*.blend4
|
||||||
*.blend5
|
*.blend5
|
||||||
|
|
||||||
|
# VSCode addon
|
||||||
|
.favorites.json
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
18.16.0
|
20.3.1
|
||||||
|
|||||||
136
CHANGELOG.md
136
CHANGELOG.md
@@ -11,14 +11,146 @@
|
|||||||
-
|
-
|
||||||
|
|
||||||
-->
|
-->
|
||||||
|
|
||||||
## 13.x.x (unreleased)
|
## 13.x.x (unreleased)
|
||||||
|
|
||||||
|
### General
|
||||||
|
- identicon生成を無効にしてパフォーマンスを向上させることができるようになりました
|
||||||
|
- サーバーのマシン情報の公開を無効にしてパフォーマンスを向上させることができるようになりました
|
||||||
|
|
||||||
|
### Client
|
||||||
|
- deck UIのカラムのメニューからアンテナとリストの編集画面を開けるように
|
||||||
|
- ドライブファイルのメニューで画像をクロップできるように
|
||||||
|
- 画像を動画と同様に簡単に隠せるように
|
||||||
|
- オリジナル画像を保持せずにアップロードする場合webpでアップロードされるように(Safari以外)
|
||||||
|
- 見たことのあるRenoteを省略して表示をオンのときに自分のnoteのrenoteを省略するように
|
||||||
|
- フォルダーやファイルに対しても開発者モード使用時、IDをコピーできるように
|
||||||
|
- 引用対象を「もっと見る」で展開した場合、「閉じる」で畳めるように
|
||||||
|
- プロフィールURLをコピーできるボタンを追加 #11190
|
||||||
|
- ユーザーのContextMenuに「アンテナに追加」ボタンを追加
|
||||||
|
- フォローやお気に入り登録をしていないチャンネルを開く時は概要ページを開くように
|
||||||
|
- 画面ビューワをタップした場合、マウスクリックと同様に画像ビューワを閉じるように
|
||||||
|
- オフライン時の画面にリロードボタンを追加
|
||||||
|
- Fix: サーバーメトリクスが90度傾いている
|
||||||
|
- Fix: 非ログイン時にクレデンシャルが必要なページに行くとエラーが出る問題を修正
|
||||||
|
- Fix: sparkle内にリンクを入れるとクリック不能になる問題の修正
|
||||||
|
- Fix: ZenUIでポップアップの表示位置がおかしい問題を修正
|
||||||
|
- Fix: ページ遷移でスクロール位置が保持されない問題を修正
|
||||||
|
- Fix: フォルダーのページネーションが機能しない #11180
|
||||||
|
- Fix: 長い文章を投稿する際、プレビューが画面からはみ出る問題を修正
|
||||||
|
- Fix: システムフォント設定が正しく反映されない問題を修正
|
||||||
|
|
||||||
|
### Server
|
||||||
|
- JSON.parse の回数を削減することで、ストリーミングのパフォーマンスを向上しました
|
||||||
|
- nsfwjs のモデルロードを排他することで、重複ロードによってメモリ使用量が増加しないように
|
||||||
|
- 連合の配送ジョブのパフォーマンスを向上(ロック機構の見直し、Redisキャッシュの活用)
|
||||||
|
- 全体的なDBクエリのパフォーマンスを向上
|
||||||
|
- featuredノートのsignedGet回数を減らしました
|
||||||
|
- リモートサーバーからのNSFW映像のキャッシュだけを無効化できるオプションを追加しました
|
||||||
|
|
||||||
|
## 13.13.2
|
||||||
|
|
||||||
|
### General
|
||||||
|
- エラー時や項目が存在しないときなどのアイコン画像をサーバー管理者が設定できるように
|
||||||
|
- ロールが付与されているユーザーリストを非公開にできるように
|
||||||
|
- サーバーの負荷が非常に高いため、ユーザー統計表示機能を削除しました
|
||||||
|
|
||||||
|
### Client
|
||||||
|
- Fix: タブがバックグラウンドでもstreamが切断されないように
|
||||||
|
|
||||||
|
### Server
|
||||||
|
- Fix: キャッシュが溜まり続けないように
|
||||||
|
|
||||||
|
## 13.13.1
|
||||||
|
|
||||||
|
### Client
|
||||||
|
- Fix: タブがアクティブな間はstreamが切断されないように
|
||||||
|
|
||||||
|
### Server
|
||||||
|
- Fix: api/metaで`TypeError: JSON5.parse is not a function`エラーが発生する問題を修正
|
||||||
|
|
||||||
|
## 13.13.0
|
||||||
|
|
||||||
|
### General
|
||||||
|
- カスタム絵文字ごとにそれをリアクションとして使えるロールを設定できるように
|
||||||
|
- カスタム絵文字ごとに連合するかどうか設定できるように
|
||||||
|
- カスタム絵文字ごとにセンシティブフラグを設定できるように
|
||||||
|
- センシティブなカスタム絵文字のリアクションを受け入れない設定が可能に
|
||||||
|
- タイムラインにフォロイーの行った他人へのリプライを含めるかどうかの設定をアカウントに保存するのをやめるように
|
||||||
|
- 今後はAPI呼び出し時およびストリーミング接続時に設定するようになります
|
||||||
|
- リストを公開できるようになりました
|
||||||
|
|
||||||
|
### Client
|
||||||
|
- リアクションの取り消し/変更時に確認ダイアログを出すように
|
||||||
|
- 開発者モードを追加
|
||||||
|
- AiScriptを0.13.3に更新
|
||||||
|
- Deck UIを使用している場合、`/`以外にアクセスした際にZen UIで表示するように
|
||||||
|
- メインカラムを設置していない場合の問題を解決
|
||||||
|
- ハッシュタグのノート一覧ページから、そのハッシュタグで投稿するボタンを追加
|
||||||
|
- アカウント初期設定ウィザードに戻るボタンを追加
|
||||||
|
- アカウントの初期設定ウィザードにあとでボタンを追加
|
||||||
|
- サーバーにカスタム絵文字の種類が多い場合のパフォーマンスの改善
|
||||||
|
- Fix: URLプレビューで情報が取得できなかった際の挙動を修正
|
||||||
|
- Fix: Safari、Firefoxでの新規登録時、パスワードマネージャーにメールアドレスが登録されていた挙動を修正
|
||||||
|
- Fix: ロールタイムラインが無効でも投稿が流れてしまう問題の修正
|
||||||
|
- Fix: ロールタイムラインにて全ての投稿が流れてしまう問題の修正
|
||||||
|
- Fix: 「アクセストークンの管理」画面でアプリの情報が表示されない問題の修正
|
||||||
|
- Fix: Firefoxにおける絵文字ピッカーのTabキーフォーカス問題の修正
|
||||||
|
- Fix: フォローボタンがテーマのカラースキームによって視認性が悪くなる問題を修正
|
||||||
|
- 新しいプロパティ `fgOnWhite` が追加されました
|
||||||
|
|
||||||
|
### Server
|
||||||
|
- bullをbull-mqにアップグレードし、ジョブキューのパフォーマンスを改善
|
||||||
|
- ストリーミングのパフォーマンスを改善
|
||||||
|
- Fix: 無効化されたアンテナにアクセスがあった際に再度有効化するように
|
||||||
|
- Fix: お知らせの画像URLを空にできない問題を修正
|
||||||
|
- Fix: i/notificationsのsinceIdが機能しない問題を修正
|
||||||
|
- Fix: pageのピン留めを解除することができない問題を修正
|
||||||
|
|
||||||
|
## 13.12.2
|
||||||
|
|
||||||
|
## NOTE
|
||||||
|
Meilisearchの設定に`index`が必要になりました。値はMisskeyサーバーのホスト名にすることをお勧めします(アルファベット、ハイフン、アンダーバーのみ使用可能)。例: `misskey-io`
|
||||||
|
過去に作成された`notes`インデックスは、`<index名>---notes`にリネームが必要です。例: `misskey-io---notes`
|
||||||
|
|
||||||
|
### General
|
||||||
|
- 投稿したコンテンツのAIによる学習を軽減するオプションを追加
|
||||||
|
|
||||||
|
### Client
|
||||||
|
- ユーザーを指定してのノート検索が可能に
|
||||||
|
- アカウント初期設定ウィザードにプライバシー設定を追加
|
||||||
|
- リテンション率チャートに折れ線グラフを追加
|
||||||
|
- Fix: ブラーエフェクトを有効にしている状態で高負荷になる問題を修正
|
||||||
|
- Fix: Pageにおいて画像ブロックに画像を設定できない問題を修正
|
||||||
|
- Fix: カラーバーがリプライには表示されないのを修正
|
||||||
|
- Fix: チャンネル内の検索ボックスが挙動不審な問題を修正
|
||||||
|
- Fix: リテンションチャートのレンダリングを修正
|
||||||
|
- Fix: リアクションエフェクトのレンダリングの問題を修正
|
||||||
|
|
||||||
|
### Server
|
||||||
|
- センシティブワードの登録にAnd、正規表現が使用できるようになりました。
|
||||||
|
- Fix: ひとつのMeilisearchサーバーを複数のMisskeyサーバーで使えない問題を修正
|
||||||
|
|
||||||
|
## 13.12.1
|
||||||
|
|
||||||
|
### Client
|
||||||
|
- プロフィール画面におけるモデレーションノートの表示を調整
|
||||||
|
- Fix: 一部ダイアログが表示されない問題を修正
|
||||||
|
- Fix: MkUserInfoのフォローボタンが変な位置にある問題を修正
|
||||||
|
|
||||||
|
### Server
|
||||||
|
- Fix: リモートサーバーの情報が更新できない問題を修正
|
||||||
|
- Fix: 13.11を経験しない状態で13.12にアップデートした場合ユーザープロフィール関連の画像が消失する問題を修正
|
||||||
|
|
||||||
|
## 13.12.0
|
||||||
|
|
||||||
### NOTE
|
### NOTE
|
||||||
- Node.js 18.6.0以上が必要になりました
|
- Node.js 18.16.0以上が必要になりました
|
||||||
|
|
||||||
### General
|
### General
|
||||||
- アカウントの引っ越し(フォロワー引き継ぎ)に対応
|
- アカウントの引っ越し(フォロワー引き継ぎ)に対応
|
||||||
- Meilisearchを全文検索に使用できるようになりました
|
- Meilisearchを全文検索に使用できるようになりました
|
||||||
|
* 「フォロワーのみ」の投稿は検索結果に表示されません。
|
||||||
- 新規登録前に簡潔なルールをユーザーに表示できる、サーバールール機能を追加
|
- 新規登録前に簡潔なルールをユーザーに表示できる、サーバールール機能を追加
|
||||||
- ユーザーへの自分用メモ機能
|
- ユーザーへの自分用メモ機能
|
||||||
* ユーザーに対して、自分だけが見られるメモを追加できるようになりました。
|
* ユーザーに対して、自分だけが見られるメモを追加できるようになりました。
|
||||||
@@ -51,6 +183,7 @@
|
|||||||
* 画像が全て隠れた状態で表示されるようになります
|
* 画像が全て隠れた状態で表示されるようになります
|
||||||
- 閲覧注意設定された画像は表示した状態でもそれが閲覧注意だと分かる表示をするように
|
- 閲覧注意設定された画像は表示した状態でもそれが閲覧注意だと分かる表示をするように
|
||||||
- モデレーターはノートに添付された画像上から直接NSFW設定できるように
|
- モデレーターはノートに添付された画像上から直接NSFW設定できるように
|
||||||
|
- 1枚だけのメディアリストの画像のアスペクト比を画像に応じて縦長にするように
|
||||||
- プロフィール設定「追加情報」の項目の削除と並び替えができるように
|
- プロフィール設定「追加情報」の項目の削除と並び替えができるように
|
||||||
- 新しい実績を追加
|
- 新しい実績を追加
|
||||||
- AiScriptを0.13.2に更新
|
- AiScriptを0.13.2に更新
|
||||||
@@ -298,6 +431,7 @@
|
|||||||
- アンテナでCWも検索対象にするように
|
- アンテナでCWも検索対象にするように
|
||||||
- ノートの操作部をホバー時のみ表示するオプションを追加
|
- ノートの操作部をホバー時のみ表示するオプションを追加
|
||||||
- サウンドを追加
|
- サウンドを追加
|
||||||
|
- enhance(client): MFMのx2, scale, positionが含まれていたらノートをたたむように
|
||||||
- サーバーのパフォーマンスを改善
|
- サーバーのパフォーマンスを改善
|
||||||
|
|
||||||
### Bugfixes
|
### Bugfixes
|
||||||
|
|||||||
@@ -106,7 +106,7 @@ If your language is not listed in Crowdin, please open an issue.
|
|||||||

|

|
||||||
|
|
||||||
## Development
|
## Development
|
||||||
During development, it is useful to use the
|
During development, it is useful to use the
|
||||||
|
|
||||||
```
|
```
|
||||||
pnpm dev
|
pnpm dev
|
||||||
@@ -150,7 +150,7 @@ Prepare DB/Redis for testing.
|
|||||||
```
|
```
|
||||||
docker compose -f packages/backend/test/docker-compose.yml up
|
docker compose -f packages/backend/test/docker-compose.yml up
|
||||||
```
|
```
|
||||||
Alternatively, prepare an empty (data can be erased) DB and edit `.config/test.yml`.
|
Alternatively, prepare an empty (data can be erased) DB and edit `.config/test.yml`.
|
||||||
|
|
||||||
Run all test.
|
Run all test.
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# syntax = docker/dockerfile:1.4
|
# syntax = docker/dockerfile:1.4
|
||||||
|
|
||||||
ARG NODE_VERSION=18.16.0-bullseye
|
ARG NODE_VERSION=20.3.1-bullseye
|
||||||
|
|
||||||
# build assets & compile TypeScript
|
# build assets & compile TypeScript
|
||||||
|
|
||||||
|
|||||||
@@ -2,9 +2,9 @@
|
|||||||
<a href="https://misskey-hub.net">
|
<a href="https://misskey-hub.net">
|
||||||
<img src="./assets/title_float.svg" alt="Misskey logo" style="border-radius:50%" width="400"/>
|
<img src="./assets/title_float.svg" alt="Misskey logo" style="border-radius:50%" width="400"/>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
**🌎 **[Misskey](https://misskey-hub.net/)** is an open source, decentralized social media platform that's free forever! 🚀**
|
**🌎 **[Misskey](https://misskey-hub.net/)** is an open source, decentralized social media platform that's free forever! 🚀**
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
<a href="https://misskey-hub.net/instances.html">
|
<a href="https://misskey-hub.net/instances.html">
|
||||||
@@ -21,7 +21,7 @@
|
|||||||
|
|
||||||
<a href="https://www.patreon.com/syuilo">
|
<a href="https://www.patreon.com/syuilo">
|
||||||
<img src="https://custom-icon-badges.herokuapp.com/badge/become_a-patron-F96854?logoColor=F96854&style=for-the-badge&logo=patreon&labelColor=363B40" alt="become a patron"/></a>
|
<img src="https://custom-icon-badges.herokuapp.com/badge/become_a-patron-F96854?logoColor=F96854&style=for-the-badge&logo=patreon&labelColor=363B40" alt="become a patron"/></a>
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
[](https://codecov.io/gh/misskey-dev/misskey)
|
[](https://codecov.io/gh/misskey-dev/misskey)
|
||||||
|
|||||||
@@ -23,13 +23,13 @@
|
|||||||
</rdf:RDF>
|
</rdf:RDF>
|
||||||
</metadata>
|
</metadata>
|
||||||
<style>
|
<style>
|
||||||
#g8 {
|
#g8 {
|
||||||
animation-name: floating;
|
animation-name: floating;
|
||||||
animation-duration: 3s;
|
animation-duration: 3s;
|
||||||
animation-iteration-count: infinite;
|
animation-iteration-count: infinite;
|
||||||
animation-timing-function: ease-in-out;
|
animation-timing-function: ease-in-out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@keyframes floating {
|
@keyframes floating {
|
||||||
0% { transform: translate(0, 0px); }
|
0% { transform: translate(0, 0px); }
|
||||||
50% { transform: translate(0, -5px); }
|
50% { transform: translate(0, -5px); }
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 6.1 KiB After Width: | Height: | Size: 6.1 KiB |
@@ -124,6 +124,7 @@ redis:
|
|||||||
# port: 7700
|
# port: 7700
|
||||||
# apiKey: ''
|
# apiKey: ''
|
||||||
# ssl: true
|
# ssl: true
|
||||||
|
# index: ''
|
||||||
|
|
||||||
# ┌───────────────┐
|
# ┌───────────────┐
|
||||||
#───┘ ID generation └───────────────────────────────────────────
|
#───┘ ID generation └───────────────────────────────────────────
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ describe('After setup instance', () => {
|
|||||||
cy.get('[data-cy-signup-rules-notes-agree] [data-cy-switch-toggle]').click();
|
cy.get('[data-cy-signup-rules-notes-agree] [data-cy-switch-toggle]').click();
|
||||||
cy.get('[data-cy-signup-rules-continue]').should('not.be.disabled');
|
cy.get('[data-cy-signup-rules-continue]').should('not.be.disabled');
|
||||||
cy.get('[data-cy-signup-rules-continue]').click();
|
cy.get('[data-cy-signup-rules-continue]').click();
|
||||||
|
|
||||||
cy.get('[data-cy-signup-submit]').should('be.disabled');
|
cy.get('[data-cy-signup-submit]').should('be.disabled');
|
||||||
cy.get('[data-cy-signup-username] input').type('alice');
|
cy.get('[data-cy-signup-username] input').type('alice');
|
||||||
cy.get('[data-cy-signup-submit]').should('be.disabled');
|
cy.get('[data-cy-signup-submit]').should('be.disabled');
|
||||||
@@ -159,10 +159,59 @@ describe('After user signed in', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('successfully loads', () => {
|
it('successfully loads', () => {
|
||||||
cy.get('[data-cy-open-post-form]').should('be.visible');
|
cy.get('[data-cy-user-setup-continue]').should('be.visible');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('account setup wizard', () => {
|
||||||
|
cy.get('[data-cy-user-setup-continue]').click();
|
||||||
|
|
||||||
|
cy.get('[data-cy-user-setup-user-name] input').type('ありす');
|
||||||
|
cy.get('[data-cy-user-setup-user-description] textarea').type('ほげ');
|
||||||
|
// TODO: アイコン設定テスト
|
||||||
|
|
||||||
|
cy.get('[data-cy-user-setup-continue]').click();
|
||||||
|
|
||||||
|
// プライバシー設定
|
||||||
|
|
||||||
|
cy.get('[data-cy-user-setup-continue]').click();
|
||||||
|
|
||||||
|
// フォローはスキップ
|
||||||
|
|
||||||
|
cy.get('[data-cy-user-setup-continue]').click();
|
||||||
|
|
||||||
|
// プッシュ通知設定はスキップ
|
||||||
|
|
||||||
|
cy.get('[data-cy-user-setup-continue]').click();
|
||||||
|
|
||||||
|
cy.get('[data-cy-user-setup-continue]').click();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('After user setup', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
cy.resetState();
|
||||||
|
|
||||||
|
// インスタンス初期セットアップ
|
||||||
|
cy.registerUser('admin', 'pass', true);
|
||||||
|
|
||||||
|
// ユーザー作成
|
||||||
|
cy.registerUser('alice', 'alice1234');
|
||||||
|
|
||||||
|
cy.login('alice', 'alice1234');
|
||||||
|
|
||||||
|
// アカウント初期設定ウィザード
|
||||||
|
cy.get('[data-cy-user-setup] [data-cy-modal-window-close]').click();
|
||||||
|
cy.get('[data-cy-modal-dialog-ok]').click();
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
// テスト終了直前にページ遷移するようなテストケース(例えばアカウント作成)だと、たぶんCypressのバグでブラウザの内容が次のテストケースに引き継がれてしまう(例えばアカウントが作成し終わった段階からテストが始まる)。
|
||||||
|
// waitを入れることでそれを防止できる
|
||||||
|
cy.wait(1000);
|
||||||
|
});
|
||||||
|
|
||||||
it('note', () => {
|
it('note', () => {
|
||||||
|
cy.get('[data-cy-open-post-form]').should('be.visible');
|
||||||
cy.get('[data-cy-open-post-form]').click();
|
cy.get('[data-cy-open-post-form]').click();
|
||||||
cy.get('[data-cy-post-form-text]').type('Hello, Misskey!');
|
cy.get('[data-cy-post-form-text]').type('Hello, Misskey!');
|
||||||
cy.get('[data-cy-open-post-form-submit]').click();
|
cy.get('[data-cy-open-post-form-submit]').click();
|
||||||
|
|||||||
@@ -10,6 +10,10 @@ describe('After user signed in', () => {
|
|||||||
cy.registerUser('alice', 'alice1234');
|
cy.registerUser('alice', 'alice1234');
|
||||||
|
|
||||||
cy.login('alice', 'alice1234');
|
cy.login('alice', 'alice1234');
|
||||||
|
|
||||||
|
// アカウント初期設定ウィザード
|
||||||
|
cy.get('[data-cy-user-setup] [data-cy-modal-window-close]').click();
|
||||||
|
cy.get('[data-cy-modal-dialog-ok]').click();
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
afterEach(() => {
|
||||||
@@ -19,26 +23,26 @@ describe('After user signed in', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('widget edit toggle is visible', () => {
|
it('widget edit toggle is visible', () => {
|
||||||
cy.get('.mk-widget-edit').should('be.visible');
|
cy.get('[data-cy-widget-edit]').should('be.visible');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('widget select should be visible in edit mode', () => {
|
it('widget select should be visible in edit mode', () => {
|
||||||
cy.get('.mk-widget-edit').click();
|
cy.get('[data-cy-widget-edit]').click();
|
||||||
cy.get('.mk-widget-select').should('be.visible');
|
cy.get('[data-cy-widget-select]').should('be.visible');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('first widget should be removed', () => {
|
it('first widget should be removed', () => {
|
||||||
cy.get('.mk-widget-edit').click();
|
cy.get('[data-cy-widget-edit]').click();
|
||||||
cy.get('[data-cy-customize-container]:first-child [data-cy-customize-container-remove]._button').click();
|
cy.get('[data-cy-customize-container]:first-child [data-cy-customize-container-remove]._button').click();
|
||||||
cy.get('[data-cy-customize-container]').should('have.length', 2);
|
cy.get('[data-cy-customize-container]').should('have.length', 2);
|
||||||
});
|
});
|
||||||
|
|
||||||
function buildWidgetTest(widgetName) {
|
function buildWidgetTest(widgetName) {
|
||||||
it(`${widgetName} widget should get added`, () => {
|
it(`${widgetName} widget should get added`, () => {
|
||||||
cy.get('.mk-widget-edit').click();
|
cy.get('[data-cy-widget-edit]').click();
|
||||||
cy.get('.mk-widget-select select').select(widgetName, { force: true });
|
cy.get('[data-cy-widget-select] select').select(widgetName, { force: true });
|
||||||
cy.get('[data-cy-bg]._modalBg[data-cy-transparent]').click({ multiple: true, force: true });
|
cy.get('[data-cy-bg]._modalBg[data-cy-transparent]').click({ multiple: true, force: true });
|
||||||
cy.get('.mk-widget-add').click({ force: true });
|
cy.get('[data-cy-widget-add]').click({ force: true });
|
||||||
cy.get(`[data-cy-mkw-${widgetName}]`).should('exist');
|
cy.get(`[data-cy-mkw-${widgetName}]`).should('exist');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,6 +21,8 @@ import './commands'
|
|||||||
|
|
||||||
Cypress.on('uncaught:exception', (err, runnable) => {
|
Cypress.on('uncaught:exception', (err, runnable) => {
|
||||||
if ([
|
if ([
|
||||||
|
'The source image cannot be decoded',
|
||||||
|
|
||||||
// Chrome
|
// Chrome
|
||||||
'ResizeObserver loop limit exceeded',
|
'ResizeObserver loop limit exceeded',
|
||||||
|
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
DONATORS
|
|
||||||
========
|
|
||||||
The list of people who have sent donation for Misskey.
|
|
||||||
|
|
||||||
(In random order, honorific titles are omitted.)
|
|
||||||
|
|
||||||
* らふぁ
|
|
||||||
* 俺様
|
|
||||||
* なぎうり
|
|
||||||
* スルメ https://surume.tk/
|
|
||||||
* 藍
|
|
||||||
* 音船 https://otofune.me/
|
|
||||||
* aqz https://misskey.xyz/aqz
|
|
||||||
* kotodu "虚無創作中"
|
|
||||||
* Maya Minatsuki
|
|
||||||
* Knzk https://knzk.me/@Knzk
|
|
||||||
* ねじりわさび https://knzk.me/@y
|
|
||||||
* NCLS https://knzk.me/@imncls]
|
|
||||||
* こじま @skoji@sandbox.skoji.jp
|
|
||||||
|
|
||||||
:heart: Thanks for donating, guys!
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
If your name is missing, please contact us!
|
|
||||||
@@ -2,14 +2,14 @@
|
|||||||
* Gulp tasks
|
* Gulp tasks
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const fs = require('fs');
|
import * as fs from 'node:fs';
|
||||||
const gulp = require('gulp');
|
import gulp from 'gulp';
|
||||||
const replace = require('gulp-replace');
|
import replace from 'gulp-replace';
|
||||||
const terser = require('gulp-terser');
|
import terser from 'gulp-terser';
|
||||||
const cssnano = require('gulp-cssnano');
|
import cssnano from 'gulp-cssnano';
|
||||||
|
|
||||||
const locales = require('./locales');
|
import locales from './locales/index.js';
|
||||||
const meta = require('./package.json');
|
import meta from './package.json' assert { type: "json" };
|
||||||
|
|
||||||
gulp.task('copy:backend:views', () =>
|
gulp.task('copy:backend:views', () =>
|
||||||
gulp.src('./packages/backend/src/server/web/views/**/*').pipe(gulp.dest('./packages/backend/built/server/web/views'))
|
gulp.src('./packages/backend/src/server/web/views/**/*').pipe(gulp.dest('./packages/backend/built/server/web/views'))
|
||||||
@@ -2,6 +2,7 @@
|
|||||||
_lang_: "العربية"
|
_lang_: "العربية"
|
||||||
headlineMisskey: "شبكة مرتبطة بالملاحظات"
|
headlineMisskey: "شبكة مرتبطة بالملاحظات"
|
||||||
introMisskey: "اهلا بك! ميسكي هو منصة تدوين مصغر لا مركزية ومفتوحة المصدر.\nيمكنك مشاركة \"ملاحظات\" عن ما يجري حولك، وإخبار الجميع عن نفسك 📡\nتسمح لك \"الانفعالات\" بتعبير عن شعورك حول ملاحظات الآخرين 👍\nاكتشف عالمًا جديدًا 🚀"
|
introMisskey: "اهلا بك! ميسكي هو منصة تدوين مصغر لا مركزية ومفتوحة المصدر.\nيمكنك مشاركة \"ملاحظات\" عن ما يجري حولك، وإخبار الجميع عن نفسك 📡\nتسمح لك \"الانفعالات\" بتعبير عن شعورك حول ملاحظات الآخرين 👍\nاكتشف عالمًا جديدًا 🚀"
|
||||||
|
poweredByMisskeyDescription: "{name} هو إحدى الخِدمات التي تستخدم المنصة مفتوحة المصدر <b>ميسكي</b> (يشار إليه كمثيل ميسكي)"
|
||||||
monthAndDay: "{day}/{month}"
|
monthAndDay: "{day}/{month}"
|
||||||
search: "البحث"
|
search: "البحث"
|
||||||
notifications: "الإشعارات"
|
notifications: "الإشعارات"
|
||||||
@@ -19,6 +20,7 @@ noNotes: "لم يُعثر على أية ملاحظات"
|
|||||||
noNotifications: "ليس هناك أية اشعارات"
|
noNotifications: "ليس هناك أية اشعارات"
|
||||||
instance: "مثيل الخادم"
|
instance: "مثيل الخادم"
|
||||||
settings: "الاعدادات"
|
settings: "الاعدادات"
|
||||||
|
notificationSettings: "إعدادات الإشعارات"
|
||||||
basicSettings: "الاعدادات الأساسية"
|
basicSettings: "الاعدادات الأساسية"
|
||||||
otherSettings: "إعدادات أخرى"
|
otherSettings: "إعدادات أخرى"
|
||||||
openInWindow: "افتح في نافذة جديدة"
|
openInWindow: "افتح في نافذة جديدة"
|
||||||
@@ -48,7 +50,10 @@ deleteAndEdit: "إزالة وإعادة الصياغة"
|
|||||||
deleteAndEditConfirm: "أمتأكد من حذف الملاحظة؟ ستفقد كل مشاركاتها، والتفاعلات، والردود عليها."
|
deleteAndEditConfirm: "أمتأكد من حذف الملاحظة؟ ستفقد كل مشاركاتها، والتفاعلات، والردود عليها."
|
||||||
addToList: "أضفه إلى قائمة"
|
addToList: "أضفه إلى قائمة"
|
||||||
sendMessage: "أرسل رسالة"
|
sendMessage: "أرسل رسالة"
|
||||||
|
copyRSS: "انسخ رابط RSS"
|
||||||
copyUsername: "انسخ اسم المستخدم"
|
copyUsername: "انسخ اسم المستخدم"
|
||||||
|
copyUserId: "انسخ معرف المستخدم"
|
||||||
|
copyNoteId: "انسخ معرف الملاحظة"
|
||||||
searchUser: "ابحث عن مستخدمين"
|
searchUser: "ابحث عن مستخدمين"
|
||||||
reply: "رد"
|
reply: "رد"
|
||||||
loadMore: "عرض المزيد"
|
loadMore: "عرض المزيد"
|
||||||
@@ -101,6 +106,8 @@ renoted: "أُعيد نشره"
|
|||||||
cantRenote: "لا يمكن إعادة نشر الملاحظة"
|
cantRenote: "لا يمكن إعادة نشر الملاحظة"
|
||||||
cantReRenote: "لا يمكنك إعادة نشر ملاحظة معاد نشرها"
|
cantReRenote: "لا يمكنك إعادة نشر ملاحظة معاد نشرها"
|
||||||
quote: "اقتبس"
|
quote: "اقتبس"
|
||||||
|
inChannelRenote: "إعادة نشر في قناة"
|
||||||
|
inChannelQuote: "اقتباس في قناة"
|
||||||
pinnedNote: "ملاحظة مدبسة"
|
pinnedNote: "ملاحظة مدبسة"
|
||||||
pinned: "دبّسها على الصفحة الشخصية"
|
pinned: "دبّسها على الصفحة الشخصية"
|
||||||
you: "أنت"
|
you: "أنت"
|
||||||
@@ -118,6 +125,8 @@ unmarkAsSensitive: "ألغ تعيينه كمحتوى حساس"
|
|||||||
enterFileName: "ادخل اسم الملف"
|
enterFileName: "ادخل اسم الملف"
|
||||||
mute: "اكتم"
|
mute: "اكتم"
|
||||||
unmute: "إلغاء الكتم"
|
unmute: "إلغاء الكتم"
|
||||||
|
renoteMute: "اكتم إعادة النشر"
|
||||||
|
renoteUnmute: "ارفع الكتم عن إعادة النشر"
|
||||||
block: "احجب"
|
block: "احجب"
|
||||||
unblock: "إلغاء الحجب"
|
unblock: "إلغاء الحجب"
|
||||||
suspend: "علِق"
|
suspend: "علِق"
|
||||||
@@ -127,6 +136,7 @@ unblockConfirm: "أمتأكد من إلغاء حجب هذا الحساب؟"
|
|||||||
suspendConfirm: "أمتأكد من تعليق الحساب؟"
|
suspendConfirm: "أمتأكد من تعليق الحساب؟"
|
||||||
unsuspendConfirm: "أمتأكد من إلغاء تعليق؟"
|
unsuspendConfirm: "أمتأكد من إلغاء تعليق؟"
|
||||||
selectList: "اختر قائمة"
|
selectList: "اختر قائمة"
|
||||||
|
selectChannel: "اختر قناة"
|
||||||
selectAntenna: "اختر هوائيًا"
|
selectAntenna: "اختر هوائيًا"
|
||||||
selectWidget: "اختر ودجة"
|
selectWidget: "اختر ودجة"
|
||||||
editWidgets: "عدّل الودجات"
|
editWidgets: "عدّل الودجات"
|
||||||
@@ -139,6 +149,7 @@ emojiUrl: "رابط الإيموجي"
|
|||||||
addEmoji: "إضافة إيموجي"
|
addEmoji: "إضافة إيموجي"
|
||||||
settingGuide: "الإعدادات المستحسنة"
|
settingGuide: "الإعدادات المستحسنة"
|
||||||
cacheRemoteFiles: "خزن مؤقتا الملفات البعيدة"
|
cacheRemoteFiles: "خزن مؤقتا الملفات البعيدة"
|
||||||
|
cacheRemoteFilesDescription: "إذا عُطل هذا الإعداد، ستُحمل الملفات من المثيل البعيد، هذا سيقلل من المساحة المستغلة على القرص لكن سيزيد حجم تدفق البيانات وهذا لأن الصور المصغرة لن تولّد."
|
||||||
flagAsBot: "علّمه كحساب آلي"
|
flagAsBot: "علّمه كحساب آلي"
|
||||||
flagAsBotDescription: "فعّل هذا الخيار إذا كان هذا الحساب يُدار عبر برمجية. إذا فُعل فسيكون بمثابة علامة للمطورين الآخرين لتجنب سلاسل لا متناهية من التفاعل بين حسابات الآلية وضبط أنظمة ميسكي للتعامل مع هذا الحساب كآلي."
|
flagAsBotDescription: "فعّل هذا الخيار إذا كان هذا الحساب يُدار عبر برمجية. إذا فُعل فسيكون بمثابة علامة للمطورين الآخرين لتجنب سلاسل لا متناهية من التفاعل بين حسابات الآلية وضبط أنظمة ميسكي للتعامل مع هذا الحساب كآلي."
|
||||||
flagAsCat: "علّم هذا الحساب كحساب قط"
|
flagAsCat: "علّم هذا الحساب كحساب قط"
|
||||||
@@ -250,12 +261,16 @@ noMoreHistory: "لا يوجد المزيد من التاريخ"
|
|||||||
startMessaging: "ابدأ محادثة"
|
startMessaging: "ابدأ محادثة"
|
||||||
nUsersRead: "قرأه {n}"
|
nUsersRead: "قرأه {n}"
|
||||||
agreeTo: "اوافق على {0}"
|
agreeTo: "اوافق على {0}"
|
||||||
|
agree: "أقبل"
|
||||||
|
agreeBelow: "أقبل ما يلي"
|
||||||
|
basicNotesBeforeCreateAccount: "ملاحظات مهمة"
|
||||||
|
termsOfService: "شروط الخدمة"
|
||||||
start: "البداية"
|
start: "البداية"
|
||||||
home: "الرئيسي"
|
home: "الرئيسي"
|
||||||
remoteUserCaution: "هذه المعلومات قد لا تكون مكتملة بما أن المستخدم من مثيل بعيد."
|
remoteUserCaution: "هذه المعلومات قد لا تكون مكتملة بما أن المستخدم من مثيل بعيد."
|
||||||
activity: "النشاط"
|
activity: "النشاط"
|
||||||
images: "الصور"
|
images: "صور"
|
||||||
image: "الصور"
|
image: "صور"
|
||||||
birthday: "تاريخ الميلاد"
|
birthday: "تاريخ الميلاد"
|
||||||
yearsOld: "{age} سنة"
|
yearsOld: "{age} سنة"
|
||||||
registeredDate: "انضم في"
|
registeredDate: "انضم في"
|
||||||
@@ -292,7 +307,6 @@ copyUrl: "انسخ الرابط"
|
|||||||
rename: "إعادة التسمية"
|
rename: "إعادة التسمية"
|
||||||
avatar: "الصورة الرمزية"
|
avatar: "الصورة الرمزية"
|
||||||
banner: "الصورة الرأسية"
|
banner: "الصورة الرأسية"
|
||||||
nsfw: "محتوى حساس"
|
|
||||||
whenServerDisconnected: "عند فقدان الاتصال بالخادم"
|
whenServerDisconnected: "عند فقدان الاتصال بالخادم"
|
||||||
disconnectedFromServer: "قُطِع الإتصال بالخادم"
|
disconnectedFromServer: "قُطِع الإتصال بالخادم"
|
||||||
reload: "انعش"
|
reload: "انعش"
|
||||||
@@ -357,6 +371,7 @@ antennaExcludeKeywords: "الكلمات المفتاحية المستثناة"
|
|||||||
antennaKeywordsDescription: "افصل بينهم بمسافة لاستخدام معامل \"و\" أو بسطر لاستخدام معامل \"أو\""
|
antennaKeywordsDescription: "افصل بينهم بمسافة لاستخدام معامل \"و\" أو بسطر لاستخدام معامل \"أو\""
|
||||||
notifyAntenna: "نبهني بصول ملاحظات جديدة"
|
notifyAntenna: "نبهني بصول ملاحظات جديدة"
|
||||||
withFileAntenna: "ملاحظات تحوي ملفات فقط"
|
withFileAntenna: "ملاحظات تحوي ملفات فقط"
|
||||||
|
enableServiceworker: "فعّل إرسال الإشعارات للمتصفح"
|
||||||
antennaUsersDescription: "اكتب اسم مستخدم لكل سطر"
|
antennaUsersDescription: "اكتب اسم مستخدم لكل سطر"
|
||||||
caseSensitive: "حساسية حالة الأحرف"
|
caseSensitive: "حساسية حالة الأحرف"
|
||||||
withReplies: "بالردود"
|
withReplies: "بالردود"
|
||||||
@@ -379,11 +394,15 @@ about: "عن"
|
|||||||
aboutMisskey: "عن Misskey"
|
aboutMisskey: "عن Misskey"
|
||||||
administrator: "المدير"
|
administrator: "المدير"
|
||||||
token: "الرمز المميز"
|
token: "الرمز المميز"
|
||||||
|
2fa: "الاستيثاق بعاملَيْن"
|
||||||
|
totp: "تطبيق استيثاق"
|
||||||
moderator: "مشرِف"
|
moderator: "مشرِف"
|
||||||
moderation: "الإشراف"
|
moderation: "الإشراف"
|
||||||
nUsersMentioned: "{n} مستخدمين أُشير إليهم"
|
nUsersMentioned: "{n} مستخدمين أُشير إليهم"
|
||||||
|
securityKeyAndPasskey: "الأمن ومفاتيح الأمان"
|
||||||
securityKey: "مفتاح الأمان"
|
securityKey: "مفتاح الأمان"
|
||||||
lastUsed: "آخر استخدام"
|
lastUsed: "آخر استخدام"
|
||||||
|
lastUsedAt: "آخر استخدام: {t}"
|
||||||
unregister: "إلغاء التسجيل"
|
unregister: "إلغاء التسجيل"
|
||||||
passwordLessLogin: "لِج مِن دون كلمة سرية"
|
passwordLessLogin: "لِج مِن دون كلمة سرية"
|
||||||
resetPassword: "أعد تعيين كلمتك السرية"
|
resetPassword: "أعد تعيين كلمتك السرية"
|
||||||
@@ -434,6 +453,8 @@ or: "أو"
|
|||||||
language: "اللغة"
|
language: "اللغة"
|
||||||
uiLanguage: "لغة واجهة المستخدم"
|
uiLanguage: "لغة واجهة المستخدم"
|
||||||
aboutX: "عن {x}"
|
aboutX: "عن {x}"
|
||||||
|
emojiStyle: "نمط الوجوه التعبيرية"
|
||||||
|
showNoteActionsOnlyHover: "أظهر الإجراءات عند التمرير فوق الملاحظة"
|
||||||
noHistory: "السجل فارغ"
|
noHistory: "السجل فارغ"
|
||||||
signinHistory: "تاريخ تسجيل الدخول"
|
signinHistory: "تاريخ تسجيل الدخول"
|
||||||
doing: "انتظر لحظة"
|
doing: "انتظر لحظة"
|
||||||
@@ -444,6 +465,7 @@ createAccount: "أنشئ حسابًا"
|
|||||||
existingAccount: "الحسابات الموجودة"
|
existingAccount: "الحسابات الموجودة"
|
||||||
regenerate: "أعِد التوليد"
|
regenerate: "أعِد التوليد"
|
||||||
fontSize: "حجم الخط"
|
fontSize: "حجم الخط"
|
||||||
|
limitTo: "سقفهُ لـ{x}"
|
||||||
noFollowRequests: "ليس لديك طلبات متابعة معلقة"
|
noFollowRequests: "ليس لديك طلبات متابعة معلقة"
|
||||||
openImageInNewTab: "إفتح الصورة بصفحة جديدة"
|
openImageInNewTab: "إفتح الصورة بصفحة جديدة"
|
||||||
dashboard: "لوحة التحكم"
|
dashboard: "لوحة التحكم"
|
||||||
@@ -465,13 +487,16 @@ objectStoragePrefix: "البادئة"
|
|||||||
objectStoragePrefixDesc: "ستُحفظ الملفات في مجلدات تحوي اسماءها هذه البادئة."
|
objectStoragePrefixDesc: "ستُحفظ الملفات في مجلدات تحوي اسماءها هذه البادئة."
|
||||||
objectStorageEndpoint: "نقطة النهاية"
|
objectStorageEndpoint: "نقطة النهاية"
|
||||||
objectStorageRegion: "المنطقة"
|
objectStorageRegion: "المنطقة"
|
||||||
|
objectStorageRegionDesc: "حدد منطقة مثل \"xx-east-1\". إذا كانت خدمتك لا تميز بين المناطق استخدم \"us-east-1\" أو اتركها فارغة إذا كنت تستخدم متغيرات البيئة أو ملفات ضبط AWS."
|
||||||
objectStorageUseSSL: "استخدم SSL"
|
objectStorageUseSSL: "استخدم SSL"
|
||||||
objectStorageUseSSLDesc: "عطل هذا الخيار إذا لم ترد استخدام API عبر HTTPS"
|
objectStorageUseSSLDesc: "عطل هذا الخيار إذا لم ترد استخدام API عبر HTTPS"
|
||||||
objectStorageUseProxy: "اتصل عبر وكيل"
|
objectStorageUseProxy: "اتصل عبر وكيل"
|
||||||
objectStorageUseProxyDesc: "عطل هذا الخيار إذا لم ترد استخدام API عبر وكيل"
|
objectStorageUseProxyDesc: "عطل هذا الخيار إذا لم ترد استخدام API عبر وكيل"
|
||||||
|
objectStorageSetPublicRead: "عينها ك\"علنية\" عند الرفع"
|
||||||
serverLogs: "سجلات الخادم"
|
serverLogs: "سجلات الخادم"
|
||||||
deleteAll: "حذف الكل"
|
deleteAll: "حذف الكل"
|
||||||
showFixedPostForm: "أظهر نموذج الكتابة في أعلى الصفحة"
|
showFixedPostForm: "أظهر نموذج الكتابة في أعلى الصفحة"
|
||||||
|
showFixedPostFormInChannel: "أظهر نموذج الكتابة في أعلى الخط الزمني (قنوات)"
|
||||||
newNoteRecived: "هناك ملاحظات جديدة"
|
newNoteRecived: "هناك ملاحظات جديدة"
|
||||||
sounds: "الرنات"
|
sounds: "الرنات"
|
||||||
sound: "الرنات"
|
sound: "الرنات"
|
||||||
@@ -506,9 +531,12 @@ userSuspended: "عُلق هذا المستخدم."
|
|||||||
userSilenced: "كُتم هذا المستخدم."
|
userSilenced: "كُتم هذا المستخدم."
|
||||||
yourAccountSuspendedTitle: "هذا الحساب معلق"
|
yourAccountSuspendedTitle: "هذا الحساب معلق"
|
||||||
yourAccountSuspendedDescription: "عُلق الحساب بسبب انتهاك شروط خدمة المثيل و ما شابه. إذا أردت معرفة التفصيل تواصل مع مدير المثيل. رجاءً لا تنشئ حساب جديد."
|
yourAccountSuspendedDescription: "عُلق الحساب بسبب انتهاك شروط خدمة المثيل و ما شابه. إذا أردت معرفة التفصيل تواصل مع مدير المثيل. رجاءً لا تنشئ حساب جديد."
|
||||||
|
accountDeleted: "حُذف الحساب"
|
||||||
|
accountDeletedDescription: "حُذف هذا الحساب."
|
||||||
menu: "القائمة"
|
menu: "القائمة"
|
||||||
divider: "فاصل"
|
divider: "فاصل"
|
||||||
addItem: "إضافة عنصر"
|
addItem: "إضافة عنصر"
|
||||||
|
rearrange: "أعد الترتيب"
|
||||||
relays: "المُرَحلات"
|
relays: "المُرَحلات"
|
||||||
addRelay: "إضافة مُرحّل"
|
addRelay: "إضافة مُرحّل"
|
||||||
inboxUrl: "رابط صندوق الوارد"
|
inboxUrl: "رابط صندوق الوارد"
|
||||||
@@ -531,6 +559,8 @@ author: "الكاتب"
|
|||||||
leaveConfirm: "لديك تغييرات غير محفوظة. أتريد المتابعة دون حفظها؟"
|
leaveConfirm: "لديك تغييرات غير محفوظة. أتريد المتابعة دون حفظها؟"
|
||||||
manage: "إدارة "
|
manage: "إدارة "
|
||||||
plugins: "الإضافات"
|
plugins: "الإضافات"
|
||||||
|
preferencesBackups: "النُسخ الاحتياطية للإعدادات"
|
||||||
|
useBlurEffectForModal: "استخدم تأثير الطمس في المشروط"
|
||||||
useFullReactionPicker: "استخدم الحجم الكامل لمنتقي التفاعلات"
|
useFullReactionPicker: "استخدم الحجم الكامل لمنتقي التفاعلات"
|
||||||
width: "العرض"
|
width: "العرض"
|
||||||
height: "الإرتفاع"
|
height: "الإرتفاع"
|
||||||
@@ -606,6 +636,7 @@ clip: "مِشبك"
|
|||||||
createNew: "أنشِئ جديد"
|
createNew: "أنشِئ جديد"
|
||||||
optional: "اختياري"
|
optional: "اختياري"
|
||||||
createNewClip: "أنشئ مِشبكَا جديدًا"
|
createNewClip: "أنشئ مِشبكَا جديدًا"
|
||||||
|
confirmToUnclipAlreadyClippedNote: "هذه الملاحظة تنتمي للمشبك {name} سلفًا، أتريد حذفها منه⸮"
|
||||||
public: "علني"
|
public: "علني"
|
||||||
i18nInfo: "يترجم متطوعون ميسكي إلى عدة لغات، يمكنك المساعدة عبر {link}"
|
i18nInfo: "يترجم متطوعون ميسكي إلى عدة لغات، يمكنك المساعدة عبر {link}"
|
||||||
manageAccessTokens: "إدارة رموز الوصول"
|
manageAccessTokens: "إدارة رموز الوصول"
|
||||||
@@ -627,6 +658,7 @@ driveFilesCount: "عدد الملفات في قرص التخزين"
|
|||||||
driveUsage: "المستغل من قرص التخزين"
|
driveUsage: "المستغل من قرص التخزين"
|
||||||
noCrawle: "ارفض فهرسة زاحف الويب"
|
noCrawle: "ارفض فهرسة زاحف الويب"
|
||||||
noCrawleDescription: "يطلب من محركات البحث ألّا يُفهرسوا ملفك الشخصي وملاحظات وصفحاتك وما شابه."
|
noCrawleDescription: "يطلب من محركات البحث ألّا يُفهرسوا ملفك الشخصي وملاحظات وصفحاتك وما شابه."
|
||||||
|
lockedAccountInfo: "ستكون هذه الملاحظة مرئية للجميع مالم تحدد مرئتيها إلى \"للمتابعين فقط\""
|
||||||
alwaysMarkSensitive: "علّم افتراضيًا جميع ملاحظاتي كذات محتوى حساس"
|
alwaysMarkSensitive: "علّم افتراضيًا جميع ملاحظاتي كذات محتوى حساس"
|
||||||
loadRawImages: "حمّل الصور الأصلية بدلًا من المصغرات"
|
loadRawImages: "حمّل الصور الأصلية بدلًا من المصغرات"
|
||||||
disableShowingAnimatedImages: "لا تشغّل الصور المتحركة"
|
disableShowingAnimatedImages: "لا تشغّل الصور المتحركة"
|
||||||
@@ -640,10 +672,13 @@ contact: "التواصل"
|
|||||||
useSystemFont: "استخدم الخط الافتراضية للنظام"
|
useSystemFont: "استخدم الخط الافتراضية للنظام"
|
||||||
clips: "مشابك"
|
clips: "مشابك"
|
||||||
experimentalFeatures: "ميّزات اختبارية"
|
experimentalFeatures: "ميّزات اختبارية"
|
||||||
|
experimental: "اختباري"
|
||||||
developer: "المطور"
|
developer: "المطور"
|
||||||
makeExplorable: "أظهر الحساب في صفحة \"استكشاف\""
|
makeExplorable: "أظهر الحساب في صفحة \"استكشاف\""
|
||||||
makeExplorableDescription: "بتعطيل هذا الخيار لن يظهر حسابك في صفحة \"استكشاف\""
|
makeExplorableDescription: "بتعطيل هذا الخيار لن يظهر حسابك في صفحة \"استكشاف\""
|
||||||
showGapBetweenNotesInTimeline: "أظهر فجوات بين المشاركات في الخيط الزمني"
|
showGapBetweenNotesInTimeline: "أظهر فجوات بين المشاركات في الخيط الزمني"
|
||||||
|
left: "يسار"
|
||||||
|
center: "وسط"
|
||||||
wide: "عريض"
|
wide: "عريض"
|
||||||
narrow: "رفيع"
|
narrow: "رفيع"
|
||||||
reloadToApplySetting: "سيُطبق هذا الإعداد بعد إعادة تحميل الصفحة، أتريد إعادة تحميلها الآن؟"
|
reloadToApplySetting: "سيُطبق هذا الإعداد بعد إعادة تحميل الصفحة، أتريد إعادة تحميلها الآن؟"
|
||||||
@@ -661,6 +696,7 @@ accentColor: "طابع لوني"
|
|||||||
textColor: "لون النص"
|
textColor: "لون النص"
|
||||||
saveAs: "احفظ كـ..."
|
saveAs: "احفظ كـ..."
|
||||||
advanced: "متقدم"
|
advanced: "متقدم"
|
||||||
|
advancedSettings: "إعدادات متقدمة"
|
||||||
value: "القيمة"
|
value: "القيمة"
|
||||||
createdAt: "أُنشئ في"
|
createdAt: "أُنشئ في"
|
||||||
updatedAt: "حُدّث في"
|
updatedAt: "حُدّث في"
|
||||||
@@ -680,6 +716,7 @@ editCode: "حرر الشفرة"
|
|||||||
apply: "تطبيق"
|
apply: "تطبيق"
|
||||||
receiveAnnouncementFromInstance: "استلم إشعارات من هذا المثيل"
|
receiveAnnouncementFromInstance: "استلم إشعارات من هذا المثيل"
|
||||||
emailNotification: "إشعارات البريد الكتروني"
|
emailNotification: "إشعارات البريد الكتروني"
|
||||||
|
publish: "علني"
|
||||||
inChannelSearch: "ابحث عن قناة"
|
inChannelSearch: "ابحث عن قناة"
|
||||||
useReactionPickerForContextMenu: "افتح منتقي التفاعلات عند النقر بالزر الأيمن"
|
useReactionPickerForContextMenu: "افتح منتقي التفاعلات عند النقر بالزر الأيمن"
|
||||||
typingUsers: "{users} يكتب(ون)..."
|
typingUsers: "{users} يكتب(ون)..."
|
||||||
@@ -719,12 +756,14 @@ noMaintainerInformationWarning: "لم تُضبط معلومات المدير"
|
|||||||
noBotProtectionWarning: "لم تضبط الحماية من الحسابات الآلية"
|
noBotProtectionWarning: "لم تضبط الحماية من الحسابات الآلية"
|
||||||
configure: "اضبط"
|
configure: "اضبط"
|
||||||
postToGallery: "انشر في المعرض"
|
postToGallery: "انشر في المعرض"
|
||||||
|
postToHashtag: "انشر بهذا الوسم"
|
||||||
gallery: "المعرض"
|
gallery: "المعرض"
|
||||||
recentPosts: "المشاركات الحديثة"
|
recentPosts: "المشاركات الحديثة"
|
||||||
popularPosts: "المشاركات المتداولة"
|
popularPosts: "المشاركات المتداولة"
|
||||||
shareWithNote: "شاركه في ملاحظة"
|
shareWithNote: "شاركه في ملاحظة"
|
||||||
ads: "الإعلانات"
|
ads: "الإعلانات"
|
||||||
expiration: "ينتهي استطلاع الرأي في"
|
expiration: "ينتهي استطلاع الرأي في"
|
||||||
|
startingperiod: "ابدأ"
|
||||||
memo: "تذكير"
|
memo: "تذكير"
|
||||||
priority: "الأولوية"
|
priority: "الأولوية"
|
||||||
high: "عالية"
|
high: "عالية"
|
||||||
@@ -750,13 +789,16 @@ translate: "ترجم"
|
|||||||
translatedFrom: "تُرجم من {x}"
|
translatedFrom: "تُرجم من {x}"
|
||||||
accountDeletionInProgress: "حذف الحساب جارٍ"
|
accountDeletionInProgress: "حذف الحساب جارٍ"
|
||||||
usernameInfo: "الاسم الذي يميزك عن بافي مستخدمي هذا الخادم، يمكنك استخدام الحروف اللاتينية (a~z, A~Z) والأرقام (0~9) والشرطة السفلية (_). لا يمكنك تغييره بعد تسجيله."
|
usernameInfo: "الاسم الذي يميزك عن بافي مستخدمي هذا الخادم، يمكنك استخدام الحروف اللاتينية (a~z, A~Z) والأرقام (0~9) والشرطة السفلية (_). لا يمكنك تغييره بعد تسجيله."
|
||||||
|
devMode: "وضع المُطوّر"
|
||||||
keepCw: "أبقِ على تحذيرات المحتوى"
|
keepCw: "أبقِ على تحذيرات المحتوى"
|
||||||
lastCommunication: "آخر تواصل"
|
lastCommunication: "آخر تواصل"
|
||||||
resolved: "عولج"
|
resolved: "عولج"
|
||||||
unresolved: "لم يعالج"
|
unresolved: "لم يعالج"
|
||||||
breakFollow: "إلغاء الاشتراك"
|
breakFollow: "إلغاء الاشتراك"
|
||||||
|
breakFollowConfirm: "أمتأكد من إزالة المتابِع ؟"
|
||||||
itsOn: "مفعّل"
|
itsOn: "مفعّل"
|
||||||
itsOff: "معطّل"
|
itsOff: "معطّل"
|
||||||
|
on: "مفعل"
|
||||||
emailRequiredForSignup: "عنوان البريد الإلكتروني إلزامي للتسجيل"
|
emailRequiredForSignup: "عنوان البريد الإلكتروني إلزامي للتسجيل"
|
||||||
unread: "غير مقروءة"
|
unread: "غير مقروءة"
|
||||||
filter: "رشّح"
|
filter: "رشّح"
|
||||||
@@ -769,6 +811,7 @@ muteThread: "اكتم النقاش"
|
|||||||
unmuteThread: "ارفع الكتم عن النقاش"
|
unmuteThread: "ارفع الكتم عن النقاش"
|
||||||
ffVisibility: "مرئية المتابِعين/المتابَعين"
|
ffVisibility: "مرئية المتابِعين/المتابَعين"
|
||||||
ffVisibilityDescription: "يسمح لك بتحديد من يمكنهم رؤية متابِعيك ومتابَعيك."
|
ffVisibilityDescription: "يسمح لك بتحديد من يمكنهم رؤية متابِعيك ومتابَعيك."
|
||||||
|
continueThread: "اعرض بقية النقاش"
|
||||||
deleteAccountConfirm: "سيحذف حسابك نهائيًا، أتريد المتابعة؟"
|
deleteAccountConfirm: "سيحذف حسابك نهائيًا، أتريد المتابعة؟"
|
||||||
incorrectPassword: "كلمة السر خاطئة."
|
incorrectPassword: "كلمة السر خاطئة."
|
||||||
voteConfirm: "متيقِّن من تصويتك لـ {choice}؟"
|
voteConfirm: "متيقِّن من تصويتك لـ {choice}؟"
|
||||||
@@ -790,25 +833,239 @@ tenMinutes: "10 دقائق"
|
|||||||
oneHour: "ساعة"
|
oneHour: "ساعة"
|
||||||
oneDay: "يوم"
|
oneDay: "يوم"
|
||||||
oneWeek: "أسبوع"
|
oneWeek: "أسبوع"
|
||||||
|
oneMonth: "شهر"
|
||||||
failedToFetchAccountInformation: "تعذر جلب معلومات الحساب"
|
failedToFetchAccountInformation: "تعذر جلب معلومات الحساب"
|
||||||
|
cropNo: "استخدمها كما هي"
|
||||||
file: "الملفات"
|
file: "الملفات"
|
||||||
|
recentNHours: "آخر {n} ساعة"
|
||||||
|
recentNDays: "آخر {n} أيام"
|
||||||
|
noEmailServerWarning: "خادم البريد غير مضبوط."
|
||||||
|
thereIsUnresolvedAbuseReportWarning: "توجد بلاغات غير معالجة."
|
||||||
|
recommended: "مقترح"
|
||||||
|
driveCapOverrideLabel: "غيّر حجم قرص التخزين لهذا المستخدم"
|
||||||
|
driveCapOverrideCaption: "أعد الحجم إلى القيمة الافتراضية بإدخال 0 أو أقل."
|
||||||
|
requireAdminForView: "لاستعراض هذه الصفحة وجب عليك الولوج كمدير."
|
||||||
|
typeToConfirm: "أدخل {x} للتأكيد"
|
||||||
|
deleteAccount: "احذف الحساب"
|
||||||
|
document: "التوثيق"
|
||||||
|
numberOfPageCache: "عدد الصفحات المخزنة مؤقتًا"
|
||||||
|
logoutConfirm: "أتريد الخروج؟"
|
||||||
|
lastActiveDate: "آخر استخدام"
|
||||||
|
statusbar: "شريط الحالة"
|
||||||
|
pleaseSelect: "حدد خيارًا"
|
||||||
reverse: "اقلب"
|
reverse: "اقلب"
|
||||||
colored: "ملوّن"
|
colored: "ملوّن"
|
||||||
|
refreshInterval: "مهلة التحديث"
|
||||||
label: "التسمية"
|
label: "التسمية"
|
||||||
|
type: "نوع"
|
||||||
|
speed: "سرعة"
|
||||||
|
slow: "بطيء"
|
||||||
|
fast: "سريع"
|
||||||
|
sensitiveMediaDetection: "التعرف على المحتوى الحساس"
|
||||||
localOnly: "المحلي فقط"
|
localOnly: "المحلي فقط"
|
||||||
|
failedToUpload: "فشل الرفع"
|
||||||
|
cannotUploadBecauseInappropriate: "تعذر رفع الملف لوجود محتوى حساس فيه."
|
||||||
|
cannotUploadBecauseNoFreeSpace: "تعذر رفع الملف لنقص مساحة التخزين."
|
||||||
|
cannotUploadBecauseExceedsFileSizeLimit: "تعذر رفع الملف بسبب تجاوز حجمه للحد المسموح"
|
||||||
|
beta: "بيتا"
|
||||||
|
enableAutoSensitive: "تعيين تلقائي كمحتوى حساس NSFW"
|
||||||
|
enableAutoSensitiveDescription: "عند الاستطاعة يسمح باكتشاف المحتوى حساس NSFW تلقائيًا في الوسائط باستخدام تعلم الآلة ووسمها تبعًا لذلك. قد يكون هذا الخيار مفعلا من جهة الخادم وسيعمل حتى وان عُطل."
|
||||||
|
activeEmailValidationDescription: "يتحقق من صحة عنوان البريد الإلكتروني بشكل أكثر حزمًا وذلك عبر تحديد ما إذا كان عنوان بريد إلكتروني مؤقت وإمكانية التواصل معه. إذا لم يحدد هذا الخيار فسيتحقق من نسق عنوان البريد الإلكتروني."
|
||||||
|
navbar: "شريط التنقل"
|
||||||
|
shuffle: "خلط"
|
||||||
account: "الحسابات"
|
account: "الحسابات"
|
||||||
|
move: "أنقل"
|
||||||
|
pushNotification: "إرسال الإشعارات"
|
||||||
|
subscribePushNotification: "فعّل إرسال الإشعارات"
|
||||||
|
unsubscribePushNotification: "عطل إرسال الإشعارات"
|
||||||
|
pushNotificationAlreadySubscribed: "إرسال الإشعارات مفعل سلفًا"
|
||||||
|
pushNotificationNotSupported: "متصفحك لا يدعم إرسال الإشعارات أو المثيل لا يدعمها."
|
||||||
|
sendPushNotificationReadMessage: "احذف الإشعارات فور قراءتها"
|
||||||
|
sendPushNotificationReadMessageCaption: "هذا قد يزيد من معدل استهلاك الطاقة لجهازك."
|
||||||
|
windowRestore: "استرجاع"
|
||||||
|
caption: "التعليق التوضيحي"
|
||||||
|
loggedInAsBot: "والج كآلي"
|
||||||
|
tools: "أدوات"
|
||||||
cannotLoad: "تعذر التحميل"
|
cannotLoad: "تعذر التحميل"
|
||||||
|
numberOfProfileView: "مشاهدات الملف الشخصي"
|
||||||
like: "أعجبني"
|
like: "أعجبني"
|
||||||
|
unlike: "ألغِ الإعجاب"
|
||||||
|
numberOfLikes: "الإعجابات"
|
||||||
show: "المظهر"
|
show: "المظهر"
|
||||||
|
neverShow: "لا تظهره مجددًا"
|
||||||
|
remindMeLater: "ربما لاحقا"
|
||||||
|
didYouLikeMisskey: "هل أعجبك ميسكي؟"
|
||||||
|
pleaseDonate: "يستخدم {host} البرمجية الحرة ميسكي. نتمنى أن تتبرعوا للمشروع مما سيسمح لنا متابعة تطويره!"
|
||||||
|
roles: "الأدوار"
|
||||||
|
role: "الدور"
|
||||||
|
noRole: "لم يُعثر على دور"
|
||||||
|
normalUser: "مستخدم عادي"
|
||||||
|
undefined: "غير معرّف"
|
||||||
|
assign: "أسند"
|
||||||
|
unassign: "ألغ الإسناد"
|
||||||
color: "اللون"
|
color: "اللون"
|
||||||
|
manageCustomEmojis: "إدارة الإيموجي المخصصة"
|
||||||
|
youCannotCreateAnymore: "وصلت لسقف الإنشاء."
|
||||||
|
cannotPerformTemporary: "غير متاح مؤقتاً"
|
||||||
|
permissionDeniedError: "رُفضة العملية"
|
||||||
|
preset: "إعدادات مسبقة"
|
||||||
|
selectFromPresets: "اختر من الإعدادات المسبقة"
|
||||||
|
achievements: "الإنجازات"
|
||||||
|
gotInvalidResponseError: "استجابة غير متوقعة من الخادم"
|
||||||
|
gotInvalidResponseErrorDescription: "يتعذر الوصول إلى الخادم أوأنه يُصان، رجاءً حاول لاحقًا."
|
||||||
|
thisPostMayBeAnnoying: "هذا قد يزعج الآخرين."
|
||||||
|
thisPostMayBeAnnoyingHome: "أنشر في الخط الزمني الرئيس"
|
||||||
|
thisPostMayBeAnnoyingCancel: "ألغِ"
|
||||||
|
internalServerError: "خطأ داخلي في الخادم"
|
||||||
|
internalServerErrorDescription: "واجه الخادم خطأ غي متوقع."
|
||||||
|
copyErrorInfo: "انسخ تفاصيل الخطأ"
|
||||||
|
joinThisServer: "سجل في هذا المثيل"
|
||||||
|
exploreOtherServers: "اعثر على مثيل آخر"
|
||||||
|
disableFederationOk: "عطّل"
|
||||||
|
invitationRequiredToRegister: "هذا المثيل للمدعوين فقط. لتسجيل فيه تحتاج رمزًا صالحًا."
|
||||||
|
postToTheChannel: "انشر في قناة"
|
||||||
|
cannotBeChangedLater: "لا يمكن تغييره لاحقًا."
|
||||||
|
reactionAcceptance: "قبول التفاعلات"
|
||||||
|
rolesAssignedToMe: "الأدوار المسندة إلي"
|
||||||
|
resetPasswordConfirm: "هل تريد إعادة تعيين كلمة السر؟"
|
||||||
|
license: "الرخصة"
|
||||||
|
unfavoriteConfirm: "أتريد إزالتها من المفضلة؟"
|
||||||
|
noteIdOrUrl: "معرف الملاحظة أو رابطها"
|
||||||
|
video: "فيديو"
|
||||||
|
videos: "فيديوهات"
|
||||||
|
accountMigration: "ترحيل الحساب"
|
||||||
|
accountMoved: "نقل هذا المستخدم حسابه:"
|
||||||
|
accountMovedShort: "رُحل هذا الحساب."
|
||||||
|
operationForbidden: "عملية ممنوعة"
|
||||||
|
forceShowAds: "أظهر الإعلانات التجارية دائما"
|
||||||
|
leftTop: "أعلى اليسار"
|
||||||
|
rightTop: "أعلى اليمين"
|
||||||
|
leftBottom: "أسفل اليسار"
|
||||||
|
rightBottom: "أسفل اليمين"
|
||||||
|
stackAxis: "اتجاه التكديس"
|
||||||
|
vertical: "عمودي"
|
||||||
horizontal: "جانبي"
|
horizontal: "جانبي"
|
||||||
|
position: "الموضع"
|
||||||
|
serverRules: "قوانين الخادم"
|
||||||
|
pleaseConfirmBelowBeforeSignup: "رجاءً وافق على ما يلي قبل التسجيل."
|
||||||
|
pleaseAgreeAllToContinue: "للمتابعة وافق على الحقول أعلاه."
|
||||||
|
continue: "متابعة"
|
||||||
|
preservedUsernames: "أسماء المستخدمين المحجوزة"
|
||||||
|
preservedUsernamesDescription: "قائمة بأسماء المستخدمين المحجوزة كلٌ في سطر. لن يُقبل التسجيل بهذه الأسماء وستبقى محصورة على التسجيل اليدوي بواسطة المديرين. لن يتأثر المستخدمون الذين يملكون هذه الأسماء سلفًا."
|
||||||
|
createNoteFromTheFile: "أنشئ ملاحظة من هذا الملف"
|
||||||
|
archive: "الأرشيف"
|
||||||
|
channelArchiveConfirmTitle: "أتريد أرشفت {name}؟"
|
||||||
|
channelArchiveConfirmDescription: "لن يمكنك نشر ملاحظات في القناة المأرشفة ولن تظهر في قائمة القنوات ولا في نتائج البحث."
|
||||||
|
thisChannelArchived: "أُرشفت هذه القناة."
|
||||||
|
displayOfNote: "عرض الملاحظة"
|
||||||
|
initialAccountSetting: "إعداد الملف الشخصي"
|
||||||
youFollowing: "متابَع"
|
youFollowing: "متابَع"
|
||||||
|
options: "خيارات"
|
||||||
|
specifyUser: "مستخدم محدد"
|
||||||
|
failedToPreviewUrl: "تتعذر المعاينة"
|
||||||
|
update: "حدِّث"
|
||||||
|
rolesThatCanBeUsedThisEmojiAsReaction: "الأدوار التي يُسمح لأصحابها استخدام هذا اإيموجي في اللتفاعل"
|
||||||
|
rolesThatCanBeUsedThisEmojiAsReactionEmptyDescription: "إذا لم تحدد دورًا يمكن للجميع استخدام هذا الإيموجي في التفاعل."
|
||||||
|
rolesThatCanBeUsedThisEmojiAsReactionPublicRoleWarn: "يجب أن تكون الأدوار علنية."
|
||||||
|
cancelReactionConfirm: "أتريد حذف تفاعلك؟"
|
||||||
|
changeReactionConfirm: "أتريد تعديل تفاعلك؟"
|
||||||
|
later: "لاحقاً"
|
||||||
|
goToMisskey: "لميسكي"
|
||||||
|
additionalEmojiDictionary: "قواميس إيموجي إضافية"
|
||||||
|
installed: "مُثبت"
|
||||||
|
_initialAccountSetting:
|
||||||
|
accountCreated: "نجح إنشاء حسابك!"
|
||||||
|
letsStartAccountSetup: "إذا كنت جديدًا لنعدّ حسابك الشخصي."
|
||||||
|
letsFillYourProfile: "أولًا لنعد ملفك الشخصي."
|
||||||
|
profileSetting: "إعدادات الملف الشخصي"
|
||||||
|
privacySetting: "إعدادات الخصوصية"
|
||||||
|
theseSettingsCanEditLater: "يمكنك تغيير هذه الإعدادات لاحقًا."
|
||||||
|
_accountMigration:
|
||||||
|
moveFrom: "انقل حسابًا آخر لهذا الحساب"
|
||||||
|
moveFromLabel: "الحساب الأصلي #{n}"
|
||||||
|
moveTo: "انقل هذا الحساب لحساب آخر"
|
||||||
|
moveToLabel: "الحساب الوجهة:"
|
||||||
|
moveCannotBeUndone: "لا يمكن التراجع عن نقل الحساب."
|
||||||
|
movedTo: "الحساب الوجهة:"
|
||||||
|
_achievements:
|
||||||
|
_types:
|
||||||
|
_notes1:
|
||||||
|
description: "انشر ملاحظتك الأولى"
|
||||||
|
flavor: "تمتع باستخدام ميسكي!"
|
||||||
|
_notes10:
|
||||||
|
title: "بعض الملاحظات"
|
||||||
|
description: "انشر 10 ملاحظات"
|
||||||
|
_notes100:
|
||||||
|
title: "كثير من الملاحظات"
|
||||||
|
description: "انشر 100 ملاحظة"
|
||||||
|
_notes500:
|
||||||
|
description: "انشر 500 ملاحظة"
|
||||||
|
_notes1000:
|
||||||
|
title: "جبل ملاحظات"
|
||||||
|
description: "انشر 1000 ملاحظة"
|
||||||
|
_notes5000:
|
||||||
|
description: "انشر 5000 ملاحظة"
|
||||||
|
_notes10000:
|
||||||
|
description: "انشر 10000 ملاحظة"
|
||||||
|
_notes20000:
|
||||||
|
title: "أريد...ملاحظات...أكثر"
|
||||||
|
description: "انشر 20000 ملاحظة"
|
||||||
|
_notes30000:
|
||||||
|
title: "ملاحظات وملاحظات وملاحظات"
|
||||||
|
description: "انشر 30000 ملاحظة"
|
||||||
|
_notes40000:
|
||||||
|
title: "مصنع ملاحظات"
|
||||||
|
description: "انشر 40000 ملاحظة"
|
||||||
|
_notes50000:
|
||||||
|
title: "كوكب ملاحظات"
|
||||||
|
description: "انشر 50000 ملاحظة"
|
||||||
|
_notes60000:
|
||||||
|
title: "نجم ملاحظات"
|
||||||
|
description: "انشر 60000 ملاحظة"
|
||||||
|
_notes70000:
|
||||||
|
title: "ثقب أسود للملاحظات"
|
||||||
|
description: "انشر 70000 ملاحظة"
|
||||||
|
_notes80000:
|
||||||
|
title: "مجرة ملاحظات"
|
||||||
|
description: "انشر 80000 ملاحظة"
|
||||||
|
_notes90000:
|
||||||
|
title: "كوْن ملاحظات"
|
||||||
|
description: "انشر 90000 ملاحظة"
|
||||||
|
_notes100000:
|
||||||
|
title: "كل ملاحظاتك لنا"
|
||||||
|
description: "انشر 100000 ملاحظة"
|
||||||
|
flavor: "حقًا لديك الكثير من القصص"
|
||||||
|
_login3:
|
||||||
|
title: "مبتدأ I"
|
||||||
|
_noteFavorited1:
|
||||||
|
description: "فضًِل ملاحظتك الأولى"
|
||||||
|
_myNoteFavorited1:
|
||||||
|
title: "ساعٍ للنجوم"
|
||||||
|
description: "أعجب شخص آخر بإحدى ملاحظاتك"
|
||||||
|
_profileFilled:
|
||||||
|
title: "مستعد"
|
||||||
|
description: "أعدّ حسابك"
|
||||||
|
_markedAsCat:
|
||||||
|
title: "أنا قط"
|
||||||
_role:
|
_role:
|
||||||
|
new: "دور جديد"
|
||||||
|
edit: "حرر الأدوار"
|
||||||
|
name: "اسم الدور"
|
||||||
|
description: "وصف الدور"
|
||||||
|
permission: "أذونات الدور"
|
||||||
|
assignTarget: "نوع الإسناد"
|
||||||
|
options: "خيارات"
|
||||||
|
policies: "السياسة العامة"
|
||||||
priority: "الأولوية"
|
priority: "الأولوية"
|
||||||
_priority:
|
_priority:
|
||||||
low: "منخفضة"
|
low: "منخفضة"
|
||||||
middle: "متوسط"
|
middle: "متوسط"
|
||||||
high: "عالية"
|
high: "عالية"
|
||||||
|
_options:
|
||||||
|
canManageCustomEmojis: "إدارة الإيموجي المخصصة"
|
||||||
|
_condition:
|
||||||
|
isLocal: "مستخدم محلي"
|
||||||
|
isRemote: "مستخدم بعيد"
|
||||||
_emailUnavailable:
|
_emailUnavailable:
|
||||||
used: "هذا البريد الإلكتروني مستخدم"
|
used: "هذا البريد الإلكتروني مستخدم"
|
||||||
format: "صيغة البريد الإلكتروني غير صالحة"
|
format: "صيغة البريد الإلكتروني غير صالحة"
|
||||||
@@ -866,10 +1123,6 @@ _aboutMisskey:
|
|||||||
donate: "تبرع لميسكي"
|
donate: "تبرع لميسكي"
|
||||||
morePatrons: "نحن نقدر الدعم الذي قدمه العديد من الأشخاص الذين لم نذكرهم. شكرًا لكم 🥰"
|
morePatrons: "نحن نقدر الدعم الذي قدمه العديد من الأشخاص الذين لم نذكرهم. شكرًا لكم 🥰"
|
||||||
patrons: "الداعمون"
|
patrons: "الداعمون"
|
||||||
_nsfw:
|
|
||||||
respect: "اخف الوسائط ذات المحتوى الحساس"
|
|
||||||
ignore: "اعرض الوسائط ذات المحتوى الحساس"
|
|
||||||
force: "اخف كل الوسائط"
|
|
||||||
_instanceTicker:
|
_instanceTicker:
|
||||||
none: "لا تظهره بتاتًا"
|
none: "لا تظهره بتاتًا"
|
||||||
remote: "أظهر للمستخدمين البِعاد"
|
remote: "أظهر للمستخدمين البِعاد"
|
||||||
@@ -1056,6 +1309,7 @@ _widgets:
|
|||||||
onlineUsers: "المتّصلون"
|
onlineUsers: "المتّصلون"
|
||||||
jobQueue: "قائمة الانتظار"
|
jobQueue: "قائمة الانتظار"
|
||||||
serverMetric: "إحصائيات الخادم"
|
serverMetric: "إحصائيات الخادم"
|
||||||
|
userList: "قائمة المستخدمين"
|
||||||
_userList:
|
_userList:
|
||||||
chooseList: "اختر قائمة"
|
chooseList: "اختر قائمة"
|
||||||
_cw:
|
_cw:
|
||||||
@@ -1119,6 +1373,7 @@ _profile:
|
|||||||
changeBanner: "غيّر اللافتة"
|
changeBanner: "غيّر اللافتة"
|
||||||
_exportOrImport:
|
_exportOrImport:
|
||||||
allNotes: "كل الملاحظات"
|
allNotes: "كل الملاحظات"
|
||||||
|
favoritedNotes: " الملاحظات المفضلة"
|
||||||
followingList: "المتابَعون"
|
followingList: "المتابَعون"
|
||||||
muteList: "المستخدمون المكتومون"
|
muteList: "المستخدمون المكتومون"
|
||||||
blockingList: "المستخدمون المحجوبون"
|
blockingList: "المستخدمون المحجوبون"
|
||||||
@@ -1137,6 +1392,8 @@ _charts:
|
|||||||
notesTotal: "إجمالي الملاحظات"
|
notesTotal: "إجمالي الملاحظات"
|
||||||
filesIncDec: "تباين عدد الملفات"
|
filesIncDec: "تباين عدد الملفات"
|
||||||
filesTotal: "العدد الإجمالي للملفات"
|
filesTotal: "العدد الإجمالي للملفات"
|
||||||
|
storageUsageIncDec: "التباين في استغلال مساحة التخزين"
|
||||||
|
storageUsageTotal: "اجمالي مساحة التخزين المستغلة"
|
||||||
_instanceCharts:
|
_instanceCharts:
|
||||||
requests: "الطلبات"
|
requests: "الطلبات"
|
||||||
users: "تباين عدد المستخدمين"
|
users: "تباين عدد المستخدمين"
|
||||||
@@ -1197,7 +1454,7 @@ _pages:
|
|||||||
text: "نص"
|
text: "نص"
|
||||||
textarea: "حقل نصي"
|
textarea: "حقل نصي"
|
||||||
section: "قسم"
|
section: "قسم"
|
||||||
image: "الصور"
|
image: "صور"
|
||||||
button: "زرّ"
|
button: "زرّ"
|
||||||
note: "ملاحظة مضمّنة"
|
note: "ملاحظة مضمّنة"
|
||||||
_note:
|
_note:
|
||||||
@@ -1256,3 +1513,5 @@ _deck:
|
|||||||
_webhookSettings:
|
_webhookSettings:
|
||||||
name: "الإسم"
|
name: "الإسم"
|
||||||
active: "مفعّل"
|
active: "مفعّل"
|
||||||
|
_events:
|
||||||
|
reaction: "عند تلقي تفاعل"
|
||||||
|
|||||||
@@ -294,7 +294,6 @@ copyUrl: "URL কপি করুন"
|
|||||||
rename: "পুনঃনামকরণ"
|
rename: "পুনঃনামকরণ"
|
||||||
avatar: "প্রোফাইল ছবি"
|
avatar: "প্রোফাইল ছবি"
|
||||||
banner: "ব্যানার"
|
banner: "ব্যানার"
|
||||||
nsfw: "সংবেদনশীল বিষয়বস্তু"
|
|
||||||
whenServerDisconnected: "সার্ভারের সাথে সংযোগ বিচ্ছিন্ন হয়ে গেলে"
|
whenServerDisconnected: "সার্ভারের সাথে সংযোগ বিচ্ছিন্ন হয়ে গেলে"
|
||||||
disconnectedFromServer: "সার্ভার থেকে সংযোগ বিচ্ছিন্ন হয়েছে"
|
disconnectedFromServer: "সার্ভার থেকে সংযোগ বিচ্ছিন্ন হয়েছে"
|
||||||
reload: "আবার লোড করুন"
|
reload: "আবার লোড করুন"
|
||||||
@@ -902,10 +901,6 @@ _aboutMisskey:
|
|||||||
donate: "Misskey তে দান করুন"
|
donate: "Misskey তে দান করুন"
|
||||||
morePatrons: "আরও অনেকে আমাদের সাহায্য করছেন। তাদের সবাইকে ধন্যবাদ 🥰"
|
morePatrons: "আরও অনেকে আমাদের সাহায্য করছেন। তাদের সবাইকে ধন্যবাদ 🥰"
|
||||||
patrons: "সমর্থনকারী"
|
patrons: "সমর্থনকারী"
|
||||||
_nsfw:
|
|
||||||
respect: "স্পর্শকাতর মিডিয়া লুকান"
|
|
||||||
ignore: "স্পর্শকাতর মিডিয়া লুকাবেন না"
|
|
||||||
force: "সকল মিডিয়া লুকান"
|
|
||||||
_instanceTicker:
|
_instanceTicker:
|
||||||
none: "দেখাবেন না"
|
none: "দেখাবেন না"
|
||||||
remote: "রিমোট ব্যাবহারকারীদের জন্য দেখান"
|
remote: "রিমোট ব্যাবহারকারীদের জন্য দেখান"
|
||||||
|
|||||||
@@ -263,7 +263,6 @@ emptyFolder: "La carpeta està buida"
|
|||||||
unableToDelete: "No es pot eliminar"
|
unableToDelete: "No es pot eliminar"
|
||||||
copyUrl: "Copia l'URL"
|
copyUrl: "Copia l'URL"
|
||||||
rename: "Canvia el nom"
|
rename: "Canvia el nom"
|
||||||
nsfw: "NSFW"
|
|
||||||
reload: "Actualitza"
|
reload: "Actualitza"
|
||||||
doNothing: "Ignora"
|
doNothing: "Ignora"
|
||||||
accept: "Accepta"
|
accept: "Accepta"
|
||||||
|
|||||||
@@ -276,7 +276,6 @@ copyUrl: "Kopírovat URL"
|
|||||||
rename: "Přejmenovat"
|
rename: "Přejmenovat"
|
||||||
avatar: "Avatar"
|
avatar: "Avatar"
|
||||||
banner: "Baner"
|
banner: "Baner"
|
||||||
nsfw: "NSFW"
|
|
||||||
disconnectedFromServer: "Spojení bylo přerušeno"
|
disconnectedFromServer: "Spojení bylo přerušeno"
|
||||||
reload: "Aktualizovat"
|
reload: "Aktualizovat"
|
||||||
doNothing: "Ignorovat"
|
doNothing: "Ignorovat"
|
||||||
|
|||||||
@@ -52,6 +52,10 @@ addToList: "Zu Liste hinzufügen"
|
|||||||
sendMessage: "Nachricht senden"
|
sendMessage: "Nachricht senden"
|
||||||
copyRSS: "RSS kopieren"
|
copyRSS: "RSS kopieren"
|
||||||
copyUsername: "Benutzernamen kopieren"
|
copyUsername: "Benutzernamen kopieren"
|
||||||
|
copyUserId: "Benutzer-ID kopieren"
|
||||||
|
copyNoteId: "Notiz-ID kopieren"
|
||||||
|
copyFileId: "Datei-ID kopieren"
|
||||||
|
copyFolderId: "Ordner-ID kopieren"
|
||||||
searchUser: "Nach einem Benutzer suchen"
|
searchUser: "Nach einem Benutzer suchen"
|
||||||
reply: "Antworten"
|
reply: "Antworten"
|
||||||
loadMore: "Mehr laden"
|
loadMore: "Mehr laden"
|
||||||
@@ -110,7 +114,7 @@ pinnedNote: "Angeheftete Notiz"
|
|||||||
pinned: "Angeheftet"
|
pinned: "Angeheftet"
|
||||||
you: "Du"
|
you: "Du"
|
||||||
clickToShow: "Zum Anzeigen anklicken"
|
clickToShow: "Zum Anzeigen anklicken"
|
||||||
sensitive: "NSFW"
|
sensitive: "Sensibel"
|
||||||
add: "Hinzufügen"
|
add: "Hinzufügen"
|
||||||
reaction: "Reaktionen"
|
reaction: "Reaktionen"
|
||||||
reactions: "Reaktionen"
|
reactions: "Reaktionen"
|
||||||
@@ -118,8 +122,8 @@ reactionSetting: "In der Reaktionsauswahl anzuzeigende Reaktionen"
|
|||||||
reactionSettingDescription2: "Ziehe um Anzuordnen, klicke um zu löschen, drücke „+“ um hinzuzufügen"
|
reactionSettingDescription2: "Ziehe um Anzuordnen, klicke um zu löschen, drücke „+“ um hinzuzufügen"
|
||||||
rememberNoteVisibility: "Notizsichtbarkeit merken"
|
rememberNoteVisibility: "Notizsichtbarkeit merken"
|
||||||
attachCancel: "Anhang entfernen"
|
attachCancel: "Anhang entfernen"
|
||||||
markAsSensitive: "Als NSFW markieren"
|
markAsSensitive: "Als sensibel markieren"
|
||||||
unmarkAsSensitive: "Als nicht NSFW markieren"
|
unmarkAsSensitive: "Als nicht sensibel markieren"
|
||||||
enterFileName: "Dateinamen eingeben"
|
enterFileName: "Dateinamen eingeben"
|
||||||
mute: "Stummschalten"
|
mute: "Stummschalten"
|
||||||
unmute: "Stummschaltung aufheben"
|
unmute: "Stummschaltung aufheben"
|
||||||
@@ -134,8 +138,10 @@ unblockConfirm: "Möchtest du diese Blockierung wirklich aufheben?"
|
|||||||
suspendConfirm: "Möchtest du diesen Benutzer wirklich sperren?"
|
suspendConfirm: "Möchtest du diesen Benutzer wirklich sperren?"
|
||||||
unsuspendConfirm: "Möchtest du diesen Benutzer wirklich entsperren?"
|
unsuspendConfirm: "Möchtest du diesen Benutzer wirklich entsperren?"
|
||||||
selectList: "Liste auswählen"
|
selectList: "Liste auswählen"
|
||||||
|
editList: "Liste bearbeiten"
|
||||||
selectChannel: "Kanal auswählen"
|
selectChannel: "Kanal auswählen"
|
||||||
selectAntenna: "Antenne auswählen"
|
selectAntenna: "Antenne auswählen"
|
||||||
|
editAntenna: "Antenne bearbeiten"
|
||||||
selectWidget: "Widget auswählen"
|
selectWidget: "Widget auswählen"
|
||||||
editWidgets: "Widgets bearbeiten"
|
editWidgets: "Widgets bearbeiten"
|
||||||
editWidgetsExit: "Fertig"
|
editWidgetsExit: "Fertig"
|
||||||
@@ -309,7 +315,7 @@ copyUrl: "URL kopieren"
|
|||||||
rename: "Umbenennen"
|
rename: "Umbenennen"
|
||||||
avatar: "Profilbild"
|
avatar: "Profilbild"
|
||||||
banner: "Banner"
|
banner: "Banner"
|
||||||
nsfw: "NSFW"
|
displayOfSensitiveMedia: "Anzeige von sensiblen Medien"
|
||||||
whenServerDisconnected: "Bei Verbindungsverlust zum Server"
|
whenServerDisconnected: "Bei Verbindungsverlust zum Server"
|
||||||
disconnectedFromServer: "Die Verbindung zum Server wurde getrennt"
|
disconnectedFromServer: "Die Verbindung zum Server wurde getrennt"
|
||||||
reload: "Aktualisieren"
|
reload: "Aktualisieren"
|
||||||
@@ -691,7 +697,7 @@ driveUsage: "Drive-Auslastung"
|
|||||||
noCrawle: "Crawler-Indexierung ablehnen"
|
noCrawle: "Crawler-Indexierung ablehnen"
|
||||||
noCrawleDescription: "Suchmaschinen bitten, die eigene Profilseite, Notizen, Seiten usw. nicht zu indexieren."
|
noCrawleDescription: "Suchmaschinen bitten, die eigene Profilseite, Notizen, Seiten usw. nicht zu indexieren."
|
||||||
lockedAccountInfo: "Auch wenn du Follow-Anfragen auf manuelle Bestätigung setzt, wird jede deiner Notizen öffentlich sichtbar sein, sofern du ihre Notizsichtbarkeit nicht auf \"Nur Follower\" setzt."
|
lockedAccountInfo: "Auch wenn du Follow-Anfragen auf manuelle Bestätigung setzt, wird jede deiner Notizen öffentlich sichtbar sein, sofern du ihre Notizsichtbarkeit nicht auf \"Nur Follower\" setzt."
|
||||||
alwaysMarkSensitive: "Medien standardmäßig als NSFW markieren"
|
alwaysMarkSensitive: "Medien standardmäßig als sensibel markieren"
|
||||||
loadRawImages: "Anstatt Vorschaubilder immer Originalbilder anzeigen"
|
loadRawImages: "Anstatt Vorschaubilder immer Originalbilder anzeigen"
|
||||||
disableShowingAnimatedImages: "Animierte Bilder nicht abspielen"
|
disableShowingAnimatedImages: "Animierte Bilder nicht abspielen"
|
||||||
verificationEmailSent: "Eine Bestätigungsmail wurde an deine Email-Adresse versendet. Besuche den dort enthaltenen Link, um die Verifizierung abzuschließen."
|
verificationEmailSent: "Eine Bestätigungsmail wurde an deine Email-Adresse versendet. Besuche den dort enthaltenen Link, um die Verifizierung abzuschließen."
|
||||||
@@ -790,6 +796,7 @@ noMaintainerInformationWarning: "Betreiberinformationen sind nicht konfiguriert.
|
|||||||
noBotProtectionWarning: "Schutz vor Bots ist nicht konfiguriert."
|
noBotProtectionWarning: "Schutz vor Bots ist nicht konfiguriert."
|
||||||
configure: "Konfigurieren"
|
configure: "Konfigurieren"
|
||||||
postToGallery: "Neuen Galeriebeitrag erstellen"
|
postToGallery: "Neuen Galeriebeitrag erstellen"
|
||||||
|
postToHashtag: "Mit diesem Hashtag senden"
|
||||||
gallery: "Galerie"
|
gallery: "Galerie"
|
||||||
recentPosts: "Neue Beiträge"
|
recentPosts: "Neue Beiträge"
|
||||||
popularPosts: "Beliebte Beiträge"
|
popularPosts: "Beliebte Beiträge"
|
||||||
@@ -823,6 +830,7 @@ translatedFrom: "Aus {x} übersetzt"
|
|||||||
accountDeletionInProgress: "Die Löschung deines Benutzerkontos ist momentan in Bearbeitung."
|
accountDeletionInProgress: "Die Löschung deines Benutzerkontos ist momentan in Bearbeitung."
|
||||||
usernameInfo: "Ein Name, durch den dein Benutzerkonto auf diesem Server identifiziert werden kann. Du kannst das Alphabet (a~z, A~Z), Ziffern (0~9) oder Unterstriche (_) verwenden. Benutzernamen können später nicht geändert werden."
|
usernameInfo: "Ein Name, durch den dein Benutzerkonto auf diesem Server identifiziert werden kann. Du kannst das Alphabet (a~z, A~Z), Ziffern (0~9) oder Unterstriche (_) verwenden. Benutzernamen können später nicht geändert werden."
|
||||||
aiChanMode: "Ai-Modus"
|
aiChanMode: "Ai-Modus"
|
||||||
|
devMode: "Entwicklermodus"
|
||||||
keepCw: "Inhaltswarnungen beibehalten"
|
keepCw: "Inhaltswarnungen beibehalten"
|
||||||
pubSub: "Pub/Sub Benutzerkonten"
|
pubSub: "Pub/Sub Benutzerkonten"
|
||||||
lastCommunication: "Letzte Kommunikation"
|
lastCommunication: "Letzte Kommunikation"
|
||||||
@@ -832,6 +840,8 @@ breakFollow: "Follower entfernen"
|
|||||||
breakFollowConfirm: "Diesen Follower wirklich entfernen?"
|
breakFollowConfirm: "Diesen Follower wirklich entfernen?"
|
||||||
itsOn: "Eingeschaltet"
|
itsOn: "Eingeschaltet"
|
||||||
itsOff: "Ausgeschaltet"
|
itsOff: "Ausgeschaltet"
|
||||||
|
on: "An"
|
||||||
|
off: "Aus"
|
||||||
emailRequiredForSignup: "Angabe einer Email-Adresse als benötigt markieren"
|
emailRequiredForSignup: "Angabe einer Email-Adresse als benötigt markieren"
|
||||||
unread: "Ungelesen"
|
unread: "Ungelesen"
|
||||||
filter: "Filter"
|
filter: "Filter"
|
||||||
@@ -906,16 +916,16 @@ type: "Art"
|
|||||||
speed: "Geschwindigkeit"
|
speed: "Geschwindigkeit"
|
||||||
slow: "Langsam"
|
slow: "Langsam"
|
||||||
fast: "Schnell"
|
fast: "Schnell"
|
||||||
sensitiveMediaDetection: "Erkennung von NSFW-Medien"
|
sensitiveMediaDetection: "Erkennung von sensiblen Medien"
|
||||||
localOnly: "Nur Lokal"
|
localOnly: "Nur Lokal"
|
||||||
remoteOnly: "Nur für fremde Instanzen"
|
remoteOnly: "Nur für fremde Instanzen"
|
||||||
failedToUpload: "Hochladen fehlgeschlagen"
|
failedToUpload: "Hochladen fehlgeschlagen"
|
||||||
cannotUploadBecauseInappropriate: "Diese Datei kann nicht hochgeladen werden, da Anteile der Datei als möglicherweise NSFW festgestellt wurden."
|
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."
|
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."
|
cannotUploadBecauseExceedsFileSizeLimit: "Diese Datei kann wegen Überschreitung der Maximalgröße nicht hochgeladen werden."
|
||||||
beta: "Beta"
|
beta: "Beta"
|
||||||
enableAutoSensitive: "NSFW-Automarkierung"
|
enableAutoSensitive: "Automarkierung sensibler Medien"
|
||||||
enableAutoSensitiveDescription: "Setzt soweit möglich durch Verwendung von Machine Learning automatisch NSFW-Markierungen für Medien, die NSFW-Anteile beinhalten. Auch wenn du diese Option deaktiviert hast, ist sie möglicherweise auf Instanzebene aktiviert."
|
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."
|
||||||
activeEmailValidationDescription: "Aktivert strengere Überprüfung von E-Mail-Adressen, d.h. Testen auf Wegwerfadressen und darauf, ob mit der Adresse tatsächlich kommuniziert werden kann. Ist dies deaktiviert, so wird nur das Format der E-Mail überprüft."
|
activeEmailValidationDescription: "Aktivert strengere Überprüfung von E-Mail-Adressen, d.h. Testen auf Wegwerfadressen und darauf, ob mit der Adresse tatsächlich kommuniziert werden kann. Ist dies deaktiviert, so wird nur das Format der E-Mail überprüft."
|
||||||
navbar: "Navigationsleiste"
|
navbar: "Navigationsleiste"
|
||||||
shuffle: "Mischen"
|
shuffle: "Mischen"
|
||||||
@@ -985,11 +995,14 @@ postToTheChannel: "In Kanal senden"
|
|||||||
cannotBeChangedLater: "Kann später nicht mehr geändert werden."
|
cannotBeChangedLater: "Kann später nicht mehr geändert werden."
|
||||||
reactionAcceptance: "Reaktionsannahme"
|
reactionAcceptance: "Reaktionsannahme"
|
||||||
likeOnly: "Nur \"Gefällt mir\""
|
likeOnly: "Nur \"Gefällt mir\""
|
||||||
likeOnlyForRemote: "Nur \"Gefällt mir\" für fremde Instanzen"
|
likeOnlyForRemote: "Alle (Nur \"Gefällt mir\" für fremde Instanzen)"
|
||||||
|
nonSensitiveOnly: "Keine Sensitiven"
|
||||||
|
nonSensitiveOnlyForLocalLikeOnlyForRemote: "Keine Sensitiven (Nur \"Gefällt mir\" von fremden Instanzen)"
|
||||||
rolesAssignedToMe: "Mir zugewiesene Rollen"
|
rolesAssignedToMe: "Mir zugewiesene Rollen"
|
||||||
resetPasswordConfirm: "Wirklich Passwort zurücksetzen?"
|
resetPasswordConfirm: "Wirklich Passwort zurücksetzen?"
|
||||||
sensitiveWords: "Sensible Wörter"
|
sensitiveWords: "Sensible Wörter"
|
||||||
sensitiveWordsDescription: "Die Notizsichtbarkeit aller Notizen, die diese Wörter enthalten, wird automatisch auf \"Startseite\" gesetzt. Durch Zeilenumbrüche können mehrere konfiguriert werden."
|
sensitiveWordsDescription: "Die Notizsichtbarkeit aller Notizen, die diese Wörter enthalten, wird automatisch auf \"Startseite\" gesetzt. Durch Zeilenumbrüche können mehrere konfiguriert werden."
|
||||||
|
sensitiveWordsDescription2: "Durch die Verwendung von Leerzeichen können AND-Verknüpfungen angegeben werden und durch das Umgeben von Schrägstrichen können reguläre Ausdrücke verwendet werden."
|
||||||
notesSearchNotAvailable: "Die Notizsuche ist nicht verfügbar."
|
notesSearchNotAvailable: "Die Notizsuche ist nicht verfügbar."
|
||||||
license: "Lizenz"
|
license: "Lizenz"
|
||||||
unfavoriteConfirm: "Wirklich aus Favoriten entfernen?"
|
unfavoriteConfirm: "Wirklich aus Favoriten entfernen?"
|
||||||
@@ -1036,7 +1049,42 @@ channelArchiveConfirmTitle: "{name} wirklich archivieren?"
|
|||||||
channelArchiveConfirmDescription: "Ein archivierter Kanal taucht nicht mehr in der Kanalliste oder in Suchergebnissen auf. Zudem können ihm keine Beiträge mehr hinzugefügt werden."
|
channelArchiveConfirmDescription: "Ein archivierter Kanal taucht nicht mehr in der Kanalliste oder in Suchergebnissen auf. Zudem können ihm keine Beiträge mehr hinzugefügt werden."
|
||||||
thisChannelArchived: "Dieser Kanal wurde archiviert."
|
thisChannelArchived: "Dieser Kanal wurde archiviert."
|
||||||
displayOfNote: "Anzeige von Notizen"
|
displayOfNote: "Anzeige von Notizen"
|
||||||
|
initialAccountSetting: "Kontoeinrichtung"
|
||||||
youFollowing: "Gefolgt"
|
youFollowing: "Gefolgt"
|
||||||
|
preventAiLearning: "Verwendung in machinellem Lernen (Generative bzw. Prediktive AI/KI) ablehnen"
|
||||||
|
preventAiLearningDescription: "Fordert Crawler auf, gepostetes Text- oder Bildmaterial usw. nicht in Datensätzen für maschinelles Lernen (Generative bzw. Prediktive AI/KI) zu verwenden. Dies wird durch das Hinzufügen einer \"noai\"-Flag in der HTML-Antwort des jeweiligen Inhalts erreicht. Da diese Flag jedoch ignoriert werden kann, ist eine vollständige Verhinderung hierdurch nicht möglich."
|
||||||
|
options: "Optionen"
|
||||||
|
specifyUser: "Spezifischer Benutzer"
|
||||||
|
failedToPreviewUrl: "Vorschau nicht anzeigbar"
|
||||||
|
update: "Aktualisieren"
|
||||||
|
rolesThatCanBeUsedThisEmojiAsReaction: "Rollen, die dieses Emoji als Reaktion verwenden können"
|
||||||
|
rolesThatCanBeUsedThisEmojiAsReactionEmptyDescription: "Sind keine Rollen angegeben, kann jeder dieses Emoji als Reaktion verwenden."
|
||||||
|
rolesThatCanBeUsedThisEmojiAsReactionPublicRoleWarn: "Diese Rollen müssen öffentlich sein."
|
||||||
|
cancelReactionConfirm: "Möchtest du deine Reaktion wirklich löschen?"
|
||||||
|
changeReactionConfirm: "Möchtest du deine Reaktion wirklich ändern?"
|
||||||
|
later: "Später"
|
||||||
|
goToMisskey: "Zu Misskey"
|
||||||
|
additionalEmojiDictionary: "Zusätzliche Emoji-Wörterbücher"
|
||||||
|
installed: "Installiert"
|
||||||
|
branding: "Branding"
|
||||||
|
enableServerMachineStats: "Hardwareinformationen des Servers veröffentlichen"
|
||||||
|
enableIdenticonGeneration: "Generierung von Benutzer-Identicons aktivieren"
|
||||||
|
turnOffToImprovePerformance: "Deaktivierung kann zu höherer Leistung führen."
|
||||||
|
_initialAccountSetting:
|
||||||
|
accountCreated: "Dein Konto wurde erfolgreich erstellt!"
|
||||||
|
letsStartAccountSetup: "Lass uns nun dein Konto einrichten."
|
||||||
|
letsFillYourProfile: "Lass uns zuerst dein Profil einrichten."
|
||||||
|
profileSetting: "Profileinstellungen"
|
||||||
|
privacySetting: "Privatsphäreneinstellungen"
|
||||||
|
theseSettingsCanEditLater: "Diese Einstellungen kannst du jederzeit ändern."
|
||||||
|
youCanEditMoreSettingsInSettingsPageLater: "In den Einstellungen findest du noch viele weitere Optionen. Schau dort später mal vorbei."
|
||||||
|
followUsers: "Folge zuerst ein paar Nutzern, um deine Chronik zu füllen."
|
||||||
|
pushNotificationDescription: "Durch die Aktivierung von Push-Benachrichtigungen kannst du von {name} Benachrichtigungen direkt auf dein Gerät erhalten."
|
||||||
|
initialAccountSettingCompleted: "Kontoeinrichtung abgeschlossen!"
|
||||||
|
haveFun: "Viel Spaß mit {name}!"
|
||||||
|
ifYouNeedLearnMore: "Besuche {link}, falls du mehr über {name} (Misskey) lernen möchtest."
|
||||||
|
skipAreYouSure: "Die Kontoeinrichtung wirklich überspringen?"
|
||||||
|
laterAreYouSure: "Die Kontoeinrichtung wirklich später erledigen?"
|
||||||
_serverRules:
|
_serverRules:
|
||||||
description: "Eine Reihe von Regeln, die vor der Registrierung angezeigt werden. Eine Zusammenfassung der Nutzungsbedingungen anzuzeigen ist empfohlen."
|
description: "Eine Reihe von Regeln, die vor der Registrierung angezeigt werden. Eine Zusammenfassung der Nutzungsbedingungen anzuzeigen ist empfohlen."
|
||||||
_accountMigration:
|
_accountMigration:
|
||||||
@@ -1053,7 +1101,7 @@ _accountMigration:
|
|||||||
migrationConfirm: "Dieses Konto wirklich zu {account} umziehen? Sobald der Umzug beginnt, kann er nicht rückgängig gemacht werden, und dieses Konto nicht wieder im ursprünglichen Zustand verwendet werden."
|
migrationConfirm: "Dieses Konto wirklich zu {account} umziehen? Sobald der Umzug beginnt, kann er nicht rückgängig gemacht werden, und dieses Konto nicht wieder im ursprünglichen Zustand verwendet werden."
|
||||||
movedAndCannotBeUndone: "\nDieses Konto wurde migriert.\nDiese Aktion ist unwiderruflich."
|
movedAndCannotBeUndone: "\nDieses Konto wurde migriert.\nDiese Aktion ist unwiderruflich."
|
||||||
postMigrationNote: "Dieses Konto wird 24 Stunden nach Abschluss der Migration allen Konten, denen es derzeit folgt, nicht mehr folgen.\n\nSowohl die Anzahl der Follower als auch die der Konten, denen dieses Konto folgt, wird dann auf Null gesetzt. Um zu vermeiden, dass Follower dieses Kontos dessen Beiträge, welche nur für Follower bestimmt sind, nicht mehr sehen können, werden sie diesem Konto jedoch weiterhin folgen."
|
postMigrationNote: "Dieses Konto wird 24 Stunden nach Abschluss der Migration allen Konten, denen es derzeit folgt, nicht mehr folgen.\n\nSowohl die Anzahl der Follower als auch die der Konten, denen dieses Konto folgt, wird dann auf Null gesetzt. Um zu vermeiden, dass Follower dieses Kontos dessen Beiträge, welche nur für Follower bestimmt sind, nicht mehr sehen können, werden sie diesem Konto jedoch weiterhin folgen."
|
||||||
movedTo: "Umzugsziel:"
|
movedTo: "Neues Konto:"
|
||||||
_achievements:
|
_achievements:
|
||||||
earnedAt: "Freigeschaltet am"
|
earnedAt: "Freigeschaltet am"
|
||||||
_types:
|
_types:
|
||||||
@@ -1307,7 +1355,7 @@ _role:
|
|||||||
condition: "Bedingung"
|
condition: "Bedingung"
|
||||||
isConditionalRole: "Dies ist eine konditionale Rolle."
|
isConditionalRole: "Dies ist eine konditionale Rolle."
|
||||||
isPublic: "Öffentliche Rolle"
|
isPublic: "Öffentliche Rolle"
|
||||||
descriptionOfIsPublic: "Ist dies aktiviert, so kann jeder die Liste der Benutzer, die dieser Rolle zugewiesen sind, einsehen. Zusätzlich wird diese Rolle im Profil zugewiesener Benutzer angezeigt."
|
descriptionOfIsPublic: "Diese Rolle wird im Profil zugewiesener Benutzer angezeigt."
|
||||||
options: "Optionen"
|
options: "Optionen"
|
||||||
policies: "Richtlinien"
|
policies: "Richtlinien"
|
||||||
baseRole: "Rollenvorlage"
|
baseRole: "Rollenvorlage"
|
||||||
@@ -1316,8 +1364,8 @@ _role:
|
|||||||
iconUrl: "Icon-URL"
|
iconUrl: "Icon-URL"
|
||||||
asBadge: "Als Abzeichen anzeigen"
|
asBadge: "Als Abzeichen anzeigen"
|
||||||
descriptionOfAsBadge: "Ist dies aktiviert, so wird das Icon dieser Rolle an der Seite der Namen von Benutzern mit dieser Rolle angezeigt."
|
descriptionOfAsBadge: "Ist dies aktiviert, so wird das Icon dieser Rolle an der Seite der Namen von Benutzern mit dieser Rolle angezeigt."
|
||||||
isExplorable: "Rollenchronik veröffentlichen"
|
isExplorable: "Benutzerliste veröffentlichen"
|
||||||
descriptionOfIsExplorable: "Ist dies aktiviert, so ist die Rollenchronik dieser Rolle frei zugänglich. Die Chronik von Rollen, welche nicht öffentlich sind, wird auch bei Aktivierung nicht veröffentlicht."
|
descriptionOfIsExplorable: "Ist dies aktiviert, so ist die Chronik dieser Rolle, sowie eine Liste der Benutzer mit dieser Rolle, frei zugänglich."
|
||||||
displayOrder: "Position"
|
displayOrder: "Position"
|
||||||
descriptionOfDisplayOrder: "Je höher die Nummer, desto höher die UI-Position."
|
descriptionOfDisplayOrder: "Je höher die Nummer, desto höher die UI-Position."
|
||||||
canEditMembersByModerator: "Moderatoren können Benutzern diese Rolle zuweisen"
|
canEditMembersByModerator: "Moderatoren können Benutzern diese Rolle zuweisen"
|
||||||
@@ -1362,10 +1410,10 @@ _role:
|
|||||||
or: "ODER-Bedingung"
|
or: "ODER-Bedingung"
|
||||||
not: "NICHT-Bedingung"
|
not: "NICHT-Bedingung"
|
||||||
_sensitiveMediaDetection:
|
_sensitiveMediaDetection:
|
||||||
description: "Ermöglicht eine Erleichterung der Servermoderation durch die automatische Erkennungen von NSFW-Medien unter Verwendung von Machine Learning. Hierdurch wird die Serverlast etwas erhöht."
|
description: "Ermöglicht eine Erleichterung der Servermoderation durch die automatische Erkennungen von sensiblen Medien unter Verwendung von Machine Learning. Hierdurch wird die Serverlast etwas erhöht."
|
||||||
sensitivity: "Erkennungssensitivität"
|
sensitivity: "Erkennungssensitivität"
|
||||||
sensitivityDescription: "Durch das Senken der Sensitivität kann die Anzahl an Fehlerkennungen (sog. false positives) reduziert werden. Durch ein Erhöhen dieser kann die Anzahl an verpassten Erkennungen (sog. false negatives) reduziert werden."
|
sensitivityDescription: "Durch das Senken der Sensitivität kann die Anzahl an Fehlerkennungen (sog. false positives) reduziert werden. Durch ein Erhöhen dieser kann die Anzahl an verpassten Erkennungen (sog. false negatives) reduziert werden."
|
||||||
setSensitiveFlagAutomatically: "Als NSFW markieren"
|
setSensitiveFlagAutomatically: "Als sensibel markieren"
|
||||||
setSensitiveFlagAutomaticallyDescription: "Die Resultate der internen Erkennung werden beibehalten, auch wenn diese Option deaktiviert ist."
|
setSensitiveFlagAutomaticallyDescription: "Die Resultate der internen Erkennung werden beibehalten, auch wenn diese Option deaktiviert ist."
|
||||||
analyzeVideos: "Videoanalyse aktivieren"
|
analyzeVideos: "Videoanalyse aktivieren"
|
||||||
analyzeVideosDescription: "Analysiert zusätzlich zu Bildern auch Videos. Die Last des Servers wird hierdurch etwas erhöht."
|
analyzeVideosDescription: "Analysiert zusätzlich zu Bildern auch Videos. Die Last des Servers wird hierdurch etwas erhöht."
|
||||||
@@ -1394,6 +1442,7 @@ _ad:
|
|||||||
back: "Zurück"
|
back: "Zurück"
|
||||||
reduceFrequencyOfThisAd: "Diese Werbung weniger anzeigen"
|
reduceFrequencyOfThisAd: "Diese Werbung weniger anzeigen"
|
||||||
hide: "Ausblenden"
|
hide: "Ausblenden"
|
||||||
|
timezoneinfo: "Der Wochentag wird durch die Serverzeitzone bestimmt."
|
||||||
_forgotPassword:
|
_forgotPassword:
|
||||||
enterEmail: "Gib die Email-Adresse ein, mit der du dich registriert hast. An diese wird ein Link gesendet, mit dem du dein Passwort zurücksetzen kannst."
|
enterEmail: "Gib die Email-Adresse ein, mit der du dich registriert hast. An diese wird ein Link gesendet, mit dem du dein Passwort zurücksetzen kannst."
|
||||||
ifNoEmail: "Solltest du bei der Registrierung keine Email-Adresse angegeben haben, wende dich bitte an den Administrator."
|
ifNoEmail: "Solltest du bei der Registrierung keine Email-Adresse angegeben haben, wende dich bitte an den Administrator."
|
||||||
@@ -1445,9 +1494,9 @@ _aboutMisskey:
|
|||||||
donate: "An Misskey spenden"
|
donate: "An Misskey spenden"
|
||||||
morePatrons: "Wir schätzen ebenso die Unterstützung vieler anderer hier nicht gelisteter Personen sehr. Danke! 🥰"
|
morePatrons: "Wir schätzen ebenso die Unterstützung vieler anderer hier nicht gelisteter Personen sehr. Danke! 🥰"
|
||||||
patrons: "UnterstützerInnen"
|
patrons: "UnterstützerInnen"
|
||||||
_nsfw:
|
_displayOfSensitiveMedia:
|
||||||
respect: "Als NSFW markierte Bilder verbergen"
|
respect: "Sensible Medien verbergen"
|
||||||
ignore: "Als NSFW markierte Bilder nicht verbergen"
|
ignore: "Sensible Medien anzeigen"
|
||||||
force: "Alle Medien verbergen"
|
force: "Alle Medien verbergen"
|
||||||
_instanceTicker:
|
_instanceTicker:
|
||||||
none: "Nie anzeigen"
|
none: "Nie anzeigen"
|
||||||
@@ -1586,6 +1635,16 @@ _time:
|
|||||||
minute: "Minute(n)"
|
minute: "Minute(n)"
|
||||||
hour: "Stunde(n)"
|
hour: "Stunde(n)"
|
||||||
day: "Tag(en)"
|
day: "Tag(en)"
|
||||||
|
_timelineTutorial:
|
||||||
|
title: "Wie du Misskey verwendest"
|
||||||
|
step1_1: "Dieser Bildschirm ist die \"Chronik\". Hier werden alle \"Notizen\" von {name} angezeigt."
|
||||||
|
step1_2: "Es gibt einige verschiedene Chroniken. Beispielsweise werden in der \"Startseite\" alle Notizen von Nutzern, denen du folgst, angezeigt, und in der \"Lokalen Chronik\" werden Notizen aller Nutzer auf {name} angezeigt."
|
||||||
|
step2_1: "Lass uns als nächstes versuchen, eine Notiz zu schreiben. Dies kannst du tun, indem du auf den Knopf mit dem Stift-Icon drückst."
|
||||||
|
step2_2: "Stell dich den anderen vor oder schreibe einfach \"Hallo {name}!\", wenn du darauf keine Lust hast oder dir nichts einfällt."
|
||||||
|
step3_1: "Fertig mit dem Senden deiner ersten Notiz?"
|
||||||
|
step3_2: "Falls deine Notiz nun in deiner Chronik auftaucht, hast du alles richtig gemacht."
|
||||||
|
step4_1: "Notizen können zusätzlich mit \"Reaktionen\" ausgestattet werden."
|
||||||
|
step4_2: "Um eine Reaktion anzufügen, klicke auf das „+“-Symbol einer Notiz und wähle ein Emoji aus, mit dem du reagieren möchtest."
|
||||||
_2fa:
|
_2fa:
|
||||||
alreadyRegistered: "Du hast bereits ein Gerät für Zwei-Faktor-Authentifizierung registriert."
|
alreadyRegistered: "Du hast bereits ein Gerät für Zwei-Faktor-Authentifizierung registriert."
|
||||||
registerTOTP: "Authentifizierungs-App registrieren"
|
registerTOTP: "Authentifizierungs-App registrieren"
|
||||||
|
|||||||
@@ -52,6 +52,10 @@ addToList: "Add to list"
|
|||||||
sendMessage: "Send a message"
|
sendMessage: "Send a message"
|
||||||
copyRSS: "Copy RSS"
|
copyRSS: "Copy RSS"
|
||||||
copyUsername: "Copy username"
|
copyUsername: "Copy username"
|
||||||
|
copyUserId: "Copy user ID"
|
||||||
|
copyNoteId: "Copy note ID"
|
||||||
|
copyFileId: "Copy file ID"
|
||||||
|
copyFolderId: "Copy folder ID"
|
||||||
searchUser: "Search for a user"
|
searchUser: "Search for a user"
|
||||||
reply: "Reply"
|
reply: "Reply"
|
||||||
loadMore: "Load more"
|
loadMore: "Load more"
|
||||||
@@ -110,7 +114,7 @@ pinnedNote: "Pinned note"
|
|||||||
pinned: "Pin to profile"
|
pinned: "Pin to profile"
|
||||||
you: "You"
|
you: "You"
|
||||||
clickToShow: "Click to show"
|
clickToShow: "Click to show"
|
||||||
sensitive: "NSFW"
|
sensitive: "Sensitive"
|
||||||
add: "Add"
|
add: "Add"
|
||||||
reaction: "Reactions"
|
reaction: "Reactions"
|
||||||
reactions: "Reactions"
|
reactions: "Reactions"
|
||||||
@@ -118,8 +122,8 @@ reactionSetting: "Reactions to show in the reaction picker"
|
|||||||
reactionSettingDescription2: "Drag to reorder, click to delete, press \"+\" to add."
|
reactionSettingDescription2: "Drag to reorder, click to delete, press \"+\" to add."
|
||||||
rememberNoteVisibility: "Remember note visibility settings"
|
rememberNoteVisibility: "Remember note visibility settings"
|
||||||
attachCancel: "Remove attachment"
|
attachCancel: "Remove attachment"
|
||||||
markAsSensitive: "Mark as NSFW"
|
markAsSensitive: "Mark as sensitive"
|
||||||
unmarkAsSensitive: "Unmark as NSFW"
|
unmarkAsSensitive: "Unmark as sensitive"
|
||||||
enterFileName: "Enter filename"
|
enterFileName: "Enter filename"
|
||||||
mute: "Mute"
|
mute: "Mute"
|
||||||
unmute: "Unmute"
|
unmute: "Unmute"
|
||||||
@@ -134,8 +138,10 @@ unblockConfirm: "Are you sure that you want to unblock this account?"
|
|||||||
suspendConfirm: "Are you sure that you want to suspend this account?"
|
suspendConfirm: "Are you sure that you want to suspend this account?"
|
||||||
unsuspendConfirm: "Are you sure that you want to unsuspend this account?"
|
unsuspendConfirm: "Are you sure that you want to unsuspend this account?"
|
||||||
selectList: "Select a list"
|
selectList: "Select a list"
|
||||||
|
editList: "Edit list"
|
||||||
selectChannel: "Select a channel"
|
selectChannel: "Select a channel"
|
||||||
selectAntenna: "Select an antenna"
|
selectAntenna: "Select an antenna"
|
||||||
|
editAntenna: "Edit antenna"
|
||||||
selectWidget: "Select a widget"
|
selectWidget: "Select a widget"
|
||||||
editWidgets: "Edit widgets"
|
editWidgets: "Edit widgets"
|
||||||
editWidgetsExit: "Done"
|
editWidgetsExit: "Done"
|
||||||
@@ -309,7 +315,7 @@ copyUrl: "Copy URL"
|
|||||||
rename: "Rename"
|
rename: "Rename"
|
||||||
avatar: "Avatar"
|
avatar: "Avatar"
|
||||||
banner: "Banner"
|
banner: "Banner"
|
||||||
nsfw: "NSFW"
|
displayOfSensitiveMedia: "Display of sensitive media"
|
||||||
whenServerDisconnected: "When losing connection to the server"
|
whenServerDisconnected: "When losing connection to the server"
|
||||||
disconnectedFromServer: "Connection to server has been lost"
|
disconnectedFromServer: "Connection to server has been lost"
|
||||||
reload: "Refresh"
|
reload: "Refresh"
|
||||||
@@ -691,7 +697,7 @@ driveUsage: "Drive space usage"
|
|||||||
noCrawle: "Reject crawler indexing"
|
noCrawle: "Reject crawler indexing"
|
||||||
noCrawleDescription: "Ask search engines to not index your profile page, notes, Pages, etc."
|
noCrawleDescription: "Ask search engines to not index your profile page, notes, Pages, etc."
|
||||||
lockedAccountInfo: "Unless you set your note visiblity to \"Followers only\", your notes will be visible to anyone, even if you require followers to be manually approved."
|
lockedAccountInfo: "Unless you set your note visiblity to \"Followers only\", your notes will be visible to anyone, even if you require followers to be manually approved."
|
||||||
alwaysMarkSensitive: "Mark as NSFW by default"
|
alwaysMarkSensitive: "Mark as sensitive by default"
|
||||||
loadRawImages: "Load original images instead of showing thumbnails"
|
loadRawImages: "Load original images instead of showing thumbnails"
|
||||||
disableShowingAnimatedImages: "Don't play animated images"
|
disableShowingAnimatedImages: "Don't play animated images"
|
||||||
verificationEmailSent: "A verification email has been sent. Please follow the included link to complete verification."
|
verificationEmailSent: "A verification email has been sent. Please follow the included link to complete verification."
|
||||||
@@ -790,6 +796,7 @@ noMaintainerInformationWarning: "Maintainer information is not configured."
|
|||||||
noBotProtectionWarning: "Bot protection is not configured."
|
noBotProtectionWarning: "Bot protection is not configured."
|
||||||
configure: "Configure"
|
configure: "Configure"
|
||||||
postToGallery: "Create new gallery post"
|
postToGallery: "Create new gallery post"
|
||||||
|
postToHashtag: "Post to this hashtag"
|
||||||
gallery: "Gallery"
|
gallery: "Gallery"
|
||||||
recentPosts: "Recent posts"
|
recentPosts: "Recent posts"
|
||||||
popularPosts: "Popular posts"
|
popularPosts: "Popular posts"
|
||||||
@@ -823,6 +830,7 @@ translatedFrom: "Translated from {x}"
|
|||||||
accountDeletionInProgress: "Account deletion is currently in progress"
|
accountDeletionInProgress: "Account deletion is currently in progress"
|
||||||
usernameInfo: "A name that identifies your account from others on this server. You can use the alphabet (a~z, A~Z), digits (0~9) or underscores (_). Usernames cannot be changed later."
|
usernameInfo: "A name that identifies your account from others on this server. You can use the alphabet (a~z, A~Z), digits (0~9) or underscores (_). Usernames cannot be changed later."
|
||||||
aiChanMode: "Ai Mode"
|
aiChanMode: "Ai Mode"
|
||||||
|
devMode: "Developer mode"
|
||||||
keepCw: "Keep content warnings"
|
keepCw: "Keep content warnings"
|
||||||
pubSub: "Pub/Sub Accounts"
|
pubSub: "Pub/Sub Accounts"
|
||||||
lastCommunication: "Last communication"
|
lastCommunication: "Last communication"
|
||||||
@@ -832,6 +840,8 @@ breakFollow: "Remove follower"
|
|||||||
breakFollowConfirm: "Really remove this follower?"
|
breakFollowConfirm: "Really remove this follower?"
|
||||||
itsOn: "Enabled"
|
itsOn: "Enabled"
|
||||||
itsOff: "Disabled"
|
itsOff: "Disabled"
|
||||||
|
on: "On"
|
||||||
|
off: "Off"
|
||||||
emailRequiredForSignup: "Require email address for sign-up"
|
emailRequiredForSignup: "Require email address for sign-up"
|
||||||
unread: "Unread"
|
unread: "Unread"
|
||||||
filter: "Filter"
|
filter: "Filter"
|
||||||
@@ -906,16 +916,16 @@ type: "Type"
|
|||||||
speed: "Speed"
|
speed: "Speed"
|
||||||
slow: "Slow"
|
slow: "Slow"
|
||||||
fast: "Fast"
|
fast: "Fast"
|
||||||
sensitiveMediaDetection: "Detection of NSFW media"
|
sensitiveMediaDetection: "Detection of sensitive media"
|
||||||
localOnly: "Local only"
|
localOnly: "Local only"
|
||||||
remoteOnly: "Remote only"
|
remoteOnly: "Remote only"
|
||||||
failedToUpload: "Upload failed"
|
failedToUpload: "Upload failed"
|
||||||
cannotUploadBecauseInappropriate: "This file could not be uploaded because parts of it have been detected as potentially NSFW."
|
cannotUploadBecauseInappropriate: "This file could not be uploaded because parts of it have been detected as potentially inappropriate."
|
||||||
cannotUploadBecauseNoFreeSpace: "Upload failed due to lack of Drive capacity."
|
cannotUploadBecauseNoFreeSpace: "Upload failed due to lack of Drive capacity."
|
||||||
cannotUploadBecauseExceedsFileSizeLimit: "This file cannot be uploaded as it exceeds the file size limit."
|
cannotUploadBecauseExceedsFileSizeLimit: "This file cannot be uploaded as it exceeds the file size limit."
|
||||||
beta: "Beta"
|
beta: "Beta"
|
||||||
enableAutoSensitive: "Automatic NSFW-Marking"
|
enableAutoSensitive: "Automatic marking as sensitive"
|
||||||
enableAutoSensitiveDescription: "Allows automatic detection and marking of NSFW media through Machine Learning where possible. Even if this option is disabled, it may be enabled instance-wide."
|
enableAutoSensitiveDescription: "Allows automatic detection and marking of sensitive media through Machine Learning where possible. Even if this option is disabled, it may be enabled instance-wide."
|
||||||
activeEmailValidationDescription: "Enables stricter validation of email addresses, which includes checking for disposable addresses and by whether it can actually be communicated with. When unchecked, only the format of the email is validated."
|
activeEmailValidationDescription: "Enables stricter validation of email addresses, which includes checking for disposable addresses and by whether it can actually be communicated with. When unchecked, only the format of the email is validated."
|
||||||
navbar: "Navigation bar"
|
navbar: "Navigation bar"
|
||||||
shuffle: "Shuffle"
|
shuffle: "Shuffle"
|
||||||
@@ -985,11 +995,14 @@ postToTheChannel: "Post to channel"
|
|||||||
cannotBeChangedLater: "This cannot be changed later."
|
cannotBeChangedLater: "This cannot be changed later."
|
||||||
reactionAcceptance: "Reaction Acceptance"
|
reactionAcceptance: "Reaction Acceptance"
|
||||||
likeOnly: "Only likes"
|
likeOnly: "Only likes"
|
||||||
likeOnlyForRemote: "Only likes for remote instances"
|
likeOnlyForRemote: "All (Only likes for remote instances)"
|
||||||
|
nonSensitiveOnly: "Non-sensitive only"
|
||||||
|
nonSensitiveOnlyForLocalLikeOnlyForRemote: "Non-sensitive only (Only likes from remote)"
|
||||||
rolesAssignedToMe: "Roles assigned to me"
|
rolesAssignedToMe: "Roles assigned to me"
|
||||||
resetPasswordConfirm: "Really reset your password?"
|
resetPasswordConfirm: "Really reset your password?"
|
||||||
sensitiveWords: "Sensitive words"
|
sensitiveWords: "Sensitive words"
|
||||||
sensitiveWordsDescription: "The visibility of all notes containing any of the configured words will be set to \"Home\" automatically. You can list multiple by separating them via line breaks."
|
sensitiveWordsDescription: "The visibility of all notes containing any of the configured words will be set to \"Home\" automatically. You can list multiple by separating them via line breaks."
|
||||||
|
sensitiveWordsDescription2: "Using spaces will create AND expressions and surrounding keywords with slashes will turn them into a regular expression."
|
||||||
notesSearchNotAvailable: "Note search is unavailable."
|
notesSearchNotAvailable: "Note search is unavailable."
|
||||||
license: "License"
|
license: "License"
|
||||||
unfavoriteConfirm: "Really remove from favorites?"
|
unfavoriteConfirm: "Really remove from favorites?"
|
||||||
@@ -1036,7 +1049,42 @@ channelArchiveConfirmTitle: "Really archive {name}?"
|
|||||||
channelArchiveConfirmDescription: "An archived channel won't appear in the channel list or search results anymore. New posts can also not be added to it anymore."
|
channelArchiveConfirmDescription: "An archived channel won't appear in the channel list or search results anymore. New posts can also not be added to it anymore."
|
||||||
thisChannelArchived: "This channel has been archived."
|
thisChannelArchived: "This channel has been archived."
|
||||||
displayOfNote: "Note display"
|
displayOfNote: "Note display"
|
||||||
|
initialAccountSetting: "Profile setup"
|
||||||
youFollowing: "Followed"
|
youFollowing: "Followed"
|
||||||
|
preventAiLearning: "Reject usage in Machine Learning (Generative AI)"
|
||||||
|
preventAiLearningDescription: "Requests crawlers to not use posted text or image material etc. in machine learning (Predictive / Generative AI) data sets. This is achieved by adding a \"noai\" HTML-Response flag to the respective content. A complete prevention can however not be achieved through this flag, as it may simply be ignored."
|
||||||
|
options: "Options"
|
||||||
|
specifyUser: "Specific user"
|
||||||
|
failedToPreviewUrl: "Could not preview"
|
||||||
|
update: "Update"
|
||||||
|
rolesThatCanBeUsedThisEmojiAsReaction: "Roles that can use this emoji as reaction"
|
||||||
|
rolesThatCanBeUsedThisEmojiAsReactionEmptyDescription: "If no roles are specified, anyone can use this emoji as reaction."
|
||||||
|
rolesThatCanBeUsedThisEmojiAsReactionPublicRoleWarn: "These roles must be public."
|
||||||
|
cancelReactionConfirm: "Really delete your reaction?"
|
||||||
|
changeReactionConfirm: "Really change your reaction?"
|
||||||
|
later: "Later"
|
||||||
|
goToMisskey: "To Misskey"
|
||||||
|
additionalEmojiDictionary: "Additional emoji dictionaries"
|
||||||
|
installed: "Installed"
|
||||||
|
branding: "Branding"
|
||||||
|
enableServerMachineStats: "Publish server hardware stats"
|
||||||
|
enableIdenticonGeneration: "Enable user identicon generation"
|
||||||
|
turnOffToImprovePerformance: "Turning this off can increase performance."
|
||||||
|
_initialAccountSetting:
|
||||||
|
accountCreated: "Your account was successfully created!"
|
||||||
|
letsStartAccountSetup: "For starters, let's set up your profile."
|
||||||
|
letsFillYourProfile: "First, let's set up your profile."
|
||||||
|
profileSetting: "Profile settings"
|
||||||
|
privacySetting: "Privacy settings"
|
||||||
|
theseSettingsCanEditLater: "You can always change these settings later."
|
||||||
|
youCanEditMoreSettingsInSettingsPageLater: "There are many more settings you can configure from the \"Settings\" page. Be sure to visit it later."
|
||||||
|
followUsers: "Try following some users that interest you to build up your timeline."
|
||||||
|
pushNotificationDescription: "Enabling push notifications will allow you to receive notifications from {name} directly on your device."
|
||||||
|
initialAccountSettingCompleted: "Profile setup complete!"
|
||||||
|
haveFun: "Enjoy {name}!"
|
||||||
|
ifYouNeedLearnMore: "If you'd like to learn more about how to use {name} (Misskey), please visit {link}."
|
||||||
|
skipAreYouSure: "Really skip profile setup?"
|
||||||
|
laterAreYouSure: "Really do profile setup later?"
|
||||||
_serverRules:
|
_serverRules:
|
||||||
description: "A set of rules to be displayed before registration. Setting a summary of the Terms of Service is recommended."
|
description: "A set of rules to be displayed before registration. Setting a summary of the Terms of Service is recommended."
|
||||||
_accountMigration:
|
_accountMigration:
|
||||||
@@ -1053,7 +1101,7 @@ _accountMigration:
|
|||||||
migrationConfirm: "Really migrate this account to {account}? Once started, this process cannot be stopped or taken back, and you will not be able to use this account in its original state anymore."
|
migrationConfirm: "Really migrate this account to {account}? Once started, this process cannot be stopped or taken back, and you will not be able to use this account in its original state anymore."
|
||||||
movedAndCannotBeUndone: "\nThis account has been migrated.\nMigration cannot be reversed."
|
movedAndCannotBeUndone: "\nThis account has been migrated.\nMigration cannot be reversed."
|
||||||
postMigrationNote: "This account will unfollow all accounts it is currently following 24 hours after migration finishes.\nBoth the number of follows and followers will then become zero. To avoid your followers from being unable to see followers only posts of this account, they will however continue following this account."
|
postMigrationNote: "This account will unfollow all accounts it is currently following 24 hours after migration finishes.\nBoth the number of follows and followers will then become zero. To avoid your followers from being unable to see followers only posts of this account, they will however continue following this account."
|
||||||
movedTo: "Account to move to:"
|
movedTo: "New account:"
|
||||||
_achievements:
|
_achievements:
|
||||||
earnedAt: "Unlocked at"
|
earnedAt: "Unlocked at"
|
||||||
_types:
|
_types:
|
||||||
@@ -1307,8 +1355,8 @@ _role:
|
|||||||
condition: "Condition"
|
condition: "Condition"
|
||||||
isConditionalRole: "This is a conditional role."
|
isConditionalRole: "This is a conditional role."
|
||||||
isPublic: "Public role"
|
isPublic: "Public role"
|
||||||
descriptionOfIsPublic: "Anyone will be able to view a list of users assigned to this role. In addition, this role will be displayed in the profiles of assigned users."
|
descriptionOfIsPublic: "This role will be displayed in the profiles of assigned users."
|
||||||
options: "Role options"
|
options: "Options"
|
||||||
policies: "Policies"
|
policies: "Policies"
|
||||||
baseRole: "Role template"
|
baseRole: "Role template"
|
||||||
useBaseValue: "Use role template value"
|
useBaseValue: "Use role template value"
|
||||||
@@ -1316,8 +1364,8 @@ _role:
|
|||||||
iconUrl: "Icon URL"
|
iconUrl: "Icon URL"
|
||||||
asBadge: "Show as badge"
|
asBadge: "Show as badge"
|
||||||
descriptionOfAsBadge: "This role's icon will be displayed next to the username of users with this role if turned on."
|
descriptionOfAsBadge: "This role's icon will be displayed next to the username of users with this role if turned on."
|
||||||
isExplorable: "Role timeline is public"
|
isExplorable: "Make role explorable"
|
||||||
descriptionOfIsExplorable: "This role's timeline will become publicly accessible if enabled. Timelines of non-public roles will not be made public even if set."
|
descriptionOfIsExplorable: "This role's timeline and the list of users with this will be made public if enabled."
|
||||||
displayOrder: "Position"
|
displayOrder: "Position"
|
||||||
descriptionOfDisplayOrder: "The higher the number, the higher its UI position."
|
descriptionOfDisplayOrder: "The higher the number, the higher its UI position."
|
||||||
canEditMembersByModerator: "Allow moderators to edit the list of members for this role"
|
canEditMembersByModerator: "Allow moderators to edit the list of members for this role"
|
||||||
@@ -1362,10 +1410,10 @@ _role:
|
|||||||
or: "OR-Condition"
|
or: "OR-Condition"
|
||||||
not: "NOT-Condition"
|
not: "NOT-Condition"
|
||||||
_sensitiveMediaDetection:
|
_sensitiveMediaDetection:
|
||||||
description: "Reduces the effort of server moderation through automatically recognizing NSFW media via Machine Learning. This will slightly increase the load on the server."
|
description: "Reduces the effort of server moderation through automatically recognizing sensitive media via Machine Learning. This will slightly increase the load on the server."
|
||||||
sensitivity: "Detection sensitivity"
|
sensitivity: "Detection sensitivity"
|
||||||
sensitivityDescription: "Reducing the sensitivity will lead to fewer misdetections (false positives) whereas increasing it will lead to fewer missed detections (false negatives)."
|
sensitivityDescription: "Reducing the sensitivity will lead to fewer misdetections (false positives) whereas increasing it will lead to fewer missed detections (false negatives)."
|
||||||
setSensitiveFlagAutomatically: "Mark as NSFW"
|
setSensitiveFlagAutomatically: "Mark as sensitive"
|
||||||
setSensitiveFlagAutomaticallyDescription: "The results of the internal detection will be retained even if this option is turned off."
|
setSensitiveFlagAutomaticallyDescription: "The results of the internal detection will be retained even if this option is turned off."
|
||||||
analyzeVideos: "Enable analysis of videos"
|
analyzeVideos: "Enable analysis of videos"
|
||||||
analyzeVideosDescription: "Analyzes videos in addition to images. This will slightly increase the load on the server."
|
analyzeVideosDescription: "Analyzes videos in addition to images. This will slightly increase the load on the server."
|
||||||
@@ -1394,6 +1442,7 @@ _ad:
|
|||||||
back: "Back"
|
back: "Back"
|
||||||
reduceFrequencyOfThisAd: "Show this ad less"
|
reduceFrequencyOfThisAd: "Show this ad less"
|
||||||
hide: "Hide"
|
hide: "Hide"
|
||||||
|
timezoneinfo: "The day of the week is determined from the server's timezone."
|
||||||
_forgotPassword:
|
_forgotPassword:
|
||||||
enterEmail: "Enter the email address you used to register. A link with which you can reset your password will then be sent to it."
|
enterEmail: "Enter the email address you used to register. A link with which you can reset your password will then be sent to it."
|
||||||
ifNoEmail: "If you did not use an email during registration, please contact the instance administrator instead."
|
ifNoEmail: "If you did not use an email during registration, please contact the instance administrator instead."
|
||||||
@@ -1445,9 +1494,9 @@ _aboutMisskey:
|
|||||||
donate: "Donate to Misskey"
|
donate: "Donate to Misskey"
|
||||||
morePatrons: "We also appreciate the support of many other helpers not listed here. Thank you! 🥰"
|
morePatrons: "We also appreciate the support of many other helpers not listed here. Thank you! 🥰"
|
||||||
patrons: "Patrons"
|
patrons: "Patrons"
|
||||||
_nsfw:
|
_displayOfSensitiveMedia:
|
||||||
respect: "Hide NSFW media"
|
respect: "Hide media marked as sensitive"
|
||||||
ignore: "Don't hide NSFW media"
|
ignore: "Display media marked as sensitive"
|
||||||
force: "Hide all media"
|
force: "Hide all media"
|
||||||
_instanceTicker:
|
_instanceTicker:
|
||||||
none: "Never show"
|
none: "Never show"
|
||||||
@@ -1586,6 +1635,16 @@ _time:
|
|||||||
minute: "Minute(s)"
|
minute: "Minute(s)"
|
||||||
hour: "Hour(s)"
|
hour: "Hour(s)"
|
||||||
day: "Day(s)"
|
day: "Day(s)"
|
||||||
|
_timelineTutorial:
|
||||||
|
title: "How to use Misskey"
|
||||||
|
step1_1: "This is the \"timeline\". All \"notes\" submitted on {name} will be chronologically displayed here."
|
||||||
|
step1_2: "There are a few different timelines. For example, the \"Home timeline\" will contain notes of users you follow, and the \"Local timeline\" will contain notes from all users of {name}."
|
||||||
|
step2_1: "Let's try posting a note next. You can do so by pressing the button with a pencil icon."
|
||||||
|
step2_2: "How about writing a self-introduction, or just \"Hello {name}!\" if you don't feel like it?"
|
||||||
|
step3_1: "Finished posting your first note?"
|
||||||
|
step3_2: "Your first note should now be displayed on your timeline."
|
||||||
|
step4_1: "You can also attach \"Reactions\" to notes."
|
||||||
|
step4_2: "To attach a reaction, press the \"+\" mark on a note and choose an emoji you'd like to react with."
|
||||||
_2fa:
|
_2fa:
|
||||||
alreadyRegistered: "You have already registered a 2-factor authentication device."
|
alreadyRegistered: "You have already registered a 2-factor authentication device."
|
||||||
registerTOTP: "Register authenticator app"
|
registerTOTP: "Register authenticator app"
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ noNotes: "No hay notas"
|
|||||||
noNotifications: "No hay notificaciones"
|
noNotifications: "No hay notificaciones"
|
||||||
instance: "Instancia"
|
instance: "Instancia"
|
||||||
settings: "Configuración"
|
settings: "Configuración"
|
||||||
|
notificationSettings: "Configurar las notificaciones"
|
||||||
basicSettings: "Configuración Básica"
|
basicSettings: "Configuración Básica"
|
||||||
otherSettings: "Configuración avanzada"
|
otherSettings: "Configuración avanzada"
|
||||||
openInWindow: "Abrir en una ventana"
|
openInWindow: "Abrir en una ventana"
|
||||||
@@ -51,6 +52,8 @@ addToList: "Agregar a lista"
|
|||||||
sendMessage: "Enviar un mensaje"
|
sendMessage: "Enviar un mensaje"
|
||||||
copyRSS: "Copiar RSS"
|
copyRSS: "Copiar RSS"
|
||||||
copyUsername: "Copiar nombre de usuario"
|
copyUsername: "Copiar nombre de usuario"
|
||||||
|
copyUserId: "Copiar ID del usuario"
|
||||||
|
copyNoteId: "Copiar ID de la nota"
|
||||||
searchUser: "Buscar un usuario"
|
searchUser: "Buscar un usuario"
|
||||||
reply: "Responder"
|
reply: "Responder"
|
||||||
loadMore: "Ver más"
|
loadMore: "Ver más"
|
||||||
@@ -133,8 +136,10 @@ unblockConfirm: "¿Quiere dejar de bloquear esta cuenta?"
|
|||||||
suspendConfirm: "¿Quiere suspender esta cuenta?"
|
suspendConfirm: "¿Quiere suspender esta cuenta?"
|
||||||
unsuspendConfirm: "¿Quiere dejar de suspender esta cuenta?"
|
unsuspendConfirm: "¿Quiere dejar de suspender esta cuenta?"
|
||||||
selectList: "Seleccione una lista"
|
selectList: "Seleccione una lista"
|
||||||
|
editList: "Editar lista"
|
||||||
selectChannel: "Seleccionar canal"
|
selectChannel: "Seleccionar canal"
|
||||||
selectAntenna: "Seleccionar antena"
|
selectAntenna: "Seleccionar antena"
|
||||||
|
editAntenna: "Editar antena"
|
||||||
selectWidget: "Seleccionar widget"
|
selectWidget: "Seleccionar widget"
|
||||||
editWidgets: "Editar widgets"
|
editWidgets: "Editar widgets"
|
||||||
editWidgetsExit: "Terminar edición"
|
editWidgetsExit: "Terminar edición"
|
||||||
@@ -228,10 +233,10 @@ instanceFollowers: "Seguidores de la instancia"
|
|||||||
instanceUsers: "Usuarios de la instancia"
|
instanceUsers: "Usuarios de la instancia"
|
||||||
changePassword: "Cambiar contraseña"
|
changePassword: "Cambiar contraseña"
|
||||||
security: "Seguridad"
|
security: "Seguridad"
|
||||||
retypedNotMatch: "No hay coincidencia"
|
retypedNotMatch: "La información no coincide."
|
||||||
currentPassword: "Contraseña actual"
|
currentPassword: "Contraseña actual"
|
||||||
newPassword: "Contraseña nueva"
|
newPassword: "Contraseña nueva"
|
||||||
newPasswordRetype: "Contraseña nueva (repetir)"
|
newPasswordRetype: "Reescribe contraseña nueva"
|
||||||
attachFile: "Añadir archivo"
|
attachFile: "Añadir archivo"
|
||||||
more: "¡Más!"
|
more: "¡Más!"
|
||||||
featured: "Destacados"
|
featured: "Destacados"
|
||||||
@@ -262,8 +267,10 @@ noMoreHistory: "El historial se ha acabado"
|
|||||||
startMessaging: "Iniciar chat"
|
startMessaging: "Iniciar chat"
|
||||||
nUsersRead: "Leído por {n} personas"
|
nUsersRead: "Leído por {n} personas"
|
||||||
agreeTo: "De acuerdo con {0}"
|
agreeTo: "De acuerdo con {0}"
|
||||||
|
agree: "De acuerdo."
|
||||||
agreeBelow: "Estoy de acuerdo con lo siguiente"
|
agreeBelow: "Estoy de acuerdo con lo siguiente"
|
||||||
basicNotesBeforeCreateAccount: "Notas básicas"
|
basicNotesBeforeCreateAccount: "Notas básicas"
|
||||||
|
termsOfService: "Términos y condiciones"
|
||||||
start: "Comenzar"
|
start: "Comenzar"
|
||||||
home: "Inicio"
|
home: "Inicio"
|
||||||
remoteUserCaution: "Para el usuario remoto, la información está incompleta"
|
remoteUserCaution: "Para el usuario remoto, la información está incompleta"
|
||||||
@@ -306,7 +313,6 @@ copyUrl: "Copiar URL"
|
|||||||
rename: "Renombrar"
|
rename: "Renombrar"
|
||||||
avatar: "Avatar"
|
avatar: "Avatar"
|
||||||
banner: "Banner"
|
banner: "Banner"
|
||||||
nsfw: "Marcado como sensible"
|
|
||||||
whenServerDisconnected: "Cuando se pierda la conexión con el servidor"
|
whenServerDisconnected: "Cuando se pierda la conexión con el servidor"
|
||||||
disconnectedFromServer: "Desconectado del servidor"
|
disconnectedFromServer: "Desconectado del servidor"
|
||||||
reload: "Recargar"
|
reload: "Recargar"
|
||||||
@@ -430,7 +436,7 @@ title: "Título"
|
|||||||
text: "Texto"
|
text: "Texto"
|
||||||
enable: "Activar"
|
enable: "Activar"
|
||||||
next: "Siguiente"
|
next: "Siguiente"
|
||||||
retype: "Intentar de nuevo"
|
retype: "Ingrese de nuevo"
|
||||||
noteOf: "Notas de {user}"
|
noteOf: "Notas de {user}"
|
||||||
quoteAttached: "Cita añadida"
|
quoteAttached: "Cita añadida"
|
||||||
quoteQuestion: "¿Quiere añadir una cita?"
|
quoteQuestion: "¿Quiere añadir una cita?"
|
||||||
@@ -450,7 +456,7 @@ weakPassword: "Contraseña débil"
|
|||||||
normalPassword: "Buena contraseña"
|
normalPassword: "Buena contraseña"
|
||||||
strongPassword: "Muy buena contraseña"
|
strongPassword: "Muy buena contraseña"
|
||||||
passwordMatched: "Correcto"
|
passwordMatched: "Correcto"
|
||||||
passwordNotMatched: "Las contraseñas no son las mismas"
|
passwordNotMatched: "Las contraseñas no coinciden"
|
||||||
signinWith: "Inicie sesión con {x}"
|
signinWith: "Inicie sesión con {x}"
|
||||||
signinFailed: "Autenticación fallida. Asegúrate de haber usado el nombre de usuario y contraseña correctos."
|
signinFailed: "Autenticación fallida. Asegúrate de haber usado el nombre de usuario y contraseña correctos."
|
||||||
or: "O"
|
or: "O"
|
||||||
@@ -473,6 +479,8 @@ createAccount: "Crear cuenta"
|
|||||||
existingAccount: "Cuenta existente"
|
existingAccount: "Cuenta existente"
|
||||||
regenerate: "Regenerar"
|
regenerate: "Regenerar"
|
||||||
fontSize: "Tamaño de la letra"
|
fontSize: "Tamaño de la letra"
|
||||||
|
mediaListWithOneImageAppearance: "Altura de la lista de medios con una sola imagen."
|
||||||
|
limitTo: "{x} hasta un máximo de"
|
||||||
noFollowRequests: "No hay solicitudes de seguimiento"
|
noFollowRequests: "No hay solicitudes de seguimiento"
|
||||||
openImageInNewTab: "Abrir imagen en nueva pestaña"
|
openImageInNewTab: "Abrir imagen en nueva pestaña"
|
||||||
dashboard: "Panel de control"
|
dashboard: "Panel de control"
|
||||||
@@ -555,6 +563,7 @@ accountDeletedDescription: "Esta cuenta ha sido borrada."
|
|||||||
menu: "Menú"
|
menu: "Menú"
|
||||||
divider: "Divisor"
|
divider: "Divisor"
|
||||||
addItem: "Agregar elemento"
|
addItem: "Agregar elemento"
|
||||||
|
rearrange: "Ordenar"
|
||||||
relays: "Relés"
|
relays: "Relés"
|
||||||
addRelay: "Agregar relé"
|
addRelay: "Agregar relé"
|
||||||
inboxUrl: "Inbox URL"
|
inboxUrl: "Inbox URL"
|
||||||
@@ -698,6 +707,8 @@ contact: "Contacto"
|
|||||||
useSystemFont: "Utilizar la tipografía por defecto del sistema"
|
useSystemFont: "Utilizar la tipografía por defecto del sistema"
|
||||||
clips: "Clip"
|
clips: "Clip"
|
||||||
experimentalFeatures: "Características experimentales"
|
experimentalFeatures: "Características experimentales"
|
||||||
|
experimental: "Función experimental"
|
||||||
|
thisIsExperimentalFeature: "Se trata de una función experimental. Las especificaciones pueden cambiar o puede que no funcione correctamente."
|
||||||
developer: "Desarrolladores"
|
developer: "Desarrolladores"
|
||||||
makeExplorable: "Hacer visible la cuenta en \"Explorar\""
|
makeExplorable: "Hacer visible la cuenta en \"Explorar\""
|
||||||
makeExplorableDescription: "Si desactiva esta opción, su cuenta no aparecerá en la sección \"Explorar\"."
|
makeExplorableDescription: "Si desactiva esta opción, su cuenta no aparecerá en la sección \"Explorar\"."
|
||||||
@@ -782,8 +793,9 @@ noMaintainerInformationWarning: "No se ha establecido la información del admini
|
|||||||
noBotProtectionWarning: "La protección contra los bots no está configurada"
|
noBotProtectionWarning: "La protección contra los bots no está configurada"
|
||||||
configure: "Configurar"
|
configure: "Configurar"
|
||||||
postToGallery: "Crear una nueva publicación en la galería"
|
postToGallery: "Crear una nueva publicación en la galería"
|
||||||
|
postToHashtag: "Publicar a este hashtag"
|
||||||
gallery: "Galería"
|
gallery: "Galería"
|
||||||
recentPosts: "Posts recientes"
|
recentPosts: "Publicaciones recientes"
|
||||||
popularPosts: "Más vistos"
|
popularPosts: "Más vistos"
|
||||||
shareWithNote: "Compartir con una nota"
|
shareWithNote: "Compartir con una nota"
|
||||||
ads: "Anuncios"
|
ads: "Anuncios"
|
||||||
@@ -815,6 +827,7 @@ translatedFrom: "Traducido de {x}"
|
|||||||
accountDeletionInProgress: "La eliminación de la cuenta está en curso"
|
accountDeletionInProgress: "La eliminación de la cuenta está en curso"
|
||||||
usernameInfo: "Un nombre que identifique su cuenta de otras en este servidor. Puede utilizar el alfabeto (a~z, A~Z), dígitos (0~9) o guiones bajos (_). Los nombres de usuario no se pueden cambiar posteriormente."
|
usernameInfo: "Un nombre que identifique su cuenta de otras en este servidor. Puede utilizar el alfabeto (a~z, A~Z), dígitos (0~9) o guiones bajos (_). Los nombres de usuario no se pueden cambiar posteriormente."
|
||||||
aiChanMode: "Modo Ai"
|
aiChanMode: "Modo Ai"
|
||||||
|
devMode: "Modo de desarrollador"
|
||||||
keepCw: "Mantener la advertencia de contenido"
|
keepCw: "Mantener la advertencia de contenido"
|
||||||
pubSub: "Cuentas Pub/Sub"
|
pubSub: "Cuentas Pub/Sub"
|
||||||
lastCommunication: "Última comunicación"
|
lastCommunication: "Última comunicación"
|
||||||
@@ -824,9 +837,11 @@ breakFollow: "Dejar de seguir"
|
|||||||
breakFollowConfirm: "¿Quieres dejar de seguir?"
|
breakFollowConfirm: "¿Quieres dejar de seguir?"
|
||||||
itsOn: "¡Está encendido!"
|
itsOn: "¡Está encendido!"
|
||||||
itsOff: "¡Está apagado!"
|
itsOff: "¡Está apagado!"
|
||||||
emailRequiredForSignup: "Se requere una dirección de correo electrónico para el registro de la cuenta"
|
on: "Activado"
|
||||||
|
off: "Desactivado"
|
||||||
|
emailRequiredForSignup: "Se requiere una dirección de correo electrónico para el registro de la cuenta"
|
||||||
unread: "No leído"
|
unread: "No leído"
|
||||||
filter: "Filtro"
|
filter: "Filtrar"
|
||||||
controlPanel: "Panel de control"
|
controlPanel: "Panel de control"
|
||||||
manageAccounts: "Administrar cuenta"
|
manageAccounts: "Administrar cuenta"
|
||||||
makeReactionsPublic: "Hacer el historial de reacciones público"
|
makeReactionsPublic: "Hacer el historial de reacciones público"
|
||||||
@@ -904,6 +919,7 @@ remoteOnly: "Sólo remoto"
|
|||||||
failedToUpload: "La subida falló"
|
failedToUpload: "La subida falló"
|
||||||
cannotUploadBecauseInappropriate: "Este archivo no se puede subir debido a que algunas partes han sido detectadas comoNSFW."
|
cannotUploadBecauseInappropriate: "Este archivo no se puede subir debido a que algunas partes han sido detectadas comoNSFW."
|
||||||
cannotUploadBecauseNoFreeSpace: "La subida falló debido a falta de espacio libre en la unidad del usuario."
|
cannotUploadBecauseNoFreeSpace: "La subida falló debido a falta de espacio libre en la unidad del usuario."
|
||||||
|
cannotUploadBecauseExceedsFileSizeLimit: "Este archivo supera el peso máximo y no puede ser subido."
|
||||||
beta: "Beta"
|
beta: "Beta"
|
||||||
enableAutoSensitive: "Marcar automáticamente contenido NSFW"
|
enableAutoSensitive: "Marcar automáticamente contenido NSFW"
|
||||||
enableAutoSensitiveDescription: "Permite la detección y marcado automático de contenido NSFW usando 'Machine Learning' cuando sea posible. Incluso si esta opción está desactivada, puede ser activado para toda la instancia."
|
enableAutoSensitiveDescription: "Permite la detección y marcado automático de contenido NSFW usando 'Machine Learning' cuando sea posible. Incluso si esta opción está desactivada, puede ser activado para toda la instancia."
|
||||||
@@ -934,18 +950,23 @@ show: "Apariencia"
|
|||||||
neverShow: "No mostrar de nuevo"
|
neverShow: "No mostrar de nuevo"
|
||||||
remindMeLater: "Recordar después"
|
remindMeLater: "Recordar después"
|
||||||
didYouLikeMisskey: "¿Te gusta Misskey?"
|
didYouLikeMisskey: "¿Te gusta Misskey?"
|
||||||
pleaseDonate: "Misskey es software libre, y es usado por {host} . Por favor, ¡considera donar al proyecto principal para que podamos continuar!"
|
pleaseDonate: "{host} usa el software gratuito Misskey. Por favor ¡Considera donar al proyecto principal para que podamos continuar!"
|
||||||
roles: "Roles"
|
roles: "Roles"
|
||||||
role: "Roles"
|
role: "Rol"
|
||||||
|
noRole: "Rol no encontrado"
|
||||||
normalUser: "Usuario normal"
|
normalUser: "Usuario normal"
|
||||||
undefined: "Indefinido"
|
undefined: "Indefinido"
|
||||||
assign: "Asignar"
|
assign: "Asignar"
|
||||||
unassign: "Quitar"
|
unassign: "Quitar"
|
||||||
color: "Color"
|
color: "Color"
|
||||||
manageCustomEmojis: "Administrar emojis personalizados"
|
manageCustomEmojis: "Administrar emojis personalizados"
|
||||||
youCannotCreateAnymore: "Se alcanzó el límite de creación"
|
youCannotCreateAnymore: "Has llegado al límite de creaciones."
|
||||||
cannotPerformTemporary: "Indisponible temporalmente"
|
cannotPerformTemporary: "Temporalmente no disponible"
|
||||||
cannotPerformTemporaryDescription: "Esta acción no se puede realizar porque se excedió el límite de ejecución. Espera un poco y prueba de nuevo."
|
cannotPerformTemporaryDescription: "Esta acción no se puede realizar porque se excedió el límite de ejecución. Espera un poco y prueba de nuevo."
|
||||||
|
invalidParamError: "Parámetros inválidos"
|
||||||
|
invalidParamErrorDescription: "Los parámetros de la solicitud son inválidos. Normalmente se trata de un error, pero también puede haberse excedido algún límite o similares."
|
||||||
|
permissionDeniedError: "Operación denegada"
|
||||||
|
permissionDeniedErrorDescription: "Esta cuenta no tiene permisos para hacer esa acción."
|
||||||
preset: "Predefinido"
|
preset: "Predefinido"
|
||||||
selectFromPresets: "Escoger desde predefinidos"
|
selectFromPresets: "Escoger desde predefinidos"
|
||||||
achievements: "Logros"
|
achievements: "Logros"
|
||||||
@@ -961,7 +982,7 @@ internalServerErrorDescription: "El servidor tuvo un error inesperado."
|
|||||||
copyErrorInfo: "Copiar detalles del error"
|
copyErrorInfo: "Copiar detalles del error"
|
||||||
joinThisServer: "Registrarse en esta instancia"
|
joinThisServer: "Registrarse en esta instancia"
|
||||||
exploreOtherServers: "Buscar otra instancia"
|
exploreOtherServers: "Buscar otra instancia"
|
||||||
letsLookAtTimeline: "Mirar la línea de tiempo local"
|
letsLookAtTimeline: "Mira la línea de tiempo"
|
||||||
disableFederationConfirm: "¿Estas seguro que quieres desactivar la federación?"
|
disableFederationConfirm: "¿Estas seguro que quieres desactivar la federación?"
|
||||||
disableFederationConfirmWarn: "Aunque no exista federación los posts no serán marcados como privados. En la mayoría de los casos, no es necesario hacer los posts no federar."
|
disableFederationConfirmWarn: "Aunque no exista federación los posts no serán marcados como privados. En la mayoría de los casos, no es necesario hacer los posts no federar."
|
||||||
disableFederationOk: "Desactivar."
|
disableFederationOk: "Desactivar."
|
||||||
@@ -972,6 +993,7 @@ cannotBeChangedLater: "Esto no podrá ser cambiado después."
|
|||||||
reactionAcceptance: "Aceptación de reacciones"
|
reactionAcceptance: "Aceptación de reacciones"
|
||||||
likeOnly: "Sólo 'me gusta'"
|
likeOnly: "Sólo 'me gusta'"
|
||||||
likeOnlyForRemote: "Sólo reacciones de instancias remotas"
|
likeOnlyForRemote: "Sólo reacciones de instancias remotas"
|
||||||
|
nonSensitiveOnly: "Solo no sensible"
|
||||||
rolesAssignedToMe: "Roles asignados a mí"
|
rolesAssignedToMe: "Roles asignados a mí"
|
||||||
resetPasswordConfirm: "¿Realmente quieres cambiar la contraseña?"
|
resetPasswordConfirm: "¿Realmente quieres cambiar la contraseña?"
|
||||||
sensitiveWords: "Palabras sensibles"
|
sensitiveWords: "Palabras sensibles"
|
||||||
@@ -989,10 +1011,40 @@ enableChartsForFederatedInstances: "Generar gráficos de servidores remotos"
|
|||||||
showClipButtonInNoteFooter: "Añadir \"Clip\" al menú de notas"
|
showClipButtonInNoteFooter: "Añadir \"Clip\" al menú de notas"
|
||||||
largeNoteReactions: "Agrandar las reacciones de las notas"
|
largeNoteReactions: "Agrandar las reacciones de las notas"
|
||||||
noteIdOrUrl: "ID o URL de la nota"
|
noteIdOrUrl: "ID o URL de la nota"
|
||||||
|
video: "Video"
|
||||||
|
videos: "Video"
|
||||||
|
dataSaver: "Ahorro de datos"
|
||||||
accountMigration: "Migración de cuenta"
|
accountMigration: "Migración de cuenta"
|
||||||
accountMoved: "Este usuario se ha mudado a una nueva cuenta:"
|
accountMoved: "Este usuario se movió a una nueva cuenta:"
|
||||||
|
accountMovedShort: "Esta cuenta ha sido migrada."
|
||||||
|
addMemo: "Añadir nota"
|
||||||
|
editMemo: "Editar nota"
|
||||||
|
reactionsList: "Lista de reacciones"
|
||||||
|
renotesList: "Renotas"
|
||||||
|
stackAxis: "Dirección de apilado"
|
||||||
horizontal: "Horizontal"
|
horizontal: "Horizontal"
|
||||||
|
position: "Posición"
|
||||||
|
serverRules: "Reglas del servidor"
|
||||||
|
continue: "Continuar"
|
||||||
|
preservedUsernames: "Nombre de usuario reservado"
|
||||||
|
archive: "Archivo"
|
||||||
|
channelArchiveConfirmTitle: "¿Seguro de archivar {name}?"
|
||||||
youFollowing: "Siguiendo"
|
youFollowing: "Siguiendo"
|
||||||
|
options: "Opción"
|
||||||
|
update: "Actualizar"
|
||||||
|
installed: "Instalado"
|
||||||
|
branding: "Marca"
|
||||||
|
enableServerMachineStats: "Publicar estadísticas de hardware del servidor"
|
||||||
|
enableIdenticonGeneration: "Activar generación de identicon por usuario"
|
||||||
|
_initialAccountSetting:
|
||||||
|
accountCreated: "¡La cuenta ha sido creada!"
|
||||||
|
letsStartAccountSetup: "Para empezar, creemos tu perfil."
|
||||||
|
letsFillYourProfile: "Primero, creemos tu perfil."
|
||||||
|
profileSetting: "Configuración del perfil"
|
||||||
|
privacySetting: "Configuración de privacidad"
|
||||||
|
theseSettingsCanEditLater: "Puedes cambiar estos ajustes más tarde."
|
||||||
|
youCanEditMoreSettingsInSettingsPageLater: "Desde la pestaña de \"Configuración\" puedes modificar más ajustes. Asegúrate de visitarla después."
|
||||||
|
followUsers: "Comienza a seguir a usuarios que te interesen para construir tu línea de tiempo."
|
||||||
_accountMigration:
|
_accountMigration:
|
||||||
moveFrom: "Trasladar de otra cuenta a ésta"
|
moveFrom: "Trasladar de otra cuenta a ésta"
|
||||||
moveFromLabel: "Cuenta desde la que se realiza el traslado:"
|
moveFromLabel: "Cuenta desde la que se realiza el traslado:"
|
||||||
@@ -1173,6 +1225,8 @@ _achievements:
|
|||||||
_client30min:
|
_client30min:
|
||||||
title: "Un descansito"
|
title: "Un descansito"
|
||||||
description: "30 minutos dedicados a Misskey"
|
description: "30 minutos dedicados a Misskey"
|
||||||
|
_client60min:
|
||||||
|
title: "Viendo mucho Misskey."
|
||||||
_noteDeletedWithin1min:
|
_noteDeletedWithin1min:
|
||||||
title: "Ah... Mejor no..."
|
title: "Ah... Mejor no..."
|
||||||
description: "Borrar una nota antes que de pase 1 minuto"
|
description: "Borrar una nota antes que de pase 1 minuto"
|
||||||
@@ -1276,7 +1330,7 @@ _role:
|
|||||||
canPublicNote: "Permitir la publicación"
|
canPublicNote: "Permitir la publicación"
|
||||||
canInvite: "Puede crear códigos de invitación"
|
canInvite: "Puede crear códigos de invitación"
|
||||||
canManageCustomEmojis: "Administrar emojis personalizados"
|
canManageCustomEmojis: "Administrar emojis personalizados"
|
||||||
driveCapacity: "Capacidad de almacenamiento"
|
driveCapacity: "Capacidad del drive"
|
||||||
pinMax: "Máximo de notas fijadas"
|
pinMax: "Máximo de notas fijadas"
|
||||||
antennaMax: "Máximo de antenas"
|
antennaMax: "Máximo de antenas"
|
||||||
wordMuteMax: "Máximo de caracteres en palabras silenciadas"
|
wordMuteMax: "Máximo de caracteres en palabras silenciadas"
|
||||||
@@ -1387,10 +1441,6 @@ _aboutMisskey:
|
|||||||
donate: "Donar a Misskey"
|
donate: "Donar a Misskey"
|
||||||
morePatrons: "Muchas más personas nos apoyan. Muchas gracias🥰"
|
morePatrons: "Muchas más personas nos apoyan. Muchas gracias🥰"
|
||||||
patrons: "Patrocinadores"
|
patrons: "Patrocinadores"
|
||||||
_nsfw:
|
|
||||||
respect: "Ocultar medios NSFW"
|
|
||||||
ignore: "No esconder medios NSFW "
|
|
||||||
force: "Ocultar todos los medios"
|
|
||||||
_instanceTicker:
|
_instanceTicker:
|
||||||
none: "No mostrar"
|
none: "No mostrar"
|
||||||
remote: "Mostrar a usuarios remotos"
|
remote: "Mostrar a usuarios remotos"
|
||||||
@@ -1512,7 +1562,7 @@ _sfx:
|
|||||||
channel: "Notificaciones del canal"
|
channel: "Notificaciones del canal"
|
||||||
_ago:
|
_ago:
|
||||||
future: "Futuro"
|
future: "Futuro"
|
||||||
justNow: "Recién ahora"
|
justNow: "Justo ahora"
|
||||||
secondsAgo: "Hace {n} segundos"
|
secondsAgo: "Hace {n} segundos"
|
||||||
minutesAgo: "Hace {n} minutos"
|
minutesAgo: "Hace {n} minutos"
|
||||||
hoursAgo: "Hace {n} horas"
|
hoursAgo: "Hace {n} horas"
|
||||||
@@ -1526,6 +1576,9 @@ _time:
|
|||||||
minute: "Minutos"
|
minute: "Minutos"
|
||||||
hour: "Horas"
|
hour: "Horas"
|
||||||
day: "Días"
|
day: "Días"
|
||||||
|
_timelineTutorial:
|
||||||
|
step4_1: "También puedes añadir \"Reacciones\" a notas."
|
||||||
|
step4_2: "Para añadir una reacción selecciona el botón \"+\" en la nota y escoge el emoji que quieras para reaccionar."
|
||||||
_2fa:
|
_2fa:
|
||||||
alreadyRegistered: "Ya has completado la configuración."
|
alreadyRegistered: "Ya has completado la configuración."
|
||||||
registerTOTP: "Registrar aplicación autenticadora"
|
registerTOTP: "Registrar aplicación autenticadora"
|
||||||
@@ -1671,14 +1724,14 @@ _visibility:
|
|||||||
homeDescription: "Visible sólo en la linea de tiempo de inicio"
|
homeDescription: "Visible sólo en la linea de tiempo de inicio"
|
||||||
followers: "Seguidores"
|
followers: "Seguidores"
|
||||||
followersDescription: "Visible sólo para tus seguidores"
|
followersDescription: "Visible sólo para tus seguidores"
|
||||||
specified: "Mensaje directo"
|
specified: "Nota directa"
|
||||||
specifiedDescription: "Visible sólo para los usuarios elegidos"
|
specifiedDescription: "Visible sólo para los usuarios elegidos"
|
||||||
disableFederation: "No federado"
|
disableFederation: "No federado"
|
||||||
disableFederationDescription: "No enviar a otras instancias"
|
disableFederationDescription: "No enviar a otras instancias"
|
||||||
_postForm:
|
_postForm:
|
||||||
replyPlaceholder: "Responder a esta nota"
|
replyPlaceholder: "Responder a esta nota"
|
||||||
quotePlaceholder: "Citar esta nota"
|
quotePlaceholder: "Citar esta nota"
|
||||||
channelPlaceholder: "Postear en el canal"
|
channelPlaceholder: "Publicar en el canal"
|
||||||
_placeholders:
|
_placeholders:
|
||||||
a: "¿Qué haces?"
|
a: "¿Qué haces?"
|
||||||
b: "¿Te pasó algo?"
|
b: "¿Te pasó algo?"
|
||||||
@@ -1862,7 +1915,7 @@ _deck:
|
|||||||
list: "Listas"
|
list: "Listas"
|
||||||
channel: "Canal"
|
channel: "Canal"
|
||||||
mentions: "Menciones"
|
mentions: "Menciones"
|
||||||
direct: "Mensaje directo"
|
direct: "Notas directas"
|
||||||
_dialog:
|
_dialog:
|
||||||
charactersExceeded: "¡Has excedido el límite de caracteres! Actualmente {current} de {max}."
|
charactersExceeded: "¡Has excedido el límite de caracteres! Actualmente {current} de {max}."
|
||||||
charactersBelow: "¡Estás por debajo del límite de caracteres! Actualmente {current} de {min}."
|
charactersBelow: "¡Estás por debajo del límite de caracteres! Actualmente {current} de {min}."
|
||||||
@@ -1870,8 +1923,8 @@ _disabledTimeline:
|
|||||||
title: "Línea de tiempo deshabilitada"
|
title: "Línea de tiempo deshabilitada"
|
||||||
description: "No puedes usar esta línea de tiempo con tus roles actuales."
|
description: "No puedes usar esta línea de tiempo con tus roles actuales."
|
||||||
_drivecleaner:
|
_drivecleaner:
|
||||||
orderBySizeDesc: "Más grandes"
|
orderBySizeDesc: "Tamaño descendiente"
|
||||||
orderByCreatedAtAsc: "Más antiguos"
|
orderByCreatedAtAsc: "Fecha ascendente"
|
||||||
_webhookSettings:
|
_webhookSettings:
|
||||||
createWebhook: "Crear Webhook"
|
createWebhook: "Crear Webhook"
|
||||||
name: "Nombre"
|
name: "Nombre"
|
||||||
|
|||||||
@@ -302,7 +302,6 @@ copyUrl: "Copier l’URL"
|
|||||||
rename: "Renommer"
|
rename: "Renommer"
|
||||||
avatar: "Avatar"
|
avatar: "Avatar"
|
||||||
banner: "Bannière"
|
banner: "Bannière"
|
||||||
nsfw: "Contenu sensible"
|
|
||||||
whenServerDisconnected: "Lorsque la connexion au serveur est perdue"
|
whenServerDisconnected: "Lorsque la connexion au serveur est perdue"
|
||||||
disconnectedFromServer: "Déconnecté·e du serveur"
|
disconnectedFromServer: "Déconnecté·e du serveur"
|
||||||
reload: "Rafraîchir"
|
reload: "Rafraîchir"
|
||||||
@@ -452,6 +451,7 @@ native: "Natif"
|
|||||||
disableDrawer: "Les menus ne s'affichent pas dans le tiroir"
|
disableDrawer: "Les menus ne s'affichent pas dans le tiroir"
|
||||||
noHistory: "Pas d'historique"
|
noHistory: "Pas d'historique"
|
||||||
signinHistory: "Historique de connexion"
|
signinHistory: "Historique de connexion"
|
||||||
|
enableAdvancedMfm: "Activer la MFM avancée"
|
||||||
doing: "En cours..."
|
doing: "En cours..."
|
||||||
category: "Catégorie"
|
category: "Catégorie"
|
||||||
tags: "Étiquettes"
|
tags: "Étiquettes"
|
||||||
@@ -846,6 +846,7 @@ rateLimitExceeded: "Limite de taux dépassée"
|
|||||||
cropImage: "Recadrer l'image"
|
cropImage: "Recadrer l'image"
|
||||||
cropImageAsk: "Voulez-vous recadrer cette image ?"
|
cropImageAsk: "Voulez-vous recadrer cette image ?"
|
||||||
cropYes: "Rogner"
|
cropYes: "Rogner"
|
||||||
|
cropNo: "Utiliser en l'état"
|
||||||
file: "Fichiers"
|
file: "Fichiers"
|
||||||
recentNHours: "Dernières {n} heures"
|
recentNHours: "Dernières {n} heures"
|
||||||
recentNDays: "Derniers {n} jours"
|
recentNDays: "Derniers {n} jours"
|
||||||
@@ -906,18 +907,22 @@ neverShow: "Ne plus afficher"
|
|||||||
remindMeLater: "Peut-être plus tard"
|
remindMeLater: "Peut-être plus tard"
|
||||||
roles: "Rôles"
|
roles: "Rôles"
|
||||||
role: "Rôles"
|
role: "Rôles"
|
||||||
|
noRole: "Aucun rôle"
|
||||||
normalUser: "Simple utilisateur·rice"
|
normalUser: "Simple utilisateur·rice"
|
||||||
assign: "Attribuer"
|
assign: "Attribuer"
|
||||||
color: "Couleur"
|
color: "Couleur"
|
||||||
manageCustomEmojis: "Gestion des émojis personnalisés"
|
manageCustomEmojis: "Gestion des émojis personnalisés"
|
||||||
preset: "Préréglage"
|
preset: "Préréglage"
|
||||||
selectFromPresets: "Sélectionner à partir des préréglages"
|
selectFromPresets: "Sélectionner à partir des préréglages"
|
||||||
|
thisPostMayBeAnnoying: "Cette note peut gêner d'autres personnes."
|
||||||
|
thisPostMayBeAnnoyingCancel: "Annuler"
|
||||||
license: "Licence"
|
license: "Licence"
|
||||||
video: "Vidéo"
|
video: "Vidéo"
|
||||||
videos: "Vidéos"
|
videos: "Vidéos"
|
||||||
dataSaver: "Économiseur de données"
|
dataSaver: "Économiseur de données"
|
||||||
accountMigration: "Migration de compte"
|
accountMigration: "Migration de compte"
|
||||||
accountMoved: "Cet·te utilisateur·rice a migré son compte vers :"
|
accountMoved: "Cet·te utilisateur·rice a migré son compte vers :"
|
||||||
|
addMemo: "Ajouter un mémo"
|
||||||
notificationDisplay: "Style des notifications"
|
notificationDisplay: "Style des notifications"
|
||||||
leftTop: "En haut à gauche"
|
leftTop: "En haut à gauche"
|
||||||
rightTop: "En haut à droite"
|
rightTop: "En haut à droite"
|
||||||
@@ -925,19 +930,25 @@ leftBottom: "En bas à gauche"
|
|||||||
rightBottom: "En bas à droite"
|
rightBottom: "En bas à droite"
|
||||||
vertical: "Vertical"
|
vertical: "Vertical"
|
||||||
horizontal: "Latéral"
|
horizontal: "Latéral"
|
||||||
|
serverRules: "Règles du serveur"
|
||||||
youFollowing: "Abonné·e"
|
youFollowing: "Abonné·e"
|
||||||
_achievements:
|
_achievements:
|
||||||
_types:
|
_types:
|
||||||
_notes1:
|
_notes1:
|
||||||
description: "Publiez votre première note"
|
description: "Publiez votre première note"
|
||||||
flavor: "Passez un bon moment avec Misskey !"
|
flavor: "Passez un bon moment avec Misskey !"
|
||||||
|
_notes100:
|
||||||
|
title: "Beaucoup de notes"
|
||||||
_notes100000:
|
_notes100000:
|
||||||
title: "ALL YOUR NOTE ARE BELONG TO US"
|
title: "ALL YOUR NOTE ARE BELONG TO US"
|
||||||
_login3:
|
_login3:
|
||||||
|
title: "Débutant Ⅰ"
|
||||||
description: "Se connecter pour un total de 3 jours"
|
description: "Se connecter pour un total de 3 jours"
|
||||||
_login7:
|
_login7:
|
||||||
|
title: "Débutant Ⅱ"
|
||||||
description: "Se connecter pour un total de 7 jours"
|
description: "Se connecter pour un total de 7 jours"
|
||||||
_login15:
|
_login15:
|
||||||
|
title: "Débutant Ⅲ"
|
||||||
description: "Se connecter pour un total de 15 jours"
|
description: "Se connecter pour un total de 15 jours"
|
||||||
_login30:
|
_login30:
|
||||||
description: "Se connecter pour un total de 30 jours"
|
description: "Se connecter pour un total de 30 jours"
|
||||||
@@ -945,6 +956,22 @@ _achievements:
|
|||||||
description: "Se connecter pour un total de 60 jours"
|
description: "Se connecter pour un total de 60 jours"
|
||||||
_login100:
|
_login100:
|
||||||
description: "Se connecter pour un total de 100 jours"
|
description: "Se connecter pour un total de 100 jours"
|
||||||
|
_login200:
|
||||||
|
description: "Se connecter pour un total de 200 jours"
|
||||||
|
_login300:
|
||||||
|
description: "Se connecter pour un total de 300 jours"
|
||||||
|
_login400:
|
||||||
|
description: "Se connecter pour un total de 400 jours"
|
||||||
|
_login500:
|
||||||
|
description: "Se connecter pour un total de 500 jours"
|
||||||
|
_login600:
|
||||||
|
description: "Se connecter pour un total de 600 jours"
|
||||||
|
_login700:
|
||||||
|
description: "Se connecter pour un total de 700 jours"
|
||||||
|
_login800:
|
||||||
|
description: "Se connecter pour un total de 800 jours"
|
||||||
|
_login900:
|
||||||
|
description: "Se connecter pour un total de 900 jours"
|
||||||
_login1000:
|
_login1000:
|
||||||
flavor: "Merci d'utiliser Misskey !"
|
flavor: "Merci d'utiliser Misskey !"
|
||||||
_markedAsCat:
|
_markedAsCat:
|
||||||
@@ -954,10 +981,16 @@ _achievements:
|
|||||||
title: "Beaucoup d'amis"
|
title: "Beaucoup d'amis"
|
||||||
_followers10:
|
_followers10:
|
||||||
title: "Abonnez-moi !"
|
title: "Abonnez-moi !"
|
||||||
|
_iLoveMisskey:
|
||||||
|
title: "J’adore Misskey"
|
||||||
_viewInstanceChart:
|
_viewInstanceChart:
|
||||||
title: "Analyste"
|
title: "Analyste"
|
||||||
|
_loggedInOnBirthday:
|
||||||
|
title: "Joyeux Anniversaire !"
|
||||||
_loggedInOnNewYearsDay:
|
_loggedInOnNewYearsDay:
|
||||||
title: "Bonne année !"
|
title: "Bonne année !"
|
||||||
|
_cookieClicked:
|
||||||
|
flavor: "Attendez une minute, vous êtes sur le mauvais site web ?"
|
||||||
_role:
|
_role:
|
||||||
assignTarget: "Attribuer"
|
assignTarget: "Attribuer"
|
||||||
priority: "Priorité"
|
priority: "Priorité"
|
||||||
@@ -1051,10 +1084,6 @@ _aboutMisskey:
|
|||||||
donate: "Soutenir Misskey"
|
donate: "Soutenir Misskey"
|
||||||
morePatrons: "Nous apprécions vraiment le soutien de nombreuses autres personnes non mentionnées ici. Merci à toutes et à tous ! 🥰"
|
morePatrons: "Nous apprécions vraiment le soutien de nombreuses autres personnes non mentionnées ici. Merci à toutes et à tous ! 🥰"
|
||||||
patrons: "Contributeurs"
|
patrons: "Contributeurs"
|
||||||
_nsfw:
|
|
||||||
respect: "Cacher les médias marqués comme contenu sensible"
|
|
||||||
ignore: "Afficher les médias sensibles"
|
|
||||||
force: "Cacher tous les médias"
|
|
||||||
_instanceTicker:
|
_instanceTicker:
|
||||||
none: "Cacher "
|
none: "Cacher "
|
||||||
remote: "Montrer pour les utilisateur·ice·s distant·e·s"
|
remote: "Montrer pour les utilisateur·ice·s distant·e·s"
|
||||||
|
|||||||
72
locales/generateDTS.js
Normal file
72
locales/generateDTS.js
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
import * as fs from 'node:fs';
|
||||||
|
import * as yaml from 'js-yaml';
|
||||||
|
import * as ts from 'typescript';
|
||||||
|
|
||||||
|
function createMembers(record) {
|
||||||
|
return Object.entries(record)
|
||||||
|
.map(([k, v]) => ts.factory.createPropertySignature(
|
||||||
|
undefined,
|
||||||
|
ts.factory.createStringLiteral(k),
|
||||||
|
undefined,
|
||||||
|
typeof v === 'string'
|
||||||
|
? ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword)
|
||||||
|
: ts.factory.createTypeLiteralNode(createMembers(v)),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function generateDTS() {
|
||||||
|
const locale = yaml.load(fs.readFileSync(`${__dirname}/ja-JP.yml`, 'utf-8'));
|
||||||
|
const members = createMembers(locale);
|
||||||
|
const elements = [
|
||||||
|
ts.factory.createInterfaceDeclaration(
|
||||||
|
[ts.factory.createToken(ts.SyntaxKind.ExportKeyword)],
|
||||||
|
ts.factory.createIdentifier('Locale'),
|
||||||
|
undefined,
|
||||||
|
undefined,
|
||||||
|
members,
|
||||||
|
),
|
||||||
|
ts.factory.createVariableStatement(
|
||||||
|
[ts.factory.createToken(ts.SyntaxKind.DeclareKeyword)],
|
||||||
|
ts.factory.createVariableDeclarationList(
|
||||||
|
[ts.factory.createVariableDeclaration(
|
||||||
|
ts.factory.createIdentifier('locales'),
|
||||||
|
undefined,
|
||||||
|
ts.factory.createTypeLiteralNode([ts.factory.createIndexSignature(
|
||||||
|
undefined,
|
||||||
|
[ts.factory.createParameterDeclaration(
|
||||||
|
undefined,
|
||||||
|
undefined,
|
||||||
|
ts.factory.createIdentifier('lang'),
|
||||||
|
undefined,
|
||||||
|
ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword),
|
||||||
|
undefined,
|
||||||
|
)],
|
||||||
|
ts.factory.createTypeReferenceNode(
|
||||||
|
ts.factory.createIdentifier('Locale'),
|
||||||
|
undefined,
|
||||||
|
),
|
||||||
|
)]),
|
||||||
|
undefined,
|
||||||
|
)],
|
||||||
|
ts.NodeFlags.Const | ts.NodeFlags.Ambient | ts.NodeFlags.ContextFlags,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
ts.factory.createExportAssignment(
|
||||||
|
undefined,
|
||||||
|
true,
|
||||||
|
ts.factory.createIdentifier('locales'),
|
||||||
|
),
|
||||||
|
];
|
||||||
|
const printed = ts.createPrinter({
|
||||||
|
newLine: ts.NewLineKind.LineFeed,
|
||||||
|
}).printList(
|
||||||
|
ts.ListFormat.MultiLine,
|
||||||
|
ts.factory.createNodeArray(elements),
|
||||||
|
ts.createSourceFile('index.d.ts', '', ts.ScriptTarget.ESNext, true, ts.ScriptKind.TS),
|
||||||
|
);
|
||||||
|
|
||||||
|
fs.writeFileSync(`${__dirname}/index.d.ts`, `/* eslint-disable */
|
||||||
|
// This file is generated by locales/generateDTS.js
|
||||||
|
// Do not edit this file directly.
|
||||||
|
${printed}`, 'utf-8');
|
||||||
|
}
|
||||||
@@ -5,7 +5,7 @@ introMisskey: "Selamat datang! Misskey adalah perangkat mikroblog tercatu bersif
|
|||||||
poweredByMisskeyDescription: "{name} adalah sebuah layanan (instance) yang menggunakan platform sumber terbuka <b>Misskey</b>."
|
poweredByMisskeyDescription: "{name} adalah sebuah layanan (instance) yang menggunakan platform sumber terbuka <b>Misskey</b>."
|
||||||
monthAndDay: "{day} {month}"
|
monthAndDay: "{day} {month}"
|
||||||
search: "Penelusuran"
|
search: "Penelusuran"
|
||||||
notifications: "Pemberitahuan"
|
notifications: "Notifikasi"
|
||||||
username: "Nama Pengguna"
|
username: "Nama Pengguna"
|
||||||
password: "Kata sandi"
|
password: "Kata sandi"
|
||||||
forgotPassword: "Lupa Kata Sandi"
|
forgotPassword: "Lupa Kata Sandi"
|
||||||
@@ -17,14 +17,15 @@ noThankYou: "Tidak sekarang."
|
|||||||
enterUsername: "Masukkan nama pengguna"
|
enterUsername: "Masukkan nama pengguna"
|
||||||
renotedBy: "direnote oleh {user}"
|
renotedBy: "direnote oleh {user}"
|
||||||
noNotes: "Tidak ada catatan"
|
noNotes: "Tidak ada catatan"
|
||||||
noNotifications: "Tidak ada pemberitahuan"
|
noNotifications: "Tidak ada notifikasi"
|
||||||
instance: "Instansi"
|
instance: "Instansi"
|
||||||
settings: "Pengaturan"
|
settings: "Pengaturan"
|
||||||
|
notificationSettings: "Atur Notifikasi"
|
||||||
basicSettings: "Pengaturan umum"
|
basicSettings: "Pengaturan umum"
|
||||||
otherSettings: "Pengaturan lainnya"
|
otherSettings: "Pengaturan lainnya"
|
||||||
openInWindow: "Buka di jendela"
|
openInWindow: "Buka di jendela"
|
||||||
profile: "Profil"
|
profile: "Profil"
|
||||||
timeline: "Linimasa"
|
timeline: "Lini masa"
|
||||||
noAccountDescription: "Pengguna ini belum menulis bio"
|
noAccountDescription: "Pengguna ini belum menulis bio"
|
||||||
login: "Masuk"
|
login: "Masuk"
|
||||||
loggingIn: "Sedang masuk"
|
loggingIn: "Sedang masuk"
|
||||||
@@ -51,6 +52,8 @@ addToList: "Tambahkan ke daftar"
|
|||||||
sendMessage: "Kirim pesan"
|
sendMessage: "Kirim pesan"
|
||||||
copyRSS: "Salin RSS"
|
copyRSS: "Salin RSS"
|
||||||
copyUsername: "Salin nama pengguna"
|
copyUsername: "Salin nama pengguna"
|
||||||
|
copyUserId: "Salin ID pengguna"
|
||||||
|
copyNoteId: "Salin ID catatan"
|
||||||
searchUser: "Cari pengguna"
|
searchUser: "Cari pengguna"
|
||||||
reply: "Balas"
|
reply: "Balas"
|
||||||
loadMore: "Selebihnya"
|
loadMore: "Selebihnya"
|
||||||
@@ -89,7 +92,7 @@ serverIsDead: "Tidak ada respon dari peladen. Mohon tunggu dan coba beberapa saa
|
|||||||
youShouldUpgradeClient: "Untuk melihat halaman ini, mohon muat ulang untuk memutakhirkan klienmu."
|
youShouldUpgradeClient: "Untuk melihat halaman ini, mohon muat ulang untuk memutakhirkan klienmu."
|
||||||
enterListName: "Masukkan nama daftar"
|
enterListName: "Masukkan nama daftar"
|
||||||
privacy: "Privasi"
|
privacy: "Privasi"
|
||||||
makeFollowManuallyApprove: "Permintaan mengikuti membutuhkan persetujuan"
|
makeFollowManuallyApprove: "Permintaan mengikuti butuh persetujuan"
|
||||||
defaultNoteVisibility: "Privasi bawaan catatan"
|
defaultNoteVisibility: "Privasi bawaan catatan"
|
||||||
follow: "Ikuti"
|
follow: "Ikuti"
|
||||||
followRequest: "Permintaan mengikuti"
|
followRequest: "Permintaan mengikuti"
|
||||||
@@ -114,7 +117,7 @@ add: "Tambahkan"
|
|||||||
reaction: "Reaksi"
|
reaction: "Reaksi"
|
||||||
reactions: "Reaksi"
|
reactions: "Reaksi"
|
||||||
reactionSetting: "Reaksi untuk dimunculkan di bilah reaksi"
|
reactionSetting: "Reaksi untuk dimunculkan di bilah reaksi"
|
||||||
reactionSettingDescription2: "Geser untuk memindah urutkan, klik untuk menghapus, tekan \"+\" untuk menambahkan"
|
reactionSettingDescription2: "Geser untuk memindah urutan emoji, klik untuk menghapus, tekan \"+\" untuk menambahkan"
|
||||||
rememberNoteVisibility: "Ingat pengaturan visibilitas catatan"
|
rememberNoteVisibility: "Ingat pengaturan visibilitas catatan"
|
||||||
attachCancel: "Hapus lampiran"
|
attachCancel: "Hapus lampiran"
|
||||||
markAsSensitive: "Tandai sebagai konten sensitif"
|
markAsSensitive: "Tandai sebagai konten sensitif"
|
||||||
@@ -133,8 +136,10 @@ unblockConfirm: "Apakah kamu yakin ingin membuka blokir akun ini?"
|
|||||||
suspendConfirm: "Apakah kamu yakin ingin membekukan akun ini?"
|
suspendConfirm: "Apakah kamu yakin ingin membekukan akun ini?"
|
||||||
unsuspendConfirm: "Apakah kamu yakin ingin membuka pembekuan akun ini?"
|
unsuspendConfirm: "Apakah kamu yakin ingin membuka pembekuan akun ini?"
|
||||||
selectList: "Pilih daftar"
|
selectList: "Pilih daftar"
|
||||||
|
editList: "Sunting daftar"
|
||||||
selectChannel: "Pilih kanal"
|
selectChannel: "Pilih kanal"
|
||||||
selectAntenna: "Pilih Antena"
|
selectAntenna: "Pilih Antena"
|
||||||
|
editAntenna: "Sunting antena"
|
||||||
selectWidget: "Pilih gawit"
|
selectWidget: "Pilih gawit"
|
||||||
editWidgets: "Sunting gawit"
|
editWidgets: "Sunting gawit"
|
||||||
editWidgetsExit: "Selesai"
|
editWidgetsExit: "Selesai"
|
||||||
@@ -145,16 +150,17 @@ emojiName: "Nama emoji"
|
|||||||
emojiUrl: "URL Emoji"
|
emojiUrl: "URL Emoji"
|
||||||
addEmoji: "Tambahkan emoji"
|
addEmoji: "Tambahkan emoji"
|
||||||
settingGuide: "Pengaturan rekomendasi"
|
settingGuide: "Pengaturan rekomendasi"
|
||||||
cacheRemoteFiles: "Tembolokkan berkas remote"
|
cacheRemoteFiles: "Tembolokkan berkas dari instansi luar"
|
||||||
cacheRemoteFilesDescription: "Ketika pengaturan ini dinonaktifkan, berkas luar akan dimuat langsung dari instansi luar. Menonaktifkan ini akan mengurangi penggunaan penyimpanan, namun dapat menyebabkan meningkatkan lalu lintas bandwidth, karena thumbnail tidak dihasilkan."
|
cacheRemoteFilesDescription: "Ketika pengaturan ini dinonaktifkan, berkas dari instansi luar akan dimuat langsung. Menonaktifkan ini akan mengurangi penggunaan penyimpanan peladen, namun dapat menyebabkan peningkatan lalu lintas bandwidth, karena keluku tidak dihasilkan."
|
||||||
flagAsBot: "Atur akun ini sebagai Bot"
|
flagAsBot: "Atur akun ini sebagai Bot"
|
||||||
flagAsBotDescription: "Jika akun ini dikendalikan oleh program, tetapkanlah opsi ini. Jika diaktifkan, ini akan berfungsi sebagai tanda bagi pengembang lain untuk mencegah interaksi berantai dengan bot lain dan menyesuaikan sistem internal Misskey untuk memperlakukan akun ini sebagai bot."
|
flagAsBotDescription: "Jika akun ini dikendalikan oleh program, tetapkanlah opsi ini. Jika diaktifkan, ini akan berfungsi sebagai tanda bagi pengembang lain untuk mencegah interaksi berantai dengan bot lain dan menyesuaikan sistem internal Misskey untuk memperlakukan akun ini sebagai bot."
|
||||||
flagAsCat: "Atur akun ini sebagai kucing"
|
flagAsCat: "Atur akun ini sebagai kucing"
|
||||||
flagAsCatDescription: "Nyalakan tanda ini untuk menandai akun ini sebagai kucing."
|
flagAsCatDescription: "Nyalakan tanda ini untuk menandai akun ini sebagai kucing."
|
||||||
flagShowTimelineReplies: "Tampilkan balasan di linimasa"
|
flagShowTimelineReplies: "Tampilkan balasan di lini masa"
|
||||||
flagShowTimelineRepliesDescription: "Menampilkan balasan pengguna dari note pengguna lain di linimasa apabila dinyalakan."
|
flagShowTimelineRepliesDescription: "Menampilkan balasan pengguna dari catatan pengguna lain di lini masa apabila dinyalakan."
|
||||||
autoAcceptFollowed: "Setujui otomatis permintaan mengikuti dari pengguna yang kamu ikuti"
|
autoAcceptFollowed: "Setujui otomatis permintaan mengikuti dari pengguna yang kamu ikuti"
|
||||||
addAccount: "Tambahkan akun"
|
addAccount: "Tambahkan akun"
|
||||||
|
reloadAccountsList: "Muat ulang daftar akun"
|
||||||
loginFailed: "Gagal untuk masuk"
|
loginFailed: "Gagal untuk masuk"
|
||||||
showOnRemote: "Lihat profil asli"
|
showOnRemote: "Lihat profil asli"
|
||||||
general: "Umum"
|
general: "Umum"
|
||||||
@@ -165,7 +171,7 @@ searchWith: "Cari: {q}"
|
|||||||
youHaveNoLists: "Kamu tidak memiliki daftar apapun"
|
youHaveNoLists: "Kamu tidak memiliki daftar apapun"
|
||||||
followConfirm: "Apakah kamu yakin ingin mengikuti {name}?"
|
followConfirm: "Apakah kamu yakin ingin mengikuti {name}?"
|
||||||
proxyAccount: "Akun proksi"
|
proxyAccount: "Akun proksi"
|
||||||
proxyAccountDescription: "Akun proksi merupakan sebuah akun yang bertindak sebagai pengikut luar untuk pengguna dalam kondisi tertentu. Sebagai contoh, ketika pengguna menambahkan seorang pengguna luar ke dalam daftar, aktivitas dari pengguna luar tidak akan disampaikan ke instansi apabila tidak ada pengguna lokal yang mengikuti pengguna tersebut, dengan begitu akun proksilah yang akan mengikutinya."
|
proxyAccountDescription: "Akun proksi merupakan sebuah akun yang bertindak sebagai pengikut instansi luar untuk pengguna dalam kondisi tertentu. Sebagai contoh, ketika pengguna menambahkan seorang pengguna instansi luar ke dalam daftar, aktivitas dari pengguna instansi luar tidak akan disampaikan ke instansi apabila tidak ada pengguna lokal yang mengikuti pengguna tersebut, dengan begitu akun proksilah yang akan mengikutinya."
|
||||||
host: "Host"
|
host: "Host"
|
||||||
selectUser: "Pilih pengguna"
|
selectUser: "Pilih pengguna"
|
||||||
recipient: "Penerima"
|
recipient: "Penerima"
|
||||||
@@ -197,7 +203,7 @@ clearQueue: "Bersihkan antrian"
|
|||||||
clearQueueConfirmTitle: "Apakah kamu yakin ingin membersihkan antrian?"
|
clearQueueConfirmTitle: "Apakah kamu yakin ingin membersihkan antrian?"
|
||||||
clearQueueConfirmText: "Seluruh sisa catatan yang tidak tersampaikan di dalam antrian tidak akan difederasi. Biasanya operasi ini TIDAK dibutuhkan."
|
clearQueueConfirmText: "Seluruh sisa catatan yang tidak tersampaikan di dalam antrian tidak akan difederasi. Biasanya operasi ini TIDAK dibutuhkan."
|
||||||
clearCachedFiles: "Hapus tembolok"
|
clearCachedFiles: "Hapus tembolok"
|
||||||
clearCachedFilesConfirm: "Apakah kamu yakin ingin menghapus seluruh tembolok berkas remote?"
|
clearCachedFilesConfirm: "Apakah kamu yakin ingin menghapus seluruh tembolok berkas instansi luar?"
|
||||||
blockedInstances: "Instansi terblokir"
|
blockedInstances: "Instansi terblokir"
|
||||||
blockedInstancesDescription: "Daftar nama host dari instansi yang diperlukan untuk diblokir. Instansi yang didaftarkan tidak akan dapat berkomunikasi dengan instansi ini."
|
blockedInstancesDescription: "Daftar nama host dari instansi yang diperlukan untuk diblokir. Instansi yang didaftarkan tidak akan dapat berkomunikasi dengan instansi ini."
|
||||||
muteAndBlock: "Bisukan / Blokir"
|
muteAndBlock: "Bisukan / Blokir"
|
||||||
@@ -222,9 +228,9 @@ all: "Semua"
|
|||||||
subscribing: "Berlangganan"
|
subscribing: "Berlangganan"
|
||||||
publishing: "Sedang menyiarkan langsung"
|
publishing: "Sedang menyiarkan langsung"
|
||||||
notResponding: "Tidak ada respon"
|
notResponding: "Tidak ada respon"
|
||||||
instanceFollowing: "Mengikuti instance"
|
instanceFollowing: "Mengikuti instansi"
|
||||||
instanceFollowers: "Pengikut instance"
|
instanceFollowers: "Pengikut instansi"
|
||||||
instanceUsers: "Pengguna pada instance ini"
|
instanceUsers: "Pengguna pada instansi ini"
|
||||||
changePassword: "Ubah kata sandi"
|
changePassword: "Ubah kata sandi"
|
||||||
security: "Keamanan"
|
security: "Keamanan"
|
||||||
retypedNotMatch: "Input tidak sama"
|
retypedNotMatch: "Input tidak sama"
|
||||||
@@ -232,11 +238,11 @@ currentPassword: "Kata sandi saat ini"
|
|||||||
newPassword: "Kata sandi baru"
|
newPassword: "Kata sandi baru"
|
||||||
newPasswordRetype: "Ulangi kata sandi baru"
|
newPasswordRetype: "Ulangi kata sandi baru"
|
||||||
attachFile: "Lampirkan berkas"
|
attachFile: "Lampirkan berkas"
|
||||||
more: "Lagi !"
|
more: "Lainnya"
|
||||||
featured: "Sorotan"
|
featured: "Sorotan"
|
||||||
usernameOrUserId: "Nama pengguna atau User ID"
|
usernameOrUserId: "Nama pengguna atau User ID"
|
||||||
noSuchUser: "Pengguna tidak ditemukan"
|
noSuchUser: "Pengguna tidak ditemukan"
|
||||||
lookup: "Mencari"
|
lookup: "Cari"
|
||||||
announcements: "Pengumuman"
|
announcements: "Pengumuman"
|
||||||
imageUrl: "URL Gambar"
|
imageUrl: "URL Gambar"
|
||||||
remove: "Hapus"
|
remove: "Hapus"
|
||||||
@@ -261,11 +267,13 @@ noMoreHistory: "Tidak ada sejarah lagi"
|
|||||||
startMessaging: "Mulai mengirim pesan"
|
startMessaging: "Mulai mengirim pesan"
|
||||||
nUsersRead: "Dibaca oleh {n}"
|
nUsersRead: "Dibaca oleh {n}"
|
||||||
agreeTo: "Saya setuju kepada {0}"
|
agreeTo: "Saya setuju kepada {0}"
|
||||||
|
agree: "Setuju"
|
||||||
agreeBelow: "Saya setuju dengan di bawah ini"
|
agreeBelow: "Saya setuju dengan di bawah ini"
|
||||||
basicNotesBeforeCreateAccount: "Catatan penting"
|
basicNotesBeforeCreateAccount: "Catatan penting"
|
||||||
|
termsOfService: "Syarat dan ketentuan"
|
||||||
start: "Mulai"
|
start: "Mulai"
|
||||||
home: "Beranda"
|
home: "Beranda"
|
||||||
remoteUserCaution: "Informasi ini mungkin tidak mutakhir, karena pengguna ini berasal dari instansi luar."
|
remoteUserCaution: "Informasi ini mungkin tidak mutakhir, karena pengguna ini berasal dari peladen instansi luar."
|
||||||
activity: "Aktivitas"
|
activity: "Aktivitas"
|
||||||
images: "Gambar"
|
images: "Gambar"
|
||||||
image: "Gambar"
|
image: "Gambar"
|
||||||
@@ -305,19 +313,18 @@ copyUrl: "Salin tautan"
|
|||||||
rename: "Ubah nama"
|
rename: "Ubah nama"
|
||||||
avatar: "Avatar"
|
avatar: "Avatar"
|
||||||
banner: "Banner"
|
banner: "Banner"
|
||||||
nsfw: "Konten sensitif"
|
|
||||||
whenServerDisconnected: "Ketika kehilangan koneksi dengan peladen"
|
whenServerDisconnected: "Ketika kehilangan koneksi dengan peladen"
|
||||||
disconnectedFromServer: "Terputus koneksi dari peladen"
|
disconnectedFromServer: "Terputus koneksi dari peladen"
|
||||||
reload: "Muat ulang"
|
reload: "Muat ulang"
|
||||||
doNothing: "Abaikan"
|
doNothing: "Abaikan"
|
||||||
reloadConfirm: "Apakah kamu ingin memuat ulang linimasa?"
|
reloadConfirm: "Apakah kamu ingin memuat ulang lini masa?"
|
||||||
watch: "Tonton"
|
watch: "Tonton"
|
||||||
unwatch: "Batal tonton"
|
unwatch: "Batal tonton"
|
||||||
accept: "Terima"
|
accept: "Terima"
|
||||||
reject: "Tolak"
|
reject: "Tolak"
|
||||||
normal: "Normal"
|
normal: "Normal"
|
||||||
instanceName: "Nama instance"
|
instanceName: "Nama instansi"
|
||||||
instanceDescription: "Tentang instance"
|
instanceDescription: "Tentang instansi"
|
||||||
maintainerName: "Pengelola"
|
maintainerName: "Pengelola"
|
||||||
maintainerEmail: "Surel pengelola"
|
maintainerEmail: "Surel pengelola"
|
||||||
tosUrl: "URL Syarat dan Ketentuan"
|
tosUrl: "URL Syarat dan Ketentuan"
|
||||||
@@ -331,9 +338,9 @@ pages: "Halaman"
|
|||||||
integration: "Integrasi"
|
integration: "Integrasi"
|
||||||
connectService: "Sambungkan"
|
connectService: "Sambungkan"
|
||||||
disconnectService: "Putuskan"
|
disconnectService: "Putuskan"
|
||||||
enableLocalTimeline: "Nyalakan linimasa lokal"
|
enableLocalTimeline: "Nyalakan lini masa lokal"
|
||||||
enableGlobalTimeline: "Nyalakan linimasa global"
|
enableGlobalTimeline: "Nyalakan lini masa global"
|
||||||
disablingTimelinesInfo: "Admin dan Moderator akan selalu memiliki akses ke semua linimasa meskipun linimasa tersebut tidak diaktifkan."
|
disablingTimelinesInfo: "Admin dan Moderator akan selalu memiliki akses ke semua lini masa meskipun lini masa tersebut tidak diaktifkan."
|
||||||
registration: "Pendaftaran"
|
registration: "Pendaftaran"
|
||||||
enableRegistration: "Nyalakan pendaftaran pengguna baru"
|
enableRegistration: "Nyalakan pendaftaran pengguna baru"
|
||||||
invite: "Undang"
|
invite: "Undang"
|
||||||
@@ -376,7 +383,7 @@ enableServiceworker: "Aktifkan ServiceWorker"
|
|||||||
antennaUsersDescription: "Tuliskan satu nama pengguna per baris"
|
antennaUsersDescription: "Tuliskan satu nama pengguna per baris"
|
||||||
caseSensitive: "Peka huruf besar dan huruf kecil"
|
caseSensitive: "Peka huruf besar dan huruf kecil"
|
||||||
withReplies: "Termasuk balasan"
|
withReplies: "Termasuk balasan"
|
||||||
connectedTo: "Akun yang mengikuti telah terhubung"
|
connectedTo: "Akun berikut terhubung"
|
||||||
notesAndReplies: "Catatan dan balasan"
|
notesAndReplies: "Catatan dan balasan"
|
||||||
withFiles: "Media"
|
withFiles: "Media"
|
||||||
silence: "Bungkam"
|
silence: "Bungkam"
|
||||||
@@ -395,6 +402,7 @@ about: "Informasi"
|
|||||||
aboutMisskey: "Tentang Misskey"
|
aboutMisskey: "Tentang Misskey"
|
||||||
administrator: "Admin"
|
administrator: "Admin"
|
||||||
token: "Token"
|
token: "Token"
|
||||||
|
2fa: "Autentikasi 2-faktor"
|
||||||
totp: "Aplikasi autentikator"
|
totp: "Aplikasi autentikator"
|
||||||
totpDescription: "Gunakan aplikasi autentikator untuk mendapatkan kata sandi sekali pakai"
|
totpDescription: "Gunakan aplikasi autentikator untuk mendapatkan kata sandi sekali pakai"
|
||||||
moderator: "Moderator"
|
moderator: "Moderator"
|
||||||
@@ -406,6 +414,7 @@ lastUsed: "Terakhir digunakan"
|
|||||||
lastUsedAt: "Penggunaan terakhir: {t}"
|
lastUsedAt: "Penggunaan terakhir: {t}"
|
||||||
unregister: "Batalkan pendaftaran"
|
unregister: "Batalkan pendaftaran"
|
||||||
passwordLessLogin: "Setel login tanpa kata sandi"
|
passwordLessLogin: "Setel login tanpa kata sandi"
|
||||||
|
passwordLessLoginDescription: "Bolehkan masuk tanpa kata sandi dengan menggunakan hanya security-key atau passkey"
|
||||||
resetPassword: "Atur ulang kata sandi"
|
resetPassword: "Atur ulang kata sandi"
|
||||||
newPasswordIs: "Kata sandi baru adalah \"{password}\""
|
newPasswordIs: "Kata sandi baru adalah \"{password}\""
|
||||||
reduceUiAnimation: "Kurangi animasi antarmuka"
|
reduceUiAnimation: "Kurangi animasi antarmuka"
|
||||||
@@ -414,7 +423,7 @@ notFound: "Tidak dapat ditemukan"
|
|||||||
notFoundDescription: "Tidak ada halaman sesuai dengan URL yang ditentukan."
|
notFoundDescription: "Tidak ada halaman sesuai dengan URL yang ditentukan."
|
||||||
uploadFolder: "Lokasi unggah folder bawaan"
|
uploadFolder: "Lokasi unggah folder bawaan"
|
||||||
cacheClear: "Bersihkan tembolok"
|
cacheClear: "Bersihkan tembolok"
|
||||||
markAsReadAllNotifications: "Tandai semua pemberitahuan telah dibaca"
|
markAsReadAllNotifications: "Tandai semua notifikasi telah dibaca"
|
||||||
markAsReadAllUnreadNotes: "Tandai semua catatan telah dibaca"
|
markAsReadAllUnreadNotes: "Tandai semua catatan telah dibaca"
|
||||||
markAsReadAllTalkMessages: "Tandai semua pesan telah dibaca"
|
markAsReadAllTalkMessages: "Tandai semua pesan telah dibaca"
|
||||||
help: "Bantuan"
|
help: "Bantuan"
|
||||||
@@ -457,6 +466,7 @@ aboutX: "Tentang {x}"
|
|||||||
emojiStyle: "Gaya emoji"
|
emojiStyle: "Gaya emoji"
|
||||||
native: "Native"
|
native: "Native"
|
||||||
disableDrawer: "Jangan gunakan menu bergaya laci"
|
disableDrawer: "Jangan gunakan menu bergaya laci"
|
||||||
|
showNoteActionsOnlyHover: "Hanya tampilkan aksi catatan saat ditunjuk"
|
||||||
noHistory: "Tidak ada riwayat"
|
noHistory: "Tidak ada riwayat"
|
||||||
signinHistory: "Riwayat masuk"
|
signinHistory: "Riwayat masuk"
|
||||||
enableAdvancedMfm: "Nyalakan MFM tingkat lanjut"
|
enableAdvancedMfm: "Nyalakan MFM tingkat lanjut"
|
||||||
@@ -469,6 +479,8 @@ createAccount: "Buat akun"
|
|||||||
existingAccount: "Akun yang ada"
|
existingAccount: "Akun yang ada"
|
||||||
regenerate: "Buat ulang"
|
regenerate: "Buat ulang"
|
||||||
fontSize: "Ukuran huruf"
|
fontSize: "Ukuran huruf"
|
||||||
|
mediaListWithOneImageAppearance: "Tinggi daftar media dengan satu gambar saja"
|
||||||
|
limitTo: "Batasi pada {x}"
|
||||||
noFollowRequests: "Kamu tidak memiliki permintaan mengikuti yang menunggu"
|
noFollowRequests: "Kamu tidak memiliki permintaan mengikuti yang menunggu"
|
||||||
openImageInNewTab: "Buka gambar di tab baru"
|
openImageInNewTab: "Buka gambar di tab baru"
|
||||||
dashboard: "Dasbor"
|
dashboard: "Dasbor"
|
||||||
@@ -484,7 +496,7 @@ promotion: "Promosi"
|
|||||||
promote: "Promosikan"
|
promote: "Promosikan"
|
||||||
numberOfDays: "Jumlah hari"
|
numberOfDays: "Jumlah hari"
|
||||||
hideThisNote: "Sembunyikan catatan ini"
|
hideThisNote: "Sembunyikan catatan ini"
|
||||||
showFeaturedNotesInTimeline: "Tampilkan catatan yang diunggulkan di linimasa"
|
showFeaturedNotesInTimeline: "Tampilkan catatan yang diunggulkan di lini masa"
|
||||||
objectStorage: "Object Storage"
|
objectStorage: "Object Storage"
|
||||||
useObjectStorage: "Gunakan object storage"
|
useObjectStorage: "Gunakan object storage"
|
||||||
objectStorageBaseUrl: "Base URL"
|
objectStorageBaseUrl: "Base URL"
|
||||||
@@ -502,9 +514,11 @@ objectStorageUseSSLDesc: "Matikan ini jika kamu tidak akan menggunakan HTTPS unt
|
|||||||
objectStorageUseProxy: "Hubungkan melalui Proxy"
|
objectStorageUseProxy: "Hubungkan melalui Proxy"
|
||||||
objectStorageUseProxyDesc: "Matikan ini jika kamu tidak akan menggunakan Proxy untuk koneksi ObjectStorage"
|
objectStorageUseProxyDesc: "Matikan ini jika kamu tidak akan menggunakan Proxy untuk koneksi ObjectStorage"
|
||||||
objectStorageSetPublicRead: "Setel \"public-read\" disaat mengunggah"
|
objectStorageSetPublicRead: "Setel \"public-read\" disaat mengunggah"
|
||||||
|
s3ForcePathStyleDesc: "Jika s3ForcePathStyle dinyalakan, nama bucket harus dimasukkan dalam path URL dan bukan URL nama host tersebut. Kamu perlu menyalakan pengaturan ini jika menggunakan layanan seperti instansi Minio yang self-hosted."
|
||||||
serverLogs: "Log Peladen"
|
serverLogs: "Log Peladen"
|
||||||
deleteAll: "Hapus semua"
|
deleteAll: "Hapus semua"
|
||||||
showFixedPostForm: "Tampilkan form posting di atas linimasa."
|
showFixedPostForm: "Tampilkan form posting di atas lini masa."
|
||||||
|
showFixedPostFormInChannel: "Tampilkan form posting di atas lini masa (Kanal)"
|
||||||
newNoteRecived: "Kamu mendapat catatan baru"
|
newNoteRecived: "Kamu mendapat catatan baru"
|
||||||
sounds: "Bunyi"
|
sounds: "Bunyi"
|
||||||
sound: "Bunyi"
|
sound: "Bunyi"
|
||||||
@@ -533,23 +547,28 @@ scratchpadDescription: "Scratchpad menyediakan lingkungan eksperimen untuk AiScr
|
|||||||
output: "Keluaran"
|
output: "Keluaran"
|
||||||
script: "Script"
|
script: "Script"
|
||||||
disablePagesScript: "Nonaktifkan script pada halaman"
|
disablePagesScript: "Nonaktifkan script pada halaman"
|
||||||
updateRemoteUser: "Perbaharui informasi pengguna luar"
|
updateRemoteUser: "Perbaharui informasi pengguna instansi luar"
|
||||||
deleteAllFiles: "Hapus semua berkas"
|
deleteAllFiles: "Hapus semua berkas"
|
||||||
deleteAllFilesConfirm: "Apakah kamu yakin ingin menghapus semua berkas?"
|
deleteAllFilesConfirm: "Apakah kamu yakin ingin menghapus semua berkas?"
|
||||||
removeAllFollowing: "Tahan semua mengikuti"
|
removeAllFollowing: "Batalkan mengikuti semua pengguna"
|
||||||
removeAllFollowingDescription: "Batal mengikuti semua akun dari {host}. Mohon jalankan ini ketika instansi sudah tidak ada lagi."
|
removeAllFollowingDescription: "Batal mengikuti semua akun dari {host}. Mohon jalankan ini ketika instansi sudah tidak ada lagi."
|
||||||
userSuspended: "Pengguna ini telah dibekukan."
|
userSuspended: "Pengguna ini telah dibekukan."
|
||||||
userSilenced: "Pengguna ini telah dibungkam."
|
userSilenced: "Pengguna ini telah dibungkam."
|
||||||
yourAccountSuspendedTitle: "Akun ini dibekukan"
|
yourAccountSuspendedTitle: "Akun ini dibekukan"
|
||||||
yourAccountSuspendedDescription: "Akun ini dibekukan karena melanggar ketentuan penggunaan layanan peladen atau semacamnya. Hubungi admin apabila ingin tahu alasan lebih lanjut. Mohon untuk tidak membuat akun baru."
|
yourAccountSuspendedDescription: "Akun ini dibekukan karena melanggar ketentuan penggunaan layanan peladen atau semacamnya. Hubungi admin apabila ingin tahu alasan lebih lanjut. Mohon untuk tidak membuat akun baru."
|
||||||
|
tokenRevoked: "Token tidak valid"
|
||||||
|
tokenRevokedDescription: "Token ini telah kedaluwarsa. Mohon masuk lagi."
|
||||||
|
accountDeleted: "Akun telah dihapus"
|
||||||
|
accountDeletedDescription: "Akun ini telah dihapus."
|
||||||
menu: "Menu"
|
menu: "Menu"
|
||||||
divider: "Pembagi"
|
divider: "Pembagi"
|
||||||
addItem: "Tambahkan item"
|
addItem: "Tambahkan item"
|
||||||
|
rearrange: "Tata ulang"
|
||||||
relays: "Relay"
|
relays: "Relay"
|
||||||
addRelay: "Tambahkan relay"
|
addRelay: "Tambahkan relay"
|
||||||
inboxUrl: "URL Kotak masuk"
|
inboxUrl: "URL Kotak masuk"
|
||||||
addedRelays: "Relay yang ditambahkan"
|
addedRelays: "Relay yang ditambahkan"
|
||||||
serviceworkerInfo: "Harus diaktifkan untuk pemberitahuan push."
|
serviceworkerInfo: "Harus diaktifkan untuk notifikasi dorong."
|
||||||
deletedNote: "Catatan yang dihapus"
|
deletedNote: "Catatan yang dihapus"
|
||||||
invisibleNote: "Catatan yang disembunyikan"
|
invisibleNote: "Catatan yang disembunyikan"
|
||||||
enableInfiniteScroll: "Aktifkan gulir tak terbatas"
|
enableInfiniteScroll: "Aktifkan gulir tak terbatas"
|
||||||
@@ -577,13 +596,13 @@ height: "Tinggi"
|
|||||||
large: "Besar"
|
large: "Besar"
|
||||||
medium: "Sedang"
|
medium: "Sedang"
|
||||||
small: "Kecil"
|
small: "Kecil"
|
||||||
generateAccessToken: "Buat access token"
|
generateAccessToken: "Buat token akses"
|
||||||
permission: "Izin"
|
permission: "Izin"
|
||||||
enableAll: "Aktifkan semua"
|
enableAll: "Aktifkan semua"
|
||||||
disableAll: "Nonaktifkan semua"
|
disableAll: "Nonaktifkan semua"
|
||||||
tokenRequested: "Berikan ijin akses ke akun"
|
tokenRequested: "Berikan ijin akses ke akun"
|
||||||
pluginTokenRequestedDescription: "Plugin ini dapat menggunakan setelan ijin disini."
|
pluginTokenRequestedDescription: "Plugin ini dapat menggunakan setelan ijin disini."
|
||||||
notificationType: "Jenis pemberitahuan"
|
notificationType: "Jenis notifikasi"
|
||||||
edit: "Sunting"
|
edit: "Sunting"
|
||||||
emailServer: "Peladen surel"
|
emailServer: "Peladen surel"
|
||||||
enableEmail: "Nyalakan distribusi surel"
|
enableEmail: "Nyalakan distribusi surel"
|
||||||
@@ -614,10 +633,10 @@ delayed: "Terlambat"
|
|||||||
database: "Basis data"
|
database: "Basis data"
|
||||||
channel: "Kanal"
|
channel: "Kanal"
|
||||||
create: "Buat"
|
create: "Buat"
|
||||||
notificationSetting: "Pengaturan Pemberitahuan"
|
notificationSetting: "Pengaturan Notifikasi"
|
||||||
notificationSettingDesc: "Pilih tipe pemberitahuan untuk ditampilkan"
|
notificationSettingDesc: "Pilih tipe notifikasi untuk ditampilkan"
|
||||||
useGlobalSetting: "Gunakan setelan global"
|
useGlobalSetting: "Gunakan setelan global"
|
||||||
useGlobalSettingDesc: "Jika dinyalakan, setelan pemberitahuan akun kamu akan digunakan. Jika dimatikan, konfigurasi secara individu dapat dibuat."
|
useGlobalSettingDesc: "Jika dinyalakan, setelan notifikasi akun kamu akan digunakan. Jika dimatikan, pengaturan secara individu dapat dibuat."
|
||||||
other: "Lainnya"
|
other: "Lainnya"
|
||||||
regenerateLoginToken: "Perbarui token login"
|
regenerateLoginToken: "Perbarui token login"
|
||||||
regenerateLoginTokenDescription: "Perbarui token yang digunakan secara internal saat login. Normalnya aksi ini tidak diperlukan. Jika diperbarui, semua perangkat akan dilogout."
|
regenerateLoginTokenDescription: "Perbarui token yang digunakan secara internal saat login. Normalnya aksi ini tidak diperlukan. Jika diperbarui, semua perangkat akan dilogout."
|
||||||
@@ -654,8 +673,8 @@ createNewClip: "Buat klip baru"
|
|||||||
unclip: "Batalkan klip"
|
unclip: "Batalkan klip"
|
||||||
confirmToUnclipAlreadyClippedNote: "Catatan ini sudah disertakan di klip \"{name}\". Yakin ingin membatalkan catatan dari klip ini?"
|
confirmToUnclipAlreadyClippedNote: "Catatan ini sudah disertakan di klip \"{name}\". Yakin ingin membatalkan catatan dari klip ini?"
|
||||||
public: "Publik"
|
public: "Publik"
|
||||||
i18nInfo: "Misskey diterjemahkan ke dalam banyak bahasa oleh sukarelawan. Kamu dapat ikut membantu di {link}."
|
i18nInfo: "Misskey diterjemahkan ke dalam banyak bahasa oleh sukarelawan. Kamu juga dapat ikut membantu menerjemahkannya di {link}."
|
||||||
manageAccessTokens: "Kelola access token"
|
manageAccessTokens: "Kelola token akses"
|
||||||
accountInfo: "Informasi akun"
|
accountInfo: "Informasi akun"
|
||||||
notesCount: "Jumlah catatan"
|
notesCount: "Jumlah catatan"
|
||||||
repliesCount: "Jumlah balasan terkirim"
|
repliesCount: "Jumlah balasan terkirim"
|
||||||
@@ -672,7 +691,7 @@ yes: "Iya"
|
|||||||
no: "Tidak"
|
no: "Tidak"
|
||||||
driveFilesCount: "Jumlah berkas drive"
|
driveFilesCount: "Jumlah berkas drive"
|
||||||
driveUsage: "Penggunaan ruang penyimpanan drive"
|
driveUsage: "Penggunaan ruang penyimpanan drive"
|
||||||
noCrawle: "Tolak pengindeksan crawler"
|
noCrawle: "Tolak pengindeksan perayap web"
|
||||||
noCrawleDescription: "Meminta mesin pencari untuk tidak mengindeks halaman profil kamu, catatan, Halaman, dll."
|
noCrawleDescription: "Meminta mesin pencari untuk tidak mengindeks halaman profil kamu, catatan, Halaman, dll."
|
||||||
lockedAccountInfo: "Kecuali kamu menyetel visibilitas catatan milikmu ke \"Hanya pengikut\", catatan milikmu akan dapat dilihat oleh siapa saja, bahkan jika kamu memerlukan pengikut untuk disetujui secara manual."
|
lockedAccountInfo: "Kecuali kamu menyetel visibilitas catatan milikmu ke \"Hanya pengikut\", catatan milikmu akan dapat dilihat oleh siapa saja, bahkan jika kamu memerlukan pengikut untuk disetujui secara manual."
|
||||||
alwaysMarkSensitive: "Tandai media dalam catatan sebagai media sensitif"
|
alwaysMarkSensitive: "Tandai media dalam catatan sebagai media sensitif"
|
||||||
@@ -688,10 +707,12 @@ contact: "Kontak"
|
|||||||
useSystemFont: "Gunakan font bawaan sistem operasi"
|
useSystemFont: "Gunakan font bawaan sistem operasi"
|
||||||
clips: "Klip"
|
clips: "Klip"
|
||||||
experimentalFeatures: "Fitur eksperimental"
|
experimentalFeatures: "Fitur eksperimental"
|
||||||
|
experimental: "Eksperimental"
|
||||||
|
thisIsExperimentalFeature: "Fitur ini eksperimental. Fungsionalitas dari fitur ini dapat berubah sewaktu-waktu dan mungkin tidak bekerja sesuai semestinya."
|
||||||
developer: "Pengembang"
|
developer: "Pengembang"
|
||||||
makeExplorable: "Buat akun tampil di \"Jelajahi\""
|
makeExplorable: "Buat akun tampil di \"Jelajahi\""
|
||||||
makeExplorableDescription: "Jika kamu mematikan ini, akun kamu tidak akan muncul di bagian \"Jelajahi:"
|
makeExplorableDescription: "Jika kamu mematikan ini, akun kamu tidak akan muncul di menu \"Jelajahi\""
|
||||||
showGapBetweenNotesInTimeline: "Tampilkan jarak diantara catatan pada linimasa"
|
showGapBetweenNotesInTimeline: "Tampilkan jarak diantara catatan pada lini masa"
|
||||||
duplicate: "Duplikat"
|
duplicate: "Duplikat"
|
||||||
left: "Kiri"
|
left: "Kiri"
|
||||||
center: "Tengah"
|
center: "Tengah"
|
||||||
@@ -730,14 +751,14 @@ capacity: "Kapasitas"
|
|||||||
inUse: "Digunakan"
|
inUse: "Digunakan"
|
||||||
editCode: "Sunting kode"
|
editCode: "Sunting kode"
|
||||||
apply: "Terapkan"
|
apply: "Terapkan"
|
||||||
receiveAnnouncementFromInstance: "Terima pemberitahuan surel dari instansi ini"
|
receiveAnnouncementFromInstance: "Terima pengumuman dari instansi ini"
|
||||||
emailNotification: "Pemberitahuan surel"
|
emailNotification: "Notifikasi surel"
|
||||||
publish: "Terbitkan"
|
publish: "Terbitkan"
|
||||||
inChannelSearch: "Cari di kanal"
|
inChannelSearch: "Cari di kanal"
|
||||||
useReactionPickerForContextMenu: "Buka pemilih reaksi dengan klik-kanan"
|
useReactionPickerForContextMenu: "Buka pemilih reaksi dengan klik-kanan"
|
||||||
typingUsers: "{users} sedang mengetik..."
|
typingUsers: "{users} sedang mengetik..."
|
||||||
jumpToSpecifiedDate: "Loncat ke tanggal spesifik"
|
jumpToSpecifiedDate: "Loncat ke tanggal spesifik"
|
||||||
showingPastTimeline: "Sedang menampilkan linimasa lama"
|
showingPastTimeline: "Sedang menampilkan lini masa lama"
|
||||||
clear: "Bersihkan"
|
clear: "Bersihkan"
|
||||||
markAllAsRead: "Tandai semua telah dibaca"
|
markAllAsRead: "Tandai semua telah dibaca"
|
||||||
goBack: "Kembali"
|
goBack: "Kembali"
|
||||||
@@ -752,7 +773,7 @@ userInfo: "Informasi pengguna"
|
|||||||
unknown: "Tidak diketahui"
|
unknown: "Tidak diketahui"
|
||||||
onlineStatus: "Status daring"
|
onlineStatus: "Status daring"
|
||||||
hideOnlineStatus: "Sembunyikan status daring"
|
hideOnlineStatus: "Sembunyikan status daring"
|
||||||
hideOnlineStatusDescription: "Menyembunyikan status daring kamu umengurangi kenyamanan untuk beberapa fungsi seperti contohnya pencarian."
|
hideOnlineStatusDescription: "Menyembunyikan status daring kamu akan mengurangi kenyamanan untuk beberapa fungsi, seperti contohnya pencarian."
|
||||||
online: "Daring"
|
online: "Daring"
|
||||||
active: "Aktif"
|
active: "Aktif"
|
||||||
offline: "Luring"
|
offline: "Luring"
|
||||||
@@ -772,12 +793,14 @@ noMaintainerInformationWarning: "Informasi pengelola belum disetel."
|
|||||||
noBotProtectionWarning: "Proteksi bot belum disetel."
|
noBotProtectionWarning: "Proteksi bot belum disetel."
|
||||||
configure: "Setel"
|
configure: "Setel"
|
||||||
postToGallery: "Posting ke galeri"
|
postToGallery: "Posting ke galeri"
|
||||||
|
postToHashtag: "Catat ke tagar ini"
|
||||||
gallery: "Galeri"
|
gallery: "Galeri"
|
||||||
recentPosts: "Postingan terbaru"
|
recentPosts: "Postingan terbaru"
|
||||||
popularPosts: "Postingan populer"
|
popularPosts: "Postingan populer"
|
||||||
shareWithNote: "Bagikan dengan catatan"
|
shareWithNote: "Bagikan dengan catatan"
|
||||||
ads: "Iklan"
|
ads: "Iklan"
|
||||||
expiration: "Batas akhir"
|
expiration: "Batas akhir"
|
||||||
|
startingperiod: "Mulai"
|
||||||
memo: "Memo"
|
memo: "Memo"
|
||||||
priority: "Prioritas"
|
priority: "Prioritas"
|
||||||
high: "Tinggi"
|
high: "Tinggi"
|
||||||
@@ -804,14 +827,18 @@ translatedFrom: "Terjemahkan dari {x}"
|
|||||||
accountDeletionInProgress: "Penghapusan akun sedang dalam proses"
|
accountDeletionInProgress: "Penghapusan akun sedang dalam proses"
|
||||||
usernameInfo: "Nama yang mengidentifikasikan akun kamu dari yang lain pada peladen ini. Kamu dapat menggunakan alfabet (a~z, A~Z), digit (0~9) atau garis bawah (_). Username tidak dapat diubah setelahnya."
|
usernameInfo: "Nama yang mengidentifikasikan akun kamu dari yang lain pada peladen ini. Kamu dapat menggunakan alfabet (a~z, A~Z), digit (0~9) atau garis bawah (_). Username tidak dapat diubah setelahnya."
|
||||||
aiChanMode: "Mode Ai"
|
aiChanMode: "Mode Ai"
|
||||||
keepCw: "Biarkan Peringatan Konten"
|
devMode: "Mode pengembang"
|
||||||
|
keepCw: "Biarkan peringatan konten"
|
||||||
pubSub: "Akun Pub/Sub"
|
pubSub: "Akun Pub/Sub"
|
||||||
lastCommunication: "Komunikasi terakhir"
|
lastCommunication: "Komunikasi terakhir"
|
||||||
resolved: "Selesai"
|
resolved: "Selesai"
|
||||||
unresolved: "Belum selesai"
|
unresolved: "Belum selesai"
|
||||||
breakFollow: "Batalkan mengikuti"
|
breakFollow: "Hapus pengikut"
|
||||||
|
breakFollowConfirm: "Yakin untuk menghapus pengikut ini?"
|
||||||
itsOn: "Aktif"
|
itsOn: "Aktif"
|
||||||
itsOff: "Nonaktif"
|
itsOff: "Nonaktif"
|
||||||
|
on: "Nyala"
|
||||||
|
off: "Mati"
|
||||||
emailRequiredForSignup: "Membutuhkan alamat surel untuk mendaftar"
|
emailRequiredForSignup: "Membutuhkan alamat surel untuk mendaftar"
|
||||||
unread: "Belum dibaca"
|
unread: "Belum dibaca"
|
||||||
filter: "Saring"
|
filter: "Saring"
|
||||||
@@ -888,25 +915,26 @@ slow: "Lambat"
|
|||||||
fast: "Cepat"
|
fast: "Cepat"
|
||||||
sensitiveMediaDetection: "Deteksi media NSFW"
|
sensitiveMediaDetection: "Deteksi media NSFW"
|
||||||
localOnly: "Hanya lokal"
|
localOnly: "Hanya lokal"
|
||||||
remoteOnly: "Hanya remot"
|
remoteOnly: "Hanya luar instansi"
|
||||||
failedToUpload: "Gagal mengunggah"
|
failedToUpload: "Gagal mengunggah"
|
||||||
cannotUploadBecauseInappropriate: "Berkas ini tidak dapat diunggah karena sebagian dari berkas terdeteksi berpotensi NSFW."
|
cannotUploadBecauseInappropriate: "Berkas ini tidak dapat diunggah karena sebagian dari berkas terdeteksi berpotensi NSFW."
|
||||||
cannotUploadBecauseNoFreeSpace: "Gagal mengunggah karena kekurangan kapasitas Drive."
|
cannotUploadBecauseNoFreeSpace: "Gagal mengunggah karena kekurangan kapasitas Drive."
|
||||||
|
cannotUploadBecauseExceedsFileSizeLimit: "Berkas ini tidak dapat diunggah karena melebihi batas ukuran berkas."
|
||||||
beta: "Beta"
|
beta: "Beta"
|
||||||
enableAutoSensitive: "Penandaan NSFW otomatis"
|
enableAutoSensitive: "Penandaan NSFW otomatis"
|
||||||
enableAutoSensitiveDescription: "Mendeteksi otomatis dan menandai media NSFW menggunakan Machine Learning jika memungkinkan. Meskipun opsi ini dimatikan, ada kemungkinan dinyalakan secara menyeluruh pada instansi peladen."
|
enableAutoSensitiveDescription: "Mendeteksi otomatis dan menandai media NSFW menggunakan Pembelajaran Mesin jika memungkinkan. Meskipun opsi ini dimatikan, ada kemungkinan dinyalakan secara menyeluruh pada instansi peladen."
|
||||||
activeEmailValidationDescription: "Membolehkan validasi alamat surel ketat dengan mengecek apakah alamat surel tersebut temporer dan bisa berkomunikasi dengan surel tersebut. Ketidak tidak dicentang, hanya format surel yang divalidasi."
|
activeEmailValidationDescription: "Membolehkan validasi alamat surel ketat dengan mengecek apakah alamat surel tersebut temporer dan bisa berkomunikasi dengan surel tersebut. Ketidak tidak dicentang, hanya format surel yang divalidasi."
|
||||||
navbar: "Bilah navigasi"
|
navbar: "Bilah navigasi"
|
||||||
shuffle: "Acak"
|
shuffle: "Acak"
|
||||||
account: "Akun"
|
account: "Akun"
|
||||||
move: "Pindah"
|
move: "Pindah"
|
||||||
pushNotification: "Pemberitahuan push"
|
pushNotification: "Notifikasi dorong"
|
||||||
subscribePushNotification: "Nyalakan pemberitahuan push"
|
subscribePushNotification: "Nyalakan notifikasi dorong"
|
||||||
unsubscribePushNotification: "Matikan pemberitahuan push"
|
unsubscribePushNotification: "Matikan notifikasi dorong"
|
||||||
pushNotificationAlreadySubscribed: "Pemberitahuan push telah dinyalakan"
|
pushNotificationAlreadySubscribed: "Notifikasi dorong telah dinyalakan"
|
||||||
pushNotificationNotSupported: "Browser atau instansi kamu tidak mendukung pemberitahuan push"
|
pushNotificationNotSupported: "Browser atau instansi kamu tidak mendukung notifikasi dorong"
|
||||||
sendPushNotificationReadMessage: "Hapus pemberitahuan push ketika pemberitahuan relevan atau pesan telah dibaca"
|
sendPushNotificationReadMessage: "Hapus notifikasi dorong ketika notifikasi relevan atau pesan telah dibaca"
|
||||||
sendPushNotificationReadMessageCaption: "Pemberitahuan berisi teks「{emptyPushNotificationMessage}」akan ditampilkan dalam waktu pendek. Ini mungkin dapat menambah pemakaian baterai pada perangkat kamu."
|
sendPushNotificationReadMessageCaption: "Notifikasi berisi teks「{emptyPushNotificationMessage}」akan ditampilkan dalam waktu pendek. Ini mungkin dapat menambah pemakaian baterai pada perangkat kamu."
|
||||||
windowMaximize: "Maksimalkan"
|
windowMaximize: "Maksimalkan"
|
||||||
windowMinimize: "Minimalkan"
|
windowMinimize: "Minimalkan"
|
||||||
windowRestore: "Kembalikan"
|
windowRestore: "Kembalikan"
|
||||||
@@ -925,6 +953,7 @@ didYouLikeMisskey: "Apakah kamu mulai menyukai Misskey?"
|
|||||||
pleaseDonate: "{host} menggunakan perangkat lunak bebas yaitu Misskey. Kami sangat mengapresiasi sekali donasi dari kamu agar pengembangan Misskey tetap dapat berlanjut!"
|
pleaseDonate: "{host} menggunakan perangkat lunak bebas yaitu Misskey. Kami sangat mengapresiasi sekali donasi dari kamu agar pengembangan Misskey tetap dapat berlanjut!"
|
||||||
roles: "Peran"
|
roles: "Peran"
|
||||||
role: "Peran"
|
role: "Peran"
|
||||||
|
noRole: "Peran tidak temukan"
|
||||||
normalUser: "Pengguna umum"
|
normalUser: "Pengguna umum"
|
||||||
undefined: "Tak terdefinisi"
|
undefined: "Tak terdefinisi"
|
||||||
assign: "Tetapkan\n"
|
assign: "Tetapkan\n"
|
||||||
@@ -934,27 +963,141 @@ manageCustomEmojis: "Kelola Emoji Kustom"
|
|||||||
youCannotCreateAnymore: "Kamu melewati batas pembuatan."
|
youCannotCreateAnymore: "Kamu melewati batas pembuatan."
|
||||||
cannotPerformTemporary: "Sementara Tidak Tersedia"
|
cannotPerformTemporary: "Sementara Tidak Tersedia"
|
||||||
cannotPerformTemporaryDescription: "Aksi ini tidak dapat dilakukan sementara karena melewati batas eksekusi. Mohon tunggu sejenak dan coba lagi."
|
cannotPerformTemporaryDescription: "Aksi ini tidak dapat dilakukan sementara karena melewati batas eksekusi. Mohon tunggu sejenak dan coba lagi."
|
||||||
|
invalidParamError: "Parameter tidak valid"
|
||||||
|
invalidParamErrorDescription: "Parameter permintaan tidak valid. Hal ini biasanya disebabkan oleh bug, namun juga dapat terjadi karena input melebihi batas ukuran atau semacamnya."
|
||||||
|
permissionDeniedError: "Operasi ditolak"
|
||||||
|
permissionDeniedErrorDescription: "Akun ini tidak memiliki izin untuk melakukan aksi ini."
|
||||||
preset: "Prasetel"
|
preset: "Prasetel"
|
||||||
selectFromPresets: "Pilih dari prasetel"
|
selectFromPresets: "Pilih dari prasetel"
|
||||||
achievements: "Pencapaian"
|
achievements: "Pencapaian"
|
||||||
gotInvalidResponseError: "Respon peladen tidak valid"
|
gotInvalidResponseError: "Respon peladen tidak valid"
|
||||||
gotInvalidResponseErrorDescription: "Peladen tidak dapat dijangkau atau sedang dalam perawatan. Mohon coba lagi nanti."
|
gotInvalidResponseErrorDescription: "Peladen tidak dapat dijangkau atau sedang dalam perawatan. Mohon coba lagi nanti."
|
||||||
thisPostMayBeAnnoying: "Catatan ini mungkin dapat mengganggu orang lain."
|
thisPostMayBeAnnoying: "Catatan ini mungkin dapat mengganggu orang lain."
|
||||||
thisPostMayBeAnnoyingHome: "Catat ke linimasa beranda"
|
thisPostMayBeAnnoyingHome: "Catat ke lini masa beranda"
|
||||||
thisPostMayBeAnnoyingCancel: "Batalkan"
|
thisPostMayBeAnnoyingCancel: "Batalkan"
|
||||||
thisPostMayBeAnnoyingIgnore: "Tetap catat"
|
thisPostMayBeAnnoyingIgnore: "Tetap catat"
|
||||||
collapseRenotes: "Tutup renote yang sudah kamu lihat"
|
collapseRenotes: "Tutup renote yang sudah kamu lihat"
|
||||||
internalServerError: "Kesalahan internal peladen"
|
internalServerError: "Kesalahan internal peladen"
|
||||||
internalServerErrorDescription: "Peladen sedang mengalami galat tak terduga"
|
internalServerErrorDescription: "Peladen sedang mengalami galat tak terduga"
|
||||||
copyErrorInfo: "Salin detil galat"
|
copyErrorInfo: "Salin detil galat"
|
||||||
joinThisServer: "Gabung server ini"
|
joinThisServer: "Gabung peladen ini"
|
||||||
exploreOtherServers: "Cari server lain"
|
exploreOtherServers: "Cari peladen lain"
|
||||||
letsLookAtTimeline: "LIhat timeline"
|
letsLookAtTimeline: "LIhat timeline"
|
||||||
disableFederationConfirm: "Matikan federasi?"
|
disableFederationConfirm: "Matikan federasi?"
|
||||||
disableFederationConfirmWarn: "Mematikan federasi tidak membuat kiriman menjadi privat. Umumnya, mematikan federasi tidak diperlukan."
|
disableFederationConfirmWarn: "Mematikan federasi tidak membuat kiriman menjadi privat. Umumnya, mematikan federasi tidak diperlukan."
|
||||||
disableFederationOk: "Matikan federasi"
|
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"
|
||||||
|
cannotBeChangedLater: "Hal ini nantinya tidak dapat diubah lagi."
|
||||||
|
reactionAcceptance: "Penerimaan reaksi"
|
||||||
|
likeOnly: "Hanya suka"
|
||||||
|
likeOnlyForRemote: "Semua (Hanya suka dari instansi luar)"
|
||||||
|
nonSensitiveOnly: "Hanya non-sensitif"
|
||||||
|
nonSensitiveOnlyForLocalLikeOnlyForRemote: "Hanya non-sensitif (Hanya suka dari instansi luar)"
|
||||||
|
rolesAssignedToMe: "Peran yang ditugaskan ke saya"
|
||||||
|
resetPasswordConfirm: "Yakin untuk mereset kata sandimu?"
|
||||||
|
sensitiveWords: "Kata sensitif"
|
||||||
|
sensitiveWordsDescription: "Visibilitas dari semua catatan mengandung kata yang telah diatur akan dijadikan \"Beranda\" secara otomatis. Kamu dapat mendaftarkan kata tersebut lebih dari satu dengan menuliskannya di baris baru."
|
||||||
|
sensitiveWordsDescription2: "Menggunakan spasi akan membuat ekspresi AND dan kata kunci disekitarnya dengan garis miring akan mengubahnya menjadi ekspresi reguler."
|
||||||
|
notesSearchNotAvailable: "Pencarian catatan tidak tersedia."
|
||||||
|
license: "Lisensi"
|
||||||
|
unfavoriteConfirm: "Yakin ingin menghapusnya dari favorit?"
|
||||||
|
myClips: "Klip saya"
|
||||||
|
drivecleaner: "Pembersih Drive"
|
||||||
|
retryAllQueuesNow: "Coba jalankan lagi semua antrian"
|
||||||
|
retryAllQueuesConfirmTitle: "Yakin ingin mencoba lagi semuanya?"
|
||||||
|
retryAllQueuesConfirmText: "Hal ini akan meningkatkan beban sementara ke peladen."
|
||||||
|
enableChartsForRemoteUser: "Buat bagan data pengguna instansi luar"
|
||||||
|
enableChartsForFederatedInstances: "Buat bagan data peladen instansi luar"
|
||||||
|
showClipButtonInNoteFooter: "Tambahkan \"Klip\" ke menu aksi catatan"
|
||||||
|
largeNoteReactions: "Besarkan reaksi yang ditampilkan"
|
||||||
|
noteIdOrUrl: "ID catatan atau URL"
|
||||||
|
video: "Video"
|
||||||
|
videos: "Video"
|
||||||
|
dataSaver: "Penghemat data"
|
||||||
|
accountMigration: "Pemindahan akun"
|
||||||
|
accountMoved: "Pengguna ini telah berpindah ke akun baru:"
|
||||||
|
accountMovedShort: "Akun ini telah dipindahkan."
|
||||||
|
operationForbidden: "Operasi dilarang"
|
||||||
|
forceShowAds: "Selalu tampilkan iklan"
|
||||||
|
addMemo: "Tambahkan memo"
|
||||||
|
editMemo: "Sunting memo"
|
||||||
|
reactionsList: "Reaksi"
|
||||||
|
renotesList: "Renote"
|
||||||
|
notificationDisplay: "Notifikasi"
|
||||||
|
leftTop: "Kiri atas"
|
||||||
|
rightTop: "Kanan atas"
|
||||||
|
leftBottom: "Kiri bawah"
|
||||||
|
rightBottom: "Kanan bawah"
|
||||||
|
stackAxis: "Arah tumpukan"
|
||||||
|
vertical: "Vertikal"
|
||||||
horizontal: "Horisontal"
|
horizontal: "Horisontal"
|
||||||
|
position: "Posisi"
|
||||||
|
serverRules: "Aturan peladen"
|
||||||
|
pleaseConfirmBelowBeforeSignup: "Mohon konfirmasi di bawah ini sebelum mendaftar."
|
||||||
|
pleaseAgreeAllToContinue: "Kamu harus menyetujui semua kolom di atas untuk melanjutkan."
|
||||||
|
continue: "Lanjutkan"
|
||||||
|
preservedUsernames: "Nama pengguna tercadangkan"
|
||||||
|
preservedUsernamesDescription: "Daftar nama pengguna yang dicadangkan dipisah dengan baris baru. Nama pengguna berikut akan tidak dapat dipakai pada pembuatan akun normal, namun dapat digunakan oleh admin untuk membuat akun baru. Akun yang sudah ada dengan menggunakan nama pengguna ini tidak akan terpengaruh."
|
||||||
|
createNoteFromTheFile: "Buat catatan dari berkas ini"
|
||||||
|
archive: "Arsipkan"
|
||||||
|
channelArchiveConfirmTitle: "Yakin untuk mengarsipkan {name}?"
|
||||||
|
channelArchiveConfirmDescription: "Kanal yang diarsipkan tidak akan muncul pada daftar kanal atau hasil pencarian. Postingan baru juga tidak dapat ditambahkan lagi."
|
||||||
|
thisChannelArchived: "Kanal ini telah diarsipkan."
|
||||||
|
displayOfNote: "Tampilan catatan"
|
||||||
|
initialAccountSetting: "Atur profil"
|
||||||
youFollowing: "Mengikuti"
|
youFollowing: "Mengikuti"
|
||||||
|
preventAiLearning: "Tolak penggunaan Pembelajaran Mesin (AI Generatif)"
|
||||||
|
preventAiLearningDescription: "Minta perayap web untuk tidak menggunakan materi teks atau gambar yang telah diposting ke dalam set data Pembelajaran Mesin (Prediktif / Generatif). Hal ini dicapai dengan menambahkan flag HTML-Response \"noai\" ke masing-masing konten. Pencegahan penuh mungkin tidak dapat dicapai dengan flag ini, karena juga dapat diabaikan begitu saja."
|
||||||
|
options: "Opsi peran"
|
||||||
|
specifyUser: "Pengguna spesifik"
|
||||||
|
failedToPreviewUrl: "Tidak dapat dipratinjau"
|
||||||
|
update: "Perbarui"
|
||||||
|
rolesThatCanBeUsedThisEmojiAsReaction: "Peran yang dapat menggunakan emoji ini sebagai reaksi"
|
||||||
|
rolesThatCanBeUsedThisEmojiAsReactionEmptyDescription: "Jika peran tidak ditentukan, semua pengguna dapat menggunakan emoji ini sebagai reaksi."
|
||||||
|
rolesThatCanBeUsedThisEmojiAsReactionPublicRoleWarn: "Peran ini harus publik."
|
||||||
|
cancelReactionConfirm: "Yakin untuk menghapus reaksimu?"
|
||||||
|
changeReactionConfirm: "Yakin untuk mengganti reaksimu?"
|
||||||
|
later: "Nanti saja"
|
||||||
|
goToMisskey: "Ke Misskey"
|
||||||
|
additionalEmojiDictionary: "Kamus emoji tambahan"
|
||||||
|
installed: "Terpasang"
|
||||||
|
branding: "Merek"
|
||||||
|
enableServerMachineStats: "Tampilkan informasi mesin peladen menjadi publik"
|
||||||
|
enableIdenticonGeneration: "Nyalakan pembuatan Identicon per pengguna"
|
||||||
|
_initialAccountSetting:
|
||||||
|
accountCreated: "Akun kamu telah sukses dibuat!"
|
||||||
|
letsStartAccountSetup: "Untuk pemula, ayo atur profilmu dulu."
|
||||||
|
letsFillYourProfile: "Pertama, ayo atur profilmu dulu."
|
||||||
|
profileSetting: "Pengaturan profil"
|
||||||
|
privacySetting: "Pengaturan privasi"
|
||||||
|
theseSettingsCanEditLater: "Kamu selalu bisa mengganti pengaturan ini lain kali."
|
||||||
|
youCanEditMoreSettingsInSettingsPageLater: "Ada banyak pengaturan yang dapat kamu atur dari halaman \"Pengaturan\". Pastikan untuk mengunjungi halaman tersebut nanti."
|
||||||
|
followUsers: "Coba ikuti beberapa pengguna yang menarik bagimu untuk membangun lini masa akunmu."
|
||||||
|
pushNotificationDescription: "Menyalakan notifikasi dorong akan membuatmu menerima notifikasi dari {name} secara langsung ke perangkatmu."
|
||||||
|
initialAccountSettingCompleted: "Pengaturan profil selesai!"
|
||||||
|
haveFun: "Selamat menikmati, {name}!"
|
||||||
|
ifYouNeedLearnMore: "Kalau kamu ingin mempelajari lebih lanjut bagaimana cara menggunakan {name} (Misskey), silahkan kunjungi {link}."
|
||||||
|
skipAreYouSure: "Yakin melewati atur profil?"
|
||||||
|
laterAreYouSure: "Yakin banget untuk atur profil nanti?"
|
||||||
|
_serverRules:
|
||||||
|
description: "Daftar peraturan akan ditampilkan sebelum pendaftaran. Mengatur ringkasan dari Syarat dan Ketentuan sangat direkomendasikan."
|
||||||
|
_accountMigration:
|
||||||
|
moveFrom: "Pindahkan akun lain ke akun ini"
|
||||||
|
moveFromSub: "Buat alias ke akun lain"
|
||||||
|
moveFromLabel: "Akun asli #{n}"
|
||||||
|
moveFromDescription: "Kamu harus membuat alias untuk akun asal kamu berpindah ke akun ini\nMasukkan alias akun asal kamu berpindah ke dalam format berikut: @namapengguna@nama.server.com\nUntuk menghapus alias, kosongkan kolom ini (tidak direkomendasikan)."
|
||||||
|
moveTo: "Pindahkan akun ini ke akun lain"
|
||||||
|
moveToLabel: "Akun tujuan pindah:"
|
||||||
|
moveCannotBeUndone: "Pemindahan akun tidak dapat diurungkan."
|
||||||
|
moveAccountDescription: "Hal ini akan memindahkan akun kamu ke akun lain.\n ・Pengikut dari akun ini akan secara otomatis dipindahkan ke akun baru\n ・Akun ini akan berhenti mengikuti dari semua pengguna yang sedang kamu ikuti\n ・Kamu akan tidak dapat membuat catatan baru dan lain-lain pada akun ini\n\nMeskipun pemindahan pengikut dilakukan secara otomatis, kamu harus mempersiapkan beberapa langkah secara manual untuk memindahkan daftar pengguna yang sedang kamu ikuti. Untuk melakukan tersebut, lakukan ekspor daftar ikuti yang nantinya dapat kamu impor pada menu pengaturan di akun baru kamu. Prosedur yang sama juga dapat diterapkan pada daftar seperti pengguna yang kamu bisukan atau blokir.\n\n(Penjelasan ini hanya berlaku pada Misskey versi 13.12.0 dan setelahnya. Perangkat lunak ActivityPub lainnya seperti Mastodon berkemungkinan befungsi berbeda.)"
|
||||||
|
moveAccountHowTo: "Untuk pindah, pertama buat alias untuk akun ini pada akun tujuan kamu berpindah.\nSetelah kamu membuat alias, masukkan akun tujuan kamu berpindah ke dalam format berikut:\n@namapengguna@nama.server.com"
|
||||||
|
startMigration: "Pindahkan"
|
||||||
|
migrationConfirm: "Yakin untuk memindahkan akun ini ke {account}? Sekali dimulai, proses ini tidak dapat dihentikan atau ditarik kembali, dan kamu tidak dapat menggunakan akun ini lagi dalam keadaan asli semula."
|
||||||
|
movedAndCannotBeUndone: "\nAkun ini telah dipindahkan.\nPemindahan tidak dapat diurungkan."
|
||||||
|
postMigrationNote: "24 jam setelah pemindahan akun selesai, akun ini akan berhenti mengikuti semua akun yang sedang diikuti. Angka mengikut dan pengikut akan menjadi nol. Untuk menghindari pengikut kamu tidak dapat melihat postingan hanya pengikut saja dalam postingan ini, mereka akan tetap mengikuti akun ini."
|
||||||
|
movedTo: "Akun baru tujuan pindah:"
|
||||||
_achievements:
|
_achievements:
|
||||||
earnedAt: "Terbuka pada"
|
earnedAt: "Terbuka pada"
|
||||||
_types:
|
_types:
|
||||||
@@ -1126,6 +1269,9 @@ _achievements:
|
|||||||
_client30min:
|
_client30min:
|
||||||
title: "Istirahat pendek"
|
title: "Istirahat pendek"
|
||||||
description: "Habiskan waktu 30 menit di Misskey"
|
description: "Habiskan waktu 30 menit di Misskey"
|
||||||
|
_client60min:
|
||||||
|
title: "Tidak ada \"Miss\" dalam Misskey"
|
||||||
|
description: "Biarkan Misskey tetap terbuka setidaknya selama 60 menit"
|
||||||
_noteDeletedWithin1min:
|
_noteDeletedWithin1min:
|
||||||
title: "Eh, salah coy!"
|
title: "Eh, salah coy!"
|
||||||
description: "Hapus catatan kurang dari semenit kamu catat"
|
description: "Hapus catatan kurang dari semenit kamu catat"
|
||||||
@@ -1141,8 +1287,8 @@ _achievements:
|
|||||||
title: "Rujukan mandiri"
|
title: "Rujukan mandiri"
|
||||||
description: "Kutip catatanmu sendiri"
|
description: "Kutip catatanmu sendiri"
|
||||||
_htl20npm:
|
_htl20npm:
|
||||||
title: "Linimasa mengalir"
|
title: "Lini masa mengalir"
|
||||||
description: "Memiliki linimasa beranda dengan kecepatan melebihi 20 cpm (catatan per menit)"
|
description: "Memiliki lini masa beranda dengan kecepatan melebihi 20 cpm (catatan per menit)"
|
||||||
_viewInstanceChart:
|
_viewInstanceChart:
|
||||||
title: "Analis"
|
title: "Analis"
|
||||||
description: "Lihat bagan instansimu"
|
description: "Lihat bagan instansimu"
|
||||||
@@ -1214,6 +1360,10 @@ _role:
|
|||||||
iconUrl: "URL ikon"
|
iconUrl: "URL ikon"
|
||||||
asBadge: "Tampilkan sebagai lencana"
|
asBadge: "Tampilkan sebagai lencana"
|
||||||
descriptionOfAsBadge: "Ikon peran ini akan ditampilkan bersebelahan dengan username pengguna yang memiliki peran ini jika dinyalakan."
|
descriptionOfAsBadge: "Ikon peran ini akan ditampilkan bersebelahan dengan username pengguna yang memiliki peran ini jika dinyalakan."
|
||||||
|
isExplorable: "Buat peran dapat terjelajahi"
|
||||||
|
descriptionOfIsExplorable: "Lini masa peran ini dan daftar pengguna dengan peran ini akan dibuat publik apabila dinyalakan."
|
||||||
|
displayOrder: "Urutan"
|
||||||
|
descriptionOfDisplayOrder: "Semakin tinggi angka, semakin tinggi posisi antarmukanya."
|
||||||
canEditMembersByModerator: "Perbolehkan moderator untuk menyunting daftar anggota untuk peran ini"
|
canEditMembersByModerator: "Perbolehkan moderator untuk menyunting daftar anggota untuk peran ini"
|
||||||
descriptionOfCanEditMembersByModerator: "Ketika dinyalakan, moderator beserta administrator dapat menugaskan ataupun mencabut pengguna ke peran ini. Ketika dimatikan, hanya administrator saja yang dapat menugaskan pengguna ke peran ini."
|
descriptionOfCanEditMembersByModerator: "Ketika dinyalakan, moderator beserta administrator dapat menugaskan ataupun mencabut pengguna ke peran ini. Ketika dimatikan, hanya administrator saja yang dapat menugaskan pengguna ke peran ini."
|
||||||
priority: "Prioritas"
|
priority: "Prioritas"
|
||||||
@@ -1222,12 +1372,13 @@ _role:
|
|||||||
middle: "Sedang"
|
middle: "Sedang"
|
||||||
high: "Tinggi"
|
high: "Tinggi"
|
||||||
_options:
|
_options:
|
||||||
gtlAvailable: "Dapat melihat linimasa global"
|
gtlAvailable: "Dapat melihat lini masa global"
|
||||||
ltlAvailable: "Dapat melihat linimasa lokal"
|
ltlAvailable: "Dapat melihat lini masa lokal"
|
||||||
canPublicNote: "Dapat mengirim catatan publik"
|
canPublicNote: "Dapat mengirim catatan publik"
|
||||||
canInvite: "Dapat membuat kode undangan instansi"
|
canInvite: "Dapat membuat kode undangan instansi"
|
||||||
canManageCustomEmojis: "Dapat mengelola Emoji kustom"
|
canManageCustomEmojis: "Dapat mengelola Emoji kustom"
|
||||||
driveCapacity: "Kapasitas Drive"
|
driveCapacity: "Kapasitas Drive"
|
||||||
|
alwaysMarkNsfw: "Selalu tandai berkas sebagai NSFW"
|
||||||
pinMax: "Jumlah maksimal catatan yang disematkan"
|
pinMax: "Jumlah maksimal catatan yang disematkan"
|
||||||
antennaMax: "Jumlah maksimum antena"
|
antennaMax: "Jumlah maksimum antena"
|
||||||
wordMuteMax: "Jumlah maksimum karakter yang diperbolehkan dalam membisukan kata"
|
wordMuteMax: "Jumlah maksimum karakter yang diperbolehkan dalam membisukan kata"
|
||||||
@@ -1239,6 +1390,7 @@ _role:
|
|||||||
rateLimitFactor: "Batas kecepatan"
|
rateLimitFactor: "Batas kecepatan"
|
||||||
descriptionOfRateLimitFactor: "Batas kecepatan yang rendah tidak begitu membatasi, batas kecepatan tinggi lebih membatasi. "
|
descriptionOfRateLimitFactor: "Batas kecepatan yang rendah tidak begitu membatasi, batas kecepatan tinggi lebih membatasi. "
|
||||||
canHideAds: "Dapat menyembunyikan iklan"
|
canHideAds: "Dapat menyembunyikan iklan"
|
||||||
|
canSearchNotes: "Penggunaan pencarian catatan"
|
||||||
_condition:
|
_condition:
|
||||||
isLocal: "Pengguna lokal"
|
isLocal: "Pengguna lokal"
|
||||||
isRemote: "Pengguna remote"
|
isRemote: "Pengguna remote"
|
||||||
@@ -1248,11 +1400,13 @@ _role:
|
|||||||
followersMoreThanOrEq: "Memiliki pengikut X atau lebih dari tersebut"
|
followersMoreThanOrEq: "Memiliki pengikut X atau lebih dari tersebut"
|
||||||
followingLessThanOrEq: "Mengikuti X pengguna atau kurang dari itu"
|
followingLessThanOrEq: "Mengikuti X pengguna atau kurang dari itu"
|
||||||
followingMoreThanOrEq: "Mengikuti X pengguna atau lebih dari itu"
|
followingMoreThanOrEq: "Mengikuti X pengguna atau lebih dari itu"
|
||||||
|
notesLessThanOrEq: "Jumlah postingan kurang dari sama dengan"
|
||||||
|
notesMoreThanOrEq: "Jumlah postingan lebih dari sama dengan"
|
||||||
and: "Kondisi-AND"
|
and: "Kondisi-AND"
|
||||||
or: "Kondisi-OR"
|
or: "Kondisi-OR"
|
||||||
not: "Kondisi-NOT"
|
not: "Kondisi-NOT"
|
||||||
_sensitiveMediaDetection:
|
_sensitiveMediaDetection:
|
||||||
description: "Mengurangi usaha moderasi server dengan mengenali media NSFW srcara otomatis menggunakan Machine Learning. Fungsi ini akan sedikit menaikkan beban peladen."
|
description: "Mengurangi usaha moderasi peladen dengan mengenali media NSFW secara otomatis menggunakan Pembelajaran Mesin. Fungsi ini akan sedikit menaikkan beban peladen."
|
||||||
sensitivity: "Sensitivitas deteksi"
|
sensitivity: "Sensitivitas deteksi"
|
||||||
sensitivityDescription: "Mengurangi sensitivitas akan mengurangi misdeteksi (false positive) sedangkan meningkatkannya akan menambah misdeteksi (false positive)."
|
sensitivityDescription: "Mengurangi sensitivitas akan mengurangi misdeteksi (false positive) sedangkan meningkatkannya akan menambah misdeteksi (false positive)."
|
||||||
setSensitiveFlagAutomatically: "Tandai sebagai NSFW"
|
setSensitiveFlagAutomatically: "Tandai sebagai NSFW"
|
||||||
@@ -1335,21 +1489,17 @@ _aboutMisskey:
|
|||||||
donate: "Donasi ke Misskey"
|
donate: "Donasi ke Misskey"
|
||||||
morePatrons: "Kami sangat mengapresiasi dukungan dari banyak penolong lain yang tidak tercantum disini. Terima kasih! 🥰"
|
morePatrons: "Kami sangat mengapresiasi dukungan dari banyak penolong lain yang tidak tercantum disini. Terima kasih! 🥰"
|
||||||
patrons: "Pendukung"
|
patrons: "Pendukung"
|
||||||
_nsfw:
|
|
||||||
respect: "Sembunyikan media NSFW"
|
|
||||||
ignore: "Jangan sembunyikan media NSFW"
|
|
||||||
force: "Sembunyikan semua media"
|
|
||||||
_instanceTicker:
|
_instanceTicker:
|
||||||
none: "Jangan tampilkan"
|
none: "Jangan tampilkan"
|
||||||
remote: "Tampilkan untuk pengguna luar"
|
remote: "Tampilkan untuk pengguna instansi luar"
|
||||||
always: "Selalu tampilkan"
|
always: "Selalu tampilkan"
|
||||||
_serverDisconnectedBehavior:
|
_serverDisconnectedBehavior:
|
||||||
reload: "Muat ulang otomatis"
|
reload: "Muat ulang otomatis"
|
||||||
dialog: "Tampilkan dialog peringatan"
|
dialog: "Tampilkan dialog peringatan"
|
||||||
quiet: "Tampilkan peringatan tidak mengganggu"
|
quiet: "Tampilkan peringatan tidak mengganggu"
|
||||||
_channel:
|
_channel:
|
||||||
create: "Buat saluran"
|
create: "Buat Kanal"
|
||||||
edit: "Sunting saluran"
|
edit: "Sunting Kanal"
|
||||||
setBanner: "Setel banner"
|
setBanner: "Setel banner"
|
||||||
removeBanner: "Hapus banner"
|
removeBanner: "Hapus banner"
|
||||||
featured: "Tren"
|
featured: "Tren"
|
||||||
@@ -1357,6 +1507,8 @@ _channel:
|
|||||||
following: "Mengikuti"
|
following: "Mengikuti"
|
||||||
usersCount: "{n} Partisipan"
|
usersCount: "{n} Partisipan"
|
||||||
notesCount: "terdapat {n} catatan"
|
notesCount: "terdapat {n} catatan"
|
||||||
|
nameAndDescription: "Nama dan deskripsi"
|
||||||
|
nameOnly: "Hanya nama"
|
||||||
_menuDisplay:
|
_menuDisplay:
|
||||||
sideFull: "Horisontal"
|
sideFull: "Horisontal"
|
||||||
sideIcon: "Horisontal (Ikon)"
|
sideIcon: "Horisontal (Ikon)"
|
||||||
@@ -1365,9 +1517,9 @@ _menuDisplay:
|
|||||||
_wordMute:
|
_wordMute:
|
||||||
muteWords: "Kata yang dibisukan"
|
muteWords: "Kata yang dibisukan"
|
||||||
muteWordsDescription: "Pisahkan dengan spasi untuk kondisi AND. Pisahkan dengan baris baru untuk kondisi OR."
|
muteWordsDescription: "Pisahkan dengan spasi untuk kondisi AND. Pisahkan dengan baris baru untuk kondisi OR."
|
||||||
muteWordsDescription2: "Kurung kata kunci dengan garis miring untuk menggunakan regular expressions."
|
muteWordsDescription2: "Kurung kata kunci dengan garis miring untuk menggunakan ekspresi reguler."
|
||||||
softDescription: "Sembunyikan catatan yang memenuhi aturan kondisi dari linimasa."
|
softDescription: "Sembunyikan catatan yang memenuhi aturan kondisi dari lini masa."
|
||||||
hardDescription: "Cegah catatan memenuhi aturan kondisi dari ditambahkan ke linimasa. Dengan tambahan, catatan berikut tidak akan ditambahkan ke linimasa meskipun jika kondisi tersebut diubah."
|
hardDescription: "Cegah catatan memenuhi aturan kondisi dari ditambahkan ke lini masa. Dengan tambahan, catatan berikut tidak akan ditambahkan ke lini masa meskipun jika kondisi tersebut diubah."
|
||||||
soft: "Lembut"
|
soft: "Lembut"
|
||||||
hard: "Keras"
|
hard: "Keras"
|
||||||
mutedNotes: "Catatan yang dibisukan"
|
mutedNotes: "Catatan yang dibisukan"
|
||||||
@@ -1437,8 +1589,8 @@ _theme:
|
|||||||
cwBg: "Latar belakang tombol Sembunyikan Konten"
|
cwBg: "Latar belakang tombol Sembunyikan Konten"
|
||||||
cwFg: "Teks tombol Sembunyikan Konten"
|
cwFg: "Teks tombol Sembunyikan Konten"
|
||||||
cwHoverBg: "Latar belakang tombol Sembunyikan Konten (Mengambang)"
|
cwHoverBg: "Latar belakang tombol Sembunyikan Konten (Mengambang)"
|
||||||
toastBg: "Latar belakang pemberitahuan"
|
toastBg: "Latar belakang notifikasi"
|
||||||
toastFg: "Teks pemberitahuan"
|
toastFg: "Teks notifikasi"
|
||||||
buttonBg: "Latar belakang tombol"
|
buttonBg: "Latar belakang tombol"
|
||||||
buttonHoverBg: "Latar belakang tombol (Mengambang)"
|
buttonHoverBg: "Latar belakang tombol (Mengambang)"
|
||||||
inputBorder: "Batas bidang masukan"
|
inputBorder: "Batas bidang masukan"
|
||||||
@@ -1453,11 +1605,11 @@ _theme:
|
|||||||
_sfx:
|
_sfx:
|
||||||
note: "Catatan"
|
note: "Catatan"
|
||||||
noteMy: "Catatan (Saya)"
|
noteMy: "Catatan (Saya)"
|
||||||
notification: "Pemberitahuan"
|
notification: "Notifikasi"
|
||||||
chat: "Pesan"
|
chat: "Pesan"
|
||||||
chatBg: "Obrolan (Latar Belakang)"
|
chatBg: "Obrolan (Latar Belakang)"
|
||||||
antenna: "Penerimaan Antenna"
|
antenna: "Penerimaan Antenna"
|
||||||
channel: "Pemberitahuan saluran"
|
channel: "Notifikasi Kanal"
|
||||||
_ago:
|
_ago:
|
||||||
future: "Masa depan"
|
future: "Masa depan"
|
||||||
justNow: "Baru saja"
|
justNow: "Baru saja"
|
||||||
@@ -1474,15 +1626,40 @@ _time:
|
|||||||
minute: "menit"
|
minute: "menit"
|
||||||
hour: "jam"
|
hour: "jam"
|
||||||
day: "hari"
|
day: "hari"
|
||||||
|
_timelineTutorial:
|
||||||
|
title: "Bagaimana cara menggunakan Misskey"
|
||||||
|
step1_1: "Ini adalah \"lini masa\". Semua \"catatan\" yang dikirimkan oleh {name} akan dimunculkan secara kronologis di sini."
|
||||||
|
step1_2: "Ada beberapa lini masa yang berbeda. Seperti contoh, \"Lini masa Beranda\" berisi catatan dari pengguna yang kamu ikuti, dan \"Lini masa lokal\" berisi catatan dari semua pengguna dari {name}."
|
||||||
|
step2_1: "Selanjutnya, mari kita coba memposting sebuah catatan. Kamu dapat melakukanya dengan menekan tombol dengan ikon pensil."
|
||||||
|
step2_2: "Bagaimana dengan menuliskan sedikit perkenalan diri, atau hanya \"Hello {name}\" kalau kamu lagi ngga feeling?"
|
||||||
|
step3_1: "Udah selesai memposting catatan pertamamu?"
|
||||||
|
step3_2: "Catatan pertamamu seharusnya sekarang sudah tampil di lini masa kamu."
|
||||||
|
step4_1: "Kamu dapat menyisipkan \"Reaksi\" ke dalam catatan."
|
||||||
|
step4_2: "Untuk menyisipkan reaksi, tekan tanda \"+\" dalam catatan dan pilih emoji yang kamu suka untuk mereaksi catatan tersebut."
|
||||||
_2fa:
|
_2fa:
|
||||||
alreadyRegistered: "Kamu telah mendaftarkan perangkat otentikasi dua faktor."
|
alreadyRegistered: "Kamu telah mendaftarkan perangkat otentikasi dua faktor."
|
||||||
|
registerTOTP: "Daftarkan aplikasi autentikator"
|
||||||
|
passwordToTOTP: "Masukkan kata sandimu"
|
||||||
step1: "Pertama, pasang aplikasi otentikasi (seperti {a} atau {b}) di perangkat kamu."
|
step1: "Pertama, pasang aplikasi otentikasi (seperti {a} atau {b}) di perangkat kamu."
|
||||||
step2: "Lalu, pindai kode QR yang ada di layar."
|
step2: "Lalu, pindai kode QR yang ada di layar."
|
||||||
|
step2Click: "Mengeklik kode QR ini akan membolehkanmu untuk mendaftarkan 2FA ke security-key atau aplikasi autentikator ponsel."
|
||||||
step2Url: "Di aplikasi desktop, masukkan URL berikut:"
|
step2Url: "Di aplikasi desktop, masukkan URL berikut:"
|
||||||
|
step3Title: "Masukkan kode autentikasi"
|
||||||
step3: "Masukkan token yang telah disediakan oleh aplikasimu untuk menyelesaikan pemasangan."
|
step3: "Masukkan token yang telah disediakan oleh aplikasimu untuk menyelesaikan pemasangan."
|
||||||
step4: "Mulai sekarang, upaya login apapun akan meminta token login dari aplikasi otentikasi kamu."
|
step4: "Mulai sekarang, upaya login apapun akan meminta token login dari aplikasi otentikasi kamu."
|
||||||
|
securityKeyNotSupported: "Peramban kamu tidak mendukung security key."
|
||||||
|
registerTOTPBeforeKey: "Mohon atur aplikasi autentikator untuk mendaftarkan security key atau passkey."
|
||||||
securityKeyInfo: "Kamu dapat memasang otentikasi WebAuthN untuk mengamankan proses login lebih lanjut dengan tidak hanya perangkat keras kunci keamanan yang mendukung FIDO2, namun juga sidik jari atau otentikasi PIN pada perangkatmu."
|
securityKeyInfo: "Kamu dapat memasang otentikasi WebAuthN untuk mengamankan proses login lebih lanjut dengan tidak hanya perangkat keras kunci keamanan yang mendukung FIDO2, namun juga sidik jari atau otentikasi PIN pada perangkatmu."
|
||||||
|
chromePasskeyNotSupported: "Passkey Chrome saat ini tidak didukung."
|
||||||
|
registerSecurityKey: "Daftarkan security key atau passkey."
|
||||||
|
securityKeyName: "Masukkan nama key."
|
||||||
|
tapSecurityKey: "Mohon ikuti peramban kamu untuk mendaftarkan security key atau passkey"
|
||||||
|
removeKey: "Hapus security key"
|
||||||
removeKeyConfirm: "Hapus cadangan {name}?"
|
removeKeyConfirm: "Hapus cadangan {name}?"
|
||||||
|
whyTOTPOnlyRenew: "Aplikasi autentikator tidak dapat dihapus selama security key masih terdaftar."
|
||||||
|
renewTOTP: "Atur ulang aplikasi autentikator"
|
||||||
|
renewTOTPConfirm: "Hal ini akan menyebabkan kode verifikasi dari aplikasi autentikator sebelumnya berhenti bekerja"
|
||||||
|
renewTOTPOk: "Atur ulang"
|
||||||
renewTOTPCancel: "Tidak sekarang."
|
renewTOTPCancel: "Tidak sekarang."
|
||||||
_permissions:
|
_permissions:
|
||||||
"read:account": "Lihat informasi akun"
|
"read:account": "Lihat informasi akun"
|
||||||
@@ -1500,8 +1677,8 @@ _permissions:
|
|||||||
"read:mutes": "Lihat daftar orang yang dibisukan"
|
"read:mutes": "Lihat daftar orang yang dibisukan"
|
||||||
"write:mutes": "Sunting daftar orang yang dibisukan"
|
"write:mutes": "Sunting daftar orang yang dibisukan"
|
||||||
"write:notes": "Buat atau hapus catatan"
|
"write:notes": "Buat atau hapus catatan"
|
||||||
"read:notifications": "Lihat pemberitahuan"
|
"read:notifications": "Lihat notifikasi"
|
||||||
"write:notifications": "Sunting pemberitahuan"
|
"write:notifications": "Sunting notifikasi"
|
||||||
"read:reactions": "Lihat reaksi"
|
"read:reactions": "Lihat reaksi"
|
||||||
"write:reactions": "Sunting reaksi"
|
"write:reactions": "Sunting reaksi"
|
||||||
"write:votes": "Beri suara"
|
"write:votes": "Beri suara"
|
||||||
@@ -1511,8 +1688,8 @@ _permissions:
|
|||||||
"write:page-likes": "Sunting suka pada Halaman"
|
"write:page-likes": "Sunting suka pada Halaman"
|
||||||
"read:user-groups": "Lihat grup pengguna"
|
"read:user-groups": "Lihat grup pengguna"
|
||||||
"write:user-groups": "Sunting atau hapus grup pengguna"
|
"write:user-groups": "Sunting atau hapus grup pengguna"
|
||||||
"read:channels": "Lihat saluran"
|
"read:channels": "Lihat Kanal"
|
||||||
"write:channels": "Sunting saluran"
|
"write:channels": "Sunting Kanal"
|
||||||
"read:gallery": "Lihat galeri"
|
"read:gallery": "Lihat galeri"
|
||||||
"write:gallery": "Sunting galeri"
|
"write:gallery": "Sunting galeri"
|
||||||
"read:gallery-likes": "Lihat daftar postingan galeri yang disukai"
|
"read:gallery-likes": "Lihat daftar postingan galeri yang disukai"
|
||||||
@@ -1544,8 +1721,8 @@ _widgets:
|
|||||||
profile: "Profil"
|
profile: "Profil"
|
||||||
instanceInfo: "Informasi Instansi"
|
instanceInfo: "Informasi Instansi"
|
||||||
memo: "Catatan memo"
|
memo: "Catatan memo"
|
||||||
notifications: "Pemberitahuan"
|
notifications: "Notifikasi"
|
||||||
timeline: "Linimasa"
|
timeline: "Lini masa"
|
||||||
calendar: "Kalender"
|
calendar: "Kalender"
|
||||||
trends: "Tren"
|
trends: "Tren"
|
||||||
clock: "Jam"
|
clock: "Jam"
|
||||||
@@ -1599,13 +1776,15 @@ _poll:
|
|||||||
remainingSeconds: "Berakhir dalam {s} detik"
|
remainingSeconds: "Berakhir dalam {s} detik"
|
||||||
_visibility:
|
_visibility:
|
||||||
public: "Publik"
|
public: "Publik"
|
||||||
publicDescription: "Catat ke linimasa global"
|
publicDescription: "Catat ke lini masa global"
|
||||||
home: "Beranda"
|
home: "Beranda"
|
||||||
homeDescription: "Catat ke linimasa beranda saja"
|
homeDescription: "Catat ke lini masa beranda saja"
|
||||||
followers: "Pengikut"
|
followers: "Pengikut"
|
||||||
followersDescription: "Catat ke pengikut saja"
|
followersDescription: "Catat ke pengikut saja"
|
||||||
specified: "Langsung"
|
specified: "Langsung"
|
||||||
specifiedDescription: "Catat ke pengguna yang ditentukan saja"
|
specifiedDescription: "Catat ke pengguna yang ditentukan saja"
|
||||||
|
disableFederation: "Matikan federasi"
|
||||||
|
disableFederationDescription: "Jangan kirimkan ke instansi lain"
|
||||||
_postForm:
|
_postForm:
|
||||||
replyPlaceholder: "Balas ke catatan ini..."
|
replyPlaceholder: "Balas ke catatan ini..."
|
||||||
quotePlaceholder: "Kutip catatan ini..."
|
quotePlaceholder: "Kutip catatan ini..."
|
||||||
@@ -1646,7 +1825,7 @@ _charts:
|
|||||||
activeUsers: "Pengguna aktif"
|
activeUsers: "Pengguna aktif"
|
||||||
notesIncDec: "Perbedaan # dalam catatan"
|
notesIncDec: "Perbedaan # dalam catatan"
|
||||||
localNotesIncDec: "Perbedaan # dalam catatan lokal"
|
localNotesIncDec: "Perbedaan # dalam catatan lokal"
|
||||||
remoteNotesIncDec: "Perbedaan # dalam catatan luar"
|
remoteNotesIncDec: "Perbedaan # dalam catatan instansi luar"
|
||||||
notesTotal: "Total # catatan"
|
notesTotal: "Total # catatan"
|
||||||
filesIncDec: "Perbedaan # dalam berkas"
|
filesIncDec: "Perbedaan # dalam berkas"
|
||||||
filesTotal: "Jumlah # berkas"
|
filesTotal: "Jumlah # berkas"
|
||||||
@@ -1761,7 +1940,8 @@ _notification:
|
|||||||
pollEnded: "Jajak pendapat berakhir"
|
pollEnded: "Jajak pendapat berakhir"
|
||||||
receiveFollowRequest: "Permintaan mengikuti diterima"
|
receiveFollowRequest: "Permintaan mengikuti diterima"
|
||||||
followRequestAccepted: "Permintaan mengikuti disetujui"
|
followRequestAccepted: "Permintaan mengikuti disetujui"
|
||||||
app: "Pemberitahuan dari aplikasi"
|
achievementEarned: "Pencapaian didapatkan"
|
||||||
|
app: "Notifikasi dari aplikasi tertaut"
|
||||||
_actions:
|
_actions:
|
||||||
followBack: "Ikuti Kembali"
|
followBack: "Ikuti Kembali"
|
||||||
reply: "Balas"
|
reply: "Balas"
|
||||||
@@ -1786,13 +1966,34 @@ _deck:
|
|||||||
_columns:
|
_columns:
|
||||||
main: "Utama"
|
main: "Utama"
|
||||||
widgets: "Widget"
|
widgets: "Widget"
|
||||||
notifications: "Pemberitahuan"
|
notifications: "Notifikasi"
|
||||||
tl: "Linimasa"
|
tl: "Lini masa"
|
||||||
antenna: "Antena"
|
antenna: "Antena"
|
||||||
list: "Daftar"
|
list: "Daftar"
|
||||||
channel: "Kanal"
|
channel: "Kanal"
|
||||||
mentions: "Sebutan"
|
mentions: "Sebutan"
|
||||||
direct: "Langsung"
|
direct: "Langsung"
|
||||||
|
roleTimeline: "Lini masa peran"
|
||||||
|
_dialog:
|
||||||
|
charactersExceeded: "Kamu telah melebihi batas karakter maksimum! Saat ini pada {current} dari {max}."
|
||||||
|
charactersBelow: "Kamu berada di bawah batas minimum karakter! Saat ini pada {current} dari {min}."
|
||||||
|
_disabledTimeline:
|
||||||
|
title: "Lini masa dinonaktifkan"
|
||||||
|
description: "Saat ini kamu tidak dapat menggunakan lini masa ini karena peran kamu saat ini."
|
||||||
|
_drivecleaner:
|
||||||
|
orderBySizeDesc: "Ukuran berkas (Turun)"
|
||||||
|
orderByCreatedAtAsc: "Tanggal (Naik)"
|
||||||
_webhookSettings:
|
_webhookSettings:
|
||||||
|
createWebhook: "Buat Webhook"
|
||||||
name: "Nama"
|
name: "Nama"
|
||||||
|
secret: "Secret"
|
||||||
|
events: "Webhook Events"
|
||||||
active: "Aktif"
|
active: "Aktif"
|
||||||
|
_events:
|
||||||
|
follow: "Ketika mengikuti pengguna"
|
||||||
|
followed: "Ketika diikuti pengguna"
|
||||||
|
note: "Ketika memposting catatan"
|
||||||
|
reply: "Ketika menerima balasan"
|
||||||
|
renote: "Ketika direnote"
|
||||||
|
reaction: "Ketika menerima reaksi"
|
||||||
|
mention: "Ketika sedang disebut"
|
||||||
|
|||||||
2166
locales/index.d.ts
vendored
2166
locales/index.d.ts
vendored
File diff suppressed because it is too large
Load Diff
@@ -2,8 +2,8 @@
|
|||||||
* Languages Loader
|
* Languages Loader
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const fs = require('fs');
|
import * as fs from 'node:fs';
|
||||||
const yaml = require('js-yaml');
|
import * as yaml from 'js-yaml';
|
||||||
|
|
||||||
const merge = (...args) => args.reduce((a, c) => ({
|
const merge = (...args) => args.reduce((a, c) => ({
|
||||||
...a,
|
...a,
|
||||||
@@ -51,9 +51,9 @@ const primaries = {
|
|||||||
// 何故か文字列にバックスペース文字が混入することがあり、YAMLが壊れるので取り除く
|
// 何故か文字列にバックスペース文字が混入することがあり、YAMLが壊れるので取り除く
|
||||||
const clean = (text) => text.replace(new RegExp(String.fromCodePoint(0x08), 'g'), '');
|
const clean = (text) => text.replace(new RegExp(String.fromCodePoint(0x08), 'g'), '');
|
||||||
|
|
||||||
const locales = languages.reduce((a, c) => (a[c] = yaml.load(clean(fs.readFileSync(`${__dirname}/${c}.yml`, 'utf-8'))) || {}, a), {});
|
const locales = languages.reduce((a, c) => (a[c] = yaml.load(clean(fs.readFileSync(new URL(`${c}.yml`, import.meta.url), 'utf-8'))) || {}, a), {});
|
||||||
|
|
||||||
module.exports = Object.entries(locales)
|
export default Object.entries(locales)
|
||||||
.reduce((a, [k ,v]) => (a[k] = (() => {
|
.reduce((a, [k ,v]) => (a[k] = (() => {
|
||||||
const [lang] = k.split('-');
|
const [lang] = k.split('-');
|
||||||
switch (k) {
|
switch (k) {
|
||||||
|
|||||||
@@ -26,15 +26,15 @@ otherSettings: "Altre impostazioni"
|
|||||||
openInWindow: "Apri in una finestra"
|
openInWindow: "Apri in una finestra"
|
||||||
profile: "Profilo"
|
profile: "Profilo"
|
||||||
timeline: "Timeline"
|
timeline: "Timeline"
|
||||||
noAccountDescription: "L'utente non ha ancora scritto niente nella biografia di profilo."
|
noAccountDescription: "La persona non ha ancora scritto alcuna autobiografia."
|
||||||
login: "Accedi"
|
login: "Accedi"
|
||||||
loggingIn: "Accesso in corso..."
|
loggingIn: "Accesso in corso..."
|
||||||
logout: "Uscita"
|
logout: "Uscita"
|
||||||
signup: "Iscriviti"
|
signup: "Iscriviti"
|
||||||
uploading: "Caricamento..."
|
uploading: "Caricamento..."
|
||||||
save: "Salva"
|
save: "Salva"
|
||||||
users: "Utente"
|
users: "Profili"
|
||||||
addUser: "Aggiungi utente"
|
addUser: "Aggiungi profilo"
|
||||||
favorite: "Preferiti"
|
favorite: "Preferiti"
|
||||||
favorites: "Preferiti"
|
favorites: "Preferiti"
|
||||||
unfavorite: "Rimuovi nota dai preferiti"
|
unfavorite: "Rimuovi nota dai preferiti"
|
||||||
@@ -52,7 +52,9 @@ addToList: "Aggiungi alla lista"
|
|||||||
sendMessage: "Invia messaggio"
|
sendMessage: "Invia messaggio"
|
||||||
copyRSS: "Copia RSS"
|
copyRSS: "Copia RSS"
|
||||||
copyUsername: "Copia nome utente"
|
copyUsername: "Copia nome utente"
|
||||||
searchUser: "Cerca utente"
|
copyUserId: "Copia ID del profilo"
|
||||||
|
copyNoteId: "Copia ID della Nota"
|
||||||
|
searchUser: "Cerca profilo"
|
||||||
reply: "Rispondi"
|
reply: "Rispondi"
|
||||||
loadMore: "Mostra di più"
|
loadMore: "Mostra di più"
|
||||||
showMore: "Espandi"
|
showMore: "Espandi"
|
||||||
@@ -153,7 +155,7 @@ flagAsBotDescription: "Attiva questo campo se il profilo esegue principalmente o
|
|||||||
flagAsCat: "Sono un gatto"
|
flagAsCat: "Sono un gatto"
|
||||||
flagAsCatDescription: "La modalità \"sono un gatto\" aggiunge le orecchie al tuo profilo"
|
flagAsCatDescription: "La modalità \"sono un gatto\" aggiunge le orecchie al tuo profilo"
|
||||||
flagShowTimelineReplies: "Mostra le risposte alle note sulla timeline."
|
flagShowTimelineReplies: "Mostra le risposte alle note sulla timeline."
|
||||||
flagShowTimelineRepliesDescription: "Se è attiva, la timeline mostra le risposte alle altre note dell'utente oltre a quelle dell'utente stesso."
|
flagShowTimelineRepliesDescription: "Attivando, la timeline mostra le Note del profilo ed anche le risposte ad altre Note"
|
||||||
autoAcceptFollowed: "Accetta automaticamente le richieste di follow da utenti che già segui"
|
autoAcceptFollowed: "Accetta automaticamente le richieste di follow da utenti che già segui"
|
||||||
addAccount: "Aggiungi profilo"
|
addAccount: "Aggiungi profilo"
|
||||||
reloadAccountsList: "Ricarica l'elenco dei profili"
|
reloadAccountsList: "Ricarica l'elenco dei profili"
|
||||||
@@ -205,7 +207,7 @@ blockedInstancesDescription: "Elenca le istanze che vuoi bloccare, una per riga.
|
|||||||
muteAndBlock: "Silenziati / Bloccati"
|
muteAndBlock: "Silenziati / Bloccati"
|
||||||
mutedUsers: "Profili silenziati"
|
mutedUsers: "Profili silenziati"
|
||||||
blockedUsers: "Profili bloccati"
|
blockedUsers: "Profili bloccati"
|
||||||
noUsers: "Nessun utente trovato"
|
noUsers: "Non ci sono profili"
|
||||||
editProfile: "Modifica profilo"
|
editProfile: "Modifica profilo"
|
||||||
noteDeleteConfirm: "Vuoi davvero eliminare questa Nota?"
|
noteDeleteConfirm: "Vuoi davvero eliminare questa Nota?"
|
||||||
pinLimitExceeded: "Non puoi fissare altre note "
|
pinLimitExceeded: "Non puoi fissare altre note "
|
||||||
@@ -236,8 +238,8 @@ newPasswordRetype: "Conferma password"
|
|||||||
attachFile: "Allega file"
|
attachFile: "Allega file"
|
||||||
more: "Di più!"
|
more: "Di più!"
|
||||||
featured: "Tendenze"
|
featured: "Tendenze"
|
||||||
usernameOrUserId: "Nome utente o ID utente"
|
usernameOrUserId: "Nome utente o ID"
|
||||||
noSuchUser: "Nessun utente trovato"
|
noSuchUser: "Profilo non trovato"
|
||||||
lookup: "Ricerca remota"
|
lookup: "Ricerca remota"
|
||||||
announcements: "Annunci"
|
announcements: "Annunci"
|
||||||
imageUrl: "URL dell'immagine"
|
imageUrl: "URL dell'immagine"
|
||||||
@@ -269,7 +271,7 @@ basicNotesBeforeCreateAccount: "Note importanti"
|
|||||||
termsOfService: "Informativa Privacy"
|
termsOfService: "Informativa Privacy"
|
||||||
start: "Inizia!"
|
start: "Inizia!"
|
||||||
home: "Home"
|
home: "Home"
|
||||||
remoteUserCaution: "Può darsi che le informazioni siano incomplete perché questo è un utente remoto."
|
remoteUserCaution: "Le informazioni potrebbero essere incomplete poiché questo profilo remoto potrebbe non essere completamente federato."
|
||||||
activity: "Attività"
|
activity: "Attività"
|
||||||
images: "Immagini"
|
images: "Immagini"
|
||||||
image: "Immagini"
|
image: "Immagini"
|
||||||
@@ -309,7 +311,6 @@ copyUrl: "Copia URL"
|
|||||||
rename: "Modifica nome"
|
rename: "Modifica nome"
|
||||||
avatar: "Foto del profilo"
|
avatar: "Foto del profilo"
|
||||||
banner: "Intestazione"
|
banner: "Intestazione"
|
||||||
nsfw: "Contenuti sensibili"
|
|
||||||
whenServerDisconnected: "Quando la connessione col server è persa"
|
whenServerDisconnected: "Quando la connessione col server è persa"
|
||||||
disconnectedFromServer: "Il server si è disconnesso"
|
disconnectedFromServer: "Il server si è disconnesso"
|
||||||
reload: "Ricarica"
|
reload: "Ricarica"
|
||||||
@@ -444,7 +445,7 @@ signinRequired: "Occorre avere un profilo registrato su questa istanza"
|
|||||||
invitations: "Invita"
|
invitations: "Invita"
|
||||||
invitationCode: "Codice di invito"
|
invitationCode: "Codice di invito"
|
||||||
checking: "Confermando"
|
checking: "Confermando"
|
||||||
available: "Consigliati"
|
available: "Disponibile"
|
||||||
unavailable: "Il nome utente è già in uso"
|
unavailable: "Il nome utente è già in uso"
|
||||||
usernameInvalidFormat: "Il nome utente può contenere solo lettere, numeri e '_'"
|
usernameInvalidFormat: "Il nome utente può contenere solo lettere, numeri e '_'"
|
||||||
tooShort: "Troppo breve"
|
tooShort: "Troppo breve"
|
||||||
@@ -560,6 +561,7 @@ accountDeletedDescription: "Questo profilo è stato eliminato."
|
|||||||
menu: "Menù"
|
menu: "Menù"
|
||||||
divider: "Linea di separazione"
|
divider: "Linea di separazione"
|
||||||
addItem: "Aggiungi elemento"
|
addItem: "Aggiungi elemento"
|
||||||
|
rearrange: "Riordina"
|
||||||
relays: "Ripetitori"
|
relays: "Ripetitori"
|
||||||
addRelay: "Aggiungi ripetitore"
|
addRelay: "Aggiungi ripetitore"
|
||||||
inboxUrl: "Inbox URL"
|
inboxUrl: "Inbox URL"
|
||||||
@@ -660,7 +662,7 @@ instanceTicker: "Informazioni sull'istanza da cui vengono le note"
|
|||||||
waitingFor: "Aspettando {x}"
|
waitingFor: "Aspettando {x}"
|
||||||
random: "Casuale"
|
random: "Casuale"
|
||||||
system: "Sistema"
|
system: "Sistema"
|
||||||
switchUi: "Cambiare interfaccia"
|
switchUi: "Cambia interfaccia grafica"
|
||||||
desktop: "Desktop"
|
desktop: "Desktop"
|
||||||
clip: "Clip"
|
clip: "Clip"
|
||||||
createNew: "Crea"
|
createNew: "Crea"
|
||||||
@@ -703,6 +705,8 @@ contact: "Contatti"
|
|||||||
useSystemFont: "Usa il carattere predefinito del sistema"
|
useSystemFont: "Usa il carattere predefinito del sistema"
|
||||||
clips: "Clip"
|
clips: "Clip"
|
||||||
experimentalFeatures: "Funzioni sperimentali"
|
experimentalFeatures: "Funzioni sperimentali"
|
||||||
|
experimental: "Sperimentale"
|
||||||
|
thisIsExperimentalFeature: "Questa è una funzionalità sperimentale. Potrebbe essere malfunzionante o cambiare in futuro."
|
||||||
developer: "Sviluppatore"
|
developer: "Sviluppatore"
|
||||||
makeExplorable: "Profilo visibile pubblicamente nella pagina \"Esplora\""
|
makeExplorable: "Profilo visibile pubblicamente nella pagina \"Esplora\""
|
||||||
makeExplorableDescription: "Disabilitando questa opzione, il tuo profilo non verrà elencato nella pagina \"Esplora\"."
|
makeExplorableDescription: "Disabilitando questa opzione, il tuo profilo non verrà elencato nella pagina \"Esplora\"."
|
||||||
@@ -779,7 +783,7 @@ switchAccount: "Cambia profilo"
|
|||||||
enabled: "Attivo"
|
enabled: "Attivo"
|
||||||
disabled: "Inattivo"
|
disabled: "Inattivo"
|
||||||
quickAction: "Azioni rapide"
|
quickAction: "Azioni rapide"
|
||||||
user: "Utente"
|
user: "Profilo"
|
||||||
administration: "Gestione"
|
administration: "Gestione"
|
||||||
accounts: "Profilo"
|
accounts: "Profilo"
|
||||||
switch: "Cambia"
|
switch: "Cambia"
|
||||||
@@ -787,6 +791,7 @@ noMaintainerInformationWarning: "Le informazioni amministratore non sono imposta
|
|||||||
noBotProtectionWarning: "Nessuna protezione impostata contro i bot."
|
noBotProtectionWarning: "Nessuna protezione impostata contro i bot."
|
||||||
configure: "Imposta"
|
configure: "Imposta"
|
||||||
postToGallery: "Pubblicare nella galleria"
|
postToGallery: "Pubblicare nella galleria"
|
||||||
|
postToHashtag: "Pubblica a questo hashtag"
|
||||||
gallery: "Galleria"
|
gallery: "Galleria"
|
||||||
recentPosts: "Le più recenti"
|
recentPosts: "Le più recenti"
|
||||||
popularPosts: "Le più visualizzate"
|
popularPosts: "Le più visualizzate"
|
||||||
@@ -811,7 +816,7 @@ received: "Ricevuto"
|
|||||||
searchResult: "Risultati della Ricerca"
|
searchResult: "Risultati della Ricerca"
|
||||||
hashtags: "Hashtag"
|
hashtags: "Hashtag"
|
||||||
troubleshooting: "Risoluzione problemi"
|
troubleshooting: "Risoluzione problemi"
|
||||||
useBlurEffect: "Utilizza effetto sfocatura nell'interfaccia"
|
useBlurEffect: "Utilizza effetto sfocatura"
|
||||||
learnMore: "Più dettagli"
|
learnMore: "Più dettagli"
|
||||||
misskeyUpdated: "Misskey è stato aggiornato!"
|
misskeyUpdated: "Misskey è stato aggiornato!"
|
||||||
whatIsNew: "Visualizza le informazioni sull'aggiornamento"
|
whatIsNew: "Visualizza le informazioni sull'aggiornamento"
|
||||||
@@ -820,6 +825,7 @@ translatedFrom: "Tradotto da {x}"
|
|||||||
accountDeletionInProgress: "È in corso l'eliminazione del profilo"
|
accountDeletionInProgress: "È in corso l'eliminazione del profilo"
|
||||||
usernameInfo: "Un nome per identificare univocamente il tuo profilo sull'istanza. Puoi utilizzare caratteri alfanumerici maiuscoli, minuscoli e il trattino basso (_). Non potrai cambiare nome utente in seguito."
|
usernameInfo: "Un nome per identificare univocamente il tuo profilo sull'istanza. Puoi utilizzare caratteri alfanumerici maiuscoli, minuscoli e il trattino basso (_). Non potrai cambiare nome utente in seguito."
|
||||||
aiChanMode: "Modalità Ai"
|
aiChanMode: "Modalità Ai"
|
||||||
|
devMode: "Modalità sviluppatori"
|
||||||
keepCw: "Mantieni il Content Warning"
|
keepCw: "Mantieni il Content Warning"
|
||||||
pubSub: "Publish/Subscribe del profilo"
|
pubSub: "Publish/Subscribe del profilo"
|
||||||
lastCommunication: "La comunicazione più recente"
|
lastCommunication: "La comunicazione più recente"
|
||||||
@@ -829,6 +835,8 @@ breakFollow: "Non seguire"
|
|||||||
breakFollowConfirm: "Vuoi davvero togliere follower?"
|
breakFollowConfirm: "Vuoi davvero togliere follower?"
|
||||||
itsOn: "Abilitato"
|
itsOn: "Abilitato"
|
||||||
itsOff: "Disabilitato"
|
itsOff: "Disabilitato"
|
||||||
|
on: "Acceso"
|
||||||
|
off: "Spento"
|
||||||
emailRequiredForSignup: "L'ndirizzo e-mail è obbligatorio per registrarsi"
|
emailRequiredForSignup: "L'ndirizzo e-mail è obbligatorio per registrarsi"
|
||||||
unread: "Non lette"
|
unread: "Non lette"
|
||||||
filter: "Filtri"
|
filter: "Filtri"
|
||||||
@@ -848,7 +856,7 @@ voteConfirm: "Votare per「{choice}」?"
|
|||||||
hide: "Nascondere"
|
hide: "Nascondere"
|
||||||
useDrawerReactionPickerForMobile: "Mostra sul drawer da dispositivo mobile"
|
useDrawerReactionPickerForMobile: "Mostra sul drawer da dispositivo mobile"
|
||||||
welcomeBackWithName: "Ciao, {name}! Eccoti di nuovo!"
|
welcomeBackWithName: "Ciao, {name}! Eccoti di nuovo!"
|
||||||
clickToFinishEmailVerification: "Fai click su [{ok}] per completare la verifica dell'indirizzo email."
|
clickToFinishEmailVerification: "Premi il bottone \"{ok}\" per completare la verifica dell'indirizzo email."
|
||||||
overridedDeviceKind: "Tipo di dispositivo"
|
overridedDeviceKind: "Tipo di dispositivo"
|
||||||
smartphone: "Smartphone"
|
smartphone: "Smartphone"
|
||||||
tablet: "Tablet"
|
tablet: "Tablet"
|
||||||
@@ -909,6 +917,7 @@ remoteOnly: "Solo remoto"
|
|||||||
failedToUpload: "errore di caricamento"
|
failedToUpload: "errore di caricamento"
|
||||||
cannotUploadBecauseInappropriate: "Non è possibile caricarlo perché è stato stabilito che potrebbe contenere contenuti inappropriati."
|
cannotUploadBecauseInappropriate: "Non è possibile caricarlo perché è stato stabilito che potrebbe contenere contenuti inappropriati."
|
||||||
cannotUploadBecauseNoFreeSpace: "Impossibile caricare a causa della mancanza di spazio libero sul drive."
|
cannotUploadBecauseNoFreeSpace: "Impossibile caricare a causa della mancanza di spazio libero sul drive."
|
||||||
|
cannotUploadBecauseExceedsFileSizeLimit: "Il file non può essere caricato perché eccede le dimensioni consentite."
|
||||||
beta: "Versione beta"
|
beta: "Versione beta"
|
||||||
enableAutoSensitive: "Determinazione automatica del NSFW"
|
enableAutoSensitive: "Determinazione automatica del NSFW"
|
||||||
enableAutoSensitiveDescription: "Se disponibile, il flag NSFW viene impostato automaticamente sui media utilizzando l'apprendimento automatico. Anche se questa funzione è disattivata, in alcuni casi può essere impostata automaticamente."
|
enableAutoSensitiveDescription: "Se disponibile, il flag NSFW viene impostato automaticamente sui media utilizzando l'apprendimento automatico. Anche se questa funzione è disattivata, in alcuni casi può essere impostata automaticamente."
|
||||||
@@ -942,6 +951,7 @@ didYouLikeMisskey: "Ti piace Misskey?"
|
|||||||
pleaseDonate: "Misskey è il software libero utilizzato su {host}. Offrendo una donazione è più facile continuare a svilupparlo!"
|
pleaseDonate: "Misskey è il software libero utilizzato su {host}. Offrendo una donazione è più facile continuare a svilupparlo!"
|
||||||
roles: "Ruoli"
|
roles: "Ruoli"
|
||||||
role: "Ruolo"
|
role: "Ruolo"
|
||||||
|
noRole: "Ruolo non trovato"
|
||||||
normalUser: "Profilo standard"
|
normalUser: "Profilo standard"
|
||||||
undefined: "Indefinito"
|
undefined: "Indefinito"
|
||||||
assign: "Assegna"
|
assign: "Assegna"
|
||||||
@@ -981,10 +991,13 @@ cannotBeChangedLater: "Non sarà più modificabile"
|
|||||||
reactionAcceptance: "Reazioni consentite"
|
reactionAcceptance: "Reazioni consentite"
|
||||||
likeOnly: "Solo i Like"
|
likeOnly: "Solo i Like"
|
||||||
likeOnlyForRemote: "Solo Like remoti"
|
likeOnlyForRemote: "Solo Like remoti"
|
||||||
|
nonSensitiveOnly: "Solamente non sensibili"
|
||||||
|
nonSensitiveOnlyForLocalLikeOnlyForRemote: "Solamente non sensibili (solo Mi piace remoti)"
|
||||||
rolesAssignedToMe: "I miei ruoli"
|
rolesAssignedToMe: "I miei ruoli"
|
||||||
resetPasswordConfirm: "Vuoi davvero ripristinare la password?"
|
resetPasswordConfirm: "Vuoi davvero ripristinare la password?"
|
||||||
sensitiveWords: "Parole sensibili"
|
sensitiveWords: "Parole sensibili"
|
||||||
sensitiveWordsDescription: "Imposta automaticamente \"Home\" alla visibilità delle Note che contengono una qualsiasi parola tra queste configurate. Puoi separarle per riga."
|
sensitiveWordsDescription: "Imposta automaticamente \"Home\" alla visibilità delle Note che contengono una qualsiasi parola tra queste configurate. Puoi separarle per riga."
|
||||||
|
sensitiveWordsDescription2: "Gli spazi creano la relazione \"E\" tra parole (questo E quello). Racchiudere una parola nelle slash \"/\" la trasforma in Espressione Regolare."
|
||||||
notesSearchNotAvailable: "Non è possibile cercare tra le Note."
|
notesSearchNotAvailable: "Non è possibile cercare tra le Note."
|
||||||
license: "Licenza"
|
license: "Licenza"
|
||||||
unfavoriteConfirm: "Vuoi davvero rimuovere la preferenza?"
|
unfavoriteConfirm: "Vuoi davvero rimuovere la preferenza?"
|
||||||
@@ -1003,9 +1016,13 @@ videos: "Video"
|
|||||||
dataSaver: "Risparmia dati"
|
dataSaver: "Risparmia dati"
|
||||||
accountMigration: "Migrazione del profilo"
|
accountMigration: "Migrazione del profilo"
|
||||||
accountMoved: "Questo profilo ha migrato altrove:"
|
accountMoved: "Questo profilo ha migrato altrove:"
|
||||||
|
accountMovedShort: "Questo profilo è stato migrato"
|
||||||
|
operationForbidden: "Operazione non consentita"
|
||||||
forceShowAds: "Mostra sempre i banner"
|
forceShowAds: "Mostra sempre i banner"
|
||||||
addMemo: "Aggiungi Memo"
|
addMemo: "Aggiungi Memo"
|
||||||
editMemo: "Modifica Memo"
|
editMemo: "Modifica Memo"
|
||||||
|
reactionsList: "Elenco delle reazioni"
|
||||||
|
renotesList: "Elenco di Rinota"
|
||||||
notificationDisplay: "Stile delle notifiche"
|
notificationDisplay: "Stile delle notifiche"
|
||||||
leftTop: "In alto a sinistra"
|
leftTop: "In alto a sinistra"
|
||||||
rightTop: "In alto a destra"
|
rightTop: "In alto a destra"
|
||||||
@@ -1019,17 +1036,65 @@ serverRules: "Regolamento"
|
|||||||
pleaseConfirmBelowBeforeSignup: "Ai sensi del regolamento EU 679/2016 GDPR, autorizzo il trattamento dati personali come descritto nella informativa Privacy."
|
pleaseConfirmBelowBeforeSignup: "Ai sensi del regolamento EU 679/2016 GDPR, autorizzo il trattamento dati personali come descritto nella informativa Privacy."
|
||||||
pleaseAgreeAllToContinue: "Per continuare, occorre selezionare ed essere d'accordo su tutto."
|
pleaseAgreeAllToContinue: "Per continuare, occorre selezionare ed essere d'accordo su tutto."
|
||||||
continue: "Continua"
|
continue: "Continua"
|
||||||
|
preservedUsernames: "Nomi utente riservati"
|
||||||
|
preservedUsernamesDescription: "Elenca, uno per linea, i nomi utente che non possono essere registrati durante la creazione del profilo. La restrizione non si applica agli amministratori. Inoltre, i profili già registrati sono esenti."
|
||||||
|
createNoteFromTheFile: "Crea Nota da questo file"
|
||||||
|
archive: "Archivio"
|
||||||
|
channelArchiveConfirmTitle: "Vuoi davvero archiviare {name}?"
|
||||||
|
channelArchiveConfirmDescription: "Un canale archiviato non compare nell'elenco canali, nemmeno nei risultati di ricerca. Non può ricevere nemmeno nuove Note."
|
||||||
|
thisChannelArchived: "Questo canale è stato archiviato."
|
||||||
|
displayOfNote: "Visualizzazione delle Note"
|
||||||
|
initialAccountSetting: "Impostazioni iniziali del profilo"
|
||||||
youFollowing: "Seguiti"
|
youFollowing: "Seguiti"
|
||||||
|
preventAiLearning: "Impedisci l'apprendimento della IA"
|
||||||
|
preventAiLearningDescription: "Aggiungendo il campo \"noai\" alla risposta HTML, si indica ai Robot esterni di non usare testi e allegati per addestrare sistemi di Machine Learning (IA predittiva/generativa). Anche se è impossibile sapere se la richiesta venga onorata o semplicemente ignorata."
|
||||||
|
options: "Opzioni del ruolo"
|
||||||
|
specifyUser: "Profilo specifico"
|
||||||
|
failedToPreviewUrl: "Anteprima non disponibile"
|
||||||
|
update: "Aggiorna"
|
||||||
|
rolesThatCanBeUsedThisEmojiAsReaction: "Ruoli che possono usare questa emoji come reazione"
|
||||||
|
rolesThatCanBeUsedThisEmojiAsReactionEmptyDescription: "Se non viene specificato alcun ruolo, chiunque può reagire con questa emoji."
|
||||||
|
rolesThatCanBeUsedThisEmojiAsReactionPublicRoleWarn: "Questi ruoli devono essere pubblici"
|
||||||
|
cancelReactionConfirm: "Vuoi annullare la tua reazione?"
|
||||||
|
changeReactionConfirm: "Vuoi cambiare la tua reazione?"
|
||||||
|
later: "Non ora"
|
||||||
|
goToMisskey: "Vai a Misskey"
|
||||||
|
additionalEmojiDictionary: "Dizionario aggiuntivo emoji"
|
||||||
|
installed: "Installazione avvenuta"
|
||||||
|
branding: "Branding"
|
||||||
|
enableServerMachineStats: "Pubblicare le informazioni sul server"
|
||||||
|
enableIdenticonGeneration: "Generazione automatica delle Identicon"
|
||||||
|
_initialAccountSetting:
|
||||||
|
accountCreated: "Il tuo profilo è stato creato!"
|
||||||
|
letsStartAccountSetup: "Per iniziare, impostiamo il tuo profilo."
|
||||||
|
letsFillYourProfile: "Innanzitutto, compila il tuo profilo."
|
||||||
|
profileSetting: "Impostazioni del profilo"
|
||||||
|
privacySetting: "Impostazioni sulla privacy"
|
||||||
|
theseSettingsCanEditLater: "In seguito, potrai cambiare la tua scelta."
|
||||||
|
youCanEditMoreSettingsInSettingsPageLater: "Nella pagina \"Impostazioni\", è possibile personalizzare di più il tuo profilo. Dacci un'occhiata dopo!"
|
||||||
|
followUsers: "Per comporre la tua Timeline Home (personale) segui i profili delle persone che ti interessano."
|
||||||
|
pushNotificationDescription: "Attivare le notifiche push ti permettera di ricevere informazioni sulla attività di {name} direttamente sul tuo dispositivo."
|
||||||
|
initialAccountSettingCompleted: "Hai completato la configurazione iniziale!"
|
||||||
|
haveFun: "Divertiti con {name}!"
|
||||||
|
ifYouNeedLearnMore: "Per saperne di più su come usare {name} (Misskey), visita la pagina {link}"
|
||||||
|
skipAreYouSure: "Vuoi davvero saltare la configurazione iniziale?"
|
||||||
|
laterAreYouSure: "Vuoi davvero rimandare la configurazione iniziale?"
|
||||||
_serverRules:
|
_serverRules:
|
||||||
description: "In Europa è necessario mostrare l'informativa sul trattamento dei dati personali, prima della registrazione al servizio."
|
description: "In Europa è necessario mostrare l'informativa sul trattamento dei dati personali, prima della registrazione al servizio."
|
||||||
_accountMigration:
|
_accountMigration:
|
||||||
moveFrom: "Migra un altro profilo dentro a questo"
|
moveFrom: "Migra un altro profilo dentro a questo"
|
||||||
|
moveFromSub: "Crea un alias verso un altro profilo remoto"
|
||||||
moveFromLabel: "Profilo da cui migrare:"
|
moveFromLabel: "Profilo da cui migrare:"
|
||||||
moveFromDescription: "Se desideri spostare i profili follower da un altro profilo a questo, devi prima creare un alias qui. Assicurati averlo creato PRIMA di eseguire l'attività! Inserisci l'indirizzo del profilo mittente in questo modo: @persona@istanza.it"
|
moveFromDescription: "Se desideri spostare i profili follower da un altro profilo a questo, devi prima creare un alias qui. Assicurati averlo creato PRIMA di eseguire l'attività! Inserisci l'indirizzo del profilo mittente in questo modo: @persona@istanza.it"
|
||||||
moveTo: "Migrare questo profilo verso un un altro"
|
moveTo: "Migrare questo profilo verso un un altro"
|
||||||
moveToLabel: "Profilo verso cui migrare"
|
moveToLabel: "Profilo verso cui migrare"
|
||||||
|
moveCannotBeUndone: "La migrazione è irreversibile, non può essere interrotta o annullata."
|
||||||
moveAccountDescription: "Questa attività è irreversibile! Innanzitutto, assicurati di aver creato, nella istanza di destinazione, un alias con l'indirizzo di questo profilo. Successivamente, indica qui il profilo di destinazione in questo modo: @persona@istanza.it"
|
moveAccountDescription: "Questa attività è irreversibile! Innanzitutto, assicurati di aver creato, nella istanza di destinazione, un alias con l'indirizzo di questo profilo. Successivamente, indica qui il profilo di destinazione in questo modo: @persona@istanza.it"
|
||||||
|
moveAccountHowTo: "Per migrare su un profilo remoto, crea prima un alias di questo profilo, sulla istanza di destinazione.\nDopo aver creato l'alias, inserisci l'indirizzo di destinazione, indicando ad esempio: @profilo@altra.istanza"
|
||||||
|
startMigration: "Avvia la migrazione"
|
||||||
migrationConfirm: "Vuoi davvero migrare questo profilo su {account}? L'azione è irreversibile e non potrai più utilizzare questo profilo nel suo stato originale.\nInoltre, assicurati di aver già creato un alias sull'account a cui ti stai trasferendo."
|
migrationConfirm: "Vuoi davvero migrare questo profilo su {account}? L'azione è irreversibile e non potrai più utilizzare questo profilo nel suo stato originale.\nInoltre, assicurati di aver già creato un alias sull'account a cui ti stai trasferendo."
|
||||||
|
movedAndCannotBeUndone: "Il tuo profilo è stato migrato.\nLa migrazione non può essere annullata."
|
||||||
|
postMigrationNote: "Questo profilo smetterà di seguire gli altri profili remoti a 24 ore dal termine della migrazione.\nSia i Follow che i Follower scenderanno a zero. I tuoi follower saranno comunque in grado di vedere le Note per soli follower, poiché non smetteranno di seguirti."
|
||||||
movedTo: "Profilo verso cui migrare"
|
movedTo: "Profilo verso cui migrare"
|
||||||
_achievements:
|
_achievements:
|
||||||
earnedAt: "Data di conseguimento"
|
earnedAt: "Data di conseguimento"
|
||||||
@@ -1311,6 +1376,7 @@ _role:
|
|||||||
canInvite: "Genera codici di invito all'istanza"
|
canInvite: "Genera codici di invito all'istanza"
|
||||||
canManageCustomEmojis: "Gestire le emoji personalizzate"
|
canManageCustomEmojis: "Gestire le emoji personalizzate"
|
||||||
driveCapacity: "Capienza del Drive"
|
driveCapacity: "Capienza del Drive"
|
||||||
|
alwaysMarkNsfw: "Imposta sempre come NSFW"
|
||||||
pinMax: "Quantità massima di Note in primo piano"
|
pinMax: "Quantità massima di Note in primo piano"
|
||||||
antennaMax: "Quantità massima di Antenne"
|
antennaMax: "Quantità massima di Antenne"
|
||||||
wordMuteMax: "Lunghezza massima del filtro parole"
|
wordMuteMax: "Lunghezza massima del filtro parole"
|
||||||
@@ -1421,10 +1487,6 @@ _aboutMisskey:
|
|||||||
donate: "Sostieni Misskey"
|
donate: "Sostieni Misskey"
|
||||||
morePatrons: "Apprezziamo sinceramente il supporto di tante altre persone. Grazie mille! 🥰"
|
morePatrons: "Apprezziamo sinceramente il supporto di tante altre persone. Grazie mille! 🥰"
|
||||||
patrons: "Sostenitori"
|
patrons: "Sostenitori"
|
||||||
_nsfw:
|
|
||||||
respect: "Nascondere i media segnati come sensibli"
|
|
||||||
ignore: "Visualizzare i media segnati come sensibili"
|
|
||||||
force: "Nascondere tutti i media"
|
|
||||||
_instanceTicker:
|
_instanceTicker:
|
||||||
none: "Nascondi"
|
none: "Nascondi"
|
||||||
remote: "Mostra solo per i profili remoti"
|
remote: "Mostra solo per i profili remoti"
|
||||||
@@ -1562,6 +1624,16 @@ _time:
|
|||||||
minute: "min"
|
minute: "min"
|
||||||
hour: "ore"
|
hour: "ore"
|
||||||
day: "giorni"
|
day: "giorni"
|
||||||
|
_timelineTutorial:
|
||||||
|
title: "Come usare Misskey"
|
||||||
|
step1_1: "Questa è la \"Timeline\". tutte le \"Note\" pubblicate su {name} vengono elencate in ordine cronologico."
|
||||||
|
step1_2: "Le Timeline sono diverse, ad esempio, la \"Home\" elenca le Note dei profili che segui. Quella \"Locale\" elenca quelle di tutti i profili attivi su {name}."
|
||||||
|
step2_1: "Prova a pubblicare una Nota. Semplicemente premendo il bottone con l'icona di una matita."
|
||||||
|
step2_2: "Potresti scrivere la tua presentazione, oppure semplicemente \"Ciao da {name}!\""
|
||||||
|
step3_1: "Hai pubblicato qualcosa?"
|
||||||
|
step3_2: "In tal caso, dovrebbe comparire subito nella tua \"Home\""
|
||||||
|
step4_1: "Puoi reagire con un emoji alle Note."
|
||||||
|
step4_2: "To attach a reaction, press the \"+\" mark on a note and choose an emoji you'd like to react with.\nPer reagire con una emoji, premi il bottone \"+\" (più) visibile vicino ad ogni Nota e scegli dall'elenco la emoji che rappresenta la tua reazione."
|
||||||
_2fa:
|
_2fa:
|
||||||
alreadyRegistered: "La configurazione è stata già completata."
|
alreadyRegistered: "La configurazione è stata già completata."
|
||||||
registerTOTP: "Registra un'app di autenticazione"
|
registerTOTP: "Registra un'app di autenticazione"
|
||||||
@@ -1709,7 +1781,7 @@ _visibility:
|
|||||||
followersDescription: "Visibile solo ai tuoi follower"
|
followersDescription: "Visibile solo ai tuoi follower"
|
||||||
specified: "Nota diretta"
|
specified: "Nota diretta"
|
||||||
specifiedDescription: "Visibile solo ai profili menzionati"
|
specifiedDescription: "Visibile solo ai profili menzionati"
|
||||||
disableFederation: "Federazione disabilitata"
|
disableFederation: "Non federare"
|
||||||
disableFederationDescription: "Non spedire attività alle altre istanze remote"
|
disableFederationDescription: "Non spedire attività alle altre istanze remote"
|
||||||
_postForm:
|
_postForm:
|
||||||
replyPlaceholder: "Rispondi a questa nota..."
|
replyPlaceholder: "Rispondi a questa nota..."
|
||||||
|
|||||||
@@ -49,9 +49,15 @@ delete: "削除"
|
|||||||
deleteAndEdit: "削除して編集"
|
deleteAndEdit: "削除して編集"
|
||||||
deleteAndEditConfirm: "このノートを削除してもう一度編集しますか?このノートへのリアクション、Renote、返信も全て削除されます。"
|
deleteAndEditConfirm: "このノートを削除してもう一度編集しますか?このノートへのリアクション、Renote、返信も全て削除されます。"
|
||||||
addToList: "リストに追加"
|
addToList: "リストに追加"
|
||||||
|
addToAntenna: "アンテナに追加"
|
||||||
sendMessage: "メッセージを送信"
|
sendMessage: "メッセージを送信"
|
||||||
copyRSS: "RSSをコピー"
|
copyRSS: "RSSをコピー"
|
||||||
copyUsername: "ユーザー名をコピー"
|
copyUsername: "ユーザー名をコピー"
|
||||||
|
copyUserId: "ユーザーIDをコピー"
|
||||||
|
copyNoteId: "ノートIDをコピー"
|
||||||
|
copyFileId: "ファイルIDをコピー"
|
||||||
|
copyFolderId: "フォルダーIDをコピー"
|
||||||
|
copyProfileUrl: "プロフィールURLをコピー"
|
||||||
searchUser: "ユーザーを検索"
|
searchUser: "ユーザーを検索"
|
||||||
reply: "返信"
|
reply: "返信"
|
||||||
loadMore: "もっと見る"
|
loadMore: "もっと見る"
|
||||||
@@ -110,7 +116,7 @@ pinnedNote: "ピン留めされたノート"
|
|||||||
pinned: "ピン留め"
|
pinned: "ピン留め"
|
||||||
you: "あなた"
|
you: "あなた"
|
||||||
clickToShow: "クリックして表示"
|
clickToShow: "クリックして表示"
|
||||||
sensitive: "閲覧注意"
|
sensitive: "センシティブ"
|
||||||
add: "追加"
|
add: "追加"
|
||||||
reaction: "リアクション"
|
reaction: "リアクション"
|
||||||
reactions: "リアクション"
|
reactions: "リアクション"
|
||||||
@@ -118,8 +124,8 @@ reactionSetting: "ピッカーに表示するリアクション"
|
|||||||
reactionSettingDescription2: "ドラッグして並び替え、クリックして削除、+を押して追加します。"
|
reactionSettingDescription2: "ドラッグして並び替え、クリックして削除、+を押して追加します。"
|
||||||
rememberNoteVisibility: "公開範囲を記憶する"
|
rememberNoteVisibility: "公開範囲を記憶する"
|
||||||
attachCancel: "添付取り消し"
|
attachCancel: "添付取り消し"
|
||||||
markAsSensitive: "閲覧注意にする"
|
markAsSensitive: "センシティブとして設定"
|
||||||
unmarkAsSensitive: "閲覧注意を解除する"
|
unmarkAsSensitive: "センシティブを解除する"
|
||||||
enterFileName: "ファイル名を入力"
|
enterFileName: "ファイル名を入力"
|
||||||
mute: "ミュート"
|
mute: "ミュート"
|
||||||
unmute: "ミュート解除"
|
unmute: "ミュート解除"
|
||||||
@@ -134,8 +140,10 @@ unblockConfirm: "ブロック解除しますか?"
|
|||||||
suspendConfirm: "凍結しますか?"
|
suspendConfirm: "凍結しますか?"
|
||||||
unsuspendConfirm: "解凍しますか?"
|
unsuspendConfirm: "解凍しますか?"
|
||||||
selectList: "リストを選択"
|
selectList: "リストを選択"
|
||||||
|
editList: "リストを編集"
|
||||||
selectChannel: "チャンネルを選択"
|
selectChannel: "チャンネルを選択"
|
||||||
selectAntenna: "アンテナを選択"
|
selectAntenna: "アンテナを選択"
|
||||||
|
editAntenna: "アンテナを編集"
|
||||||
selectWidget: "ウィジェットを選択"
|
selectWidget: "ウィジェットを選択"
|
||||||
editWidgets: "ウィジェットを編集"
|
editWidgets: "ウィジェットを編集"
|
||||||
editWidgetsExit: "編集を終了"
|
editWidgetsExit: "編集を終了"
|
||||||
@@ -148,6 +156,8 @@ addEmoji: "絵文字を追加"
|
|||||||
settingGuide: "おすすめ設定"
|
settingGuide: "おすすめ設定"
|
||||||
cacheRemoteFiles: "リモートのファイルをキャッシュする"
|
cacheRemoteFiles: "リモートのファイルをキャッシュする"
|
||||||
cacheRemoteFilesDescription: "この設定を無効にすると、リモートファイルをキャッシュせず直リンクするようになります。サーバーのストレージを節約できますが、サムネイルが生成されないので通信量が増加します。"
|
cacheRemoteFilesDescription: "この設定を無効にすると、リモートファイルをキャッシュせず直リンクするようになります。サーバーのストレージを節約できますが、サムネイルが生成されないので通信量が増加します。"
|
||||||
|
cacheRemoteSensitiveFiles: "リモートのNSFWファイルをキャッシュする"
|
||||||
|
cacheRemoteSensitiveFilesDescription: "この設定を無効にすると、リモートのNSFWファイルだけはキャッシュせず直リンクするようになります。"
|
||||||
flagAsBot: "Botとして設定"
|
flagAsBot: "Botとして設定"
|
||||||
flagAsBotDescription: "このアカウントがプログラムによって運用される場合は、このフラグをオンにします。オンにすると、反応の連鎖を防ぐためのフラグとして他の開発者に役立ったり、Misskeyのシステム上での扱いがBotに合ったものになります。"
|
flagAsBotDescription: "このアカウントがプログラムによって運用される場合は、このフラグをオンにします。オンにすると、反応の連鎖を防ぐためのフラグとして他の開発者に役立ったり、Misskeyのシステム上での扱いがBotに合ったものになります。"
|
||||||
flagAsCat: "にゃああああああああああああああ!!!!!!!!!!!!"
|
flagAsCat: "にゃああああああああああああああ!!!!!!!!!!!!"
|
||||||
@@ -309,7 +319,7 @@ copyUrl: "URLをコピー"
|
|||||||
rename: "名前を変更"
|
rename: "名前を変更"
|
||||||
avatar: "アイコン"
|
avatar: "アイコン"
|
||||||
banner: "バナー"
|
banner: "バナー"
|
||||||
nsfw: "閲覧注意"
|
displayOfSensitiveMedia: "センシティブなメディアの表示"
|
||||||
whenServerDisconnected: "サーバーとの接続が失われたとき"
|
whenServerDisconnected: "サーバーとの接続が失われたとき"
|
||||||
disconnectedFromServer: "サーバーから切断されました"
|
disconnectedFromServer: "サーバーから切断されました"
|
||||||
reload: "リロード"
|
reload: "リロード"
|
||||||
@@ -689,9 +699,9 @@ no: "いいえ"
|
|||||||
driveFilesCount: "ドライブのファイル数"
|
driveFilesCount: "ドライブのファイル数"
|
||||||
driveUsage: "ドライブ使用量"
|
driveUsage: "ドライブ使用量"
|
||||||
noCrawle: "クローラーによるインデックスを拒否"
|
noCrawle: "クローラーによるインデックスを拒否"
|
||||||
noCrawleDescription: "検索エンジンにあなたのユーザーページ、ノート、Pagesなどのコンテンツを登録(インデックス)しないよう要請します。"
|
noCrawleDescription: "外部の検索エンジンにあなたのユーザーページ、ノート、Pagesなどのコンテンツを登録(インデックス)しないよう要求します。"
|
||||||
lockedAccountInfo: "フォローを承認制にしても、ノートの公開範囲を「フォロワー」にしない限り、誰でもあなたのノートを見ることができます。"
|
lockedAccountInfo: "フォローを承認制にしても、ノートの公開範囲を「フォロワー」にしない限り、誰でもあなたのノートを見ることができます。"
|
||||||
alwaysMarkSensitive: "デフォルトでメディアを閲覧注意にする"
|
alwaysMarkSensitive: "デフォルトでメディアをセンシティブ設定にする"
|
||||||
loadRawImages: "添付画像のサムネイルをオリジナル画質にする"
|
loadRawImages: "添付画像のサムネイルをオリジナル画質にする"
|
||||||
disableShowingAnimatedImages: "アニメーション画像を再生しない"
|
disableShowingAnimatedImages: "アニメーション画像を再生しない"
|
||||||
verificationEmailSent: "確認のメールを送信しました。メールに記載されたリンクにアクセスして、設定を完了してください。"
|
verificationEmailSent: "確認のメールを送信しました。メールに記載されたリンクにアクセスして、設定を完了してください。"
|
||||||
@@ -790,6 +800,7 @@ noMaintainerInformationWarning: "管理者情報が設定されていません
|
|||||||
noBotProtectionWarning: "Botプロテクションが設定されていません。"
|
noBotProtectionWarning: "Botプロテクションが設定されていません。"
|
||||||
configure: "設定する"
|
configure: "設定する"
|
||||||
postToGallery: "ギャラリーへ投稿"
|
postToGallery: "ギャラリーへ投稿"
|
||||||
|
postToHashtag: "このハッシュタグで投稿"
|
||||||
gallery: "ギャラリー"
|
gallery: "ギャラリー"
|
||||||
recentPosts: "最近の投稿"
|
recentPosts: "最近の投稿"
|
||||||
popularPosts: "人気の投稿"
|
popularPosts: "人気の投稿"
|
||||||
@@ -823,6 +834,7 @@ translatedFrom: "{x}から翻訳"
|
|||||||
accountDeletionInProgress: "アカウントの削除が進行中です"
|
accountDeletionInProgress: "アカウントの削除が進行中です"
|
||||||
usernameInfo: "サーバー上であなたのアカウントを一意に識別するための名前。アルファベット(a~z, A~Z)、数字(0~9)、およびアンダーバー(_)が使用できます。ユーザー名は後から変更することは出来ません。"
|
usernameInfo: "サーバー上であなたのアカウントを一意に識別するための名前。アルファベット(a~z, A~Z)、数字(0~9)、およびアンダーバー(_)が使用できます。ユーザー名は後から変更することは出来ません。"
|
||||||
aiChanMode: "藍モード"
|
aiChanMode: "藍モード"
|
||||||
|
devMode: "開発者モード"
|
||||||
keepCw: "CWを維持する"
|
keepCw: "CWを維持する"
|
||||||
pubSub: "Pub/Subのアカウント"
|
pubSub: "Pub/Subのアカウント"
|
||||||
lastCommunication: "直近の通信"
|
lastCommunication: "直近の通信"
|
||||||
@@ -832,6 +844,8 @@ breakFollow: "フォロワーを解除"
|
|||||||
breakFollowConfirm: "フォロワー解除しますか?"
|
breakFollowConfirm: "フォロワー解除しますか?"
|
||||||
itsOn: "オンになっています"
|
itsOn: "オンになっています"
|
||||||
itsOff: "オフになっています"
|
itsOff: "オフになっています"
|
||||||
|
on: "オン"
|
||||||
|
off: "オフ"
|
||||||
emailRequiredForSignup: "アカウント登録にメールアドレスを必須にする"
|
emailRequiredForSignup: "アカウント登録にメールアドレスを必須にする"
|
||||||
unread: "未読"
|
unread: "未読"
|
||||||
filter: "フィルタ"
|
filter: "フィルタ"
|
||||||
@@ -914,8 +928,8 @@ cannotUploadBecauseInappropriate: "不適切な内容を含む可能性がある
|
|||||||
cannotUploadBecauseNoFreeSpace: "ドライブの空き容量が無いためアップロードできません。"
|
cannotUploadBecauseNoFreeSpace: "ドライブの空き容量が無いためアップロードできません。"
|
||||||
cannotUploadBecauseExceedsFileSizeLimit: "ファイルサイズの制限を超えているためアップロードできません。"
|
cannotUploadBecauseExceedsFileSizeLimit: "ファイルサイズの制限を超えているためアップロードできません。"
|
||||||
beta: "ベータ"
|
beta: "ベータ"
|
||||||
enableAutoSensitive: "自動NSFW判定"
|
enableAutoSensitive: "自動センシティブ判定"
|
||||||
enableAutoSensitiveDescription: "利用可能な場合は、機械学習を利用して自動でメディアにNSFWフラグを設定します。この機能をオフにしても、サーバーによっては自動で設定されることがあります。"
|
enableAutoSensitiveDescription: "利用可能な場合は、機械学習を利用して自動でメディアにセンシティブフラグを設定します。この機能をオフにしても、サーバーによっては自動で設定されることがあります。"
|
||||||
activeEmailValidationDescription: "ユーザーのメールアドレスのバリデーションを、捨てアドかどうかや実際に通信可能かどうかなどを判定しより積極的に行います。オフにすると単に文字列として正しいかどうかのみチェックされます。"
|
activeEmailValidationDescription: "ユーザーのメールアドレスのバリデーションを、捨てアドかどうかや実際に通信可能かどうかなどを判定しより積極的に行います。オフにすると単に文字列として正しいかどうかのみチェックされます。"
|
||||||
navbar: "ナビゲーションバー"
|
navbar: "ナビゲーションバー"
|
||||||
shuffle: "シャッフル"
|
shuffle: "シャッフル"
|
||||||
@@ -985,11 +999,14 @@ postToTheChannel: "チャンネルに投稿"
|
|||||||
cannotBeChangedLater: "後から変更できません。"
|
cannotBeChangedLater: "後から変更できません。"
|
||||||
reactionAcceptance: "リアクションの受け入れ"
|
reactionAcceptance: "リアクションの受け入れ"
|
||||||
likeOnly: "いいねのみ"
|
likeOnly: "いいねのみ"
|
||||||
likeOnlyForRemote: "リモートからはいいねのみ"
|
likeOnlyForRemote: "全て (リモートはいいねのみ)"
|
||||||
|
nonSensitiveOnly: "非センシティブのみ"
|
||||||
|
nonSensitiveOnlyForLocalLikeOnlyForRemote: "非センシティブのみ (リモートはいいねのみ)"
|
||||||
rolesAssignedToMe: "自分に割り当てられたロール"
|
rolesAssignedToMe: "自分に割り当てられたロール"
|
||||||
resetPasswordConfirm: "パスワードリセットしますか?"
|
resetPasswordConfirm: "パスワードリセットしますか?"
|
||||||
sensitiveWords: "センシティブワード"
|
sensitiveWords: "センシティブワード"
|
||||||
sensitiveWordsDescription: "設定したワードが含まれるノートの公開範囲をホームにします。改行で区切って複数設定できます。"
|
sensitiveWordsDescription: "設定したワードが含まれるノートの公開範囲をホームにします。改行で区切って複数設定できます。"
|
||||||
|
sensitiveWordsDescription2: "スペースで区切るとAND指定になり、キーワードをスラッシュで囲むと正規表現になります。"
|
||||||
notesSearchNotAvailable: "ノート検索は利用できません。"
|
notesSearchNotAvailable: "ノート検索は利用できません。"
|
||||||
license: "ライセンス"
|
license: "ライセンス"
|
||||||
unfavoriteConfirm: "お気に入り解除しますか?"
|
unfavoriteConfirm: "お気に入り解除しますか?"
|
||||||
@@ -1038,11 +1055,32 @@ thisChannelArchived: "このチャンネルはアーカイブされています
|
|||||||
displayOfNote: "ノートの表示"
|
displayOfNote: "ノートの表示"
|
||||||
initialAccountSetting: "初期設定"
|
initialAccountSetting: "初期設定"
|
||||||
youFollowing: "フォロー中"
|
youFollowing: "フォロー中"
|
||||||
|
preventAiLearning: "生成AIによる学習を拒否"
|
||||||
|
preventAiLearningDescription: "外部の文章生成AIや画像生成AIに対して、投稿したノートや画像などのコンテンツを学習の対象にしないように要求します。これはnoaiフラグをHTMLレスポンスに含めることによって実現されますが、この要求に従うかはそのAI次第であるため、学習を完全に防止するものではありません。"
|
||||||
|
options: "オプション"
|
||||||
|
specifyUser: "ユーザー指定"
|
||||||
|
failedToPreviewUrl: "プレビューできません"
|
||||||
|
update: "更新"
|
||||||
|
rolesThatCanBeUsedThisEmojiAsReaction: "リアクションとして使えるロール"
|
||||||
|
rolesThatCanBeUsedThisEmojiAsReactionEmptyDescription: "ロールの指定が一つもない場合、誰でもリアクションとして使えます。"
|
||||||
|
rolesThatCanBeUsedThisEmojiAsReactionPublicRoleWarn: "ロールは公開ロールである必要があります。"
|
||||||
|
cancelReactionConfirm: "リアクションを取り消しますか?"
|
||||||
|
changeReactionConfirm: "リアクションを変更しますか?"
|
||||||
|
later: "あとで"
|
||||||
|
goToMisskey: "Misskeyへ"
|
||||||
|
additionalEmojiDictionary: "絵文字の追加辞書"
|
||||||
|
installed: "インストール済み"
|
||||||
|
branding: "ブランディング"
|
||||||
|
enableServerMachineStats: "サーバーのマシン情報を公開する"
|
||||||
|
enableIdenticonGeneration: "ユーザーごとのIdenticon生成を有効にする"
|
||||||
|
turnOffToImprovePerformance: "オフにするとパフォーマンスが向上します。"
|
||||||
|
|
||||||
_initialAccountSetting:
|
_initialAccountSetting:
|
||||||
accountCreated: "アカウントの作成が完了しました!"
|
accountCreated: "アカウントの作成が完了しました!"
|
||||||
|
letsStartAccountSetup: "アカウントの初期設定を行いましょう。"
|
||||||
letsFillYourProfile: "まずはあなたのプロフィールを設定しましょう。"
|
letsFillYourProfile: "まずはあなたのプロフィールを設定しましょう。"
|
||||||
profileSetting: "プロフィール設定"
|
profileSetting: "プロフィール設定"
|
||||||
|
privacySetting: "プライバシー設定"
|
||||||
theseSettingsCanEditLater: "これらの設定は後から変更できます。"
|
theseSettingsCanEditLater: "これらの設定は後から変更できます。"
|
||||||
youCanEditMoreSettingsInSettingsPageLater: "この他にも様々な設定を「設定」ページから行えます。ぜひ後で確認してみてください。"
|
youCanEditMoreSettingsInSettingsPageLater: "この他にも様々な設定を「設定」ページから行えます。ぜひ後で確認してみてください。"
|
||||||
followUsers: "タイムラインを構築するため、気になるユーザーをフォローしてみましょう。"
|
followUsers: "タイムラインを構築するため、気になるユーザーをフォローしてみましょう。"
|
||||||
@@ -1051,6 +1089,7 @@ _initialAccountSetting:
|
|||||||
haveFun: "{name}をお楽しみください!"
|
haveFun: "{name}をお楽しみください!"
|
||||||
ifYouNeedLearnMore: "{name}(Misskey)の使い方などを詳しく知るには{link}をご覧ください。"
|
ifYouNeedLearnMore: "{name}(Misskey)の使い方などを詳しく知るには{link}をご覧ください。"
|
||||||
skipAreYouSure: "初期設定をスキップしますか?"
|
skipAreYouSure: "初期設定をスキップしますか?"
|
||||||
|
laterAreYouSure: "初期設定をあとでやり直しますか?"
|
||||||
|
|
||||||
_serverRules:
|
_serverRules:
|
||||||
description: "新規登録前に表示する、サーバーの簡潔なルールを設定します。内容は利用規約の要約とすることを推奨します。"
|
description: "新規登録前に表示する、サーバーの簡潔なルールを設定します。内容は利用規約の要約とすることを推奨します。"
|
||||||
@@ -1324,8 +1363,8 @@ _role:
|
|||||||
conditional: "コンディショナル"
|
conditional: "コンディショナル"
|
||||||
condition: "条件"
|
condition: "条件"
|
||||||
isConditionalRole: "これはコンディショナルロールです。"
|
isConditionalRole: "これはコンディショナルロールです。"
|
||||||
isPublic: "ロールを公開"
|
isPublic: "公開ロール"
|
||||||
descriptionOfIsPublic: "ロールにアサインされたユーザーを誰でも見ることができます。また、ユーザーのプロフィールでこのロールが表示されます。"
|
descriptionOfIsPublic: "ユーザーのプロフィールでこのロールが表示されます。"
|
||||||
options: "オプション"
|
options: "オプション"
|
||||||
policies: "ポリシー"
|
policies: "ポリシー"
|
||||||
baseRole: "ベースロール"
|
baseRole: "ベースロール"
|
||||||
@@ -1334,8 +1373,8 @@ _role:
|
|||||||
iconUrl: "アイコン画像のURL"
|
iconUrl: "アイコン画像のURL"
|
||||||
asBadge: "バッジとして表示"
|
asBadge: "バッジとして表示"
|
||||||
descriptionOfAsBadge: "オンにすると、ユーザー名の横にロールのアイコンが表示されます。"
|
descriptionOfAsBadge: "オンにすると、ユーザー名の横にロールのアイコンが表示されます。"
|
||||||
isExplorable: "ロールタイムラインを公開"
|
isExplorable: "ユーザーを見つけやすくする"
|
||||||
descriptionOfIsExplorable: "オンにすると、ロールのタイムラインを公開します。ロールの公開がオフの場合、タイムラインの公開はされません。"
|
descriptionOfIsExplorable: "オンにすると、「みつける」でメンバー一覧が公開されるほか、ロールのタイムラインが利用可能になります。"
|
||||||
displayOrder: "表示順"
|
displayOrder: "表示順"
|
||||||
descriptionOfDisplayOrder: "数値が大きいほどUI上で先頭に表示されます。"
|
descriptionOfDisplayOrder: "数値が大きいほどUI上で先頭に表示されます。"
|
||||||
canEditMembersByModerator: "モデレーターのメンバー編集を許可"
|
canEditMembersByModerator: "モデレーターのメンバー編集を許可"
|
||||||
@@ -1384,7 +1423,7 @@ _sensitiveMediaDetection:
|
|||||||
description: "機械学習を使って自動でセンシティブなメディアを検出し、モデレーションに役立てることができます。サーバーの負荷が少し増えます。"
|
description: "機械学習を使って自動でセンシティブなメディアを検出し、モデレーションに役立てることができます。サーバーの負荷が少し増えます。"
|
||||||
sensitivity: "検出感度"
|
sensitivity: "検出感度"
|
||||||
sensitivityDescription: "感度を低くすると、誤検知(偽陽性)が減ります。感度を高くすると、検知漏れ(偽陰性)が減ります。"
|
sensitivityDescription: "感度を低くすると、誤検知(偽陽性)が減ります。感度を高くすると、検知漏れ(偽陰性)が減ります。"
|
||||||
setSensitiveFlagAutomatically: "NSFWフラグを設定する"
|
setSensitiveFlagAutomatically: "センシティブフラグを設定する"
|
||||||
setSensitiveFlagAutomaticallyDescription: "この設定をオフにしても内部的に判定結果は保持されます。"
|
setSensitiveFlagAutomaticallyDescription: "この設定をオフにしても内部的に判定結果は保持されます。"
|
||||||
analyzeVideos: "動画の解析を有効化"
|
analyzeVideos: "動画の解析を有効化"
|
||||||
analyzeVideosDescription: "静止画に加えて動画も解析するようにします。サーバーの負荷が少し増えます。"
|
analyzeVideosDescription: "静止画に加えて動画も解析するようにします。サーバーの負荷が少し増えます。"
|
||||||
@@ -1418,6 +1457,7 @@ _ad:
|
|||||||
back: "戻る"
|
back: "戻る"
|
||||||
reduceFrequencyOfThisAd: "この広告の表示頻度を下げる"
|
reduceFrequencyOfThisAd: "この広告の表示頻度を下げる"
|
||||||
hide: "表示しない"
|
hide: "表示しない"
|
||||||
|
timezoneinfo: "曜日はサーバーのタイムゾーンを元に指定されます。"
|
||||||
|
|
||||||
_forgotPassword:
|
_forgotPassword:
|
||||||
enterEmail: "アカウントに登録したメールアドレスを入力してください。そのアドレス宛てに、パスワードリセット用のリンクが送信されます。"
|
enterEmail: "アカウントに登録したメールアドレスを入力してください。そのアドレス宛てに、パスワードリセット用のリンクが送信されます。"
|
||||||
@@ -1477,9 +1517,9 @@ _aboutMisskey:
|
|||||||
morePatrons: "他にも多くの方が支援してくれています。ありがとうございます🥰"
|
morePatrons: "他にも多くの方が支援してくれています。ありがとうございます🥰"
|
||||||
patrons: "支援者"
|
patrons: "支援者"
|
||||||
|
|
||||||
_nsfw:
|
_displayOfSensitiveMedia:
|
||||||
respect: "閲覧注意のメディアは隠す"
|
respect: "センシティブ設定されたメディアを隠す"
|
||||||
ignore: "閲覧注意のメディアを隠さない"
|
ignore: "センシティブ設定されたメディアを隠さない"
|
||||||
force: "常にメディアを隠す"
|
force: "常にメディアを隠す"
|
||||||
|
|
||||||
_instanceTicker:
|
_instanceTicker:
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
---
|
---
|
||||||
_lang_: "日本語 (関西弁)"
|
_lang_: "日本語 (関西弁)"
|
||||||
headlineMisskey: "ノートでつながるネットワーク"
|
headlineMisskey: "ノートでつながるネットワーク"
|
||||||
introMisskey: "ようお越し!Misskeyは、オープンソースの分散型マイクロブログサービスやねん。\n「ノート」を作って、いま起こっとることを共有したり、あんたについて皆に発信しよう📡\n「ツッコミ」機能で、皆のノートに素早く反応を追加したりもできるで✌\nほな新しい世界を探検しよか🚀"
|
introMisskey: "ようお越し!Misskeyは、オープンソースの分散型マイクロブログサービスやねん。\n「ノート」を作って、いま起こっとることを共有したり、あんたについて皆に発信しよう📡\n「ツッコミ」機能で、皆のノートに素早く反応を追加したりもできるで✌\nほな、新しい世界を探検しよか🚀"
|
||||||
poweredByMisskeyDescription: "{name}は、オープンソースのプラットフォーム<b>Misskey</b>のサーバーのひとつなんやで。"
|
poweredByMisskeyDescription: "{name}は、オープンソースのプラットフォーム<b>Misskey</b>のサーバーのひとつなんやで。"
|
||||||
monthAndDay: "{month}月 {day}日"
|
monthAndDay: "{month}月 {day}日"
|
||||||
search: "探す"
|
search: "探す"
|
||||||
notifications: "通知"
|
notifications: "通知"
|
||||||
username: "ユーザー名"
|
username: "ユーザー名"
|
||||||
password: "パスワード"
|
password: "パスワード"
|
||||||
forgotPassword: "パスワード忘れてもうた"
|
forgotPassword: "パスワード忘れたん?"
|
||||||
fetchingAsApObject: "今ちと連合に照会しとるで"
|
fetchingAsApObject: "今ちと連合に照会しとるで"
|
||||||
ok: "ええで"
|
ok: "ええで"
|
||||||
gotIt: "ほい"
|
gotIt: "ほい"
|
||||||
@@ -26,7 +26,7 @@ otherSettings: "ほかの設定"
|
|||||||
openInWindow: "ウィンドウで開くで"
|
openInWindow: "ウィンドウで開くで"
|
||||||
profile: "プロフィール"
|
profile: "プロフィール"
|
||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
noAccountDescription: "自己紹介はあらへん"
|
noAccountDescription: "自己紹介食ってもた"
|
||||||
login: "ログイン"
|
login: "ログイン"
|
||||||
loggingIn: "ログインしよるで"
|
loggingIn: "ログインしよるで"
|
||||||
logout: "ログアウト"
|
logout: "ログアウト"
|
||||||
@@ -38,20 +38,22 @@ addUser: "ユーザーを追加や"
|
|||||||
favorite: "お気に入り"
|
favorite: "お気に入り"
|
||||||
favorites: "お気に入り"
|
favorites: "お気に入り"
|
||||||
unfavorite: "やっぱ気に入らん"
|
unfavorite: "やっぱ気に入らん"
|
||||||
favorited: "お気に入りに登録したで"
|
favorited: "お気に入りに入れたで"
|
||||||
alreadyFavorited: "もうお気に入りに入れとるがな。"
|
alreadyFavorited: "もうお気に入りに入れとるがな。"
|
||||||
cantFavorite: "アカン、お気に入り登録できへんかったで。"
|
cantFavorite: "アカン、お気に入りに入れれんかったわ。"
|
||||||
pin: "ピン留めしとく"
|
pin: "ピン留めしとく"
|
||||||
unpin: "やっぱピン留めせん"
|
unpin: "やっぱピン留めせん"
|
||||||
copyContent: "内容をコピー"
|
copyContent: "内容をコピー"
|
||||||
copyLink: "リンクをコピー"
|
copyLink: "リンクをコピー"
|
||||||
delete: "ほかす"
|
delete: "ほかす"
|
||||||
deleteAndEdit: "ほかして直す"
|
deleteAndEdit: "ほかして直す"
|
||||||
deleteAndEditConfirm: "このノートをほかしてもっかい直す?このノートへのリアクション、Renote、返信も全部消えるんやけどそれでもええん?"
|
deleteAndEditConfirm: "このノートをほかしてもっかい直す?このノートへのツッコミ、Renote、返信も全部消えるんやけどそれでもええん?"
|
||||||
addToList: "リストに入れたる"
|
addToList: "リストに入れたる"
|
||||||
sendMessage: "メッセージを送る"
|
sendMessage: "メッセージを送る"
|
||||||
copyRSS: "RSSをコピー"
|
copyRSS: "RSSをコピー"
|
||||||
copyUsername: "ユーザー名をコピー"
|
copyUsername: "ユーザー名をコピー"
|
||||||
|
copyUserId: "ユーザーIDをコピー"
|
||||||
|
copyNoteId: "ノートIDをコピー"
|
||||||
searchUser: "ユーザーを検索"
|
searchUser: "ユーザーを検索"
|
||||||
reply: "返事"
|
reply: "返事"
|
||||||
loadMore: "まだまだあるで!"
|
loadMore: "まだまだあるで!"
|
||||||
@@ -134,8 +136,10 @@ unblockConfirm: "ブロックやめたるってほんまか?"
|
|||||||
suspendConfirm: "凍結してしもうてええか?"
|
suspendConfirm: "凍結してしもうてええか?"
|
||||||
unsuspendConfirm: "解凍するけどええか?"
|
unsuspendConfirm: "解凍するけどええか?"
|
||||||
selectList: "リストを選ぶ"
|
selectList: "リストを選ぶ"
|
||||||
|
editList: "リスト直すで"
|
||||||
selectChannel: "チャンネルを選ぶ"
|
selectChannel: "チャンネルを選ぶ"
|
||||||
selectAntenna: "アンテナを選ぶ"
|
selectAntenna: "アンテナを選ぶ"
|
||||||
|
editAntenna: "アンテナを編集"
|
||||||
selectWidget: "ウィジェットを選ぶ"
|
selectWidget: "ウィジェットを選ぶ"
|
||||||
editWidgets: "ウィジェットをいじる"
|
editWidgets: "ウィジェットをいじる"
|
||||||
editWidgetsExit: "編集終ったで"
|
editWidgetsExit: "編集終ったで"
|
||||||
@@ -309,7 +313,6 @@ copyUrl: "URLをコピー"
|
|||||||
rename: "名前を変えるで"
|
rename: "名前を変えるで"
|
||||||
avatar: "アイコン"
|
avatar: "アイコン"
|
||||||
banner: "バナー"
|
banner: "バナー"
|
||||||
nsfw: "見るんは気いつけてな"
|
|
||||||
whenServerDisconnected: "サーバーとの接続が失くなってしもうたとき"
|
whenServerDisconnected: "サーバーとの接続が失くなってしもうたとき"
|
||||||
disconnectedFromServer: "サーバーが機嫌悪いねん"
|
disconnectedFromServer: "サーバーが機嫌悪いねん"
|
||||||
reload: "リロード"
|
reload: "リロード"
|
||||||
@@ -462,7 +465,7 @@ uiLanguage: "UIの表示言語"
|
|||||||
aboutX: "{x}について"
|
aboutX: "{x}について"
|
||||||
emojiStyle: "絵文字のスタイル"
|
emojiStyle: "絵文字のスタイル"
|
||||||
native: "ネイティブ"
|
native: "ネイティブ"
|
||||||
disableDrawer: "メニューをドロワーで表示せぇへん"
|
disableDrawer: "メニューをドロワーで表示せえへん"
|
||||||
showNoteActionsOnlyHover: "ノートの操作部をホバー時のみ表示するで"
|
showNoteActionsOnlyHover: "ノートの操作部をホバー時のみ表示するで"
|
||||||
noHistory: "履歴はないわ。"
|
noHistory: "履歴はないわ。"
|
||||||
signinHistory: "ログイン履歴"
|
signinHistory: "ログイン履歴"
|
||||||
@@ -560,6 +563,7 @@ accountDeletedDescription: "このアカウントは削除されとるで。"
|
|||||||
menu: "メニュー"
|
menu: "メニュー"
|
||||||
divider: "分割線"
|
divider: "分割線"
|
||||||
addItem: "項目を追加"
|
addItem: "項目を追加"
|
||||||
|
rearrange: "並び替え"
|
||||||
relays: "リレー"
|
relays: "リレー"
|
||||||
addRelay: "リレーの追加"
|
addRelay: "リレーの追加"
|
||||||
inboxUrl: "inboxのURL"
|
inboxUrl: "inboxのURL"
|
||||||
@@ -688,7 +692,7 @@ no: "あかん"
|
|||||||
driveFilesCount: "ドライブのファイル数"
|
driveFilesCount: "ドライブのファイル数"
|
||||||
driveUsage: "ドライブ使用量やで"
|
driveUsage: "ドライブ使用量やで"
|
||||||
noCrawle: "クローラーによるインデックスを拒否するで"
|
noCrawle: "クローラーによるインデックスを拒否するで"
|
||||||
noCrawleDescription: "検索エンジンにあんたのユーザーページ、ノート、Pagesとかのコンテンツを登録(インデックス)せんように頼むで。邪魔すんねんやったら帰って〜。"
|
noCrawleDescription: "検索エンジンにあんたのユーザーページ、ノート、Pagesとかのコンテンツを登録(インデックス)せぇへんように頼むで。"
|
||||||
lockedAccountInfo: "フォローを承認制にしとっても、ノートの公開範囲を「フォロワー」にせぇへん限り、誰でもあんたのノートを見れるで。"
|
lockedAccountInfo: "フォローを承認制にしとっても、ノートの公開範囲を「フォロワー」にせぇへん限り、誰でもあんたのノートを見れるで。"
|
||||||
alwaysMarkSensitive: "デフォルトでメディアを閲覧注意にするで"
|
alwaysMarkSensitive: "デフォルトでメディアを閲覧注意にするで"
|
||||||
loadRawImages: "添付画像のサムネイルをオリジナル画質にするで"
|
loadRawImages: "添付画像のサムネイルをオリジナル画質にするで"
|
||||||
@@ -789,6 +793,7 @@ noMaintainerInformationWarning: "管理者情報が設定されてへんで"
|
|||||||
noBotProtectionWarning: "Botプロテクションが設定されてへんで。"
|
noBotProtectionWarning: "Botプロテクションが設定されてへんで。"
|
||||||
configure: "設定する"
|
configure: "設定する"
|
||||||
postToGallery: "ギャラリーへ投稿"
|
postToGallery: "ギャラリーへ投稿"
|
||||||
|
postToHashtag: "このハッシュタグで投稿"
|
||||||
gallery: "ギャラリー"
|
gallery: "ギャラリー"
|
||||||
recentPosts: "最近の投稿"
|
recentPosts: "最近の投稿"
|
||||||
popularPosts: "人気の投稿"
|
popularPosts: "人気の投稿"
|
||||||
@@ -822,6 +827,7 @@ translatedFrom: "{x}から翻訳するで"
|
|||||||
accountDeletionInProgress: "アカウント削除しとるで待っとってなー"
|
accountDeletionInProgress: "アカウント削除しとるで待っとってなー"
|
||||||
usernameInfo: "サーバー上であんたのアカウントをあんたやと分かるようにするための名前やで。アルファベット(a~z, A~Z)、数字(0~9)、それとアンダーバー(_)が使って考えてな。この名前は後から変更することはできへんからちゃんと考えるんやで。"
|
usernameInfo: "サーバー上であんたのアカウントをあんたやと分かるようにするための名前やで。アルファベット(a~z, A~Z)、数字(0~9)、それとアンダーバー(_)が使って考えてな。この名前は後から変更することはできへんからちゃんと考えるんやで。"
|
||||||
aiChanMode: "藍モードやで"
|
aiChanMode: "藍モードやで"
|
||||||
|
devMode: "開発者モード"
|
||||||
keepCw: "CWを維持するで"
|
keepCw: "CWを維持するで"
|
||||||
pubSub: "Pub/Subのアカウント"
|
pubSub: "Pub/Subのアカウント"
|
||||||
lastCommunication: "直近の通信"
|
lastCommunication: "直近の通信"
|
||||||
@@ -831,6 +837,8 @@ breakFollow: "フォロワーを解除するで"
|
|||||||
breakFollowConfirm: "フォロワー解除してもええか?"
|
breakFollowConfirm: "フォロワー解除してもええか?"
|
||||||
itsOn: "オンになっとるよ"
|
itsOn: "オンになっとるよ"
|
||||||
itsOff: "オフになってるで"
|
itsOff: "オフになってるで"
|
||||||
|
on: "オン"
|
||||||
|
off: "オフ"
|
||||||
emailRequiredForSignup: "アカウント登録にメールアドレスを必須にするで"
|
emailRequiredForSignup: "アカウント登録にメールアドレスを必須にするで"
|
||||||
unread: "未読"
|
unread: "未読"
|
||||||
filter: "フィルタ"
|
filter: "フィルタ"
|
||||||
@@ -985,10 +993,13 @@ cannotBeChangedLater: "後からは変えられへんで。"
|
|||||||
reactionAcceptance: "ツッコミの受け入れ"
|
reactionAcceptance: "ツッコミの受け入れ"
|
||||||
likeOnly: "いいねだけ"
|
likeOnly: "いいねだけ"
|
||||||
likeOnlyForRemote: "リモートからはいいねだけな"
|
likeOnlyForRemote: "リモートからはいいねだけな"
|
||||||
|
nonSensitiveOnly: "センシティブじゃないやつだけ"
|
||||||
|
nonSensitiveOnlyForLocalLikeOnlyForRemote: "センシティブじゃないやつだけ (リモートはいいねだけ)"
|
||||||
rolesAssignedToMe: "自分に割り当てられたロール"
|
rolesAssignedToMe: "自分に割り当てられたロール"
|
||||||
resetPasswordConfirm: "パスワード作り直すんでええな?"
|
resetPasswordConfirm: "パスワード作り直すんでええな?"
|
||||||
sensitiveWords: "けったいな単語"
|
sensitiveWords: "けったいな単語"
|
||||||
sensitiveWordsDescription: "設定した単語が入っとるノートの公開範囲をホームにしたるわ。改行で区切ったら複数設定できるで。"
|
sensitiveWordsDescription: "設定した単語が入っとるノートの公開範囲をホームにしたるわ。改行で区切ったら複数設定できるで。"
|
||||||
|
sensitiveWordsDescription2: "スペースで区切るとAND指定、キーワードをスラッシュで囲んだら正規表現や。"
|
||||||
notesSearchNotAvailable: "ノート検索は使われへんで。"
|
notesSearchNotAvailable: "ノート検索は使われへんで。"
|
||||||
license: "ライセンス"
|
license: "ライセンス"
|
||||||
unfavoriteConfirm: "ほんまに気に入らんの?"
|
unfavoriteConfirm: "ほんまに気に入らんの?"
|
||||||
@@ -1028,21 +1039,64 @@ pleaseConfirmBelowBeforeSignup: "このサーバーに登録する前に、下
|
|||||||
pleaseAgreeAllToContinue: "続けるんやったら、全ての「せやな」にチェック入れてる必要があるで。"
|
pleaseAgreeAllToContinue: "続けるんやったら、全ての「せやな」にチェック入れてる必要があるで。"
|
||||||
continue: "続けるで"
|
continue: "続けるで"
|
||||||
preservedUsernames: "予約ユーザー名"
|
preservedUsernames: "予約ユーザー名"
|
||||||
|
preservedUsernamesDescription: "予約しとくユーザー名を行ごとに挙げるで。ここで指定されたユーザー名はアカウント作るときに使えへんくなるけど、管理者は例外や。あと、もうあるアカウントも例外やな。"
|
||||||
|
createNoteFromTheFile: "このファイル使うてノート作るで"
|
||||||
|
archive: "アーカイブ"
|
||||||
|
channelArchiveConfirmTitle: "{name}をアーカイブしてええか?"
|
||||||
|
channelArchiveConfirmDescription: "アーカイブしたら、チャンネル一覧とか検索結果からなくなるし、新しく書き込みもできへんなるで。"
|
||||||
|
thisChannelArchived: "このチャンネル、アーカイブされとるで。"
|
||||||
|
displayOfNote: "ノートの表示"
|
||||||
|
initialAccountSetting: "初期設定"
|
||||||
youFollowing: "フォロー中やで"
|
youFollowing: "フォロー中やで"
|
||||||
|
preventAiLearning: "生成AIの学習に使わんといて"
|
||||||
|
preventAiLearningDescription: "他の文章生成AIとか画像生成AIに、投稿したノートとか画像なんかを勝手に使わんように頼むで。具体的にはnoaiフラグをHTMLレスポンスに含めるんやけど、これ聞いてくれるんはAIの気分次第やから、使われる可能性もちょっとはあるな。"
|
||||||
|
options: "オプション"
|
||||||
|
specifyUser: "ユーザー指定"
|
||||||
|
failedToPreviewUrl: "プレビューできへん"
|
||||||
|
update: "更新"
|
||||||
|
rolesThatCanBeUsedThisEmojiAsReaction: "ツッコミとして使えるロール"
|
||||||
|
rolesThatCanBeUsedThisEmojiAsReactionEmptyDescription: "ロールが一個も指定されてへんかったら、誰でもツッコミとして使えるで。"
|
||||||
|
rolesThatCanBeUsedThisEmojiAsReactionPublicRoleWarn: "ロールは公開ロールじゃないとアカンで。"
|
||||||
|
cancelReactionConfirm: "ツッコむんをやっぱやめるか?"
|
||||||
|
changeReactionConfirm: "ツッコミを別のに変えるか?"
|
||||||
|
later: "あとで"
|
||||||
|
goToMisskey: "Misskeyへ"
|
||||||
|
additionalEmojiDictionary: "絵文字の追加辞書"
|
||||||
|
installed: "インストール済み"
|
||||||
|
branding: "あ"
|
||||||
|
enableServerMachineStats: "サーバーのマシン情報見せびらかすで"
|
||||||
|
enableIdenticonGeneration: "ユーザーごとのIdenticon生成を有効にする"
|
||||||
|
_initialAccountSetting:
|
||||||
|
accountCreated: "アカウント作り終わったで。"
|
||||||
|
letsStartAccountSetup: "アカウントの初期設定をしよか。"
|
||||||
|
letsFillYourProfile: "最初はあんたのプロフィールを設定しよか。"
|
||||||
|
profileSetting: "プロフィール設定"
|
||||||
|
privacySetting: "プライバシー設定"
|
||||||
|
theseSettingsCanEditLater: "この設定はあとから変えれるで。"
|
||||||
|
youCanEditMoreSettingsInSettingsPageLater: "これ以外にもいろんな設定を「設定」ページからできるで。後で確認してみてな。"
|
||||||
|
followUsers: "タイムラインを構築するために、気になるユーザーをフォローしてみ。"
|
||||||
|
pushNotificationDescription: "プッシュ通知を有効にすると{name}の通知をあんたのデバイスで受け取れるで。"
|
||||||
|
initialAccountSettingCompleted: "初期設定が終わったで。"
|
||||||
|
haveFun: "{name}、楽しんでな~"
|
||||||
|
ifYouNeedLearnMore: "{name}(Misskey)の使い方とかをよー知りたいんやったら{link}をみてな。"
|
||||||
|
skipAreYouSure: "初期設定飛ばすか?"
|
||||||
|
laterAreYouSure: "初期設定あとでやり直すん?"
|
||||||
_serverRules:
|
_serverRules:
|
||||||
description: "新規登録前に見せる、サーバーの簡潔なルールを設定すんで。内容は使うための決め事の要約とすることを推奨するわ。"
|
description: "新規登録前に見せる、サーバーの簡潔なルールを設定すんで。内容は使うための決め事の要約とすることを推奨するわ。"
|
||||||
_accountMigration:
|
_accountMigration:
|
||||||
moveFrom: "別のアカウントからこのアカウントに引っ越す"
|
moveFrom: "別のアカウントからこのアカウントに引っ越す"
|
||||||
|
moveFromSub: "別のアカウントへエイリアスを作る"
|
||||||
moveFromLabel: "引っ越し元のアカウント:"
|
moveFromLabel: "引っ越し元のアカウント:"
|
||||||
moveFromDescription: "別のアカウントからこのアカウントにフォロワーを引き継いで引っ越したかったら、ここでエイリアスを作っとく必要があるで。必ずお引っ越しを実行する前に作っとかなあかんで!引っ越し元のアカウントをこんな風に入力してくれへんか?:@person@instance.com"
|
moveFromDescription: "別のアカウントからこのアカウントにフォロワーを引き継いで引っ越したかったら、ここでエイリアスを作っとく必要があるで。必ずお引っ越しを実行する前に作っとかなあかんで!引っ越し元のアカウントをこんな風に入力してくれへんか?:@person@instance.com"
|
||||||
moveTo: "このアカウントをさらのアカウントに引っ越すで"
|
moveTo: "このアカウントをさらのアカウントに引っ越すで"
|
||||||
moveToLabel: "引っ越し先のアカウント:"
|
moveToLabel: "引っ越し先のアカウント:"
|
||||||
moveCannotBeUndone: "アカウントを移行すると、取り消すことはできへんくなります。"
|
moveCannotBeUndone: "アカウントを移行すると、取り消すことはできへんくなります。"
|
||||||
moveAccountDescription: "この操作は戻されへんで。まず引っ越し先のアカウントでこのアカウントへのエイリアスが作れたか確認してきなはれや。エイリアスができてたら、引っ越し先のアカウントをこんな風に入力してくれへんか?:@person@instance.com"
|
moveAccountDescription: "おニューのアカウントに移行すんで。\n ・フォロワーがおニューの方を勝手にフォローすんで。\n ・このアカウントからのフォローはまるまる全部解除されんで。\n ・このアカウントでノート作れへんようになるで。\n\nフォロワーの移行は勝手にこっちでやっとくけど、フォローの移行は自分でしてや。移行前にこのアカウントでフォローエクスポートして、移行したあとすぐにおニューのところでインポートしてくれな。\nリストとかミュート、あとブロックもおんなじや。自分で移行してな。\n\n(この説明はこのサーバー、つまりMisskey v13.12.0から後の仕様や。Mastodonとか他のActivityPubソフトやとちょっと挙動が違うこともあんで。)"
|
||||||
moveAccountHowTo: "アカウントの引っ越しには、まず引っ越し先のアカウントで自分のアカウントに対しエイリアスを作成しなはれや。\nエイリアス作成した後、引っ越し先のアカウントを次のように入力してくれへんか?:@username@server.example.com"
|
moveAccountHowTo: "アカウントの引っ越しには、まず引っ越し先のアカウントで自分のアカウントに対しエイリアスを作成しなはれや。\nエイリアス作成した後、引っ越し先のアカウントを次のように入力してくれへんか?:@username@server.example.com"
|
||||||
startMigration: "引っ越しする"
|
startMigration: "引っ越しする"
|
||||||
migrationConfirm: "ほんまにこのアカウントを {account} に引っ越すんか?一回引っ越してもうたら取り消されへんし、二度とこのアカウントを元に戻されへんくなるで。\nそれと、引っ越し先のアカウントでエイリアスが作れたかちゃ~んと確認しーや?"
|
migrationConfirm: "ほんまにこのアカウントを {account} に引っ越すんか?一回引っ越してもうたら取り消されへんし、二度とこのアカウントを元に戻されへんくなるで。\nそれと、引っ越し先のアカウントでエイリアスが作れたかちゃ~んと確認しーや?"
|
||||||
movedAndCannotBeUndone: "\nアカウントはもう引っ越されてます。\n引っ越しを取り消すことはできまへん。"
|
movedAndCannotBeUndone: "\nアカウントはもう引っ越されてます。\n引っ越しを取り消すことはできまへん。"
|
||||||
|
postMigrationNote: "このアカウントからのフォロー解除は移行操作から丸一日経ったら実行されんで。\nこのアカウントのフォロー・フォロワー数はどっちも0や。フォローの解除はされへんから、あんたのフォロワーはこのアカウントのフォロワー向けの投稿をこの後も見れるで。"
|
||||||
movedTo: "引っ越し先のアカウント:"
|
movedTo: "引っ越し先のアカウント:"
|
||||||
_achievements:
|
_achievements:
|
||||||
earnedAt: "貰った日ぃ"
|
earnedAt: "貰った日ぃ"
|
||||||
@@ -1324,6 +1378,7 @@ _role:
|
|||||||
canInvite: "サーバー招待コードの発行"
|
canInvite: "サーバー招待コードの発行"
|
||||||
canManageCustomEmojis: "カスタム絵文字の管理"
|
canManageCustomEmojis: "カスタム絵文字の管理"
|
||||||
driveCapacity: "ドライブ容量"
|
driveCapacity: "ドライブ容量"
|
||||||
|
alwaysMarkNsfw: "勝手にファイルにNSFWをくっつける"
|
||||||
pinMax: "ノートのピン留めの最大数"
|
pinMax: "ノートのピン留めの最大数"
|
||||||
antennaMax: "アンテナの作成可能数"
|
antennaMax: "アンテナの作成可能数"
|
||||||
wordMuteMax: "ワードミュートの最大文字数"
|
wordMuteMax: "ワードミュートの最大文字数"
|
||||||
@@ -1434,10 +1489,6 @@ _aboutMisskey:
|
|||||||
donate: "Misskeyに寄付"
|
donate: "Misskeyに寄付"
|
||||||
morePatrons: "他にもぎょうさんの人からサポートしてもろてんねん。ほんまおおきに🥰"
|
morePatrons: "他にもぎょうさんの人からサポートしてもろてんねん。ほんまおおきに🥰"
|
||||||
patrons: "支援者"
|
patrons: "支援者"
|
||||||
_nsfw:
|
|
||||||
respect: "閲覧注意のメディアは隠すで"
|
|
||||||
ignore: "閲覧注意のメディアは隠さへんで"
|
|
||||||
force: "常にメディアを隠すで"
|
|
||||||
_instanceTicker:
|
_instanceTicker:
|
||||||
none: "表示せん"
|
none: "表示せん"
|
||||||
remote: "リモートユーザーに表示"
|
remote: "リモートユーザーに表示"
|
||||||
@@ -1575,6 +1626,16 @@ _time:
|
|||||||
minute: "分"
|
minute: "分"
|
||||||
hour: "時間"
|
hour: "時間"
|
||||||
day: "日"
|
day: "日"
|
||||||
|
_timelineTutorial:
|
||||||
|
title: "Misskeyってなんや?"
|
||||||
|
step1_1: "これは「タイムライン」や。{name}に投稿された「ノート」が順番に表示されるで。"
|
||||||
|
step1_2: "タイムラインには何個か種類があってな、例えば「ホームタイムライン」だったらあんたのフォローしてる人のノート、「ローカルタイムライン」には{name}全部のノートが流れてくるで。"
|
||||||
|
step2_1: "試しに、何かノートを投稿してみ。画面の鉛筆マークのボタンでフォームが開くで。"
|
||||||
|
step2_2: "最初のノートは、自己紹介とか「{name}始めてみたんや」とかがええと思うで。"
|
||||||
|
step3_1: "投稿できた?"
|
||||||
|
step3_2: "あんたのノートがタイムラインに出てきたら成功や。"
|
||||||
|
step4_1: "ノートには、「ツッコミ」を付けれるで。"
|
||||||
|
step4_2: "ツッコむんやったら、ノートの「+」マークを押して、好きな絵文字を選ぶんやで。"
|
||||||
_2fa:
|
_2fa:
|
||||||
alreadyRegistered: "もう設定終わっとるわ。"
|
alreadyRegistered: "もう設定終わっとるわ。"
|
||||||
registerTOTP: "認証アプリの設定はじめる"
|
registerTOTP: "認証アプリの設定はじめる"
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
_lang_: "한국어"
|
_lang_: "한국어"
|
||||||
headlineMisskey: "노트로 연결되는 네트워크"
|
headlineMisskey: "노트로 연결되는 네트워크"
|
||||||
introMisskey: "환영합니다! Misskey는 오픈 소스 분산형 마이크로 블로그 서비스입니다.\n'노트'를 작성해서 지금 일어나고 있는 일을 공유하거나, 당신만의 이야기를 모두에게 발신하세요📡\n'리액션' 기능으로 친구의 노트에 총알같이 반응을 추가할 수도 있습니다👍\n새로운 세계를 탐험해 보세요🚀"
|
introMisskey: "환영합니다! Misskey는 오픈 소스 분산형 마이크로 블로그 서비스입니다.\n'노트'를 작성해서 지금 일어나고 있는 일을 공유하거나, 당신만의 이야기를 모두에게 발신하세요📡\n'리액션' 기능으로 친구의 노트에 총알같이 반응을 추가할 수도 있습니다👍\n새로운 세계를 탐험해 보세요🚀"
|
||||||
poweredByMisskeyDescription: "{name}은(는) 오픈소스 플랫폼<b>Misskey</b>를 사용한 서버 중 하나입니다."
|
poweredByMisskeyDescription: "{name}은(는) 오픈소스 플랫폼 <b>Misskey</b>를 사용한 서버 가운데 하나입니다."
|
||||||
monthAndDay: "{month}월 {day}일"
|
monthAndDay: "{month}월 {day}일"
|
||||||
search: "검색"
|
search: "검색"
|
||||||
notifications: "알림"
|
notifications: "알림"
|
||||||
@@ -52,6 +52,8 @@ addToList: "리스트에 추가"
|
|||||||
sendMessage: "메시지 보내기"
|
sendMessage: "메시지 보내기"
|
||||||
copyRSS: "RSS 복사"
|
copyRSS: "RSS 복사"
|
||||||
copyUsername: "유저명 복사"
|
copyUsername: "유저명 복사"
|
||||||
|
copyUserId: "유저 ID 복사"
|
||||||
|
copyNoteId: "노트 ID 복사"
|
||||||
searchUser: "사용자 검색"
|
searchUser: "사용자 검색"
|
||||||
reply: "답글"
|
reply: "답글"
|
||||||
loadMore: "더 보기"
|
loadMore: "더 보기"
|
||||||
@@ -134,8 +136,10 @@ unblockConfirm: "이 계정의 차단을 해제하시겠습니까?"
|
|||||||
suspendConfirm: "이 계정을 정지하시겠습니까?"
|
suspendConfirm: "이 계정을 정지하시겠습니까?"
|
||||||
unsuspendConfirm: "이 계정의 정지를 해제하시겠습니까?"
|
unsuspendConfirm: "이 계정의 정지를 해제하시겠습니까?"
|
||||||
selectList: "리스트 선택"
|
selectList: "리스트 선택"
|
||||||
|
editList: "리스트 편집"
|
||||||
selectChannel: "채널 선택"
|
selectChannel: "채널 선택"
|
||||||
selectAntenna: "안테나 선택"
|
selectAntenna: "안테나 선택"
|
||||||
|
editAntenna: "안테나 편집"
|
||||||
selectWidget: "위젯 선택"
|
selectWidget: "위젯 선택"
|
||||||
editWidgets: "위젯 편집"
|
editWidgets: "위젯 편집"
|
||||||
editWidgetsExit: "편집 종료"
|
editWidgetsExit: "편집 종료"
|
||||||
@@ -309,7 +313,6 @@ copyUrl: "URL 복사"
|
|||||||
rename: "이름 변경"
|
rename: "이름 변경"
|
||||||
avatar: "아바타"
|
avatar: "아바타"
|
||||||
banner: "배너"
|
banner: "배너"
|
||||||
nsfw: "열람주의"
|
|
||||||
whenServerDisconnected: "서버와의 접속이 끊겼을 때"
|
whenServerDisconnected: "서버와의 접속이 끊겼을 때"
|
||||||
disconnectedFromServer: "서버와의 연결이 끊어졌습니다"
|
disconnectedFromServer: "서버와의 연결이 끊어졌습니다"
|
||||||
reload: "새로고침"
|
reload: "새로고침"
|
||||||
@@ -505,7 +508,7 @@ objectStoragePrefixDesc: "이 Prefix 의 디렉토리 아래에 파일이 저장
|
|||||||
objectStorageEndpoint: "Endpoint"
|
objectStorageEndpoint: "Endpoint"
|
||||||
objectStorageEndpointDesc: "AWS S3의 경우 공란, 다른 서비스의 경우 각 서비스의 가이드에 맞게 endpoint를 설정해주세요. '<host>' 혹은 '<host>:<port>' 와 같이 지정합니다."
|
objectStorageEndpointDesc: "AWS S3의 경우 공란, 다른 서비스의 경우 각 서비스의 가이드에 맞게 endpoint를 설정해주세요. '<host>' 혹은 '<host>:<port>' 와 같이 지정합니다."
|
||||||
objectStorageRegion: "Region"
|
objectStorageRegion: "Region"
|
||||||
objectStorageRegionDesc: "'xx-east-1'와 같이 region을 지정해주세요. 사용하는 서비스에 region 개념이 없는 경우, 비워 두거나 'us-east-1'으로 설정해 주세요."
|
objectStorageRegionDesc: "'xx-east-1'와 같이 region을 지정해 주세요. 사용하는 서비스에 region 개념이 없는 경우 'us-east-1'으로 설정해 주세요. AWS 설정 파일 또는 환경 변수를 참조할 경우에는 비워주세요."
|
||||||
objectStorageUseSSL: "SSL 사용"
|
objectStorageUseSSL: "SSL 사용"
|
||||||
objectStorageUseSSLDesc: "API 호출시 HTTPS 를 사용하지 않는 경우 OFF 로 설정해 주세요"
|
objectStorageUseSSLDesc: "API 호출시 HTTPS 를 사용하지 않는 경우 OFF 로 설정해 주세요"
|
||||||
objectStorageUseProxy: "연결에 프록시를 사용"
|
objectStorageUseProxy: "연결에 프록시를 사용"
|
||||||
@@ -790,6 +793,7 @@ noMaintainerInformationWarning: "관리자 정보가 설정되어 있지 않습
|
|||||||
noBotProtectionWarning: "Bot 방어가 설정되어 있지 않습니다."
|
noBotProtectionWarning: "Bot 방어가 설정되어 있지 않습니다."
|
||||||
configure: "설정하기"
|
configure: "설정하기"
|
||||||
postToGallery: "갤러리에 업로드"
|
postToGallery: "갤러리에 업로드"
|
||||||
|
postToHashtag: "이 해시태그에 게시"
|
||||||
gallery: "갤러리"
|
gallery: "갤러리"
|
||||||
recentPosts: "최근 포스트"
|
recentPosts: "최근 포스트"
|
||||||
popularPosts: "인기 포스트"
|
popularPosts: "인기 포스트"
|
||||||
@@ -823,6 +827,7 @@ translatedFrom: "{x}에서 번역"
|
|||||||
accountDeletionInProgress: "계정 삭제 작업을 진행하고 있습니다"
|
accountDeletionInProgress: "계정 삭제 작업을 진행하고 있습니다"
|
||||||
usernameInfo: "서버상에서 계정을 식별하기 위한 이름. 알파벳(a~z, A~Z), 숫자(0~9) 및 언더바(_)를 사용할 수 있습니다. 사용자명은 나중에 변경할 수 없습니다."
|
usernameInfo: "서버상에서 계정을 식별하기 위한 이름. 알파벳(a~z, A~Z), 숫자(0~9) 및 언더바(_)를 사용할 수 있습니다. 사용자명은 나중에 변경할 수 없습니다."
|
||||||
aiChanMode: "아이 모드"
|
aiChanMode: "아이 모드"
|
||||||
|
devMode: "개발자 모드"
|
||||||
keepCw: "CW 유지하기"
|
keepCw: "CW 유지하기"
|
||||||
pubSub: "Pub/Sub 계정"
|
pubSub: "Pub/Sub 계정"
|
||||||
lastCommunication: "마지막 통신"
|
lastCommunication: "마지막 통신"
|
||||||
@@ -830,8 +835,10 @@ resolved: "해결됨"
|
|||||||
unresolved: "해결되지 않음"
|
unresolved: "해결되지 않음"
|
||||||
breakFollow: "팔로워 해제"
|
breakFollow: "팔로워 해제"
|
||||||
breakFollowConfirm: "팔로우를 해제하시겠습니까?"
|
breakFollowConfirm: "팔로우를 해제하시겠습니까?"
|
||||||
itsOn: "켜짐"
|
itsOn: "켜져 있습니다"
|
||||||
itsOff: "꺼짐"
|
itsOff: "꺼져 있습니다"
|
||||||
|
on: "켜짐"
|
||||||
|
off: "꺼짐"
|
||||||
emailRequiredForSignup: "가입할 때 이메일 주소 입력을 필수로 하기"
|
emailRequiredForSignup: "가입할 때 이메일 주소 입력을 필수로 하기"
|
||||||
unread: "읽지 않음"
|
unread: "읽지 않음"
|
||||||
filter: "필터"
|
filter: "필터"
|
||||||
@@ -864,7 +871,7 @@ instanceDefaultLightTheme: "서버 기본 라이트 테마"
|
|||||||
instanceDefaultDarkTheme: "서버 기본 다크 테마"
|
instanceDefaultDarkTheme: "서버 기본 다크 테마"
|
||||||
instanceDefaultThemeDescription: "객체 형식의 테마 코드를 입력해 주세요."
|
instanceDefaultThemeDescription: "객체 형식의 테마 코드를 입력해 주세요."
|
||||||
mutePeriod: "뮤트할 기간"
|
mutePeriod: "뮤트할 기간"
|
||||||
period: "투표 기한"
|
period: "기간"
|
||||||
indefinitely: "무기한"
|
indefinitely: "무기한"
|
||||||
tenMinutes: "10분"
|
tenMinutes: "10분"
|
||||||
oneHour: "1시간"
|
oneHour: "1시간"
|
||||||
@@ -986,10 +993,13 @@ cannotBeChangedLater: "나중에 변경할 수 없습니다."
|
|||||||
reactionAcceptance: "리액션 수신"
|
reactionAcceptance: "리액션 수신"
|
||||||
likeOnly: "좋아요만 받기"
|
likeOnly: "좋아요만 받기"
|
||||||
likeOnlyForRemote: "리모트에서는 좋아요만 받기"
|
likeOnlyForRemote: "리모트에서는 좋아요만 받기"
|
||||||
|
nonSensitiveOnly: "민감한 이모지를 제외하고 받기"
|
||||||
|
nonSensitiveOnlyForLocalLikeOnlyForRemote: "민감한 이모지를 제외하고 받기 (리모트에서는 좋아요만 받기)"
|
||||||
rolesAssignedToMe: "나에게 할당된 역할"
|
rolesAssignedToMe: "나에게 할당된 역할"
|
||||||
resetPasswordConfirm: "비밀번호를 재설정하시겠습니까?"
|
resetPasswordConfirm: "비밀번호를 재설정하시겠습니까?"
|
||||||
sensitiveWords: "민감한 단어"
|
sensitiveWords: "민감한 단어"
|
||||||
sensitiveWordsDescription: "설정한 단어가 포함된 노트의 공개 범위를 '홈'으로 강제합니다. 개행으로 구분하여 여러 개를 지정할 수 있습니다."
|
sensitiveWordsDescription: "설정한 단어가 포함된 노트의 공개 범위를 '홈'으로 강제합니다. 개행으로 구분하여 여러 개를 지정할 수 있습니다."
|
||||||
|
sensitiveWordsDescription2: "공백으로 구분하면 AND 지정이 되며, 키워드를 슬래시로 둘러싸면 정규 표현식이 됩니다."
|
||||||
notesSearchNotAvailable: "노트 검색을 이용하실 수 없습니다."
|
notesSearchNotAvailable: "노트 검색을 이용하실 수 없습니다."
|
||||||
license: "라이선스"
|
license: "라이선스"
|
||||||
unfavoriteConfirm: "즐겨찾기를 해제하시겠습니까?"
|
unfavoriteConfirm: "즐겨찾기를 해제하시겠습니까?"
|
||||||
@@ -1036,18 +1046,52 @@ channelArchiveConfirmTitle: "{name} 을(를) 아카이브하시겠습니까?"
|
|||||||
channelArchiveConfirmDescription: "아카이브한 채널은 채널 목록과 검색 결과에 표시되지 않으며, 채널에 새로운 노트를 작성할 수 없게 됩니다."
|
channelArchiveConfirmDescription: "아카이브한 채널은 채널 목록과 검색 결과에 표시되지 않으며, 채널에 새로운 노트를 작성할 수 없게 됩니다."
|
||||||
thisChannelArchived: "이 채널은 아카이브되었습니다."
|
thisChannelArchived: "이 채널은 아카이브되었습니다."
|
||||||
displayOfNote: "노트 표시"
|
displayOfNote: "노트 표시"
|
||||||
|
initialAccountSetting: "초기 설정"
|
||||||
youFollowing: "팔로잉"
|
youFollowing: "팔로잉"
|
||||||
|
preventAiLearning: "기계학습(생성형 AI)으로의 사용을 거부"
|
||||||
|
preventAiLearningDescription: "외부의 문장 생성 AI나 이미지 생성 AI에 대해 제출한 노트나 이미지 등의 콘텐츠를 학습의 대상으로 사용하지 않도록 요구합니다. 다만, 이 요구사항을 지킬 의무는 없기 때문에 학습을 완전히 방지하는 것은 아닙니다."
|
||||||
|
options: "옵션"
|
||||||
|
specifyUser: "사용자 지정"
|
||||||
|
failedToPreviewUrl: "미리 볼 수 없음"
|
||||||
|
update: "업데이트"
|
||||||
|
rolesThatCanBeUsedThisEmojiAsReaction: "이 이모지를 리액션으로 사용할 수 있는 역할"
|
||||||
|
rolesThatCanBeUsedThisEmojiAsReactionEmptyDescription: "역할을 지정하지 않으면, 누구나 이 이모지를 리액션으로 사용할 수 있습니다."
|
||||||
|
rolesThatCanBeUsedThisEmojiAsReactionPublicRoleWarn: "역할은 공개로 설정되어 있어야 합니다."
|
||||||
|
cancelReactionConfirm: "리액션을 취소하시겠습니까?"
|
||||||
|
changeReactionConfirm: "리액션을 변경하시겠습니까?"
|
||||||
|
later: "나중에"
|
||||||
|
goToMisskey: "Misskey로"
|
||||||
|
additionalEmojiDictionary: "이모지 추가 사전"
|
||||||
|
installed: "설치됨"
|
||||||
|
branding: "브랜딩"
|
||||||
|
enableServerMachineStats: "서버의 머신 사양을 공개하기"
|
||||||
|
enableIdenticonGeneration: "유저마다의 Identicon 생성 유효화"
|
||||||
|
_initialAccountSetting:
|
||||||
|
accountCreated: "계정 생성이 완료되었습니다!"
|
||||||
|
letsStartAccountSetup: "계정의 초기 설정을 진행합니다."
|
||||||
|
letsFillYourProfile: "우선 나의 프로필을 설정해 보아요."
|
||||||
|
profileSetting: "프로필 설정"
|
||||||
|
privacySetting: "프라이버시 설정"
|
||||||
|
theseSettingsCanEditLater: "이 설정들은 나중에도 변경할 수 있습니다."
|
||||||
|
youCanEditMoreSettingsInSettingsPageLater: "이 외에도 '설정' 페이지에서 다양한 설정을 나의 입맛에 맞게 조절할 수 있습니다. 꼭 확인해 보세요!"
|
||||||
|
followUsers: "관심사가 맞는 유저를 팔로우하여 타임라인을 가꾸어 봅시다."
|
||||||
|
pushNotificationDescription: "푸시 알림을 활성화하면 {name}의 알림을 나의 기기에서 받아볼 수 있게 됩니다."
|
||||||
|
initialAccountSettingCompleted: "초기 설정을 모두 마쳤습니다!"
|
||||||
|
haveFun: "{name}와 함께 즐거운 시간 보내세요!"
|
||||||
|
ifYouNeedLearnMore: "{name}(Misskey)의 사용 방법에 대해 자세히 알아보려면 {link}를 참고해 주세요."
|
||||||
|
skipAreYouSure: "초기 설정을 중단하시겠습니까?"
|
||||||
|
laterAreYouSure: "초기 설정을 나중에 진행하시겠습니까?"
|
||||||
_serverRules:
|
_serverRules:
|
||||||
description: "회원 가입 이전에 간단하게 표시할 서버 규칙입니다. 이용 약관의 요약으로 구성하는 것을 추천합니다."
|
description: "회원 가입 이전에 간단하게 표시할 서버 규칙입니다. 이용 약관의 요약으로 구성하는 것을 추천합니다."
|
||||||
_accountMigration:
|
_accountMigration:
|
||||||
moveFrom: "다른 계정에서 이 계정으로 이사"
|
moveFrom: "다른 계정에서 이 계정으로 이사"
|
||||||
moveFromSub: "다른 계정에 대한 별칭을 생성"
|
moveFromSub: "다른 계정에 대한 별칭을 생성"
|
||||||
moveFromLabel: "기존 계정:"
|
moveFromLabel: "기존 계정 #{n}"
|
||||||
moveFromDescription: "다른 계정에서 이 계정으로 팔로워를 가져오려면, 우선 여기에서 별칭을 지정해야 합니다. 반드시 이사하기 전에 지정해야 합니다! 기존 계정을 다음과 같은 형식으로 입력해 주십시오: @person@instance.com"
|
moveFromDescription: "다른 계정에서 이 계정으로 팔로워를 가져오려면, 우선 여기에서 별칭을 지정해야 합니다. 반드시 이사하기 전에 지정해야 합니다! 기존 계정을 다음과 같은 형식으로 입력해 주십시오: @person@instance.com"
|
||||||
moveTo: "이 계정에서 다른 계정으로 이사"
|
moveTo: "이 계정에서 다른 계정으로 이사"
|
||||||
moveToLabel: "이사할 계정:"
|
moveToLabel: "이사할 계정:"
|
||||||
moveCannotBeUndone: "한 번 이사하면, 두 번 다시 되돌릴 수 없습니다."
|
moveCannotBeUndone: "한 번 이사하면, 두 번 다시 되돌릴 수 없습니다."
|
||||||
moveAccountDescription: "이 작업은 취소할 수 없습니다. 먼저 이사할 계정에서 이 계정에 대한 별칭을 지정하였는지 다시 한 번 확인해 주십시오. 별칭을 지정한 다음, 이사할 계정을 다음과 같은 형식으로 입력해 주십시오: @person@instance.com"
|
moveAccountDescription: "새 계정으로 이전합니다.\n ・팔로워가 새 계정을 자동으로 팔로우 합니다\n ・이 계정에서 팔로우는 모두 해제됩니다\n ・이 계정으로는 노트 작성 등을 할 수 없게 됩니다\n\n팔로워는 자동으로 이전되지만, 팔로우는 수동으로 진행해야 합니다. 이전하기 전에 이 계정에서 팔로우를 내보내고, 이전 후에는 즉시 이전한 계정에서 가져오기를 진행하십시오.\n리스트・뮤트・차단에 대해서도 마찬가지이므로 수동으로 이전해야 합니다.\n\n(이 설명은 이 서버(Misskey v13.12.0 이후)의 사양입니다. Mastodon 등의 다른 ActivityPub 소프트웨어에서는 작동이 다를 수 있습니다.)"
|
||||||
moveAccountHowTo: "계정을 이사하려면 우선 이사갈 계정에서 이 계정에 대한 별칭을 지정해야 합니다.\n별칭을 작성한 다음, 이사갈 계정을 다음과 같이 입력하십시오:\n@username@server.example.com"
|
moveAccountHowTo: "계정을 이사하려면 우선 이사갈 계정에서 이 계정에 대한 별칭을 지정해야 합니다.\n별칭을 작성한 다음, 이사갈 계정을 다음과 같이 입력하십시오:\n@username@server.example.com"
|
||||||
startMigration: "이사하기"
|
startMigration: "이사하기"
|
||||||
migrationConfirm: "정말로 이 계정을 {account} 으로 이전하시겠습니까? 한 번 이전한 다음에는 취소할 수 없으며, 두 번 다시 원래 상태로 복구할 수 없습니다.\n이사할 계정에서 계정 별칭을 지정하였는지 다시 한 번 확인하십시오."
|
migrationConfirm: "정말로 이 계정을 {account} 으로 이전하시겠습니까? 한 번 이전한 다음에는 취소할 수 없으며, 두 번 다시 원래 상태로 복구할 수 없습니다.\n이사할 계정에서 계정 별칭을 지정하였는지 다시 한 번 확인하십시오."
|
||||||
@@ -1226,6 +1270,7 @@ _achievements:
|
|||||||
title: "잠깐 쉬어"
|
title: "잠깐 쉬어"
|
||||||
description: "클라이언트를 시작하고 30분이 경과하였습니다"
|
description: "클라이언트를 시작하고 30분이 경과하였습니다"
|
||||||
_client60min:
|
_client60min:
|
||||||
|
title: "No \"Miss\" in Misskey"
|
||||||
description: "클라이언트를 시작하고 60분이 경과하였습니다"
|
description: "클라이언트를 시작하고 60분이 경과하였습니다"
|
||||||
_noteDeletedWithin1min:
|
_noteDeletedWithin1min:
|
||||||
title: "있었는데요 없었습니다"
|
title: "있었는데요 없었습니다"
|
||||||
@@ -1444,10 +1489,6 @@ _aboutMisskey:
|
|||||||
donate: "Misskey에 기부하기"
|
donate: "Misskey에 기부하기"
|
||||||
morePatrons: "이 외에도 다른 많은 분들이 도움을 주시고 계십니다. 감사합니다🥰"
|
morePatrons: "이 외에도 다른 많은 분들이 도움을 주시고 계십니다. 감사합니다🥰"
|
||||||
patrons: "후원자"
|
patrons: "후원자"
|
||||||
_nsfw:
|
|
||||||
respect: "열람주의로 설정된 미디어 숨기기"
|
|
||||||
ignore: "열람 주의 미디어 항상 표시"
|
|
||||||
force: "미디어 항상 숨기기"
|
|
||||||
_instanceTicker:
|
_instanceTicker:
|
||||||
none: "보이지 않음"
|
none: "보이지 않음"
|
||||||
remote: "리모트 유저에게만 보이기"
|
remote: "리모트 유저에게만 보이기"
|
||||||
@@ -1475,7 +1516,7 @@ _menuDisplay:
|
|||||||
hide: "숨기기"
|
hide: "숨기기"
|
||||||
_wordMute:
|
_wordMute:
|
||||||
muteWords: "뮤트할 단어"
|
muteWords: "뮤트할 단어"
|
||||||
muteWordsDescription: "공백으로 구분하는 경우 AND, 줄바꿈으로 구분하는 경우 OR로 지정됩니다。"
|
muteWordsDescription: "공백으로 구분하는 경우 AND, 줄바꿈으로 구분하는 경우 OR로 지정됩니다."
|
||||||
muteWordsDescription2: "정규 표현식을 사용하려면 키워드를 빗금표(/)로 감싸 주세요."
|
muteWordsDescription2: "정규 표현식을 사용하려면 키워드를 빗금표(/)로 감싸 주세요."
|
||||||
softDescription: "지정한 조건의 노트를 타임라인에서 숨깁니다."
|
softDescription: "지정한 조건의 노트를 타임라인에서 숨깁니다."
|
||||||
hardDescription: "지정한 조건의 노트를 타임라인에 추가하지 않습니다. 타임라인에 추가되지 않은 노트는 조건을 변경해도 표시되지 않습니다."
|
hardDescription: "지정한 조건의 노트를 타임라인에 추가하지 않습니다. 타임라인에 추가되지 않은 노트는 조건을 변경해도 표시되지 않습니다."
|
||||||
@@ -1585,6 +1626,16 @@ _time:
|
|||||||
minute: "분"
|
minute: "분"
|
||||||
hour: "시간"
|
hour: "시간"
|
||||||
day: "일"
|
day: "일"
|
||||||
|
_timelineTutorial:
|
||||||
|
title: "Misskey의 사용 방법"
|
||||||
|
step1_1: "이것은 '타임라인'입니다. {name}에 게시된 '노트'가 시간 순서대로 표시됩니다."
|
||||||
|
step1_2: "타임라인은 몇 가지 종류로 나뉩니다. 그 중에 '홈 타임라인'은 내가 팔로우한 사람의 노트가 표시되며, '로컬 타임라인'에는 {name} 의 모든 노트가 표시됩니다."
|
||||||
|
step2_1: "그럼 시험삼아 노트를 작성해 봅시다. 화면에 있는 연필 버튼을 눌러 보세요."
|
||||||
|
step2_2: "첫 노트이니까 자기소개, 혹은 가볍게 \"안녕 {name}\"라고 올려 보는 건 어떨까요?"
|
||||||
|
step3_1: "노트 작성을 끝내셨나요?"
|
||||||
|
step3_2: "당신의 노트가 타임라인에 표시되어 있다면 성공입니다."
|
||||||
|
step4_1: "노트에는 '리액션'을 붙일 수 있습니다."
|
||||||
|
step4_2: "리액션을 붙이려면, 노트의 \"+\" 버튼을 클릭하고 원하는 이모지를 선택합니다."
|
||||||
_2fa:
|
_2fa:
|
||||||
alreadyRegistered: "이미 설정이 완료되었습니다."
|
alreadyRegistered: "이미 설정이 완료되었습니다."
|
||||||
registerTOTP: "인증 앱 설정 시작"
|
registerTOTP: "인증 앱 설정 시작"
|
||||||
|
|||||||
@@ -248,7 +248,6 @@ inputNewDescription: "ໃສ່ຄຳບັນຍາຍໃໝ່"
|
|||||||
inputNewFolderName: "ໃສ່ຊື່ໂຟນເດີໃໝ່"
|
inputNewFolderName: "ໃສ່ຊື່ໂຟນເດີໃໝ່"
|
||||||
circularReferenceFolder: "ໂຟນເດີປາຍທາງແມ່ນໂຟນເດີຍ່ອຍຂອງໂຟນເດີທີ່ທ່ານຕ້ອງການຍ້າຍ"
|
circularReferenceFolder: "ໂຟນເດີປາຍທາງແມ່ນໂຟນເດີຍ່ອຍຂອງໂຟນເດີທີ່ທ່ານຕ້ອງການຍ້າຍ"
|
||||||
rename: "ປ່ຽນຊື່"
|
rename: "ປ່ຽນຊື່"
|
||||||
nsfw: "NSFW"
|
|
||||||
watch: "ເບິ່ງ"
|
watch: "ເບິ່ງ"
|
||||||
unwatch: "ຢຸດເບິ່ງ"
|
unwatch: "ຢຸດເບິ່ງ"
|
||||||
accept: "ອະນຸຍາດ"
|
accept: "ອະນຸຍາດ"
|
||||||
|
|||||||
@@ -296,7 +296,6 @@ copyUrl: "URL kopiëren"
|
|||||||
rename: "Hernoemen"
|
rename: "Hernoemen"
|
||||||
avatar: "Avatar"
|
avatar: "Avatar"
|
||||||
banner: "Banner"
|
banner: "Banner"
|
||||||
nsfw: "NSFW"
|
|
||||||
whenServerDisconnected: "Wanneer de verbinding met de server wordt onderbroken"
|
whenServerDisconnected: "Wanneer de verbinding met de server wordt onderbroken"
|
||||||
disconnectedFromServer: "Verbinding met de server onderbroken."
|
disconnectedFromServer: "Verbinding met de server onderbroken."
|
||||||
reload: "Verversen"
|
reload: "Verversen"
|
||||||
|
|||||||
@@ -1,21 +1,31 @@
|
|||||||
---
|
---
|
||||||
_lang_: "Norsk Bokmål"
|
_lang_: "Norsk Bokmål"
|
||||||
|
headlineMisskey: "Et nettverk forbundet med Notes"
|
||||||
|
introMisskey: "Velkommen! Misskey er en desentralisert mikrobloggtjeneste med åpen kildekode.\nOpprett \"Notes\" for å dele tankene dine med alle rundt deg. 📡\nMed \"reaksjoner\" kan du også raskt gi uttrykk for hva du synes om alles Notes. 👍\nLa oss utforske en ny verden! 🚀"
|
||||||
|
monthAndDay: "{day}-{month}"
|
||||||
search: "Søk"
|
search: "Søk"
|
||||||
notifications: "Varsler"
|
notifications: "Varsler"
|
||||||
username: "Brukernavn"
|
username: "Brukernavn"
|
||||||
password: "Passord"
|
password: "Passord"
|
||||||
forgotPassword: "Glemt passord"
|
forgotPassword: "Glemt passord"
|
||||||
|
fetchingAsApObject: "Henter fra Fediverse..."
|
||||||
ok: "OK"
|
ok: "OK"
|
||||||
gotIt: "Skjønner"
|
gotIt: "Skjønner"
|
||||||
cancel: "Avbryt"
|
cancel: "Avbryt"
|
||||||
noThankYou: "Avbryt"
|
noThankYou: "Ikke nå"
|
||||||
|
enterUsername: "Skriv inn brukernavn"
|
||||||
|
renotedBy: "Renotes av {user}"
|
||||||
|
noNotes: "Ingen Notes"
|
||||||
noNotifications: "Ingen varsler"
|
noNotifications: "Ingen varsler"
|
||||||
instance: "Server"
|
instance: "Server"
|
||||||
settings: "Innstillinger"
|
settings: "Innstillinger"
|
||||||
notificationSettings: "Varslingsinnstillinger"
|
notificationSettings: "Varslingsinnstillinger"
|
||||||
|
basicSettings: "Grunnleggende innstillinger"
|
||||||
otherSettings: "Andre innstillinger"
|
otherSettings: "Andre innstillinger"
|
||||||
|
openInWindow: "Åpne i vindu"
|
||||||
profile: "Profil"
|
profile: "Profil"
|
||||||
timeline: "Tidslinje"
|
timeline: "Tidslinje"
|
||||||
|
noAccountDescription: "Denne brukeren har ikke skrevet sin biografi ennå."
|
||||||
login: "Logg inn"
|
login: "Logg inn"
|
||||||
loggingIn: "Logget inn"
|
loggingIn: "Logget inn"
|
||||||
logout: "Logg ut"
|
logout: "Logg ut"
|
||||||
@@ -24,17 +34,21 @@ uploading: "Laster opp"
|
|||||||
save: "Lagre"
|
save: "Lagre"
|
||||||
users: "Brukere"
|
users: "Brukere"
|
||||||
addUser: "Legg til bruker"
|
addUser: "Legg til bruker"
|
||||||
favorite: "Favoritt"
|
favorite: "Legg til i favoritter"
|
||||||
favorites: "Favoritter"
|
favorites: "Favoritter"
|
||||||
unfavorite: "Fjern favoritt"
|
unfavorite: "Fjern fra favoritter"
|
||||||
pin: "Fest"
|
favorited: "Lagt til i favoritter."
|
||||||
unpin: "Opphev festing"
|
alreadyFavorited: "Allerede lagt til i favoritter."
|
||||||
|
cantFavorite: "Kunne ikke legge til i favoritter."
|
||||||
|
pin: "Fest til profil"
|
||||||
|
unpin: "Fjern fra profil"
|
||||||
copyContent: "Kopier innhold"
|
copyContent: "Kopier innhold"
|
||||||
copyLink: "Kopier lenke"
|
copyLink: "Kopier lenke"
|
||||||
delete: "Slett"
|
delete: "Slett"
|
||||||
deleteAndEdit: "Slett og rediger"
|
deleteAndEdit: "Slett og rediger"
|
||||||
|
deleteAndEditConfirm: "Er du sikker på at du vil slette denne Noten og redigere den? Du vil miste alle reaksjoner, Renotes og svar på den."
|
||||||
addToList: "Legg til i liste"
|
addToList: "Legg til i liste"
|
||||||
sendMessage: "Send melding"
|
sendMessage: "Send en melding"
|
||||||
copyRSS: "Kopier RSS"
|
copyRSS: "Kopier RSS"
|
||||||
copyUsername: "Kopier brukernavn"
|
copyUsername: "Kopier brukernavn"
|
||||||
searchUser: "Søk brukere"
|
searchUser: "Søk brukere"
|
||||||
@@ -42,140 +56,290 @@ reply: "Svar"
|
|||||||
loadMore: "Vis mer"
|
loadMore: "Vis mer"
|
||||||
showMore: "Vis mer"
|
showMore: "Vis mer"
|
||||||
showLess: "Lukk"
|
showLess: "Lukk"
|
||||||
|
youGotNewFollower: "fulgte deg"
|
||||||
|
followRequestAccepted: "Følgeforespørsel akseptert"
|
||||||
|
importAndExport: "Importer og eksporter"
|
||||||
|
import: "Importer"
|
||||||
|
export: "Eksporter"
|
||||||
files: "Filer"
|
files: "Filer"
|
||||||
download: "Nedlastinger"
|
download: "Nedlastinger"
|
||||||
|
driveFileDeleteConfirm: "Er du sikker på at du vil slette \"{name}\"? Det vil også forsvinne fra alt innhold som bruker det."
|
||||||
|
unfollowConfirm: "Er du sikker på at du vil slutte å følge {name}?"
|
||||||
|
importRequested: "Du har bedt om import. Dette kan ta en stund."
|
||||||
lists: "Lister"
|
lists: "Lister"
|
||||||
noLists: "Ingen lister"
|
noLists: "Ingen lister"
|
||||||
following: "Følg"
|
note: "Note"
|
||||||
|
notes: "Notes"
|
||||||
|
following: "Følger"
|
||||||
followers: "Følgere"
|
followers: "Følgere"
|
||||||
followsYou: "Følger deg"
|
followsYou: "Følger deg"
|
||||||
createList: "Opprett liste"
|
createList: "Opprett liste"
|
||||||
error: "Feil"
|
error: "Feil"
|
||||||
|
somethingHappened: "En feil har oppstått"
|
||||||
retry: "Prøv igjen"
|
retry: "Prøv igjen"
|
||||||
pageLoadError: "Kunne ikke hente side."
|
pageLoadError: "Kunne ikke hente side."
|
||||||
|
serverIsDead: "Denne serveren svarer ikke. Vennligst vent en stund og prøv igjen."
|
||||||
|
enterListName: "Skriv inn et navn på listen"
|
||||||
privacy: "Personvern"
|
privacy: "Personvern"
|
||||||
|
defaultNoteVisibility: "Standard synlighet"
|
||||||
follow: "Følg"
|
follow: "Følg"
|
||||||
followRequest: "Følgeforespørsel"
|
followRequest: "Følgeforespørsel"
|
||||||
followRequests: "Følgeforespørsel"
|
followRequests: "Følgeforespørsel"
|
||||||
unfollow: "Avfølg"
|
unfollow: "Avfølg"
|
||||||
followRequestPending: "Venter på godkjenning"
|
followRequestPending: "Venter på godkjenning"
|
||||||
|
enterEmoji: "Skriv inn en emoji"
|
||||||
|
renote: "Renote"
|
||||||
|
renoted: "Renotet."
|
||||||
|
cantRenote: "Dette innlegget kan ikke renotes."
|
||||||
|
cantReRenote: "En Renote kan ikke renotes."
|
||||||
quote: "Sitat"
|
quote: "Sitat"
|
||||||
pinned: "Fest"
|
inChannelRenote: "Renote kun for kanal"
|
||||||
|
inChannelQuote: "Sitat kun for kanal"
|
||||||
|
pinnedNote: "Festet Note"
|
||||||
|
pinned: "Fest til profil"
|
||||||
you: "Du"
|
you: "Du"
|
||||||
clickToShow: "Klikk for å vise"
|
clickToShow: "Klikk for å vise"
|
||||||
add: "Legg til"
|
add: "Legg til"
|
||||||
reaction: "Reaksjon"
|
reaction: "Reaksjon"
|
||||||
reactions: "Reaksjoner"
|
reactions: "Reaksjoner"
|
||||||
|
reactionSetting: "Reaksjoner som vises i reaksjonsvelgeren"
|
||||||
|
reactionSettingDescription2: "Dra for å endre rekkefølgen, klikk for å slette, trykk \"+\" for å legge til."
|
||||||
|
rememberNoteVisibility: "Husk innstillingene for synlighet av Notes"
|
||||||
|
attachCancel: "Fjern vedlegg"
|
||||||
|
enterFileName: "Skriv inn filnavn"
|
||||||
mute: "Skjul"
|
mute: "Skjul"
|
||||||
unmute: "Vis"
|
unmute: "Vis"
|
||||||
|
renoteMute: "Skjul Renotes"
|
||||||
|
renoteUnmute: "Vis Renotes"
|
||||||
block: "Blokker"
|
block: "Blokker"
|
||||||
unblock: "Opphev blokkering"
|
unblock: "Opphev blokkering"
|
||||||
blockConfirm: "Blokker?"
|
suspend: "Suspender"
|
||||||
selectList: "Velg liste"
|
blockConfirm: "Er du sikker på at du vil blokke denne kontoen?"
|
||||||
selectChannel: "Velg kanal"
|
unblockConfirm: "Er du sikker på at du vil oppheve blokkeringen av denne kontoen?"
|
||||||
|
suspendConfirm: "Er du sikker på at du vil suspendere denne kontoen?"
|
||||||
|
selectList: "Velg en liste"
|
||||||
|
selectChannel: "Velg en kanal"
|
||||||
|
selectAntenna: "Velg en antenne"
|
||||||
|
selectWidget: "Velg en widget"
|
||||||
|
editWidgets: "Rediger widgeter"
|
||||||
|
editWidgetsExit: "Ferdig"
|
||||||
emoji: "Emoji"
|
emoji: "Emoji"
|
||||||
emojis: "Emojier"
|
emojis: "Emojier"
|
||||||
addEmoji: "Legg til emoji"
|
addEmoji: "Legg til emoji"
|
||||||
|
settingGuide: "Anbefalte innstillinger"
|
||||||
|
flagAsBot: "Merk denne kontoen som en bot"
|
||||||
|
flagAsBotDescription: "Aktiver dette alternativet hvis denne kontoen styres av et program. Hvis det er aktivert, vil det fungere som et flagg for andre utviklere for å forhindre endeløse interaksjonskjeder med andre roboter og justere Misskeys interne systemer til å behandle denne kontoen som en bot."
|
||||||
|
flagAsCat: "Merk denne kontoen som en katt"
|
||||||
|
flagAsCatDescription: "Aktiver dette alternativet for å merke denne kontoen som en katt."
|
||||||
|
flagShowTimelineReplies: "Vis svar i tidslinje"
|
||||||
addAccount: "Legg til konto"
|
addAccount: "Legg til konto"
|
||||||
selectUser: "Velg bruker"
|
reloadAccountsList: "Last inn kontoliste på nytt"
|
||||||
instances: "Server"
|
loginFailed: "Kunne ikke logge inn"
|
||||||
|
general: "Generelt"
|
||||||
|
searchWith: "Søk: {q}"
|
||||||
|
youHaveNoLists: "Du har ingen lister"
|
||||||
|
followConfirm: "Er du sikker på at du vil følge {name}?"
|
||||||
|
host: "Vert"
|
||||||
|
selectUser: "Velg en bruker"
|
||||||
|
recipient: "Mottaker"
|
||||||
|
annotation: "Kommentarer"
|
||||||
|
federation: "Føderasjon"
|
||||||
|
instances: "Servere"
|
||||||
registeredAt: "Registrerte seg"
|
registeredAt: "Registrerte seg"
|
||||||
|
latestRequestReceivedAt: "Siste forespørsel mottatt"
|
||||||
|
latestStatus: "Siste status"
|
||||||
|
charts: "Diagrammer"
|
||||||
perHour: "Per time"
|
perHour: "Per time"
|
||||||
perDay: "Per dag"
|
perDay: "Per dag"
|
||||||
|
stopActivityDelivery: "Slutt å sende aktiviteter"
|
||||||
blockThisInstance: "Blokker denne serveren"
|
blockThisInstance: "Blokker denne serveren"
|
||||||
|
operations: "Operasjoner"
|
||||||
|
software: "Programvare"
|
||||||
version: "Versjon"
|
version: "Versjon"
|
||||||
|
metadata: "Metadata"
|
||||||
|
withNFiles: "{n} fil(er)"
|
||||||
|
network: "Nettverk"
|
||||||
|
instanceInfo: "Serverinformasjon"
|
||||||
statistics: "Statistikk"
|
statistics: "Statistikk"
|
||||||
clearQueue: "Tøm kø"
|
clearQueue: "Tøm kø"
|
||||||
clearQueueConfirmTitle: "Vil du tømme kø?"
|
clearQueueConfirmTitle: "Er du sikker på at du vil tømme køen?"
|
||||||
blockedInstances: "Blokkerte severe"
|
blockedInstances: "Blokkerte severe"
|
||||||
|
blockedInstancesDescription: "Skriv opp vertsnavnene til serverne du vil blokkere, atskilt med linjeskift. Serverne i listen vil ikke lenger kunne kommunisere med denne serveren."
|
||||||
muteAndBlock: "Skjul og blokker"
|
muteAndBlock: "Skjul og blokker"
|
||||||
mutedUsers: "Skjulte brukere"
|
mutedUsers: "Skjulte brukere"
|
||||||
blockedUsers: "Blokkerte brukere"
|
blockedUsers: "Blokkerte brukere"
|
||||||
|
noUsers: "Det er ingen brukere"
|
||||||
editProfile: "Rediger profil"
|
editProfile: "Rediger profil"
|
||||||
|
noteDeleteConfirm: "Er du sikker på at du vil slette denne Noten?"
|
||||||
pinLimitExceeded: "Du kan ikke feste flere."
|
pinLimitExceeded: "Du kan ikke feste flere."
|
||||||
noCustomEmojis: "Ingen emoji"
|
intro: "Installasjonen av Misskey er ferdig! Vennligst opprett en administratorkonto."
|
||||||
|
done: "Ferdig"
|
||||||
|
default: "Standard"
|
||||||
|
defaultValueIs: "Standard: {value}"
|
||||||
|
noCustomEmojis: "Det er ingen emoji"
|
||||||
|
noJobs: "Det er ingen jobber"
|
||||||
blocked: "Blokkert"
|
blocked: "Blokkert"
|
||||||
|
suspended: "Suspendert"
|
||||||
all: "Alle"
|
all: "Alle"
|
||||||
|
notResponding: "Svarer ikke"
|
||||||
changePassword: "Endre passord"
|
changePassword: "Endre passord"
|
||||||
security: "Sikkerhet"
|
security: "Sikkerhet"
|
||||||
|
retypedNotMatch: "Inngangene stemmer ikke overens."
|
||||||
|
currentPassword: "Nåværende passord"
|
||||||
newPassword: "Nytt passord"
|
newPassword: "Nytt passord"
|
||||||
newPasswordRetype: "Nytt passord (gjenta)"
|
newPasswordRetype: "Nytt passord (gjenta)"
|
||||||
|
attachFile: "Legg ved filer"
|
||||||
more: "Mer!"
|
more: "Mer!"
|
||||||
|
noSuchUser: "Bruker ikke funnet"
|
||||||
|
announcements: "Kunngjøringer"
|
||||||
remove: "Slett"
|
remove: "Slett"
|
||||||
removed: "Slettet"
|
removed: "Vellykket slettet"
|
||||||
|
removeAreYouSure: "Er du sikker på at du vil fjerne \"{x}\"?"
|
||||||
|
deleteAreYouSure: "Er du sikker på at du vil slette \"{x}\"?"
|
||||||
saved: "Lagret"
|
saved: "Lagret"
|
||||||
upload: "Laste opp"
|
upload: "Laste opp"
|
||||||
|
keepOriginalUploading: "Behold originalbildet"
|
||||||
|
fromUrl: "Fra URL"
|
||||||
|
uploadFromUrl: "Last opp fra en URL"
|
||||||
|
uploadFromUrlDescription: "URL til filen du vil laste opp"
|
||||||
explore: "Utforsk"
|
explore: "Utforsk"
|
||||||
messageRead: "Lest"
|
messageRead: "Lest"
|
||||||
agree: "Jeg godtar"
|
nUsersRead: "lest av {n}"
|
||||||
|
agreeTo: "Jeg godtar {0}"
|
||||||
|
agree: "Godta"
|
||||||
|
agreeBelow: "Jeg godtar følgende"
|
||||||
|
basicNotesBeforeCreateAccount: "Viktige merknader"
|
||||||
|
termsOfService: "Vilkår for bruk"
|
||||||
home: "Hjem"
|
home: "Hjem"
|
||||||
|
activity: "Aktivitet"
|
||||||
images: "Bilder"
|
images: "Bilder"
|
||||||
image: "Bilder"
|
image: "Bilde"
|
||||||
birthday: "Bursdag"
|
birthday: "Bursdag"
|
||||||
yearsOld: "{age} år gammel"
|
yearsOld: "{age} år gammel"
|
||||||
|
theme: "Temaer"
|
||||||
light: "Lys"
|
light: "Lys"
|
||||||
dark: "Mørk"
|
dark: "Mørk"
|
||||||
|
lightThemes: "Lyse temaer"
|
||||||
|
darkThemes: "Mørke temaer"
|
||||||
|
syncDeviceDarkMode: "Synkroniser mørkmodus med enhetens innstillinger"
|
||||||
fileName: "Filnavn"
|
fileName: "Filnavn"
|
||||||
selectFile: "Velg fil"
|
selectFile: "Velg en fil"
|
||||||
selectFiles: "Velg fil"
|
selectFiles: "Velg filer"
|
||||||
selectFolder: "Velg mappe"
|
selectFolder: "Velg en mappe"
|
||||||
selectFolders: "Velg mappe"
|
selectFolders: "Velg mapper"
|
||||||
renameFile: "Endre filnavn"
|
renameFile: "Endre filnavn"
|
||||||
folderName: "Mappenavn"
|
folderName: "Mappenavn"
|
||||||
createFolder: "Opprett mappe"
|
createFolder: "Opprett en mappe"
|
||||||
renameFolder: "Endre mappenavn"
|
renameFolder: "Endre mappenavn"
|
||||||
deleteFolder: "Slett mappe"
|
deleteFolder: "Slett denne mappen"
|
||||||
addFile: "Legg til fil"
|
addFile: "Legg til en fil"
|
||||||
emptyFolder: "Denne mappen er tom"
|
emptyFolder: "Denne mappen er tom"
|
||||||
|
unableToDelete: "Kan ikke slette"
|
||||||
|
inputNewFileName: "Skriv inn et nytt filnavn"
|
||||||
|
inputNewDescription: "Skriv inn ny bildetekst"
|
||||||
|
inputNewFolderName: "Skriv inn et nytt mappenavn"
|
||||||
|
circularReferenceFolder: "Målmappen er en undermappe til mappen du ønsker å flytte."
|
||||||
|
hasChildFilesOrFolders: "Siden denne mappen ikke er tom, kan den ikke slettes."
|
||||||
copyUrl: "Kopier URL"
|
copyUrl: "Kopier URL"
|
||||||
rename: "Endre navn"
|
rename: "Endre navn"
|
||||||
doNothing: "Gjør ingenting"
|
avatar: "Avatar"
|
||||||
|
banner: "Banner"
|
||||||
|
doNothing: "Ignorer"
|
||||||
accept: "Tillatt"
|
accept: "Tillatt"
|
||||||
reject: "Avslå"
|
reject: "Avslå"
|
||||||
instanceName: "Servernavn"
|
instanceName: "Servernavn"
|
||||||
thisYear: "I år"
|
instanceDescription: "Serverbeskrivelse"
|
||||||
|
thisYear: "År"
|
||||||
|
thisMonth: "Måned"
|
||||||
today: "I dag"
|
today: "I dag"
|
||||||
|
dayX: "{day}"
|
||||||
|
monthX: "{month}"
|
||||||
|
yearX: "{year}"
|
||||||
pages: "Sider"
|
pages: "Sider"
|
||||||
pinnedUsers: "Festete brukrere"
|
integration: "Integrasjon"
|
||||||
pinnedPages: "Festete sider"
|
enableLocalTimeline: "Aktiver lokal tidslinje"
|
||||||
|
enableGlobalTimeline: "Aktiver global tidslinje"
|
||||||
|
disablingTimelinesInfo: "Administratorer og Moderatorer vil alltid ha tilgang til alle tidslinjer, selv om de ikke er aktivert."
|
||||||
|
registration: "Registrer"
|
||||||
|
enableRegistration: "Aktiver registrering av nye brukere"
|
||||||
|
invite: "Inviter"
|
||||||
|
basicInfo: "Grunnleggende informasjon"
|
||||||
|
pinnedUsers: "Festede brukrere"
|
||||||
|
pinnedUsersDescription: "Liste over brukernavn atskilt med linjeskift som skal festes i \"Utforsk\" fanen."
|
||||||
|
pinnedPages: "Festede sider"
|
||||||
|
pinnedNotes: "Festet Note"
|
||||||
hcaptcha: "hCaptcha"
|
hcaptcha: "hCaptcha"
|
||||||
|
enableHcaptcha: "Aktiver hCaptcha"
|
||||||
recaptcha: "reCAPTCHA"
|
recaptcha: "reCAPTCHA"
|
||||||
|
enableRecaptcha: "Aktiver reCAPTCHA"
|
||||||
|
turnstile: "Turnstile"
|
||||||
|
enableTurnstile: "Aktiver Turnstile"
|
||||||
|
antennas: "Antenner"
|
||||||
name: "Navn"
|
name: "Navn"
|
||||||
|
antennaSource: "Antennekilde"
|
||||||
|
notifyAntenna: "Varsle om nye Notes"
|
||||||
|
withFileAntenna: "Bare Notes med filer"
|
||||||
|
notesAndReplies: "Notes og svar"
|
||||||
popularUsers: "Populære brukere"
|
popularUsers: "Populære brukere"
|
||||||
exploreUsersCount: "Det finnes {count} brukere"
|
exploreUsersCount: "Det finnes {count} brukere"
|
||||||
|
exploreFediverse: "Utforsk Fediverse"
|
||||||
userList: "Lister"
|
userList: "Lister"
|
||||||
about: "Infomasjon"
|
about: "Informasjon"
|
||||||
aboutMisskey: "Om Misskey"
|
aboutMisskey: "Om Misskey"
|
||||||
|
newPasswordIs: "Det nye passordet er \"{password}\"."
|
||||||
share: "Del"
|
share: "Del"
|
||||||
|
notFound: "Ikke funnet"
|
||||||
|
markAsReadAllNotifications: "Merk alle varsler som lest"
|
||||||
|
markAsReadAllUnreadNotes: "Merk alle Notes som lest"
|
||||||
help: "Hjelp"
|
help: "Hjelp"
|
||||||
|
inputMessageHere: "Skriv inn melding her"
|
||||||
close: "Lukk"
|
close: "Lukk"
|
||||||
|
invites: "Inviter"
|
||||||
members: "Medlemmer"
|
members: "Medlemmer"
|
||||||
|
title: "Tittel"
|
||||||
text: "Tekst"
|
text: "Tekst"
|
||||||
next: "Neste"
|
next: "Neste"
|
||||||
retype: "Gjenta"
|
retype: "Gjenta"
|
||||||
|
quoteAttached: "Sitat"
|
||||||
|
noMessagesYet: "Ingen meldinger ennå"
|
||||||
|
newMessageExists: "Det er nye meldinger"
|
||||||
|
onlyOneFileCanBeAttached: "Du kan bare legge ved én fil i en melding"
|
||||||
|
invitations: "Inviter"
|
||||||
available: "Tilgjengelig"
|
available: "Tilgjengelig"
|
||||||
unavailable: "Utilgjengelig"
|
unavailable: "Utilgjengelig"
|
||||||
tooShort: "For kort"
|
tooShort: "For kort"
|
||||||
tooLong: "For langt"
|
tooLong: "For langt"
|
||||||
|
weakPassword: "Svakt passord"
|
||||||
|
normalPassword: "Gjennomsnittlig passord"
|
||||||
|
strongPassword: "Sterkt passord"
|
||||||
|
signinWith: "Logg inn med {x}"
|
||||||
|
signinFailed: "Kunne ikke logge inn. Det oppgitte brukernavnet eller passordet er feil."
|
||||||
or: "eller"
|
or: "eller"
|
||||||
language: "Språk"
|
language: "Språk"
|
||||||
aboutX: "Om {x}"
|
aboutX: "Om {x}"
|
||||||
category: "Kategorier"
|
category: "Kategori"
|
||||||
createAccount: "Opprett konto"
|
createAccount: "Opprett konto"
|
||||||
|
openImageInNewTab: "Åpne bilder i ny fane"
|
||||||
|
clientSettings: "Klientinnstillinger"
|
||||||
|
accountSettings: "Kontoinnstillinger"
|
||||||
objectStorageRegion: "Region"
|
objectStorageRegion: "Region"
|
||||||
objectStorageUseSSL: "Bruk SSL"
|
objectStorageUseSSL: "Bruk SSL"
|
||||||
objectStorageUseProxy: "Bruk Proxy"
|
objectStorageUseProxy: "Bruk Proxy"
|
||||||
deleteAll: "Slett alt"
|
deleteAll: "Slett alt"
|
||||||
|
newNoteRecived: "Det er nye Notes"
|
||||||
listen: "Lytt"
|
listen: "Lytt"
|
||||||
none: "Ingen"
|
none: "Ingen"
|
||||||
|
volume: "Volum"
|
||||||
chooseEmoji: "Velg emoji"
|
chooseEmoji: "Velg emoji"
|
||||||
recentUsed: "Sist brukte"
|
recentUsed: "Sist brukte"
|
||||||
install: "Installer"
|
install: "Installer"
|
||||||
|
uninstall: "Avinstaller"
|
||||||
nothing: "Ingenting"
|
nothing: "Ingenting"
|
||||||
deleteAllFiles: "Slett alle filer"
|
deleteAllFiles: "Slett alle filer"
|
||||||
deleteAllFilesConfirm: "Vil du slette alle filer?"
|
deleteAllFilesConfirm: "Er du sikker på at du vil slette alle filer?"
|
||||||
|
userSuspended: "Denne brukeren har blitt suspendert."
|
||||||
accountDeleted: "Kontoen blir slettet"
|
accountDeleted: "Kontoen blir slettet"
|
||||||
accountDeletedDescription: "Denne kontoen blir slettet"
|
accountDeletedDescription: "Denne kontoen har blitt slettet."
|
||||||
menu: "Meny"
|
menu: "Meny"
|
||||||
poll: "Avstemning"
|
poll: "Avstemning"
|
||||||
description: "Beskrivelse"
|
description: "Beskrivelse"
|
||||||
@@ -186,6 +350,7 @@ small: "Liten"
|
|||||||
notificationType: "Varseltype"
|
notificationType: "Varseltype"
|
||||||
edit: "Rediger"
|
edit: "Rediger"
|
||||||
email: "E-post"
|
email: "E-post"
|
||||||
|
smtpHost: "Vert"
|
||||||
smtpUser: "Brukernavn"
|
smtpUser: "Brukernavn"
|
||||||
smtpPass: "Passord"
|
smtpPass: "Passord"
|
||||||
userSaysSomething: "{name} sa noe"
|
userSaysSomething: "{name} sa noe"
|
||||||
@@ -201,16 +366,25 @@ reportAbuse: "Rappoter"
|
|||||||
send: "Send"
|
send: "Send"
|
||||||
openInNewTab: "Åpne i ny fane"
|
openInNewTab: "Åpne i ny fane"
|
||||||
waitingFor: "Venter på {x}"
|
waitingFor: "Venter på {x}"
|
||||||
|
random: "Tilfeldig"
|
||||||
system: "System"
|
system: "System"
|
||||||
|
desktop: "Skrivebord"
|
||||||
|
i18nInfo: "Misskey oversettes til flere språk av frivillige. Du kan hjelpe til på {link}."
|
||||||
followingCount: "Følger"
|
followingCount: "Følger"
|
||||||
followersCount: "Følgere"
|
followersCount: "Følgere"
|
||||||
yes: "Ja"
|
yes: "Ja"
|
||||||
no: "Nei"
|
no: "Nei"
|
||||||
|
contact: "Kontakt"
|
||||||
|
developer: "Utvikler"
|
||||||
|
makeExplorable: "Gjør konto synlig i \"Utforsk\""
|
||||||
|
makeExplorableDescription: "Hvis du slår av dette, vises ikke kontoen din i \"Utforsk\" delen."
|
||||||
left: "Venstre"
|
left: "Venstre"
|
||||||
|
nNotes: "{n} Notes"
|
||||||
saveAs: "Lagre som"
|
saveAs: "Lagre som"
|
||||||
value: "Verdi"
|
value: "Verdi"
|
||||||
deleteConfirm: "Vil du slette?"
|
deleteConfirm: "Vil du slette?"
|
||||||
invalidValue: "Verdien er ugyldig."
|
invalidValue: "Verdien er ugyldig."
|
||||||
|
closeAccount: "Avslutt konto"
|
||||||
emailNotification: "E-postvarsler"
|
emailNotification: "E-postvarsler"
|
||||||
inChannelSearch: "Søk i kanal"
|
inChannelSearch: "Søk i kanal"
|
||||||
clear: "Tøm"
|
clear: "Tøm"
|
||||||
@@ -224,16 +398,23 @@ accounts: "Kontoer"
|
|||||||
switch: "Bytt"
|
switch: "Bytt"
|
||||||
gallery: "Galleri"
|
gallery: "Galleri"
|
||||||
ads: "Annonser"
|
ads: "Annonser"
|
||||||
|
memo: "Notat"
|
||||||
high: "Høy"
|
high: "Høy"
|
||||||
low: "Lav"
|
low: "Lav"
|
||||||
sent: "Send"
|
sent: "Sendt"
|
||||||
|
received: "Mottatt"
|
||||||
learnMore: "Les mer"
|
learnMore: "Les mer"
|
||||||
|
misskeyUpdated: "Misskey har blitt oppdatert!"
|
||||||
translate: "Oversett"
|
translate: "Oversett"
|
||||||
|
translatedFrom: "Oversatt fra {x}"
|
||||||
unread: "Ulest"
|
unread: "Ulest"
|
||||||
manageAccounts: "Administrer konto"
|
manageAccounts: "Administrer konto"
|
||||||
classic: "Klassisk"
|
classic: "Klassisk"
|
||||||
muteThread: "Skjul denne tråden"
|
muteThread: "Skjul denne tråden"
|
||||||
unmuteThread: "Vis denne tråden"
|
unmuteThread: "Vis denne tråden"
|
||||||
|
continueThread: "Vis fortsettelse av tråden"
|
||||||
|
hide: "Skjul"
|
||||||
|
smartphone: "Smarttelefon"
|
||||||
tablet: "Nettbrett"
|
tablet: "Nettbrett"
|
||||||
auto: "Automatisk"
|
auto: "Automatisk"
|
||||||
size: "Størrelse"
|
size: "Størrelse"
|
||||||
@@ -249,10 +430,10 @@ check: "Sjekk"
|
|||||||
deleteAccount: "Slett konto"
|
deleteAccount: "Slett konto"
|
||||||
document: "Dokumenter"
|
document: "Dokumenter"
|
||||||
logoutConfirm: "Vil du logge ut?"
|
logoutConfirm: "Vil du logge ut?"
|
||||||
pleaseSelect: "Vennligst velg"
|
pleaseSelect: "Velg et alternativ"
|
||||||
type: "Type"
|
type: "Type"
|
||||||
beta: "Beta"
|
beta: "Beta"
|
||||||
account: "Kontoer"
|
account: "Konto"
|
||||||
move: "Flytt"
|
move: "Flytt"
|
||||||
pushNotification: "Push-varsler"
|
pushNotification: "Push-varsler"
|
||||||
tools: "Verktøy"
|
tools: "Verktøy"
|
||||||
@@ -268,16 +449,44 @@ role: "Rolle"
|
|||||||
color: "Farge"
|
color: "Farge"
|
||||||
youCannotCreateAnymore: "Du kan ikke opprette flere."
|
youCannotCreateAnymore: "Du kan ikke opprette flere."
|
||||||
cannotPerformTemporary: "Midlertidig utilgjengelig"
|
cannotPerformTemporary: "Midlertidig utilgjengelig"
|
||||||
|
achievements: "Prestasjoner"
|
||||||
thisPostMayBeAnnoyingCancel: "Avbryt"
|
thisPostMayBeAnnoyingCancel: "Avbryt"
|
||||||
exploreOtherServers: "Utforsk andre severe"
|
exploreOtherServers: "Utforsk andre severe"
|
||||||
letsLookAtTimeline: "La oss se på tidslinje"
|
letsLookAtTimeline: "La oss se på tidslinje"
|
||||||
cannotBeChangedLater: "Du kan ikke endre senere."
|
cannotBeChangedLater: "Du kan ikke endre senere."
|
||||||
likeOnly: "Bare liker"
|
likeOnly: "Bare liker"
|
||||||
retryAllQueuesConfirmTitle: "Vil du prøve igjen akkurat nå?"
|
retryAllQueuesConfirmTitle: "Vil du prøve igjen akkurat nå?"
|
||||||
|
video: "Video"
|
||||||
|
videos: "Videoer"
|
||||||
continue: "Fortsett"
|
continue: "Fortsett"
|
||||||
youFollowing: "Følger"
|
youFollowing: "Følger"
|
||||||
|
options: "Alternativ"
|
||||||
|
_initialAccountSetting:
|
||||||
|
theseSettingsCanEditLater: "Du kan endre disse innstillingene senere."
|
||||||
_achievements:
|
_achievements:
|
||||||
_types:
|
_types:
|
||||||
|
_notes10:
|
||||||
|
title: "Noen Notes"
|
||||||
|
_notes100:
|
||||||
|
title: "Mange Notes"
|
||||||
|
_notes500:
|
||||||
|
title: "Dekket i Notes"
|
||||||
|
_notes1000:
|
||||||
|
title: "Et fjell av Notes"
|
||||||
|
_notes5000:
|
||||||
|
title: "Overfylte Notes"
|
||||||
|
_notes10000:
|
||||||
|
title: "Super Notes"
|
||||||
|
_notes20000:
|
||||||
|
title: "Trenger... mer... Notes..."
|
||||||
|
_notes30000:
|
||||||
|
title: "Notes Notes Notes!"
|
||||||
|
_notes40000:
|
||||||
|
title: "Note fabrikk"
|
||||||
|
_notes50000:
|
||||||
|
title: "Planet av Notes"
|
||||||
|
_notes100000:
|
||||||
|
flavor: "Du har jammen mye å si."
|
||||||
_noteFavorited1:
|
_noteFavorited1:
|
||||||
title: "Stjernekikker"
|
title: "Stjernekikker"
|
||||||
_myNoteFavorited1:
|
_myNoteFavorited1:
|
||||||
@@ -290,13 +499,42 @@ _achievements:
|
|||||||
title: "For mange venner"
|
title: "For mange venner"
|
||||||
_followers10:
|
_followers10:
|
||||||
title: "Følg meg!"
|
title: "Følg meg!"
|
||||||
|
_followers100:
|
||||||
|
title: "Populær"
|
||||||
|
_postedAtLateNight:
|
||||||
|
flavor: "Det er på tide å gå til sengs."
|
||||||
|
_driveFolderCircularReference:
|
||||||
|
title: "Rundskrivreferanse"
|
||||||
_reactWithoutRead:
|
_reactWithoutRead:
|
||||||
title: "Leste du det virkelig?"
|
title: "Leste du det virkelig?"
|
||||||
_clickedClickHere:
|
_clickedClickHere:
|
||||||
title: "Klikk her"
|
title: "Klikk her"
|
||||||
description: "Du har klikket her"
|
description: "Du har klikket her"
|
||||||
|
_justPlainLucky:
|
||||||
|
title: "Rett og slett heldig"
|
||||||
|
_setNameToSyuilo:
|
||||||
|
description: "Du satte navnet ditt til \"syuilo\""
|
||||||
|
_passedSinceAccountCreated1:
|
||||||
|
title: "Ett års jubileum"
|
||||||
|
description: "Det har gått ett år siden kontoen din ble opprettet"
|
||||||
|
_passedSinceAccountCreated2:
|
||||||
|
title: "To års jubileum"
|
||||||
|
description: "Det har gått to år siden kontoen din ble opprettet"
|
||||||
|
_passedSinceAccountCreated3:
|
||||||
|
title: "Tre års jubileum"
|
||||||
|
description: "Det har gått tre år siden kontoen din ble opprettet"
|
||||||
_loggedInOnBirthday:
|
_loggedInOnBirthday:
|
||||||
title: "Gratulerer med dagen"
|
title: "Gratulerer med dagen"
|
||||||
|
description: "Du logget inn på bursdagen din"
|
||||||
|
_loggedInOnNewYearsDay:
|
||||||
|
title: "Godt nytt år"
|
||||||
|
description: "Du logget inn på årets første dag"
|
||||||
|
_cookieClicked:
|
||||||
|
description: "Du klikket på kjeksen"
|
||||||
|
flavor: "Er du på riktig nettsted?"
|
||||||
|
_brainDiver:
|
||||||
|
title: "Brain Diver"
|
||||||
|
flavor: "Misskey-Misskey La-Tu-Ma"
|
||||||
_role:
|
_role:
|
||||||
options: "Alternativ"
|
options: "Alternativ"
|
||||||
_priority:
|
_priority:
|
||||||
@@ -311,6 +549,9 @@ _ad:
|
|||||||
_gallery:
|
_gallery:
|
||||||
like: "Liker!"
|
like: "Liker!"
|
||||||
unlike: "Liker ikke"
|
unlike: "Liker ikke"
|
||||||
|
_email:
|
||||||
|
_follow:
|
||||||
|
title: "fulgte deg"
|
||||||
_preferencesBackups:
|
_preferencesBackups:
|
||||||
saveNew: "Lagre som ny"
|
saveNew: "Lagre som ny"
|
||||||
cannotSave: "Kunne ikke lagre"
|
cannotSave: "Kunne ikke lagre"
|
||||||
@@ -318,6 +559,7 @@ _registry:
|
|||||||
key: "Nøkkel"
|
key: "Nøkkel"
|
||||||
keys: "Nøkler"
|
keys: "Nøkler"
|
||||||
_aboutMisskey:
|
_aboutMisskey:
|
||||||
|
about: "Misskey er programvare med åpen kildekode som har blitt utviklet av syuilo siden 2014."
|
||||||
translation: "Oversett Misskey"
|
translation: "Oversett Misskey"
|
||||||
_instanceTicker:
|
_instanceTicker:
|
||||||
none: "Ikke vis"
|
none: "Ikke vis"
|
||||||
@@ -328,6 +570,8 @@ _channel:
|
|||||||
featured: "Populært"
|
featured: "Populært"
|
||||||
following: "Følger"
|
following: "Følger"
|
||||||
nameAndDescription: "Navn og beskrivelse"
|
nameAndDescription: "Navn og beskrivelse"
|
||||||
|
_menuDisplay:
|
||||||
|
hide: "Skjul"
|
||||||
_wordMute:
|
_wordMute:
|
||||||
soft: "Myk"
|
soft: "Myk"
|
||||||
hard: "Hard"
|
hard: "Hard"
|
||||||
@@ -337,15 +581,17 @@ _theme:
|
|||||||
key: "Nøkkel"
|
key: "Nøkkel"
|
||||||
keys:
|
keys:
|
||||||
link: "Lenke"
|
link: "Lenke"
|
||||||
|
renote: "Renote"
|
||||||
_sfx:
|
_sfx:
|
||||||
|
note: "Notes"
|
||||||
notification: "Varsler"
|
notification: "Varsler"
|
||||||
_ago:
|
_ago:
|
||||||
future: "Fremitid"
|
future: "Fremitid"
|
||||||
justNow: "Akkurat nå"
|
justNow: "Akkurat nå"
|
||||||
secondsAgo: "{n} sekunder siden"
|
secondsAgo: "{n}s siden"
|
||||||
minutesAgo: "{n} minutter siden"
|
minutesAgo: "{n}m siden"
|
||||||
hoursAgo: "{n} timer siden"
|
hoursAgo: "{n}t siden"
|
||||||
daysAgo: "{n} dager siden"
|
daysAgo: "{n}d siden"
|
||||||
weeksAgo: "{n} uker siden"
|
weeksAgo: "{n} uker siden"
|
||||||
monthsAgo: "{n} måneder siden"
|
monthsAgo: "{n} måneder siden"
|
||||||
yearsAgo: "{n} år siden"
|
yearsAgo: "{n} år siden"
|
||||||
@@ -355,6 +601,9 @@ _time:
|
|||||||
minute: "Minutter"
|
minute: "Minutter"
|
||||||
hour: "Timer"
|
hour: "Timer"
|
||||||
day: "Dager"
|
day: "Dager"
|
||||||
|
_timelineTutorial:
|
||||||
|
title: "Hvordan bruke Misskey"
|
||||||
|
step2_2: "Hva med å skrive en selvpresentasjon, eller bare \"Hei {name}!\" hvis du ikke har lyst?"
|
||||||
_2fa:
|
_2fa:
|
||||||
renewTOTPCancel: "Avbryt"
|
renewTOTPCancel: "Avbryt"
|
||||||
_weekday:
|
_weekday:
|
||||||
@@ -367,21 +616,29 @@ _weekday:
|
|||||||
saturday: "Lørdag"
|
saturday: "Lørdag"
|
||||||
_widgets:
|
_widgets:
|
||||||
profile: "Profil"
|
profile: "Profil"
|
||||||
|
instanceInfo: "Serverinformasjon"
|
||||||
notifications: "Varsler"
|
notifications: "Varsler"
|
||||||
timeline: "Tidslinje"
|
timeline: "Tidslinje"
|
||||||
calendar: "Kalender"
|
calendar: "Kalender"
|
||||||
trends: "Populært"
|
trends: "Populært"
|
||||||
clock: "Klokke"
|
clock: "Klokke"
|
||||||
|
activity: "Aktivitet"
|
||||||
photos: "Bilder"
|
photos: "Bilder"
|
||||||
|
federation: "Føderasjon"
|
||||||
button: "Knapp"
|
button: "Knapp"
|
||||||
|
aiscriptApp: "AiScript App"
|
||||||
userList: "Brukerliste"
|
userList: "Brukerliste"
|
||||||
_userList:
|
_userList:
|
||||||
chooseList: "Velg liste"
|
chooseList: "Velg liste"
|
||||||
_cw:
|
_cw:
|
||||||
|
hide: "Skjul"
|
||||||
show: "Vis mer"
|
show: "Vis mer"
|
||||||
_poll:
|
_poll:
|
||||||
|
noOnlyOneChoice: "Trenger minst to valger."
|
||||||
|
choiceN: "Valg {n}"
|
||||||
noMore: "Du kan ikke legge til flere."
|
noMore: "Du kan ikke legge til flere."
|
||||||
deadlineTime: "Timer"
|
deadlineTime: "Timer"
|
||||||
|
votesCount: "{n} stemmer"
|
||||||
vote: "Stem"
|
vote: "Stem"
|
||||||
showResult: "Vis resultatet"
|
showResult: "Vis resultatet"
|
||||||
voted: "Stemt"
|
voted: "Stemt"
|
||||||
@@ -395,6 +652,7 @@ _postForm:
|
|||||||
_profile:
|
_profile:
|
||||||
name: "Navn"
|
name: "Navn"
|
||||||
username: "Brukernavn"
|
username: "Brukernavn"
|
||||||
|
description: "Biografi"
|
||||||
metadataContent: "Innhold"
|
metadataContent: "Innhold"
|
||||||
_exportOrImport:
|
_exportOrImport:
|
||||||
followingList: "Følg"
|
followingList: "Følg"
|
||||||
@@ -402,6 +660,7 @@ _exportOrImport:
|
|||||||
blockingList: "Blokker"
|
blockingList: "Blokker"
|
||||||
userLists: "Lister"
|
userLists: "Lister"
|
||||||
_charts:
|
_charts:
|
||||||
|
federation: "Føderasjon"
|
||||||
filesIncDec: "Forskjell på antall filer"
|
filesIncDec: "Forskjell på antall filer"
|
||||||
_instanceCharts:
|
_instanceCharts:
|
||||||
users: "Forskjell på antall brukere"
|
users: "Forskjell på antall brukere"
|
||||||
@@ -413,14 +672,18 @@ _play:
|
|||||||
new: "Opprett Play"
|
new: "Opprett Play"
|
||||||
edit: "Rediger Play"
|
edit: "Rediger Play"
|
||||||
featured: "Populært"
|
featured: "Populært"
|
||||||
|
title: "Tittel"
|
||||||
summary: "Beskrivelse"
|
summary: "Beskrivelse"
|
||||||
_pages:
|
_pages:
|
||||||
|
invalidNameText: "Pass på at sidetittelen ikke er tom"
|
||||||
like: "Liker"
|
like: "Liker"
|
||||||
unlike: "Liker ikke"
|
unlike: "Liker ikke"
|
||||||
my: "Mine sider"
|
my: "Mine sider"
|
||||||
featured: "Populært"
|
featured: "Populært"
|
||||||
contents: "Innhold"
|
contents: "Innhold"
|
||||||
|
title: "Tittel"
|
||||||
url: "Side URL"
|
url: "Side URL"
|
||||||
|
hideTitleWhenPinned: "Skjul sidetittel når festet til profil"
|
||||||
fontSerif: "Serif"
|
fontSerif: "Serif"
|
||||||
fontSansSerif: "Sans Serif"
|
fontSansSerif: "Sans Serif"
|
||||||
selectType: "Velg type"
|
selectType: "Velg type"
|
||||||
@@ -430,13 +693,18 @@ _pages:
|
|||||||
image: "Bilde"
|
image: "Bilde"
|
||||||
button: "Knapp"
|
button: "Knapp"
|
||||||
_notification:
|
_notification:
|
||||||
|
youWereFollowed: "fulgte deg"
|
||||||
|
unreadAntennaNote: "Antenne {name}"
|
||||||
|
achievementEarned: "Prestasjon låst opp"
|
||||||
_types:
|
_types:
|
||||||
follow: "Følg"
|
follow: "Nye følgere"
|
||||||
reply: "Svar"
|
reply: "Svar"
|
||||||
quote: "Sitat"
|
renote: "Renotes"
|
||||||
reaction: "Reaksjon"
|
quote: "Sitater"
|
||||||
|
reaction: "Reaksjoner"
|
||||||
_actions:
|
_actions:
|
||||||
reply: "Svar"
|
reply: "Svar"
|
||||||
|
renote: "Renote"
|
||||||
_deck:
|
_deck:
|
||||||
swapLeft: "Flytt til venstre"
|
swapLeft: "Flytt til venstre"
|
||||||
swapRight: "Flytt til høyre"
|
swapRight: "Flytt til høyre"
|
||||||
@@ -448,6 +716,7 @@ _deck:
|
|||||||
_columns:
|
_columns:
|
||||||
notifications: "Varsler"
|
notifications: "Varsler"
|
||||||
tl: "Tidslinje"
|
tl: "Tidslinje"
|
||||||
|
antenna: "Antenner"
|
||||||
list: "Lister"
|
list: "Lister"
|
||||||
channel: "Kanaler"
|
channel: "Kanaler"
|
||||||
direct: "Direkte"
|
direct: "Direkte"
|
||||||
|
|||||||
3
locales/package.json
Normal file
3
locales/package.json
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"type": "module"
|
||||||
|
}
|
||||||
@@ -299,7 +299,6 @@ copyUrl: "Skopiuj adres URL"
|
|||||||
rename: "Zmień nazwę"
|
rename: "Zmień nazwę"
|
||||||
avatar: "Awatar"
|
avatar: "Awatar"
|
||||||
banner: "Baner"
|
banner: "Baner"
|
||||||
nsfw: "NSFW"
|
|
||||||
whenServerDisconnected: "Po utracie połączenia z serwerem"
|
whenServerDisconnected: "Po utracie połączenia z serwerem"
|
||||||
disconnectedFromServer: "Utracono połączenie z serwerem."
|
disconnectedFromServer: "Utracono połączenie z serwerem."
|
||||||
reload: "Odśwież"
|
reload: "Odśwież"
|
||||||
@@ -955,10 +954,6 @@ _aboutMisskey:
|
|||||||
donate: "Przekaż darowiznę na Misskey"
|
donate: "Przekaż darowiznę na Misskey"
|
||||||
morePatrons: "Naprawdę doceniam wsparcie ze strony wielu niewymienionych tu osób. Dziękuję! 🥰"
|
morePatrons: "Naprawdę doceniam wsparcie ze strony wielu niewymienionych tu osób. Dziękuję! 🥰"
|
||||||
patrons: "Wspierający"
|
patrons: "Wspierający"
|
||||||
_nsfw:
|
|
||||||
respect: "Ukrywaj media NSFW"
|
|
||||||
ignore: "Nie ukrywaj mediów NSFW"
|
|
||||||
force: "Ukrywaj wszystkie media"
|
|
||||||
_instanceTicker:
|
_instanceTicker:
|
||||||
none: "Nigdy nie pokazuj"
|
none: "Nigdy nie pokazuj"
|
||||||
remote: "Pokaż dla zdalnych użytkowników"
|
remote: "Pokaż dla zdalnych użytkowników"
|
||||||
|
|||||||
@@ -294,7 +294,6 @@ copyUrl: "Copiar URL"
|
|||||||
rename: "Renomear"
|
rename: "Renomear"
|
||||||
avatar: "Avatar"
|
avatar: "Avatar"
|
||||||
banner: "Capa"
|
banner: "Capa"
|
||||||
nsfw: "Conteúdo sensível"
|
|
||||||
whenServerDisconnected: "Quando a conexão com o servidor é perdida"
|
whenServerDisconnected: "Quando a conexão com o servidor é perdida"
|
||||||
disconnectedFromServer: "Desconectado do servidor"
|
disconnectedFromServer: "Desconectado do servidor"
|
||||||
reload: "Recarregar"
|
reload: "Recarregar"
|
||||||
|
|||||||
@@ -294,7 +294,6 @@ copyUrl: "Copiază URL"
|
|||||||
rename: "Redenumește"
|
rename: "Redenumește"
|
||||||
avatar: "Avatar"
|
avatar: "Avatar"
|
||||||
banner: "Banner"
|
banner: "Banner"
|
||||||
nsfw: "NSFW"
|
|
||||||
whenServerDisconnected: "Când pierzi conexiunea cu serverul"
|
whenServerDisconnected: "Când pierzi conexiunea cu serverul"
|
||||||
disconnectedFromServer: "Conecțiunea cu serverul a fost pierdută"
|
disconnectedFromServer: "Conecțiunea cu serverul a fost pierdută"
|
||||||
reload: "Reîncarcă"
|
reload: "Reîncarcă"
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
_lang_: "Русский"
|
_lang_: "Русский"
|
||||||
headlineMisskey: "Сеть, сплетённая из заметок"
|
headlineMisskey: "Сеть, сплетённая из заметок"
|
||||||
introMisskey: "Добро пожаловать! Misskey — это децентрализованный сервис микроблогов с открытым исходным кодом.\nПишите «заметки» — делитесь со всеми происходящим вокруг или рассказывайте о себе 📡\nСтавьте «реакции» — выражайте свои чувства и эмоции от заметок других 👍\nОткройте для себя новый мир 🚀"
|
introMisskey: "Добро пожаловать! Misskey — это децентрализованный сервис микроблогов с открытым исходным кодом.\nПишите «заметки» — делитесь со всеми происходящим вокруг или рассказывайте о себе 📡\nСтавьте «реакции» — выражайте свои чувства и эмоции от заметок других 👍\nОткройте для себя новый мир 🚀"
|
||||||
poweredByMisskeyDescription: "{name} – один из инстансов (также называемый экземпляром Misskey), использующий платформу с открытым исходным кодом <b>Misskey</b>."
|
poweredByMisskeyDescription: "{name} – сервис на платформе с открытым исходным кодом <b>Misskey</b>, называемый инстансом Misskey."
|
||||||
monthAndDay: "{day}.{month}"
|
monthAndDay: "{day}.{month}"
|
||||||
search: "Поиск"
|
search: "Поиск"
|
||||||
notifications: "Уведомления"
|
notifications: "Уведомления"
|
||||||
@@ -52,6 +52,8 @@ addToList: "Добавить в список"
|
|||||||
sendMessage: "Отправить сообщение"
|
sendMessage: "Отправить сообщение"
|
||||||
copyRSS: "Скопировать RSS"
|
copyRSS: "Скопировать RSS"
|
||||||
copyUsername: "Скопировать имя пользователя"
|
copyUsername: "Скопировать имя пользователя"
|
||||||
|
copyUserId: "Скопировать ID пользователя"
|
||||||
|
copyNoteId: "Скопировать ID заметки"
|
||||||
searchUser: "Поиск людей"
|
searchUser: "Поиск людей"
|
||||||
reply: "Ответить"
|
reply: "Ответить"
|
||||||
loadMore: "Показать еще"
|
loadMore: "Показать еще"
|
||||||
@@ -309,7 +311,6 @@ copyUrl: "Копировать ссылку"
|
|||||||
rename: "Переименовать"
|
rename: "Переименовать"
|
||||||
avatar: "Аватар"
|
avatar: "Аватар"
|
||||||
banner: "Шапка"
|
banner: "Шапка"
|
||||||
nsfw: "Содержимое не для всех"
|
|
||||||
whenServerDisconnected: "Когда соединение с сервером потеряно"
|
whenServerDisconnected: "Когда соединение с сервером потеряно"
|
||||||
disconnectedFromServer: "Разорвано соединение с сервером"
|
disconnectedFromServer: "Разорвано соединение с сервером"
|
||||||
reload: "Перезагрузить"
|
reload: "Перезагрузить"
|
||||||
@@ -560,6 +561,7 @@ accountDeletedDescription: "Эта учетная запись удалена"
|
|||||||
menu: "Меню"
|
menu: "Меню"
|
||||||
divider: "Линия-разделитель"
|
divider: "Линия-разделитель"
|
||||||
addItem: "Добавить элемент"
|
addItem: "Добавить элемент"
|
||||||
|
rearrange: "Сортировать по"
|
||||||
relays: "Ретрансляторы"
|
relays: "Ретрансляторы"
|
||||||
addRelay: "Добавить ретранслятор"
|
addRelay: "Добавить ретранслятор"
|
||||||
inboxUrl: "URL ящика входящих сообщений"
|
inboxUrl: "URL ящика входящих сообщений"
|
||||||
@@ -648,8 +650,8 @@ abuseReported: "Жалоба отправлена. Большое спасибо
|
|||||||
reporter: "Сообщивший"
|
reporter: "Сообщивший"
|
||||||
reporteeOrigin: "О ком сообщено"
|
reporteeOrigin: "О ком сообщено"
|
||||||
reporterOrigin: "Кто сообщил"
|
reporterOrigin: "Кто сообщил"
|
||||||
forwardReport: "Перенаправление отчета на инстант."
|
forwardReport: "Отправить жалобу на инстанс автора."
|
||||||
forwardReportIsAnonymous: "Удаленный инстант не сможет увидеть вашу информацию и будет отображаться как анонимная системная учетная запись."
|
forwardReportIsAnonymous: "Жалоба на удалённый инстанс будет отправлена анонимно. Вместо ваших данных у получателя будет отображена системная учётная запись."
|
||||||
send: "Отправить"
|
send: "Отправить"
|
||||||
abuseMarkAsResolved: "Отметить жалобу как решённую"
|
abuseMarkAsResolved: "Отметить жалобу как решённую"
|
||||||
openInNewTab: "Открыть в новой вкладке"
|
openInNewTab: "Открыть в новой вкладке"
|
||||||
@@ -789,6 +791,7 @@ noMaintainerInformationWarning: "Не заполнены сведения об
|
|||||||
noBotProtectionWarning: "Ботозащита не настроена"
|
noBotProtectionWarning: "Ботозащита не настроена"
|
||||||
configure: "Настроить"
|
configure: "Настроить"
|
||||||
postToGallery: "Опубликовать в галерею"
|
postToGallery: "Опубликовать в галерею"
|
||||||
|
postToHashtag: "Опубликовать пост с этим хештегом"
|
||||||
gallery: "Галерея"
|
gallery: "Галерея"
|
||||||
recentPosts: "Недавние публикации"
|
recentPosts: "Недавние публикации"
|
||||||
popularPosts: "Популярные публикации"
|
popularPosts: "Популярные публикации"
|
||||||
@@ -822,6 +825,7 @@ translatedFrom: "Перевод. Язык оригинала — {x}"
|
|||||||
accountDeletionInProgress: "В настоящее время выполняется удаление учетной записи"
|
accountDeletionInProgress: "В настоящее время выполняется удаление учетной записи"
|
||||||
usernameInfo: "Имя, которое отличает вашу учетную запись от других на этом сервере. Вы можете использовать алфавит (a~z, A~Z), цифры (0~9) или символы подчеркивания (_). Имена пользователей не могут быть изменены позже."
|
usernameInfo: "Имя, которое отличает вашу учетную запись от других на этом сервере. Вы можете использовать алфавит (a~z, A~Z), цифры (0~9) или символы подчеркивания (_). Имена пользователей не могут быть изменены позже."
|
||||||
aiChanMode: "Режим Ай"
|
aiChanMode: "Режим Ай"
|
||||||
|
devMode: "Режим разработчика"
|
||||||
keepCw: "Сохраняйте Предупреждения о содержимом"
|
keepCw: "Сохраняйте Предупреждения о содержимом"
|
||||||
pubSub: "Учётные записи Pub/Sub"
|
pubSub: "Учётные записи Pub/Sub"
|
||||||
lastCommunication: "Последнее сообщение"
|
lastCommunication: "Последнее сообщение"
|
||||||
@@ -913,8 +917,8 @@ cannotUploadBecauseInappropriate: "Файл не может быть загру
|
|||||||
cannotUploadBecauseNoFreeSpace: "Файл не может быть загружен, так как не осталось места на диске"
|
cannotUploadBecauseNoFreeSpace: "Файл не может быть загружен, так как не осталось места на диске"
|
||||||
cannotUploadBecauseExceedsFileSizeLimit: "Файл не может быть загружен, так как он превышает лимит размера файла."
|
cannotUploadBecauseExceedsFileSizeLimit: "Файл не может быть загружен, так как он превышает лимит размера файла."
|
||||||
beta: "Бета"
|
beta: "Бета"
|
||||||
enableAutoSensitive: "Автоматическое определение NSFW"
|
enableAutoSensitive: "Автоматическое определение содержимого не для всех"
|
||||||
enableAutoSensitiveDescription: "Если доступно, используйте машинное обучение для автоматической установки флага NSFW на носителе. Даже если эта функция отключена, она может быть установлена автоматически в зависимости от инстанта."
|
enableAutoSensitiveDescription: "Позволяет определять наличие содержимого не для всех при помощи искусственного интеллекта там, где это возможно. Даже если эту опцию отключить, она всё равно может быть включена на весь инстанс."
|
||||||
activeEmailValidationDescription: "Если включено, будет проводиться более строгая проверка адреса электронной почты, в том числе на то, что он действительный и не временный. Если же отключено, то проверяется только корректность написания адреса."
|
activeEmailValidationDescription: "Если включено, будет проводиться более строгая проверка адреса электронной почты, в том числе на то, что он действительный и не временный. Если же отключено, то проверяется только корректность написания адреса."
|
||||||
navbar: "Панель навигации"
|
navbar: "Панель навигации"
|
||||||
shuffle: "Перемешать"
|
shuffle: "Перемешать"
|
||||||
@@ -989,6 +993,7 @@ rolesAssignedToMe: "Мои роли"
|
|||||||
resetPasswordConfirm: "Сбросить пароль?"
|
resetPasswordConfirm: "Сбросить пароль?"
|
||||||
sensitiveWords: "Чувствительные слова"
|
sensitiveWords: "Чувствительные слова"
|
||||||
sensitiveWordsDescription: "Установите общедоступный диапазон заметки, содержащей заданное слово, на домашний. Можно сделать несколько настроек, разделив их переносами строк."
|
sensitiveWordsDescription: "Установите общедоступный диапазон заметки, содержащей заданное слово, на домашний. Можно сделать несколько настроек, разделив их переносами строк."
|
||||||
|
sensitiveWordsDescription2: "Разделение пробелом создаёт спецификацию AND, а разделение косой чертой создаёт регулярное выражение."
|
||||||
notesSearchNotAvailable: "Поиск заметок недоступен"
|
notesSearchNotAvailable: "Поиск заметок недоступен"
|
||||||
license: "Лицензия"
|
license: "Лицензия"
|
||||||
unfavoriteConfirm: "Удалить избранное?"
|
unfavoriteConfirm: "Удалить избранное?"
|
||||||
@@ -1004,8 +1009,10 @@ noteIdOrUrl: "ID или ссылка на заметку"
|
|||||||
video: "Видео"
|
video: "Видео"
|
||||||
videos: "Видео"
|
videos: "Видео"
|
||||||
dataSaver: "Экономия трафика"
|
dataSaver: "Экономия трафика"
|
||||||
|
renotesList: "Репосты"
|
||||||
horizontal: "Сбоку"
|
horizontal: "Сбоку"
|
||||||
youFollowing: "Подписки"
|
youFollowing: "Подписки"
|
||||||
|
options: "Настройки ролей"
|
||||||
_achievements:
|
_achievements:
|
||||||
earnedAt: "Разблокировано в"
|
earnedAt: "Разблокировано в"
|
||||||
_types:
|
_types:
|
||||||
@@ -1177,6 +1184,9 @@ _achievements:
|
|||||||
_client30min:
|
_client30min:
|
||||||
title: "Перерыв на обед"
|
title: "Перерыв на обед"
|
||||||
description: "Прошло 30 минут с момента запуска клиента"
|
description: "Прошло 30 минут с момента запуска клиента"
|
||||||
|
_client60min:
|
||||||
|
title: "Не наглядеться на Misskey"
|
||||||
|
description: "Misskey был открыт 60 минут подряд"
|
||||||
_noteDeletedWithin1min:
|
_noteDeletedWithin1min:
|
||||||
title: "Ой, нет!"
|
title: "Ой, нет!"
|
||||||
description: "Заметка удалена через минуту после публикации"
|
description: "Заметка удалена через минуту после публикации"
|
||||||
@@ -1279,6 +1289,7 @@ _role:
|
|||||||
canInvite: "Может создавать пригласительные коды"
|
canInvite: "Может создавать пригласительные коды"
|
||||||
canManageCustomEmojis: "Управлять пользовательскими эмодзи"
|
canManageCustomEmojis: "Управлять пользовательскими эмодзи"
|
||||||
driveCapacity: "Доступное пространство на «диске»"
|
driveCapacity: "Доступное пространство на «диске»"
|
||||||
|
alwaysMarkNsfw: "Всегда отмечать файлы как «не для всех»"
|
||||||
pinMax: "Доступное количество закреплённых заметок"
|
pinMax: "Доступное количество закреплённых заметок"
|
||||||
antennaMax: "Доступное количество антенн"
|
antennaMax: "Доступное количество антенн"
|
||||||
wordMuteMax: "Доступное количество знаков в списке скрытия слов"
|
wordMuteMax: "Доступное количество знаков в списке скрытия слов"
|
||||||
@@ -1306,7 +1317,7 @@ _sensitiveMediaDetection:
|
|||||||
description: "Машинное обучение может быть использовано для автоматического обнаружения чувствительных медиа для модерации. Нагрузка на сервер увеличивается незначительно."
|
description: "Машинное обучение может быть использовано для автоматического обнаружения чувствительных медиа для модерации. Нагрузка на сервер увеличивается незначительно."
|
||||||
sensitivity: "Чувствительность обнаружения"
|
sensitivity: "Чувствительность обнаружения"
|
||||||
sensitivityDescription: "Более низкая чувствительность уменьшает количество ложных срабатываний (false positives). Повышение чувствительности уменьшает утечку при обнаружении (ложноотрицательные результаты)."
|
sensitivityDescription: "Более низкая чувствительность уменьшает количество ложных срабатываний (false positives). Повышение чувствительности уменьшает утечку при обнаружении (ложноотрицательные результаты)."
|
||||||
setSensitiveFlagAutomatically: "Установить флаг NSFW"
|
setSensitiveFlagAutomatically: "Обозначить как не для всех"
|
||||||
setSensitiveFlagAutomaticallyDescription: "Даже если этот параметр отключен, результат оценки сохраняется внутри системы."
|
setSensitiveFlagAutomaticallyDescription: "Даже если этот параметр отключен, результат оценки сохраняется внутри системы."
|
||||||
analyzeVideos: "Анализировать видео?"
|
analyzeVideos: "Анализировать видео?"
|
||||||
analyzeVideosDescription: "Анализируйте видео в дополнение к неподвижным изображениям. Нагрузка на сервер немного увеличивается."
|
analyzeVideosDescription: "Анализируйте видео в дополнение к неподвижным изображениям. Нагрузка на сервер немного увеличивается."
|
||||||
@@ -1386,10 +1397,6 @@ _aboutMisskey:
|
|||||||
donate: "Пожертвование на Misskey"
|
donate: "Пожертвование на Misskey"
|
||||||
morePatrons: "Большое спасибо и многим другим, кто принял участие в этом проекте! 🥰"
|
morePatrons: "Большое спасибо и многим другим, кто принял участие в этом проекте! 🥰"
|
||||||
patrons: "Материальная поддержка"
|
patrons: "Материальная поддержка"
|
||||||
_nsfw:
|
|
||||||
respect: "Скрывать содержимое не для всех"
|
|
||||||
ignore: "Показывать содержимое не для всех"
|
|
||||||
force: "Скрывать вообще все файлы"
|
|
||||||
_instanceTicker:
|
_instanceTicker:
|
||||||
none: "Не показывать"
|
none: "Не показывать"
|
||||||
remote: "Только для других сайтов"
|
remote: "Только для других сайтов"
|
||||||
@@ -1525,6 +1532,16 @@ _time:
|
|||||||
minute: "мин"
|
minute: "мин"
|
||||||
hour: "ч"
|
hour: "ч"
|
||||||
day: "сут"
|
day: "сут"
|
||||||
|
_timelineTutorial:
|
||||||
|
title: "Как пользоваться Misskey"
|
||||||
|
step1_1: "Это лицо Misskey, так называемая лента. Ваш инстанс, {name}, покажет тут все опубликованные на нём заметки в хронологическом порядке."
|
||||||
|
step1_2: "Здесь есть несколько лент. К примеру «персональная» лента отображает заметки тех, на кого вы подписаны. А «местная» — заметки тех, кого приютил {name}."
|
||||||
|
step2_1: "Что ж, теперь самое время опубликовать заметку. Если нажать вверху страницы на изображение карандаша, появится форма для текста."
|
||||||
|
step2_2: "Почему бы не написать немного о себе? Ну, или хотя бы «Привет, {name}»?"
|
||||||
|
step3_1: "Справились с первой заметкой?"
|
||||||
|
step3_2: "Отлично, теперь она должна появиться в вашей ленте."
|
||||||
|
step4_1: "А ещё здесь можно делиться своими реакциями на заметки."
|
||||||
|
step4_2: "Отмечайте реакции, нажимая на символ «+» под заметкой и выбирая значок по душе."
|
||||||
_2fa:
|
_2fa:
|
||||||
alreadyRegistered: "Двухфакторная аутентификация уже настроена."
|
alreadyRegistered: "Двухфакторная аутентификация уже настроена."
|
||||||
registerTOTP: "Начните настраивать приложение-аутентификатор"
|
registerTOTP: "Начните настраивать приложение-аутентификатор"
|
||||||
@@ -1865,6 +1882,9 @@ _deck:
|
|||||||
_dialog:
|
_dialog:
|
||||||
charactersExceeded: "Превышено максимальное количество символов! У вас {current} / из {max}"
|
charactersExceeded: "Превышено максимальное количество символов! У вас {current} / из {max}"
|
||||||
charactersBelow: "Это ниже минимального количества символов! У вас {current} / из {min}"
|
charactersBelow: "Это ниже минимального количества символов! У вас {current} / из {min}"
|
||||||
|
_disabledTimeline:
|
||||||
|
title: "Лента отключена"
|
||||||
|
description: "Ваша текущая роль не позволяет пользоваться этой лентой."
|
||||||
_webhookSettings:
|
_webhookSettings:
|
||||||
name: "Название"
|
name: "Название"
|
||||||
active: "Вкл."
|
active: "Вкл."
|
||||||
|
|||||||
@@ -303,7 +303,6 @@ copyUrl: "Kopírovať URL"
|
|||||||
rename: "Premenovať"
|
rename: "Premenovať"
|
||||||
avatar: "Avatar"
|
avatar: "Avatar"
|
||||||
banner: "BAnner"
|
banner: "BAnner"
|
||||||
nsfw: "NSFW"
|
|
||||||
whenServerDisconnected: "Keď sa stratí spojenie so serverom"
|
whenServerDisconnected: "Keď sa stratí spojenie so serverom"
|
||||||
disconnectedFromServer: "Spojenie so serverom bolo prerušené"
|
disconnectedFromServer: "Spojenie so serverom bolo prerušené"
|
||||||
reload: "Obnoviť"
|
reload: "Obnoviť"
|
||||||
@@ -1009,10 +1008,6 @@ _aboutMisskey:
|
|||||||
donate: "Podporiť Misskey"
|
donate: "Podporiť Misskey"
|
||||||
morePatrons: "Takisto oceňujeme podporu mnoých ďalších, ktorí tu nie sú uvedení. Ďakujeme! 🥰"
|
morePatrons: "Takisto oceňujeme podporu mnoých ďalších, ktorí tu nie sú uvedení. Ďakujeme! 🥰"
|
||||||
patrons: "Prispievatelia"
|
patrons: "Prispievatelia"
|
||||||
_nsfw:
|
|
||||||
respect: "Skryť NSFW médiá"
|
|
||||||
ignore: "Neskrývať NSFW médiá"
|
|
||||||
force: "Skryť všetky médiá"
|
|
||||||
_instanceTicker:
|
_instanceTicker:
|
||||||
none: "Nikdy nezobrazovať"
|
none: "Nikdy nezobrazovať"
|
||||||
remote: "Zobraziť pre vzdialených používateľov"
|
remote: "Zobraziť pre vzdialených používateľov"
|
||||||
|
|||||||
@@ -51,6 +51,8 @@ addToList: "Lägg till i lista"
|
|||||||
sendMessage: "Skicka ett meddelande"
|
sendMessage: "Skicka ett meddelande"
|
||||||
copyRSS: "Kopiera RSS"
|
copyRSS: "Kopiera RSS"
|
||||||
copyUsername: "Kopiera användarnamn"
|
copyUsername: "Kopiera användarnamn"
|
||||||
|
copyUserId: "Kopiera användar-ID"
|
||||||
|
copyNoteId: "Kopiera noter-ID"
|
||||||
searchUser: "Sök användare"
|
searchUser: "Sök användare"
|
||||||
reply: "Svara"
|
reply: "Svara"
|
||||||
loadMore: "Ladda mer"
|
loadMore: "Ladda mer"
|
||||||
@@ -103,6 +105,7 @@ renoted: "Omnoterad."
|
|||||||
cantRenote: "Inlägget kunde inte bli omnoterat."
|
cantRenote: "Inlägget kunde inte bli omnoterat."
|
||||||
cantReRenote: "En omnotering kan inte bli omnoterad."
|
cantReRenote: "En omnotering kan inte bli omnoterad."
|
||||||
quote: "Citat"
|
quote: "Citat"
|
||||||
|
inChannelRenote: "Omnotera inom kanalen"
|
||||||
pinnedNote: "Fästad not"
|
pinnedNote: "Fästad not"
|
||||||
pinned: "Fäst till profil"
|
pinned: "Fäst till profil"
|
||||||
you: "Du"
|
you: "Du"
|
||||||
@@ -129,7 +132,10 @@ unblockConfirm: "Är du säkert att du vill avblockera kontot?"
|
|||||||
suspendConfirm: "Är du säker att du vill suspendera detta konto?"
|
suspendConfirm: "Är du säker att du vill suspendera detta konto?"
|
||||||
unsuspendConfirm: "Är du säker att du vill avsuspendera detta konto?"
|
unsuspendConfirm: "Är du säker att du vill avsuspendera detta konto?"
|
||||||
selectList: "Välj lista"
|
selectList: "Välj lista"
|
||||||
|
editList: "Redigera lista"
|
||||||
|
selectChannel: "Välj en kanal"
|
||||||
selectAntenna: "Välj en antenn"
|
selectAntenna: "Välj en antenn"
|
||||||
|
editAntenna: "Redigera en antenn"
|
||||||
selectWidget: "Välj en widget"
|
selectWidget: "Välj en widget"
|
||||||
editWidgets: "Redigera widgets"
|
editWidgets: "Redigera widgets"
|
||||||
editWidgetsExit: "Avsluta redigering"
|
editWidgetsExit: "Avsluta redigering"
|
||||||
@@ -256,6 +262,9 @@ noMoreHistory: "Det finns ingen mer historik"
|
|||||||
startMessaging: "Starta en chatt"
|
startMessaging: "Starta en chatt"
|
||||||
nUsersRead: "läst av {n}"
|
nUsersRead: "läst av {n}"
|
||||||
agreeTo: "Jag accepterar {0}"
|
agreeTo: "Jag accepterar {0}"
|
||||||
|
agree: "Överens"
|
||||||
|
termsOfService: "Användarvillkor"
|
||||||
|
start: "Kom igång"
|
||||||
home: "Hem"
|
home: "Hem"
|
||||||
remoteUserCaution: "Då denna användaren kommer från en fjärrinstans, kan informationen visad vara ofullständig."
|
remoteUserCaution: "Då denna användaren kommer från en fjärrinstans, kan informationen visad vara ofullständig."
|
||||||
activity: "Aktivitet"
|
activity: "Aktivitet"
|
||||||
@@ -297,7 +306,6 @@ copyUrl: "Kopiera URL"
|
|||||||
rename: "Byt namn"
|
rename: "Byt namn"
|
||||||
avatar: "Profilbild"
|
avatar: "Profilbild"
|
||||||
banner: "Banner"
|
banner: "Banner"
|
||||||
nsfw: "Känsligt innehåll"
|
|
||||||
reload: "Ladda om"
|
reload: "Ladda om"
|
||||||
doNothing: "Ignorera"
|
doNothing: "Ignorera"
|
||||||
reloadConfirm: "Vill du ladda om tidslinjen?"
|
reloadConfirm: "Vill du ladda om tidslinjen?"
|
||||||
@@ -320,16 +328,22 @@ connectService: "Anslut"
|
|||||||
disconnectService: "Koppla från"
|
disconnectService: "Koppla från"
|
||||||
enableLocalTimeline: "Aktivera lokal tidslinje"
|
enableLocalTimeline: "Aktivera lokal tidslinje"
|
||||||
enableGlobalTimeline: "Aktivera global tidslinje"
|
enableGlobalTimeline: "Aktivera global tidslinje"
|
||||||
|
registration: "Registrera"
|
||||||
enableRegistration: "Aktivera registrering av nya användare"
|
enableRegistration: "Aktivera registrering av nya användare"
|
||||||
|
invite: "Inbjudan"
|
||||||
inMb: "I megabyte"
|
inMb: "I megabyte"
|
||||||
iconUrl: "URL till profilbilden"
|
iconUrl: "URL till profilbilden"
|
||||||
bannerUrl: "URL till banner-bilden"
|
bannerUrl: "URL till banner-bilden"
|
||||||
pinnedNotes: "Fästad not"
|
pinnedNotes: "Fästad not"
|
||||||
|
hcaptcha: "hCaptcha"
|
||||||
enableHcaptcha: "Aktivera hCaptcha"
|
enableHcaptcha: "Aktivera hCaptcha"
|
||||||
|
hcaptchaSiteKey: "Webbplatsnyckel"
|
||||||
|
recaptcha: "reCAPTCHA"
|
||||||
enableRecaptcha: "Aktivera reCAPTCHA"
|
enableRecaptcha: "Aktivera reCAPTCHA"
|
||||||
enableTurnstile: "Aktivera Turnstile"
|
enableTurnstile: "Aktivera Turnstile"
|
||||||
antennas: "Antenner"
|
antennas: "Antenner"
|
||||||
manageAntennas: "Hantera Antenner"
|
manageAntennas: "Hantera Antenner"
|
||||||
|
name: "Namn"
|
||||||
antennaSource: "Antennkälla"
|
antennaSource: "Antennkälla"
|
||||||
antennaKeywords: "Nyckelord att lyssna efter"
|
antennaKeywords: "Nyckelord att lyssna efter"
|
||||||
antennaExcludeKeywords: "Nyckelord att exkludera"
|
antennaExcludeKeywords: "Nyckelord att exkludera"
|
||||||
@@ -338,9 +352,14 @@ notifyAntenna: "Notifiera om nya noter"
|
|||||||
withFileAntenna: "Endast noter med filer"
|
withFileAntenna: "Endast noter med filer"
|
||||||
enableServiceworker: "Aktivera pushnotiser i denna webbläsaren"
|
enableServiceworker: "Aktivera pushnotiser i denna webbläsaren"
|
||||||
antennaUsersDescription: "Ange ett användarnamn per linje"
|
antennaUsersDescription: "Ange ett användarnamn per linje"
|
||||||
|
notesAndReplies: "Inlägg och svar"
|
||||||
|
silence: "Tystnad"
|
||||||
recentlyUpdatedUsers: "Nyligen aktiva användare"
|
recentlyUpdatedUsers: "Nyligen aktiva användare"
|
||||||
recentlyRegisteredUsers: "Nyligen registrerade användare"
|
recentlyRegisteredUsers: "Nyligen registrerade användare"
|
||||||
|
exploreFediverse: "Utforska Fediverse"
|
||||||
|
popularTags: "Populära taggar"
|
||||||
userList: "Listor"
|
userList: "Listor"
|
||||||
|
about: "Om"
|
||||||
aboutMisskey: "Om Misskey"
|
aboutMisskey: "Om Misskey"
|
||||||
administrator: "Administratör"
|
administrator: "Administratör"
|
||||||
passwordLessLogin: "Lösenordsfri inloggning"
|
passwordLessLogin: "Lösenordsfri inloggning"
|
||||||
@@ -348,29 +367,90 @@ passwordLessLoginDescription: "Tillåter lösenordsfri inloggning med endast en
|
|||||||
resetPassword: "Återställ Lösenord"
|
resetPassword: "Återställ Lösenord"
|
||||||
newPasswordIs: "Det nya lösenordet är \"{password}\""
|
newPasswordIs: "Det nya lösenordet är \"{password}\""
|
||||||
share: "Dela"
|
share: "Dela"
|
||||||
|
help: "Hjälp"
|
||||||
|
close: "Stäng"
|
||||||
|
invites: "Inbjudan"
|
||||||
|
members: "Medlemmar"
|
||||||
|
text: "Text"
|
||||||
enable: "Aktivera"
|
enable: "Aktivera"
|
||||||
|
next: "Nästa"
|
||||||
|
invitations: "Inbjudan"
|
||||||
weakPassword: "Svagt Lösenord"
|
weakPassword: "Svagt Lösenord"
|
||||||
normalPassword: "Medel Lösenord"
|
normalPassword: "Medel Lösenord"
|
||||||
strongPassword: "Starkt Lösenord"
|
strongPassword: "Starkt Lösenord"
|
||||||
signinFailed: "Kan inte logga in. Det angivna användarnamnet eller lösenordet är felaktigt."
|
signinFailed: "Kan inte logga in. Det angivna användarnamnet eller lösenordet är felaktigt."
|
||||||
|
or: "eller"
|
||||||
|
language: "Språk"
|
||||||
|
aboutX: "Om {x}"
|
||||||
|
category: "Kategori"
|
||||||
|
tags: "Taggar"
|
||||||
|
createAccount: "Skapa ett konto"
|
||||||
|
existingAccount: "Existerande konto"
|
||||||
|
regenerate: "Regenerera"
|
||||||
|
fontSize: "Textstorlek"
|
||||||
|
openImageInNewTab: "Öppna bild i ny flik"
|
||||||
|
clientSettings: "Klientinställningar"
|
||||||
|
accountSettings: "Kontoinställningar"
|
||||||
|
numberOfDays: "Antal dagar"
|
||||||
|
deleteAll: "Radera alla"
|
||||||
|
sounds: "Ljud"
|
||||||
|
sound: "Ljud"
|
||||||
|
listen: "Lyssna"
|
||||||
|
none: "Ingen"
|
||||||
|
volume: "Volym"
|
||||||
|
chooseEmoji: "Välj en emoji"
|
||||||
|
recentUsed: "Senast använd"
|
||||||
|
install: "Installera"
|
||||||
|
uninstall: "Avinstallera"
|
||||||
|
menu: "Meny"
|
||||||
serviceworkerInfo: "Måste vara aktiverad för pushnotiser."
|
serviceworkerInfo: "Måste vara aktiverad för pushnotiser."
|
||||||
enableInfiniteScroll: "Ladda mer automatiskt"
|
enableInfiniteScroll: "Ladda mer automatiskt"
|
||||||
enablePlayer: "Öppna videospelare"
|
enablePlayer: "Öppna videospelare"
|
||||||
|
permission: "Behörigheter"
|
||||||
enableAll: "Aktivera alla"
|
enableAll: "Aktivera alla"
|
||||||
|
edit: "Ändra"
|
||||||
enableEmail: "Aktivera epost-utskick"
|
enableEmail: "Aktivera epost-utskick"
|
||||||
|
email: "E-post"
|
||||||
smtpHost: "Värd"
|
smtpHost: "Värd"
|
||||||
smtpUser: "Användarnamn"
|
smtpUser: "Användarnamn"
|
||||||
smtpPass: "Lösenord"
|
smtpPass: "Lösenord"
|
||||||
emptyToDisableSmtpAuth: "Lämna användarnamn och lösenord tomt för att avaktivera SMTP verifiering"
|
emptyToDisableSmtpAuth: "Lämna användarnamn och lösenord tomt för att avaktivera SMTP verifiering"
|
||||||
|
logs: "Logg"
|
||||||
|
channel: "kanal"
|
||||||
|
create: "Skapa"
|
||||||
|
other: "Mer"
|
||||||
|
send: "Skicka"
|
||||||
|
openInNewTab: "Öppna i ny flik"
|
||||||
|
createNew: "Skapa ny"
|
||||||
|
i18nInfo: "Misskey översätts till många olika språk av volontärer. Du kan hjälpa till med översättningen på {link}."
|
||||||
|
accountInfo: "Kontoinformation"
|
||||||
|
clips: "Klipp"
|
||||||
|
duplicate: "Duplicera"
|
||||||
|
reloadToApplySetting: "Inställningen tillämpas efter sidan laddas om. Vill du göra det nu?"
|
||||||
clearCache: "Rensa cache"
|
clearCache: "Rensa cache"
|
||||||
onlineUsersCount: "{n} användare är online"
|
onlineUsersCount: "{n} användare är online"
|
||||||
|
nNotes: "{n} Noter"
|
||||||
|
backgroundColor: "Bakgrundsbild"
|
||||||
|
textColor: "Text"
|
||||||
|
youAreRunningUpToDateClient: "Klienten du använder är uppdaterat."
|
||||||
|
newVersionOfClientAvailable: "Ny version av klienten är tillgänglig."
|
||||||
|
publish: "Publicera"
|
||||||
|
typingUsers: "{users} skriver"
|
||||||
|
info: "Om"
|
||||||
enabled: "Aktiverad"
|
enabled: "Aktiverad"
|
||||||
user: "Användare"
|
user: "Användare"
|
||||||
|
customCssWarn: "Den här inställningen borde bara ändrats av en som har rätta kunskaper. Om du ställer in det här fel så kan klienten sluta fungera rätt."
|
||||||
global: "Global"
|
global: "Global"
|
||||||
squareAvatars: "Visa fyrkantiga profilbilder"
|
squareAvatars: "Visa fyrkantiga profilbilder"
|
||||||
|
sent: "Skicka"
|
||||||
|
misskeyUpdated: "Misskey har uppdaterats!"
|
||||||
incorrectPassword: "Fel lösenord."
|
incorrectPassword: "Fel lösenord."
|
||||||
|
welcomeBackWithName: "Välkommen tillbaka, {name}"
|
||||||
|
clickToFinishEmailVerification: "Tryck på [{ok}] för att slutföra bekräftelsen på e-postadressen."
|
||||||
searchByGoogle: "Sök"
|
searchByGoogle: "Sök"
|
||||||
file: "Filer"
|
file: "Filer"
|
||||||
|
cannotUploadBecauseNoFreeSpace: "Kan inte ladda upp filen för att det finns inget lagringsutrymme kvar."
|
||||||
|
cannotUploadBecauseExceedsFileSizeLimit: "Kan inte ladda upp filen för att den är större än filstorleksgränsen."
|
||||||
enableAutoSensitive: "Automatisk NSFW markering"
|
enableAutoSensitive: "Automatisk NSFW markering"
|
||||||
enableAutoSensitiveDescription: "Tillåter automatiskt detektering och marketing av NSFW media genom Maskininlärning när möjligt. Även om denna inställningen är avaktiverad, kan det vara aktiverat på hela instansen."
|
enableAutoSensitiveDescription: "Tillåter automatiskt detektering och marketing av NSFW media genom Maskininlärning när möjligt. Även om denna inställningen är avaktiverad, kan det vara aktiverat på hela instansen."
|
||||||
pushNotification: "Pushnotiser"
|
pushNotification: "Pushnotiser"
|
||||||
@@ -381,12 +461,15 @@ pushNotificationNotSupported: "Din webbläsare eller instans har inte stöd för
|
|||||||
windowMaximize: "Maximera"
|
windowMaximize: "Maximera"
|
||||||
windowMinimize: "Minimera"
|
windowMinimize: "Minimera"
|
||||||
windowRestore: "Återställ"
|
windowRestore: "Återställ"
|
||||||
|
pleaseDonate: "Misskey är en gratis programvara som används på {host}. Donera gärna för att göra utvecklingen ständigt, tack!"
|
||||||
resetPasswordConfirm: "Återställ verkligen ditt lösenord?"
|
resetPasswordConfirm: "Återställ verkligen ditt lösenord?"
|
||||||
_achievements:
|
_achievements:
|
||||||
_types:
|
_types:
|
||||||
_open3windows:
|
_open3windows:
|
||||||
title: "Flera Fönster"
|
title: "Flera Fönster"
|
||||||
description: "Ha minst 3 fönster öppna samtidigt"
|
description: "Ha minst 3 fönster öppna samtidigt"
|
||||||
|
_ffVisibility:
|
||||||
|
public: "Publicera"
|
||||||
_email:
|
_email:
|
||||||
_follow:
|
_follow:
|
||||||
title: "följde dig"
|
title: "följde dig"
|
||||||
@@ -426,6 +509,7 @@ _visibility:
|
|||||||
home: "Hem"
|
home: "Hem"
|
||||||
followers: "Följare"
|
followers: "Följare"
|
||||||
_profile:
|
_profile:
|
||||||
|
name: "Namn"
|
||||||
username: "Användarnamn"
|
username: "Användarnamn"
|
||||||
changeAvatar: "Ändra profilbild"
|
changeAvatar: "Ändra profilbild"
|
||||||
changeBanner: "Ändra banner"
|
changeBanner: "Ändra banner"
|
||||||
@@ -461,6 +545,8 @@ _deck:
|
|||||||
tl: "Tidslinje"
|
tl: "Tidslinje"
|
||||||
antenna: "Antenner"
|
antenna: "Antenner"
|
||||||
list: "Listor"
|
list: "Listor"
|
||||||
|
channel: "kanal"
|
||||||
mentions: "Omnämningar"
|
mentions: "Omnämningar"
|
||||||
_webhookSettings:
|
_webhookSettings:
|
||||||
|
name: "Namn"
|
||||||
active: "Aktiverad"
|
active: "Aktiverad"
|
||||||
|
|||||||
@@ -52,6 +52,8 @@ addToList: "เพิ่มในลิสต์"
|
|||||||
sendMessage: "ส่งข้อความ"
|
sendMessage: "ส่งข้อความ"
|
||||||
copyRSS: "คัดลอก RSS"
|
copyRSS: "คัดลอก RSS"
|
||||||
copyUsername: "คัดลอกชื่อผู้ใช้"
|
copyUsername: "คัดลอกชื่อผู้ใช้"
|
||||||
|
copyUserId: "คัดลอก ID ผู้ใช้"
|
||||||
|
copyNoteId: "คัดลอก ID โน้ต "
|
||||||
searchUser: "ค้นหาผู้ใช้งาน"
|
searchUser: "ค้นหาผู้ใช้งาน"
|
||||||
reply: "ตอบกลับ"
|
reply: "ตอบกลับ"
|
||||||
loadMore: "โหลดเพิ่มเติม"
|
loadMore: "โหลดเพิ่มเติม"
|
||||||
@@ -73,8 +75,8 @@ unfollowConfirm: "นายแน่ใจแล้วหรอว่าต้
|
|||||||
exportRequested: "เมื่อคุณได้ร้องขอการส่งออก อาจจะต้องใช้เวลาสักครู่ และจะถูกเพิ่มในไดรฟ์ของคุณเมื่อเสร็จสิ้นแล้ว"
|
exportRequested: "เมื่อคุณได้ร้องขอการส่งออก อาจจะต้องใช้เวลาสักครู่ และจะถูกเพิ่มในไดรฟ์ของคุณเมื่อเสร็จสิ้นแล้ว"
|
||||||
importRequested: "เมื่อคุณได้ร้องขอการนำเข้า อาจจะต้องใช้เวลาสักครู่นะ"
|
importRequested: "เมื่อคุณได้ร้องขอการนำเข้า อาจจะต้องใช้เวลาสักครู่นะ"
|
||||||
lists: "รายการ"
|
lists: "รายการ"
|
||||||
noLists: "คุณไม่มีลิสต์ใดๆนะ"
|
noLists: "คุณไม่มีลิสต์ใด ๆ"
|
||||||
note: "ตัวโน้ต"
|
note: " โน้ต"
|
||||||
notes: "ตัวโน้ต"
|
notes: "ตัวโน้ต"
|
||||||
following: "กำลังติดตาม"
|
following: "กำลังติดตาม"
|
||||||
followers: "ผู้ติดตาม"
|
followers: "ผู้ติดตาม"
|
||||||
@@ -100,7 +102,7 @@ followRequestPending: "กำลังรอดำเนินการร้อ
|
|||||||
enterEmoji: "ใส่อีโมจิ"
|
enterEmoji: "ใส่อีโมจิ"
|
||||||
renote: "รีโน้ต"
|
renote: "รีโน้ต"
|
||||||
unrenote: "เลิกรีโน้ต"
|
unrenote: "เลิกรีโน้ต"
|
||||||
renoted: "รีโน้ตแล้วนะ"
|
renoted: "รีโน้ตแล้ว"
|
||||||
cantRenote: "โพสต์นี้ไม่สามารถรีโน้ตไว้ใหม่ได้นะ"
|
cantRenote: "โพสต์นี้ไม่สามารถรีโน้ตไว้ใหม่ได้นะ"
|
||||||
cantReRenote: "ไม่สามารถรีโน้ตเอาไว้ใหม่ได้นะ"
|
cantReRenote: "ไม่สามารถรีโน้ตเอาไว้ใหม่ได้นะ"
|
||||||
quote: "อ้างคำพูด"
|
quote: "อ้างคำพูด"
|
||||||
@@ -108,7 +110,7 @@ inChannelRenote: "รีโน้ตช่องแชลแนลเท่า
|
|||||||
inChannelQuote: "อ้างช่องเท่านั้น"
|
inChannelQuote: "อ้างช่องเท่านั้น"
|
||||||
pinnedNote: "โน้ตที่ปักหมุดเอาไว้"
|
pinnedNote: "โน้ตที่ปักหมุดเอาไว้"
|
||||||
pinned: "ปักหมุดไปยังโปรไฟล์"
|
pinned: "ปักหมุดไปยังโปรไฟล์"
|
||||||
you: "ตัวเอง"
|
you: "คุณ"
|
||||||
clickToShow: "คลิกเพื่อแสดง"
|
clickToShow: "คลิกเพื่อแสดง"
|
||||||
sensitive: "เนื้อหาที่ละเอียดอ่อน NSFW"
|
sensitive: "เนื้อหาที่ละเอียดอ่อน NSFW"
|
||||||
add: "เพิ่ม"
|
add: "เพิ่ม"
|
||||||
@@ -134,8 +136,10 @@ unblockConfirm: "คุณแน่ใจแล้วเหรอ? ว่าต
|
|||||||
suspendConfirm: "นายแน่ใจแล้วเหรอว่าต้องการระงับบัญชีนี้อ่ะ?"
|
suspendConfirm: "นายแน่ใจแล้วเหรอว่าต้องการระงับบัญชีนี้อ่ะ?"
|
||||||
unsuspendConfirm: "นายแน่ใจแล้วหรอ? ว่าต้องการยกเลิกการระงับบัญชีนี้"
|
unsuspendConfirm: "นายแน่ใจแล้วหรอ? ว่าต้องการยกเลิกการระงับบัญชีนี้"
|
||||||
selectList: "เลือกรายการ"
|
selectList: "เลือกรายการ"
|
||||||
|
editList: "แก้ไขรายการ"
|
||||||
selectChannel: "เลือกแชนแนล"
|
selectChannel: "เลือกแชนแนล"
|
||||||
selectAntenna: "เลือกเสาอากาศ"
|
selectAntenna: "เลือกเสาอากาศ"
|
||||||
|
editAntenna: "แก้ไขเสาอากาศ"
|
||||||
selectWidget: "เลือกวิดเจ็ต"
|
selectWidget: "เลือกวิดเจ็ต"
|
||||||
editWidgets: "แก้ไขวิดเจ็ต"
|
editWidgets: "แก้ไขวิดเจ็ต"
|
||||||
editWidgetsExit: "เรียบร้อย"
|
editWidgetsExit: "เรียบร้อย"
|
||||||
@@ -164,7 +168,7 @@ wallpaper: "วอลล์เปเปอร์"
|
|||||||
setWallpaper: "ตั้งวอลเปเปอร์"
|
setWallpaper: "ตั้งวอลเปเปอร์"
|
||||||
removeWallpaper: "นำวอลเปเปอร์ออก"
|
removeWallpaper: "นำวอลเปเปอร์ออก"
|
||||||
searchWith: "ค้นหา: {q}"
|
searchWith: "ค้นหา: {q}"
|
||||||
youHaveNoLists: "รายการนี้ว่างเปล่า"
|
youHaveNoLists: "คุณไม่มีลิสต์ใด ๆ "
|
||||||
followConfirm: "คุณแน่ใจแล้วหรอว่าต้องการที่จะติดตาม {name}?"
|
followConfirm: "คุณแน่ใจแล้วหรอว่าต้องการที่จะติดตาม {name}?"
|
||||||
proxyAccount: "บัญชี พร็อกซี่"
|
proxyAccount: "บัญชี พร็อกซี่"
|
||||||
proxyAccountDescription: "บัญชีพร็อกซี่ คือ บัญชีที่จะทำหน้าที่เป็นผู้ติดตามระยะไกลสำหรับผู้ใช้งานที่อยู่ภายใต้ด้วยเงื่อนไขบางอย่าง ยกตัวอย่าง เช่น เมื่อมีผู้ใช้งานนั้นได้เพิ่มผู้ใช้งานจากระยะไกลลงในรายการ แต่กิจกรรมของผู้ใช้ในระยะไกลนั้นจะไม่ถูกส่งไปยังอินสแตนซ์หากไม่มีผู้ใช้งานในพื้นที่ติดตามผู้ใช้รายนั้น ดังนั้นบัญชีพร็อกซีนี้จะติดตามแทน"
|
proxyAccountDescription: "บัญชีพร็อกซี่ คือ บัญชีที่จะทำหน้าที่เป็นผู้ติดตามระยะไกลสำหรับผู้ใช้งานที่อยู่ภายใต้ด้วยเงื่อนไขบางอย่าง ยกตัวอย่าง เช่น เมื่อมีผู้ใช้งานนั้นได้เพิ่มผู้ใช้งานจากระยะไกลลงในรายการ แต่กิจกรรมของผู้ใช้ในระยะไกลนั้นจะไม่ถูกส่งไปยังอินสแตนซ์หากไม่มีผู้ใช้งานในพื้นที่ติดตามผู้ใช้รายนั้น ดังนั้นบัญชีพร็อกซีนี้จะติดตามแทน"
|
||||||
@@ -186,7 +190,7 @@ blockThisInstance: "บล็อกอินสแตนซ์นี้"
|
|||||||
operations: "ดำเนินการ"
|
operations: "ดำเนินการ"
|
||||||
software: "ซอฟต์แวร์"
|
software: "ซอฟต์แวร์"
|
||||||
version: "เวอร์ชั่น"
|
version: "เวอร์ชั่น"
|
||||||
metadata: "ข้อมูลเมตา"
|
metadata: "Metadata"
|
||||||
withNFiles: "{n} ไฟล์(s)"
|
withNFiles: "{n} ไฟล์(s)"
|
||||||
monitor: "มอนิเตอร์"
|
monitor: "มอนิเตอร์"
|
||||||
jobQueue: "คิวงาน"
|
jobQueue: "คิวงาน"
|
||||||
@@ -213,7 +217,7 @@ intro: "การติดตั้ง Misskey เสร็จสิ้นแล
|
|||||||
done: "เสร็จสิ้น"
|
done: "เสร็จสิ้น"
|
||||||
processing: "กำลังประมวลผล..."
|
processing: "กำลังประมวลผล..."
|
||||||
preview: "แสดงตัวอย่าง"
|
preview: "แสดงตัวอย่าง"
|
||||||
default: "ค่าตั้งต้น"
|
default: "ค่าเริ่มต้น"
|
||||||
defaultValueIs: "ค่าเริ่มต้น: {value}"
|
defaultValueIs: "ค่าเริ่มต้น: {value}"
|
||||||
noCustomEmojis: "ไม่มีอีโมจิ"
|
noCustomEmojis: "ไม่มีอีโมจิ"
|
||||||
noJobs: "ไม่มีชิ้นงาน"
|
noJobs: "ไม่มีชิ้นงาน"
|
||||||
@@ -234,10 +238,10 @@ currentPassword: "รหัสผ่านปัจจุบัน"
|
|||||||
newPassword: "รหัสผ่านใหม่"
|
newPassword: "รหัสผ่านใหม่"
|
||||||
newPasswordRetype: "ใส่รหัสผ่านใหม่อีกครั้ง"
|
newPasswordRetype: "ใส่รหัสผ่านใหม่อีกครั้ง"
|
||||||
attachFile: "แนบไฟล์"
|
attachFile: "แนบไฟล์"
|
||||||
more: "เพิ่มเติม!"
|
more: "เพิ่มเติม"
|
||||||
featured: "ไฮไลท์"
|
featured: "ไฮไลท์"
|
||||||
usernameOrUserId: "ชื่อผู้ใช้หรือรหัสผู้ใช้งาน"
|
usernameOrUserId: "ชื่อผู้ใช้หรือรหัสผู้ใช้งาน"
|
||||||
noSuchUser: "ไม่มีผู้ใช้นี้อยู่ในระบบ"
|
noSuchUser: "ไม่พบผู้ใช้"
|
||||||
lookup: "การค้นหา"
|
lookup: "การค้นหา"
|
||||||
announcements: "ประกาศ"
|
announcements: "ประกาศ"
|
||||||
imageUrl: "url รูปภาพ"
|
imageUrl: "url รูปภาพ"
|
||||||
@@ -282,7 +286,7 @@ themeForLightMode: "ธีมที่จะใช้ในโหมดแสง
|
|||||||
themeForDarkMode: "ธีมที่จะใช้ในโหมดมืด"
|
themeForDarkMode: "ธีมที่จะใช้ในโหมดมืด"
|
||||||
light: "สว่าง"
|
light: "สว่าง"
|
||||||
dark: "มืด"
|
dark: "มืด"
|
||||||
lightThemes: "ธีมสีสว่าง"
|
lightThemes: "ธีมสว่าง"
|
||||||
darkThemes: "ธีมมืด"
|
darkThemes: "ธีมมืด"
|
||||||
syncDeviceDarkMode: "ซิงค์โหมดมืดด้วยการตั้งค่ากับอุปกรณ์"
|
syncDeviceDarkMode: "ซิงค์โหมดมืดด้วยการตั้งค่ากับอุปกรณ์"
|
||||||
drive: "ไดรฟ์"
|
drive: "ไดรฟ์"
|
||||||
@@ -309,7 +313,6 @@ copyUrl: "คัดลอก URL"
|
|||||||
rename: "เปลี่ยนชื่อ"
|
rename: "เปลี่ยนชื่อ"
|
||||||
avatar: "ไอคอน"
|
avatar: "ไอคอน"
|
||||||
banner: "แบนเนอร์"
|
banner: "แบนเนอร์"
|
||||||
nsfw: "เนื้อหาที่ละเอียดอ่อน NSFW"
|
|
||||||
whenServerDisconnected: "สูญเสียการเชื่อมต่อกับเซิร์ฟเวอร์"
|
whenServerDisconnected: "สูญเสียการเชื่อมต่อกับเซิร์ฟเวอร์"
|
||||||
disconnectedFromServer: "ถูกตัดการเชื่อมต่อออกจากเซิร์ฟเวอร์"
|
disconnectedFromServer: "ถูกตัดการเชื่อมต่อออกจากเซิร์ฟเวอร์"
|
||||||
reload: "รีโหลด"
|
reload: "รีโหลด"
|
||||||
@@ -319,7 +322,7 @@ watch: "ดู"
|
|||||||
unwatch: "หยุดดู"
|
unwatch: "หยุดดู"
|
||||||
accept: "ยอมรับ"
|
accept: "ยอมรับ"
|
||||||
reject: "ปฏิเสธ"
|
reject: "ปฏิเสธ"
|
||||||
normal: "โหมดปกติ"
|
normal: "ปกติ"
|
||||||
instanceName: "ชื่อ อินสแตนซ์"
|
instanceName: "ชื่อ อินสแตนซ์"
|
||||||
instanceDescription: "คำอธิบายอินสแตนซ์"
|
instanceDescription: "คำอธิบายอินสแตนซ์"
|
||||||
maintainerName: "ผู้ดูแล"
|
maintainerName: "ผู้ดูแล"
|
||||||
@@ -560,6 +563,7 @@ accountDeletedDescription: "บัญชีนี้ถูกลบไปแล
|
|||||||
menu: "เมนู"
|
menu: "เมนู"
|
||||||
divider: "ตัวแบ่ง"
|
divider: "ตัวแบ่ง"
|
||||||
addItem: "เพิ่มรายการ"
|
addItem: "เพิ่มรายการ"
|
||||||
|
rearrange: "จัดใหม่"
|
||||||
relays: "รีเลย์"
|
relays: "รีเลย์"
|
||||||
addRelay: "เพิ่มรีเลย์"
|
addRelay: "เพิ่มรีเลย์"
|
||||||
inboxUrl: "อินบ็อกซ์ URL"
|
inboxUrl: "อินบ็อกซ์ URL"
|
||||||
@@ -789,6 +793,7 @@ noMaintainerInformationWarning: "ข้อมูลผู้ดูแลไม
|
|||||||
noBotProtectionWarning: "ไม่ได้กำหนดค่าการป้องกันบอทนะ"
|
noBotProtectionWarning: "ไม่ได้กำหนดค่าการป้องกันบอทนะ"
|
||||||
configure: "กำหนดค่า"
|
configure: "กำหนดค่า"
|
||||||
postToGallery: "สร้างโพสต์แกลเลอรี่ใหม่"
|
postToGallery: "สร้างโพสต์แกลเลอรี่ใหม่"
|
||||||
|
postToHashtag: "โพสต์ไปที่แฮชแท็กนี้"
|
||||||
gallery: "แกลเลอรี่"
|
gallery: "แกลเลอรี่"
|
||||||
recentPosts: "โพสต์ล่าสุด"
|
recentPosts: "โพสต์ล่าสุด"
|
||||||
popularPosts: "โพสต์ติดอันดับ"
|
popularPosts: "โพสต์ติดอันดับ"
|
||||||
@@ -822,6 +827,7 @@ translatedFrom: "แปลมาจาก {x}"
|
|||||||
accountDeletionInProgress: "กำลังดำเนินการลบบัญชีอยู่"
|
accountDeletionInProgress: "กำลังดำเนินการลบบัญชีอยู่"
|
||||||
usernameInfo: "ชื่อที่ระบุบัญชีของคุณจากผู้อื่นในเซิร์ฟเวอร์นี้ คุณสามารถใช้ตัวอักษร (a~z, A~Z), ตัวเลข (0~9) หรือขีดล่าง (_) ชื่อผู้ใช้ไม่สามารถเปลี่ยนแปลงได้ในภายหลัง"
|
usernameInfo: "ชื่อที่ระบุบัญชีของคุณจากผู้อื่นในเซิร์ฟเวอร์นี้ คุณสามารถใช้ตัวอักษร (a~z, A~Z), ตัวเลข (0~9) หรือขีดล่าง (_) ชื่อผู้ใช้ไม่สามารถเปลี่ยนแปลงได้ในภายหลัง"
|
||||||
aiChanMode: "โหมด Ai "
|
aiChanMode: "โหมด Ai "
|
||||||
|
devMode: "โหมดนักพัฒนา"
|
||||||
keepCw: "เก็บคำเตือนเนื้อหา"
|
keepCw: "เก็บคำเตือนเนื้อหา"
|
||||||
pubSub: "บัญชีผับ/ย่อย"
|
pubSub: "บัญชีผับ/ย่อย"
|
||||||
lastCommunication: "การสื่อสารครั้งสุดท้ายล่าสุด"
|
lastCommunication: "การสื่อสารครั้งสุดท้ายล่าสุด"
|
||||||
@@ -831,6 +837,8 @@ breakFollow: "ลบผู้ติดตาม"
|
|||||||
breakFollowConfirm: "ลบผู้ติดตามนี้ออกจริงหรอ?"
|
breakFollowConfirm: "ลบผู้ติดตามนี้ออกจริงหรอ?"
|
||||||
itsOn: "เปิดใช้งาน"
|
itsOn: "เปิดใช้งาน"
|
||||||
itsOff: "ปิดใช้งาน"
|
itsOff: "ปิดใช้งาน"
|
||||||
|
on: "เปิด"
|
||||||
|
off: "ปิด"
|
||||||
emailRequiredForSignup: "จำเป็นต้องการใช้ที่อยู่อีเมลสำหรับการสมัคร"
|
emailRequiredForSignup: "จำเป็นต้องการใช้ที่อยู่อีเมลสำหรับการสมัคร"
|
||||||
unread: "ไม่ได้อ่าน"
|
unread: "ไม่ได้อ่าน"
|
||||||
filter: "กรอง"
|
filter: "กรอง"
|
||||||
@@ -849,7 +857,7 @@ incorrectPassword: "รหัสผ่านไม่ถูกต้อง"
|
|||||||
voteConfirm: "ยืนยันการโหวต \"{choice}\" มั้ย?"
|
voteConfirm: "ยืนยันการโหวต \"{choice}\" มั้ย?"
|
||||||
hide: "ซ่อน"
|
hide: "ซ่อน"
|
||||||
useDrawerReactionPickerForMobile: "แสดงผล ตัวเลือกปฏิกิริยาเป็นลิ้นชักบนมือถือ"
|
useDrawerReactionPickerForMobile: "แสดงผล ตัวเลือกปฏิกิริยาเป็นลิ้นชักบนมือถือ"
|
||||||
welcomeBackWithName: "ยินดีต้อนรับการกลับมานะค่ะ, {name}"
|
welcomeBackWithName: "ยินดีต้อนรับการกลับมานะคะ, {name}"
|
||||||
clickToFinishEmailVerification: "กรุณาคลิก [{ok}] เพื่อดำเนินการยืนยันอีเมลให้เสร็จสมบูรณ์นะ"
|
clickToFinishEmailVerification: "กรุณาคลิก [{ok}] เพื่อดำเนินการยืนยันอีเมลให้เสร็จสมบูรณ์นะ"
|
||||||
overridedDeviceKind: "ประเภทอุปกรณ์"
|
overridedDeviceKind: "ประเภทอุปกรณ์"
|
||||||
smartphone: "สมาร์ทโฟน"
|
smartphone: "สมาร์ทโฟน"
|
||||||
@@ -954,7 +962,7 @@ color: "สี"
|
|||||||
manageCustomEmojis: "จัดการอีโมจิแบบกำหนดเอง"
|
manageCustomEmojis: "จัดการอีโมจิแบบกำหนดเอง"
|
||||||
youCannotCreateAnymore: "คุณถึงขีดจํากัดการสร้างแล้วนะ"
|
youCannotCreateAnymore: "คุณถึงขีดจํากัดการสร้างแล้วนะ"
|
||||||
cannotPerformTemporary: "ไม่สามารถใช้การได้ชั่วคราว"
|
cannotPerformTemporary: "ไม่สามารถใช้การได้ชั่วคราว"
|
||||||
cannotPerformTemporaryDescription: "การดําเนินการนี้ไม่สามารถดําเนินการได้ชั่วคราว เนื่องจากเกินขีดจํากัดการดําเนินการ กรุณารอสักครู่แล้วลองใหม่อีกครั้งนะค่ะ"
|
cannotPerformTemporaryDescription: "ไม่สามารถดําเนินการได้ชั่วคราว เนื่องจากเกินขีดจํากัดการดําเนินการ กรุณารอสักครู่แล้วลองใหม่อีกครั้ง"
|
||||||
invalidParamError: "ข้อผิดพลาดพารามิเตอร์"
|
invalidParamError: "ข้อผิดพลาดพารามิเตอร์"
|
||||||
invalidParamErrorDescription: "คำขอพารามิเตอร์ไม่ถูกต้อง สิ่งนี้มักจะเกิดจากข้อผิดพลาด แต่อาจเกิดจากอินพุตเกินขีดจำกัดของขนาดหรือที่คล้ายกัน"
|
invalidParamErrorDescription: "คำขอพารามิเตอร์ไม่ถูกต้อง สิ่งนี้มักจะเกิดจากข้อผิดพลาด แต่อาจเกิดจากอินพุตเกินขีดจำกัดของขนาดหรือที่คล้ายกัน"
|
||||||
permissionDeniedError: "การดำเนินถูกปฏิเสธ"
|
permissionDeniedError: "การดำเนินถูกปฏิเสธ"
|
||||||
@@ -976,20 +984,23 @@ joinThisServer: "ลงชื่อสมัครใช้ในอินสแ
|
|||||||
exploreOtherServers: "มองหาอินสแตนซ์อื่น"
|
exploreOtherServers: "มองหาอินสแตนซ์อื่น"
|
||||||
letsLookAtTimeline: "ลองดูที่ไทม์ไลน์"
|
letsLookAtTimeline: "ลองดูที่ไทม์ไลน์"
|
||||||
disableFederationConfirm: "ปิดใช้งานสหพันธ์จริงๆหรอแน่ใจแล้วนะ?"
|
disableFederationConfirm: "ปิดใช้งานสหพันธ์จริงๆหรอแน่ใจแล้วนะ?"
|
||||||
disableFederationConfirmWarn: "แม้ว่าจะถูกยกเลิกเอาไว้โพสต์ดังกล่าวนั้นจะยังคงเป็นสาธารณะต่อไป เว้นแต่ว่า...จะตั้งค่าเป็นอย่างอื่น โดยปกติคุณไม่จำเป็นต้องทำตรงนี้หรอกนะค่ะ"
|
disableFederationConfirmWarn: "โพสต์จะยังคงเป็นสาธารณะต่อไป เว้นแต่จะตั้งค่าเป็นอย่างอื่น"
|
||||||
disableFederationOk: "ปิดการใช้งาน"
|
disableFederationOk: "ปิดการใช้งาน"
|
||||||
invitationRequiredToRegister: "อินสแตนซ์นี้เป็นแบบรับเชิญเท่านั้น คุณต้องป้อนรหัสเชิญที่ถูกต้องถึงจะลงทะเบียนได้นะค่ะ"
|
invitationRequiredToRegister: "อินสแตนซ์นี้เป็นแบบรับเชิญเท่านั้น คุณต้องป้อนรหัสเชิญ เพื่องลงทะเบียนเข้าใช้งาน"
|
||||||
emailNotSupported: "อินสแตนซ์นี้ไม่รองรับการส่งอีเมลนะค่ะ"
|
emailNotSupported: "อินสแตนซ์นี้ไม่รองรับการส่งอีเมล"
|
||||||
postToTheChannel: "โพสต์ลงช่อง"
|
postToTheChannel: "โพสต์ลงช่อง"
|
||||||
cannotBeChangedLater: "สิ่งนี้ไม่สามารถเปลี่ยนแปลงได้ในภายหลังนะ"
|
cannotBeChangedLater: "สิ่งนี้ไม่สามารถเปลี่ยนแปลงได้ในภายหลังนะ"
|
||||||
reactionAcceptance: "การยอมรับรีแอคชั่น"
|
reactionAcceptance: "การยอมรับรีแอคชั่น"
|
||||||
likeOnly: "ที่ชอบเท่านั้น"
|
likeOnly: "ที่ชอบเท่านั้น"
|
||||||
likeOnlyForRemote: "ไลค์สำหรับอินสแตนซ์ระยะไกลเท่านั้น"
|
likeOnlyForRemote: "ไลค์สำหรับอินสแตนซ์ระยะไกลเท่านั้น"
|
||||||
|
nonSensitiveOnly: "ไม่มีความอ่อนไหวเท่านั้น"
|
||||||
|
nonSensitiveOnlyForLocalLikeOnlyForRemote: "ไม่มีความอ่อนไหวเท่านั้น (เฉพาะไลค์จากระยะไกลเท่านั้น)"
|
||||||
rolesAssignedToMe: "บทบาทที่ได้รับมอบหมายให้ฉัน"
|
rolesAssignedToMe: "บทบาทที่ได้รับมอบหมายให้ฉัน"
|
||||||
resetPasswordConfirm: "รีเซ็ตรหัสผ่านของคุณจริงๆหรอ?"
|
resetPasswordConfirm: "รีเซ็ตรหัสผ่านของคุณจริงๆหรอ?"
|
||||||
sensitiveWords: "คำที่ละเอียดอ่อน"
|
sensitiveWords: "คำที่ละเอียดอ่อน"
|
||||||
sensitiveWordsDescription: "การเปิดเผยโน้ตทั้งหมดที่มีคำที่กำหนดค่าไว้จะถูกตั้งค่าเป็น \"หน้าแรก\" โดยอัตโนมัติ คุณยังสามารถแสดงหลายรายการได้โดยแยกรายการโดยใช้ตัวแบ่งบรรทัดได้นะ"
|
sensitiveWordsDescription: "การเปิดเผยโน้ตทั้งหมดที่มีคำที่กำหนดค่าไว้จะถูกตั้งค่าเป็น \"หน้าแรก\" โดยอัตโนมัติ คุณยังสามารถแสดงหลายรายการได้โดยแยกรายการโดยใช้ตัวแบ่งบรรทัดได้นะ"
|
||||||
notesSearchNotAvailable: "การค้นหาโน้ตไม่พร้อมใช้งานนะค่ะ"
|
sensitiveWordsDescription2: "การใช้ช่องว่างนั้นอาจจะสร้างนิพจน์ AND และคำหลักที่มีเครื่องหมายทับล้อมรอบจะเปลี่ยนเป็นนิพจน์ทั่วไปนะ"
|
||||||
|
notesSearchNotAvailable: "การค้นหาโน้ตไม่พร้อมใช้งาน"
|
||||||
license: "ใบอนุญาต"
|
license: "ใบอนุญาต"
|
||||||
unfavoriteConfirm: "ลบออกจากรายการโปรดแน่ใจหรอ?"
|
unfavoriteConfirm: "ลบออกจากรายการโปรดแน่ใจหรอ?"
|
||||||
myClips: "คลิปของฉัน"
|
myClips: "คลิปของฉัน"
|
||||||
@@ -1024,27 +1035,60 @@ vertical: "แนวตั้ง"
|
|||||||
horizontal: "ด้านข้าง"
|
horizontal: "ด้านข้าง"
|
||||||
position: "ตำแหน่ง"
|
position: "ตำแหน่ง"
|
||||||
serverRules: "กฎของเซิฟเวอร์"
|
serverRules: "กฎของเซิฟเวอร์"
|
||||||
pleaseConfirmBelowBeforeSignup: "โปรดยืนยันด้านล่างก่อนกำลังลงชื่อสมัครนะค่ะ"
|
pleaseConfirmBelowBeforeSignup: "โปรดยืนยันที่ด้านล่างก่อนสมัครใช้งาน"
|
||||||
pleaseAgreeAllToContinue: "คุณต้องยอมรับทุกช่องตรงด้านบนเพื่อดำเนินการต่อค่ะ"
|
pleaseAgreeAllToContinue: "คุณต้องยอมรับทุกช่องตรงด้านบนเพื่อดำเนินการต่อค่ะ"
|
||||||
continue: "ดำเนินการต่อ"
|
continue: "ดำเนินการต่อ"
|
||||||
preservedUsernames: "ชื่อผู้ใช้ที่สงวนไว้"
|
preservedUsernames: "ชื่อผู้ใช้ที่สงวนไว้"
|
||||||
preservedUsernamesDescription: "ลิสต์ชื่อผู้ใช้ที่จะสำรองโดยคั่นด้วยการแบ่งบรรทัดนั้น เพราะสิ่งเหล่านี้จะไม่สามารถทำได้ในระหว่างการสร้างบัญชีตามปกติ บัญชีที่มีอยู่แล้วนั้นโดยใช้ชื่อผู้ใช้เหล่านี้จะไม่ได้รับผลกระทบอะไร"
|
preservedUsernamesDescription: "ลิสต์ชื่อผู้ใช้ที่จะสำรองโดยคั่นด้วยการแบ่งบรรทัดนั้น เพราะสิ่งเหล่านี้จะไม่สามารถทำได้ในระหว่างการสร้างบัญชีตามปกติ บัญชีที่มีอยู่แล้วนั้นโดยใช้ชื่อผู้ใช้เหล่านี้จะไม่ได้รับผลกระทบอะไร"
|
||||||
createNoteFromTheFile: "เรียบเรียงโน้ตจากไฟล์นี้"
|
createNoteFromTheFile: "เรียบเรียงโน้ตจากไฟล์นี้"
|
||||||
|
archive: "เก็บถาวร"
|
||||||
|
channelArchiveConfirmTitle: "เก็บถาวรจริงๆ {name} มั้ย?"
|
||||||
|
thisChannelArchived: "ช่องนี้ถูกเก็บถาวรแล้วนะ"
|
||||||
|
displayOfNote: "การแสดงโน้ต"
|
||||||
|
initialAccountSetting: "ตั้งค่าโปรไฟล์"
|
||||||
youFollowing: "ติดตามแล้ว"
|
youFollowing: "ติดตามแล้ว"
|
||||||
|
preventAiLearning: "ปฏิเสธการใช้งาน ในการเรียนรู้ของเครื่อง (Generative AI)"
|
||||||
|
options: "ตัวเลือกบทบาท"
|
||||||
|
specifyUser: "ผู้ใช้เฉพาะ"
|
||||||
|
failedToPreviewUrl: "ไม่สามารถดูตัวอย่างได้"
|
||||||
|
update: "อัปเดต"
|
||||||
|
rolesThatCanBeUsedThisEmojiAsReaction: "บทบาทที่สามารถใช้อิโมจินี้เป็นรีแอคชั่นได้"
|
||||||
|
rolesThatCanBeUsedThisEmojiAsReactionPublicRoleWarn: "บทบาทเหล่านี้ต้องเป็นสาธารณะ"
|
||||||
|
cancelReactionConfirm: "ต้องการลบรีแอคชั่นของคุณจริงๆหรอ?"
|
||||||
|
changeReactionConfirm: "ต้องการเปลี่ยนรีแอคชั่นของคุณจริงๆหรอ?"
|
||||||
|
later: "ไว้ทีหลัง"
|
||||||
|
goToMisskey: "ถึง Misskey"
|
||||||
|
additionalEmojiDictionary: "พจนานุกรมอีโมจิเพิ่มเติม"
|
||||||
|
installed: "ติดตั้งแล้ว"
|
||||||
|
branding: "แบรนดิ้ง"
|
||||||
|
enableServerMachineStats: "เผยแพร่สถานะฮาร์ดแวร์ของเซิร์ฟเวอร์"
|
||||||
|
enableIdenticonGeneration: "เปิดใช้งานผู้ใช้สร้างตัวระบุ"
|
||||||
|
turnOffToImprovePerformance: "การปิดส่วนนี้สามารถเพิ่มประสิทธิภาพได้"
|
||||||
|
_initialAccountSetting:
|
||||||
|
accountCreated: "คุณได้สร้างบัญชีของคุณสำเร็จเรียบร้อยแล้ว!"
|
||||||
|
letsStartAccountSetup: "สำหรับผู้เริ่มต้นมาตั้งค่าโปรไฟล์ของคุณกันเถอะ"
|
||||||
|
letsFillYourProfile: "ก่อนอื่นมาตั้งค่าโปรไฟล์ของคุณ"
|
||||||
|
profileSetting: "ตั้งค่าโปรไฟล์"
|
||||||
|
privacySetting: "ตั้งค่าความเป็นส่วนตัว"
|
||||||
|
theseSettingsCanEditLater: "คุณสามารถเปลี่ยนการตั้งค่าเหล่านี้ได้ในภายหลังได้ตลอดเวลานะ"
|
||||||
|
initialAccountSettingCompleted: "ตั้งค่าโปรไฟล์เสร็จสมบูรณ์แล้ว!"
|
||||||
|
haveFun: "สนุกกับ {name}!"
|
||||||
|
skipAreYouSure: "ต้องการข้ามการตั้งค่าโปรไฟล์จริงๆแบบนั้นหรอ?"
|
||||||
|
laterAreYouSure: "ต้องการตั้งค่าโปรไฟล์ในภายหลังจริงๆอย่างงั้นหรอ?"
|
||||||
_serverRules:
|
_serverRules:
|
||||||
description: "ชุดของกฎที่จะแสดงก่อนการลงทะเบียนเราขอแนะนำให้ตั้งค่าสรุปข้อกำหนดในการให้บริการ"
|
description: "ชุดของกฎที่จะแสดงก่อนการลงทะเบียนเราขอแนะนำให้ตั้งค่าสรุปข้อกำหนดในการให้บริการ"
|
||||||
_accountMigration:
|
_accountMigration:
|
||||||
moveFrom: "ย้ายข้อมูลบัญชีอื่นไปยังอีกบัญชีนี้หนึ่ง"
|
moveFrom: "ย้ายข้อมูลบัญชีอื่นไปยังอีกบัญชีนี้หนึ่ง"
|
||||||
moveFromSub: "สร้างนามแฝงไปยังบัญชีอื่น"
|
moveFromSub: "สร้างนามแฝงไปยังบัญชีอื่น"
|
||||||
moveFromLabel: "บัญชีที่จะย้ายจาก:"
|
moveFromLabel: "บัญชีที่จะย้ายจาก:"
|
||||||
moveFromDescription: "สร้างนามแฝงสำหรับบัญชีที่จะย้ายจากบัญชีนี้ ถ้าหากคุณต้องการโอนผู้ติดตาม สิ่งนี้ต้องทำก่อนโอนก่อนนะค่ะ! หลังจากนั้น ป้อนบัญชีที่จะย้ายไปในรูปแบบต่อไปนี้: @person@instance.com"
|
moveFromDescription: "ถ้าหากคุณต้องการโอนข้อมูล คุณจำเป็นต้องสร้างบัญชีสำรองสำหรับการย้ายบัญชี หลังจากนั้นป้อนบัญชีที่จะย้ายไปในรูปแบบต่อไปนี้: @person@instance.com"
|
||||||
moveTo: "ย้ายข้อมูลบัญชีนี้ไปยังบัญชีอีกหนึ่ง"
|
moveTo: "ย้ายข้อมูลบัญชีนี้ไปยังบัญชีอีกหนึ่ง"
|
||||||
moveToLabel: "บัญชีที่จะย้ายไปที่:"
|
moveToLabel: "บัญชีที่จะย้ายไปที่:"
|
||||||
moveCannotBeUndone: "ไม่สามารถยกเลิกการโอนย้ายบัญชีได้"
|
moveCannotBeUndone: "ไม่สามารถยกเลิกการโอนย้ายบัญชีได้"
|
||||||
moveAccountDescription: "การกระทำนี้ไม่สามารถย้อนกลับได้นะ ขั้นตอนแรก ต้องสร้างนามแฝงสำหรับบัญชีนี้ในบัญชีที่คุณต้องการย้ายไป หลังจากนั้นแล้ว ป้อนบัญชีที่จะย้ายไปในรูปแบบดังต่อไปนี้: @person@instance.com"
|
moveAccountDescription: "การกระทำนี้ไม่สามารถย้อนกลับได้นะ ขั้นตอนแรก ต้องสร้างนามแฝงสำหรับบัญชีนี้ในบัญชีที่คุณต้องการย้ายไป หลังจากนั้นแล้ว ป้อนบัญชีที่จะย้ายไปในรูปแบบดังต่อไปนี้: @person@instance.com"
|
||||||
moveAccountHowTo: "หากต้องการย้ายข้อมูลก่อนอื่นให้สร้างชื่อแทนสำหรับบัญชีนี้ ในบัญชีที่จะต้องการย้ายไป\nหลังจากที่คุณสร้างนามแฝงนั้นแล้ว ให้ป้อนบัญชีที่ต้องการจะย้ายไปในรูปแบบดังต่อไปนี้: @username@server.example.com"
|
moveAccountHowTo: "หากต้องการย้ายข้อมูลก่อนอื่นให้สร้างชื่อแทนสำหรับบัญชีนี้ ในบัญชีที่จะต้องการย้ายไป\nหลังจากที่คุณสร้างนามแฝงนั้นแล้ว ให้ป้อนบัญชีที่ต้องการจะย้ายไปในรูปแบบดังต่อไปนี้: @username@server.example.com"
|
||||||
startMigration: "โอนย้าย"
|
startMigration: "โอนย้าย"
|
||||||
migrationConfirm: "ย้ายข้อมูลบัญชีนี้ไปที่ {account} จริงๆนะ เมื่อมีการเริ่มต้นแล้ว กระบวนการนี้จะไม่สามารถหยุดหรือนำกลับคืนมาได้ และคุณจะไม่สามารถใช้บัญชีนี้ในสถานะดั้งเดิมได้อีกต่อไป\n\nนอกจากนี้ เพื่อให้แน่ใจยืนยันว่าคุณได้สร้างนามแฝงในบัญชีที่จะย้ายข้อมูลนะค่ะ"
|
migrationConfirm: "ยืนยันการย้ายข้อมูลบัญชีนี้ไปที่ {account} เมื่อเริ่มแล้วจะไม่สามารถหยุดหรือนำกลับคืนมาได้ และคุณจะไม่สามารถใช้บัญชีนี้ในสถานะดั้งเดิมได้อีกต่อไป\n\nนอกจากนี้ คุณจำเป็นต้องสร้างบัญชีสำรองสำหรับการย้ายบัญชี"
|
||||||
movedAndCannotBeUndone: "\nบัญชีนี้ถูกโอนย้ายไปแล้ว\nไม่สามารถย้อนกลับโอนย้ายข้อมูลได้"
|
movedAndCannotBeUndone: "\nบัญชีนี้ถูกโอนย้ายไปแล้ว\nไม่สามารถย้อนกลับโอนย้ายข้อมูลได้"
|
||||||
postMigrationNote: "บัญชีนี้จะถูกเลิกติดตามบัญชีทั้งหมดที่กำลังติดตามภายใน 24 ชั่วโมงหลังจากการย้ายข้อมูลนั้นเสร็จสิ้น ทั้งจำนวนผู้ติดตามและผู้ติดตามนั้นจะกลายเป็นศูนย์ เพื่อหลีกเลี่ยงป้องกันไม่ให้ผู้ติดตามของคุณนั้นไม่สามารถเห็นโพสต์เฉพาะผู้ติดตามของบัญชีนี้ได้ แต่อย่างไรก็ตามแล้วพวกเขาจะยังคงติดตามบัญชีนี้ต่อไป"
|
postMigrationNote: "บัญชีนี้จะถูกเลิกติดตามบัญชีทั้งหมดที่กำลังติดตามภายใน 24 ชั่วโมงหลังจากการย้ายข้อมูลนั้นเสร็จสิ้น ทั้งจำนวนผู้ติดตามและผู้ติดตามนั้นจะกลายเป็นศูนย์ เพื่อหลีกเลี่ยงป้องกันไม่ให้ผู้ติดตามของคุณนั้นไม่สามารถเห็นโพสต์เฉพาะผู้ติดตามของบัญชีนี้ได้ แต่อย่างไรก็ตามแล้วพวกเขาจะยังคงติดตามบัญชีนี้ต่อไป"
|
||||||
movedTo: "บัญชีที่จะย้ายไปที่:"
|
movedTo: "บัญชีที่จะย้ายไปที่:"
|
||||||
@@ -1220,7 +1264,7 @@ _achievements:
|
|||||||
title: "พักผ่อนสักหน่อย"
|
title: "พักผ่อนสักหน่อย"
|
||||||
description: "ใช้เวลา 30 นาทีบน Misskey"
|
description: "ใช้เวลา 30 นาทีบน Misskey"
|
||||||
_client60min:
|
_client60min:
|
||||||
title: "ไม่มี \"Miss\" ใน Misskey นะค่ะ !"
|
title: "ไม่พบ \"Miss\" ใน Misskey "
|
||||||
description: "เปิด Misskey ค้างไว้แล้วอย่างน้อย 60 นาที"
|
description: "เปิด Misskey ค้างไว้แล้วอย่างน้อย 60 นาที"
|
||||||
_noteDeletedWithin1min:
|
_noteDeletedWithin1min:
|
||||||
title: "ไม่เป็นไร"
|
title: "ไม่เป็นไร"
|
||||||
@@ -1328,6 +1372,7 @@ _role:
|
|||||||
canInvite: "สร้างรหัสเชิญอินสแตนซ์"
|
canInvite: "สร้างรหัสเชิญอินสแตนซ์"
|
||||||
canManageCustomEmojis: "จัดการอีโมจิแบบกำหนดเอง"
|
canManageCustomEmojis: "จัดการอีโมจิแบบกำหนดเอง"
|
||||||
driveCapacity: "ความจุของไดรฟ์"
|
driveCapacity: "ความจุของไดรฟ์"
|
||||||
|
alwaysMarkNsfw: "ทำเครื่องหมายไฟล์ว่าเป็น NSFW เสมอ"
|
||||||
pinMax: "จํานวนสูงสุดของโน้ตที่ปักหมุดไว้"
|
pinMax: "จํานวนสูงสุดของโน้ตที่ปักหมุดไว้"
|
||||||
antennaMax: "จำนวนสูงสุดของเสาอากาศ"
|
antennaMax: "จำนวนสูงสุดของเสาอากาศ"
|
||||||
wordMuteMax: "จำนวนอักขระสูงสุดที่อนุญาตในการปิดเสียงคำ"
|
wordMuteMax: "จำนวนอักขระสูงสุดที่อนุญาตในการปิดเสียงคำ"
|
||||||
@@ -1387,6 +1432,7 @@ _ad:
|
|||||||
back: "ย้อนกลับ"
|
back: "ย้อนกลับ"
|
||||||
reduceFrequencyOfThisAd: "แสดงโฆษณานี้ให้น้อยลง"
|
reduceFrequencyOfThisAd: "แสดงโฆษณานี้ให้น้อยลง"
|
||||||
hide: "ไม่ต้องแสดง"
|
hide: "ไม่ต้องแสดง"
|
||||||
|
timezoneinfo: "วันในสัปดาห์นี้จะถูกกำหนดจากโซนเวลาของเซิร์ฟเวอร์"
|
||||||
_forgotPassword:
|
_forgotPassword:
|
||||||
enterEmail: "ป้อนที่อยู่อีเมลที่คุณเคยใช้ในการลงทะเบียนไว้ ลิงก์ที่คุณสามารถรีเซ็ตรหัสผ่านได้นั้นจะถูกส่งไปนะ"
|
enterEmail: "ป้อนที่อยู่อีเมลที่คุณเคยใช้ในการลงทะเบียนไว้ ลิงก์ที่คุณสามารถรีเซ็ตรหัสผ่านได้นั้นจะถูกส่งไปนะ"
|
||||||
ifNoEmail: "ถ้าหากคุณไม่ได้ใช้อีเมลระหว่างการลงทะเบียน กรุณาติดต่อผู้ดูแลระบบอินสแตนซ์แทนนะ"
|
ifNoEmail: "ถ้าหากคุณไม่ได้ใช้อีเมลระหว่างการลงทะเบียน กรุณาติดต่อผู้ดูแลระบบอินสแตนซ์แทนนะ"
|
||||||
@@ -1438,10 +1484,6 @@ _aboutMisskey:
|
|||||||
donate: "บริจาคให้กับ Misskey"
|
donate: "บริจาคให้กับ Misskey"
|
||||||
morePatrons: "เราขอขอบคุณสำหรับความช่วยเหลือจากผู้ช่วยอื่นๆ ที่ไม่ได้ระบุไว้ที่นี่นะ ขอขอบคุณ! 🥰"
|
morePatrons: "เราขอขอบคุณสำหรับความช่วยเหลือจากผู้ช่วยอื่นๆ ที่ไม่ได้ระบุไว้ที่นี่นะ ขอขอบคุณ! 🥰"
|
||||||
patrons: "สมาชิกพันธมิตร"
|
patrons: "สมาชิกพันธมิตร"
|
||||||
_nsfw:
|
|
||||||
respect: "ซ่อนสื่อ NSFW"
|
|
||||||
ignore: "อย่าซ่อนสื่อ NSFW"
|
|
||||||
force: "ซ่อนสื่อทั้งหมด"
|
|
||||||
_instanceTicker:
|
_instanceTicker:
|
||||||
none: "ไม่ต้องแสดง"
|
none: "ไม่ต้องแสดง"
|
||||||
remote: "แสดงสำหรับผู้ใช้ระยะไกล"
|
remote: "แสดงสำหรับผู้ใช้ระยะไกล"
|
||||||
@@ -1579,6 +1621,14 @@ _time:
|
|||||||
minute: "นาที"
|
minute: "นาที"
|
||||||
hour: "ชั่วโมง"
|
hour: "ชั่วโมง"
|
||||||
day: "วัน"
|
day: "วัน"
|
||||||
|
_timelineTutorial:
|
||||||
|
title: "วิธีใช้งาน Misskey"
|
||||||
|
step2_1: "มาลองโพสต์โน้ตต่อไปกัน คุณสามารถทำได้โดยการกดปุ่มที่มีไอคอนดินสอ"
|
||||||
|
step2_2: "ยังไงไหนลองเขียนแนะนำตัวเองหรือแค่ \"สวัสดี {name}!\" ถ้าคุณไม่รู้สึกเหมือนมัน?"
|
||||||
|
step3_1: "เสร็จสิ้นการโพสต์โน้ตย่อแรกของคุณแล้วอย่างงั้นหรอ?"
|
||||||
|
step3_2: "ไชโย! ตอนนี้โน้ตย่อแรกของคุณได้ปรากฏบนไทม์ไลน์ของคุณแล้วนะ"
|
||||||
|
step4_1: "คุณสามารถเพิ่ม \"การตอบสนอง\" ในโน้ตได้"
|
||||||
|
step4_2: "หากต้องการแนบการแสดงความรู้สึก ให้กดเครื่องหมาย \"+\" บนโน้ตแล้วเลือกอิโมจิที่คุณต้องการแสดงความรู้สึกที่ตนเองชอบได้เลย"
|
||||||
_2fa:
|
_2fa:
|
||||||
alreadyRegistered: "คุณได้ลงทะเบียนอุปกรณ์ยืนยันตัวตนแบบ 2 ชั้นแล้ว"
|
alreadyRegistered: "คุณได้ลงทะเบียนอุปกรณ์ยืนยันตัวตนแบบ 2 ชั้นแล้ว"
|
||||||
registerTOTP: "ลงทะเบียนแอพตัวตรวจสอบสิทธิ์"
|
registerTOTP: "ลงทะเบียนแอพตัวตรวจสอบสิทธิ์"
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
---
|
---
|
||||||
_lang_: "Türkçe"
|
_lang_: "Türkçe"
|
||||||
introMisskey: "Açık kaynaklı bir dağıtılmış mikroblog hizmeti olan Misskey'e hoş geldiniz.\nMisskey, neler olup bittiğini paylaşmak ve herkese sizden bahsetmek için \"notlar\" oluşturmanıza olanak tanıyan, açık kaynaklı, dağıtılmış bir mikroblog hizmetidir.\nHerkesin notlarına kendi tepkilerinizi hızlıca eklemek için \"Tepkiler\" özelliğini de kullanabilirsiniz👍.\nYeni bir dünyayı keşfedin🚀."
|
introMisskey: "Açık kaynaklı bir dağıtılmış mikroblog hizmeti olan Misskey'e hoş geldiniz.\nMisskey, neler olup bittiğini paylaşmak ve herkese sizden bahsetmek için \"notlar\" oluşturmanıza olanak tanıyan, açık kaynaklı, dağıtılmış bir mikroblog hizmetidir.\nHerkesin notlarına kendi tepkilerinizi hızlıca eklemek için \"Tepkiler\" özelliğini de kullanabilirsiniz👍.\nYeni bir dünyayı keşfedin🚀."
|
||||||
|
poweredByMisskeyDescription: "name}Açık kaynak bir platform\n<b>Misskey</b>Dünya'nın en sunucularında biri。"
|
||||||
monthAndDay: "{month}Ay {day}Gün"
|
monthAndDay: "{month}Ay {day}Gün"
|
||||||
search: "Arama"
|
search: "Arama"
|
||||||
notifications: "Bildirim"
|
notifications: "Bildirim"
|
||||||
@@ -13,7 +14,9 @@ cancel: "İptal"
|
|||||||
enterUsername: "Kullanıcı adınızı giriniz"
|
enterUsername: "Kullanıcı adınızı giriniz"
|
||||||
noNotes: "Notlar mevcut değil."
|
noNotes: "Notlar mevcut değil."
|
||||||
noNotifications: "Bildirim bulunmuyor"
|
noNotifications: "Bildirim bulunmuyor"
|
||||||
|
instance: "Sunucu"
|
||||||
settings: "Ayarlar"
|
settings: "Ayarlar"
|
||||||
|
notificationSettings: "Bildirim Ayarları"
|
||||||
basicSettings: "Temel Ayarlar"
|
basicSettings: "Temel Ayarlar"
|
||||||
otherSettings: "Diğer Ayarlar"
|
otherSettings: "Diğer Ayarlar"
|
||||||
openInWindow: "Bir pencere ile aç"
|
openInWindow: "Bir pencere ile aç"
|
||||||
@@ -21,9 +24,11 @@ profile: "Profil"
|
|||||||
timeline: "Zaman çizelgesi"
|
timeline: "Zaman çizelgesi"
|
||||||
noAccountDescription: "Bu kullanıcı henüz biyografisini yazmadı"
|
noAccountDescription: "Bu kullanıcı henüz biyografisini yazmadı"
|
||||||
login: "Giriş Yap "
|
login: "Giriş Yap "
|
||||||
|
loggingIn: "Oturum aç"
|
||||||
logout: "Çıkış Yap"
|
logout: "Çıkış Yap"
|
||||||
signup: "Kayıt Ol"
|
signup: "Kayıt Ol"
|
||||||
uploading: "Yükleniyor"
|
uploading: "Yükleniyor"
|
||||||
|
save: "Kaydet"
|
||||||
users: "Kullanıcı"
|
users: "Kullanıcı"
|
||||||
addUser: "Kullanıcı Ekle"
|
addUser: "Kullanıcı Ekle"
|
||||||
favorite: "Favoriler"
|
favorite: "Favoriler"
|
||||||
@@ -31,6 +36,7 @@ favorites: "Favoriler"
|
|||||||
unfavorite: "Favorilerden Kaldır"
|
unfavorite: "Favorilerden Kaldır"
|
||||||
favorited: "Favorilerime eklendi."
|
favorited: "Favorilerime eklendi."
|
||||||
alreadyFavorited: "Zaten favorilerinizde kayıtlı."
|
alreadyFavorited: "Zaten favorilerinizde kayıtlı."
|
||||||
|
cantFavorite: "Favorilere kayıt yapılamadı"
|
||||||
pin: "Sabitlenmiş"
|
pin: "Sabitlenmiş"
|
||||||
unpin: "Sabitlemeyi kaldır"
|
unpin: "Sabitlemeyi kaldır"
|
||||||
copyContent: "İçeriği kopyala"
|
copyContent: "İçeriği kopyala"
|
||||||
@@ -40,23 +46,88 @@ deleteAndEdit: "Sil ve yeniden düzenle"
|
|||||||
deleteAndEditConfirm: "Bu notu silip yeniden düzenlemek istiyor musunuz? Bu nota ilişkin tüm Tepkiler, Yeniden Notlar ve Yanıtlar da silinecektir."
|
deleteAndEditConfirm: "Bu notu silip yeniden düzenlemek istiyor musunuz? Bu nota ilişkin tüm Tepkiler, Yeniden Notlar ve Yanıtlar da silinecektir."
|
||||||
addToList: "Listeye ekle"
|
addToList: "Listeye ekle"
|
||||||
sendMessage: "Mesaj Gönder"
|
sendMessage: "Mesaj Gönder"
|
||||||
|
copyRSS: "RSSKopyala"
|
||||||
copyUsername: "Kullanıcı Adını Kopyala"
|
copyUsername: "Kullanıcı Adını Kopyala"
|
||||||
|
copyUserId: "KullanıcıyıKopyala"
|
||||||
|
copyNoteId: "Kimlik notunu kopyala"
|
||||||
searchUser: "Kullanıcıları ara"
|
searchUser: "Kullanıcıları ara"
|
||||||
|
reply: "yanıt"
|
||||||
|
loadMore: "Devamını yükle"
|
||||||
|
showMore: "Devamını yükle"
|
||||||
|
lists: "Listeler"
|
||||||
|
noLists: "Liste yok"
|
||||||
|
note: "not"
|
||||||
|
notes: "notlar"
|
||||||
|
following: "takipçi"
|
||||||
|
followers: "takipçi"
|
||||||
|
followsYou: "seni takip ediyor"
|
||||||
|
createList: "Liste oluştur"
|
||||||
|
manageLists: "Yönetici Listeleri"
|
||||||
|
error: "hata"
|
||||||
|
follow: "takipçi"
|
||||||
|
followRequest: "Takip isteği"
|
||||||
|
followRequests: "Takip istekleri"
|
||||||
|
unfollow: "takip etmeyi bırak"
|
||||||
|
followRequestPending: "Bekleyen Takip Etme Talebi"
|
||||||
|
enterEmoji: "Emoji Giriniz"
|
||||||
|
renote: "vazgeçme"
|
||||||
|
unrenote: "not alma"
|
||||||
|
renoted: "yeniden adlandırılmış"
|
||||||
|
cantRenote: "Ayrılamama"
|
||||||
|
cantReRenote: "not alabilirmiyim"
|
||||||
|
quote: "alıntı"
|
||||||
|
pinnedNote: "Sabitlenen"
|
||||||
pinned: "Sabitlenmiş"
|
pinned: "Sabitlenmiş"
|
||||||
|
you: "sen"
|
||||||
|
unmute: "sesi aç"
|
||||||
|
renoteMute: "sesi kapat"
|
||||||
|
renoteUnmute: "sesi açmayı iptal et"
|
||||||
|
block: "engelle"
|
||||||
|
unblock: "engellemeyi kaldır"
|
||||||
|
suspend: "askıya al"
|
||||||
|
unsuspend: "askıya alma"
|
||||||
|
blockConfirm: "Onayı engelle"
|
||||||
|
unblockConfirm: "engellemeyi kaldır onayla"
|
||||||
|
selectChannel: "Kanal seç"
|
||||||
|
flagAsBot: "Bot olarak işaretle"
|
||||||
|
instances: "Sunucu"
|
||||||
remove: "Sil"
|
remove: "Sil"
|
||||||
|
pinnedNotes: "Sabitlenen"
|
||||||
|
userList: "Listeler"
|
||||||
smtpUser: "Kullanıcı Adı"
|
smtpUser: "Kullanıcı Adı"
|
||||||
smtpPass: "Şifre"
|
smtpPass: "Şifre"
|
||||||
user: "Kullanıcı"
|
user: "Kullanıcı"
|
||||||
searchByGoogle: "Arama"
|
searchByGoogle: "Arama"
|
||||||
|
_theme:
|
||||||
|
keys:
|
||||||
|
renote: "vazgeçme"
|
||||||
_sfx:
|
_sfx:
|
||||||
|
note: "notlar"
|
||||||
notification: "Bildirim"
|
notification: "Bildirim"
|
||||||
_widgets:
|
_widgets:
|
||||||
profile: "Profil"
|
profile: "Profil"
|
||||||
notifications: "Bildirim"
|
notifications: "Bildirim"
|
||||||
timeline: "Zaman çizelgesi"
|
timeline: "Zaman çizelgesi"
|
||||||
|
_cw:
|
||||||
|
show: "Devamını yükle"
|
||||||
|
_visibility:
|
||||||
|
followers: "takipçi"
|
||||||
_profile:
|
_profile:
|
||||||
username: "Kullanıcı Adı"
|
username: "Kullanıcı Adı"
|
||||||
|
_exportOrImport:
|
||||||
|
followingList: "takipçi"
|
||||||
|
blockingList: "engelle"
|
||||||
|
userLists: "Listeler"
|
||||||
|
_notification:
|
||||||
|
_types:
|
||||||
|
follow: "takipçi"
|
||||||
|
renote: "vazgeçme"
|
||||||
|
quote: "alıntı"
|
||||||
|
_actions:
|
||||||
|
reply: "yanıt"
|
||||||
|
renote: "vazgeçme"
|
||||||
_deck:
|
_deck:
|
||||||
_columns:
|
_columns:
|
||||||
notifications: "Bildirim"
|
notifications: "Bildirim"
|
||||||
tl: "Zaman çizelgesi"
|
tl: "Zaman çizelgesi"
|
||||||
|
list: "Listeler"
|
||||||
|
|||||||
@@ -300,7 +300,6 @@ copyUrl: "Копіювати URL"
|
|||||||
rename: "Перейменувати"
|
rename: "Перейменувати"
|
||||||
avatar: "Аватар"
|
avatar: "Аватар"
|
||||||
banner: "Банер"
|
banner: "Банер"
|
||||||
nsfw: "NSFW"
|
|
||||||
whenServerDisconnected: "Коли зв’язок із сервером втрачено"
|
whenServerDisconnected: "Коли зв’язок із сервером втрачено"
|
||||||
disconnectedFromServer: "Зв’язок із сервером було перервано"
|
disconnectedFromServer: "Зв’язок із сервером було перервано"
|
||||||
reload: "Оновити"
|
reload: "Оновити"
|
||||||
@@ -1200,10 +1199,6 @@ _aboutMisskey:
|
|||||||
donate: "Пожертвувати Misskey"
|
donate: "Пожертвувати Misskey"
|
||||||
morePatrons: "Ми дуже цінуємо підтримку багатьох інших помічників, не перелічених тут. Дякуємо! 🥰"
|
morePatrons: "Ми дуже цінуємо підтримку багатьох інших помічників, не перелічених тут. Дякуємо! 🥰"
|
||||||
patrons: "Підтримали"
|
patrons: "Підтримали"
|
||||||
_nsfw:
|
|
||||||
respect: "Приховувати NSFW медіа"
|
|
||||||
ignore: "Не приховувати NSFW медіа"
|
|
||||||
force: "Приховувати всі медіа файли"
|
|
||||||
_instanceTicker:
|
_instanceTicker:
|
||||||
none: "Не відображати"
|
none: "Не відображати"
|
||||||
remote: "Відображати для віддалених користувачів"
|
remote: "Відображати для віддалених користувачів"
|
||||||
|
|||||||
@@ -303,7 +303,6 @@ copyUrl: "Sao chép URL"
|
|||||||
rename: "Đổi tên"
|
rename: "Đổi tên"
|
||||||
avatar: "Ảnh đại diện"
|
avatar: "Ảnh đại diện"
|
||||||
banner: "Ảnh bìa"
|
banner: "Ảnh bìa"
|
||||||
nsfw: "Nhạy cảm"
|
|
||||||
whenServerDisconnected: "Khi mất kết nối tới máy chủ"
|
whenServerDisconnected: "Khi mất kết nối tới máy chủ"
|
||||||
disconnectedFromServer: "Mất kết nối tới máy chủ"
|
disconnectedFromServer: "Mất kết nối tới máy chủ"
|
||||||
reload: "Tải lại"
|
reload: "Tải lại"
|
||||||
@@ -1212,10 +1211,6 @@ _aboutMisskey:
|
|||||||
donate: "Ủng hộ Misskey"
|
donate: "Ủng hộ Misskey"
|
||||||
morePatrons: "Chúng tôi cũng trân trọng sự hỗ trợ của nhiều người đóng góp khác không được liệt kê ở đây. Cảm ơn! 🥰"
|
morePatrons: "Chúng tôi cũng trân trọng sự hỗ trợ của nhiều người đóng góp khác không được liệt kê ở đây. Cảm ơn! 🥰"
|
||||||
patrons: "Người ủng hộ"
|
patrons: "Người ủng hộ"
|
||||||
_nsfw:
|
|
||||||
respect: "Ẩn nội dung NSFW"
|
|
||||||
ignore: "Hiện nội dung NSFW"
|
|
||||||
force: "Ẩn mọi media"
|
|
||||||
_instanceTicker:
|
_instanceTicker:
|
||||||
none: "Không hiển thị"
|
none: "Không hiển thị"
|
||||||
remote: "Hiện cho người dùng từ máy chủ khác"
|
remote: "Hiện cho người dùng từ máy chủ khác"
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -52,6 +52,10 @@ addToList: "加入至清單"
|
|||||||
sendMessage: "發送訊息"
|
sendMessage: "發送訊息"
|
||||||
copyRSS: "複製RSS"
|
copyRSS: "複製RSS"
|
||||||
copyUsername: "複製使用者名稱"
|
copyUsername: "複製使用者名稱"
|
||||||
|
copyUserId: "複製使用者ID"
|
||||||
|
copyNoteId: "複製貼文ID"
|
||||||
|
copyFileId: "複製檔案ID"
|
||||||
|
copyFolderId: "複製資料夾ID"
|
||||||
searchUser: "搜尋使用者"
|
searchUser: "搜尋使用者"
|
||||||
reply: "回覆"
|
reply: "回覆"
|
||||||
loadMore: "載入更多"
|
loadMore: "載入更多"
|
||||||
@@ -134,8 +138,10 @@ unblockConfirm: "確定解除封鎖此用戶?"
|
|||||||
suspendConfirm: "確定凍結此帳戶?"
|
suspendConfirm: "確定凍結此帳戶?"
|
||||||
unsuspendConfirm: "確定解凍此帳戶?"
|
unsuspendConfirm: "確定解凍此帳戶?"
|
||||||
selectList: "選擇清單"
|
selectList: "選擇清單"
|
||||||
|
editList: "編輯清單"
|
||||||
selectChannel: "選擇頻道"
|
selectChannel: "選擇頻道"
|
||||||
selectAntenna: "選擇天線"
|
selectAntenna: "選擇天線"
|
||||||
|
editAntenna: "編輯天線"
|
||||||
selectWidget: "選擇小工具"
|
selectWidget: "選擇小工具"
|
||||||
editWidgets: "編輯小工具"
|
editWidgets: "編輯小工具"
|
||||||
editWidgetsExit: "完成"
|
editWidgetsExit: "完成"
|
||||||
@@ -309,7 +315,7 @@ copyUrl: "複製URL"
|
|||||||
rename: "重新命名"
|
rename: "重新命名"
|
||||||
avatar: "大頭貼"
|
avatar: "大頭貼"
|
||||||
banner: "橫幅"
|
banner: "橫幅"
|
||||||
nsfw: "敏感內容"
|
displayOfSensitiveMedia: "敏感性媒體的顯示"
|
||||||
whenServerDisconnected: "與伺服器的連接中斷時"
|
whenServerDisconnected: "與伺服器的連接中斷時"
|
||||||
disconnectedFromServer: "與伺服器中斷連線"
|
disconnectedFromServer: "與伺服器中斷連線"
|
||||||
reload: "重新整理"
|
reload: "重新整理"
|
||||||
@@ -750,7 +756,7 @@ editCode: "編輯代碼"
|
|||||||
apply: "套用"
|
apply: "套用"
|
||||||
receiveAnnouncementFromInstance: "接收由本實例發出的電郵通知"
|
receiveAnnouncementFromInstance: "接收由本實例發出的電郵通知"
|
||||||
emailNotification: "郵件通知"
|
emailNotification: "郵件通知"
|
||||||
publish: "發佈"
|
publish: "發布"
|
||||||
inChannelSearch: "頻道内搜尋"
|
inChannelSearch: "頻道内搜尋"
|
||||||
useReactionPickerForContextMenu: "點擊右鍵開啟反應工具欄"
|
useReactionPickerForContextMenu: "點擊右鍵開啟反應工具欄"
|
||||||
typingUsers: "{users}輸入中..."
|
typingUsers: "{users}輸入中..."
|
||||||
@@ -790,6 +796,7 @@ noMaintainerInformationWarning: "尚未設定管理員信息。"
|
|||||||
noBotProtectionWarning: "尚未設定Bot防護。"
|
noBotProtectionWarning: "尚未設定Bot防護。"
|
||||||
configure: "設定"
|
configure: "設定"
|
||||||
postToGallery: "發佈到相簿"
|
postToGallery: "發佈到相簿"
|
||||||
|
postToHashtag: "以此主題標籤發布"
|
||||||
gallery: "相簿"
|
gallery: "相簿"
|
||||||
recentPosts: "最新貼文"
|
recentPosts: "最新貼文"
|
||||||
popularPosts: "熱門的貼文"
|
popularPosts: "熱門的貼文"
|
||||||
@@ -807,7 +814,7 @@ ratio: "%"
|
|||||||
previewNoteText: "預覽文本"
|
previewNoteText: "預覽文本"
|
||||||
customCss: "自定義 CSS"
|
customCss: "自定義 CSS"
|
||||||
customCssWarn: "這個設定必須由具備相關知識的人員操作,不當的設定可能导致客戶端無法正常使用。"
|
customCssWarn: "這個設定必須由具備相關知識的人員操作,不當的設定可能导致客戶端無法正常使用。"
|
||||||
global: "公開"
|
global: "全域"
|
||||||
squareAvatars: "頭像以方形顯示"
|
squareAvatars: "頭像以方形顯示"
|
||||||
sent: "發送"
|
sent: "發送"
|
||||||
received: "收取"
|
received: "收取"
|
||||||
@@ -823,6 +830,7 @@ translatedFrom: "從 {x} 翻譯"
|
|||||||
accountDeletionInProgress: "正在刪除帳戶"
|
accountDeletionInProgress: "正在刪除帳戶"
|
||||||
usernameInfo: "在伺服器上您的帳戶是唯一的識別名稱。您可以使用字母 (a ~ z, A ~ Z)、數字 (0 ~ 9) 和下底線 (_)。之後帳戶名是不能更改的。"
|
usernameInfo: "在伺服器上您的帳戶是唯一的識別名稱。您可以使用字母 (a ~ z, A ~ Z)、數字 (0 ~ 9) 和下底線 (_)。之後帳戶名是不能更改的。"
|
||||||
aiChanMode: "小藍模式"
|
aiChanMode: "小藍模式"
|
||||||
|
devMode: "開發者模式"
|
||||||
keepCw: "保持CW"
|
keepCw: "保持CW"
|
||||||
pubSub: "Pub/Sub 帳戶"
|
pubSub: "Pub/Sub 帳戶"
|
||||||
lastCommunication: "最近的通信"
|
lastCommunication: "最近的通信"
|
||||||
@@ -832,6 +840,8 @@ breakFollow: "解除追隨者"
|
|||||||
breakFollowConfirm: "確定要取消被追隨嗎?"
|
breakFollowConfirm: "確定要取消被追隨嗎?"
|
||||||
itsOn: "已開啟"
|
itsOn: "已開啟"
|
||||||
itsOff: "已關閉"
|
itsOff: "已關閉"
|
||||||
|
on: "開啟"
|
||||||
|
off: "關閉"
|
||||||
emailRequiredForSignup: "註冊帳戶需要電子郵件地址"
|
emailRequiredForSignup: "註冊帳戶需要電子郵件地址"
|
||||||
unread: "未讀"
|
unread: "未讀"
|
||||||
filter: "篩選"
|
filter: "篩選"
|
||||||
@@ -842,7 +852,7 @@ makeReactionsPublicDescription: "將您做過的反應設為公開可見。"
|
|||||||
classic: "經典"
|
classic: "經典"
|
||||||
muteThread: "將貼文串設為靜音"
|
muteThread: "將貼文串設為靜音"
|
||||||
unmuteThread: "將貼文串的靜音解除"
|
unmuteThread: "將貼文串的靜音解除"
|
||||||
ffVisibility: "連接的公開範圍"
|
ffVisibility: "連繫的可見性"
|
||||||
ffVisibilityDescription: "您可以設定您的關注/關注者資訊的公開範圍"
|
ffVisibilityDescription: "您可以設定您的關注/關注者資訊的公開範圍"
|
||||||
continueThread: "查看更多貼文"
|
continueThread: "查看更多貼文"
|
||||||
deleteAccountConfirm: "將要刪除帳戶。是否確定?"
|
deleteAccountConfirm: "將要刪除帳戶。是否確定?"
|
||||||
@@ -986,10 +996,13 @@ cannotBeChangedLater: "之後不能變更。"
|
|||||||
reactionAcceptance: "接受表情反應"
|
reactionAcceptance: "接受表情反應"
|
||||||
likeOnly: "僅限讚"
|
likeOnly: "僅限讚"
|
||||||
likeOnlyForRemote: "遠端僅限讚"
|
likeOnlyForRemote: "遠端僅限讚"
|
||||||
|
nonSensitiveOnly: "僅限非敏感"
|
||||||
|
nonSensitiveOnlyForLocalLikeOnlyForRemote: "僅限非敏感(遠端僅限按讚)"
|
||||||
rolesAssignedToMe: "指派給自己的角色"
|
rolesAssignedToMe: "指派給自己的角色"
|
||||||
resetPasswordConfirm: "重設密碼?"
|
resetPasswordConfirm: "重設密碼?"
|
||||||
sensitiveWords: "敏感詞"
|
sensitiveWords: "敏感詞"
|
||||||
sensitiveWordsDescription: "將含有設定詞彙的貼文可見性設為發送至首頁。可以用換行來進行複數的設定。"
|
sensitiveWordsDescription: "將含有設定詞彙的貼文可見性設為發送至首頁。可以用換行來進行複數的設定。"
|
||||||
|
sensitiveWordsDescription2: "用空格分隔關鍵詞構成AND格式,用斜線包圍關鍵字構成正規表達式。"
|
||||||
notesSearchNotAvailable: "無法使用搜尋貼文功能。"
|
notesSearchNotAvailable: "無法使用搜尋貼文功能。"
|
||||||
license: "授權"
|
license: "授權"
|
||||||
unfavoriteConfirm: "要取消收錄我的最愛嗎?"
|
unfavoriteConfirm: "要取消收錄我的最愛嗎?"
|
||||||
@@ -1036,7 +1049,42 @@ channelArchiveConfirmTitle: "要封存{name}嗎?"
|
|||||||
channelArchiveConfirmDescription: "封存以後,在頻道列表與搜索結果中不會顯示,也無法發布新的貼文。"
|
channelArchiveConfirmDescription: "封存以後,在頻道列表與搜索結果中不會顯示,也無法發布新的貼文。"
|
||||||
thisChannelArchived: "這個頻道已被封存。"
|
thisChannelArchived: "這個頻道已被封存。"
|
||||||
displayOfNote: "顯示貼文"
|
displayOfNote: "顯示貼文"
|
||||||
youFollowing: "關注中"
|
initialAccountSetting: "初始設定"
|
||||||
|
youFollowing: "追隨中"
|
||||||
|
preventAiLearning: "拒絕接受生成式AI的訓練"
|
||||||
|
preventAiLearningDescription: "要求外部的文章生成式AI或圖像生成式AI不以發布的貼文和圖像等內容為學習對象。這是透過在HTML響應中包含noai旗標來實現的,但不能完全防止AI的學習,因為這要看該AI是否遵守這個要求。"
|
||||||
|
options: "選項"
|
||||||
|
specifyUser: "指定使用者"
|
||||||
|
failedToPreviewUrl: "無法預覽"
|
||||||
|
update: "更新"
|
||||||
|
rolesThatCanBeUsedThisEmojiAsReaction: "可以用這個做為反應的角色"
|
||||||
|
rolesThatCanBeUsedThisEmojiAsReactionEmptyDescription: "未指定角色的情況,則任何人都可以將它用做反應。"
|
||||||
|
rolesThatCanBeUsedThisEmojiAsReactionPublicRoleWarn: "角色必須是公開的角色。"
|
||||||
|
cancelReactionConfirm: "要取消做出的反應嗎?"
|
||||||
|
changeReactionConfirm: "要變更做出的反應嗎?"
|
||||||
|
later: "稍後再說"
|
||||||
|
goToMisskey: "往Misskey"
|
||||||
|
additionalEmojiDictionary: "表情符號的附加辭典"
|
||||||
|
installed: "已安裝"
|
||||||
|
branding: "品牌宣傳"
|
||||||
|
enableServerMachineStats: "公布伺服器的機器資訊"
|
||||||
|
enableIdenticonGeneration: "啟用每個使用者的Identicon"
|
||||||
|
turnOffToImprovePerformance: "關閉時會提高性能。"
|
||||||
|
_initialAccountSetting:
|
||||||
|
accountCreated: "帳戶已建立完成!"
|
||||||
|
letsStartAccountSetup: "來進行帳戶的初始設定吧。"
|
||||||
|
letsFillYourProfile: "首先,來設定您的個人檔案吧。"
|
||||||
|
profileSetting: "個人檔案設定"
|
||||||
|
privacySetting: "隱私設定"
|
||||||
|
theseSettingsCanEditLater: "這裡的設定可以在之後變更。"
|
||||||
|
youCanEditMoreSettingsInSettingsPageLater: "除此之外,還可以在「設定」頁面進行各種設定。之後請確認看看。"
|
||||||
|
followUsers: "為了構築時間軸,試著追蹤您感興趣的使用者吧。"
|
||||||
|
pushNotificationDescription: "啟用推送通知,就可以在設備上接收{name}的通知。"
|
||||||
|
initialAccountSettingCompleted: "初始設定完成了!"
|
||||||
|
haveFun: "盡情享受{name}吧!"
|
||||||
|
ifYouNeedLearnMore: "關於如何使用{name}(Misskey)的詳細資訊,請見{link}。"
|
||||||
|
skipAreYouSure: "要略過初始設定嗎?"
|
||||||
|
laterAreYouSure: "稍後再重新進行初始設定嗎?"
|
||||||
_serverRules:
|
_serverRules:
|
||||||
description: "設定伺服器的簡要規則,在新的註冊之前顯示。建議的內容是使用條款的摘要。"
|
description: "設定伺服器的簡要規則,在新的註冊之前顯示。建議的內容是使用條款的摘要。"
|
||||||
_accountMigration:
|
_accountMigration:
|
||||||
@@ -1316,7 +1364,7 @@ _role:
|
|||||||
iconUrl: "圖示的URL"
|
iconUrl: "圖示的URL"
|
||||||
asBadge: "顯示為徽章"
|
asBadge: "顯示為徽章"
|
||||||
descriptionOfAsBadge: "開啟的話,角色圖示會顯示在用戶名旁邊。"
|
descriptionOfAsBadge: "開啟的話,角色圖示會顯示在用戶名旁邊。"
|
||||||
isExplorable: "公開角色時間軸"
|
isExplorable: "讓使用者更容易找到您"
|
||||||
descriptionOfIsExplorable: "若開啟則公開角色時間軸。若角色不是公開的,則無法公開時間軸。"
|
descriptionOfIsExplorable: "若開啟則公開角色時間軸。若角色不是公開的,則無法公開時間軸。"
|
||||||
displayOrder: "顯示順序"
|
displayOrder: "顯示順序"
|
||||||
descriptionOfDisplayOrder: "數字越大,顯示在UI上的越上面。"
|
descriptionOfDisplayOrder: "數字越大,顯示在UI上的越上面。"
|
||||||
@@ -1376,7 +1424,7 @@ _emailUnavailable:
|
|||||||
mx: "郵件伺服器不正確"
|
mx: "郵件伺服器不正確"
|
||||||
smtp: "郵件伺服器沒有應答"
|
smtp: "郵件伺服器沒有應答"
|
||||||
_ffVisibility:
|
_ffVisibility:
|
||||||
public: "發佈"
|
public: "公開"
|
||||||
followers: "只有關注你的用戶能看到"
|
followers: "只有關注你的用戶能看到"
|
||||||
private: "私密"
|
private: "私密"
|
||||||
_signup:
|
_signup:
|
||||||
@@ -1394,6 +1442,7 @@ _ad:
|
|||||||
back: "返回"
|
back: "返回"
|
||||||
reduceFrequencyOfThisAd: "降低此廣告的頻率 "
|
reduceFrequencyOfThisAd: "降低此廣告的頻率 "
|
||||||
hide: "隱藏"
|
hide: "隱藏"
|
||||||
|
timezoneinfo: "星期幾是由伺服器的時區指定的。"
|
||||||
_forgotPassword:
|
_forgotPassword:
|
||||||
enterEmail: "請輸入您的帳戶註冊的電子郵件地址。 密碼重置連結將被發送到該電子郵件地址。"
|
enterEmail: "請輸入您的帳戶註冊的電子郵件地址。 密碼重置連結將被發送到該電子郵件地址。"
|
||||||
ifNoEmail: "如果您還沒有註冊您的電子郵件地址,請聯繫管理員。 "
|
ifNoEmail: "如果您還沒有註冊您的電子郵件地址,請聯繫管理員。 "
|
||||||
@@ -1445,10 +1494,10 @@ _aboutMisskey:
|
|||||||
donate: "贊助Misskey"
|
donate: "贊助Misskey"
|
||||||
morePatrons: "還有許許多多幫助我們的其他人,非常感謝你們。 🥰"
|
morePatrons: "還有許許多多幫助我們的其他人,非常感謝你們。 🥰"
|
||||||
patrons: "贊助者"
|
patrons: "贊助者"
|
||||||
_nsfw:
|
_displayOfSensitiveMedia:
|
||||||
respect: "隱藏敏感內容"
|
respect: "隱藏設定為敏感的媒體"
|
||||||
ignore: "不隱藏敏感內容"
|
ignore: "不隱藏設定為敏感的媒體"
|
||||||
force: "隱藏所有內容"
|
force: "隱藏所有媒體"
|
||||||
_instanceTicker:
|
_instanceTicker:
|
||||||
none: "隱藏"
|
none: "隱藏"
|
||||||
remote: "向遠端使用者顯示"
|
remote: "向遠端使用者顯示"
|
||||||
@@ -1464,7 +1513,7 @@ _channel:
|
|||||||
removeBanner: "移除橫幅圖像"
|
removeBanner: "移除橫幅圖像"
|
||||||
featured: "熱門貼文"
|
featured: "熱門貼文"
|
||||||
owned: "管理中"
|
owned: "管理中"
|
||||||
following: "關注中"
|
following: "追隨中"
|
||||||
usersCount: "有{n}人參與"
|
usersCount: "有{n}人參與"
|
||||||
notesCount: "有{n}個貼文"
|
notesCount: "有{n}個貼文"
|
||||||
nameAndDescription: "名稱與說明"
|
nameAndDescription: "名稱與說明"
|
||||||
@@ -1586,6 +1635,16 @@ _time:
|
|||||||
minute: "分鐘"
|
minute: "分鐘"
|
||||||
hour: "小時"
|
hour: "小時"
|
||||||
day: "日"
|
day: "日"
|
||||||
|
_timelineTutorial:
|
||||||
|
title: "Misskey的使用方法"
|
||||||
|
step1_1: "這個畫面是「時間軸」。發布到{name}的「貼文」按照時間順序顯示。"
|
||||||
|
step1_2: "時間軸有多種類型,例如在「首頁時間軸」中流動的是您追蹤的人的貼文;而在「本地時間軸」流動的是{name}全體的貼文。"
|
||||||
|
step2_1: "試試看,發布個貼文吧!按畫面上鉛筆圖示的按鈕開啟表格。"
|
||||||
|
step2_2: "初次貼文的內容,建議包括自我介紹以及「開始使用{name}」。"
|
||||||
|
step3_1: "貼文發出去了嗎?"
|
||||||
|
step3_2: "如果你的貼文出現在時間軸上,就代表發文成功。"
|
||||||
|
step4_1: "可以對貼文標記「反應」。"
|
||||||
|
step4_2: "點擊貼文的「+」圖示,即可選擇喜好的表情符號來標記反應。"
|
||||||
_2fa:
|
_2fa:
|
||||||
alreadyRegistered: "此設備已經被註冊過了"
|
alreadyRegistered: "此設備已經被註冊過了"
|
||||||
registerTOTP: "開始設定驗證應用程式"
|
registerTOTP: "開始設定驗證應用程式"
|
||||||
@@ -1728,11 +1787,11 @@ _visibility:
|
|||||||
public: "公開"
|
public: "公開"
|
||||||
publicDescription: "發布給所有用戶 "
|
publicDescription: "發布給所有用戶 "
|
||||||
home: "首頁"
|
home: "首頁"
|
||||||
homeDescription: "僅發送至首頁的時間軸"
|
homeDescription: "僅發布至首頁的時間軸"
|
||||||
followers: "追隨者"
|
followers: "追隨者"
|
||||||
followersDescription: "僅發送至關注者"
|
followersDescription: "僅發布至關注者"
|
||||||
specified: "指定使用者"
|
specified: "指定使用者"
|
||||||
specifiedDescription: "僅發送至指定使用者"
|
specifiedDescription: "僅發布至指定使用者"
|
||||||
disableFederation: "停用聯邦"
|
disableFederation: "停用聯邦"
|
||||||
disableFederationDescription: "不要傳遞給其他實例"
|
disableFederationDescription: "不要傳遞給其他實例"
|
||||||
_postForm:
|
_postForm:
|
||||||
|
|||||||
18
package.json
18
package.json
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "misskey",
|
"name": "misskey",
|
||||||
"version": "13.12.0-beta.6",
|
"version": "13.14.0-beta.2",
|
||||||
"codename": "nasubi",
|
"codename": "nasubi",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/misskey-dev/misskey.git"
|
"url": "https://github.com/misskey-dev/misskey.git"
|
||||||
},
|
},
|
||||||
"packageManager": "pnpm@8.3.1",
|
"packageManager": "pnpm@8.6.0",
|
||||||
"workspaces": [
|
"workspaces": [
|
||||||
"packages/frontend",
|
"packages/frontend",
|
||||||
"packages/backend",
|
"packages/backend",
|
||||||
@@ -25,7 +25,7 @@
|
|||||||
"migrateandstart": "pnpm migrate && pnpm start",
|
"migrateandstart": "pnpm migrate && pnpm start",
|
||||||
"gulp": "pnpm exec gulp build",
|
"gulp": "pnpm exec gulp build",
|
||||||
"watch": "pnpm dev",
|
"watch": "pnpm dev",
|
||||||
"dev": "node ./scripts/dev.js",
|
"dev": "node ./scripts/dev.mjs",
|
||||||
"lint": "pnpm -r lint",
|
"lint": "pnpm -r lint",
|
||||||
"cy:open": "pnpm cypress open --browser --e2e --config-file=cypress.config.ts",
|
"cy:open": "pnpm cypress open --browser --e2e --config-file=cypress.config.ts",
|
||||||
"cy:run": "pnpm cypress run",
|
"cy:run": "pnpm cypress run",
|
||||||
@@ -44,23 +44,23 @@
|
|||||||
"lodash": "4.17.21"
|
"lodash": "4.17.21"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"execa": "5.1.1",
|
"execa": "7.1.1",
|
||||||
"gulp": "4.0.2",
|
"gulp": "4.0.2",
|
||||||
"gulp-cssnano": "2.1.3",
|
"gulp-cssnano": "2.1.3",
|
||||||
"gulp-rename": "2.0.0",
|
"gulp-rename": "2.0.0",
|
||||||
"gulp-replace": "1.1.4",
|
"gulp-replace": "1.1.4",
|
||||||
"gulp-terser": "2.1.0",
|
"gulp-terser": "2.1.0",
|
||||||
"js-yaml": "4.1.0",
|
"js-yaml": "4.1.0",
|
||||||
"typescript": "5.0.4"
|
"typescript": "5.1.6"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/gulp": "4.0.10",
|
"@types/gulp": "4.0.10",
|
||||||
"@types/gulp-rename": "2.0.1",
|
"@types/gulp-rename": "2.0.1",
|
||||||
"@typescript-eslint/eslint-plugin": "5.59.2",
|
"@typescript-eslint/eslint-plugin": "5.61.0",
|
||||||
"@typescript-eslint/parser": "5.59.2",
|
"@typescript-eslint/parser": "5.61.0",
|
||||||
"cross-env": "7.0.3",
|
"cross-env": "7.0.3",
|
||||||
"cypress": "12.11.0",
|
"cypress": "12.17.0",
|
||||||
"eslint": "8.39.0",
|
"eslint": "8.44.0",
|
||||||
"start-server-and-test": "2.0.0"
|
"start-server-and-test": "2.0.0"
|
||||||
},
|
},
|
||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
"paths": {
|
"paths": {
|
||||||
"@/*": ["*"]
|
"@/*": ["*"]
|
||||||
},
|
},
|
||||||
"target": "es2021"
|
"target": "es2022"
|
||||||
},
|
},
|
||||||
"minify": false
|
"minify": false
|
||||||
}
|
}
|
||||||
|
|||||||
BIN
packages/backend/assets/avatar.png
Normal file
BIN
packages/backend/assets/avatar.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 13 KiB |
9
packages/backend/migration/1677054292210-ad4.js
Normal file
9
packages/backend/migration/1677054292210-ad4.js
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
export class ad1677054292210 {
|
||||||
|
name = 'ad1677054292210';
|
||||||
|
async up(queryRunner) {
|
||||||
|
await queryRunner.query(`ALTER TABLE "ad" ADD "dayOfWeek" integer NOT NULL Default 0`);
|
||||||
|
}
|
||||||
|
async down(queryRunner) {
|
||||||
|
await queryRunner.query(`ALTER TABLE "ad" DROP COLUMN "dayOfWeek"`);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
export class PreventAiLarning1683682889948 {
|
||||||
|
name = 'PreventAiLarning1683682889948'
|
||||||
|
|
||||||
|
async up(queryRunner) {
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" ADD "preventAiLarning" boolean NOT NULL DEFAULT true`);
|
||||||
|
}
|
||||||
|
|
||||||
|
async down(queryRunner) {
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "preventAiLarning"`);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
export class PublicReactionsDefaultTrue1683683083083 {
|
||||||
|
name = 'PublicReactionsDefaultTrue1683683083083'
|
||||||
|
|
||||||
|
async up(queryRunner) {
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "publicReactions" SET DEFAULT true`);
|
||||||
|
}
|
||||||
|
|
||||||
|
async down(queryRunner) {
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "publicReactions" SET DEFAULT false`);
|
||||||
|
}
|
||||||
|
}
|
||||||
11
packages/backend/migration/1683789676867-fix-typo.js
Normal file
11
packages/backend/migration/1683789676867-fix-typo.js
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
export class FixTypo1683789676867 {
|
||||||
|
name = 'FixTypo1683789676867'
|
||||||
|
|
||||||
|
async up(queryRunner) {
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" RENAME COLUMN "preventAiLarning" TO "preventAiLearning"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
async down(queryRunner) {
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" RENAME COLUMN "preventAiLearning" TO "preventAiLarning"`);
|
||||||
|
}
|
||||||
|
}
|
||||||
13
packages/backend/migration/1683847157541-UserList.js
Normal file
13
packages/backend/migration/1683847157541-UserList.js
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
export class UserList1683847157541 {
|
||||||
|
name = 'UserList1683847157541'
|
||||||
|
|
||||||
|
async up(queryRunner) {
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_list" ADD "isPublic" boolean NOT NULL DEFAULT false`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_48a00f08598662b9ca540521eb" ON "user_list" ("isPublic") `);
|
||||||
|
}
|
||||||
|
|
||||||
|
async down(queryRunner) {
|
||||||
|
await queryRunner.query(`DROP INDEX "public"."IDX_48a00f08598662b9ca540521eb"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_list" DROP COLUMN "isPublic"`);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
export class UserListFavorites1683869758873 {
|
||||||
|
name = 'UserListFavorites1683869758873'
|
||||||
|
|
||||||
|
async up(queryRunner) {
|
||||||
|
await queryRunner.query(`CREATE TABLE "user_list_favorite" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "userListId" character varying(32) NOT NULL, CONSTRAINT "PK_c0974b21e18502a4c8178e09fe6" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_016f613dc4feb807e03e3e7da9" ON "user_list_favorite" ("userId") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_d6765a8c2a4c17c33f9d7f948b" ON "user_list_favorite" ("userId", "userListId") `);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_list_favorite" ADD CONSTRAINT "FK_016f613dc4feb807e03e3e7da92" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_list_favorite" ADD CONSTRAINT "FK_4d52b20bfe32c8552e7a61e80d2" FOREIGN KEY ("userListId") REFERENCES "user_list"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
}
|
||||||
|
|
||||||
|
async down(queryRunner) {
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_list_favorite" DROP CONSTRAINT "FK_4d52b20bfe32c8552e7a61e80d2"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_list_favorite" DROP CONSTRAINT "FK_016f613dc4feb807e03e3e7da92"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "public"."IDX_d6765a8c2a4c17c33f9d7f948b"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "public"."IDX_016f613dc4feb807e03e3e7da9"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "user_list_favorite"`);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
export class RemoveShowTimelineReplies1684206886988 {
|
||||||
|
name = 'RemoveShowTimelineReplies1684206886988'
|
||||||
|
|
||||||
|
async up(queryRunner) {
|
||||||
|
await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "showTimelineReplies"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
async down(queryRunner) {
|
||||||
|
await queryRunner.query(`ALTER TABLE "user" ADD "showTimelineReplies" boolean NOT NULL DEFAULT false`);
|
||||||
|
}
|
||||||
|
}
|
||||||
15
packages/backend/migration/1684386446061-emoji-improve.js
Normal file
15
packages/backend/migration/1684386446061-emoji-improve.js
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
export class EmojiImprove1684386446061 {
|
||||||
|
name = 'EmojiImprove1684386446061'
|
||||||
|
|
||||||
|
async up(queryRunner) {
|
||||||
|
await queryRunner.query(`ALTER TABLE "emoji" ADD "localOnly" boolean NOT NULL DEFAULT false`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "emoji" ADD "isSensitive" boolean NOT NULL DEFAULT false`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "emoji" ADD "roleIdsThatCanBeUsedThisEmojiAsReaction" character varying(128) array NOT NULL DEFAULT '{}'`);
|
||||||
|
}
|
||||||
|
|
||||||
|
async down(queryRunner) {
|
||||||
|
await queryRunner.query(`ALTER TABLE "emoji" DROP COLUMN "roleIdsThatCanBeUsedThisEmojiAsReaction"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "emoji" DROP COLUMN "isSensitive"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "emoji" DROP COLUMN "localOnly"`);
|
||||||
|
}
|
||||||
|
}
|
||||||
17
packages/backend/migration/1685973839966-errorImageUrl.js
Normal file
17
packages/backend/migration/1685973839966-errorImageUrl.js
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
export class ErrorImageUrl1685973839966 {
|
||||||
|
name = 'ErrorImageUrl1685973839966'
|
||||||
|
|
||||||
|
async up(queryRunner) {
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "errorImageUrl"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" ADD "serverErrorImageUrl" character varying(1024)`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" ADD "notFoundImageUrl" character varying(1024)`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" ADD "infoImageUrl" character varying(1024)`);
|
||||||
|
}
|
||||||
|
|
||||||
|
async down(queryRunner) {
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "infoImageUrl"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "notFoundImageUrl"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "serverErrorImageUrl"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" ADD "errorImageUrl" character varying(1024) DEFAULT 'https://xn--931a.moe/aiart/yubitun.png'`);
|
||||||
|
}
|
||||||
|
}
|
||||||
13
packages/backend/migration/1688280713783-add-meta-options.js
Normal file
13
packages/backend/migration/1688280713783-add-meta-options.js
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
export class AddMetaOptions1688280713783 {
|
||||||
|
name = 'AddMetaOptions1688280713783'
|
||||||
|
|
||||||
|
async up(queryRunner) {
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" ADD "enableServerMachineStats" boolean NOT NULL DEFAULT false`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" ADD "enableIdenticonGeneration" boolean NOT NULL DEFAULT true`);
|
||||||
|
}
|
||||||
|
|
||||||
|
async down(queryRunner) {
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "enableIdenticonGeneration"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "enableServerMachineStats"`);
|
||||||
|
}
|
||||||
|
}
|
||||||
11
packages/backend/migration/1689102832143-nsfw-cache.js
Normal file
11
packages/backend/migration/1689102832143-nsfw-cache.js
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
export class NsfwCache1689102832143 {
|
||||||
|
name = 'NsfwCache1689102832143'
|
||||||
|
|
||||||
|
async up(queryRunner) {
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" ADD "cacheRemoteSensitiveFiles" boolean NOT NULL DEFAULT true`);
|
||||||
|
}
|
||||||
|
|
||||||
|
async down(queryRunner) {
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "cacheRemoteSensitiveFiles"`);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -3,6 +3,9 @@
|
|||||||
"main": "./index.js",
|
"main": "./index.js",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=18.16.0"
|
||||||
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "node ./built/index.js",
|
"start": "node ./built/index.js",
|
||||||
"start:test": "NODE_ENV=test node ./built/index.js",
|
"start:test": "NODE_ENV=test node ./built/index.js",
|
||||||
@@ -35,49 +38,53 @@
|
|||||||
"@swc/core-win32-x64-msvc": "1.3.56",
|
"@swc/core-win32-x64-msvc": "1.3.56",
|
||||||
"@tensorflow/tfjs": "4.4.0",
|
"@tensorflow/tfjs": "4.4.0",
|
||||||
"@tensorflow/tfjs-node": "4.4.0",
|
"@tensorflow/tfjs-node": "4.4.0",
|
||||||
"slacc-android-arm-eabi": "0.0.7",
|
"bufferutil": "^4.0.7",
|
||||||
"slacc-android-arm64": "0.0.7",
|
"slacc-android-arm-eabi": "0.0.9",
|
||||||
"slacc-darwin-arm64": "0.0.7",
|
"slacc-android-arm64": "0.0.9",
|
||||||
"slacc-darwin-universal": "0.0.7",
|
"slacc-darwin-arm64": "0.0.9",
|
||||||
"slacc-darwin-x64": "0.0.7",
|
"slacc-darwin-universal": "0.0.9",
|
||||||
"slacc-linux-arm-gnueabihf": "0.0.7",
|
"slacc-darwin-x64": "0.0.9",
|
||||||
"slacc-linux-arm64-gnu": "0.0.7",
|
"slacc-freebsd-x64": "0.0.9",
|
||||||
"slacc-linux-arm64-musl": "0.0.7",
|
"slacc-linux-arm-gnueabihf": "0.0.9",
|
||||||
"slacc-linux-x64-gnu": "0.0.7",
|
"slacc-linux-arm64-gnu": "0.0.9",
|
||||||
"slacc-win32-arm64-msvc": "0.0.7",
|
"slacc-linux-arm64-musl": "0.0.9",
|
||||||
"slacc-win32-x64-msvc": "0.0.7"
|
"slacc-linux-x64-gnu": "0.0.9",
|
||||||
|
"slacc-win32-arm64-msvc": "0.0.9",
|
||||||
|
"slacc-win32-x64-msvc": "0.0.9",
|
||||||
|
"utf-8-validate": "^6.0.3"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@aws-sdk/client-s3": "3.321.1",
|
"@aws-sdk/client-s3": "3.367.0",
|
||||||
"@aws-sdk/lib-storage": "3.321.1",
|
"@aws-sdk/lib-storage": "3.367.0",
|
||||||
"@aws-sdk/node-http-handler": "3.321.1",
|
"@aws-sdk/node-http-handler": "3.360.0",
|
||||||
"@bull-board/api": "5.1.2",
|
"@bull-board/api": "5.6.0",
|
||||||
"@bull-board/fastify": "5.1.2",
|
"@bull-board/fastify": "5.6.0",
|
||||||
"@bull-board/ui": "5.1.2",
|
"@bull-board/ui": "5.6.0",
|
||||||
"@discordapp/twemoji": "14.1.2",
|
"@discordapp/twemoji": "14.1.2",
|
||||||
"@fastify/accepts": "4.1.0",
|
"@fastify/accepts": "4.2.0",
|
||||||
"@fastify/cookie": "8.3.0",
|
"@fastify/cookie": "8.3.0",
|
||||||
"@fastify/cors": "8.2.1",
|
"@fastify/cors": "8.3.0",
|
||||||
"@fastify/http-proxy": "9.0.0",
|
"@fastify/http-proxy": "9.2.1",
|
||||||
"@fastify/multipart": "7.6.0",
|
"@fastify/multipart": "7.7.0",
|
||||||
"@fastify/static": "6.10.1",
|
"@fastify/static": "6.10.2",
|
||||||
"@fastify/view": "7.4.1",
|
"@fastify/view": "8.0.0",
|
||||||
"@nestjs/common": "9.4.0",
|
"@nestjs/common": "10.0.5",
|
||||||
"@nestjs/core": "9.4.0",
|
"@nestjs/core": "10.0.5",
|
||||||
"@nestjs/testing": "9.4.0",
|
"@nestjs/testing": "10.0.5",
|
||||||
"@peertube/http-signature": "1.7.0",
|
"@peertube/http-signature": "1.7.0",
|
||||||
"@sinonjs/fake-timers": "10.0.2",
|
"@sinonjs/fake-timers": "10.3.0",
|
||||||
"@swc/cli": "0.1.62",
|
"@swc/cli": "0.1.62",
|
||||||
"@swc/core": "1.3.56",
|
"@swc/core": "1.3.68",
|
||||||
"accepts": "1.3.8",
|
"accepts": "1.3.8",
|
||||||
"ajv": "8.12.0",
|
"ajv": "8.12.0",
|
||||||
"archiver": "5.3.1",
|
"archiver": "5.3.1",
|
||||||
|
"async-mutex": "^0.4.0",
|
||||||
"autwh": "0.1.0",
|
"autwh": "0.1.0",
|
||||||
"bcryptjs": "2.4.3",
|
"bcryptjs": "2.4.3",
|
||||||
"blurhash": "2.0.5",
|
"blurhash": "2.0.5",
|
||||||
"bull": "4.10.4",
|
"bullmq": "4.2.0",
|
||||||
"cacheable-lookup": "6.1.0",
|
"cacheable-lookup": "7.0.0",
|
||||||
"cbor": "8.1.0",
|
"cbor": "9.0.0",
|
||||||
"chalk": "5.2.0",
|
"chalk": "5.2.0",
|
||||||
"chalk-template": "0.4.0",
|
"chalk-template": "0.4.0",
|
||||||
"chokidar": "3.5.3",
|
"chokidar": "3.5.3",
|
||||||
@@ -87,37 +94,37 @@
|
|||||||
"date-fns": "2.30.0",
|
"date-fns": "2.30.0",
|
||||||
"deep-email-validator": "0.1.21",
|
"deep-email-validator": "0.1.21",
|
||||||
"escape-regexp": "0.0.1",
|
"escape-regexp": "0.0.1",
|
||||||
"fastify": "4.17.0",
|
"fastify": "4.19.2",
|
||||||
"feed": "4.2.2",
|
"feed": "4.2.2",
|
||||||
"file-type": "18.3.0",
|
"file-type": "18.5.0",
|
||||||
"fluent-ffmpeg": "2.1.2",
|
"fluent-ffmpeg": "2.1.2",
|
||||||
"form-data": "4.0.0",
|
"form-data": "4.0.0",
|
||||||
"got": "12.6.0",
|
"got": "13.0.0",
|
||||||
"happy-dom": "9.10.2",
|
"happy-dom": "10.0.3",
|
||||||
"hpagent": "1.2.0",
|
"hpagent": "1.2.0",
|
||||||
"ioredis": "5.3.2",
|
"ioredis": "5.3.2",
|
||||||
"ip-cidr": "3.1.0",
|
"ip-cidr": "3.1.0",
|
||||||
"is-svg": "4.3.2",
|
"ipaddr.js": "2.1.0",
|
||||||
|
"is-svg": "5.0.0",
|
||||||
"js-yaml": "4.1.0",
|
"js-yaml": "4.1.0",
|
||||||
"jsdom": "21.1.1",
|
"jsdom": "22.1.0",
|
||||||
"json5": "2.2.3",
|
"json5": "2.2.3",
|
||||||
"jsonld": "8.1.1",
|
"jsonld": "8.2.0",
|
||||||
"meilisearch": "0.32.3",
|
|
||||||
"jsrsasign": "10.8.6",
|
"jsrsasign": "10.8.6",
|
||||||
|
"meilisearch": "0.33.0",
|
||||||
"mfm-js": "0.23.3",
|
"mfm-js": "0.23.3",
|
||||||
"mime-types": "2.1.35",
|
"mime-types": "2.1.35",
|
||||||
"misskey-js": "workspace:*",
|
"misskey-js": "workspace:*",
|
||||||
"ms": "3.0.0-canary.1",
|
"ms": "3.0.0-canary.1",
|
||||||
"nested-property": "4.0.0",
|
"nested-property": "4.0.0",
|
||||||
"node-fetch": "3.3.1",
|
"node-fetch": "3.3.1",
|
||||||
"nodemailer": "6.9.1",
|
"nodemailer": "6.9.3",
|
||||||
"nsfwjs": "2.4.2",
|
"nsfwjs": "2.4.2",
|
||||||
"oauth": "0.10.0",
|
"oauth": "0.10.0",
|
||||||
"os-utils": "0.0.14",
|
"os-utils": "0.0.14",
|
||||||
"otpauth": "9.1.1",
|
"otpauth": "9.1.3",
|
||||||
"parse5": "7.1.2",
|
"parse5": "7.1.2",
|
||||||
"pg": "8.10.0",
|
"pg": "8.11.1",
|
||||||
"private-ip": "3.0.0",
|
|
||||||
"probe-image-size": "7.2.3",
|
"probe-image-size": "7.2.3",
|
||||||
"promise-limit": "2.7.0",
|
"promise-limit": "2.7.0",
|
||||||
"pug": "3.0.2",
|
"pug": "3.0.2",
|
||||||
@@ -126,90 +133,87 @@
|
|||||||
"qrcode": "1.5.3",
|
"qrcode": "1.5.3",
|
||||||
"random-seed": "0.3.0",
|
"random-seed": "0.3.0",
|
||||||
"ratelimiter": "3.4.1",
|
"ratelimiter": "3.4.1",
|
||||||
"re2": "1.18.0",
|
"re2": "1.19.1",
|
||||||
"redis-lock": "0.1.4",
|
"redis-lock": "0.1.4",
|
||||||
"reflect-metadata": "0.1.13",
|
"reflect-metadata": "0.1.13",
|
||||||
"rename": "1.0.4",
|
"rename": "1.0.4",
|
||||||
"rndstr": "1.0.0",
|
|
||||||
"rss-parser": "3.13.0",
|
"rss-parser": "3.13.0",
|
||||||
"rxjs": "7.8.1",
|
"rxjs": "7.8.1",
|
||||||
"s-age": "1.1.2",
|
"s-age": "1.1.2",
|
||||||
"sanitize-html": "2.10.0",
|
"sanitize-html": "2.11.0",
|
||||||
"seedrandom": "3.0.5",
|
"semver": "7.5.3",
|
||||||
"semver": "7.5.0",
|
|
||||||
"sharp": "0.32.1",
|
"sharp": "0.32.1",
|
||||||
"sharp-read-bmp": "github:misskey-dev/sharp-read-bmp",
|
"sharp-read-bmp": "github:misskey-dev/sharp-read-bmp",
|
||||||
"slacc": "0.0.7",
|
"slacc": "0.0.9",
|
||||||
"strict-event-emitter-types": "2.0.0",
|
"strict-event-emitter-types": "2.0.0",
|
||||||
"stringz": "2.1.0",
|
"stringz": "2.1.0",
|
||||||
"summaly": "github:misskey-dev/summaly",
|
"summaly": "github:misskey-dev/summaly",
|
||||||
"systeminformation": "5.17.12",
|
"systeminformation": "5.18.6",
|
||||||
"tinycolor2": "1.6.0",
|
"tinycolor2": "1.6.0",
|
||||||
"tmp": "0.2.1",
|
"tmp": "0.2.1",
|
||||||
"tsc-alias": "1.8.6",
|
"tsc-alias": "1.8.7",
|
||||||
"tsconfig-paths": "4.2.0",
|
"tsconfig-paths": "4.2.0",
|
||||||
"twemoji-parser": "14.0.0",
|
"twemoji-parser": "14.0.0",
|
||||||
"typeorm": "0.3.15",
|
"typeorm": "0.3.17",
|
||||||
"typescript": "5.0.4",
|
"typescript": "5.1.6",
|
||||||
"ulid": "2.3.0",
|
"ulid": "2.3.0",
|
||||||
"unzipper": "0.10.11",
|
"unzipper": "0.10.14",
|
||||||
"uuid": "9.0.0",
|
"uuid": "9.0.0",
|
||||||
"vary": "1.1.2",
|
"vary": "1.1.2",
|
||||||
"web-push": "3.6.1",
|
"web-push": "3.6.3",
|
||||||
"websocket": "1.0.34",
|
|
||||||
"ws": "8.13.0",
|
"ws": "8.13.0",
|
||||||
"xev": "3.0.2"
|
"xev": "3.0.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@jest/globals": "29.5.0",
|
"@jest/globals": "29.6.1",
|
||||||
"@swc/jest": "0.2.26",
|
"@swc/jest": "0.2.26",
|
||||||
"@types/accepts": "1.3.5",
|
"@types/accepts": "1.3.5",
|
||||||
"@types/archiver": "5.3.2",
|
"@types/archiver": "5.3.2",
|
||||||
"@types/bcryptjs": "2.4.2",
|
"@types/bcryptjs": "2.4.2",
|
||||||
"@types/bull": "4.10.0",
|
|
||||||
"@types/cbor": "6.0.0",
|
"@types/cbor": "6.0.0",
|
||||||
"@types/color-convert": "2.0.0",
|
"@types/color-convert": "2.0.0",
|
||||||
"@types/content-disposition": "0.5.5",
|
"@types/content-disposition": "0.5.5",
|
||||||
"@types/escape-regexp": "0.0.1",
|
"@types/escape-regexp": "0.0.1",
|
||||||
"@types/fluent-ffmpeg": "2.1.21",
|
"@types/fluent-ffmpeg": "2.1.21",
|
||||||
"@types/jest": "29.5.1",
|
"@types/jest": "29.5.2",
|
||||||
"@types/js-yaml": "4.0.5",
|
"@types/js-yaml": "4.0.5",
|
||||||
"@types/jsdom": "21.1.1",
|
"@types/jsdom": "21.1.1",
|
||||||
"@types/jsonld": "1.5.8",
|
"@types/jsonld": "1.5.9",
|
||||||
"@types/jsrsasign": "10.5.8",
|
"@types/jsrsasign": "10.5.8",
|
||||||
"@types/mime-types": "2.1.1",
|
"@types/mime-types": "2.1.1",
|
||||||
"@types/node": "18.16.3",
|
"@types/ms": "^0.7.31",
|
||||||
|
"@types/node": "20.4.0",
|
||||||
"@types/node-fetch": "3.0.3",
|
"@types/node-fetch": "3.0.3",
|
||||||
"@types/nodemailer": "6.4.7",
|
"@types/nodemailer": "6.4.8",
|
||||||
"@types/oauth": "0.9.1",
|
"@types/oauth": "0.9.1",
|
||||||
"@types/pg": "8.6.6",
|
"@types/pg": "8.10.2",
|
||||||
"@types/pug": "2.0.6",
|
"@types/pug": "2.0.6",
|
||||||
"@types/punycode": "2.1.0",
|
"@types/punycode": "2.1.0",
|
||||||
"@types/qrcode": "1.5.0",
|
"@types/qrcode": "1.5.1",
|
||||||
"@types/random-seed": "0.3.3",
|
"@types/random-seed": "0.3.3",
|
||||||
"@types/ratelimiter": "3.4.4",
|
"@types/ratelimiter": "3.4.4",
|
||||||
"@types/redis": "4.0.11",
|
"@types/redis": "4.0.11",
|
||||||
"@types/rename": "1.0.4",
|
"@types/rename": "1.0.4",
|
||||||
"@types/sanitize-html": "2.9.0",
|
"@types/sanitize-html": "2.9.0",
|
||||||
"@types/semver": "7.3.13",
|
"@types/semver": "7.5.0",
|
||||||
"@types/sharp": "0.32.0",
|
"@types/sharp": "0.32.0",
|
||||||
"@types/sinonjs__fake-timers": "8.1.2",
|
"@types/sinonjs__fake-timers": "8.1.2",
|
||||||
"@types/tinycolor2": "1.4.3",
|
"@types/tinycolor2": "1.4.3",
|
||||||
"@types/tmp": "0.2.3",
|
"@types/tmp": "0.2.3",
|
||||||
"@types/unzipper": "0.10.5",
|
"@types/unzipper": "0.10.6",
|
||||||
"@types/uuid": "9.0.1",
|
"@types/uuid": "9.0.2",
|
||||||
"@types/vary": "1.1.0",
|
"@types/vary": "1.1.0",
|
||||||
"@types/web-push": "3.3.2",
|
"@types/web-push": "3.3.2",
|
||||||
"@types/websocket": "1.0.5",
|
"@types/websocket": "1.0.5",
|
||||||
"@types/ws": "8.5.4",
|
"@types/ws": "8.5.5",
|
||||||
"@typescript-eslint/eslint-plugin": "5.59.2",
|
"@typescript-eslint/eslint-plugin": "5.61.0",
|
||||||
"@typescript-eslint/parser": "5.59.2",
|
"@typescript-eslint/parser": "5.61.0",
|
||||||
"aws-sdk-client-mock": "^2.1.1",
|
"aws-sdk-client-mock": "3.0.0",
|
||||||
"cross-env": "7.0.3",
|
"cross-env": "7.0.3",
|
||||||
"eslint": "8.39.0",
|
"eslint": "8.44.0",
|
||||||
"eslint-plugin-import": "2.27.5",
|
"eslint-plugin-import": "2.27.5",
|
||||||
"execa": "6.1.0",
|
"execa": "7.1.1",
|
||||||
"jest": "29.5.0",
|
"jest": "29.6.1",
|
||||||
"jest-mock": "29.5.0"
|
"jest-mock": "29.6.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import * as Redis from 'ioredis';
|
|||||||
import { DataSource } from 'typeorm';
|
import { DataSource } from 'typeorm';
|
||||||
import { MeiliSearch } from 'meilisearch';
|
import { MeiliSearch } from 'meilisearch';
|
||||||
import { DI } from './di-symbols.js';
|
import { DI } from './di-symbols.js';
|
||||||
import { loadConfig } from './config.js';
|
import { Config, loadConfig } from './config.js';
|
||||||
import { createPostgresDataSource } from './postgres.js';
|
import { createPostgresDataSource } from './postgres.js';
|
||||||
import { RepositoryModule } from './models/RepositoryModule.js';
|
import { RepositoryModule } from './models/RepositoryModule.js';
|
||||||
import type { Provider, OnApplicationShutdown } from '@nestjs/common';
|
import type { Provider, OnApplicationShutdown } from '@nestjs/common';
|
||||||
@@ -25,7 +25,7 @@ const $db: Provider = {
|
|||||||
|
|
||||||
const $meilisearch: Provider = {
|
const $meilisearch: Provider = {
|
||||||
provide: DI.meilisearch,
|
provide: DI.meilisearch,
|
||||||
useFactory: (config) => {
|
useFactory: (config: Config) => {
|
||||||
if (config.meilisearch) {
|
if (config.meilisearch) {
|
||||||
return new MeiliSearch({
|
return new MeiliSearch({
|
||||||
host: `${config.meilisearch.ssl ? 'https' : 'http' }://${config.meilisearch.host}:${config.meilisearch.port}`,
|
host: `${config.meilisearch.ssl ? 'https' : 'http' }://${config.meilisearch.host}:${config.meilisearch.port}`,
|
||||||
@@ -40,7 +40,7 @@ const $meilisearch: Provider = {
|
|||||||
|
|
||||||
const $redis: Provider = {
|
const $redis: Provider = {
|
||||||
provide: DI.redis,
|
provide: DI.redis,
|
||||||
useFactory: (config) => {
|
useFactory: (config: Config) => {
|
||||||
return new Redis.Redis({
|
return new Redis.Redis({
|
||||||
port: config.redis.port,
|
port: config.redis.port,
|
||||||
host: config.redis.host,
|
host: config.redis.host,
|
||||||
@@ -55,7 +55,7 @@ const $redis: Provider = {
|
|||||||
|
|
||||||
const $redisForPub: Provider = {
|
const $redisForPub: Provider = {
|
||||||
provide: DI.redisForPub,
|
provide: DI.redisForPub,
|
||||||
useFactory: (config) => {
|
useFactory: (config: Config) => {
|
||||||
const redis = new Redis.Redis({
|
const redis = new Redis.Redis({
|
||||||
port: config.redisForPubsub.port,
|
port: config.redisForPubsub.port,
|
||||||
host: config.redisForPubsub.host,
|
host: config.redisForPubsub.host,
|
||||||
@@ -71,7 +71,7 @@ const $redisForPub: Provider = {
|
|||||||
|
|
||||||
const $redisForSub: Provider = {
|
const $redisForSub: Provider = {
|
||||||
provide: DI.redisForSub,
|
provide: DI.redisForSub,
|
||||||
useFactory: (config) => {
|
useFactory: (config: Config) => {
|
||||||
const redis = new Redis.Redis({
|
const redis = new Redis.Redis({
|
||||||
port: config.redisForPubsub.port,
|
port: config.redisForPubsub.port,
|
||||||
host: config.redisForPubsub.host,
|
host: config.redisForPubsub.host,
|
||||||
@@ -100,7 +100,7 @@ export class GlobalModule implements OnApplicationShutdown {
|
|||||||
@Inject(DI.redisForSub) private redisForSub: Redis.Redis,
|
@Inject(DI.redisForSub) private redisForSub: Redis.Redis,
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
async onApplicationShutdown(signal: string): Promise<void> {
|
public async dispose(): Promise<void> {
|
||||||
if (process.env.NODE_ENV === 'test') {
|
if (process.env.NODE_ENV === 'test') {
|
||||||
// XXX:
|
// XXX:
|
||||||
// Shutting down the existing connections causes errors on Jest as
|
// Shutting down the existing connections causes errors on Jest as
|
||||||
@@ -116,4 +116,8 @@ export class GlobalModule implements OnApplicationShutdown {
|
|||||||
this.redisForSub.disconnect(),
|
this.redisForSub.disconnect(),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async onApplicationShutdown(signal: string): Promise<void> {
|
||||||
|
await this.dispose();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,10 +18,12 @@ export async function server() {
|
|||||||
const serverService = app.get(ServerService);
|
const serverService = app.get(ServerService);
|
||||||
await serverService.launch();
|
await serverService.launch();
|
||||||
|
|
||||||
app.get(ChartManagementService).start();
|
if (process.env.NODE_ENV !== 'test') {
|
||||||
app.get(JanitorService).start();
|
app.get(ChartManagementService).start();
|
||||||
app.get(QueueStatsService).start();
|
app.get(JanitorService).start();
|
||||||
app.get(ServerStatsService).start();
|
app.get(QueueStatsService).start();
|
||||||
|
app.get(ServerStatsService).start();
|
||||||
|
}
|
||||||
|
|
||||||
return app;
|
return app;
|
||||||
}
|
}
|
||||||
@@ -34,4 +36,6 @@ export async function jobQueue() {
|
|||||||
|
|
||||||
jobQueue.get(QueueProcessorService).start();
|
jobQueue.get(QueueProcessorService).start();
|
||||||
jobQueue.get(ChartManagementService).start();
|
jobQueue.get(ChartManagementService).start();
|
||||||
|
|
||||||
|
return jobQueue;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -96,12 +96,6 @@ function showNodejsVersion(): void {
|
|||||||
const nodejsLogger = bootLogger.createSubLogger('nodejs');
|
const nodejsLogger = bootLogger.createSubLogger('nodejs');
|
||||||
|
|
||||||
nodejsLogger.info(`Version ${process.version} detected.`);
|
nodejsLogger.info(`Version ${process.version} detected.`);
|
||||||
|
|
||||||
const minVersion = fs.readFileSync(`${_dirname}/../../../../.node-version`, 'utf-8').trim();
|
|
||||||
if (semver.lt(process.version, minVersion)) {
|
|
||||||
nodejsLogger.error(`At least Node.js ${minVersion} required!`);
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function loadConfigBoot(): Config {
|
function loadConfigBoot(): Config {
|
||||||
|
|||||||
@@ -62,6 +62,7 @@ export type Source = {
|
|||||||
port: string;
|
port: string;
|
||||||
apiKey: string;
|
apiKey: string;
|
||||||
ssl?: boolean;
|
ssl?: boolean;
|
||||||
|
index: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
proxy?: string;
|
proxy?: string;
|
||||||
@@ -143,7 +144,7 @@ export function loadConfig() {
|
|||||||
const clientManifestExists = fs.existsSync(_dirname + '/../../../built/_vite_/manifest.json');
|
const clientManifestExists = fs.existsSync(_dirname + '/../../../built/_vite_/manifest.json');
|
||||||
const clientManifest = clientManifestExists ?
|
const clientManifest = clientManifestExists ?
|
||||||
JSON.parse(fs.readFileSync(`${_dirname}/../../../built/_vite_/manifest.json`, 'utf-8'))
|
JSON.parse(fs.readFileSync(`${_dirname}/../../../built/_vite_/manifest.json`, 'utf-8'))
|
||||||
: { 'src/init.ts': { file: 'src/init.ts' } };
|
: { 'src/_boot_.ts': { file: 'src/_boot_.ts' } };
|
||||||
const config = yaml.load(fs.readFileSync(path, 'utf-8')) as Source;
|
const config = yaml.load(fs.readFileSync(path, 'utf-8')) as Source;
|
||||||
|
|
||||||
const mixin = {} as Mixin;
|
const mixin = {} as Mixin;
|
||||||
@@ -164,7 +165,7 @@ export function loadConfig() {
|
|||||||
mixin.authUrl = `${mixin.scheme}://${mixin.host}/auth`;
|
mixin.authUrl = `${mixin.scheme}://${mixin.host}/auth`;
|
||||||
mixin.driveUrl = `${mixin.scheme}://${mixin.host}/files`;
|
mixin.driveUrl = `${mixin.scheme}://${mixin.host}/files`;
|
||||||
mixin.userAgent = `Misskey/${meta.version} (${config.url})`;
|
mixin.userAgent = `Misskey/${meta.version} (${config.url})`;
|
||||||
mixin.clientEntry = clientManifest['src/init.ts'];
|
mixin.clientEntry = clientManifest['src/_boot_.ts'];
|
||||||
mixin.clientManifestExists = clientManifestExists;
|
mixin.clientManifestExists = clientManifestExists;
|
||||||
|
|
||||||
const externalMediaProxy = config.mediaProxy ?
|
const externalMediaProxy = config.mediaProxy ?
|
||||||
@@ -189,6 +190,6 @@ function tryCreateUrl(url: string) {
|
|||||||
try {
|
try {
|
||||||
return new URL(url);
|
return new URL(url);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
throw `url="${url}" is not a valid URL.`;
|
throw new Error(`url="${url}" is not a valid URL.`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -295,7 +295,7 @@ export class AccountMoveService {
|
|||||||
* dstユーザーのalsoKnownAsをfetchPersonしていき、本当にmovedToUrlをdstに指定するユーザーが存在するのかを調べる
|
* dstユーザーのalsoKnownAsをfetchPersonしていき、本当にmovedToUrlをdstに指定するユーザーが存在するのかを調べる
|
||||||
*
|
*
|
||||||
* @param dst movedToUrlを指定するユーザー
|
* @param dst movedToUrlを指定するユーザー
|
||||||
* @param check
|
* @param check
|
||||||
* @param instant checkがtrueであるユーザーが最初に見つかったら即座にreturnするかどうか
|
* @param instant checkがtrueであるユーザーが最初に見つかったら即座にreturnするかどうか
|
||||||
* @returns Promise<LocalUser | RemoteUser | null>
|
* @returns Promise<LocalUser | RemoteUser | null>
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import { dirname } from 'node:path';
|
|||||||
import { Inject, Injectable } from '@nestjs/common';
|
import { Inject, Injectable } from '@nestjs/common';
|
||||||
import * as nsfw from 'nsfwjs';
|
import * as nsfw from 'nsfwjs';
|
||||||
import si from 'systeminformation';
|
import si from 'systeminformation';
|
||||||
|
import { Mutex } from 'async-mutex';
|
||||||
import type { Config } from '@/config.js';
|
import type { Config } from '@/config.js';
|
||||||
import { DI } from '@/di-symbols.js';
|
import { DI } from '@/di-symbols.js';
|
||||||
import { bindThis } from '@/decorators.js';
|
import { bindThis } from '@/decorators.js';
|
||||||
@@ -17,6 +18,7 @@ let isSupportedCpu: undefined | boolean = undefined;
|
|||||||
@Injectable()
|
@Injectable()
|
||||||
export class AiService {
|
export class AiService {
|
||||||
private model: nsfw.NSFWJS;
|
private model: nsfw.NSFWJS;
|
||||||
|
private modelLoadMutex: Mutex = new Mutex();
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
@Inject(DI.config)
|
@Inject(DI.config)
|
||||||
@@ -31,16 +33,22 @@ export class AiService {
|
|||||||
const cpuFlags = await this.getCpuFlags();
|
const cpuFlags = await this.getCpuFlags();
|
||||||
isSupportedCpu = REQUIRED_CPU_FLAGS.every(required => cpuFlags.includes(required));
|
isSupportedCpu = REQUIRED_CPU_FLAGS.every(required => cpuFlags.includes(required));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isSupportedCpu) {
|
if (!isSupportedCpu) {
|
||||||
console.error('This CPU cannot use TensorFlow.');
|
console.error('This CPU cannot use TensorFlow.');
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
const tf = await import('@tensorflow/tfjs-node');
|
const tf = await import('@tensorflow/tfjs-node');
|
||||||
|
|
||||||
if (this.model == null) this.model = await nsfw.load(`file://${_dirname}/../../nsfw-model/`, { size: 299 });
|
if (this.model == null) {
|
||||||
|
await this.modelLoadMutex.runExclusive(async () => {
|
||||||
|
if (this.model == null) {
|
||||||
|
this.model = await nsfw.load(`file://${_dirname}/../../nsfw-model/`, { size: 299 });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
const buffer = await fs.promises.readFile(path);
|
const buffer = await fs.promises.readFile(path);
|
||||||
const image = await tf.node.decodeImage(buffer, 3) as any;
|
const image = await tf.node.decodeImage(buffer, 3) as any;
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -55,11 +55,6 @@ export class AntennaService implements OnApplicationShutdown {
|
|||||||
this.redisForSub.on('message', this.onRedisMessage);
|
this.redisForSub.on('message', this.onRedisMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
@bindThis
|
|
||||||
public onApplicationShutdown(signal?: string | undefined) {
|
|
||||||
this.redisForSub.off('message', this.onRedisMessage);
|
|
||||||
}
|
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
private async onRedisMessage(_: string, data: string): Promise<void> {
|
private async onRedisMessage(_: string, data: string): Promise<void> {
|
||||||
const obj = JSON.parse(data);
|
const obj = JSON.parse(data);
|
||||||
@@ -104,7 +99,7 @@ export class AntennaService implements OnApplicationShutdown {
|
|||||||
'MAXLEN', '~', '200',
|
'MAXLEN', '~', '200',
|
||||||
'*',
|
'*',
|
||||||
'note', note.id);
|
'note', note.id);
|
||||||
|
|
||||||
this.globalEventService.publishAntennaStream(antenna.id, 'note', note);
|
this.globalEventService.publishAntennaStream(antenna.id, 'note', note);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -117,16 +112,16 @@ export class AntennaService implements OnApplicationShutdown {
|
|||||||
public async checkHitAntenna(antenna: Antenna, note: (Note | Packed<'Note'>), noteUser: { id: User['id']; username: string; host: string | null; }): Promise<boolean> {
|
public async checkHitAntenna(antenna: Antenna, note: (Note | Packed<'Note'>), noteUser: { id: User['id']; username: string; host: string | null; }): Promise<boolean> {
|
||||||
if (note.visibility === 'specified') return false;
|
if (note.visibility === 'specified') return false;
|
||||||
if (note.visibility === 'followers') return false;
|
if (note.visibility === 'followers') return false;
|
||||||
|
|
||||||
if (!antenna.withReplies && note.replyId != null) return false;
|
if (!antenna.withReplies && note.replyId != null) return false;
|
||||||
|
|
||||||
if (antenna.src === 'home') {
|
if (antenna.src === 'home') {
|
||||||
// TODO
|
// TODO
|
||||||
} else if (antenna.src === 'list') {
|
} else if (antenna.src === 'list') {
|
||||||
const listUsers = (await this.userListJoiningsRepository.findBy({
|
const listUsers = (await this.userListJoiningsRepository.findBy({
|
||||||
userListId: antenna.userListId!,
|
userListId: antenna.userListId!,
|
||||||
})).map(x => x.userId);
|
})).map(x => x.userId);
|
||||||
|
|
||||||
if (!listUsers.includes(note.userId)) return false;
|
if (!listUsers.includes(note.userId)) return false;
|
||||||
} else if (antenna.src === 'users') {
|
} else if (antenna.src === 'users') {
|
||||||
const accts = antenna.users.map(x => {
|
const accts = antenna.users.map(x => {
|
||||||
@@ -135,32 +130,32 @@ export class AntennaService implements OnApplicationShutdown {
|
|||||||
});
|
});
|
||||||
if (!accts.includes(this.utilityService.getFullApAccount(noteUser.username, noteUser.host).toLowerCase())) return false;
|
if (!accts.includes(this.utilityService.getFullApAccount(noteUser.username, noteUser.host).toLowerCase())) return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const keywords = antenna.keywords
|
const keywords = antenna.keywords
|
||||||
// Clean up
|
// Clean up
|
||||||
.map(xs => xs.filter(x => x !== ''))
|
.map(xs => xs.filter(x => x !== ''))
|
||||||
.filter(xs => xs.length > 0);
|
.filter(xs => xs.length > 0);
|
||||||
|
|
||||||
if (keywords.length > 0) {
|
if (keywords.length > 0) {
|
||||||
if (note.text == null && note.cw == null) return false;
|
if (note.text == null && note.cw == null) return false;
|
||||||
|
|
||||||
const _text = (note.text ?? '') + '\n' + (note.cw ?? '');
|
const _text = (note.text ?? '') + '\n' + (note.cw ?? '');
|
||||||
|
|
||||||
const matched = keywords.some(and =>
|
const matched = keywords.some(and =>
|
||||||
and.every(keyword =>
|
and.every(keyword =>
|
||||||
antenna.caseSensitive
|
antenna.caseSensitive
|
||||||
? _text.includes(keyword)
|
? _text.includes(keyword)
|
||||||
: _text.toLowerCase().includes(keyword.toLowerCase()),
|
: _text.toLowerCase().includes(keyword.toLowerCase()),
|
||||||
));
|
));
|
||||||
|
|
||||||
if (!matched) return false;
|
if (!matched) return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const excludeKeywords = antenna.excludeKeywords
|
const excludeKeywords = antenna.excludeKeywords
|
||||||
// Clean up
|
// Clean up
|
||||||
.map(xs => xs.filter(x => x !== ''))
|
.map(xs => xs.filter(x => x !== ''))
|
||||||
.filter(xs => xs.length > 0);
|
.filter(xs => xs.length > 0);
|
||||||
|
|
||||||
if (excludeKeywords.length > 0) {
|
if (excludeKeywords.length > 0) {
|
||||||
if (note.text == null && note.cw == null) return false;
|
if (note.text == null && note.cw == null) return false;
|
||||||
|
|
||||||
@@ -172,16 +167,16 @@ export class AntennaService implements OnApplicationShutdown {
|
|||||||
? _text.includes(keyword)
|
? _text.includes(keyword)
|
||||||
: _text.toLowerCase().includes(keyword.toLowerCase()),
|
: _text.toLowerCase().includes(keyword.toLowerCase()),
|
||||||
));
|
));
|
||||||
|
|
||||||
if (matched) return false;
|
if (matched) return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (antenna.withFile) {
|
if (antenna.withFile) {
|
||||||
if (note.fileIds && note.fileIds.length === 0) return false;
|
if (note.fileIds && note.fileIds.length === 0) return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: eval expression
|
// TODO: eval expression
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -193,7 +188,17 @@ export class AntennaService implements OnApplicationShutdown {
|
|||||||
});
|
});
|
||||||
this.antennasFetched = true;
|
this.antennasFetched = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.antennas;
|
return this.antennas;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@bindThis
|
||||||
|
public dispose(): void {
|
||||||
|
this.redisForSub.off('message', this.onRedisMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
@bindThis
|
||||||
|
public onApplicationShutdown(signal?: string | undefined): void {
|
||||||
|
this.dispose();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,11 +32,6 @@ export class AppLockService {
|
|||||||
return this.lock(`ap-object:${uri}`, timeout);
|
return this.lock(`ap-object:${uri}`, timeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
@bindThis
|
|
||||||
public getFetchInstanceMetadataLock(host: string, timeout = 30 * 1000): Promise<() => void> {
|
|
||||||
return this.lock(`instance:${host}`, timeout);
|
|
||||||
}
|
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
public getChartInsertLock(lockKey: string, timeout = 30 * 1000): Promise<() => void> {
|
public getChartInsertLock(lockKey: string, timeout = 30 * 1000): Promise<() => void> {
|
||||||
return this.lock(`chart-insert:${lockKey}`, timeout);
|
return this.lock(`chart-insert:${lockKey}`, timeout);
|
||||||
|
|||||||
@@ -11,10 +11,10 @@ import type { OnApplicationShutdown } from '@nestjs/common';
|
|||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class CacheService implements OnApplicationShutdown {
|
export class CacheService implements OnApplicationShutdown {
|
||||||
public userByIdCache: MemoryKVCache<User>;
|
public userByIdCache: MemoryKVCache<User, User | string>;
|
||||||
public localUserByNativeTokenCache: MemoryKVCache<LocalUser | null>;
|
public localUserByNativeTokenCache: MemoryKVCache<LocalUser | null, string | null>;
|
||||||
public localUserByIdCache: MemoryKVCache<LocalUser>;
|
public localUserByIdCache: MemoryKVCache<LocalUser>;
|
||||||
public uriPersonCache: MemoryKVCache<User | null>;
|
public uriPersonCache: MemoryKVCache<User | null, string | null>;
|
||||||
public userProfileCache: RedisKVCache<UserProfile>;
|
public userProfileCache: RedisKVCache<UserProfile>;
|
||||||
public userMutingsCache: RedisKVCache<Set<string>>;
|
public userMutingsCache: RedisKVCache<Set<string>>;
|
||||||
public userBlockingCache: RedisKVCache<Set<string>>;
|
public userBlockingCache: RedisKVCache<Set<string>>;
|
||||||
@@ -55,10 +55,41 @@ export class CacheService implements OnApplicationShutdown {
|
|||||||
) {
|
) {
|
||||||
//this.onMessage = this.onMessage.bind(this);
|
//this.onMessage = this.onMessage.bind(this);
|
||||||
|
|
||||||
this.userByIdCache = new MemoryKVCache<User>(Infinity);
|
const localUserByIdCache = new MemoryKVCache<LocalUser>(1000 * 60 * 60 * 6 /* 6h */);
|
||||||
this.localUserByNativeTokenCache = new MemoryKVCache<LocalUser | null>(Infinity);
|
this.localUserByIdCache = localUserByIdCache;
|
||||||
this.localUserByIdCache = new MemoryKVCache<LocalUser>(Infinity);
|
|
||||||
this.uriPersonCache = new MemoryKVCache<User | null>(Infinity);
|
// ローカルユーザーならlocalUserByIdCacheにデータを追加し、こちらにはid(文字列)だけを追加する
|
||||||
|
const userByIdCache = new MemoryKVCache<User, User | string>(1000 * 60 * 60 * 6 /* 6h */, {
|
||||||
|
toMapConverter: user => {
|
||||||
|
if (user.host === null) {
|
||||||
|
localUserByIdCache.set(user.id, user as LocalUser);
|
||||||
|
return user.id;
|
||||||
|
}
|
||||||
|
|
||||||
|
return user;
|
||||||
|
},
|
||||||
|
fromMapConverter: userOrId => typeof userOrId === 'string' ? localUserByIdCache.get(userOrId) : userOrId,
|
||||||
|
});
|
||||||
|
this.userByIdCache = userByIdCache;
|
||||||
|
|
||||||
|
this.localUserByNativeTokenCache = new MemoryKVCache<LocalUser | null, string | null>(Infinity, {
|
||||||
|
toMapConverter: user => {
|
||||||
|
if (user === null) return null;
|
||||||
|
|
||||||
|
localUserByIdCache.set(user.id, user);
|
||||||
|
return user.id;
|
||||||
|
},
|
||||||
|
fromMapConverter: id => id === null ? null : localUserByIdCache.get(id),
|
||||||
|
});
|
||||||
|
this.uriPersonCache = new MemoryKVCache<User | null, string | null>(Infinity, {
|
||||||
|
toMapConverter: user => {
|
||||||
|
if (user === null) return null;
|
||||||
|
|
||||||
|
userByIdCache.set(user.id, user);
|
||||||
|
return user.id;
|
||||||
|
},
|
||||||
|
fromMapConverter: id => id === null ? null : userByIdCache.get(id),
|
||||||
|
});
|
||||||
|
|
||||||
this.userProfileCache = new RedisKVCache<UserProfile>(this.redisClient, 'userProfile', {
|
this.userProfileCache = new RedisKVCache<UserProfile>(this.redisClient, 'userProfile', {
|
||||||
lifetime: 1000 * 60 * 30, // 30m
|
lifetime: 1000 * 60 * 30, // 30m
|
||||||
@@ -131,7 +162,7 @@ export class CacheService implements OnApplicationShutdown {
|
|||||||
const user = await this.usersRepository.findOneByOrFail({ id: body.id });
|
const user = await this.usersRepository.findOneByOrFail({ id: body.id });
|
||||||
this.userByIdCache.set(user.id, user);
|
this.userByIdCache.set(user.id, user);
|
||||||
for (const [k, v] of this.uriPersonCache.cache.entries()) {
|
for (const [k, v] of this.uriPersonCache.cache.entries()) {
|
||||||
if (v.value?.id === user.id) {
|
if (v.value === user.id) {
|
||||||
this.uriPersonCache.set(k, user);
|
this.uriPersonCache.set(k, user);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -166,7 +197,23 @@ export class CacheService implements OnApplicationShutdown {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
public onApplicationShutdown(signal?: string | undefined) {
|
public dispose(): void {
|
||||||
this.redisForSub.off('message', this.onMessage);
|
this.redisForSub.off('message', this.onMessage);
|
||||||
|
this.userByIdCache.dispose();
|
||||||
|
this.localUserByNativeTokenCache.dispose();
|
||||||
|
this.localUserByIdCache.dispose();
|
||||||
|
this.uriPersonCache.dispose();
|
||||||
|
this.userProfileCache.dispose();
|
||||||
|
this.userMutingsCache.dispose();
|
||||||
|
this.userBlockingCache.dispose();
|
||||||
|
this.userBlockedCache.dispose();
|
||||||
|
this.renoteMutingsCache.dispose();
|
||||||
|
this.userFollowingsCache.dispose();
|
||||||
|
this.userFollowingChannelsCache.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
@bindThis
|
||||||
|
public onApplicationShutdown(signal?: string | undefined): void {
|
||||||
|
this.dispose();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ export class CaptchaService {
|
|||||||
secret,
|
secret,
|
||||||
response,
|
response,
|
||||||
});
|
});
|
||||||
|
|
||||||
const res = await this.httpRequestService.send(url, {
|
const res = await this.httpRequestService.send(url, {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
body: params.toString(),
|
body: params.toString(),
|
||||||
@@ -28,59 +28,59 @@ export class CaptchaService {
|
|||||||
'Content-Type': 'application/x-www-form-urlencoded',
|
'Content-Type': 'application/x-www-form-urlencoded',
|
||||||
},
|
},
|
||||||
}, { throwErrorWhenResponseNotOk: false });
|
}, { throwErrorWhenResponseNotOk: false });
|
||||||
|
|
||||||
if (!res.ok) {
|
if (!res.ok) {
|
||||||
throw `${res.status}`;
|
throw new Error(`${res.status}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
return await res.json() as CaptchaResponse;
|
return await res.json() as CaptchaResponse;
|
||||||
}
|
}
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
public async verifyRecaptcha(secret: string, response: string | null | undefined): Promise<void> {
|
public async verifyRecaptcha(secret: string, response: string | null | undefined): Promise<void> {
|
||||||
if (response == null) {
|
if (response == null) {
|
||||||
throw 'recaptcha-failed: no response provided';
|
throw new Error('recaptcha-failed: no response provided');
|
||||||
}
|
}
|
||||||
|
|
||||||
const result = await this.getCaptchaResponse('https://www.recaptcha.net/recaptcha/api/siteverify', secret, response).catch(err => {
|
const result = await this.getCaptchaResponse('https://www.recaptcha.net/recaptcha/api/siteverify', secret, response).catch(err => {
|
||||||
throw `recaptcha-request-failed: ${err}`;
|
throw new Error(`recaptcha-request-failed: ${err}`);
|
||||||
});
|
});
|
||||||
|
|
||||||
if (result.success !== true) {
|
if (result.success !== true) {
|
||||||
const errorCodes = result['error-codes'] ? result['error-codes'].join(', ') : '';
|
const errorCodes = result['error-codes'] ? result['error-codes'].join(', ') : '';
|
||||||
throw `recaptcha-failed: ${errorCodes}`;
|
throw new Error(`recaptcha-failed: ${errorCodes}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
public async verifyHcaptcha(secret: string, response: string | null | undefined): Promise<void> {
|
public async verifyHcaptcha(secret: string, response: string | null | undefined): Promise<void> {
|
||||||
if (response == null) {
|
if (response == null) {
|
||||||
throw 'hcaptcha-failed: no response provided';
|
throw new Error('hcaptcha-failed: no response provided');
|
||||||
}
|
}
|
||||||
|
|
||||||
const result = await this.getCaptchaResponse('https://hcaptcha.com/siteverify', secret, response).catch(err => {
|
const result = await this.getCaptchaResponse('https://hcaptcha.com/siteverify', secret, response).catch(err => {
|
||||||
throw `hcaptcha-request-failed: ${err}`;
|
throw new Error(`hcaptcha-request-failed: ${err}`);
|
||||||
});
|
});
|
||||||
|
|
||||||
if (result.success !== true) {
|
if (result.success !== true) {
|
||||||
const errorCodes = result['error-codes'] ? result['error-codes'].join(', ') : '';
|
const errorCodes = result['error-codes'] ? result['error-codes'].join(', ') : '';
|
||||||
throw `hcaptcha-failed: ${errorCodes}`;
|
throw new Error(`hcaptcha-failed: ${errorCodes}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
public async verifyTurnstile(secret: string, response: string | null | undefined): Promise<void> {
|
public async verifyTurnstile(secret: string, response: string | null | undefined): Promise<void> {
|
||||||
if (response == null) {
|
if (response == null) {
|
||||||
throw 'turnstile-failed: no response provided';
|
throw new Error('turnstile-failed: no response provided');
|
||||||
}
|
}
|
||||||
|
|
||||||
const result = await this.getCaptchaResponse('https://challenges.cloudflare.com/turnstile/v0/siteverify', secret, response).catch(err => {
|
const result = await this.getCaptchaResponse('https://challenges.cloudflare.com/turnstile/v0/siteverify', secret, response).catch(err => {
|
||||||
throw `turnstile-request-failed: ${err}`;
|
throw new Error(`turnstile-request-failed: ${err}`);
|
||||||
});
|
});
|
||||||
|
|
||||||
if (result.success !== true) {
|
if (result.success !== true) {
|
||||||
const errorCodes = result['error-codes'] ? result['error-codes'].join(', ') : '';
|
const errorCodes = result['error-codes'] ? result['error-codes'].join(', ') : '';
|
||||||
throw `turnstile-failed: ${errorCodes}`;
|
throw new Error(`turnstile-failed: ${errorCodes}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,27 +25,27 @@ export class CreateSystemUserService {
|
|||||||
@bindThis
|
@bindThis
|
||||||
public async createSystemUser(username: string): Promise<User> {
|
public async createSystemUser(username: string): Promise<User> {
|
||||||
const password = uuid();
|
const password = uuid();
|
||||||
|
|
||||||
// Generate hash of password
|
// Generate hash of password
|
||||||
const salt = await bcrypt.genSalt(8);
|
const salt = await bcrypt.genSalt(8);
|
||||||
const hash = await bcrypt.hash(password, salt);
|
const hash = await bcrypt.hash(password, salt);
|
||||||
|
|
||||||
// Generate secret
|
// Generate secret
|
||||||
const secret = generateNativeUserToken();
|
const secret = generateNativeUserToken();
|
||||||
|
|
||||||
const keyPair = await genRsaKeyPair(4096);
|
const keyPair = await genRsaKeyPair(4096);
|
||||||
|
|
||||||
let account!: User;
|
let account!: User;
|
||||||
|
|
||||||
// Start transaction
|
// Start transaction
|
||||||
await this.db.transaction(async transactionalEntityManager => {
|
await this.db.transaction(async transactionalEntityManager => {
|
||||||
const exist = await transactionalEntityManager.findOneBy(User, {
|
const exist = await transactionalEntityManager.findOneBy(User, {
|
||||||
usernameLower: username.toLowerCase(),
|
usernameLower: username.toLowerCase(),
|
||||||
host: IsNull(),
|
host: IsNull(),
|
||||||
});
|
});
|
||||||
|
|
||||||
if (exist) throw new Error('the user is already exists');
|
if (exist) throw new Error('the user is already exists');
|
||||||
|
|
||||||
account = await transactionalEntityManager.insert(User, {
|
account = await transactionalEntityManager.insert(User, {
|
||||||
id: this.idService.genId(),
|
id: this.idService.genId(),
|
||||||
createdAt: new Date(),
|
createdAt: new Date(),
|
||||||
@@ -58,25 +58,25 @@ export class CreateSystemUserService {
|
|||||||
isExplorable: false,
|
isExplorable: false,
|
||||||
isBot: true,
|
isBot: true,
|
||||||
}).then(x => transactionalEntityManager.findOneByOrFail(User, x.identifiers[0]));
|
}).then(x => transactionalEntityManager.findOneByOrFail(User, x.identifiers[0]));
|
||||||
|
|
||||||
await transactionalEntityManager.insert(UserKeypair, {
|
await transactionalEntityManager.insert(UserKeypair, {
|
||||||
publicKey: keyPair.publicKey,
|
publicKey: keyPair.publicKey,
|
||||||
privateKey: keyPair.privateKey,
|
privateKey: keyPair.privateKey,
|
||||||
userId: account.id,
|
userId: account.id,
|
||||||
});
|
});
|
||||||
|
|
||||||
await transactionalEntityManager.insert(UserProfile, {
|
await transactionalEntityManager.insert(UserProfile, {
|
||||||
userId: account.id,
|
userId: account.id,
|
||||||
autoAcceptFollowed: false,
|
autoAcceptFollowed: false,
|
||||||
password: hash,
|
password: hash,
|
||||||
});
|
});
|
||||||
|
|
||||||
await transactionalEntityManager.insert(UsedUsername, {
|
await transactionalEntityManager.insert(UsedUsername, {
|
||||||
createdAt: new Date(),
|
createdAt: new Date(),
|
||||||
username: username.toLowerCase(),
|
username: username.toLowerCase(),
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
return account;
|
return account;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { Inject, Injectable } from '@nestjs/common';
|
import { Inject, Injectable, OnApplicationShutdown } from '@nestjs/common';
|
||||||
import { DataSource, In, IsNull } from 'typeorm';
|
import { DataSource, In, IsNull } from 'typeorm';
|
||||||
import * as Redis from 'ioredis';
|
import * as Redis from 'ioredis';
|
||||||
import { DI } from '@/di-symbols.js';
|
import { DI } from '@/di-symbols.js';
|
||||||
@@ -7,7 +7,7 @@ import { EmojiEntityService } from '@/core/entities/EmojiEntityService.js';
|
|||||||
import { GlobalEventService } from '@/core/GlobalEventService.js';
|
import { GlobalEventService } from '@/core/GlobalEventService.js';
|
||||||
import type { DriveFile } from '@/models/entities/DriveFile.js';
|
import type { DriveFile } from '@/models/entities/DriveFile.js';
|
||||||
import type { Emoji } from '@/models/entities/Emoji.js';
|
import type { Emoji } from '@/models/entities/Emoji.js';
|
||||||
import type { EmojisRepository } from '@/models/index.js';
|
import type { EmojisRepository, Role } from '@/models/index.js';
|
||||||
import { bindThis } from '@/decorators.js';
|
import { bindThis } from '@/decorators.js';
|
||||||
import { MemoryKVCache, RedisSingleCache } from '@/misc/cache.js';
|
import { MemoryKVCache, RedisSingleCache } from '@/misc/cache.js';
|
||||||
import { UtilityService } from '@/core/UtilityService.js';
|
import { UtilityService } from '@/core/UtilityService.js';
|
||||||
@@ -15,8 +15,10 @@ import type { Config } from '@/config.js';
|
|||||||
import { query } from '@/misc/prelude/url.js';
|
import { query } from '@/misc/prelude/url.js';
|
||||||
import type { Serialized } from '@/server/api/stream/types.js';
|
import type { Serialized } from '@/server/api/stream/types.js';
|
||||||
|
|
||||||
|
const parseEmojiStrRegexp = /^(\w+)(?:@([\w.-]+))?$/;
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class CustomEmojiService {
|
export class CustomEmojiService implements OnApplicationShutdown {
|
||||||
private cache: MemoryKVCache<Emoji | null>;
|
private cache: MemoryKVCache<Emoji | null>;
|
||||||
public localEmojisCache: RedisSingleCache<Map<string, Emoji>>;
|
public localEmojisCache: RedisSingleCache<Map<string, Emoji>>;
|
||||||
|
|
||||||
@@ -63,6 +65,9 @@ export class CustomEmojiService {
|
|||||||
aliases: string[];
|
aliases: string[];
|
||||||
host: string | null;
|
host: string | null;
|
||||||
license: string | null;
|
license: string | null;
|
||||||
|
isSensitive: boolean;
|
||||||
|
localOnly: boolean;
|
||||||
|
roleIdsThatCanBeUsedThisEmojiAsReaction: Role['id'][];
|
||||||
}): Promise<Emoji> {
|
}): Promise<Emoji> {
|
||||||
const emoji = await this.emojisRepository.insert({
|
const emoji = await this.emojisRepository.insert({
|
||||||
id: this.idService.genId(),
|
id: this.idService.genId(),
|
||||||
@@ -75,6 +80,9 @@ export class CustomEmojiService {
|
|||||||
publicUrl: data.driveFile.webpublicUrl ?? data.driveFile.url,
|
publicUrl: data.driveFile.webpublicUrl ?? data.driveFile.url,
|
||||||
type: data.driveFile.webpublicType ?? data.driveFile.type,
|
type: data.driveFile.webpublicType ?? data.driveFile.type,
|
||||||
license: data.license,
|
license: data.license,
|
||||||
|
isSensitive: data.isSensitive,
|
||||||
|
localOnly: data.localOnly,
|
||||||
|
roleIdsThatCanBeUsedThisEmojiAsReaction: data.roleIdsThatCanBeUsedThisEmojiAsReaction,
|
||||||
}).then(x => this.emojisRepository.findOneByOrFail(x.identifiers[0]));
|
}).then(x => this.emojisRepository.findOneByOrFail(x.identifiers[0]));
|
||||||
|
|
||||||
if (data.host == null) {
|
if (data.host == null) {
|
||||||
@@ -90,10 +98,14 @@ export class CustomEmojiService {
|
|||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
public async update(id: Emoji['id'], data: {
|
public async update(id: Emoji['id'], data: {
|
||||||
|
driveFile?: DriveFile;
|
||||||
name?: string;
|
name?: string;
|
||||||
category?: string | null;
|
category?: string | null;
|
||||||
aliases?: string[];
|
aliases?: string[];
|
||||||
license?: string | null;
|
license?: string | null;
|
||||||
|
isSensitive?: boolean;
|
||||||
|
localOnly?: boolean;
|
||||||
|
roleIdsThatCanBeUsedThisEmojiAsReaction?: Role['id'][];
|
||||||
}): Promise<void> {
|
}): Promise<void> {
|
||||||
const emoji = await this.emojisRepository.findOneByOrFail({ id: id });
|
const emoji = await this.emojisRepository.findOneByOrFail({ id: id });
|
||||||
const sameNameEmoji = await this.emojisRepository.findOneBy({ name: data.name, host: IsNull() });
|
const sameNameEmoji = await this.emojisRepository.findOneBy({ name: data.name, host: IsNull() });
|
||||||
@@ -105,6 +117,12 @@ export class CustomEmojiService {
|
|||||||
category: data.category,
|
category: data.category,
|
||||||
aliases: data.aliases,
|
aliases: data.aliases,
|
||||||
license: data.license,
|
license: data.license,
|
||||||
|
isSensitive: data.isSensitive,
|
||||||
|
localOnly: data.localOnly,
|
||||||
|
originalUrl: data.driveFile != null ? data.driveFile.url : undefined,
|
||||||
|
publicUrl: data.driveFile != null ? (data.driveFile.webpublicUrl ?? data.driveFile.url) : undefined,
|
||||||
|
type: data.driveFile != null ? (data.driveFile.webpublicType ?? data.driveFile.type) : undefined,
|
||||||
|
roleIdsThatCanBeUsedThisEmojiAsReaction: data.roleIdsThatCanBeUsedThisEmojiAsReaction ?? undefined,
|
||||||
});
|
});
|
||||||
|
|
||||||
this.localEmojisCache.refresh();
|
this.localEmojisCache.refresh();
|
||||||
@@ -122,7 +140,7 @@ export class CustomEmojiService {
|
|||||||
|
|
||||||
this.globalEventService.publishBroadcastStream('emojiAdded', {
|
this.globalEventService.publishBroadcastStream('emojiAdded', {
|
||||||
emoji: updated,
|
emoji: updated,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -176,7 +194,7 @@ export class CustomEmojiService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.localEmojisCache.refresh();
|
this.localEmojisCache.refresh();
|
||||||
|
|
||||||
this.globalEventService.publishBroadcastStream('emojiUpdated', {
|
this.globalEventService.publishBroadcastStream('emojiUpdated', {
|
||||||
emojis: await this.emojiEntityService.packDetailedMany(ids),
|
emojis: await this.emojiEntityService.packDetailedMany(ids),
|
||||||
});
|
});
|
||||||
@@ -197,7 +215,7 @@ export class CustomEmojiService {
|
|||||||
emojis: await this.emojiEntityService.packDetailedMany(ids),
|
emojis: await this.emojiEntityService.packDetailedMany(ids),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
public async setLicenseBulk(ids: Emoji['id'][], license: string | null) {
|
public async setLicenseBulk(ids: Emoji['id'][], license: string | null) {
|
||||||
await this.emojisRepository.update({
|
await this.emojisRepository.update({
|
||||||
@@ -259,7 +277,7 @@ export class CustomEmojiService {
|
|||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
public parseEmojiStr(emojiName: string, noteUserHost: string | null) {
|
public parseEmojiStr(emojiName: string, noteUserHost: string | null) {
|
||||||
const match = emojiName.match(/^(\w+)(?:@([\w.-]+))?$/);
|
const match = emojiName.match(parseEmojiStrRegexp);
|
||||||
if (!match) return { name: null, host: null };
|
if (!match) return { name: null, host: null };
|
||||||
|
|
||||||
const name = match[1];
|
const name = match[1];
|
||||||
@@ -331,4 +349,14 @@ export class CustomEmojiService {
|
|||||||
this.cache.set(`${emoji.name} ${emoji.host}`, emoji);
|
this.cache.set(`${emoji.name} ${emoji.host}`, emoji);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@bindThis
|
||||||
|
public dispose(): void {
|
||||||
|
this.cache.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
@bindThis
|
||||||
|
public onApplicationShutdown(signal?: string | undefined): void {
|
||||||
|
this.dispose();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,11 +28,11 @@ export class DeleteAccountService {
|
|||||||
|
|
||||||
// 物理削除する前にDelete activityを送信する
|
// 物理削除する前にDelete activityを送信する
|
||||||
await this.userSuspendService.doPostSuspend(user).catch(e => {});
|
await this.userSuspendService.doPostSuspend(user).catch(e => {});
|
||||||
|
|
||||||
this.queueService.createDeleteAccountJob(user, {
|
this.queueService.createDeleteAccountJob(user, {
|
||||||
soft: false,
|
soft: false,
|
||||||
});
|
});
|
||||||
|
|
||||||
await this.usersRepository.update(user.id, {
|
await this.usersRepository.update(user.id, {
|
||||||
isDeleted: true,
|
isDeleted: true,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -2,8 +2,7 @@ import * as fs from 'node:fs';
|
|||||||
import * as stream from 'node:stream';
|
import * as stream from 'node:stream';
|
||||||
import * as util from 'node:util';
|
import * as util from 'node:util';
|
||||||
import { Inject, Injectable } from '@nestjs/common';
|
import { Inject, Injectable } from '@nestjs/common';
|
||||||
import IPCIDR from 'ip-cidr';
|
import ipaddr from 'ipaddr.js';
|
||||||
import PrivateIp from 'private-ip';
|
|
||||||
import chalk from 'chalk';
|
import chalk from 'chalk';
|
||||||
import got, * as Got from 'got';
|
import got, * as Got from 'got';
|
||||||
import { parse } from 'content-disposition';
|
import { parse } from 'content-disposition';
|
||||||
@@ -123,15 +122,15 @@ export class DownloadService {
|
|||||||
public async downloadTextFile(url: string): Promise<string> {
|
public async downloadTextFile(url: string): Promise<string> {
|
||||||
// Create temp file
|
// Create temp file
|
||||||
const [path, cleanup] = await createTemp();
|
const [path, cleanup] = await createTemp();
|
||||||
|
|
||||||
this.logger.info(`text file: Temp file is ${path}`);
|
this.logger.info(`text file: Temp file is ${path}`);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// write content at URL to temp file
|
// write content at URL to temp file
|
||||||
await this.downloadUrl(url, path);
|
await this.downloadUrl(url, path);
|
||||||
|
|
||||||
const text = await util.promisify(fs.readFile)(path, 'utf8');
|
const text = await util.promisify(fs.readFile)(path, 'utf8');
|
||||||
|
|
||||||
return text;
|
return text;
|
||||||
} finally {
|
} finally {
|
||||||
cleanup();
|
cleanup();
|
||||||
@@ -140,13 +139,14 @@ export class DownloadService {
|
|||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
private isPrivateIp(ip: string): boolean {
|
private isPrivateIp(ip: string): boolean {
|
||||||
|
const parsedIp = ipaddr.parse(ip);
|
||||||
|
|
||||||
for (const net of this.config.allowedPrivateNetworks ?? []) {
|
for (const net of this.config.allowedPrivateNetworks ?? []) {
|
||||||
const cidr = new IPCIDR(net);
|
if (parsedIp.match(ipaddr.parseCIDR(net))) {
|
||||||
if (cidr.contains(ip)) {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return PrivateIp(ip) ?? false;
|
return parsedIp.range() !== 'unicast';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,12 +29,12 @@ export class EmailService {
|
|||||||
@bindThis
|
@bindThis
|
||||||
public async sendEmail(to: string, subject: string, html: string, text: string) {
|
public async sendEmail(to: string, subject: string, html: string, text: string) {
|
||||||
const meta = await this.metaService.fetch(true);
|
const meta = await this.metaService.fetch(true);
|
||||||
|
|
||||||
const iconUrl = `${this.config.url}/static-assets/mi-white.png`;
|
const iconUrl = `${this.config.url}/static-assets/mi-white.png`;
|
||||||
const emailSettingUrl = `${this.config.url}/settings/email`;
|
const emailSettingUrl = `${this.config.url}/settings/email`;
|
||||||
|
|
||||||
const enableAuth = meta.smtpUser != null && meta.smtpUser !== '';
|
const enableAuth = meta.smtpUser != null && meta.smtpUser !== '';
|
||||||
|
|
||||||
const transporter = nodemailer.createTransport({
|
const transporter = nodemailer.createTransport({
|
||||||
host: meta.smtpHost,
|
host: meta.smtpHost,
|
||||||
port: meta.smtpPort,
|
port: meta.smtpPort,
|
||||||
@@ -46,7 +46,7 @@ export class EmailService {
|
|||||||
pass: meta.smtpPass,
|
pass: meta.smtpPass,
|
||||||
} : undefined,
|
} : undefined,
|
||||||
} as any);
|
} as any);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// TODO: htmlサニタイズ
|
// TODO: htmlサニタイズ
|
||||||
const info = await transporter.sendMail({
|
const info = await transporter.sendMail({
|
||||||
@@ -135,7 +135,7 @@ export class EmailService {
|
|||||||
</body>
|
</body>
|
||||||
</html>`,
|
</html>`,
|
||||||
});
|
});
|
||||||
|
|
||||||
this.logger.info(`Message sent: ${info.messageId}`);
|
this.logger.info(`Message sent: ${info.messageId}`);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
this.logger.error(err as Error);
|
this.logger.error(err as Error);
|
||||||
@@ -149,12 +149,12 @@ export class EmailService {
|
|||||||
reason: null | 'used' | 'format' | 'disposable' | 'mx' | 'smtp';
|
reason: null | 'used' | 'format' | 'disposable' | 'mx' | 'smtp';
|
||||||
}> {
|
}> {
|
||||||
const meta = await this.metaService.fetch();
|
const meta = await this.metaService.fetch();
|
||||||
|
|
||||||
const exist = await this.userProfilesRepository.countBy({
|
const exist = await this.userProfilesRepository.countBy({
|
||||||
emailVerified: true,
|
emailVerified: true,
|
||||||
email: emailAddress,
|
email: emailAddress,
|
||||||
});
|
});
|
||||||
|
|
||||||
const validated = meta.enableActiveEmailValidation ? await validateEmail({
|
const validated = meta.enableActiveEmailValidation ? await validateEmail({
|
||||||
email: emailAddress,
|
email: emailAddress,
|
||||||
validateRegex: true,
|
validateRegex: true,
|
||||||
@@ -163,9 +163,9 @@ export class EmailService {
|
|||||||
validateDisposable: true, // 捨てアドかどうかチェック
|
validateDisposable: true, // 捨てアドかどうかチェック
|
||||||
validateSMTP: false, // 日本だと25ポートが殆どのプロバイダーで塞がれていてタイムアウトになるので
|
validateSMTP: false, // 日本だと25ポートが殆どのプロバイダーで塞がれていてタイムアウトになるので
|
||||||
}) : { valid: true, reason: null };
|
}) : { valid: true, reason: null };
|
||||||
|
|
||||||
const available = exist === 0 && validated.valid;
|
const available = exist === 0 && validated.valid;
|
||||||
|
|
||||||
return {
|
return {
|
||||||
available,
|
available,
|
||||||
reason: available ? null :
|
reason: available ? null :
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { Inject, Injectable } from '@nestjs/common';
|
import { Inject, Injectable, OnApplicationShutdown } from '@nestjs/common';
|
||||||
import * as Redis from 'ioredis';
|
import * as Redis from 'ioredis';
|
||||||
import type { InstancesRepository } from '@/models/index.js';
|
import type { InstancesRepository } from '@/models/index.js';
|
||||||
import type { Instance } from '@/models/entities/Instance.js';
|
import type { Instance } from '@/models/entities/Instance.js';
|
||||||
@@ -9,7 +9,7 @@ import { UtilityService } from '@/core/UtilityService.js';
|
|||||||
import { bindThis } from '@/decorators.js';
|
import { bindThis } from '@/decorators.js';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class FederatedInstanceService {
|
export class FederatedInstanceService implements OnApplicationShutdown {
|
||||||
public federatedInstanceCache: RedisKVCache<Instance | null>;
|
public federatedInstanceCache: RedisKVCache<Instance | null>;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
@@ -43,19 +43,19 @@ export class FederatedInstanceService {
|
|||||||
@bindThis
|
@bindThis
|
||||||
public async fetch(host: string): Promise<Instance> {
|
public async fetch(host: string): Promise<Instance> {
|
||||||
host = this.utilityService.toPuny(host);
|
host = this.utilityService.toPuny(host);
|
||||||
|
|
||||||
const cached = await this.federatedInstanceCache.get(host);
|
const cached = await this.federatedInstanceCache.get(host);
|
||||||
if (cached) return cached;
|
if (cached) return cached;
|
||||||
|
|
||||||
const index = await this.instancesRepository.findOneBy({ host });
|
const index = await this.instancesRepository.findOneBy({ host });
|
||||||
|
|
||||||
if (index == null) {
|
if (index == null) {
|
||||||
const i = await this.instancesRepository.insert({
|
const i = await this.instancesRepository.insert({
|
||||||
id: this.idService.genId(),
|
id: this.idService.genId(),
|
||||||
host,
|
host,
|
||||||
firstRetrievedAt: new Date(),
|
firstRetrievedAt: new Date(),
|
||||||
}).then(x => this.instancesRepository.findOneByOrFail(x.identifiers[0]));
|
}).then(x => this.instancesRepository.findOneByOrFail(x.identifiers[0]));
|
||||||
|
|
||||||
this.federatedInstanceCache.set(host, i);
|
this.federatedInstanceCache.set(host, i);
|
||||||
return i;
|
return i;
|
||||||
} else {
|
} else {
|
||||||
@@ -75,8 +75,16 @@ export class FederatedInstanceService {
|
|||||||
return response.raw[0];
|
return response.raw[0];
|
||||||
});
|
});
|
||||||
|
|
||||||
const updated = result.raw[0];
|
this.federatedInstanceCache.set(result.host, result);
|
||||||
|
}
|
||||||
this.federatedInstanceCache.set(updated.host, updated);
|
|
||||||
|
@bindThis
|
||||||
|
public dispose(): void {
|
||||||
|
this.federatedInstanceCache.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
@bindThis
|
||||||
|
public onApplicationShutdown(signal?: string | undefined): void {
|
||||||
|
this.dispose();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,8 +3,6 @@ import { Inject, Injectable } from '@nestjs/common';
|
|||||||
import { JSDOM } from 'jsdom';
|
import { JSDOM } from 'jsdom';
|
||||||
import tinycolor from 'tinycolor2';
|
import tinycolor from 'tinycolor2';
|
||||||
import type { Instance } from '@/models/entities/Instance.js';
|
import type { Instance } from '@/models/entities/Instance.js';
|
||||||
import type { InstancesRepository } from '@/models/index.js';
|
|
||||||
import { AppLockService } from '@/core/AppLockService.js';
|
|
||||||
import type Logger from '@/logger.js';
|
import type Logger from '@/logger.js';
|
||||||
import { DI } from '@/di-symbols.js';
|
import { DI } from '@/di-symbols.js';
|
||||||
import { LoggerService } from '@/core/LoggerService.js';
|
import { LoggerService } from '@/core/LoggerService.js';
|
||||||
@@ -12,6 +10,7 @@ import { HttpRequestService } from '@/core/HttpRequestService.js';
|
|||||||
import { bindThis } from '@/decorators.js';
|
import { bindThis } from '@/decorators.js';
|
||||||
import { FederatedInstanceService } from '@/core/FederatedInstanceService.js';
|
import { FederatedInstanceService } from '@/core/FederatedInstanceService.js';
|
||||||
import type { DOMWindow } from 'jsdom';
|
import type { DOMWindow } from 'jsdom';
|
||||||
|
import * as Redis from 'ioredis';
|
||||||
|
|
||||||
type NodeInfo = {
|
type NodeInfo = {
|
||||||
openRegistrations?: unknown;
|
openRegistrations?: unknown;
|
||||||
@@ -37,39 +36,49 @@ export class FetchInstanceMetadataService {
|
|||||||
private logger: Logger;
|
private logger: Logger;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
@Inject(DI.instancesRepository)
|
|
||||||
private instancesRepository: InstancesRepository,
|
|
||||||
|
|
||||||
private appLockService: AppLockService,
|
|
||||||
private httpRequestService: HttpRequestService,
|
private httpRequestService: HttpRequestService,
|
||||||
private loggerService: LoggerService,
|
private loggerService: LoggerService,
|
||||||
private federatedInstanceService: FederatedInstanceService,
|
private federatedInstanceService: FederatedInstanceService,
|
||||||
|
@Inject(DI.redis)
|
||||||
|
private redisClient: Redis.Redis,
|
||||||
) {
|
) {
|
||||||
this.logger = this.loggerService.getLogger('metadata', 'cyan');
|
this.logger = this.loggerService.getLogger('metadata', 'cyan');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@bindThis
|
||||||
|
public async tryLock(host: string): Promise<boolean> {
|
||||||
|
const mutex = await this.redisClient.set(`fetchInstanceMetadata:mutex:${host}`, '1', 'GET');
|
||||||
|
return mutex !== '1';
|
||||||
|
}
|
||||||
|
|
||||||
|
@bindThis
|
||||||
|
public unlock(host: string): Promise<'OK'> {
|
||||||
|
return this.redisClient.set(`fetchInstanceMetadata:mutex:${host}`, '0');
|
||||||
|
}
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
public async fetchInstanceMetadata(instance: Instance, force = false): Promise<void> {
|
public async fetchInstanceMetadata(instance: Instance, force = false): Promise<void> {
|
||||||
const unlock = await this.appLockService.getFetchInstanceMetadataLock(instance.host);
|
const host = instance.host;
|
||||||
|
// Acquire mutex to ensure no parallel runs
|
||||||
if (!force) {
|
if (!await this.tryLock(host)) return;
|
||||||
const _instance = await this.instancesRepository.findOneBy({ host: instance.host });
|
|
||||||
const now = Date.now();
|
|
||||||
if (_instance && _instance.infoUpdatedAt && (now - _instance.infoUpdatedAt.getTime() < 1000 * 60 * 60 * 24)) {
|
|
||||||
unlock();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this.logger.info(`Fetching metadata of ${instance.host} ...`);
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
if (!force) {
|
||||||
|
const _instance = await this.federatedInstanceService.fetch(host);
|
||||||
|
const now = Date.now();
|
||||||
|
if (_instance && _instance.infoUpdatedAt && (now - _instance.infoUpdatedAt.getTime() < 1000 * 60 * 60 * 24)) {
|
||||||
|
// unlock at the finally caluse
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.logger.info(`Fetching metadata of ${instance.host} ...`);
|
||||||
|
|
||||||
const [info, dom, manifest] = await Promise.all([
|
const [info, dom, manifest] = await Promise.all([
|
||||||
this.fetchNodeinfo(instance).catch(() => null),
|
this.fetchNodeinfo(instance).catch(() => null),
|
||||||
this.fetchDom(instance).catch(() => null),
|
this.fetchDom(instance).catch(() => null),
|
||||||
this.fetchManifest(instance).catch(() => null),
|
this.fetchManifest(instance).catch(() => null),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
const [favicon, icon, themeColor, name, description] = await Promise.all([
|
const [favicon, icon, themeColor, name, description] = await Promise.all([
|
||||||
this.fetchFaviconUrl(instance, dom).catch(() => null),
|
this.fetchFaviconUrl(instance, dom).catch(() => null),
|
||||||
this.fetchIconUrl(instance, dom, manifest).catch(() => null),
|
this.fetchIconUrl(instance, dom, manifest).catch(() => null),
|
||||||
@@ -77,13 +86,13 @@ export class FetchInstanceMetadataService {
|
|||||||
this.getSiteName(info, dom, manifest).catch(() => null),
|
this.getSiteName(info, dom, manifest).catch(() => null),
|
||||||
this.getDescription(info, dom, manifest).catch(() => null),
|
this.getDescription(info, dom, manifest).catch(() => null),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
this.logger.succ(`Successfuly fetched metadata of ${instance.host}`);
|
this.logger.succ(`Successfuly fetched metadata of ${instance.host}`);
|
||||||
|
|
||||||
const updates = {
|
const updates = {
|
||||||
infoUpdatedAt: new Date(),
|
infoUpdatedAt: new Date(),
|
||||||
} as Record<string, any>;
|
} as Record<string, any>;
|
||||||
|
|
||||||
if (info) {
|
if (info) {
|
||||||
updates.softwareName = typeof info.software?.name === 'string' ? info.software.name.toLowerCase() : '?';
|
updates.softwareName = typeof info.software?.name === 'string' ? info.software.name.toLowerCase() : '?';
|
||||||
updates.softwareVersion = info.software?.version;
|
updates.softwareVersion = info.software?.version;
|
||||||
@@ -91,63 +100,63 @@ export class FetchInstanceMetadataService {
|
|||||||
updates.maintainerName = info.metadata ? info.metadata.maintainer ? (info.metadata.maintainer.name ?? null) : null : null;
|
updates.maintainerName = info.metadata ? info.metadata.maintainer ? (info.metadata.maintainer.name ?? null) : null : null;
|
||||||
updates.maintainerEmail = info.metadata ? info.metadata.maintainer ? (info.metadata.maintainer.email ?? null) : null : null;
|
updates.maintainerEmail = info.metadata ? info.metadata.maintainer ? (info.metadata.maintainer.email ?? null) : null : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (name) updates.name = name;
|
if (name) updates.name = name;
|
||||||
if (description) updates.description = description;
|
if (description) updates.description = description;
|
||||||
if (icon || favicon) updates.iconUrl = icon ?? favicon;
|
if (icon || favicon) updates.iconUrl = (icon && !icon.includes('data:image/png;base64')) ? icon : favicon;
|
||||||
if (favicon) updates.faviconUrl = favicon;
|
if (favicon) updates.faviconUrl = favicon;
|
||||||
if (themeColor) updates.themeColor = themeColor;
|
if (themeColor) updates.themeColor = themeColor;
|
||||||
|
|
||||||
await this.federatedInstanceService.update(instance.id, updates);
|
await this.federatedInstanceService.update(instance.id, updates);
|
||||||
|
|
||||||
this.logger.succ(`Successfuly updated metadata of ${instance.host}`);
|
this.logger.succ(`Successfuly updated metadata of ${instance.host}`);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
this.logger.error(`Failed to update metadata of ${instance.host}: ${e}`);
|
this.logger.error(`Failed to update metadata of ${instance.host}: ${e}`);
|
||||||
} finally {
|
} finally {
|
||||||
unlock();
|
await this.unlock(host);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
private async fetchNodeinfo(instance: Instance): Promise<NodeInfo> {
|
private async fetchNodeinfo(instance: Instance): Promise<NodeInfo> {
|
||||||
this.logger.info(`Fetching nodeinfo of ${instance.host} ...`);
|
this.logger.info(`Fetching nodeinfo of ${instance.host} ...`);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const wellknown = await this.httpRequestService.getJson('https://' + instance.host + '/.well-known/nodeinfo')
|
const wellknown = await this.httpRequestService.getJson('https://' + instance.host + '/.well-known/nodeinfo')
|
||||||
.catch(err => {
|
.catch(err => {
|
||||||
if (err.statusCode === 404) {
|
if (err.statusCode === 404) {
|
||||||
throw 'No nodeinfo provided';
|
throw new Error('No nodeinfo provided');
|
||||||
} else {
|
} else {
|
||||||
throw err.statusCode ?? err.message;
|
throw err.statusCode ?? err.message;
|
||||||
}
|
}
|
||||||
}) as Record<string, unknown>;
|
}) as Record<string, unknown>;
|
||||||
|
|
||||||
if (wellknown.links == null || !Array.isArray(wellknown.links)) {
|
if (wellknown.links == null || !Array.isArray(wellknown.links)) {
|
||||||
throw 'No wellknown links';
|
throw new Error('No wellknown links');
|
||||||
}
|
}
|
||||||
|
|
||||||
const links = wellknown.links as any[];
|
const links = wellknown.links as any[];
|
||||||
|
|
||||||
const lnik1_0 = links.find(link => link.rel === 'http://nodeinfo.diaspora.software/ns/schema/1.0');
|
const lnik1_0 = links.find(link => link.rel === 'http://nodeinfo.diaspora.software/ns/schema/1.0');
|
||||||
const lnik2_0 = links.find(link => link.rel === 'http://nodeinfo.diaspora.software/ns/schema/2.0');
|
const lnik2_0 = links.find(link => link.rel === 'http://nodeinfo.diaspora.software/ns/schema/2.0');
|
||||||
const lnik2_1 = links.find(link => link.rel === 'http://nodeinfo.diaspora.software/ns/schema/2.1');
|
const lnik2_1 = links.find(link => link.rel === 'http://nodeinfo.diaspora.software/ns/schema/2.1');
|
||||||
const link = lnik2_1 ?? lnik2_0 ?? lnik1_0;
|
const link = lnik2_1 ?? lnik2_0 ?? lnik1_0;
|
||||||
|
|
||||||
if (link == null) {
|
if (link == null) {
|
||||||
throw 'No nodeinfo link provided';
|
throw new Error('No nodeinfo link provided');
|
||||||
}
|
}
|
||||||
|
|
||||||
const info = await this.httpRequestService.getJson(link.href)
|
const info = await this.httpRequestService.getJson(link.href)
|
||||||
.catch(err => {
|
.catch(err => {
|
||||||
throw err.statusCode ?? err.message;
|
throw err.statusCode ?? err.message;
|
||||||
});
|
});
|
||||||
|
|
||||||
this.logger.succ(`Successfuly fetched nodeinfo of ${instance.host}`);
|
this.logger.succ(`Successfuly fetched nodeinfo of ${instance.host}`);
|
||||||
|
|
||||||
return info as NodeInfo;
|
return info as NodeInfo;
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
this.logger.error(`Failed to fetch nodeinfo of ${instance.host}: ${err}`);
|
this.logger.error(`Failed to fetch nodeinfo of ${instance.host}: ${err}`);
|
||||||
|
|
||||||
throw err;
|
throw err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -155,51 +164,51 @@ export class FetchInstanceMetadataService {
|
|||||||
@bindThis
|
@bindThis
|
||||||
private async fetchDom(instance: Instance): Promise<DOMWindow['document']> {
|
private async fetchDom(instance: Instance): Promise<DOMWindow['document']> {
|
||||||
this.logger.info(`Fetching HTML of ${instance.host} ...`);
|
this.logger.info(`Fetching HTML of ${instance.host} ...`);
|
||||||
|
|
||||||
const url = 'https://' + instance.host;
|
const url = 'https://' + instance.host;
|
||||||
|
|
||||||
const html = await this.httpRequestService.getHtml(url);
|
const html = await this.httpRequestService.getHtml(url);
|
||||||
|
|
||||||
const { window } = new JSDOM(html);
|
const { window } = new JSDOM(html);
|
||||||
const doc = window.document;
|
const doc = window.document;
|
||||||
|
|
||||||
return doc;
|
return doc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
private async fetchManifest(instance: Instance): Promise<Record<string, unknown> | null> {
|
private async fetchManifest(instance: Instance): Promise<Record<string, unknown> | null> {
|
||||||
const url = 'https://' + instance.host;
|
const url = 'https://' + instance.host;
|
||||||
|
|
||||||
const manifestUrl = url + '/manifest.json';
|
const manifestUrl = url + '/manifest.json';
|
||||||
|
|
||||||
const manifest = await this.httpRequestService.getJson(manifestUrl) as Record<string, unknown>;
|
const manifest = await this.httpRequestService.getJson(manifestUrl) as Record<string, unknown>;
|
||||||
|
|
||||||
return manifest;
|
return manifest;
|
||||||
}
|
}
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
private async fetchFaviconUrl(instance: Instance, doc: DOMWindow['document'] | null): Promise<string | null> {
|
private async fetchFaviconUrl(instance: Instance, doc: DOMWindow['document'] | null): Promise<string | null> {
|
||||||
const url = 'https://' + instance.host;
|
const url = 'https://' + instance.host;
|
||||||
|
|
||||||
if (doc) {
|
if (doc) {
|
||||||
// https://github.com/misskey-dev/misskey/pull/8220#issuecomment-1025104043
|
// https://github.com/misskey-dev/misskey/pull/8220#issuecomment-1025104043
|
||||||
const href = Array.from(doc.getElementsByTagName('link')).reverse().find(link => link.relList.contains('icon'))?.href;
|
const href = Array.from(doc.getElementsByTagName('link')).reverse().find(link => link.relList.contains('icon'))?.href;
|
||||||
|
|
||||||
if (href) {
|
if (href) {
|
||||||
return (new URL(href, url)).href;
|
return (new URL(href, url)).href;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const faviconUrl = url + '/favicon.ico';
|
const faviconUrl = url + '/favicon.ico';
|
||||||
|
|
||||||
const favicon = await this.httpRequestService.send(faviconUrl, {
|
const favicon = await this.httpRequestService.send(faviconUrl, {
|
||||||
method: 'HEAD',
|
method: 'HEAD',
|
||||||
}, { throwErrorWhenResponseNotOk: false });
|
}, { throwErrorWhenResponseNotOk: false });
|
||||||
|
|
||||||
if (favicon.ok) {
|
if (favicon.ok) {
|
||||||
return faviconUrl;
|
return faviconUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -209,38 +218,38 @@ export class FetchInstanceMetadataService {
|
|||||||
const url = 'https://' + instance.host;
|
const url = 'https://' + instance.host;
|
||||||
return (new URL(manifest.icons[0].src, url)).href;
|
return (new URL(manifest.icons[0].src, url)).href;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (doc) {
|
if (doc) {
|
||||||
const url = 'https://' + instance.host;
|
const url = 'https://' + instance.host;
|
||||||
|
|
||||||
// https://github.com/misskey-dev/misskey/pull/8220#issuecomment-1025104043
|
// https://github.com/misskey-dev/misskey/pull/8220#issuecomment-1025104043
|
||||||
const links = Array.from(doc.getElementsByTagName('link')).reverse();
|
const links = Array.from(doc.getElementsByTagName('link')).reverse();
|
||||||
// https://github.com/misskey-dev/misskey/pull/8220/files/0ec4eba22a914e31b86874f12448f88b3e58dd5a#r796487559
|
// https://github.com/misskey-dev/misskey/pull/8220/files/0ec4eba22a914e31b86874f12448f88b3e58dd5a#r796487559
|
||||||
const href =
|
const href =
|
||||||
[
|
[
|
||||||
links.find(link => link.relList.contains('apple-touch-icon-precomposed'))?.href,
|
links.find(link => link.relList.contains('apple-touch-icon-precomposed'))?.href,
|
||||||
links.find(link => link.relList.contains('apple-touch-icon'))?.href,
|
links.find(link => link.relList.contains('apple-touch-icon'))?.href,
|
||||||
links.find(link => link.relList.contains('icon'))?.href,
|
links.find(link => link.relList.contains('icon'))?.href,
|
||||||
]
|
]
|
||||||
.find(href => href);
|
.find(href => href);
|
||||||
|
|
||||||
if (href) {
|
if (href) {
|
||||||
return (new URL(href, url)).href;
|
return (new URL(href, url)).href;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
private async getThemeColor(info: NodeInfo | null, doc: DOMWindow['document'] | null, manifest: Record<string, any> | null): Promise<string | null> {
|
private async getThemeColor(info: NodeInfo | null, doc: DOMWindow['document'] | null, manifest: Record<string, any> | null): Promise<string | null> {
|
||||||
const themeColor = info?.metadata?.themeColor ?? doc?.querySelector('meta[name="theme-color"]')?.getAttribute('content') ?? manifest?.theme_color;
|
const themeColor = info?.metadata?.themeColor ?? doc?.querySelector('meta[name="theme-color"]')?.getAttribute('content') ?? manifest?.theme_color;
|
||||||
|
|
||||||
if (themeColor) {
|
if (themeColor) {
|
||||||
const color = new tinycolor(themeColor);
|
const color = new tinycolor(themeColor);
|
||||||
if (color.isValid()) return color.toHexString();
|
if (color.isValid()) return color.toHexString();
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -253,19 +262,19 @@ export class FetchInstanceMetadataService {
|
|||||||
return info.metadata.name;
|
return info.metadata.name;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (doc) {
|
if (doc) {
|
||||||
const og = doc.querySelector('meta[property="og:title"]')?.getAttribute('content');
|
const og = doc.querySelector('meta[property="og:title"]')?.getAttribute('content');
|
||||||
|
|
||||||
if (og) {
|
if (og) {
|
||||||
return og;
|
return og;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (manifest) {
|
if (manifest) {
|
||||||
return manifest.name ?? manifest.short_name;
|
return manifest.name ?? manifest.short_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -278,23 +287,23 @@ export class FetchInstanceMetadataService {
|
|||||||
return info.metadata.description;
|
return info.metadata.description;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (doc) {
|
if (doc) {
|
||||||
const meta = doc.querySelector('meta[name="description"]')?.getAttribute('content');
|
const meta = doc.querySelector('meta[name="description"]')?.getAttribute('content');
|
||||||
if (meta) {
|
if (meta) {
|
||||||
return meta;
|
return meta;
|
||||||
}
|
}
|
||||||
|
|
||||||
const og = doc.querySelector('meta[property="og:description"]')?.getAttribute('content');
|
const og = doc.querySelector('meta[property="og:description"]')?.getAttribute('content');
|
||||||
if (og) {
|
if (og) {
|
||||||
return og;
|
return og;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (manifest) {
|
if (manifest) {
|
||||||
return manifest.name ?? manifest.short_name;
|
return manifest.name ?? manifest.short_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -161,20 +161,20 @@ export class FileInfoService {
|
|||||||
private async detectSensitivity(source: string, mime: string, sensitiveThreshold: number, sensitiveThresholdForPorn: number, analyzeVideo: boolean): Promise<[sensitive: boolean, porn: boolean]> {
|
private async detectSensitivity(source: string, mime: string, sensitiveThreshold: number, sensitiveThresholdForPorn: number, analyzeVideo: boolean): Promise<[sensitive: boolean, porn: boolean]> {
|
||||||
let sensitive = false;
|
let sensitive = false;
|
||||||
let porn = false;
|
let porn = false;
|
||||||
|
|
||||||
function judgePrediction(result: readonly predictionType[]): [sensitive: boolean, porn: boolean] {
|
function judgePrediction(result: readonly predictionType[]): [sensitive: boolean, porn: boolean] {
|
||||||
let sensitive = false;
|
let sensitive = false;
|
||||||
let porn = false;
|
let porn = false;
|
||||||
|
|
||||||
if ((result.find(x => x.className === 'Sexy')?.probability ?? 0) > sensitiveThreshold) sensitive = true;
|
if ((result.find(x => x.className === 'Sexy')?.probability ?? 0) > sensitiveThreshold) sensitive = true;
|
||||||
if ((result.find(x => x.className === 'Hentai')?.probability ?? 0) > sensitiveThreshold) sensitive = true;
|
if ((result.find(x => x.className === 'Hentai')?.probability ?? 0) > sensitiveThreshold) sensitive = true;
|
||||||
if ((result.find(x => x.className === 'Porn')?.probability ?? 0) > sensitiveThreshold) sensitive = true;
|
if ((result.find(x => x.className === 'Porn')?.probability ?? 0) > sensitiveThreshold) sensitive = true;
|
||||||
|
|
||||||
if ((result.find(x => x.className === 'Porn')?.probability ?? 0) > sensitiveThresholdForPorn) porn = true;
|
if ((result.find(x => x.className === 'Porn')?.probability ?? 0) > sensitiveThresholdForPorn) porn = true;
|
||||||
|
|
||||||
return [sensitive, porn];
|
return [sensitive, porn];
|
||||||
}
|
}
|
||||||
|
|
||||||
if ([
|
if ([
|
||||||
'image/jpeg',
|
'image/jpeg',
|
||||||
'image/png',
|
'image/png',
|
||||||
@@ -253,10 +253,10 @@ export class FileInfoService {
|
|||||||
disposeOutDir();
|
disposeOutDir();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return [sensitive, porn];
|
return [sensitive, porn];
|
||||||
}
|
}
|
||||||
|
|
||||||
private async *asyncIterateFrames(cwd: string, command: FFmpeg.FfmpegCommand): AsyncGenerator<string, void> {
|
private async *asyncIterateFrames(cwd: string, command: FFmpeg.FfmpegCommand): AsyncGenerator<string, void> {
|
||||||
const watcher = new FSWatcher({
|
const watcher = new FSWatcher({
|
||||||
cwd,
|
cwd,
|
||||||
@@ -295,7 +295,7 @@ export class FileInfoService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
private exists(path: string): Promise<boolean> {
|
private exists(path: string): Promise<boolean> {
|
||||||
return fs.promises.access(path).then(() => true, () => false);
|
return fs.promises.access(path).then(() => true, () => false);
|
||||||
@@ -304,11 +304,11 @@ export class FileInfoService {
|
|||||||
@bindThis
|
@bindThis
|
||||||
public fixMime(mime: string | fileType.MimeType): string {
|
public fixMime(mime: string | fileType.MimeType): string {
|
||||||
// see https://github.com/misskey-dev/misskey/pull/10686
|
// see https://github.com/misskey-dev/misskey/pull/10686
|
||||||
if (mime === "audio/x-flac") {
|
if (mime === 'audio/x-flac') {
|
||||||
return "audio/flac";
|
return 'audio/flac';
|
||||||
}
|
}
|
||||||
if (mime === "audio/vnd.wave") {
|
if (mime === 'audio/vnd.wave') {
|
||||||
return "audio/wav";
|
return 'audio/wav';
|
||||||
}
|
}
|
||||||
|
|
||||||
return mime;
|
return mime;
|
||||||
@@ -355,11 +355,12 @@ export class FileInfoService {
|
|||||||
* Check the file is SVG or not
|
* Check the file is SVG or not
|
||||||
*/
|
*/
|
||||||
@bindThis
|
@bindThis
|
||||||
public async checkSvg(path: string) {
|
public async checkSvg(path: string): Promise<boolean> {
|
||||||
try {
|
try {
|
||||||
const size = await this.getFileSize(path);
|
const size = await this.getFileSize(path);
|
||||||
if (size > 1 * 1024 * 1024) return false;
|
if (size > 1 * 1024 * 1024) return false;
|
||||||
return isSvg(fs.readFileSync(path));
|
const buffer = await fs.promises.readFile(path);
|
||||||
|
return isSvg(buffer.toString());
|
||||||
} catch {
|
} catch {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ import type { Packed } from '@/misc/json-schema.js';
|
|||||||
import { DI } from '@/di-symbols.js';
|
import { DI } from '@/di-symbols.js';
|
||||||
import type { Config } from '@/config.js';
|
import type { Config } from '@/config.js';
|
||||||
import { bindThis } from '@/decorators.js';
|
import { bindThis } from '@/decorators.js';
|
||||||
import { Role } from '@/models';
|
import { Role } from '@/models/index.js';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class GlobalEventService {
|
export class GlobalEventService {
|
||||||
|
|||||||
@@ -42,21 +42,21 @@ export class HttpRequestService {
|
|||||||
errorTtl: 30, // 30secs
|
errorTtl: 30, // 30secs
|
||||||
lookup: false, // nativeのdns.lookupにfallbackしない
|
lookup: false, // nativeのdns.lookupにfallbackしない
|
||||||
});
|
});
|
||||||
|
|
||||||
this.http = new http.Agent({
|
this.http = new http.Agent({
|
||||||
keepAlive: true,
|
keepAlive: true,
|
||||||
keepAliveMsecs: 30 * 1000,
|
keepAliveMsecs: 30 * 1000,
|
||||||
lookup: cache.lookup,
|
lookup: cache.lookup,
|
||||||
} as http.AgentOptions);
|
} as http.AgentOptions);
|
||||||
|
|
||||||
this.https = new https.Agent({
|
this.https = new https.Agent({
|
||||||
keepAlive: true,
|
keepAlive: true,
|
||||||
keepAliveMsecs: 30 * 1000,
|
keepAliveMsecs: 30 * 1000,
|
||||||
lookup: cache.lookup,
|
lookup: cache.lookup,
|
||||||
} as https.AgentOptions);
|
} as https.AgentOptions);
|
||||||
|
|
||||||
const maxSockets = Math.max(256, config.deliverJobConcurrency ?? 128);
|
const maxSockets = Math.max(256, config.deliverJobConcurrency ?? 128);
|
||||||
|
|
||||||
this.httpAgent = config.proxy
|
this.httpAgent = config.proxy
|
||||||
? new HttpProxyAgent({
|
? new HttpProxyAgent({
|
||||||
keepAlive: true,
|
keepAlive: true,
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import type { Config } from '@/config.js';
|
|||||||
import { genAid, parseAid } from '@/misc/id/aid.js';
|
import { genAid, parseAid } from '@/misc/id/aid.js';
|
||||||
import { genMeid, parseMeid } from '@/misc/id/meid.js';
|
import { genMeid, parseMeid } from '@/misc/id/meid.js';
|
||||||
import { genMeidg, parseMeidg } from '@/misc/id/meidg.js';
|
import { genMeidg, parseMeidg } from '@/misc/id/meidg.js';
|
||||||
import { genObjectId } from '@/misc/id/object-id.js';
|
import { genObjectId, parseObjectId } from '@/misc/id/object-id.js';
|
||||||
import { bindThis } from '@/decorators.js';
|
import { bindThis } from '@/decorators.js';
|
||||||
import { parseUlid } from '@/misc/id/ulid.js';
|
import { parseUlid } from '@/misc/id/ulid.js';
|
||||||
|
|
||||||
@@ -23,7 +23,7 @@ export class IdService {
|
|||||||
@bindThis
|
@bindThis
|
||||||
public genId(date?: Date): string {
|
public genId(date?: Date): string {
|
||||||
if (!date || (date > new Date())) date = new Date();
|
if (!date || (date > new Date())) date = new Date();
|
||||||
|
|
||||||
switch (this.method) {
|
switch (this.method) {
|
||||||
case 'aid': return genAid(date);
|
case 'aid': return genAid(date);
|
||||||
case 'meid': return genMeid(date);
|
case 'meid': return genMeid(date);
|
||||||
@@ -38,7 +38,7 @@ export class IdService {
|
|||||||
public parse(id: string): { date: Date; } {
|
public parse(id: string): { date: Date; } {
|
||||||
switch (this.method) {
|
switch (this.method) {
|
||||||
case 'aid': return parseAid(id);
|
case 'aid': return parseAid(id);
|
||||||
case 'objectid':
|
case 'objectid': return parseObjectId(id);
|
||||||
case 'meid': return parseMeid(id);
|
case 'meid': return parseMeid(id);
|
||||||
case 'meidg': return parseMeidg(id);
|
case 'meidg': return parseMeidg(id);
|
||||||
case 'ulid': return parseUlid(id);
|
case 'ulid': return parseUlid(id);
|
||||||
|
|||||||
@@ -26,12 +26,12 @@ export class InstanceActorService {
|
|||||||
public async getInstanceActor(): Promise<LocalUser> {
|
public async getInstanceActor(): Promise<LocalUser> {
|
||||||
const cached = this.cache.get();
|
const cached = this.cache.get();
|
||||||
if (cached) return cached;
|
if (cached) return cached;
|
||||||
|
|
||||||
const user = await this.usersRepository.findOneBy({
|
const user = await this.usersRepository.findOneBy({
|
||||||
host: IsNull(),
|
host: IsNull(),
|
||||||
username: ACTOR_USERNAME,
|
username: ACTOR_USERNAME,
|
||||||
}) as LocalUser | undefined;
|
}) as LocalUser | undefined;
|
||||||
|
|
||||||
if (user) {
|
if (user) {
|
||||||
this.cache.set(user);
|
this.cache.set(user);
|
||||||
return user;
|
return user;
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import { DI } from '@/di-symbols.js';
|
|||||||
import type { Config } from '@/config.js';
|
import type { Config } from '@/config.js';
|
||||||
import Logger from '@/logger.js';
|
import Logger from '@/logger.js';
|
||||||
import { bindThis } from '@/decorators.js';
|
import { bindThis } from '@/decorators.js';
|
||||||
import type { KEYWORD } from 'color-convert/conversions';
|
import type { KEYWORD } from 'color-convert/conversions.js';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class LoggerService {
|
export class LoggerService {
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ export class MetaService implements OnApplicationShutdown {
|
|||||||
@bindThis
|
@bindThis
|
||||||
public async fetch(noCache = false): Promise<Meta> {
|
public async fetch(noCache = false): Promise<Meta> {
|
||||||
if (!noCache && this.cache) return this.cache;
|
if (!noCache && this.cache) return this.cache;
|
||||||
|
|
||||||
return await this.db.transaction(async transactionalEntityManager => {
|
return await this.db.transaction(async transactionalEntityManager => {
|
||||||
// 過去のバグでレコードが複数出来てしまっている可能性があるので新しいIDを優先する
|
// 過去のバグでレコードが複数出来てしまっている可能性があるので新しいIDを優先する
|
||||||
const metas = await transactionalEntityManager.find(Meta, {
|
const metas = await transactionalEntityManager.find(Meta, {
|
||||||
@@ -64,9 +64,9 @@ export class MetaService implements OnApplicationShutdown {
|
|||||||
id: 'DESC',
|
id: 'DESC',
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const meta = metas[0];
|
const meta = metas[0];
|
||||||
|
|
||||||
if (meta) {
|
if (meta) {
|
||||||
this.cache = meta;
|
this.cache = meta;
|
||||||
return meta;
|
return meta;
|
||||||
@@ -81,7 +81,7 @@ export class MetaService implements OnApplicationShutdown {
|
|||||||
['id'],
|
['id'],
|
||||||
)
|
)
|
||||||
.then((x) => transactionalEntityManager.findOneByOrFail(Meta, x.identifiers[0]));
|
.then((x) => transactionalEntityManager.findOneByOrFail(Meta, x.identifiers[0]));
|
||||||
|
|
||||||
this.cache = saved;
|
this.cache = saved;
|
||||||
return saved;
|
return saved;
|
||||||
}
|
}
|
||||||
@@ -120,8 +120,13 @@ export class MetaService implements OnApplicationShutdown {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
public onApplicationShutdown(signal?: string | undefined) {
|
public dispose(): void {
|
||||||
clearInterval(this.intervalId);
|
clearInterval(this.intervalId);
|
||||||
this.redisForSub.off('message', this.onMessage);
|
this.redisForSub.off('message', this.onMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@bindThis
|
||||||
|
public onApplicationShutdown(signal?: string | undefined): void {
|
||||||
|
this.dispose();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,29 +27,29 @@ export class MfmService {
|
|||||||
public fromHtml(html: string, hashtagNames?: string[]): string {
|
public fromHtml(html: string, hashtagNames?: string[]): string {
|
||||||
// some AP servers like Pixelfed use br tags as well as newlines
|
// some AP servers like Pixelfed use br tags as well as newlines
|
||||||
html = html.replace(/<br\s?\/?>\r?\n/gi, '\n');
|
html = html.replace(/<br\s?\/?>\r?\n/gi, '\n');
|
||||||
|
|
||||||
const dom = parse5.parseFragment(html);
|
const dom = parse5.parseFragment(html);
|
||||||
|
|
||||||
let text = '';
|
let text = '';
|
||||||
|
|
||||||
for (const n of dom.childNodes) {
|
for (const n of dom.childNodes) {
|
||||||
analyze(n);
|
analyze(n);
|
||||||
}
|
}
|
||||||
|
|
||||||
return text.trim();
|
return text.trim();
|
||||||
|
|
||||||
function getText(node: TreeAdapter.Node): string {
|
function getText(node: TreeAdapter.Node): string {
|
||||||
if (treeAdapter.isTextNode(node)) return node.value;
|
if (treeAdapter.isTextNode(node)) return node.value;
|
||||||
if (!treeAdapter.isElementNode(node)) return '';
|
if (!treeAdapter.isElementNode(node)) return '';
|
||||||
if (node.nodeName === 'br') return '\n';
|
if (node.nodeName === 'br') return '\n';
|
||||||
|
|
||||||
if (node.childNodes) {
|
if (node.childNodes) {
|
||||||
return node.childNodes.map(n => getText(n)).join('');
|
return node.childNodes.map(n => getText(n)).join('');
|
||||||
}
|
}
|
||||||
|
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
function appendChildren(childNodes: TreeAdapter.ChildNode[]): void {
|
function appendChildren(childNodes: TreeAdapter.ChildNode[]): void {
|
||||||
if (childNodes) {
|
if (childNodes) {
|
||||||
for (const n of childNodes) {
|
for (const n of childNodes) {
|
||||||
@@ -57,35 +57,35 @@ export class MfmService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function analyze(node: TreeAdapter.Node) {
|
function analyze(node: TreeAdapter.Node) {
|
||||||
if (treeAdapter.isTextNode(node)) {
|
if (treeAdapter.isTextNode(node)) {
|
||||||
text += node.value;
|
text += node.value;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Skip comment or document type node
|
// Skip comment or document type node
|
||||||
if (!treeAdapter.isElementNode(node)) return;
|
if (!treeAdapter.isElementNode(node)) return;
|
||||||
|
|
||||||
switch (node.nodeName) {
|
switch (node.nodeName) {
|
||||||
case 'br': {
|
case 'br': {
|
||||||
text += '\n';
|
text += '\n';
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case 'a':
|
case 'a':
|
||||||
{
|
{
|
||||||
const txt = getText(node);
|
const txt = getText(node);
|
||||||
const rel = node.attrs.find(x => x.name === 'rel');
|
const rel = node.attrs.find(x => x.name === 'rel');
|
||||||
const href = node.attrs.find(x => x.name === 'href');
|
const href = node.attrs.find(x => x.name === 'href');
|
||||||
|
|
||||||
// ハッシュタグ
|
// ハッシュタグ
|
||||||
if (hashtagNames && href && hashtagNames.map(x => x.toLowerCase()).includes(txt.toLowerCase())) {
|
if (hashtagNames && href && hashtagNames.map(x => x.toLowerCase()).includes(txt.toLowerCase())) {
|
||||||
text += txt;
|
text += txt;
|
||||||
// メンション
|
// メンション
|
||||||
} else if (txt.startsWith('@') && !(rel && rel.value.match(/^me /))) {
|
} else if (txt.startsWith('@') && !(rel && rel.value.startsWith('me '))) {
|
||||||
const part = txt.split('@');
|
const part = txt.split('@');
|
||||||
|
|
||||||
if (part.length === 2 && href) {
|
if (part.length === 2 && href) {
|
||||||
//#region ホスト名部分が省略されているので復元する
|
//#region ホスト名部分が省略されているので復元する
|
||||||
const acct = `${txt}@${(new URL(href.value)).hostname}`;
|
const acct = `${txt}@${(new URL(href.value)).hostname}`;
|
||||||
@@ -116,12 +116,12 @@ export class MfmService {
|
|||||||
return `[${txt}](${href.value})`;
|
return `[${txt}](${href.value})`;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
text += generateLink();
|
text += generateLink();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case 'h1':
|
case 'h1':
|
||||||
{
|
{
|
||||||
text += '【';
|
text += '【';
|
||||||
@@ -129,7 +129,7 @@ export class MfmService {
|
|||||||
text += '】\n';
|
text += '】\n';
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case 'b':
|
case 'b':
|
||||||
case 'strong':
|
case 'strong':
|
||||||
{
|
{
|
||||||
@@ -138,7 +138,7 @@ export class MfmService {
|
|||||||
text += '**';
|
text += '**';
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case 'small':
|
case 'small':
|
||||||
{
|
{
|
||||||
text += '<small>';
|
text += '<small>';
|
||||||
@@ -146,7 +146,7 @@ export class MfmService {
|
|||||||
text += '</small>';
|
text += '</small>';
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case 's':
|
case 's':
|
||||||
case 'del':
|
case 'del':
|
||||||
{
|
{
|
||||||
@@ -155,7 +155,7 @@ export class MfmService {
|
|||||||
text += '~~';
|
text += '~~';
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case 'i':
|
case 'i':
|
||||||
case 'em':
|
case 'em':
|
||||||
{
|
{
|
||||||
@@ -164,7 +164,7 @@ export class MfmService {
|
|||||||
text += '</i>';
|
text += '</i>';
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// block code (<pre><code>)
|
// block code (<pre><code>)
|
||||||
case 'pre': {
|
case 'pre': {
|
||||||
if (node.childNodes.length === 1 && node.childNodes[0].nodeName === 'code') {
|
if (node.childNodes.length === 1 && node.childNodes[0].nodeName === 'code') {
|
||||||
@@ -176,7 +176,7 @@ export class MfmService {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// inline code (<code>)
|
// inline code (<code>)
|
||||||
case 'code': {
|
case 'code': {
|
||||||
text += '`';
|
text += '`';
|
||||||
@@ -184,7 +184,7 @@ export class MfmService {
|
|||||||
text += '`';
|
text += '`';
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case 'blockquote': {
|
case 'blockquote': {
|
||||||
const t = getText(node);
|
const t = getText(node);
|
||||||
if (t) {
|
if (t) {
|
||||||
@@ -193,7 +193,7 @@ export class MfmService {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case 'p':
|
case 'p':
|
||||||
case 'h2':
|
case 'h2':
|
||||||
case 'h3':
|
case 'h3':
|
||||||
@@ -205,7 +205,7 @@ export class MfmService {
|
|||||||
appendChildren(node.childNodes);
|
appendChildren(node.childNodes);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// other block elements
|
// other block elements
|
||||||
case 'div':
|
case 'div':
|
||||||
case 'header':
|
case 'header':
|
||||||
@@ -219,7 +219,7 @@ export class MfmService {
|
|||||||
appendChildren(node.childNodes);
|
appendChildren(node.childNodes);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
default: // includes inline elements
|
default: // includes inline elements
|
||||||
{
|
{
|
||||||
appendChildren(node.childNodes);
|
appendChildren(node.childNodes);
|
||||||
@@ -234,48 +234,48 @@ export class MfmService {
|
|||||||
if (nodes == null) {
|
if (nodes == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
const { window } = new Window();
|
const { window } = new Window();
|
||||||
|
|
||||||
const doc = window.document;
|
const doc = window.document;
|
||||||
|
|
||||||
function appendChildren(children: mfm.MfmNode[], targetElement: any): void {
|
function appendChildren(children: mfm.MfmNode[], targetElement: any): void {
|
||||||
if (children) {
|
if (children) {
|
||||||
for (const child of children.map(x => (handlers as any)[x.type](x))) targetElement.appendChild(child);
|
for (const child of children.map(x => (handlers as any)[x.type](x))) targetElement.appendChild(child);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const handlers: { [K in mfm.MfmNode['type']]: (node: mfm.NodeType<K>) => any } = {
|
const handlers: { [K in mfm.MfmNode['type']]: (node: mfm.NodeType<K>) => any } = {
|
||||||
bold: (node) => {
|
bold: (node) => {
|
||||||
const el = doc.createElement('b');
|
const el = doc.createElement('b');
|
||||||
appendChildren(node.children, el);
|
appendChildren(node.children, el);
|
||||||
return el;
|
return el;
|
||||||
},
|
},
|
||||||
|
|
||||||
small: (node) => {
|
small: (node) => {
|
||||||
const el = doc.createElement('small');
|
const el = doc.createElement('small');
|
||||||
appendChildren(node.children, el);
|
appendChildren(node.children, el);
|
||||||
return el;
|
return el;
|
||||||
},
|
},
|
||||||
|
|
||||||
strike: (node) => {
|
strike: (node) => {
|
||||||
const el = doc.createElement('del');
|
const el = doc.createElement('del');
|
||||||
appendChildren(node.children, el);
|
appendChildren(node.children, el);
|
||||||
return el;
|
return el;
|
||||||
},
|
},
|
||||||
|
|
||||||
italic: (node) => {
|
italic: (node) => {
|
||||||
const el = doc.createElement('i');
|
const el = doc.createElement('i');
|
||||||
appendChildren(node.children, el);
|
appendChildren(node.children, el);
|
||||||
return el;
|
return el;
|
||||||
},
|
},
|
||||||
|
|
||||||
fn: (node) => {
|
fn: (node) => {
|
||||||
const el = doc.createElement('i');
|
const el = doc.createElement('i');
|
||||||
appendChildren(node.children, el);
|
appendChildren(node.children, el);
|
||||||
return el;
|
return el;
|
||||||
},
|
},
|
||||||
|
|
||||||
blockCode: (node) => {
|
blockCode: (node) => {
|
||||||
const pre = doc.createElement('pre');
|
const pre = doc.createElement('pre');
|
||||||
const inner = doc.createElement('code');
|
const inner = doc.createElement('code');
|
||||||
@@ -283,21 +283,21 @@ export class MfmService {
|
|||||||
pre.appendChild(inner);
|
pre.appendChild(inner);
|
||||||
return pre;
|
return pre;
|
||||||
},
|
},
|
||||||
|
|
||||||
center: (node) => {
|
center: (node) => {
|
||||||
const el = doc.createElement('div');
|
const el = doc.createElement('div');
|
||||||
appendChildren(node.children, el);
|
appendChildren(node.children, el);
|
||||||
return el;
|
return el;
|
||||||
},
|
},
|
||||||
|
|
||||||
emojiCode: (node) => {
|
emojiCode: (node) => {
|
||||||
return doc.createTextNode(`\u200B:${node.props.name}:\u200B`);
|
return doc.createTextNode(`\u200B:${node.props.name}:\u200B`);
|
||||||
},
|
},
|
||||||
|
|
||||||
unicodeEmoji: (node) => {
|
unicodeEmoji: (node) => {
|
||||||
return doc.createTextNode(node.props.emoji);
|
return doc.createTextNode(node.props.emoji);
|
||||||
},
|
},
|
||||||
|
|
||||||
hashtag: (node) => {
|
hashtag: (node) => {
|
||||||
const a = doc.createElement('a');
|
const a = doc.createElement('a');
|
||||||
a.setAttribute('href', `${this.config.url}/tags/${node.props.hashtag}`);
|
a.setAttribute('href', `${this.config.url}/tags/${node.props.hashtag}`);
|
||||||
@@ -305,32 +305,32 @@ export class MfmService {
|
|||||||
a.setAttribute('rel', 'tag');
|
a.setAttribute('rel', 'tag');
|
||||||
return a;
|
return a;
|
||||||
},
|
},
|
||||||
|
|
||||||
inlineCode: (node) => {
|
inlineCode: (node) => {
|
||||||
const el = doc.createElement('code');
|
const el = doc.createElement('code');
|
||||||
el.textContent = node.props.code;
|
el.textContent = node.props.code;
|
||||||
return el;
|
return el;
|
||||||
},
|
},
|
||||||
|
|
||||||
mathInline: (node) => {
|
mathInline: (node) => {
|
||||||
const el = doc.createElement('code');
|
const el = doc.createElement('code');
|
||||||
el.textContent = node.props.formula;
|
el.textContent = node.props.formula;
|
||||||
return el;
|
return el;
|
||||||
},
|
},
|
||||||
|
|
||||||
mathBlock: (node) => {
|
mathBlock: (node) => {
|
||||||
const el = doc.createElement('code');
|
const el = doc.createElement('code');
|
||||||
el.textContent = node.props.formula;
|
el.textContent = node.props.formula;
|
||||||
return el;
|
return el;
|
||||||
},
|
},
|
||||||
|
|
||||||
link: (node) => {
|
link: (node) => {
|
||||||
const a = doc.createElement('a');
|
const a = doc.createElement('a');
|
||||||
a.setAttribute('href', node.props.url);
|
a.setAttribute('href', node.props.url);
|
||||||
appendChildren(node.children, a);
|
appendChildren(node.children, a);
|
||||||
return a;
|
return a;
|
||||||
},
|
},
|
||||||
|
|
||||||
mention: (node) => {
|
mention: (node) => {
|
||||||
const a = doc.createElement('a');
|
const a = doc.createElement('a');
|
||||||
const { username, host, acct } = node.props;
|
const { username, host, acct } = node.props;
|
||||||
@@ -340,47 +340,47 @@ export class MfmService {
|
|||||||
a.textContent = acct;
|
a.textContent = acct;
|
||||||
return a;
|
return a;
|
||||||
},
|
},
|
||||||
|
|
||||||
quote: (node) => {
|
quote: (node) => {
|
||||||
const el = doc.createElement('blockquote');
|
const el = doc.createElement('blockquote');
|
||||||
appendChildren(node.children, el);
|
appendChildren(node.children, el);
|
||||||
return el;
|
return el;
|
||||||
},
|
},
|
||||||
|
|
||||||
text: (node) => {
|
text: (node) => {
|
||||||
const el = doc.createElement('span');
|
const el = doc.createElement('span');
|
||||||
const nodes = node.props.text.split(/\r\n|\r|\n/).map(x => doc.createTextNode(x));
|
const nodes = node.props.text.split(/\r\n|\r|\n/).map(x => doc.createTextNode(x));
|
||||||
|
|
||||||
for (const x of intersperse<FIXME | 'br'>('br', nodes)) {
|
for (const x of intersperse<FIXME | 'br'>('br', nodes)) {
|
||||||
el.appendChild(x === 'br' ? doc.createElement('br') : x);
|
el.appendChild(x === 'br' ? doc.createElement('br') : x);
|
||||||
}
|
}
|
||||||
|
|
||||||
return el;
|
return el;
|
||||||
},
|
},
|
||||||
|
|
||||||
url: (node) => {
|
url: (node) => {
|
||||||
const a = doc.createElement('a');
|
const a = doc.createElement('a');
|
||||||
a.setAttribute('href', node.props.url);
|
a.setAttribute('href', node.props.url);
|
||||||
a.textContent = node.props.url;
|
a.textContent = node.props.url;
|
||||||
return a;
|
return a;
|
||||||
},
|
},
|
||||||
|
|
||||||
search: (node) => {
|
search: (node) => {
|
||||||
const a = doc.createElement('a');
|
const a = doc.createElement('a');
|
||||||
a.setAttribute('href', `https://www.google.com/search?q=${node.props.query}`);
|
a.setAttribute('href', `https://www.google.com/search?q=${node.props.query}`);
|
||||||
a.textContent = node.props.content;
|
a.textContent = node.props.content;
|
||||||
return a;
|
return a;
|
||||||
},
|
},
|
||||||
|
|
||||||
plain: (node) => {
|
plain: (node) => {
|
||||||
const el = doc.createElement('span');
|
const el = doc.createElement('span');
|
||||||
appendChildren(node.children, el);
|
appendChildren(node.children, el);
|
||||||
return el;
|
return el;
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
appendChildren(nodes, doc.body);
|
appendChildren(nodes, doc.body);
|
||||||
|
|
||||||
return `<p>${doc.body.innerHTML}</p>`;
|
return `<p>${doc.body.innerHTML}</p>`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import * as mfm from 'mfm-js';
|
|||||||
import { In, DataSource } from 'typeorm';
|
import { In, DataSource } from 'typeorm';
|
||||||
import * as Redis from 'ioredis';
|
import * as Redis from 'ioredis';
|
||||||
import { Inject, Injectable, OnApplicationShutdown } from '@nestjs/common';
|
import { Inject, Injectable, OnApplicationShutdown } from '@nestjs/common';
|
||||||
|
import RE2 from 're2';
|
||||||
import { extractMentions } from '@/misc/extract-mentions.js';
|
import { extractMentions } from '@/misc/extract-mentions.js';
|
||||||
import { extractCustomEmojisFromMfm } from '@/misc/extract-custom-emojis-from-mfm.js';
|
import { extractCustomEmojisFromMfm } from '@/misc/extract-custom-emojis-from-mfm.js';
|
||||||
import { extractHashtags } from '@/misc/extract-hashtags.js';
|
import { extractHashtags } from '@/misc/extract-hashtags.js';
|
||||||
@@ -238,7 +239,8 @@ export class NoteCreateService implements OnApplicationShutdown {
|
|||||||
if (data.channel != null) data.localOnly = true;
|
if (data.channel != null) data.localOnly = true;
|
||||||
|
|
||||||
if (data.visibility === 'public' && data.channel == null) {
|
if (data.visibility === 'public' && data.channel == null) {
|
||||||
if ((data.text != null) && (await this.metaService.fetch()).sensitiveWords.some(w => data.text!.includes(w))) {
|
const sensitiveWords = (await this.metaService.fetch()).sensitiveWords;
|
||||||
|
if (this.isSensitive(data, sensitiveWords)) {
|
||||||
data.visibility = 'home';
|
data.visibility = 'home';
|
||||||
} else if ((await this.roleService.getUserPolicies(user.id)).canPublicNote === false) {
|
} else if ((await this.roleService.getUserPolicies(user.id)).canPublicNote === false) {
|
||||||
data.visibility = 'home';
|
data.visibility = 'home';
|
||||||
@@ -508,7 +510,7 @@ export class NoteCreateService implements OnApplicationShutdown {
|
|||||||
|
|
||||||
if (data.poll && data.poll.expiresAt) {
|
if (data.poll && data.poll.expiresAt) {
|
||||||
const delay = data.poll.expiresAt.getTime() - Date.now();
|
const delay = data.poll.expiresAt.getTime() - Date.now();
|
||||||
this.queueService.endedPollNotificationQueue.add({
|
this.queueService.endedPollNotificationQueue.add(note.id, {
|
||||||
noteId: note.id,
|
noteId: note.id,
|
||||||
}, {
|
}, {
|
||||||
delay,
|
delay,
|
||||||
@@ -568,12 +570,14 @@ export class NoteCreateService implements OnApplicationShutdown {
|
|||||||
if (data.reply) {
|
if (data.reply) {
|
||||||
// 通知
|
// 通知
|
||||||
if (data.reply.userHost === null) {
|
if (data.reply.userHost === null) {
|
||||||
const threadMuted = await this.noteThreadMutingsRepository.findOneBy({
|
const isThreadMuted = await this.noteThreadMutingsRepository.exist({
|
||||||
userId: data.reply.userId,
|
where: {
|
||||||
threadId: data.reply.threadId ?? data.reply.id,
|
userId: data.reply.userId,
|
||||||
|
threadId: data.reply.threadId ?? data.reply.id,
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!threadMuted) {
|
if (!isThreadMuted) {
|
||||||
nm.push(data.reply.userId, 'reply');
|
nm.push(data.reply.userId, 'reply');
|
||||||
this.globalEventService.publishMainStream(data.reply.userId, 'reply', noteObj);
|
this.globalEventService.publishMainStream(data.reply.userId, 'reply', noteObj);
|
||||||
|
|
||||||
@@ -671,6 +675,31 @@ export class NoteCreateService implements OnApplicationShutdown {
|
|||||||
this.index(note);
|
this.index(note);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@bindThis
|
||||||
|
private isSensitive(note: Option, sensitiveWord: string[]): boolean {
|
||||||
|
if (sensitiveWord.length > 0) {
|
||||||
|
const text = note.cw ?? note.text ?? '';
|
||||||
|
if (text === '') return false;
|
||||||
|
const matched = sensitiveWord.some(filter => {
|
||||||
|
// represents RegExp
|
||||||
|
const regexp = filter.match(/^\/(.+)\/(.*)$/);
|
||||||
|
// This should never happen due to input sanitisation.
|
||||||
|
if (!regexp) {
|
||||||
|
const words = filter.split(' ');
|
||||||
|
return words.every(keyword => text.includes(keyword));
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
return new RE2(regexp[1], regexp[2]).test(text);
|
||||||
|
} catch (err) {
|
||||||
|
// This should never happen due to input sanitisation.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (matched) return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
private incRenoteCount(renote: Note) {
|
private incRenoteCount(renote: Note) {
|
||||||
this.notesRepository.createQueryBuilder().update()
|
this.notesRepository.createQueryBuilder().update()
|
||||||
@@ -685,12 +714,14 @@ export class NoteCreateService implements OnApplicationShutdown {
|
|||||||
@bindThis
|
@bindThis
|
||||||
private async createMentionedEvents(mentionedUsers: MinimumUser[], note: Note, nm: NotificationManager) {
|
private async createMentionedEvents(mentionedUsers: MinimumUser[], note: Note, nm: NotificationManager) {
|
||||||
for (const u of mentionedUsers.filter(u => this.userEntityService.isLocalUser(u))) {
|
for (const u of mentionedUsers.filter(u => this.userEntityService.isLocalUser(u))) {
|
||||||
const threadMuted = await this.noteThreadMutingsRepository.findOneBy({
|
const isThreadMuted = await this.noteThreadMutingsRepository.exist({
|
||||||
userId: u.id,
|
where: {
|
||||||
threadId: note.threadId ?? note.id,
|
userId: u.id,
|
||||||
|
threadId: note.threadId ?? note.id,
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
if (threadMuted) {
|
if (isThreadMuted) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -731,7 +762,7 @@ export class NoteCreateService implements OnApplicationShutdown {
|
|||||||
@bindThis
|
@bindThis
|
||||||
private index(note: Note) {
|
private index(note: Note) {
|
||||||
if (note.text == null && note.cw == null) return;
|
if (note.text == null && note.cw == null) return;
|
||||||
|
|
||||||
this.searchService.indexNote(note);
|
this.searchService.indexNote(note);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -763,7 +794,13 @@ export class NoteCreateService implements OnApplicationShutdown {
|
|||||||
return mentionedUsers;
|
return mentionedUsers;
|
||||||
}
|
}
|
||||||
|
|
||||||
onApplicationShutdown(signal?: string | undefined) {
|
@bindThis
|
||||||
|
public dispose(): void {
|
||||||
this.#shutdownController.abort();
|
this.#shutdownController.abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@bindThis
|
||||||
|
public onApplicationShutdown(signal?: string | undefined): void {
|
||||||
|
this.dispose();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ import { UserEntityService } from '@/core/entities/UserEntityService.js';
|
|||||||
import { NoteEntityService } from '@/core/entities/NoteEntityService.js';
|
import { NoteEntityService } from '@/core/entities/NoteEntityService.js';
|
||||||
import { bindThis } from '@/decorators.js';
|
import { bindThis } from '@/decorators.js';
|
||||||
import { MetaService } from '@/core/MetaService.js';
|
import { MetaService } from '@/core/MetaService.js';
|
||||||
|
import { SearchService } from '@/core/SearchService.js';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class NoteDeleteService {
|
export class NoteDeleteService {
|
||||||
@@ -41,11 +42,12 @@ export class NoteDeleteService {
|
|||||||
private apRendererService: ApRendererService,
|
private apRendererService: ApRendererService,
|
||||||
private apDeliverManagerService: ApDeliverManagerService,
|
private apDeliverManagerService: ApDeliverManagerService,
|
||||||
private metaService: MetaService,
|
private metaService: MetaService,
|
||||||
|
private searchService: SearchService,
|
||||||
private notesChart: NotesChart,
|
private notesChart: NotesChart,
|
||||||
private perUserNotesChart: PerUserNotesChart,
|
private perUserNotesChart: PerUserNotesChart,
|
||||||
private instanceChart: InstanceChart,
|
private instanceChart: InstanceChart,
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 投稿を削除します。
|
* 投稿を削除します。
|
||||||
* @param user 投稿者
|
* @param user 投稿者
|
||||||
@@ -53,6 +55,7 @@ export class NoteDeleteService {
|
|||||||
*/
|
*/
|
||||||
async delete(user: { id: User['id']; uri: User['uri']; host: User['host']; isBot: User['isBot']; }, note: Note, quiet = false) {
|
async delete(user: { id: User['id']; uri: User['uri']; host: User['host']; isBot: User['isBot']; }, note: Note, quiet = false) {
|
||||||
const deletedAt = new Date();
|
const deletedAt = new Date();
|
||||||
|
const cascadingNotes = await this.findCascadingNotes(note);
|
||||||
|
|
||||||
// この投稿を除く指定したユーザーによる指定したノートのリノートが存在しないとき
|
// この投稿を除く指定したユーザーによる指定したノートのリノートが存在しないとき
|
||||||
if (note.renoteId && (await this.noteEntityService.countSameRenotes(user.id, note.renoteId, note.id)) === 0) {
|
if (note.renoteId && (await this.noteEntityService.countSameRenotes(user.id, note.renoteId, note.id)) === 0) {
|
||||||
@@ -88,8 +91,8 @@ export class NoteDeleteService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// also deliever delete activity to cascaded notes
|
// also deliever delete activity to cascaded notes
|
||||||
const cascadingNotes = (await this.findCascadingNotes(note)).filter(note => !note.localOnly); // filter out local-only notes
|
const federatedLocalCascadingNotes = (cascadingNotes).filter(note => !note.localOnly && note.userHost == null); // filter out local-only notes
|
||||||
for (const cascadingNote of cascadingNotes) {
|
for (const cascadingNote of federatedLocalCascadingNotes) {
|
||||||
if (!cascadingNote.user) continue;
|
if (!cascadingNote.user) continue;
|
||||||
if (!this.userEntityService.isLocalUser(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));
|
const content = this.apRendererService.addContext(this.apRendererService.renderDelete(this.apRendererService.renderTombstone(`${this.config.url}/notes/${cascadingNote.id}`), cascadingNote.user));
|
||||||
@@ -114,6 +117,11 @@ export class NoteDeleteService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (const cascadingNote of cascadingNotes) {
|
||||||
|
this.searchService.unindexNote(cascadingNote);
|
||||||
|
}
|
||||||
|
this.searchService.unindexNote(note);
|
||||||
|
|
||||||
await this.notesRepository.delete({
|
await this.notesRepository.delete({
|
||||||
id: note.id,
|
id: note.id,
|
||||||
userId: user.id,
|
userId: user.id,
|
||||||
@@ -121,10 +129,8 @@ export class NoteDeleteService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
private async findCascadingNotes(note: Note) {
|
private async findCascadingNotes(note: Note): Promise<Note[]> {
|
||||||
const cascadingNotes: Note[] = [];
|
const recursive = async (noteId: string): Promise<Note[]> => {
|
||||||
|
|
||||||
const recursive = async (noteId: string) => {
|
|
||||||
const query = this.notesRepository.createQueryBuilder('note')
|
const query = this.notesRepository.createQueryBuilder('note')
|
||||||
.where('note.replyId = :noteId', { noteId })
|
.where('note.replyId = :noteId', { noteId })
|
||||||
.orWhere(new Brackets(q => {
|
.orWhere(new Brackets(q => {
|
||||||
@@ -133,14 +139,16 @@ export class NoteDeleteService {
|
|||||||
}))
|
}))
|
||||||
.leftJoinAndSelect('note.user', 'user');
|
.leftJoinAndSelect('note.user', 'user');
|
||||||
const replies = await query.getMany();
|
const replies = await query.getMany();
|
||||||
for (const reply of replies) {
|
|
||||||
cascadingNotes.push(reply);
|
|
||||||
await recursive(reply.id);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
await recursive(note.id);
|
|
||||||
|
|
||||||
return cascadingNotes.filter(note => note.userHost === null); // filter out non-local users
|
return [
|
||||||
|
replies,
|
||||||
|
...await Promise.all(replies.map(reply => recursive(reply.id))),
|
||||||
|
].flat();
|
||||||
|
};
|
||||||
|
|
||||||
|
const cascadingNotes: Note[] = await recursive(note.id);
|
||||||
|
|
||||||
|
return cascadingNotes;
|
||||||
}
|
}
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user