Compare commits
147 Commits
Author | SHA1 | Date | |
---|---|---|---|
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 |
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の時とは違い、findOneでレコードを取得する時に対象レコードが存在しない場合 **`undefined`** が返ってくるので注意。
|
||||||
MongoDBは`null`で返してきてたので、その感覚で`if (x === null)`とか書くとバグる。代わりに`if (x == null)`と書いてください
|
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作成方法
|
### Migration作成方法
|
||||||
```
|
```
|
||||||
npx ts-node ./node_modules/typeorm/cli.js migration:generate -n 変更の名前
|
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
|
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://circleci.com/gh/syuilo/misskey)
|
||||||
[](https://david-dm.org/syuilo/misskey)
|
[](https://david-dm.org/syuilo/misskey)
|
||||||
@ -10,69 +11,52 @@
|
|||||||
|
|
||||||
**A forever evolving, interplanetary microblogging platform.**
|
**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.
|
<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),
|
Since it exists within the Fediverse (a universe where various social media platforms are organized),
|
||||||
it is mutually linked with other social media platforms.
|
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>
|
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>
|
<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
|
: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>Posting</h3>
|
||||||
|
<p>
|
||||||
<h3 align="left">Posting</h3>
|
|
||||||
<p align="justify">
|
|
||||||
Post your ideas, discussion topics, fun moments, or anything else you want to share! Misskey supports text, emoji, pictures, videos, and polls!
|
Post your ideas, discussion topics, fun moments, or anything else you want to share! Misskey supports text, emoji, pictures, videos, and polls!
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
<img src="/assets/about/reaction.png" align="right" height="200px"/>
|
<h3 >Reactions</h3>
|
||||||
|
<p>
|
||||||
<h3 align="right">Reactions</h3>
|
|
||||||
<p align="justify">
|
|
||||||
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”.
|
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>
|
</p>
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
<img src="/assets/about/ui.png" align="left" height="200px"/>
|
<h3>Interface</h3>
|
||||||
|
<p>
|
||||||
<h3 align="left">Interface</h3>
|
|
||||||
<p align="justify">
|
|
||||||
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.
|
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>
|
</p>
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
<img src="/assets/about/drive.png" align="right" width="300px"/>
|
<h3>Misskey Drive</h3>
|
||||||
|
<p>
|
||||||
<h3 align="right">Misskey Drive</h3>
|
|
||||||
<p align="justify">
|
|
||||||
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!
|
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>
|
</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.
|
...and more!
|
||||||
|
|
||||||
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).
|
|
||||||
|
|
||||||
:package: Create your own instance
|
:package: Create your own instance
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
@ -106,6 +90,10 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
|
|||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
To receive updates of this repo, follow [@repo@misskey.io](https://misskey.io/@repo) on fediverse.
|
||||||
|
|
||||||
:heart: Backers
|
:heart: Backers
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
<!-- PATREON_START -->
|
<!-- 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
@ -50,11 +50,13 @@ server {
|
|||||||
location / {
|
location / {
|
||||||
proxy_pass http://127.0.0.1:3000;
|
proxy_pass http://127.0.0.1:3000;
|
||||||
proxy_set_header Host $host;
|
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-Real-IP $remote_addr;
|
||||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
proxy_set_header X-Forwarded-Proto https;
|
proxy_set_header X-Forwarded-Proto https;
|
||||||
proxy_http_version 1.1;
|
|
||||||
proxy_redirect off;
|
|
||||||
|
|
||||||
# For WebSocket
|
# For WebSocket
|
||||||
proxy_set_header Upgrade $http_upgrade;
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
@ -32,6 +32,9 @@ addUser: "اضافة مستخدم"
|
|||||||
favorite: "إضافة إلى المفضلة"
|
favorite: "إضافة إلى المفضلة"
|
||||||
favorites: "المفضلات"
|
favorites: "المفضلات"
|
||||||
unfavorite: "إزالة من المفضلة"
|
unfavorite: "إزالة من المفضلة"
|
||||||
|
favorited: "تمت الإضافة إلى المفضلة."
|
||||||
|
alreadyFavorited: "تمت إضافته بالفعل إلى المفضلة."
|
||||||
|
cantFavorite: "تعذرت الإضافة إلى المفضلة."
|
||||||
pin: "دبّسها على الصفحة الشخصية"
|
pin: "دبّسها على الصفحة الشخصية"
|
||||||
unpin: "ألغ تثبيتها من ملفك الشخصي"
|
unpin: "ألغ تثبيتها من ملفك الشخصي"
|
||||||
copyContent: "انسخ المحتوى"
|
copyContent: "انسخ المحتوى"
|
||||||
@ -85,6 +88,7 @@ enterEmoji: "أدخل إيموجي"
|
|||||||
unrenote: "إلغاء مشاركة الملاحظة"
|
unrenote: "إلغاء مشاركة الملاحظة"
|
||||||
quote: "اقتبس"
|
quote: "اقتبس"
|
||||||
pinnedNote: "ملاحظة مدبسة"
|
pinnedNote: "ملاحظة مدبسة"
|
||||||
|
pinned: "دبّسها على الصفحة الشخصية"
|
||||||
you: "أنت"
|
you: "أنت"
|
||||||
clickToShow: "اضغط للعرض"
|
clickToShow: "اضغط للعرض"
|
||||||
sensitive: "محتوى حساس"
|
sensitive: "محتوى حساس"
|
||||||
@ -176,16 +180,23 @@ remove: "حذف"
|
|||||||
removed: "تم حذفه بنجاح"
|
removed: "تم حذفه بنجاح"
|
||||||
removeAreYouSure: "متأكد من أنك تريد حذف {x}؟"
|
removeAreYouSure: "متأكد من أنك تريد حذف {x}؟"
|
||||||
deleteAreYouSure: "متأكد من أنك تريد حذف {x}؟"
|
deleteAreYouSure: "متأكد من أنك تريد حذف {x}؟"
|
||||||
|
resetAreYouSure: "هل تريد إعادة التعيين؟"
|
||||||
saved: "تم حفظه"
|
saved: "تم حفظه"
|
||||||
messaging: "الدردشة"
|
messaging: "الدردشة"
|
||||||
upload: "تحميل"
|
upload: "تحميل"
|
||||||
fromDrive: "من المخزن"
|
fromDrive: "من المخزن"
|
||||||
fromUrl: "من عنوان URL"
|
fromUrl: "من عنوان URL"
|
||||||
uploadFromUrl: "التحميل عبر URL"
|
uploadFromUrl: "التحميل عبر URL"
|
||||||
|
uploadFromUrlDescription: "رابط الملف المراد تحميله "
|
||||||
|
uploadFromUrlRequested: "الرفع مطلوب"
|
||||||
|
uploadFromUrlMayTakeTime: "سيستغرق بعض الوقت لاتمام الرفع "
|
||||||
explore: "استكشاف"
|
explore: "استكشاف"
|
||||||
games: "ألعاب Misskey"
|
games: "ألعاب Misskey"
|
||||||
messageRead: "مقروءة"
|
messageRead: "مقروءة"
|
||||||
|
noMoreHistory: "لا يوجد المزيد من التاريخ"
|
||||||
startMessaging: "ابدأ الدردشة"
|
startMessaging: "ابدأ الدردشة"
|
||||||
|
nUsersRead: "تمت القراءة من {n}"
|
||||||
|
agreeTo: "اوافق على {0}"
|
||||||
tos: "شروط الخدمة"
|
tos: "شروط الخدمة"
|
||||||
start: "البداية"
|
start: "البداية"
|
||||||
home: "الرئيسي"
|
home: "الرئيسي"
|
||||||
@ -202,6 +213,7 @@ light: "فاتح"
|
|||||||
dark: "داكن"
|
dark: "داكن"
|
||||||
lightThemes: "الحلة الفاتحة"
|
lightThemes: "الحلة الفاتحة"
|
||||||
darkThemes: "الحلة الداكنة"
|
darkThemes: "الحلة الداكنة"
|
||||||
|
syncDeviceDarkMode: "مطابقة الوضع المضلمومع اعدادات الجهاز"
|
||||||
drive: "قرص التخرين"
|
drive: "قرص التخرين"
|
||||||
fileName: "اسم الملف"
|
fileName: "اسم الملف"
|
||||||
selectFile: "اختر ملفًا"
|
selectFile: "اختر ملفًا"
|
||||||
@ -219,14 +231,17 @@ emptyFolder: "هذا المجلد فارغ"
|
|||||||
unableToDelete: "لا يمكن حذفه"
|
unableToDelete: "لا يمكن حذفه"
|
||||||
inputNewFileName: "ادخل الإسم الجديد للملف"
|
inputNewFileName: "ادخل الإسم الجديد للملف"
|
||||||
inputNewFolderName: "ادخل الإسم الجديد للمجلد"
|
inputNewFolderName: "ادخل الإسم الجديد للمجلد"
|
||||||
|
hasChildFilesOrFolders: "الان الملف غير فارغ. لا يمكن حذفه"
|
||||||
copyUrl: "انسخ عنوان URL"
|
copyUrl: "انسخ عنوان URL"
|
||||||
rename: "إعادة التسمية"
|
rename: "إعادة التسمية"
|
||||||
avatar: "الصورة الرمزية"
|
avatar: "الصورة الرمزية"
|
||||||
banner: "الصورة الرأسية"
|
banner: "الصورة الرأسية"
|
||||||
nsfw: "محتوى حساس"
|
nsfw: "محتوى حساس"
|
||||||
|
whenServerDisconnected: "عند فقدان الاتصال بالخادم"
|
||||||
disconnectedFromServer: "قُطِع الإتصال بالخادم"
|
disconnectedFromServer: "قُطِع الإتصال بالخادم"
|
||||||
reload: "انعش"
|
reload: "انعش"
|
||||||
doNothing: "تجاهل"
|
doNothing: "تجاهل"
|
||||||
|
reloadConfirm: "هل ترغب في تحديث الجدول الزمني؟"
|
||||||
watch: "راقب"
|
watch: "راقب"
|
||||||
unwatch: "إلغاء المراقبة"
|
unwatch: "إلغاء المراقبة"
|
||||||
accept: "السماح"
|
accept: "السماح"
|
||||||
@ -244,10 +259,12 @@ dayX: "{day}"
|
|||||||
monthX: "{month}"
|
monthX: "{month}"
|
||||||
yearX: "{year}"
|
yearX: "{year}"
|
||||||
pages: "الصفحات"
|
pages: "الصفحات"
|
||||||
|
integration: "دمج"
|
||||||
connectSerice: "أوصل"
|
connectSerice: "أوصل"
|
||||||
disconnectSerice: "قطع الاتصال"
|
disconnectSerice: "قطع الاتصال"
|
||||||
enableLocalTimeline: "تفعيل الخيط المحلي"
|
enableLocalTimeline: "تفعيل الخيط المحلي"
|
||||||
enableGlobalTimeline: "تفعيل الخيط الزمني الشامل"
|
enableGlobalTimeline: "تفعيل الخيط الزمني الشامل"
|
||||||
|
disablingTimelinesInfo: "سيتمكن المسؤولون ومن تعديل دائمًا و من الوصول إلى جميع المخططات الزمنية ، حتى إذا لم يتم تمكينها."
|
||||||
registration: "إنشاء حساب"
|
registration: "إنشاء حساب"
|
||||||
enableRegistration: "تفعيل إنشاء الحسابات الجديدة"
|
enableRegistration: "تفعيل إنشاء الحسابات الجديدة"
|
||||||
invite: "دعوة"
|
invite: "دعوة"
|
||||||
@ -289,6 +306,8 @@ resetPassword: "أعد تعيين كلمتك السرية"
|
|||||||
newPasswordIs: "كلمتك السرية الجديدة هي {password}"
|
newPasswordIs: "كلمتك السرية الجديدة هي {password}"
|
||||||
share: "شارِك"
|
share: "شارِك"
|
||||||
notFound: "غير موجود"
|
notFound: "غير موجود"
|
||||||
|
cacheClear: "مسح ذاكرة التخزين المؤقت"
|
||||||
|
markAsReadAllNotifications: "وضع جميع الإشعارات كأنها مقروءة"
|
||||||
help: "المساعدة"
|
help: "المساعدة"
|
||||||
inputMessageHere: "اكتب رسالتك هنا"
|
inputMessageHere: "اكتب رسالتك هنا"
|
||||||
close: "اغلق"
|
close: "اغلق"
|
||||||
@ -329,6 +348,7 @@ aboutX: "عن {x}"
|
|||||||
useOsNativeEmojis: "استخدم الإيموجيات الخاصة بنظام التشغيل"
|
useOsNativeEmojis: "استخدم الإيموجيات الخاصة بنظام التشغيل"
|
||||||
youHaveNoGroups: "لا تمتلك أية فِرَق"
|
youHaveNoGroups: "لا تمتلك أية فِرَق"
|
||||||
noHistory: "السجل فارغ"
|
noHistory: "السجل فارغ"
|
||||||
|
signinHistory: "تاريخ تسجيل الدخول"
|
||||||
doing: "انتظر لحظة"
|
doing: "انتظر لحظة"
|
||||||
category: "الفئات"
|
category: "الفئات"
|
||||||
tags: "الوسوم"
|
tags: "الوسوم"
|
||||||
@ -337,6 +357,7 @@ createAccount: "أنشئ حسابًا"
|
|||||||
existingAcount: "الحسابات الموجودة"
|
existingAcount: "الحسابات الموجودة"
|
||||||
regenerate: "أعِد التوليد"
|
regenerate: "أعِد التوليد"
|
||||||
fontSize: "حجم الخط"
|
fontSize: "حجم الخط"
|
||||||
|
openImageInNewTab: "إفتح الصورة بصفحة جديدة"
|
||||||
dashboard: "لوحة التحكم"
|
dashboard: "لوحة التحكم"
|
||||||
local: "المحلي"
|
local: "المحلي"
|
||||||
remote: "بُعدي"
|
remote: "بُعدي"
|
||||||
@ -365,6 +386,9 @@ state: "الحالة"
|
|||||||
sort: "ترتيب حسب"
|
sort: "ترتيب حسب"
|
||||||
output: "الخارجة"
|
output: "الخارجة"
|
||||||
updateRemoteUser: "تحديث المعلومات عن المستخدم البعيد"
|
updateRemoteUser: "تحديث المعلومات عن المستخدم البعيد"
|
||||||
|
deleteAllFiles: "حذف كافة الملفات"
|
||||||
|
userSuspended: "تم تعليق هذا المستخدم."
|
||||||
|
userSilenced: "تم إسكات هذا المستخدم."
|
||||||
sidebar: "الشريط الجانبي"
|
sidebar: "الشريط الجانبي"
|
||||||
addItem: "إضافة عنصر"
|
addItem: "إضافة عنصر"
|
||||||
rooms: "الغرفة"
|
rooms: "الغرفة"
|
||||||
@ -374,14 +398,40 @@ addedRelays: "المرحلات التي تم إضافتها"
|
|||||||
deletedNote: "ملاحظة محذوفة"
|
deletedNote: "ملاحظة محذوفة"
|
||||||
invisibleNote: "ملاحظة مخفية"
|
invisibleNote: "ملاحظة مخفية"
|
||||||
poll: "استطلاع رأي"
|
poll: "استطلاع رأي"
|
||||||
|
useCw: "إخفاء المحتوى"
|
||||||
themeEditor: "مصمم القوالب"
|
themeEditor: "مصمم القوالب"
|
||||||
|
manage: "إدارة "
|
||||||
plugins: "الإضافات"
|
plugins: "الإضافات"
|
||||||
pluginInstallWarn: "يرجى تنصيب إضافات ذات مصدر موثوق منه فقط."
|
width: "العرض"
|
||||||
|
height: "الإرتفاع"
|
||||||
|
large: "كبير"
|
||||||
|
medium: "متوسط"
|
||||||
|
small: "صغير"
|
||||||
|
permission: "أذونات"
|
||||||
|
enableAll: "تشغيل الكل"
|
||||||
|
disableAll: "تعطيل الكل"
|
||||||
|
tokenRequested: "منح حق الوصول إلى الحساب"
|
||||||
|
notificationType: "أنواع الإشعارات"
|
||||||
|
edit: "التعديل"
|
||||||
|
email: "البريد الإلكتروني "
|
||||||
|
emailAddress: "عنوان البريد الالكتروني"
|
||||||
smtpHost: "المضيف"
|
smtpHost: "المضيف"
|
||||||
|
smtpPort: "المنفذ"
|
||||||
smtpUser: "اسم المستخدم"
|
smtpUser: "اسم المستخدم"
|
||||||
smtpPass: "الكلمة السرية"
|
smtpPass: "الكلمة السرية"
|
||||||
|
makeActive: "تفعيل"
|
||||||
display: "المظهر"
|
display: "المظهر"
|
||||||
|
copy: "نسخ"
|
||||||
|
metrics: "المقاييس"
|
||||||
public: "للعامة"
|
public: "للعامة"
|
||||||
|
currentVersion: "الإصدار الحالي"
|
||||||
|
latestVersion: "آخر نسخة مستقرة"
|
||||||
|
usageAmount: "الإستخدام"
|
||||||
|
capacity: "السعة"
|
||||||
|
inUse: "مستخدم"
|
||||||
|
_email:
|
||||||
|
_follow:
|
||||||
|
title: "يتابعك"
|
||||||
_mfm:
|
_mfm:
|
||||||
mention: "أشر الى"
|
mention: "أشر الى"
|
||||||
quote: "اقتبس"
|
quote: "اقتبس"
|
||||||
@ -454,6 +504,7 @@ _widgets:
|
|||||||
activity: "النشاط"
|
activity: "النشاط"
|
||||||
photos: "الصور"
|
photos: "الصور"
|
||||||
federation: "الفديرالية"
|
federation: "الفديرالية"
|
||||||
|
jobQueue: "قائمة الانتظار"
|
||||||
_cw:
|
_cw:
|
||||||
hide: "إخفاء"
|
hide: "إخفاء"
|
||||||
show: "عرض المزيد"
|
show: "عرض المزيد"
|
||||||
|
@ -97,6 +97,7 @@ cantRenote: "Renote dieses Beitrags nicht möglich."
|
|||||||
cantReRenote: "Renote einer Renote nicht möglich."
|
cantReRenote: "Renote einer Renote nicht möglich."
|
||||||
quote: "Zitieren"
|
quote: "Zitieren"
|
||||||
pinnedNote: "Angepinnte Notiz"
|
pinnedNote: "Angepinnte Notiz"
|
||||||
|
pinned: "Anheften"
|
||||||
you: "Du"
|
you: "Du"
|
||||||
clickToShow: "Klicke, um diesen Inhalt anzusehen"
|
clickToShow: "Klicke, um diesen Inhalt anzusehen"
|
||||||
sensitive: "NSFW"
|
sensitive: "NSFW"
|
||||||
@ -437,6 +438,7 @@ signinWith: "Mit {x} anmelden"
|
|||||||
signinFailed: "Anmeldung fehlgeschlagen. Überprüfe Benutzername und Passswort."
|
signinFailed: "Anmeldung fehlgeschlagen. Überprüfe Benutzername und Passswort."
|
||||||
tapSecurityKey: "Tippe deinen Sicherheitsschlüssel an"
|
tapSecurityKey: "Tippe deinen Sicherheitsschlüssel an"
|
||||||
or: "Oder"
|
or: "Oder"
|
||||||
|
language: "Sprache"
|
||||||
uiLanguage: "Sprache der Benutzeroberfläche"
|
uiLanguage: "Sprache der Benutzeroberfläche"
|
||||||
groupInvited: "Du wurdest in eine Gruppe eingeladen"
|
groupInvited: "Du wurdest in eine Gruppe eingeladen"
|
||||||
aboutX: "Über {x}"
|
aboutX: "Über {x}"
|
||||||
@ -548,7 +550,6 @@ author: "Autor"
|
|||||||
leaveConfirm: "Es gibt unspeicherte Änderungen. Möchtest du diese verwerfen?"
|
leaveConfirm: "Es gibt unspeicherte Änderungen. Möchtest du diese verwerfen?"
|
||||||
manage: "Verwaltung"
|
manage: "Verwaltung"
|
||||||
plugins: "Plugins"
|
plugins: "Plugins"
|
||||||
pluginInstallWarn: "Installiere nur vertrauenswürdige Plugins."
|
|
||||||
deck: "Deck"
|
deck: "Deck"
|
||||||
undeck: "Deck verlassen"
|
undeck: "Deck verlassen"
|
||||||
useBlurEffectForModal: "Weichzeichnungseffekt für Modals verwenden"
|
useBlurEffectForModal: "Weichzeichnungseffekt für Modals verwenden"
|
||||||
@ -677,6 +678,52 @@ clearCache: "Cache leeren"
|
|||||||
onlineUsersCount: "{n} Benutzer sind online"
|
onlineUsersCount: "{n} Benutzer sind online"
|
||||||
nUsers: "{n} Benutzer"
|
nUsers: "{n} Benutzer"
|
||||||
nNotes: "{n} Notizen"
|
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"
|
||||||
|
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:
|
_aboutMisskey:
|
||||||
about: "Misskey ist Open-Source-Software die von syuilo seit 2014 entwickelt wird."
|
about: "Misskey ist Open-Source-Software die von syuilo seit 2014 entwickelt wird."
|
||||||
contributors: "Hauptmitwirkende"
|
contributors: "Hauptmitwirkende"
|
||||||
@ -915,7 +962,7 @@ _tutorial:
|
|||||||
title: "Wie du Misskey verwendest"
|
title: "Wie du Misskey verwendest"
|
||||||
step1_1: "Willkommen!"
|
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_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_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."
|
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?"
|
step3_1: "Mit dem Einrichten deines Profils fertig?"
|
||||||
@ -1008,8 +1055,10 @@ _widgets:
|
|||||||
postForm: "Neue Notiz anfertigen"
|
postForm: "Neue Notiz anfertigen"
|
||||||
slideshow: "Diashow"
|
slideshow: "Diashow"
|
||||||
button: "Knopf"
|
button: "Knopf"
|
||||||
onlineUsers: "Benutzer die Online sind"
|
onlineUsers: "Benutzer Online"
|
||||||
|
jobQueue: "Job-Warteschlange"
|
||||||
serverMetric: "Servermetriken"
|
serverMetric: "Servermetriken"
|
||||||
|
aiscript: "AiScript-Konsole"
|
||||||
_cw:
|
_cw:
|
||||||
hide: "Ausblenden"
|
hide: "Ausblenden"
|
||||||
show: "Mehr anzeigen"
|
show: "Mehr anzeigen"
|
||||||
@ -1472,7 +1521,7 @@ _notification:
|
|||||||
youGotPoll: "{name} hat auf deiner Umfrage abgestimmt"
|
youGotPoll: "{name} hat auf deiner Umfrage abgestimmt"
|
||||||
youGotMessagingMessageFromUser: "{name} hat dir eine Chatnachricht gesendet"
|
youGotMessagingMessageFromUser: "{name} hat dir eine Chatnachricht gesendet"
|
||||||
youGotMessagingMessageFromGroup: "In die Gruppe {name} wurde 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"
|
youReceivedFollowRequest: "Du hast eine Follow-Anfrage erhalten"
|
||||||
yourFollowRequestAccepted: "Deine Follow-Anfrage wurde akzeptiert"
|
yourFollowRequestAccepted: "Deine Follow-Anfrage wurde akzeptiert"
|
||||||
youWereInvitedToGroup: "Du wurdest in eine Gruppe eingeladen"
|
youWereInvitedToGroup: "Du wurdest in eine Gruppe eingeladen"
|
||||||
@ -1501,6 +1550,7 @@ _deck:
|
|||||||
swapDown: "Nach unten verschieben"
|
swapDown: "Nach unten verschieben"
|
||||||
stackLeft: "Auf linke Spalte stapeln"
|
stackLeft: "Auf linke Spalte stapeln"
|
||||||
popRight: "Nach rechts vom Stapel nehmen"
|
popRight: "Nach rechts vom Stapel nehmen"
|
||||||
|
profile: "Profil"
|
||||||
_columns:
|
_columns:
|
||||||
main: "Hauptspalte"
|
main: "Hauptspalte"
|
||||||
widgets: "Widgets"
|
widgets: "Widgets"
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
_lang_: "English"
|
_lang_: "English"
|
||||||
headlineMisskey: "Network connected by notes"
|
headlineMisskey: "Network connected by notes"
|
||||||
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 🚀"
|
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}"
|
monthAndDay: "{month}/{day}"
|
||||||
search: "Search"
|
search: "Search"
|
||||||
notifications: "Notifications"
|
notifications: "Notifications"
|
||||||
@ -97,6 +97,7 @@ cantRenote: "This post can't be renoted."
|
|||||||
cantReRenote: "A renote can't be renoted."
|
cantReRenote: "A renote can't be renoted."
|
||||||
quote: "Quote"
|
quote: "Quote"
|
||||||
pinnedNote: "Pinned note"
|
pinnedNote: "Pinned note"
|
||||||
|
pinned: "Pin to profile"
|
||||||
you: "You"
|
you: "You"
|
||||||
clickToShow: "Click to show"
|
clickToShow: "Click to show"
|
||||||
sensitive: "NSFW"
|
sensitive: "NSFW"
|
||||||
@ -314,7 +315,7 @@ enableLocalTimeline: "Enable local timeline"
|
|||||||
enableGlobalTimeline: "Enable global timeline"
|
enableGlobalTimeline: "Enable global timeline"
|
||||||
disablingTimelinesInfo: "Admins and Mods will always have access to all timelines, even if they are not enabled."
|
disablingTimelinesInfo: "Admins and Mods will always have access to all timelines, even if they are not enabled."
|
||||||
registration: "Register"
|
registration: "Register"
|
||||||
enableRegistration: "Enable new user registeration"
|
enableRegistration: "Enable new user registration"
|
||||||
invite: "Invite"
|
invite: "Invite"
|
||||||
proxyRemoteFiles: "Proxy remote files"
|
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."
|
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."
|
||||||
@ -346,8 +347,8 @@ antennaSource: "Antenna source"
|
|||||||
antennaKeywords: "Keywords to receive"
|
antennaKeywords: "Keywords to receive"
|
||||||
antennaExcludeKeywords: "Keywords to exclude"
|
antennaExcludeKeywords: "Keywords to exclude"
|
||||||
antennaKeywordsDescription: "Separate with spaces for AND condition. Separate with line breaks for OR."
|
antennaKeywordsDescription: "Separate with spaces for AND condition. Separate with line breaks for OR."
|
||||||
notifyAntenna: "Notify newer notes"
|
notifyAntenna: "Notify for new notes"
|
||||||
withFileAntenna: "Filter only notes with file attached"
|
withFileAntenna: "Filter only notes with file(s) attached"
|
||||||
serviceworker: "ServiceWorker"
|
serviceworker: "ServiceWorker"
|
||||||
enableServiceworker: "Enable ServiceWorker"
|
enableServiceworker: "Enable ServiceWorker"
|
||||||
antennaUsersDescription: "List one username per line"
|
antennaUsersDescription: "List one username per line"
|
||||||
@ -437,6 +438,7 @@ signinWith: "Sign in with {x}"
|
|||||||
signinFailed: "Unable to sign in. The username or password you entered is incorrect."
|
signinFailed: "Unable to sign in. The username or password you entered is incorrect."
|
||||||
tapSecurityKey: "Tap your security key"
|
tapSecurityKey: "Tap your security key"
|
||||||
or: "Or"
|
or: "Or"
|
||||||
|
language: "Language"
|
||||||
uiLanguage: "UI display language"
|
uiLanguage: "UI display language"
|
||||||
groupInvited: "Invited to group"
|
groupInvited: "Invited to group"
|
||||||
aboutX: "About {x}"
|
aboutX: "About {x}"
|
||||||
@ -548,7 +550,6 @@ author: "Author"
|
|||||||
leaveConfirm: "There are unsaved changes. Do you want to discard them?"
|
leaveConfirm: "There are unsaved changes. Do you want to discard them?"
|
||||||
manage: "Management"
|
manage: "Management"
|
||||||
plugins: "Plugins"
|
plugins: "Plugins"
|
||||||
pluginInstallWarn: "Please do not install untrustworthy plugins."
|
|
||||||
deck: "Deck"
|
deck: "Deck"
|
||||||
undeck: "Leave Deck"
|
undeck: "Leave Deck"
|
||||||
useBlurEffectForModal: "Use blur effect for modals"
|
useBlurEffectForModal: "Use blur effect for modals"
|
||||||
@ -646,8 +647,8 @@ no: "No"
|
|||||||
driveFilesCount: "Amount of drive files"
|
driveFilesCount: "Amount of drive files"
|
||||||
driveUsage: "Drive space usage"
|
driveUsage: "Drive space usage"
|
||||||
noCrawle: "Reject crawler indexing"
|
noCrawle: "Reject crawler indexing"
|
||||||
noCrawleDescription: "Ask search engines not to index your profile page, notes, Pages, etc"
|
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."
|
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"
|
alwaysMarkSensitive: "Mark NSFW by default"
|
||||||
loadRawImages: "Display image attachments fully instead of thumbnails"
|
loadRawImages: "Display image attachments fully instead of thumbnails"
|
||||||
disableShowingAnimatedImages: "Don't play animated images"
|
disableShowingAnimatedImages: "Don't play animated images"
|
||||||
@ -677,6 +678,52 @@ clearCache: "Clear cache"
|
|||||||
onlineUsersCount: "{n} people are online"
|
onlineUsersCount: "{n} people are online"
|
||||||
nUsers: "{n} Users"
|
nUsers: "{n} Users"
|
||||||
nNotes: "{n} Notes"
|
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"
|
||||||
|
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:
|
_aboutMisskey:
|
||||||
about: "Misskey is open-source software being developed by syuilo since 2014."
|
about: "Misskey is open-source software being developed by syuilo since 2014."
|
||||||
contributors: "Main contributors"
|
contributors: "Main contributors"
|
||||||
@ -1009,7 +1056,9 @@ _widgets:
|
|||||||
slideshow: "Slideshow"
|
slideshow: "Slideshow"
|
||||||
button: "Button"
|
button: "Button"
|
||||||
onlineUsers: "Online users"
|
onlineUsers: "Online users"
|
||||||
|
jobQueue: "Job Queue"
|
||||||
serverMetric: "Server metrics"
|
serverMetric: "Server metrics"
|
||||||
|
aiscript: "AiScript console"
|
||||||
_cw:
|
_cw:
|
||||||
hide: "Hide"
|
hide: "Hide"
|
||||||
show: "Load more"
|
show: "Load more"
|
||||||
@ -1501,6 +1550,7 @@ _deck:
|
|||||||
swapDown: "Swap with below"
|
swapDown: "Swap with below"
|
||||||
stackLeft: "Stack on left column"
|
stackLeft: "Stack on left column"
|
||||||
popRight: "Pop to the right"
|
popRight: "Pop to the right"
|
||||||
|
profile: "Profile"
|
||||||
_columns:
|
_columns:
|
||||||
main: "Main"
|
main: "Main"
|
||||||
widgets: "Widgets"
|
widgets: "Widgets"
|
||||||
|
@ -96,6 +96,7 @@ cantRenote: "No se puede renotar este post"
|
|||||||
cantReRenote: "No se puede renotar una renota"
|
cantReRenote: "No se puede renotar una renota"
|
||||||
quote: "Citar"
|
quote: "Citar"
|
||||||
pinnedNote: "Nota fijada"
|
pinnedNote: "Nota fijada"
|
||||||
|
pinned: "Fijar"
|
||||||
you: "Tú"
|
you: "Tú"
|
||||||
clickToShow: "Click para ver"
|
clickToShow: "Click para ver"
|
||||||
sensitive: "Marcado como sensible"
|
sensitive: "Marcado como sensible"
|
||||||
@ -547,7 +548,6 @@ author: "Autor"
|
|||||||
leaveConfirm: "Hay modificaciones sin guardar. ¿Desea descartarlas?"
|
leaveConfirm: "Hay modificaciones sin guardar. ¿Desea descartarlas?"
|
||||||
manage: "Administrar"
|
manage: "Administrar"
|
||||||
plugins: "Plugins"
|
plugins: "Plugins"
|
||||||
pluginInstallWarn: "Por favor no instale plugins que no son de confianza"
|
|
||||||
deck: "Deck"
|
deck: "Deck"
|
||||||
undeck: "Quitar deck"
|
undeck: "Quitar deck"
|
||||||
useBlurEffectForModal: "Usar efecto borroso en modales"
|
useBlurEffectForModal: "Usar efecto borroso en modales"
|
||||||
@ -648,6 +648,16 @@ noCrawle: "Rechazar indexación del crawler"
|
|||||||
noCrawleDescription: "Pedir a los motores de búsqueda que no indexen tu perfil, notas, páginas, etc."
|
noCrawleDescription: "Pedir a los motores de búsqueda que no indexen tu perfil, notas, páginas, etc."
|
||||||
clips: "Clip"
|
clips: "Clip"
|
||||||
clearCache: "Limpiar caché"
|
clearCache: "Limpiar caché"
|
||||||
|
backgroundColor: "Fondo"
|
||||||
|
accentColor: "Acento"
|
||||||
|
textColor: "Texto"
|
||||||
|
value: "Valores"
|
||||||
|
_email:
|
||||||
|
_follow:
|
||||||
|
title: "te ha seguido"
|
||||||
|
_registry:
|
||||||
|
key: "Clave"
|
||||||
|
keys: "Clave"
|
||||||
_mfm:
|
_mfm:
|
||||||
cheatSheet: "Hoja de referencia de 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."
|
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."
|
||||||
@ -921,6 +931,7 @@ _widgets:
|
|||||||
federation: "Federación"
|
federation: "Federación"
|
||||||
postForm: "Formulario"
|
postForm: "Formulario"
|
||||||
button: "Botón"
|
button: "Botón"
|
||||||
|
jobQueue: "Cola de trabajos"
|
||||||
_cw:
|
_cw:
|
||||||
hide: "Ocultar"
|
hide: "Ocultar"
|
||||||
show: "Ver más"
|
show: "Ver más"
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
---
|
---
|
||||||
_lang_: "Français"
|
_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 🚀"
|
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}"
|
monthAndDay: "{day}/{month}"
|
||||||
search: "Rechercher"
|
search: "Rechercher"
|
||||||
@ -33,6 +34,9 @@ addUser: "Ajouter un·e utilisateur·rice"
|
|||||||
favorite: "Ajouter aux favoris"
|
favorite: "Ajouter aux favoris"
|
||||||
favorites: "Favoris"
|
favorites: "Favoris"
|
||||||
unfavorite: "Retirer des favoris"
|
unfavorite: "Retirer des favoris"
|
||||||
|
favorited: "Ajouter à mes favoris"
|
||||||
|
alreadyFavorited: "Déjà ajouté aux favoris."
|
||||||
|
cantFavorite: "Impossible d'ajouter aux favoris."
|
||||||
pin: "Épingler sur le profil"
|
pin: "Épingler sur le profil"
|
||||||
unpin: "Désépingler"
|
unpin: "Désépingler"
|
||||||
copyContent: "Copier le contenu"
|
copyContent: "Copier le contenu"
|
||||||
@ -75,6 +79,7 @@ error: "Erreur"
|
|||||||
somethingHappened: "Une erreur est survenue"
|
somethingHappened: "Une erreur est survenue"
|
||||||
retry: "Réessayer"
|
retry: "Réessayer"
|
||||||
pageLoadError: "Le chargement de la page a échoué"
|
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"
|
enterListName: "Nom de la liste"
|
||||||
privacy: "Confidentialité"
|
privacy: "Confidentialité"
|
||||||
makeFollowManuallyApprove: "Accepter manuellement les demandes d’abonnement"
|
makeFollowManuallyApprove: "Accepter manuellement les demandes d’abonnement"
|
||||||
@ -87,8 +92,11 @@ followRequestPending: "En attente d’approbation"
|
|||||||
enterEmoji: "ou entrez un émoji"
|
enterEmoji: "ou entrez un émoji"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
unrenote: "Annuler Renote"
|
unrenote: "Annuler Renote"
|
||||||
|
renoted: "Republier"
|
||||||
|
cantRenote: "Ce message ne peut pas être republié."
|
||||||
quote: "Citer"
|
quote: "Citer"
|
||||||
pinnedNote: "Note épinglée"
|
pinnedNote: "Note épinglée"
|
||||||
|
pinned: "Épingler sur le profil"
|
||||||
you: "Vous"
|
you: "Vous"
|
||||||
clickToShow: "Cliquer pour afficher"
|
clickToShow: "Cliquer pour afficher"
|
||||||
sensitive: "Contenu sensible"
|
sensitive: "Contenu sensible"
|
||||||
@ -124,7 +132,9 @@ settingGuide: "Configuration proposée"
|
|||||||
cacheRemoteFiles: "Mise en cache des fichiers distants"
|
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."
|
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"
|
flagAsBot: "Ce compte est un robot"
|
||||||
|
flagAsBotDescription: "Si ce compte est contrôlé par un programme, 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"
|
flagAsCat: "Ce compte est un chat"
|
||||||
|
flagAsCatDescription: "Activez cette option pour que ce compte soit marqué comme un chat."
|
||||||
autoAcceptFollowed: "Accepter automatiquement les demandes d’abonnement venant d’utilisateur·rice·s que vous suivez"
|
autoAcceptFollowed: "Accepter automatiquement les demandes d’abonnement venant d’utilisateur·rice·s que vous suivez"
|
||||||
addAcount: "Ajouter un compte"
|
addAcount: "Ajouter un compte"
|
||||||
loginFailed: "Échec de la connexion"
|
loginFailed: "Échec de la connexion"
|
||||||
@ -215,6 +225,7 @@ remove: "Supprimer"
|
|||||||
removed: "Supprimé"
|
removed: "Supprimé"
|
||||||
removeAreYouSure: "Supprimer «{x}» ?"
|
removeAreYouSure: "Supprimer «{x}» ?"
|
||||||
deleteAreYouSure: "Supprimer «{x}» ?"
|
deleteAreYouSure: "Supprimer «{x}» ?"
|
||||||
|
resetAreYouSure: "Réinitialiser ?"
|
||||||
saved: "Enregistré"
|
saved: "Enregistré"
|
||||||
messaging: "Discuter"
|
messaging: "Discuter"
|
||||||
upload: "Téléverser"
|
upload: "Téléverser"
|
||||||
@ -429,6 +440,7 @@ useOsNativeEmojis: "Utiliser les émojis natifs du système"
|
|||||||
youHaveNoGroups: "Vous n’avez aucun groupe"
|
youHaveNoGroups: "Vous n’avez aucun groupe"
|
||||||
joinOrCreateGroup: "Soyez invité à rejoindre les groupes ou vous pouvez créer votre propre groupe."
|
joinOrCreateGroup: "Soyez invité à rejoindre les groupes ou vous pouvez créer votre propre groupe."
|
||||||
noHistory: "Pas d'historique"
|
noHistory: "Pas d'historique"
|
||||||
|
signinHistory: "Historique de connexion"
|
||||||
disableAnimatedMfm: "Désactiver MFM ayant des animations"
|
disableAnimatedMfm: "Désactiver MFM ayant des animations"
|
||||||
doing: "Attends une seconde"
|
doing: "Attends une seconde"
|
||||||
category: "Catégories"
|
category: "Catégories"
|
||||||
@ -479,6 +491,7 @@ listen: "Écouter"
|
|||||||
none: "Rien"
|
none: "Rien"
|
||||||
popout: "Fenêtre contextuelle"
|
popout: "Fenêtre contextuelle"
|
||||||
volume: "Volume"
|
volume: "Volume"
|
||||||
|
masterVolume: "Volume"
|
||||||
details: "Détails"
|
details: "Détails"
|
||||||
chooseEmoji: "Choisissez un émoji"
|
chooseEmoji: "Choisissez un émoji"
|
||||||
unableToProcess: "L’opération n’a pas pu être complétée."
|
unableToProcess: "L’opération n’a pas pu être complétée."
|
||||||
@ -529,12 +542,14 @@ author: "Auteur·rice"
|
|||||||
leaveConfirm: "Vous avez des modifications non-sauvegardées. Voulez-vous les ignorer ?"
|
leaveConfirm: "Vous avez des modifications non-sauvegardées. Voulez-vous les ignorer ?"
|
||||||
manage: "Gestion"
|
manage: "Gestion"
|
||||||
plugins: "Extensions"
|
plugins: "Extensions"
|
||||||
pluginInstallWarn: "N’installez que des extensions provenant de sources de confiance."
|
|
||||||
deck: "Deck"
|
deck: "Deck"
|
||||||
undeck: "Quitter le deck"
|
undeck: "Quitter le deck"
|
||||||
useBlurEffectForModal: "Utiliser un effet de flou pour les modals"
|
useBlurEffectForModal: "Utiliser un effet de flou pour les modals"
|
||||||
width: "Largeur"
|
width: "Largeur"
|
||||||
height: "Hauteur"
|
height: "Hauteur"
|
||||||
|
large: "Grand"
|
||||||
|
medium: "Moyen"
|
||||||
|
small: "Petit"
|
||||||
generateAccessToken: "Générer un jeton d'accès"
|
generateAccessToken: "Générer un jeton d'accès"
|
||||||
permission: "Autorisations "
|
permission: "Autorisations "
|
||||||
enableAll: "Tout activer"
|
enableAll: "Tout activer"
|
||||||
@ -547,6 +562,8 @@ useStarForReactionFallback: "Utiliser ★ comme alternative si l’émoji de ré
|
|||||||
emailConfig: "Configuration du serveur email"
|
emailConfig: "Configuration du serveur email"
|
||||||
enableEmail: "Activer la distribution de courriel"
|
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."
|
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"
|
smtpConfig: "Paramètres du serveur SMTP"
|
||||||
smtpHost: "Hôte"
|
smtpHost: "Hôte"
|
||||||
smtpPort: "Port"
|
smtpPort: "Port"
|
||||||
@ -571,27 +588,105 @@ create: "Créer"
|
|||||||
notificationSetting: "Paramètres des notifications "
|
notificationSetting: "Paramètres des notifications "
|
||||||
notificationSettingDesc: "Sélectionnez le type de notification à afficher"
|
notificationSettingDesc: "Sélectionnez le type de notification à afficher"
|
||||||
useGlobalSetting: "Utiliser paramètre général"
|
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"
|
other: "Autre"
|
||||||
regenerateLoginToken: "Régénérer le jeton de connexion"
|
regenerateLoginToken: "Régénérer le jeton de connexion"
|
||||||
setMultipleBySeparatingWithSpace: "Vous pouvez définir plus d’un, séparés par des espaces."
|
setMultipleBySeparatingWithSpace: "Vous pouvez définir plus d’un, séparés par des espaces."
|
||||||
fileIdOrUrl: "ID du fichier ou URL"
|
fileIdOrUrl: "ID du fichier ou URL"
|
||||||
chatOpenBehavior: "Comportement de la fenêtre de discussion lors de son ouverture"
|
chatOpenBehavior: "Comportement de la fenêtre de discussion lors de son ouverture"
|
||||||
|
abuseReports: "Signalements"
|
||||||
|
reportAbuse: "Signalements"
|
||||||
|
reportAbuseOf: "Signaler {name}"
|
||||||
|
send: "Envoyer"
|
||||||
|
abuseMarkAsResolved: "Marquer le signalement comme résolu"
|
||||||
|
openInNewTab: "Ouvrir dans un nouvel onglet"
|
||||||
|
waitingFor: "En attente de {x}"
|
||||||
random: "Aléatoire"
|
random: "Aléatoire"
|
||||||
|
clip: "Clip"
|
||||||
|
createNewClip: "Créer un nouveau clip"
|
||||||
public: "Public"
|
public: "Public"
|
||||||
|
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"
|
||||||
|
followingCount: "Nombre de comptes suivis"
|
||||||
|
driveFilesCount: "Nombre de fichiers dans le 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."
|
||||||
|
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."
|
||||||
|
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é"
|
||||||
|
showTitlebar: "Afficher la barre de titre"
|
||||||
clearCache: "Vider le cache"
|
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"
|
||||||
|
textColor: "Texte"
|
||||||
|
saveAs: "Enregistrer sous ..."
|
||||||
|
advanced: "Avancé"
|
||||||
|
value: "Valeur"
|
||||||
|
saveConfirm: "Voulez-vous sauvegarder les modifications?"
|
||||||
|
closeAccount: "Fermer le compte"
|
||||||
|
usageAmount: "Utilisation"
|
||||||
|
capacity: "Capacité "
|
||||||
|
inUse: "utilisé"
|
||||||
|
_email:
|
||||||
|
_follow:
|
||||||
|
title: "Vous suit"
|
||||||
|
_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 sensibles"
|
||||||
|
ignore: "Afficher les médias sensibles"
|
||||||
|
force: "Cacher tous les médias"
|
||||||
_mfm:
|
_mfm:
|
||||||
mention: "Mentionner"
|
mention: "Mentionner"
|
||||||
hashtag: "Hashtags"
|
hashtag: "Hashtags"
|
||||||
link: "Lien"
|
link: "Lien"
|
||||||
|
bold: "Gras"
|
||||||
center: "Centrée"
|
center: "Centrée"
|
||||||
quote: "Citer"
|
quote: "Citer"
|
||||||
|
quoteDescription: "Affiche le contenu sous forme de citation."
|
||||||
emoji: "Émojis personnalisés"
|
emoji: "Émojis personnalisés"
|
||||||
search: "Rechercher"
|
search: "Rechercher"
|
||||||
|
flip: "Inverser"
|
||||||
font: "Police de caractères"
|
font: "Police de caractères"
|
||||||
_reversi:
|
_reversi:
|
||||||
total: "Total"
|
total: "Total"
|
||||||
_serverDisconnectedBehavior:
|
_serverDisconnectedBehavior:
|
||||||
reload: "Rechargement automatique"
|
reload: "Rechargement automatique"
|
||||||
|
quiet: "Afficher un avertissement discret"
|
||||||
_channel:
|
_channel:
|
||||||
create: "Créer un canal"
|
create: "Créer un canal"
|
||||||
edit: "Éditer le canal"
|
edit: "Éditer le canal"
|
||||||
@ -613,6 +708,7 @@ _theme:
|
|||||||
manage: "Gestion des thèmes"
|
manage: "Gestion des thèmes"
|
||||||
code: "Code du thème"
|
code: "Code du thème"
|
||||||
installed: "{name} a été installé"
|
installed: "{name} a été installé"
|
||||||
|
installedThemes: "Thèmes installés"
|
||||||
alreadyInstalled: "Ce thème est déjà installé"
|
alreadyInstalled: "Ce thème est déjà installé"
|
||||||
invalid: "Le format du thème n'est pas valide"
|
invalid: "Le format du thème n'est pas valide"
|
||||||
make: "Créer un thème"
|
make: "Créer un thème"
|
||||||
@ -766,6 +862,7 @@ _widgets:
|
|||||||
federation: "Fédération"
|
federation: "Fédération"
|
||||||
postForm: "Formulaire à publier"
|
postForm: "Formulaire à publier"
|
||||||
button: "Bouton"
|
button: "Bouton"
|
||||||
|
jobQueue: "File d’attente"
|
||||||
_cw:
|
_cw:
|
||||||
hide: "Masquer"
|
hide: "Masquer"
|
||||||
show: "Afficher plus …"
|
show: "Afficher plus …"
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
---
|
---
|
||||||
_lang_: "Bahasa Jepang"
|
_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}"
|
monthAndDay: "{day} {month}"
|
||||||
search: "Pencarian"
|
search: "Pencarian"
|
||||||
notifications: "Notifikasi"
|
notifications: "Notifikasi"
|
||||||
@ -44,9 +46,30 @@ sendMessage: "Kirim pesan"
|
|||||||
copyUsername: "Salin nama pengguna"
|
copyUsername: "Salin nama pengguna"
|
||||||
searchUser: "Cari pengguna"
|
searchUser: "Cari pengguna"
|
||||||
reply: "Balas"
|
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"
|
cantReRenote: "Renote tidak dapat direnote"
|
||||||
quote: "Kutip"
|
quote: "Kutip"
|
||||||
pinnedNote: "Note yang disematkan"
|
pinnedNote: "Note yang disematkan"
|
||||||
|
pinned: "Sematkan ke profil"
|
||||||
you: "Anda"
|
you: "Anda"
|
||||||
clickToShow: "Klik untuk melihat"
|
clickToShow: "Klik untuk melihat"
|
||||||
sensitive: "Konten sensitif"
|
sensitive: "Konten sensitif"
|
||||||
@ -175,33 +198,60 @@ basicInfo: "Informasi Umum"
|
|||||||
pinnedUsers: "Pengguna yang disematkan"
|
pinnedUsers: "Pengguna yang disematkan"
|
||||||
pinnedPages: "Halaman yang disematkan"
|
pinnedPages: "Halaman yang disematkan"
|
||||||
pinnedNotes: "Note 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"
|
invites: "Undang"
|
||||||
invitations: "Undang"
|
invitations: "Undang"
|
||||||
smtpUser: "Nama Pengguna"
|
smtpUser: "Nama Pengguna"
|
||||||
smtpPass: "Kata sandi"
|
smtpPass: "Kata sandi"
|
||||||
|
_email:
|
||||||
|
_follow:
|
||||||
|
title: "Sedang mengikuti"
|
||||||
_mfm:
|
_mfm:
|
||||||
|
mention: "Panggilan"
|
||||||
quote: "Kutip"
|
quote: "Kutip"
|
||||||
emoji: "Emoji kustom"
|
emoji: "Emoji kustom"
|
||||||
search: "Pencarian"
|
search: "Pencarian"
|
||||||
|
_theme:
|
||||||
|
keys:
|
||||||
|
mention: "Panggilan"
|
||||||
_sfx:
|
_sfx:
|
||||||
notification: "Notifikasi"
|
notification: "Notifikasi"
|
||||||
chat: "Pesan"
|
chat: "Pesan"
|
||||||
_widgets:
|
_widgets:
|
||||||
notifications: "Notifikasi"
|
notifications: "Notifikasi"
|
||||||
timeline: "Linimasa"
|
timeline: "Linimasa"
|
||||||
|
_cw:
|
||||||
|
show: "Selebihnya"
|
||||||
|
_visibility:
|
||||||
|
followers: "Pengikut"
|
||||||
_profile:
|
_profile:
|
||||||
username: "Nama Pengguna"
|
username: "Nama Pengguna"
|
||||||
_exportOrImport:
|
_exportOrImport:
|
||||||
|
followingList: "Ikuti"
|
||||||
muteList: "Bisukan"
|
muteList: "Bisukan"
|
||||||
blockingList: "Blokir"
|
blockingList: "Blokir"
|
||||||
_rooms:
|
_rooms:
|
||||||
_roomType:
|
_roomType:
|
||||||
default: "Bawaan"
|
default: "Bawaan"
|
||||||
_notification:
|
_notification:
|
||||||
|
youWereFollowed: "Sedang mengikuti"
|
||||||
_types:
|
_types:
|
||||||
|
follow: "Ikuti"
|
||||||
|
mention: "Panggilan"
|
||||||
quote: "Kutip"
|
quote: "Kutip"
|
||||||
reaction: "Reaksi"
|
reaction: "Reaksi"
|
||||||
_deck:
|
_deck:
|
||||||
_columns:
|
_columns:
|
||||||
notifications: "Notifikasi"
|
notifications: "Notifikasi"
|
||||||
tl: "Linimasa"
|
tl: "Linimasa"
|
||||||
|
antenna: "Antena"
|
||||||
|
@ -43,7 +43,7 @@ const primaries = {
|
|||||||
'zh': 'CN',
|
'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)
|
module.exports = Object.entries(locales)
|
||||||
.reduce((a, [k ,v]) => (a[k] = (() => {
|
.reduce((a, [k ,v]) => (a[k] = (() => {
|
||||||
|
@ -1 +1,574 @@
|
|||||||
---
|
---
|
||||||
|
_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}"
|
||||||
|
random: "Casuale"
|
||||||
|
system: "Sistema"
|
||||||
|
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"
|
||||||
|
@ -97,6 +97,7 @@ cantRenote: "この投稿はRenoteできません。"
|
|||||||
cantReRenote: "RenoteをRenoteすることはできません。"
|
cantReRenote: "RenoteをRenoteすることはできません。"
|
||||||
quote: "引用"
|
quote: "引用"
|
||||||
pinnedNote: "ピン留めされたノート"
|
pinnedNote: "ピン留めされたノート"
|
||||||
|
pinned: "ピン留め"
|
||||||
you: "あなた"
|
you: "あなた"
|
||||||
clickToShow: "クリックして表示"
|
clickToShow: "クリックして表示"
|
||||||
sensitive: "閲覧注意"
|
sensitive: "閲覧注意"
|
||||||
@ -437,6 +438,7 @@ signinWith: "{x}でログイン"
|
|||||||
signinFailed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
signinFailed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||||
tapSecurityKey: "セキュリティキーにタッチ"
|
tapSecurityKey: "セキュリティキーにタッチ"
|
||||||
or: "もしくは"
|
or: "もしくは"
|
||||||
|
language: "言語"
|
||||||
uiLanguage: "UIの表示言語"
|
uiLanguage: "UIの表示言語"
|
||||||
groupInvited: "グループに招待されました"
|
groupInvited: "グループに招待されました"
|
||||||
aboutX: "{x}について"
|
aboutX: "{x}について"
|
||||||
@ -548,7 +550,6 @@ author: "作者"
|
|||||||
leaveConfirm: "未保存の変更があります。破棄しますか?"
|
leaveConfirm: "未保存の変更があります。破棄しますか?"
|
||||||
manage: "管理"
|
manage: "管理"
|
||||||
plugins: "プラグイン"
|
plugins: "プラグイン"
|
||||||
pluginInstallWarn: "信頼できないプラグインはインストールしないでください。"
|
|
||||||
deck: "デッキ"
|
deck: "デッキ"
|
||||||
undeck: "デッキ解除"
|
undeck: "デッキ解除"
|
||||||
useBlurEffectForModal: "モーダルにぼかし効果を使用"
|
useBlurEffectForModal: "モーダルにぼかし効果を使用"
|
||||||
@ -677,6 +678,56 @@ clearCache: "キャッシュをクリア"
|
|||||||
onlineUsersCount: "{n}人がオンライン"
|
onlineUsersCount: "{n}人がオンライン"
|
||||||
nUsers: "{n}ユーザー"
|
nUsers: "{n}ユーザー"
|
||||||
nNotes: "{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:
|
_aboutMisskey:
|
||||||
about: "Misskeyはsyuiloによって2014年から開発されている、オープンソースのソフトウェアです。"
|
about: "Misskeyはsyuiloによって2014年から開発されている、オープンソースのソフトウェアです。"
|
||||||
@ -1032,6 +1083,7 @@ _widgets:
|
|||||||
onlineUsers: "オンラインユーザー"
|
onlineUsers: "オンラインユーザー"
|
||||||
jobQueue: "ジョブキュー"
|
jobQueue: "ジョブキュー"
|
||||||
serverMetric: "サーバーメトリクス"
|
serverMetric: "サーバーメトリクス"
|
||||||
|
aiscript: "AiScriptコンソール"
|
||||||
|
|
||||||
_cw:
|
_cw:
|
||||||
hide: "隠す"
|
hide: "隠す"
|
||||||
@ -1550,6 +1602,7 @@ _deck:
|
|||||||
swapDown: "下に移動"
|
swapDown: "下に移動"
|
||||||
stackLeft: "左に重ねる"
|
stackLeft: "左に重ねる"
|
||||||
popRight: "右に出す"
|
popRight: "右に出す"
|
||||||
|
profile: "プロファイル"
|
||||||
|
|
||||||
_columns:
|
_columns:
|
||||||
main: "メイン"
|
main: "メイン"
|
||||||
|
@ -1,15 +1,15 @@
|
|||||||
---
|
---
|
||||||
_lang_: "日本語 (関西弁)"
|
_lang_: "日本語 (関西弁)"
|
||||||
introMisskey: "ようこそ!Misskeyってのは、オープンソースの分散型マイクロブログサービスやねん。\n「ノート」を作成し、いま起こっとることを共有したり、あんたんこととか皆に伝えていこう📡\n「リアクション」機能で、皆のノートに素はよ反応を追加することもできるんやで✌\n新しい世界を探検してみらん?🚀"
|
introMisskey: "ようお越し!Misskeyは、オープンソースの分散型マイクロブログサービスやねん。\n「ノート」を作って、いま起こっとることを共有したり、あんたについて皆に発信しよう📡\n「リアクション」機能で、皆のノートに素早く反応を追加したりもできるで✌\nほな新しい世界を探検しよか🚀"
|
||||||
monthAndDay: "{month}月 {day}日"
|
monthAndDay: "{month}月 {day}日"
|
||||||
search: "探す"
|
search: "探す"
|
||||||
notifications: "通知"
|
notifications: "通知"
|
||||||
username: "ユーザー名"
|
username: "ユーザー名"
|
||||||
password: "パスワード"
|
password: "パスワード"
|
||||||
fetchingAsApObject: "今ちと連合に照会しとるで"
|
fetchingAsApObject: "今ちと連合に照会しとるで"
|
||||||
ok: "おっけー"
|
ok: "OKや"
|
||||||
gotIt: "ほい"
|
gotIt: "ほい"
|
||||||
cancel: "やめとくわ"
|
cancel: "やめとく"
|
||||||
enterUsername: "ユーザー名を入れてや"
|
enterUsername: "ユーザー名を入れてや"
|
||||||
renotedBy: "{user}がRenote"
|
renotedBy: "{user}がRenote"
|
||||||
noNotes: "ノートはあらへん"
|
noNotes: "ノートはあらへん"
|
||||||
@ -18,16 +18,16 @@ instance: "インスタンス"
|
|||||||
settings: "設定"
|
settings: "設定"
|
||||||
basicSettings: "基本設定"
|
basicSettings: "基本設定"
|
||||||
otherSettings: "その他の設定"
|
otherSettings: "その他の設定"
|
||||||
openInWindow: "ウィンドウで開いてや"
|
openInWindow: "ウィンドウで開くで"
|
||||||
profile: "プロフィール"
|
profile: "プロフィール"
|
||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
noAccountDescription: "自己紹介はあらへん"
|
noAccountDescription: "自己紹介食ってもた"
|
||||||
login: "ログイン"
|
login: "ログイン"
|
||||||
loggingIn: "ログインしよるで"
|
loggingIn: "ログインしよるで"
|
||||||
logout: "ログアウト"
|
logout: "ログアウト"
|
||||||
signup: "新規登録"
|
signup: "新規登録"
|
||||||
uploading: "アップロードしよるで"
|
uploading: "アップロードしとるで"
|
||||||
save: "とっとく"
|
save: "保存"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
addUser: "ユーザーを追加や"
|
addUser: "ユーザーを追加や"
|
||||||
favorite: "お気に入り"
|
favorite: "お気に入り"
|
||||||
@ -42,14 +42,14 @@ copyContent: "内容をコピー"
|
|||||||
copyLink: "リンクをコピー"
|
copyLink: "リンクをコピー"
|
||||||
delete: "ほかす"
|
delete: "ほかす"
|
||||||
deleteAndEdit: "ほかして直す"
|
deleteAndEdit: "ほかして直す"
|
||||||
deleteAndEditConfirm: "このノートをほかしてもっかい直す?このノートへのリアクション、Renote、返信も全部消えるんやけどそれでもええん?"
|
deleteAndEditConfirm: "このノートをほかして書き直すんか?このノートへのリアクション、Renote、返信も全部消えてまうで。"
|
||||||
addToList: "リストに入れたる"
|
addToList: "リストに入れたる"
|
||||||
sendMessage: "メッセージを送る"
|
sendMessage: "メッセージを送る"
|
||||||
copyUsername: "ユーザー名をコピー"
|
copyUsername: "ユーザー名をコピー"
|
||||||
searchUser: "ユーザーを検索"
|
searchUser: "ユーザーを検索"
|
||||||
reply: "返す"
|
reply: "返事"
|
||||||
loadMore: "もっとあるやろ!"
|
loadMore: "まだまだあるで!"
|
||||||
showMore: "もっとあるやろ!"
|
showMore: "まだまだあるで!"
|
||||||
youGotNewFollower: "フォローされたで"
|
youGotNewFollower: "フォローされたで"
|
||||||
receiveFollowRequest: "フォローリクエストされたで"
|
receiveFollowRequest: "フォローリクエストされたで"
|
||||||
followRequestAccepted: "フォローが承認されたで"
|
followRequestAccepted: "フォローが承認されたで"
|
||||||
@ -80,12 +80,12 @@ retry: "もっぺんやる?"
|
|||||||
pageLoadError: "ページの読み込みに失敗してしもうたで…"
|
pageLoadError: "ページの読み込みに失敗してしもうたで…"
|
||||||
pageLoadErrorDescription: "これは普通、ネットワークかブラウザキャッシュが原因やからね。キャッシュをクリアするか、もうちっとだけ待ってくれへんか?"
|
pageLoadErrorDescription: "これは普通、ネットワークかブラウザキャッシュが原因やからね。キャッシュをクリアするか、もうちっとだけ待ってくれへんか?"
|
||||||
enterListName: "リスト名を入れてや"
|
enterListName: "リスト名を入れてや"
|
||||||
privacy: "プライバシーってなんぞや?"
|
privacy: "プライバシー"
|
||||||
makeFollowManuallyApprove: "他人からのフォローは自分が決める"
|
makeFollowManuallyApprove: "ええって言わなフォローできへんようにする"
|
||||||
defaultNoteVisibility: "もとからの公開範囲"
|
defaultNoteVisibility: "もとからの公開範囲"
|
||||||
follow: "フォロー"
|
follow: "フォロー"
|
||||||
followRequest: "フォローを頼む"
|
followRequest: "フォローを頼む"
|
||||||
followRequests: "フォローを頼む"
|
followRequests: "フォロー申請"
|
||||||
unfollow: "フォローやめる"
|
unfollow: "フォローやめる"
|
||||||
followRequestPending: "フォロー許してくれるん待っとる"
|
followRequestPending: "フォロー許してくれるん待っとる"
|
||||||
enterEmoji: "絵文字を入れてや"
|
enterEmoji: "絵文字を入れてや"
|
||||||
@ -93,18 +93,19 @@ renote: "Renote"
|
|||||||
unrenote: "Renoteやめる"
|
unrenote: "Renoteやめる"
|
||||||
renoted: "Renoteしたで。"
|
renoted: "Renoteしたで。"
|
||||||
cantRenote: "この投稿はRenoteできへんらしい。"
|
cantRenote: "この投稿はRenoteできへんらしい。"
|
||||||
cantReRenote: "すまん、今このRenoteにRenoteはできへんのや。"
|
cantReRenote: "Renote自体はRenoteできへんで。"
|
||||||
quote: "引用"
|
quote: "引用"
|
||||||
pinnedNote: "ピン留めされとるノート"
|
pinnedNote: "ピン留めされとるノート"
|
||||||
|
pinned: "ピン留めしとく"
|
||||||
you: "あんた"
|
you: "あんた"
|
||||||
clickToShow: "押したら見えるようになるで"
|
clickToShow: "押したら見えるで"
|
||||||
sensitive: "ちょっとアカンやつやで"
|
sensitive: "ちょっとアカンやつやで"
|
||||||
add: "増やす"
|
add: "増やす"
|
||||||
reaction: "リアクション"
|
reaction: "リアクション"
|
||||||
reactionSettingDescription: "リアクションピッカーに出しとくリアクションを選んでや。"
|
reactionSettingDescription: "リアクションピッカーに出しとくリアクションを選んでや。"
|
||||||
reactionSettingDescription2: "ドラッグして並び替え、クリックして削除、+を押すと追加できるで。"
|
reactionSettingDescription2: "ドラッグで並び替え、クリックで削除、+を押して追加やで。"
|
||||||
rememberNoteVisibility: "公開範囲覚えといて"
|
rememberNoteVisibility: "公開範囲覚えといて"
|
||||||
attachCancel: "やっぱ添付やめてくれん?"
|
attachCancel: "のっけるのやめる"
|
||||||
markAsSensitive: "ちょっとこれはアカン"
|
markAsSensitive: "ちょっとこれはアカン"
|
||||||
unmarkAsSensitive: "そこまでアカンことないやろ"
|
unmarkAsSensitive: "そこまでアカンことないやろ"
|
||||||
enterFileName: "ファイル名を入れてや"
|
enterFileName: "ファイル名を入れてや"
|
||||||
@ -130,12 +131,12 @@ emojiUrl: "絵文字画像URL"
|
|||||||
addEmoji: "絵文字を追加"
|
addEmoji: "絵文字を追加"
|
||||||
settingGuide: "ええ感じの設定"
|
settingGuide: "ええ感じの設定"
|
||||||
cacheRemoteFiles: "リモートのファイルをキャッシュする"
|
cacheRemoteFiles: "リモートのファイルをキャッシュする"
|
||||||
cacheRemoteFilesDescription: "この設定を切っとくと、リモートファイルをキャッシュせず直リンクするようになってしまうんやで? サーバーのストレージは節約できるんやけど、かわりにサムネイルが作られんくなるから通信量が増えるで?"
|
cacheRemoteFilesDescription: "この設定を切っとくと、リモートファイルをキャッシュせず直リンクするようになるで。サーバーの容量は節約できるけど、サムネイルが作られんくなるから通信量が増えるで。"
|
||||||
flagAsBot: "Botやで"
|
flagAsBot: "Botやで"
|
||||||
flagAsBotDescription: "もしこのアカウントがプログラムによって運用されるんやったら、このフラグをオンにしてたのむで。オンにすると、反応の連鎖を防ぐためのフラグとして他の開発者に役立ったり、Misskeyのシステム上での扱いがBotに合ったもんになるんやで。"
|
flagAsBotDescription: "もしこのアカウントがプログラムによって運用されるんやったら、このフラグをオンにしてたのむで。オンにすると、反応の連鎖を防ぐためのフラグとして他の開発者に役立ったり、Misskeyのシステム上での扱いがBotに合ったもんになるんやで。"
|
||||||
flagAsCat: "Catやで"
|
flagAsCat: "Catやで"
|
||||||
flagAsCatDescription: "ワレ、猫ちゃんならこのフラグをつけてみ?"
|
flagAsCatDescription: "ワレ、猫ちゃんならこのフラグをつけてみ?"
|
||||||
autoAcceptFollowed: "フォローしとるユーザーからのフォローリクエストには勝手に許可しとくで。"
|
autoAcceptFollowed: "フォローしとるユーザーからのフォローリクエストを勝手に許可しとく"
|
||||||
addAcount: "アカウント追加"
|
addAcount: "アカウント追加"
|
||||||
loginFailed: "ログインに失敗してしもうた…"
|
loginFailed: "ログインに失敗してしもうた…"
|
||||||
showOnRemote: "リモートで見る"
|
showOnRemote: "リモートで見る"
|
||||||
@ -180,7 +181,7 @@ clearQueue: "キューにさいなら"
|
|||||||
clearQueueConfirmTitle: "キューをクリアしまっか?"
|
clearQueueConfirmTitle: "キューをクリアしまっか?"
|
||||||
clearQueueConfirmText: "未配達の投稿は配送されなくなるで。通常この操作を行う必要はあらへんや。"
|
clearQueueConfirmText: "未配達の投稿は配送されなくなるで。通常この操作を行う必要はあらへんや。"
|
||||||
clearCachedFiles: "キャッシュにさいなら"
|
clearCachedFiles: "キャッシュにさいなら"
|
||||||
clearCachedFilesConfirm: "キャッシュされとるリモートファイルを全部削除しまっか?"
|
clearCachedFilesConfirm: "キャッシュされとるリモートファイルをみんなほかしてええか?"
|
||||||
blockedInstances: "インスタンスブロック"
|
blockedInstances: "インスタンスブロック"
|
||||||
blockedInstancesDescription: "ブロックしたいインスタンスのホストを改行で区切って設定してな。ブロックされてもうたインスタンスとはもう金輪際やり取りできひんくなるで。"
|
blockedInstancesDescription: "ブロックしたいインスタンスのホストを改行で区切って設定してな。ブロックされてもうたインスタンスとはもう金輪際やり取りできひんくなるで。"
|
||||||
muteAndBlock: "ミュートとブロック"
|
muteAndBlock: "ミュートとブロック"
|
||||||
@ -213,18 +214,18 @@ retypedNotMatch: "そやないねん。"
|
|||||||
currentPassword: "今のパスワード"
|
currentPassword: "今のパスワード"
|
||||||
newPassword: "今度のパスワード"
|
newPassword: "今度のパスワード"
|
||||||
newPasswordRetype: "今度のパスワード(もっぺん入れて)"
|
newPasswordRetype: "今度のパスワード(もっぺん入れて)"
|
||||||
attachFile: "ファイルくっつけて"
|
attachFile: "ファイルのっける"
|
||||||
more: "他ないんか!"
|
more: "他のやつ!"
|
||||||
featured: "ハイライト"
|
featured: "ハイライト"
|
||||||
usernameOrUserId: "ユーザー名かユーザーID"
|
usernameOrUserId: "ユーザー名かユーザーID"
|
||||||
noSuchUser: "ユーザーが見つからへんで"
|
noSuchUser: "ユーザーが見つからへんで"
|
||||||
lookup: "見てきて"
|
lookup: "見てきて"
|
||||||
announcements: "これ知っといてな"
|
announcements: "お知らせ"
|
||||||
imageUrl: "画像URL"
|
imageUrl: "画像URL"
|
||||||
remove: "ほかす"
|
remove: "ほかす"
|
||||||
removed: "削除したで!"
|
removed: "削除したで!"
|
||||||
removeAreYouSure: "「{x}」はなおしてしもてええか?"
|
removeAreYouSure: "「{x}」はほかしてええか?"
|
||||||
deleteAreYouSure: "「{x}」はなおしてしもてええか?"
|
deleteAreYouSure: "「{x}」はほかしてええか?"
|
||||||
resetAreYouSure: "リセットしてええん?"
|
resetAreYouSure: "リセットしてええん?"
|
||||||
saved: "保存したで!"
|
saved: "保存したで!"
|
||||||
messaging: "チャット"
|
messaging: "チャット"
|
||||||
@ -245,7 +246,7 @@ agreeTo: "{0}はええで"
|
|||||||
tos: "利用規約"
|
tos: "利用規約"
|
||||||
start: "始める"
|
start: "始める"
|
||||||
home: "ホーム"
|
home: "ホーム"
|
||||||
remoteUserCaution: "リモートユーザーやから、ちゃんとした情報とちゃうで。"
|
remoteUserCaution: "リモートユーザーやから、足りひん情報あるかもしれへん。"
|
||||||
activity: "アクティビティ"
|
activity: "アクティビティ"
|
||||||
images: "画像"
|
images: "画像"
|
||||||
birthday: "生まれた日"
|
birthday: "生まれた日"
|
||||||
@ -259,7 +260,7 @@ light: "ライト"
|
|||||||
dark: "ダーク"
|
dark: "ダーク"
|
||||||
lightThemes: "デイゲーム"
|
lightThemes: "デイゲーム"
|
||||||
darkThemes: "ナイトゲーム"
|
darkThemes: "ナイトゲーム"
|
||||||
syncDeviceDarkMode: "試合開始時間はデバイスのダークモードと一緒や"
|
syncDeviceDarkMode: "デバイスのダークモードと一緒にする"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
fileName: "ファイル名"
|
fileName: "ファイル名"
|
||||||
selectFile: "ファイル選んでや"
|
selectFile: "ファイル選んでや"
|
||||||
@ -283,9 +284,9 @@ copyUrl: "URLをコピー"
|
|||||||
rename: "名前を変えるで"
|
rename: "名前を変えるで"
|
||||||
avatar: "アイコン"
|
avatar: "アイコン"
|
||||||
banner: "バナー"
|
banner: "バナー"
|
||||||
nsfw: "ちょっとアカンやつやで"
|
nsfw: "閲覧注意"
|
||||||
whenServerDisconnected: "サーバーとの接続が失くなってしもうたとき"
|
whenServerDisconnected: "サーバーとの接続が切れたとき"
|
||||||
disconnectedFromServer: "サーバーが機嫌悪いねん"
|
disconnectedFromServer: "サーバーとの通信が切れたで"
|
||||||
reload: "リロード"
|
reload: "リロード"
|
||||||
doNothing: "何もせんとく"
|
doNothing: "何もせんとく"
|
||||||
reloadConfirm: "リロードしてええか?"
|
reloadConfirm: "リロードしてええか?"
|
||||||
@ -306,7 +307,7 @@ dayX: "{day}日"
|
|||||||
monthX: "{month}月"
|
monthX: "{month}月"
|
||||||
yearX: "{year}年"
|
yearX: "{year}年"
|
||||||
pages: "ページ"
|
pages: "ページ"
|
||||||
integration: "つないで"
|
integration: "連携"
|
||||||
connectSerice: "つなげる"
|
connectSerice: "つなげる"
|
||||||
disconnectSerice: "切ってまう"
|
disconnectSerice: "切ってまう"
|
||||||
enableLocalTimeline: "ローカルタイムラインを使えるようにする"
|
enableLocalTimeline: "ローカルタイムラインを使えるようにする"
|
||||||
@ -316,7 +317,7 @@ registration: "登録"
|
|||||||
enableRegistration: "一見さんでも誰でもいらっしゃ~い"
|
enableRegistration: "一見さんでも誰でもいらっしゃ~い"
|
||||||
invite: "来てや"
|
invite: "来てや"
|
||||||
proxyRemoteFiles: "リモートのファイルをプロキシする"
|
proxyRemoteFiles: "リモートのファイルをプロキシする"
|
||||||
proxyRemoteFilesDescription: "この設定を入れると、保存しとらんかったり、お腹いっぱいになってしもたせいで保存できんかったリモートファイルをローカルでプロキシして、サムネイル作ってもらうことができるで。サーバーの腹具合には影響せんけどな。"
|
proxyRemoteFilesDescription: "この設定を有効にしたら、保存してなかったり容量が足らんくて消されたリモートファイルをローカルでプロキシして、サムネイルを作るようになるで。サーバーの容量には関係ないで。"
|
||||||
driveCapacityPerLocalAccount: "ローカルユーザーひとりあたりのドライブ容量"
|
driveCapacityPerLocalAccount: "ローカルユーザーひとりあたりのドライブ容量"
|
||||||
driveCapacityPerRemoteAccount: "リモートユーザーひとりあたりのドライブ容量"
|
driveCapacityPerRemoteAccount: "リモートユーザーひとりあたりのドライブ容量"
|
||||||
inMb: "メガバイト単位"
|
inMb: "メガバイト単位"
|
||||||
@ -380,11 +381,11 @@ unregister: "登録やめる"
|
|||||||
passwordLessLogin: "パスワード無くてもログインできるようにする"
|
passwordLessLogin: "パスワード無くてもログインできるようにする"
|
||||||
resetPassword: "パスワードをリセット"
|
resetPassword: "パスワードをリセット"
|
||||||
newPasswordIs: "今度のパスワードは「{password}」や"
|
newPasswordIs: "今度のパスワードは「{password}」や"
|
||||||
reduceUiAnimation: "UIの動きやアニメーションを減らしてくれや。"
|
reduceUiAnimation: "UIの動きやアニメーションを減らす"
|
||||||
share: "わけわけ"
|
share: "わけわけ"
|
||||||
notFound: "見つからへんね"
|
notFound: "見つからへんね"
|
||||||
notFoundDescription: "指定されたURLに該当するページはあらへんやった。"
|
notFoundDescription: "指定されたURLに該当するページはあらへんやった。"
|
||||||
uploadFolder: "とりあえずここへアップロード"
|
uploadFolder: "とりあえずアップロードしたやつ置いとく所"
|
||||||
cacheClear: "キャッシュをほかす"
|
cacheClear: "キャッシュをほかす"
|
||||||
markAsReadAllNotifications: "通知はもう全て読んだわっ"
|
markAsReadAllNotifications: "通知はもう全て読んだわっ"
|
||||||
markAsReadAllUnreadNotes: "投稿は全て読んだわっ"
|
markAsReadAllUnreadNotes: "投稿は全て読んだわっ"
|
||||||
@ -423,9 +424,9 @@ checking: "確認しとるで"
|
|||||||
available: "利用できる\n"
|
available: "利用できる\n"
|
||||||
unavailable: "利用できん"
|
unavailable: "利用できん"
|
||||||
usernameInvalidFormat: "a~z、A~Z、0~9、_が使えるで"
|
usernameInvalidFormat: "a~z、A~Z、0~9、_が使えるで"
|
||||||
tooShort: "短すぎやろ!"
|
tooShort: "短すぎやろ!"
|
||||||
tooLong: "長すぎやろ!"
|
tooLong: "長すぎやろ!"
|
||||||
weakPassword: "弱いパスワード"
|
weakPassword: "へぼいパスワード"
|
||||||
normalPassword: "普通のパスワード"
|
normalPassword: "普通のパスワード"
|
||||||
strongPassword: "ええ感じのパスワード"
|
strongPassword: "ええ感じのパスワード"
|
||||||
passwordMatched: "よし!一致や!"
|
passwordMatched: "よし!一致や!"
|
||||||
@ -439,6 +440,7 @@ useOsNativeEmojis: "OSネイティブの絵文字を使う"
|
|||||||
youHaveNoGroups: "グループがあらへんねぇ。"
|
youHaveNoGroups: "グループがあらへんねぇ。"
|
||||||
noHistory: "履歴はあらへんねぇ。"
|
noHistory: "履歴はあらへんねぇ。"
|
||||||
signinHistory: "ログイン履歴"
|
signinHistory: "ログイン履歴"
|
||||||
|
disableAnimatedMfm: "動きがやかましいMFMを止める"
|
||||||
doing: "やっとるがな"
|
doing: "やっとるがな"
|
||||||
category: "カテゴリ"
|
category: "カテゴリ"
|
||||||
tags: "タグ"
|
tags: "タグ"
|
||||||
@ -452,15 +454,32 @@ openImageInNewTab: "画像を新しいタブで開く"
|
|||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
local: "ローカル"
|
local: "ローカル"
|
||||||
remote: "リモート"
|
remote: "リモート"
|
||||||
|
scratchpadDescription: "スクラッチパッドではAiScriptを色々試すことができるんや。Misskeyに対して色々できるコードを書いて動かしてみたり、結果を見たりできるで。"
|
||||||
|
leaveConfirm: "未保存の変更があるで!ほかしてええか?"
|
||||||
|
emailConfigInfo: "メールアドレスの確認とかパスワードリセットの時に使うで"
|
||||||
smtpHost: "ホスト"
|
smtpHost: "ホスト"
|
||||||
smtpUser: "ユーザー名"
|
smtpUser: "ユーザー名"
|
||||||
smtpPass: "パスワード"
|
smtpPass: "パスワード"
|
||||||
clearCache: "キャッシュにさいなら"
|
notificationSettingDesc: "表示する通知の種類えらんでや。"
|
||||||
|
emailVerified: "メールアドレスは確認されたで"
|
||||||
|
pageLikesCount: "Pageにええやんと思った数"
|
||||||
|
pageLikedCount: "Pageにええやんと思ってくれた数"
|
||||||
|
reloadToApplySetting: "設定はページリロード後に反映されるで。今リロードしとくか?"
|
||||||
|
clearCache: "キャッシュをほかす"
|
||||||
|
onlineUsersCount: "{n}人が起きとるで"
|
||||||
|
sendErrorReportsDescription: "オンにしたら、なんか変なことが起きたときにエラーの詳細がMisskeyに共有されて、ソフトウェアの品質向上に役立てられるんや。エラー情報には、OSのバージョン、ブラウザの種類、行動履歴などが含まれるで。"
|
||||||
|
youAreRunningUpToDateClient: "今使ってるクライアントが最新やで!"
|
||||||
|
newVersionOfClientAvailable: "新しいバージョンのクライアントが使えるで。"
|
||||||
|
_email:
|
||||||
|
_follow:
|
||||||
|
title: "フォローされたで"
|
||||||
_mfm:
|
_mfm:
|
||||||
mention: "メンション"
|
mention: "メンション"
|
||||||
quote: "引用"
|
quote: "引用"
|
||||||
emoji: "カスタム絵文字"
|
emoji: "カスタム絵文字"
|
||||||
search: "探す"
|
search: "探す"
|
||||||
|
_channel:
|
||||||
|
notesCount: "{n}こ投稿があるで"
|
||||||
_sidebar:
|
_sidebar:
|
||||||
icon: "アイコン"
|
icon: "アイコン"
|
||||||
_theme:
|
_theme:
|
||||||
@ -472,7 +491,7 @@ _sfx:
|
|||||||
notification: "通知"
|
notification: "通知"
|
||||||
chat: "チャット"
|
chat: "チャット"
|
||||||
_ago:
|
_ago:
|
||||||
unknown: "謎"
|
unknown: "わからん"
|
||||||
future: "未来"
|
future: "未来"
|
||||||
justNow: "たった今"
|
justNow: "たった今"
|
||||||
secondsAgo: "{n}秒前"
|
secondsAgo: "{n}秒前"
|
||||||
@ -487,8 +506,13 @@ _time:
|
|||||||
minute: "分"
|
minute: "分"
|
||||||
hour: "時間"
|
hour: "時間"
|
||||||
day: "日"
|
day: "日"
|
||||||
|
_tutorial:
|
||||||
|
step3_1: "プロフィール設定はええ感じにできたか?"
|
||||||
_2fa:
|
_2fa:
|
||||||
alreadyRegistered: "もう設定終わっとるわ"
|
alreadyRegistered: "もう設定終わっとるわ。"
|
||||||
|
_permissions:
|
||||||
|
"read:page-likes": "ページのええやんを見る"
|
||||||
|
"write:page-likes": "ページのええやんを操作する"
|
||||||
_auth:
|
_auth:
|
||||||
permissionAsk: "このアプリは次の権限を要求しとるで"
|
permissionAsk: "このアプリは次の権限を要求しとるで"
|
||||||
_antennaSources:
|
_antennaSources:
|
||||||
@ -499,8 +523,9 @@ _widgets:
|
|||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
activity: "アクティビティ"
|
activity: "アクティビティ"
|
||||||
federation: "連合"
|
federation: "連合"
|
||||||
|
jobQueue: "ジョブキュー"
|
||||||
_cw:
|
_cw:
|
||||||
show: "もっとあるやろ!"
|
show: "続き見して!"
|
||||||
_poll:
|
_poll:
|
||||||
noMore: "これ以上追加でけへん"
|
noMore: "これ以上追加でけへん"
|
||||||
deadlineTime: "時間"
|
deadlineTime: "時間"
|
||||||
@ -520,11 +545,15 @@ _exportOrImport:
|
|||||||
_timelines:
|
_timelines:
|
||||||
home: "ホーム"
|
home: "ホーム"
|
||||||
_rooms:
|
_rooms:
|
||||||
|
leaveConfirm: "未保存の変更があるけど、移動してええか?"
|
||||||
_roomType:
|
_roomType:
|
||||||
default: "デフォルト"
|
default: "デフォルト"
|
||||||
_furnitures:
|
_furnitures:
|
||||||
monitor: "モニター"
|
monitor: "モニター"
|
||||||
_pages:
|
_pages:
|
||||||
|
like: "ええやん"
|
||||||
|
unlike: "良くないわ"
|
||||||
|
liked: "ええと思ったページ"
|
||||||
blocks:
|
blocks:
|
||||||
image: "画像"
|
image: "画像"
|
||||||
script:
|
script:
|
||||||
@ -547,6 +576,8 @@ _pages:
|
|||||||
array: "リスト"
|
array: "リスト"
|
||||||
_notification:
|
_notification:
|
||||||
youWereFollowed: "フォローされたで"
|
youWereFollowed: "フォローされたで"
|
||||||
|
youReceivedFollowRequest: "フォロー許可してほしいみたいやな"
|
||||||
|
yourFollowRequestAccepted: "フォローさせてもろたで"
|
||||||
youWereInvitedToGroup: "グループに招待されとるで"
|
youWereInvitedToGroup: "グループに招待されとるで"
|
||||||
_types:
|
_types:
|
||||||
follow: "フォロー"
|
follow: "フォロー"
|
||||||
@ -554,6 +585,8 @@ _notification:
|
|||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
quote: "引用"
|
quote: "引用"
|
||||||
reaction: "リアクション"
|
reaction: "リアクション"
|
||||||
|
receiveFollowRequest: "フォロー許可してほしいみたいやで"
|
||||||
|
followRequestAccepted: "フォローが受理されたで"
|
||||||
_deck:
|
_deck:
|
||||||
_columns:
|
_columns:
|
||||||
notifications: "通知"
|
notifications: "通知"
|
||||||
|
@ -36,6 +36,9 @@ userList: "Tibdarin"
|
|||||||
uiLanguage: "Tutlayt n wegrudem"
|
uiLanguage: "Tutlayt n wegrudem"
|
||||||
smtpUser: "Isem n umseqdac"
|
smtpUser: "Isem n umseqdac"
|
||||||
smtpPass: "Awal uffir"
|
smtpPass: "Awal uffir"
|
||||||
|
_email:
|
||||||
|
_follow:
|
||||||
|
title: "Yeṭṭafaṛ-ik·em-id"
|
||||||
_mfm:
|
_mfm:
|
||||||
mention: "Bder"
|
mention: "Bder"
|
||||||
search: "Nadi"
|
search: "Nadi"
|
||||||
|
@ -53,10 +53,14 @@ files: "ಕಡತಗಳು"
|
|||||||
download: "ಜಾಲದಿಂದಿಳಿಸು"
|
download: "ಜಾಲದಿಂದಿಳಿಸು"
|
||||||
driveFileDeleteConfirm: "\"{name}\" ಕಡತವನ್ನು ಅಳಿಸಲು ನೀವು ಬಯಸುವಿರಾ? ಈ ನೋಡಿರಿ ಲಗತ್ತಿಸಲಾದ ಟಿಪ್ಪಣಿ ಸಹ ಕಣ್ಮರೆಯಾಗುತ್ತದೆ."
|
driveFileDeleteConfirm: "\"{name}\" ಕಡತವನ್ನು ಅಳಿಸಲು ನೀವು ಬಯಸುವಿರಾ? ಈ ನೋಡಿರಿ ಲಗತ್ತಿಸಲಾದ ಟಿಪ್ಪಣಿ ಸಹ ಕಣ್ಮರೆಯಾಗುತ್ತದೆ."
|
||||||
unfollowConfirm: "{name}ಅನ್ನು ಹಿಂಬಾಲಿಸದಿರುವುದೇ?"
|
unfollowConfirm: "{name}ಅನ್ನು ಹಿಂಬಾಲಿಸದಿರುವುದೇ?"
|
||||||
|
pinned: "ಪ್ರೊಫ಼ೈಲಿಗೆ ಅಂಟಿಸು"
|
||||||
instances: "ನಿದರ್ಶನ"
|
instances: "ನಿದರ್ಶನ"
|
||||||
remove: "ಅಳಿಸು"
|
remove: "ಅಳಿಸು"
|
||||||
smtpUser: "ಬಳಕೆಹೆಸರು"
|
smtpUser: "ಬಳಕೆಹೆಸರು"
|
||||||
smtpPass: "ಗುಪ್ತಪದ"
|
smtpPass: "ಗುಪ್ತಪದ"
|
||||||
|
_email:
|
||||||
|
_follow:
|
||||||
|
title: "ಹಿಂಬಾಲಿಸಿದರು"
|
||||||
_mfm:
|
_mfm:
|
||||||
search: "ಹುಡುಕು"
|
search: "ಹುಡುಕು"
|
||||||
_sfx:
|
_sfx:
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
---
|
---
|
||||||
_lang_: "한국어"
|
_lang_: "한국어"
|
||||||
|
headlineMisskey: "노트로 연결되는 네트워크"
|
||||||
introMisskey: "환영합니다! Misskey 는 오픈 소스 분산형 마이크로 블로그 서비스입니다.\n\"노트\" 를 작성해서, 지금 일어나고 있는 일을 공유하거나, 당신만의 이야기를 모두에게 발신하세요📡\n\"리액션\" 기능으로, 친구의 노트에 총알같이 반응을 추가할 수도 있습니다👍\n새로운 세계를 탐험해 보세요🚀"
|
introMisskey: "환영합니다! Misskey 는 오픈 소스 분산형 마이크로 블로그 서비스입니다.\n\"노트\" 를 작성해서, 지금 일어나고 있는 일을 공유하거나, 당신만의 이야기를 모두에게 발신하세요📡\n\"리액션\" 기능으로, 친구의 노트에 총알같이 반응을 추가할 수도 있습니다👍\n새로운 세계를 탐험해 보세요🚀"
|
||||||
monthAndDay: "{month}월 {day}일"
|
monthAndDay: "{month}월 {day}일"
|
||||||
search: "검색"
|
search: "검색"
|
||||||
@ -33,6 +34,9 @@ addUser: "유저 추가"
|
|||||||
favorite: "즐겨찾기"
|
favorite: "즐겨찾기"
|
||||||
favorites: "즐겨찾기"
|
favorites: "즐겨찾기"
|
||||||
unfavorite: "즐겨찾기에서 제거"
|
unfavorite: "즐겨찾기에서 제거"
|
||||||
|
favorited: "즐겨찾기에 등록했습니다"
|
||||||
|
alreadyFavorited: "이미 즐겨찾기에 등록되어 있습니다"
|
||||||
|
cantFavorite: "즐겨찾기에 등록하지 못했습니다"
|
||||||
pin: "프로필에 고정"
|
pin: "프로필에 고정"
|
||||||
unpin: "프로필에서 고정 해제"
|
unpin: "프로필에서 고정 해제"
|
||||||
copyContent: "내용 복사"
|
copyContent: "내용 복사"
|
||||||
@ -88,14 +92,19 @@ followRequestPending: "팔로우 허가 대기중"
|
|||||||
enterEmoji: "이모지 입력"
|
enterEmoji: "이모지 입력"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
unrenote: "Renote 취소"
|
unrenote: "Renote 취소"
|
||||||
|
renoted: "Renote 하였습니다"
|
||||||
|
cantRenote: "이 게시물은 Renote할 수 없습니다."
|
||||||
|
cantReRenote: "Renote를 Renote할 수 없습니다."
|
||||||
quote: "인용"
|
quote: "인용"
|
||||||
pinnedNote: "고정해놓은 노트"
|
pinnedNote: "고정해놓은 노트"
|
||||||
|
pinned: "프로필에 고정"
|
||||||
you: "당신"
|
you: "당신"
|
||||||
clickToShow: "클릭하여 보기"
|
clickToShow: "클릭하여 보기"
|
||||||
sensitive: "열람주의"
|
sensitive: "열람주의"
|
||||||
add: "추가"
|
add: "추가"
|
||||||
reaction: "리액션"
|
reaction: "리액션"
|
||||||
reactionSettingDescription: "리액션 선택 상자에 표시할 리액션을 설정합니다."
|
reactionSettingDescription: "리액션 선택 상자에 표시할 리액션을 설정합니다."
|
||||||
|
reactionSettingDescription2: "끌어서 순서 변경, 클릭해서 삭제, +를 눌러서 추가할 수 있습니다."
|
||||||
rememberNoteVisibility: "공개 범위를 기억하기"
|
rememberNoteVisibility: "공개 범위를 기억하기"
|
||||||
attachCancel: "첨부 취소"
|
attachCancel: "첨부 취소"
|
||||||
markAsSensitive: "열람주의로 설정"
|
markAsSensitive: "열람주의로 설정"
|
||||||
@ -320,6 +329,7 @@ pinnedUsers: "고정된 유저"
|
|||||||
pinnedUsersDescription: "\"발견하기\" 페이지 등에 고정하고 싶은 유저를 한 줄에 한 명씩 적습니다."
|
pinnedUsersDescription: "\"발견하기\" 페이지 등에 고정하고 싶은 유저를 한 줄에 한 명씩 적습니다."
|
||||||
pinnedPages: "고정한 페이지"
|
pinnedPages: "고정한 페이지"
|
||||||
pinnedPagesDescription: "인스턴스의 대문에 고정하고 싶은 페이지의 경로를 한 줄에 하나씩 적습니다."
|
pinnedPagesDescription: "인스턴스의 대문에 고정하고 싶은 페이지의 경로를 한 줄에 하나씩 적습니다."
|
||||||
|
pinnedClipId: "고정할 클립의 ID"
|
||||||
pinnedNotes: "고정해놓은 노트"
|
pinnedNotes: "고정해놓은 노트"
|
||||||
hcaptcha: "hCaptcha"
|
hcaptcha: "hCaptcha"
|
||||||
enableHcaptcha: "hCaptcha 활성화"
|
enableHcaptcha: "hCaptcha 활성화"
|
||||||
@ -428,6 +438,7 @@ signinWith: "{x}로 로그인"
|
|||||||
signinFailed: "로그인할 수 없습니다. 사용자명과 비밀번호를 확인하여 주십시오."
|
signinFailed: "로그인할 수 없습니다. 사용자명과 비밀번호를 확인하여 주십시오."
|
||||||
tapSecurityKey: "보안 키를 터치"
|
tapSecurityKey: "보안 키를 터치"
|
||||||
or: "혹은"
|
or: "혹은"
|
||||||
|
language: "언어"
|
||||||
uiLanguage: "UI 표시 언어"
|
uiLanguage: "UI 표시 언어"
|
||||||
groupInvited: "그룹에 초대되었습니다"
|
groupInvited: "그룹에 초대되었습니다"
|
||||||
aboutX: "{x}에 대하여"
|
aboutX: "{x}에 대하여"
|
||||||
@ -453,6 +464,7 @@ remote: "리모트"
|
|||||||
total: "합계"
|
total: "합계"
|
||||||
weekOverWeekChanges: "지난주보다"
|
weekOverWeekChanges: "지난주보다"
|
||||||
dayOverDayChanges: "어제보다"
|
dayOverDayChanges: "어제보다"
|
||||||
|
appearance: "모양"
|
||||||
clientSettings: "클라이언트 설정"
|
clientSettings: "클라이언트 설정"
|
||||||
accountSettings: "계정 설정"
|
accountSettings: "계정 설정"
|
||||||
promotion: "프로모션"
|
promotion: "프로모션"
|
||||||
@ -538,7 +550,6 @@ author: "작성자"
|
|||||||
leaveConfirm: "저장하지 않은 변경사항이 있습니다. 취소하시겠습니까?"
|
leaveConfirm: "저장하지 않은 변경사항이 있습니다. 취소하시겠습니까?"
|
||||||
manage: "관리"
|
manage: "관리"
|
||||||
plugins: "플러그인"
|
plugins: "플러그인"
|
||||||
pluginInstallWarn: "신뢰할 수 없는 플러그인은 설치하지 마십시오."
|
|
||||||
deck: "덱"
|
deck: "덱"
|
||||||
undeck: "덱 해제"
|
undeck: "덱 해제"
|
||||||
width: "폭"
|
width: "폭"
|
||||||
@ -556,7 +567,10 @@ notificationType: "알림 유형"
|
|||||||
edit: "편집"
|
edit: "편집"
|
||||||
useStarForReactionFallback: "알 수 없는 리액션 이모지 대신 ★ 사용"
|
useStarForReactionFallback: "알 수 없는 리액션 이모지 대신 ★ 사용"
|
||||||
emailConfig: "메일 서버 설정"
|
emailConfig: "메일 서버 설정"
|
||||||
|
enableEmail: "이메일 송신 기능 활성화"
|
||||||
emailConfigInfo: "가입 시 메일 주소 확인이나 비밀번호 초기화 시에 사용합니다."
|
emailConfigInfo: "가입 시 메일 주소 확인이나 비밀번호 초기화 시에 사용합니다."
|
||||||
|
email: "이메일"
|
||||||
|
emailAddress: "메일 주소"
|
||||||
smtpConfig: "SMTP 서버 설정"
|
smtpConfig: "SMTP 서버 설정"
|
||||||
smtpHost: "호스트"
|
smtpHost: "호스트"
|
||||||
smtpPort: "포트"
|
smtpPort: "포트"
|
||||||
@ -567,9 +581,11 @@ smtpSecure: "SMTP 연결에 Implicit SSL/TTS 사용"
|
|||||||
smtpSecureInfo: "STARTTLS 사용 시에는 해제합니다."
|
smtpSecureInfo: "STARTTLS 사용 시에는 해제합니다."
|
||||||
testEmail: "이메일 전송 테스트"
|
testEmail: "이메일 전송 테스트"
|
||||||
wordMute: "단어 뮤트"
|
wordMute: "단어 뮤트"
|
||||||
|
userSaysSomething: "{name}님이 무언가를 말했습니다"
|
||||||
makeActive: "활성화"
|
makeActive: "활성화"
|
||||||
display: "표시"
|
display: "표시"
|
||||||
copy: "복사"
|
copy: "복사"
|
||||||
|
metrics: "통계"
|
||||||
overview: "요약"
|
overview: "요약"
|
||||||
logs: "로그"
|
logs: "로그"
|
||||||
delayed: "지연"
|
delayed: "지연"
|
||||||
@ -578,6 +594,7 @@ channel: "채널"
|
|||||||
create: "생성"
|
create: "생성"
|
||||||
notificationSetting: "알림 설정"
|
notificationSetting: "알림 설정"
|
||||||
notificationSettingDesc: "표시할 알림의 종류를 선택해 주세요."
|
notificationSettingDesc: "표시할 알림의 종류를 선택해 주세요."
|
||||||
|
useGlobalSetting: "글로벌 설정을 사용하기"
|
||||||
useGlobalSettingDesc: "활성화하면 계정의 알림 설정이 적용되니다. 비활성화하면 개별적으로 설정할 수 있게 됩니다."
|
useGlobalSettingDesc: "활성화하면 계정의 알림 설정이 적용되니다. 비활성화하면 개별적으로 설정할 수 있게 됩니다."
|
||||||
other: "기타"
|
other: "기타"
|
||||||
regenerateLoginToken: "로그인 토큰을 재생성"
|
regenerateLoginToken: "로그인 토큰을 재생성"
|
||||||
@ -593,7 +610,12 @@ reportAbuseOf: "{name}을 신고하기"
|
|||||||
fillAbuseReportDescription: "신고하려는 이유를 자세히 알려주세요. 특정 게시물을 신고할 때에는 게시물의 URL도 포함해 주세요."
|
fillAbuseReportDescription: "신고하려는 이유를 자세히 알려주세요. 특정 게시물을 신고할 때에는 게시물의 URL도 포함해 주세요."
|
||||||
abuseReported: "신고를 보냈습니다. 신고해 주셔서 감사합니다."
|
abuseReported: "신고를 보냈습니다. 신고해 주셔서 감사합니다."
|
||||||
send: "전송"
|
send: "전송"
|
||||||
|
abuseMarkAsResolved: "해결됨으로 표시"
|
||||||
openInNewTab: "새 탭에서 열기"
|
openInNewTab: "새 탭에서 열기"
|
||||||
|
openInSideView: "사이드뷰로 열기"
|
||||||
|
editTheseSettingsMayBreakAccount: "이 설정을 변경하면 계정이 손상될 수 있습니다."
|
||||||
|
instanceTicker: "노트의 인스턴스 정보"
|
||||||
|
waitingFor: "{x}을(를) 기다리고 있습니다"
|
||||||
random: "랜덤"
|
random: "랜덤"
|
||||||
system: "시스템"
|
system: "시스템"
|
||||||
switchUi: "UI 전환"
|
switchUi: "UI 전환"
|
||||||
@ -603,22 +625,102 @@ createNew: "새로 만들기"
|
|||||||
optional: "옵션"
|
optional: "옵션"
|
||||||
createNewClip: "새 클립 만들기"
|
createNewClip: "새 클립 만들기"
|
||||||
public: "공개"
|
public: "공개"
|
||||||
|
i18nInfo: "Misskey는 자원봉사자들에 의해 다양한 언어로 번역되고 있습니다. {link}에서 번역에 참가할 수 있습니다."
|
||||||
manageAccessTokens: "액세스 토큰 관리"
|
manageAccessTokens: "액세스 토큰 관리"
|
||||||
|
accountInfo: "계정 정보"
|
||||||
|
notesCount: "노트 수"
|
||||||
|
repliesCount: "답글 수"
|
||||||
|
renotesCount: "Renote 수"
|
||||||
|
repliedCount: "받은 답글 수"
|
||||||
|
renotedCount: "받은 Renote 수"
|
||||||
|
followingCount: "팔로우 수"
|
||||||
|
followersCount: "팔로워 수"
|
||||||
|
sentReactionsCount: "보낸 리액션 수"
|
||||||
|
receivedReactionsCount: "받은 리액션 수"
|
||||||
|
pollVotesCount: "투표한 횟수"
|
||||||
|
pollVotedCount: "투표받은 횟수"
|
||||||
yes: "예"
|
yes: "예"
|
||||||
no: "아니오"
|
no: "아니오"
|
||||||
|
driveFilesCount: "드라이브 파일 개수"
|
||||||
driveUsage: "드라이브 사용량"
|
driveUsage: "드라이브 사용량"
|
||||||
noCrawle: "검색엔진의 인덱싱 거부"
|
noCrawle: "검색엔진의 인덱싱 거부"
|
||||||
noCrawleDescription: "검색엔진에 사용자 페이지, 노트, 페이지 등의 콘텐츠를 인덱싱되지 않게 합니다."
|
noCrawleDescription: "검색엔진에 사용자 페이지, 노트, 페이지 등의 콘텐츠를 인덱싱되지 않게 합니다."
|
||||||
lockedAccountInfo: "팔로우를 승인으로 승인받더라도 노트의 공개 범위를 '팔로워'로 하지 않는 한 누구나 당신의 노트를 볼 수 있습니다."
|
lockedAccountInfo: "팔로우를 승인으로 승인받더라도 노트의 공개 범위를 '팔로워'로 하지 않는 한 누구나 당신의 노트를 볼 수 있습니다."
|
||||||
alwaysMarkSensitive: "미디어를 항상 열람 주의로 설정"
|
alwaysMarkSensitive: "미디어를 항상 열람 주의로 설정"
|
||||||
|
loadRawImages: "첨부한 이미지의 썸네일을 원본화질로 표시"
|
||||||
|
disableShowingAnimatedImages: "움직이는 이미지를 자동으로 재생하지 않음"
|
||||||
|
verificationEmailSent: "확인 메일을 발송하였습니다. 설정을 완료하려면 메일에 첨부된 링크를 확인해 주세요."
|
||||||
|
notSet: "설정되지 않음"
|
||||||
emailVerified: "메일 주소가 확인되었습니다."
|
emailVerified: "메일 주소가 확인되었습니다."
|
||||||
|
noteFavoritesCount: "즐겨찾기한 노트 수"
|
||||||
|
pageLikesCount: "좋아요 한 Page 수"
|
||||||
|
pageLikedCount: "Page에 받은 좋아요 수"
|
||||||
|
reversiCount: "리버시 대국 횟수"
|
||||||
|
contact: "연락처"
|
||||||
|
useSystemFont: "시스템 기본 글꼴을 사용"
|
||||||
clips: "클립"
|
clips: "클립"
|
||||||
|
experimentalFeatures: "실험실"
|
||||||
|
developer: "개발자"
|
||||||
|
makeExplorable: "\"발견하기\"에 내 계정 보이기"
|
||||||
|
makeExplorableDescription: "비활성화하면 \"발견하기\"에 나의 계정을 표시하지 않습니다."
|
||||||
|
showGapBetweenNotesInTimeline: "타임라인의 노트 사이를 띄워서 표시"
|
||||||
|
duplicate: "복제"
|
||||||
|
left: "왼쪽"
|
||||||
|
center: "가운데"
|
||||||
|
wide: "넓게"
|
||||||
|
narrow: "좁게"
|
||||||
|
reloadToApplySetting: "이 설정을 적용하려면 페이지를 새로고침해야 합니다. 바로 새로고침하시겠습니까?"
|
||||||
|
showTitlebar: "타이틀 바를 표시하기"
|
||||||
clearCache: "캐시 비우기"
|
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:
|
_nsfw:
|
||||||
|
respect: "열람주의로 설정된 미디어 숨기기"
|
||||||
ignore: "열람 주의 미디어 항상 표시"
|
ignore: "열람 주의 미디어 항상 표시"
|
||||||
|
force: "미디어 항상 숨기기"
|
||||||
_mfm:
|
_mfm:
|
||||||
cheatSheet: "MFM 도움말"
|
cheatSheet: "MFM 도움말"
|
||||||
intro: "MFM는 Misskey의 다양한 곳에서 사용할 수 있는 전용 마크업 언어입니다. 여기에서는 MFM에서 사용할 수 있는 구문을 확인할 수 있습니다."
|
intro: "MFM는 Misskey의 다양한 곳에서 사용할 수 있는 전용 마크업 언어입니다. 여기에서는 MFM에서 사용할 수 있는 구문을 확인할 수 있습니다."
|
||||||
|
dummy: "Misskey로 연합우주의 세계가 펼쳐집니다"
|
||||||
mention: "멘션"
|
mention: "멘션"
|
||||||
mentionDescription: "골뱅이표(@) 뒤에 사용자명을 넣어 특정 유저를 나타낼 수 있습니다."
|
mentionDescription: "골뱅이표(@) 뒤에 사용자명을 넣어 특정 유저를 나타낼 수 있습니다."
|
||||||
hashtag: "해시태그"
|
hashtag: "해시태그"
|
||||||
@ -626,12 +728,16 @@ _mfm:
|
|||||||
url: "URL"
|
url: "URL"
|
||||||
urlDescription: "URL을 나타낼 수 있습니다."
|
urlDescription: "URL을 나타낼 수 있습니다."
|
||||||
link: "링크"
|
link: "링크"
|
||||||
|
linkDescription: "문장의 특정 범위를 URL로 표시합니다."
|
||||||
|
bold: "굵음/볼드체"
|
||||||
boldDescription: "문자를 굵게 강조합니다."
|
boldDescription: "문자를 굵게 강조합니다."
|
||||||
smallDescription: "내용을 작고 연하게 보이게 합니다."
|
smallDescription: "내용을 작고 연하게 보이게 합니다."
|
||||||
center: "가운데 정렬"
|
center: "가운데 정렬"
|
||||||
centerDescription: "내용을 가운데 정렬로 보이게 합니다."
|
centerDescription: "내용을 가운데 정렬로 보이게 합니다."
|
||||||
inlineCode: "코드(인라인)"
|
inlineCode: "코드(인라인)"
|
||||||
|
inlineCodeDescription: "여러 행의 코드를 문법 강조를 적용하여 인라인으로 표시합니다."
|
||||||
blockCode: "코드(블록)"
|
blockCode: "코드(블록)"
|
||||||
|
blockCodeDescription: "여러 행의 코드를 문법 강조를 적용하여 블록으로 표시합니다."
|
||||||
inlineMath: "수식(인라인)"
|
inlineMath: "수식(인라인)"
|
||||||
inlineMathDescription: "수식(KaTeX)를 인라인으로 보이게 합니다."
|
inlineMathDescription: "수식(KaTeX)를 인라인으로 보이게 합니다."
|
||||||
blockMath: "수식(블록)"
|
blockMath: "수식(블록)"
|
||||||
@ -644,7 +750,14 @@ _mfm:
|
|||||||
flip: "플립"
|
flip: "플립"
|
||||||
flipDescription: "내용을 상하 또는 좌우로 반전시킵니다."
|
flipDescription: "내용을 상하 또는 좌우로 반전시킵니다."
|
||||||
jump: "애니메이션(점프)"
|
jump: "애니메이션(점프)"
|
||||||
|
x2: "크게"
|
||||||
|
x2Description: "내용을 크게 표시합니다."
|
||||||
|
x3: "더 크게"
|
||||||
|
x3Description: "내용을 더 크게 표시합니다."
|
||||||
|
x4: "매우 크게"
|
||||||
|
x4Description: "내용을 매우 크게 표시합니다."
|
||||||
font: "폰트"
|
font: "폰트"
|
||||||
|
fontDescription: "내용의 글꼴을 지정할 수 있습니다."
|
||||||
_reversi:
|
_reversi:
|
||||||
reversi: "리버시"
|
reversi: "리버시"
|
||||||
gameSettings: "대국 설정"
|
gameSettings: "대국 설정"
|
||||||
@ -657,6 +770,8 @@ _reversi:
|
|||||||
waitingForOther: "상대의 준비가 완료될 때까지 기다리고 있습니다"
|
waitingForOther: "상대의 준비가 완료될 때까지 기다리고 있습니다"
|
||||||
waitingForMe: "당신의 준비 완료를 기다리고 있습니다"
|
waitingForMe: "당신의 준비 완료를 기다리고 있습니다"
|
||||||
ready: "준비 완료"
|
ready: "준비 완료"
|
||||||
|
cancelReady: "준비 취소"
|
||||||
|
opponentTurn: "상대의 차례입니다"
|
||||||
myTurn: "당신의 차례입니다"
|
myTurn: "당신의 차례입니다"
|
||||||
turnOf: "{name}님의 차례입니다"
|
turnOf: "{name}님의 차례입니다"
|
||||||
pastTurnOf: "{name}님의 차례"
|
pastTurnOf: "{name}님의 차례"
|
||||||
@ -679,11 +794,17 @@ _instanceTicker:
|
|||||||
none: "보이지 않음"
|
none: "보이지 않음"
|
||||||
remote: "리모트 유저에게만 보이기"
|
remote: "리모트 유저에게만 보이기"
|
||||||
always: "항상 보이기"
|
always: "항상 보이기"
|
||||||
|
_serverDisconnectedBehavior:
|
||||||
|
reload: "자동으로 새로고침"
|
||||||
|
dialog: "경고창 표시"
|
||||||
|
quiet: "조용히 경고"
|
||||||
_channel:
|
_channel:
|
||||||
create: "채널 생성"
|
create: "채널 생성"
|
||||||
|
edit: "채널 편집"
|
||||||
setBanner: "배너 설정"
|
setBanner: "배너 설정"
|
||||||
removeBanner: "배너 삭제"
|
removeBanner: "배너 삭제"
|
||||||
featured: "트렌드"
|
featured: "트렌드"
|
||||||
|
owned: "관리중"
|
||||||
following: "팔로잉"
|
following: "팔로잉"
|
||||||
usersCount: "{n}명 참여 중"
|
usersCount: "{n}명 참여 중"
|
||||||
notesCount: "{n}노트"
|
notesCount: "{n}노트"
|
||||||
@ -693,6 +814,9 @@ _sidebar:
|
|||||||
_wordMute:
|
_wordMute:
|
||||||
muteWords: "뮤트할 단어"
|
muteWords: "뮤트할 단어"
|
||||||
muteWordsDescription: "공백으로 구분하는 경우 AND, 줄바꿈으로 구분하는 경우 OR로 지정됩니다。"
|
muteWordsDescription: "공백으로 구분하는 경우 AND, 줄바꿈으로 구분하는 경우 OR로 지정됩니다。"
|
||||||
|
muteWordsDescription2: "정규 표현식을 사용하려면 키워드를 빗금표(/)로 감싸 주세요."
|
||||||
|
softDescription: "지정한 조건의 노트를 타임라인에서 숨깁니다."
|
||||||
|
hardDescription: "지정한 조건의 노트를 타임라인에 추가하지 않습니다. 타임라인에 추가되지 않은 노트는 조건을 변경해도 표시되지 않습니다."
|
||||||
mutedNotes: "뮤트된 노트"
|
mutedNotes: "뮤트된 노트"
|
||||||
_theme:
|
_theme:
|
||||||
explore: "테마 찾아보기"
|
explore: "테마 찾아보기"
|
||||||
@ -700,6 +824,8 @@ _theme:
|
|||||||
manage: "테마 관리"
|
manage: "테마 관리"
|
||||||
code: "테마 코드"
|
code: "테마 코드"
|
||||||
installed: "{name} 테마가 설치되었습니다"
|
installed: "{name} 테마가 설치되었습니다"
|
||||||
|
installedThemes: "설치된 테마"
|
||||||
|
builtinThemes: "표준 테마"
|
||||||
alreadyInstalled: "이미 설치된 테마입니다"
|
alreadyInstalled: "이미 설치된 테마입니다"
|
||||||
invalid: "테마 형식이 올바르지 않습니다"
|
invalid: "테마 형식이 올바르지 않습니다"
|
||||||
make: "테마 만들기"
|
make: "테마 만들기"
|
||||||
@ -714,8 +840,12 @@ _theme:
|
|||||||
func: "함수"
|
func: "함수"
|
||||||
funcKind: "함수 종류"
|
funcKind: "함수 종류"
|
||||||
argument: "매개변수"
|
argument: "매개변수"
|
||||||
|
inputConstantName: "상수 이름을 입력하세요"
|
||||||
importInfo: "여기에 테마 코드를 붙여 넣어 에디터로 불러올 수 있습니다."
|
importInfo: "여기에 테마 코드를 붙여 넣어 에디터로 불러올 수 있습니다."
|
||||||
|
deleteConstantConfirm: "상수 {const}를 삭제하시겠습니까?"
|
||||||
keys:
|
keys:
|
||||||
|
accent: "강조 색상"
|
||||||
|
panel: "패널"
|
||||||
link: "링크"
|
link: "링크"
|
||||||
hashtag: "해시태그"
|
hashtag: "해시태그"
|
||||||
mention: "멘션"
|
mention: "멘션"
|
||||||
@ -728,6 +858,9 @@ _sfx:
|
|||||||
chat: "대화"
|
chat: "대화"
|
||||||
chatBg: "대화 (백그라운드)"
|
chatBg: "대화 (백그라운드)"
|
||||||
antenna: "안테나 수신"
|
antenna: "안테나 수신"
|
||||||
|
channel: "채널 알림"
|
||||||
|
reversiPutBlack: "리버시: 흑돌을 두었을 때"
|
||||||
|
reversiPutWhite: "리버시: 백돌을 두었을 때"
|
||||||
_ago:
|
_ago:
|
||||||
unknown: "알 수 없음"
|
unknown: "알 수 없음"
|
||||||
future: "미래"
|
future: "미래"
|
||||||
@ -803,6 +936,8 @@ _permissions:
|
|||||||
"write:page-likes": "페이지의 좋아요를 추가하거나 삭제합니다"
|
"write:page-likes": "페이지의 좋아요를 추가하거나 삭제합니다"
|
||||||
"read:user-groups": "유저 그룹을 조회합니다"
|
"read:user-groups": "유저 그룹을 조회합니다"
|
||||||
"write:user-groups": "유저 그룹을 만들거나, 초대하거나, 이름을 변경하거나, 양도하거나, 삭제합니다"
|
"write:user-groups": "유저 그룹을 만들거나, 초대하거나, 이름을 변경하거나, 양도하거나, 삭제합니다"
|
||||||
|
"read:channels": "채널을 보기"
|
||||||
|
"write:channels": "채널을 변경하기"
|
||||||
_auth:
|
_auth:
|
||||||
shareAccess: "\"{name}\" 이 계정에 접근하는 것을 허용하시겠습니까?"
|
shareAccess: "\"{name}\" 이 계정에 접근하는 것을 허용하시겠습니까?"
|
||||||
shareAccessAsk: "이 애플리케이션이 계정에 접근하는 것을 허용하시겠습니까?"
|
shareAccessAsk: "이 애플리케이션이 계정에 접근하는 것을 허용하시겠습니까?"
|
||||||
@ -837,7 +972,10 @@ _widgets:
|
|||||||
digitalClock: "디지털 시계"
|
digitalClock: "디지털 시계"
|
||||||
federation: "연합"
|
federation: "연합"
|
||||||
postForm: "글 입력란"
|
postForm: "글 입력란"
|
||||||
|
slideshow: "슬라이드 쇼"
|
||||||
button: "버튼"
|
button: "버튼"
|
||||||
|
jobQueue: "작업 대기열"
|
||||||
|
serverMetric: "서버 통계"
|
||||||
_cw:
|
_cw:
|
||||||
hide: "숨기기"
|
hide: "숨기기"
|
||||||
show: "더 보기"
|
show: "더 보기"
|
||||||
@ -879,6 +1017,7 @@ _visibility:
|
|||||||
_postForm:
|
_postForm:
|
||||||
replyPlaceholder: "이 노트에 답글..."
|
replyPlaceholder: "이 노트에 답글..."
|
||||||
quotePlaceholder: "이 노트를 인용..."
|
quotePlaceholder: "이 노트를 인용..."
|
||||||
|
channelPlaceholder: "채널에 게시하기..."
|
||||||
_placeholders:
|
_placeholders:
|
||||||
a: "지금 무엇을 하고 있나요?"
|
a: "지금 무엇을 하고 있나요?"
|
||||||
b: "무슨 일이 일어나고 있나요?"
|
b: "무슨 일이 일어나고 있나요?"
|
||||||
@ -999,6 +1138,7 @@ _pages:
|
|||||||
created: "페이지를 만들었습니다"
|
created: "페이지를 만들었습니다"
|
||||||
updated: "페이지를 수정했습니다"
|
updated: "페이지를 수정했습니다"
|
||||||
deleted: "페이지가 삭제되었습니다"
|
deleted: "페이지가 삭제되었습니다"
|
||||||
|
pageSetting: "페이지 설정"
|
||||||
nameAlreadyExists: "지정한 페이지 URL이 이미 존재합니다"
|
nameAlreadyExists: "지정한 페이지 URL이 이미 존재합니다"
|
||||||
invalidNameTitle: "유효하지 않은 페이지 URL입니다"
|
invalidNameTitle: "유효하지 않은 페이지 URL입니다"
|
||||||
invalidNameText: "비어있지 않은지 확인해주세요"
|
invalidNameText: "비어있지 않은지 확인해주세요"
|
||||||
@ -1009,6 +1149,7 @@ _pages:
|
|||||||
unlike: "좋아요 해제"
|
unlike: "좋아요 해제"
|
||||||
my: "내 페이지"
|
my: "내 페이지"
|
||||||
liked: "좋아요한 페이지"
|
liked: "좋아요한 페이지"
|
||||||
|
featured: "인기"
|
||||||
inspector: "인스펙터"
|
inspector: "인스펙터"
|
||||||
contents: "콘텐츠"
|
contents: "콘텐츠"
|
||||||
content: "페이지 블록"
|
content: "페이지 블록"
|
||||||
@ -1064,7 +1205,10 @@ _pages:
|
|||||||
id: "캔버스 ID"
|
id: "캔버스 ID"
|
||||||
width: "폭"
|
width: "폭"
|
||||||
height: "높이"
|
height: "높이"
|
||||||
|
note: "노트필기"
|
||||||
_note:
|
_note:
|
||||||
|
id: "노트 ID"
|
||||||
|
idDescription: "노트 URL을 붙여넣어 설정할 수도 있습니다."
|
||||||
detailed: "세부 정보 보기"
|
detailed: "세부 정보 보기"
|
||||||
switch: "스위치"
|
switch: "스위치"
|
||||||
_switch:
|
_switch:
|
||||||
@ -1307,7 +1451,9 @@ _deck:
|
|||||||
swapDown: "아래로 이동"
|
swapDown: "아래로 이동"
|
||||||
stackLeft: "왼쪽에 쌓기"
|
stackLeft: "왼쪽에 쌓기"
|
||||||
popRight: "오른쪽으로 빼기"
|
popRight: "오른쪽으로 빼기"
|
||||||
|
profile: "프로파일"
|
||||||
_columns:
|
_columns:
|
||||||
|
main: "메인"
|
||||||
widgets: "위젯"
|
widgets: "위젯"
|
||||||
notifications: "알림"
|
notifications: "알림"
|
||||||
tl: "타임라인"
|
tl: "타임라인"
|
||||||
|
@ -1,2 +1,31 @@
|
|||||||
---
|
---
|
||||||
_lang_: "Português"
|
_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_: "Русский"
|
_lang_: "Русский"
|
||||||
|
headlineMisskey: "Сеть, сплетённая из заметок"
|
||||||
introMisskey: "Добро пожаловать! Misskey — это децентрализованный сервис микроблогов с открытым исходным кодом.\nПишите «заметки» — делитесь со всеми происходящим вокруг или рассказывайте о себе 📡\nСтавьте «реакции» — выражайте свои чувства и эмоции от заметок других 👍\nОткройте для себя новый мир 🚀"
|
introMisskey: "Добро пожаловать! Misskey — это децентрализованный сервис микроблогов с открытым исходным кодом.\nПишите «заметки» — делитесь со всеми происходящим вокруг или рассказывайте о себе 📡\nСтавьте «реакции» — выражайте свои чувства и эмоции от заметок других 👍\nОткройте для себя новый мир 🚀"
|
||||||
monthAndDay: "{day}.{month}"
|
monthAndDay: "{day}.{month}"
|
||||||
search: "Поиск"
|
search: "Поиск"
|
||||||
@ -96,6 +97,7 @@ cantRenote: "Это нельзя репостить."
|
|||||||
cantReRenote: "Невозможно репостить репост."
|
cantReRenote: "Невозможно репостить репост."
|
||||||
quote: "Цитата"
|
quote: "Цитата"
|
||||||
pinnedNote: "Закреплённая заметка"
|
pinnedNote: "Закреплённая заметка"
|
||||||
|
pinned: "Закрепить в профиле"
|
||||||
you: "Вы"
|
you: "Вы"
|
||||||
clickToShow: "Нажмите для просмотра"
|
clickToShow: "Нажмите для просмотра"
|
||||||
sensitive: "Содержимое не для всех"
|
sensitive: "Содержимое не для всех"
|
||||||
@ -436,6 +438,7 @@ signinWith: "Использовать {x} для входа"
|
|||||||
signinFailed: "Невозможно войти в систему. Введенное вами имя пользователя или пароль неверны."
|
signinFailed: "Невозможно войти в систему. Введенное вами имя пользователя или пароль неверны."
|
||||||
tapSecurityKey: "Нажмите на свой электронный ключ"
|
tapSecurityKey: "Нажмите на свой электронный ключ"
|
||||||
or: "или"
|
or: "или"
|
||||||
|
language: "Язык"
|
||||||
uiLanguage: "Язык интерфейса"
|
uiLanguage: "Язык интерфейса"
|
||||||
groupInvited: "Приглашение в группу"
|
groupInvited: "Приглашение в группу"
|
||||||
aboutX: "Описание {x}"
|
aboutX: "Описание {x}"
|
||||||
@ -449,7 +452,7 @@ doing: "В процессе"
|
|||||||
category: "Категория"
|
category: "Категория"
|
||||||
tags: "Метки"
|
tags: "Метки"
|
||||||
docSource: "Источник документа"
|
docSource: "Источник документа"
|
||||||
createAccount: "Новый аккаунт"
|
createAccount: "Новая учётная запись"
|
||||||
existingAcount: "Уже существующий"
|
existingAcount: "Уже существующий"
|
||||||
regenerate: "Создать повторно"
|
regenerate: "Создать повторно"
|
||||||
fontSize: "Размер шрифта"
|
fontSize: "Размер шрифта"
|
||||||
@ -547,7 +550,6 @@ author: "Автор"
|
|||||||
leaveConfirm: "Вы не сохранили изменения. Хотите выйти и потерять их?"
|
leaveConfirm: "Вы не сохранили изменения. Хотите выйти и потерять их?"
|
||||||
manage: "Управление"
|
manage: "Управление"
|
||||||
plugins: "Расширения"
|
plugins: "Расширения"
|
||||||
pluginInstallWarn: "Пожалуста, не устанавливайте расширения, которым не доверяете"
|
|
||||||
deck: "Пульт"
|
deck: "Пульт"
|
||||||
undeck: "Покинуть пульт"
|
undeck: "Покинуть пульт"
|
||||||
useBlurEffectForModal: "Размывка под формой поверх всего"
|
useBlurEffectForModal: "Размывка под формой поверх всего"
|
||||||
@ -562,7 +564,7 @@ permission: "Разрешения"
|
|||||||
enableAll: "Включить все"
|
enableAll: "Включить все"
|
||||||
disableAll: "Выключить всё"
|
disableAll: "Выключить всё"
|
||||||
tokenRequested: "Открыть доступ к учётной записи"
|
tokenRequested: "Открыть доступ к учётной записи"
|
||||||
pluginTokenRequestedDescription: "Этот плагин сможет пользоваться разрешениями, установленными здесь."
|
pluginTokenRequestedDescription: "Это расширение сможет пользоваться разрешениями, установленными здесь."
|
||||||
notificationType: "Тип уведомления"
|
notificationType: "Тип уведомления"
|
||||||
edit: "Изменить"
|
edit: "Изменить"
|
||||||
useStarForReactionFallback: "Ставить ★ в качестве реакции вместо неизвестного эмодзи"
|
useStarForReactionFallback: "Ставить ★ в качестве реакции вместо неизвестного эмодзи"
|
||||||
@ -668,12 +670,56 @@ showGapBetweenNotesInTimeline: "Показывать разделитель ме
|
|||||||
duplicate: "Дубликат"
|
duplicate: "Дубликат"
|
||||||
left: "Влево"
|
left: "Влево"
|
||||||
center: "По центру"
|
center: "По центру"
|
||||||
|
wide: "Толстый"
|
||||||
|
narrow: "Тонкий"
|
||||||
reloadToApplySetting: "Это настройка вступает в силу при загрузке страницы. Перезагрузить сейчас?"
|
reloadToApplySetting: "Это настройка вступает в силу при загрузке страницы. Перезагрузить сейчас?"
|
||||||
showTitlebar: "Показать заголовок"
|
showTitlebar: "Показать заголовок"
|
||||||
clearCache: "Очистить кэш"
|
clearCache: "Очистить кэш"
|
||||||
onlineUsersCount: "Пользователей сейчас в сети: {n}"
|
onlineUsersCount: "Пользователей сейчас в сети: {n}"
|
||||||
nUsers: "Пользователей: {n}"
|
nUsers: "Пользователей: {n}"
|
||||||
nNotes: "Заметок: {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: "Поиск по каналу"
|
||||||
|
_email:
|
||||||
|
_follow:
|
||||||
|
title: "Новый подписчик"
|
||||||
|
_receiveFollowRequest:
|
||||||
|
title: "Новый запрос на подписку."
|
||||||
|
_plugin:
|
||||||
|
install: "Установка расширений"
|
||||||
|
installWarn: "Пожалуйста, не устанавливайте расширения, которым не доверяете."
|
||||||
|
manage: "Управление расширениями"
|
||||||
|
_registry:
|
||||||
|
scope: "Область"
|
||||||
|
key: "Ключ"
|
||||||
|
keys: "Ключ"
|
||||||
|
domain: "Домен"
|
||||||
|
createKey: "Новый ключ"
|
||||||
_aboutMisskey:
|
_aboutMisskey:
|
||||||
about: "Misskey — программа с открытым исходным кодом, которую разрабатывает syuilo с 2014 года."
|
about: "Misskey — программа с открытым исходным кодом, которую разрабатывает syuilo с 2014 года."
|
||||||
contributors: "Основные соавторы"
|
contributors: "Основные соавторы"
|
||||||
@ -689,7 +735,7 @@ _nsfw:
|
|||||||
force: "Скрывать вообще все файлы"
|
force: "Скрывать вообще все файлы"
|
||||||
_mfm:
|
_mfm:
|
||||||
cheatSheet: "Подсказка по разметке MFM"
|
cheatSheet: "Подсказка по разметке MFM"
|
||||||
intro: "MFM — язык оформления текста, придуманный специально для Misskey, который здесь можно много где использовать. На этой странице собраны и кратко изложены способы его применения."
|
intro: "MFM — язык оформления текста, который придуман специально для Misskey и готов для применения во многих местах. На этой странице собраны и кратко изложены способы его использовать."
|
||||||
dummy: "Misskey расширяет границы Федиверса."
|
dummy: "Misskey расширяет границы Федиверса."
|
||||||
mention: "Упоминание"
|
mention: "Упоминание"
|
||||||
mentionDescription: "При помощи знака «собака» перед именем можно упомянуть какого-нибудь пользователя."
|
mentionDescription: "При помощи знака «собака» перед именем можно упомянуть какого-нибудь пользователя."
|
||||||
@ -735,7 +781,16 @@ _mfm:
|
|||||||
twitchDescription: "Заставляет трястись как одержимого"
|
twitchDescription: "Заставляет трястись как одержимого"
|
||||||
spin: "Вращение"
|
spin: "Вращение"
|
||||||
spinDescription: "Так можно крутить содержимое в разных направлениях."
|
spinDescription: "Так можно крутить содержимое в разных направлениях."
|
||||||
|
x2: "Крупный шрифт"
|
||||||
|
x2Description: "Увеличивает содержимое."
|
||||||
|
x3: "Ещё крупнее"
|
||||||
|
x3Description: "Сильнее увеличивает содержимое."
|
||||||
|
x4: "Совсем крупно"
|
||||||
|
x4Description: "Увеличивает содержимое совсем сильно."
|
||||||
|
blur: "Размытие"
|
||||||
|
blurDescription: "Размывает текст до нечитаемости, будто его поместили за матовое стекло. Наведение указателя мыши на размытый текст возвращает чёткость."
|
||||||
font: "Шрифт"
|
font: "Шрифт"
|
||||||
|
fontDescription: "Так можно писать произвольным шрифтом."
|
||||||
_reversi:
|
_reversi:
|
||||||
reversi: "Реверси"
|
reversi: "Реверси"
|
||||||
gameSettings: "Настройки игры"
|
gameSettings: "Настройки игры"
|
||||||
@ -997,6 +1052,9 @@ _widgets:
|
|||||||
slideshow: "Показ слайдов"
|
slideshow: "Показ слайдов"
|
||||||
button: "Кнопка"
|
button: "Кнопка"
|
||||||
onlineUsers: "Пользователи сейчас с сети"
|
onlineUsers: "Пользователи сейчас с сети"
|
||||||
|
jobQueue: "Очередь заданий"
|
||||||
|
serverMetric: "Показатели сервера"
|
||||||
|
aiscript: "Консоль AiScript"
|
||||||
_cw:
|
_cw:
|
||||||
hide: "Спрятать"
|
hide: "Спрятать"
|
||||||
show: "Показать еще"
|
show: "Показать еще"
|
||||||
@ -1488,6 +1546,7 @@ _deck:
|
|||||||
swapDown: "Переставить ниже"
|
swapDown: "Переставить ниже"
|
||||||
stackLeft: "В столбик влево"
|
stackLeft: "В столбик влево"
|
||||||
popRight: "Из столбика вправо"
|
popRight: "Из столбика вправо"
|
||||||
|
profile: "Профиль"
|
||||||
_columns:
|
_columns:
|
||||||
main: "Основная"
|
main: "Основная"
|
||||||
widgets: "Виджеты"
|
widgets: "Виджеты"
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
---
|
---
|
||||||
_lang_: "Українська"
|
_lang_: "Українська"
|
||||||
introMisskey: "Ласкаво просимо! Misskey - децентралізована служба мікроблогів з відкритим кодом.\nСтворюйте \"нотатки\", щоб поділитися тим, що відбувається, і розповісти всім про себе 📡\nЗа допомогою \"реакцій\" ви також можете швидко висловити свої почуття щодо нотаток інших 👍\nДавайте досліджувати новий світ 🚀"
|
headlineMisskey: "Мережа об'єднана записами"
|
||||||
|
introMisskey: "Ласкаво просимо! Misskey - децентралізована служба мікроблогів з відкритим кодом.\nСтворюйте \"нотатки\", щоб поділитися тим, що відбувається, і розповісти всім про себе 📡\nЗа допомогою \"реакцій\" ви також можете швидко висловити свої почуття щодо нотаток інших 👍\nДосліджуймо новий світ! 🚀"
|
||||||
monthAndDay: "{month}/{day}"
|
monthAndDay: "{month}/{day}"
|
||||||
search: "Пошук"
|
search: "Пошук"
|
||||||
notifications: "Сповіщення"
|
notifications: "Сповіщення"
|
||||||
@ -33,6 +34,9 @@ addUser: "Додати користувача"
|
|||||||
favorite: "Обране"
|
favorite: "Обране"
|
||||||
favorites: "Обране"
|
favorites: "Обране"
|
||||||
unfavorite: "Видалити з обраного"
|
unfavorite: "Видалити з обраного"
|
||||||
|
favorited: "Додано до вподобаних."
|
||||||
|
alreadyFavorited: "Вже додано до вподобаних."
|
||||||
|
cantFavorite: "Неможливо вподобати."
|
||||||
pin: "Закріпити"
|
pin: "Закріпити"
|
||||||
unpin: "Відкріпити"
|
unpin: "Відкріпити"
|
||||||
copyContent: "Скопіювати контент"
|
copyContent: "Скопіювати контент"
|
||||||
@ -60,12 +64,12 @@ files: "Файли"
|
|||||||
download: "Завантажити"
|
download: "Завантажити"
|
||||||
driveFileDeleteConfirm: "Ви впевнені, що хочете видалити файл {name}? Нотатки із цим файлом також буде видалено."
|
driveFileDeleteConfirm: "Ви впевнені, що хочете видалити файл {name}? Нотатки із цим файлом також буде видалено."
|
||||||
unfollowConfirm: "Ви впевнені, що хочете відписатися від {name}?"
|
unfollowConfirm: "Ви впевнені, що хочете відписатися від {name}?"
|
||||||
exportRequested: "Ви запросили експорт. Це може зайняти деякий час. Після завершення експорту отриманий файл буде додано на диск."
|
exportRequested: "Експортування розпочато. Це може зайняти деякий час. Після завершення експорту отриманий файл буде додано на диск."
|
||||||
importRequested: "Ви запросили імпорт. Це може зайняти деякий час."
|
importRequested: "Імпортування розпочато. Це може зайняти деякий час."
|
||||||
lists: "Списки"
|
lists: "Списки"
|
||||||
noLists: "Немає списків"
|
noLists: "Немає списків"
|
||||||
note: "Нотатки"
|
note: "Запис"
|
||||||
notes: "Нотатки"
|
notes: "Записи"
|
||||||
following: "Підписки"
|
following: "Підписки"
|
||||||
followers: "Підписники"
|
followers: "Підписники"
|
||||||
followsYou: "Підписаний(-а) на вас"
|
followsYou: "Підписаний(-а) на вас"
|
||||||
@ -77,10 +81,10 @@ retry: "Спробувати знову"
|
|||||||
pageLoadError: "Помилка при завантаженні сторінки"
|
pageLoadError: "Помилка при завантаженні сторінки"
|
||||||
pageLoadErrorDescription: "Зазвичай це пов’язано з помилками мережі або кешем браузера. Очистіть кеш або почекайте трохи й спробуйте ще раз."
|
pageLoadErrorDescription: "Зазвичай це пов’язано з помилками мережі або кешем браузера. Очистіть кеш або почекайте трохи й спробуйте ще раз."
|
||||||
enterListName: "Введіть назву списку"
|
enterListName: "Введіть назву списку"
|
||||||
privacy: "Приватність"
|
privacy: "Конфіденційність"
|
||||||
makeFollowManuallyApprove: "Підтверджувати підписників уручну"
|
makeFollowManuallyApprove: "Підтверджувати підписників уручну"
|
||||||
defaultNoteVisibility: "Видимість за замовчуванням"
|
defaultNoteVisibility: "Видимість за замовчуванням"
|
||||||
follow: "Підписка"
|
follow: "Підписатись"
|
||||||
followRequest: "Запит на підписку"
|
followRequest: "Запит на підписку"
|
||||||
followRequests: "Запити на підписку"
|
followRequests: "Запити на підписку"
|
||||||
unfollow: "Відписатись"
|
unfollow: "Відписатись"
|
||||||
@ -88,14 +92,19 @@ followRequestPending: "Очікуючі запити на підписку"
|
|||||||
enterEmoji: "Введіть емодзі"
|
enterEmoji: "Введіть емодзі"
|
||||||
renote: "Поширити"
|
renote: "Поширити"
|
||||||
unrenote: "Відміна поширення"
|
unrenote: "Відміна поширення"
|
||||||
|
renoted: "Поширити запис."
|
||||||
|
cantRenote: "Неможливо поширити."
|
||||||
|
cantReRenote: "Поширення не можливо поширити."
|
||||||
quote: "Цитата"
|
quote: "Цитата"
|
||||||
pinnedNote: "Закріплена нотатка"
|
pinnedNote: "Закріплений запис"
|
||||||
|
pinned: "Закріпити"
|
||||||
you: "Ви"
|
you: "Ви"
|
||||||
clickToShow: "Натисніть для перегляду"
|
clickToShow: "Натисніть для перегляду"
|
||||||
sensitive: "NSFW"
|
sensitive: "NSFW"
|
||||||
add: "Додати"
|
add: "Додати"
|
||||||
reaction: "Реакції"
|
reaction: "Реакції"
|
||||||
reactionSettingDescription: "Виберіть свої улюблені реакції, які хочете закріпити в селекторі реакцій."
|
reactionSettingDescription: "Виберіть свої улюблені реакції, які хочете закріпити в селекторі реакцій."
|
||||||
|
reactionSettingDescription2: "Перемістити щоб змінити порядок, Клацнути мишою щоб видалити, Натиснути \"+\" щоб додати."
|
||||||
rememberNoteVisibility: "Пам’ятати параметри видимісті"
|
rememberNoteVisibility: "Пам’ятати параметри видимісті"
|
||||||
attachCancel: "Видалити вкладення"
|
attachCancel: "Видалити вкладення"
|
||||||
markAsSensitive: "Позначити як NSFW"
|
markAsSensitive: "Позначити як NSFW"
|
||||||
@ -125,7 +134,9 @@ settingGuide: "Рекомендована конфігурація"
|
|||||||
cacheRemoteFiles: "Кешувати дані з інших інстансів"
|
cacheRemoteFiles: "Кешувати дані з інших інстансів"
|
||||||
cacheRemoteFilesDescription: "Якщо кешування вимкнено, віддалені файли завантажуються безпосередньо з віддаленого інстансу. Це зменшує використання сховища, але збільшує трафік, оскільки не генеруются ескізи."
|
cacheRemoteFilesDescription: "Якщо кешування вимкнено, віддалені файли завантажуються безпосередньо з віддаленого інстансу. Це зменшує використання сховища, але збільшує трафік, оскільки не генеруются ескізи."
|
||||||
flagAsBot: "Акаунт бота"
|
flagAsBot: "Акаунт бота"
|
||||||
|
flagAsBotDescription: "Ввімкніть якщо цей обліковий запис використовується ботом. Ця опція позначить обліковий запис як бота. Це потрібно щоб виключити безкінечну інтеракцію між ботами а також відповідного підлаштування Misskey."
|
||||||
flagAsCat: "Акаунт кота"
|
flagAsCat: "Акаунт кота"
|
||||||
|
flagAsCatDescription: "Ввімкніть, щоб позначити, що обліковий запис є котиком."
|
||||||
autoAcceptFollowed: "Автоматично приймати запити на підписку від користувачів, на яких ви підписані"
|
autoAcceptFollowed: "Автоматично приймати запити на підписку від користувачів, на яких ви підписані"
|
||||||
addAcount: "Додати акаунт"
|
addAcount: "Додати акаунт"
|
||||||
loginFailed: "Не вдалося увійти"
|
loginFailed: "Не вдалося увійти"
|
||||||
@ -140,15 +151,15 @@ followConfirm: "Підписатися на {name}?"
|
|||||||
proxyAccount: "Проксі-акаунт"
|
proxyAccount: "Проксі-акаунт"
|
||||||
host: "Хост"
|
host: "Хост"
|
||||||
selectUser: "Виберіть користувача"
|
selectUser: "Виберіть користувача"
|
||||||
recipient: "Кому"
|
recipient: "Отримувач"
|
||||||
annotation: "Коментар"
|
annotation: "Коментарі"
|
||||||
federation: "Федіверс"
|
federation: "Федіверс"
|
||||||
instances: "Інстанс"
|
instances: "Інстанс"
|
||||||
registeredAt: "Приєднався(лась)"
|
registeredAt: "Приєднався(лась)"
|
||||||
latestRequestSentAt: "Останній запит надіслано"
|
latestRequestSentAt: "Останній запит надіслано"
|
||||||
latestRequestReceivedAt: "Останній запит прийнято"
|
latestRequestReceivedAt: "Останній запит прийнято"
|
||||||
latestStatus: "Останній статус"
|
latestStatus: "Останній статус"
|
||||||
storageUsage: "Використання простіру"
|
storageUsage: "Використання простору"
|
||||||
charts: "Графіки"
|
charts: "Графіки"
|
||||||
perHour: "Щогодинно"
|
perHour: "Щогодинно"
|
||||||
perDay: "Щоденно"
|
perDay: "Щоденно"
|
||||||
@ -173,19 +184,19 @@ clearCachedFiles: "Очистити кеш"
|
|||||||
clearCachedFilesConfirm: "Ви впевнені, що хочете видалити всі кешовані файли?"
|
clearCachedFilesConfirm: "Ви впевнені, що хочете видалити всі кешовані файли?"
|
||||||
blockedInstances: "Заблоковані інстанси"
|
blockedInstances: "Заблоковані інстанси"
|
||||||
blockedInstancesDescription: "Вкажіть інстанси, які потрібно заблокувати. Перелічені інстанси більше не зможуть спілкуватися з цим інстансом."
|
blockedInstancesDescription: "Вкажіть інстанси, які потрібно заблокувати. Перелічені інстанси більше не зможуть спілкуватися з цим інстансом."
|
||||||
muteAndBlock: "Ігнор і блокування"
|
muteAndBlock: "Заглушення і блокування"
|
||||||
mutedUsers: "Ігноровані користувачі"
|
mutedUsers: "Заглушені користувачі"
|
||||||
blockedUsers: "Заблоковані користувачі"
|
blockedUsers: "Заблоковані користувачі"
|
||||||
noUsers: "Немає користувачів"
|
noUsers: "Немає користувачів"
|
||||||
editProfile: "Редагувати профіль"
|
editProfile: "Редагувати обліковий запис"
|
||||||
noteDeleteConfirm: "Ви дійсно хочете видалити цю нотатку?"
|
noteDeleteConfirm: "Ви дійсно хочете видалити цей запис?"
|
||||||
pinLimitExceeded: "Більше нотаток не можна закріпити"
|
pinLimitExceeded: "Більше записів не можна закріпити"
|
||||||
intro: "Встановлення Misskey завершено! Будь ласка, створіть акаунт адміністратора."
|
intro: "Встановлення Misskey завершено! Будь ласка, створіть обліковий запис адміністратора."
|
||||||
done: "Готово"
|
done: "Готово"
|
||||||
processing: "Обробка"
|
processing: "Обробка"
|
||||||
preview: "Передогляд"
|
preview: "Попередній перегляд"
|
||||||
default: "За умовчанням"
|
default: "За умовчанням"
|
||||||
noCustomEmojis: "Немає кастомних емоджі"
|
noCustomEmojis: "Немає нетипових емоджі"
|
||||||
noJobs: "Немає завдань"
|
noJobs: "Немає завдань"
|
||||||
federating: "Федерується"
|
federating: "Федерується"
|
||||||
blocked: "Заблоковано"
|
blocked: "Заблоковано"
|
||||||
@ -203,27 +214,27 @@ retypedNotMatch: "Введені дані не збігаються."
|
|||||||
currentPassword: "Поточний пароль"
|
currentPassword: "Поточний пароль"
|
||||||
newPassword: "Новий пароль"
|
newPassword: "Новий пароль"
|
||||||
newPasswordRetype: "Новий пароль (повторно)"
|
newPasswordRetype: "Новий пароль (повторно)"
|
||||||
attachFile: "Вкласти файл"
|
attachFile: "Прикріпити файл"
|
||||||
more: "Бiльше!"
|
more: "Бiльше!"
|
||||||
featured: "Популярні"
|
featured: "Популярні"
|
||||||
usernameOrUserId: "Ім'я або ID користувача"
|
usernameOrUserId: "Ім'я або ID користувача"
|
||||||
noSuchUser: "Користувача не знайдено"
|
noSuchUser: "Користувача не знайдено"
|
||||||
lookup: "Пошук"
|
lookup: "Пошук"
|
||||||
announcements: "Оголошення"
|
announcements: "Оголошення"
|
||||||
imageUrl: "URL зображення"
|
imageUrl: "Посилання на зображення"
|
||||||
remove: "Видалити"
|
remove: "Видалити"
|
||||||
removed: "Видалено"
|
removed: "Видалено"
|
||||||
removeAreYouSure: "Ви впевнені, що хочете видалити \"{x}\"?"
|
removeAreYouSure: "Ви впевнені, що хочете видалити \"{x}\"?"
|
||||||
deleteAreYouSure: "Ви впевнені, що хочете видалити \"{x}\"?"
|
deleteAreYouSure: "Ви впевнені, що хочете видалити \"{x}\"?"
|
||||||
resetAreYouSure: "Дійсно ресет?"
|
resetAreYouSure: "Справді скинути?"
|
||||||
saved: "Збережено"
|
saved: "Збережено"
|
||||||
messaging: "Чати"
|
messaging: "Чати"
|
||||||
upload: "Завантажити"
|
upload: "Завантажити"
|
||||||
fromDrive: "З диска"
|
fromDrive: "З диска"
|
||||||
fromUrl: "З URL"
|
fromUrl: "З посилання"
|
||||||
uploadFromUrl: "Завантажити з URL"
|
uploadFromUrl: "Завантажити з посилання"
|
||||||
uploadFromUrlDescription: "URL-адреса файлу для завантаження"
|
uploadFromUrlDescription: "Посилання на файл для завантаження"
|
||||||
uploadFromUrlRequested: "Обрано завантаження"
|
uploadFromUrlRequested: "Завантаження розпочалось"
|
||||||
uploadFromUrlMayTakeTime: "Завантаження може зайняти деякий час."
|
uploadFromUrlMayTakeTime: "Завантаження може зайняти деякий час."
|
||||||
explore: "Огляд"
|
explore: "Огляд"
|
||||||
games: "Ігри Misskey"
|
games: "Ігри Misskey"
|
||||||
@ -283,6 +294,7 @@ watch: "Стежити"
|
|||||||
unwatch: "Не стежити"
|
unwatch: "Не стежити"
|
||||||
accept: "Прийняти"
|
accept: "Прийняти"
|
||||||
reject: "Відхилити"
|
reject: "Відхилити"
|
||||||
|
normal: "Нормальний"
|
||||||
instanceName: "Назва інстансу"
|
instanceName: "Назва інстансу"
|
||||||
instanceDescription: "Описання інстансу"
|
instanceDescription: "Описання інстансу"
|
||||||
maintainerName: "Ім'я адміністратора"
|
maintainerName: "Ім'я адміністратора"
|
||||||
@ -305,6 +317,7 @@ registration: "Реєстрація"
|
|||||||
enableRegistration: "Дозволити реєстрацію"
|
enableRegistration: "Дозволити реєстрацію"
|
||||||
invite: "Запросити"
|
invite: "Запросити"
|
||||||
proxyRemoteFiles: "Проксувати файли з інших інстансів"
|
proxyRemoteFiles: "Проксувати файли з інших інстансів"
|
||||||
|
proxyRemoteFilesDescription: "При увімкненні віддалені файли, які не зберігаються локально або були видалені через недостатнії обсяг пам'яті, будуть локально проксовані включаючи обкладинки. Це налаштування не впливає на пам'ять серверу. "
|
||||||
driveCapacityPerLocalAccount: "Об'єм диска на одного локального користувача"
|
driveCapacityPerLocalAccount: "Об'єм диска на одного локального користувача"
|
||||||
driveCapacityPerRemoteAccount: "Об'єм диска на одного віддаленого користувача"
|
driveCapacityPerRemoteAccount: "Об'єм диска на одного віддаленого користувача"
|
||||||
inMb: "В мегабайтах"
|
inMb: "В мегабайтах"
|
||||||
@ -312,8 +325,10 @@ iconUrl: "URL аватара"
|
|||||||
bannerUrl: "URL банера"
|
bannerUrl: "URL банера"
|
||||||
basicInfo: "Основна інформація"
|
basicInfo: "Основна інформація"
|
||||||
pinnedUsers: "Закріплені користувачі"
|
pinnedUsers: "Закріплені користувачі"
|
||||||
|
pinnedUsersDescription: "Впишіть в список користувачів, яких хочете закріпити на сторінці \"Знайти\", ім'я в стовпчик."
|
||||||
pinnedPages: "Закріплені сторінки"
|
pinnedPages: "Закріплені сторінки"
|
||||||
pinnedPagesDescription: "Введіть шляхи сторінок, які ви бажаєте закріпити на головній сторінці цього інстанса, розділені новими рядками."
|
pinnedPagesDescription: "Введіть шляхи сторінок, які ви бажаєте закріпити на головній сторінці цього інстанса, розділені новими рядками."
|
||||||
|
pinnedClipId: "Ідентифікатор закріпленої замітки."
|
||||||
pinnedNotes: "Закріплена нотатка"
|
pinnedNotes: "Закріплена нотатка"
|
||||||
hcaptcha: "hCaptcha"
|
hcaptcha: "hCaptcha"
|
||||||
enableHcaptcha: "Увімкнути hCaptcha"
|
enableHcaptcha: "Увімкнути hCaptcha"
|
||||||
@ -329,10 +344,12 @@ name: "Ім'я"
|
|||||||
antennaSource: "Джерело антени"
|
antennaSource: "Джерело антени"
|
||||||
antennaKeywords: "Ключові слова антени"
|
antennaKeywords: "Ключові слова антени"
|
||||||
antennaExcludeKeywords: "Винятки"
|
antennaExcludeKeywords: "Винятки"
|
||||||
|
antennaKeywordsDescription: "Розділення ключових слів пробілами для \"І\" або з нової лінійки для \"АБО\""
|
||||||
notifyAntenna: "Сповіщати про нові нотатки"
|
notifyAntenna: "Сповіщати про нові нотатки"
|
||||||
withFileAntenna: "Тільки нотатки з вкладеними файлами"
|
withFileAntenna: "Тільки нотатки з вкладеними файлами"
|
||||||
serviceworker: "ServiceWorker"
|
serviceworker: "ServiceWorker"
|
||||||
enableServiceworker: "Ввімкнути ServiceWorker"
|
enableServiceworker: "Ввімкнути ServiceWorker"
|
||||||
|
antennaUsersDescription: "Список імя користувачів в стопчик"
|
||||||
caseSensitive: "З урахуванням регістру"
|
caseSensitive: "З урахуванням регістру"
|
||||||
withReplies: "Включаючи відповіді"
|
withReplies: "Включаючи відповіді"
|
||||||
connectedTo: "Наступні акаунти під'єднані"
|
connectedTo: "Наступні акаунти під'єднані"
|
||||||
@ -456,13 +473,21 @@ objectStorage: "Object Storage"
|
|||||||
useObjectStorage: "Використовувати object storage"
|
useObjectStorage: "Використовувати object storage"
|
||||||
objectStorageBaseUrl: "Base URL"
|
objectStorageBaseUrl: "Base URL"
|
||||||
objectStorageBucket: "Bucket"
|
objectStorageBucket: "Bucket"
|
||||||
|
objectStorageBucketDesc: "Будь ласка вкажіть назву відра в налаштованому сервісі."
|
||||||
objectStoragePrefix: "Prefix"
|
objectStoragePrefix: "Prefix"
|
||||||
|
objectStoragePrefixDesc: "Файли будуть зберігатись у розташуванні з цим префіксом."
|
||||||
objectStorageEndpoint: "Endpoint"
|
objectStorageEndpoint: "Endpoint"
|
||||||
|
objectStorageEndpointDesc: "Залиште пустим при використанні AWS S3. Інакше введіть кінцевий пункт як '<host>' або '<host>:<port>' слідуючи інструкціям сервісу, який використовується."
|
||||||
objectStorageRegion: "Region"
|
objectStorageRegion: "Region"
|
||||||
|
objectStorageRegionDesc: "Введіть регіон у формі 'xx-east-1'. Залиште пустим, якщо ваш сервіс не різниться відповідно до регіонів, або введіть 'us-east-1'."
|
||||||
objectStorageUseSSL: "Використовувати SSL"
|
objectStorageUseSSL: "Використовувати SSL"
|
||||||
|
objectStorageUseSSLDesc: "Вимкніть коли не використовується HTTPS для з'єднання API"
|
||||||
objectStorageUseProxy: "Використовувати Proxy"
|
objectStorageUseProxy: "Використовувати Proxy"
|
||||||
|
objectStorageUseProxyDesc: "Вимкніть коли проксі не використовується для з'єднання ObjectStorage"
|
||||||
|
objectStorageSetPublicRead: "Встановіть 'публічне читання' при завантаженні"
|
||||||
serverLogs: "Журнал сервера"
|
serverLogs: "Журнал сервера"
|
||||||
deleteAll: "Видалити все"
|
deleteAll: "Видалити все"
|
||||||
|
showFixedPostForm: "Показати форму запису над стрічкою новин."
|
||||||
newNoteRecived: "Є нові нотатки"
|
newNoteRecived: "Є нові нотатки"
|
||||||
sounds: "Звуки"
|
sounds: "Звуки"
|
||||||
listen: "Слухати"
|
listen: "Слухати"
|
||||||
@ -495,6 +520,8 @@ deleteAllFiles: "Видалити всі файли"
|
|||||||
deleteAllFilesConfirm: "Ви дійсно хочете видалити всі файли?"
|
deleteAllFilesConfirm: "Ви дійсно хочете видалити всі файли?"
|
||||||
removeAllFollowing: "Скасувати всі підписки"
|
removeAllFollowing: "Скасувати всі підписки"
|
||||||
removeAllFollowingDescription: "Скасувати підписку на всі акаунти з {host}. Будь ласка, робіть це, якщо інстанс більше не існує."
|
removeAllFollowingDescription: "Скасувати підписку на всі акаунти з {host}. Будь ласка, робіть це, якщо інстанс більше не існує."
|
||||||
|
userSuspended: "Обліковий запис заблокований."
|
||||||
|
userSilenced: "Обліковий запис приглушений."
|
||||||
sidebar: "Бокова панель"
|
sidebar: "Бокова панель"
|
||||||
divider: "Розділювач"
|
divider: "Розділювач"
|
||||||
addItem: "Додати елемент"
|
addItem: "Додати елемент"
|
||||||
@ -505,6 +532,7 @@ inboxUrl: "Inbox URL"
|
|||||||
addedRelays: "Додані ретранслятори"
|
addedRelays: "Додані ретранслятори"
|
||||||
serviceworkerInfo: "Повинен бути ввімкнений для push-сповіщень."
|
serviceworkerInfo: "Повинен бути ввімкнений для push-сповіщень."
|
||||||
deletedNote: "Видалена нотатка"
|
deletedNote: "Видалена нотатка"
|
||||||
|
invisibleNote: "Приховані записи"
|
||||||
enableInfiniteScroll: "Увімкнути нескінченну прокрутку"
|
enableInfiniteScroll: "Увімкнути нескінченну прокрутку"
|
||||||
visibility: "Видимість"
|
visibility: "Видимість"
|
||||||
poll: "Опитування"
|
poll: "Опитування"
|
||||||
@ -515,6 +543,7 @@ expandTweet: "Розгорнути твіт"
|
|||||||
themeEditor: "Редактор тем"
|
themeEditor: "Редактор тем"
|
||||||
description: "Опис"
|
description: "Опис"
|
||||||
author: "Автор"
|
author: "Автор"
|
||||||
|
leaveConfirm: "Зміни не збережені. Ви дійсно хочете скасувати зміни?"
|
||||||
manage: "Управління"
|
manage: "Управління"
|
||||||
plugins: "Плагіни"
|
plugins: "Плагіни"
|
||||||
deck: "Дек"
|
deck: "Дек"
|
||||||
@ -531,18 +560,26 @@ permission: "Права"
|
|||||||
enableAll: "Увімкнути все"
|
enableAll: "Увімкнути все"
|
||||||
disableAll: "Вимкнути все"
|
disableAll: "Вимкнути все"
|
||||||
tokenRequested: "Надати доступ до акаунту"
|
tokenRequested: "Надати доступ до акаунту"
|
||||||
|
pluginTokenRequestedDescription: "Цей плагін зможе використовувати дозволи які тут вказані."
|
||||||
notificationType: "Тип сповіщення"
|
notificationType: "Тип сповіщення"
|
||||||
edit: "Редагувати"
|
edit: "Редагувати"
|
||||||
useStarForReactionFallback: "Використовувати ★ як запасний варіант, якщо емодзі реакції невідомий"
|
useStarForReactionFallback: "Використовувати ★ як запасний варіант, якщо емодзі реакції невідомий"
|
||||||
emailConfig: "Налаштування email сервера"
|
emailConfig: "Налаштування email сервера"
|
||||||
|
enableEmail: "Увімкнути функцію доставки пошти"
|
||||||
|
emailConfigInfo: "Використовується для підтвердження електронної пошти підчас реєстрації, а також для відновлення паролю."
|
||||||
email: "E-mail"
|
email: "E-mail"
|
||||||
emailAddress: "E-mail адреса"
|
emailAddress: "E-mail адреса"
|
||||||
|
smtpConfig: "Налаштування сервера SMTP"
|
||||||
smtpHost: "Хост"
|
smtpHost: "Хост"
|
||||||
smtpPort: "Порт"
|
smtpPort: "Порт"
|
||||||
smtpUser: "Ім'я користувача"
|
smtpUser: "Ім'я користувача"
|
||||||
smtpPass: "Пароль"
|
smtpPass: "Пароль"
|
||||||
|
emptyToDisableSmtpAuth: "Залиште назву користувача і пароль пустими для вимкнення підтвердження SMTP"
|
||||||
|
smtpSecure: "Використовувати безумовне шифрування SSL/TLS для з'єднань SMTP"
|
||||||
|
smtpSecureInfo: "Вимкніть при використанні STARTTLS "
|
||||||
testEmail: "Тестовий email"
|
testEmail: "Тестовий email"
|
||||||
wordMute: "Блокування слів"
|
wordMute: "Блокування слів"
|
||||||
|
userSaysSomething: "{name} щось сказав(ла)"
|
||||||
makeActive: "Активувати"
|
makeActive: "Активувати"
|
||||||
display: "Відображення"
|
display: "Відображення"
|
||||||
copy: "Скопіювати"
|
copy: "Скопіювати"
|
||||||
@ -556,16 +593,24 @@ create: "Створити"
|
|||||||
notificationSetting: "Параметри сповіщень"
|
notificationSetting: "Параметри сповіщень"
|
||||||
notificationSettingDesc: "Виберіть типи сповіщень для відображення"
|
notificationSettingDesc: "Виберіть типи сповіщень для відображення"
|
||||||
useGlobalSetting: "Застосувати глобальнi параметри"
|
useGlobalSetting: "Застосувати глобальнi параметри"
|
||||||
|
useGlobalSettingDesc: "Якщо увімкнено, то будуть використовуватись налаштування повідомлень облікового запису, інакше можливо налаштувати індивідуально."
|
||||||
other: "Інше"
|
other: "Інше"
|
||||||
regenerateLoginToken: "Оновити Login Token"
|
regenerateLoginToken: "Оновити Login Token"
|
||||||
|
regenerateLoginTokenDescription: "Регенерувати внутрішній ключ використовуваний під час входу. Зазвичай цього не потрібно робити. При регенерації всі пристрої вийдуть з системи."
|
||||||
|
setMultipleBySeparatingWithSpace: "Можна вказати кілька значень, відділивши їх пробілом."
|
||||||
|
fileIdOrUrl: "Ідентифікатор файлу або посилання"
|
||||||
|
chatOpenBehavior: "Поводження вікна переписки під час відкриття"
|
||||||
behavior: "Поведінка"
|
behavior: "Поведінка"
|
||||||
sample: "Приклад"
|
sample: "Приклад"
|
||||||
abuseReports: "Скарги"
|
abuseReports: "Скарги"
|
||||||
reportAbuse: "Поскаржитись"
|
reportAbuse: "Поскаржитись"
|
||||||
reportAbuseOf: "Поскаржитись на {name}"
|
reportAbuseOf: "Поскаржитись на {name}"
|
||||||
|
fillAbuseReportDescription: "Будь ласка вкажіть подробиці скарги. Якщо скарга стосується запису, вкажіть посилання на нього."
|
||||||
|
abuseReported: "Дякуємо, вашу скаргу було відправлено. "
|
||||||
send: "Відправити"
|
send: "Відправити"
|
||||||
abuseMarkAsResolved: "Позначити скаргу як вирішену"
|
abuseMarkAsResolved: "Позначити скаргу як вирішену"
|
||||||
openInNewTab: "Відкрити в новій вкладці"
|
openInNewTab: "Відкрити в новій вкладці"
|
||||||
|
openInSideView: "Відкрити збоку"
|
||||||
defaultNavigationBehaviour: "Поведінка навігації за замовчуванням"
|
defaultNavigationBehaviour: "Поведінка навігації за замовчуванням"
|
||||||
editTheseSettingsMayBreakAccount: "Зміна цих параметрів може призвести до пошкодження вашого акаунта."
|
editTheseSettingsMayBreakAccount: "Зміна цих параметрів може призвести до пошкодження вашого акаунта."
|
||||||
instanceTicker: "Мітка з назвою інстанса в нотатках"
|
instanceTicker: "Мітка з назвою інстанса в нотатках"
|
||||||
@ -577,6 +622,7 @@ desktop: "Десктоп"
|
|||||||
clip: "Добірка"
|
clip: "Добірка"
|
||||||
createNew: "Створити новий"
|
createNew: "Створити новий"
|
||||||
optional: "Необов'язково"
|
optional: "Необов'язково"
|
||||||
|
createNewClip: "Створити нотатку"
|
||||||
public: "Публічний"
|
public: "Публічний"
|
||||||
i18nInfo: "Misskey перекладається на різні мови волонтерами. Ви можете допомогти: {link}"
|
i18nInfo: "Misskey перекладається на різні мови волонтерами. Ви можете допомогти: {link}"
|
||||||
manageAccessTokens: "Керування токенами доступу"
|
manageAccessTokens: "Керування токенами доступу"
|
||||||
@ -598,9 +644,11 @@ driveFilesCount: "Кількість файлів на диску"
|
|||||||
driveUsage: "Використання місця на диску"
|
driveUsage: "Використання місця на диску"
|
||||||
noCrawle: "Заборонити індексацію"
|
noCrawle: "Заборонити індексацію"
|
||||||
noCrawleDescription: "Просити пошукові системи не індексувати ваш профіль, нотатки, сторінки тощо."
|
noCrawleDescription: "Просити пошукові системи не індексувати ваш профіль, нотатки, сторінки тощо."
|
||||||
|
lockedAccountInfo: "Якщо видимість вашого запису не встановлена як \"Тільки підписники\", то кожен зможе побачити ваш запис, навіть якщо ви вимагаєте підтвердження підписок вручну."
|
||||||
alwaysMarkSensitive: "Позначати NSFW за замовчуванням"
|
alwaysMarkSensitive: "Позначати NSFW за замовчуванням"
|
||||||
loadRawImages: "Відображати вкладені зображення повністю замість ескізів"
|
loadRawImages: "Відображати вкладені зображення повністю замість ескізів"
|
||||||
disableShowingAnimatedImages: "Не програвати анімовані зображення"
|
disableShowingAnimatedImages: "Не програвати анімовані зображення"
|
||||||
|
verificationEmailSent: "Електронний лист з підтвердженням відісланий. Будь ласка перейдіть по посиланню в листі для підтвердження."
|
||||||
notSet: "Не налаштовано"
|
notSet: "Не налаштовано"
|
||||||
emailVerified: "Електронну пошту підтверджено."
|
emailVerified: "Електронну пошту підтверджено."
|
||||||
noteFavoritesCount: "Кількість улюблених нотаток"
|
noteFavoritesCount: "Кількість улюблених нотаток"
|
||||||
@ -612,7 +660,43 @@ useSystemFont: "Використовувати стандартний шрифт
|
|||||||
clips: "Добірка"
|
clips: "Добірка"
|
||||||
experimentalFeatures: "Експериментальні функції"
|
experimentalFeatures: "Експериментальні функції"
|
||||||
developer: "Розробник"
|
developer: "Розробник"
|
||||||
|
makeExplorable: "Зробіть обліковий запис видимим у розділі \"Огляд\""
|
||||||
|
makeExplorableDescription: "Вимкніть, щоб обліковий запис не показувався у розділі \"Огляд\"."
|
||||||
|
showGapBetweenNotesInTimeline: "Показувати розрив між записами у стрічці новин"
|
||||||
|
duplicate: "Дублікат"
|
||||||
|
left: "Лівий"
|
||||||
|
center: "Центр"
|
||||||
|
wide: "Широкий"
|
||||||
|
narrow: "Вузький"
|
||||||
|
reloadToApplySetting: "Налаштування ввійде в дію при перезавантаженні. Перезавантажити?"
|
||||||
|
showTitlebar: "Показати титульний рядок"
|
||||||
clearCache: "Очистити кеш"
|
clearCache: "Очистити кеш"
|
||||||
|
onlineUsersCount: "{n} користувачів онлайн"
|
||||||
|
nUsers: "{n} Користувачів"
|
||||||
|
nNotes: "{n} Записів"
|
||||||
|
sendErrorReports: "Надіслати звіт про помилки"
|
||||||
|
sendErrorReportsDescription: "При увімкненні детальна інформація про помилки буде надана Misskey у разі виникнення проблем, що дасть можливість покращити Misskey."
|
||||||
|
myTheme: "Моя тема"
|
||||||
|
backgroundColor: "Фон"
|
||||||
|
accentColor: "Акцент"
|
||||||
|
textColor: "Текст"
|
||||||
|
saveAs: "Зберегти як…"
|
||||||
|
advanced: "Розширені"
|
||||||
|
value: "Значення"
|
||||||
|
updatedAt: "Останнє оновлення"
|
||||||
|
saveConfirm: "Зберегти зміни?"
|
||||||
|
deleteConfirm: "Ви дійсно бажаєте це видалити?"
|
||||||
|
invalidValue: "Некоректне значення."
|
||||||
|
registry: "Реєстр"
|
||||||
|
closeAccount: "Закрити обліковий запис"
|
||||||
|
_email:
|
||||||
|
_follow:
|
||||||
|
title: "Новий підписник"
|
||||||
|
_registry:
|
||||||
|
key: "Ключ"
|
||||||
|
keys: "Ключі"
|
||||||
|
domain: "Домен"
|
||||||
|
createKey: "Створити ключ"
|
||||||
_aboutMisskey:
|
_aboutMisskey:
|
||||||
about: "Misskey - це програмне забезпечення з відкритим кодом, яке розробляє syuilo з 2014 року."
|
about: "Misskey - це програмне забезпечення з відкритим кодом, яке розробляє syuilo з 2014 року."
|
||||||
contributors: "Головні помічники"
|
contributors: "Головні помічники"
|
||||||
@ -651,10 +735,14 @@ _mfm:
|
|||||||
inlineMath: "Формула (у рядку)"
|
inlineMath: "Формула (у рядку)"
|
||||||
inlineMathDescription: "Відображення математичних формул (KaTeX) у рядку"
|
inlineMathDescription: "Відображення математичних формул (KaTeX) у рядку"
|
||||||
blockMath: "Формули (блок)"
|
blockMath: "Формули (блок)"
|
||||||
|
blockMathDescription: "Відображати багаторядкові формули (KaTeX) блоками"
|
||||||
quote: "Цитата"
|
quote: "Цитата"
|
||||||
|
quoteDescription: "Відображає зміст як цитату."
|
||||||
emoji: "Кастомні емоджі"
|
emoji: "Кастомні емоджі"
|
||||||
|
emojiDescription: "Щоб показати нетиповий емоджі, потрібно ввести його назву в двокрапках."
|
||||||
search: "Пошук"
|
search: "Пошук"
|
||||||
searchDescription: "Відображає вікно пошуку з попередньо введеним текстом"
|
searchDescription: "Відображає вікно пошуку з попередньо введеним текстом"
|
||||||
|
flip: "Перевернути"
|
||||||
flipDescription: "Віддзеркалює вміст по горизонталі або вертикалі"
|
flipDescription: "Віддзеркалює вміст по горизонталі або вертикалі"
|
||||||
jelly: "Анімація (желе)"
|
jelly: "Анімація (желе)"
|
||||||
jellyDescription: "Створює желеподібну анімацію"
|
jellyDescription: "Створює желеподібну анімацію"
|
||||||
@ -666,7 +754,16 @@ _mfm:
|
|||||||
shake: "Анімація (Shake)"
|
shake: "Анімація (Shake)"
|
||||||
twitch: "Анімація (Twitch)"
|
twitch: "Анімація (Twitch)"
|
||||||
spin: "Анімація (Spin)"
|
spin: "Анімація (Spin)"
|
||||||
|
x2: "Великий"
|
||||||
|
x2Description: "Показує контент збільшеним."
|
||||||
|
x3: "Дуже великий"
|
||||||
|
x3Description: "Показує контент ще більшим."
|
||||||
|
x4: "Надзвичайно великий"
|
||||||
|
x4Description: "Показує контент надзвичайно великим."
|
||||||
|
blur: "Розмиття"
|
||||||
|
blurDescription: "Цей ефект зробить контент розмитим. Контент можна зробити чітким, якщо навести на нього вказівник миші."
|
||||||
font: "Шрифт"
|
font: "Шрифт"
|
||||||
|
fontDescription: "Встановлює шрифт для контенту."
|
||||||
_reversi:
|
_reversi:
|
||||||
reversi: "Реверсі"
|
reversi: "Реверсі"
|
||||||
gameSettings: "Налаштування гри"
|
gameSettings: "Налаштування гри"
|
||||||
@ -695,6 +792,9 @@ _reversi:
|
|||||||
myGames: "Мої ігри"
|
myGames: "Мої ігри"
|
||||||
allGames: "Усі ігри"
|
allGames: "Усі ігри"
|
||||||
ended: "Завершено"
|
ended: "Завершено"
|
||||||
|
playing: "В даний момент у процесі гри"
|
||||||
|
isLlotheo: "Гравець з найменшою кількістю фігур виграє (Llotheo)"
|
||||||
|
canPutEverywhere: "Фігури можна ставити в будь якії позиції"
|
||||||
_instanceTicker:
|
_instanceTicker:
|
||||||
none: "Не відображати"
|
none: "Не відображати"
|
||||||
remote: "Відображати для віддалених користувачів"
|
remote: "Відображати для віддалених користувачів"
|
||||||
@ -709,6 +809,7 @@ _channel:
|
|||||||
setBanner: "Встановити банер"
|
setBanner: "Встановити банер"
|
||||||
removeBanner: "Видалити банер"
|
removeBanner: "Видалити банер"
|
||||||
featured: "Тренди"
|
featured: "Тренди"
|
||||||
|
following: "Підписки"
|
||||||
usersCount: "{n} учасників"
|
usersCount: "{n} учасників"
|
||||||
notesCount: "{n} дописів"
|
notesCount: "{n} дописів"
|
||||||
_sidebar:
|
_sidebar:
|
||||||
@ -716,12 +817,32 @@ _sidebar:
|
|||||||
icon: "Аватар"
|
icon: "Аватар"
|
||||||
hide: "Сховати"
|
hide: "Сховати"
|
||||||
_wordMute:
|
_wordMute:
|
||||||
|
muteWords: "Заглушені слова"
|
||||||
|
muteWordsDescription: "Розділення ключових слів пробілами для \"І\" або з нової лінійки для \"АБО\""
|
||||||
|
muteWordsDescription2: "Для використання RegEx, ключові слова потрібно вписати поміж слешів \"/\"."
|
||||||
|
softDescription: "Приховати записи які відповідають критеріям зі стрічки подій."
|
||||||
|
hardDescription: "Приховати записи які відповідають критеріям зі стрічки подій. Також приховані записи не будуть додані до стрічки подій навіть якщо критерії буде змінено."
|
||||||
soft: "М'яко"
|
soft: "М'яко"
|
||||||
hard: "Жорстко"
|
hard: "Жорстко"
|
||||||
mutedNotes: "Заблоковані нотатки"
|
mutedNotes: "Заблоковані нотатки"
|
||||||
_theme:
|
_theme:
|
||||||
|
explore: "Оглянути теми"
|
||||||
|
install: "Встановити тему"
|
||||||
|
manage: "Керування темами"
|
||||||
|
code: "Код теми"
|
||||||
|
installed: "Тему {name} встановлено"
|
||||||
|
installedThemes: "Встановлені теми"
|
||||||
|
builtinThemes: "Вбудоваі теми"
|
||||||
|
alreadyInstalled: "Тему вже встановлено"
|
||||||
|
invalid: "Неправильний формат теми"
|
||||||
|
make: "Створити тему"
|
||||||
|
base: "Основа"
|
||||||
defaultValue: "Значення за замовчуванням"
|
defaultValue: "Значення за замовчуванням"
|
||||||
func: "Функції"
|
func: "Функції"
|
||||||
|
lighten: "Яскравість"
|
||||||
|
inputConstantName: "Введіть назву константи"
|
||||||
|
importInfo: "Вставляючи сюди код теми, ви можете добавити її до редактору тем"
|
||||||
|
deleteConstantConfirm: "Ви дійсно бажаєте видалити константу \"{const}\"?"
|
||||||
keys:
|
keys:
|
||||||
accent: "Акцент"
|
accent: "Акцент"
|
||||||
bg: "Фон"
|
bg: "Фон"
|
||||||
@ -741,13 +862,41 @@ _theme:
|
|||||||
mention: "Згадка"
|
mention: "Згадка"
|
||||||
mentionMe: "Згадки (мене)"
|
mentionMe: "Згадки (мене)"
|
||||||
renote: "Поширити"
|
renote: "Поширити"
|
||||||
|
modalBg: "Модальний фон"
|
||||||
divider: "Розділювач"
|
divider: "Розділювач"
|
||||||
|
scrollbarHandle: "Ручка смуги прокрутки"
|
||||||
|
scrollbarHandleHover: "Ручка смуги прокрутки (при наведенні)"
|
||||||
|
dateLabelFg: "Текст позначок дати"
|
||||||
|
infoBg: "Фон інформації"
|
||||||
|
infoFg: "Текст інформації"
|
||||||
|
infoWarnBg: "Фон попередження"
|
||||||
|
infoWarnFg: "Текст попередження"
|
||||||
|
cwBg: "Фон чутливого змісту"
|
||||||
|
cwFg: "Текст чутливого змісту"
|
||||||
|
cwHoverBg: "Фон чутливого змісту (при наведенні)"
|
||||||
|
toastBg: "Фон повідомлення"
|
||||||
|
toastFg: "Текст повідомлення"
|
||||||
|
buttonBg: "Фон кнопки"
|
||||||
|
buttonHoverBg: "Фон кнопки (при наведенні)"
|
||||||
|
inputBorder: "Край поля вводу"
|
||||||
|
listItemHoverBg: "Фон елементу в списку (при наведенні)"
|
||||||
|
driveFolderBg: "Фон папки на диску"
|
||||||
|
wallpaperOverlay: "Накладання шпалер"
|
||||||
|
badge: "Значок"
|
||||||
|
messageBg: "Фон переписки"
|
||||||
|
accentDarken: "Акцент (Затемлений)"
|
||||||
|
accentLighten: "Акцент (Освітлений)"
|
||||||
|
fgHighlighted: "Виділений текст"
|
||||||
_sfx:
|
_sfx:
|
||||||
note: "Нотатки"
|
note: "Нотатки"
|
||||||
noteMy: "Мої нотатки"
|
noteMy: "Мої нотатки"
|
||||||
notification: "Сповіщення"
|
notification: "Сповіщення"
|
||||||
chat: "Чати"
|
chat: "Чати"
|
||||||
chatBg: "Чати (фон)"
|
chatBg: "Чати (фон)"
|
||||||
|
antenna: "Прийом антени"
|
||||||
|
channel: "Повідомлення каналу"
|
||||||
|
reversiPutBlack: "Реверсі: хід Чорного"
|
||||||
|
reversiPutWhite: "Реверсі: хід Білого"
|
||||||
_ago:
|
_ago:
|
||||||
unknown: "Невідомо"
|
unknown: "Невідомо"
|
||||||
future: "Майбутнє"
|
future: "Майбутнє"
|
||||||
@ -767,8 +916,26 @@ _time:
|
|||||||
_tutorial:
|
_tutorial:
|
||||||
title: "Як користуватись Misskey"
|
title: "Як користуватись Misskey"
|
||||||
step1_1: "Ласкаво просимо!"
|
step1_1: "Ласкаво просимо!"
|
||||||
|
step1_2: "Ця сторінка має назву \"стрічка подій\". На ній з'являються записи користувачів на яких ви підписані."
|
||||||
step1_3: "Наразі ваша стрічка порожня, оскільки ви ще не написали жодної нотатки і не підписані на інших."
|
step1_3: "Наразі ваша стрічка порожня, оскільки ви ще не написали жодної нотатки і не підписані на інших."
|
||||||
|
step2_1: "Перш ніж зробити запис або підписатись на когось, спочатку заповніть свій обліковий запис."
|
||||||
|
step2_2: "Надання деякої інформації про себе дозволить іншим користувачам підписатись на вас."
|
||||||
|
step3_1: "Ви успішно налаштували свій обліковий запис?"
|
||||||
step3_2: "Наступним кроком є написання нотатки. Це можна зробити, натиснувши зображення олівця на екрані."
|
step3_2: "Наступним кроком є написання нотатки. Це можна зробити, натиснувши зображення олівця на екрані."
|
||||||
|
step3_3: "Після написання вмісту ви можете опублікувати його, натиснувши кнопку у верхньому правому куті форми."
|
||||||
|
step3_4: "Не знаєте що написати? Спробуйте \"налаштовую свій msky\"!"
|
||||||
|
step4_1: "Ви розмістили свій перший запис?"
|
||||||
|
step4_2: "Ура! Ваш перший запис відображається на вашій стрічці подій."
|
||||||
|
step5_1: "Настав час оживити вашу стрічку подій підписавшись на інших користувачів."
|
||||||
|
step5_2: "{featured} показує популярні записи , а {explore} популярних користувачів з цього інстансу. Спробуйте підписатись на користувача, який вам сподобався!"
|
||||||
|
step5_3: "Щоб підписатись на інших користувачів, нажміть на їхнє зображення, а потім на кнопку \"підписатись\"."
|
||||||
|
step5_4: "Якщо користувач має замок при імені, то йому потрібно буде вручну підтвердити вашу заявку на підписку."
|
||||||
|
step6_1: "Тепер ви повинні бачити записи інших користувачів на вашій стрічці подій."
|
||||||
|
step6_2: "Також ви можете швидко відповісти, або \"відреагувати\" на записи інших користувачів."
|
||||||
|
step6_3: "Щоб \"відреагувати\", нажміть на знак плюс \"+\" на записі і виберіть емоджі яким ви хочете \"відреагувати\"."
|
||||||
|
step7_1: "Вітаю! Ви пройшли ознайомлення з Misskey."
|
||||||
|
step7_2: "Якщо ви хочете більше дізнатись про Misskey, зайдіть в розділ {help}."
|
||||||
|
step7_3: "Насолоджуйтесь Misskey! 🚀"
|
||||||
_2fa:
|
_2fa:
|
||||||
registerKey: "Зареєструвати новий ключ безпеки"
|
registerKey: "Зареєструвати новий ключ безпеки"
|
||||||
_permissions:
|
_permissions:
|
||||||
@ -815,6 +982,7 @@ _weekday:
|
|||||||
friday: "П'ятниця"
|
friday: "П'ятниця"
|
||||||
saturday: "Субота"
|
saturday: "Субота"
|
||||||
_widgets:
|
_widgets:
|
||||||
|
memo: "Нагадування"
|
||||||
notifications: "Сповіщення"
|
notifications: "Сповіщення"
|
||||||
timeline: "Стрічка"
|
timeline: "Стрічка"
|
||||||
calendar: "Календар"
|
calendar: "Календар"
|
||||||
@ -828,6 +996,10 @@ _widgets:
|
|||||||
postForm: "Створення нотатки"
|
postForm: "Створення нотатки"
|
||||||
slideshow: "Слайд-шоу"
|
slideshow: "Слайд-шоу"
|
||||||
button: "Кнопка"
|
button: "Кнопка"
|
||||||
|
onlineUsers: "Користувачі онлайн"
|
||||||
|
jobQueue: "Черга завдань"
|
||||||
|
serverMetric: "Показники сервера "
|
||||||
|
aiscript: "Консоль AiScript"
|
||||||
_cw:
|
_cw:
|
||||||
hide: "Сховати"
|
hide: "Сховати"
|
||||||
show: "Показати більше"
|
show: "Показати більше"
|
||||||
@ -835,10 +1007,13 @@ _cw:
|
|||||||
files: "{count} файлів"
|
files: "{count} файлів"
|
||||||
_poll:
|
_poll:
|
||||||
noOnlyOneChoice: "Потрібні принаймні два варіанти."
|
noOnlyOneChoice: "Потрібні принаймні два варіанти."
|
||||||
|
choiceN: "Варіант {n}"
|
||||||
noMore: "Більше варіантів додати не можна"
|
noMore: "Більше варіантів додати не можна"
|
||||||
canMultipleVote: "Можна вибрати кілька варіантів"
|
canMultipleVote: "Можна вибрати кілька варіантів"
|
||||||
expiration: "Опитування закінчується"
|
expiration: "Опитування закінчується"
|
||||||
infinite: "Ніколи"
|
infinite: "Ніколи"
|
||||||
|
at: "На даті..."
|
||||||
|
after: "Через..."
|
||||||
deadlineDate: "Дата закінчення"
|
deadlineDate: "Дата закінчення"
|
||||||
deadlineTime: "г"
|
deadlineTime: "г"
|
||||||
duration: "Тривалість"
|
duration: "Тривалість"
|
||||||
@ -902,8 +1077,12 @@ _charts:
|
|||||||
_instanceCharts:
|
_instanceCharts:
|
||||||
requests: "Запити"
|
requests: "Запити"
|
||||||
usersTotal: "Сумарна кількість користувачів"
|
usersTotal: "Сумарна кількість користувачів"
|
||||||
|
notes: "Різниця кількості зроблених записів"
|
||||||
notesTotal: "Сумарна кількість нотаток"
|
notesTotal: "Сумарна кількість нотаток"
|
||||||
|
ff: "Різниця кількості підписників"
|
||||||
|
ffTotal: "Кількість підписників"
|
||||||
cacheSizeTotal: "Сумарний розмір кешу"
|
cacheSizeTotal: "Сумарний розмір кешу"
|
||||||
|
files: "Різниця в кількості файлів"
|
||||||
filesTotal: "Сумарна кількість файлів"
|
filesTotal: "Сумарна кількість файлів"
|
||||||
_timelines:
|
_timelines:
|
||||||
home: "Домівка"
|
home: "Домівка"
|
||||||
@ -918,6 +1097,7 @@ _rooms:
|
|||||||
exit: "Назад"
|
exit: "Назад"
|
||||||
remove: "Видалити"
|
remove: "Видалити"
|
||||||
clear: "Видалити все"
|
clear: "Видалити все"
|
||||||
|
clearConfirm: "Ви дійсно хочете позбутись усіх речей у вашій кімнаті?"
|
||||||
leaveConfirm: "Є незбережені зміни. Ви дійсно хочете вийти?"
|
leaveConfirm: "Є незбережені зміни. Ви дійсно хочете вийти?"
|
||||||
chooseImage: "Виберіть зображення"
|
chooseImage: "Виберіть зображення"
|
||||||
roomType: "Тип кімнати"
|
roomType: "Тип кімнати"
|
||||||
@ -966,6 +1146,7 @@ _rooms:
|
|||||||
sofa: "Диван"
|
sofa: "Диван"
|
||||||
spiral: "Гвинтові сходи"
|
spiral: "Гвинтові сходи"
|
||||||
bin: "Смітник"
|
bin: "Смітник"
|
||||||
|
cup-noodle: "Локшина в чашці"
|
||||||
holo-display: "Голографічний дисплей"
|
holo-display: "Голографічний дисплей"
|
||||||
energy-drink: "Енергетичний напій"
|
energy-drink: "Енергетичний напій"
|
||||||
doll-ai: "Лялька Аі-тян"
|
doll-ai: "Лялька Аі-тян"
|
||||||
@ -991,6 +1172,7 @@ _pages:
|
|||||||
featured: "Популярні"
|
featured: "Популярні"
|
||||||
inspector: "Інспектор"
|
inspector: "Інспектор"
|
||||||
contents: "Вміст"
|
contents: "Вміст"
|
||||||
|
content: "Блок сторінки"
|
||||||
variables: "Змінні"
|
variables: "Змінні"
|
||||||
title: "Заголовок"
|
title: "Заголовок"
|
||||||
url: "URL сторінки"
|
url: "URL сторінки"
|
||||||
@ -1005,6 +1187,7 @@ _pages:
|
|||||||
chooseBlock: "Додати блок"
|
chooseBlock: "Додати блок"
|
||||||
selectType: "Виберіть тип"
|
selectType: "Виберіть тип"
|
||||||
enterVariableName: "Введіть назву для змінної"
|
enterVariableName: "Введіть назву для змінної"
|
||||||
|
variableNameIsAlreadyUsed: "Ця назва вже використовується іншою змінною"
|
||||||
contentBlocks: "Контент"
|
contentBlocks: "Контент"
|
||||||
inputBlocks: "Ввід"
|
inputBlocks: "Ввід"
|
||||||
specialBlocks: "Особливе"
|
specialBlocks: "Особливе"
|
||||||
@ -1020,6 +1203,7 @@ _pages:
|
|||||||
post: "Створення нотатки"
|
post: "Створення нотатки"
|
||||||
_post:
|
_post:
|
||||||
text: "Вміст"
|
text: "Вміст"
|
||||||
|
canvasId: "Ідентифікатор полотна"
|
||||||
textInput: "Введення тексту"
|
textInput: "Введення тексту"
|
||||||
_textInput:
|
_textInput:
|
||||||
name: "Ім'я змінної"
|
name: "Ім'я змінної"
|
||||||
@ -1035,7 +1219,9 @@ _pages:
|
|||||||
name: "Ім'я змінної"
|
name: "Ім'я змінної"
|
||||||
text: "Назва"
|
text: "Назва"
|
||||||
default: "Значення за замовчуванням"
|
default: "Значення за замовчуванням"
|
||||||
|
canvas: "Полотно"
|
||||||
_canvas:
|
_canvas:
|
||||||
|
id: "Ідентифікатор полотна"
|
||||||
width: "Ширина"
|
width: "Ширина"
|
||||||
height: "Висота"
|
height: "Висота"
|
||||||
note: "Вбудована нотатка"
|
note: "Вбудована нотатка"
|
||||||
@ -1055,7 +1241,10 @@ _pages:
|
|||||||
inc: "Збільшити на"
|
inc: "Збільшити на"
|
||||||
_button:
|
_button:
|
||||||
text: "Напис"
|
text: "Напис"
|
||||||
|
colored: "Кольоровий"
|
||||||
|
action: "Дія кнопки"
|
||||||
_action:
|
_action:
|
||||||
|
dialog: "Показати повідомлення"
|
||||||
_dialog:
|
_dialog:
|
||||||
content: "Вміст"
|
content: "Вміст"
|
||||||
resetRandom: "Скидання генератора випадковості"
|
resetRandom: "Скидання генератора випадковості"
|
||||||
@ -1090,11 +1279,15 @@ _pages:
|
|||||||
text: "Текст"
|
text: "Текст"
|
||||||
multiLineText: "Текст (багаторядковий)"
|
multiLineText: "Текст (багаторядковий)"
|
||||||
textList: "Текстовий список"
|
textList: "Текстовий список"
|
||||||
|
_textList:
|
||||||
|
info: "Використовувати новий рядок як роздільник для вводу"
|
||||||
strLen: "Довжина тексту"
|
strLen: "Довжина тексту"
|
||||||
_strLen:
|
_strLen:
|
||||||
arg1: "Текст"
|
arg1: "Текст"
|
||||||
|
strPick: "Вибрати символ"
|
||||||
_strPick:
|
_strPick:
|
||||||
arg1: "Текст"
|
arg1: "Текст"
|
||||||
|
arg2: "Розташування символу"
|
||||||
strReplace: "Заміна тексту"
|
strReplace: "Заміна тексту"
|
||||||
_strReplace:
|
_strReplace:
|
||||||
arg1: "Текст"
|
arg1: "Текст"
|
||||||
@ -1227,17 +1420,25 @@ _pages:
|
|||||||
aiScriptVar: "Змінна AiScript"
|
aiScriptVar: "Змінна AiScript"
|
||||||
fn: "Функції"
|
fn: "Функції"
|
||||||
_fn:
|
_fn:
|
||||||
|
slots: "Паз"
|
||||||
|
slots-info: "Використовувати нову лінію як роздільник пазів"
|
||||||
arg1: "Вивід"
|
arg1: "Вивід"
|
||||||
for: "Повторення"
|
for: "Повторення"
|
||||||
_for:
|
_for:
|
||||||
arg1: "Кількість повторень"
|
arg1: "Кількість повторень"
|
||||||
arg2: "Дія"
|
arg2: "Дія"
|
||||||
|
typeError: "Паз {slot} приймає \"{expect}\" тип, але надана змінна має тип \"{actual}\"!"
|
||||||
|
thereIsEmptySlot: "Паз {slot} пустий!"
|
||||||
types:
|
types:
|
||||||
string: "Текст"
|
string: "Текст"
|
||||||
number: "Число"
|
number: "Число"
|
||||||
boolean: "Прапорець"
|
boolean: "Прапорець"
|
||||||
array: "Списки"
|
array: "Списки"
|
||||||
stringArray: "Текстовий список"
|
stringArray: "Текстовий список"
|
||||||
|
emptySlot: "Пустий паз"
|
||||||
|
enviromentVariables: "Змінні середовища"
|
||||||
|
pageVariables: "Елемент сторінки"
|
||||||
|
argVariables: "Стрічка вводу"
|
||||||
_relayStatus:
|
_relayStatus:
|
||||||
requesting: "Очікує затвердження"
|
requesting: "Очікує затвердження"
|
||||||
accepted: "Затверджено"
|
accepted: "Затверджено"
|
||||||
@ -1271,6 +1472,8 @@ _notification:
|
|||||||
_deck:
|
_deck:
|
||||||
alwaysShowMainColumn: "Завжди показувати головну колонку"
|
alwaysShowMainColumn: "Завжди показувати головну колонку"
|
||||||
columnAlign: "Вирівняти стовпці"
|
columnAlign: "Вирівняти стовпці"
|
||||||
|
columnMargin: "Відступ між стовпцями"
|
||||||
|
columnHeaderHeight: "Висота заголовку колони"
|
||||||
addColumn: "Додати стовпець"
|
addColumn: "Додати стовпець"
|
||||||
swapLeft: "Пересунути ліворуч"
|
swapLeft: "Пересунути ліворуч"
|
||||||
swapRight: "Пересунути праворуч"
|
swapRight: "Пересунути праворуч"
|
||||||
@ -1278,7 +1481,9 @@ _deck:
|
|||||||
swapDown: "Пересунути вниз"
|
swapDown: "Пересунути вниз"
|
||||||
stackLeft: "У стовпчик вліво"
|
stackLeft: "У стовпчик вліво"
|
||||||
popRight: "Витягнути вправо"
|
popRight: "Витягнути вправо"
|
||||||
|
profile: "Обліковий запис"
|
||||||
_columns:
|
_columns:
|
||||||
|
main: "Головна"
|
||||||
widgets: "Віджети"
|
widgets: "Віджети"
|
||||||
notifications: "Сповіщення"
|
notifications: "Сповіщення"
|
||||||
tl: "Стрічка"
|
tl: "Стрічка"
|
||||||
|
@ -13,7 +13,7 @@ gotIt: "我明白了"
|
|||||||
cancel: "取消"
|
cancel: "取消"
|
||||||
enterUsername: "输入用户名"
|
enterUsername: "输入用户名"
|
||||||
renotedBy: "{user} 转发了"
|
renotedBy: "{user} 转发了"
|
||||||
noNotes: "没有帖文"
|
noNotes: "没有帖子"
|
||||||
noNotifications: "无通知"
|
noNotifications: "无通知"
|
||||||
instance: "实例"
|
instance: "实例"
|
||||||
settings: "设置"
|
settings: "设置"
|
||||||
@ -97,16 +97,17 @@ cantRenote: "该帖子无法转发。"
|
|||||||
cantReRenote: "转发无法被再次转发。"
|
cantReRenote: "转发无法被再次转发。"
|
||||||
quote: "引用"
|
quote: "引用"
|
||||||
pinnedNote: "已置顶的帖子"
|
pinnedNote: "已置顶的帖子"
|
||||||
|
pinned: "置顶"
|
||||||
you: "您"
|
you: "您"
|
||||||
clickToShow: "点击以显示"
|
clickToShow: "点击以显示"
|
||||||
sensitive: "阅读注意"
|
sensitive: "敏感内容"
|
||||||
add: "添加"
|
add: "添加"
|
||||||
reaction: "回应"
|
reaction: "回应"
|
||||||
reactionSettingDescription: "选择您想要置顶的回应。"
|
reactionSettingDescription: "选择您想要置顶的回应。"
|
||||||
reactionSettingDescription2: "拖动重新排序,单击删除,点击 + 添加。"
|
reactionSettingDescription2: "拖动重新排序,单击删除,点击 + 添加。"
|
||||||
rememberNoteVisibility: "记录公开范围"
|
rememberNoteVisibility: "记录公开范围"
|
||||||
attachCancel: "删除附件"
|
attachCancel: "删除附件"
|
||||||
markAsSensitive: "阅读注意"
|
markAsSensitive: "标记为敏感内容"
|
||||||
unmarkAsSensitive: "取消标记为敏感内容"
|
unmarkAsSensitive: "取消标记为敏感内容"
|
||||||
enterFileName: "请输入文件名"
|
enterFileName: "请输入文件名"
|
||||||
mute: "屏蔽"
|
mute: "屏蔽"
|
||||||
@ -193,7 +194,7 @@ noteDeleteConfirm: "要删除该帖子吗?"
|
|||||||
pinLimitExceeded: "无法置顶更多了"
|
pinLimitExceeded: "无法置顶更多了"
|
||||||
intro: "Misskey的部署结束啦!填写管理员账号吧!"
|
intro: "Misskey的部署结束啦!填写管理员账号吧!"
|
||||||
done: "完成"
|
done: "完成"
|
||||||
processing: "处理中"
|
processing: "正在处理"
|
||||||
preview: "预览"
|
preview: "预览"
|
||||||
default: "默认"
|
default: "默认"
|
||||||
noCustomEmojis: "没有自定义表情符号"
|
noCustomEmojis: "没有自定义表情符号"
|
||||||
@ -284,7 +285,7 @@ copyUrl: "复制链接"
|
|||||||
rename: "重命名"
|
rename: "重命名"
|
||||||
avatar: "头像"
|
avatar: "头像"
|
||||||
banner: "Banner"
|
banner: "Banner"
|
||||||
nsfw: "阅读注意"
|
nsfw: "敏感内容"
|
||||||
whenServerDisconnected: "与服务器连接中断时"
|
whenServerDisconnected: "与服务器连接中断时"
|
||||||
disconnectedFromServer: "已从服务器断开连接"
|
disconnectedFromServer: "已从服务器断开连接"
|
||||||
reload: "重新加载"
|
reload: "重新加载"
|
||||||
@ -308,7 +309,7 @@ monthX: "{month}月"
|
|||||||
yearX: "{year}年"
|
yearX: "{year}年"
|
||||||
pages: "页面"
|
pages: "页面"
|
||||||
integration: "关联"
|
integration: "关联"
|
||||||
connectSerice: "已连接"
|
connectSerice: "连接"
|
||||||
disconnectSerice: "断开连接"
|
disconnectSerice: "断开连接"
|
||||||
enableLocalTimeline: "启用本地时间线功能"
|
enableLocalTimeline: "启用本地时间线功能"
|
||||||
enableGlobalTimeline: "启用全局时间线"
|
enableGlobalTimeline: "启用全局时间线"
|
||||||
@ -320,7 +321,7 @@ proxyRemoteFiles: "代理远程文件"
|
|||||||
proxyRemoteFilesDescription: "启用此设置后,由于超出存储容量而导致未保存被删除的远程文件将被本地代理,并且会生成缩略图。不会影响服务器的存储。"
|
proxyRemoteFilesDescription: "启用此设置后,由于超出存储容量而导致未保存被删除的远程文件将被本地代理,并且会生成缩略图。不会影响服务器的存储。"
|
||||||
driveCapacityPerLocalAccount: "每个用户的网盘空间"
|
driveCapacityPerLocalAccount: "每个用户的网盘空间"
|
||||||
driveCapacityPerRemoteAccount: "每个远程用户的网盘容量"
|
driveCapacityPerRemoteAccount: "每个远程用户的网盘容量"
|
||||||
inMb: "以兆字节(Mbps)为单位"
|
inMb: "以兆字节(MegaByte)为单位"
|
||||||
iconUrl: "图标URL"
|
iconUrl: "图标URL"
|
||||||
bannerUrl: "Banner URL"
|
bannerUrl: "Banner URL"
|
||||||
basicInfo: "基本信息"
|
basicInfo: "基本信息"
|
||||||
@ -437,6 +438,7 @@ signinWith: "以{x}登录"
|
|||||||
signinFailed: "无法登录,请检查您的用户名和密码。"
|
signinFailed: "无法登录,请检查您的用户名和密码。"
|
||||||
tapSecurityKey: "轻触硬件安全密钥"
|
tapSecurityKey: "轻触硬件安全密钥"
|
||||||
or: "或者"
|
or: "或者"
|
||||||
|
language: "语言"
|
||||||
uiLanguage: "显示语言"
|
uiLanguage: "显示语言"
|
||||||
groupInvited: "群组招待"
|
groupInvited: "群组招待"
|
||||||
aboutX: "关于 {x}"
|
aboutX: "关于 {x}"
|
||||||
@ -472,7 +474,7 @@ hideThisNote: "隐藏这条帖子"
|
|||||||
showFeaturedNotesInTimeline: "在时间线上显示热门推荐"
|
showFeaturedNotesInTimeline: "在时间线上显示热门推荐"
|
||||||
objectStorage: "对象存储"
|
objectStorage: "对象存储"
|
||||||
useObjectStorage: "使用对象存储"
|
useObjectStorage: "使用对象存储"
|
||||||
objectStorageBaseUrl: "基本网址"
|
objectStorageBaseUrl: "Base URL"
|
||||||
objectStorageBaseUrlDesc: "URL前缀,用于构造URL到对象(媒体)的引用,如果您使用的是CDN或反向代理,请指定其URL,否则请根据您使用的服务指定可公开访问的地址。例如“https://<bucket>.s3.amazonaws.com”用于AWS S3,“https://storage.googleapis.com/<bucket>”用于GCS"
|
objectStorageBaseUrlDesc: "URL前缀,用于构造URL到对象(媒体)的引用,如果您使用的是CDN或反向代理,请指定其URL,否则请根据您使用的服务指定可公开访问的地址。例如“https://<bucket>.s3.amazonaws.com”用于AWS S3,“https://storage.googleapis.com/<bucket>”用于GCS"
|
||||||
objectStorageBucket: "存储桶"
|
objectStorageBucket: "存储桶"
|
||||||
objectStorageBucketDesc: "请指定使用的对象存储服务的存储桶名称。"
|
objectStorageBucketDesc: "请指定使用的对象存储服务的存储桶名称。"
|
||||||
@ -526,7 +528,7 @@ userSuspended: "该用户已被冻结。"
|
|||||||
userSilenced: "该用户已被禁言。"
|
userSilenced: "该用户已被禁言。"
|
||||||
sidebar: "侧边栏"
|
sidebar: "侧边栏"
|
||||||
divider: "分割线"
|
divider: "分割线"
|
||||||
addItem: "添加项"
|
addItem: "添加项目"
|
||||||
rooms: "房间"
|
rooms: "房间"
|
||||||
relays: "中继"
|
relays: "中继"
|
||||||
addRelay: "添加中继"
|
addRelay: "添加中继"
|
||||||
@ -548,7 +550,6 @@ author: "作者"
|
|||||||
leaveConfirm: "存在未保存的更改。要放弃更改吗?"
|
leaveConfirm: "存在未保存的更改。要放弃更改吗?"
|
||||||
manage: "管理"
|
manage: "管理"
|
||||||
plugins: "插件"
|
plugins: "插件"
|
||||||
pluginInstallWarn: "请不要安装不明来源的插件"
|
|
||||||
deck: "Deck"
|
deck: "Deck"
|
||||||
undeck: "取消Deck"
|
undeck: "取消Deck"
|
||||||
useBlurEffectForModal: "模态框使用模糊效果"
|
useBlurEffectForModal: "模态框使用模糊效果"
|
||||||
@ -578,7 +579,7 @@ smtpPort: "端口"
|
|||||||
smtpUser: "用户名"
|
smtpUser: "用户名"
|
||||||
smtpPass: "密码"
|
smtpPass: "密码"
|
||||||
emptyToDisableSmtpAuth: "用户名和密码留空可以禁用SMTP验证"
|
emptyToDisableSmtpAuth: "用户名和密码留空可以禁用SMTP验证"
|
||||||
smtpSecure: "在 SMTP 连接中使用隐式 SSL / TLS"
|
smtpSecure: "在 SMTP 连接中默认使用 SSL / TLS"
|
||||||
smtpSecureInfo: "使用STARTTLS时关闭。"
|
smtpSecureInfo: "使用STARTTLS时关闭。"
|
||||||
testEmail: "邮件发送测试"
|
testEmail: "邮件发送测试"
|
||||||
wordMute: "文字屏蔽"
|
wordMute: "文字屏蔽"
|
||||||
@ -637,18 +638,18 @@ repliedCount: "回复数"
|
|||||||
renotedCount: "转发数"
|
renotedCount: "转发数"
|
||||||
followingCount: "正在关注数量"
|
followingCount: "正在关注数量"
|
||||||
followersCount: "关注者数量"
|
followersCount: "关注者数量"
|
||||||
sentReactionsCount: "发送反应数"
|
sentReactionsCount: "发送回应数"
|
||||||
receivedReactionsCount: "收到反应数"
|
receivedReactionsCount: "收到回应数"
|
||||||
pollVotesCount: "发起投票数"
|
pollVotesCount: "问卷调查的投票数"
|
||||||
pollVotedCount: "已投票数"
|
pollVotedCount: "问卷调查的被投票数"
|
||||||
yes: "确定"
|
yes: "是"
|
||||||
no: "取消"
|
no: "否"
|
||||||
driveFilesCount: "磁盘文件数"
|
driveFilesCount: "磁盘文件数"
|
||||||
driveUsage: "磁盘空间用量"
|
driveUsage: "磁盘空间用量"
|
||||||
noCrawle: "拒绝搜索器的索引"
|
noCrawle: "拒绝搜索器的索引"
|
||||||
noCrawleDescription: "要求搜索引擎不要收录(索引)您的用户页面,帖子,页面等。"
|
noCrawleDescription: "要求搜索引擎不要收录(索引)您的用户页面,帖子,页面等。"
|
||||||
lockedAccountInfo: "即使通过了关注请求,只要您不将帖子可见范围设置成“关注者”,任何人都可以看到您的帖子。"
|
lockedAccountInfo: "即使通过了关注请求,只要您不将帖子可见范围设置成“关注者”,任何人都可以看到您的帖子。"
|
||||||
alwaysMarkSensitive: "浏览默认媒体文件时请谨慎"
|
alwaysMarkSensitive: "默认将媒体文件标记为敏感内容"
|
||||||
loadRawImages: "添加附件图像的缩略图时使用原始图像质量"
|
loadRawImages: "添加附件图像的缩略图时使用原始图像质量"
|
||||||
disableShowingAnimatedImages: "不播放动画"
|
disableShowingAnimatedImages: "不播放动画"
|
||||||
verificationEmailSent: "已发送确认电子邮件。请访问电子邮件中的链接以完成设置。"
|
verificationEmailSent: "已发送确认电子邮件。请访问电子邮件中的链接以完成设置。"
|
||||||
@ -677,6 +678,53 @@ clearCache: "清除缓存"
|
|||||||
onlineUsersCount: "{n}人在线"
|
onlineUsersCount: "{n}人在线"
|
||||||
nUsers: "{n}用户"
|
nUsers: "{n}用户"
|
||||||
nNotes: "{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:
|
_aboutMisskey:
|
||||||
about: "Misskey是由syuilo于2014年开发的开源软件。"
|
about: "Misskey是由syuilo于2014年开发的开源软件。"
|
||||||
contributors: "主要贡献者"
|
contributors: "主要贡献者"
|
||||||
@ -687,8 +735,8 @@ _aboutMisskey:
|
|||||||
morePatrons: "还有很多其他的人也在支持我们,非常感谢🥰"
|
morePatrons: "还有很多其他的人也在支持我们,非常感谢🥰"
|
||||||
patrons: "支持者"
|
patrons: "支持者"
|
||||||
_nsfw:
|
_nsfw:
|
||||||
respect: "隐藏NSFW内容"
|
respect: "隐藏敏感内容"
|
||||||
ignore: "不隐藏NSFW内容"
|
ignore: "不隐藏敏感内容"
|
||||||
force: "总是隐藏内容"
|
force: "总是隐藏内容"
|
||||||
_mfm:
|
_mfm:
|
||||||
cheatSheet: "MFM代码速查表"
|
cheatSheet: "MFM代码速查表"
|
||||||
@ -872,8 +920,8 @@ _theme:
|
|||||||
cwBg: "CW 按钮背景"
|
cwBg: "CW 按钮背景"
|
||||||
cwFg: "CW 按钮文本"
|
cwFg: "CW 按钮文本"
|
||||||
cwHoverBg: "CW 按钮背景(悬停)"
|
cwHoverBg: "CW 按钮背景(悬停)"
|
||||||
toastBg: "吐司提示背景"
|
toastBg: "吐司通知背景"
|
||||||
toastFg: "吐司提示文本"
|
toastFg: "吐司通知文本"
|
||||||
buttonBg: "按钮背景"
|
buttonBg: "按钮背景"
|
||||||
buttonHoverBg: "按钮背景(悬停)"
|
buttonHoverBg: "按钮背景(悬停)"
|
||||||
inputBorder: "输入框边框"
|
inputBorder: "输入框边框"
|
||||||
@ -938,7 +986,7 @@ _2fa:
|
|||||||
alreadyRegistered: "此设备已被注册"
|
alreadyRegistered: "此设备已被注册"
|
||||||
registerDevice: "注册设备"
|
registerDevice: "注册设备"
|
||||||
registerKey: "注册密钥"
|
registerKey: "注册密钥"
|
||||||
step1: "首先,在您的设备上安装二步验证应用程序,例如{a}或{b}。"
|
step1: "首先,在您的设备上安装验证应用,例如{a}或{b}。"
|
||||||
step2: "然后,扫描屏幕上显示的二维码。"
|
step2: "然后,扫描屏幕上显示的二维码。"
|
||||||
step3: "输入您的应用提供的动态口令以完成设置。"
|
step3: "输入您的应用提供的动态口令以完成设置。"
|
||||||
step4: "从现在开始,任何登录操作都将要求您提供动态口令。"
|
step4: "从现在开始,任何登录操作都将要求您提供动态口令。"
|
||||||
@ -1009,7 +1057,9 @@ _widgets:
|
|||||||
slideshow: "幻灯片展示"
|
slideshow: "幻灯片展示"
|
||||||
button: "按钮"
|
button: "按钮"
|
||||||
onlineUsers: "在线用户"
|
onlineUsers: "在线用户"
|
||||||
|
jobQueue: "作业队列"
|
||||||
serverMetric: "服务器指标"
|
serverMetric: "服务器指标"
|
||||||
|
aiscript: "AiScript控制台"
|
||||||
_cw:
|
_cw:
|
||||||
hide: "隐藏"
|
hide: "隐藏"
|
||||||
show: "查看更多"
|
show: "查看更多"
|
||||||
@ -1484,7 +1534,7 @@ _notification:
|
|||||||
renote: "转发"
|
renote: "转发"
|
||||||
quote: "引用"
|
quote: "引用"
|
||||||
reaction: "回应"
|
reaction: "回应"
|
||||||
pollVote: "问卷调查已投票"
|
pollVote: "问卷调查被投票"
|
||||||
receiveFollowRequest: "收到关注请求"
|
receiveFollowRequest: "收到关注请求"
|
||||||
followRequestAccepted: "关注请求已接受"
|
followRequestAccepted: "关注请求已接受"
|
||||||
groupInvited: "加入群组邀请"
|
groupInvited: "加入群组邀请"
|
||||||
@ -1501,6 +1551,7 @@ _deck:
|
|||||||
swapDown: "向下移动"
|
swapDown: "向下移动"
|
||||||
stackLeft: "向左折叠"
|
stackLeft: "向左折叠"
|
||||||
popRight: "向右弹出"
|
popRight: "向右弹出"
|
||||||
|
profile: "个人资料"
|
||||||
_columns:
|
_columns:
|
||||||
main: "主列"
|
main: "主列"
|
||||||
widgets: "小工具"
|
widgets: "小工具"
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
---
|
---
|
||||||
_lang_: "繁體中文"
|
_lang_: "繁體中文"
|
||||||
introMisskey: "歡迎! Misskey是一個開源且去中心化的社群網絡。\n通過「箋文」分享周邊新鮮事,並告訴其他人您的想法!📡\n透過「情感」功能,對大家的箋文表達情感!👍\n一起來探索這個新的世界吧!🚀"
|
headlineMisskey: "貼文連繫網絡"
|
||||||
|
introMisskey: "歡迎! Misskey是一個開源且去中心化的社群網絡。\n通過「貼文」分享周邊新鮮事,並告訴其他人您的想法!📡\n透過「情感」功能,對大家的貼文表達情感!👍\n一起來探索這個新的世界吧!🚀"
|
||||||
monthAndDay: "{month}月 {day}日"
|
monthAndDay: "{month}月 {day}日"
|
||||||
search: "搜尋"
|
search: "搜尋"
|
||||||
notifications: "通知"
|
notifications: "通知"
|
||||||
@ -12,7 +13,7 @@ gotIt: "知道了"
|
|||||||
cancel: "取消"
|
cancel: "取消"
|
||||||
enterUsername: "輸入使用者名稱"
|
enterUsername: "輸入使用者名稱"
|
||||||
renotedBy: "{user} 轉發了"
|
renotedBy: "{user} 轉發了"
|
||||||
noNotes: "箋文不可用。"
|
noNotes: "貼文不可用。"
|
||||||
noNotifications: "沒有通知"
|
noNotifications: "沒有通知"
|
||||||
instance: "實例"
|
instance: "實例"
|
||||||
settings: "設定"
|
settings: "設定"
|
||||||
@ -30,19 +31,19 @@ uploading: "上傳中"
|
|||||||
save: "儲存"
|
save: "儲存"
|
||||||
users: "使用者"
|
users: "使用者"
|
||||||
addUser: "新增使用者"
|
addUser: "新增使用者"
|
||||||
favorite: "收藏"
|
favorite: "我的最愛"
|
||||||
favorites: "已收藏"
|
favorites: "我的最愛"
|
||||||
unfavorite: "取消收藏"
|
unfavorite: "從我的最愛中移除"
|
||||||
favorited: "已添加至收藏夾"
|
favorited: "已添加至我的最愛"
|
||||||
alreadyFavorited: "已經有添加入收藏夾過了"
|
alreadyFavorited: "我的最愛中已存在。"
|
||||||
cantFavorite: "無法添加至收藏夾"
|
cantFavorite: "無法加入至我的最愛。"
|
||||||
pin: "置頂"
|
pin: "置頂"
|
||||||
unpin: "取消置頂"
|
unpin: "取消置頂"
|
||||||
copyContent: "複製內容"
|
copyContent: "複製內容"
|
||||||
copyLink: "複製連結"
|
copyLink: "複製連結"
|
||||||
delete: "刪除"
|
delete: "刪除"
|
||||||
deleteAndEdit: "刪除並編輯"
|
deleteAndEdit: "刪除並編輯"
|
||||||
deleteAndEditConfirm: "要刪除並再次編輯嗎?此箋文的所有情感、轉發和回覆也將會消失。"
|
deleteAndEditConfirm: "要刪除並再次編輯嗎?此貼文的所有情感、轉發和回覆也將會消失。"
|
||||||
addToList: "新增至清單"
|
addToList: "新增至清單"
|
||||||
sendMessage: "發送訊息"
|
sendMessage: "發送訊息"
|
||||||
copyUsername: "複製用戶名"
|
copyUsername: "複製用戶名"
|
||||||
@ -61,14 +62,14 @@ import: "匯入"
|
|||||||
export: "匯出"
|
export: "匯出"
|
||||||
files: "檔案"
|
files: "檔案"
|
||||||
download: "下載"
|
download: "下載"
|
||||||
driveFileDeleteConfirm: "確定要刪除檔案「{name}」嗎?使用此附件的箋文也會跟著消失。\n"
|
driveFileDeleteConfirm: "確定要刪除檔案「{name}」嗎?使用此附件的貼文也會跟著消失。\n"
|
||||||
unfollowConfirm: "確定要取消追隨{name}嗎?"
|
unfollowConfirm: "確定要取消追隨{name}嗎?"
|
||||||
exportRequested: "已請求匯出。這可能會花一點時間。結束後檔案將會被放到雲端裡。"
|
exportRequested: "已請求匯出。這可能會花一點時間。結束後檔案將會被放到雲端裡。"
|
||||||
importRequested: "已請求匯入。這可能會花一點時間"
|
importRequested: "已請求匯入。這可能會花一點時間"
|
||||||
lists: "清單"
|
lists: "清單"
|
||||||
noLists: "你沒有任何清單"
|
noLists: "你沒有任何清單"
|
||||||
note: "箋文"
|
note: "貼文"
|
||||||
notes: "箋文"
|
notes: "貼文"
|
||||||
following: "追隨中"
|
following: "追隨中"
|
||||||
followers: "追隨者"
|
followers: "追隨者"
|
||||||
followsYou: "追隨你的人"
|
followsYou: "追隨你的人"
|
||||||
@ -89,13 +90,14 @@ followRequests: "追隨請求"
|
|||||||
unfollow: "取消追隨"
|
unfollow: "取消追隨"
|
||||||
followRequestPending: "追隨許可批准中"
|
followRequestPending: "追隨許可批准中"
|
||||||
enterEmoji: "輸入表情符號"
|
enterEmoji: "輸入表情符號"
|
||||||
renote: "轉箋"
|
renote: "轉發"
|
||||||
unrenote: "取消轉箋"
|
unrenote: "取消轉發"
|
||||||
renoted: "轉發成功"
|
renoted: "轉發成功"
|
||||||
cantRenote: "無法轉發此箋文。"
|
cantRenote: "無法轉發此貼文。"
|
||||||
cantReRenote: "無法轉發之前已經轉發過的內容"
|
cantReRenote: "無法轉發之前已經轉發過的內容"
|
||||||
quote: "引用"
|
quote: "引用"
|
||||||
pinnedNote: "已置頂的箋文"
|
pinnedNote: "已置頂的貼文"
|
||||||
|
pinned: "置頂"
|
||||||
you: "您"
|
you: "您"
|
||||||
clickToShow: "按一下以顯示"
|
clickToShow: "按一下以顯示"
|
||||||
sensitive: "敏感內容"
|
sensitive: "敏感內容"
|
||||||
@ -103,7 +105,7 @@ add: "新增"
|
|||||||
reaction: "情感"
|
reaction: "情感"
|
||||||
reactionSettingDescription: "置頂「反應」表情符號\n"
|
reactionSettingDescription: "置頂「反應」表情符號\n"
|
||||||
reactionSettingDescription2: "拖動以重新列序,點擊以刪除,按下 + 添加。"
|
reactionSettingDescription2: "拖動以重新列序,點擊以刪除,按下 + 添加。"
|
||||||
rememberNoteVisibility: "記住箋文可見性"
|
rememberNoteVisibility: "記住貼文可見性"
|
||||||
attachCancel: "移除附件"
|
attachCancel: "移除附件"
|
||||||
markAsSensitive: "標記為敏感內容"
|
markAsSensitive: "標記為敏感內容"
|
||||||
unmarkAsSensitive: "取消標記為敏感內容"
|
unmarkAsSensitive: "取消標記為敏感內容"
|
||||||
@ -162,6 +164,7 @@ storageUsage: "已使用容量"
|
|||||||
charts: "圖表"
|
charts: "圖表"
|
||||||
perHour: "每小時"
|
perHour: "每小時"
|
||||||
perDay: "每日"
|
perDay: "每日"
|
||||||
|
stopActivityDelivery: "停止發送活動"
|
||||||
blockThisInstance: "封鎖此實例"
|
blockThisInstance: "封鎖此實例"
|
||||||
operations: "操作"
|
operations: "操作"
|
||||||
software: "軟體"
|
software: "軟體"
|
||||||
@ -187,8 +190,8 @@ mutedUsers: "已靜音用戶"
|
|||||||
blockedUsers: "已封鎖用戶"
|
blockedUsers: "已封鎖用戶"
|
||||||
noUsers: "沒有任何使用者"
|
noUsers: "沒有任何使用者"
|
||||||
editProfile: "編輯個人檔案"
|
editProfile: "編輯個人檔案"
|
||||||
noteDeleteConfirm: "確定刪除此箋文嗎?"
|
noteDeleteConfirm: "確定刪除此貼文嗎?"
|
||||||
pinLimitExceeded: "不能置頂更多箋文了"
|
pinLimitExceeded: "不能置頂更多貼文了"
|
||||||
intro: "Misskey 部署完成!請開設管理員帳號!"
|
intro: "Misskey 部署完成!請開設管理員帳號!"
|
||||||
done: "完成"
|
done: "完成"
|
||||||
processing: "處理中"
|
processing: "處理中"
|
||||||
@ -309,7 +312,7 @@ integration: "整合"
|
|||||||
connectSerice: "連線"
|
connectSerice: "連線"
|
||||||
disconnectSerice: "中斷連線"
|
disconnectSerice: "中斷連線"
|
||||||
enableLocalTimeline: "開啟本地時間軸"
|
enableLocalTimeline: "開啟本地時間軸"
|
||||||
enableGlobalTimeline: "開啟全球時間軸"
|
enableGlobalTimeline: "啟用公開時間軸"
|
||||||
disablingTimelinesInfo: "即使您禁用了時間線功能,管理員和協調人仍可以繼續使用,以方便您。"
|
disablingTimelinesInfo: "即使您禁用了時間線功能,管理員和協調人仍可以繼續使用,以方便您。"
|
||||||
registration: "註冊"
|
registration: "註冊"
|
||||||
enableRegistration: "開啟新用戶註冊"
|
enableRegistration: "開啟新用戶註冊"
|
||||||
@ -326,7 +329,8 @@ pinnedUsers: "置頂用戶"
|
|||||||
pinnedUsersDescription: "在「發現」頁面中使用換行標記想要置頂的用戶。"
|
pinnedUsersDescription: "在「發現」頁面中使用換行標記想要置頂的用戶。"
|
||||||
pinnedPages: "釘選頁面"
|
pinnedPages: "釘選頁面"
|
||||||
pinnedPagesDescription: "輸入要固定至實例首頁的頁面路徑,以換行符分隔。"
|
pinnedPagesDescription: "輸入要固定至實例首頁的頁面路徑,以換行符分隔。"
|
||||||
pinnedNotes: "已置頂的箋文"
|
pinnedClipId: "置頂的摘錄ID"
|
||||||
|
pinnedNotes: "已置頂的貼文"
|
||||||
hcaptcha: "hCaptcha"
|
hcaptcha: "hCaptcha"
|
||||||
enableHcaptcha: "啟用 hCaptcha"
|
enableHcaptcha: "啟用 hCaptcha"
|
||||||
hcaptchaSiteKey: "網站金鑰"
|
hcaptchaSiteKey: "網站金鑰"
|
||||||
@ -343,15 +347,15 @@ antennaSource: "接收來源"
|
|||||||
antennaKeywords: "包含關鍵字"
|
antennaKeywords: "包含關鍵字"
|
||||||
antennaExcludeKeywords: "排除關鍵字"
|
antennaExcludeKeywords: "排除關鍵字"
|
||||||
antennaKeywordsDescription: "用空格分隔指定AND、用換行符分隔指定OR"
|
antennaKeywordsDescription: "用空格分隔指定AND、用換行符分隔指定OR"
|
||||||
notifyAntenna: "通知有新箋文"
|
notifyAntenna: "通知有新貼文"
|
||||||
withFileAntenna: "僅帶有附件的箋文"
|
withFileAntenna: "僅帶有附件的貼文"
|
||||||
serviceworker: "ServiceWorker"
|
serviceworker: "ServiceWorker"
|
||||||
enableServiceworker: "開啟 ServiceWorker"
|
enableServiceworker: "開啟 ServiceWorker"
|
||||||
antennaUsersDescription: "指定用換行符分隔的用戶名"
|
antennaUsersDescription: "指定用換行符分隔的用戶名"
|
||||||
caseSensitive: "區分大小寫"
|
caseSensitive: "區分大小寫"
|
||||||
withReplies: "包含回覆"
|
withReplies: "包含回覆"
|
||||||
connectedTo: "您的帳號已連接到以下社交帳號"
|
connectedTo: "您的帳號已連接到以下社交帳號"
|
||||||
notesAndReplies: "箋文與回覆"
|
notesAndReplies: "貼文與回覆"
|
||||||
withFiles: "附件"
|
withFiles: "附件"
|
||||||
silence: "禁言"
|
silence: "禁言"
|
||||||
silenceConfirm: "確定要禁言此用戶嗎?"
|
silenceConfirm: "確定要禁言此用戶嗎?"
|
||||||
@ -387,7 +391,7 @@ notFoundDescription: "找不到與指定URL回應的頁面"
|
|||||||
uploadFolder: "預設上傳資料夾"
|
uploadFolder: "預設上傳資料夾"
|
||||||
cacheClear: "清除快取"
|
cacheClear: "清除快取"
|
||||||
markAsReadAllNotifications: "標記所有通知為已讀"
|
markAsReadAllNotifications: "標記所有通知為已讀"
|
||||||
markAsReadAllUnreadNotes: "標記所有箋文為已讀"
|
markAsReadAllUnreadNotes: "標記所有貼文為已讀"
|
||||||
markAsReadAllTalkMessages: "標記所有訊息為已讀"
|
markAsReadAllTalkMessages: "標記所有訊息為已讀"
|
||||||
help: "幫助"
|
help: "幫助"
|
||||||
inputMessageHere: "在此輸入訊息"
|
inputMessageHere: "在此輸入訊息"
|
||||||
@ -408,9 +412,9 @@ text: "文字"
|
|||||||
enable: "啟用"
|
enable: "啟用"
|
||||||
next: "下一步"
|
next: "下一步"
|
||||||
retype: "重新輸入"
|
retype: "重新輸入"
|
||||||
noteOf: "{user}的箋文"
|
noteOf: "{user}的貼文"
|
||||||
inviteToGroup: "邀請至群組"
|
inviteToGroup: "邀請至群組"
|
||||||
maxNoteTextLength: "箋文的字數限制"
|
maxNoteTextLength: "貼文的字數限制"
|
||||||
quoteAttached: "引用"
|
quoteAttached: "引用"
|
||||||
quoteQuestion: "是否要引用?"
|
quoteQuestion: "是否要引用?"
|
||||||
noMessagesYet: "沒有訊息"
|
noMessagesYet: "沒有訊息"
|
||||||
@ -465,8 +469,10 @@ accountSettings: "帳號設定"
|
|||||||
promotion: "推廣"
|
promotion: "推廣"
|
||||||
promote: "推廣"
|
promote: "推廣"
|
||||||
numberOfDays: "有效天數"
|
numberOfDays: "有效天數"
|
||||||
hideThisNote: "隱藏此箋文"
|
hideThisNote: "隱藏此貼文"
|
||||||
showFeaturedNotesInTimeline: "在時間軸上顯示熱門推薦"
|
showFeaturedNotesInTimeline: "在時間軸上顯示熱門推薦"
|
||||||
|
objectStorage: "Object Storage (物件儲存)"
|
||||||
|
useObjectStorage: "使用Object Storage"
|
||||||
objectStorageBaseUrl: "Base URL"
|
objectStorageBaseUrl: "Base URL"
|
||||||
objectStorageBucket: "儲存空間(Bucket)"
|
objectStorageBucket: "儲存空間(Bucket)"
|
||||||
objectStoragePrefix: "前綴"
|
objectStoragePrefix: "前綴"
|
||||||
@ -478,8 +484,8 @@ objectStorageUseProxy: "使用網路代理"
|
|||||||
objectStorageSetPublicRead: "上載時設定為\"public-read\""
|
objectStorageSetPublicRead: "上載時設定為\"public-read\""
|
||||||
serverLogs: "伺服器日誌"
|
serverLogs: "伺服器日誌"
|
||||||
deleteAll: "刪除所有記錄"
|
deleteAll: "刪除所有記錄"
|
||||||
showFixedPostForm: "於時間軸頁頂顯示「發送箋文」方框"
|
showFixedPostForm: "於時間軸頁頂顯示「發送貼文」方框"
|
||||||
newNoteRecived: "發現新的箋文"
|
newNoteRecived: "發現新的貼文"
|
||||||
sounds: "音效"
|
sounds: "音效"
|
||||||
listen: "聆聽"
|
listen: "聆聽"
|
||||||
none: "無"
|
none: "無"
|
||||||
@ -521,7 +527,7 @@ addRelay: "添加中繼"
|
|||||||
inboxUrl: "私信URL"
|
inboxUrl: "私信URL"
|
||||||
addedRelays: "已添加的中繼"
|
addedRelays: "已添加的中繼"
|
||||||
serviceworkerInfo: "您需要啟用推送通知"
|
serviceworkerInfo: "您需要啟用推送通知"
|
||||||
deletedNote: "已删除的箋文"
|
deletedNote: "已删除的貼文"
|
||||||
invisibleNote: "隱藏的帖子"
|
invisibleNote: "隱藏的帖子"
|
||||||
enableInfiniteScroll: "啟用自動滾動頁面模式"
|
enableInfiniteScroll: "啟用自動滾動頁面模式"
|
||||||
visibility: "可見性"
|
visibility: "可見性"
|
||||||
@ -536,7 +542,6 @@ author: "作者"
|
|||||||
leaveConfirm: "有未保存的更改。要放棄嗎?"
|
leaveConfirm: "有未保存的更改。要放棄嗎?"
|
||||||
manage: "管理"
|
manage: "管理"
|
||||||
plugins: "插件"
|
plugins: "插件"
|
||||||
pluginInstallWarn: "請不要安裝來源不明的插件。"
|
|
||||||
deck: "多欄模式"
|
deck: "多欄模式"
|
||||||
undeck: "取消多欄模式"
|
undeck: "取消多欄模式"
|
||||||
useBlurEffectForModal: "在模態框使用模糊效果"
|
useBlurEffectForModal: "在模態框使用模糊效果"
|
||||||
@ -581,6 +586,7 @@ notificationSetting: "通知設定"
|
|||||||
notificationSettingDesc: "選擇顯示通知的類型"
|
notificationSettingDesc: "選擇顯示通知的類型"
|
||||||
useGlobalSetting: "使用全域設定"
|
useGlobalSetting: "使用全域設定"
|
||||||
other: "其他"
|
other: "其他"
|
||||||
|
regenerateLoginToken: "再生登入權杖"
|
||||||
regenerateLoginTokenDescription: "再生用於登入的內部權杖。一般情況下是不需要這樣做的。一旦再生,所有裝置將會被登出。"
|
regenerateLoginTokenDescription: "再生用於登入的內部權杖。一般情況下是不需要這樣做的。一旦再生,所有裝置將會被登出。"
|
||||||
fileIdOrUrl: "文檔ID或者URL"
|
fileIdOrUrl: "文檔ID或者URL"
|
||||||
chatOpenBehavior: "開啟聊天窗口時的行為"
|
chatOpenBehavior: "開啟聊天窗口時的行為"
|
||||||
@ -596,19 +602,21 @@ abuseMarkAsResolved: "處理完畢"
|
|||||||
openInNewTab: "在新分頁中開啟"
|
openInNewTab: "在新分頁中開啟"
|
||||||
openInSideView: "在側欄中開啟"
|
openInSideView: "在側欄中開啟"
|
||||||
editTheseSettingsMayBreakAccount: "修改這些設定可能會毀壞您的帳戶"
|
editTheseSettingsMayBreakAccount: "修改這些設定可能會毀壞您的帳戶"
|
||||||
instanceTicker: "箋文的實例來源"
|
instanceTicker: "貼文的實例來源"
|
||||||
waitingFor: "等待{x}"
|
waitingFor: "等待{x}"
|
||||||
random: "隨機"
|
random: "隨機"
|
||||||
system: "系統"
|
system: "系統"
|
||||||
switchUi: "切換界面"
|
switchUi: "切換界面"
|
||||||
desktop: "桌面"
|
desktop: "桌面"
|
||||||
clip: "片段"
|
clip: "摘錄"
|
||||||
createNew: "新建"
|
createNew: "新建"
|
||||||
optional: "可選"
|
optional: "可選"
|
||||||
|
createNewClip: "建立新摘錄"
|
||||||
public: "公開"
|
public: "公開"
|
||||||
i18nInfo: "Misskey已經被志願者們翻譯成各種語言版本,如果想要幫忙的話,可以進入{link}幫助翻譯。"
|
i18nInfo: "Misskey已經被志願者們翻譯成各種語言版本,如果想要幫忙的話,可以進入{link}幫助翻譯。"
|
||||||
|
manageAccessTokens: "管理存取權杖"
|
||||||
accountInfo: "帳戶資訊"
|
accountInfo: "帳戶資訊"
|
||||||
notesCount: "箋文數量"
|
notesCount: "貼文數量"
|
||||||
repliesCount: "回覆數量\n"
|
repliesCount: "回覆數量\n"
|
||||||
renotesCount: "轉發數量"
|
renotesCount: "轉發數量"
|
||||||
repliedCount: "回覆數量"
|
repliedCount: "回覆數量"
|
||||||
@ -617,27 +625,29 @@ followingCount: "正在跟隨的用戶數量"
|
|||||||
followersCount: "跟隨者數量"
|
followersCount: "跟隨者數量"
|
||||||
sentReactionsCount: "情感發送次數"
|
sentReactionsCount: "情感發送次數"
|
||||||
receivedReactionsCount: "情感收到次數"
|
receivedReactionsCount: "情感收到次數"
|
||||||
|
pollVotesCount: "已統計的投票數"
|
||||||
|
pollVotedCount: "已投票數"
|
||||||
yes: "確定"
|
yes: "確定"
|
||||||
no: "取消"
|
no: "取消"
|
||||||
driveFilesCount: "雲端硬碟檔案數量"
|
driveFilesCount: "雲端硬碟檔案數量"
|
||||||
driveUsage: "雲端硬碟使用量"
|
driveUsage: "雲端硬碟使用量"
|
||||||
noCrawleDescription: "請求網路搜尋引擎不要索引你的個人資料頁、箋文及頁面等。"
|
noCrawleDescription: "請求網路搜尋引擎不要索引你的個人資料頁、貼文及頁面等。"
|
||||||
lockedAccountInfo: "即使你通過了追隨者請求,除非你將箋文的可見性設定為 「追隨者」,否則任何人都能看見你的箋文。"
|
lockedAccountInfo: "即使你通過了追隨者請求,除非你將貼文的可見性設定為 「追隨者」,否則任何人都能看見你的貼文。"
|
||||||
loadRawImages: "以原始圖像質量顯示附件圖像的縮略圖"
|
loadRawImages: "以原始圖像質量顯示附件圖像的縮略圖"
|
||||||
disableShowingAnimatedImages: "不播放動態圖像"
|
disableShowingAnimatedImages: "不播放動態圖像"
|
||||||
notSet: "未設定"
|
notSet: "未設定"
|
||||||
emailVerified: "已成功驗證您的電郵"
|
emailVerified: "已成功驗證您的電郵"
|
||||||
noteFavoritesCount: "收藏箋文的數目"
|
noteFavoritesCount: "我的最愛貼文的數目"
|
||||||
pageLikesCount: "頁面被喜歡次數"
|
pageLikesCount: "頁面被喜歡次數"
|
||||||
pageLikedCount: "頁面被喜歡次數"
|
pageLikedCount: "頁面被喜歡次數"
|
||||||
contact: "聯絡人"
|
contact: "聯絡人"
|
||||||
useSystemFont: "使用系統默認的字型"
|
useSystemFont: "使用系統默認的字型"
|
||||||
clips: "標籤"
|
clips: "摘錄"
|
||||||
experimentalFeatures: "測試中的功能"
|
experimentalFeatures: "測試中的功能"
|
||||||
developer: "開發者"
|
developer: "開發者"
|
||||||
makeExplorable: "讓自己的帳戶能夠在“探索”版面顯示"
|
makeExplorable: "讓自己的帳戶能夠在“探索”版面顯示"
|
||||||
makeExplorableDescription: "如果關閉,帳戶將不會被顯示在\"探索\"版面中。"
|
makeExplorableDescription: "如果關閉,帳戶將不會被顯示在\"探索\"版面中。"
|
||||||
showGapBetweenNotesInTimeline: "分開顯示時間線上的箋文。"
|
showGapBetweenNotesInTimeline: "分開顯示時間線上的貼文。"
|
||||||
duplicate: "複製"
|
duplicate: "複製"
|
||||||
left: "左"
|
left: "左"
|
||||||
center: "向中央"
|
center: "向中央"
|
||||||
@ -648,6 +658,34 @@ showTitlebar: "顯示標題列"
|
|||||||
clearCache: "清除快取資料"
|
clearCache: "清除快取資料"
|
||||||
onlineUsersCount: "{n}人正在線上"
|
onlineUsersCount: "{n}人正在線上"
|
||||||
nUsers: "{n}用戶"
|
nUsers: "{n}用戶"
|
||||||
|
nNotes: "{n}貼文"
|
||||||
|
myTheme: "我的佈景主題"
|
||||||
|
backgroundColor: "背景"
|
||||||
|
accentColor: "重點色彩"
|
||||||
|
textColor: "文本"
|
||||||
|
advanced: "進階"
|
||||||
|
value: "數值 "
|
||||||
|
updatedAt: "最後更新"
|
||||||
|
saveConfirm: "您要儲存變更嗎?"
|
||||||
|
deleteConfirm: "你確定要刪除嗎?"
|
||||||
|
invalidValue: "輸入值無效。"
|
||||||
|
registry: "登錄表"
|
||||||
|
closeAccount: "停用帳戶"
|
||||||
|
currentVersion: "當前版本"
|
||||||
|
latestVersion: "最新版本"
|
||||||
|
newVersionOfClientAvailable: "新版本的用戶端可用。"
|
||||||
|
usageAmount: "使用量"
|
||||||
|
capacity: "容量"
|
||||||
|
inUse: "已使用"
|
||||||
|
_email:
|
||||||
|
_follow:
|
||||||
|
title: "您有新的追隨者"
|
||||||
|
_registry:
|
||||||
|
scope: "範圍"
|
||||||
|
key: "機碼"
|
||||||
|
keys: "機碼"
|
||||||
|
domain: "域"
|
||||||
|
createKey: "新增機碼"
|
||||||
_aboutMisskey:
|
_aboutMisskey:
|
||||||
about: "Misskey是由syuilo於2014年開發的開源軟件。"
|
about: "Misskey是由syuilo於2014年開發的開源軟件。"
|
||||||
contributors: "主要貢獻者"
|
contributors: "主要貢獻者"
|
||||||
@ -663,12 +701,19 @@ _nsfw:
|
|||||||
force: "隱藏所有內容"
|
force: "隱藏所有內容"
|
||||||
_mfm:
|
_mfm:
|
||||||
cheatSheet: "MFM代碼小抄"
|
cheatSheet: "MFM代碼小抄"
|
||||||
|
intro: "MFM是Misskey專用的標記語言,可以在Misskey中的各個位置使用。 您可以這裏看到MFM可用語法列表。"
|
||||||
mention: "提及"
|
mention: "提及"
|
||||||
hashtag: "#tag"
|
hashtag: "#tag"
|
||||||
url: "URL"
|
url: "URL"
|
||||||
link: "鏈接"
|
link: "鏈接"
|
||||||
bold: "粗體"
|
bold: "粗體"
|
||||||
|
small: "縮小"
|
||||||
center: "置中"
|
center: "置中"
|
||||||
|
inlineCode: "程式碼(内嵌)"
|
||||||
|
blockCode: "程式碼(區塊)"
|
||||||
|
inlineMath: "數學公式(內嵌)"
|
||||||
|
inlineMathDescription: "顯示內嵌的KaTex數學公式。"
|
||||||
|
blockMath: "數學公式(方塊)"
|
||||||
quote: "引用"
|
quote: "引用"
|
||||||
emoji: "自訂表情符號"
|
emoji: "自訂表情符號"
|
||||||
search: "搜尋"
|
search: "搜尋"
|
||||||
@ -676,11 +721,18 @@ _mfm:
|
|||||||
flipDescription: "將內容上下或左右翻轉。"
|
flipDescription: "將內容上下或左右翻轉。"
|
||||||
jelly: "動畫(果凍)"
|
jelly: "動畫(果凍)"
|
||||||
jellyDescription: "顯示果凍一樣的動畫效果。"
|
jellyDescription: "顯示果凍一樣的動畫效果。"
|
||||||
|
jump: "動畫(跳動)"
|
||||||
bounce: "動畫(反彈)"
|
bounce: "動畫(反彈)"
|
||||||
shake: "動畫(搖晃)"
|
shake: "動畫(搖晃)"
|
||||||
twitch: "動畫(顫抖)"
|
twitch: "動畫(顫抖)"
|
||||||
|
twitchDescription: "顯示強烈顫抖的動畫效果。"
|
||||||
spin: "動畫(旋轉)"
|
spin: "動畫(旋轉)"
|
||||||
spinDescription: "顯示旋轉的動畫效果。"
|
spinDescription: "顯示旋轉的動畫效果。"
|
||||||
|
x2: "大"
|
||||||
|
x3: "較大"
|
||||||
|
x3Description: "放大顯示內容。"
|
||||||
|
x4: "最大"
|
||||||
|
x4Description: "將顯示內容放至最大。"
|
||||||
blur: "模糊"
|
blur: "模糊"
|
||||||
font: "字型"
|
font: "字型"
|
||||||
fontDescription: "可設置顯示內容所使用的字型"
|
fontDescription: "可設置顯示內容所使用的字型"
|
||||||
@ -703,6 +755,7 @@ _reversi:
|
|||||||
turnOf: "{name}的回合"
|
turnOf: "{name}的回合"
|
||||||
pastTurnOf: "{name}的回合"
|
pastTurnOf: "{name}的回合"
|
||||||
surrender: "認輸"
|
surrender: "認輸"
|
||||||
|
surrendered: "對手認輸"
|
||||||
drawn: "平局"
|
drawn: "平局"
|
||||||
won: "{name}獲勝"
|
won: "{name}獲勝"
|
||||||
black: "黑"
|
black: "黑"
|
||||||
@ -737,8 +790,8 @@ _sidebar:
|
|||||||
hide: "隱藏"
|
hide: "隱藏"
|
||||||
_wordMute:
|
_wordMute:
|
||||||
muteWords: "加入靜音文字"
|
muteWords: "加入靜音文字"
|
||||||
softDescription: "隱藏時間軸中指定條件的箋文。"
|
softDescription: "隱藏時間軸中指定條件的貼文。"
|
||||||
mutedNotes: "已靜音的箋文"
|
mutedNotes: "已靜音的貼文"
|
||||||
_theme:
|
_theme:
|
||||||
explore: "取得佈景主題"
|
explore: "取得佈景主題"
|
||||||
install: "安裝佈景主題"
|
install: "安裝佈景主題"
|
||||||
@ -756,7 +809,7 @@ _theme:
|
|||||||
color: "顏色"
|
color: "顏色"
|
||||||
func: "函数"
|
func: "函数"
|
||||||
funcKind: "功能類型"
|
funcKind: "功能類型"
|
||||||
argument: "引數"
|
argument: "參數"
|
||||||
alpha: "透明度"
|
alpha: "透明度"
|
||||||
darken: "暗度"
|
darken: "暗度"
|
||||||
lighten: "亮度"
|
lighten: "亮度"
|
||||||
@ -769,7 +822,7 @@ _theme:
|
|||||||
hashtag: "#tag"
|
hashtag: "#tag"
|
||||||
mention: "提及"
|
mention: "提及"
|
||||||
mentionMe: "提及我"
|
mentionMe: "提及我"
|
||||||
renote: "轉發箋文"
|
renote: "轉發貼文"
|
||||||
divider: "分割線"
|
divider: "分割線"
|
||||||
scrollbarHandle: "滾動條"
|
scrollbarHandle: "滾動條"
|
||||||
scrollbarHandleHover: "滾動條 (漂浮)"
|
scrollbarHandleHover: "滾動條 (漂浮)"
|
||||||
@ -786,13 +839,14 @@ _theme:
|
|||||||
inputBorder: "輸入框邊框"
|
inputBorder: "輸入框邊框"
|
||||||
listItemHoverBg: "列表物品背景 (漂浮)"
|
listItemHoverBg: "列表物品背景 (漂浮)"
|
||||||
driveFolderBg: "雲端硬碟文件夾背景"
|
driveFolderBg: "雲端硬碟文件夾背景"
|
||||||
|
badge: "獎章"
|
||||||
messageBg: "私信背景"
|
messageBg: "私信背景"
|
||||||
accentDarken: "強調色(偏暗)"
|
accentDarken: "強調色(偏暗)"
|
||||||
accentLighten: "強調色(明亮)"
|
accentLighten: "強調色(明亮)"
|
||||||
fgHighlighted: "高亮顯示文本"
|
fgHighlighted: "高亮顯示文本"
|
||||||
_sfx:
|
_sfx:
|
||||||
note: "箋文"
|
note: "貼文"
|
||||||
noteMy: "我的箋文"
|
noteMy: "我的貼文"
|
||||||
notification: "通知"
|
notification: "通知"
|
||||||
chat: "傳送訊息"
|
chat: "傳送訊息"
|
||||||
antenna: "天線接收"
|
antenna: "天線接收"
|
||||||
@ -816,22 +870,22 @@ _time:
|
|||||||
_tutorial:
|
_tutorial:
|
||||||
title: "Misskey使用方法"
|
title: "Misskey使用方法"
|
||||||
step1_1: "歡迎!"
|
step1_1: "歡迎!"
|
||||||
step1_2: "此為「時間軸」頁面,它會按照時間順序顯示你「追隨」的人發出的「箋文」"
|
step1_2: "此為「時間軸」頁面,它會按照時間順序顯示你「追隨」的人發出的「貼文」"
|
||||||
step1_3: "由於你沒有發佈任何箋文,也沒有追隨任何人,所以你的時間軸目前是空的。"
|
step1_3: "由於你沒有發佈任何貼文,也沒有追隨任何人,所以你的時間軸目前是空的。"
|
||||||
step2_1: "在發文或追隨其他人之前先讓我們設定一下個人資料吧。"
|
step2_1: "在發文或追隨其他人之前先讓我們設定一下個人資料吧。"
|
||||||
step2_2: "提供一些關於自己的資訊來讓其他人更有追隨你的意願。"
|
step2_2: "提供一些關於自己的資訊來讓其他人更有追隨你的意願。"
|
||||||
step3_1: "個人資料都打理好了嗎?"
|
step3_1: "個人資料都打理好了嗎?"
|
||||||
step3_2: "下一步讓我們來試試看發個文,按一下畫面上的鉛筆圖示來開始"
|
step3_2: "下一步讓我們來試試看發個文,按一下畫面上的鉛筆圖示來開始"
|
||||||
step3_3: "輸入完內容後,按視窗右上角的按鈕來發文"
|
step3_3: "輸入完內容後,按視窗右上角的按鈕來發文"
|
||||||
step3_4: "不知道該寫什麼內容嗎?試試看「開始使用Misskey了」如何。"
|
step3_4: "不知道該寫什麼內容嗎?試試看「開始使用Misskey了」如何。"
|
||||||
step4_1: "箋文發出去了嗎?"
|
step4_1: "貼文發出去了嗎?"
|
||||||
step4_2: "如果你的箋文出現在時間軸上,就代表發文成功。"
|
step4_2: "如果你的貼文出現在時間軸上,就代表發文成功。"
|
||||||
step5_1: "現在試試看追隨其他人來讓你的時間軸變得更生動吧。"
|
step5_1: "現在試試看追隨其他人來讓你的時間軸變得更生動吧。"
|
||||||
step5_2: "你會在{featured}上看到受歡迎的箋文,你也可以從列表中追隨你喜歡的人,或者在{explore}上找到熱門使用者。"
|
step5_2: "你會在{featured}上看到受歡迎的貼文,你也可以從列表中追隨你喜歡的人,或者在{explore}上找到熱門使用者。"
|
||||||
step5_3: "想要追隨其他人,只要點擊他們的頭像並按「追隨」即可。"
|
step5_3: "想要追隨其他人,只要點擊他們的頭像並按「追隨」即可。"
|
||||||
step5_4: "如果使用者的名字旁有鎖頭的圖示,代表他們需要手動核准你的追隨請求。"
|
step5_4: "如果使用者的名字旁有鎖頭的圖示,代表他們需要手動核准你的追隨請求。"
|
||||||
step6_1: "現在你可以在時間軸上看到其他用戶的箋文。"
|
step6_1: "現在你可以在時間軸上看到其他用戶的貼文。"
|
||||||
step6_2: "你也可以對別人的箋文作出「情感」,作出簡單的回覆。"
|
step6_2: "你也可以對別人的貼文作出「情感」,作出簡單的回覆。"
|
||||||
step7_1: "以上為Misskey的基本操作說明,教學在此告一段落。辛苦了。"
|
step7_1: "以上為Misskey的基本操作說明,教學在此告一段落。辛苦了。"
|
||||||
step7_2: "歡迎到{help}來瞭解更多Misskey相關介紹。"
|
step7_2: "歡迎到{help}來瞭解更多Misskey相關介紹。"
|
||||||
step7_3: "那麼,祝您在Misskey玩的開心~ 🚀"
|
step7_3: "那麼,祝您在Misskey玩的開心~ 🚀"
|
||||||
@ -847,14 +901,14 @@ _permissions:
|
|||||||
"write:blocks": "編輯已封鎖用戶名單"
|
"write:blocks": "編輯已封鎖用戶名單"
|
||||||
"read:drive": "存取雲端硬碟\n"
|
"read:drive": "存取雲端硬碟\n"
|
||||||
"write:drive": "編輯雲端硬碟的檔案"
|
"write:drive": "編輯雲端硬碟的檔案"
|
||||||
"read:favorites": "瀏覽已收藏"
|
"read:favorites": "瀏覽我的最愛"
|
||||||
"write:favorites": "編輯收藏清單"
|
"write:favorites": "編輯我的最愛列表"
|
||||||
"write:following": "追隨/解除追隨"
|
"write:following": "追隨/解除追隨"
|
||||||
"read:messaging": "顯示訊息"
|
"read:messaging": "顯示訊息"
|
||||||
"write:messaging": "撰寫或刪除私人訊息"
|
"write:messaging": "撰寫或刪除私人訊息"
|
||||||
"read:mutes": "顯示已靜音列表"
|
"read:mutes": "顯示已靜音列表"
|
||||||
"write:mutes": "編輯已靜音列表"
|
"write:mutes": "編輯已靜音列表"
|
||||||
"write:notes": "撰寫或刪除箋文"
|
"write:notes": "撰寫或刪除貼文"
|
||||||
"read:notifications": "查看通知"
|
"read:notifications": "查看通知"
|
||||||
"write:notifications": "編輯通知"
|
"write:notifications": "編輯通知"
|
||||||
"read:reactions": "查看情感"
|
"read:reactions": "查看情感"
|
||||||
@ -876,11 +930,11 @@ _auth:
|
|||||||
callback: "回到應用程式"
|
callback: "回到應用程式"
|
||||||
denied: "拒絕訪問"
|
denied: "拒絕訪問"
|
||||||
_antennaSources:
|
_antennaSources:
|
||||||
all: "全部箋文"
|
all: "全部貼文"
|
||||||
homeTimeline: "來自已追隨使用者的箋文"
|
homeTimeline: "來自已追隨使用者的貼文"
|
||||||
users: "來自特定使用者的箋文"
|
users: "來自特定使用者的貼文"
|
||||||
userList: "來自特定清單中的箋文"
|
userList: "來自特定清單中的貼文"
|
||||||
userGroup: "來自特定群組的箋文"
|
userGroup: "來自特定群組的貼文"
|
||||||
_weekday:
|
_weekday:
|
||||||
sunday: "週日"
|
sunday: "週日"
|
||||||
monday: "週一"
|
monday: "週一"
|
||||||
@ -894,17 +948,18 @@ _widgets:
|
|||||||
notifications: "通知"
|
notifications: "通知"
|
||||||
timeline: "時間軸"
|
timeline: "時間軸"
|
||||||
calendar: "行事曆"
|
calendar: "行事曆"
|
||||||
trends: "發燒箋文"
|
trends: "發燒貼文"
|
||||||
clock: "時鐘"
|
clock: "時鐘"
|
||||||
rss: "RSS閱讀器"
|
rss: "RSS閱讀器"
|
||||||
activity: "動態"
|
activity: "動態"
|
||||||
photos: "照片"
|
photos: "照片"
|
||||||
digitalClock: "電子時鐘"
|
digitalClock: "電子時鐘"
|
||||||
federation: "聯邦宇宙"
|
federation: "聯邦宇宙"
|
||||||
postForm: "篆文窗口"
|
postForm: "發佈窗口"
|
||||||
slideshow: "幻燈片"
|
slideshow: "幻燈片"
|
||||||
button: "按鈕"
|
button: "按鈕"
|
||||||
onlineUsers: "在線上的用戶"
|
onlineUsers: "在線上的用戶"
|
||||||
|
jobQueue: "佇列"
|
||||||
_cw:
|
_cw:
|
||||||
hide: "隱藏"
|
hide: "隱藏"
|
||||||
show: "瀏覽更多"
|
show: "瀏覽更多"
|
||||||
@ -928,6 +983,7 @@ _poll:
|
|||||||
closed: "已結束"
|
closed: "已結束"
|
||||||
remainingDays: "{d}天{h}小時後結束"
|
remainingDays: "{d}天{h}小時後結束"
|
||||||
remainingHours: "{h}小時{m}分後結束"
|
remainingHours: "{h}小時{m}分後結束"
|
||||||
|
remainingSeconds: "{s}秒後截止"
|
||||||
_visibility:
|
_visibility:
|
||||||
public: "公開"
|
public: "公開"
|
||||||
home: "首頁"
|
home: "首頁"
|
||||||
@ -937,8 +993,8 @@ _visibility:
|
|||||||
localOnly: "僅限本地"
|
localOnly: "僅限本地"
|
||||||
localOnlyDescription: "對遠端使用者隱藏"
|
localOnlyDescription: "對遠端使用者隱藏"
|
||||||
_postForm:
|
_postForm:
|
||||||
replyPlaceholder: "回覆此箋文..."
|
replyPlaceholder: "回覆此貼文..."
|
||||||
quotePlaceholder: "引用此箋文..."
|
quotePlaceholder: "引用此貼文..."
|
||||||
channelPlaceholder: "發佈到頻道"
|
channelPlaceholder: "發佈到頻道"
|
||||||
_placeholders:
|
_placeholders:
|
||||||
a: "今天過得如何?"
|
a: "今天過得如何?"
|
||||||
@ -952,10 +1008,12 @@ _profile:
|
|||||||
username: "使用者名稱"
|
username: "使用者名稱"
|
||||||
description: "關於我"
|
description: "關於我"
|
||||||
youCanIncludeHashtags: "你也可以在「關於我」中加上 #tag"
|
youCanIncludeHashtags: "你也可以在「關於我」中加上 #tag"
|
||||||
|
metadata: "進階資訊"
|
||||||
|
metadataEdit: "編輯進階資訊"
|
||||||
metadataLabel: "標籤"
|
metadataLabel: "標籤"
|
||||||
metadataContent: "内容"
|
metadataContent: "内容"
|
||||||
_exportOrImport:
|
_exportOrImport:
|
||||||
allNotes: "所有箋文"
|
allNotes: "所有貼文"
|
||||||
followingList: "追隨中"
|
followingList: "追隨中"
|
||||||
muteList: "靜音"
|
muteList: "靜音"
|
||||||
blockingList: "封鎖"
|
blockingList: "封鎖"
|
||||||
@ -964,10 +1022,10 @@ _charts:
|
|||||||
usersIncDec: "使用者増減"
|
usersIncDec: "使用者増減"
|
||||||
usersTotal: "使用者合共"
|
usersTotal: "使用者合共"
|
||||||
activeUsers: "活躍使用者"
|
activeUsers: "活躍使用者"
|
||||||
notesIncDec: "箋文増減"
|
notesIncDec: "貼文増減"
|
||||||
localNotesIncDec: "本地箋文増減"
|
localNotesIncDec: "本地貼文増減"
|
||||||
remoteNotesIncDec: "遠端箋文數目增减"
|
remoteNotesIncDec: "遠端貼文數目增减"
|
||||||
notesTotal: "箋文合共"
|
notesTotal: "貼文合共"
|
||||||
filesIncDec: "檔案増減"
|
filesIncDec: "檔案増減"
|
||||||
filesTotal: "累計檔案"
|
filesTotal: "累計檔案"
|
||||||
storageUsageIncDec: "儲存空間的増減"
|
storageUsageIncDec: "儲存空間的増減"
|
||||||
@ -976,8 +1034,8 @@ _instanceCharts:
|
|||||||
requests: "請求"
|
requests: "請求"
|
||||||
users: "使用者増減"
|
users: "使用者増減"
|
||||||
usersTotal: "總計使用者"
|
usersTotal: "總計使用者"
|
||||||
notes: "箋文増減"
|
notes: "貼文増減"
|
||||||
notesTotal: "累計箋文"
|
notesTotal: "累計貼文"
|
||||||
ff: "追隨/追隨者的増減"
|
ff: "追隨/追隨者的増減"
|
||||||
ffTotal: "追隨/追隨者累計"
|
ffTotal: "追隨/追隨者累計"
|
||||||
cacheSize: "增加或減少快取用量"
|
cacheSize: "增加或減少快取用量"
|
||||||
@ -988,7 +1046,7 @@ _timelines:
|
|||||||
home: "首頁"
|
home: "首頁"
|
||||||
local: "本地"
|
local: "本地"
|
||||||
social: "社群"
|
social: "社群"
|
||||||
global: "全域"
|
global: "公開"
|
||||||
_rooms:
|
_rooms:
|
||||||
roomOf: "{user}的房間"
|
roomOf: "{user}的房間"
|
||||||
addFurniture: "擺放家具"
|
addFurniture: "擺放家具"
|
||||||
@ -1025,17 +1083,24 @@ _rooms:
|
|||||||
book: "讀物"
|
book: "讀物"
|
||||||
book2: "讀物2"
|
book2: "讀物2"
|
||||||
piano: "鋼琴"
|
piano: "鋼琴"
|
||||||
|
server: "伺服器"
|
||||||
moon: "月亮"
|
moon: "月亮"
|
||||||
corkboard: "木栓板"
|
corkboard: "木栓板"
|
||||||
mousepad: "滑鼠墊"
|
mousepad: "滑鼠墊"
|
||||||
monitor: "監視器"
|
monitor: "監視器"
|
||||||
keyboard: "鍵盤"
|
keyboard: "鍵盤"
|
||||||
carpet-stripe: "條紋地毯"
|
carpet-stripe: "條紋地毯"
|
||||||
|
mat: "地毯"
|
||||||
|
color-box: "層架"
|
||||||
wall-clock: "壁鐘"
|
wall-clock: "壁鐘"
|
||||||
photoframe: "相框"
|
photoframe: "相框"
|
||||||
cube: "立方體"
|
cube: "立方體"
|
||||||
tv: "電視"
|
tv: "電視"
|
||||||
pinguin: "企鵝蠟像"
|
pinguin: "企鵝蠟像"
|
||||||
|
poster-h: "海報(橫向)"
|
||||||
|
poster-v: "海報(直向)"
|
||||||
|
sofa: " 沙發"
|
||||||
|
spiral: "螺旋式樓梯"
|
||||||
bin: "垃圾箱"
|
bin: "垃圾箱"
|
||||||
cup-noodle: "杯面"
|
cup-noodle: "杯面"
|
||||||
holo-display: "投影機"
|
holo-display: "投影機"
|
||||||
@ -1083,18 +1148,19 @@ _pages:
|
|||||||
inputBlocks: "輸入"
|
inputBlocks: "輸入"
|
||||||
specialBlocks: "特殊"
|
specialBlocks: "特殊"
|
||||||
blocks:
|
blocks:
|
||||||
text: "文本"
|
text: "字串"
|
||||||
textarea: "文字區域"
|
textarea: "字串區域"
|
||||||
section: "區段"
|
section: "區段"
|
||||||
image: "圖片"
|
image: "圖片"
|
||||||
button: "按鈕"
|
button: "按鈕"
|
||||||
if: "如果"
|
if: "如果"
|
||||||
_if:
|
_if:
|
||||||
variable: "變數"
|
variable: "變數"
|
||||||
|
post: "發佈窗口"
|
||||||
_post:
|
_post:
|
||||||
text: "内容"
|
text: "内容"
|
||||||
canvasId: "畫布ID"
|
canvasId: "畫布ID"
|
||||||
textInput: "插入文字"
|
textInput: "插入字串"
|
||||||
_textInput:
|
_textInput:
|
||||||
name: "變數名稱"
|
name: "變數名稱"
|
||||||
text: "標題"
|
text: "標題"
|
||||||
@ -1114,9 +1180,9 @@ _pages:
|
|||||||
id: "畫布ID"
|
id: "畫布ID"
|
||||||
width: "寬度"
|
width: "寬度"
|
||||||
height: "高度"
|
height: "高度"
|
||||||
note: "嵌式箋文"
|
note: "嵌式貼文"
|
||||||
_note:
|
_note:
|
||||||
id: "箋文ID"
|
id: "貼文ID"
|
||||||
detailed: "顯示詳細內容"
|
detailed: "顯示詳細內容"
|
||||||
switch: "開關"
|
switch: "開關"
|
||||||
_switch:
|
_switch:
|
||||||
@ -1150,6 +1216,7 @@ _pages:
|
|||||||
default: "預設值"
|
default: "預設值"
|
||||||
script:
|
script:
|
||||||
categories:
|
categories:
|
||||||
|
flow: "控制"
|
||||||
logical: "邏輯運算"
|
logical: "邏輯運算"
|
||||||
operation: "計算"
|
operation: "計算"
|
||||||
comparison: "對比"
|
comparison: "對比"
|
||||||
@ -1160,18 +1227,23 @@ _pages:
|
|||||||
convert: "轉換"
|
convert: "轉換"
|
||||||
list: "清單"
|
list: "清單"
|
||||||
blocks:
|
blocks:
|
||||||
text: "文本"
|
text: "字串"
|
||||||
multiLineText: "文本 (多行)"
|
multiLineText: "字串(多行)"
|
||||||
textList: "文本列表"
|
textList: "字串串列"
|
||||||
|
strLen: "字串長度"
|
||||||
_strLen:
|
_strLen:
|
||||||
arg1: "文本"
|
arg1: "字串"
|
||||||
|
strPick: "提取字元"
|
||||||
_strPick:
|
_strPick:
|
||||||
arg1: "文本"
|
arg1: "字串"
|
||||||
arg2: "字元位置"
|
arg2: "字元位置"
|
||||||
|
strReplace: "替換字串"
|
||||||
_strReplace:
|
_strReplace:
|
||||||
arg1: "文本"
|
arg1: "字串"
|
||||||
|
strReverse: "倒轉字串"
|
||||||
_strReverse:
|
_strReverse:
|
||||||
arg1: "本文"
|
arg1: "字串"
|
||||||
|
join: "合併字串"
|
||||||
_join:
|
_join:
|
||||||
arg1: "清單"
|
arg1: "清單"
|
||||||
arg2: "分隔字元"
|
arg2: "分隔字元"
|
||||||
@ -1267,7 +1339,7 @@ _pages:
|
|||||||
arg1: "種子"
|
arg1: "種子"
|
||||||
arg2: "清單"
|
arg2: "清單"
|
||||||
_DRPWPM:
|
_DRPWPM:
|
||||||
arg1: "文本列表"
|
arg1: "字串串列"
|
||||||
pick: "從清單中選取"
|
pick: "從清單中選取"
|
||||||
_pick:
|
_pick:
|
||||||
arg1: "清單"
|
arg1: "清單"
|
||||||
@ -1276,26 +1348,29 @@ _pages:
|
|||||||
_listLen:
|
_listLen:
|
||||||
arg1: "清單"
|
arg1: "清單"
|
||||||
number: "數值"
|
number: "數值"
|
||||||
|
stringToNumber: "將字串轉換至數値"
|
||||||
_stringToNumber:
|
_stringToNumber:
|
||||||
arg1: "文字"
|
arg1: "字串"
|
||||||
|
numberToString: "將數値轉換至字串"
|
||||||
_numberToString:
|
_numberToString:
|
||||||
arg1: "數值"
|
arg1: "數值"
|
||||||
|
splitStrByLine: "於換行時分割字串"
|
||||||
_splitStrByLine:
|
_splitStrByLine:
|
||||||
arg1: "文本"
|
arg1: "字串"
|
||||||
ref: "變數"
|
ref: "變數"
|
||||||
aiScriptVar: "AiScript的變數"
|
aiScriptVar: "AiScript的變數"
|
||||||
fn: "函数"
|
fn: "函数"
|
||||||
_fn:
|
_fn:
|
||||||
slots: "欄位"
|
|
||||||
arg1: "輸出"
|
arg1: "輸出"
|
||||||
_for:
|
_for:
|
||||||
arg1: "重複次數"
|
arg1: "重複次數"
|
||||||
arg2: "處理"
|
arg2: "處理"
|
||||||
types:
|
types:
|
||||||
string: "文字"
|
string: "字串"
|
||||||
number: "数值"
|
number: "数值"
|
||||||
|
boolean: "標記"
|
||||||
array: "清單"
|
array: "清單"
|
||||||
stringArray: "文本列表"
|
stringArray: "字串列表"
|
||||||
enviromentVariables: "環境變數"
|
enviromentVariables: "環境變數"
|
||||||
pageVariables: "頁面元素"
|
pageVariables: "頁面元素"
|
||||||
_relayStatus:
|
_relayStatus:
|
||||||
@ -1306,7 +1381,7 @@ _notification:
|
|||||||
youGotMention: "{name}提及到您"
|
youGotMention: "{name}提及到您"
|
||||||
youGotReply: "{name}回覆了您"
|
youGotReply: "{name}回覆了您"
|
||||||
youGotQuote: "{name}引用了您"
|
youGotQuote: "{name}引用了您"
|
||||||
youRenoted: "{name} 轉發了你的箋文"
|
youRenoted: "{name} 轉發了你的貼文"
|
||||||
youGotPoll: "{name}已投票"
|
youGotPoll: "{name}已投票"
|
||||||
youGotMessagingMessageFromUser: "{name}發送給您的訊息"
|
youGotMessagingMessageFromUser: "{name}發送給您的訊息"
|
||||||
youWereFollowed: "您有新的追隨者"
|
youWereFollowed: "您有新的追隨者"
|
||||||
@ -1318,9 +1393,10 @@ _notification:
|
|||||||
follow: "追隨中"
|
follow: "追隨中"
|
||||||
mention: "提及"
|
mention: "提及"
|
||||||
reply: "回覆"
|
reply: "回覆"
|
||||||
renote: "轉發箋文"
|
renote: "轉發貼文"
|
||||||
quote: "引用"
|
quote: "引用"
|
||||||
reaction: "情感"
|
reaction: "情感"
|
||||||
|
pollVote: "統計已投票數"
|
||||||
receiveFollowRequest: "已收到追隨請求"
|
receiveFollowRequest: "已收到追隨請求"
|
||||||
followRequestAccepted: "追隨請求已接受"
|
followRequestAccepted: "追隨請求已接受"
|
||||||
groupInvited: "加入社群邀請"
|
groupInvited: "加入社群邀請"
|
||||||
@ -1329,6 +1405,7 @@ _deck:
|
|||||||
alwaysShowMainColumn: "總是顯示主欄"
|
alwaysShowMainColumn: "總是顯示主欄"
|
||||||
columnAlign: "對齊欄位"
|
columnAlign: "對齊欄位"
|
||||||
columnMargin: "列之間的邊距"
|
columnMargin: "列之間的邊距"
|
||||||
|
columnHeaderHeight: "欄位標題高度"
|
||||||
addColumn: "新增欄位"
|
addColumn: "新增欄位"
|
||||||
swapLeft: "向左移動"
|
swapLeft: "向左移動"
|
||||||
swapRight: "向右移動"
|
swapRight: "向右移動"
|
||||||
@ -1336,6 +1413,7 @@ _deck:
|
|||||||
swapDown: "往下移動"
|
swapDown: "往下移動"
|
||||||
stackLeft: "向左折疊"
|
stackLeft: "向左折疊"
|
||||||
popRight: "向右彈出"
|
popRight: "向右彈出"
|
||||||
|
profile: "個人檔案"
|
||||||
_columns:
|
_columns:
|
||||||
main: "主列"
|
main: "主列"
|
||||||
widgets: "小工具"
|
widgets: "小工具"
|
||||||
|
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`);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
138
package.json
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "misskey",
|
"name": "misskey",
|
||||||
"author": "syuilo <syuilotan@yahoo.co.jp>",
|
"author": "syuilo <syuilotan@yahoo.co.jp>",
|
||||||
"version": "12.66.0",
|
"version": "12.71.0",
|
||||||
"codename": "indigo",
|
"codename": "indigo",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
@ -35,34 +35,36 @@
|
|||||||
"lodash": "^4.17.20"
|
"lodash": "^4.17.20"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/plugin-transform-runtime": "7.12.1",
|
"@babel/plugin-transform-runtime": "7.12.15",
|
||||||
"@elastic/elasticsearch": "7.10.0",
|
"@elastic/elasticsearch": "7.10.0",
|
||||||
"@fortawesome/fontawesome-svg-core": "1.2.32",
|
"@fortawesome/fontawesome-svg-core": "1.2.34",
|
||||||
"@fortawesome/free-brands-svg-icons": "5.15.1",
|
"@fortawesome/free-brands-svg-icons": "5.15.2",
|
||||||
"@fortawesome/free-regular-svg-icons": "5.15.1",
|
"@fortawesome/free-regular-svg-icons": "5.15.2",
|
||||||
"@fortawesome/free-solid-svg-icons": "5.15.1",
|
"@fortawesome/free-solid-svg-icons": "5.15.2",
|
||||||
"@fortawesome/vue-fontawesome": "3.0.0-3",
|
"@fortawesome/vue-fontawesome": "3.0.0-3",
|
||||||
"@koa/cors": "3.1.0",
|
"@koa/cors": "3.1.0",
|
||||||
"@koa/multer": "3.0.0",
|
"@koa/multer": "3.0.0",
|
||||||
"@koa/router": "9.0.1",
|
"@koa/router": "9.0.1",
|
||||||
|
"@sentry/browser": "5.29.2",
|
||||||
|
"@sentry/tracing": "5.29.2",
|
||||||
"@sinonjs/fake-timers": "6.0.1",
|
"@sinonjs/fake-timers": "6.0.1",
|
||||||
"@syuilo/aiscript": "0.11.1",
|
"@syuilo/aiscript": "0.11.1",
|
||||||
"@types/bcryptjs": "2.4.2",
|
"@types/bcryptjs": "2.4.2",
|
||||||
"@types/bull": "3.14.4",
|
"@types/bull": "3.15.0",
|
||||||
"@types/cbor": "5.0.1",
|
"@types/cbor": "5.0.1",
|
||||||
"@types/dateformat": "3.0.1",
|
"@types/dateformat": "3.0.1",
|
||||||
"@types/double-ended-queue": "2.1.1",
|
"@types/double-ended-queue": "2.1.1",
|
||||||
"@types/escape-regexp": "0.0.0",
|
"@types/escape-regexp": "0.0.0",
|
||||||
"@types/glob": "7.1.3",
|
"@types/glob": "7.1.3",
|
||||||
"@types/gulp": "4.0.6",
|
"@types/gulp": "4.0.8",
|
||||||
"@types/gulp-rename": "0.0.33",
|
"@types/gulp-rename": "2.0.0",
|
||||||
"@types/gulp-replace": "0.0.31",
|
"@types/gulp-replace": "0.0.31",
|
||||||
"@types/is-url": "1.2.28",
|
"@types/is-url": "1.2.28",
|
||||||
"@types/js-yaml": "3.12.5",
|
"@types/js-yaml": "4.0.0",
|
||||||
"@types/jsdom": "16.2.5",
|
"@types/jsdom": "16.2.6",
|
||||||
"@types/jsonld": "1.5.1",
|
"@types/jsonld": "1.5.3",
|
||||||
"@types/katex": "0.11.0",
|
"@types/katex": "0.11.0",
|
||||||
"@types/koa": "2.11.6",
|
"@types/koa": "2.13.0",
|
||||||
"@types/koa-bodyparser": "4.3.0",
|
"@types/koa-bodyparser": "4.3.0",
|
||||||
"@types/koa-cors": "0.0.0",
|
"@types/koa-cors": "0.0.0",
|
||||||
"@types/koa-favicon": "2.0.19",
|
"@types/koa-favicon": "2.0.19",
|
||||||
@ -72,20 +74,20 @@
|
|||||||
"@types/koa-views": "2.0.4",
|
"@types/koa-views": "2.0.4",
|
||||||
"@types/koa__cors": "3.0.2",
|
"@types/koa__cors": "3.0.2",
|
||||||
"@types/koa__multer": "2.0.2",
|
"@types/koa__multer": "2.0.2",
|
||||||
"@types/koa__router": "8.0.2",
|
"@types/koa__router": "8.0.4",
|
||||||
"@types/markdown-it": "10.0.3",
|
"@types/markdown-it": "12.0.1",
|
||||||
"@types/matter-js": "0.14.8",
|
"@types/matter-js": "0.14.10",
|
||||||
"@types/mocha": "7.0.2",
|
"@types/mocha": "8.2.1",
|
||||||
"@types/node": "14.14.13",
|
"@types/node": "14.14.31",
|
||||||
"@types/node-fetch": "2.5.7",
|
"@types/node-fetch": "2.5.8",
|
||||||
"@types/nodemailer": "6.4.0",
|
"@types/nodemailer": "6.4.0",
|
||||||
"@types/nprogress": "0.2.0",
|
"@types/nprogress": "0.2.0",
|
||||||
"@types/oauth": "0.9.1",
|
"@types/oauth": "0.9.1",
|
||||||
"@types/parse5": "5.0.3",
|
"@types/parse5": "6.0.0",
|
||||||
"@types/parsimmon": "1.10.6",
|
"@types/parsimmon": "1.10.6",
|
||||||
"@types/portscanner": "2.1.0",
|
"@types/portscanner": "2.1.0",
|
||||||
"@types/pug": "2.0.4",
|
"@types/pug": "2.0.4",
|
||||||
"@types/qrcode": "1.3.5",
|
"@types/qrcode": "1.4.0",
|
||||||
"@types/random-seed": "0.3.3",
|
"@types/random-seed": "0.3.3",
|
||||||
"@types/ratelimiter": "3.4.1",
|
"@types/ratelimiter": "3.4.1",
|
||||||
"@types/redis": "2.8.28",
|
"@types/redis": "2.8.28",
|
||||||
@ -93,50 +95,51 @@
|
|||||||
"@types/request-stats": "3.0.0",
|
"@types/request-stats": "3.0.0",
|
||||||
"@types/rimraf": "3.0.0",
|
"@types/rimraf": "3.0.0",
|
||||||
"@types/seedrandom": "2.4.28",
|
"@types/seedrandom": "2.4.28",
|
||||||
"@types/sharp": "0.26.1",
|
"@types/sharp": "0.27.1",
|
||||||
"@types/sinonjs__fake-timers": "6.0.1",
|
"@types/sinonjs__fake-timers": "6.0.2",
|
||||||
"@types/speakeasy": "2.0.5",
|
"@types/speakeasy": "2.0.5",
|
||||||
|
"@types/throttle-debounce": "2.1.0",
|
||||||
"@types/tinycolor2": "1.4.2",
|
"@types/tinycolor2": "1.4.2",
|
||||||
"@types/tmp": "0.2.0",
|
"@types/tmp": "0.2.0",
|
||||||
"@types/uuid": "8.3.0",
|
"@types/uuid": "8.3.0",
|
||||||
"@types/web-push": "3.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/webpack-stream": "3.2.11",
|
||||||
"@types/websocket": "1.0.1",
|
"@types/websocket": "1.0.1",
|
||||||
"@types/ws": "7.4.0",
|
"@types/ws": "7.4.0",
|
||||||
"@typescript-eslint/parser": "4.10.0",
|
"@typescript-eslint/parser": "4.14.2",
|
||||||
"@vue/compiler-sfc": "3.0.5",
|
"@vue/compiler-sfc": "3.0.5",
|
||||||
"abort-controller": "3.0.0",
|
"abort-controller": "3.0.0",
|
||||||
"apexcharts": "3.22.3",
|
"apexcharts": "3.25.0",
|
||||||
"autobind-decorator": "2.4.0",
|
"autobind-decorator": "2.4.0",
|
||||||
"autosize": "4.0.2",
|
"autosize": "4.0.2",
|
||||||
"autwh": "0.1.0",
|
"autwh": "0.1.0",
|
||||||
"aws-sdk": "2.809.0",
|
"aws-sdk": "2.848.0",
|
||||||
"bcryptjs": "2.4.3",
|
"bcryptjs": "2.4.3",
|
||||||
"blurhash": "1.1.3",
|
"blurhash": "1.1.3",
|
||||||
"bull": "3.20.0",
|
"broadcast-channel": "3.4.1",
|
||||||
|
"bull": "3.20.1",
|
||||||
"cafy": "15.2.1",
|
"cafy": "15.2.1",
|
||||||
"cbor": "5.1.0",
|
"cbor": "7.0.1",
|
||||||
"chalk": "4.1.0",
|
"chalk": "4.1.0",
|
||||||
"chart.js": "2.9.4",
|
"chart.js": "2.9.4",
|
||||||
"cli-highlight": "2.1.9",
|
"cli-highlight": "2.1.10",
|
||||||
"commander": "4.1.1",
|
"commander": "4.1.1",
|
||||||
"content-disposition": "0.5.3",
|
"content-disposition": "0.5.3",
|
||||||
"core-js": "3.8.1",
|
"core-js": "3.9.0",
|
||||||
"crc-32": "1.2.0",
|
"crc-32": "1.2.0",
|
||||||
"css-loader": "5.0.1",
|
"css-loader": "5.0.2",
|
||||||
"cssnano": "4.1.10",
|
"cssnano": "4.1.10",
|
||||||
"dateformat": "4.3.1",
|
"dateformat": "4.5.1",
|
||||||
"deep-entries": "3.1.0",
|
|
||||||
"diskusage": "1.1.3",
|
"diskusage": "1.1.3",
|
||||||
"double-ended-queue": "2.1.0-0",
|
"double-ended-queue": "2.1.0-0",
|
||||||
"escape-regexp": "0.0.1",
|
"escape-regexp": "0.0.1",
|
||||||
"eslint": "7.16.0",
|
"eslint": "7.20.0",
|
||||||
"eslint-plugin-vue": "7.3.0",
|
"eslint-plugin-vue": "7.6.0",
|
||||||
"eventemitter3": "4.0.7",
|
"eventemitter3": "4.0.7",
|
||||||
"feed": "4.2.1",
|
"feed": "4.2.2",
|
||||||
"fibers": "5.0.0",
|
"fibers": "5.0.0",
|
||||||
"file-type": "16.0.1",
|
"file-type": "16.2.0",
|
||||||
"fluent-ffmpeg": "2.1.2",
|
"fluent-ffmpeg": "2.1.2",
|
||||||
"glob": "7.1.6",
|
"glob": "7.1.6",
|
||||||
"got": "11.8.1",
|
"got": "11.8.1",
|
||||||
@ -144,27 +147,26 @@
|
|||||||
"gulp-cssnano": "2.1.3",
|
"gulp-cssnano": "2.1.3",
|
||||||
"gulp-rename": "2.0.0",
|
"gulp-rename": "2.0.0",
|
||||||
"gulp-replace": "1.0.0",
|
"gulp-replace": "1.0.0",
|
||||||
"gulp-sourcemaps": "2.6.5",
|
"gulp-terser": "2.0.1",
|
||||||
"gulp-terser": "2.0.0",
|
|
||||||
"gulp-tslint": "8.1.4",
|
"gulp-tslint": "8.1.4",
|
||||||
"gulp-typescript": "6.0.0-alpha.1",
|
"gulp-typescript": "6.0.0-alpha.1",
|
||||||
"hard-source-webpack-plugin": "0.13.1",
|
"hard-source-webpack-plugin": "0.13.1",
|
||||||
"hcaptcha": "0.0.2",
|
|
||||||
"html-minifier": "4.0.0",
|
"html-minifier": "4.0.0",
|
||||||
"http-proxy-agent": "4.0.1",
|
"http-proxy-agent": "4.0.1",
|
||||||
"http-signature": "1.3.5",
|
"http-signature": "1.3.5",
|
||||||
"https-proxy-agent": "5.0.0",
|
"https-proxy-agent": "5.0.0",
|
||||||
|
"idb-keyval": "5.0.2",
|
||||||
"insert-text-at-cursor": "0.3.0",
|
"insert-text-at-cursor": "0.3.0",
|
||||||
"is-root": "2.1.0",
|
"is-root": "2.1.0",
|
||||||
"is-svg": "4.2.1",
|
"is-svg": "4.2.1",
|
||||||
"js-yaml": "3.14.0",
|
"js-yaml": "4.0.0",
|
||||||
"jsdom": "16.4.0",
|
"jsdom": "16.4.0",
|
||||||
"json5": "2.1.3",
|
"json5": "2.2.0",
|
||||||
"json5-loader": "4.0.1",
|
"json5-loader": "4.0.1",
|
||||||
"jsonld": "3.2.0",
|
"jsonld": "4.0.1",
|
||||||
"jsrsasign": "8.0.20",
|
"jsrsasign": "8.0.20",
|
||||||
"katex": "0.12.0",
|
"katex": "0.12.0",
|
||||||
"koa": "2.13.0",
|
"koa": "2.13.1",
|
||||||
"koa-bodyparser": "4.3.0",
|
"koa-bodyparser": "4.3.0",
|
||||||
"koa-favicon": "2.1.0",
|
"koa-favicon": "2.1.0",
|
||||||
"koa-json-body": "5.3.0",
|
"koa-json-body": "5.3.0",
|
||||||
@ -175,16 +177,16 @@
|
|||||||
"koa-views": "6.3.1",
|
"koa-views": "6.3.1",
|
||||||
"langmap": "0.0.16",
|
"langmap": "0.0.16",
|
||||||
"lookup-dns-cache": "2.1.0",
|
"lookup-dns-cache": "2.1.0",
|
||||||
"markdown-it": "11.0.1",
|
"markdown-it": "12.0.4",
|
||||||
"markdown-it-anchor": "6.0.1",
|
"markdown-it-anchor": "7.0.2",
|
||||||
"matter-js": "0.14.2",
|
"matter-js": "0.16.1",
|
||||||
"mocha": "8.2.1",
|
"mocha": "8.3.0",
|
||||||
"moji": "0.5.1",
|
"moji": "0.5.1",
|
||||||
"ms": "2.1.3",
|
"ms": "2.1.3",
|
||||||
"multer": "1.4.2",
|
"multer": "1.4.2",
|
||||||
"nested-property": "4.0.0",
|
"nested-property": "4.0.0",
|
||||||
"node-fetch": "2.6.1",
|
"node-fetch": "2.6.1",
|
||||||
"nodemailer": "6.4.17",
|
"nodemailer": "6.4.18",
|
||||||
"object-assign-deep": "0.4.0",
|
"object-assign-deep": "0.4.0",
|
||||||
"os-utils": "0.0.14",
|
"os-utils": "0.0.14",
|
||||||
"p-cancelable": "2.0.0",
|
"p-cancelable": "2.0.0",
|
||||||
@ -192,9 +194,9 @@
|
|||||||
"parsimmon": "1.16.0",
|
"parsimmon": "1.16.0",
|
||||||
"pg": "8.5.1",
|
"pg": "8.5.1",
|
||||||
"portscanner": "2.2.0",
|
"portscanner": "2.2.0",
|
||||||
"postcss": "8.2.1",
|
"postcss": "8.2.6",
|
||||||
"postcss-loader": "4.1.0",
|
"postcss-loader": "5.0.0",
|
||||||
"prismjs": "1.22.0",
|
"prismjs": "1.23.0",
|
||||||
"probe-image-size": "6.0.0",
|
"probe-image-size": "6.0.0",
|
||||||
"promise-limit": "2.7.0",
|
"promise-limit": "2.7.0",
|
||||||
"promise-sequential": "1.1.1",
|
"promise-sequential": "1.1.1",
|
||||||
@ -205,7 +207,6 @@
|
|||||||
"random-seed": "0.3.0",
|
"random-seed": "0.3.0",
|
||||||
"ratelimiter": "3.4.1",
|
"ratelimiter": "3.4.1",
|
||||||
"re2": "1.15.9",
|
"re2": "1.15.9",
|
||||||
"recaptcha-promise": "1.0.0",
|
|
||||||
"reconnecting-websocket": "4.4.0",
|
"reconnecting-websocket": "4.4.0",
|
||||||
"redis": "3.0.2",
|
"redis": "3.0.2",
|
||||||
"redis-lock": "0.1.4",
|
"redis-lock": "0.1.4",
|
||||||
@ -217,27 +218,28 @@
|
|||||||
"rimraf": "3.0.2",
|
"rimraf": "3.0.2",
|
||||||
"rndstr": "1.0.0",
|
"rndstr": "1.0.0",
|
||||||
"s-age": "1.1.2",
|
"s-age": "1.1.2",
|
||||||
"sass": "1.29.0",
|
"sass": "1.32.8",
|
||||||
"sass-loader": "10.1.0",
|
"sass-loader": "11.0.1",
|
||||||
"seedrandom": "3.0.5",
|
"seedrandom": "3.0.5",
|
||||||
"sharp": "0.26.2",
|
"sharp": "0.27.1",
|
||||||
"speakeasy": "2.0.0",
|
"speakeasy": "2.0.0",
|
||||||
"stringz": "2.1.0",
|
"stringz": "2.1.0",
|
||||||
"style-loader": "2.0.0",
|
"style-loader": "2.0.0",
|
||||||
"summaly": "2.4.0",
|
"summaly": "2.4.0",
|
||||||
"syslog-pro": "1.0.0",
|
"syslog-pro": "1.0.0",
|
||||||
"systeminformation": "4.31.1",
|
"systeminformation": "4.34.6",
|
||||||
"syuilo-password-strength": "0.0.1",
|
"syuilo-password-strength": "0.0.1",
|
||||||
"textarea-caret": "3.1.0",
|
"textarea-caret": "3.1.0",
|
||||||
"three": "0.117.1",
|
"three": "0.117.1",
|
||||||
|
"throttle-debounce": "3.0.1",
|
||||||
"tinycolor2": "1.4.2",
|
"tinycolor2": "1.4.2",
|
||||||
"tmp": "0.2.1",
|
"tmp": "0.2.1",
|
||||||
"ts-loader": "8.0.11",
|
"ts-loader": "8.0.17",
|
||||||
"ts-node": "9.1.0",
|
"ts-node": "9.1.1",
|
||||||
"tslint": "6.1.3",
|
"tslint": "6.1.3",
|
||||||
"tslint-sonarts": "1.9.0",
|
"tslint-sonarts": "1.9.0",
|
||||||
"typeorm": "0.2.29",
|
"typeorm": "0.2.31",
|
||||||
"typescript": "4.1.3",
|
"typescript": "4.1.5",
|
||||||
"ulid": "2.3.0",
|
"ulid": "2.3.0",
|
||||||
"url-loader": "4.1.1",
|
"url-loader": "4.1.1",
|
||||||
"uuid": "8.3.2",
|
"uuid": "8.3.2",
|
||||||
@ -246,22 +248,22 @@
|
|||||||
"vue": "3.0.5",
|
"vue": "3.0.5",
|
||||||
"vue-color": "2.8.1",
|
"vue-color": "2.8.1",
|
||||||
"vue-json-pretty": "1.7.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-prism-editor": "2.0.0-alpha.2",
|
||||||
"vue-router": "4.0.1",
|
"vue-router": "4.0.3",
|
||||||
"vue-style-loader": "4.1.2",
|
"vue-style-loader": "4.1.2",
|
||||||
"vuedraggable": "4.0.1",
|
"vuedraggable": "4.0.1",
|
||||||
"web-push": "3.4.4",
|
"web-push": "3.4.4",
|
||||||
"webpack": "5.10.1",
|
"webpack": "5.23.0",
|
||||||
"webpack-cli": "4.3.0",
|
"webpack-cli": "4.5.0",
|
||||||
"websocket": "1.0.33",
|
"websocket": "1.0.33",
|
||||||
"ws": "7.4.1",
|
"ws": "7.4.3",
|
||||||
"xev": "2.0.1"
|
"xev": "2.0.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/chai": "4.2.14",
|
"@types/chai": "4.2.14",
|
||||||
"@types/fluent-ffmpeg": "2.1.16",
|
"@types/fluent-ffmpeg": "2.1.16",
|
||||||
"chai": "4.2.0",
|
"chai": "4.3.0",
|
||||||
"cross-env": "7.0.3"
|
"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;
|
|
||||||
}
|
|
@ -1,13 +1,13 @@
|
|||||||
import { reactive } from 'vue';
|
import { reactive } from 'vue';
|
||||||
import { apiUrl } from '@/config';
|
import { apiUrl } from '@/config';
|
||||||
import { waiting } from '@/os';
|
import { waiting } from '@/os';
|
||||||
|
import { unisonReload } from '@/scripts/unison-reload';
|
||||||
|
|
||||||
// TODO: 他のタブと永続化されたstateを同期
|
// TODO: 他のタブと永続化されたstateを同期
|
||||||
|
|
||||||
type Account = {
|
type Account = {
|
||||||
id: string;
|
id: string;
|
||||||
token: string;
|
token: string;
|
||||||
clientData: Record<string, any>;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const data = localStorage.getItem('account');
|
const data = localStorage.getItem('account');
|
||||||
@ -63,6 +63,7 @@ export function updateAccount(data) {
|
|||||||
for (const [key, value] of Object.entries(data)) {
|
for (const [key, value] of Object.entries(data)) {
|
||||||
$i[key] = value;
|
$i[key] = value;
|
||||||
}
|
}
|
||||||
|
localStorage.setItem('account', JSON.stringify($i));
|
||||||
}
|
}
|
||||||
|
|
||||||
export function refreshAccount() {
|
export function refreshAccount() {
|
||||||
@ -75,7 +76,7 @@ export async function login(token: Account['token']) {
|
|||||||
const me = await fetchAccount(token);
|
const me = await fetchAccount(token);
|
||||||
localStorage.setItem('account', JSON.stringify(me));
|
localStorage.setItem('account', JSON.stringify(me));
|
||||||
addAccount(me.id, token);
|
addAccount(me.id, token);
|
||||||
location.reload();
|
unisonReload();
|
||||||
}
|
}
|
||||||
|
|
||||||
// このファイルに書きたくないけどここに書かないと何故かVeturが認識しない
|
// このファイルに書きたくないけどここに書かないと何故かVeturが認識しない
|
||||||
|
BIN
src/client/assets/about-icon.png
Normal file
After Width: | Height: | Size: 20 KiB |
@ -57,7 +57,7 @@ export default defineComponent({
|
|||||||
src() {
|
src() {
|
||||||
const endpoint = ({
|
const endpoint = ({
|
||||||
hcaptcha: 'https://hcaptcha.com/1',
|
hcaptcha: 'https://hcaptcha.com/1',
|
||||||
grecaptcha: 'https://www.google.com/recaptcha',
|
grecaptcha: 'https://www.recaptcha.net/recaptcha',
|
||||||
} as Record<PropertyKey, unknown>)[this.provider];
|
} as Record<PropertyKey, unknown>)[this.provider];
|
||||||
|
|
||||||
return `${typeof endpoint == 'string' ? endpoint : 'about:invalid'}/api.js?render=explicit`;
|
return `${typeof endpoint == 'string' ? endpoint : 'about:invalid'}/api.js?render=explicit`;
|
||||||
|
@ -17,17 +17,17 @@
|
|||||||
@dragenter="onDragenter"
|
@dragenter="onDragenter"
|
||||||
@dragleave="onDragleave"
|
@dragleave="onDragleave"
|
||||||
@drop.prevent.stop="onDrop"
|
@drop.prevent.stop="onDrop"
|
||||||
@contextmenu="onContextmenu"
|
@contextmenu.stop="onContextmenu"
|
||||||
>
|
>
|
||||||
<div class="contents" ref="contents">
|
<div class="contents" ref="contents">
|
||||||
<div class="folders" ref="foldersContainer" v-show="folders.length > 0">
|
<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 -->
|
<!-- 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>
|
<div class="padding" v-for="(n, i) in 16" :key="i"></div>
|
||||||
<MkButton ref="moreFolders" v-if="moreFolders">{{ $ts.loadMore }}</MkButton>
|
<MkButton ref="moreFolders" v-if="moreFolders">{{ $ts.loadMore }}</MkButton>
|
||||||
</div>
|
</div>
|
||||||
<div class="files" ref="filesContainer" v-show="files.length > 0">
|
<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 -->
|
<!-- 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>
|
<div class="padding" v-for="(n, i) in 16" :key="i"></div>
|
||||||
<MkButton ref="loadMoreFiles" @click="fetchMoreFiles" v-show="moreFiles">{{ $ts.loadMore }}</MkButton>
|
<MkButton ref="loadMoreFiles" @click="fetchMoreFiles" v-show="moreFiles">{{ $ts.loadMore }}</MkButton>
|
||||||
|
@ -99,7 +99,8 @@ import { faHeart, faFlag, faLaugh } from '@fortawesome/free-regular-svg-icons';
|
|||||||
import MkModal from '@/components/ui/modal.vue';
|
import MkModal from '@/components/ui/modal.vue';
|
||||||
import Particle from '@/components/particle.vue';
|
import Particle from '@/components/particle.vue';
|
||||||
import * as os from '@/os';
|
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 { emojiCategories } from '@/instance';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
@ -322,7 +323,7 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
|
|
||||||
mounted() {
|
mounted() {
|
||||||
if (!os.isMobile) {
|
if (!isMobile && !isDeviceTouch) {
|
||||||
this.$refs.search.focus({
|
this.$refs.search.focus({
|
||||||
preventScroll: true
|
preventScroll: true
|
||||||
});
|
});
|
||||||
|
@ -1,63 +1,50 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="ztzhwixg _formItem" :class="{ inline, disabled }">
|
<FormGroup class="_formItem">
|
||||||
<div class="_formLabel"><slot></slot></div>
|
<template #label><slot></slot></template>
|
||||||
<div class="icon" ref="icon"><slot name="icon"></slot></div>
|
<div class="ztzhwixg _formItem" :class="{ inline, disabled }">
|
||||||
<div class="input _formPanel">
|
<div class="icon" ref="icon"><slot name="icon"></slot></div>
|
||||||
<div class="prefix" ref="prefixEl"><slot name="prefix"></slot></div>
|
<div class="input _formPanel">
|
||||||
<input v-if="debounce" ref="inputEl"
|
<div class="prefix" ref="prefixEl"><slot name="prefix"></slot></div>
|
||||||
v-debounce="500"
|
<input ref="inputEl"
|
||||||
:type="type"
|
:type="type"
|
||||||
v-model.lazy="v"
|
v-model="v"
|
||||||
:disabled="disabled"
|
:disabled="disabled"
|
||||||
:required="required"
|
:required="required"
|
||||||
:readonly="readonly"
|
:readonly="readonly"
|
||||||
:placeholder="placeholder"
|
:placeholder="placeholder"
|
||||||
:pattern="pattern"
|
:pattern="pattern"
|
||||||
:autocomplete="autocomplete"
|
:autocomplete="autocomplete"
|
||||||
:spellcheck="spellcheck"
|
:spellcheck="spellcheck"
|
||||||
:step="step"
|
:step="step"
|
||||||
@focus="focused = true"
|
@focus="focused = true"
|
||||||
@blur="focused = false"
|
@blur="focused = false"
|
||||||
@keydown="onKeydown($event)"
|
@keydown="onKeydown($event)"
|
||||||
@input="onInput"
|
@input="onInput"
|
||||||
:list="id"
|
:list="id"
|
||||||
>
|
>
|
||||||
<input v-else ref="inputEl"
|
<datalist :id="id" v-if="datalist">
|
||||||
:type="type"
|
<option v-for="data in datalist" :value="data"/>
|
||||||
v-model="v"
|
</datalist>
|
||||||
:disabled="disabled"
|
<div class="suffix" ref="suffixEl"><slot name="suffix"></slot></div>
|
||||||
:required="required"
|
</div>
|
||||||
: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(); }">{{ $ts.save }}</button>
|
<template #caption><slot name="desc"></slot></template>
|
||||||
<div class="_formCaption"><slot name="desc"></slot></div>
|
|
||||||
</div>
|
<FormButton v-if="manualSave && changed" @click="updated" primary><Fa :icon="faSave"/> {{ $ts.save }}</FormButton>
|
||||||
|
</FormGroup>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent, onMounted, onUnmounted, nextTick, ref, watch, computed, toRefs } from 'vue';
|
import { defineComponent, onMounted, onUnmounted, nextTick, ref, watch, computed, toRefs } from 'vue';
|
||||||
import debounce from 'v-debounce';
|
import { faExclamationCircle, faSave } from '@fortawesome/free-solid-svg-icons';
|
||||||
import { faExclamationCircle } from '@fortawesome/free-solid-svg-icons';
|
|
||||||
import './form.scss';
|
import './form.scss';
|
||||||
|
import FormButton from './button.vue';
|
||||||
|
import FormGroup from './group.vue';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
directives: {
|
components: {
|
||||||
debounce
|
FormGroup,
|
||||||
|
FormButton,
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
value: {
|
value: {
|
||||||
@ -101,9 +88,6 @@ export default defineComponent({
|
|||||||
step: {
|
step: {
|
||||||
required: false
|
required: false
|
||||||
},
|
},
|
||||||
debounce: {
|
|
||||||
required: false
|
|
||||||
},
|
|
||||||
datalist: {
|
datalist: {
|
||||||
type: Array,
|
type: Array,
|
||||||
required: false,
|
required: false,
|
||||||
@ -113,9 +97,10 @@ export default defineComponent({
|
|||||||
required: false,
|
required: false,
|
||||||
default: false
|
default: false
|
||||||
},
|
},
|
||||||
save: {
|
manualSave: {
|
||||||
type: Function,
|
type: Boolean,
|
||||||
required: false,
|
required: false,
|
||||||
|
default: false
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
emits: ['change', 'keydown', 'enter'],
|
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 => {
|
watch(value, newValue => {
|
||||||
v.value = newValue;
|
v.value = newValue;
|
||||||
});
|
});
|
||||||
|
|
||||||
watch(v, newValue => {
|
watch(v, newValue => {
|
||||||
if (type?.value === 'number') {
|
if (!props.manualSave) {
|
||||||
context.emit('update:value', parseFloat(newValue));
|
updated();
|
||||||
} else {
|
|
||||||
context.emit('update:value', newValue);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
invalid.value = inputEl.value.validity.badInput;
|
invalid.value = inputEl.value.validity.badInput;
|
||||||
@ -198,7 +190,8 @@ export default defineComponent({
|
|||||||
focus,
|
focus,
|
||||||
onInput,
|
onInput,
|
||||||
onKeydown,
|
onKeydown,
|
||||||
faExclamationCircle,
|
updated,
|
||||||
|
faExclamationCircle, faSave,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
@ -285,11 +278,6 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
> .save {
|
|
||||||
margin: 6px 0 0 0;
|
|
||||||
font-size: 0.8em;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.inline {
|
&.inline {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
|
@ -1,29 +1,39 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="rivhosbp _formItem" :class="{ tall, pre }">
|
<FormGroup class="_formItem">
|
||||||
<div class="_formLabel"><slot></slot></div>
|
<template #label><slot></slot></template>
|
||||||
<div class="input _formPanel">
|
<div class="rivhosbp _formItem" :class="{ tall, pre }">
|
||||||
<textarea ref="input" :class="{ code, _monospace: code }"
|
<div class="input _formPanel">
|
||||||
:value="value"
|
<textarea ref="input" :class="{ code, _monospace: code }"
|
||||||
:required="required"
|
v-model="v"
|
||||||
:readonly="readonly"
|
:required="required"
|
||||||
:pattern="pattern"
|
:readonly="readonly"
|
||||||
:autocomplete="autocomplete"
|
:pattern="pattern"
|
||||||
:spellcheck="!code"
|
:autocomplete="autocomplete"
|
||||||
@input="onInput"
|
:spellcheck="!code"
|
||||||
@focus="focused = true"
|
@input="onInput"
|
||||||
@blur="focused = false"
|
@focus="focused = true"
|
||||||
></textarea>
|
@blur="focused = false"
|
||||||
|
></textarea>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<button class="save _textButton" v-if="save && changed" @click="() => { changed = false; save(); }">{{ $ts.save }}</button>
|
<template #caption><slot name="desc"></slot></template>
|
||||||
<div class="_formCaption"><slot name="desc"></slot></div>
|
|
||||||
</div>
|
<FormButton v-if="manualSave && changed" @click="updated" primary><Fa :icon="faSave"/> {{ $ts.save }}</FormButton>
|
||||||
|
</FormGroup>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<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 './form.scss';
|
||||||
|
import FormButton from './button.vue';
|
||||||
|
import FormGroup from './group.vue';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
|
components: {
|
||||||
|
FormGroup,
|
||||||
|
FormButton,
|
||||||
|
},
|
||||||
props: {
|
props: {
|
||||||
value: {
|
value: {
|
||||||
required: false
|
required: false
|
||||||
@ -58,24 +68,46 @@ export default defineComponent({
|
|||||||
required: false,
|
required: false,
|
||||||
default: false
|
default: false
|
||||||
},
|
},
|
||||||
save: {
|
manualSave: {
|
||||||
type: Function,
|
type: Boolean,
|
||||||
required: false,
|
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 {
|
return {
|
||||||
changed: false,
|
v,
|
||||||
}
|
updated,
|
||||||
},
|
changed,
|
||||||
methods: {
|
focus,
|
||||||
focus() {
|
onInput,
|
||||||
this.$refs.input.focus();
|
faSave,
|
||||||
},
|
};
|
||||||
onInput(ev) {
|
|
||||||
this.changed = true;
|
|
||||||
this.$emit('update:value', ev.target.value);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
@ -112,11 +144,6 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
> .save {
|
|
||||||
margin: 6px 0 0 0;
|
|
||||||
font-size: 0.8em;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.tall {
|
&.tall {
|
||||||
> .input {
|
> .input {
|
||||||
> textarea {
|
> textarea {
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
<template>
|
<template>
|
||||||
<span class="eiwwqkts" :class="{ cat }" :title="acct(user)" v-if="disableLink" v-user-preview="disablePreview ? undefined : user.id" @click="onClick">
|
<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"/>
|
<img class="inner" :src="url" decoding="async"/>
|
||||||
</span>
|
</span>
|
||||||
<MkA class="eiwwqkts" :class="{ cat }" :to="userPage(user)" :title="acct(user)" :target="target" v-else v-user-preview="disablePreview ? undefined : user.id">
|
<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"/>
|
<img class="inner" :src="url" decoding="async"/>
|
||||||
</MkA>
|
</MkA>
|
||||||
</template>
|
</template>
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
<component :is="self ? 'MkA' : 'a'" class="ieqqeuvs _link" :[attr]="self ? url.substr(local.length) : url" :rel="rel" :target="target"
|
<component :is="self ? 'MkA' : 'a'" class="ieqqeuvs _link" :[attr]="self ? url.substr(local.length) : url" :rel="rel" :target="target"
|
||||||
@mouseover="onMouseover"
|
@mouseover="onMouseover"
|
||||||
@mouseleave="onMouseleave"
|
@mouseleave="onMouseleave"
|
||||||
|
@contextmenu.stop="() => {}"
|
||||||
>
|
>
|
||||||
<template v-if="!self">
|
<template v-if="!self">
|
||||||
<span class="schema">{{ schema }}//</span>
|
<span class="schema">{{ schema }}//</span>
|
||||||
|
@ -38,24 +38,24 @@
|
|||||||
<MkAvatar class="avatar" :user="appearNote.user"/>
|
<MkAvatar class="avatar" :user="appearNote.user"/>
|
||||||
<div class="body">
|
<div class="body">
|
||||||
<div class="top">
|
<div class="top">
|
||||||
<MkA class="name" :to="userPage(note.user)" v-user-preview="note.user.id">
|
<MkA class="name" :to="userPage(appearNote.user)" v-user-preview="appearNote.user.id">
|
||||||
<MkUserName :user="note.user"/>
|
<MkUserName :user="appearNote.user"/>
|
||||||
</MkA>
|
</MkA>
|
||||||
<span class="is-bot" v-if="note.user.isBot">bot</span>
|
<span class="is-bot" v-if="appearNote.user.isBot">bot</span>
|
||||||
<span class="admin" v-if="note.user.isAdmin"><Fa :icon="faBookmark"/></span>
|
<span class="admin" v-if="appearNote.user.isAdmin"><Fa :icon="faBookmark"/></span>
|
||||||
<span class="moderator" v-if="!note.user.isAdmin && note.user.isModerator"><Fa :icon="farBookmark"/></span>
|
<span class="moderator" v-if="!appearNote.user.isAdmin && appearNote.user.isModerator"><Fa :icon="farBookmark"/></span>
|
||||||
<span class="visibility" v-if="note.visibility !== 'public'">
|
<span class="visibility" v-if="appearNote.visibility !== 'public'">
|
||||||
<Fa v-if="note.visibility === 'home'" :icon="faHome"/>
|
<Fa v-if="appearNote.visibility === 'home'" :icon="faHome"/>
|
||||||
<Fa v-if="note.visibility === 'followers'" :icon="faUnlock"/>
|
<Fa v-if="appearNote.visibility === 'followers'" :icon="faUnlock"/>
|
||||||
<Fa v-if="note.visibility === 'specified'" :icon="faEnvelope"/>
|
<Fa v-if="appearNote.visibility === 'specified'" :icon="faEnvelope"/>
|
||||||
</span>
|
</span>
|
||||||
<span class="localOnly" v-if="note.localOnly"><Fa :icon="faBiohazard"/></span>
|
<span class="localOnly" v-if="appearNote.localOnly"><Fa :icon="faBiohazard"/></span>
|
||||||
</div>
|
</div>
|
||||||
<div class="username"><MkAcct :user="note.user"/></div>
|
<div class="username"><MkAcct :user="appearNote.user"/></div>
|
||||||
|
<MkInstanceTicker v-if="showTicker" class="ticker" :instance="appearNote.user.instance"/>
|
||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
<div class="main">
|
<div class="main">
|
||||||
<MkInstanceTicker v-if="showTicker" class="ticker" :instance="appearNote.user.instance"/>
|
|
||||||
<div class="body">
|
<div class="body">
|
||||||
<p v-if="appearNote.cw != null" class="cw">
|
<p v-if="appearNote.cw != null" class="cw">
|
||||||
<Mfm v-if="appearNote.cw != ''" class="text" :text="appearNote.cw" :author="appearNote.user" :i="$i" :custom-emojis="appearNote.emojis"/>
|
<Mfm v-if="appearNote.cw != ''" class="text" :text="appearNote.cw" :author="appearNote.user" :i="$i" :custom-emojis="appearNote.emojis"/>
|
||||||
@ -756,7 +756,13 @@ export default defineComponent({
|
|||||||
};
|
};
|
||||||
if (isLink(e.target)) return;
|
if (isLink(e.target)) return;
|
||||||
if (window.getSelection().toString() !== '') return;
|
if (window.getSelection().toString() !== '') return;
|
||||||
os.contextMenu(this.getMenu(), e).then(this.focus);
|
|
||||||
|
if (this.$store.state.useReactionPickerForContextMenu) {
|
||||||
|
e.preventDefault();
|
||||||
|
this.react();
|
||||||
|
} else {
|
||||||
|
os.contextMenu(this.getMenu(), e).then(this.focus);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
menu(viaKeyboard = false) {
|
menu(viaKeyboard = false) {
|
||||||
@ -1005,6 +1011,7 @@ export default defineComponent({
|
|||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
padding-left: 16px;
|
padding-left: 16px;
|
||||||
|
font-size: 0.95em;
|
||||||
|
|
||||||
> .top {
|
> .top {
|
||||||
> .name {
|
> .name {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div
|
<div
|
||||||
class="note _panel"
|
class="tkcbzcuz _panel"
|
||||||
v-if="!muted"
|
v-if="!muted"
|
||||||
v-show="!isDeleted"
|
v-show="!isDeleted"
|
||||||
:tabindex="!isDeleted ? '-1' : null"
|
:tabindex="!isDeleted ? '-1' : null"
|
||||||
@ -731,7 +731,13 @@ export default defineComponent({
|
|||||||
};
|
};
|
||||||
if (isLink(e.target)) return;
|
if (isLink(e.target)) return;
|
||||||
if (window.getSelection().toString() !== '') return;
|
if (window.getSelection().toString() !== '') return;
|
||||||
os.contextMenu(this.getMenu(), e).then(this.focus);
|
|
||||||
|
if (this.$store.state.useReactionPickerForContextMenu) {
|
||||||
|
e.preventDefault();
|
||||||
|
this.react();
|
||||||
|
} else {
|
||||||
|
os.contextMenu(this.getMenu(), e).then(this.focus);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
menu(viaKeyboard = false) {
|
menu(viaKeyboard = false) {
|
||||||
@ -858,7 +864,7 @@ export default defineComponent({
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.note {
|
.tkcbzcuz {
|
||||||
position: relative;
|
position: relative;
|
||||||
transition: box-shadow 0.1s ease;
|
transition: box-shadow 0.1s ease;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
@ -8,10 +8,10 @@
|
|||||||
<MkError v-if="error" @retry="init()"/>
|
<MkError v-if="error" @retry="init()"/>
|
||||||
|
|
||||||
<div v-show="more && reversed" style="margin-bottom: var(--margin);">
|
<div v-show="more && reversed" style="margin-bottom: var(--margin);">
|
||||||
<button class="_loadMore" @click="fetchMore" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }">
|
<MkButton style="margin: 0 auto;" @click="fetchMoreFeature" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }">
|
||||||
<template v-if="!moreFetching">{{ $ts.loadMore }}</template>
|
<template v-if="!moreFetching">{{ $ts.loadMore }}</template>
|
||||||
<template v-if="moreFetching"><MkLoading inline/></template>
|
<template v-if="moreFetching"><MkLoading inline/></template>
|
||||||
</button>
|
</MkButton>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<XList ref="notes" :items="notes" v-slot="{ item: note }" :direction="reversed ? 'up' : 'down'" :reversed="reversed">
|
<XList ref="notes" :items="notes" v-slot="{ item: note }" :direction="reversed ? 'up' : 'down'" :reversed="reversed">
|
||||||
@ -19,10 +19,10 @@
|
|||||||
</XList>
|
</XList>
|
||||||
|
|
||||||
<div v-show="more && !reversed" style="margin-top: var(--margin);">
|
<div v-show="more && !reversed" style="margin-top: var(--margin);">
|
||||||
<button class="_loadMore" v-appear="$store.state.enableInfiniteScroll ? fetchMore : null" @click="fetchMore" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }">
|
<MkButton style="margin: 0 auto;" v-appear="$store.state.enableInfiniteScroll ? fetchMore : null" @click="fetchMore" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }">
|
||||||
<template v-if="!moreFetching">{{ $ts.loadMore }}</template>
|
<template v-if="!moreFetching">{{ $ts.loadMore }}</template>
|
||||||
<template v-if="moreFetching"><MkLoading inline/></template>
|
<template v-if="moreFetching"><MkLoading inline/></template>
|
||||||
</button>
|
</MkButton>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@ -32,10 +32,11 @@ import { defineComponent } from 'vue';
|
|||||||
import paging from '@/scripts/paging';
|
import paging from '@/scripts/paging';
|
||||||
import XNote from './note.vue';
|
import XNote from './note.vue';
|
||||||
import XList from './date-separated-list.vue';
|
import XList from './date-separated-list.vue';
|
||||||
|
import MkButton from '@/components/ui/button.vue';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: {
|
components: {
|
||||||
XNote, XList,
|
XNote, XList, MkButton,
|
||||||
},
|
},
|
||||||
|
|
||||||
mixins: [
|
mixins: [
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mfcuwfyp">
|
<div class="mfcuwfyp _noGap_">
|
||||||
<XList class="notifications" :items="items" v-slot="{ item: notification }">
|
<XList class="notifications" :items="items" v-slot="{ item: notification }">
|
||||||
<XNote v-if="['reply', 'quote', 'mention'].includes(notification.type)" :note="notification.note" @update:note="noteUpdated(notification.note, $event)" :key="notification.id"/>
|
<XNote v-if="['reply', 'quote', 'mention'].includes(notification.type)" :note="notification.note" @update:note="noteUpdated(notification.note, $event)" :key="notification.id"/>
|
||||||
<XNotification v-else :notification="notification" :with-time="true" :full="true" class="_panel notification" :key="notification.id"/>
|
<XNotification v-else :notification="notification" :with-time="true" :full="true" class="_panel notification" :key="notification.id"/>
|
||||||
</XList>
|
</XList>
|
||||||
|
|
||||||
<button class="_loadMore" v-appear="$store.state.enableInfiniteScroll ? fetchMore : null" @click="fetchMore" v-show="more" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }">
|
<button class="_buttonPrimary" v-appear="$store.state.enableInfiniteScroll ? fetchMore : null" @click="fetchMore" v-show="more" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }">
|
||||||
<template v-if="!moreFetching">{{ $ts.loadMore }}</template>
|
<template v-if="!moreFetching">{{ $ts.loadMore }}</template>
|
||||||
<template v-if="moreFetching"><MkLoading inline/></template>
|
<template v-if="moreFetching"><MkLoading inline/></template>
|
||||||
</button>
|
</button>
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
<template>
|
<template>
|
||||||
<component :is="'x-' + value.type" :value="value" :page="page" :hpml="hpml" :key="value.id" :h="h"/>
|
<component :is="'x-' + block.type" :block="block" :hpml="hpml" :key="block.id" :h="h"/>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent, PropType } from 'vue';
|
||||||
import XText from './page.text.vue';
|
import XText from './page.text.vue';
|
||||||
import XSection from './page.section.vue';
|
import XSection from './page.section.vue';
|
||||||
import XImage from './page.image.vue';
|
import XImage from './page.image.vue';
|
||||||
@ -19,22 +19,24 @@ import XCounter from './page.counter.vue';
|
|||||||
import XRadioButton from './page.radio-button.vue';
|
import XRadioButton from './page.radio-button.vue';
|
||||||
import XCanvas from './page.canvas.vue';
|
import XCanvas from './page.canvas.vue';
|
||||||
import XNote from './page.note.vue';
|
import XNote from './page.note.vue';
|
||||||
|
import { Hpml } from '@/scripts/hpml/evaluator';
|
||||||
|
import { Block } from '@/scripts/hpml/block';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: {
|
components: {
|
||||||
XText, XSection, XImage, XButton, XNumberInput, XTextInput, XTextareaInput, XTextarea, XPost, XSwitch, XIf, XCounter, XRadioButton, XCanvas, XNote
|
XText, XSection, XImage, XButton, XNumberInput, XTextInput, XTextareaInput, XTextarea, XPost, XSwitch, XIf, XCounter, XRadioButton, XCanvas, XNote
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
value: {
|
block: {
|
||||||
|
type: Object as PropType<Block>,
|
||||||
required: true
|
required: true
|
||||||
},
|
},
|
||||||
hpml: {
|
hpml: {
|
||||||
required: true
|
type: Object as PropType<Hpml>,
|
||||||
},
|
|
||||||
page: {
|
|
||||||
required: true
|
required: true
|
||||||
},
|
},
|
||||||
h: {
|
h: {
|
||||||
|
type: Number,
|
||||||
required: true
|
required: true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -1,51 +1,55 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<MkButton class="kudkigyw" @click="click()" :primary="value.primary">{{ hpml.interpolate(value.text) }}</MkButton>
|
<MkButton class="kudkigyw" @click="click()" :primary="block.primary">{{ hpml.interpolate(block.text) }}</MkButton>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent, PropType, unref } from 'vue';
|
||||||
import MkButton from '../ui/button.vue';
|
import MkButton from '../ui/button.vue';
|
||||||
import * as os from '@/os';
|
import * as os from '@/os';
|
||||||
|
import { ButtonBlock } from '@/scripts/hpml/block';
|
||||||
|
import { Hpml } from '@/scripts/hpml/evaluator';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: {
|
components: {
|
||||||
MkButton
|
MkButton
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
value: {
|
block: {
|
||||||
|
type: Object as PropType<ButtonBlock>,
|
||||||
required: true
|
required: true
|
||||||
},
|
},
|
||||||
hpml: {
|
hpml: {
|
||||||
|
type: Object as PropType<Hpml>,
|
||||||
required: true
|
required: true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
click() {
|
click() {
|
||||||
if (this.value.action === 'dialog') {
|
if (this.block.action === 'dialog') {
|
||||||
this.hpml.eval();
|
this.hpml.eval();
|
||||||
os.dialog({
|
os.dialog({
|
||||||
text: this.hpml.interpolate(this.value.content)
|
text: this.hpml.interpolate(this.block.content)
|
||||||
});
|
});
|
||||||
} else if (this.value.action === 'resetRandom') {
|
} else if (this.block.action === 'resetRandom') {
|
||||||
this.hpml.updateRandomSeed(Math.random());
|
this.hpml.updateRandomSeed(Math.random());
|
||||||
this.hpml.eval();
|
this.hpml.eval();
|
||||||
} else if (this.value.action === 'pushEvent') {
|
} else if (this.block.action === 'pushEvent') {
|
||||||
os.api('page-push', {
|
os.api('page-push', {
|
||||||
pageId: this.hpml.page.id,
|
pageId: this.hpml.page.id,
|
||||||
event: this.value.event,
|
event: this.block.event,
|
||||||
...(this.value.var ? {
|
...(this.block.var ? {
|
||||||
var: this.hpml.vars[this.value.var]
|
var: unref(this.hpml.vars)[this.block.var]
|
||||||
} : {})
|
} : {})
|
||||||
});
|
});
|
||||||
|
|
||||||
os.dialog({
|
os.dialog({
|
||||||
type: 'success',
|
type: 'success',
|
||||||
text: this.hpml.interpolate(this.value.message)
|
text: this.hpml.interpolate(this.block.message)
|
||||||
});
|
});
|
||||||
} else if (this.value.action === 'callAiScript') {
|
} else if (this.block.action === 'callAiScript') {
|
||||||
this.hpml.callAiScript(this.value.fn);
|
this.hpml.callAiScript(this.block.fn);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,24 +1,36 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="ysrxegms">
|
<div class="ysrxegms">
|
||||||
<canvas ref="canvas" :width="value.width" :height="value.height"/>
|
<canvas ref="canvas" :width="block.width" :height="block.height"/>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent, onMounted, PropType, Ref, ref } from 'vue';
|
||||||
import * as os from '@/os';
|
import * as os from '@/os';
|
||||||
|
import { CanvasBlock } from '@/scripts/hpml/block';
|
||||||
|
import { Hpml } from '@/scripts/hpml/evaluator';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
props: {
|
props: {
|
||||||
value: {
|
block: {
|
||||||
|
type: Object as PropType<CanvasBlock>,
|
||||||
required: true
|
required: true
|
||||||
},
|
},
|
||||||
hpml: {
|
hpml: {
|
||||||
|
type: Object as PropType<Hpml>,
|
||||||
required: true
|
required: true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
setup(props, ctx) {
|
||||||
this.hpml.registerCanvas(this.value.name, this.$refs.canvas);
|
const canvas: Ref<any> = ref(null);
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
props.hpml.registerCanvas(props.block.name, canvas.value);
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
canvas
|
||||||
|
};
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
@ -1,41 +1,43 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<MkButton class="llumlmnx" @click="click()">{{ hpml.interpolate(value.text) }}</MkButton>
|
<MkButton class="llumlmnx" @click="click()">{{ hpml.interpolate(block.text) }}</MkButton>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { computed, defineComponent, PropType } from 'vue';
|
||||||
import MkButton from '../ui/button.vue';
|
import MkButton from '../ui/button.vue';
|
||||||
import * as os from '@/os';
|
import * as os from '@/os';
|
||||||
|
import { CounterVarBlock } from '@/scripts/hpml/block';
|
||||||
|
import { Hpml } from '@/scripts/hpml/evaluator';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: {
|
components: {
|
||||||
MkButton
|
MkButton
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
value: {
|
block: {
|
||||||
|
type: Object as PropType<CounterVarBlock>,
|
||||||
required: true
|
required: true
|
||||||
},
|
},
|
||||||
hpml: {
|
hpml: {
|
||||||
|
type: Object as PropType<Hpml>,
|
||||||
required: true
|
required: true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
setup(props, ctx) {
|
||||||
|
const value = computed(() => {
|
||||||
|
return props.hpml.vars.value[props.block.name];
|
||||||
|
});
|
||||||
|
|
||||||
|
function click() {
|
||||||
|
props.hpml.updatePageVar(props.block.name, value.value + (props.block.inc || 1));
|
||||||
|
props.hpml.eval();
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
v: 0,
|
click
|
||||||
};
|
};
|
||||||
},
|
|
||||||
watch: {
|
|
||||||
v() {
|
|
||||||
this.hpml.updatePageVar(this.value.name, this.v);
|
|
||||||
this.hpml.eval();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
click() {
|
|
||||||
this.v = this.v + (this.value.inc || 1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
@ -1,27 +1,29 @@
|
|||||||
<template>
|
<template>
|
||||||
<div v-show="hpml.vars[value.var]">
|
<div v-show="hpml.vars.value[block.var]">
|
||||||
<XBlock v-for="child in value.children" :value="child" :page="page" :hpml="hpml" :key="child.id" :h="h"/>
|
<XBlock v-for="child in block.children" :block="child" :hpml="hpml" :key="child.id" :h="h"/>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent, defineAsyncComponent } from 'vue';
|
import { IfBlock } from '@/scripts/hpml/block';
|
||||||
|
import { Hpml } from '@/scripts/hpml/evaluator';
|
||||||
|
import { defineComponent, defineAsyncComponent, PropType } from 'vue';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: {
|
components: {
|
||||||
XBlock: defineAsyncComponent(() => import('./page.block.vue'))
|
XBlock: defineAsyncComponent(() => import('./page.block.vue'))
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
value: {
|
block: {
|
||||||
|
type: Object as PropType<IfBlock>,
|
||||||
required: true
|
required: true
|
||||||
},
|
},
|
||||||
hpml: {
|
hpml: {
|
||||||
required: true
|
type: Object as PropType<Hpml>,
|
||||||
},
|
|
||||||
page: {
|
|
||||||
required: true
|
required: true
|
||||||
},
|
},
|
||||||
h: {
|
h: {
|
||||||
|
type: Number,
|
||||||
required: true
|
required: true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -5,25 +5,28 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent, PropType } from 'vue';
|
||||||
import * as os from '@/os';
|
import * as os from '@/os';
|
||||||
|
import { ImageBlock } from '@/scripts/hpml/block';
|
||||||
|
import { Hpml } from '@/scripts/hpml/evaluator';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
props: {
|
props: {
|
||||||
value: {
|
block: {
|
||||||
|
type: Object as PropType<ImageBlock>,
|
||||||
required: true
|
required: true
|
||||||
},
|
},
|
||||||
page: {
|
hpml: {
|
||||||
|
type: Object as PropType<Hpml>,
|
||||||
required: true
|
required: true
|
||||||
},
|
}
|
||||||
},
|
},
|
||||||
data() {
|
setup(props, ctx) {
|
||||||
|
const image = props.hpml.page.attachedFiles.find(x => x.id === props.block.fileId);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
image: null,
|
image
|
||||||
};
|
};
|
||||||
},
|
|
||||||
created() {
|
|
||||||
this.image = this.page.attachedFiles.find(x => x.id === this.value.fileId);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
@ -1,33 +1,41 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="voxdxuby">
|
<div class="voxdxuby">
|
||||||
<XNote v-if="note" v-model:note="note" :key="note.id" :detail="value.detailed"/>
|
<XNote v-if="note && !block.detailed" v-model:note="note" :key="note.id + ':normal'"/>
|
||||||
|
<XNoteDetailed v-if="note && block.detailed" v-model:note="note" :key="note.id + ':detail'"/>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent, onMounted, PropType, Ref, ref } from 'vue';
|
||||||
import XNote from '@/components/note.vue';
|
import XNote from '@/components/note.vue';
|
||||||
|
import XNoteDetailed from '@/components/note-detailed.vue';
|
||||||
import * as os from '@/os';
|
import * as os from '@/os';
|
||||||
|
import { NoteBlock } from '@/scripts/hpml/block';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: {
|
components: {
|
||||||
XNote
|
XNote,
|
||||||
|
XNoteDetailed,
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
value: {
|
block: {
|
||||||
required: true
|
type: Object as PropType<NoteBlock>,
|
||||||
},
|
|
||||||
hpml: {
|
|
||||||
required: true
|
required: true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
setup(props, ctx) {
|
||||||
|
const note: Ref<Record<string, any> | null> = ref(null);
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
os.api('notes/show', { noteId: props.block.note })
|
||||||
|
.then(result => {
|
||||||
|
note.value = result;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
return {
|
return {
|
||||||
note: null,
|
note
|
||||||
};
|
};
|
||||||
},
|
|
||||||
async mounted() {
|
|
||||||
this.note = await os.api('notes/show', { noteId: this.value.note });
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
@ -1,36 +1,44 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<MkInput class="kudkigyw" v-model:value="v" type="number">{{ hpml.interpolate(value.text) }}</MkInput>
|
<MkInput class="kudkigyw" :value="value" @update:value="updateValue($event)" type="number">{{ hpml.interpolate(block.text) }}</MkInput>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { computed, defineComponent, PropType } from 'vue';
|
||||||
import MkInput from '../ui/input.vue';
|
import MkInput from '../ui/input.vue';
|
||||||
import * as os from '@/os';
|
import * as os from '@/os';
|
||||||
|
import { Hpml } from '@/scripts/hpml/evaluator';
|
||||||
|
import { NumberInputVarBlock } from '@/scripts/hpml/block';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: {
|
components: {
|
||||||
MkInput
|
MkInput
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
value: {
|
block: {
|
||||||
|
type: Object as PropType<NumberInputVarBlock>,
|
||||||
required: true
|
required: true
|
||||||
},
|
},
|
||||||
hpml: {
|
hpml: {
|
||||||
|
type: Object as PropType<Hpml>,
|
||||||
required: true
|
required: true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
setup(props, ctx) {
|
||||||
return {
|
const value = computed(() => {
|
||||||
v: this.value.default,
|
return props.hpml.vars.value[props.block.name];
|
||||||
};
|
});
|
||||||
},
|
|
||||||
watch: {
|
function updateValue(newValue) {
|
||||||
v() {
|
props.hpml.updatePageVar(props.block.name, newValue);
|
||||||
this.hpml.updatePageVar(this.value.name, this.v);
|
props.hpml.eval();
|
||||||
this.hpml.eval();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
value,
|
||||||
|
updateValue
|
||||||
|
};
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
@ -6,12 +6,14 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent, PropType } from 'vue';
|
||||||
import { faCheck, faPaperPlane } from '@fortawesome/free-solid-svg-icons';
|
import { faCheck, faPaperPlane } from '@fortawesome/free-solid-svg-icons';
|
||||||
import MkTextarea from '../ui/textarea.vue';
|
import MkTextarea from '../ui/textarea.vue';
|
||||||
import MkButton from '../ui/button.vue';
|
import MkButton from '../ui/button.vue';
|
||||||
import { apiUrl } from '@/config';
|
import { apiUrl } from '@/config';
|
||||||
import * as os from '@/os';
|
import * as os from '@/os';
|
||||||
|
import { PostBlock } from '@/scripts/hpml/block';
|
||||||
|
import { Hpml } from '@/scripts/hpml/evaluator';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: {
|
components: {
|
||||||
@ -19,16 +21,18 @@ export default defineComponent({
|
|||||||
MkButton,
|
MkButton,
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
value: {
|
block: {
|
||||||
|
type: Object as PropType<PostBlock>,
|
||||||
required: true
|
required: true
|
||||||
},
|
},
|
||||||
hpml: {
|
hpml: {
|
||||||
|
type: Object as PropType<Hpml>,
|
||||||
required: true
|
required: true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
text: this.hpml.interpolate(this.value.text),
|
text: this.hpml.interpolate(this.block.text),
|
||||||
posted: false,
|
posted: false,
|
||||||
posting: false,
|
posting: false,
|
||||||
faCheck, faPaperPlane
|
faCheck, faPaperPlane
|
||||||
@ -37,7 +41,7 @@ export default defineComponent({
|
|||||||
watch: {
|
watch: {
|
||||||
'hpml.vars': {
|
'hpml.vars': {
|
||||||
handler() {
|
handler() {
|
||||||
this.text = this.hpml.interpolate(this.value.text);
|
this.text = this.hpml.interpolate(this.block.text);
|
||||||
},
|
},
|
||||||
deep: true
|
deep: true
|
||||||
}
|
}
|
||||||
@ -45,7 +49,7 @@ export default defineComponent({
|
|||||||
methods: {
|
methods: {
|
||||||
upload() {
|
upload() {
|
||||||
const promise = new Promise((ok) => {
|
const promise = new Promise((ok) => {
|
||||||
const canvas = this.hpml.canvases[this.value.canvasId];
|
const canvas = this.hpml.canvases[this.block.canvasId];
|
||||||
canvas.toBlob(blob => {
|
canvas.toBlob(blob => {
|
||||||
const data = new FormData();
|
const data = new FormData();
|
||||||
data.append('file', blob);
|
data.append('file', blob);
|
||||||
@ -69,7 +73,7 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
async post() {
|
async post() {
|
||||||
this.posting = true;
|
this.posting = true;
|
||||||
const file = this.value.attachCanvasImage ? await this.upload() : null;
|
const file = this.block.attachCanvasImage ? await this.upload() : null;
|
||||||
os.apiWithDialog('notes/create', {
|
os.apiWithDialog('notes/create', {
|
||||||
text: this.text === '' ? null : this.text,
|
text: this.text === '' ? null : this.text,
|
||||||
fileIds: file ? [file.id] : undefined,
|
fileIds: file ? [file.id] : undefined,
|
||||||
|
@ -1,37 +1,45 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<div>{{ hpml.interpolate(value.title) }}</div>
|
<div>{{ hpml.interpolate(block.title) }}</div>
|
||||||
<MkRadio v-for="x in value.values" v-model="v" :value="x" :key="x">{{ x }}</MkRadio>
|
<MkRadio v-for="item in block.values" :modelValue="value" @update:modelValue="updateValue($event)" :value="item" :key="item">{{ item }}</MkRadio>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { computed, defineComponent, PropType } from 'vue';
|
||||||
import MkRadio from '../ui/radio.vue';
|
import MkRadio from '../ui/radio.vue';
|
||||||
import * as os from '@/os';
|
import * as os from '@/os';
|
||||||
|
import { Hpml } from '@/scripts/hpml/evaluator';
|
||||||
|
import { RadioButtonVarBlock } from '@/scripts/hpml/block';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: {
|
components: {
|
||||||
MkRadio
|
MkRadio
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
value: {
|
block: {
|
||||||
|
type: Object as PropType<RadioButtonVarBlock>,
|
||||||
required: true
|
required: true
|
||||||
},
|
},
|
||||||
hpml: {
|
hpml: {
|
||||||
|
type: Object as PropType<Hpml>,
|
||||||
required: true
|
required: true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
setup(props, ctx) {
|
||||||
return {
|
const value = computed(() => {
|
||||||
v: this.value.default,
|
return props.hpml.vars.value[props.block.name];
|
||||||
};
|
});
|
||||||
},
|
|
||||||
watch: {
|
function updateValue(newValue: string) {
|
||||||
v() {
|
props.hpml.updatePageVar(props.block.name, newValue);
|
||||||
this.hpml.updatePageVar(this.value.name, this.v);
|
props.hpml.eval();
|
||||||
this.hpml.eval();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
value,
|
||||||
|
updateValue
|
||||||
|
};
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
@ -1,29 +1,30 @@
|
|||||||
<template>
|
<template>
|
||||||
<section class="sdgxphyu">
|
<section class="sdgxphyu">
|
||||||
<component :is="'h' + h">{{ value.title }}</component>
|
<component :is="'h' + h">{{ block.title }}</component>
|
||||||
|
|
||||||
<div class="children">
|
<div class="children">
|
||||||
<XBlock v-for="child in value.children" :value="child" :page="page" :hpml="hpml" :key="child.id" :h="h + 1"/>
|
<XBlock v-for="child in block.children" :block="child" :hpml="hpml" :key="child.id" :h="h + 1"/>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent, defineAsyncComponent } from 'vue';
|
import { defineComponent, defineAsyncComponent, PropType } from 'vue';
|
||||||
import * as os from '@/os';
|
import * as os from '@/os';
|
||||||
|
import { SectionBlock } from '@/scripts/hpml/block';
|
||||||
|
import { Hpml } from '@/scripts/hpml/evaluator';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: {
|
components: {
|
||||||
XBlock: defineAsyncComponent(() => import('./page.block.vue'))
|
XBlock: defineAsyncComponent(() => import('./page.block.vue'))
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
value: {
|
block: {
|
||||||
|
type: Object as PropType<SectionBlock>,
|
||||||
required: true
|
required: true
|
||||||
},
|
},
|
||||||
hpml: {
|
hpml: {
|
||||||
required: true
|
type: Object as PropType<Hpml>,
|
||||||
},
|
|
||||||
page: {
|
|
||||||
required: true
|
required: true
|
||||||
},
|
},
|
||||||
h: {
|
h: {
|
||||||
|
@ -1,36 +1,44 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="hkcxmtwj">
|
<div class="hkcxmtwj">
|
||||||
<MkSwitch v-model:value="v">{{ hpml.interpolate(value.text) }}</MkSwitch>
|
<MkSwitch :value="value" @update:value="updateValue($event)">{{ hpml.interpolate(block.text) }}</MkSwitch>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { computed, defineComponent, PropType } from 'vue';
|
||||||
import MkSwitch from '../ui/switch.vue';
|
import MkSwitch from '../ui/switch.vue';
|
||||||
import * as os from '@/os';
|
import * as os from '@/os';
|
||||||
|
import { Hpml } from '@/scripts/hpml/evaluator';
|
||||||
|
import { SwitchVarBlock } from '@/scripts/hpml/block';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: {
|
components: {
|
||||||
MkSwitch
|
MkSwitch
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
value: {
|
block: {
|
||||||
|
type: Object as PropType<SwitchVarBlock>,
|
||||||
required: true
|
required: true
|
||||||
},
|
},
|
||||||
hpml: {
|
hpml: {
|
||||||
|
type: Object as PropType<Hpml>,
|
||||||
required: true
|
required: true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
setup(props, ctx) {
|
||||||
return {
|
const value = computed(() => {
|
||||||
v: this.value.default,
|
return props.hpml.vars.value[props.block.name];
|
||||||
};
|
});
|
||||||
},
|
|
||||||
watch: {
|
function updateValue(newValue: boolean) {
|
||||||
v() {
|
props.hpml.updatePageVar(props.block.name, newValue);
|
||||||
this.hpml.updatePageVar(this.value.name, this.v);
|
props.hpml.eval();
|
||||||
this.hpml.eval();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
value,
|
||||||
|
updateValue
|
||||||
|
};
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
@ -1,36 +1,44 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<MkInput class="kudkigyw" v-model:value="v" type="text">{{ hpml.interpolate(value.text) }}</MkInput>
|
<MkInput class="kudkigyw" :value="value" @update:value="updateValue($event)" type="text">{{ hpml.interpolate(block.text) }}</MkInput>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { computed, defineComponent, PropType } from 'vue';
|
||||||
import MkInput from '../ui/input.vue';
|
import MkInput from '../ui/input.vue';
|
||||||
import * as os from '@/os';
|
import * as os from '@/os';
|
||||||
|
import { Hpml } from '@/scripts/hpml/evaluator';
|
||||||
|
import { TextInputVarBlock } from '@/scripts/hpml/block';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: {
|
components: {
|
||||||
MkInput
|
MkInput
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
value: {
|
block: {
|
||||||
|
type: Object as PropType<TextInputVarBlock>,
|
||||||
required: true
|
required: true
|
||||||
},
|
},
|
||||||
hpml: {
|
hpml: {
|
||||||
|
type: Object as PropType<Hpml>,
|
||||||
required: true
|
required: true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
setup(props, ctx) {
|
||||||
return {
|
const value = computed(() => {
|
||||||
v: this.value.default,
|
return props.hpml.vars.value[props.block.name];
|
||||||
};
|
});
|
||||||
},
|
|
||||||
watch: {
|
function updateValue(newValue) {
|
||||||
v() {
|
props.hpml.updatePageVar(props.block.name, newValue);
|
||||||
this.hpml.updatePageVar(this.value.name, this.v);
|
props.hpml.eval();
|
||||||
this.hpml.eval();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
value,
|
||||||
|
updateValue
|
||||||
|
};
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
@ -6,7 +6,9 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineAsyncComponent, defineComponent } from 'vue';
|
import { TextBlock } from '@/scripts/hpml/block';
|
||||||
|
import { Hpml } from '@/scripts/hpml/evaluator';
|
||||||
|
import { defineAsyncComponent, defineComponent, PropType } from 'vue';
|
||||||
import { parse } from '../../../mfm/parse';
|
import { parse } from '../../../mfm/parse';
|
||||||
import { unique } from '../../../prelude/array';
|
import { unique } from '../../../prelude/array';
|
||||||
|
|
||||||
@ -15,16 +17,18 @@ export default defineComponent({
|
|||||||
MkUrlPreview: defineAsyncComponent(() => import('@/components/url-preview.vue')),
|
MkUrlPreview: defineAsyncComponent(() => import('@/components/url-preview.vue')),
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
value: {
|
block: {
|
||||||
|
type: Object as PropType<TextBlock>,
|
||||||
required: true
|
required: true
|
||||||
},
|
},
|
||||||
hpml: {
|
hpml: {
|
||||||
|
type: Object as PropType<Hpml>,
|
||||||
required: true
|
required: true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
text: this.hpml.interpolate(this.value.text),
|
text: this.hpml.interpolate(this.block.text),
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
@ -43,7 +47,7 @@ export default defineComponent({
|
|||||||
watch: {
|
watch: {
|
||||||
'hpml.vars': {
|
'hpml.vars': {
|
||||||
handler() {
|
handler() {
|
||||||
this.text = this.hpml.interpolate(this.value.text);
|
this.text = this.hpml.interpolate(this.block.text);
|
||||||
},
|
},
|
||||||
deep: true
|
deep: true
|
||||||
}
|
}
|
||||||
|
@ -1,36 +1,45 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<MkTextarea v-model:value="v">{{ hpml.interpolate(value.text) }}</MkTextarea>
|
<MkTextarea :value="value" @update:value="updateValue($event)">{{ hpml.interpolate(block.text) }}</MkTextarea>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { computed, defineComponent, PropType } from 'vue';
|
||||||
import MkTextarea from '../ui/textarea.vue';
|
import MkTextarea from '../ui/textarea.vue';
|
||||||
import * as os from '@/os';
|
import * as os from '@/os';
|
||||||
|
import { Hpml } from '@/scripts/hpml/evaluator';
|
||||||
|
import { HpmlTextInput } from '@/scripts/hpml';
|
||||||
|
import { TextInputVarBlock } from '@/scripts/hpml/block';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: {
|
components: {
|
||||||
MkTextarea
|
MkTextarea
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
value: {
|
block: {
|
||||||
|
type: Object as PropType<TextInputVarBlock>,
|
||||||
required: true
|
required: true
|
||||||
},
|
},
|
||||||
hpml: {
|
hpml: {
|
||||||
|
type: Object as PropType<Hpml>,
|
||||||
required: true
|
required: true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
setup(props, ctx) {
|
||||||
return {
|
const value = computed(() => {
|
||||||
v: this.value.default,
|
return props.hpml.vars.value[props.block.name];
|
||||||
};
|
});
|
||||||
},
|
|
||||||
watch: {
|
function updateValue(newValue) {
|
||||||
v() {
|
props.hpml.updatePageVar(props.block.name, newValue);
|
||||||
this.hpml.updatePageVar(this.value.name, this.v);
|
props.hpml.eval();
|
||||||
this.hpml.eval();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
value,
|
||||||
|
updateValue
|
||||||
|
};
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
@ -3,7 +3,9 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { TextBlock } from '@/scripts/hpml/block';
|
||||||
|
import { Hpml } from '@/scripts/hpml/evaluator';
|
||||||
|
import { defineComponent, PropType } from 'vue';
|
||||||
import MkTextarea from '../ui/textarea.vue';
|
import MkTextarea from '../ui/textarea.vue';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
@ -11,22 +13,24 @@ export default defineComponent({
|
|||||||
MkTextarea
|
MkTextarea
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
value: {
|
block: {
|
||||||
|
type: Object as PropType<TextBlock>,
|
||||||
required: true
|
required: true
|
||||||
},
|
},
|
||||||
hpml: {
|
hpml: {
|
||||||
|
type: Object as PropType<Hpml>,
|
||||||
required: true
|
required: true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
text: this.hpml.interpolate(this.value.text),
|
text: this.hpml.interpolate(this.block.text),
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
'hpml.vars': {
|
'hpml.vars': {
|
||||||
handler() {
|
handler() {
|
||||||
this.text = this.hpml.interpolate(this.value.text);
|
this.text = this.hpml.interpolate(this.block.text);
|
||||||
},
|
},
|
||||||
deep: true
|
deep: true
|
||||||
}
|
}
|
||||||
|
@ -1,77 +1,72 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="iroscrza" :class="{ center: page.alignCenter, serif: page.font === 'serif' }" v-if="hpml">
|
<div class="iroscrza" :class="{ center: page.alignCenter, serif: page.font === 'serif' }" v-if="hpml">
|
||||||
<XBlock v-for="child in page.content" :value="child" :page="page" :hpml="hpml" :key="child.id" :h="2"/>
|
<XBlock v-for="child in page.content" :block="child" :hpml="hpml" :key="child.id" :h="2"/>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent, onMounted, nextTick, onUnmounted, PropType } from 'vue';
|
||||||
import { parse } from '@syuilo/aiscript';
|
import { parse } from '@syuilo/aiscript';
|
||||||
import { faHeart as faHeartS } from '@fortawesome/free-solid-svg-icons';
|
|
||||||
import { faHeart } from '@fortawesome/free-regular-svg-icons';
|
|
||||||
import XBlock from './page.block.vue';
|
import XBlock from './page.block.vue';
|
||||||
import { Hpml } from '@/scripts/hpml/evaluator';
|
import { Hpml } from '@/scripts/hpml/evaluator';
|
||||||
import { url } from '@/config';
|
import { url } from '@/config';
|
||||||
|
import { $i } from '@/account';
|
||||||
|
import { defaultStore } from '@/store';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: {
|
components: {
|
||||||
XBlock
|
XBlock
|
||||||
},
|
},
|
||||||
|
|
||||||
props: {
|
props: {
|
||||||
page: {
|
page: {
|
||||||
type: Object,
|
type: Object as PropType<Record<string, any>>,
|
||||||
required: true
|
required: true
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
setup(props, ctx) {
|
||||||
|
|
||||||
data() {
|
const hpml = new Hpml(props.page, {
|
||||||
return {
|
|
||||||
hpml: null,
|
|
||||||
faHeartS, faHeart
|
|
||||||
};
|
|
||||||
},
|
|
||||||
|
|
||||||
created() {
|
|
||||||
this.hpml = new Hpml(this.page, {
|
|
||||||
randomSeed: Math.random(),
|
randomSeed: Math.random(),
|
||||||
visitor: this.$i,
|
visitor: $i,
|
||||||
url: url,
|
url: url,
|
||||||
enableAiScript: !this.$store.state.disablePagesScript
|
enableAiScript: !defaultStore.state.disablePagesScript
|
||||||
});
|
});
|
||||||
},
|
|
||||||
|
|
||||||
mounted() {
|
onMounted(() => {
|
||||||
this.$nextTick(() => {
|
nextTick(() => {
|
||||||
if (this.page.script && this.hpml.aiscript) {
|
if (props.page.script && hpml.aiscript) {
|
||||||
let ast;
|
let ast;
|
||||||
try {
|
try {
|
||||||
ast = parse(this.page.script);
|
ast = parse(props.page.script);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error(e);
|
console.error(e);
|
||||||
/*os.dialog({
|
/*os.dialog({
|
||||||
type: 'error',
|
type: 'error',
|
||||||
text: 'Syntax error :('
|
text: 'Syntax error :('
|
||||||
});*/
|
});*/
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
hpml.aiscript.exec(ast).then(() => {
|
||||||
|
hpml.eval();
|
||||||
|
}).catch(e => {
|
||||||
|
console.error(e);
|
||||||
|
/*os.dialog({
|
||||||
|
type: 'error',
|
||||||
|
text: e
|
||||||
|
});*/
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
hpml.eval();
|
||||||
}
|
}
|
||||||
this.hpml.aiscript.exec(ast).then(() => {
|
});
|
||||||
this.hpml.eval();
|
onUnmounted(() => {
|
||||||
}).catch(e => {
|
if (hpml.aiscript) hpml.aiscript.abort();
|
||||||
console.error(e);
|
});
|
||||||
/*os.dialog({
|
|
||||||
type: 'error',
|
|
||||||
text: e
|
|
||||||
});*/
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
this.hpml.eval();
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
},
|
|
||||||
|
|
||||||
beforeUnmount() {
|
return {
|
||||||
if (this.hpml.aiscript) this.hpml.aiscript.abort();
|
hpml,
|
||||||
|
};
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
<header>
|
<header>
|
||||||
<button v-if="!fixed" class="cancel _button" @click="cancel"><Fa :icon="faTimes"/></button>
|
<button v-if="!fixed" class="cancel _button" @click="cancel"><Fa :icon="faTimes"/></button>
|
||||||
<div>
|
<div>
|
||||||
<span class="text-count" :class="{ over: trimmedLength(text) > max }">{{ max - trimmedLength(text) }}</span>
|
<span class="text-count" :class="{ over: textLength > max }">{{ max - textLength }}</span>
|
||||||
<span class="local-only" v-if="localOnly"><Fa :icon="faBiohazard"/></span>
|
<span class="local-only" v-if="localOnly"><Fa :icon="faBiohazard"/></span>
|
||||||
<button class="_button visibility" @click="setVisibility" ref="visibilityButton" v-tooltip="$ts.visibility" :disabled="channel != null">
|
<button class="_button visibility" @click="setVisibility" ref="visibilityButton" v-tooltip="$ts.visibility" :disabled="channel != null">
|
||||||
<span v-if="visibility === 'public'"><Fa :icon="faGlobe"/></span>
|
<span v-if="visibility === 'public'"><Fa :icon="faGlobe"/></span>
|
||||||
@ -35,7 +35,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<input v-show="useCw" ref="cw" class="cw" v-model="cw" :placeholder="$ts.annotation" @keydown="onKeydown">
|
<input v-show="useCw" ref="cw" class="cw" v-model="cw" :placeholder="$ts.annotation" @keydown="onKeydown">
|
||||||
<textarea v-model="text" class="text" :class="{ withCw: useCw }" ref="text" :disabled="posting" :placeholder="placeholder" @keydown="onKeydown" @paste="onPaste"></textarea>
|
<textarea v-model="text" class="text" :class="{ withCw: useCw }" ref="text" :disabled="posting" :placeholder="placeholder" @keydown="onKeydown" @paste="onPaste" @compositionupdate="onCompositionUpdate" @compositionend="onCompositionEnd" />
|
||||||
<XPostFormAttaches class="attaches" :files="files" @updated="updateFiles" @detach="detachFile" @changeSensitive="updateFileSensitive" @changeName="updateFileName"/>
|
<XPostFormAttaches class="attaches" :files="files" @updated="updateFiles" @detach="detachFile" @changeSensitive="updateFileSensitive" @changeName="updateFileName"/>
|
||||||
<XPollEditor v-if="poll" :poll="poll" @destroyed="poll = null" @updated="onPollUpdate"/>
|
<XPollEditor v-if="poll" :poll="poll" @destroyed="poll = null" @updated="onPollUpdate"/>
|
||||||
<footer>
|
<footer>
|
||||||
@ -69,6 +69,8 @@ import { noteVisibilities } from '../../types';
|
|||||||
import * as os from '@/os';
|
import * as os from '@/os';
|
||||||
import { selectFile } from '@/scripts/select-file';
|
import { selectFile } from '@/scripts/select-file';
|
||||||
import { notePostInterruptors, postFormActions } from '@/store';
|
import { notePostInterruptors, postFormActions } from '@/store';
|
||||||
|
import { isMobile } from '@/scripts/is-mobile';
|
||||||
|
import { throttle } from 'throttle-debounce';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: {
|
components: {
|
||||||
@ -142,6 +144,12 @@ export default defineComponent({
|
|||||||
draghover: false,
|
draghover: false,
|
||||||
quoteId: null,
|
quoteId: null,
|
||||||
recentHashtags: JSON.parse(localStorage.getItem('hashtags') || '[]'),
|
recentHashtags: JSON.parse(localStorage.getItem('hashtags') || '[]'),
|
||||||
|
imeText: '',
|
||||||
|
typing: throttle(3000, () => {
|
||||||
|
if (this.channel) {
|
||||||
|
os.stream.send('typingOnChannel', { channel: this.channel.id });
|
||||||
|
}
|
||||||
|
}),
|
||||||
postFormActions,
|
postFormActions,
|
||||||
faReply, faQuoteRight, faPaperPlane, faTimes, faUpload, faPollH, faGlobe, faHome, faUnlock, faEnvelope, faEyeSlash, faLaughSquint, faPlus, faPhotoVideo, faAt, faBiohazard, faPlug
|
faReply, faQuoteRight, faPaperPlane, faTimes, faUpload, faPollH, faGlobe, faHome, faUnlock, faEnvelope, faEyeSlash, faLaughSquint, faPlus, faPhotoVideo, faAt, faBiohazard, faPlug
|
||||||
};
|
};
|
||||||
@ -190,10 +198,14 @@ export default defineComponent({
|
|||||||
: this.$ts.note;
|
: this.$ts.note;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
textLength(): number {
|
||||||
|
return length((this.text + this.imeText).trim());
|
||||||
|
},
|
||||||
|
|
||||||
canPost(): boolean {
|
canPost(): boolean {
|
||||||
return !this.posting &&
|
return !this.posting &&
|
||||||
(1 <= this.text.length || 1 <= this.files.length || this.poll || this.renote) &&
|
(1 <= this.textLength || 1 <= this.files.length || !!this.poll || !!this.renote) &&
|
||||||
(length(this.text.trim()) <= this.max) &&
|
(this.textLength <= this.max) &&
|
||||||
(!this.poll || this.poll.choices.length >= 2);
|
(!this.poll || this.poll.choices.length >= 2);
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -262,7 +274,7 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
|
|
||||||
// keep cw when reply
|
// keep cw when reply
|
||||||
if (this.$store.keepCw && this.reply && this.reply.cw) {
|
if (this.$store.state.keepCw && this.reply && this.reply.cw) {
|
||||||
this.useCw = true;
|
this.useCw = true;
|
||||||
this.cw = this.reply.cw;
|
this.cw = this.reply.cw;
|
||||||
}
|
}
|
||||||
@ -339,10 +351,6 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
trimmedLength(text: string) {
|
|
||||||
return length(text.trim());
|
|
||||||
},
|
|
||||||
|
|
||||||
addTag(tag: string) {
|
addTag(tag: string) {
|
||||||
insertTextAtCursor(this.$refs.text, ` #${tag} `);
|
insertTextAtCursor(this.$refs.text, ` #${tag} `);
|
||||||
},
|
},
|
||||||
@ -429,9 +437,19 @@ export default defineComponent({
|
|||||||
this.quoteId = null;
|
this.quoteId = null;
|
||||||
},
|
},
|
||||||
|
|
||||||
onKeydown(e) {
|
onKeydown(e: KeyboardEvent) {
|
||||||
if ((e.which === 10 || e.which === 13) && (e.ctrlKey || e.metaKey) && this.canPost) this.post();
|
if ((e.which === 10 || e.which === 13) && (e.ctrlKey || e.metaKey) && this.canPost) this.post();
|
||||||
if (e.which === 27) this.$emit('esc');
|
if (e.which === 27) this.$emit('esc');
|
||||||
|
this.typing();
|
||||||
|
},
|
||||||
|
|
||||||
|
onCompositionUpdate(e: CompositionEvent) {
|
||||||
|
this.imeText = e.data;
|
||||||
|
this.typing();
|
||||||
|
},
|
||||||
|
|
||||||
|
onCompositionEnd(e: CompositionEvent) {
|
||||||
|
this.imeText = '';
|
||||||
},
|
},
|
||||||
|
|
||||||
async onPaste(e: ClipboardEvent) {
|
async onPaste(e: ClipboardEvent) {
|
||||||
@ -545,7 +563,7 @@ export default defineComponent({
|
|||||||
localOnly: this.localOnly,
|
localOnly: this.localOnly,
|
||||||
visibility: this.visibility,
|
visibility: this.visibility,
|
||||||
visibleUserIds: this.visibility == 'specified' ? this.visibleUsers.map(u => u.id) : undefined,
|
visibleUserIds: this.visibility == 'specified' ? this.visibleUsers.map(u => u.id) : undefined,
|
||||||
viaMobile: os.isMobile
|
viaMobile: isMobile
|
||||||
};
|
};
|
||||||
|
|
||||||
// plugin
|
// plugin
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
<MkButton inline>This is</MkButton>
|
<MkButton inline>This is</MkButton>
|
||||||
<MkButton inline primary>the button</MkButton>
|
<MkButton inline primary>the button</MkButton>
|
||||||
</div>
|
</div>
|
||||||
<div class="_content">
|
<div class="_content" style="pointer-events: none;">
|
||||||
<Mfm :text="mfm"/>
|
<Mfm :text="mfm"/>
|
||||||
</div>
|
</div>
|
||||||
<div class="_content">
|
<div class="_content">
|
||||||
@ -49,9 +49,9 @@ export default defineComponent({
|
|||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
text: '',
|
text: '',
|
||||||
flag: false,
|
flag: true,
|
||||||
radio: 'misskey',
|
radio: 'misskey',
|
||||||
mfm: `Hello world! This is an @example mention. BTW you are @${this.$i.username}.\nAlso, here is ${config.url} and [example link](${config.url}). for more details, see https://example.com.\nAs you know #misskey is open-source software.`
|
mfm: `Hello world! This is an @example mention. BTW you are @${this.$i ? this.$i.username : 'guest'}.\nAlso, here is ${config.url} and [example link](${config.url}). for more details, see https://example.com.\nAs you know #misskey is open-source software.`
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -55,6 +55,14 @@ import { sidebarDef } from '@/sidebar';
|
|||||||
import { getAccounts, addAccount, login } from '@/account';
|
import { getAccounts, addAccount, login } from '@/account';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
|
props: {
|
||||||
|
defaultHidden: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default: false,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
host: host,
|
host: host,
|
||||||
@ -63,7 +71,7 @@ export default defineComponent({
|
|||||||
connection: null,
|
connection: null,
|
||||||
menuDef: sidebarDef,
|
menuDef: sidebarDef,
|
||||||
iconOnly: false,
|
iconOnly: false,
|
||||||
hidden: false,
|
hidden: this.defaultHidden,
|
||||||
faGripVertical, faChevronLeft, faComments, faHashtag, faBroadcastTower, faFireAlt, faEllipsisH, faPencilAlt, faBars, faTimes, faBell, faSearch, faUserCog, faCog, faUser, faHome, faStar, faCircle, faAt, faEnvelope, faListUl, faPlus, faUserClock, faLaugh, faUsers, faTachometerAlt, faExchangeAlt, faGlobe, faChartBar, faCloud, faServer, faProjectDiagram
|
faGripVertical, faChevronLeft, faComments, faHashtag, faBroadcastTower, faFireAlt, faEllipsisH, faPencilAlt, faBars, faTimes, faBell, faSearch, faUserCog, faCog, faUser, faHome, faStar, faCircle, faAt, faEnvelope, faListUl, faPlus, faUserClock, faLaugh, faUsers, faTachometerAlt, faExchangeAlt, faGlobe, faChartBar, faCloud, faServer, faProjectDiagram
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
@ -112,7 +120,9 @@ export default defineComponent({
|
|||||||
methods: {
|
methods: {
|
||||||
calcViewState() {
|
calcViewState() {
|
||||||
this.iconOnly = (window.innerWidth <= 1279) || (this.$store.state.sidebarDisplay === 'icon');
|
this.iconOnly = (window.innerWidth <= 1279) || (this.$store.state.sidebarDisplay === 'icon');
|
||||||
this.hidden = (window.innerWidth <= 650);
|
if (!this.defaultHidden) {
|
||||||
|
this.hidden = (window.innerWidth <= 650);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
show() {
|
show() {
|
||||||
@ -128,13 +138,19 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
|
|
||||||
async openAccountMenu(ev) {
|
async openAccountMenu(ev) {
|
||||||
const storedAccounts = getAccounts();
|
const storedAccounts = getAccounts().filter(x => x.id !== this.$i.id);
|
||||||
const accounts = (await os.api('users/show', { userIds: storedAccounts.map(x => x.id) })).filter(x => x.id !== this.$i.id);
|
const accountsPromise = os.api('users/show', { userIds: storedAccounts.map(x => x.id) });
|
||||||
|
|
||||||
const accountItems = accounts.map(account => ({
|
const accountItemPromises = storedAccounts.map(a => new Promise(res => {
|
||||||
type: 'user',
|
accountsPromise.then(accounts => {
|
||||||
user: account,
|
const account = accounts.find(x => x.id === a.id);
|
||||||
action: () => { this.switchAccount(account); }
|
if (account == null) return res(null);
|
||||||
|
res({
|
||||||
|
type: 'user',
|
||||||
|
user: account,
|
||||||
|
action: () => { this.switchAccount(account); }
|
||||||
|
});
|
||||||
|
});
|
||||||
}));
|
}));
|
||||||
|
|
||||||
os.modalMenu([...[{
|
os.modalMenu([...[{
|
||||||
@ -142,7 +158,7 @@ export default defineComponent({
|
|||||||
text: this.$ts.profile,
|
text: this.$ts.profile,
|
||||||
to: `/@${ this.$i.username }`,
|
to: `/@${ this.$i.username }`,
|
||||||
avatar: this.$i,
|
avatar: this.$i,
|
||||||
}, null, ...accountItems, {
|
}, null, ...accountItemPromises, {
|
||||||
icon: faPlus,
|
icon: faPlus,
|
||||||
text: this.$ts.addAcount,
|
text: this.$ts.addAcount,
|
||||||
action: () => {
|
action: () => {
|
||||||
|
@ -34,7 +34,7 @@ export default defineComponent({
|
|||||||
font-size: 90%;
|
font-size: 90%;
|
||||||
background: var(--infoBg);
|
background: var(--infoBg);
|
||||||
color: var(--infoFg);
|
color: var(--infoFg);
|
||||||
border-radius: 5px;
|
border-radius: var(--radius);
|
||||||
|
|
||||||
&.warn {
|
&.warn {
|
||||||
background: var(--infoWarnBg);
|
background: var(--infoWarnBg);
|
||||||
|
@ -70,6 +70,7 @@ export default defineComponent({
|
|||||||
// TODO: ResizeObserver無くしたい
|
// TODO: ResizeObserver無くしたい
|
||||||
new ResizeObserver((entries, observer) => {
|
new ResizeObserver((entries, observer) => {
|
||||||
const rect = this.src.getBoundingClientRect();
|
const rect = this.src.getBoundingClientRect();
|
||||||
|
|
||||||
const width = popover.offsetWidth;
|
const width = popover.offsetWidth;
|
||||||
const height = popover.offsetHeight;
|
const height = popover.offsetHeight;
|
||||||
|
|
||||||
@ -98,11 +99,11 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (left + width - window.pageXOffset > window.innerWidth) {
|
if (left + width - window.pageXOffset > window.innerWidth) {
|
||||||
left = window.innerWidth - width + window.pageXOffset;
|
left = window.innerWidth - width + window.pageXOffset - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (top + height - window.pageYOffset > window.innerHeight) {
|
if (top + height - window.pageYOffset > window.innerHeight) {
|
||||||
top = window.innerHeight - height + window.pageYOffset;
|
top = window.innerHeight - height + window.pageYOffset - 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<transition name="zoom-in-top" appear @after-leave="$emit('closed')">
|
<transition name="tooltip" appear @after-leave="$emit('closed')">
|
||||||
<div class="buebdbiu _acrylic _shadow" v-if="showing">
|
<div class="buebdbiu _acrylic _shadow" v-show="showing" ref="content">
|
||||||
<slot>{{ text }}</slot>
|
<slot>{{ text }}</slot>
|
||||||
</div>
|
</div>
|
||||||
</transition>
|
</transition>
|
||||||
@ -35,19 +35,43 @@ export default defineComponent({
|
|||||||
|
|
||||||
const rect = this.source.getBoundingClientRect();
|
const rect = this.source.getBoundingClientRect();
|
||||||
|
|
||||||
let x = rect.left + window.pageXOffset + (this.source.offsetWidth / 2);
|
const contentWidth = this.$refs.content.offsetWidth;
|
||||||
let y = rect.top + window.pageYOffset + this.source.offsetHeight;
|
const contentHeight = this.$refs.content.offsetHeight;
|
||||||
|
|
||||||
x -= (this.$el.offsetWidth / 2);
|
let left = rect.left + window.pageXOffset + (this.source.offsetWidth / 2);
|
||||||
|
let top = rect.top + window.pageYOffset + this.source.offsetHeight;
|
||||||
|
|
||||||
this.$el.style.left = x + 'px';
|
left -= (this.$el.offsetWidth / 2);
|
||||||
this.$el.style.top = y + 'px';
|
|
||||||
|
if (left + contentWidth - window.pageXOffset > window.innerWidth) {
|
||||||
|
left = window.innerWidth - contentWidth + window.pageXOffset - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (top + contentHeight - window.pageYOffset > window.innerHeight) {
|
||||||
|
top = rect.top + window.pageYOffset - contentHeight;
|
||||||
|
this.$refs.content.style.transformOrigin = 'center bottom';
|
||||||
|
}
|
||||||
|
|
||||||
|
this.$el.style.left = left + 'px';
|
||||||
|
this.$el.style.top = top + 'px';
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
|
.tooltip-enter-active,
|
||||||
|
.tooltip-leave-active {
|
||||||
|
opacity: 1;
|
||||||
|
transform: scale(1);
|
||||||
|
transition: transform 200ms cubic-bezier(0.23, 1, 0.32, 1), opacity 200ms cubic-bezier(0.23, 1, 0.32, 1);
|
||||||
|
}
|
||||||
|
.tooltip-enter-from,
|
||||||
|
.tooltip-leave-active {
|
||||||
|
opacity: 0;
|
||||||
|
transform: scale(0.75);
|
||||||
|
}
|
||||||
|
|
||||||
.buebdbiu {
|
.buebdbiu {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
z-index: 11000;
|
z-index: 11000;
|
||||||
@ -57,6 +81,6 @@ export default defineComponent({
|
|||||||
text-align: center;
|
text-align: center;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
transform-origin: center -16px;
|
transform-origin: center top;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
153
src/client/components/widgets.vue
Normal file
@ -0,0 +1,153 @@
|
|||||||
|
<template>
|
||||||
|
<div class="vjoppmmu">
|
||||||
|
<template v-if="edit">
|
||||||
|
<header>
|
||||||
|
<MkSelect v-model:value="widgetAdderSelected" style="margin-bottom: var(--margin)">
|
||||||
|
<template #label>{{ $ts.selectWidget }}</template>
|
||||||
|
<option v-for="widget in widgetDefs" :value="widget" :key="widget">{{ $t(`_widgets.${widget}`) }}</option>
|
||||||
|
</MkSelect>
|
||||||
|
<MkButton inline @click="addWidget" primary><Fa :icon="faPlus"/> {{ $ts.add }}</MkButton>
|
||||||
|
<MkButton inline @click="$emit('exit')">{{ $ts.close }}</MkButton>
|
||||||
|
</header>
|
||||||
|
<XDraggable
|
||||||
|
v-model="_widgets"
|
||||||
|
item-key="id"
|
||||||
|
animation="150"
|
||||||
|
>
|
||||||
|
<template #item="{element}">
|
||||||
|
<div class="customize-container">
|
||||||
|
<button class="config _button" @click.prevent.stop="configWidget(element.id)"><Fa :icon="faCog"/></button>
|
||||||
|
<button class="remove _button" @click.prevent.stop="removeWidget(element)"><Fa :icon="faTimes"/></button>
|
||||||
|
<component :is="`mkw-${element.name}`" :widget="element" :setting-callback="setting => settings[element.id] = setting" :column="column" @updateProps="updateWidget(element.id, $event)"/>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</XDraggable>
|
||||||
|
</template>
|
||||||
|
<component v-else class="widget" v-for="widget in widgets" :is="`mkw-${widget.name}`" :key="widget.id" :widget="widget" :column="column" @updateProps="updateWidget(widget.id, $event)"/>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent, defineAsyncComponent } from 'vue';
|
||||||
|
import { v4 as uuid } from 'uuid';
|
||||||
|
import { faTimes, faCog, faPlus } from '@fortawesome/free-solid-svg-icons';
|
||||||
|
import MkSelect from '@/components/ui/select.vue';
|
||||||
|
import MkButton from '@/components/ui/button.vue';
|
||||||
|
import { widgets as widgetDefs } from '@/widgets';
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
components: {
|
||||||
|
XDraggable: defineAsyncComponent(() => import('vuedraggable').then(x => x.default)),
|
||||||
|
MkSelect,
|
||||||
|
MkButton,
|
||||||
|
},
|
||||||
|
|
||||||
|
props: {
|
||||||
|
widgets: {
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
edit: {
|
||||||
|
type: Boolean,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
emits: ['updateWidgets', 'addWidget', 'removeWidget', 'updateWidget', 'exit'],
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
widgetAdderSelected: null,
|
||||||
|
widgetDefs,
|
||||||
|
settings: {},
|
||||||
|
faTimes, faPlus, faCog
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
_widgets: {
|
||||||
|
get() {
|
||||||
|
return this.widgets;
|
||||||
|
},
|
||||||
|
set(value) {
|
||||||
|
this.$emit('updateWidgets', value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
configWidget(id) {
|
||||||
|
this.settings[id]();
|
||||||
|
},
|
||||||
|
|
||||||
|
addWidget() {
|
||||||
|
if (this.widgetAdderSelected == null) return;
|
||||||
|
|
||||||
|
this.$emit('addWidget', {
|
||||||
|
name: this.widgetAdderSelected,
|
||||||
|
id: uuid(),
|
||||||
|
data: {}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.widgetAdderSelected = null;
|
||||||
|
},
|
||||||
|
|
||||||
|
removeWidget(widget) {
|
||||||
|
this.$emit('removeWidget', widget);
|
||||||
|
},
|
||||||
|
|
||||||
|
updateWidget(id, data) {
|
||||||
|
this.$emit('updateWidget', { id, data });
|
||||||
|
},
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.vjoppmmu {
|
||||||
|
> header {
|
||||||
|
margin: 16px 0;
|
||||||
|
|
||||||
|
> * {
|
||||||
|
width: 100%;
|
||||||
|
padding: 4px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
> .widget, .customize-container {
|
||||||
|
margin: var(--margin) 0;
|
||||||
|
|
||||||
|
&:first-of-type {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.customize-container {
|
||||||
|
position: relative;
|
||||||
|
cursor: move;
|
||||||
|
|
||||||
|
> *:not(.remove):not(.config) {
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
> .config,
|
||||||
|
> .remove {
|
||||||
|
position: absolute;
|
||||||
|
z-index: 10000;
|
||||||
|
top: 8px;
|
||||||
|
width: 32px;
|
||||||
|
height: 32px;
|
||||||
|
color: #fff;
|
||||||
|
background: rgba(#000, 0.7);
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
> .config {
|
||||||
|
right: 8px + 8px + 32px;
|
||||||
|
}
|
||||||
|
|
||||||
|
> .remove {
|
||||||
|
right: 8px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
18
src/client/directives/anim.ts
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
import { Directive } from 'vue';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
beforeMount(src, binding, vn) {
|
||||||
|
src.style.opacity = '0';
|
||||||
|
src.style.transform = 'scale(0.9)';
|
||||||
|
// ページネーションと相性が悪いので
|
||||||
|
//if (typeof binding.value === 'number') src.style.transitionDelay = `${binding.value * 30}ms`;
|
||||||
|
src.classList.add('_zoom');
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted(src, binding, vn) {
|
||||||
|
setTimeout(() => {
|
||||||
|
src.style.opacity = '1';
|
||||||
|
src.style.transform = 'none';
|
||||||
|
}, 1);
|
||||||
|
},
|
||||||
|
} as Directive;
|
@ -3,12 +3,22 @@ import { getScrollContainer, getScrollPosition } from '@/scripts/scroll';
|
|||||||
|
|
||||||
export default {
|
export default {
|
||||||
mounted(src, binding, vn) {
|
mounted(src, binding, vn) {
|
||||||
const ro = new ResizeObserver((entries, observer) => {
|
if (binding.value === false) return;
|
||||||
const pos = getScrollPosition(src);
|
|
||||||
const container = getScrollContainer(src);
|
let isBottom = true;
|
||||||
|
|
||||||
|
const container = getScrollContainer(src)!;
|
||||||
|
container.addEventListener('scroll', () => {
|
||||||
|
const pos = getScrollPosition(container);
|
||||||
const viewHeight = container.clientHeight;
|
const viewHeight = container.clientHeight;
|
||||||
const height = container.scrollHeight;
|
const height = container.scrollHeight;
|
||||||
if (pos + viewHeight > height - 32) {
|
isBottom = (pos + viewHeight > height - 32);
|
||||||
|
}, { passive: true });
|
||||||
|
container.scrollTop = container.scrollHeight;
|
||||||
|
|
||||||
|
const ro = new ResizeObserver((entries, observer) => {
|
||||||
|
if (isBottom) {
|
||||||
|
const height = container.scrollHeight;
|
||||||
container.scrollTop = height;
|
container.scrollTop = height;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -20,6 +30,6 @@ export default {
|
|||||||
},
|
},
|
||||||
|
|
||||||
unmounted(src, binding, vn) {
|
unmounted(src, binding, vn) {
|
||||||
src._ro_.unobserve(src);
|
if (src._ro_) src._ro_.unobserve(src);
|
||||||
}
|
}
|
||||||
} as Directive;
|
} as Directive;
|
||||||
|
@ -6,6 +6,7 @@ import particle from './particle';
|
|||||||
import tooltip from './tooltip';
|
import tooltip from './tooltip';
|
||||||
import hotkey from './hotkey';
|
import hotkey from './hotkey';
|
||||||
import appear from './appear';
|
import appear from './appear';
|
||||||
|
import anim from './anim';
|
||||||
|
|
||||||
export default function(app: App) {
|
export default function(app: App) {
|
||||||
app.directive('userPreview', userPreview);
|
app.directive('userPreview', userPreview);
|
||||||
@ -15,4 +16,5 @@ export default function(app: App) {
|
|||||||
app.directive('tooltip', tooltip);
|
app.directive('tooltip', tooltip);
|
||||||
app.directive('hotkey', hotkey);
|
app.directive('hotkey', hotkey);
|
||||||
app.directive('appear', appear);
|
app.directive('appear', appear);
|
||||||
|
app.directive('anim', anim);
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,7 @@ import { popup } from '@/os';
|
|||||||
|
|
||||||
const start = isDeviceTouch ? 'touchstart' : 'mouseover';
|
const start = isDeviceTouch ? 'touchstart' : 'mouseover';
|
||||||
const end = isDeviceTouch ? 'touchend' : 'mouseleave';
|
const end = isDeviceTouch ? 'touchend' : 'mouseleave';
|
||||||
|
const delay = 100;
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
mounted(el: HTMLElement, binding, vn) {
|
mounted(el: HTMLElement, binding, vn) {
|
||||||
@ -47,13 +48,13 @@ export default {
|
|||||||
el.addEventListener(start, () => {
|
el.addEventListener(start, () => {
|
||||||
clearTimeout(self.showTimer);
|
clearTimeout(self.showTimer);
|
||||||
clearTimeout(self.hideTimer);
|
clearTimeout(self.hideTimer);
|
||||||
self.showTimer = setTimeout(show, 300);
|
self.showTimer = setTimeout(show, delay);
|
||||||
}, { passive: true });
|
}, { passive: true });
|
||||||
|
|
||||||
el.addEventListener(end, () => {
|
el.addEventListener(end, () => {
|
||||||
clearTimeout(self.showTimer);
|
clearTimeout(self.showTimer);
|
||||||
clearTimeout(self.hideTimer);
|
clearTimeout(self.hideTimer);
|
||||||
self.hideTimer = setTimeout(self.close, 300);
|
self.hideTimer = setTimeout(self.close, delay);
|
||||||
}, { passive: true });
|
}, { passive: true });
|
||||||
|
|
||||||
el.addEventListener('click', () => {
|
el.addEventListener('click', () => {
|
||||||
|
@ -1,49 +1,6 @@
|
|||||||
import { markRaw } from 'vue';
|
import { markRaw } from 'vue';
|
||||||
import { locale } from '@/config';
|
import { locale } from '@/config';
|
||||||
|
import { I18n } from '../misc/i18n';
|
||||||
export class I18n<T extends Record<string, any>> {
|
|
||||||
public locale: T;
|
|
||||||
|
|
||||||
constructor(locale: T) {
|
|
||||||
this.locale = locale;
|
|
||||||
|
|
||||||
if (_DEV_) {
|
|
||||||
console.log('i18n', this.locale);
|
|
||||||
}
|
|
||||||
|
|
||||||
//#region BIND
|
|
||||||
this.t = this.t.bind(this);
|
|
||||||
//#endregion
|
|
||||||
}
|
|
||||||
|
|
||||||
// string にしているのは、ドット区切りでのパス指定を許可するため
|
|
||||||
// なるべくこのメソッド使うよりもlocale直接参照の方がvueのキャッシュ効いてパフォーマンスが良いかも
|
|
||||||
public t(key: string, args?: Record<string, any>): string {
|
|
||||||
try {
|
|
||||||
let str = key.split('.').reduce((o, i) => o[i], this.locale) as string;
|
|
||||||
|
|
||||||
if (_DEV_) {
|
|
||||||
if (!str.includes('{')) {
|
|
||||||
console.warn(`i18n: '${key}' has no any arg. so ref prop directly instead of call this method.`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (args) {
|
|
||||||
for (const [k, v] of Object.entries(args)) {
|
|
||||||
str = str.replace(`{${k}}`, v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return str;
|
|
||||||
} catch (e) {
|
|
||||||
if (_DEV_) {
|
|
||||||
console.warn(`missing localization '${key}'`);
|
|
||||||
return `⚠'${key}'⚠`;
|
|
||||||
}
|
|
||||||
|
|
||||||
return key;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export const i18n = markRaw(new I18n(locale));
|
export const i18n = markRaw(new I18n(locale));
|
||||||
|
|
||||||
|
@ -36,28 +36,35 @@ if (localStorage.getItem('vuex') != null) {
|
|||||||
location.reload();
|
location.reload();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
import * as Sentry from '@sentry/browser';
|
||||||
|
import { Integrations } from '@sentry/tracing';
|
||||||
import { createApp, watch } from 'vue';
|
import { createApp, watch } from 'vue';
|
||||||
import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';
|
import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';
|
||||||
|
|
||||||
import widgets from '@/widgets';
|
import widgets from '@/widgets';
|
||||||
import directives from '@/directives';
|
import directives from '@/directives';
|
||||||
import components from '@/components';
|
import components from '@/components';
|
||||||
import { version, ui, lang } from '@/config';
|
import { version, ui, lang, host } from '@/config';
|
||||||
import { router } from '@/router';
|
import { router } from '@/router';
|
||||||
import { applyTheme } from '@/scripts/theme';
|
import { applyTheme } from '@/scripts/theme';
|
||||||
import { isDeviceDarkmode } from '@/scripts/is-device-darkmode';
|
import { isDeviceDarkmode } from '@/scripts/is-device-darkmode';
|
||||||
import { i18n } from '@/i18n';
|
import { i18n } from '@/i18n';
|
||||||
import { stream, isMobile, dialog, post } from '@/os';
|
import { stream, dialog, post } from '@/os';
|
||||||
import * as sound from '@/scripts/sound';
|
import * as sound from '@/scripts/sound';
|
||||||
import { $i, refreshAccount, login, updateAccount, signout } from '@/account';
|
import { $i, refreshAccount, login, updateAccount, signout } from '@/account';
|
||||||
import { defaultStore, ColdDeviceStorage } from '@/store';
|
import { defaultStore, ColdDeviceStorage } from '@/store';
|
||||||
import { fetchInstance, instance } from '@/instance';
|
import { fetchInstance, instance } from '@/instance';
|
||||||
import { makeHotkey } from './scripts/hotkey';
|
import { makeHotkey } from '@/scripts/hotkey';
|
||||||
import { search } from './scripts/search';
|
import { search } from '@/scripts/search';
|
||||||
|
import { isMobile } from '@/scripts/is-mobile';
|
||||||
|
import { getThemes } from '@/theme-store';
|
||||||
|
import { initializeSw } from '@/scripts/initialize-sw';
|
||||||
|
import { reloadChannel } from '@/scripts/unison-reload';
|
||||||
|
|
||||||
console.info(`Misskey v${version}`);
|
console.info(`Misskey v${version}`);
|
||||||
|
|
||||||
window.clearTimeout((window as any).mkBootTimer);
|
// boot.jsのやつを解除
|
||||||
|
window.onerror = null;
|
||||||
|
|
||||||
if (_DEV_) {
|
if (_DEV_) {
|
||||||
console.warn('Development mode!!!');
|
console.warn('Development mode!!!');
|
||||||
@ -88,9 +95,24 @@ if (_DEV_) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (defaultStore.state.reportError && !_DEV_) {
|
||||||
|
Sentry.init({
|
||||||
|
dsn: 'https://fd273254a07a4b61857607a9ea05d629@o501808.ingest.sentry.io/5583438',
|
||||||
|
tracesSampleRate: 1.0,
|
||||||
|
});
|
||||||
|
|
||||||
|
Sentry.setTag('misskey_version', version);
|
||||||
|
Sentry.setTag('ui', ui);
|
||||||
|
Sentry.setTag('lang', lang);
|
||||||
|
Sentry.setTag('host', host);
|
||||||
|
}
|
||||||
|
|
||||||
// タッチデバイスでCSSの:hoverを機能させる
|
// タッチデバイスでCSSの:hoverを機能させる
|
||||||
document.addEventListener('touchend', () => {}, { passive: true });
|
document.addEventListener('touchend', () => {}, { passive: true });
|
||||||
|
|
||||||
|
// 一斉リロード
|
||||||
|
reloadChannel.addEventListener('message', () => location.reload());
|
||||||
|
|
||||||
//#region SEE: https://css-tricks.com/the-trick-to-viewport-units-on-mobile/
|
//#region SEE: https://css-tricks.com/the-trick-to-viewport-units-on-mobile/
|
||||||
// TODO: いつの日にか消したい
|
// TODO: いつの日にか消したい
|
||||||
const vh = window.innerHeight * 0.01;
|
const vh = window.innerHeight * 0.01;
|
||||||
@ -155,8 +177,10 @@ if ($i && $i.token) {
|
|||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
fetchInstance().then(() => {
|
fetchInstance().then(() => {
|
||||||
|
localStorage.setItem('v', instance.version);
|
||||||
|
|
||||||
// Init service worker
|
// Init service worker
|
||||||
//if (this.store.state.instance.meta.swPublickey) this.registerSw(this.store.state.instance.meta.swPublickey);
|
initializeSw();
|
||||||
});
|
});
|
||||||
|
|
||||||
stream.init($i);
|
stream.init($i);
|
||||||
@ -166,6 +190,7 @@ const app = createApp(await (
|
|||||||
!$i ? import('@/ui/visitor.vue') :
|
!$i ? import('@/ui/visitor.vue') :
|
||||||
ui === 'deck' ? import('@/ui/deck.vue') :
|
ui === 'deck' ? import('@/ui/deck.vue') :
|
||||||
ui === 'desktop' ? import('@/ui/desktop.vue') :
|
ui === 'desktop' ? import('@/ui/desktop.vue') :
|
||||||
|
ui === 'chat' ? import('@/ui/chat/index.vue') :
|
||||||
import('@/ui/default.vue')
|
import('@/ui/default.vue')
|
||||||
).then(x => x.default));
|
).then(x => x.default));
|
||||||
|
|
||||||
@ -197,7 +222,7 @@ app.mount('body');
|
|||||||
|
|
||||||
watch(defaultStore.reactiveState.darkMode, (darkMode) => {
|
watch(defaultStore.reactiveState.darkMode, (darkMode) => {
|
||||||
import('@/scripts/theme').then(({ builtinThemes }) => {
|
import('@/scripts/theme').then(({ builtinThemes }) => {
|
||||||
const themes = builtinThemes.concat(ColdDeviceStorage.get('themes'));
|
const themes = builtinThemes.concat(getThemes());
|
||||||
applyTheme(themes.find(x => x.id === (darkMode ? ColdDeviceStorage.get('darkTheme') : ColdDeviceStorage.get('lightTheme'))));
|
applyTheme(themes.find(x => x.id === (darkMode ? ColdDeviceStorage.get('darkTheme') : ColdDeviceStorage.get('lightTheme'))));
|
||||||
});
|
});
|
||||||
}, { immediate: localStorage.theme == null });
|
}, { immediate: localStorage.theme == null });
|
||||||
@ -333,14 +358,6 @@ if ($i) {
|
|||||||
updateAccount({ hasUnreadAnnouncement: false });
|
updateAccount({ hasUnreadAnnouncement: false });
|
||||||
});
|
});
|
||||||
|
|
||||||
main.on('clientSettingUpdated', x => {
|
|
||||||
updateAccount({
|
|
||||||
clientData: {
|
|
||||||
[x.key]: x.value
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
// トークンが再生成されたとき
|
// トークンが再生成されたとき
|
||||||
// このままではMisskeyが利用できないので強制的にサインアウトさせる
|
// このままではMisskeyが利用できないので強制的にサインアウトさせる
|
||||||
main.on('myTokenRegenerated', () => {
|
main.on('myTokenRegenerated', () => {
|
||||||
|
@ -1,14 +1,13 @@
|
|||||||
import { Component, defineAsyncComponent, markRaw, reactive, Ref, ref } from 'vue';
|
import { Component, defineAsyncComponent, markRaw, reactive, Ref, ref } from 'vue';
|
||||||
import { EventEmitter } from 'eventemitter3';
|
import { EventEmitter } from 'eventemitter3';
|
||||||
|
import * as Sentry from '@sentry/browser';
|
||||||
import Stream from '@/scripts/stream';
|
import Stream from '@/scripts/stream';
|
||||||
import { apiUrl, debug } from '@/config';
|
import { apiUrl, debug } from '@/config';
|
||||||
import MkPostFormDialog from '@/components/post-form-dialog.vue';
|
import MkPostFormDialog from '@/components/post-form-dialog.vue';
|
||||||
import MkWaitingDialog from '@/components/waiting-dialog.vue';
|
import MkWaitingDialog from '@/components/waiting-dialog.vue';
|
||||||
import { resolve } from '@/router';
|
import { resolve } from '@/router';
|
||||||
import { $i } from './account';
|
import { $i } from '@/account';
|
||||||
|
import { defaultStore } from '@/store';
|
||||||
const ua = navigator.userAgent.toLowerCase();
|
|
||||||
export const isMobile = /mobile|iphone|ipad|android/.test(ua);
|
|
||||||
|
|
||||||
export const stream = markRaw(new Stream());
|
export const stream = markRaw(new Stream());
|
||||||
|
|
||||||
@ -54,19 +53,32 @@ export function api(endpoint: string, data: Record<string, any> = {}, token?: st
|
|||||||
if (res.status === 200) {
|
if (res.status === 200) {
|
||||||
resolve(body);
|
resolve(body);
|
||||||
if (debug) {
|
if (debug) {
|
||||||
log.res = markRaw(body);
|
log!.res = markRaw(body);
|
||||||
log.state = 'success';
|
log!.state = 'success';
|
||||||
}
|
}
|
||||||
} else if (res.status === 204) {
|
} else if (res.status === 204) {
|
||||||
resolve();
|
resolve();
|
||||||
if (debug) {
|
if (debug) {
|
||||||
log.state = 'success';
|
log!.state = 'success';
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
reject(body.error);
|
reject(body.error);
|
||||||
if (debug) {
|
if (debug) {
|
||||||
log.res = markRaw(body.error);
|
log!.res = markRaw(body.error);
|
||||||
log.state = 'failed';
|
log!.state = 'failed';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (defaultStore.state.reportError && !_DEV_) {
|
||||||
|
Sentry.withScope((scope) => {
|
||||||
|
scope.setTag('api_endpoint', endpoint);
|
||||||
|
scope.setContext('api params', data);
|
||||||
|
scope.setContext('api error info', body.info);
|
||||||
|
scope.setTag('api_error_id', body.id);
|
||||||
|
scope.setTag('api_error_code', body.code);
|
||||||
|
scope.setTag('api_error_kind', body.kind);
|
||||||
|
scope.setLevel(Sentry.Severity.Error);
|
||||||
|
Sentry.captureMessage('API error');
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}).catch(reject);
|
}).catch(reject);
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
<div id="debug"></div>
|
<div id="debug"></div>
|
||||||
<section class="_formItem about">
|
<section class="_formItem about">
|
||||||
<div class="_formPanel panel" :class="{ playing: easterEggEngine != null }" ref="about">
|
<div class="_formPanel panel" :class="{ playing: easterEggEngine != null }" ref="about">
|
||||||
<img src="/assets/icons/512.png" alt="" class="icon" ref="icon" @load="iconLoaded" draggable="false"/>
|
<img src="/assets/about-icon.png" alt="" class="icon" ref="icon" @load="iconLoaded" draggable="false"/>
|
||||||
<div class="misskey">Misskey</div>
|
<div class="misskey">Misskey</div>
|
||||||
<div class="version">v{{ version }}</div>
|
<div class="version">v{{ version }}</div>
|
||||||
<span class="emoji" v-for="emoji in easterEggEmojis" :key="emoji.id" :data-physics-x="emoji.left" :data-physics-y="emoji.top" :class="{ _physics_circle_: !emoji.emoji.startsWith(':') }"><MkEmoji class="emoji" :emoji="emoji.emoji" :custom-emojis="$instance.emojis" :is-reaction="false" :normal="true" :no-style="true"/></span>
|
<span class="emoji" v-for="emoji in easterEggEmojis" :key="emoji.id" :data-physics-x="emoji.left" :data-physics-y="emoji.top" :class="{ _physics_circle_: !emoji.emoji.startsWith(':') }"><MkEmoji class="emoji" :emoji="emoji.emoji" :custom-emojis="$instance.emojis" :is-reaction="false" :normal="true" :no-style="true"/></span>
|
||||||
|
353
src/client/pages/advanced-theme-editor.vue
Normal file
@ -0,0 +1,353 @@
|
|||||||
|
<template>
|
||||||
|
<div class="t9makv94">
|
||||||
|
<section class="_section">
|
||||||
|
<div class="_content">
|
||||||
|
<details>
|
||||||
|
<summary>{{ $ts.import }}</summary>
|
||||||
|
<MkTextarea v-model:value="themeToImport">
|
||||||
|
{{ $ts._theme.importInfo }}
|
||||||
|
</MkTextarea>
|
||||||
|
<MkButton :disabled="!themeToImport.trim()" @click="importTheme">{{ $ts.import }}</MkButton>
|
||||||
|
</details>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section class="_section">
|
||||||
|
<div class="_content _card _vMargin">
|
||||||
|
<div class="_content">
|
||||||
|
<MkInput v-model:value="name" required><span>{{ $ts.name }}</span></MkInput>
|
||||||
|
<MkInput v-model:value="author" required><span>{{ $ts.author }}</span></MkInput>
|
||||||
|
<MkTextarea v-model:value="description"><span>{{ $ts.description }}</span></MkTextarea>
|
||||||
|
<div class="_inputs">
|
||||||
|
<div v-text="$ts._theme.base" />
|
||||||
|
<MkRadio v-model="baseTheme" value="light">{{ $ts.light }}</MkRadio>
|
||||||
|
<MkRadio v-model="baseTheme" value="dark">{{ $ts.dark }}</MkRadio>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="_content _card _vMargin">
|
||||||
|
<div class="list-view _content">
|
||||||
|
<div class="item" v-for="([ k, v ], i) in theme" :key="k">
|
||||||
|
<div class="_inputs">
|
||||||
|
<div>
|
||||||
|
{{ k.startsWith('$') ? `${k} (${$ts._theme.constant})` : $t('_theme.keys.' + k) }}
|
||||||
|
<button v-if="k.startsWith('$')" class="_button _link" @click="del(i)" v-text="$ts.delete" />
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<div class="type" @click="chooseType($event, i)">
|
||||||
|
{{ getTypeOf(v) }} <Fa :icon="faChevronDown"/>
|
||||||
|
</div>
|
||||||
|
<!-- default -->
|
||||||
|
<div v-if="v === null" v-text="baseProps[k]" class="default-value" />
|
||||||
|
<!-- color -->
|
||||||
|
<div v-else-if="typeof v === 'string'" class="color">
|
||||||
|
<input type="color" :value="v" @input="colorChanged($event.target.value, i)"/>
|
||||||
|
<MkInput class="select" :value="v" @update:value="colorChanged($event, i)"/>
|
||||||
|
</div>
|
||||||
|
<!-- ref const -->
|
||||||
|
<MkInput v-else-if="v.type === 'refConst'" v-model:value="v.key">
|
||||||
|
<template #prefix>$</template>
|
||||||
|
<span>{{ $ts.name }}</span>
|
||||||
|
</MkInput>
|
||||||
|
<!-- ref props -->
|
||||||
|
<MkSelect class="select" v-else-if="v.type === 'refProp'" v-model:value="v.key">
|
||||||
|
<option v-for="key in themeProps" :value="key" :key="key">{{ $t('_theme.keys.' + key) }}</option>
|
||||||
|
</MkSelect>
|
||||||
|
<!-- func -->
|
||||||
|
<template v-else-if="v.type === 'func'">
|
||||||
|
<MkSelect class="select" v-model:value="v.name">
|
||||||
|
<template #label>{{ $ts._theme.funcKind }}</template>
|
||||||
|
<option v-for="n in ['alpha', 'darken', 'lighten']" :value="n" :key="n">{{ $t('_theme.' + n) }}</option>
|
||||||
|
</MkSelect>
|
||||||
|
<MkInput type="number" v-model:value="v.arg"><span>{{ $ts._theme.argument }}</span></MkInput>
|
||||||
|
<MkSelect class="select" v-model:value="v.value">
|
||||||
|
<template #label>{{ $ts._theme.basedProp }}</template>
|
||||||
|
<option v-for="key in themeProps" :value="key" :key="key">{{ $t('_theme.keys.' + key) }}</option>
|
||||||
|
</MkSelect>
|
||||||
|
</template>
|
||||||
|
<!-- CSS -->
|
||||||
|
<MkInput v-else-if="v.type === 'css'" v-model:value="v.value">
|
||||||
|
<span>CSS</span>
|
||||||
|
</MkInput>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<MkButton primary @click="addConst">{{ $ts._theme.addConstant }}</MkButton>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section class="_section">
|
||||||
|
<details class="_content">
|
||||||
|
<summary>{{ $ts.sample }}</summary>
|
||||||
|
<MkSample/>
|
||||||
|
</details>
|
||||||
|
</section>
|
||||||
|
<section class="_section">
|
||||||
|
<div class="_content">
|
||||||
|
<MkButton inline @click="preview">{{ $ts.preview }}</MkButton>
|
||||||
|
<MkButton inline primary :disabled="!name || !author" @click="save">{{ $ts.save }}</MkButton>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent } from 'vue';
|
||||||
|
import { faPalette, faChevronDown, faKeyboard } from '@fortawesome/free-solid-svg-icons';
|
||||||
|
import * as JSON5 from 'json5';
|
||||||
|
import { toUnicode } from 'punycode';
|
||||||
|
|
||||||
|
import MkRadio from '@/components/ui/radio.vue';
|
||||||
|
import MkButton from '@/components/ui/button.vue';
|
||||||
|
import MkInput from '@/components/ui/input.vue';
|
||||||
|
import MkTextarea from '@/components/ui/textarea.vue';
|
||||||
|
import MkSelect from '@/components/ui/select.vue';
|
||||||
|
import MkSample from '@/components/sample.vue';
|
||||||
|
|
||||||
|
import { convertToMisskeyTheme, ThemeValue, convertToViewModel, ThemeViewModel } from '@/scripts/theme-editor';
|
||||||
|
import { Theme, applyTheme, lightTheme, darkTheme, themeProps, validateTheme } from '@/scripts/theme';
|
||||||
|
import { host } from '@/config';
|
||||||
|
import * as os from '@/os';
|
||||||
|
import { ColdDeviceStorage } from '@/store';
|
||||||
|
import { addTheme } from '@/theme-store';
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
components: {
|
||||||
|
MkRadio,
|
||||||
|
MkButton,
|
||||||
|
MkInput,
|
||||||
|
MkTextarea,
|
||||||
|
MkSelect,
|
||||||
|
MkSample,
|
||||||
|
},
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
INFO: {
|
||||||
|
title: this.$ts.themeEditor,
|
||||||
|
icon: faPalette,
|
||||||
|
},
|
||||||
|
theme: [] as ThemeViewModel,
|
||||||
|
name: '',
|
||||||
|
description: '',
|
||||||
|
baseTheme: 'light' as 'dark' | 'light',
|
||||||
|
author: `@${this.$i.username}@${toUnicode(host)}`,
|
||||||
|
themeToImport: '',
|
||||||
|
changed: false,
|
||||||
|
lightTheme, darkTheme, themeProps,
|
||||||
|
faPalette, faChevronDown, faKeyboard,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
baseProps() {
|
||||||
|
return this.baseTheme === 'light' ? this.lightTheme.props : this.darkTheme.props;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
beforeUnmount() {
|
||||||
|
window.removeEventListener('beforeunload', this.beforeunload);
|
||||||
|
},
|
||||||
|
|
||||||
|
async beforeRouteLeave(to, from, next) {
|
||||||
|
if (this.changed && !(await this.confirm())) {
|
||||||
|
next(false);
|
||||||
|
} else {
|
||||||
|
next();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted() {
|
||||||
|
this.init();
|
||||||
|
window.addEventListener('beforeunload', this.beforeunload);
|
||||||
|
const changed = () => this.changed = true;
|
||||||
|
this.$watch('name', changed);
|
||||||
|
this.$watch('description', changed);
|
||||||
|
this.$watch('baseTheme', changed);
|
||||||
|
this.$watch('author', changed);
|
||||||
|
this.$watch('theme', changed);
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
beforeunload(e: BeforeUnloadEvent) {
|
||||||
|
if (this.changed) {
|
||||||
|
e.preventDefault();
|
||||||
|
e.returnValue = '';
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
async confirm(): Promise<boolean> {
|
||||||
|
const { canceled } = await os.dialog({
|
||||||
|
type: 'warning',
|
||||||
|
text: this.$ts.leaveConfirm,
|
||||||
|
showCancelButton: true
|
||||||
|
});
|
||||||
|
return !canceled;
|
||||||
|
},
|
||||||
|
|
||||||
|
init() {
|
||||||
|
const t: ThemeViewModel = [];
|
||||||
|
for (const key of themeProps) {
|
||||||
|
t.push([ key, null ]);
|
||||||
|
}
|
||||||
|
this.theme = t;
|
||||||
|
},
|
||||||
|
|
||||||
|
async del(i: number) {
|
||||||
|
const { canceled } = await os.dialog({
|
||||||
|
type: 'warning',
|
||||||
|
showCancelButton: true,
|
||||||
|
text: this.$t('_theme.deleteConstantConfirm', { const: this.theme[i][0] }),
|
||||||
|
});
|
||||||
|
if (canceled) return;
|
||||||
|
Vue.delete(this.theme, i);
|
||||||
|
},
|
||||||
|
|
||||||
|
async addConst() {
|
||||||
|
const { canceled, result } = await os.dialog({
|
||||||
|
title: this.$ts._theme.inputConstantName,
|
||||||
|
input: true
|
||||||
|
});
|
||||||
|
if (canceled) return;
|
||||||
|
this.theme.push([ '$' + result, '#000000']);
|
||||||
|
},
|
||||||
|
|
||||||
|
save() {
|
||||||
|
const theme = convertToMisskeyTheme(this.theme, this.name, this.description, this.author, this.baseTheme);
|
||||||
|
addTheme(theme);
|
||||||
|
os.dialog({
|
||||||
|
type: 'success',
|
||||||
|
text: this.$t('_theme.installed', { name: theme.name })
|
||||||
|
});
|
||||||
|
this.changed = false;
|
||||||
|
},
|
||||||
|
|
||||||
|
preview() {
|
||||||
|
const theme = convertToMisskeyTheme(this.theme, this.name, this.description, this.author, this.baseTheme);
|
||||||
|
try {
|
||||||
|
applyTheme(theme, false);
|
||||||
|
} catch (e) {
|
||||||
|
os.dialog({
|
||||||
|
type: 'error',
|
||||||
|
text: e.message
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
async importTheme() {
|
||||||
|
if (this.changed && (!await this.confirm())) return;
|
||||||
|
|
||||||
|
try {
|
||||||
|
const theme = JSON5.parse(this.themeToImport) as Theme;
|
||||||
|
if (!validateTheme(theme)) throw new Error(this.$ts._theme.invalid);
|
||||||
|
|
||||||
|
this.name = theme.name;
|
||||||
|
this.description = theme.desc || '';
|
||||||
|
this.author = theme.author;
|
||||||
|
this.baseTheme = theme.base || 'light';
|
||||||
|
this.theme = convertToViewModel(theme);
|
||||||
|
this.themeToImport = '';
|
||||||
|
} catch (e) {
|
||||||
|
os.dialog({
|
||||||
|
type: 'error',
|
||||||
|
text: e.message
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
colorChanged(color: string, i: number) {
|
||||||
|
this.theme[i] = [this.theme[i][0], color];
|
||||||
|
},
|
||||||
|
|
||||||
|
getTypeOf(v: ThemeValue) {
|
||||||
|
return v === null
|
||||||
|
? this.$ts._theme.defaultValue
|
||||||
|
: typeof v === 'string'
|
||||||
|
? this.$ts._theme.color
|
||||||
|
: this.$t('_theme.' + v.type);
|
||||||
|
},
|
||||||
|
|
||||||
|
async chooseType(e: MouseEvent, i: number) {
|
||||||
|
const newValue = await this.showTypeMenu(e);
|
||||||
|
this.theme[i] = [ this.theme[i][0], newValue ];
|
||||||
|
},
|
||||||
|
|
||||||
|
showTypeMenu(e: MouseEvent) {
|
||||||
|
return new Promise<ThemeValue>((resolve) => {
|
||||||
|
os.modalMenu([{
|
||||||
|
text: this.$ts._theme.defaultValue,
|
||||||
|
action: () => resolve(null),
|
||||||
|
}, {
|
||||||
|
text: this.$ts._theme.color,
|
||||||
|
action: () => resolve('#000000'),
|
||||||
|
}, {
|
||||||
|
text: this.$ts._theme.func,
|
||||||
|
action: () => resolve({
|
||||||
|
type: 'func', name: 'alpha', arg: 1, value: 'accent'
|
||||||
|
}),
|
||||||
|
}, {
|
||||||
|
text: this.$ts._theme.refProp,
|
||||||
|
action: () => resolve({
|
||||||
|
type: 'refProp', key: 'accent',
|
||||||
|
}),
|
||||||
|
}, {
|
||||||
|
text: this.$ts._theme.refConst,
|
||||||
|
action: () => resolve({
|
||||||
|
type: 'refConst', key: '',
|
||||||
|
}),
|
||||||
|
}, {
|
||||||
|
text: 'CSS',
|
||||||
|
action: () => resolve({
|
||||||
|
type: 'css', value: '',
|
||||||
|
}),
|
||||||
|
}], e.currentTarget || e.target);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.t9makv94 {
|
||||||
|
> ._section {
|
||||||
|
> ._content {
|
||||||
|
> .list-view {
|
||||||
|
> .item {
|
||||||
|
min-height: 48px;
|
||||||
|
word-break: break-all;
|
||||||
|
|
||||||
|
&:not(:last-child) {
|
||||||
|
margin-bottom: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select {
|
||||||
|
margin: 24px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.type {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.default-value {
|
||||||
|
opacity: 0.6;
|
||||||
|
pointer-events: none;
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.color {
|
||||||
|
> input {
|
||||||
|
display: inline-block;
|
||||||
|
width: 1.5em;
|
||||||
|
height: 1.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
> div {
|
||||||
|
margin-left: 8px;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
@ -175,6 +175,7 @@
|
|||||||
<MkSwitch v-model:value="objectStorageUseSSL" :disabled="!useObjectStorage">{{ $ts.objectStorageUseSSL }}<template #desc>{{ $ts.objectStorageUseSSLDesc }}</template></MkSwitch>
|
<MkSwitch v-model:value="objectStorageUseSSL" :disabled="!useObjectStorage">{{ $ts.objectStorageUseSSL }}<template #desc>{{ $ts.objectStorageUseSSLDesc }}</template></MkSwitch>
|
||||||
<MkSwitch v-model:value="objectStorageUseProxy" :disabled="!useObjectStorage">{{ $ts.objectStorageUseProxy }}<template #desc>{{ $ts.objectStorageUseProxyDesc }}</template></MkSwitch>
|
<MkSwitch v-model:value="objectStorageUseProxy" :disabled="!useObjectStorage">{{ $ts.objectStorageUseProxy }}<template #desc>{{ $ts.objectStorageUseProxyDesc }}</template></MkSwitch>
|
||||||
<MkSwitch v-model:value="objectStorageSetPublicRead" :disabled="!useObjectStorage">{{ $ts.objectStorageSetPublicRead }}</MkSwitch>
|
<MkSwitch v-model:value="objectStorageSetPublicRead" :disabled="!useObjectStorage">{{ $ts.objectStorageSetPublicRead }}</MkSwitch>
|
||||||
|
<MkSwitch v-model:value="objectStorageS3ForcePathStyle" :disabled="!useObjectStorage">s3ForcePathStyle</MkSwitch>
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
<div class="_footer">
|
<div class="_footer">
|
||||||
@ -325,6 +326,7 @@ export default defineComponent({
|
|||||||
objectStorageUseSSL: false,
|
objectStorageUseSSL: false,
|
||||||
objectStorageUseProxy: false,
|
objectStorageUseProxy: false,
|
||||||
objectStorageSetPublicRead: false,
|
objectStorageSetPublicRead: false,
|
||||||
|
objectStorageS3ForcePathStyle: true,
|
||||||
enableTwitterIntegration: false,
|
enableTwitterIntegration: false,
|
||||||
twitterConsumerKey: null,
|
twitterConsumerKey: null,
|
||||||
twitterConsumerSecret: null,
|
twitterConsumerSecret: null,
|
||||||
@ -393,6 +395,7 @@ export default defineComponent({
|
|||||||
this.objectStorageUseSSL = this.meta.objectStorageUseSSL;
|
this.objectStorageUseSSL = this.meta.objectStorageUseSSL;
|
||||||
this.objectStorageUseProxy = this.meta.objectStorageUseProxy;
|
this.objectStorageUseProxy = this.meta.objectStorageUseProxy;
|
||||||
this.objectStorageSetPublicRead = this.meta.objectStorageSetPublicRead;
|
this.objectStorageSetPublicRead = this.meta.objectStorageSetPublicRead;
|
||||||
|
this.objectStorageS3ForcePathStyle = this.meta.objectStorageS3ForcePathStyle;
|
||||||
this.enableTwitterIntegration = this.meta.enableTwitterIntegration;
|
this.enableTwitterIntegration = this.meta.enableTwitterIntegration;
|
||||||
this.twitterConsumerKey = this.meta.twitterConsumerKey;
|
this.twitterConsumerKey = this.meta.twitterConsumerKey;
|
||||||
this.twitterConsumerSecret = this.meta.twitterConsumerSecret;
|
this.twitterConsumerSecret = this.meta.twitterConsumerSecret;
|
||||||
@ -547,6 +550,7 @@ export default defineComponent({
|
|||||||
objectStorageUseSSL: this.objectStorageUseSSL,
|
objectStorageUseSSL: this.objectStorageUseSSL,
|
||||||
objectStorageUseProxy: this.objectStorageUseProxy,
|
objectStorageUseProxy: this.objectStorageUseProxy,
|
||||||
objectStorageSetPublicRead: this.objectStorageSetPublicRead,
|
objectStorageSetPublicRead: this.objectStorageSetPublicRead,
|
||||||
|
objectStorageS3ForcePathStyle: this.objectStorageS3ForcePathStyle,
|
||||||
enableTwitterIntegration: this.enableTwitterIntegration,
|
enableTwitterIntegration: this.enableTwitterIntegration,
|
||||||
twitterConsumerKey: this.twitterConsumerKey,
|
twitterConsumerKey: this.twitterConsumerKey,
|
||||||
twitterConsumerSecret: this.twitterConsumerSecret,
|
twitterConsumerSecret: this.twitterConsumerSecret,
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
:to="message.groupId ? `/my/messaging/group/${message.groupId}` : `/my/messaging/${getAcct(isMe(message) ? message.recipient : message.user)}`"
|
:to="message.groupId ? `/my/messaging/group/${message.groupId}` : `/my/messaging/${getAcct(isMe(message) ? message.recipient : message.user)}`"
|
||||||
:data-index="i"
|
:data-index="i"
|
||||||
:key="message.id"
|
:key="message.id"
|
||||||
|
v-anim="i"
|
||||||
>
|
>
|
||||||
<div>
|
<div>
|
||||||
<MkAvatar class="avatar" :user="message.groupId ? message.user : isMe(message) ? message.recipient : message.user"/>
|
<MkAvatar class="avatar" :user="message.groupId ? message.user : isMe(message) ? message.recipient : message.user"/>
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
v-model="text"
|
v-model="text"
|
||||||
ref="text"
|
ref="text"
|
||||||
@keypress="onKeypress"
|
@keypress="onKeypress"
|
||||||
|
@compositionupdate="onCompositionUpdate"
|
||||||
@paste="onPaste"
|
@paste="onPaste"
|
||||||
:placeholder="$ts.inputMessageHere"
|
:placeholder="$ts.inputMessageHere"
|
||||||
></textarea>
|
></textarea>
|
||||||
@ -29,6 +30,7 @@ import { formatTimeString } from '../../../misc/format-time-string';
|
|||||||
import { selectFile } from '@/scripts/select-file';
|
import { selectFile } from '@/scripts/select-file';
|
||||||
import * as os from '@/os';
|
import * as os from '@/os';
|
||||||
import { Autocomplete } from '@/scripts/autocomplete';
|
import { Autocomplete } from '@/scripts/autocomplete';
|
||||||
|
import { throttle } from 'throttle-debounce';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
props: {
|
props: {
|
||||||
@ -46,6 +48,9 @@ export default defineComponent({
|
|||||||
text: null,
|
text: null,
|
||||||
file: null,
|
file: null,
|
||||||
sending: false,
|
sending: false,
|
||||||
|
typing: throttle(3000, () => {
|
||||||
|
os.stream.send('typingOnMessaging', this.user ? { partner: this.user.id } : { group: this.group.id });
|
||||||
|
}),
|
||||||
faPaperPlane, faPhotoVideo, faLaughSquint
|
faPaperPlane, faPhotoVideo, faLaughSquint
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
@ -147,11 +152,16 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
|
|
||||||
onKeypress(e) {
|
onKeypress(e) {
|
||||||
|
this.typing();
|
||||||
if ((e.which == 10 || e.which == 13) && (e.ctrlKey || e.metaKey) && this.canSend) {
|
if ((e.which == 10 || e.which == 13) && (e.ctrlKey || e.metaKey) && this.canSend) {
|
||||||
this.send();
|
this.send();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
onCompositionUpdate() {
|
||||||
|
this.typing();
|
||||||
|
},
|
||||||
|
|
||||||
chooseFile(e) {
|
chooseFile(e) {
|
||||||
selectFile(e.currentTarget || e.target, this.$ts.selectFile, false).then(file => {
|
selectFile(e.currentTarget || e.target, this.$ts.selectFile, false).then(file => {
|
||||||
this.file = file;
|
this.file = file;
|
||||||
|
@ -16,6 +16,14 @@
|
|||||||
</XList>
|
</XList>
|
||||||
</div>
|
</div>
|
||||||
<footer>
|
<footer>
|
||||||
|
<div class="typers" v-if="typers.length > 0">
|
||||||
|
<I18n :src="$ts.typingUsers" text-tag="span" class="users">
|
||||||
|
<template #users>
|
||||||
|
<b v-for="user in typers" :key="user.id" class="user">{{ user.username }}</b>
|
||||||
|
</template>
|
||||||
|
</I18n>
|
||||||
|
<MkEllipsis/>
|
||||||
|
</div>
|
||||||
<transition name="fade">
|
<transition name="fade">
|
||||||
<div class="new-message" v-show="showIndicator">
|
<div class="new-message" v-show="showIndicator">
|
||||||
<button class="_buttonPrimary" @click="onIndicatorClick"><i><Fa :icon="faArrowCircleDown"/></i>{{ $ts.newMessageExists }}</button>
|
<button class="_buttonPrimary" @click="onIndicatorClick"><i><Fa :icon="faArrowCircleDown"/></i>{{ $ts.newMessageExists }}</button>
|
||||||
@ -86,6 +94,7 @@ const Component = defineComponent({
|
|||||||
connection: null,
|
connection: null,
|
||||||
showIndicator: false,
|
showIndicator: false,
|
||||||
timer: null,
|
timer: null,
|
||||||
|
typers: [],
|
||||||
ilObserver: new IntersectionObserver(
|
ilObserver: new IntersectionObserver(
|
||||||
(entries) => entries.some((entry) => entry.isIntersecting)
|
(entries) => entries.some((entry) => entry.isIntersecting)
|
||||||
&& !this.fetching
|
&& !this.fetching
|
||||||
@ -142,6 +151,9 @@ const Component = defineComponent({
|
|||||||
this.connection.on('message', this.onMessage);
|
this.connection.on('message', this.onMessage);
|
||||||
this.connection.on('read', this.onRead);
|
this.connection.on('read', this.onRead);
|
||||||
this.connection.on('deleted', this.onDeleted);
|
this.connection.on('deleted', this.onDeleted);
|
||||||
|
this.connection.on('typers', typers => {
|
||||||
|
this.typers = typers.filter(u => u.id !== this.$i.id);
|
||||||
|
});
|
||||||
|
|
||||||
document.addEventListener('visibilitychange', this.onVisibilitychange);
|
document.addEventListener('visibilitychange', this.onVisibilitychange);
|
||||||
|
|
||||||
@ -397,6 +409,7 @@ export default Component;
|
|||||||
|
|
||||||
> footer {
|
> footer {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
> .new-message {
|
> .new-message {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
@ -422,6 +435,25 @@ export default Component;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
> .typers {
|
||||||
|
position: absolute;
|
||||||
|
bottom: 100%;
|
||||||
|
padding: 0 8px 0 8px;
|
||||||
|
font-size: 0.9em;
|
||||||
|
color: var(--fgTransparentWeak);
|
||||||
|
|
||||||
|
> .users {
|
||||||
|
> .user + .user:before {
|
||||||
|
content: ", ";
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
> .user:last-of-type:after {
|
||||||
|
content: " ";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,6 +45,13 @@ export default defineComponent({
|
|||||||
MkButton
|
MkButton
|
||||||
},
|
},
|
||||||
|
|
||||||
|
props: {
|
||||||
|
groupId: {
|
||||||
|
type: String,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
INFO: computed(() => this.group ? {
|
INFO: computed(() => this.group ? {
|
||||||
@ -58,7 +65,7 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
|
|
||||||
watch: {
|
watch: {
|
||||||
$route: 'fetch'
|
groupId: 'fetch',
|
||||||
},
|
},
|
||||||
|
|
||||||
created() {
|
created() {
|
||||||
@ -69,7 +76,7 @@ export default defineComponent({
|
|||||||
fetch() {
|
fetch() {
|
||||||
Progress.start();
|
Progress.start();
|
||||||
os.api('users/groups/show', {
|
os.api('users/groups/show', {
|
||||||
groupId: this.$route.params.group
|
groupId: this.groupId
|
||||||
}).then(group => {
|
}).then(group => {
|
||||||
this.group = group;
|
this.group = group;
|
||||||
os.api('users/show', {
|
os.api('users/show', {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="fcuexfpr">
|
<div class="fcuexfpr">
|
||||||
<div v-if="note" class="note">
|
<div v-if="note" class="note" v-anim>
|
||||||
<div class="_section" v-if="showNext">
|
<div class="_section" v-if="showNext">
|
||||||
<XNotes class="_content _noGap_" :pagination="next"/>
|
<XNotes class="_content _noGap_" :pagination="next"/>
|
||||||
</div>
|
</div>
|
||||||
|
@ -9,7 +9,8 @@
|
|||||||
</MkInput>
|
</MkInput>
|
||||||
<MkSwitch v-model:value="value.detailed"><span>{{ $ts._pages.blocks._note.detailed }}</span></MkSwitch>
|
<MkSwitch v-model:value="value.detailed"><span>{{ $ts._pages.blocks._note.detailed }}</span></MkSwitch>
|
||||||
|
|
||||||
<XNote v-if="note" v-model:note="note" :key="note.id + ':' + (value.detailed ? 'detailed' : 'normal')" :detail="value.detailed" style="margin-bottom: 16px;"/>
|
<XNote v-if="note && !value.detailed" v-model:note="note" :key="note.id + ':normal'" style="margin-bottom: 16px;"/>
|
||||||
|
<XNoteDetailed v-if="note && value.detailed" v-model:note="note" :key="note.id + ':detail'" style="margin-bottom: 16px;"/>
|
||||||
</section>
|
</section>
|
||||||
</XContainer>
|
</XContainer>
|
||||||
</template>
|
</template>
|
||||||
@ -21,11 +22,12 @@ import XContainer from '../page-editor.container.vue';
|
|||||||
import MkInput from '@/components/ui/input.vue';
|
import MkInput from '@/components/ui/input.vue';
|
||||||
import MkSwitch from '@/components/ui/switch.vue';
|
import MkSwitch from '@/components/ui/switch.vue';
|
||||||
import XNote from '@/components/note.vue';
|
import XNote from '@/components/note.vue';
|
||||||
|
import XNoteDetailed from '@/components/note-detailed.vue';
|
||||||
import * as os from '@/os';
|
import * as os from '@/os';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: {
|
components: {
|
||||||
XContainer, MkInput, MkSwitch, XNote
|
XContainer, MkInput, MkSwitch, XNote, XNoteDetailed,
|
||||||
},
|
},
|
||||||
|
|
||||||
props: {
|
props: {
|
||||||
|
@ -61,8 +61,10 @@ import { faPencilAlt, faPlug } from '@fortawesome/free-solid-svg-icons';
|
|||||||
import { v4 as uuid } from 'uuid';
|
import { v4 as uuid } from 'uuid';
|
||||||
import XContainer from './page-editor.container.vue';
|
import XContainer from './page-editor.container.vue';
|
||||||
import MkTextarea from '@/components/ui/textarea.vue';
|
import MkTextarea from '@/components/ui/textarea.vue';
|
||||||
import { isLiteralBlock, funcDefs, blockDefs } from '@/scripts/hpml/index';
|
import { blockDefs } from '@/scripts/hpml/index';
|
||||||
import * as os from '@/os';
|
import * as os from '@/os';
|
||||||
|
import { isLiteralValue } from '@/scripts/hpml/expr';
|
||||||
|
import { funcDefs } from '@/scripts/hpml/lib';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: {
|
components: {
|
||||||
@ -166,7 +168,7 @@ export default defineComponent({
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isLiteralBlock(this.value)) return;
|
if (isLiteralValue(this.value)) return;
|
||||||
|
|
||||||
const empties = [];
|
const empties = [];
|
||||||
for (let i = 0; i < funcDefs[this.value.type].in.length; i++) {
|
for (let i = 0; i < funcDefs[this.value.type].in.length; i++) {
|
||||||
|