Compare commits
419 Commits
Author | SHA1 | Date | |
---|---|---|---|
9a4a534c92 | |||
0e89a9f41e | |||
f34920ea87 | |||
5e9cc09fcb | |||
7e93319873 | |||
878f09460c | |||
c9a01aeba5 | |||
2154354a4f | |||
490692316e | |||
3c5d2ecc91 | |||
a8d52c565e | |||
2752afd5f5 | |||
433230413e | |||
b090ff9994 | |||
68ace4a311 | |||
65d6104ad2 | |||
372b42c0bd | |||
06845b3bec | |||
cbcbd6f0a9 | |||
af280f52ab | |||
7674a62d40 | |||
764a158cd7 | |||
cb2a9a29fe | |||
21e1906fbf | |||
4c01dcd8eb | |||
95939e4991 | |||
10af8c8db7 | |||
f29d417b30 | |||
f2e071baaa | |||
34fef37e54 | |||
06e817af59 | |||
55face52d8 | |||
aba867ea14 | |||
0921850a79 | |||
377b0399a0 | |||
49dfcd4227 | |||
0ee1021bcc | |||
e60d13f471 | |||
1baff3f8d7 | |||
1a4de42999 | |||
f5e53afa7a | |||
7886c2aa96 | |||
ad069f0eba | |||
3d68a0988b | |||
3c7a02af1e | |||
3fa1d2bfc0 | |||
a413144bce | |||
bd046f7670 | |||
d8fb729aee | |||
a2557fca87 | |||
78a963fe33 | |||
f3aef8df75 | |||
b0757129d5 | |||
de98718923 | |||
0d1158335f | |||
9860489f88 | |||
25d37302a8 | |||
5f1a6b6f64 | |||
c39f69e5dd | |||
8668bc2609 | |||
65fbca47f9 | |||
53c7077d1d | |||
7eb6038f92 | |||
d6c8b9b994 | |||
8bd80eb2a6 | |||
b36adb6aab | |||
eefbe097c0 | |||
5c6e389cd5 | |||
126826eb5a | |||
9bc0110b86 | |||
10cd4754fd | |||
10f9fd6146 | |||
ffb0dadbc7 | |||
9c1e42cc9b | |||
911dedf3d7 | |||
6a9187c1ba | |||
5cdd9d2027 | |||
70826d326b | |||
0336d640ec | |||
80eefa92ce | |||
f1a861d1c1 | |||
1eda7c8565 | |||
6ce2231e70 | |||
6477ad2cfc | |||
225ec6f5ed | |||
91172654e4 | |||
ebadd7fd3f | |||
2d3248504b | |||
78b12c7b80 | |||
42a6dc44f4 | |||
832eabfeab | |||
2fe22acc0d | |||
554bf821d8 | |||
dcf2c32fd8 | |||
215d7ec1b9 | |||
33bd8fb9d9 | |||
ab9343a788 | |||
263032b680 | |||
cc9bc7703a | |||
90f738608f | |||
d0cf26b342 | |||
51f6708fc6 | |||
c6fcef6e98 | |||
0c3a24318a | |||
868657477c | |||
c77f3e0985 | |||
130a222821 | |||
e0facd97c7 | |||
01eba895d1 | |||
74196a3781 | |||
fdfc23d878 | |||
c4bdf39abc | |||
7e8a0e5c5a | |||
ad14feae94 | |||
2e7458a246 | |||
fd7fe5d96e | |||
d8872ca278 | |||
49e6c2ed75 | |||
f24c7c81c0 | |||
fb7a0b5816 | |||
8bb76da6b5 | |||
20816fd77a | |||
aa7e206329 | |||
a1b9bbb726 | |||
0a64d121d9 | |||
823a0c86d3 | |||
5743d87a43 | |||
871d2bad17 | |||
547da89c7d | |||
4ecd036d0a | |||
b2fb92cf0f | |||
3d73ce63ca | |||
eb267e8a57 | |||
40bfa3ef04 | |||
9b3458fba0 | |||
86eb487a38 | |||
091d6f6a3e | |||
885f8e1856 | |||
c88902e640 | |||
0e45f10d99 | |||
41d7515f85 | |||
3be7eafa6b | |||
9dd1a8fb2e | |||
ecae4c03f9 | |||
ff67fb337e | |||
100a131913 | |||
7fc3e7dd8b | |||
e4bcdd7b4d | |||
bce65e2140 | |||
7747ec5b6d | |||
c3b797b414 | |||
0343c5e692 | |||
1621e5d6fb | |||
6311474fa7 | |||
e0e373c357 | |||
9fff26b900 | |||
d439bc8c2f | |||
fe52f7c392 | |||
82207598f0 | |||
a2bef1fa52 | |||
3762cdc8c0 | |||
b224760aba | |||
cbdd14fa82 | |||
96d6e0f8a2 | |||
a44ad63440 | |||
c3592e8c4a | |||
d153d3b761 | |||
60561578d8 | |||
b8bc96c181 | |||
005d6b4ccf | |||
f972fb6920 | |||
77078f2ce2 | |||
dae6d60163 | |||
264d6afe5d | |||
52c1d87fa2 | |||
dccafca58d | |||
52c12f96d5 | |||
114a9fbdb2 | |||
20e67e7edd | |||
889b52e813 | |||
6c975275f8 | |||
1286dee1ab | |||
fee953b0df | |||
26e7454f0e | |||
edbaa07867 | |||
f7ebf14501 | |||
d00928cf3f | |||
b3a198cae6 | |||
8b87d56a5a | |||
62ac3400da | |||
d54f71774e | |||
a47358f590 | |||
8f2cf066b6 | |||
e3e5a4272b | |||
2dcb3af70f | |||
3a19e9f80e | |||
c6fe798092 | |||
e74a47916d | |||
761071e1ce | |||
9e3610d513 | |||
393ac6c203 | |||
b7a79d25b0 | |||
486f045751 | |||
d6e3ec3218 | |||
078b043cae | |||
296cbc2e5a | |||
a74beaac36 | |||
79f8eb910f | |||
c91eef0030 | |||
7bf9d726d0 | |||
1946ff8ed4 | |||
b4d85d4f69 | |||
a03702d2bd | |||
71d7de4989 | |||
35d9e13dbb | |||
b427842679 | |||
4ae172be57 | |||
e6705b1a65 | |||
bc22cabdb5 | |||
7128b9f16a | |||
8c0490fef1 | |||
882a81636d | |||
24b9be76ba | |||
e763c6e661 | |||
899e2c73d7 | |||
10cb15b000 | |||
873d4bd707 | |||
97dea72c94 | |||
7d49f260b8 | |||
3055e6d8c7 | |||
2c93246860 | |||
360c820b9d | |||
87847c6ed5 | |||
4874f54d4d | |||
ff73efcc08 | |||
4ee64cbd9e | |||
0c40a86fca | |||
f92eed0549 | |||
69ed8cc409 | |||
4fff1279db | |||
d80699e454 | |||
deee1dbf53 | |||
067588845b | |||
b177b0cafc | |||
5679777010 | |||
a70c24cd1e | |||
357f3dd258 | |||
d815838762 | |||
4ceef78599 | |||
d5811633ea | |||
32265da72c | |||
ef94236e7f | |||
2924f0e434 | |||
1e419a9e1f | |||
097ece9dc9 | |||
6b6483c9fc | |||
22049b10ff | |||
de86644cb6 | |||
657aac5bc5 | |||
7ae3640d1a | |||
6fb42857c6 | |||
abf21349cd | |||
ed17af8339 | |||
67f391f6d4 | |||
c6b25f317e | |||
d91fa1a37a | |||
6c3f052996 | |||
33b0c87fb1 | |||
5c490e7521 | |||
54961235a4 | |||
17eca2a18f | |||
137f3ee609 | |||
498f6e9be2 | |||
a5e841f59c | |||
9adab1e85e | |||
4288a843cb | |||
1669f5b265 | |||
1157298eb8 | |||
948a65bf39 | |||
20c076b369 | |||
b67ed64116 | |||
1da3777bfb | |||
ea6aa40b09 | |||
b002651194 | |||
1452512daf | |||
0e7778bebf | |||
698fbdf88b | |||
7b738deabf | |||
3c65e7b76e | |||
3fc427b699 | |||
03667e1fe6 | |||
5cfd000a7d | |||
fa66eac096 | |||
70eb75b7e6 | |||
2f6187a26a | |||
167da988da | |||
6935e647a6 | |||
743eca4a95 | |||
78598a92f9 | |||
94598ab555 | |||
c5bdee086d | |||
c6cfc3f908 | |||
84b488a912 | |||
ec4d5857d8 | |||
4576641105 | |||
572e475b39 | |||
882a30fabe | |||
feec35bf4f | |||
c9fea5a7a0 | |||
00f3a1e1ec | |||
5a8cc7851b | |||
9d81d06853 | |||
4fce5d8066 | |||
329e367bda | |||
ce056bf936 | |||
c6ab5faba6 | |||
6ce0804b43 | |||
a7a6563281 | |||
0a084a3363 | |||
beeb8de6da | |||
e73297f260 | |||
b408ef5ba5 | |||
50539099ab | |||
9a3a77cff0 | |||
cdc07945af | |||
9f9194ab5c | |||
136a087ae7 | |||
b9e91afa26 | |||
f943e39c89 | |||
75bdbff36d | |||
43930e6a84 | |||
57d0c19a98 | |||
66a11378d2 | |||
62b680cadd | |||
1e1ac13999 | |||
d27c454674 | |||
3263eaec32 | |||
de4e9a857c | |||
d838876ab1 | |||
03336f01b5 | |||
d212d693a4 | |||
d17fcd8e48 | |||
49b3ee36bd | |||
100d7adc3d | |||
68b1fea6bb | |||
4de6e1e28a | |||
84f8c34e90 | |||
77567cf114 | |||
3cf8e1917c | |||
84cbabec29 | |||
b88c65ab67 | |||
10782822de | |||
5457172aa5 | |||
d20a2c7080 | |||
c01098de16 | |||
0b14a57d55 | |||
405d104208 | |||
83e3316f06 | |||
2037d4c21d | |||
6cabf052b1 | |||
359e1b2e6e | |||
7b553b13ac | |||
79872ec3e8 | |||
e9df7265fa | |||
1ade89be35 | |||
3356f7113f | |||
e6495ea6e2 | |||
629991443a | |||
6848f05ea5 | |||
e58dd71829 | |||
1afa2f1202 | |||
f322cb444a | |||
69c3c4e3dc | |||
488e6feed9 | |||
40891aca48 | |||
cd0e557991 | |||
679f8ad614 | |||
00c647c736 | |||
1ac6af6ad1 | |||
a5d7099a3c | |||
e9c8a0f5d5 | |||
adcda0889e | |||
95cbcdd379 | |||
a5e8eb4b7b | |||
ed440f80f3 | |||
4e2ef94107 | |||
de690e0622 | |||
062e1a4940 | |||
cc3779b197 | |||
92dc34b51a | |||
f8ee615640 | |||
5dde8b4bdc | |||
2c70055a87 | |||
db8ab8b890 | |||
28da5c5a31 | |||
b345aad52c | |||
aa5af89dfc | |||
9a3a74db34 | |||
328619f1fc | |||
121e12785f | |||
cc3f0737a2 | |||
bc3714139f | |||
9200379997 | |||
0ee664db2b | |||
86487e6f66 | |||
adc2bcc59b | |||
21a54f559a | |||
145e16c266 | |||
68f4edd0ee | |||
7fd6a134d1 | |||
0db8d566e2 | |||
c6f6291fc0 | |||
c2d79450ea | |||
d58ae601f7 | |||
3ad73ad7d9 | |||
f0c4df1cc5 | |||
839784bc8c | |||
b758ec96ef | |||
2f8ceb9d22 |
@ -32,7 +32,7 @@ jobs:
|
||||
apk update && apk add jq
|
||||
docker tag misskey/misskey misskey/misskey:$(cat package.json | jq -r .version)
|
||||
docker login -u $DOCKERHUB_USERNAME -p $DOCKERHUB_PASSWORD
|
||||
docker push misskey/misskey
|
||||
docker push -a misskey/misskey
|
||||
else
|
||||
echo -e '\033[0;33mAborted deploying to Docker Hub\033[0;39m'
|
||||
fi
|
||||
|
18
.github/workflows/docker.yml
vendored
@ -1,18 +0,0 @@
|
||||
name: Docker build
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
- develop
|
||||
pull_request:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Pull previous build result (for cache)
|
||||
run: docker pull misskey/misskey:latest
|
||||
- name: Build docker container
|
||||
run: docker build --cache-from misskey/misskey:latest -t misskey/misskey .
|
@ -1 +1 @@
|
||||
v14.15.1
|
||||
v14.15.4
|
||||
|
@ -240,36 +240,6 @@ SQLでは配列のインデックスは**1始まり**。
|
||||
MongoDBの時とは違い、findOneでレコードを取得する時に対象レコードが存在しない場合 **`undefined`** が返ってくるので注意。
|
||||
MongoDBは`null`で返してきてたので、その感覚で`if (x === null)`とか書くとバグる。代わりに`if (x == null)`と書いてください
|
||||
|
||||
### 簡素な`undefined`チェック
|
||||
データベースからレコードを取得するときに、プログラムの流れ的に(ほぼ)絶対`undefined`にはならない場合でも、`undefined`チェックしないとTypeScriptに怒られます。
|
||||
でもいちいち複数行を費やして、発生するはずのない`undefined`をチェックするのも面倒なので、`ensure`というユーティリティ関数を用意しています。
|
||||
例えば、
|
||||
``` ts
|
||||
const user = await Users.findOne(userId);
|
||||
// この時点で user の型は User | undefined
|
||||
if (user == null) {
|
||||
throw 'missing user';
|
||||
}
|
||||
// この時点で user の型は User
|
||||
```
|
||||
という処理を`ensure`を使うと
|
||||
``` ts
|
||||
const user = await Users.findOne(userId).then(ensure);
|
||||
// この時点で user の型は User
|
||||
```
|
||||
という風に書けます。
|
||||
もちろん`ensure`内部でエラーを握りつぶすようなことはしておらず、万が一`undefined`だった場合はPromiseがRejectされ後続の処理は実行されません。
|
||||
``` ts
|
||||
const user = await Users.findOne(userId).then(ensure);
|
||||
// 万が一 Users.findOne の結果が undefined だったら、ensure でエラーが発生するので
|
||||
// この行に到達することは無い
|
||||
// なので、.then(ensure) は
|
||||
// if (user == null) {
|
||||
// throw 'missing user';
|
||||
// }
|
||||
// の糖衣構文のような扱いです
|
||||
```
|
||||
|
||||
### Migration作成方法
|
||||
```
|
||||
npx ts-node ./node_modules/typeorm/cli.js migration:generate -n 変更の名前
|
||||
|
@ -1,4 +1,4 @@
|
||||
FROM node:14.15.1-alpine AS base
|
||||
FROM node:14.15.4-alpine AS base
|
||||
|
||||
ENV NODE_ENV=production
|
||||
|
||||
|
56
README.md
@ -1,7 +1,8 @@
|
||||
<a href="https://xn--931a.moe/"><img src="https://github.com/syuilo/misskey/blob/develop/assets/ai-orig.png?raw=true" align="right" height="320px"/></a>
|
||||
[](https://join.misskey.page/)
|
||||
|
||||
[](https://join.misskey.page/)
|
||||
================================================================
|
||||
<h1 align="center">Misskey</h1>
|
||||
|
||||
<div align="center">
|
||||
|
||||
[](https://circleci.com/gh/syuilo/misskey)
|
||||
[](https://david-dm.org/syuilo/misskey)
|
||||
@ -10,69 +11,52 @@
|
||||
|
||||
**A forever evolving, interplanetary microblogging platform.**
|
||||
|
||||
<p align="justify">
|
||||
<a href="https://join.misskey.page/">Misskey</a> is a decentralized microblogging platform born on Earth.
|
||||
Since it exists within the Fediverse (a universe where various social media platforms are organized),
|
||||
it is mutually linked with other social media platforms.
|
||||
Why don't you take a short break from the hustle and bustle of the city, and dive into a new Internet? <a href="https://join.misskey.page/">Find an instance!</a>
|
||||
</p>
|
||||
|
||||
<a href="https://www.patreon.com/syuilo"><img src="https://c5.patreon.com/external/logo/become_a_patron_button@2x.png" alt="Become a Patron!" width="160" /></a>
|
||||
|
||||
</div>
|
||||
|
||||
---
|
||||
|
||||

|
||||
|
||||
:sparkles: Features
|
||||
----------------------------------------------------------------
|
||||
<a href="https://xn--931a.moe/"><img src="https://github.com/syuilo/misskey/blob/develop/assets/ai-orig.png?raw=true" align="right" height="320px"/></a>
|
||||
|
||||
<img src="/assets/about/post.png" align="left" height="200px"/>
|
||||
|
||||
<h3 align="left">Posting</h3>
|
||||
<p align="justify">
|
||||
<h3>Posting</h3>
|
||||
<p>
|
||||
Post your ideas, discussion topics, fun moments, or anything else you want to share! Misskey supports text, emoji, pictures, videos, and polls!
|
||||
</p>
|
||||
|
||||
---
|
||||
|
||||
<img src="/assets/about/reaction.png" align="right" height="200px"/>
|
||||
|
||||
<h3 align="right">Reactions</h3>
|
||||
<p align="justify">
|
||||
<h3 >Reactions</h3>
|
||||
<p>
|
||||
Reactions are the simplest way to respond to others' posts. Simply pick a reaction emote from the list! Reactions on Misskey are much more expressive than other social media services which only allow “liking”.
|
||||
</p>
|
||||
|
||||
---
|
||||
|
||||
<img src="/assets/about/ui.png" align="left" height="200px"/>
|
||||
|
||||
<h3 align="left">Interface</h3>
|
||||
<p align="justify">
|
||||
<h3>Interface</h3>
|
||||
<p>
|
||||
Customize the UI to your own tastes! No UI will work for everyone, so Misskey is completely customizable. Make Misskey *yours* by editing the style, adjusting timeline layouts, and placing widgets.
|
||||
</p>
|
||||
|
||||
---
|
||||
|
||||
<img src="/assets/about/drive.png" align="right" width="300px"/>
|
||||
|
||||
<h3 align="right">Misskey Drive</h3>
|
||||
<p align="justify">
|
||||
<h3>Misskey Drive</h3>
|
||||
<p>
|
||||
Organize and store your files! Want to post a picture you have already uploaded? Wish you could organize your files into folders? Misskey Drive is a solution!
|
||||
</p>
|
||||
|
||||
---
|
||||
|
||||
...and more! Experience Misskey with your own eyes at [misskey.io](https://misskey.io/) or join one of the [other instances](https://joinmisskey.github.io/) that are available.
|
||||
|
||||
Screen shots
|
||||
----------------------------------------------------------------
|
||||
### Profile page
|
||||
<img src="/assets/ss/user.jpg" width="500px"/>
|
||||
|
||||
### Explore users
|
||||
<img src="/assets/ss/explore.jpg" width="500px"/>
|
||||
|
||||
:new: What's new
|
||||
----------------------------------------------------------------
|
||||
Please see the [Release notes](./CHANGELOG.md).
|
||||
...and more!
|
||||
|
||||
:package: Create your own instance
|
||||
----------------------------------------------------------------
|
||||
@ -106,6 +90,10 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
---
|
||||
|
||||
To receive updates of this repo, follow [@repo@misskey.io](https://misskey.io/@repo) on fediverse.
|
||||
|
||||
:heart: Backers
|
||||
----------------------------------------------------------------
|
||||
<!-- PATREON_START -->
|
||||
|
74
assets/about/banner.svg
Normal file
After Width: | Height: | Size: 35 KiB |
Before Width: | Height: | Size: 9.3 KiB After Width: | Height: | Size: 9.6 KiB |
BIN
assets/banner.afdesign
Normal file
Before Width: | Height: | Size: 7.2 KiB After Width: | Height: | Size: 9.1 KiB |
@ -1,27 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 256 256" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(0.413372,0,0,0.469741,64.564,40.5821)">
|
||||
<rect x="-156.189" y="-86.393" width="619.297" height="544.981" style="fill:rgb(27,30,31);"/>
|
||||
</g>
|
||||
<g transform="matrix(0.898356,0,0,0.898356,-130.722,-120.968)">
|
||||
<g transform="matrix(0.5,0.866025,-0.866025,0.5,288,-166.277)">
|
||||
<path d="M390.877,136.653C389.457,134.193 386.831,132.677 383.99,132.677C381.149,132.677 378.524,134.193 377.103,136.653C373.093,143.599 368.146,152.168 364.604,158.303C361.749,163.248 361.749,169.34 364.604,174.285C368.142,180.414 373.084,188.972 377.092,195.915C378.515,198.379 381.144,199.898 383.99,199.898C386.836,199.898 389.466,198.379 390.889,195.915C394.897,188.972 399.838,180.414 403.377,174.284C406.232,169.34 406.232,163.248 403.377,158.303C399.835,152.168 394.888,143.599 390.877,136.653Z" style="fill:white;"/>
|
||||
</g>
|
||||
<g transform="matrix(1,0,0,1,-96,166.277)">
|
||||
<path d="M390.877,136.653C389.457,134.193 386.831,132.677 383.99,132.677C381.149,132.677 378.524,134.193 377.103,136.653C373.093,143.599 368.146,152.168 364.604,158.303C361.749,163.248 361.749,169.34 364.604,174.285C368.142,180.414 373.084,188.972 377.092,195.915C378.515,198.379 381.144,199.898 383.99,199.898C386.836,199.898 389.466,198.379 390.889,195.915C394.897,188.972 399.838,180.414 403.377,174.284C406.232,169.34 406.232,163.248 403.377,158.303C399.835,152.168 394.888,143.599 390.877,136.653Z" style="fill:white;"/>
|
||||
</g>
|
||||
<g transform="matrix(0.5,-0.866025,0.866025,0.5,-96,498.831)">
|
||||
<path d="M390.877,136.653C389.457,134.193 386.831,132.677 383.99,132.677C381.149,132.677 378.524,134.193 377.103,136.653C373.093,143.599 368.146,152.168 364.604,158.303C361.749,163.248 361.749,169.34 364.604,174.285C368.142,180.414 373.084,188.972 377.092,195.915C378.515,198.379 381.144,199.898 383.99,199.898C386.836,199.898 389.466,198.379 390.889,195.915C394.897,188.972 399.838,180.414 403.377,174.284C406.232,169.34 406.232,163.248 403.377,158.303C399.835,152.168 394.888,143.599 390.877,136.653Z" style="fill:white;"/>
|
||||
</g>
|
||||
<g transform="matrix(1,0,0,1,-95.9902,55.4086)">
|
||||
<path d="M390.877,136.653C389.457,134.193 386.831,132.677 383.99,132.677C381.149,132.677 378.524,134.193 377.103,136.653C373.093,143.599 368.146,152.168 364.604,158.303C361.749,163.248 361.749,169.34 364.604,174.285C368.142,180.414 373.084,188.972 377.092,195.915C378.515,198.379 381.144,199.898 383.99,199.898C386.836,199.898 389.466,198.379 390.889,195.915C394.897,188.972 399.838,180.414 403.377,174.284C406.232,169.34 406.232,163.248 403.377,158.303C399.835,152.168 394.888,143.599 390.877,136.653ZM385.681,139.653C385.332,139.049 384.688,138.677 383.99,138.677C383.293,138.677 382.648,139.049 382.299,139.653C378.289,146.599 373.342,155.168 369.8,161.303C368.017,164.391 368.017,168.196 369.8,171.285C373.339,177.414 378.28,185.972 382.288,192.915C382.639,193.523 383.288,193.898 383.99,193.898C384.692,193.898 385.341,193.523 385.692,192.915C389.701,185.972 394.642,177.414 398.181,171.284C399.964,168.196 399.964,164.391 398.181,161.303L385.681,139.653Z" style="fill:rgb(150,208,74);"/>
|
||||
</g>
|
||||
<g transform="matrix(0.5,-0.866025,0.866025,0.5,-2.64322e-11,554.256)">
|
||||
<path d="M390.877,136.653C389.457,134.193 386.831,132.677 383.99,132.677C381.149,132.677 378.524,134.193 377.103,136.653C373.093,143.599 368.146,152.168 364.604,158.303C361.749,163.248 361.749,169.34 364.604,174.285C368.142,180.414 373.084,188.972 377.092,195.915C378.515,198.379 381.144,199.898 383.99,199.898C386.836,199.898 389.466,198.379 390.889,195.915C394.897,188.972 399.838,180.414 403.377,174.284C406.232,169.34 406.232,163.248 403.377,158.303C399.835,152.168 394.888,143.599 390.877,136.653ZM385.681,139.653C385.332,139.049 384.688,138.677 383.99,138.677C383.293,138.677 382.648,139.049 382.299,139.653C378.289,146.599 373.342,155.168 369.8,161.303C368.017,164.391 368.017,168.196 369.8,171.285C373.339,177.414 378.28,185.972 382.288,192.915C382.639,193.523 383.288,193.898 383.99,193.898C384.692,193.898 385.341,193.523 385.692,192.915C389.701,185.972 394.642,177.414 398.181,171.284C399.964,168.196 399.964,164.391 398.181,161.303L385.681,139.653Z" style="fill:rgb(150,208,74);"/>
|
||||
</g>
|
||||
<g transform="matrix(0.5,0.866025,-0.866025,0.5,192,-110.851)">
|
||||
<path d="M390.877,136.653C389.457,134.193 386.831,132.677 383.99,132.677C381.149,132.677 378.524,134.193 377.103,136.653C373.093,143.599 368.146,152.168 364.604,158.303C361.749,163.248 361.749,169.34 364.604,174.285C368.142,180.414 373.084,188.972 377.092,195.915C378.515,198.379 381.144,199.898 383.99,199.898C386.836,199.898 389.466,198.379 390.889,195.915C394.897,188.972 399.838,180.414 403.377,174.284C406.232,169.34 406.232,163.248 403.377,158.303C399.835,152.168 394.888,143.599 390.877,136.653ZM385.681,139.653C385.332,139.049 384.688,138.677 383.99,138.677C383.293,138.677 382.648,139.049 382.299,139.653C378.289,146.599 373.342,155.168 369.8,161.303C368.017,164.391 368.017,168.196 369.8,171.285C373.339,177.414 378.28,185.972 382.288,192.915C382.639,193.523 383.288,193.898 383.99,193.898C384.692,193.898 385.341,193.523 385.692,192.915C389.701,185.972 394.642,177.414 398.181,171.284C399.964,168.196 399.964,164.391 398.181,161.303L385.681,139.653Z" style="fill:rgb(150,208,74);"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 5.7 KiB |
Before Width: | Height: | Size: 7.2 KiB After Width: | Height: | Size: 7.5 KiB |
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 20 KiB |
BIN
assets/mi-white.afdesign
Normal file
BIN
assets/mi-white.png
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
assets/mi.afdesign
Normal file
@ -1,3 +1,7 @@
|
||||
files:
|
||||
- source: /locales/ja-JP.yml
|
||||
translation: /locales/%locale%.yml
|
||||
update_option: update_as_unapproved
|
||||
- source: /src/docs/ja-JP/*.md
|
||||
translation: /src/docs/%locale%/%original_file_name%
|
||||
update_option: update_as_unapproved
|
||||
|
@ -50,11 +50,13 @@ server {
|
||||
location / {
|
||||
proxy_pass http://127.0.0.1:3000;
|
||||
proxy_set_header Host $host;
|
||||
proxy_http_version 1.1;
|
||||
proxy_redirect off;
|
||||
|
||||
# If it's behind another reverse proxy or CDN, remove the following.
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto https;
|
||||
proxy_http_version 1.1;
|
||||
proxy_redirect off;
|
||||
|
||||
# For WebSocket
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
|
27
gulpfile.ts
@ -7,6 +7,9 @@ import * as gulp from 'gulp';
|
||||
import * as ts from 'gulp-typescript';
|
||||
import * as rimraf from 'rimraf';
|
||||
import * as rename from 'gulp-rename';
|
||||
import * as replace from 'gulp-replace';
|
||||
const terser = require('gulp-terser');
|
||||
const cssnano = require('gulp-cssnano');
|
||||
|
||||
const locales: { [x: string]: any } = require('./locales');
|
||||
const meta = require('./package.json');
|
||||
@ -25,6 +28,10 @@ gulp.task('build:copy:views', () =>
|
||||
gulp.src('./src/server/web/views/**/*').pipe(gulp.dest('./built/server/web/views'))
|
||||
);
|
||||
|
||||
gulp.task('build:copy:fonts', () =>
|
||||
gulp.src('./node_modules/three/examples/fonts/**/*').pipe(gulp.dest('./built/client/assets/fonts/'))
|
||||
);
|
||||
|
||||
gulp.task('build:copy:locales', cb => {
|
||||
fs.mkdirSync('./built/client/assets/locales', { recursive: true });
|
||||
|
||||
@ -37,11 +44,23 @@ gulp.task('build:copy:locales', cb => {
|
||||
cb();
|
||||
});
|
||||
|
||||
gulp.task('build:copy:fonts', () =>
|
||||
gulp.src('./node_modules/three/examples/fonts/**/*').pipe(gulp.dest('./built/client/assets/fonts/'))
|
||||
);
|
||||
gulp.task('build:client:script', () => {
|
||||
return gulp.src(['./src/server/web/boot.js', './src/server/web/bios.js', './src/server/web/cli.js'])
|
||||
.pipe(replace('VERSION', JSON.stringify(meta.version)))
|
||||
.pipe(replace('LANGS', JSON.stringify(Object.keys(locales))))
|
||||
.pipe(terser({
|
||||
toplevel: true
|
||||
}))
|
||||
.pipe(gulp.dest('./built/server/web/'));
|
||||
});
|
||||
|
||||
gulp.task('build:copy', gulp.parallel('build:copy:views', 'build:copy:locales', 'build:copy:fonts', () =>
|
||||
gulp.task('build:client:style', () => {
|
||||
return gulp.src(['./src/server/web/style.css', './src/server/web/bios.css', './src/server/web/cli.css'])
|
||||
.pipe(cssnano())
|
||||
.pipe(gulp.dest('./built/server/web/'));
|
||||
});
|
||||
|
||||
gulp.task('build:copy', gulp.parallel('build:copy:locales', 'build:copy:views', 'build:client:script', 'build:client:style', 'build:copy:fonts', () =>
|
||||
gulp.src([
|
||||
'./src/emojilist.json',
|
||||
'./src/server/web/views/**/*',
|
||||
|
@ -32,6 +32,9 @@ addUser: "اضافة مستخدم"
|
||||
favorite: "إضافة إلى المفضلة"
|
||||
favorites: "المفضلات"
|
||||
unfavorite: "إزالة من المفضلة"
|
||||
favorited: "تمت الإضافة إلى المفضلة."
|
||||
alreadyFavorited: "تمت إضافته بالفعل إلى المفضلة."
|
||||
cantFavorite: "تعذرت الإضافة إلى المفضلة."
|
||||
pin: "دبّسها على الصفحة الشخصية"
|
||||
unpin: "ألغ تثبيتها من ملفك الشخصي"
|
||||
copyContent: "انسخ المحتوى"
|
||||
@ -45,6 +48,7 @@ copyUsername: "انسخ اسم المستخدم"
|
||||
searchUser: "ابحث عن مستخدمين"
|
||||
reply: "رد"
|
||||
loadMore: "عرض المزيد"
|
||||
showMore: "عرض المزيد"
|
||||
youGotNewFollower: "يتابعك"
|
||||
receiveFollowRequest: "تلقيت طلب متابعة"
|
||||
followRequestAccepted: "قُبل طلب المتابعة"
|
||||
@ -84,6 +88,7 @@ enterEmoji: "أدخل إيموجي"
|
||||
unrenote: "إلغاء مشاركة الملاحظة"
|
||||
quote: "اقتبس"
|
||||
pinnedNote: "ملاحظة مدبسة"
|
||||
pinned: "دبّسها على الصفحة الشخصية"
|
||||
you: "أنت"
|
||||
clickToShow: "اضغط للعرض"
|
||||
sensitive: "محتوى حساس"
|
||||
@ -175,16 +180,23 @@ remove: "حذف"
|
||||
removed: "تم حذفه بنجاح"
|
||||
removeAreYouSure: "متأكد من أنك تريد حذف {x}؟"
|
||||
deleteAreYouSure: "متأكد من أنك تريد حذف {x}؟"
|
||||
resetAreYouSure: "هل تريد إعادة التعيين؟"
|
||||
saved: "تم حفظه"
|
||||
messaging: "الدردشة"
|
||||
upload: "تحميل"
|
||||
fromDrive: "من المخزن"
|
||||
fromUrl: "من عنوان URL"
|
||||
uploadFromUrl: "التحميل عبر URL"
|
||||
uploadFromUrlDescription: "رابط الملف المراد تحميله "
|
||||
uploadFromUrlRequested: "الرفع مطلوب"
|
||||
uploadFromUrlMayTakeTime: "سيستغرق بعض الوقت لاتمام الرفع "
|
||||
explore: "استكشاف"
|
||||
games: "ألعاب Misskey"
|
||||
messageRead: "مقروءة"
|
||||
noMoreHistory: "لا يوجد المزيد من التاريخ"
|
||||
startMessaging: "ابدأ الدردشة"
|
||||
nUsersRead: "تمت القراءة من {n}"
|
||||
agreeTo: "اوافق على {0}"
|
||||
tos: "شروط الخدمة"
|
||||
start: "البداية"
|
||||
home: "الرئيسي"
|
||||
@ -201,6 +213,7 @@ light: "فاتح"
|
||||
dark: "داكن"
|
||||
lightThemes: "الحلة الفاتحة"
|
||||
darkThemes: "الحلة الداكنة"
|
||||
syncDeviceDarkMode: "مطابقة الوضع المضلمومع اعدادات الجهاز"
|
||||
drive: "قرص التخرين"
|
||||
fileName: "اسم الملف"
|
||||
selectFile: "اختر ملفًا"
|
||||
@ -218,14 +231,17 @@ emptyFolder: "هذا المجلد فارغ"
|
||||
unableToDelete: "لا يمكن حذفه"
|
||||
inputNewFileName: "ادخل الإسم الجديد للملف"
|
||||
inputNewFolderName: "ادخل الإسم الجديد للمجلد"
|
||||
hasChildFilesOrFolders: "الان الملف غير فارغ. لا يمكن حذفه"
|
||||
copyUrl: "انسخ عنوان URL"
|
||||
rename: "إعادة التسمية"
|
||||
avatar: "الصورة الرمزية"
|
||||
banner: "الصورة الرأسية"
|
||||
nsfw: "محتوى حساس"
|
||||
whenServerDisconnected: "عند فقدان الاتصال بالخادم"
|
||||
disconnectedFromServer: "قُطِع الإتصال بالخادم"
|
||||
reload: "انعش"
|
||||
doNothing: "تجاهل"
|
||||
reloadConfirm: "هل ترغب في تحديث الجدول الزمني؟"
|
||||
watch: "راقب"
|
||||
unwatch: "إلغاء المراقبة"
|
||||
accept: "السماح"
|
||||
@ -243,10 +259,12 @@ dayX: "{day}"
|
||||
monthX: "{month}"
|
||||
yearX: "{year}"
|
||||
pages: "الصفحات"
|
||||
integration: "دمج"
|
||||
connectSerice: "أوصل"
|
||||
disconnectSerice: "قطع الاتصال"
|
||||
enableLocalTimeline: "تفعيل الخيط المحلي"
|
||||
enableGlobalTimeline: "تفعيل الخيط الزمني الشامل"
|
||||
disablingTimelinesInfo: "سيتمكن المسؤولون ومن تعديل دائمًا و من الوصول إلى جميع المخططات الزمنية ، حتى إذا لم يتم تمكينها."
|
||||
registration: "إنشاء حساب"
|
||||
enableRegistration: "تفعيل إنشاء الحسابات الجديدة"
|
||||
invite: "دعوة"
|
||||
@ -288,6 +306,8 @@ resetPassword: "أعد تعيين كلمتك السرية"
|
||||
newPasswordIs: "كلمتك السرية الجديدة هي {password}"
|
||||
share: "شارِك"
|
||||
notFound: "غير موجود"
|
||||
cacheClear: "مسح ذاكرة التخزين المؤقت"
|
||||
markAsReadAllNotifications: "وضع جميع الإشعارات كأنها مقروءة"
|
||||
help: "المساعدة"
|
||||
inputMessageHere: "اكتب رسالتك هنا"
|
||||
close: "اغلق"
|
||||
@ -328,6 +348,7 @@ aboutX: "عن {x}"
|
||||
useOsNativeEmojis: "استخدم الإيموجيات الخاصة بنظام التشغيل"
|
||||
youHaveNoGroups: "لا تمتلك أية فِرَق"
|
||||
noHistory: "السجل فارغ"
|
||||
signinHistory: "تاريخ تسجيل الدخول"
|
||||
doing: "انتظر لحظة"
|
||||
category: "الفئات"
|
||||
tags: "الوسوم"
|
||||
@ -336,6 +357,7 @@ createAccount: "أنشئ حسابًا"
|
||||
existingAcount: "الحسابات الموجودة"
|
||||
regenerate: "أعِد التوليد"
|
||||
fontSize: "حجم الخط"
|
||||
openImageInNewTab: "إفتح الصورة بصفحة جديدة"
|
||||
dashboard: "لوحة التحكم"
|
||||
local: "المحلي"
|
||||
remote: "بُعدي"
|
||||
@ -364,6 +386,9 @@ state: "الحالة"
|
||||
sort: "ترتيب حسب"
|
||||
output: "الخارجة"
|
||||
updateRemoteUser: "تحديث المعلومات عن المستخدم البعيد"
|
||||
deleteAllFiles: "حذف كافة الملفات"
|
||||
userSuspended: "تم تعليق هذا المستخدم."
|
||||
userSilenced: "تم إسكات هذا المستخدم."
|
||||
sidebar: "الشريط الجانبي"
|
||||
addItem: "إضافة عنصر"
|
||||
rooms: "الغرفة"
|
||||
@ -373,14 +398,40 @@ addedRelays: "المرحلات التي تم إضافتها"
|
||||
deletedNote: "ملاحظة محذوفة"
|
||||
invisibleNote: "ملاحظة مخفية"
|
||||
poll: "استطلاع رأي"
|
||||
useCw: "إخفاء المحتوى"
|
||||
themeEditor: "مصمم القوالب"
|
||||
manage: "إدارة "
|
||||
plugins: "الإضافات"
|
||||
pluginInstallWarn: "يرجى تنصيب إضافات ذات مصدر موثوق منه فقط."
|
||||
width: "العرض"
|
||||
height: "الإرتفاع"
|
||||
large: "كبير"
|
||||
medium: "متوسط"
|
||||
small: "صغير"
|
||||
permission: "أذونات"
|
||||
enableAll: "تشغيل الكل"
|
||||
disableAll: "تعطيل الكل"
|
||||
tokenRequested: "منح حق الوصول إلى الحساب"
|
||||
notificationType: "أنواع الإشعارات"
|
||||
edit: "التعديل"
|
||||
email: "البريد الإلكتروني "
|
||||
emailAddress: "عنوان البريد الالكتروني"
|
||||
smtpHost: "المضيف"
|
||||
smtpPort: "المنفذ"
|
||||
smtpUser: "اسم المستخدم"
|
||||
smtpPass: "الكلمة السرية"
|
||||
makeActive: "تفعيل"
|
||||
display: "المظهر"
|
||||
copy: "نسخ"
|
||||
metrics: "المقاييس"
|
||||
public: "للعامة"
|
||||
currentVersion: "الإصدار الحالي"
|
||||
latestVersion: "آخر نسخة مستقرة"
|
||||
usageAmount: "الإستخدام"
|
||||
capacity: "السعة"
|
||||
inUse: "مستخدم"
|
||||
_email:
|
||||
_follow:
|
||||
title: "يتابعك"
|
||||
_mfm:
|
||||
mention: "أشر الى"
|
||||
quote: "اقتبس"
|
||||
@ -453,6 +504,7 @@ _widgets:
|
||||
activity: "النشاط"
|
||||
photos: "الصور"
|
||||
federation: "الفديرالية"
|
||||
jobQueue: "قائمة الانتظار"
|
||||
_cw:
|
||||
hide: "إخفاء"
|
||||
show: "عرض المزيد"
|
||||
|
@ -1,5 +1,6 @@
|
||||
---
|
||||
_lang_: "Deutsch"
|
||||
headlineMisskey: "Durch Notizen verbundenes Netzwerk"
|
||||
introMisskey: "Willkommen! Misskey ist eine dezentralisierte Open-Source Microblogging-Platform.\nVerfasse \"Notizen\" um mitzuteilen, was gerade passiert oder um Ereignisse mit Anderen zu teilen. 📡\nMit \"Reaktionen\" kannst du außerdem schnell deine Gefühle über Notizen anderer Benutzer zum Ausdruck bringen. 👍\nLass uns eine neue Welt erforschen! 🚀"
|
||||
monthAndDay: "{day}/{month}"
|
||||
search: "Suchen"
|
||||
@ -33,6 +34,9 @@ addUser: "Benutzer hinzufügen"
|
||||
favorite: "Zu Favoriten hinzufügen"
|
||||
favorites: "Favoriten"
|
||||
unfavorite: "Aus Favoriten entfernen"
|
||||
favorited: "Zu Favoriten hinzugefügt."
|
||||
alreadyFavorited: "Bereits zu den Favoriten hinzugefügt."
|
||||
cantFavorite: "Hinzufügen zu Favoriten fehlgeschlagen."
|
||||
pin: "Anheften"
|
||||
unpin: "Lösen"
|
||||
copyContent: "Inhalt kopieren"
|
||||
@ -46,6 +50,7 @@ copyUsername: "Benutzernamen kopieren"
|
||||
searchUser: "Benutzersuche"
|
||||
reply: "Antworten"
|
||||
loadMore: "Mehr anzeigen"
|
||||
showMore: "Mehr anzeigen"
|
||||
youGotNewFollower: "Du hast einen neuen Follower"
|
||||
receiveFollowRequest: "Follow-Anfrage erhalten"
|
||||
followRequestAccepted: "Follow-Anfrage akzeptiert"
|
||||
@ -87,8 +92,12 @@ followRequestPending: "Ausstehende Follow-Anfrage"
|
||||
enterEmoji: "Gib ein Emoji ein"
|
||||
renote: "Renote"
|
||||
unrenote: "Renote zurücknehmen"
|
||||
renoted: "Renote getätigt."
|
||||
cantRenote: "Renote dieses Beitrags nicht möglich."
|
||||
cantReRenote: "Renote einer Renote nicht möglich."
|
||||
quote: "Zitieren"
|
||||
pinnedNote: "Angepinnte Notiz"
|
||||
pinned: "Anheften"
|
||||
you: "Du"
|
||||
clickToShow: "Klicke, um diesen Inhalt anzusehen"
|
||||
sensitive: "NSFW"
|
||||
@ -176,7 +185,7 @@ clearCachedFiles: "Cache leeren"
|
||||
clearCachedFilesConfirm: "Sollen alle im Cache gespeicherten Dateien von anderen Instanzen wirklich gelöscht werden?"
|
||||
blockedInstances: "Blockierte Instanzen"
|
||||
blockedInstancesDescription: "Gib den Hostnamen der Instanz an, die blockiert werden soll. Blockierte Instanzen können nicht mehr mit dieser kommunizieren."
|
||||
muteAndBlock: "Stummgeschaltet / Blockiert"
|
||||
muteAndBlock: "Stummschaltungen / Blockierungen"
|
||||
mutedUsers: "Stummgeschaltete Benutzer"
|
||||
blockedUsers: "Blockierte Benutzer"
|
||||
noUsers: "Keine Benutzer"
|
||||
@ -310,7 +319,7 @@ enableRegistration: "Registration neuer Benutzer erlauben"
|
||||
invite: "Einladen"
|
||||
proxyRemoteFiles: "Dateien anderer Instanzen durch Proxy leiten"
|
||||
proxyRemoteFilesDescription: "Wenn diese Einstellung aktiviert ist, dann werden Dateien von anderen Instanzen, welche entweder nicht lokal gespeichert sind oder durch Überschreiten des Speicherlimits gelöscht wurden, durch einen Proxy geleitet. Hierbei wird auch ein Vorschaubild generiert. \n Dies hat keinen Effekt auf den Speicherplatz des Servers."
|
||||
driveCapacityPerLocalAccount: "Drivekapazität pro lokales Benutzerkonto"
|
||||
driveCapacityPerLocalAccount: "Drive-Kapazität pro lokales Benutzerkonto"
|
||||
driveCapacityPerRemoteAccount: "Drive-Kapazität pro Benutzer anderer Instanzen"
|
||||
inMb: "In Megabytes"
|
||||
iconUrl: "Icon-URL"
|
||||
@ -429,6 +438,7 @@ signinWith: "Mit {x} anmelden"
|
||||
signinFailed: "Anmeldung fehlgeschlagen. Überprüfe Benutzername und Passswort."
|
||||
tapSecurityKey: "Tippe deinen Sicherheitsschlüssel an"
|
||||
or: "Oder"
|
||||
language: "Sprache"
|
||||
uiLanguage: "Sprache der Benutzeroberfläche"
|
||||
groupInvited: "Du wurdest in eine Gruppe eingeladen"
|
||||
aboutX: "Über {x}"
|
||||
@ -485,7 +495,7 @@ showFixedPostForm: "Bereich zum Schreiben neuer Notizen am Anfang der Chronik an
|
||||
newNoteRecived: "Es gibt neue Notizen"
|
||||
sounds: "Töne"
|
||||
listen: "Anhören"
|
||||
none: "Keine"
|
||||
none: "Nichts"
|
||||
showInPage: "In Seite anzeigen"
|
||||
popout: "Pop-Up"
|
||||
volume: "Lautstärke"
|
||||
@ -530,7 +540,7 @@ invisibleNote: "Private Notiz"
|
||||
enableInfiniteScroll: "Automatisch mehr Notizen laden"
|
||||
visibility: "Sichtbarkeit"
|
||||
poll: "Umfrage"
|
||||
useCw: "Inhalt verstecken"
|
||||
useCw: "Inhalt verdecken"
|
||||
enablePlayer: "Video-Player öffnen"
|
||||
disablePlayer: "Video-Player schließen"
|
||||
expandTweet: "Tweet ausklappen"
|
||||
@ -540,7 +550,6 @@ author: "Autor"
|
||||
leaveConfirm: "Es gibt unspeicherte Änderungen. Möchtest du diese verwerfen?"
|
||||
manage: "Verwaltung"
|
||||
plugins: "Plugins"
|
||||
pluginInstallWarn: "Installiere nur vertrauenswürdige Plugins."
|
||||
deck: "Deck"
|
||||
undeck: "Deck verlassen"
|
||||
useBlurEffectForModal: "Weichzeichnungseffekt für Modals verwenden"
|
||||
@ -556,7 +565,7 @@ enableAll: "Alle aktivieren"
|
||||
disableAll: "Alle deaktivieren"
|
||||
tokenRequested: "Benutzerkontozugriff gewähren"
|
||||
pluginTokenRequestedDescription: "Dieses Plugin wird die hier konfigurierten Berechtigungen verwenden können."
|
||||
notificationType: "Benachrichtigungstyp"
|
||||
notificationType: "Benachrichtigungsart"
|
||||
edit: "Bearbeiten"
|
||||
useStarForReactionFallback: "Verwende ★ falls das Reaktions-Emoji unbekannt ist"
|
||||
emailConfig: "Email-Server Konfiguration"
|
||||
@ -619,7 +628,7 @@ createNew: "Neu erstellen"
|
||||
optional: "Optional"
|
||||
createNewClip: "Neuen Clip erstellen"
|
||||
public: "Öffentlich"
|
||||
i18nInfo: "Misskey wird durch freiwillige Helfer in viele verschiedene Sprachen übersetzt. Unter {link} kannst du mithelfen."
|
||||
i18nInfo: "Misskey wird durch freiwillige Helfer in viele verschiedene Sprachen übersetzt. Auf {link} kannst du mithelfen."
|
||||
manageAccessTokens: "Zugriffstoken verwalten"
|
||||
accountInfo: "Benutzerkonto-Informationen"
|
||||
notesCount: "Anzahl von Notizen"
|
||||
@ -655,6 +664,67 @@ useSystemFont: "Standardschriftart des Systems verwenden"
|
||||
clips: "Clips"
|
||||
experimentalFeatures: "Experimentelle Funktionalitäten"
|
||||
developer: "Entwickler"
|
||||
makeExplorable: "Benutzerkonto in \"Erkunden\" sichtbar machen"
|
||||
makeExplorableDescription: "Wenn diese Option deaktiviert ist, ist dein Benutzerkonto nicht im \"Erkunden\"-Bereich sichtbar."
|
||||
showGapBetweenNotesInTimeline: "Abstände zwischen Notizen auf der Chronik anzeigen"
|
||||
duplicate: "Duplizieren"
|
||||
left: "Links"
|
||||
center: "Mitte"
|
||||
wide: "Breit"
|
||||
narrow: "Schmal"
|
||||
reloadToApplySetting: "Diese Einstellung tritt nach einer Aktualisierung der Seite in Kraft. Jetzt aktualisieren?"
|
||||
showTitlebar: "Titelleiste anzeigen"
|
||||
clearCache: "Cache leeren"
|
||||
onlineUsersCount: "{n} Benutzer sind online"
|
||||
nUsers: "{n} Benutzer"
|
||||
nNotes: "{n} Notizen"
|
||||
sendErrorReports: "Fehlerberichte senden"
|
||||
sendErrorReportsDescription: "Ist diese Option aktiviert, so werden beim Auftreten von Fehlern detaillierte Fehlerinformationen an Misskey weitergegeben, was zur Verbesserung der Qualität von Misskey beiträgt."
|
||||
myTheme: "Mein Farbthema"
|
||||
backgroundColor: "Hintergrund"
|
||||
accentColor: "Akzentfarbe"
|
||||
textColor: "Text"
|
||||
saveAs: "Speichern als…"
|
||||
advanced: "Fortgeschritten"
|
||||
value: "Wert"
|
||||
updatedAt: "Zuletzt geändert am"
|
||||
saveConfirm: "Änderungen speichern?"
|
||||
deleteConfirm: "Wirklich löschen?"
|
||||
invalidValue: "Ungültiger Wert."
|
||||
registry: "Registry"
|
||||
closeAccount: "Benutzerkonto schließen"
|
||||
currentVersion: "Momentane Version"
|
||||
latestVersion: "Neuste Version"
|
||||
youAreRunningUpToDateClient: "Du verwendest die neuste Version deines Clients."
|
||||
newVersionOfClientAvailable: "Eine neuere Version deines Clients ist verfügbar."
|
||||
usageAmount: "Verwendung"
|
||||
capacity: "Kapazität"
|
||||
inUse: "Verwendet"
|
||||
editCode: "Code bearbeiten"
|
||||
apply: "Anwenden"
|
||||
receiveAnnouncementFromInstance: "E-Mail-Benachrichtigungen von dieser Instanz empfangen"
|
||||
emailNotification: "E-Mail-Benachrichtigungen"
|
||||
inChannelSearch: "In Kanal suchen"
|
||||
useReactionPickerForContextMenu: "Reaktionsauswahl durch Rechtsklick öffnen"
|
||||
typingUsers: "{users} ist/sind am schreiben..."
|
||||
jumpToSpecifiedDate: "Zu bestimmtem Datum springen"
|
||||
showingPastTimeline: "Momentan wird eine alte Chronik angezeigt"
|
||||
clear: "Zurückkehren"
|
||||
_email:
|
||||
_follow:
|
||||
title: "Du hast einen neuen Follower"
|
||||
_receiveFollowRequest:
|
||||
title: "Du hast eine Follow-Anfrage erhalten"
|
||||
_plugin:
|
||||
install: "Plugins installieren"
|
||||
installWarn: "Installiere bitte nur vertrauenswürdige Plugins."
|
||||
manage: "Plugins verwalten"
|
||||
_registry:
|
||||
scope: "Scope"
|
||||
key: "Schlüssel"
|
||||
keys: "Schlüssel"
|
||||
domain: "Domain"
|
||||
createKey: "Schlüssel erstellen"
|
||||
_aboutMisskey:
|
||||
about: "Misskey ist Open-Source-Software die von syuilo seit 2014 entwickelt wird."
|
||||
contributors: "Hauptmitwirkende"
|
||||
@ -677,7 +747,7 @@ _mfm:
|
||||
hashtag: "Hashtag"
|
||||
hashtagDescription: "Mit einer Raute und Text kann ein Hashtag angegeben werden."
|
||||
url: "URL"
|
||||
urlDescription: "URLs können angezeigt werden."
|
||||
urlDescription: "Zeigt URLs an."
|
||||
link: "Link"
|
||||
linkDescription: "Ein spezifizierter Textabschnitt kann als URL angezeigt werden."
|
||||
bold: "Fett"
|
||||
@ -716,6 +786,16 @@ _mfm:
|
||||
twitchDescription: "Verleiht eine sehr stark zuckende Animation."
|
||||
spin: "Animation (Rotieren)"
|
||||
spinDescription: "Verleiht eine rotierende Animation."
|
||||
x2: "Groß"
|
||||
x2Description: "Lässt Inhalte größer angezeigt werden."
|
||||
x3: "Sehr groß"
|
||||
x3Description: "Lässt Inhalte noch größer angezeigt werden."
|
||||
x4: "Am größten"
|
||||
x4Description: "Lässt Inhalte noch größer als größer als groß angezeigt werden."
|
||||
blur: "Weichzeichner"
|
||||
blurDescription: "Inhalte durch Weihzeichnung verschwimmen lassen. Durch das Bewegen des Mauszeigers auf den Inhalt wird er klar angezeigt."
|
||||
font: "Schriftart"
|
||||
fontDescription: "Setzt die Schriftart des Inhaltes fest."
|
||||
_reversi:
|
||||
reversi: "Reversi"
|
||||
gameSettings: "Spieleinstellungen"
|
||||
@ -800,7 +880,7 @@ _theme:
|
||||
refConst: "Konstante referenzieren"
|
||||
key: "Schlüssel"
|
||||
func: "Funktionen"
|
||||
funcKind: "Funktionstyp"
|
||||
funcKind: "Funktionsart"
|
||||
argument: "Parameter"
|
||||
basedProp: "Referenzierte Eigenschaft"
|
||||
alpha: "Transparenz"
|
||||
@ -837,9 +917,9 @@ _theme:
|
||||
infoFg: "Text von Informationen"
|
||||
infoWarnBg: "Hintergrund von Warnungen"
|
||||
infoWarnFg: "Text von Informationen"
|
||||
cwBg: "Hintergrund von versteckten Inhalten"
|
||||
cwFg: "Text von versteckten Inhalten"
|
||||
cwHoverBg: "Hintergrund von versteckten Inhalten (Mouseover)"
|
||||
cwBg: "Hintergrund von verdeckten Inhalten"
|
||||
cwFg: "Text von verdeckten Inhalten"
|
||||
cwHoverBg: "Hintergrund von verdeckten Inhalten (Mouseover)"
|
||||
toastBg: "Hintergrund von Benachrichtigungen"
|
||||
toastFg: "Text von Benachrichtigungen"
|
||||
buttonBg: "Hintergrund von Schaltflächen"
|
||||
@ -883,7 +963,7 @@ _tutorial:
|
||||
title: "Wie du Misskey verwendest"
|
||||
step1_1: "Willkommen!"
|
||||
step1_2: "Diese Seite ist die \"Chronik\". Sie zeigt dir deine geschrieben \"Notizen\" sowie die aller Benutzer, denen du \"folgst\" in chronologischer Reihenfolge."
|
||||
step1_3: "Deine Chronik sollte momentan leer sein, da du bis jetzt nocht keine Notizen geschrieben hast und auch noch keinen Benutzern folgst."
|
||||
step1_3: "Deine Chronik sollte momentan leer sein, da du bis jetzt noch keine Notizen geschrieben hast und auch noch keinen Benutzern folgst."
|
||||
step2_1: "Lass uns zuerst dein Profil vervollständigen, bevor du Notizen schreibst oder jemandem folgst."
|
||||
step2_2: "Informationen darüber, wer du bist, macht es anderen leichter zu wissen, ob sie deine Notizen sehen wollen und ob sie dir folgen möchten."
|
||||
step3_1: "Mit dem Einrichten deines Profils fertig?"
|
||||
@ -975,6 +1055,11 @@ _widgets:
|
||||
federation: "Föderation"
|
||||
postForm: "Neue Notiz anfertigen"
|
||||
slideshow: "Diashow"
|
||||
button: "Knopf"
|
||||
onlineUsers: "Benutzer Online"
|
||||
jobQueue: "Job-Warteschlange"
|
||||
serverMetric: "Servermetriken"
|
||||
aiscript: "AiScript-Konsole"
|
||||
_cw:
|
||||
hide: "Ausblenden"
|
||||
show: "Mehr anzeigen"
|
||||
@ -1084,7 +1169,7 @@ _rooms:
|
||||
clearConfirm: "Möchtest du wirklich alle Möbel entfernen?"
|
||||
leaveConfirm: "Es gibt ungespeicherte Änderungen. Möchtest du wirklich gehen?"
|
||||
chooseImage: "Bild auswählen"
|
||||
roomType: "Raumtyp"
|
||||
roomType: "Raumart"
|
||||
carpetColor: "Teppichfarbe"
|
||||
_roomType:
|
||||
default: "Standard"
|
||||
@ -1437,7 +1522,7 @@ _notification:
|
||||
youGotPoll: "{name} hat auf deiner Umfrage abgestimmt"
|
||||
youGotMessagingMessageFromUser: "{name} hat dir eine Chatnachricht gesendet"
|
||||
youGotMessagingMessageFromGroup: "In die Gruppe {name} wurde eine Chatnachricht gesendet"
|
||||
youWereFollowed: "Du hast einen neuen Follower"
|
||||
youWereFollowed: "ist dir gefolgt"
|
||||
youReceivedFollowRequest: "Du hast eine Follow-Anfrage erhalten"
|
||||
yourFollowRequestAccepted: "Deine Follow-Anfrage wurde akzeptiert"
|
||||
youWereInvitedToGroup: "Du wurdest in eine Gruppe eingeladen"
|
||||
@ -1457,14 +1542,18 @@ _notification:
|
||||
_deck:
|
||||
alwaysShowMainColumn: "Hauptspalte immer zeigen"
|
||||
columnAlign: "Spalten ausrichten"
|
||||
columnMargin: "Spaltenabstand"
|
||||
columnHeaderHeight: "Spaltenkopfhöhe"
|
||||
addColumn: "Spalte hinzufügen"
|
||||
swapLeft: "Nach links verschieben"
|
||||
swapRight: "Nach rechts verschieben"
|
||||
swapUp: "Nach oben verschieben"
|
||||
swapDown: "Nach unten verschieben"
|
||||
stackLeft: "Nach links stapeln"
|
||||
stackLeft: "Auf linke Spalte stapeln"
|
||||
popRight: "Nach rechts vom Stapel nehmen"
|
||||
profile: "Profil"
|
||||
_columns:
|
||||
main: "Hauptspalte"
|
||||
widgets: "Widgets"
|
||||
notifications: "Benachrichtigungen"
|
||||
tl: "Chronik"
|
||||
|
@ -1,6 +1,7 @@
|
||||
---
|
||||
_lang_: "English"
|
||||
introMisskey: "Welcome! Misskey is an open source, and also a decentralized microblogging service.\nCreate \"notes\" to share what is happening now, or to share it with everyone around you 📡\nWith \"reactions\", you can also quickly express your feelings about everyone's notes 👍\nLet's explore a new world 🚀"
|
||||
headlineMisskey: "Network connected by notes"
|
||||
introMisskey: "Welcome! Misskey is an open source, decentralized microblogging service.\nCreate \"notes\" to share what is happening now, or to share it with everyone around you. 📡\nWith \"reactions\", you can also quickly express your feelings about everyone's notes. 👍\nLet's explore a new world! 🚀"
|
||||
monthAndDay: "{month}/{day}"
|
||||
search: "Search"
|
||||
notifications: "Notifications"
|
||||
@ -33,6 +34,9 @@ addUser: "Add a user"
|
||||
favorite: "Favorite"
|
||||
favorites: "Favorites"
|
||||
unfavorite: "Unfavorite"
|
||||
favorited: "Added to favorites."
|
||||
alreadyFavorited: "Already added to favorites."
|
||||
cantFavorite: "Couldn't add to favorites."
|
||||
pin: "Pin to profile"
|
||||
unpin: "Unpin from profile"
|
||||
copyContent: "Copy contents"
|
||||
@ -46,6 +50,7 @@ copyUsername: "Copy username"
|
||||
searchUser: "User search"
|
||||
reply: "Reply"
|
||||
loadMore: "Load more"
|
||||
showMore: "Load more"
|
||||
youGotNewFollower: "Followed you"
|
||||
receiveFollowRequest: "Follow request received"
|
||||
followRequestAccepted: "Follow request accepted"
|
||||
@ -63,7 +68,7 @@ exportRequested: "You have requested an export. This may take a while. After the
|
||||
importRequested: "You requested an import. This may take a while."
|
||||
lists: "Lists"
|
||||
noLists: "You don't have any lists"
|
||||
note: "Notes"
|
||||
note: "Note"
|
||||
notes: "Notes"
|
||||
following: "Following"
|
||||
followers: "Followers"
|
||||
@ -74,7 +79,7 @@ error: "Error"
|
||||
somethingHappened: "An error occurred"
|
||||
retry: "Retry"
|
||||
pageLoadError: "Failed to load page"
|
||||
pageLoadErrorDescription: "This is normally caused by network errors or the browser's cache. Try clearung the cache and then try again after waiting a little while."
|
||||
pageLoadErrorDescription: "This is normally caused by network errors or the browser's cache. Try clearing the cache and then try again after waiting a little while."
|
||||
enterListName: "List name"
|
||||
privacy: "Privacy"
|
||||
makeFollowManuallyApprove: "Follow requests require approval"
|
||||
@ -87,8 +92,12 @@ followRequestPending: "Pending follow request"
|
||||
enterEmoji: "Enter an emoji"
|
||||
renote: "Renote"
|
||||
unrenote: "Unrenote"
|
||||
renoted: "Renoted."
|
||||
cantRenote: "This post can't be renoted."
|
||||
cantReRenote: "A renote can't be renoted."
|
||||
quote: "Quote"
|
||||
pinnedNote: "Pinned note"
|
||||
pinned: "Pin to profile"
|
||||
you: "You"
|
||||
clickToShow: "Click to show"
|
||||
sensitive: "NSFW"
|
||||
@ -245,7 +254,7 @@ birthday: "Birthday"
|
||||
yearsOld: "{age} years old"
|
||||
registeredDate: "Joined on"
|
||||
location: "Location"
|
||||
theme: "Theme"
|
||||
theme: "Themes"
|
||||
themeForLightMode: "Theme to use in Light Mode"
|
||||
themeForDarkMode: "Theme to use in Dark Mode"
|
||||
light: "Light"
|
||||
@ -306,7 +315,7 @@ enableLocalTimeline: "Enable local timeline"
|
||||
enableGlobalTimeline: "Enable global timeline"
|
||||
disablingTimelinesInfo: "Admins and Mods will always have access to all timelines, even if they are not enabled."
|
||||
registration: "Register"
|
||||
enableRegistration: "Enable new user registeration"
|
||||
enableRegistration: "Enable new user registration"
|
||||
invite: "Invite"
|
||||
proxyRemoteFiles: "Proxy remote files"
|
||||
proxyRemoteFilesDescription: "If enabled, remote files that (1) are not stored locally or (2) got deleted from exceeding storage limit will be locally proxied (with thumbnails). This does not affect the server's storage."
|
||||
@ -338,8 +347,8 @@ antennaSource: "Antenna source"
|
||||
antennaKeywords: "Keywords to receive"
|
||||
antennaExcludeKeywords: "Keywords to exclude"
|
||||
antennaKeywordsDescription: "Separate with spaces for AND condition. Separate with line breaks for OR."
|
||||
notifyAntenna: "Notify newer notes"
|
||||
withFileAntenna: "Filter only notes with file attached"
|
||||
notifyAntenna: "Notify for new notes"
|
||||
withFileAntenna: "Filter only notes with file(s) attached"
|
||||
serviceworker: "ServiceWorker"
|
||||
enableServiceworker: "Enable ServiceWorker"
|
||||
antennaUsersDescription: "List one username per line"
|
||||
@ -429,6 +438,7 @@ signinWith: "Sign in with {x}"
|
||||
signinFailed: "Unable to sign in. The username or password you entered is incorrect."
|
||||
tapSecurityKey: "Tap your security key"
|
||||
or: "Or"
|
||||
language: "Language"
|
||||
uiLanguage: "UI display language"
|
||||
groupInvited: "Invited to group"
|
||||
aboutX: "About {x}"
|
||||
@ -540,7 +550,6 @@ author: "Author"
|
||||
leaveConfirm: "There are unsaved changes. Do you want to discard them?"
|
||||
manage: "Management"
|
||||
plugins: "Plugins"
|
||||
pluginInstallWarn: "Please do not install untrustworthy plugins."
|
||||
deck: "Deck"
|
||||
undeck: "Leave Deck"
|
||||
useBlurEffectForModal: "Use blur effect for modals"
|
||||
@ -638,8 +647,8 @@ no: "No"
|
||||
driveFilesCount: "Amount of drive files"
|
||||
driveUsage: "Drive space usage"
|
||||
noCrawle: "Reject crawler indexing"
|
||||
noCrawleDescription: "Ask search engines not to index your profile page, notes, Pages, etc"
|
||||
lockedAccountInfo: "Unless you set your note visiblity to \"Followers only\", your notes are visible to anyone even if you require followers to be manually approved."
|
||||
noCrawleDescription: "Ask search engines not to index your profile page, notes, Pages, etc."
|
||||
lockedAccountInfo: "Unless you set your note visiblity to \"Followers only\", your notes are visible to anyone, even if you require followers to be manually approved."
|
||||
alwaysMarkSensitive: "Mark NSFW by default"
|
||||
loadRawImages: "Display image attachments fully instead of thumbnails"
|
||||
disableShowingAnimatedImages: "Don't play animated images"
|
||||
@ -655,6 +664,67 @@ useSystemFont: "Use the system's default font"
|
||||
clips: "Clips"
|
||||
experimentalFeatures: "Experimental features"
|
||||
developer: "Developer"
|
||||
makeExplorable: "Make account visible in \"Explore\""
|
||||
makeExplorableDescription: "If you turn this off, your account will not show up in the \"Explore\" section."
|
||||
showGapBetweenNotesInTimeline: "Show a gap between posts on the timeline"
|
||||
duplicate: "Duplicate"
|
||||
left: "Left"
|
||||
center: "Center"
|
||||
wide: "Wide"
|
||||
narrow: "Narrow"
|
||||
reloadToApplySetting: "This setting will be applied upon page reload. Reload now?"
|
||||
showTitlebar: "Show title bar"
|
||||
clearCache: "Clear cache"
|
||||
onlineUsersCount: "{n} people are online"
|
||||
nUsers: "{n} Users"
|
||||
nNotes: "{n} Notes"
|
||||
sendErrorReports: "Send error reports"
|
||||
sendErrorReportsDescription: "When turned on, detailed error information will be shared with Misskey when a problem occurs, helping to improve the quality of Misskey."
|
||||
myTheme: "My theme"
|
||||
backgroundColor: "Background"
|
||||
accentColor: "Accent"
|
||||
textColor: "Text"
|
||||
saveAs: "Save as..."
|
||||
advanced: "Advanced"
|
||||
value: "Value"
|
||||
updatedAt: "Updated at"
|
||||
saveConfirm: "Save changes?"
|
||||
deleteConfirm: "Really delete?"
|
||||
invalidValue: "Invalid value."
|
||||
registry: "Registry"
|
||||
closeAccount: "Close account"
|
||||
currentVersion: "Current version"
|
||||
latestVersion: "Newest version"
|
||||
youAreRunningUpToDateClient: "You are using the newest version of your client."
|
||||
newVersionOfClientAvailable: "There is a newer version of your client available."
|
||||
usageAmount: "Usage"
|
||||
capacity: "Capacity"
|
||||
inUse: "Used"
|
||||
editCode: "Edit code"
|
||||
apply: "Apply"
|
||||
receiveAnnouncementFromInstance: "Receive Email notifications from this instance"
|
||||
emailNotification: "Email notifications"
|
||||
inChannelSearch: "Search in channel"
|
||||
useReactionPickerForContextMenu: "Open reaction picker on right-click"
|
||||
typingUsers: "{users} is/are typing..."
|
||||
jumpToSpecifiedDate: "Jump to specific date"
|
||||
showingPastTimeline: "Currently displaying an old timeline"
|
||||
clear: "Return"
|
||||
_email:
|
||||
_follow:
|
||||
title: "You've got a new follower"
|
||||
_receiveFollowRequest:
|
||||
title: "You've received a follow request"
|
||||
_plugin:
|
||||
install: "Install plugins"
|
||||
installWarn: "Please do not install untrustworthy plugins."
|
||||
manage: "Manage plugins"
|
||||
_registry:
|
||||
scope: "Scope"
|
||||
key: "Key"
|
||||
keys: "Keys"
|
||||
domain: "Domain"
|
||||
createKey: "Create key"
|
||||
_aboutMisskey:
|
||||
about: "Misskey is open-source software being developed by syuilo since 2014."
|
||||
contributors: "Main contributors"
|
||||
@ -716,6 +786,16 @@ _mfm:
|
||||
twitchDescription: "Infuses a strongly twitching animation."
|
||||
spin: "Animation (Spin)"
|
||||
spinDescription: "Infuses a spinning animation."
|
||||
x2: "Big"
|
||||
x2Description: "Displays content bigger."
|
||||
x3: "Very big"
|
||||
x3Description: "Displays content even bigger."
|
||||
x4: "Extremely big"
|
||||
x4Description: "Displays content even bigger than bigger than big."
|
||||
blur: "Blur"
|
||||
blurDescription: "Content can be blurred via this effect. It will be clearly displayed by hovering your cursor above it."
|
||||
font: "Font"
|
||||
fontDescription: "Sets the font to display contents in."
|
||||
_reversi:
|
||||
reversi: "Reversi"
|
||||
gameSettings: "Game settings"
|
||||
@ -975,6 +1055,11 @@ _widgets:
|
||||
federation: "Federation"
|
||||
postForm: "Compose a note"
|
||||
slideshow: "Slideshow"
|
||||
button: "Button"
|
||||
onlineUsers: "Online users"
|
||||
jobQueue: "Job Queue"
|
||||
serverMetric: "Server metrics"
|
||||
aiscript: "AiScript console"
|
||||
_cw:
|
||||
hide: "Hide"
|
||||
show: "Load more"
|
||||
@ -1457,14 +1542,18 @@ _notification:
|
||||
_deck:
|
||||
alwaysShowMainColumn: "Always show main column"
|
||||
columnAlign: "Align columns"
|
||||
columnMargin: "Margin between columns"
|
||||
columnHeaderHeight: " Column header height"
|
||||
addColumn: "Add column"
|
||||
swapLeft: "Swap to left"
|
||||
swapRight: "Swap to right"
|
||||
swapUp: "Swap with above"
|
||||
swapDown: "Swap with below"
|
||||
stackLeft: "Stack on the left"
|
||||
stackLeft: "Stack on left column"
|
||||
popRight: "Pop to the right"
|
||||
profile: "Profile"
|
||||
_columns:
|
||||
main: "Main"
|
||||
widgets: "Widgets"
|
||||
notifications: "Notifications"
|
||||
tl: "Timeline"
|
||||
|
@ -33,6 +33,9 @@ addUser: "Agregar usuario"
|
||||
favorite: "Favorito"
|
||||
favorites: "Favoritos"
|
||||
unfavorite: "Quitar de favoritos"
|
||||
favorited: "Añadido a favoritos"
|
||||
alreadyFavorited: "Ya había sido añadido a favoritos"
|
||||
cantFavorite: "No fue añadido a favoritos"
|
||||
pin: "Fijar"
|
||||
unpin: "Desfijar"
|
||||
copyContent: "Copiar contenido"
|
||||
@ -46,6 +49,7 @@ copyUsername: "Copiar nombre de usuario"
|
||||
searchUser: "Búsqueda de usuarios"
|
||||
reply: "Responder"
|
||||
loadMore: "Ver más"
|
||||
showMore: "Ver más"
|
||||
youGotNewFollower: "te ha seguido"
|
||||
receiveFollowRequest: "Recibiste una solicitud de seguimiento"
|
||||
followRequestAccepted: "La solicitud de seguimiento fue aceptada"
|
||||
@ -87,14 +91,19 @@ followRequestPending: "Solicitudes de seguimiento pendientes"
|
||||
enterEmoji: "Ingresar emojis"
|
||||
renote: "Renotar"
|
||||
unrenote: "Quitar renota"
|
||||
renoted: "Renotado"
|
||||
cantRenote: "No se puede renotar este post"
|
||||
cantReRenote: "No se puede renotar una renota"
|
||||
quote: "Citar"
|
||||
pinnedNote: "Nota fijada"
|
||||
pinned: "Fijar"
|
||||
you: "Tú"
|
||||
clickToShow: "Click para ver"
|
||||
sensitive: "Marcado como sensible"
|
||||
add: "Agregar"
|
||||
reaction: "Reacción"
|
||||
reactionSettingDescription: "Asigne sus reacción favoritas que desean anclar en el selector de reacciones."
|
||||
reactionSettingDescription2: "Arrastre para reordenar, click para borrar, apriete la tecla + para añadir."
|
||||
rememberNoteVisibility: "Recordar visibilidad"
|
||||
attachCancel: "Quitar adjunto"
|
||||
markAsSensitive: "Marcar como sensible"
|
||||
@ -124,7 +133,9 @@ settingGuide: "Configuración sugerida"
|
||||
cacheRemoteFiles: "Mantener en cache los archivos remotos"
|
||||
cacheRemoteFilesDescription: "Si desactiva esta configuración, Los archivos remotos se cargarán desde el link directo sin usar la caché. Con eso se puede ahorrar almacenamiento del servidor, pero eso aumentará el tráfico al no crear miniaturas."
|
||||
flagAsBot: "Esta cuenta es un bot"
|
||||
flagAsBotDescription: "En caso de que esta cuenta fuera usada por un programa, active esta opción. Al hacerlo, esta opción servirá para otros desarrolladores para evitar cadenas infinitas de reacciones, y ajustará los sistemas internos de Misskey para que trate a esta cuenta como un bot."
|
||||
flagAsCat: "Esta cuenta es un gato"
|
||||
flagAsCatDescription: "En caso de que declare que esta cuenta es de un gato, active esta opción."
|
||||
autoAcceptFollowed: "Aceptar automáticamente las solicitudes de seguimiento de los usuarios que sigues"
|
||||
addAcount: "Agregar cuenta"
|
||||
loginFailed: "Error al iniciar sesión."
|
||||
@ -215,6 +226,7 @@ remove: "Borrar"
|
||||
removed: "Borrado"
|
||||
removeAreYouSure: "¿Desea borrar \"{x}\"?"
|
||||
deleteAreYouSure: "¿Desea borrar \"{x}\"?"
|
||||
resetAreYouSure: "¿Desea reestablecer?"
|
||||
saved: "Guardado"
|
||||
messaging: "Chat"
|
||||
upload: "Subir"
|
||||
@ -314,6 +326,9 @@ bannerUrl: "URL de la imagen del banner"
|
||||
basicInfo: "Información básica"
|
||||
pinnedUsers: "Usuarios fijados"
|
||||
pinnedUsersDescription: "Describir los usuarios que quiere fijar en la página \"Descubrir\" separados por una linea nueva"
|
||||
pinnedPages: "Páginas fijadas"
|
||||
pinnedPagesDescription: "Describa las rutas de las páginas que desea fijar a la página principal de la instancia, separadas por lineas nuevas"
|
||||
pinnedClipId: "Id del clip fijado"
|
||||
pinnedNotes: "Nota fijada"
|
||||
hcaptcha: "hCaptcha"
|
||||
enableHcaptcha: "Habilitar hCaptcha"
|
||||
@ -429,6 +444,7 @@ useOsNativeEmojis: "Usa los emojis nativos de la plataforma"
|
||||
youHaveNoGroups: "Sin grupos"
|
||||
joinOrCreateGroup: "Obtenga una invitación para unirse al grupos o puede crear su propio grupo."
|
||||
noHistory: "No hay datos en el historial"
|
||||
signinHistory: "Historial de ingresos"
|
||||
disableAnimatedMfm: "Deshabilitar MFM que tiene animaciones"
|
||||
doing: "Voy en camino"
|
||||
category: "Categoría"
|
||||
@ -481,6 +497,7 @@ none: "Ninguna"
|
||||
showInPage: "Mostrar en la página"
|
||||
popout: "Popout"
|
||||
volume: "Volumen"
|
||||
masterVolume: "Volumen principal"
|
||||
details: "Detalles"
|
||||
chooseEmoji: "Elije un emoji"
|
||||
unableToProcess: "La operación no se puede llevar a cabo"
|
||||
@ -531,13 +548,15 @@ author: "Autor"
|
||||
leaveConfirm: "Hay modificaciones sin guardar. ¿Desea descartarlas?"
|
||||
manage: "Administrar"
|
||||
plugins: "Plugins"
|
||||
pluginInstallWarn: "Por favor no instale plugins que no son de confianza"
|
||||
deck: "Deck"
|
||||
undeck: "Quitar deck"
|
||||
useBlurEffectForModal: "Usar efecto borroso en modales"
|
||||
useFullReactionPicker: "Reacción"
|
||||
width: "Ancho"
|
||||
height: "Altura"
|
||||
large: "Grande"
|
||||
medium: "Mediano"
|
||||
small: "Pequeño"
|
||||
generateAccessToken: "Generar token de acceso"
|
||||
permission: "Permisos"
|
||||
enableAll: "Activar todo"
|
||||
@ -550,6 +569,8 @@ useStarForReactionFallback: "En caso de que los emojis de reacciones no sean cla
|
||||
emailConfig: "Configuración del servidor de correos"
|
||||
enableEmail: "Activar el envío de correos electrónicos"
|
||||
emailConfigInfo: "Usar en caso de validación de correo electrónico y pedido de contraseña"
|
||||
email: "Correo"
|
||||
emailAddress: "Correo electrónico"
|
||||
smtpConfig: "Configuración del servidor SMTP"
|
||||
smtpHost: "Host"
|
||||
smtpPort: "Puerto"
|
||||
@ -581,6 +602,7 @@ regenerateLoginTokenDescription: "Regenerar el token usado internamente durante
|
||||
setMultipleBySeparatingWithSpace: "Puedes añadir mas de uno, separado por espacios."
|
||||
fileIdOrUrl: "Id del archivo o URL"
|
||||
chatOpenBehavior: "Comportamiento al abrir el chat"
|
||||
behavior: "Comportamiento"
|
||||
sample: "Muestra"
|
||||
abuseReports: "Reportes"
|
||||
reportAbuse: "Reportar"
|
||||
@ -599,7 +621,43 @@ random: "Aleatorio"
|
||||
system: "Sistema"
|
||||
switchUi: "Cambiar interfaz de usuario"
|
||||
desktop: "Escritorio"
|
||||
clip: "Clip"
|
||||
createNew: "Crear"
|
||||
optional: "Opcional"
|
||||
createNewClip: "Crear clip nuevo"
|
||||
public: "Público"
|
||||
i18nInfo: "Misskey está siendo traducido a varios idiomas gracias a voluntarios. Se puede colaborar traduciendo en {link}"
|
||||
manageAccessTokens: "Administrar tokens de acceso"
|
||||
accountInfo: "Información de la Cuenta"
|
||||
notesCount: "Cantidad de notas"
|
||||
repliesCount: "Cantidad de respuestas hechas"
|
||||
renotesCount: "Cantidad de renotas hechas"
|
||||
repliedCount: "Cantidad de respuestas recibidas"
|
||||
renotedCount: "Cantidad de renotas recibidas"
|
||||
followingCount: "Cantidad de seguidos"
|
||||
followersCount: "Cantidad de seguidores"
|
||||
sentReactionsCount: "Cantidad de reacciones hechas"
|
||||
receivedReactionsCount: "Cantidad de reacciones recibidas"
|
||||
pollVotesCount: "Cantidad de votaciones hechas"
|
||||
pollVotedCount: "Cantidad de votaciones recibidas"
|
||||
yes: "Si"
|
||||
no: "No"
|
||||
driveFilesCount: "Cantidad de archivos en el drive"
|
||||
driveUsage: "Uso del drive"
|
||||
noCrawle: "Rechazar indexación del crawler"
|
||||
noCrawleDescription: "Pedir a los motores de búsqueda que no indexen tu perfil, notas, páginas, etc."
|
||||
clips: "Clip"
|
||||
clearCache: "Limpiar caché"
|
||||
backgroundColor: "Fondo"
|
||||
accentColor: "Acento"
|
||||
textColor: "Texto"
|
||||
value: "Valores"
|
||||
_email:
|
||||
_follow:
|
||||
title: "te ha seguido"
|
||||
_registry:
|
||||
key: "Clave"
|
||||
keys: "Clave"
|
||||
_mfm:
|
||||
cheatSheet: "Hoja de referencia de MFM"
|
||||
intro: "MFM es un lenguaje de marcado dedicado que se puede usar en varios lugares dentro de Misskey. Aquí puede ver una lista de sintaxis disponibles en MFM."
|
||||
@ -617,6 +675,7 @@ _mfm:
|
||||
search: "Buscar"
|
||||
flip: "Echar de un capirotazo"
|
||||
flipDescription: "Voltea el contenido hacia arriba / abajo o hacia la izquierda / derecha."
|
||||
font: "Fuente"
|
||||
_reversi:
|
||||
reversi: "Reversi"
|
||||
gameSettings: "Configuración del juego"
|
||||
@ -871,6 +930,8 @@ _widgets:
|
||||
digitalClock: "Reloj digital"
|
||||
federation: "Federación"
|
||||
postForm: "Formulario"
|
||||
button: "Botón"
|
||||
jobQueue: "Cola de trabajos"
|
||||
_cw:
|
||||
hide: "Ocultar"
|
||||
show: "Ver más"
|
||||
|
@ -1,5 +1,6 @@
|
||||
---
|
||||
_lang_: "Français"
|
||||
headlineMisskey: "Réseau relié par des notes"
|
||||
introMisskey: "Bienvenue ! Misskey est un service de microblogage décentralisé, libre et ouvert.\nÉcrivez des « notes » et partagez ce qui se passe à l’instant présent, autour de vous avec les autres 📡\nLa fonction « réactions », vous permet également d’ajouter une réaction rapide aux notes des autres utilisateur·rice·s 👍\nExplorons un nouveau monde 🚀"
|
||||
monthAndDay: "{day}/{month}"
|
||||
search: "Rechercher"
|
||||
@ -16,7 +17,7 @@ noNotes: "Aucune note"
|
||||
noNotifications: "Aucune notification"
|
||||
instance: "Instance"
|
||||
settings: "Paramètres"
|
||||
basicSettings: "Paramètres basiques"
|
||||
basicSettings: "Paramètres généraux"
|
||||
otherSettings: "Autres paramètres"
|
||||
openInWindow: "Ouvrir dans une nouvelle fenêtre"
|
||||
profile: "Profil"
|
||||
@ -33,6 +34,9 @@ addUser: "Ajouter un·e utilisateur·rice"
|
||||
favorite: "Ajouter aux favoris"
|
||||
favorites: "Favoris"
|
||||
unfavorite: "Retirer des favoris"
|
||||
favorited: "Ajouté à mes favoris"
|
||||
alreadyFavorited: "Déjà ajouté aux favoris."
|
||||
cantFavorite: "Impossible d'ajouter aux favoris."
|
||||
pin: "Épingler sur le profil"
|
||||
unpin: "Désépingler"
|
||||
copyContent: "Copier le contenu"
|
||||
@ -46,6 +50,7 @@ copyUsername: "Copier le nom d’utilisateur·rice"
|
||||
searchUser: "Chercher un·e utilisateur·rice"
|
||||
reply: "Répondre"
|
||||
loadMore: "Afficher plus …"
|
||||
showMore: "Afficher plus …"
|
||||
youGotNewFollower: "Vous suit"
|
||||
receiveFollowRequest: "Demande d’abonnement reçue"
|
||||
followRequestAccepted: "La demande d’abonnement a été acceptée"
|
||||
@ -57,7 +62,7 @@ import: "Importer"
|
||||
export: "Exporter"
|
||||
files: "Fichiers"
|
||||
download: "Télécharger"
|
||||
driveFileDeleteConfirm: "Êtes-vous sûr·e de vouloir supprimer le fichier \"{name}\" ? Les notes avec ce fichier joint seront aussi supprimées."
|
||||
driveFileDeleteConfirm: "Êtes-vous sûr·e de vouloir supprimer le fichier \"{name}\" ? Les notes liées à ce fichier seront aussi supprimées."
|
||||
unfollowConfirm: "Désirez-vous vous désabonner de {name} ?"
|
||||
exportRequested: "Vous avez demandé une exportation. L’opération pourrait prendre un peu de temps. Une terminée, le fichier résultant sera ajouté au Drive."
|
||||
importRequested: "Vous avez initié un import. Cela pourrait prendre un peu de temps."
|
||||
@ -74,6 +79,7 @@ error: "Erreur"
|
||||
somethingHappened: "Une erreur est survenue"
|
||||
retry: "Réessayer"
|
||||
pageLoadError: "Le chargement de la page a échoué"
|
||||
pageLoadErrorDescription: "Cela est généralement causé par le cache du navigateur ou par un problème réseau. Veuillez vider votre cache ou attendre un peu et réessayer."
|
||||
enterListName: "Nom de la liste"
|
||||
privacy: "Confidentialité"
|
||||
makeFollowManuallyApprove: "Accepter manuellement les demandes d’abonnement"
|
||||
@ -82,25 +88,30 @@ follow: "S’abonner"
|
||||
followRequest: "Demande d’abonnement"
|
||||
followRequests: "Demandes d’abonnement"
|
||||
unfollow: "Se désabonner"
|
||||
followRequestPending: "En attente d’approbation"
|
||||
enterEmoji: "ou entrez un émoji"
|
||||
renote: "Renote"
|
||||
unrenote: "Annuler Renote"
|
||||
followRequestPending: "Demande d'abonnement en attente de confirmation"
|
||||
enterEmoji: "Insérer un émoji"
|
||||
renote: "Partager"
|
||||
unrenote: "Annuler le partage"
|
||||
renoted: "Republié !"
|
||||
cantRenote: "Ce message ne peut pas être republié."
|
||||
cantReRenote: "Impossible de repartager un partage."
|
||||
quote: "Citer"
|
||||
pinnedNote: "Note épinglée"
|
||||
pinned: "Épingler sur le profil"
|
||||
you: "Vous"
|
||||
clickToShow: "Cliquer pour afficher"
|
||||
sensitive: "Contenu sensible"
|
||||
add: "Ajouter"
|
||||
reaction: "Réactions"
|
||||
reactionSettingDescription: "Choisissez vos réactions préférées que vous souhaitez épingler dans le sélecteur de réactions."
|
||||
reactionSettingDescription2: "Déplacer pour réorganiser, cliquer pour effacer, utiliser « + » pour ajouter."
|
||||
rememberNoteVisibility: "Se souvenir de la visibilité des notes"
|
||||
attachCancel: "Supprimer le fichier attaché"
|
||||
markAsSensitive: "Marquer comme sensible"
|
||||
unmarkAsSensitive: "Enlever le marquage comme sensible"
|
||||
unmarkAsSensitive: "Supprimer le marquage comme sensible"
|
||||
enterFileName: "Entrer le nom du fichier"
|
||||
mute: "Mettre en sourdine"
|
||||
unmute: "Enlever la sourdine"
|
||||
unmute: "Ne plus masquer"
|
||||
block: "Bloquer"
|
||||
unblock: "Débloquer"
|
||||
suspend: "Suspendre"
|
||||
@ -113,7 +124,7 @@ selectList: "Sélectionner une liste"
|
||||
selectAntenna: "Sélectionner une antenne"
|
||||
selectWidget: "Sélectionner un widget"
|
||||
editWidgets: "Modifier les widgets"
|
||||
editWidgetsExit: "Fait"
|
||||
editWidgetsExit: "Valider les modifications"
|
||||
customEmojis: "Émojis personnalisés"
|
||||
emoji: "Émoji"
|
||||
emojiName: "Nom de l’émoji"
|
||||
@ -123,7 +134,9 @@ settingGuide: "Configuration proposée"
|
||||
cacheRemoteFiles: "Mise en cache des fichiers distants"
|
||||
cacheRemoteFilesDescription: "Lorsque cette option est désactivée, les fichiers distants sont chargés directement depuis l’instance distante. La désactiver diminuera certes l’utilisation de l’espace de stockage local mais augmentera le trafic réseau puisque les miniatures ne seront plus générées."
|
||||
flagAsBot: "Ce compte est un robot"
|
||||
flagAsBotDescription: "Si ce compte est géré de manière automatisée , définissez cette option. Si elle est activée, elle agira comme un marqueur pour les autres développeurs afin d'éviter des chaînes d'interaction sans fin avec d'autres robots et d'ajuster les systèmes internes de Misskey pour traiter ce compte comme un robot."
|
||||
flagAsCat: "Ce compte est un chat"
|
||||
flagAsCatDescription: "Vous pouvez activer l'option \"Je suis un chat \" pour ce compte."
|
||||
autoAcceptFollowed: "Accepter automatiquement les demandes d’abonnement venant d’utilisateur·rice·s que vous suivez"
|
||||
addAcount: "Ajouter un compte"
|
||||
loginFailed: "Échec de la connexion"
|
||||
@ -139,7 +152,7 @@ proxyAccount: "Compte proxy"
|
||||
proxyAccountDescription: "Un compte proxy se comporte, dans certaines conditions, comme un·e abonné·e distant·e pour les utilisateurs d'autres instances. Par exemple, quand un·e utilisateur·rice ajoute un·e utilisateur·rice distant·e à une liste, ses notes ne seront pas visibles sur l'instance si personne ne suit cet·te utilisateur·rice. Le compte proxy va donc suivre cet·te utilisateur·rice pour que ses notes soient acheminées."
|
||||
host: "Hôte"
|
||||
selectUser: "Sélectionner un·e utilisateur·rice"
|
||||
recipient: "Correspondant·e"
|
||||
recipient: "Destinataire"
|
||||
annotation: "Commentaires"
|
||||
federation: "Fédération"
|
||||
instances: "Instance"
|
||||
@ -158,7 +171,7 @@ software: "Logiciel"
|
||||
version: "Version"
|
||||
metadata: "Métadonnées"
|
||||
withNFiles: "{n} fichier(s)"
|
||||
monitor: "Écran de contrôle"
|
||||
monitor: "Contrôle"
|
||||
jobQueue: "File d’attente"
|
||||
cpuAndMemory: "Processeur et mémoire"
|
||||
network: "Réseau"
|
||||
@ -167,9 +180,9 @@ instanceInfo: "Informations sur l’instance"
|
||||
statistics: "Statistiques"
|
||||
clearQueue: "Vider la file d’attente"
|
||||
clearQueueConfirmTitle: "Êtes-vous sûr·e de vouloir vider la file d’attente ?"
|
||||
clearQueueConfirmText: "Les notes non distribuées ne seront pas livrées. Normalement, vous n'avez PAS besoin d'effectuer cette opération."
|
||||
clearQueueConfirmText: "Les notes non distribuées ne seront pas délivrées. Normalement, vous n'avez pas besoin d'effectuer cette opération."
|
||||
clearCachedFiles: "Vider le cache"
|
||||
clearCachedFilesConfirm: "Êtes-vous sûr·e de vouloir vider le cache de fichiers distants ?"
|
||||
clearCachedFilesConfirm: "Êtes-vous sûr·e de vouloir vider tout le cache de fichiers distants ?"
|
||||
blockedInstances: "Instances bloquées"
|
||||
blockedInstancesDescription: "Listez les instances que vous désirez bloquer, une par ligne. Ces instances ne seront plus en capacité d'interagir avec votre instance."
|
||||
muteAndBlock: "Masqué·e·s / Bloqué·e·s"
|
||||
@ -182,7 +195,7 @@ pinLimitExceeded: "Vous ne pouvez plus épingler d’autres notes."
|
||||
intro: "L’installation de Misskey est terminée ! Veuillez créer un compte administrateur."
|
||||
done: "Terminé"
|
||||
processing: "Traitement en cours"
|
||||
preview: "Prévisualisation"
|
||||
preview: "Aperçu"
|
||||
default: "Par défaut"
|
||||
noCustomEmojis: "Il n'y a pas d’émoji"
|
||||
noJobs: "Il n’y a aucune tâche planifiée"
|
||||
@ -193,7 +206,7 @@ all: "Tous"
|
||||
subscribing: "Abonné"
|
||||
publishing: "Publié"
|
||||
notResponding: "Ne répond pas"
|
||||
instanceFollowing: "Abonnements une instance"
|
||||
instanceFollowing: "Suivre une instance"
|
||||
instanceFollowers: "Abonné·e·s de l’instance"
|
||||
instanceUsers: "Utilisateur·rice·s de cette l’instance"
|
||||
changePassword: "Modifier votre mot de passe"
|
||||
@ -206,14 +219,15 @@ attachFile: "Joindre un fichier"
|
||||
more: "Plus !"
|
||||
featured: "Tendances"
|
||||
usernameOrUserId: "Nom d’utilisateur·rice ou ID utilisateur"
|
||||
noSuchUser: "Utilisateur·rice non trouvé"
|
||||
noSuchUser: "Utilisateur·rice non trouvé·e"
|
||||
lookup: "Recherche"
|
||||
announcements: "Annonces"
|
||||
imageUrl: "URL de l’image"
|
||||
remove: "Supprimer"
|
||||
removed: "Supprimé"
|
||||
removeAreYouSure: "Supprimer «{x}» ?"
|
||||
deleteAreYouSure: "Supprimer «{x}» ?"
|
||||
removeAreYouSure: "Êtes-vous sûr·e de vouloir supprimer「{x}」?"
|
||||
deleteAreYouSure: "Êtes-vous sûr·e de vouloir supprimer「{x}」?"
|
||||
resetAreYouSure: "Voulez-vous réinitialiser ?"
|
||||
saved: "Enregistré"
|
||||
messaging: "Discuter"
|
||||
upload: "Téléverser"
|
||||
@ -245,28 +259,28 @@ themeForLightMode: "Thème à utiliser en Mode Clair"
|
||||
themeForDarkMode: "Thème à utiliser en Mode Sombre"
|
||||
light: "Clair"
|
||||
dark: "Sombre"
|
||||
lightThemes: "Thème clair"
|
||||
darkThemes: "Thème sombre"
|
||||
syncDeviceDarkMode: "Synchronisez le mode sombre avec les paramètres de votre appareil"
|
||||
lightThemes: "Thèmes clairs"
|
||||
darkThemes: "Thèmes sombres"
|
||||
syncDeviceDarkMode: "Utiliser le mode sombre de votre appareil"
|
||||
drive: "Drive"
|
||||
fileName: "Nom du fichier"
|
||||
selectFile: "Choisir le fichier"
|
||||
selectFiles: "Choisir les fichiers"
|
||||
selectFolder: "Sélectionnez un dossier"
|
||||
selectFolders: "Sélectionnez des dossiers"
|
||||
renameFile: "Renommer le ficher"
|
||||
renameFile: "Renommer le fichier"
|
||||
folderName: "Nom du dossier"
|
||||
createFolder: "Créer un dossier"
|
||||
renameFolder: "Renommer le dossier"
|
||||
deleteFolder: "Supprimer le dossier"
|
||||
addFile: "Ajoutez un fichier"
|
||||
addFile: "Ajouter un fichier"
|
||||
emptyDrive: "Le Drive est vide"
|
||||
emptyFolder: "Le dossier est vide"
|
||||
unableToDelete: "Ne peut pas être supprimé"
|
||||
unableToDelete: "Suppression impossible"
|
||||
inputNewFileName: "Entrez un nouveau nom de fichier"
|
||||
inputNewFolderName: "Entrez un nouveau nom de dossier"
|
||||
circularReferenceFolder: "Le dossier de destination est un sous-dossier du dossier que vous souhaitez déplacer."
|
||||
hasChildFilesOrFolders: "Ce dossier n'est pas vide, il ne peut donc pas être supprimé"
|
||||
hasChildFilesOrFolders: "Impossible de supprimer ce dossier car il n'est pas vide."
|
||||
copyUrl: "Copier l’URL"
|
||||
rename: "Renommer"
|
||||
avatar: "Avatar"
|
||||
@ -276,7 +290,7 @@ whenServerDisconnected: "Lorsque la connexion au serveur est perdue"
|
||||
disconnectedFromServer: "Déconnecté·e du serveur"
|
||||
reload: "Rafraîchir"
|
||||
doNothing: "Ignorer"
|
||||
reloadConfirm: "Voulez-vous recharger le fil ?"
|
||||
reloadConfirm: "Voulez-vous recharger?"
|
||||
watch: "Surveiller"
|
||||
unwatch: "Ne plus surveiller"
|
||||
accept: "Autoriser"
|
||||
@ -313,6 +327,9 @@ bannerUrl: "URL de l’image de la bannière"
|
||||
basicInfo: "Informations basiques"
|
||||
pinnedUsers: "Utilisateur·rice épinglé·e"
|
||||
pinnedUsersDescription: "Listez les utilisateur·rice·s que vous souhaitez voir épinglé·e·s sur la page \"Découvrir\", un·e par ligne."
|
||||
pinnedPages: "Pages épinglées"
|
||||
pinnedPagesDescription: "Inscrivez le chemin des pages que vous souhaitez épingler en haut de la page de l'instance. Séparez les pages d'un retour à la ligne."
|
||||
pinnedClipId: "Identifiant du clip épinglé"
|
||||
pinnedNotes: "Note épinglée"
|
||||
hcaptcha: "hCaptcha"
|
||||
enableHcaptcha: "Activer hCaptcha"
|
||||
@ -342,7 +359,7 @@ notesAndReplies: "Notes et Réponses"
|
||||
withFiles: "Avec fichiers joints"
|
||||
silence: "Mettre en sourdine"
|
||||
silenceConfirm: "Êtes-vous sûr·e de vouloir mettre l’utilisateur·rice en sourdine ?"
|
||||
unsilence: "Annuler la mise en sourdine"
|
||||
unsilence: "Annuler la sourdine"
|
||||
unsilenceConfirm: "Êtes-vous sûr·e de vouloir annuler la mise en sourdine de cette utilisateur·rice ?"
|
||||
popularUsers: "Utilisateur·rice·s populaires"
|
||||
recentlyUpdatedUsers: "Utilisateur·rice·s actif·ve·s récemment"
|
||||
@ -421,6 +438,7 @@ signinWith: "Connectez-vous avec {x}"
|
||||
signinFailed: "Échec d’authentification. Veuillez vérifier que votre nom d’utilisateur et mot de passe sont corrects."
|
||||
tapSecurityKey: "Appuyez sur votre clé de sécurité"
|
||||
or: "OU"
|
||||
language: "Langue"
|
||||
uiLanguage: "Langue d’affichage de l’interface"
|
||||
groupInvited: "Invité au groupe"
|
||||
aboutX: "À propos de {x}"
|
||||
@ -428,6 +446,7 @@ useOsNativeEmojis: "Utiliser les émojis natifs du système"
|
||||
youHaveNoGroups: "Vous n’avez aucun groupe"
|
||||
joinOrCreateGroup: "Soyez invité à rejoindre les groupes ou vous pouvez créer votre propre groupe."
|
||||
noHistory: "Pas d'historique"
|
||||
signinHistory: "Historique de connexion"
|
||||
disableAnimatedMfm: "Désactiver MFM ayant des animations"
|
||||
doing: "Attends une seconde"
|
||||
category: "Catégories"
|
||||
@ -469,6 +488,7 @@ objectStorageUseSSL: "Utiliser SSL"
|
||||
objectStorageUseSSLDesc: "Désactivez-le si vous n'utilisez pas HTTPS pour la connexion API"
|
||||
objectStorageUseProxy: "Se connecter via proxy"
|
||||
objectStorageUseProxyDesc: "Désactivez-le si vous n'utilisez pas Proxy pour la connexion de stockage d'objets"
|
||||
objectStorageSetPublicRead: "Régler sur « public » lors de l'envoi"
|
||||
serverLogs: "Journaux serveur"
|
||||
deleteAll: "Supprimer tout"
|
||||
showFixedPostForm: "Afficher le formulaire en haut du fil d'actualité"
|
||||
@ -476,8 +496,10 @@ newNoteRecived: "Vous avez une nouvelle note"
|
||||
sounds: "Sons"
|
||||
listen: "Écouter"
|
||||
none: "Rien"
|
||||
showInPage: "Afficher dans la page"
|
||||
popout: "Fenêtre contextuelle"
|
||||
volume: "Volume"
|
||||
masterVolume: "Volume"
|
||||
details: "Détails"
|
||||
chooseEmoji: "Choisissez un émoji"
|
||||
unableToProcess: "L’opération n’a pas pu être complétée."
|
||||
@ -503,7 +525,7 @@ deleteAllFilesConfirm: "Êtes vous surs de vouloir supprimer tous les fichiers ?
|
||||
removeAllFollowing: "Retenir tous les abonnements"
|
||||
removeAllFollowingDescription: "Se désabonner de tous les comptes de {host}. Veuillez lancer cette action uniquement si l’instance n’existe plus."
|
||||
userSuspended: "Cette utilisateur·trice a été suspendue."
|
||||
userSilenced: "Cette utilisateur·trice a été masquer."
|
||||
userSilenced: "Cette utilisateur·trice a été mis·e en sourdine."
|
||||
sidebar: "Barre latérale"
|
||||
divider: "Séparateur"
|
||||
addItem: "Ajouter élément"
|
||||
@ -528,12 +550,15 @@ author: "Auteur·rice"
|
||||
leaveConfirm: "Vous avez des modifications non-sauvegardées. Voulez-vous les ignorer ?"
|
||||
manage: "Gestion"
|
||||
plugins: "Extensions"
|
||||
pluginInstallWarn: "N’installez que des extensions provenant de sources de confiance."
|
||||
deck: "Deck"
|
||||
undeck: "Quitter le deck"
|
||||
useBlurEffectForModal: "Utiliser un effet de flou pour les modals"
|
||||
useFullReactionPicker: "Utiliser l'intégralité du panneau de réactions"
|
||||
width: "Largeur"
|
||||
height: "Hauteur"
|
||||
large: "Grand"
|
||||
medium: "Moyen"
|
||||
small: "Petit"
|
||||
generateAccessToken: "Générer un jeton d'accès"
|
||||
permission: "Autorisations "
|
||||
enableAll: "Tout activer"
|
||||
@ -546,6 +571,8 @@ useStarForReactionFallback: "Utiliser ★ comme alternative si l’émoji de ré
|
||||
emailConfig: "Configuration du serveur email"
|
||||
enableEmail: "Activer la distribution de courriel"
|
||||
emailConfigInfo: "Utilisé pour confirmer votre adresse de courriel et la réinitialisation de votre mot de passe en cas d’oubli."
|
||||
email: "E-mail "
|
||||
emailAddress: "Adresses e-mail"
|
||||
smtpConfig: "Paramètres du serveur SMTP"
|
||||
smtpHost: "Hôte"
|
||||
smtpPort: "Port"
|
||||
@ -570,30 +597,221 @@ create: "Créer"
|
||||
notificationSetting: "Paramètres des notifications "
|
||||
notificationSettingDesc: "Sélectionnez le type de notification à afficher"
|
||||
useGlobalSetting: "Utiliser paramètre général"
|
||||
useGlobalSettingDesc: "S'il est activé, les paramètres de notification de votre compte seront utilisés. S'il est désactivé, des configurations individuelles peuvent être effectuées."
|
||||
other: "Autre"
|
||||
regenerateLoginToken: "Régénérer le jeton de connexion"
|
||||
regenerateLoginTokenDescription: "Générer un nouveau jeton d'authentification. Cette opération ne devrait pas être nécessaire ; lors de la génération d'un nouveau jeton, tous les appareils seront déconnectés. "
|
||||
setMultipleBySeparatingWithSpace: "Vous pouvez définir plus d’un, séparés par des espaces."
|
||||
fileIdOrUrl: "ID du fichier ou URL"
|
||||
chatOpenBehavior: "Comportement de la fenêtre de discussion lors de son ouverture"
|
||||
behavior: "Comportement"
|
||||
abuseReports: "Signalements"
|
||||
reportAbuse: "Signalements"
|
||||
reportAbuseOf: "Signaler {name}"
|
||||
fillAbuseReportDescription: "Veuillez expliquer les raisons du signalement. S'il s'agit d'une note précise, veuillez en donner le lien."
|
||||
abuseReported: "Le rapport est envoyé. Merci."
|
||||
send: "Envoyer"
|
||||
abuseMarkAsResolved: "Marquer le signalement comme résolu"
|
||||
openInNewTab: "Ouvrir dans un nouvel onglet"
|
||||
openInSideView: "Ouvrir en vue latérale"
|
||||
defaultNavigationBehaviour: "Navigation par défaut"
|
||||
editTheseSettingsMayBreakAccount: "La modification de ces paramètres peut endommager votre compte."
|
||||
waitingFor: "En attente de {x}"
|
||||
random: "Aléatoire"
|
||||
system: "Système"
|
||||
switchUi: "Modifier l'interface utilisateur"
|
||||
desktop: "Bureau"
|
||||
clip: "Clip"
|
||||
optional: "Facultatif"
|
||||
createNewClip: "Créer un nouveau clip"
|
||||
public: "Public"
|
||||
i18nInfo: "Misskey est traduit dans différentes langues par des bénévoles. Vous pouvez contribuer à {link}."
|
||||
manageAccessTokens: "Gérer les jetons d'accès"
|
||||
accountInfo: " Informations du compte "
|
||||
notesCount: "Nombre de notes"
|
||||
repliesCount: "Nombre de réponses envoyées"
|
||||
renotesCount: "Nombre de notes repartagées"
|
||||
repliedCount: "Nombre de réponses reçues"
|
||||
renotedCount: "Nombre de Renotes"
|
||||
followingCount: "Nombre de comptes suivis"
|
||||
followersCount: "Nombre d'abonnés"
|
||||
sentReactionsCount: "Nombre de réactions envoyées"
|
||||
receivedReactionsCount: "Nombre de réactions reçues"
|
||||
pollVotesCount: "Nombre de votes envoyés"
|
||||
pollVotedCount: "Nombre de votes reçus"
|
||||
yes: "Oui"
|
||||
no: "Non"
|
||||
driveFilesCount: "Nombre de fichiers dans le Drive"
|
||||
driveUsage: "Utilisation du Drive"
|
||||
noCrawle: "Refuser l'indexation par les robots"
|
||||
noCrawleDescription: "Demandez aux moteurs de recherche de ne pas indexer votre page de profil, vos notes, vos pages, etc."
|
||||
lockedAccountInfo: "À moins que vous ne définissiez la visibilité de votre note sur \"Abonné-e-s\", vos notes sont visibles par tous, même si vous exigez que les followers soient approuvés manuellement."
|
||||
alwaysMarkSensitive: "Marquer les médias comme contenu sensible par défaut"
|
||||
loadRawImages: "Affichage complet des images jointes au lieu des vignettes"
|
||||
disableShowingAnimatedImages: "Désactiver l'animation des images"
|
||||
verificationEmailSent: "Un e-mail de vérification a été envoyé. Veuillez accéder au lien pour compléter la vérification."
|
||||
notSet: "Non défini"
|
||||
emailVerified: "Votre adresse e-mail a été vérifiée."
|
||||
noteFavoritesCount: "Nombre de notes dans les favoris"
|
||||
pageLikesCount: "Nombre de pages aimées"
|
||||
pageLikedCount: "Nombre de vos pages aimées"
|
||||
reversiCount: "Nombre de parties de Reversi"
|
||||
contact: "Contact"
|
||||
useSystemFont: "Utiliser la police par défaut du système"
|
||||
clips: "Clip"
|
||||
experimentalFeatures: "Fonctionnalités expérimentales"
|
||||
developer: "Développeur"
|
||||
makeExplorable: "Rendre le compte visible sur la page \"Découvrir\"."
|
||||
makeExplorableDescription: "Si vous désactivez cette option, votre compte n'apparaîtra pas sur la page \"Découvrir\"."
|
||||
showGapBetweenNotesInTimeline: "Afficher un écart entre les notes sur la Timeline"
|
||||
left: "Gauche"
|
||||
center: "Centrer"
|
||||
wide: "Large"
|
||||
narrow: "Condensé"
|
||||
reloadToApplySetting: "Vos paramètres seront appliqués lorsque vous rechargerez la page. Souhaitez-vous recharger ?"
|
||||
showTitlebar: "Afficher la barre de titre"
|
||||
clearCache: "Vider le cache"
|
||||
onlineUsersCount: "{n} utilisateur(s) en ligne"
|
||||
nUsers: "{n} utilisateur·rice·s"
|
||||
nNotes: "{n} Notes"
|
||||
sendErrorReports: "Envoyer les rapports d’erreur"
|
||||
sendErrorReportsDescription: "Lorsqu'il est activé, des informations détaillées sur les erreurs sont partagées avec Misskey lorsqu'un problème survient, ce qui contribue à améliorer la qualité de Misskey."
|
||||
myTheme: "Mes thèmes"
|
||||
backgroundColor: "Arrière-plan"
|
||||
accentColor: "Accentuation"
|
||||
textColor: "Texte"
|
||||
saveAs: "Enregistrer sous ..."
|
||||
advanced: "Avancé"
|
||||
value: "Valeur"
|
||||
updatedAt: "Mis à jour le"
|
||||
saveConfirm: "Voulez-vous sauvegarder les modifications?"
|
||||
deleteConfirm: "Confirmez-vous la suppression?"
|
||||
invalidValue: "Cette valeur est invalide."
|
||||
registry: "Registre"
|
||||
closeAccount: "Fermer le compte"
|
||||
currentVersion: "Version actuelle"
|
||||
latestVersion: "Dernière version "
|
||||
youAreRunningUpToDateClient: "Votre client est à jour."
|
||||
newVersionOfClientAvailable: "Une nouvelle version de votre client est disponible."
|
||||
usageAmount: "Utilisation"
|
||||
capacity: "Capacité "
|
||||
inUse: "utilisé"
|
||||
editCode: "Modifier le code"
|
||||
apply: "Appliquer"
|
||||
receiveAnnouncementFromInstance: "Recevoir les messages d'information de l'instance"
|
||||
emailNotification: "Notifications par mail"
|
||||
inChannelSearch: "Chercher dans le canal"
|
||||
useReactionPickerForContextMenu: "Clic-droit pour ouvrir le panneau de réactions"
|
||||
typingUsers: "{users} est en train d'écrire"
|
||||
jumpToSpecifiedDate: "Se rendre à la date"
|
||||
showingPastTimeline: "Un fil ancien est affiché"
|
||||
clear: "Effacer"
|
||||
_email:
|
||||
_follow:
|
||||
title: "Vous suit"
|
||||
_receiveFollowRequest:
|
||||
title: "Vous avez reçu une demande de suivi"
|
||||
_plugin:
|
||||
install: "Installation de plugin"
|
||||
installWarn: "N’installez que des extensions provenant de sources de confiance."
|
||||
manage: "Gestion des plugins"
|
||||
_registry:
|
||||
key: "Clé "
|
||||
keys: "Clé "
|
||||
domain: "Domaine"
|
||||
createKey: "Créer une clé"
|
||||
_aboutMisskey:
|
||||
about: "Misskey est un logiciel libre et ouvert, développé par syuilo depuis 2014."
|
||||
contributors: "Principaux contributeurs"
|
||||
allContributors: "Tous les contributeurs"
|
||||
source: "Code source"
|
||||
translation: "Traduire Misskey"
|
||||
donate: "Soutenir Misskey"
|
||||
morePatrons: "Nous apprécions vraiment le soutien de nombreuses autres personnes non mentionnées ici. Merci à toutes et à tous ! 🥰"
|
||||
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"
|
||||
_mfm:
|
||||
cheatSheet: "Antisèche MFM"
|
||||
intro: "MFM est un langage Markdown spécifique utilisable ici et là dans Misskey. Vous pouvez vérifier ici les structures utilisables avec MFM."
|
||||
dummy: "La Fédiverse s'agrandit avec Misskey"
|
||||
mention: "Mentionner"
|
||||
mentionDescription: "Vous pouvez afficher un utilisateur spécifique en indiquant une arobase suivie d'un nom d'utilisateur"
|
||||
hashtag: "Hashtags"
|
||||
hashtagDescription: "Vous pouvez afficher un mot-dièse en utilisant un croisillon et du texte"
|
||||
url: "URL"
|
||||
urlDescription: "L'adresse web peut être affichée."
|
||||
link: "Lien"
|
||||
linkDescription: "Une partie précise d'une phrase peut être liée à l'adresse web."
|
||||
bold: "Gras"
|
||||
boldDescription: "Il est possible de mettre le texte en exergue en le mettant en gras."
|
||||
small: "Diminuer l'emphase"
|
||||
smallDescription: "Le contenu peut être affiché en petit et fin."
|
||||
center: "Centrée"
|
||||
centerDescription: "Le contenu peut être centré"
|
||||
inlineCode: "Code (inline)"
|
||||
blockCode: "Bloc de code"
|
||||
quote: "Citer"
|
||||
quoteDescription: "Affiche le contenu sous forme de citation."
|
||||
emoji: "Émojis personnalisés"
|
||||
search: "Rechercher"
|
||||
flip: "Inverser"
|
||||
x2: "Grand"
|
||||
x2Description: "Afficher le contenu en grand."
|
||||
x3: "Très grand"
|
||||
x3Description: "Afficher le contenu en très grand."
|
||||
x4: "Plus grand"
|
||||
x4Description: "Afficher le contenu en plus grand."
|
||||
blur: "Flou"
|
||||
blurDescription: "Le contenu peut être flouté ; il sera visible en le survolant avec le curseur."
|
||||
font: "Police de caractères"
|
||||
fontDescription: "Il est possible de choisir la police."
|
||||
_reversi:
|
||||
reversi: "Reversi"
|
||||
gameSettings: "Réglages de la partie"
|
||||
chooseBoard: "Choix du plateau"
|
||||
blackOrWhite: "Pions blancs/Pions noirs"
|
||||
blackIs: "{name} joue les pions noirs"
|
||||
rules: "Règles"
|
||||
botSettings: "Options du bot"
|
||||
thisGameIsStartedSoon: "La partie commencera dans quelques secondes"
|
||||
waitingForOther: "En attente que l'adversaire soit prêt"
|
||||
waitingForMe: "En attente que vous soyez prêt"
|
||||
waitingBoth: "Préparez-vous"
|
||||
ready: "Prêt"
|
||||
cancelReady: "Recommencer la préparation"
|
||||
opponentTurn: "Tour de l’adversaire"
|
||||
myTurn: "C’est votre tour"
|
||||
turnOf: "Tour de {name}"
|
||||
pastTurnOf: "Tour de {name}"
|
||||
surrender: "Abandonner"
|
||||
surrendered: "Par abandon"
|
||||
drawn: "Match nul"
|
||||
won: "{name} a gagné"
|
||||
black: "Noirs"
|
||||
white: "Blancs"
|
||||
total: "Total"
|
||||
turnCount: "Tour {count}"
|
||||
myGames: "Mes parties"
|
||||
allGames: "Toutes les parties"
|
||||
ended: "Fin de partie"
|
||||
playing: "En cours"
|
||||
isLlotheo: "Celui ou celle qui a le moins de pièces gagne (Llotheo)"
|
||||
canPutEverywhere: "Les pions peuvent être placés partout "
|
||||
_instanceTicker:
|
||||
none: "Cacher "
|
||||
_serverDisconnectedBehavior:
|
||||
reload: "Rechargement automatique"
|
||||
quiet: "Afficher un avertissement discret"
|
||||
_channel:
|
||||
create: "Créer un canal"
|
||||
edit: "Éditer le canal"
|
||||
setBanner: "Sélectionner la bannière"
|
||||
removeBanner: "Supprimer la bannière"
|
||||
featured: "Tendances"
|
||||
following: "Abonné·e"
|
||||
usersCount: "{n} Participants"
|
||||
notesCount: "{n} Notes"
|
||||
_sidebar:
|
||||
@ -601,15 +819,17 @@ _sidebar:
|
||||
icon: "Avatar"
|
||||
hide: "Masquer"
|
||||
_wordMute:
|
||||
muteWords: "Mot à mettre en sourdine"
|
||||
muteWords: "Mots à filtrer"
|
||||
muteWordsDescription: "Séparer avec des espaces pour la condition AND. Séparer avec un saut de ligne pour une condition OR."
|
||||
mutedNotes: "Notes mises en sourdine"
|
||||
mutedNotes: "Notes filtrées"
|
||||
_theme:
|
||||
explore: "Explorer les thèmes"
|
||||
install: "Installer un thème"
|
||||
manage: "Gestion des thèmes"
|
||||
code: "Code du thème"
|
||||
installed: "{name} a été installé"
|
||||
installedThemes: "Thèmes installés"
|
||||
builtinThemes: "Thèmes intégrés"
|
||||
alreadyInstalled: "Ce thème est déjà installé"
|
||||
invalid: "Le format du thème n'est pas valide"
|
||||
make: "Créer un thème"
|
||||
@ -634,16 +854,25 @@ _theme:
|
||||
header: "Entête"
|
||||
navBg: "Fond de la barre latérale"
|
||||
navFg: "Texte de la barre latérale"
|
||||
navHoverFg: "Texte de la barre latérale (survolé)"
|
||||
navActive: "Texte de la barre latérale (actif)"
|
||||
navIndicator: "Indicateur de barre latérale"
|
||||
link: "Lien"
|
||||
hashtag: "Hashtags"
|
||||
mention: "Mentionner"
|
||||
mentionMe: "Mentions (Moi)"
|
||||
renote: "Renote"
|
||||
renote: "Partager"
|
||||
divider: "Séparateur"
|
||||
scrollbarHandle: "Poignée de la barre de navigation"
|
||||
scrollbarHandleHover: "Poignée de la barre de navigation (survolée)"
|
||||
infoWarnFg: "Texte d’avertissement"
|
||||
cwBg: "Arrière-plan du CW"
|
||||
buttonBg: "Arrière-plan du bouton"
|
||||
buttonHoverBg: "Arrière-plan du bouton (survolé)"
|
||||
inputBorder: "Cadre de la zone de texte"
|
||||
badge: "Badge"
|
||||
messageBg: "Arrière plan de la discussion"
|
||||
fgHighlighted: "Texte mis en évidence"
|
||||
_sfx:
|
||||
note: "Nouvelle note"
|
||||
noteMy: "Ma note"
|
||||
@ -712,8 +941,8 @@ _permissions:
|
||||
"write:following": "Abonnements/Se désabonner"
|
||||
"read:messaging": "Cherche à discuter"
|
||||
"write:messaging": "Contrôler le discuter"
|
||||
"read:mutes": "Voir les comptes muets"
|
||||
"write:mutes": "Gérer les comptes muets"
|
||||
"read:mutes": "Voir les comptes masqués"
|
||||
"write:mutes": "Gérer les comptes masqués"
|
||||
"write:notes": "Créer / supprimer des notes"
|
||||
"read:notifications": "Afficher les notifications"
|
||||
"write:notifications": "Gérer vos notifications"
|
||||
@ -762,6 +991,12 @@ _widgets:
|
||||
digitalClock: "Horloge numérique"
|
||||
federation: "Fédération"
|
||||
postForm: "Formulaire à publier"
|
||||
slideshow: "Diaporama"
|
||||
button: "Bouton"
|
||||
onlineUsers: "Utilisateurs en ligne"
|
||||
jobQueue: "File d’attente"
|
||||
serverMetric: "Statistiques du serveur"
|
||||
aiscript: "Console AiScript"
|
||||
_cw:
|
||||
hide: "Masquer"
|
||||
show: "Afficher plus …"
|
||||
@ -816,12 +1051,17 @@ _profile:
|
||||
username: "Nom d’utilisateur·rice"
|
||||
description: "À propos de moi"
|
||||
youCanIncludeHashtags: "Vous pouvez également inclure des hashtags."
|
||||
metadata: "Informations supplémentaires"
|
||||
metadataEdit: "Éditer les informations supplémentaires"
|
||||
metadataDescription: "Vous pouvez afficher jusqu'à quatre informations supplémentaires dans votre profil."
|
||||
metadataLabel: "Étiquette"
|
||||
metadataContent: "Contenu"
|
||||
changeAvatar: "Changer l'image de profil"
|
||||
changeBanner: "Changer de bannière"
|
||||
_exportOrImport:
|
||||
allNotes: "Toutes les notes"
|
||||
followingList: "Abonnements"
|
||||
muteList: "Mettre en sourdine"
|
||||
muteList: "Liste des comptes maqués"
|
||||
blockingList: "Bloquer"
|
||||
userLists: "Listes"
|
||||
_charts:
|
||||
@ -924,6 +1164,7 @@ _pages:
|
||||
created: "La page a été créée !"
|
||||
updated: "La page a été mise à jour !"
|
||||
deleted: "La page a bien été supprimée"
|
||||
pageSetting: "Paramètres de la Page"
|
||||
nameAlreadyExists: "La URL de page spécifiée existe déjà"
|
||||
invalidNameTitle: "La URL de la page spécifiée n’est pas valide"
|
||||
invalidNameText: "Assurez-vous qu’il n’est pas vide"
|
||||
@ -934,6 +1175,7 @@ _pages:
|
||||
unlike: "Je n’aime pas"
|
||||
my: "Mes pages"
|
||||
liked: "Pages favorites"
|
||||
featured: "Populaire"
|
||||
inspector: "Inspecteur"
|
||||
contents: "Contenu"
|
||||
content: "Bloc de page"
|
||||
@ -989,6 +1231,9 @@ _pages:
|
||||
id: "Toile ID"
|
||||
width: "Largeur"
|
||||
height: "Hauteur"
|
||||
_note:
|
||||
id: "Identifiant de la note"
|
||||
detailed: "Afficher les détails"
|
||||
switch: "Basculer"
|
||||
_switch:
|
||||
name: "Nom de la variable"
|
||||
@ -1221,19 +1466,28 @@ _notification:
|
||||
follow: "Abonnements"
|
||||
mention: "Mentionner"
|
||||
reply: "Réponses"
|
||||
renote: "Renote"
|
||||
renote: "Partager"
|
||||
quote: "Citer"
|
||||
reaction: "Réactions"
|
||||
receiveFollowRequest: "Demande d'abonnement reçue"
|
||||
followRequestAccepted: "Demande d'abonnement acceptée"
|
||||
groupInvited: "Invité aux groupes"
|
||||
app: "Notifications provenant des apps"
|
||||
_deck:
|
||||
alwaysShowMainColumn: "Toujours afficher la colonne principale"
|
||||
columnAlign: "Aligner les colonnes"
|
||||
columnMargin: "Marge entre les colonnes"
|
||||
columnHeaderHeight: "Taille de l'en-tête de colonne"
|
||||
addColumn: "Ajouter une colonne"
|
||||
swapLeft: "Déplacer à gauche"
|
||||
swapRight: "Déplacer à droite"
|
||||
swapUp: "Déplacer vers le haut"
|
||||
swapDown: "Déplacer vers le bas"
|
||||
stackLeft: "Empiler à gauche"
|
||||
popRight: "Vers la droite"
|
||||
profile: "Profil"
|
||||
_columns:
|
||||
main: "Principale"
|
||||
widgets: "Widgets"
|
||||
notifications: "Notifications"
|
||||
tl: "Fil"
|
||||
|
1
locales/ht-HT.yml
Normal file
@ -0,0 +1 @@
|
||||
---
|
257
locales/id-ID.yml
Normal file
@ -0,0 +1,257 @@
|
||||
---
|
||||
_lang_: "Bahasa Jepang"
|
||||
headlineMisskey: "Catatan terhubung jaringan"
|
||||
introMisskey: "Selamat datang! Misskey adalah perangkat mikroblog tercatu bersifat sumber terbuka.\nMulailah menuliskan catatan, bagikan peristiwa terkini, serta ceritakan segala tentangmu.📡\nTunjukkan juga reaksimu pada catatan pengguna lain.👍\nMari jelajahi dunia baru🚀"
|
||||
monthAndDay: "{day} {month}"
|
||||
search: "Pencarian"
|
||||
notifications: "Notifikasi"
|
||||
username: "Nama Pengguna"
|
||||
password: "Kata sandi"
|
||||
ok: "OK"
|
||||
gotIt: "Saya mengerti"
|
||||
cancel: "Batalkan"
|
||||
enterUsername: "Masukkan nama pengguna"
|
||||
renotedBy: "direnote oleh {user}"
|
||||
noNotes: "Tidak ada notes"
|
||||
noNotifications: "Tidak ada notifikasi"
|
||||
settings: "Pengaturan"
|
||||
basicSettings: "Pengaturan umum"
|
||||
otherSettings: "Pengaturan lainnya"
|
||||
openInWindow: "Buka di jendela"
|
||||
profile: "Profil"
|
||||
timeline: "Linimasa"
|
||||
noAccountDescription: "Pengguna ini belum menulis bio"
|
||||
login: "Masuk"
|
||||
loggingIn: "Sedang masuk"
|
||||
logout: "Keluar"
|
||||
signup: "Daftar"
|
||||
uploading: "Sedang mengunggah"
|
||||
save: "Simpan"
|
||||
users: "Pengguna"
|
||||
addUser: "Tambah pengguna"
|
||||
favorite: "Favorit"
|
||||
favorites: "Favorit"
|
||||
unfavorite: "Hapus favorit"
|
||||
favorited: "Ditambahkan ke favorit"
|
||||
alreadyFavorited: "Telah ditambahkan ke favorit"
|
||||
cantFavorite: "Tidak dapat menambahkan ke favorit"
|
||||
pin: "Sematkan ke profil"
|
||||
unpin: "Lepas sematan dari profil"
|
||||
copyContent: "Salin konten"
|
||||
copyLink: "Salin tautan"
|
||||
delete: "Hapus"
|
||||
deleteAndEdit: "Hapus dan sunting"
|
||||
addToList: "Tambahkan ke daftar"
|
||||
sendMessage: "Kirim pesan"
|
||||
copyUsername: "Salin nama pengguna"
|
||||
searchUser: "Cari pengguna"
|
||||
reply: "Balas"
|
||||
loadMore: "Selebihnya"
|
||||
showMore: "Selebihnya"
|
||||
youGotNewFollower: "Sedang mengikuti"
|
||||
receiveFollowRequest: "Permintaan mengikuti terkirim"
|
||||
mention: "Panggilan"
|
||||
files: "Berkas"
|
||||
download: "Unduh"
|
||||
driveFileDeleteConfirm: "Hapus {name}? Catatan dengan berkas terkait juga akan terhapus."
|
||||
unfollowConfirm: "Berhenti mengikuti {name}?"
|
||||
following: "Ikuti"
|
||||
followers: "Pengikut"
|
||||
followsYou: "Mengikuti Anda"
|
||||
error: "Galat"
|
||||
somethingHappened: "Terjadi kesalahan"
|
||||
retry: "Coba lagi"
|
||||
pageLoadError: "Gagal memuat halaman."
|
||||
pageLoadErrorDescription: "Umumnya disebabkan jaringan atau tembolok perambah. Cobalah bersihkan tembolok peramban lalu tunggu sesaat sebelum mencoba kembali."
|
||||
privacy: "Keleluasaan"
|
||||
follow: "Ikuti"
|
||||
unfollow: "Berhenti mengikuti"
|
||||
cantReRenote: "Renote tidak dapat direnote"
|
||||
quote: "Kutip"
|
||||
pinnedNote: "Note yang disematkan"
|
||||
pinned: "Sematkan ke profil"
|
||||
you: "Anda"
|
||||
clickToShow: "Klik untuk melihat"
|
||||
sensitive: "Konten sensitif"
|
||||
add: "Tambahkan"
|
||||
reaction: "Reaksi"
|
||||
reactionSettingDescription: "Masukkan reaksi favorit yang ingin anda sematkan pada bilah reaksi"
|
||||
reactionSettingDescription2: "Geser untuk memindah urutkan, klik untuk menghapus, tekan \"+\" untuk menambahkan"
|
||||
rememberNoteVisibility: "Ingat pengaturan visibilitas note"
|
||||
attachCancel: "Hapus lampiran"
|
||||
markAsSensitive: "Tandai sebagai konten sensitif"
|
||||
unmarkAsSensitive: "Hapus tanda konten sensitif"
|
||||
enterFileName: "Masukkan nama berkas"
|
||||
mute: "Bisukan"
|
||||
unmute: "Hapus bisukan"
|
||||
block: "Blokir"
|
||||
unblock: "Buka blokir"
|
||||
suspend: "Bekukan"
|
||||
unsuspend: "Buka pembekuan"
|
||||
blockConfirm: "Apakah anda yakin ingin memblokir akun ini?"
|
||||
unblockConfirm: "Apakah anda yakin ingin membuka blokir akun ini?"
|
||||
suspendConfirm: "Apakah anda yakin ingin membekukan akun ini?"
|
||||
unsuspendConfirm: "Apakah anda yakin ingin membuka pembekuan akun ini?"
|
||||
selectList: "Pilih daftar"
|
||||
selectAntenna: "Pilih Antena"
|
||||
selectWidget: "Pilih gawit"
|
||||
editWidgets: "Sunting gawit"
|
||||
editWidgetsExit: "Selesai"
|
||||
customEmojis: "Emoji kustom"
|
||||
emoji: "Emoji"
|
||||
emojiName: "Nama emoji"
|
||||
emojiUrl: "URL Emoji"
|
||||
addEmoji: "Tambahkan emoji"
|
||||
settingGuide: "Pengaturan rekomendasi"
|
||||
cacheRemoteFiles: "Tembolokkan berkas remote"
|
||||
flagAsBot: "Atur akun ini sebagai Bot"
|
||||
flagAsCat: "Atur akun ini sebagai kucing"
|
||||
autoAcceptFollowed: "Setujui otomatis permintaan mengikuti dari pengguna yang anda ikuti"
|
||||
addAcount: "Tambahkan akun"
|
||||
loginFailed: "Gagal untuk masuk"
|
||||
showOnRemote: "Lihat profil asli"
|
||||
general: "Umum"
|
||||
wallpaper: "Wallpaper"
|
||||
setWallpaper: "Atur wallpaper"
|
||||
removeWallpaper: "Hapus wallpaper"
|
||||
intro: "Instalasi Misskey telah selesai! Mohon untuk membuat pengguna admin."
|
||||
done: "Selesai"
|
||||
processing: "Memproses"
|
||||
preview: "Pratinjau"
|
||||
default: "Bawaan"
|
||||
noCustomEmojis: "Tidak ada emoji kustom"
|
||||
federating: "memfederasi"
|
||||
blocked: "Diblokir"
|
||||
all: "Semua"
|
||||
subscribing: "Berlangganan"
|
||||
publishing: "Sedang menyiarkan langsung"
|
||||
notResponding: "Tidak ada respon"
|
||||
instanceFollowing: "Mengikuti instance"
|
||||
instanceFollowers: "Pengikut instance"
|
||||
instanceUsers: "Pengguna pada instance ini"
|
||||
changePassword: "Ubah kata sandi"
|
||||
security: "Keamanan"
|
||||
retypedNotMatch: "Input tidak sama"
|
||||
currentPassword: "Kata sandi saat ini"
|
||||
newPassword: "Kata sandi baru"
|
||||
newPasswordRetype: "Ulangi kata sandi baru"
|
||||
attachFile: "Lampirkan berkas"
|
||||
more: "Lagi !"
|
||||
featured: "Sorotan"
|
||||
usernameOrUserId: "Nama pengguna atau User ID"
|
||||
noSuchUser: "Pengguna tidak ditemukan"
|
||||
lookup: "Mencari"
|
||||
announcements: "Pengumuman"
|
||||
imageUrl: "URL Gambar"
|
||||
remove: "Hapus"
|
||||
removed: "Telah dihapus"
|
||||
removeAreYouSure: "Apakah anda yakin ingin menghapus \"{x}\"?"
|
||||
deleteAreYouSure: "Apakah anda yakin ingin menghapus \"{x}\"?"
|
||||
saved: "Telah disimpan"
|
||||
messaging: "Pesan"
|
||||
upload: "Unggah"
|
||||
fromDrive: "Dari Drive"
|
||||
fromUrl: "Dari URL"
|
||||
uploadFromUrl: "Unggah dari URL"
|
||||
uploadFromUrlDescription: "URL berkas yang ingin anda unggah"
|
||||
uploadFromUrlRequested: "Pengunggahan telah diminta"
|
||||
uploadFromUrlMayTakeTime: "Membutuhkan beberapa waktu hingga pengunggahan selesai"
|
||||
explore: "Jelajahi"
|
||||
games: "Permainan Misskey"
|
||||
messageRead: "Telah dibaca"
|
||||
noMoreHistory: "Tidak ada sejarah lagi"
|
||||
startMessaging: "Mulai mengirim pesan"
|
||||
nUsersRead: "Dibaca oleh {n}"
|
||||
nsfw: "Konten sensitif"
|
||||
watch: "Tonton"
|
||||
unwatch: "Batal tonton"
|
||||
accept: "Terima"
|
||||
reject: "Tolak"
|
||||
normal: "Normal"
|
||||
instanceName: "Nama instance"
|
||||
instanceDescription: "Tentang instance"
|
||||
maintainerName: "Pengelola"
|
||||
maintainerEmail: "Surel pengelola"
|
||||
tosUrl: "URL Syarat dan Ketentuan"
|
||||
thisYear: "Tahun ini"
|
||||
thisMonth: "Bulan ini"
|
||||
today: "Hari ini"
|
||||
dayX: "{day}"
|
||||
monthX: "{month}"
|
||||
yearX: "{year}"
|
||||
pages: "Halaman"
|
||||
integration: "Integrasi"
|
||||
connectSerice: "Sambungkan"
|
||||
disconnectSerice: "Putuskan"
|
||||
enableLocalTimeline: "Nyalakan linimasa lokal"
|
||||
enableGlobalTimeline: "Nyalakan linimasa global"
|
||||
registration: "Pendaftaran"
|
||||
enableRegistration: "Nyalakan pendaftaran pengguna baru"
|
||||
invite: "Undang"
|
||||
proxyRemoteFiles: "Proksi berkas remote"
|
||||
driveCapacityPerLocalAccount: "Kapasitas drive per pengguna lokal"
|
||||
driveCapacityPerRemoteAccount: "Kapasitas drive per pengguna remote"
|
||||
inMb: "dalam Megabytes"
|
||||
iconUrl: "URL Gambar ikon"
|
||||
bannerUrl: "URL Banner"
|
||||
basicInfo: "Informasi Umum"
|
||||
pinnedUsers: "Pengguna yang disematkan"
|
||||
pinnedPages: "Halaman yang disematkan"
|
||||
pinnedNotes: "Note yang disematkan"
|
||||
hcaptcha: "hCaptcha"
|
||||
enableHcaptcha: "Nyalakan hCaptcha"
|
||||
hcaptchaSiteKey: "Site Key"
|
||||
hcaptchaSecretKey: "Secret Key"
|
||||
recaptcha: "reCAPTCHA"
|
||||
enableRecaptcha: "Nyalakan reCAPTCHA"
|
||||
recaptchaSiteKey: "Site key"
|
||||
recaptchaSecretKey: "Secret Key"
|
||||
antennas: "Antena"
|
||||
manageAntennas: "Pengelola Antena"
|
||||
notFound: "Tidak dapat ditemukan"
|
||||
invites: "Undang"
|
||||
invitations: "Undang"
|
||||
smtpUser: "Nama Pengguna"
|
||||
smtpPass: "Kata sandi"
|
||||
_email:
|
||||
_follow:
|
||||
title: "Sedang mengikuti"
|
||||
_mfm:
|
||||
mention: "Panggilan"
|
||||
quote: "Kutip"
|
||||
emoji: "Emoji kustom"
|
||||
search: "Pencarian"
|
||||
_theme:
|
||||
keys:
|
||||
mention: "Panggilan"
|
||||
_sfx:
|
||||
notification: "Notifikasi"
|
||||
chat: "Pesan"
|
||||
_widgets:
|
||||
notifications: "Notifikasi"
|
||||
timeline: "Linimasa"
|
||||
_cw:
|
||||
show: "Selebihnya"
|
||||
_visibility:
|
||||
followers: "Pengikut"
|
||||
_profile:
|
||||
username: "Nama Pengguna"
|
||||
_exportOrImport:
|
||||
followingList: "Ikuti"
|
||||
muteList: "Bisukan"
|
||||
blockingList: "Blokir"
|
||||
_rooms:
|
||||
_roomType:
|
||||
default: "Bawaan"
|
||||
_notification:
|
||||
youWereFollowed: "Sedang mengikuti"
|
||||
_types:
|
||||
follow: "Ikuti"
|
||||
mention: "Panggilan"
|
||||
quote: "Kutip"
|
||||
reaction: "Reaksi"
|
||||
_deck:
|
||||
_columns:
|
||||
notifications: "Notifikasi"
|
||||
tl: "Linimasa"
|
||||
antenna: "Antena"
|
@ -43,7 +43,7 @@ const primaries = {
|
||||
'zh': 'CN',
|
||||
};
|
||||
|
||||
const locales = languages.reduce((a, c) => (a[c] = yaml.safeLoad(fs.readFileSync(`${__dirname}/${c}.yml`, 'utf-8')) || {}, a), {});
|
||||
const locales = languages.reduce((a, c) => (a[c] = yaml.load(fs.readFileSync(`${__dirname}/${c}.yml`, 'utf-8')) || {}, a), {});
|
||||
|
||||
module.exports = Object.entries(locales)
|
||||
.reduce((a, [k ,v]) => (a[k] = (() => {
|
||||
|
577
locales/it-IT.yml
Normal file
@ -0,0 +1,577 @@
|
||||
---
|
||||
_lang_: "Italiano"
|
||||
monthAndDay: "{day}/{month}"
|
||||
search: "Cerca"
|
||||
notifications: "Notifiche"
|
||||
username: "Nome utente"
|
||||
password: "Password"
|
||||
ok: "OK"
|
||||
cancel: "Annulla"
|
||||
enterUsername: "Inserisci un nome utente"
|
||||
renotedBy: "Rinotta da {user}"
|
||||
noNotes: "Nessuna note"
|
||||
noNotifications: "Nessuna notifica"
|
||||
instance: "Istanza"
|
||||
settings: "Impostazioni"
|
||||
basicSettings: "Impostazioni generali"
|
||||
otherSettings: "Altre impostazioni"
|
||||
profile: "Profilo"
|
||||
timeline: "Timeline"
|
||||
login: "Accedi"
|
||||
logout: "Logout"
|
||||
signup: "Iscriviti"
|
||||
uploading: "Caricamento..."
|
||||
save: "Salva"
|
||||
users: "Utente"
|
||||
favorite: "Segnalibri"
|
||||
favorites: "Segnalibri"
|
||||
unfavorite: "Rimuovi Nota dai segnalibri"
|
||||
favorited: "Nota salvato nei segnalibri."
|
||||
alreadyFavorited: "Tweet salvato nei segnalibri."
|
||||
pin: "Fissa sul profilo"
|
||||
unpin: "Non fissare più sul profilo"
|
||||
copyContent: "Copia il contenuto del Nota"
|
||||
copyLink: "Copia link"
|
||||
delete: "Elimina"
|
||||
deleteAndEdit: "Elimina & Modifica"
|
||||
addToList: "Aggiungi alla lista"
|
||||
sendMessage: "Invia messaggio"
|
||||
copyUsername: "Copia nome utente"
|
||||
searchUser: "Cerca Utente"
|
||||
reply: "Rispondi"
|
||||
loadMore: "Mostra altre"
|
||||
showMore: "Mostra altre"
|
||||
youGotNewFollower: "Nuovo seguace"
|
||||
receiveFollowRequest: "Nuova richiesta di essere seguito"
|
||||
mention: "Menzioni"
|
||||
mentions: "Menzioni"
|
||||
directNotes: "Note diretti"
|
||||
importAndExport: "Importa ed Esporta"
|
||||
import: "Importa"
|
||||
export: "Esporta"
|
||||
files: "Allegato"
|
||||
download: "Scarica"
|
||||
lists: "Liste"
|
||||
noLists: "Qui non c'è ancora niente"
|
||||
note: "Nota"
|
||||
notes: "Nota"
|
||||
following: "Seiguiti"
|
||||
followers: "Seguaci"
|
||||
followsYou: "Ti segue"
|
||||
createList: "Crea una nuova lista"
|
||||
manageLists: "Modifica lista"
|
||||
error: "Errore"
|
||||
somethingHappened: "Qualcosa è andato storto."
|
||||
retry: "Riprova"
|
||||
enterListName: "Inserisci il nome della lista"
|
||||
privacy: "Privacy"
|
||||
follow: "Segui"
|
||||
followRequest: "Richiesta di seguire"
|
||||
followRequests: "Richiesta di seguire"
|
||||
unfollow: "Smetti di seguire"
|
||||
followRequestPending: "In sospeso"
|
||||
renote: "Rinotta"
|
||||
unrenote: "Annulla rinotta"
|
||||
quote: "Cita Nota"
|
||||
pinned: "Fissa sul profilo"
|
||||
you: "Tu"
|
||||
clickToShow: "Clicca per visualizzare"
|
||||
sensitive: "Contenuto sensibile"
|
||||
add: "Aggiungi"
|
||||
reaction: "Reazione"
|
||||
attachCancel: "Rimuovi allegato"
|
||||
markAsSensitive: "Segna come sensibile"
|
||||
unmarkAsSensitive: "Segna come non sensibile"
|
||||
mute: "Silenzia"
|
||||
unmute: "Riattiva"
|
||||
block: "Blocca"
|
||||
unblock: "Sblocca"
|
||||
suspend: "Sospendi"
|
||||
unsuspend: "Annulla la sospensione dell'account"
|
||||
blockConfirm: "Vuoi bloccare?"
|
||||
unblockConfirm: "Vuoi sbloccare?"
|
||||
editWidgetsExit: "Modifica fine"
|
||||
emoji: "Emoji"
|
||||
addAcount: "Aggiungi un account esistente"
|
||||
general: "Generali"
|
||||
wallpaper: "Sfondo"
|
||||
setWallpaper: "Imposta sfondo"
|
||||
searchWith: "Cerca: {q}"
|
||||
annotation: "Descrizione"
|
||||
federation: "Federazione"
|
||||
instances: "Istanza"
|
||||
storageUsage: "Volume di dischi"
|
||||
charts: "Grafici"
|
||||
perHour: "All'ora"
|
||||
perDay: "al giorno"
|
||||
software: "Software"
|
||||
version: "Versione"
|
||||
metadata: "Metadato"
|
||||
network: "Rete"
|
||||
disk: "Disco"
|
||||
statistics: "Statistiche"
|
||||
blockedInstances: "Istanza bloccati"
|
||||
muteAndBlock: "Silenziamento e blocco"
|
||||
mutedUsers: "Account silenziati"
|
||||
blockedUsers: "Account bloccati"
|
||||
editProfile: "Modifica profilo"
|
||||
noteDeleteConfirm: "Eliminare questo Nota?"
|
||||
done: "Fine"
|
||||
processing: "In elaborazione"
|
||||
blocked: "Bloccati"
|
||||
all: "Tutti"
|
||||
notResponding: "Nessuna risposta"
|
||||
changePassword: "Aggiorna Password"
|
||||
security: "Sicurezza"
|
||||
retypedNotMatch: "Le password non corrispondono."
|
||||
currentPassword: "Password attuale"
|
||||
newPassword: "Nuova Password"
|
||||
newPasswordRetype: "Conferma nuova password"
|
||||
more: "Altri!"
|
||||
lookup: "Cercare"
|
||||
announcements: "Annuncio"
|
||||
imageUrl: "URL dell'immagine"
|
||||
remove: "Elimina"
|
||||
removed: "Il tuo Tweet è stato eliminato"
|
||||
removeAreYouSure: "Eliminare \"{x}\"?"
|
||||
deleteAreYouSure: "Eliminare \"{x}\"?"
|
||||
resetAreYouSure: "Reimposta"
|
||||
saved: "Salvato"
|
||||
messaging: "Messaggi"
|
||||
upload: "Carica"
|
||||
uploadFromUrl: "Incolla URL immagine"
|
||||
explore: "Esplora"
|
||||
games: "Misskey Giochi"
|
||||
messageRead: "Visualizzato"
|
||||
startMessaging: "Nuovo messaggio"
|
||||
tos: "Termini di servizio"
|
||||
home: "Home"
|
||||
images: "Immagini"
|
||||
birthday: "Compleanno"
|
||||
yearsOld: "{age}Anni"
|
||||
registeredDate: "Iscrizione a.."
|
||||
location: "Posizione"
|
||||
theme: "Tema"
|
||||
light: "Chiaro"
|
||||
dark: "Scuro"
|
||||
lightThemes: "Tema Chiaro"
|
||||
darkThemes: "Tema Scuro"
|
||||
drive: "Drive"
|
||||
fileName: "Nome dell'allegato"
|
||||
copyUrl: "Copia URL"
|
||||
rename: "Modifica nome"
|
||||
avatar: "Foto del profilo"
|
||||
banner: "Foto d'intestazione"
|
||||
nsfw: "Contenuti sensibili"
|
||||
reload: "Ricarica"
|
||||
watch: "Osserva"
|
||||
unwatch: "Smetti di Osserva"
|
||||
accept: "Accetta"
|
||||
reject: "Rifiuta"
|
||||
normal: "Normale"
|
||||
instanceName: "Nome dell'istanza"
|
||||
instanceDescription: "Descrizione dell'istanza"
|
||||
maintainerName: "Nome dell'Amministratore"
|
||||
maintainerEmail: "Indirizzo e-mail dell'Amministratore"
|
||||
tosUrl: "Termini di servizio URL"
|
||||
thisYear: "Anno"
|
||||
thisMonth: "Mese"
|
||||
today: "Oggi"
|
||||
dayX: "{day}"
|
||||
monthX: "{month}"
|
||||
yearX: "{year}"
|
||||
integration: "App collegate"
|
||||
connectSerice: "Connetti"
|
||||
disconnectSerice: "Disconnetti"
|
||||
registration: "Iscriviti"
|
||||
invite: "Invita"
|
||||
bannerUrl: "indirizzo Foto d'intestazione"
|
||||
basicInfo: "Informazioni fondamentali"
|
||||
hcaptcha: "hCaptcha"
|
||||
enableHcaptcha: "Abilita hCaptcha"
|
||||
recaptcha: "reCAPTCHA"
|
||||
enableRecaptcha: "Abilita reCAPTCHA"
|
||||
name: "Nome"
|
||||
serviceworker: "ServiceWorker"
|
||||
exploreFediverse: "Esplora Fediverse"
|
||||
popularTags: "Tag di tendenza"
|
||||
userList: "Liste"
|
||||
about: "Informazioni"
|
||||
aboutMisskey: "Informazioni di Misskey"
|
||||
administrator: "Amministratore"
|
||||
token: "Token"
|
||||
twoStepAuthentication: "Autenticazione a due fattori"
|
||||
moderator: "Moderatore"
|
||||
lastUsed: "Ultima attività"
|
||||
unregister: "Disattiva account"
|
||||
resetPassword: "Reimposta password"
|
||||
share: "Condividi"
|
||||
cacheClear: "Svuota cache"
|
||||
help: "Guida"
|
||||
close: "Chiudi"
|
||||
group: "Gruppo"
|
||||
groups: "Gruppi"
|
||||
createGroup: "Nuovo gruppo"
|
||||
invites: "Invita"
|
||||
transfer: "Trasferisci"
|
||||
title: "Titolo"
|
||||
next: "Avanti"
|
||||
invitations: "Invita"
|
||||
invitationCode: "Codice di invito"
|
||||
available: "Consigliati"
|
||||
unavailable: "Il nome utente è già in uso"
|
||||
usernameInvalidFormat: "Il nome utente può contenere solo lettere, numeri e '_'"
|
||||
tooShort: "Troppo breve"
|
||||
tooLong: "Troppo lungo"
|
||||
passwordNotMatched: "Le password non corrispondono."
|
||||
signinHistory: "Cronologia di accesso all'account"
|
||||
tags: "Tag"
|
||||
createAccount: "Crea il tuo account"
|
||||
existingAcount: "Account esistente"
|
||||
local: "Locale"
|
||||
remote: "Remoto"
|
||||
accountSettings: "Impostazioni Account"
|
||||
promote: "Pubblicizza"
|
||||
objectStorageBucket: "Bucket"
|
||||
objectStorageEndpoint: "Endpoint"
|
||||
objectStorageRegion: "Region"
|
||||
serverLogs: "Log del server"
|
||||
deleteAll: "Cancella cronologia"
|
||||
volume: "Volume"
|
||||
details: "Dettagli"
|
||||
install: "Installa"
|
||||
uninstall: "Disinstalla"
|
||||
installedDate: "Data installazione"
|
||||
sort: "Ordina per"
|
||||
visibility: "Privacy dei post"
|
||||
poll: "Sondaggio"
|
||||
useCw: "Nascondere media"
|
||||
description: "Descrizione"
|
||||
author: "Autore"
|
||||
width: "Larghezza"
|
||||
height: "Altezza"
|
||||
large: "Grande"
|
||||
medium: "Predefinito"
|
||||
small: "Piccolo"
|
||||
edit: "Modifica"
|
||||
email: "Email"
|
||||
smtpUser: "Nome utente"
|
||||
smtpPass: "Password"
|
||||
wordMute: "Parole silenziate"
|
||||
display: "Visualizza"
|
||||
copy: "Copia"
|
||||
logs: "Log"
|
||||
database: "Base di dati"
|
||||
channel: "Canale"
|
||||
notificationSetting: "impostazioni delle notifiche"
|
||||
other: "Avanzate"
|
||||
abuseReports: "Segnala"
|
||||
reportAbuse: "Segnala"
|
||||
reportAbuseOf: "Segnala {name}"
|
||||
send: "Inviare"
|
||||
openInNewTab: "Apri in una nuova scheda"
|
||||
random: "Casuale"
|
||||
system: "Sistema"
|
||||
desktop: "Desktop"
|
||||
optional: "Opzionale"
|
||||
public: "Pubblico"
|
||||
yes: "Sì"
|
||||
no: "No"
|
||||
contact: "Contatti"
|
||||
developer: "Sviluppatore"
|
||||
duplicate: "Duplica"
|
||||
left: "Sinistra"
|
||||
center: "Centro"
|
||||
wide: "Largo"
|
||||
nNotes: "{n}Nota"
|
||||
backgroundColor: "Sfondo"
|
||||
value: "Valore"
|
||||
saveConfirm: "Vuoi salvare le modifiche?"
|
||||
deleteConfirm: "Rimuovere?"
|
||||
registry: "Registro"
|
||||
closeAccount: "Disattiva account"
|
||||
currentVersion: "Versione attuale"
|
||||
latestVersion: "Ultima versione"
|
||||
editCode: "Modifica codice"
|
||||
apply: "Applica"
|
||||
_email:
|
||||
_follow:
|
||||
title: "Nuovo seguace"
|
||||
_registry:
|
||||
key: "Dati"
|
||||
keys: "Dati"
|
||||
_aboutMisskey:
|
||||
morePatrons: "Ci sono molti altri che ci sostengono. Grazie 🥰"
|
||||
_mfm:
|
||||
mention: "Menzioni"
|
||||
url: "URL"
|
||||
link: "Link"
|
||||
bold: "Grassetto"
|
||||
blockCode: "Codice(blocco)"
|
||||
inlineMath: "Espressione matematica(Immersione)"
|
||||
blockMath: "Espressione matematica(blocco)"
|
||||
quote: "Cita il nota"
|
||||
search: "Cerca"
|
||||
blur: "Sfocatura"
|
||||
font: "Tipo di carattere"
|
||||
_reversi:
|
||||
black: "Nero"
|
||||
white: "Bianco"
|
||||
ended: "Esci"
|
||||
_channel:
|
||||
featured: "Tendenze"
|
||||
_sidebar:
|
||||
icon: "Foto del profilo"
|
||||
hide: "Nascondere"
|
||||
_theme:
|
||||
constant: "Costante"
|
||||
defaultValue: "Valore predefinito"
|
||||
color: "Colore"
|
||||
func: "Funzione"
|
||||
darken: "Scuro"
|
||||
lighten: "Chiaro"
|
||||
keys:
|
||||
bg: "Sfondo"
|
||||
shadow: "Ombra"
|
||||
mention: "Menzioni"
|
||||
renote: "Rinotta"
|
||||
divider: "Interruzione di linea"
|
||||
_sfx:
|
||||
note: "Nota"
|
||||
notification: "Notifiche"
|
||||
chat: "Messaggi"
|
||||
_ago:
|
||||
unknown: "Sconosciuto"
|
||||
future: "Futuro"
|
||||
justNow: "Ora"
|
||||
secondsAgo: "{n}s fa"
|
||||
minutesAgo: "{n}min fa"
|
||||
hoursAgo: "{n}h fa"
|
||||
daysAgo: "{1} giorni fa"
|
||||
weeksAgo: "{n} settimane fa"
|
||||
monthsAgo: "{n} mesi fa"
|
||||
yearsAgo: "{n} anni fa"
|
||||
_time:
|
||||
second: "s"
|
||||
minute: "min"
|
||||
hour: "ore"
|
||||
day: "giorni"
|
||||
_tutorial:
|
||||
title: "Come usare Misskey"
|
||||
step1_1: "Benvenuto"
|
||||
_permissions:
|
||||
"read:blocks": "Visualizza gli account che hai bloccato."
|
||||
"write:blocks": "Gestisci gli account che hai bloccato."
|
||||
"read:favorites": "Visualizza Segnalibri"
|
||||
"write:favorites": "Gestisci Segnalibri"
|
||||
"write:following": "Seguiti/ Smetti di seguire"
|
||||
"read:notifications": "Visualizza notifiche"
|
||||
_weekday:
|
||||
sunday: "Domenica"
|
||||
monday: "Lunedì"
|
||||
tuesday: "Martedì"
|
||||
wednesday: "Mercoledì"
|
||||
thursday: "Giovedì"
|
||||
friday: "Venerdì"
|
||||
saturday: "Sabato"
|
||||
_widgets:
|
||||
memo: "Memo"
|
||||
notifications: "Notifiche"
|
||||
timeline: "Timeline"
|
||||
calendar: "Calendario"
|
||||
trends: "Tendenze"
|
||||
clock: "Orologio"
|
||||
rss: "Aggregatore rss"
|
||||
activity: "Attività"
|
||||
photos: "Foto"
|
||||
digitalClock: "Orologio digitale"
|
||||
federation: "Federazione"
|
||||
_cw:
|
||||
hide: "Nascondere"
|
||||
show: "Mostra altre"
|
||||
_poll:
|
||||
noMore: "Hai aggiunto il numero massimo di opzioni."
|
||||
canMultipleVote: "Risposte multiple"
|
||||
expiration: "Scadenza"
|
||||
infinite: "Permanente"
|
||||
deadlineDate: "Data di scadenza"
|
||||
deadlineTime: "h"
|
||||
voted: "Votato"
|
||||
closed: "Terminato"
|
||||
_visibility:
|
||||
public: "Pubblico"
|
||||
home: "Home"
|
||||
followers: "Seguaci"
|
||||
localOnly: "Solo Locale"
|
||||
localOnlyDescription: "Solo locale"
|
||||
_postForm:
|
||||
replyPlaceholder: "Nota la tua risposta.."
|
||||
quotePlaceholder: "Cita Nota..."
|
||||
_profile:
|
||||
name: "Nome"
|
||||
username: "Nome utente"
|
||||
description: "Bio"
|
||||
metadata: "Metadati"
|
||||
metadataLabel: "Etichetta"
|
||||
metadataContent: "Contenuto"
|
||||
_exportOrImport:
|
||||
followingList: "Seiguiti"
|
||||
muteList: "Silenzia"
|
||||
blockingList: "Blocca"
|
||||
userLists: "Liste"
|
||||
_timelines:
|
||||
home: "Home"
|
||||
local: "Locale"
|
||||
_rooms:
|
||||
_roomType:
|
||||
washitsu: "Washitsu"
|
||||
_furnitures:
|
||||
milk: "Cartone del latte"
|
||||
bed: "Letto"
|
||||
low-table: "Tavolino Coffee"
|
||||
desk: "Tavolo"
|
||||
chair: "Sedia"
|
||||
chair2: "Sedia 2"
|
||||
fan: "Ventilatore"
|
||||
pc: "PC"
|
||||
plant: "Pianta da appartamento"
|
||||
plant2: "Pianta da appartamento2"
|
||||
eraser: "Gomma"
|
||||
pencil: "Matita"
|
||||
pudding: "Pudding"
|
||||
book: "Libro"
|
||||
book2: "Libro2"
|
||||
piano: "Pianoforte"
|
||||
server: "Server"
|
||||
moon: "Luna"
|
||||
corkboard: "Bacheca"
|
||||
mousepad: "Tappetino per il mouse"
|
||||
monitor: "Monitor "
|
||||
keyboard: "Tastiera"
|
||||
mat: "Zerbino"
|
||||
color-box: "Libreria"
|
||||
wall-clock: "Orologio da parete"
|
||||
photoframe: "Cornice"
|
||||
cube: "Cubo"
|
||||
tv: "Televisore"
|
||||
pinguin: "Pinguini"
|
||||
bin: "Cestino"
|
||||
cup-noodle: "Noodle istantanei"
|
||||
_pages:
|
||||
like: "Mi piace"
|
||||
unlike: "Togli Mi piace"
|
||||
variables: "Variabili"
|
||||
title: "Titolo"
|
||||
font: "Tipo di carattere"
|
||||
blocks:
|
||||
image: "Immagini"
|
||||
if: "Se"
|
||||
_if:
|
||||
variable: "Variabili"
|
||||
_post:
|
||||
text: "Contenuto"
|
||||
_textInput:
|
||||
text: "Titolo"
|
||||
_textareaInput:
|
||||
text: "Titolo"
|
||||
_numberInput:
|
||||
text: "Titolo"
|
||||
_switch:
|
||||
text: "Titolo"
|
||||
_counter:
|
||||
text: "Titolo"
|
||||
_button:
|
||||
text: "Titolo"
|
||||
_action:
|
||||
_dialog:
|
||||
content: "Contenuto"
|
||||
_radioButton:
|
||||
title: "Titolo"
|
||||
script:
|
||||
categories:
|
||||
comparison: "Metodo comparativo"
|
||||
random: "Aleatorietà"
|
||||
value: "Valore"
|
||||
fn: "Funzione"
|
||||
list: "Liste"
|
||||
blocks:
|
||||
_join:
|
||||
arg1: "Liste"
|
||||
_add:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
_subtract:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
_multiply:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
_divide:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
_mod:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
_eq:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
notEq: "A non è uguale a B"
|
||||
_notEq:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
and: "A e B"
|
||||
_and:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
or: "A o B"
|
||||
_or:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
_lt:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
_gt:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
_ltEq:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
_gtEq:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
_if:
|
||||
arg1: "Se"
|
||||
random: "Aleatorietà"
|
||||
_randomPick:
|
||||
arg1: "Liste"
|
||||
_dailyRandomPick:
|
||||
arg1: "Liste"
|
||||
_seedRandomPick:
|
||||
arg2: "Liste"
|
||||
_pick:
|
||||
arg1: "Liste"
|
||||
_listLen:
|
||||
arg1: "Liste"
|
||||
ref: "Variabili"
|
||||
fn: "Funzione"
|
||||
types:
|
||||
array: "Liste"
|
||||
_notification:
|
||||
youGotQuote: "{name} ha citato il tuo Nota e ha detto"
|
||||
youRenoted: "{name} ha rinotta"
|
||||
youGotPoll: "{name} ha volluto."
|
||||
youWereFollowed: "Nuovo seguace"
|
||||
_types:
|
||||
all: "Tutto"
|
||||
follow: "Seiguiti"
|
||||
mention: "Menzioni"
|
||||
reply: "Rispondi"
|
||||
renote: "Rinotta"
|
||||
quote: "Cita il nota"
|
||||
reaction: "Reazione"
|
||||
_deck:
|
||||
_columns:
|
||||
notifications: "Notifiche"
|
||||
tl: "Timeline"
|
||||
list: "Liste"
|
||||
mentions: "Menzioni"
|
@ -1,5 +1,6 @@
|
||||
_lang_: "日本語"
|
||||
|
||||
headlineMisskey: "ノートでつながるネットワーク"
|
||||
introMisskey: "ようこそ!Misskeyは、オープンソースの分散型マイクロブログサービスです。\n「ノート」を作成して、いま起こっていることを共有したり、あなたについて皆に発信しよう📡\n「リアクション」機能で、皆のノートに素早く反応を追加することもできます👍\n新しい世界を探検しよう🚀"
|
||||
monthAndDay: "{month}月 {day}日"
|
||||
search: "検索"
|
||||
@ -33,6 +34,9 @@ addUser: "ユーザーを追加"
|
||||
favorite: "お気に入り"
|
||||
favorites: "お気に入り"
|
||||
unfavorite: "お気に入り解除"
|
||||
favorited: "お気に入りに登録しました。"
|
||||
alreadyFavorited: "既にお気に入りに登録されています。"
|
||||
cantFavorite: "お気に入りに登録できませんでした。"
|
||||
pin: "ピン留め"
|
||||
unpin: "ピン留め解除"
|
||||
copyContent: "内容をコピー"
|
||||
@ -46,6 +50,7 @@ copyUsername: "ユーザー名をコピー"
|
||||
searchUser: "ユーザーを検索"
|
||||
reply: "返信"
|
||||
loadMore: "もっと見る"
|
||||
showMore: "もっと見る"
|
||||
youGotNewFollower: "フォローされました"
|
||||
receiveFollowRequest: "フォローリクエストされました"
|
||||
followRequestAccepted: "フォローが承認されました"
|
||||
@ -87,8 +92,12 @@ followRequestPending: "フォロー許可待ち"
|
||||
enterEmoji: "絵文字を入力"
|
||||
renote: "Renote"
|
||||
unrenote: "Renote解除"
|
||||
renoted: "Renoteしました。"
|
||||
cantRenote: "この投稿はRenoteできません。"
|
||||
cantReRenote: "RenoteをRenoteすることはできません。"
|
||||
quote: "引用"
|
||||
pinnedNote: "ピン留めされたノート"
|
||||
pinned: "ピン留め"
|
||||
you: "あなた"
|
||||
clickToShow: "クリックして表示"
|
||||
sensitive: "閲覧注意"
|
||||
@ -429,6 +438,7 @@ signinWith: "{x}でログイン"
|
||||
signinFailed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||
tapSecurityKey: "セキュリティキーにタッチ"
|
||||
or: "もしくは"
|
||||
language: "言語"
|
||||
uiLanguage: "UIの表示言語"
|
||||
groupInvited: "グループに招待されました"
|
||||
aboutX: "{x}について"
|
||||
@ -540,7 +550,6 @@ author: "作者"
|
||||
leaveConfirm: "未保存の変更があります。破棄しますか?"
|
||||
manage: "管理"
|
||||
plugins: "プラグイン"
|
||||
pluginInstallWarn: "信頼できないプラグインはインストールしないでください。"
|
||||
deck: "デッキ"
|
||||
undeck: "デッキ解除"
|
||||
useBlurEffectForModal: "モーダルにぼかし効果を使用"
|
||||
@ -655,6 +664,70 @@ useSystemFont: "システムのデフォルトのフォントを使う"
|
||||
clips: "クリップ"
|
||||
experimentalFeatures: "実験的機能"
|
||||
developer: "開発者"
|
||||
makeExplorable: "アカウントを見つけやすくする"
|
||||
makeExplorableDescription: "オフにすると、「みつける」にアカウントが載らなくなります。"
|
||||
showGapBetweenNotesInTimeline: "タイムラインのノートを離して表示"
|
||||
duplicate: "複製"
|
||||
left: "左"
|
||||
center: "中央"
|
||||
wide: "広い"
|
||||
narrow: "狭い"
|
||||
reloadToApplySetting: "設定はページリロード後に反映されます。今すぐリロードしますか?"
|
||||
showTitlebar: "タイトルバーを表示する"
|
||||
clearCache: "キャッシュをクリア"
|
||||
onlineUsersCount: "{n}人がオンライン"
|
||||
nUsers: "{n}ユーザー"
|
||||
nNotes: "{n}ノート"
|
||||
sendErrorReports: "エラーリポートを送信"
|
||||
sendErrorReportsDescription: "オンにすると、問題が発生したときにエラーの詳細情報がMisskeyに共有され、ソフトウェアの品質向上に役立てることができます。エラー情報には、OSのバージョン、ブラウザの種類、行動履歴などが含まれます。"
|
||||
myTheme: "マイテーマ"
|
||||
backgroundColor: "背景"
|
||||
accentColor: "アクセント"
|
||||
textColor: "文字"
|
||||
saveAs: "名前を付けて保存"
|
||||
advanced: "高度"
|
||||
value: "値"
|
||||
updatedAt: "更新日時"
|
||||
saveConfirm: "保存しますか?"
|
||||
deleteConfirm: "削除しますか?"
|
||||
invalidValue: "有効な値ではありません。"
|
||||
registry: "レジストリ"
|
||||
closeAccount: "アカウントを閉鎖する"
|
||||
currentVersion: "現在のバージョン"
|
||||
latestVersion: "最新のバージョン"
|
||||
youAreRunningUpToDateClient: "お使いのクライアントは最新です。"
|
||||
newVersionOfClientAvailable: "新しいバージョンのクライアントが利用可能です。"
|
||||
usageAmount: "使用量"
|
||||
capacity: "容量"
|
||||
inUse: "使用中"
|
||||
editCode: "コードを編集"
|
||||
apply: "適用"
|
||||
receiveAnnouncementFromInstance: "インスタンスからのお知らせを受け取る"
|
||||
emailNotification: "メール通知"
|
||||
inChannelSearch: "チャンネル内検索"
|
||||
useReactionPickerForContextMenu: "右クリックでリアクションピッカーを開く"
|
||||
typingUsers: "{users}が入力中"
|
||||
jumpToSpecifiedDate: "特定の日付にジャンプ"
|
||||
showingPastTimeline: "過去のタイムラインを表示しています"
|
||||
clear: "クリア"
|
||||
|
||||
_email:
|
||||
_follow:
|
||||
title: "フォローされました"
|
||||
_receiveFollowRequest:
|
||||
title: "フォローリクエストを受け取りました"
|
||||
|
||||
_plugin:
|
||||
install: "プラグインのインストール"
|
||||
installWarn: "信頼できないプラグインはインストールしないでください。"
|
||||
manage: "プラグインの管理"
|
||||
|
||||
_registry:
|
||||
scope: "スコープ"
|
||||
key: "キー"
|
||||
keys: "キー"
|
||||
domain: "ドメイン"
|
||||
createKey: "キーを作成"
|
||||
|
||||
_aboutMisskey:
|
||||
about: "Misskeyはsyuiloによって2014年から開発されている、オープンソースのソフトウェアです。"
|
||||
@ -714,11 +787,21 @@ _mfm:
|
||||
bounce: "アニメーション(バウンド)"
|
||||
bounceDescription: "ぽよんぽよん弾むようなアニメーションを与えます。"
|
||||
shake: "アニメーション(ぶるぶる)"
|
||||
shakeDescription: "ぶるぶるするアニメーションを与えます。"
|
||||
shakeDescription: "ぶるぶる震えるアニメーションを与えます。"
|
||||
twitch: "アニメーション(ブレ)"
|
||||
twitchDescription: "激しくブレるアニメーションを与えます。"
|
||||
spin: "アニメーション(回転)"
|
||||
spinDescription: "回転するアニメーションを与えます。"
|
||||
x2: "大きく"
|
||||
x2Description: "内容を大きく表示します。"
|
||||
x3: "とても大きく"
|
||||
x3Description: "内容をとても大きく表示します。"
|
||||
x4: "究極に大きく"
|
||||
x4Description: "内容を究極に大きく表示します。"
|
||||
blur: "ぼかし"
|
||||
blurDescription: "内容をぼかすことができます。ポインターを上に乗せるとはっきり見えるようになります。"
|
||||
font: "フォント"
|
||||
fontDescription: "内容のフォントを指定することができます。"
|
||||
|
||||
_reversi:
|
||||
reversi: "リバーシ"
|
||||
@ -996,6 +1079,11 @@ _widgets:
|
||||
federation: "連合"
|
||||
postForm: "投稿フォーム"
|
||||
slideshow: "スライドショー"
|
||||
button: "ボタン"
|
||||
onlineUsers: "オンラインユーザー"
|
||||
jobQueue: "ジョブキュー"
|
||||
serverMetric: "サーバーメトリクス"
|
||||
aiscript: "AiScriptコンソール"
|
||||
|
||||
_cw:
|
||||
hide: "隠す"
|
||||
@ -1505,6 +1593,8 @@ _notification:
|
||||
_deck:
|
||||
alwaysShowMainColumn: "常にメインカラムを表示"
|
||||
columnAlign: "カラムの寄せ"
|
||||
columnMargin: "カラム間のマージン"
|
||||
columnHeaderHeight: "カラムのヘッダー幅"
|
||||
addColumn: "カラムを追加"
|
||||
swapLeft: "左に移動"
|
||||
swapRight: "右に移動"
|
||||
@ -1512,8 +1602,10 @@ _deck:
|
||||
swapDown: "下に移動"
|
||||
stackLeft: "左に重ねる"
|
||||
popRight: "右に出す"
|
||||
profile: "プロファイル"
|
||||
|
||||
_columns:
|
||||
main: "メイン"
|
||||
widgets: "ウィジェット"
|
||||
notifications: "通知"
|
||||
tl: "タイムライン"
|
||||
|
@ -1,15 +1,15 @@
|
||||
---
|
||||
_lang_: "日本語 (関西弁)"
|
||||
introMisskey: "ようこそ!Misskeyってのは、オープンソースの分散型マイクロブログサービスやねん。\n「ノート」を作成し、いま起こっとることを共有したり、あんたんこととか皆に伝えていこう📡\n「リアクション」機能で、皆のノートに素はよ反応を追加することもできるんやで✌\n新しい世界を探検してみらん?🚀"
|
||||
introMisskey: "ようお越し!Misskeyは、オープンソースの分散型マイクロブログサービスやねん。\n「ノート」を作って、いま起こっとることを共有したり、あんたについて皆に発信しよう📡\n「リアクション」機能で、皆のノートに素早く反応を追加したりもできるで✌\nほな新しい世界を探検しよか🚀"
|
||||
monthAndDay: "{month}月 {day}日"
|
||||
search: "探す"
|
||||
notifications: "通知"
|
||||
username: "ユーザー名"
|
||||
password: "パスワード"
|
||||
fetchingAsApObject: "今ちと連合に照会しとるで"
|
||||
ok: "おっけー"
|
||||
ok: "OKや"
|
||||
gotIt: "ほい"
|
||||
cancel: "やめとくわ"
|
||||
cancel: "やめとく"
|
||||
enterUsername: "ユーザー名を入れてや"
|
||||
renotedBy: "{user}がRenote"
|
||||
noNotes: "ノートはあらへん"
|
||||
@ -18,34 +18,38 @@ instance: "インスタンス"
|
||||
settings: "設定"
|
||||
basicSettings: "基本設定"
|
||||
otherSettings: "その他の設定"
|
||||
openInWindow: "ウィンドウで開いてや"
|
||||
openInWindow: "ウィンドウで開くで"
|
||||
profile: "プロフィール"
|
||||
timeline: "タイムライン"
|
||||
noAccountDescription: "自己紹介はあらへん"
|
||||
noAccountDescription: "自己紹介食ってもた"
|
||||
login: "ログイン"
|
||||
loggingIn: "ログインしよるで"
|
||||
logout: "ログアウト"
|
||||
signup: "新規登録"
|
||||
uploading: "アップロードしよるで"
|
||||
save: "とっとく"
|
||||
uploading: "アップロードしとるで"
|
||||
save: "保存"
|
||||
users: "ユーザー"
|
||||
addUser: "ユーザーを追加や"
|
||||
favorite: "お気に入り"
|
||||
favorites: "お気に入り"
|
||||
unfavorite: "やっぱ気に入らん"
|
||||
favorited: "お気に入りに登録したで"
|
||||
alreadyFavorited: "もうお気に入りに入れとるがな。"
|
||||
cantFavorite: "アカン、お気に入り登録できへんかったで。"
|
||||
pin: "ピン留めしとく"
|
||||
unpin: "やっぱピン留めせん"
|
||||
copyContent: "内容をコピー"
|
||||
copyLink: "リンクをコピー"
|
||||
delete: "ほかす"
|
||||
deleteAndEdit: "ほかして直す"
|
||||
deleteAndEditConfirm: "このノートをほかしてもっかい直す?このノートへのリアクション、Renote、返信も全部消えるんやけどそれでもええん?"
|
||||
deleteAndEditConfirm: "このノートをほかして書き直すんか?このノートへのリアクション、Renote、返信も全部消えてまうで。"
|
||||
addToList: "リストに入れたる"
|
||||
sendMessage: "メッセージを送る"
|
||||
copyUsername: "ユーザー名をコピー"
|
||||
searchUser: "ユーザーを検索"
|
||||
reply: "返す"
|
||||
loadMore: "もっとあるやろ!"
|
||||
reply: "返事"
|
||||
loadMore: "まだまだあるで!"
|
||||
showMore: "まだまだあるで!"
|
||||
youGotNewFollower: "フォローされたで"
|
||||
receiveFollowRequest: "フォローリクエストされたで"
|
||||
followRequestAccepted: "フォローが承認されたで"
|
||||
@ -76,27 +80,32 @@ retry: "もっぺんやる?"
|
||||
pageLoadError: "ページの読み込みに失敗してしもうたで…"
|
||||
pageLoadErrorDescription: "これは普通、ネットワークかブラウザキャッシュが原因やからね。キャッシュをクリアするか、もうちっとだけ待ってくれへんか?"
|
||||
enterListName: "リスト名を入れてや"
|
||||
privacy: "プライバシーってなんぞや?"
|
||||
makeFollowManuallyApprove: "他人からのフォローは自分が決める"
|
||||
privacy: "プライバシー"
|
||||
makeFollowManuallyApprove: "ええって言わなフォローできへんようにする"
|
||||
defaultNoteVisibility: "もとからの公開範囲"
|
||||
follow: "フォロー"
|
||||
followRequest: "フォローを頼む"
|
||||
followRequests: "フォローを頼む"
|
||||
followRequests: "フォロー申請"
|
||||
unfollow: "フォローやめる"
|
||||
followRequestPending: "フォロー許してくれるん待っとる"
|
||||
enterEmoji: "絵文字を入れてや"
|
||||
renote: "Renote"
|
||||
unrenote: "Renoteやめる"
|
||||
renoted: "Renoteしたで。"
|
||||
cantRenote: "この投稿はRenoteできへんらしい。"
|
||||
cantReRenote: "Renote自体はRenoteできへんで。"
|
||||
quote: "引用"
|
||||
pinnedNote: "ピン留めされとるノート"
|
||||
pinned: "ピン留めしとく"
|
||||
you: "あんた"
|
||||
clickToShow: "押したら見えるようになるで"
|
||||
clickToShow: "押したら見えるで"
|
||||
sensitive: "ちょっとアカンやつやで"
|
||||
add: "増やす"
|
||||
reaction: "リアクション"
|
||||
reactionSettingDescription: "リアクションピッカーに出しとくリアクションを選んでや。"
|
||||
reactionSettingDescription2: "ドラッグで並び替え、クリックで削除、+を押して追加やで。"
|
||||
rememberNoteVisibility: "公開範囲覚えといて"
|
||||
attachCancel: "やっぱ添付やめてくれん?"
|
||||
attachCancel: "のっけるのやめる"
|
||||
markAsSensitive: "ちょっとこれはアカン"
|
||||
unmarkAsSensitive: "そこまでアカンことないやろ"
|
||||
enterFileName: "ファイル名を入れてや"
|
||||
@ -122,10 +131,12 @@ emojiUrl: "絵文字画像URL"
|
||||
addEmoji: "絵文字を追加"
|
||||
settingGuide: "ええ感じの設定"
|
||||
cacheRemoteFiles: "リモートのファイルをキャッシュする"
|
||||
cacheRemoteFilesDescription: "この設定を切っとくと、リモートファイルをキャッシュせず直リンクするようになってしまうんやで? サーバーのストレージは節約できるんやけど、かわりにサムネイルが作られんくなるから通信量が増えるで?"
|
||||
cacheRemoteFilesDescription: "この設定を切っとくと、リモートファイルをキャッシュせず直リンクするようになるで。サーバーの容量は節約できるけど、サムネイルが作られんくなるから通信量が増えるで。"
|
||||
flagAsBot: "Botやで"
|
||||
flagAsBotDescription: "もしこのアカウントがプログラムによって運用されるんやったら、このフラグをオンにしてたのむで。オンにすると、反応の連鎖を防ぐためのフラグとして他の開発者に役立ったり、Misskeyのシステム上での扱いがBotに合ったもんになるんやで。"
|
||||
flagAsCat: "Catやで"
|
||||
autoAcceptFollowed: "フォローしとるユーザーからのフォローリクエストには勝手に許可しとくで。"
|
||||
flagAsCatDescription: "ワレ、猫ちゃんならこのフラグをつけてみ?"
|
||||
autoAcceptFollowed: "フォローしとるユーザーからのフォローリクエストを勝手に許可しとく"
|
||||
addAcount: "アカウント追加"
|
||||
loginFailed: "ログインに失敗してしもうた…"
|
||||
showOnRemote: "リモートで見る"
|
||||
@ -170,7 +181,7 @@ clearQueue: "キューにさいなら"
|
||||
clearQueueConfirmTitle: "キューをクリアしまっか?"
|
||||
clearQueueConfirmText: "未配達の投稿は配送されなくなるで。通常この操作を行う必要はあらへんや。"
|
||||
clearCachedFiles: "キャッシュにさいなら"
|
||||
clearCachedFilesConfirm: "キャッシュされとるリモートファイルを全部削除しまっか?"
|
||||
clearCachedFilesConfirm: "キャッシュされとるリモートファイルをみんなほかしてええか?"
|
||||
blockedInstances: "インスタンスブロック"
|
||||
blockedInstancesDescription: "ブロックしたいインスタンスのホストを改行で区切って設定してな。ブロックされてもうたインスタンスとはもう金輪際やり取りできひんくなるで。"
|
||||
muteAndBlock: "ミュートとブロック"
|
||||
@ -203,18 +214,19 @@ retypedNotMatch: "そやないねん。"
|
||||
currentPassword: "今のパスワード"
|
||||
newPassword: "今度のパスワード"
|
||||
newPasswordRetype: "今度のパスワード(もっぺん入れて)"
|
||||
attachFile: "ファイルくっつけて"
|
||||
more: "他ないんか!"
|
||||
attachFile: "ファイルのっける"
|
||||
more: "他のやつ!"
|
||||
featured: "ハイライト"
|
||||
usernameOrUserId: "ユーザー名かユーザーID"
|
||||
noSuchUser: "ユーザーが見つからへんで"
|
||||
lookup: "見てきて"
|
||||
announcements: "これ知っといてな"
|
||||
announcements: "お知らせ"
|
||||
imageUrl: "画像URL"
|
||||
remove: "ほかす"
|
||||
removed: "削除したで!"
|
||||
removeAreYouSure: "「{x}」はなおしてしもてええか?"
|
||||
deleteAreYouSure: "「{x}」はなおしてしもてええか?"
|
||||
removeAreYouSure: "「{x}」はほかしてええか?"
|
||||
deleteAreYouSure: "「{x}」はほかしてええか?"
|
||||
resetAreYouSure: "リセットしてええん?"
|
||||
saved: "保存したで!"
|
||||
messaging: "チャット"
|
||||
upload: "アップロード"
|
||||
@ -234,7 +246,7 @@ agreeTo: "{0}はええで"
|
||||
tos: "利用規約"
|
||||
start: "始める"
|
||||
home: "ホーム"
|
||||
remoteUserCaution: "リモートユーザーやから、ちゃんとした情報とちゃうで。"
|
||||
remoteUserCaution: "リモートユーザーやから、足りひん情報あるかもしれへん。"
|
||||
activity: "アクティビティ"
|
||||
images: "画像"
|
||||
birthday: "生まれた日"
|
||||
@ -248,7 +260,7 @@ light: "ライト"
|
||||
dark: "ダーク"
|
||||
lightThemes: "デイゲーム"
|
||||
darkThemes: "ナイトゲーム"
|
||||
syncDeviceDarkMode: "試合開始時間はデバイスのダークモードと一緒や"
|
||||
syncDeviceDarkMode: "デバイスのダークモードと一緒にする"
|
||||
drive: "ドライブ"
|
||||
fileName: "ファイル名"
|
||||
selectFile: "ファイル選んでや"
|
||||
@ -272,9 +284,9 @@ copyUrl: "URLをコピー"
|
||||
rename: "名前を変えるで"
|
||||
avatar: "アイコン"
|
||||
banner: "バナー"
|
||||
nsfw: "ちょっとアカンやつやで"
|
||||
whenServerDisconnected: "サーバーとの接続が失くなってしもうたとき"
|
||||
disconnectedFromServer: "サーバーが機嫌悪いねん"
|
||||
nsfw: "閲覧注意"
|
||||
whenServerDisconnected: "サーバーとの接続が切れたとき"
|
||||
disconnectedFromServer: "サーバーとの通信が切れたで"
|
||||
reload: "リロード"
|
||||
doNothing: "何もせんとく"
|
||||
reloadConfirm: "リロードしてええか?"
|
||||
@ -295,7 +307,7 @@ dayX: "{day}日"
|
||||
monthX: "{month}月"
|
||||
yearX: "{year}年"
|
||||
pages: "ページ"
|
||||
integration: "つないで"
|
||||
integration: "連携"
|
||||
connectSerice: "つなげる"
|
||||
disconnectSerice: "切ってまう"
|
||||
enableLocalTimeline: "ローカルタイムラインを使えるようにする"
|
||||
@ -305,7 +317,7 @@ registration: "登録"
|
||||
enableRegistration: "一見さんでも誰でもいらっしゃ~い"
|
||||
invite: "来てや"
|
||||
proxyRemoteFiles: "リモートのファイルをプロキシする"
|
||||
proxyRemoteFilesDescription: "この設定を入れると、保存しとらんかったり、お腹いっぱいになってしもたせいで保存できんかったリモートファイルをローカルでプロキシして、サムネイル作ってもらうことができるで。サーバーの腹具合には影響せんけどな。"
|
||||
proxyRemoteFilesDescription: "この設定を有効にしたら、保存してなかったり容量が足らんくて消されたリモートファイルをローカルでプロキシして、サムネイルを作るようになるで。サーバーの容量には関係ないで。"
|
||||
driveCapacityPerLocalAccount: "ローカルユーザーひとりあたりのドライブ容量"
|
||||
driveCapacityPerRemoteAccount: "リモートユーザーひとりあたりのドライブ容量"
|
||||
inMb: "メガバイト単位"
|
||||
@ -314,6 +326,7 @@ bannerUrl: "バナー画像のURL"
|
||||
basicInfo: "基本情報"
|
||||
pinnedUsers: "ピン留めしたユーザー"
|
||||
pinnedUsersDescription: "「みつける」ページとかにピン留めしたいユーザーをここに書けばええんやで。他ん人との名前は改行で区切ればええんやで。"
|
||||
pinnedPages: "ピン留めページ"
|
||||
pinnedNotes: "ピン留めされとるノート"
|
||||
hcaptcha: "hCaptcha(キャプチャ)"
|
||||
enableHcaptcha: "hCaptcha(キャプチャ)をつけとく"
|
||||
@ -368,11 +381,11 @@ unregister: "登録やめる"
|
||||
passwordLessLogin: "パスワード無くてもログインできるようにする"
|
||||
resetPassword: "パスワードをリセット"
|
||||
newPasswordIs: "今度のパスワードは「{password}」や"
|
||||
reduceUiAnimation: "UIの動きやアニメーションを減らしてくれや。"
|
||||
reduceUiAnimation: "UIの動きやアニメーションを減らす"
|
||||
share: "わけわけ"
|
||||
notFound: "見つからへんね"
|
||||
notFoundDescription: "指定されたURLに該当するページはあらへんやった。"
|
||||
uploadFolder: "とりあえずここへアップロード"
|
||||
uploadFolder: "とりあえずアップロードしたやつ置いとく所"
|
||||
cacheClear: "キャッシュをほかす"
|
||||
markAsReadAllNotifications: "通知はもう全て読んだわっ"
|
||||
markAsReadAllUnreadNotes: "投稿は全て読んだわっ"
|
||||
@ -404,17 +417,69 @@ quoteQuestion: "引用として添付してもええか?"
|
||||
noMessagesYet: "まだチャットはあらへんで"
|
||||
newMessageExists: "新しいメッセージがきたで"
|
||||
onlyOneFileCanBeAttached: "すまん、メッセージに添付できるファイルはひとつだけなんや。"
|
||||
signinRequired: "ログインしてくれへん?"
|
||||
invitations: "来てや"
|
||||
invitationCode: "招待コード"
|
||||
checking: "確認しとるで"
|
||||
available: "利用できる\n"
|
||||
unavailable: "利用できん"
|
||||
usernameInvalidFormat: "a~z、A~Z、0~9、_が使えるで"
|
||||
tooShort: "短すぎやろ!"
|
||||
tooLong: "長すぎやろ!"
|
||||
weakPassword: "へぼいパスワード"
|
||||
normalPassword: "普通のパスワード"
|
||||
strongPassword: "ええ感じのパスワード"
|
||||
passwordMatched: "よし!一致や!"
|
||||
passwordNotMatched: "一致しとらんで?"
|
||||
signinWith: "{x}でログイン"
|
||||
or: "それか"
|
||||
uiLanguage: "UIの表示言語"
|
||||
groupInvited: "グループに招待されとるで"
|
||||
aboutX: "{x}について"
|
||||
useOsNativeEmojis: "OSネイティブの絵文字を使う"
|
||||
youHaveNoGroups: "グループがあらへんねぇ。"
|
||||
noHistory: "履歴はあらへんねぇ。"
|
||||
signinHistory: "ログイン履歴"
|
||||
disableAnimatedMfm: "動きがやかましいMFMを止める"
|
||||
doing: "やっとるがな"
|
||||
category: "カテゴリ"
|
||||
tags: "タグ"
|
||||
docSource: "このドキュメントのソース"
|
||||
createAccount: "アカウントを作成"
|
||||
existingAcount: "既存のアカウント"
|
||||
regenerate: "再生成"
|
||||
fontSize: "フォントサイズ"
|
||||
noFollowRequests: "フォロー申請はあらへんで"
|
||||
openImageInNewTab: "画像を新しいタブで開く"
|
||||
dashboard: "ダッシュボード"
|
||||
local: "ローカル"
|
||||
remote: "リモート"
|
||||
scratchpadDescription: "スクラッチパッドではAiScriptを色々試すことができるんや。Misskeyに対して色々できるコードを書いて動かしてみたり、結果を見たりできるで。"
|
||||
leaveConfirm: "未保存の変更があるで!ほかしてええか?"
|
||||
emailConfigInfo: "メールアドレスの確認とかパスワードリセットの時に使うで"
|
||||
smtpHost: "ホスト"
|
||||
smtpUser: "ユーザー名"
|
||||
smtpPass: "パスワード"
|
||||
notificationSettingDesc: "表示する通知の種類えらんでや。"
|
||||
emailVerified: "メールアドレスは確認されたで"
|
||||
pageLikesCount: "Pageにええやんと思った数"
|
||||
pageLikedCount: "Pageにええやんと思ってくれた数"
|
||||
reloadToApplySetting: "設定はページリロード後に反映されるで。今リロードしとくか?"
|
||||
clearCache: "キャッシュをほかす"
|
||||
onlineUsersCount: "{n}人が起きとるで"
|
||||
sendErrorReportsDescription: "オンにしたら、なんか変なことが起きたときにエラーの詳細がMisskeyに共有されて、ソフトウェアの品質向上に役立てられるんや。エラー情報には、OSのバージョン、ブラウザの種類、行動履歴などが含まれるで。"
|
||||
youAreRunningUpToDateClient: "今使ってるクライアントが最新やで!"
|
||||
newVersionOfClientAvailable: "新しいバージョンのクライアントが使えるで。"
|
||||
_email:
|
||||
_follow:
|
||||
title: "フォローされたで"
|
||||
_mfm:
|
||||
mention: "メンション"
|
||||
quote: "引用"
|
||||
emoji: "カスタム絵文字"
|
||||
search: "探す"
|
||||
_channel:
|
||||
notesCount: "{n}こ投稿があるで"
|
||||
_sidebar:
|
||||
icon: "アイコン"
|
||||
_theme:
|
||||
@ -426,7 +491,7 @@ _sfx:
|
||||
notification: "通知"
|
||||
chat: "チャット"
|
||||
_ago:
|
||||
unknown: "謎"
|
||||
unknown: "わからん"
|
||||
future: "未来"
|
||||
justNow: "たった今"
|
||||
secondsAgo: "{n}秒前"
|
||||
@ -441,8 +506,13 @@ _time:
|
||||
minute: "分"
|
||||
hour: "時間"
|
||||
day: "日"
|
||||
_tutorial:
|
||||
step3_1: "プロフィール設定はええ感じにできたか?"
|
||||
_2fa:
|
||||
alreadyRegistered: "もう設定終わっとるわ"
|
||||
alreadyRegistered: "もう設定終わっとるわ。"
|
||||
_permissions:
|
||||
"read:page-likes": "ページのええやんを見る"
|
||||
"write:page-likes": "ページのええやんを操作する"
|
||||
_auth:
|
||||
permissionAsk: "このアプリは次の権限を要求しとるで"
|
||||
_antennaSources:
|
||||
@ -453,8 +523,9 @@ _widgets:
|
||||
timeline: "タイムライン"
|
||||
activity: "アクティビティ"
|
||||
federation: "連合"
|
||||
jobQueue: "ジョブキュー"
|
||||
_cw:
|
||||
show: "もっとあるやろ!"
|
||||
show: "続き見して!"
|
||||
_poll:
|
||||
noMore: "これ以上追加でけへん"
|
||||
deadlineTime: "時間"
|
||||
@ -474,11 +545,15 @@ _exportOrImport:
|
||||
_timelines:
|
||||
home: "ホーム"
|
||||
_rooms:
|
||||
leaveConfirm: "未保存の変更があるけど、移動してええか?"
|
||||
_roomType:
|
||||
default: "デフォルト"
|
||||
_furnitures:
|
||||
monitor: "モニター"
|
||||
_pages:
|
||||
like: "ええやん"
|
||||
unlike: "良くないわ"
|
||||
liked: "ええと思ったページ"
|
||||
blocks:
|
||||
image: "画像"
|
||||
script:
|
||||
@ -501,12 +576,17 @@ _pages:
|
||||
array: "リスト"
|
||||
_notification:
|
||||
youWereFollowed: "フォローされたで"
|
||||
youReceivedFollowRequest: "フォロー許可してほしいみたいやな"
|
||||
yourFollowRequestAccepted: "フォローさせてもろたで"
|
||||
youWereInvitedToGroup: "グループに招待されとるで"
|
||||
_types:
|
||||
follow: "フォロー"
|
||||
mention: "メンション"
|
||||
renote: "Renote"
|
||||
quote: "引用"
|
||||
reaction: "リアクション"
|
||||
receiveFollowRequest: "フォロー許可してほしいみたいやで"
|
||||
followRequestAccepted: "フォローが受理されたで"
|
||||
_deck:
|
||||
_columns:
|
||||
notifications: "通知"
|
||||
|
@ -13,6 +13,7 @@ delete: "Kkes"
|
||||
addToList: "Rnu ɣer tebdart"
|
||||
reply: "Err"
|
||||
loadMore: "Wali ugar"
|
||||
showMore: "Wali ugar"
|
||||
youGotNewFollower: "Yeṭṭafaṛ-ik·em-id"
|
||||
mention: "Bder"
|
||||
import: "Kter"
|
||||
@ -35,9 +36,13 @@ userList: "Tibdarin"
|
||||
uiLanguage: "Tutlayt n wegrudem"
|
||||
smtpUser: "Isem n umseqdac"
|
||||
smtpPass: "Awal uffir"
|
||||
_email:
|
||||
_follow:
|
||||
title: "Yeṭṭafaṛ-ik·em-id"
|
||||
_mfm:
|
||||
mention: "Bder"
|
||||
search: "Nadi"
|
||||
font: "Tasefsit"
|
||||
_theme:
|
||||
keys:
|
||||
mention: "Bder"
|
||||
|
@ -40,6 +40,7 @@ sendMessage: "ಸಂದೇಶ ಕಳುಹಿಸು"
|
||||
copyUsername: "ಬಳಕೆಹೆಸರು ನಕಲಿಸು"
|
||||
reply: "ಉತ್ತರಿಸು"
|
||||
loadMore: "ಇನ್ನಷ್ಟು ನೋಡು"
|
||||
showMore: "ಇನ್ನಷ್ಟು ನೋಡು"
|
||||
youGotNewFollower: "ಹಿಂಬಾಲಿಸಿದರು"
|
||||
receiveFollowRequest: "ಹಿಂಬಾಲನೆ ವಿನಂತಿ ಬಂದಿದೆ"
|
||||
followRequestAccepted: "ಹಿಂಬಾಲನೆ ವಿನಂತಿ ಸ್ವೀಕರಿಸಲಾಯಿತು"
|
||||
@ -52,10 +53,14 @@ files: "ಕಡತಗಳು"
|
||||
download: "ಜಾಲದಿಂದಿಳಿಸು"
|
||||
driveFileDeleteConfirm: "\"{name}\" ಕಡತವನ್ನು ಅಳಿಸಲು ನೀವು ಬಯಸುವಿರಾ? ಈ ನೋಡಿರಿ ಲಗತ್ತಿಸಲಾದ ಟಿಪ್ಪಣಿ ಸಹ ಕಣ್ಮರೆಯಾಗುತ್ತದೆ."
|
||||
unfollowConfirm: "{name}ಅನ್ನು ಹಿಂಬಾಲಿಸದಿರುವುದೇ?"
|
||||
pinned: "ಪ್ರೊಫ಼ೈಲಿಗೆ ಅಂಟಿಸು"
|
||||
instances: "ನಿದರ್ಶನ"
|
||||
remove: "ಅಳಿಸು"
|
||||
smtpUser: "ಬಳಕೆಹೆಸರು"
|
||||
smtpPass: "ಗುಪ್ತಪದ"
|
||||
_email:
|
||||
_follow:
|
||||
title: "ಹಿಂಬಾಲಿಸಿದರು"
|
||||
_mfm:
|
||||
search: "ಹುಡುಕು"
|
||||
_sfx:
|
||||
|
@ -1,5 +1,6 @@
|
||||
---
|
||||
_lang_: "한국어"
|
||||
headlineMisskey: "노트로 연결되는 네트워크"
|
||||
introMisskey: "환영합니다! Misskey 는 오픈 소스 분산형 마이크로 블로그 서비스입니다.\n\"노트\" 를 작성해서, 지금 일어나고 있는 일을 공유하거나, 당신만의 이야기를 모두에게 발신하세요📡\n\"리액션\" 기능으로, 친구의 노트에 총알같이 반응을 추가할 수도 있습니다👍\n새로운 세계를 탐험해 보세요🚀"
|
||||
monthAndDay: "{month}월 {day}일"
|
||||
search: "검색"
|
||||
@ -33,6 +34,9 @@ addUser: "유저 추가"
|
||||
favorite: "즐겨찾기"
|
||||
favorites: "즐겨찾기"
|
||||
unfavorite: "즐겨찾기에서 제거"
|
||||
favorited: "즐겨찾기에 등록했습니다"
|
||||
alreadyFavorited: "이미 즐겨찾기에 등록되어 있습니다"
|
||||
cantFavorite: "즐겨찾기에 등록하지 못했습니다"
|
||||
pin: "프로필에 고정"
|
||||
unpin: "프로필에서 고정 해제"
|
||||
copyContent: "내용 복사"
|
||||
@ -46,6 +50,7 @@ copyUsername: "유저명 복사"
|
||||
searchUser: "사용자 검색"
|
||||
reply: "답글"
|
||||
loadMore: "더 보기"
|
||||
showMore: "더 보기"
|
||||
youGotNewFollower: "새로운 팔로워가 있습니다"
|
||||
receiveFollowRequest: "새로운 팔로우 요청이 있습니다"
|
||||
followRequestAccepted: "팔로우가 수락되었습니다"
|
||||
@ -87,14 +92,19 @@ followRequestPending: "팔로우 허가 대기중"
|
||||
enterEmoji: "이모지 입력"
|
||||
renote: "Renote"
|
||||
unrenote: "Renote 취소"
|
||||
renoted: "Renote 하였습니다"
|
||||
cantRenote: "이 게시물은 Renote할 수 없습니다."
|
||||
cantReRenote: "Renote를 Renote할 수 없습니다."
|
||||
quote: "인용"
|
||||
pinnedNote: "고정해놓은 노트"
|
||||
pinned: "프로필에 고정"
|
||||
you: "당신"
|
||||
clickToShow: "클릭하여 보기"
|
||||
sensitive: "열람주의"
|
||||
add: "추가"
|
||||
reaction: "리액션"
|
||||
reactionSettingDescription: "리액션 선택 상자에 표시할 리액션을 설정합니다."
|
||||
reactionSettingDescription2: "끌어서 순서 변경, 클릭해서 삭제, +를 눌러서 추가할 수 있습니다."
|
||||
rememberNoteVisibility: "공개 범위를 기억하기"
|
||||
attachCancel: "첨부 취소"
|
||||
markAsSensitive: "열람주의로 설정"
|
||||
@ -319,6 +329,7 @@ pinnedUsers: "고정된 유저"
|
||||
pinnedUsersDescription: "\"발견하기\" 페이지 등에 고정하고 싶은 유저를 한 줄에 한 명씩 적습니다."
|
||||
pinnedPages: "고정한 페이지"
|
||||
pinnedPagesDescription: "인스턴스의 대문에 고정하고 싶은 페이지의 경로를 한 줄에 하나씩 적습니다."
|
||||
pinnedClipId: "고정할 클립의 ID"
|
||||
pinnedNotes: "고정해놓은 노트"
|
||||
hcaptcha: "hCaptcha"
|
||||
enableHcaptcha: "hCaptcha 활성화"
|
||||
@ -427,6 +438,7 @@ signinWith: "{x}로 로그인"
|
||||
signinFailed: "로그인할 수 없습니다. 사용자명과 비밀번호를 확인하여 주십시오."
|
||||
tapSecurityKey: "보안 키를 터치"
|
||||
or: "혹은"
|
||||
language: "언어"
|
||||
uiLanguage: "UI 표시 언어"
|
||||
groupInvited: "그룹에 초대되었습니다"
|
||||
aboutX: "{x}에 대하여"
|
||||
@ -452,6 +464,7 @@ remote: "리모트"
|
||||
total: "합계"
|
||||
weekOverWeekChanges: "지난주보다"
|
||||
dayOverDayChanges: "어제보다"
|
||||
appearance: "모양"
|
||||
clientSettings: "클라이언트 설정"
|
||||
accountSettings: "계정 설정"
|
||||
promotion: "프로모션"
|
||||
@ -537,7 +550,6 @@ author: "작성자"
|
||||
leaveConfirm: "저장하지 않은 변경사항이 있습니다. 취소하시겠습니까?"
|
||||
manage: "관리"
|
||||
plugins: "플러그인"
|
||||
pluginInstallWarn: "신뢰할 수 없는 플러그인은 설치하지 마십시오."
|
||||
deck: "덱"
|
||||
undeck: "덱 해제"
|
||||
width: "폭"
|
||||
@ -555,7 +567,10 @@ notificationType: "알림 유형"
|
||||
edit: "편집"
|
||||
useStarForReactionFallback: "알 수 없는 리액션 이모지 대신 ★ 사용"
|
||||
emailConfig: "메일 서버 설정"
|
||||
enableEmail: "이메일 송신 기능 활성화"
|
||||
emailConfigInfo: "가입 시 메일 주소 확인이나 비밀번호 초기화 시에 사용합니다."
|
||||
email: "이메일"
|
||||
emailAddress: "메일 주소"
|
||||
smtpConfig: "SMTP 서버 설정"
|
||||
smtpHost: "호스트"
|
||||
smtpPort: "포트"
|
||||
@ -566,9 +581,11 @@ smtpSecure: "SMTP 연결에 Implicit SSL/TTS 사용"
|
||||
smtpSecureInfo: "STARTTLS 사용 시에는 해제합니다."
|
||||
testEmail: "이메일 전송 테스트"
|
||||
wordMute: "단어 뮤트"
|
||||
userSaysSomething: "{name}님이 무언가를 말했습니다"
|
||||
makeActive: "활성화"
|
||||
display: "표시"
|
||||
copy: "복사"
|
||||
metrics: "통계"
|
||||
overview: "요약"
|
||||
logs: "로그"
|
||||
delayed: "지연"
|
||||
@ -577,6 +594,7 @@ channel: "채널"
|
||||
create: "생성"
|
||||
notificationSetting: "알림 설정"
|
||||
notificationSettingDesc: "표시할 알림의 종류를 선택해 주세요."
|
||||
useGlobalSetting: "글로벌 설정을 사용하기"
|
||||
useGlobalSettingDesc: "활성화하면 계정의 알림 설정이 적용되니다. 비활성화하면 개별적으로 설정할 수 있게 됩니다."
|
||||
other: "기타"
|
||||
regenerateLoginToken: "로그인 토큰을 재생성"
|
||||
@ -592,7 +610,12 @@ reportAbuseOf: "{name}을 신고하기"
|
||||
fillAbuseReportDescription: "신고하려는 이유를 자세히 알려주세요. 특정 게시물을 신고할 때에는 게시물의 URL도 포함해 주세요."
|
||||
abuseReported: "신고를 보냈습니다. 신고해 주셔서 감사합니다."
|
||||
send: "전송"
|
||||
abuseMarkAsResolved: "해결됨으로 표시"
|
||||
openInNewTab: "새 탭에서 열기"
|
||||
openInSideView: "사이드뷰로 열기"
|
||||
editTheseSettingsMayBreakAccount: "이 설정을 변경하면 계정이 손상될 수 있습니다."
|
||||
instanceTicker: "노트의 인스턴스 정보"
|
||||
waitingFor: "{x}을(를) 기다리고 있습니다"
|
||||
random: "랜덤"
|
||||
system: "시스템"
|
||||
switchUi: "UI 전환"
|
||||
@ -602,21 +625,102 @@ createNew: "새로 만들기"
|
||||
optional: "옵션"
|
||||
createNewClip: "새 클립 만들기"
|
||||
public: "공개"
|
||||
i18nInfo: "Misskey는 자원봉사자들에 의해 다양한 언어로 번역되고 있습니다. {link}에서 번역에 참가할 수 있습니다."
|
||||
manageAccessTokens: "액세스 토큰 관리"
|
||||
accountInfo: "계정 정보"
|
||||
notesCount: "노트 수"
|
||||
repliesCount: "답글 수"
|
||||
renotesCount: "Renote 수"
|
||||
repliedCount: "받은 답글 수"
|
||||
renotedCount: "받은 Renote 수"
|
||||
followingCount: "팔로우 수"
|
||||
followersCount: "팔로워 수"
|
||||
sentReactionsCount: "보낸 리액션 수"
|
||||
receivedReactionsCount: "받은 리액션 수"
|
||||
pollVotesCount: "투표한 횟수"
|
||||
pollVotedCount: "투표받은 횟수"
|
||||
yes: "예"
|
||||
no: "아니오"
|
||||
driveFilesCount: "드라이브 파일 개수"
|
||||
driveUsage: "드라이브 사용량"
|
||||
noCrawle: "검색엔진의 인덱싱 거부"
|
||||
noCrawleDescription: "검색엔진에 사용자 페이지, 노트, 페이지 등의 콘텐츠를 인덱싱되지 않게 합니다."
|
||||
lockedAccountInfo: "팔로우를 승인으로 승인받더라도 노트의 공개 범위를 '팔로워'로 하지 않는 한 누구나 당신의 노트를 볼 수 있습니다."
|
||||
alwaysMarkSensitive: "미디어를 항상 열람 주의로 설정"
|
||||
loadRawImages: "첨부한 이미지의 썸네일을 원본화질로 표시"
|
||||
disableShowingAnimatedImages: "움직이는 이미지를 자동으로 재생하지 않음"
|
||||
verificationEmailSent: "확인 메일을 발송하였습니다. 설정을 완료하려면 메일에 첨부된 링크를 확인해 주세요."
|
||||
notSet: "설정되지 않음"
|
||||
emailVerified: "메일 주소가 확인되었습니다."
|
||||
noteFavoritesCount: "즐겨찾기한 노트 수"
|
||||
pageLikesCount: "좋아요 한 Page 수"
|
||||
pageLikedCount: "Page에 받은 좋아요 수"
|
||||
reversiCount: "리버시 대국 횟수"
|
||||
contact: "연락처"
|
||||
useSystemFont: "시스템 기본 글꼴을 사용"
|
||||
clips: "클립"
|
||||
experimentalFeatures: "실험실"
|
||||
developer: "개발자"
|
||||
makeExplorable: "\"발견하기\"에 내 계정 보이기"
|
||||
makeExplorableDescription: "비활성화하면 \"발견하기\"에 나의 계정을 표시하지 않습니다."
|
||||
showGapBetweenNotesInTimeline: "타임라인의 노트 사이를 띄워서 표시"
|
||||
duplicate: "복제"
|
||||
left: "왼쪽"
|
||||
center: "가운데"
|
||||
wide: "넓게"
|
||||
narrow: "좁게"
|
||||
reloadToApplySetting: "이 설정을 적용하려면 페이지를 새로고침해야 합니다. 바로 새로고침하시겠습니까?"
|
||||
showTitlebar: "타이틀 바를 표시하기"
|
||||
clearCache: "캐시 비우기"
|
||||
onlineUsersCount: "{n}명이 접속 중"
|
||||
nUsers: "{n} 유저"
|
||||
nNotes: "{n} 노트"
|
||||
sendErrorReports: "오류 보고서 보내기"
|
||||
sendErrorReportsDescription: "이 설정을 활성화하면, 문제가 발생했을 때 오류에 대한 상세 정보를 Misskey에 보내어 더 나은 소프트웨어를 만드는 데에 도움을 줄 수 있습니다."
|
||||
myTheme: "내 테마"
|
||||
backgroundColor: "배경 색"
|
||||
accentColor: "강조 색상"
|
||||
textColor: "문자 색"
|
||||
saveAs: "다른 이름으로 저장"
|
||||
advanced: "고급"
|
||||
value: "값"
|
||||
updatedAt: "수정한 날짜"
|
||||
saveConfirm: "저장하시겠습니까?"
|
||||
deleteConfirm: "삭제하시겠습니까?"
|
||||
invalidValue: "올바른 값이 아닙니다."
|
||||
registry: "레지스트리"
|
||||
closeAccount: "계정 폐쇄"
|
||||
usageAmount: "사용량"
|
||||
capacity: "용량"
|
||||
inUse: "사용중"
|
||||
editCode: "코드 수정"
|
||||
apply: "적용"
|
||||
_email:
|
||||
_follow:
|
||||
title: "새로운 팔로워가 있습니다"
|
||||
_registry:
|
||||
scope: "범위"
|
||||
key: "키"
|
||||
keys: "키"
|
||||
domain: "도메인"
|
||||
createKey: "키 생성"
|
||||
_aboutMisskey:
|
||||
about: "Misskey는 syuilo에 의해서 2014년부터 개발되어 온 오픈소스 소프트웨어 입니다."
|
||||
contributors: "주요 기여자"
|
||||
allContributors: "모든 기여자"
|
||||
source: "소스 코드"
|
||||
translation: "Misskey를 번역하기"
|
||||
donate: "Misskey에 기부하기"
|
||||
morePatrons: "이 외에도 다른 많은 분들이 도움을 주시고 계십니다. 감사합니다🥰"
|
||||
patrons: "후원자"
|
||||
_nsfw:
|
||||
respect: "열람주의로 설정된 미디어 숨기기"
|
||||
ignore: "열람 주의 미디어 항상 표시"
|
||||
force: "미디어 항상 숨기기"
|
||||
_mfm:
|
||||
cheatSheet: "MFM 도움말"
|
||||
intro: "MFM는 Misskey의 다양한 곳에서 사용할 수 있는 전용 마크업 언어입니다. 여기에서는 MFM에서 사용할 수 있는 구문을 확인할 수 있습니다."
|
||||
dummy: "Misskey로 연합우주의 세계가 펼쳐집니다"
|
||||
mention: "멘션"
|
||||
mentionDescription: "골뱅이표(@) 뒤에 사용자명을 넣어 특정 유저를 나타낼 수 있습니다."
|
||||
hashtag: "해시태그"
|
||||
@ -624,12 +728,16 @@ _mfm:
|
||||
url: "URL"
|
||||
urlDescription: "URL을 나타낼 수 있습니다."
|
||||
link: "링크"
|
||||
linkDescription: "문장의 특정 범위를 URL로 표시합니다."
|
||||
bold: "굵음/볼드체"
|
||||
boldDescription: "문자를 굵게 강조합니다."
|
||||
smallDescription: "내용을 작고 연하게 보이게 합니다."
|
||||
center: "가운데 정렬"
|
||||
centerDescription: "내용을 가운데 정렬로 보이게 합니다."
|
||||
inlineCode: "코드(인라인)"
|
||||
inlineCodeDescription: "여러 행의 코드를 문법 강조를 적용하여 인라인으로 표시합니다."
|
||||
blockCode: "코드(블록)"
|
||||
blockCodeDescription: "여러 행의 코드를 문법 강조를 적용하여 블록으로 표시합니다."
|
||||
inlineMath: "수식(인라인)"
|
||||
inlineMathDescription: "수식(KaTeX)를 인라인으로 보이게 합니다."
|
||||
blockMath: "수식(블록)"
|
||||
@ -642,6 +750,14 @@ _mfm:
|
||||
flip: "플립"
|
||||
flipDescription: "내용을 상하 또는 좌우로 반전시킵니다."
|
||||
jump: "애니메이션(점프)"
|
||||
x2: "크게"
|
||||
x2Description: "내용을 크게 표시합니다."
|
||||
x3: "더 크게"
|
||||
x3Description: "내용을 더 크게 표시합니다."
|
||||
x4: "매우 크게"
|
||||
x4Description: "내용을 매우 크게 표시합니다."
|
||||
font: "폰트"
|
||||
fontDescription: "내용의 글꼴을 지정할 수 있습니다."
|
||||
_reversi:
|
||||
reversi: "리버시"
|
||||
gameSettings: "대국 설정"
|
||||
@ -654,6 +770,8 @@ _reversi:
|
||||
waitingForOther: "상대의 준비가 완료될 때까지 기다리고 있습니다"
|
||||
waitingForMe: "당신의 준비 완료를 기다리고 있습니다"
|
||||
ready: "준비 완료"
|
||||
cancelReady: "준비 취소"
|
||||
opponentTurn: "상대의 차례입니다"
|
||||
myTurn: "당신의 차례입니다"
|
||||
turnOf: "{name}님의 차례입니다"
|
||||
pastTurnOf: "{name}님의 차례"
|
||||
@ -676,11 +794,17 @@ _instanceTicker:
|
||||
none: "보이지 않음"
|
||||
remote: "리모트 유저에게만 보이기"
|
||||
always: "항상 보이기"
|
||||
_serverDisconnectedBehavior:
|
||||
reload: "자동으로 새로고침"
|
||||
dialog: "경고창 표시"
|
||||
quiet: "조용히 경고"
|
||||
_channel:
|
||||
create: "채널 생성"
|
||||
edit: "채널 편집"
|
||||
setBanner: "배너 설정"
|
||||
removeBanner: "배너 삭제"
|
||||
featured: "트렌드"
|
||||
owned: "관리중"
|
||||
following: "팔로잉"
|
||||
usersCount: "{n}명 참여 중"
|
||||
notesCount: "{n}노트"
|
||||
@ -690,6 +814,9 @@ _sidebar:
|
||||
_wordMute:
|
||||
muteWords: "뮤트할 단어"
|
||||
muteWordsDescription: "공백으로 구분하는 경우 AND, 줄바꿈으로 구분하는 경우 OR로 지정됩니다。"
|
||||
muteWordsDescription2: "정규 표현식을 사용하려면 키워드를 빗금표(/)로 감싸 주세요."
|
||||
softDescription: "지정한 조건의 노트를 타임라인에서 숨깁니다."
|
||||
hardDescription: "지정한 조건의 노트를 타임라인에 추가하지 않습니다. 타임라인에 추가되지 않은 노트는 조건을 변경해도 표시되지 않습니다."
|
||||
mutedNotes: "뮤트된 노트"
|
||||
_theme:
|
||||
explore: "테마 찾아보기"
|
||||
@ -697,6 +824,8 @@ _theme:
|
||||
manage: "테마 관리"
|
||||
code: "테마 코드"
|
||||
installed: "{name} 테마가 설치되었습니다"
|
||||
installedThemes: "설치된 테마"
|
||||
builtinThemes: "표준 테마"
|
||||
alreadyInstalled: "이미 설치된 테마입니다"
|
||||
invalid: "테마 형식이 올바르지 않습니다"
|
||||
make: "테마 만들기"
|
||||
@ -711,8 +840,12 @@ _theme:
|
||||
func: "함수"
|
||||
funcKind: "함수 종류"
|
||||
argument: "매개변수"
|
||||
inputConstantName: "상수 이름을 입력하세요"
|
||||
importInfo: "여기에 테마 코드를 붙여 넣어 에디터로 불러올 수 있습니다."
|
||||
deleteConstantConfirm: "상수 {const}를 삭제하시겠습니까?"
|
||||
keys:
|
||||
accent: "강조 색상"
|
||||
panel: "패널"
|
||||
link: "링크"
|
||||
hashtag: "해시태그"
|
||||
mention: "멘션"
|
||||
@ -725,6 +858,9 @@ _sfx:
|
||||
chat: "대화"
|
||||
chatBg: "대화 (백그라운드)"
|
||||
antenna: "안테나 수신"
|
||||
channel: "채널 알림"
|
||||
reversiPutBlack: "리버시: 흑돌을 두었을 때"
|
||||
reversiPutWhite: "리버시: 백돌을 두었을 때"
|
||||
_ago:
|
||||
unknown: "알 수 없음"
|
||||
future: "미래"
|
||||
@ -800,6 +936,8 @@ _permissions:
|
||||
"write:page-likes": "페이지의 좋아요를 추가하거나 삭제합니다"
|
||||
"read:user-groups": "유저 그룹을 조회합니다"
|
||||
"write:user-groups": "유저 그룹을 만들거나, 초대하거나, 이름을 변경하거나, 양도하거나, 삭제합니다"
|
||||
"read:channels": "채널을 보기"
|
||||
"write:channels": "채널을 변경하기"
|
||||
_auth:
|
||||
shareAccess: "\"{name}\" 이 계정에 접근하는 것을 허용하시겠습니까?"
|
||||
shareAccessAsk: "이 애플리케이션이 계정에 접근하는 것을 허용하시겠습니까?"
|
||||
@ -834,6 +972,10 @@ _widgets:
|
||||
digitalClock: "디지털 시계"
|
||||
federation: "연합"
|
||||
postForm: "글 입력란"
|
||||
slideshow: "슬라이드 쇼"
|
||||
button: "버튼"
|
||||
jobQueue: "작업 대기열"
|
||||
serverMetric: "서버 통계"
|
||||
_cw:
|
||||
hide: "숨기기"
|
||||
show: "더 보기"
|
||||
@ -875,6 +1017,7 @@ _visibility:
|
||||
_postForm:
|
||||
replyPlaceholder: "이 노트에 답글..."
|
||||
quotePlaceholder: "이 노트를 인용..."
|
||||
channelPlaceholder: "채널에 게시하기..."
|
||||
_placeholders:
|
||||
a: "지금 무엇을 하고 있나요?"
|
||||
b: "무슨 일이 일어나고 있나요?"
|
||||
@ -995,6 +1138,7 @@ _pages:
|
||||
created: "페이지를 만들었습니다"
|
||||
updated: "페이지를 수정했습니다"
|
||||
deleted: "페이지가 삭제되었습니다"
|
||||
pageSetting: "페이지 설정"
|
||||
nameAlreadyExists: "지정한 페이지 URL이 이미 존재합니다"
|
||||
invalidNameTitle: "유효하지 않은 페이지 URL입니다"
|
||||
invalidNameText: "비어있지 않은지 확인해주세요"
|
||||
@ -1005,6 +1149,7 @@ _pages:
|
||||
unlike: "좋아요 해제"
|
||||
my: "내 페이지"
|
||||
liked: "좋아요한 페이지"
|
||||
featured: "인기"
|
||||
inspector: "인스펙터"
|
||||
contents: "콘텐츠"
|
||||
content: "페이지 블록"
|
||||
@ -1060,7 +1205,10 @@ _pages:
|
||||
id: "캔버스 ID"
|
||||
width: "폭"
|
||||
height: "높이"
|
||||
note: "노트필기"
|
||||
_note:
|
||||
id: "노트 ID"
|
||||
idDescription: "노트 URL을 붙여넣어 설정할 수도 있습니다."
|
||||
detailed: "세부 정보 보기"
|
||||
switch: "스위치"
|
||||
_switch:
|
||||
@ -1303,7 +1451,9 @@ _deck:
|
||||
swapDown: "아래로 이동"
|
||||
stackLeft: "왼쪽에 쌓기"
|
||||
popRight: "오른쪽으로 빼기"
|
||||
profile: "프로파일"
|
||||
_columns:
|
||||
main: "메인"
|
||||
widgets: "위젯"
|
||||
notifications: "알림"
|
||||
tl: "타임라인"
|
||||
|
1345
locales/pl-PL.yml
@ -1,2 +1,31 @@
|
||||
---
|
||||
_lang_: "Português"
|
||||
monthAndDay: "{day}/{month}"
|
||||
search: "Pesquisar"
|
||||
notifications: "Notificações"
|
||||
username: "Nome de usuário"
|
||||
password: "Senha"
|
||||
ok: "OK"
|
||||
cancel: "Cancelar"
|
||||
enterUsername: "Digite o nome de usuário"
|
||||
renotedBy: "Repostado por {user}"
|
||||
settings: "Configurações"
|
||||
basicSettings: "Configurações básicas"
|
||||
otherSettings: "Outras configurações"
|
||||
profile: "Perfil"
|
||||
timeline: "Timeline"
|
||||
smtpUser: "Nome de usuário"
|
||||
smtpPass: "Senha"
|
||||
_mfm:
|
||||
search: "Pesquisar"
|
||||
_sfx:
|
||||
notification: "Notificações"
|
||||
_widgets:
|
||||
notifications: "Notificações"
|
||||
timeline: "Timeline"
|
||||
_profile:
|
||||
username: "Nome de usuário"
|
||||
_deck:
|
||||
_columns:
|
||||
notifications: "Notificações"
|
||||
tl: "Timeline"
|
||||
|
@ -1,5 +1,6 @@
|
||||
---
|
||||
_lang_: "Русский"
|
||||
headlineMisskey: "Сеть, сплетённая из заметок"
|
||||
introMisskey: "Добро пожаловать! Misskey — это децентрализованный сервис микроблогов с открытым исходным кодом.\nПишите «заметки» — делитесь со всеми происходящим вокруг или рассказывайте о себе 📡\nСтавьте «реакции» — выражайте свои чувства и эмоции от заметок других 👍\nОткройте для себя новый мир 🚀"
|
||||
monthAndDay: "{day}.{month}"
|
||||
search: "Поиск"
|
||||
@ -33,6 +34,9 @@ addUser: "Добавить пользователя"
|
||||
favorite: "В избранное"
|
||||
favorites: "Избранное"
|
||||
unfavorite: "Убрать из избранного"
|
||||
favorited: "Добавлено в избранное."
|
||||
alreadyFavorited: "Уже есть в избранном."
|
||||
cantFavorite: "Не удалось добавить в избранное."
|
||||
pin: "Закрепить в профиле"
|
||||
unpin: "Открепить от профиля"
|
||||
copyContent: "Скопировать содержимое"
|
||||
@ -46,6 +50,7 @@ copyUsername: "Скопировать имя пользователя"
|
||||
searchUser: "Поиск людей"
|
||||
reply: "Ответить"
|
||||
loadMore: "Показать еще"
|
||||
showMore: "Показать еще"
|
||||
youGotNewFollower: "Новый подписчик"
|
||||
receiveFollowRequest: "Получен запрос на подписку"
|
||||
followRequestAccepted: "Запрос на подписку принят"
|
||||
@ -87,8 +92,12 @@ followRequestPending: "Нерассмотренный запрос на подп
|
||||
enterEmoji: "Введите эмодзи"
|
||||
renote: "Репост"
|
||||
unrenote: "Отмена репоста"
|
||||
renoted: "Репост совершён."
|
||||
cantRenote: "Это нельзя репостить."
|
||||
cantReRenote: "Невозможно репостить репост."
|
||||
quote: "Цитата"
|
||||
pinnedNote: "Закреплённая заметка"
|
||||
pinned: "Закрепить в профиле"
|
||||
you: "Вы"
|
||||
clickToShow: "Нажмите для просмотра"
|
||||
sensitive: "Содержимое не для всех"
|
||||
@ -429,6 +438,7 @@ signinWith: "Использовать {x} для входа"
|
||||
signinFailed: "Невозможно войти в систему. Введенное вами имя пользователя или пароль неверны."
|
||||
tapSecurityKey: "Нажмите на свой электронный ключ"
|
||||
or: "или"
|
||||
language: "Язык"
|
||||
uiLanguage: "Язык интерфейса"
|
||||
groupInvited: "Приглашение в группу"
|
||||
aboutX: "Описание {x}"
|
||||
@ -442,7 +452,7 @@ doing: "В процессе"
|
||||
category: "Категория"
|
||||
tags: "Метки"
|
||||
docSource: "Источник документа"
|
||||
createAccount: "Новый аккаунт"
|
||||
createAccount: "Новая учётная запись"
|
||||
existingAcount: "Уже существующий"
|
||||
regenerate: "Создать повторно"
|
||||
fontSize: "Размер шрифта"
|
||||
@ -540,7 +550,6 @@ author: "Автор"
|
||||
leaveConfirm: "Вы не сохранили изменения. Хотите выйти и потерять их?"
|
||||
manage: "Управление"
|
||||
plugins: "Расширения"
|
||||
pluginInstallWarn: "Пожалуста, не устанавливайте расширения, которым не доверяете"
|
||||
deck: "Пульт"
|
||||
undeck: "Покинуть пульт"
|
||||
useBlurEffectForModal: "Размывка под формой поверх всего"
|
||||
@ -555,7 +564,7 @@ permission: "Разрешения"
|
||||
enableAll: "Включить все"
|
||||
disableAll: "Выключить всё"
|
||||
tokenRequested: "Открыть доступ к учётной записи"
|
||||
pluginTokenRequestedDescription: "Этот плагин сможет пользоваться разрешениями, установленными здесь."
|
||||
pluginTokenRequestedDescription: "Это расширение сможет пользоваться разрешениями, установленными здесь."
|
||||
notificationType: "Тип уведомления"
|
||||
edit: "Изменить"
|
||||
useStarForReactionFallback: "Ставить ★ в качестве реакции вместо неизвестного эмодзи"
|
||||
@ -655,6 +664,66 @@ useSystemFont: "Использовать шрифт, предлагаемый с
|
||||
clips: "Памятки"
|
||||
experimentalFeatures: "Экспериментальные функции"
|
||||
developer: "Разработчик"
|
||||
makeExplorable: "Опубликовать профиль в «Обзоре»."
|
||||
makeExplorableDescription: "Если выключить, ваш профиль не будет показан в разделе «Обзор»."
|
||||
showGapBetweenNotesInTimeline: "Показывать разделитель между заметками в ленте"
|
||||
duplicate: "Дубликат"
|
||||
left: "Влево"
|
||||
center: "По центру"
|
||||
wide: "Толстый"
|
||||
narrow: "Тонкий"
|
||||
reloadToApplySetting: "Это настройка вступает в силу при загрузке страницы. Перезагрузить сейчас?"
|
||||
showTitlebar: "Показать заголовок"
|
||||
clearCache: "Очистить кэш"
|
||||
onlineUsersCount: "Пользователей сейчас в сети: {n}"
|
||||
nUsers: "Пользователей: {n}"
|
||||
nNotes: "Заметок: {n}"
|
||||
sendErrorReports: "Посылать отчёты о сбоях"
|
||||
sendErrorReportsDescription: "Если включено, когда возникнет какая-нибудь техническая проблема, подробные сведения об этом будут отправлены разработчикам Misskey. Это очень помогает делать программу лучше. В отчёты попадают тип и версия ОС, браузера, журнал действий (что привело к сбою) и тому подобное."
|
||||
myTheme: "Личная тема"
|
||||
backgroundColor: "Фон"
|
||||
accentColor: "Акцент"
|
||||
textColor: "Текст"
|
||||
saveAs: "Сохранить под названием…"
|
||||
advanced: "Для продвинутых"
|
||||
value: "Значения"
|
||||
updatedAt: "Обновлено"
|
||||
saveConfirm: "Сохранить изменения?"
|
||||
deleteConfirm: "Удалить?"
|
||||
invalidValue: "Недопустимое значение."
|
||||
registry: "Реестр"
|
||||
closeAccount: "Закрыть учётную запись"
|
||||
currentVersion: "Используемая версия"
|
||||
latestVersion: "Самая свежая версия"
|
||||
youAreRunningUpToDateClient: "У вас самая свежая версия клиента."
|
||||
newVersionOfClientAvailable: "Доступна более свежая версия клиента."
|
||||
usageAmount: "Использовано"
|
||||
capacity: "Ёмкость"
|
||||
inUse: "Занято"
|
||||
editCode: "Редактировать исходный текст"
|
||||
apply: "Применить"
|
||||
receiveAnnouncementFromInstance: "Получать оповещения с инстанса"
|
||||
emailNotification: "Уведомления по электронной почте"
|
||||
inChannelSearch: "Поиск по каналу"
|
||||
useReactionPickerForContextMenu: "Открывать палитру реакций правой кнопкой"
|
||||
typingUsers: "Стук клавиш. Это {users}…"
|
||||
jumpToSpecifiedDate: "Перейти к заданной дате"
|
||||
showingPastTimeline: "Отображается старая лента"
|
||||
_email:
|
||||
_follow:
|
||||
title: "Новый подписчик"
|
||||
_receiveFollowRequest:
|
||||
title: "Новый запрос на подписку."
|
||||
_plugin:
|
||||
install: "Установка расширений"
|
||||
installWarn: "Пожалуйста, не устанавливайте расширения, которым не доверяете."
|
||||
manage: "Управление расширениями"
|
||||
_registry:
|
||||
scope: "Область"
|
||||
key: "Ключ"
|
||||
keys: "Ключ"
|
||||
domain: "Домен"
|
||||
createKey: "Новый ключ"
|
||||
_aboutMisskey:
|
||||
about: "Misskey — программа с открытым исходным кодом, которую разрабатывает syuilo с 2014 года."
|
||||
contributors: "Основные соавторы"
|
||||
@ -670,7 +739,7 @@ _nsfw:
|
||||
force: "Скрывать вообще все файлы"
|
||||
_mfm:
|
||||
cheatSheet: "Подсказка по разметке MFM"
|
||||
intro: "MFM — язык оформления текста, придуманный специально для Misskey, который здесь можно много где использовать. На этой странице собраны и кратко изложены способы его применения."
|
||||
intro: "MFM — язык оформления текста, который придуман специально для Misskey и готов для применения во многих местах. На этой странице собраны и кратко изложены способы его использовать."
|
||||
dummy: "Misskey расширяет границы Федиверса."
|
||||
mention: "Упоминание"
|
||||
mentionDescription: "При помощи знака «собака» перед именем можно упомянуть какого-нибудь пользователя."
|
||||
@ -716,6 +785,16 @@ _mfm:
|
||||
twitchDescription: "Заставляет трястись как одержимого"
|
||||
spin: "Вращение"
|
||||
spinDescription: "Так можно крутить содержимое в разных направлениях."
|
||||
x2: "Крупный шрифт"
|
||||
x2Description: "Увеличивает содержимое."
|
||||
x3: "Ещё крупнее"
|
||||
x3Description: "Сильнее увеличивает содержимое."
|
||||
x4: "Совсем крупно"
|
||||
x4Description: "Увеличивает содержимое совсем сильно."
|
||||
blur: "Размытие"
|
||||
blurDescription: "Размывает текст до нечитаемости, будто его поместили за матовое стекло. Наведение указателя мыши на размытый текст возвращает чёткость."
|
||||
font: "Шрифт"
|
||||
fontDescription: "Так можно писать произвольным шрифтом."
|
||||
_reversi:
|
||||
reversi: "Реверси"
|
||||
gameSettings: "Настройки игры"
|
||||
@ -975,6 +1054,11 @@ _widgets:
|
||||
federation: "Федерация"
|
||||
postForm: "Форма отправки"
|
||||
slideshow: "Показ слайдов"
|
||||
button: "Кнопка"
|
||||
onlineUsers: "Пользователи сейчас с сети"
|
||||
jobQueue: "Очередь заданий"
|
||||
serverMetric: "Показатели сервера"
|
||||
aiscript: "Консоль AiScript"
|
||||
_cw:
|
||||
hide: "Спрятать"
|
||||
show: "Показать еще"
|
||||
@ -1457,6 +1541,8 @@ _notification:
|
||||
_deck:
|
||||
alwaysShowMainColumn: "Всегда показывать главную колонку"
|
||||
columnAlign: "Выравнивание колонок"
|
||||
columnMargin: "Расстояние между колонками"
|
||||
columnHeaderHeight: "Высота заголовка колонки"
|
||||
addColumn: "Добавить колонку"
|
||||
swapLeft: "Переставить левее"
|
||||
swapRight: "Переставить правее"
|
||||
@ -1464,7 +1550,9 @@ _deck:
|
||||
swapDown: "Переставить ниже"
|
||||
stackLeft: "В столбик влево"
|
||||
popRight: "Из столбика вправо"
|
||||
profile: "Профиль"
|
||||
_columns:
|
||||
main: "Основная"
|
||||
widgets: "Виджеты"
|
||||
notifications: "Уведомления"
|
||||
tl: "Лента"
|
||||
|
1
locales/th-TH.yml
Normal file
@ -0,0 +1 @@
|
||||
---
|
@ -1,5 +1,6 @@
|
||||
---
|
||||
_lang_: "中文(简体)"
|
||||
headlineMisskey: "通过帖子连接在一起的网络"
|
||||
introMisskey: "欢迎!Misskey是一个开源的、去中心化的“微博客”服务。\n通过编写「帖文」来和大家分享你的以及你周围的事情吧!📡\n通过「回应」功能,可以让你快速地对大家的帖文表达反馈👍\n来探索新的世界吧!🚀"
|
||||
monthAndDay: "{month}月 {day}日"
|
||||
search: "搜索"
|
||||
@ -11,8 +12,8 @@ ok: "OK"
|
||||
gotIt: "我明白了"
|
||||
cancel: "取消"
|
||||
enterUsername: "输入用户名"
|
||||
renotedBy: "{user} 转贴了"
|
||||
noNotes: "没有帖文"
|
||||
renotedBy: "{user} 转发了"
|
||||
noNotes: "没有帖子"
|
||||
noNotifications: "无通知"
|
||||
instance: "实例"
|
||||
settings: "设置"
|
||||
@ -33,6 +34,9 @@ addUser: "添加用户"
|
||||
favorite: "收藏"
|
||||
favorites: "收藏"
|
||||
unfavorite: "取消收藏"
|
||||
favorited: "已加入收藏夹。"
|
||||
alreadyFavorited: "收藏夹中已存在。"
|
||||
cantFavorite: "无法添加到收藏夹。"
|
||||
pin: "置顶"
|
||||
unpin: "取消置顶"
|
||||
copyContent: "复制内容"
|
||||
@ -46,6 +50,7 @@ copyUsername: "复制用户名"
|
||||
searchUser: "搜索用户"
|
||||
reply: "回复"
|
||||
loadMore: "查看更多"
|
||||
showMore: "查看更多"
|
||||
youGotNewFollower: "你有新的关注者"
|
||||
receiveFollowRequest: "您收到了关注请求"
|
||||
followRequestAccepted: "您的关注请求被通过了"
|
||||
@ -87,28 +92,32 @@ followRequestPending: "发送关注申请"
|
||||
enterEmoji: "输入表情符号"
|
||||
renote: "转发"
|
||||
unrenote: "取消转发"
|
||||
renoted: "已转发。"
|
||||
cantRenote: "该帖子无法转发。"
|
||||
cantReRenote: "转发无法被再次转发。"
|
||||
quote: "引用"
|
||||
pinnedNote: "已置顶的帖子"
|
||||
pinned: "置顶"
|
||||
you: "您"
|
||||
clickToShow: "点击以显示"
|
||||
sensitive: "阅读注意"
|
||||
sensitive: "敏感内容"
|
||||
add: "添加"
|
||||
reaction: "回应"
|
||||
reactionSettingDescription: "选择您想要置顶的回应。"
|
||||
reactionSettingDescription2: "拖动重新排序,单击删除,点击 + 添加。"
|
||||
rememberNoteVisibility: "记录公开范围"
|
||||
attachCancel: "删除附件"
|
||||
markAsSensitive: "阅读注意"
|
||||
markAsSensitive: "标记为敏感内容"
|
||||
unmarkAsSensitive: "取消标记为敏感内容"
|
||||
enterFileName: "请输入文件名"
|
||||
mute: "屏蔽"
|
||||
unmute: "解除屏蔽"
|
||||
block: "屏蔽"
|
||||
unblock: "取消屏蔽"
|
||||
block: "拉黑"
|
||||
unblock: "取消拉黑"
|
||||
suspend: "冻结"
|
||||
unsuspend: "解除冻结"
|
||||
blockConfirm: "确定要屏蔽吗?"
|
||||
unblockConfirm: "确定要解除屏蔽吗?"
|
||||
blockConfirm: "确定要拉黑吗?"
|
||||
unblockConfirm: "确定要解除拉黑吗?"
|
||||
suspendConfirm: "要冻结吗?"
|
||||
unsuspendConfirm: "要解除冻结吗?"
|
||||
selectList: "选择列表"
|
||||
@ -116,7 +125,7 @@ selectAntenna: "天线选择"
|
||||
selectWidget: "选择小工具"
|
||||
editWidgets: "编辑小工具"
|
||||
editWidgetsExit: "完成编辑"
|
||||
customEmojis: "自定义Emoji"
|
||||
customEmojis: "自定义表情符号"
|
||||
emoji: "表情符号"
|
||||
emojiName: "表情符号名称"
|
||||
emojiUrl: "表情符号地址"
|
||||
@ -177,21 +186,21 @@ clearCachedFilesConfirm: "确定要清除缓存文件?"
|
||||
blockedInstances: "被阻拦的实例"
|
||||
blockedInstancesDescription: "设定要阻拦的实例,以换行来进行分割。被阻拦的实例将无法与本实例进行交换通讯。"
|
||||
muteAndBlock: "屏蔽/拉黑"
|
||||
mutedUsers: "禁言用户"
|
||||
blockedUsers: "已屏蔽用户"
|
||||
mutedUsers: "已屏蔽用户"
|
||||
blockedUsers: "被拉黑的用户"
|
||||
noUsers: "无用户"
|
||||
editProfile: "编辑资料"
|
||||
noteDeleteConfirm: "要删除该帖子吗?"
|
||||
pinLimitExceeded: "无法置顶更多了"
|
||||
intro: "Misskey的部署结束啦!填写管理员账号吧!"
|
||||
done: "完成"
|
||||
processing: "处理中"
|
||||
processing: "正在处理"
|
||||
preview: "预览"
|
||||
default: "默认"
|
||||
noCustomEmojis: "没有自定义表情符号"
|
||||
noJobs: "没有任务"
|
||||
federating: "联合中"
|
||||
blocked: "已拦截"
|
||||
blocked: "已拉黑"
|
||||
suspended: "停止推流"
|
||||
all: "全部"
|
||||
subscribing: "已订阅"
|
||||
@ -276,7 +285,7 @@ copyUrl: "复制链接"
|
||||
rename: "重命名"
|
||||
avatar: "头像"
|
||||
banner: "Banner"
|
||||
nsfw: "阅读注意"
|
||||
nsfw: "敏感内容"
|
||||
whenServerDisconnected: "与服务器连接中断时"
|
||||
disconnectedFromServer: "已从服务器断开连接"
|
||||
reload: "重新加载"
|
||||
@ -300,7 +309,7 @@ monthX: "{month}月"
|
||||
yearX: "{year}年"
|
||||
pages: "页面"
|
||||
integration: "关联"
|
||||
connectSerice: "已连接"
|
||||
connectSerice: "连接"
|
||||
disconnectSerice: "断开连接"
|
||||
enableLocalTimeline: "启用本地时间线功能"
|
||||
enableGlobalTimeline: "启用全局时间线"
|
||||
@ -312,7 +321,7 @@ proxyRemoteFiles: "代理远程文件"
|
||||
proxyRemoteFilesDescription: "启用此设置后,由于超出存储容量而导致未保存被删除的远程文件将被本地代理,并且会生成缩略图。不会影响服务器的存储。"
|
||||
driveCapacityPerLocalAccount: "每个用户的网盘空间"
|
||||
driveCapacityPerRemoteAccount: "每个远程用户的网盘容量"
|
||||
inMb: "以兆字节(Mbps)为单位"
|
||||
inMb: "以兆字节(MegaByte)为单位"
|
||||
iconUrl: "图标URL"
|
||||
bannerUrl: "Banner URL"
|
||||
basicInfo: "基本信息"
|
||||
@ -429,6 +438,7 @@ signinWith: "以{x}登录"
|
||||
signinFailed: "无法登录,请检查您的用户名和密码。"
|
||||
tapSecurityKey: "轻触硬件安全密钥"
|
||||
or: "或者"
|
||||
language: "语言"
|
||||
uiLanguage: "显示语言"
|
||||
groupInvited: "群组招待"
|
||||
aboutX: "关于 {x}"
|
||||
@ -464,7 +474,7 @@ hideThisNote: "隐藏这条帖子"
|
||||
showFeaturedNotesInTimeline: "在时间线上显示热门推荐"
|
||||
objectStorage: "对象存储"
|
||||
useObjectStorage: "使用对象存储"
|
||||
objectStorageBaseUrl: "基本网址"
|
||||
objectStorageBaseUrl: "Base URL"
|
||||
objectStorageBaseUrlDesc: "URL前缀,用于构造URL到对象(媒体)的引用,如果您使用的是CDN或反向代理,请指定其URL,否则请根据您使用的服务指定可公开访问的地址。例如“https://<bucket>.s3.amazonaws.com”用于AWS S3,“https://storage.googleapis.com/<bucket>”用于GCS"
|
||||
objectStorageBucket: "存储桶"
|
||||
objectStorageBucketDesc: "请指定使用的对象存储服务的存储桶名称。"
|
||||
@ -518,7 +528,7 @@ userSuspended: "该用户已被冻结。"
|
||||
userSilenced: "该用户已被禁言。"
|
||||
sidebar: "侧边栏"
|
||||
divider: "分割线"
|
||||
addItem: "添加项"
|
||||
addItem: "添加项目"
|
||||
rooms: "房间"
|
||||
relays: "中继"
|
||||
addRelay: "添加中继"
|
||||
@ -533,14 +543,13 @@ poll: "调查问卷"
|
||||
useCw: "隐藏内容"
|
||||
enablePlayer: "打开播放器"
|
||||
disablePlayer: "关闭播放器"
|
||||
expandTweet: "展开推文"
|
||||
expandTweet: "展开贴文"
|
||||
themeEditor: "主题编辑器"
|
||||
description: "描述"
|
||||
author: "作者"
|
||||
leaveConfirm: "存在未保存的更改。要放弃更改吗?"
|
||||
manage: "管理"
|
||||
plugins: "插件"
|
||||
pluginInstallWarn: "请不要安装不明来源的插件"
|
||||
deck: "Deck"
|
||||
undeck: "取消Deck"
|
||||
useBlurEffectForModal: "模态框使用模糊效果"
|
||||
@ -570,7 +579,7 @@ smtpPort: "端口"
|
||||
smtpUser: "用户名"
|
||||
smtpPass: "密码"
|
||||
emptyToDisableSmtpAuth: "用户名和密码留空可以禁用SMTP验证"
|
||||
smtpSecure: "在 SMTP 连接中使用隐式 SSL / TLS"
|
||||
smtpSecure: "在 SMTP 连接中默认使用 SSL / TLS"
|
||||
smtpSecureInfo: "使用STARTTLS时关闭。"
|
||||
testEmail: "邮件发送测试"
|
||||
wordMute: "文字屏蔽"
|
||||
@ -629,18 +638,18 @@ repliedCount: "回复数"
|
||||
renotedCount: "转发数"
|
||||
followingCount: "正在关注数量"
|
||||
followersCount: "关注者数量"
|
||||
sentReactionsCount: "发送反应数"
|
||||
receivedReactionsCount: "收到反应数"
|
||||
pollVotesCount: "发起投票数"
|
||||
pollVotedCount: "已投票数"
|
||||
yes: "确定"
|
||||
no: "取消"
|
||||
sentReactionsCount: "发送回应数"
|
||||
receivedReactionsCount: "收到回应数"
|
||||
pollVotesCount: "问卷调查的投票数"
|
||||
pollVotedCount: "问卷调查的被投票数"
|
||||
yes: "是"
|
||||
no: "否"
|
||||
driveFilesCount: "磁盘文件数"
|
||||
driveUsage: "磁盘空间用量"
|
||||
noCrawle: "拒绝搜索器的索引"
|
||||
noCrawleDescription: "要求搜索引擎不要收录(索引)您的用户页面,帖子,页面等。"
|
||||
lockedAccountInfo: "即使通过了关注请求,只要您不将帖子可见范围设置成“关注者”,任何人都可以看到您的帖子。"
|
||||
alwaysMarkSensitive: "浏览默认媒体文件时请谨慎"
|
||||
alwaysMarkSensitive: "默认将媒体文件标记为敏感内容"
|
||||
loadRawImages: "添加附件图像的缩略图时使用原始图像质量"
|
||||
disableShowingAnimatedImages: "不播放动画"
|
||||
verificationEmailSent: "已发送确认电子邮件。请访问电子邮件中的链接以完成设置。"
|
||||
@ -655,6 +664,67 @@ useSystemFont: "使用系统默认字体"
|
||||
clips: "片段"
|
||||
experimentalFeatures: "实验性功能"
|
||||
developer: "开发者"
|
||||
makeExplorable: "使账号可见。"
|
||||
makeExplorableDescription: "关闭时,账号不会显示在\"发现\"中。"
|
||||
showGapBetweenNotesInTimeline: "时间线上的帖子分开显示。"
|
||||
duplicate: "复制"
|
||||
left: "左"
|
||||
center: "中央"
|
||||
wide: "宽"
|
||||
narrow: "窄"
|
||||
reloadToApplySetting: "页面刷新后设置才会生效。是否现在刷新页面?"
|
||||
showTitlebar: "显示标题栏"
|
||||
clearCache: "清除缓存"
|
||||
onlineUsersCount: "{n}人在线"
|
||||
nUsers: "{n}用户"
|
||||
nNotes: "{n}帖子"
|
||||
sendErrorReports: "发送错误报告"
|
||||
sendErrorReportsDescription: "启用后,如果出现问题,可以与Misskey共享详细的错误信息,从而帮助提高软件的质量。"
|
||||
myTheme: "我的主题"
|
||||
backgroundColor: "背景"
|
||||
accentColor: "强调色"
|
||||
textColor: "文本"
|
||||
saveAs: "另存为"
|
||||
advanced: "高级"
|
||||
value: "值"
|
||||
updatedAt: "更新时间"
|
||||
saveConfirm: "确定保存?"
|
||||
deleteConfirm: "确定删除?"
|
||||
invalidValue: "无效值。"
|
||||
registry: "注册表"
|
||||
closeAccount: "关闭账户"
|
||||
currentVersion: "当前版本"
|
||||
latestVersion: "最新版本"
|
||||
youAreRunningUpToDateClient: "您所使用的客户端已经是最新的。"
|
||||
newVersionOfClientAvailable: "新版本的客户端可用。"
|
||||
usageAmount: "使用量"
|
||||
capacity: "容量"
|
||||
inUse: "已使用"
|
||||
editCode: "编辑代码"
|
||||
apply: "应用"
|
||||
receiveAnnouncementFromInstance: "从实例接收通知"
|
||||
emailNotification: "邮件通知"
|
||||
inChannelSearch: "频道内搜索"
|
||||
useReactionPickerForContextMenu: "单击右键打开回应工具栏"
|
||||
typingUsers: "{users}正在输入"
|
||||
jumpToSpecifiedDate: "跳转到特定日期"
|
||||
showingPastTimeline: "显示过去的时间线"
|
||||
clear: "清除"
|
||||
_email:
|
||||
_follow:
|
||||
title: "你有新的关注者"
|
||||
_receiveFollowRequest:
|
||||
title: "收到关注请求"
|
||||
_plugin:
|
||||
install: "安装插件"
|
||||
installWarn: "请不要安装不可信的插件。"
|
||||
manage: "管理插件..."
|
||||
_registry:
|
||||
scope: "范围"
|
||||
key: "主要"
|
||||
keys: "主要"
|
||||
domain: "域"
|
||||
createKey: "创建键"
|
||||
_aboutMisskey:
|
||||
about: "Misskey是由syuilo于2014年开发的开源软件。"
|
||||
contributors: "主要贡献者"
|
||||
@ -665,8 +735,8 @@ _aboutMisskey:
|
||||
morePatrons: "还有很多其他的人也在支持我们,非常感谢🥰"
|
||||
patrons: "支持者"
|
||||
_nsfw:
|
||||
respect: "隐藏NSFW内容"
|
||||
ignore: "不隐藏NSFW内容"
|
||||
respect: "隐藏敏感内容"
|
||||
ignore: "不隐藏敏感内容"
|
||||
force: "总是隐藏内容"
|
||||
_mfm:
|
||||
cheatSheet: "MFM代码速查表"
|
||||
@ -716,6 +786,16 @@ _mfm:
|
||||
twitchDescription: "显示强烈颤抖的动画效果。"
|
||||
spin: "动画(回转)"
|
||||
spinDescription: "显示回转的动画效果。"
|
||||
x2: "大"
|
||||
x2Description: "以大尺寸显示内容。"
|
||||
x3: "非常大"
|
||||
x3Description: "以更大尺寸显示内容。"
|
||||
x4: "最大"
|
||||
x4Description: "以最大尺寸显示内容。"
|
||||
blur: "模糊"
|
||||
blurDescription: "产生模糊效果。将鼠标指针放在上面即可将内容显示出来。"
|
||||
font: "字体"
|
||||
fontDescription: "可以设置内容所使用的字体。"
|
||||
_reversi:
|
||||
reversi: "黑白棋"
|
||||
gameSettings: "对局设置"
|
||||
@ -775,7 +855,7 @@ _wordMute:
|
||||
muteWords: "禁用词"
|
||||
muteWordsDescription: "使用空格分隔表示AND逻辑,使用换行符分隔表示OR逻辑。"
|
||||
muteWordsDescription2: "将关键字用斜线括起来表示正则表达式。"
|
||||
softDescription: "隐藏时间轴中指定条件的帖文。"
|
||||
softDescription: "隐藏时间线中指定条件的帖文。"
|
||||
hardDescription: "防止将具有指定条件的帖文添加到时间线。 即使您更改条件,未添加的帖文也会被排除在外。"
|
||||
soft: "软屏蔽"
|
||||
hard: "硬屏蔽"
|
||||
@ -840,8 +920,8 @@ _theme:
|
||||
cwBg: "CW 按钮背景"
|
||||
cwFg: "CW 按钮文本"
|
||||
cwHoverBg: "CW 按钮背景(悬停)"
|
||||
toastBg: "吐司提示背景"
|
||||
toastFg: "吐司提示文本"
|
||||
toastBg: "吐司通知背景"
|
||||
toastFg: "吐司通知文本"
|
||||
buttonBg: "按钮背景"
|
||||
buttonHoverBg: "按钮背景(悬停)"
|
||||
inputBorder: "输入框边框"
|
||||
@ -906,7 +986,7 @@ _2fa:
|
||||
alreadyRegistered: "此设备已被注册"
|
||||
registerDevice: "注册设备"
|
||||
registerKey: "注册密钥"
|
||||
step1: "首先,在您的设备上安装二步验证应用程序,例如{a}或{b}。"
|
||||
step1: "首先,在您的设备上安装验证应用,例如{a}或{b}。"
|
||||
step2: "然后,扫描屏幕上显示的二维码。"
|
||||
step3: "输入您的应用提供的动态口令以完成设置。"
|
||||
step4: "从现在开始,任何登录操作都将要求您提供动态口令。"
|
||||
@ -975,6 +1055,11 @@ _widgets:
|
||||
federation: "联邦宇宙"
|
||||
postForm: "投稿窗口"
|
||||
slideshow: "幻灯片展示"
|
||||
button: "按钮"
|
||||
onlineUsers: "在线用户"
|
||||
jobQueue: "作业队列"
|
||||
serverMetric: "服务器指标"
|
||||
aiscript: "AiScript控制台"
|
||||
_cw:
|
||||
hide: "隐藏"
|
||||
show: "查看更多"
|
||||
@ -1040,7 +1125,7 @@ _exportOrImport:
|
||||
allNotes: "所有帖子"
|
||||
followingList: "关注中"
|
||||
muteList: "屏蔽"
|
||||
blockingList: "屏蔽"
|
||||
blockingList: "拉黑"
|
||||
userLists: "列表"
|
||||
_charts:
|
||||
federationInstancesIncDec: "联合:增加/减少"
|
||||
@ -1449,7 +1534,7 @@ _notification:
|
||||
renote: "转发"
|
||||
quote: "引用"
|
||||
reaction: "回应"
|
||||
pollVote: "问卷调查已投票"
|
||||
pollVote: "问卷调查被投票"
|
||||
receiveFollowRequest: "收到关注请求"
|
||||
followRequestAccepted: "关注请求已接受"
|
||||
groupInvited: "加入群组邀请"
|
||||
@ -1457,6 +1542,8 @@ _notification:
|
||||
_deck:
|
||||
alwaysShowMainColumn: "总是显示主列"
|
||||
columnAlign: "列对齐"
|
||||
columnMargin: "列间距"
|
||||
columnHeaderHeight: "列标题高度"
|
||||
addColumn: "添加列"
|
||||
swapLeft: "向左移动"
|
||||
swapRight: "向右移动"
|
||||
@ -1464,7 +1551,9 @@ _deck:
|
||||
swapDown: "向下移动"
|
||||
stackLeft: "向左折叠"
|
||||
popRight: "向右弹出"
|
||||
profile: "个人资料"
|
||||
_columns:
|
||||
main: "主列"
|
||||
widgets: "小工具"
|
||||
notifications: "通知"
|
||||
tl: "时间线"
|
||||
|
18
migration/1607353487793-isExplorable.ts
Normal file
@ -0,0 +1,18 @@
|
||||
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||
|
||||
export class isExplorable1607353487793 implements MigrationInterface {
|
||||
name = 'isExplorable1607353487793'
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query(`ALTER TABLE "user" ADD "isExplorable" boolean NOT NULL DEFAULT true`);
|
||||
await queryRunner.query(`COMMENT ON COLUMN "user"."isExplorable" IS 'Whether the User is explorable.'`);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_d5a1b83c7cab66f167e6888188" ON "user" ("isExplorable") `);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query(`DROP INDEX "IDX_d5a1b83c7cab66f167e6888188"`);
|
||||
await queryRunner.query(`COMMENT ON COLUMN "user"."isExplorable" IS 'Whether the User is explorable.'`);
|
||||
await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "isExplorable"`);
|
||||
}
|
||||
|
||||
}
|
22
migration/1610277136869-registry.ts
Normal file
@ -0,0 +1,22 @@
|
||||
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||
|
||||
export class registry1610277136869 implements MigrationInterface {
|
||||
name = 'registry1610277136869'
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query(`CREATE TABLE "registry_item" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "key" character varying(1024) NOT NULL, "scope" character varying(1024) array NOT NULL DEFAULT '{}'::varchar[], "domain" character varying(512), CONSTRAINT "PK_64b3f7e6008b4d89b826cd3af95" PRIMARY KEY ("id")); COMMENT ON COLUMN "registry_item"."createdAt" IS 'The created date of the RegistryItem.'; COMMENT ON COLUMN "registry_item"."updatedAt" IS 'The updated date of the RegistryItem.'; COMMENT ON COLUMN "registry_item"."userId" IS 'The owner ID.'; COMMENT ON COLUMN "registry_item"."key" IS 'The key of the RegistryItem.'`);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_fb9d21ba0abb83223263df6bcb" ON "registry_item" ("userId") `);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_22baca135bb8a3ea1a83d13df3" ON "registry_item" ("scope") `);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_0a72bdfcdb97c0eca11fe7ecad" ON "registry_item" ("domain") `);
|
||||
await queryRunner.query(`ALTER TABLE "registry_item" ADD CONSTRAINT "FK_fb9d21ba0abb83223263df6bcb3" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query(`ALTER TABLE "registry_item" DROP CONSTRAINT "FK_fb9d21ba0abb83223263df6bcb3"`);
|
||||
await queryRunner.query(`DROP INDEX "IDX_0a72bdfcdb97c0eca11fe7ecad"`);
|
||||
await queryRunner.query(`DROP INDEX "IDX_22baca135bb8a3ea1a83d13df3"`);
|
||||
await queryRunner.query(`DROP INDEX "IDX_fb9d21ba0abb83223263df6bcb"`);
|
||||
await queryRunner.query(`DROP TABLE "registry_item"`);
|
||||
}
|
||||
|
||||
}
|
16
migration/1610277585759-registry2.ts
Normal file
@ -0,0 +1,16 @@
|
||||
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||
|
||||
export class registry21610277585759 implements MigrationInterface {
|
||||
name = 'registry21610277585759'
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query(`ALTER TABLE "registry_item" ADD "value" jsonb NOT NULL DEFAULT '{}'`);
|
||||
await queryRunner.query(`COMMENT ON COLUMN "registry_item"."value" IS 'The value of the RegistryItem.'`);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query(`COMMENT ON COLUMN "registry_item"."value" IS 'The value of the RegistryItem.'`);
|
||||
await queryRunner.query(`ALTER TABLE "registry_item" DROP COLUMN "value"`);
|
||||
}
|
||||
|
||||
}
|
14
migration/1610283021566-registry3.ts
Normal file
@ -0,0 +1,14 @@
|
||||
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||
|
||||
export class registry31610283021566 implements MigrationInterface {
|
||||
name = 'registry31610283021566'
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query(`ALTER TABLE "registry_item" ALTER COLUMN "value" DROP NOT NULL`);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query(`ALTER TABLE "registry_item" ALTER COLUMN "value" SET NOT NULL`);
|
||||
}
|
||||
|
||||
}
|
16
migration/1611354329133-followersUri.ts
Normal file
@ -0,0 +1,16 @@
|
||||
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||
|
||||
export class followersUri1611354329133 implements MigrationInterface {
|
||||
name = 'followersUri1611354329133'
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query(`ALTER TABLE "user" ADD "followersUri" varchar(512) DEFAULT NULL`);
|
||||
await queryRunner.query(`COMMENT ON COLUMN "user"."followersUri" IS 'The URI of the user Follower Collection. It will be null if the origin of the user is local.'`);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query(`COMMENT ON COLUMN "user"."followersUri" IS 'The URI of the user Follower Collection. It will be null if the origin of the user is local.'`);
|
||||
await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "followersUri"`);
|
||||
}
|
||||
|
||||
}
|
14
migration/1611547387175-objectStorageS3ForcePathStyle.ts
Normal file
@ -0,0 +1,14 @@
|
||||
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||
|
||||
export class objectStorageS3ForcePathStyle1611547387175 implements MigrationInterface {
|
||||
name = 'objectStorageS3ForcePathStyle1611547387175'
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query(`ALTER TABLE "meta" ADD "objectStorageS3ForcePathStyle" boolean NOT NULL DEFAULT true`);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "objectStorageS3ForcePathStyle"`);
|
||||
}
|
||||
|
||||
}
|
14
migration/1612619156584-announcement-email.ts
Normal file
@ -0,0 +1,14 @@
|
||||
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||
|
||||
export class announcementEmail1612619156584 implements MigrationInterface {
|
||||
name = 'announcementEmail1612619156584'
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query(`ALTER TABLE "user_profile" ADD "receiveAnnouncementEmail" boolean NOT NULL DEFAULT true`);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "receiveAnnouncementEmail"`);
|
||||
}
|
||||
|
||||
}
|
14
migration/1613155914446-emailNotificationTypes.ts
Normal file
@ -0,0 +1,14 @@
|
||||
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||
|
||||
export class emailNotificationTypes1613155914446 implements MigrationInterface {
|
||||
name = 'emailNotificationTypes1613155914446'
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query(`ALTER TABLE "user_profile" ADD "emailNotificationTypes" jsonb NOT NULL DEFAULT '["follow","receiveFollowRequest","groupInvited"]'`);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "emailNotificationTypes"`);
|
||||
}
|
||||
|
||||
}
|
14
migration/1613181457597-user-lang.ts
Normal file
@ -0,0 +1,14 @@
|
||||
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||
|
||||
export class userLang1613181457597 implements MigrationInterface {
|
||||
name = 'userLang1613181457597'
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query(`ALTER TABLE "user_profile" ADD "lang" character varying(32)`);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "lang"`);
|
||||
}
|
||||
|
||||
}
|
15
migration/1613503367223-use-bigint-for-driveUsage.ts
Normal file
@ -0,0 +1,15 @@
|
||||
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||
|
||||
export class useBigintForDriveUsage1613503367223 implements MigrationInterface {
|
||||
name = 'useBigintForDriveUsage1613503367223'
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query(`ALTER TABLE "instance" ALTER COLUMN "driveUsage" TYPE bigint`);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query(`ALTER TABLE "instance" DROP COLUMN "driveUsage"`);
|
||||
await queryRunner.query(`ALTER TABLE "instance" ADD "driveUsage" integer NOT NULL DEFAULT 0`);
|
||||
}
|
||||
|
||||
}
|
172
package.json
@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "misskey",
|
||||
"author": "syuilo <syuilotan@yahoo.co.jp>",
|
||||
"version": "12.62.1",
|
||||
"version": "12.73.0",
|
||||
"codename": "indigo",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@ -35,34 +35,36 @@
|
||||
"lodash": "^4.17.20"
|
||||
},
|
||||
"dependencies": {
|
||||
"@babel/plugin-transform-runtime": "7.12.1",
|
||||
"@elastic/elasticsearch": "7.10.0",
|
||||
"@fortawesome/fontawesome-svg-core": "1.2.32",
|
||||
"@fortawesome/free-brands-svg-icons": "5.15.1",
|
||||
"@fortawesome/free-regular-svg-icons": "5.15.1",
|
||||
"@fortawesome/free-solid-svg-icons": "5.15.1",
|
||||
"@fortawesome/vue-fontawesome": "3.0.0-2",
|
||||
"@babel/plugin-transform-runtime": "7.13.6",
|
||||
"@elastic/elasticsearch": "7.11.0",
|
||||
"@fortawesome/fontawesome-svg-core": "1.2.34",
|
||||
"@fortawesome/free-brands-svg-icons": "5.15.2",
|
||||
"@fortawesome/free-regular-svg-icons": "5.15.2",
|
||||
"@fortawesome/free-solid-svg-icons": "5.15.2",
|
||||
"@fortawesome/vue-fontawesome": "3.0.0-3",
|
||||
"@koa/cors": "3.1.0",
|
||||
"@koa/multer": "3.0.0",
|
||||
"@koa/router": "9.0.1",
|
||||
"@sentry/browser": "5.29.2",
|
||||
"@sentry/tracing": "5.29.2",
|
||||
"@sinonjs/fake-timers": "6.0.1",
|
||||
"@syuilo/aiscript": "0.11.1",
|
||||
"@types/bcryptjs": "2.4.2",
|
||||
"@types/bull": "3.14.4",
|
||||
"@types/bull": "3.15.0",
|
||||
"@types/cbor": "5.0.1",
|
||||
"@types/dateformat": "3.0.1",
|
||||
"@types/double-ended-queue": "2.1.1",
|
||||
"@types/escape-regexp": "0.0.0",
|
||||
"@types/glob": "7.1.3",
|
||||
"@types/gulp": "4.0.6",
|
||||
"@types/gulp-rename": "0.0.33",
|
||||
"@types/gulp": "4.0.8",
|
||||
"@types/gulp-rename": "2.0.0",
|
||||
"@types/gulp-replace": "0.0.31",
|
||||
"@types/is-url": "1.2.28",
|
||||
"@types/js-yaml": "3.12.5",
|
||||
"@types/jsdom": "16.2.5",
|
||||
"@types/jsonld": "1.5.1",
|
||||
"@types/js-yaml": "4.0.0",
|
||||
"@types/jsdom": "16.2.6",
|
||||
"@types/jsonld": "1.5.3",
|
||||
"@types/katex": "0.11.0",
|
||||
"@types/koa": "2.11.3",
|
||||
"@types/koa": "2.13.0",
|
||||
"@types/koa-bodyparser": "4.3.0",
|
||||
"@types/koa-cors": "0.0.0",
|
||||
"@types/koa-favicon": "2.0.19",
|
||||
@ -70,100 +72,101 @@
|
||||
"@types/koa-mount": "4.0.0",
|
||||
"@types/koa-send": "4.1.2",
|
||||
"@types/koa-views": "2.0.4",
|
||||
"@types/koa__cors": "3.0.1",
|
||||
"@types/koa__cors": "3.0.2",
|
||||
"@types/koa__multer": "2.0.2",
|
||||
"@types/koa__router": "8.0.2",
|
||||
"@types/markdown-it": "10.0.3",
|
||||
"@types/matter-js": "0.14.7",
|
||||
"@types/mocha": "7.0.2",
|
||||
"@types/node": "14.0.22",
|
||||
"@types/node-fetch": "2.5.7",
|
||||
"@types/koa__router": "8.0.4",
|
||||
"@types/markdown-it": "12.0.1",
|
||||
"@types/matter-js": "0.14.10",
|
||||
"@types/mocha": "8.2.1",
|
||||
"@types/node": "14.14.31",
|
||||
"@types/node-fetch": "2.5.8",
|
||||
"@types/nodemailer": "6.4.0",
|
||||
"@types/nprogress": "0.2.0",
|
||||
"@types/oauth": "0.9.1",
|
||||
"@types/parse5": "5.0.3",
|
||||
"@types/parsimmon": "1.10.5",
|
||||
"@types/parse5": "6.0.0",
|
||||
"@types/parsimmon": "1.10.6",
|
||||
"@types/portscanner": "2.1.0",
|
||||
"@types/pug": "2.0.4",
|
||||
"@types/qrcode": "1.3.5",
|
||||
"@types/qrcode": "1.4.0",
|
||||
"@types/random-seed": "0.3.3",
|
||||
"@types/ratelimiter": "3.4.0",
|
||||
"@types/ratelimiter": "3.4.1",
|
||||
"@types/redis": "2.8.28",
|
||||
"@types/rename": "1.0.2",
|
||||
"@types/request-stats": "3.0.0",
|
||||
"@types/rimraf": "3.0.0",
|
||||
"@types/seedrandom": "2.4.28",
|
||||
"@types/sharp": "0.26.0",
|
||||
"@types/sinonjs__fake-timers": "6.0.1",
|
||||
"@types/sharp": "0.27.1",
|
||||
"@types/sinonjs__fake-timers": "6.0.2",
|
||||
"@types/speakeasy": "2.0.5",
|
||||
"@types/throttle-debounce": "2.1.0",
|
||||
"@types/tinycolor2": "1.4.2",
|
||||
"@types/tmp": "0.2.0",
|
||||
"@types/uuid": "8.3.0",
|
||||
"@types/web-push": "3.3.0",
|
||||
"@types/webpack": "4.41.25",
|
||||
"@types/webpack": "4.41.26",
|
||||
"@types/webpack-stream": "3.2.11",
|
||||
"@types/websocket": "1.0.1",
|
||||
"@types/ws": "7.4.0",
|
||||
"@typescript-eslint/parser": "4.6.1",
|
||||
"@vue/compiler-sfc": "3.0.3",
|
||||
"@typescript-eslint/parser": "4.14.2",
|
||||
"@vue/compiler-sfc": "3.0.5",
|
||||
"abort-controller": "3.0.0",
|
||||
"apexcharts": "3.22.2",
|
||||
"apexcharts": "3.25.0",
|
||||
"autobind-decorator": "2.4.0",
|
||||
"autosize": "4.0.2",
|
||||
"autwh": "0.1.0",
|
||||
"aws-sdk": "2.787.0",
|
||||
"aws-sdk": "2.848.0",
|
||||
"bcryptjs": "2.4.3",
|
||||
"blurhash": "1.1.3",
|
||||
"bull": "3.18.1",
|
||||
"broadcast-channel": "3.4.1",
|
||||
"bull": "3.20.1",
|
||||
"cafy": "15.2.1",
|
||||
"cbor": "5.1.0",
|
||||
"cbor": "7.0.3",
|
||||
"chalk": "4.1.0",
|
||||
"chart.js": "2.9.4",
|
||||
"cli-highlight": "2.1.9",
|
||||
"cli-highlight": "2.1.10",
|
||||
"commander": "4.1.1",
|
||||
"content-disposition": "0.5.3",
|
||||
"core-js": "3.7.0",
|
||||
"core-js": "3.9.0",
|
||||
"crc-32": "1.2.0",
|
||||
"css-loader": "5.0.1",
|
||||
"css-loader": "5.0.2",
|
||||
"cssnano": "4.1.10",
|
||||
"dateformat": "3.0.3",
|
||||
"deep-entries": "3.1.0",
|
||||
"dateformat": "4.5.1",
|
||||
"diskusage": "1.1.3",
|
||||
"double-ended-queue": "2.1.0-0",
|
||||
"escape-regexp": "0.0.1",
|
||||
"eslint": "7.14.0",
|
||||
"eslint-plugin-vue": "7.1.0",
|
||||
"eslint": "7.20.0",
|
||||
"eslint-plugin-vue": "7.6.0",
|
||||
"eventemitter3": "4.0.7",
|
||||
"feed": "4.2.1",
|
||||
"feed": "4.2.2",
|
||||
"fibers": "5.0.0",
|
||||
"file-type": "16.0.1",
|
||||
"file-type": "16.2.0",
|
||||
"fluent-ffmpeg": "2.1.2",
|
||||
"glob": "7.1.6",
|
||||
"got": "11.8.0",
|
||||
"got": "11.8.1",
|
||||
"gulp": "4.0.2",
|
||||
"gulp-cssnano": "2.1.3",
|
||||
"gulp-rename": "2.0.0",
|
||||
"gulp-replace": "1.0.0",
|
||||
"gulp-sourcemaps": "2.6.5",
|
||||
"gulp-terser": "2.0.1",
|
||||
"gulp-tslint": "8.1.4",
|
||||
"gulp-typescript": "6.0.0-alpha.1",
|
||||
"hard-source-webpack-plugin": "0.13.1",
|
||||
"hcaptcha": "0.0.2",
|
||||
"html-minifier": "4.0.0",
|
||||
"http-proxy-agent": "4.0.1",
|
||||
"http-signature": "1.3.5",
|
||||
"https-proxy-agent": "5.0.0",
|
||||
"idb-keyval": "3.2.0",
|
||||
"idb-keyval": "5.0.2",
|
||||
"insert-text-at-cursor": "0.3.0",
|
||||
"is-root": "2.1.0",
|
||||
"is-svg": "4.2.1",
|
||||
"js-yaml": "3.14.0",
|
||||
"js-yaml": "4.0.0",
|
||||
"jsdom": "16.4.0",
|
||||
"json5": "2.1.3",
|
||||
"json5": "2.2.0",
|
||||
"json5-loader": "4.0.1",
|
||||
"jsonld": "3.2.0",
|
||||
"jsonld": "4.0.1",
|
||||
"jsrsasign": "8.0.20",
|
||||
"katex": "0.12.0",
|
||||
"koa": "2.13.0",
|
||||
"koa": "2.13.1",
|
||||
"koa-bodyparser": "4.3.0",
|
||||
"koa-favicon": "2.1.0",
|
||||
"koa-json-body": "5.3.0",
|
||||
@ -174,16 +177,16 @@
|
||||
"koa-views": "6.3.1",
|
||||
"langmap": "0.0.16",
|
||||
"lookup-dns-cache": "2.1.0",
|
||||
"markdown-it": "11.0.1",
|
||||
"markdown-it-anchor": "6.0.1",
|
||||
"matter-js": "0.14.2",
|
||||
"mocha": "8.2.1",
|
||||
"markdown-it": "12.0.4",
|
||||
"markdown-it-anchor": "7.0.2",
|
||||
"matter-js": "0.16.1",
|
||||
"mocha": "8.3.0",
|
||||
"moji": "0.5.1",
|
||||
"ms": "2.1.2",
|
||||
"ms": "2.1.3",
|
||||
"multer": "1.4.2",
|
||||
"nested-property": "4.0.0",
|
||||
"node-fetch": "2.6.1",
|
||||
"nodemailer": "6.4.16",
|
||||
"nodemailer": "6.5.0",
|
||||
"object-assign-deep": "0.4.0",
|
||||
"os-utils": "0.0.14",
|
||||
"p-cancelable": "2.0.0",
|
||||
@ -191,9 +194,9 @@
|
||||
"parsimmon": "1.16.0",
|
||||
"pg": "8.5.1",
|
||||
"portscanner": "2.2.0",
|
||||
"postcss": "8.1.14",
|
||||
"postcss-loader": "4.1.0",
|
||||
"prismjs": "1.22.0",
|
||||
"postcss": "8.2.6",
|
||||
"postcss-loader": "5.0.0",
|
||||
"prismjs": "1.23.0",
|
||||
"probe-image-size": "6.0.0",
|
||||
"promise-limit": "2.7.0",
|
||||
"promise-sequential": "1.1.1",
|
||||
@ -203,8 +206,7 @@
|
||||
"qrcode": "1.4.4",
|
||||
"random-seed": "0.3.0",
|
||||
"ratelimiter": "3.4.1",
|
||||
"re2": "1.15.8",
|
||||
"recaptcha-promise": "1.0.0",
|
||||
"re2": "1.15.9",
|
||||
"reconnecting-websocket": "4.4.0",
|
||||
"redis": "3.0.2",
|
||||
"redis-lock": "0.1.4",
|
||||
@ -216,54 +218,52 @@
|
||||
"rimraf": "3.0.2",
|
||||
"rndstr": "1.0.0",
|
||||
"s-age": "1.1.2",
|
||||
"sass": "1.29.0",
|
||||
"sass-loader": "10.1.0",
|
||||
"sass": "1.32.8",
|
||||
"sass-loader": "11.0.1",
|
||||
"seedrandom": "3.0.5",
|
||||
"sharp": "0.26.2",
|
||||
"sharp": "0.27.1",
|
||||
"speakeasy": "2.0.0",
|
||||
"stringz": "2.1.0",
|
||||
"style-loader": "2.0.0",
|
||||
"summaly": "2.4.0",
|
||||
"syslog-pro": "1.0.0",
|
||||
"systeminformation": "4.30.7",
|
||||
"systeminformation": "4.34.6",
|
||||
"syuilo-password-strength": "0.0.1",
|
||||
"textarea-caret": "3.1.0",
|
||||
"three": "0.117.1",
|
||||
"throttle-debounce": "3.0.1",
|
||||
"tinycolor2": "1.4.2",
|
||||
"tmp": "0.2.1",
|
||||
"ts-loader": "8.0.9",
|
||||
"ts-node": "9.1.0",
|
||||
"ts-loader": "8.0.17",
|
||||
"ts-node": "9.1.1",
|
||||
"tslint": "6.1.3",
|
||||
"tslint-sonarts": "1.9.0",
|
||||
"typeorm": "0.2.29",
|
||||
"typescript": "4.0.5",
|
||||
"typeorm": "0.2.31",
|
||||
"typescript": "4.1.5",
|
||||
"ulid": "2.3.0",
|
||||
"url-loader": "4.1.1",
|
||||
"uuid": "8.3.1",
|
||||
"uuid": "8.3.2",
|
||||
"v-debounce": "0.1.2",
|
||||
"vanilla-tilt": "1.7.0",
|
||||
"vue": "3.0.3",
|
||||
"vue-color": "2.7.1",
|
||||
"vue-i18n": "9.0.0-beta.7",
|
||||
"vue": "3.0.5",
|
||||
"vue-color": "2.8.1",
|
||||
"vue-json-pretty": "1.7.1",
|
||||
"vue-loader": "16.0.0",
|
||||
"vue-loader": "16.1.2",
|
||||
"vue-prism-editor": "2.0.0-alpha.2",
|
||||
"vue-router": "4.0.0-rc.6",
|
||||
"vue-router": "4.0.4",
|
||||
"vue-style-loader": "4.1.2",
|
||||
"vuedraggable": "4.0.1",
|
||||
"vuex": "4.0.0-rc.2",
|
||||
"vuex-persistedstate": "3.1.0",
|
||||
"web-push": "3.4.4",
|
||||
"webpack": "5.9.0",
|
||||
"webpack-cli": "4.2.0",
|
||||
"websocket": "1.0.32",
|
||||
"ws": "7.4.0",
|
||||
"webpack": "5.24.2",
|
||||
"webpack-cli": "4.5.0",
|
||||
"websocket": "1.0.33",
|
||||
"ws": "7.4.3",
|
||||
"xev": "2.0.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/chai": "4.2.11",
|
||||
"@types/chai": "4.2.15",
|
||||
"@types/fluent-ffmpeg": "2.1.16",
|
||||
"chai": "4.2.0",
|
||||
"cross-env": "7.0.2"
|
||||
"chai": "4.3.0",
|
||||
"cross-env": "7.0.3"
|
||||
}
|
||||
}
|
||||
|
16
src/@types/recaptcha-promise.d.ts
vendored
@ -1,16 +0,0 @@
|
||||
declare module 'recaptcha-promise' {
|
||||
interface IVerifyOptions {
|
||||
secret_key?: string;
|
||||
}
|
||||
|
||||
interface IVerify {
|
||||
(response: string, remoteAddress?: string): Promise<boolean>;
|
||||
init(options: IVerifyOptions): IVerify;
|
||||
}
|
||||
|
||||
namespace recaptchaPromise {} // Hack
|
||||
|
||||
const verify: IVerify;
|
||||
|
||||
export = verify;
|
||||
}
|
@ -66,7 +66,9 @@ if (!program.quiet) {
|
||||
|
||||
// Display detail of uncaught exception
|
||||
process.on('uncaughtException', err => {
|
||||
logger.error(err);
|
||||
try {
|
||||
logger.error(err);
|
||||
} catch { }
|
||||
});
|
||||
|
||||
// Dying away...
|
||||
|
2
src/client/@types/global.d.ts
vendored
@ -1,4 +1,4 @@
|
||||
declare const _LANGS_: string[];
|
||||
declare const _LANGS_: string[][];
|
||||
declare const _VERSION_: string;
|
||||
declare const _ENV_: string;
|
||||
declare const _DEV_: boolean;
|
||||
|
4
src/client/@types/vue.d.ts
vendored
@ -1,5 +1,5 @@
|
||||
declare module '*.vue' {
|
||||
import { defineComponent } from 'vue';
|
||||
const component: ReturnType<typeof defineComponent>;
|
||||
import type { DefineComponent } from 'vue';
|
||||
const component: DefineComponent<{}, {}, any>;
|
||||
export default component;
|
||||
}
|
||||
|
12
src/client/@types/vuex-shim.d.ts
vendored
@ -1,12 +0,0 @@
|
||||
import { ComponentCustomProperties } from 'vue';
|
||||
import { Store } from 'vuex';
|
||||
|
||||
declare module '@vue/runtime-core' {
|
||||
// tslint:disable-next-line:no-empty-interface
|
||||
interface State {
|
||||
}
|
||||
|
||||
interface ComponentCustomProperties {
|
||||
$store: Store<State>;
|
||||
}
|
||||
}
|
87
src/client/account.ts
Normal file
@ -0,0 +1,87 @@
|
||||
import { reactive } from 'vue';
|
||||
import { apiUrl } from '@/config';
|
||||
import { waiting } from '@/os';
|
||||
import { unisonReload } from '@/scripts/unison-reload';
|
||||
|
||||
// TODO: 他のタブと永続化されたstateを同期
|
||||
|
||||
type Account = {
|
||||
id: string;
|
||||
token: string;
|
||||
};
|
||||
|
||||
const data = localStorage.getItem('account');
|
||||
|
||||
// TODO: 外部からはreadonlyに
|
||||
export const $i = data ? reactive(JSON.parse(data) as Account) : null;
|
||||
|
||||
export function signout() {
|
||||
localStorage.removeItem('account');
|
||||
document.cookie = `igi=; path=/`;
|
||||
location.href = '/';
|
||||
}
|
||||
|
||||
export function getAccounts() {
|
||||
const accountsData = localStorage.getItem('accounts');
|
||||
const accounts: { id: Account['id'], token: Account['token'] }[] = accountsData ? JSON.parse(accountsData) : [];
|
||||
return accounts;
|
||||
}
|
||||
|
||||
export function addAccount(id: Account['id'], token: Account['token']) {
|
||||
const accounts = getAccounts();
|
||||
if (!accounts.some(x => x.id === id)) {
|
||||
localStorage.setItem('accounts', JSON.stringify(accounts.concat([{ id, token }])));
|
||||
}
|
||||
}
|
||||
|
||||
function fetchAccount(token): Promise<Account> {
|
||||
return new Promise((done, fail) => {
|
||||
// Fetch user
|
||||
fetch(`${apiUrl}/i`, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify({
|
||||
i: token
|
||||
})
|
||||
})
|
||||
.then(res => {
|
||||
// When failed to authenticate user
|
||||
if (res.status !== 200 && res.status < 500) {
|
||||
return signout();
|
||||
}
|
||||
|
||||
// Parse response
|
||||
res.json().then(i => {
|
||||
i.token = token;
|
||||
done(i);
|
||||
});
|
||||
})
|
||||
.catch(fail);
|
||||
});
|
||||
}
|
||||
|
||||
export function updateAccount(data) {
|
||||
for (const [key, value] of Object.entries(data)) {
|
||||
$i[key] = value;
|
||||
}
|
||||
localStorage.setItem('account', JSON.stringify($i));
|
||||
}
|
||||
|
||||
export function refreshAccount() {
|
||||
fetchAccount($i.token).then(updateAccount);
|
||||
}
|
||||
|
||||
export async function login(token: Account['token']) {
|
||||
waiting();
|
||||
if (_DEV_) console.log('logging as token ', token);
|
||||
const me = await fetchAccount(token);
|
||||
localStorage.setItem('account', JSON.stringify(me));
|
||||
addAccount(me.id, token);
|
||||
unisonReload();
|
||||
}
|
||||
|
||||
// このファイルに書きたくないけどここに書かないと何故かVeturが認識しない
|
||||
declare module '@vue/runtime-core' {
|
||||
interface ComponentCustomProperties {
|
||||
$i: typeof $i;
|
||||
}
|
||||
}
|
BIN
src/client/assets/about-icon.png
Normal file
After Width: | Height: | Size: 20 KiB |
7
src/client/assets/misskey.svg
Normal file
After Width: | Height: | Size: 9.2 KiB |
@ -1,34 +0,0 @@
|
||||
// 常にメモリにロードしておく必要がないような設定情報を保管するストレージ
|
||||
|
||||
const PREFIX = 'miux:';
|
||||
|
||||
export const defaultDeviceSettings = {
|
||||
sound_masterVolume: 0.3,
|
||||
sound_note: { type: 'syuilo/down', volume: 1 },
|
||||
sound_noteMy: { type: 'syuilo/up', volume: 1 },
|
||||
sound_notification: { type: 'syuilo/pope2', volume: 1 },
|
||||
sound_chat: { type: 'syuilo/pope1', volume: 1 },
|
||||
sound_chatBg: { type: 'syuilo/waon', volume: 1 },
|
||||
sound_antenna: { type: 'syuilo/triple', volume: 1 },
|
||||
sound_channel: { type: 'syuilo/square-pico', volume: 1 },
|
||||
sound_reversiPutBlack: { type: 'syuilo/kick', volume: 0.3 },
|
||||
sound_reversiPutWhite: { type: 'syuilo/snare', volume: 0.3 },
|
||||
};
|
||||
|
||||
export const device = {
|
||||
get<T extends keyof typeof defaultDeviceSettings>(key: T): typeof defaultDeviceSettings[T] {
|
||||
// TODO: indexedDBにする
|
||||
// ただしその際はnullチェックではなくキー存在チェックにしないとダメ
|
||||
// (indexedDBはnullを保存できるため、ユーザーが意図してnullを格納した可能性がある)
|
||||
const value = localStorage.getItem(PREFIX + key);
|
||||
if (value == null) {
|
||||
return defaultDeviceSettings[key];
|
||||
} else {
|
||||
return JSON.parse(value);
|
||||
}
|
||||
},
|
||||
|
||||
set(key: keyof typeof defaultDeviceSettings, value: any): any {
|
||||
localStorage.setItem(PREFIX + key, JSON.stringify(value));
|
||||
},
|
||||
};
|
@ -2,24 +2,24 @@
|
||||
<XWindow ref="window" :initial-width="400" :initial-height="500" :can-resize="true" @closed="$emit('closed')">
|
||||
<template #header>
|
||||
<Fa :icon="faExclamationCircle" style="margin-right: 0.5em;"/>
|
||||
<i18n-t keypath="reportAbuseOf" tag="span">
|
||||
<I18n :src="$ts.reportAbuseOf" tag="span">
|
||||
<template #name>
|
||||
<b><MkAcct :user="user"/></b>
|
||||
</template>
|
||||
</i18n-t>
|
||||
</I18n>
|
||||
</template>
|
||||
<div class="dpvffvvy">
|
||||
<div class="_section">
|
||||
<div class="_content">
|
||||
<MkTextarea v-model:value="comment">
|
||||
<span>{{ $t('details') }}</span>
|
||||
<template #desc>{{ $t('fillAbuseReportDescription') }}</template>
|
||||
<span>{{ $ts.details }}</span>
|
||||
<template #desc>{{ $ts.fillAbuseReportDescription }}</template>
|
||||
</MkTextarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="_section">
|
||||
<div class="_content">
|
||||
<MkButton @click="send" primary full :disabled="comment.length === 0">{{ $t('send') }}</MkButton>
|
||||
<MkButton @click="send" primary full :disabled="comment.length === 0">{{ $ts.send }}</MkButton>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -69,7 +69,7 @@ export default defineComponent({
|
||||
}, undefined, res => {
|
||||
os.dialog({
|
||||
type: 'success',
|
||||
text: this.$t('abuseReported')
|
||||
text: this.$ts.abuseReported
|
||||
});
|
||||
this.$refs.window.close();
|
||||
});
|
||||
|
@ -116,16 +116,6 @@ export default defineComponent({
|
||||
}
|
||||
};
|
||||
update();
|
||||
|
||||
this.$store.subscribe((mutation, state) => {
|
||||
if (mutation.type !== 'device/set') return;
|
||||
|
||||
if (mutation?.payload?.key !== 'theme') return;
|
||||
|
||||
setTimeout(() => {
|
||||
this.computedStyle = getComputedStyle(document.documentElement);
|
||||
}, 250);
|
||||
});
|
||||
},
|
||||
|
||||
beforeUnmount() {
|
||||
|
@ -8,7 +8,7 @@
|
||||
</span>
|
||||
<span class="username">@{{ acct(user) }}</span>
|
||||
</li>
|
||||
<li @click="chooseUser()" @keydown="onKeydown" tabindex="-1" class="choose">{{ $t('selectUser') }}</li>
|
||||
<li @click="chooseUser()" @keydown="onKeydown" tabindex="-1" class="choose">{{ $ts.selectUser }}</li>
|
||||
</ol>
|
||||
<ol class="hashtags" ref="suggests" v-if="hashtags.length > 0">
|
||||
<li v-for="hashtag in hashtags" @click="complete(type, hashtag)" @keydown="onKeydown" tabindex="-1">
|
||||
@ -17,8 +17,8 @@
|
||||
</ol>
|
||||
<ol class="emojis" ref="suggests" v-if="emojis.length > 0">
|
||||
<li v-for="emoji in emojis" @click="complete(type, emoji.emoji)" @keydown="onKeydown" tabindex="-1">
|
||||
<span class="emoji" v-if="emoji.isCustomEmoji"><img :src="$store.state.device.disableShowingAnimatedImages ? getStaticImageUrl(emoji.url) : emoji.url" :alt="emoji.emoji"/></span>
|
||||
<span class="emoji" v-else-if="!useOsNativeEmojis"><img :src="emoji.url" :alt="emoji.emoji"/></span>
|
||||
<span class="emoji" v-if="emoji.isCustomEmoji"><img :src="$store.state.disableShowingAnimatedImages ? getStaticImageUrl(emoji.url) : emoji.url" :alt="emoji.emoji"/></span>
|
||||
<span class="emoji" v-else-if="!$store.state.useOsNativeEmojis"><img :src="emoji.url" :alt="emoji.emoji"/></span>
|
||||
<span class="emoji" v-else>{{ emoji.emoji }}</span>
|
||||
<span class="name" v-html="emoji.name.replace(q, `<b>${q}</b>`)"></span>
|
||||
<span class="alias" v-if="emoji.aliasOf">({{ emoji.aliasOf }})</span>
|
||||
@ -128,12 +128,6 @@ export default defineComponent({
|
||||
}
|
||||
},
|
||||
|
||||
computed: {
|
||||
useOsNativeEmojis(): boolean {
|
||||
return this.$store.state.device.useOsNativeEmojis;
|
||||
}
|
||||
},
|
||||
|
||||
watch: {
|
||||
showing() {
|
||||
if (!this.showing) {
|
||||
@ -151,7 +145,7 @@ export default defineComponent({
|
||||
this.setPosition();
|
||||
|
||||
//#region Construct Emoji DB
|
||||
const customEmojis = this.$store.state.instance.meta.emojis;
|
||||
const customEmojis = this.$instance.emojis;
|
||||
const emojiDefinitions: EmojiDef[] = [];
|
||||
|
||||
for (const x of customEmojis) {
|
||||
|
@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div>
|
||||
<span v-if="!available">{{ $t('waiting') }}<MkEllipsis/></span>
|
||||
<span v-if="!available">{{ $ts.waiting }}<MkEllipsis/></span>
|
||||
<div ref="captcha"></div>
|
||||
</div>
|
||||
</template>
|
||||
@ -28,7 +28,6 @@ declare global {
|
||||
interface Window extends CaptchaContainer {
|
||||
}
|
||||
}
|
||||
import * as os from '@/os';
|
||||
|
||||
export default defineComponent({
|
||||
props: {
|
||||
@ -58,7 +57,7 @@ export default defineComponent({
|
||||
src() {
|
||||
const endpoint = ({
|
||||
hcaptcha: 'https://hcaptcha.com/1',
|
||||
grecaptcha: 'https://www.google.com/recaptcha',
|
||||
grecaptcha: 'https://www.recaptcha.net/recaptcha',
|
||||
} as Record<PropertyKey, unknown>)[this.provider];
|
||||
|
||||
return `${typeof endpoint == 'string' ? endpoint : 'about:invalid'}/api.js?render=explicit`;
|
||||
@ -101,7 +100,7 @@ export default defineComponent({
|
||||
if (this.captcha.render && this.$refs.captcha instanceof Element) {
|
||||
this.captcha.render(this.$refs.captcha, {
|
||||
sitekey: this.sitekey,
|
||||
theme: this.$store.state.device.darkMode ? 'dark' : 'light',
|
||||
theme: this.$store.state.darkMode ? 'dark' : 'light',
|
||||
callback: this.callback,
|
||||
'expired-callback': this.callback,
|
||||
'error-callback': this.callback,
|
||||
|
@ -6,14 +6,14 @@
|
||||
>
|
||||
<template v-if="!wait">
|
||||
<template v-if="isFollowing">
|
||||
<span v-if="full">{{ $t('unfollow') }}</span><Fa :icon="faMinus"/>
|
||||
<span v-if="full">{{ $ts.unfollow }}</span><Fa :icon="faMinus"/>
|
||||
</template>
|
||||
<template v-else>
|
||||
<span v-if="full">{{ $t('follow') }}</span><Fa :icon="faPlus"/>
|
||||
<span v-if="full">{{ $ts.follow }}</span><Fa :icon="faPlus"/>
|
||||
</template>
|
||||
</template>
|
||||
<template v-else>
|
||||
<span v-if="full">{{ $t('processing') }}</span><Fa :icon="faSpinner" pulse fixed-width/>
|
||||
<span v-if="full">{{ $ts.processing }}</span><Fa :icon="faSpinner" pulse fixed-width/>
|
||||
</template>
|
||||
</button>
|
||||
</template>
|
||||
|
@ -6,19 +6,19 @@
|
||||
<div class="status">
|
||||
<div>
|
||||
<Fa :icon="faUsers" fixed-width/>
|
||||
<i18n-t keypath="_channel.usersCount" tag="span" style="margin-left: 4px;">
|
||||
<I18n :src="$ts._channel.usersCount" tag="span" style="margin-left: 4px;">
|
||||
<template #n>
|
||||
<b>{{ channel.usersCount }}</b>
|
||||
</template>
|
||||
</i18n-t>
|
||||
</I18n>
|
||||
</div>
|
||||
<div>
|
||||
<Fa :icon="faPencilAlt" fixed-width/>
|
||||
<i18n-t keypath="_channel.notesCount" tag="span" style="margin-left: 4px;">
|
||||
<I18n :src="$ts._channel.notesCount" tag="span" style="margin-left: 4px;">
|
||||
<template #n>
|
||||
<b>{{ channel.notesCount }}</b>
|
||||
</template>
|
||||
</i18n-t>
|
||||
</I18n>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -27,7 +27,7 @@
|
||||
</article>
|
||||
<footer>
|
||||
<span v-if="channel.lastNotedAt">
|
||||
{{ $t('updatedAt') }}: <MkTime :time="channel.lastNotedAt"/>
|
||||
{{ $ts.updatedAt }}: <MkTime :time="channel.lastNotedAt"/>
|
||||
</span>
|
||||
</footer>
|
||||
</MkA>
|
||||
|
@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<button class="nrvgflfu _button" @click="toggle">
|
||||
<b>{{ value ? $t('_cw.hide') : $t('_cw.show') }}</b>
|
||||
<b>{{ value ? $ts._cw.hide : $ts._cw.show }}</b>
|
||||
<span v-if="!value">{{ label }}</span>
|
||||
</button>
|
||||
</template>
|
||||
@ -27,7 +27,7 @@ export default defineComponent({
|
||||
return concat([
|
||||
this.note.text ? [this.$t('_cw.chars', { count: length(this.note.text) })] : [],
|
||||
this.note.files && this.note.files.length !== 0 ? [this.$t('_cw.files', { count: this.note.files.length }) ] : [],
|
||||
this.note.poll != null ? [this.$t('poll')] : []
|
||||
this.note.poll != null ? [this.$ts.poll] : []
|
||||
] as string[][]).join(' / ');
|
||||
}
|
||||
},
|
||||
|
@ -1,20 +1,7 @@
|
||||
<template>
|
||||
<transition-group class="sqadhkmv _list_" name="list" tag="div" :data-direction="direction" :data-reversed="reversed ? 'true' : 'false'">
|
||||
<template v-for="(item, i) in items">
|
||||
<slot :item="item"></slot>
|
||||
<div class="separator" v-if="showDate(i, item)" :key="item.id + '_date'">
|
||||
<p class="date">
|
||||
<span><Fa class="icon" :icon="faAngleUp"/>{{ getDateText(item.createdAt) }}</span>
|
||||
<span>{{ getDateText(items[i + 1].createdAt) }}<Fa class="icon" :icon="faAngleDown"/></span>
|
||||
</p>
|
||||
</div>
|
||||
</template>
|
||||
</transition-group>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent } from 'vue';
|
||||
import { defineComponent, h, TransitionGroup } from 'vue';
|
||||
import { faAngleUp, faAngleDown } from '@fortawesome/free-solid-svg-icons';
|
||||
import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';
|
||||
|
||||
export default defineComponent({
|
||||
props: {
|
||||
@ -34,36 +21,72 @@ export default defineComponent({
|
||||
}
|
||||
},
|
||||
|
||||
data() {
|
||||
return {
|
||||
faAngleUp, faAngleDown
|
||||
};
|
||||
methods: {
|
||||
focus() {
|
||||
this.$slots.default[0].elm.focus();
|
||||
}
|
||||
},
|
||||
|
||||
methods: {
|
||||
getDateText(time: string) {
|
||||
render() {
|
||||
const getDateText = (time: string) => {
|
||||
const date = new Date(time).getDate();
|
||||
const month = new Date(time).getMonth() + 1;
|
||||
return this.$t('monthAndDay', {
|
||||
month: month.toString(),
|
||||
day: date.toString()
|
||||
});
|
||||
},
|
||||
}
|
||||
|
||||
showDate(i, item) {
|
||||
return (
|
||||
return h(this.$store.state.animation ? TransitionGroup : 'div', this.$store.state.animation ? {
|
||||
class: 'sqadhkmv _list_',
|
||||
name: 'list',
|
||||
tag: 'div',
|
||||
'data-direction': this.direction,
|
||||
'data-reversed': this.reversed ? 'true' : 'false',
|
||||
} : {
|
||||
class: 'sqadhkmv _list_',
|
||||
}, this.items.map((item, i) => {
|
||||
const el = this.$slots.default({
|
||||
item: item
|
||||
})[0];
|
||||
if (el.key == null && item.id) el.key = item.id;
|
||||
|
||||
if (
|
||||
i != this.items.length - 1 &&
|
||||
new Date(item.createdAt).getDate() != new Date(this.items[i + 1].createdAt).getDate() &&
|
||||
!item._prId_ &&
|
||||
!this.items[i + 1]._prId_ &&
|
||||
!item._featuredId_ &&
|
||||
!this.items[i + 1]._featuredId_);
|
||||
},
|
||||
!this.items[i + 1]._featuredId_
|
||||
) {
|
||||
const separator = h('div', {
|
||||
class: 'separator',
|
||||
key: item.id + ':separator',
|
||||
}, h('p', {
|
||||
class: 'date'
|
||||
}, [
|
||||
h('span', [
|
||||
h(FontAwesomeIcon, {
|
||||
class: 'icon',
|
||||
icon: faAngleUp,
|
||||
}),
|
||||
getDateText(item.createdAt)
|
||||
]),
|
||||
h('span', [
|
||||
getDateText(this.items[i + 1].createdAt),
|
||||
h(FontAwesomeIcon, {
|
||||
class: 'icon',
|
||||
icon: faAngleDown,
|
||||
})
|
||||
])
|
||||
]));
|
||||
|
||||
focus() {
|
||||
this.$slots.default[0].elm.focus();
|
||||
}
|
||||
}
|
||||
return [el, separator];
|
||||
} else {
|
||||
return el;
|
||||
}
|
||||
}));
|
||||
},
|
||||
});
|
||||
</script>
|
||||
|
||||
@ -97,7 +120,7 @@ export default defineComponent({
|
||||
}
|
||||
</style>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
<style lang="scss">
|
||||
.sqadhkmv {
|
||||
> .separator {
|
||||
text-align: center;
|
||||
|
@ -26,8 +26,8 @@
|
||||
</template>
|
||||
</MkSelect>
|
||||
<div class="buttons" v-if="(showOkButton || showCancelButton) && !actions">
|
||||
<MkButton inline @click="ok" v-if="showOkButton" primary :autofocus="!input && !select">{{ (showCancelButton || input || select) ? $t('ok') : $t('gotIt') }}</MkButton>
|
||||
<MkButton inline @click="cancel" v-if="showCancelButton || input || select">{{ $t('cancel') }}</MkButton>
|
||||
<MkButton inline @click="ok" v-if="showOkButton" primary :autofocus="!input && !select">{{ (showCancelButton || input || select) ? $ts.ok : $ts.gotIt }}</MkButton>
|
||||
<MkButton inline @click="cancel" v-if="showCancelButton || input || select">{{ $ts.cancel }}</MkButton>
|
||||
</div>
|
||||
<div class="buttons" v-if="actions">
|
||||
<MkButton v-for="action in actions" inline @click="() => { action.callback(); close(); }" :primary="action.primary" :key="action.text">{{ action.text }}</MkButton>
|
||||
|
@ -27,6 +27,7 @@ import {
|
||||
faFilm
|
||||
} from '@fortawesome/free-solid-svg-icons';
|
||||
import ImgWithBlurhash from './img-with-blurhash.vue';
|
||||
import { ColdDeviceStorage } from '@/store';
|
||||
|
||||
export default defineComponent({
|
||||
components: {
|
||||
@ -89,12 +90,12 @@ export default defineComponent({
|
||||
},
|
||||
mounted() {
|
||||
const audioTag = this.$refs.volumectrl as HTMLAudioElement;
|
||||
if (audioTag) audioTag.volume = this.$store.state.device.mediaVolume;
|
||||
if (audioTag) audioTag.volume = ColdDeviceStorage.get('mediaVolume');
|
||||
},
|
||||
methods: {
|
||||
volumechange() {
|
||||
const audioTag = this.$refs.volumectrl as HTMLAudioElement;
|
||||
this.$store.commit('device/set', { key: 'mediaVolume', value: audioTag.volume });
|
||||
ColdDeviceStorage.set('mediaVolume', audioTag.volume);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@ -10,7 +10,7 @@
|
||||
@closed="$emit('closed')"
|
||||
>
|
||||
<template #header>
|
||||
{{ multiple ? ((type === 'file') ? $t('selectFiles') : $t('selectFolders')) : ((type === 'file') ? $t('selectFile') : $t('selectFolder')) }}
|
||||
{{ multiple ? ((type === 'file') ? $ts.selectFiles : $ts.selectFolders) : ((type === 'file') ? $ts.selectFile : $ts.selectFolder) }}
|
||||
<span v-if="selected.length > 0" style="margin-left: 8px; opacity: 0.5;">({{ number(selected.length) }})</span>
|
||||
</template>
|
||||
<XDrive :multiple="multiple" @changeSelection="onChangeSelection" @selected="ok()" :select="type"/>
|
||||
|
@ -6,7 +6,7 @@
|
||||
@closed="$emit('closed')"
|
||||
>
|
||||
<template #header>
|
||||
{{ $t('drive') }}
|
||||
{{ $ts.drive }}
|
||||
</template>
|
||||
<XDrive :initial-folder="initialFolder"/>
|
||||
</XWindow>
|
||||
|
@ -8,17 +8,17 @@
|
||||
@dragend="onDragend"
|
||||
:title="title"
|
||||
>
|
||||
<div class="label" v-if="$store.state.i.avatarId == file.id">
|
||||
<div class="label" v-if="$i.avatarId == file.id">
|
||||
<img src="/assets/label.svg"/>
|
||||
<p>{{ $t('avatar') }}</p>
|
||||
<p>{{ $ts.avatar }}</p>
|
||||
</div>
|
||||
<div class="label" v-if="$store.state.i.bannerId == file.id">
|
||||
<div class="label" v-if="$i.bannerId == file.id">
|
||||
<img src="/assets/label.svg"/>
|
||||
<p>{{ $t('banner') }}</p>
|
||||
<p>{{ $ts.banner }}</p>
|
||||
</div>
|
||||
<div class="label red" v-if="file.isSensitive">
|
||||
<img src="/assets/label-red.svg"/>
|
||||
<p>{{ $t('nsfw') }}</p>
|
||||
<p>{{ $ts.nsfw }}</p>
|
||||
</div>
|
||||
|
||||
<MkDriveFileThumbnail class="thumbnail" :file="file" fit="contain"/>
|
||||
@ -36,7 +36,7 @@ import { faEye, faEyeSlash } from '@fortawesome/free-regular-svg-icons';
|
||||
import { faDownload, faLink, faICursor, faTrashAlt } from '@fortawesome/free-solid-svg-icons';
|
||||
import copyToClipboard from '@/scripts/copy-to-clipboard';
|
||||
import MkDriveFileThumbnail from './drive-file-thumbnail.vue';
|
||||
import bytes from '../filters/bytes';
|
||||
import bytes from '@/filters/bytes';
|
||||
import * as os from '@/os';
|
||||
|
||||
export default defineComponent({
|
||||
@ -82,26 +82,26 @@ export default defineComponent({
|
||||
methods: {
|
||||
getMenu() {
|
||||
return [{
|
||||
text: this.$t('rename'),
|
||||
text: this.$ts.rename,
|
||||
icon: faICursor,
|
||||
action: this.rename
|
||||
}, {
|
||||
text: this.file.isSensitive ? this.$t('unmarkAsSensitive') : this.$t('markAsSensitive'),
|
||||
text: this.file.isSensitive ? this.$ts.unmarkAsSensitive : this.$ts.markAsSensitive,
|
||||
icon: this.file.isSensitive ? faEye : faEyeSlash,
|
||||
action: this.toggleSensitive
|
||||
}, null, {
|
||||
text: this.$t('copyUrl'),
|
||||
text: this.$ts.copyUrl,
|
||||
icon: faLink,
|
||||
action: this.copyUrl
|
||||
}, {
|
||||
type: 'a',
|
||||
href: this.file.url,
|
||||
target: '_blank',
|
||||
text: this.$t('download'),
|
||||
text: this.$ts.download,
|
||||
icon: faDownload,
|
||||
download: this.file.name
|
||||
}, null, {
|
||||
text: this.$t('delete'),
|
||||
text: this.$ts.delete,
|
||||
icon: faTrashAlt,
|
||||
danger: true,
|
||||
action: this.deleteFile
|
||||
@ -137,9 +137,9 @@ export default defineComponent({
|
||||
|
||||
rename() {
|
||||
os.dialog({
|
||||
title: this.$t('renameFile'),
|
||||
title: this.$ts.renameFile,
|
||||
input: {
|
||||
placeholder: this.$t('inputNewFileName'),
|
||||
placeholder: this.$ts.inputNewFileName,
|
||||
default: this.file.name,
|
||||
allowEmpty: false
|
||||
}
|
||||
|
@ -19,8 +19,8 @@
|
||||
<template v-if="!hover"><Fa :icon="faFolder" fixed-width/></template>
|
||||
{{ folder.name }}
|
||||
</p>
|
||||
<p class="upload" v-if="$store.state.settings.uploadFolder == folder.id">
|
||||
{{ $t('uploadFolder') }}
|
||||
<p class="upload" v-if="$store.state.uploadFolder == folder.id">
|
||||
{{ $ts.uploadFolder }}
|
||||
</p>
|
||||
<button v-if="selectMode" class="checkbox _button" :class="{ checked: isSelected }" @click.prevent.stop="checkboxClicked"></button>
|
||||
</div>
|
||||
@ -155,14 +155,14 @@ export default defineComponent({
|
||||
switch (err) {
|
||||
case 'detected-circular-definition':
|
||||
os.dialog({
|
||||
title: this.$t('unableToProcess'),
|
||||
text: this.$t('circularReferenceFolder')
|
||||
title: this.$ts.unableToProcess,
|
||||
text: this.$ts.circularReferenceFolder
|
||||
});
|
||||
break;
|
||||
default:
|
||||
os.dialog({
|
||||
type: 'error',
|
||||
text: this.$t('somethingHappened')
|
||||
text: this.$ts.somethingHappened
|
||||
});
|
||||
}
|
||||
});
|
||||
@ -195,9 +195,9 @@ export default defineComponent({
|
||||
|
||||
rename() {
|
||||
os.dialog({
|
||||
title: this.$t('renameFolder'),
|
||||
title: this.$ts.renameFolder,
|
||||
input: {
|
||||
placeholder: this.$t('inputNewFolderName'),
|
||||
placeholder: this.$ts.inputNewFolderName,
|
||||
default: this.folder.name
|
||||
}
|
||||
}).then(({ canceled, result: name }) => {
|
||||
@ -213,40 +213,34 @@ export default defineComponent({
|
||||
os.api('drive/folders/delete', {
|
||||
folderId: this.folder.id
|
||||
}).then(() => {
|
||||
if (this.$store.state.settings.uploadFolder === this.folder.id) {
|
||||
this.$store.dispatch('settings/set', {
|
||||
key: 'uploadFolder',
|
||||
value: null
|
||||
});
|
||||
if (this.$store.state.uploadFolder === this.folder.id) {
|
||||
this.$store.set('uploadFolder', null);
|
||||
}
|
||||
}).catch(err => {
|
||||
switch(err.id) {
|
||||
case 'b0fc8a17-963c-405d-bfbc-859a487295e1':
|
||||
os.dialog({
|
||||
type: 'error',
|
||||
title: this.$t('unableToDelete'),
|
||||
text: this.$t('hasChildFilesOrFolders')
|
||||
title: this.$ts.unableToDelete,
|
||||
text: this.$ts.hasChildFilesOrFolders
|
||||
});
|
||||
break;
|
||||
default:
|
||||
os.dialog({
|
||||
type: 'error',
|
||||
text: this.$t('unableToDelete')
|
||||
text: this.$ts.unableToDelete
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
setAsUploadFolder() {
|
||||
this.$store.dispatch('settings/set', {
|
||||
key: 'uploadFolder',
|
||||
value: this.folder.id
|
||||
});
|
||||
this.$store.set('uploadFolder', this.folder.id);
|
||||
},
|
||||
|
||||
onContextmenu(e) {
|
||||
os.contextMenu([{
|
||||
text: this.$t('openInWindow'),
|
||||
text: this.$ts.openInWindow,
|
||||
icon: faWindowRestore,
|
||||
action: () => {
|
||||
os.popup(import('./drive-window.vue'), {
|
||||
@ -255,11 +249,11 @@ export default defineComponent({
|
||||
}, 'closed');
|
||||
}
|
||||
}, null, {
|
||||
text: this.$t('rename'),
|
||||
text: this.$ts.rename,
|
||||
icon: faICursor,
|
||||
action: this.rename
|
||||
}, null, {
|
||||
text: this.$t('delete'),
|
||||
text: this.$ts.delete,
|
||||
icon: faTrashAlt,
|
||||
danger: true,
|
||||
action: this.deleteFolder
|
||||
|
@ -8,7 +8,7 @@
|
||||
@drop.stop="onDrop"
|
||||
>
|
||||
<i v-if="folder == null"><Fa :icon="faCloud"/></i>
|
||||
<span>{{ folder == null ? $t('drive') : folder.name }}</span>
|
||||
<span>{{ folder == null ? $ts.drive : folder.name }}</span>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
@ -17,25 +17,25 @@
|
||||
@dragenter="onDragenter"
|
||||
@dragleave="onDragleave"
|
||||
@drop.prevent.stop="onDrop"
|
||||
@contextmenu="onContextmenu"
|
||||
@contextmenu.stop="onContextmenu"
|
||||
>
|
||||
<div class="contents" ref="contents">
|
||||
<div class="folders" ref="foldersContainer" v-show="folders.length > 0">
|
||||
<XFolder v-for="f in folders" :key="f.id" class="folder" :folder="f" :select-mode="select === 'folder'" :is-selected="selectedFolders.some(x => x.id === f.id)" @chosen="chooseFolder"/>
|
||||
<XFolder v-for="(f, i) in folders" :key="f.id" class="folder" :folder="f" :select-mode="select === 'folder'" :is-selected="selectedFolders.some(x => x.id === f.id)" @chosen="chooseFolder" v-anim="i"/>
|
||||
<!-- SEE: https://stackoverflow.com/questions/18744164/flex-box-align-last-row-to-grid -->
|
||||
<div class="padding" v-for="(n, i) in 16" :key="i"></div>
|
||||
<MkButton ref="moreFolders" v-if="moreFolders">{{ $t('loadMore') }}</MkButton>
|
||||
<MkButton ref="moreFolders" v-if="moreFolders">{{ $ts.loadMore }}</MkButton>
|
||||
</div>
|
||||
<div class="files" ref="filesContainer" v-show="files.length > 0">
|
||||
<XFile v-for="file in files" :key="file.id" class="file" :file="file" :select-mode="select === 'file'" :is-selected="selectedFiles.some(x => x.id === file.id)" @chosen="chooseFile"/>
|
||||
<XFile v-for="(file, i) in files" :key="file.id" class="file" :file="file" :select-mode="select === 'file'" :is-selected="selectedFiles.some(x => x.id === file.id)" @chosen="chooseFile" v-anim="i"/>
|
||||
<!-- SEE: https://stackoverflow.com/questions/18744164/flex-box-align-last-row-to-grid -->
|
||||
<div class="padding" v-for="(n, i) in 16" :key="i"></div>
|
||||
<MkButton ref="loadMoreFiles" @click="fetchMoreFiles" v-show="moreFiles">{{ $t('loadMore') }}</MkButton>
|
||||
<MkButton ref="loadMoreFiles" @click="fetchMoreFiles" v-show="moreFiles">{{ $ts.loadMore }}</MkButton>
|
||||
</div>
|
||||
<div class="empty" v-if="files.length == 0 && folders.length == 0 && !fetching">
|
||||
<p v-if="draghover">{{ $t('empty-draghover') }}</p>
|
||||
<p v-if="!draghover && folder == null"><strong>{{ $t('emptyDrive') }}</strong><br/>{{ $t('empty-drive-description') }}</p>
|
||||
<p v-if="!draghover && folder != null">{{ $t('emptyFolder') }}</p>
|
||||
<p v-if="!draghover && folder == null"><strong>{{ $ts.emptyDrive }}</strong><br/>{{ $t('empty-drive-description') }}</p>
|
||||
<p v-if="!draghover && folder != null">{{ $ts.emptyFolder }}</p>
|
||||
</div>
|
||||
</div>
|
||||
<MkLoading v-if="fetching"/>
|
||||
@ -136,7 +136,7 @@ export default defineComponent({
|
||||
},
|
||||
|
||||
mounted() {
|
||||
if (this.$store.state.device.enableInfiniteScroll && this.$refs.loadMoreFiles) {
|
||||
if (this.$store.state.enableInfiniteScroll && this.$refs.loadMoreFiles) {
|
||||
this.$nextTick(() => {
|
||||
this.ilFilesObserver.observe((this.$refs.loadMoreFiles as Vue).$el)
|
||||
});
|
||||
@ -159,7 +159,7 @@ export default defineComponent({
|
||||
},
|
||||
|
||||
activated() {
|
||||
if (this.$store.state.device.enableInfiniteScroll) {
|
||||
if (this.$store.state.enableInfiniteScroll) {
|
||||
this.$nextTick(() => {
|
||||
this.ilFilesObserver.observe((this.$refs.loadMoreFiles as Vue).$el)
|
||||
});
|
||||
@ -277,14 +277,14 @@ export default defineComponent({
|
||||
switch (err) {
|
||||
case 'detected-circular-definition':
|
||||
os.dialog({
|
||||
title: this.$t('unableToProcess'),
|
||||
text: this.$t('circularReferenceFolder')
|
||||
title: this.$ts.unableToProcess,
|
||||
text: this.$ts.circularReferenceFolder
|
||||
});
|
||||
break;
|
||||
default:
|
||||
os.dialog({
|
||||
type: 'error',
|
||||
text: this.$t('somethingHappened')
|
||||
text: this.$ts.somethingHappened
|
||||
});
|
||||
}
|
||||
});
|
||||
@ -298,9 +298,9 @@ export default defineComponent({
|
||||
|
||||
urlUpload() {
|
||||
os.dialog({
|
||||
title: this.$t('uploadFromUrl'),
|
||||
title: this.$ts.uploadFromUrl,
|
||||
input: {
|
||||
placeholder: this.$t('uploadFromUrlDescription')
|
||||
placeholder: this.$ts.uploadFromUrlDescription
|
||||
}
|
||||
}).then(({ canceled, result: url }) => {
|
||||
if (canceled) return;
|
||||
@ -310,17 +310,17 @@ export default defineComponent({
|
||||
});
|
||||
|
||||
os.dialog({
|
||||
title: this.$t('uploadFromUrlRequested'),
|
||||
text: this.$t('uploadFromUrlMayTakeTime')
|
||||
title: this.$ts.uploadFromUrlRequested,
|
||||
text: this.$ts.uploadFromUrlMayTakeTime
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
createFolder() {
|
||||
os.dialog({
|
||||
title: this.$t('createFolder'),
|
||||
title: this.$ts.createFolder,
|
||||
input: {
|
||||
placeholder: this.$t('folderName')
|
||||
placeholder: this.$ts.folderName
|
||||
}
|
||||
}).then(({ canceled, result: name }) => {
|
||||
if (canceled) return;
|
||||
@ -335,9 +335,9 @@ export default defineComponent({
|
||||
|
||||
renameFolder(folder) {
|
||||
os.dialog({
|
||||
title: this.$t('renameFolder'),
|
||||
title: this.$ts.renameFolder,
|
||||
input: {
|
||||
placeholder: this.$t('inputNewFolderName'),
|
||||
placeholder: this.$ts.inputNewFolderName,
|
||||
default: folder.name
|
||||
}
|
||||
}).then(({ canceled, result: name }) => {
|
||||
@ -363,14 +363,14 @@ export default defineComponent({
|
||||
case 'b0fc8a17-963c-405d-bfbc-859a487295e1':
|
||||
os.dialog({
|
||||
type: 'error',
|
||||
title: this.$t('unableToDelete'),
|
||||
text: this.$t('hasChildFilesOrFolders')
|
||||
title: this.$ts.unableToDelete,
|
||||
text: this.$ts.hasChildFilesOrFolders
|
||||
});
|
||||
break;
|
||||
default:
|
||||
os.dialog({
|
||||
type: 'error',
|
||||
text: this.$t('unableToDelete')
|
||||
text: this.$ts.unableToDelete
|
||||
});
|
||||
}
|
||||
});
|
||||
@ -602,29 +602,29 @@ export default defineComponent({
|
||||
|
||||
getMenu() {
|
||||
return [{
|
||||
text: this.$t('addFile'),
|
||||
text: this.$ts.addFile,
|
||||
type: 'label'
|
||||
}, {
|
||||
text: this.$t('upload'),
|
||||
text: this.$ts.upload,
|
||||
icon: faUpload,
|
||||
action: () => { this.selectLocalFile(); }
|
||||
}, {
|
||||
text: this.$t('fromUrl'),
|
||||
text: this.$ts.fromUrl,
|
||||
icon: faLink,
|
||||
action: () => { this.urlUpload(); }
|
||||
}, null, {
|
||||
text: this.folder ? this.folder.name : this.$t('drive'),
|
||||
text: this.folder ? this.folder.name : this.$ts.drive,
|
||||
type: 'label'
|
||||
}, this.folder ? {
|
||||
text: this.$t('renameFolder'),
|
||||
text: this.$ts.renameFolder,
|
||||
icon: faICursor,
|
||||
action: () => { this.renameFolder(this.folder); }
|
||||
} : undefined, this.folder ? {
|
||||
text: this.$t('deleteFolder'),
|
||||
text: this.$ts.deleteFolder,
|
||||
icon: faTrashAlt,
|
||||
action: () => { this.deleteFolder(this.folder); }
|
||||
} : undefined, {
|
||||
text: this.$t('createFolder'),
|
||||
text: this.$ts.createFolder,
|
||||
icon: faFolderPlus,
|
||||
action: () => { this.createFolder(); }
|
||||
}];
|
||||
|
201
src/client/components/emoji-picker-dialog.vue
Normal file
@ -0,0 +1,201 @@
|
||||
<template>
|
||||
<MkModal ref="modal" :manual-showing="manualShowing" :src="src" @click="$refs.modal.close()" @opening="opening" @close="$emit('close')" @closed="$emit('closed')" v-slot="{ showing }">
|
||||
<MkEmojiPicker v-show="showing !== false" :show-pinned="showPinned" :as-reaction-picker="asReactionPicker" @chosen="chosen" ref="picker"/>
|
||||
</MkModal>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent, markRaw } from 'vue';
|
||||
import MkModal from '@/components/ui/modal.vue';
|
||||
import MkEmojiPicker from '@/components/emoji-picker.vue';
|
||||
|
||||
export default defineComponent({
|
||||
components: {
|
||||
MkModal,
|
||||
MkEmojiPicker,
|
||||
},
|
||||
|
||||
props: {
|
||||
manualShowing: {
|
||||
type: Boolean,
|
||||
required: false,
|
||||
default: null,
|
||||
},
|
||||
src: {
|
||||
required: false
|
||||
},
|
||||
showPinned: {
|
||||
required: false,
|
||||
default: true
|
||||
},
|
||||
asReactionPicker: {
|
||||
required: false
|
||||
},
|
||||
},
|
||||
|
||||
emits: ['done', 'closed'],
|
||||
|
||||
data() {
|
||||
return {
|
||||
|
||||
};
|
||||
},
|
||||
|
||||
methods: {
|
||||
chosen(emoji: any) {
|
||||
this.$emit('done', emoji);
|
||||
this.$refs.modal.close();
|
||||
},
|
||||
|
||||
opening() {
|
||||
this.$refs.picker.reset();
|
||||
this.$refs.picker.focus();
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.omfetrab {
|
||||
$pad: 8px;
|
||||
--eachSize: 40px;
|
||||
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
contain: content;
|
||||
|
||||
&.big {
|
||||
--eachSize: 44px;
|
||||
}
|
||||
|
||||
&.w1 {
|
||||
width: calc((var(--eachSize) * 5) + (#{$pad} * 2));
|
||||
}
|
||||
|
||||
&.w2 {
|
||||
width: calc((var(--eachSize) * 6) + (#{$pad} * 2));
|
||||
}
|
||||
|
||||
&.w3 {
|
||||
width: calc((var(--eachSize) * 7) + (#{$pad} * 2));
|
||||
}
|
||||
|
||||
&.h1 {
|
||||
--height: calc((var(--eachSize) * 4) + (#{$pad} * 2));
|
||||
}
|
||||
|
||||
&.h2 {
|
||||
--height: calc((var(--eachSize) * 6) + (#{$pad} * 2));
|
||||
}
|
||||
|
||||
&.h3 {
|
||||
--height: calc((var(--eachSize) * 8) + (#{$pad} * 2));
|
||||
}
|
||||
|
||||
> .search {
|
||||
width: 100%;
|
||||
padding: 12px;
|
||||
box-sizing: border-box;
|
||||
font-size: 1em;
|
||||
outline: none;
|
||||
border: none;
|
||||
background: transparent;
|
||||
color: var(--fg);
|
||||
|
||||
&:not(.filled) {
|
||||
order: 1;
|
||||
z-index: 2;
|
||||
box-shadow: 0px -1px 0 0px var(--divider);
|
||||
}
|
||||
}
|
||||
|
||||
> .emojis {
|
||||
height: var(--height);
|
||||
overflow-y: auto;
|
||||
overflow-x: hidden;
|
||||
|
||||
scrollbar-width: none;
|
||||
|
||||
&::-webkit-scrollbar {
|
||||
display: none;
|
||||
}
|
||||
|
||||
> .index {
|
||||
min-height: var(--height);
|
||||
position: relative;
|
||||
border-bottom: solid 1px var(--divider);
|
||||
|
||||
> .arrow {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
padding: 16px 0;
|
||||
text-align: center;
|
||||
opacity: 0.5;
|
||||
pointer-events: none;
|
||||
}
|
||||
}
|
||||
|
||||
section {
|
||||
> header {
|
||||
position: sticky;
|
||||
top: 0;
|
||||
left: 0;
|
||||
z-index: 1;
|
||||
padding: 8px;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
> div {
|
||||
padding: $pad;
|
||||
|
||||
> button {
|
||||
position: relative;
|
||||
padding: 0;
|
||||
width: var(--eachSize);
|
||||
height: var(--eachSize);
|
||||
border-radius: 4px;
|
||||
|
||||
&:focus {
|
||||
outline: solid 2px var(--focus);
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
background: rgba(0, 0, 0, 0.05);
|
||||
}
|
||||
|
||||
&:active {
|
||||
background: var(--accent);
|
||||
box-shadow: inset 0 0.15em 0.3em rgba(27, 31, 35, 0.15);
|
||||
}
|
||||
|
||||
> * {
|
||||
font-size: 24px;
|
||||
height: 1.25em;
|
||||
vertical-align: -.25em;
|
||||
pointer-events: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&.result {
|
||||
border-bottom: solid 1px var(--divider);
|
||||
|
||||
&:empty {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
&.unicode {
|
||||
min-height: 384px;
|
||||
}
|
||||
|
||||
&.custom {
|
||||
min-height: 64px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
197
src/client/components/emoji-picker-window.vue
Normal file
@ -0,0 +1,197 @@
|
||||
<template>
|
||||
<MkWindow ref="window"
|
||||
:initial-width="null"
|
||||
:initial-height="null"
|
||||
:can-resize="false"
|
||||
:mini="true"
|
||||
:front="true"
|
||||
@closed="$emit('closed')"
|
||||
>
|
||||
<MkEmojiPicker :show-pinned="showPinned" :as-reaction-picker="asReactionPicker" @chosen="chosen"/>
|
||||
</MkWindow>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent, markRaw } from 'vue';
|
||||
import MkWindow from '@/components/ui/window.vue';
|
||||
import MkEmojiPicker from '@/components/emoji-picker.vue';
|
||||
|
||||
export default defineComponent({
|
||||
components: {
|
||||
MkWindow,
|
||||
MkEmojiPicker,
|
||||
},
|
||||
|
||||
props: {
|
||||
src: {
|
||||
required: false
|
||||
},
|
||||
showPinned: {
|
||||
required: false,
|
||||
default: true
|
||||
},
|
||||
asReactionPicker: {
|
||||
required: false
|
||||
},
|
||||
},
|
||||
|
||||
emits: ['chosen', 'closed'],
|
||||
|
||||
data() {
|
||||
return {
|
||||
|
||||
};
|
||||
},
|
||||
|
||||
methods: {
|
||||
chosen(emoji: any) {
|
||||
this.$emit('chosen', emoji);
|
||||
},
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.omfetrab {
|
||||
$pad: 8px;
|
||||
--eachSize: 40px;
|
||||
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
contain: content;
|
||||
|
||||
&.big {
|
||||
--eachSize: 44px;
|
||||
}
|
||||
|
||||
&.w1 {
|
||||
width: calc((var(--eachSize) * 5) + (#{$pad} * 2));
|
||||
}
|
||||
|
||||
&.w2 {
|
||||
width: calc((var(--eachSize) * 6) + (#{$pad} * 2));
|
||||
}
|
||||
|
||||
&.w3 {
|
||||
width: calc((var(--eachSize) * 7) + (#{$pad} * 2));
|
||||
}
|
||||
|
||||
&.h1 {
|
||||
--height: calc((var(--eachSize) * 4) + (#{$pad} * 2));
|
||||
}
|
||||
|
||||
&.h2 {
|
||||
--height: calc((var(--eachSize) * 6) + (#{$pad} * 2));
|
||||
}
|
||||
|
||||
&.h3 {
|
||||
--height: calc((var(--eachSize) * 8) + (#{$pad} * 2));
|
||||
}
|
||||
|
||||
> .search {
|
||||
width: 100%;
|
||||
padding: 12px;
|
||||
box-sizing: border-box;
|
||||
font-size: 1em;
|
||||
outline: none;
|
||||
border: none;
|
||||
background: transparent;
|
||||
color: var(--fg);
|
||||
|
||||
&:not(.filled) {
|
||||
order: 1;
|
||||
z-index: 2;
|
||||
box-shadow: 0px -1px 0 0px var(--divider);
|
||||
}
|
||||
}
|
||||
|
||||
> .emojis {
|
||||
height: var(--height);
|
||||
overflow-y: auto;
|
||||
overflow-x: hidden;
|
||||
|
||||
scrollbar-width: none;
|
||||
|
||||
&::-webkit-scrollbar {
|
||||
display: none;
|
||||
}
|
||||
|
||||
> .index {
|
||||
min-height: var(--height);
|
||||
position: relative;
|
||||
border-bottom: solid 1px var(--divider);
|
||||
|
||||
> .arrow {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
padding: 16px 0;
|
||||
text-align: center;
|
||||
opacity: 0.5;
|
||||
pointer-events: none;
|
||||
}
|
||||
}
|
||||
|
||||
section {
|
||||
> header {
|
||||
position: sticky;
|
||||
top: 0;
|
||||
left: 0;
|
||||
z-index: 1;
|
||||
padding: 8px;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
> div {
|
||||
padding: $pad;
|
||||
|
||||
> button {
|
||||
position: relative;
|
||||
padding: 0;
|
||||
width: var(--eachSize);
|
||||
height: var(--eachSize);
|
||||
border-radius: 4px;
|
||||
|
||||
&:focus {
|
||||
outline: solid 2px var(--focus);
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
background: rgba(0, 0, 0, 0.05);
|
||||
}
|
||||
|
||||
&:active {
|
||||
background: var(--accent);
|
||||
box-shadow: inset 0 0.15em 0.3em rgba(27, 31, 35, 0.15);
|
||||
}
|
||||
|
||||
> * {
|
||||
font-size: 24px;
|
||||
height: 1.25em;
|
||||
vertical-align: -.25em;
|
||||
pointer-events: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&.result {
|
||||
border-bottom: solid 1px var(--divider);
|
||||
|
||||
&:empty {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
&.unicode {
|
||||
min-height: 384px;
|
||||
}
|
||||
|
||||
&.custom {
|
||||
min-height: 64px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
52
src/client/components/emoji-picker.section.vue
Normal file
@ -0,0 +1,52 @@
|
||||
<template>
|
||||
<section>
|
||||
<header class="_acrylic" @click="shown = !shown">
|
||||
<Fa :icon="shown ? faChevronDown : faChevronUp" :key="shown" fixed-width class="toggle"/> <slot></slot> ({{ emojis.length }})
|
||||
</header>
|
||||
<div v-if="shown">
|
||||
<button v-for="emoji in emojis"
|
||||
class="_button"
|
||||
@click="chosen(emoji, $event)"
|
||||
:key="emoji"
|
||||
>
|
||||
<MkEmoji :emoji="emoji" :normal="true"/>
|
||||
</button>
|
||||
</div>
|
||||
</section>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent, markRaw } from 'vue';
|
||||
import { faChevronUp, faChevronDown } from '@fortawesome/free-solid-svg-icons';
|
||||
import { getStaticImageUrl } from '@/scripts/get-static-image-url';
|
||||
|
||||
export default defineComponent({
|
||||
props: {
|
||||
emojis: {
|
||||
required: true,
|
||||
},
|
||||
initialShown: {
|
||||
required: false
|
||||
}
|
||||
},
|
||||
|
||||
emits: ['chosen'],
|
||||
|
||||
data() {
|
||||
return {
|
||||
getStaticImageUrl,
|
||||
shown: this.initialShown,
|
||||
faChevronUp, faChevronDown,
|
||||
};
|
||||
},
|
||||
|
||||
methods: {
|
||||
chosen(emoji: any, ev) {
|
||||
this.$parent.chosen(emoji, ev);
|
||||
},
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
</style>
|
@ -1,115 +1,96 @@
|
||||
<template>
|
||||
<MkModal ref="modal" :src="src" @click="$refs.modal.close()" @closed="$emit('closed')">
|
||||
<div class="omfetrab _popup" :class="['w' + width, 'h' + height, { big }]">
|
||||
<input ref="search" class="search" :class="{ filled: q != null && q != '' }" v-model.trim="q" :placeholder="$t('search')" @paste.stop="paste" @keyup.enter="done()">
|
||||
<div class="emojis">
|
||||
<section class="result">
|
||||
<div v-if="searchResultCustom.length > 0">
|
||||
<button v-for="emoji in searchResultCustom"
|
||||
<div class="omfetrab _popup" :class="['w' + width, 'h' + height, { big }]">
|
||||
<input ref="search" class="search" data-prevent-emoji-insert :class="{ filled: q != null && q != '' }" v-model.trim="q" :placeholder="$ts.search" @paste.stop="paste" @keyup.enter="done()">
|
||||
<div class="emojis" ref="emojis">
|
||||
<section class="result">
|
||||
<div v-if="searchResultCustom.length > 0">
|
||||
<button v-for="emoji in searchResultCustom"
|
||||
class="_button"
|
||||
:title="emoji.name"
|
||||
@click="chosen(emoji, $event)"
|
||||
:key="emoji"
|
||||
tabindex="0"
|
||||
>
|
||||
<MkEmoji v-if="emoji.char != null" :emoji="emoji.char"/>
|
||||
<img v-else :src="$store.state.disableShowingAnimatedImages ? getStaticImageUrl(emoji.url) : emoji.url"/>
|
||||
</button>
|
||||
</div>
|
||||
<div v-if="searchResultUnicode.length > 0">
|
||||
<button v-for="emoji in searchResultUnicode"
|
||||
class="_button"
|
||||
:title="emoji.name"
|
||||
@click="chosen(emoji, $event)"
|
||||
:key="emoji.name"
|
||||
tabindex="0"
|
||||
>
|
||||
<MkEmoji :emoji="emoji.char"/>
|
||||
</button>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<div class="index" v-if="tab === 'index'">
|
||||
<section v-if="showPinned">
|
||||
<div>
|
||||
<button v-for="emoji in pinned"
|
||||
class="_button"
|
||||
@click="chosen(emoji, $event)"
|
||||
tabindex="0"
|
||||
>
|
||||
<MkEmoji :emoji="emoji" :normal="true"/>
|
||||
</button>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<header class="_acrylic"><Fa :icon="faClock" fixed-width/> {{ $ts.recentUsed }}</header>
|
||||
<div>
|
||||
<button v-for="emoji in $store.state.recentlyUsedEmojis"
|
||||
class="_button"
|
||||
:title="emoji.name"
|
||||
@click="chosen(emoji, $event)"
|
||||
:key="emoji"
|
||||
tabindex="0"
|
||||
>
|
||||
<MkEmoji v-if="emoji.char != null" :emoji="emoji.char"/>
|
||||
<img v-else :src="$store.state.device.disableShowingAnimatedImages ? getStaticImageUrl(emoji.url) : emoji.url"/>
|
||||
</button>
|
||||
</div>
|
||||
<div v-if="searchResultUnicode.length > 0">
|
||||
<button v-for="emoji in searchResultUnicode"
|
||||
class="_button"
|
||||
:title="emoji.name"
|
||||
@click="chosen(emoji, $event)"
|
||||
:key="emoji.name"
|
||||
tabindex="0"
|
||||
>
|
||||
<MkEmoji :emoji="emoji.char"/>
|
||||
</button>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<div class="index">
|
||||
<section v-if="showPinned">
|
||||
<div>
|
||||
<button v-for="emoji in pinned"
|
||||
class="_button"
|
||||
@click="chosen(emoji, $event)"
|
||||
tabindex="0"
|
||||
>
|
||||
<MkEmoji :emoji="emoji" :normal="true"/>
|
||||
</button>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<header class="_acrylic"><Fa :icon="faClock" fixed-width/> {{ $t('recentUsed') }}</header>
|
||||
<div>
|
||||
<button v-for="emoji in $store.state.device.recentlyUsedEmojis"
|
||||
class="_button"
|
||||
@click="chosen(emoji, $event)"
|
||||
:key="emoji"
|
||||
>
|
||||
<MkEmoji :emoji="emoji" :normal="true"/>
|
||||
</button>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<div class="arrow"><Fa :icon="faChevronDown"/></div>
|
||||
</div>
|
||||
|
||||
<section v-for="category in customEmojiCategories" :key="'custom:' + category" class="custom">
|
||||
<header class="_acrylic" v-appear="() => visibleCategories[category] = true">{{ category || $t('other') }}</header>
|
||||
<div v-if="visibleCategories[category]">
|
||||
<button v-for="emoji in customEmojis.filter(e => e.category === category)"
|
||||
class="_button"
|
||||
:title="emoji.name"
|
||||
@click="chosen(emoji, $event)"
|
||||
:key="emoji.name"
|
||||
>
|
||||
<img :src="$store.state.device.disableShowingAnimatedImages ? getStaticImageUrl(emoji.url) : emoji.url"/>
|
||||
</button>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section v-for="category in categories" :key="category.name" class="unicode">
|
||||
<header class="_acrylic" v-appear="() => category.isActive = true"><Fa :icon="category.icon" fixed-width/> {{ category.name }}</header>
|
||||
<div v-if="category.isActive">
|
||||
<button v-for="emoji in emojilist.filter(e => e.category === category.name)"
|
||||
class="_button"
|
||||
:title="emoji.name"
|
||||
@click="chosen(emoji, $event)"
|
||||
:key="emoji.name"
|
||||
>
|
||||
<MkEmoji :emoji="emoji.char"/>
|
||||
<MkEmoji :emoji="emoji" :normal="true"/>
|
||||
</button>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
<div>
|
||||
<header class="_acrylic">{{ $ts.customEmojis }}</header>
|
||||
<XSection v-for="category in customEmojiCategories" :key="'custom:' + category" :initial-shown="false" :emojis="customEmojis.filter(e => e.category === category).map(e => ':' + e.name + ':')">{{ category || $ts.other }}</XSection>
|
||||
</div>
|
||||
<div>
|
||||
<header class="_acrylic">{{ $ts.emoji }}</header>
|
||||
<XSection v-for="category in categories" :emojis="emojilist.filter(e => e.category === category).map(e => e.char)">{{ category }}</XSection>
|
||||
</div>
|
||||
</div>
|
||||
</MkModal>
|
||||
<div class="tabs">
|
||||
<button class="_button tab" :class="{ active: tab === 'index' }" @click="tab = 'index'"><Fa :icon="faAsterisk" fixed-width/></button>
|
||||
<button class="_button tab" :class="{ active: tab === 'custom' }" @click="tab = 'custom'"><Fa :icon="faLaugh" fixed-width/></button>
|
||||
<button class="_button tab" :class="{ active: tab === 'unicode' }" @click="tab = 'unicode'"><Fa :icon="faLeaf" fixed-width/></button>
|
||||
<button class="_button tab" :class="{ active: tab === 'tags' }" @click="tab = 'tags'"><Fa :icon="faHashtag" fixed-width/></button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent, markRaw } from 'vue';
|
||||
import { emojilist } from '../../misc/emojilist';
|
||||
import { getStaticImageUrl } from '@/scripts/get-static-image-url';
|
||||
import { faAsterisk, faLeaf, faUtensils, faFutbol, faCity, faDice, faGlobe, faClock, faUser, faChevronDown } from '@fortawesome/free-solid-svg-icons';
|
||||
import { faAsterisk, faLeaf, faUtensils, faFutbol, faCity, faDice, faGlobe, faClock, faUser, faChevronDown, faShapes, faBicycle, faHashtag } from '@fortawesome/free-solid-svg-icons';
|
||||
import { faHeart, faFlag, faLaugh } from '@fortawesome/free-regular-svg-icons';
|
||||
import MkModal from '@/components/ui/modal.vue';
|
||||
import Particle from '@/components/particle.vue';
|
||||
import * as os from '@/os';
|
||||
import { isDeviceTouch } from '../scripts/is-device-touch';
|
||||
import { isDeviceTouch } from '@/scripts/is-device-touch';
|
||||
import { isMobile } from '@/scripts/is-mobile';
|
||||
import { emojiCategories } from '@/instance';
|
||||
import XSection from './emoji-picker.section.vue';
|
||||
|
||||
export default defineComponent({
|
||||
components: {
|
||||
MkModal,
|
||||
XSection
|
||||
},
|
||||
|
||||
props: {
|
||||
src: {
|
||||
required: false
|
||||
},
|
||||
showPinned: {
|
||||
required: false,
|
||||
default: true
|
||||
@ -119,66 +100,31 @@ export default defineComponent({
|
||||
},
|
||||
},
|
||||
|
||||
emits: ['done', 'closed'],
|
||||
emits: ['chosen'],
|
||||
|
||||
data() {
|
||||
return {
|
||||
emojilist: markRaw(emojilist),
|
||||
getStaticImageUrl,
|
||||
pinned: this.$store.state.settings.reactions,
|
||||
width: this.asReactionPicker ? this.$store.state.device.reactionPickerWidth : 3,
|
||||
height: this.asReactionPicker ? this.$store.state.device.reactionPickerHeight : 2,
|
||||
pinned: this.$store.state.reactions,
|
||||
width: this.asReactionPicker ? this.$store.state.reactionPickerWidth : 3,
|
||||
height: this.asReactionPicker ? this.$store.state.reactionPickerHeight : 2,
|
||||
big: this.asReactionPicker ? isDeviceTouch : false,
|
||||
customEmojiCategories: this.$store.getters['instance/emojiCategories'],
|
||||
customEmojis: this.$store.state.instance.meta.emojis,
|
||||
visibleCategories: {},
|
||||
customEmojiCategories: emojiCategories,
|
||||
customEmojis: this.$instance.emojis,
|
||||
q: null,
|
||||
searchResultCustom: [],
|
||||
searchResultUnicode: [],
|
||||
faGlobe, faClock, faChevronDown,
|
||||
categories: [{
|
||||
name: 'face',
|
||||
icon: faLaugh,
|
||||
isActive: false
|
||||
}, {
|
||||
name: 'people',
|
||||
icon: faUser,
|
||||
isActive: false
|
||||
}, {
|
||||
name: 'animals_and_nature',
|
||||
icon: faLeaf,
|
||||
isActive: false
|
||||
}, {
|
||||
name: 'food_and_drink',
|
||||
icon: faUtensils,
|
||||
isActive: false
|
||||
}, {
|
||||
name: 'activity',
|
||||
icon: faFutbol,
|
||||
isActive: false
|
||||
}, {
|
||||
name: 'travel_and_places',
|
||||
icon: faCity,
|
||||
isActive: false
|
||||
}, {
|
||||
name: 'objects',
|
||||
icon: faDice,
|
||||
isActive: false
|
||||
}, {
|
||||
name: 'symbols',
|
||||
icon: faHeart,
|
||||
isActive: false
|
||||
}, {
|
||||
name: 'flags',
|
||||
icon: faFlag,
|
||||
isActive: false
|
||||
}],
|
||||
faAsterisk
|
||||
tab: 'index',
|
||||
categories: ['face', 'people', 'animals_and_nature', 'food_and_drink', 'activity', 'travel_and_places', 'objects', 'symbols', 'flags'],
|
||||
faGlobe, faClock, faChevronDown, faAsterisk, faLaugh, faUtensils, faLeaf, faShapes, faBicycle, faHashtag,
|
||||
};
|
||||
},
|
||||
|
||||
watch: {
|
||||
q() {
|
||||
this.$refs.emojis.scrollTop = 0;
|
||||
|
||||
if (this.q == null || this.q === '') {
|
||||
this.searchResultCustom = [];
|
||||
this.searchResultUnicode = [];
|
||||
@ -319,14 +265,22 @@ export default defineComponent({
|
||||
},
|
||||
|
||||
mounted() {
|
||||
if (!os.isMobile) {
|
||||
this.$refs.search.focus({
|
||||
preventScroll: true
|
||||
});
|
||||
}
|
||||
this.focus();
|
||||
},
|
||||
|
||||
methods: {
|
||||
focus() {
|
||||
if (!isMobile && !isDeviceTouch) {
|
||||
this.$refs.search.focus({
|
||||
preventScroll: true
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
reset() {
|
||||
this.$refs.emojis.scrollTop = 0;
|
||||
},
|
||||
|
||||
getKey(emoji: any) {
|
||||
return typeof emoji === 'string' ? emoji : (emoji.char || `:${emoji.name}:`);
|
||||
},
|
||||
@ -341,15 +295,14 @@ export default defineComponent({
|
||||
}
|
||||
|
||||
const key = this.getKey(emoji);
|
||||
this.$emit('done', key);
|
||||
this.$refs.modal.close();
|
||||
this.$emit('chosen', key);
|
||||
|
||||
// 最近使った絵文字更新
|
||||
if (!this.pinned.includes(key)) {
|
||||
let recents = this.$store.state.device.recentlyUsedEmojis;
|
||||
let recents = this.$store.state.recentlyUsedEmojis;
|
||||
recents = recents.filter((e: any) => e !== key);
|
||||
recents.unshift(key);
|
||||
this.$store.commit('device/set', { key: 'recentlyUsedEmojis', value: recents.splice(0, 16) });
|
||||
this.$store.set('recentlyUsedEmojis', recents.splice(0, 32));
|
||||
}
|
||||
},
|
||||
|
||||
@ -441,6 +394,22 @@ export default defineComponent({
|
||||
}
|
||||
}
|
||||
|
||||
> .tabs {
|
||||
display: flex;
|
||||
display: none;
|
||||
|
||||
> .tab {
|
||||
flex: 1;
|
||||
height: 38px;
|
||||
border-top: solid 1px var(--divider);
|
||||
|
||||
&.active {
|
||||
border-top: solid 1px var(--accent);
|
||||
color: var(--accent);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
> .emojis {
|
||||
height: var(--height);
|
||||
overflow-y: auto;
|
||||
@ -452,34 +421,43 @@ export default defineComponent({
|
||||
display: none;
|
||||
}
|
||||
|
||||
> .index {
|
||||
min-height: var(--height);
|
||||
position: relative;
|
||||
border-bottom: solid 1px var(--divider);
|
||||
|
||||
> .arrow {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
padding: 16px 0;
|
||||
text-align: center;
|
||||
opacity: 0.5;
|
||||
pointer-events: none;
|
||||
> div {
|
||||
&:not(.index) {
|
||||
padding: 4px 0 8px 0;
|
||||
border-top: solid 1px var(--divider);
|
||||
}
|
||||
|
||||
> header {
|
||||
/*position: sticky;
|
||||
top: 0;
|
||||
left: 0;*/
|
||||
height: 32px;
|
||||
line-height: 32px;
|
||||
z-index: 2;
|
||||
padding: 0 8px;
|
||||
font-size: 12px;
|
||||
}
|
||||
}
|
||||
|
||||
section {
|
||||
::v-deep(section) {
|
||||
> header {
|
||||
position: sticky;
|
||||
top: 0;
|
||||
left: 0;
|
||||
height: 32px;
|
||||
line-height: 32px;
|
||||
z-index: 1;
|
||||
padding: 8px;
|
||||
padding: 0 8px;
|
||||
font-size: 12px;
|
||||
cursor: pointer;
|
||||
|
||||
&:hover {
|
||||
color: var(--accent);
|
||||
}
|
||||
}
|
||||
|
||||
> div {
|
||||
position: relative;
|
||||
padding: $pad;
|
||||
|
||||
> button {
|
||||
@ -519,14 +497,6 @@ export default defineComponent({
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
&.unicode {
|
||||
min-height: 384px;
|
||||
}
|
||||
|
||||
&.custom {
|
||||
min-height: 64px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
34
src/client/components/featured-photos.vue
Normal file
@ -0,0 +1,34 @@
|
||||
<template>
|
||||
<div class="xfbouadm" v-if="meta" :style="{ backgroundImage: `url(${ meta.backgroundImageUrl })` }">
|
||||
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent } from 'vue';
|
||||
import * as os from '@/os';
|
||||
|
||||
export default defineComponent({
|
||||
components: {
|
||||
},
|
||||
|
||||
data() {
|
||||
return {
|
||||
meta: null,
|
||||
};
|
||||
},
|
||||
|
||||
created() {
|
||||
os.api('meta', { detail: true }).then(meta => {
|
||||
this.meta = meta;
|
||||
});
|
||||
},
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.xfbouadm {
|
||||
background-position: center;
|
||||
background-size: cover;
|
||||
}
|
||||
</style>
|
@ -6,23 +6,23 @@
|
||||
>
|
||||
<template v-if="!wait">
|
||||
<template v-if="hasPendingFollowRequestFromYou && user.isLocked">
|
||||
<span v-if="full">{{ $t('followRequestPending') }}</span><Fa :icon="faHourglassHalf"/>
|
||||
<span v-if="full">{{ $ts.followRequestPending }}</span><Fa :icon="faHourglassHalf"/>
|
||||
</template>
|
||||
<template v-else-if="hasPendingFollowRequestFromYou && !user.isLocked"> <!-- つまりリモートフォローの場合。 -->
|
||||
<span v-if="full">{{ $t('processing') }}</span><Fa :icon="faSpinner" pulse/>
|
||||
<span v-if="full">{{ $ts.processing }}</span><Fa :icon="faSpinner" pulse/>
|
||||
</template>
|
||||
<template v-else-if="isFollowing">
|
||||
<span v-if="full">{{ $t('unfollow') }}</span><Fa :icon="faMinus"/>
|
||||
<span v-if="full">{{ $ts.unfollow }}</span><Fa :icon="faMinus"/>
|
||||
</template>
|
||||
<template v-else-if="!isFollowing && user.isLocked">
|
||||
<span v-if="full">{{ $t('followRequest') }}</span><Fa :icon="faPlus"/>
|
||||
<span v-if="full">{{ $ts.followRequest }}</span><Fa :icon="faPlus"/>
|
||||
</template>
|
||||
<template v-else-if="!isFollowing && !user.isLocked">
|
||||
<span v-if="full">{{ $t('follow') }}</span><Fa :icon="faPlus"/>
|
||||
<span v-if="full">{{ $ts.follow }}</span><Fa :icon="faPlus"/>
|
||||
</template>
|
||||
</template>
|
||||
<template v-else>
|
||||
<span v-if="full">{{ $t('processing') }}</span><Fa :icon="faSpinner" pulse fixed-width/>
|
||||
<span v-if="full">{{ $ts.processing }}</span><Fa :icon="faSpinner" pulse fixed-width/>
|
||||
</template>
|
||||
</button>
|
||||
</template>
|
||||
|
@ -15,15 +15,15 @@
|
||||
<FormBase class="xkpnjxcv">
|
||||
<template v-for="item in Object.keys(form).filter(item => !form[item].hidden)">
|
||||
<FormInput v-if="form[item].type === 'number'" v-model:value="values[item]" type="number" :step="form[item].step || 1">
|
||||
<span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $t('optional') }})</span>
|
||||
<span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $ts.optional }})</span>
|
||||
<template v-if="form[item].description" #desc>{{ form[item].description }}</template>
|
||||
</FormInput>
|
||||
<FormInput v-else-if="form[item].type === 'string' && !form[item].multiline" v-model:value="values[item]" type="text">
|
||||
<span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $t('optional') }})</span>
|
||||
<span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $ts.optional }})</span>
|
||||
<template v-if="form[item].description" #desc>{{ form[item].description }}</template>
|
||||
</FormInput>
|
||||
<FormTextarea v-else-if="form[item].type === 'string' && form[item].multiline" v-model:value="values[item]">
|
||||
<span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $t('optional') }})</span>
|
||||
<span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $ts.optional }})</span>
|
||||
<template v-if="form[item].description" #desc>{{ form[item].description }}</template>
|
||||
</FormTextarea>
|
||||
<FormSwitch v-else-if="form[item].type === 'boolean'" v-model:value="values[item]">
|
||||
@ -31,11 +31,11 @@
|
||||
<template v-if="form[item].description" #desc>{{ form[item].description }}</template>
|
||||
</FormSwitch>
|
||||
<FormSelect v-else-if="form[item].type === 'enum'" v-model:value="values[item]">
|
||||
<template #label><span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $t('optional') }})</span></template>
|
||||
<template #label><span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $ts.optional }})</span></template>
|
||||
<option v-for="item in form[item].enum" :value="item.value" :key="item.value">{{ item.label }}</option>
|
||||
</FormSelect>
|
||||
<FormRange v-else-if="form[item].type === 'range'" v-model:value="values[item]" :min="form[item].mim" :max="form[item].max" :step="form[item].step">
|
||||
<template #label><span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $t('optional') }})</span></template>
|
||||
<template #label><span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ $ts.optional }})</span></template>
|
||||
<template v-if="form[item].description" #desc>{{ form[item].description }}</template>
|
||||
</FormRange>
|
||||
<FormButton v-else-if="form[item].type === 'button'" @click="form[item].action($event, values)">
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
&._formClickable {
|
||||
&:hover {
|
||||
background: var(--panelHighlight);
|
||||
//background: var(--panelHighlight);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -12,6 +12,7 @@
|
||||
._formLabel {
|
||||
font-size: 80%;
|
||||
padding: 0 16px 8px 16px;
|
||||
opacity: 0.8;
|
||||
|
||||
&:empty {
|
||||
display: none;
|
||||
@ -21,6 +22,7 @@
|
||||
._formCaption {
|
||||
font-size: 80%;
|
||||
padding: 8px 16px 0 16px;
|
||||
opacity: 0.8;
|
||||
|
||||
&:empty {
|
||||
display: none;
|
||||
|
@ -1,63 +1,50 @@
|
||||
<template>
|
||||
<div class="ztzhwixg _formItem" :class="{ inline, disabled }">
|
||||
<div class="_formLabel"><slot></slot></div>
|
||||
<div class="icon" ref="icon"><slot name="icon"></slot></div>
|
||||
<div class="input _formPanel">
|
||||
<div class="prefix" ref="prefixEl"><slot name="prefix"></slot></div>
|
||||
<input v-if="debounce" ref="inputEl"
|
||||
v-debounce="500"
|
||||
:type="type"
|
||||
v-model.lazy="v"
|
||||
:disabled="disabled"
|
||||
:required="required"
|
||||
:readonly="readonly"
|
||||
:placeholder="placeholder"
|
||||
:pattern="pattern"
|
||||
:autocomplete="autocomplete"
|
||||
:spellcheck="spellcheck"
|
||||
:step="step"
|
||||
@focus="focused = true"
|
||||
@blur="focused = false"
|
||||
@keydown="onKeydown($event)"
|
||||
@input="onInput"
|
||||
:list="id"
|
||||
>
|
||||
<input v-else ref="inputEl"
|
||||
:type="type"
|
||||
v-model="v"
|
||||
:disabled="disabled"
|
||||
:required="required"
|
||||
:readonly="readonly"
|
||||
:placeholder="placeholder"
|
||||
:pattern="pattern"
|
||||
:autocomplete="autocomplete"
|
||||
:spellcheck="spellcheck"
|
||||
:step="step"
|
||||
@focus="focused = true"
|
||||
@blur="focused = false"
|
||||
@keydown="onKeydown($event)"
|
||||
@input="onInput"
|
||||
:list="id"
|
||||
>
|
||||
<datalist :id="id" v-if="datalist">
|
||||
<option v-for="data in datalist" :value="data"/>
|
||||
</datalist>
|
||||
<div class="suffix" ref="suffixEl"><slot name="suffix"></slot></div>
|
||||
<FormGroup class="_formItem">
|
||||
<template #label><slot></slot></template>
|
||||
<div class="ztzhwixg _formItem" :class="{ inline, disabled }">
|
||||
<div class="icon" ref="icon"><slot name="icon"></slot></div>
|
||||
<div class="input _formPanel">
|
||||
<div class="prefix" ref="prefixEl"><slot name="prefix"></slot></div>
|
||||
<input ref="inputEl"
|
||||
:type="type"
|
||||
v-model="v"
|
||||
:disabled="disabled"
|
||||
:required="required"
|
||||
:readonly="readonly"
|
||||
:placeholder="placeholder"
|
||||
:pattern="pattern"
|
||||
:autocomplete="autocomplete"
|
||||
:spellcheck="spellcheck"
|
||||
:step="step"
|
||||
@focus="focused = true"
|
||||
@blur="focused = false"
|
||||
@keydown="onKeydown($event)"
|
||||
@input="onInput"
|
||||
:list="id"
|
||||
>
|
||||
<datalist :id="id" v-if="datalist">
|
||||
<option v-for="data in datalist" :value="data"/>
|
||||
</datalist>
|
||||
<div class="suffix" ref="suffixEl"><slot name="suffix"></slot></div>
|
||||
</div>
|
||||
</div>
|
||||
<button class="save _textButton" v-if="save && changed" @click="() => { changed = false; save(); }">{{ $t('save') }}</button>
|
||||
<div class="_formCaption"><slot name="desc"></slot></div>
|
||||
</div>
|
||||
<template #caption><slot name="desc"></slot></template>
|
||||
|
||||
<FormButton v-if="manualSave && changed" @click="updated" primary><Fa :icon="faSave"/> {{ $ts.save }}</FormButton>
|
||||
</FormGroup>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent, onMounted, onUnmounted, nextTick, ref, watch, computed, toRefs } from 'vue';
|
||||
import debounce from 'v-debounce';
|
||||
import { faExclamationCircle } from '@fortawesome/free-solid-svg-icons';
|
||||
import { faExclamationCircle, faSave } from '@fortawesome/free-solid-svg-icons';
|
||||
import './form.scss';
|
||||
import FormButton from './button.vue';
|
||||
import FormGroup from './group.vue';
|
||||
|
||||
export default defineComponent({
|
||||
directives: {
|
||||
debounce
|
||||
components: {
|
||||
FormGroup,
|
||||
FormButton,
|
||||
},
|
||||
props: {
|
||||
value: {
|
||||
@ -101,9 +88,6 @@ export default defineComponent({
|
||||
step: {
|
||||
required: false
|
||||
},
|
||||
debounce: {
|
||||
required: false
|
||||
},
|
||||
datalist: {
|
||||
type: Array,
|
||||
required: false,
|
||||
@ -113,9 +97,10 @@ export default defineComponent({
|
||||
required: false,
|
||||
default: false
|
||||
},
|
||||
save: {
|
||||
type: Function,
|
||||
manualSave: {
|
||||
type: Boolean,
|
||||
required: false,
|
||||
default: false
|
||||
},
|
||||
},
|
||||
emits: ['change', 'keydown', 'enter'],
|
||||
@ -144,15 +129,22 @@ export default defineComponent({
|
||||
}
|
||||
};
|
||||
|
||||
const updated = () => {
|
||||
changed.value = false;
|
||||
if (type?.value === 'number') {
|
||||
context.emit('update:value', parseFloat(v.value));
|
||||
} else {
|
||||
context.emit('update:value', v.value);
|
||||
}
|
||||
};
|
||||
|
||||
watch(value, newValue => {
|
||||
v.value = newValue;
|
||||
});
|
||||
|
||||
watch(v, newValue => {
|
||||
if (type?.value === 'number') {
|
||||
context.emit('update:value', parseFloat(newValue));
|
||||
} else {
|
||||
context.emit('update:value', newValue);
|
||||
if (!props.manualSave) {
|
||||
updated();
|
||||
}
|
||||
|
||||
invalid.value = inputEl.value.validity.badInput;
|
||||
@ -198,7 +190,8 @@ export default defineComponent({
|
||||
focus,
|
||||
onInput,
|
||||
onKeydown,
|
||||
faExclamationCircle,
|
||||
updated,
|
||||
faExclamationCircle, faSave,
|
||||
};
|
||||
},
|
||||
});
|
||||
@ -285,11 +278,6 @@ export default defineComponent({
|
||||
}
|
||||
}
|
||||
|
||||
> .save {
|
||||
margin: 6px 0 0 0;
|
||||
font-size: 0.8em;
|
||||
}
|
||||
|
||||
&.inline {
|
||||
display: inline-block;
|
||||
margin: 0;
|
||||
|
@ -8,7 +8,7 @@
|
||||
<Fa :icon="faExternalLinkAlt" class="icon"/>
|
||||
</span>
|
||||
</a>
|
||||
<MkA class="main _button _formPanel _formClickable" :class="{ active }" :to="to" v-else>
|
||||
<MkA class="main _button _formPanel _formClickable" :class="{ active }" :to="to" :behavior="behavior" v-else>
|
||||
<span class="icon"><slot name="icon"></slot></span>
|
||||
<span class="text"><slot></slot></span>
|
||||
<span class="right">
|
||||
@ -38,6 +38,10 @@ export default defineComponent({
|
||||
type: Boolean,
|
||||
required: false
|
||||
},
|
||||
behavior: {
|
||||
type: String,
|
||||
required: false,
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
|
@ -6,7 +6,7 @@
|
||||
<slot name="empty"></slot>
|
||||
</div>
|
||||
<FormButton v-show="more" class="button" @click="fetchMore" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }" primary>
|
||||
<template v-if="!moreFetching">{{ $t('loadMore') }}</template>
|
||||
<template v-if="!moreFetching">{{ $ts.loadMore }}</template>
|
||||
<template v-if="moreFetching"><MkLoading inline/></template>
|
||||
</FormButton>
|
||||
</FormGroup>
|
||||
|
@ -1,29 +1,39 @@
|
||||
<template>
|
||||
<div class="rivhosbp _formItem" :class="{ tall, pre }">
|
||||
<div class="_formLabel"><slot></slot></div>
|
||||
<div class="input _formPanel">
|
||||
<textarea ref="input" :class="{ code, _monospace: code }"
|
||||
:value="value"
|
||||
:required="required"
|
||||
:readonly="readonly"
|
||||
:pattern="pattern"
|
||||
:autocomplete="autocomplete"
|
||||
:spellcheck="!code"
|
||||
@input="onInput"
|
||||
@focus="focused = true"
|
||||
@blur="focused = false"
|
||||
></textarea>
|
||||
<FormGroup class="_formItem">
|
||||
<template #label><slot></slot></template>
|
||||
<div class="rivhosbp _formItem" :class="{ tall, pre }">
|
||||
<div class="input _formPanel">
|
||||
<textarea ref="input" :class="{ code, _monospace: code }"
|
||||
v-model="v"
|
||||
:required="required"
|
||||
:readonly="readonly"
|
||||
:pattern="pattern"
|
||||
:autocomplete="autocomplete"
|
||||
:spellcheck="!code"
|
||||
@input="onInput"
|
||||
@focus="focused = true"
|
||||
@blur="focused = false"
|
||||
></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<button class="save _textButton" v-if="save && changed" @click="() => { changed = false; save(); }">{{ $t('save') }}</button>
|
||||
<div class="_formCaption"><slot name="desc"></slot></div>
|
||||
</div>
|
||||
<template #caption><slot name="desc"></slot></template>
|
||||
|
||||
<FormButton v-if="manualSave && changed" @click="updated" primary><Fa :icon="faSave"/> {{ $ts.save }}</FormButton>
|
||||
</FormGroup>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent } from 'vue';
|
||||
import { defineComponent, ref, toRefs, watch } from 'vue';
|
||||
import { faSave } from '@fortawesome/free-solid-svg-icons';
|
||||
import './form.scss';
|
||||
import FormButton from './button.vue';
|
||||
import FormGroup from './group.vue';
|
||||
|
||||
export default defineComponent({
|
||||
components: {
|
||||
FormGroup,
|
||||
FormButton,
|
||||
},
|
||||
props: {
|
||||
value: {
|
||||
required: false
|
||||
@ -58,24 +68,46 @@ export default defineComponent({
|
||||
required: false,
|
||||
default: false
|
||||
},
|
||||
save: {
|
||||
type: Function,
|
||||
manualSave: {
|
||||
type: Boolean,
|
||||
required: false,
|
||||
default: false
|
||||
},
|
||||
},
|
||||
data() {
|
||||
setup(props, context) {
|
||||
const { value } = toRefs(props);
|
||||
const v = ref(value.value);
|
||||
const changed = ref(false);
|
||||
const inputEl = ref(null);
|
||||
const focus = () => inputEl.value.focus();
|
||||
const onInput = (ev) => {
|
||||
changed.value = true;
|
||||
context.emit('change', ev);
|
||||
};
|
||||
|
||||
const updated = () => {
|
||||
changed.value = false;
|
||||
context.emit('update:value', v.value);
|
||||
};
|
||||
|
||||
watch(value, newValue => {
|
||||
v.value = newValue;
|
||||
});
|
||||
|
||||
watch(v, newValue => {
|
||||
if (!props.manualSave) {
|
||||
updated();
|
||||
}
|
||||
});
|
||||
|
||||
return {
|
||||
changed: false,
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
focus() {
|
||||
this.$refs.input.focus();
|
||||
},
|
||||
onInput(ev) {
|
||||
this.changed = true;
|
||||
this.$emit('update:value', ev.target.value);
|
||||
}
|
||||
v,
|
||||
updated,
|
||||
changed,
|
||||
focus,
|
||||
onInput,
|
||||
faSave,
|
||||
};
|
||||
}
|
||||
});
|
||||
</script>
|
||||
@ -112,11 +144,6 @@ export default defineComponent({
|
||||
}
|
||||
}
|
||||
|
||||
> .save {
|
||||
margin: 6px 0 0 0;
|
||||
font-size: 0.8em;
|
||||
}
|
||||
|
||||
&.tall {
|
||||
> .input {
|
||||
> textarea {
|
||||
|
@ -10,8 +10,9 @@ import { faExpandAlt, faColumns, faExternalLinkAlt, faLink, faWindowMaximize } f
|
||||
import * as os from '@/os';
|
||||
import copyToClipboard from '@/scripts/copy-to-clipboard';
|
||||
import { router } from '@/router';
|
||||
import { ui, url } from '@/config';
|
||||
import { url } from '@/config';
|
||||
import { popout } from '@/scripts/popout';
|
||||
import { ColdDeviceStorage } from '@/store';
|
||||
|
||||
export default defineComponent({
|
||||
inject: {
|
||||
@ -57,31 +58,31 @@ export default defineComponent({
|
||||
text: this.to,
|
||||
}, {
|
||||
icon: faWindowMaximize,
|
||||
text: this.$t('openInWindow'),
|
||||
text: this.$ts.openInWindow,
|
||||
action: () => {
|
||||
os.pageWindow(this.to);
|
||||
}
|
||||
}, this.sideViewHook ? {
|
||||
icon: faColumns,
|
||||
text: this.$t('openInSideView'),
|
||||
text: this.$ts.openInSideView,
|
||||
action: () => {
|
||||
this.sideViewHook(this.to);
|
||||
}
|
||||
} : undefined, {
|
||||
icon: faExpandAlt,
|
||||
text: this.$t('showInPage'),
|
||||
text: this.$ts.showInPage,
|
||||
action: () => {
|
||||
this.$router.push(this.to);
|
||||
}
|
||||
}, null, {
|
||||
icon: faExternalLinkAlt,
|
||||
text: this.$t('openInNewTab'),
|
||||
text: this.$ts.openInNewTab,
|
||||
action: () => {
|
||||
window.open(this.to, '_blank');
|
||||
}
|
||||
}, {
|
||||
icon: faLink,
|
||||
text: this.$t('copyLink'),
|
||||
text: this.$ts.copyLink,
|
||||
action: () => {
|
||||
copyToClipboard(`${url}${this.to}`);
|
||||
}
|
||||
@ -97,9 +98,14 @@ export default defineComponent({
|
||||
},
|
||||
|
||||
nav() {
|
||||
if (this.behavior === 'browser') {
|
||||
location.href = this.to;
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.to.startsWith('/my/messaging')) {
|
||||
if (this.$store.state.device.chatOpenBehavior === 'window') return this.window();
|
||||
if (this.$store.state.device.chatOpenBehavior === 'popout') return this.popout();
|
||||
if (ColdDeviceStorage.get('chatOpenBehavior') === 'window') return this.window();
|
||||
if (ColdDeviceStorage.get('chatOpenBehavior') === 'popout') return this.popout();
|
||||
}
|
||||
|
||||
if (this.behavior) {
|
||||
@ -111,15 +117,9 @@ export default defineComponent({
|
||||
if (this.navHook) {
|
||||
this.navHook(this.to);
|
||||
} else {
|
||||
if (this.$store.state.device.defaultSideView && this.sideViewHook && this.to !== '/') {
|
||||
if (this.$store.state.defaultSideView && this.sideViewHook && this.to !== '/') {
|
||||
return this.sideViewHook(this.to);
|
||||
}
|
||||
if (this.$store.state.device.deckNavWindow && (ui === 'deck') && this.to !== '/') {
|
||||
return this.window();
|
||||
}
|
||||
if (ui === 'desktop') {
|
||||
return this.window();
|
||||
}
|
||||
|
||||
if (this.$router.currentRoute.value.path === this.to) {
|
||||
window.scroll({ top: 0, behavior: 'smooth' });
|
@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<span class="mk-acct" v-once>
|
||||
<span class="name">@{{ user.username }}</span>
|
||||
<span class="host" v-if="user.host || detail || $store.state.settings.showFullAcct">@{{ user.host || host }}</span>
|
||||
<span class="host" v-if="user.host || detail || $store.state.showFullAcct">@{{ user.host || host }}</span>
|
||||
</span>
|
||||
</template>
|
||||
|
@ -1,9 +1,9 @@
|
||||
<template>
|
||||
<span class="eiwwqkts" :class="{ cat }" :title="acct(user)" v-if="disableLink" v-user-preview="disablePreview ? undefined : user.id" @click="onClick">
|
||||
<img class="inner" :src="url"/>
|
||||
<span class="eiwwqkts _noSelect" :class="{ cat }" :title="acct(user)" v-if="disableLink" v-user-preview="disablePreview ? undefined : user.id" @click="onClick">
|
||||
<img class="inner" :src="url" decoding="async"/>
|
||||
</span>
|
||||
<MkA class="eiwwqkts" :class="{ cat }" :to="userPage(user)" :title="acct(user)" :target="target" v-else v-user-preview="disablePreview ? undefined : user.id">
|
||||
<img class="inner" :src="url"/>
|
||||
<MkA class="eiwwqkts _noSelect" :class="{ cat }" :to="userPage(user)" :title="acct(user)" :target="target" v-else v-user-preview="disablePreview ? undefined : user.id">
|
||||
<img class="inner" :src="url" decoding="async"/>
|
||||
</MkA>
|
||||
</template>
|
||||
|
||||
@ -11,7 +11,7 @@
|
||||
import { defineComponent } from 'vue';
|
||||
import { getStaticImageUrl } from '@/scripts/get-static-image-url';
|
||||
import { extractAvgColorFromBlurhash } from '@/scripts/extract-avg-color-from-blurhash';
|
||||
import { acct, userPage } from '../filters/user';
|
||||
import { acct, userPage } from '@/filters/user';
|
||||
|
||||
export default defineComponent({
|
||||
props: {
|
||||
@ -38,7 +38,7 @@ export default defineComponent({
|
||||
return this.user.isCat;
|
||||
},
|
||||
url(): string {
|
||||
return this.$store.state.device.disableShowingAnimatedImages
|
||||
return this.$store.state.disableShowingAnimatedImages
|
||||
? getStaticImageUrl(this.user.avatarUrl)
|
||||
: this.user.avatarUrl;
|
||||
},
|
@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<img v-if="customEmoji" class="mk-emoji custom" :class="{ normal, noStyle }" :src="url" :alt="alt" :title="alt"/>
|
||||
<img v-else-if="char && !useOsNativeEmojis" class="mk-emoji" :src="url" :alt="alt" :title="alt"/>
|
||||
<img v-if="customEmoji" class="mk-emoji custom" :class="{ normal, noStyle }" :src="url" :alt="alt" :title="alt" decoding="async"/>
|
||||
<img v-else-if="char && !useOsNativeEmojis" class="mk-emoji" :src="url" :alt="alt" :title="alt" decoding="async"/>
|
||||
<span v-else-if="char && useOsNativeEmojis">{{ char }}</span>
|
||||
<span v-else>{{ emoji }}</span>
|
||||
</template>
|
||||
@ -8,7 +8,7 @@
|
||||
<script lang="ts">
|
||||
import { defineComponent } from 'vue';
|
||||
import { getStaticImageUrl } from '@/scripts/get-static-image-url';
|
||||
import { twemojiSvgBase } from '../../misc/twemoji-base';
|
||||
import { twemojiSvgBase } from '@/../misc/twemoji-base';
|
||||
|
||||
export default defineComponent({
|
||||
props: {
|
||||
@ -54,13 +54,13 @@ export default defineComponent({
|
||||
},
|
||||
|
||||
useOsNativeEmojis(): boolean {
|
||||
return this.$store.state.device.useOsNativeEmojis && !this.isReaction;
|
||||
return this.$store.state.useOsNativeEmojis && !this.isReaction;
|
||||
},
|
||||
|
||||
ce() {
|
||||
let ce = [];
|
||||
if (this.customEmojis) ce = ce.concat(this.customEmojis);
|
||||
if (this.$store.state.instance.meta && this.$store.state.instance.meta.emojis) ce = ce.concat(this.$store.state.instance.meta.emojis);
|
||||
if (this.$instance && this.$instance.emojis) ce = ce.concat(this.$instance.emojis);
|
||||
return ce;
|
||||
}
|
||||
},
|
||||
@ -72,7 +72,7 @@ export default defineComponent({
|
||||
const customEmoji = this.ce.find(x => x.name === this.emoji.substr(1, this.emoji.length - 2));
|
||||
if (customEmoji) {
|
||||
this.customEmoji = customEmoji;
|
||||
this.url = this.$store.state.device.disableShowingAnimatedImages
|
||||
this.url = this.$store.state.disableShowingAnimatedImages
|
||||
? getStaticImageUrl(customEmoji.url)
|
||||
: customEmoji.url;
|
||||
}
|
@ -1,9 +1,9 @@
|
||||
<template>
|
||||
<transition :name="$store.state.device.animation ? 'zoom' : ''" appear>
|
||||
<transition :name="$store.state.animation ? 'zoom' : ''" appear>
|
||||
<div class="mjndxjcg">
|
||||
<img src="https://xn--931a.moe/assets/error.jpg" class="_ghost"/>
|
||||
<p><Fa :icon="faExclamationTriangle"/> {{ $t('somethingHappened') }}</p>
|
||||
<MkButton @click="() => $emit('retry')" class="button">{{ $t('retry') }}</MkButton>
|
||||
<p><Fa :icon="faExclamationTriangle"/> {{ $ts.somethingHappened }}</p>
|
||||
<MkButton @click="() => $emit('retry')" class="button">{{ $ts.retry }}</MkButton>
|
||||
</div>
|
||||
</transition>
|
||||
</template>
|
||||
@ -11,7 +11,7 @@
|
||||
<script lang="ts">
|
||||
import { defineComponent } from 'vue';
|
||||
import { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons';
|
||||
import MkButton from './ui/button.vue';
|
||||
import MkButton from '@/components/ui/button.vue';
|
||||
|
||||
export default defineComponent({
|
||||
components: {
|
42
src/client/components/global/i18n.ts
Normal file
@ -0,0 +1,42 @@
|
||||
import { h, defineComponent } from 'vue';
|
||||
|
||||
export default defineComponent({
|
||||
props: {
|
||||
src: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
tag: {
|
||||
type: String,
|
||||
required: false,
|
||||
default: 'span',
|
||||
},
|
||||
textTag: {
|
||||
type: String,
|
||||
required: false,
|
||||
default: null,
|
||||
},
|
||||
},
|
||||
render() {
|
||||
let str = this.src;
|
||||
const parsed = [] as (string | { arg: string; })[];
|
||||
while (true) {
|
||||
const nextBracketOpen = str.indexOf('{');
|
||||
const nextBracketClose = str.indexOf('}');
|
||||
|
||||
if (nextBracketOpen === -1) {
|
||||
parsed.push(str);
|
||||
break;
|
||||
} else {
|
||||
if (nextBracketOpen > 0) parsed.push(str.substr(0, nextBracketOpen));
|
||||
parsed.push({
|
||||
arg: str.substring(nextBracketOpen + 1, nextBracketClose)
|
||||
});
|
||||
}
|
||||
|
||||
str = str.substr(nextBracketClose + 1);
|
||||
}
|
||||
|
||||
return h(this.tag, parsed.map(x => typeof x === 'string' ? (this.textTag ? h(this.textTag, x) : x) : this.$slots[x.arg]()));
|
||||
}
|
||||
});
|
@ -4,7 +4,7 @@
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent } from 'vue';
|
||||
import MfmCore from './mfm';
|
||||
import MfmCore from '@/components/mfm';
|
||||
|
||||
export default defineComponent({
|
||||
components: {
|
||||
@ -14,6 +14,15 @@ export default defineComponent({
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
._mfm_blur_ {
|
||||
filter: blur(6px);
|
||||
transition: filter 0.3s;
|
||||
|
||||
&:hover {
|
||||
filter: blur(0px);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes mfm-spin {
|
||||
0% { transform: rotate(0deg); }
|
||||
100% { transform: rotate(360deg); }
|
@ -44,9 +44,9 @@ export default defineComponent({
|
||||
ago >= 3600 ? this.$t('_ago.hoursAgo', { n: (~~(ago / 3600)).toString() }) :
|
||||
ago >= 60 ? this.$t('_ago.minutesAgo', { n: (~~(ago / 60)).toString() }) :
|
||||
ago >= 10 ? this.$t('_ago.secondsAgo', { n: (~~(ago % 60)).toString() }) :
|
||||
ago >= -1 ? this.$t('_ago.justNow') :
|
||||
ago < -1 ? this.$t('_ago.future') :
|
||||
this.$t('_ago.unknown'));
|
||||
ago >= -1 ? this.$ts._ago.justNow :
|
||||
ago < -1 ? this.$ts._ago.future :
|
||||
this.$ts._ago.unknown);
|
||||
}
|
||||
},
|
||||
created() {
|
@ -2,6 +2,7 @@
|
||||
<component :is="self ? 'MkA' : 'a'" class="ieqqeuvs _link" :[attr]="self ? url.substr(local.length) : url" :rel="rel" :target="target"
|
||||
@mouseover="onMouseover"
|
||||
@mouseleave="onMouseleave"
|
||||
@contextmenu.stop="() => {}"
|
||||
>
|
||||
<template v-if="!self">
|
||||
<span class="schema">{{ schema }}//</span>
|