Compare commits
316 Commits
Author | SHA1 | Date | |
---|---|---|---|
0efb7af17b | |||
a45a78b94f | |||
6337c26cf0 | |||
208dec25d9 | |||
7d65a0c3d5 | |||
bb925e5de3 | |||
c9de5b65d4 | |||
9bc3fcf74f | |||
19d979c330 | |||
bb7b335491 | |||
be5a0b4794 | |||
48eea03386 | |||
566317dc83 | |||
d4334645c2 | |||
d60c3c4ee3 | |||
452514f7fe | |||
58abb0ce8f | |||
000d9cc1ce | |||
8cc017354a | |||
60269d15e8 | |||
7caa083612 | |||
68e1b00eb1 | |||
1d904c756a | |||
0a1db1f595 | |||
e30e8267dd | |||
288a881817 | |||
f593790872 | |||
1044ad8589 | |||
6e24015e68 | |||
b9a2c449ff | |||
7c390cbf7b | |||
a657d1c774 | |||
f3936a79aa | |||
78b560d89a | |||
2fc6313380 | |||
c2b882a5d7 | |||
667b18fe24 | |||
60c0dac5f2 | |||
79f3e60dac | |||
c4e04d6bf2 | |||
49f8219e54 | |||
abd873e0a8 | |||
0e45d0d47f | |||
043b66f5da | |||
5d6e1fc391 | |||
fe292e77de | |||
c996b5d0c8 | |||
7beb592f0c | |||
b3b11acd96 | |||
3bcdfbbd00 | |||
fdad5d149f | |||
2e712a9212 | |||
86c8e634bb | |||
197a9306c4 | |||
2e502a6b61 | |||
aa8a40e950 | |||
2f45ac3712 | |||
8ecf3db608 | |||
f59c68022f | |||
7aac2c4e29 | |||
0481de6629 | |||
f59d0a75e4 | |||
22f4b3cc7b | |||
a4283c415a | |||
c0fbcee38a | |||
335200c31e | |||
df71c90f9f | |||
4220bdc963 | |||
97f3b1e46f | |||
3a9dc358f8 | |||
2a3ab46a3d | |||
200a01f65f | |||
e68936911d | |||
634ffeec54 | |||
8486cb785d | |||
a9eda4e6e2 | |||
f918f9b307 | |||
d404d02d2d | |||
61f7a3974f | |||
cad8e4dea2 | |||
ef79903811 | |||
c3cd0451ad | |||
773fe28fcb | |||
69e2576387 | |||
908a5a1bb4 | |||
ffbd9ffc75 | |||
96223dd5e3 | |||
3231f12b93 | |||
1408f39d9a | |||
4ba06541aa | |||
5c78ed645a | |||
33e19447aa | |||
b52d995719 | |||
db5b90c093 | |||
39bc75a7f9 | |||
3492067ecf | |||
e342a8da05 | |||
671d71dd47 | |||
2f18d2ed8f | |||
f6e8165db0 | |||
eab3b22772 | |||
7664aa5a8c | |||
a366392cbe | |||
c8c1bc09f9 | |||
11bb1608cf | |||
b1d77775aa | |||
bc3f5e0d78 | |||
53ea709697 | |||
b7adbbb9bf | |||
31aaf559ac | |||
160185b108 | |||
848ff4440b | |||
74291b2cae | |||
ae6c4e0c5f | |||
ecb1840e27 | |||
42eb82a859 | |||
89a22908ce | |||
bc3a94aa57 | |||
77fe579d9b | |||
e8c7803a2f | |||
1abaef624c | |||
72cf2344a9 | |||
0462512e62 | |||
1d6b2bd969 | |||
5df90fdc4a | |||
607a5326d9 | |||
2cbd35acc4 | |||
9a0224ee21 | |||
2beedc5978 | |||
6d53e64798 | |||
3478cdea08 | |||
b360f2ed45 | |||
7b0c4c29b4 | |||
03f5d7575c | |||
e922d8904c | |||
45b55a8c98 | |||
8973b76bda | |||
41cf856e26 | |||
b7aeb10304 | |||
b8d9c1aa45 | |||
d7dbe503b6 | |||
c625dd074a | |||
f8a977f1c0 | |||
c35e760fd3 | |||
bc34ac82cf | |||
98f25c9159 | |||
ae9c13df66 | |||
9f8d21b2bc | |||
e05e97561a | |||
f9d21fd34a | |||
86aef5f3e0 | |||
e6bc7922ac | |||
b2f40b7d3e | |||
3878793405 | |||
33c7aef220 | |||
e927f7a4ec | |||
cd09fa5a28 | |||
9ca9757418 | |||
1fae2ffc37 | |||
71657ddb98 | |||
63845e0ba7 | |||
6781b68d33 | |||
d058eff59a | |||
f409faea2c | |||
77da98cd39 | |||
471afcbd57 | |||
72809f9d78 | |||
743fb45c3c | |||
93d6b71a31 | |||
9b10e93fba | |||
0740837b6a | |||
ff49eacee4 | |||
fbc6b267ff | |||
10cae8894e | |||
42addfed85 | |||
0dd6494ab9 | |||
9f4c6a3aef | |||
9438dc560d | |||
003ef65b59 | |||
978fb7e63a | |||
6203577696 | |||
f2b61f6a7e | |||
6f4aa69723 | |||
b308e1bb2b | |||
ab3dad2d84 | |||
0af103f399 | |||
873608a7de | |||
b04ad167da | |||
ad0d06c0d8 | |||
151476ae8a | |||
fbf43c1450 | |||
35a1fa5bf0 | |||
8d3f71d490 | |||
2239eddf88 | |||
94ea21d482 | |||
6a39f92431 | |||
7b2efa35c7 | |||
c41ea84568 | |||
0e8262e623 | |||
4d97946943 | |||
96d48b5519 | |||
4cc54d081e | |||
aab5a2ffbd | |||
c8f165b4ad | |||
9776d8e06b | |||
10f845ae76 | |||
2c8f962889 | |||
1721a82352 | |||
59bec546e4 | |||
86503f2d69 | |||
e4b8c688bb | |||
4535ab4c43 | |||
dcdb57df9d | |||
cfc2808c56 | |||
4a3d74c608 | |||
e18655d18f | |||
12b4b78763 | |||
550a528fc1 | |||
4e3429a5c7 | |||
ef98383075 | |||
d66d1f142f | |||
c896055cb1 | |||
2e8b2e0cf9 | |||
59012b5693 | |||
dfb51e8d26 | |||
5107824352 | |||
bf7ec18316 | |||
77d82d2d17 | |||
2777460150 | |||
9476a240d9 | |||
bddb878931 | |||
b0768d8a4a | |||
46bb7f9efb | |||
a507b7c0b0 | |||
939c0dc5f9 | |||
a89c206572 | |||
8b55263e72 | |||
f2ad1e4639 | |||
0fbcec1c16 | |||
ec2b73d076 | |||
6630bb0b39 | |||
bef0d4c8bd | |||
a57cb3bd31 | |||
1e4577a988 | |||
fe792b5bbb | |||
d4005133d0 | |||
abe8e80268 | |||
e38e4940b4 | |||
48dc1678c3 | |||
431383ab54 | |||
7a8d252f63 | |||
04525e2997 | |||
a2f96f3f20 | |||
a81ecb0b28 | |||
1122368ee0 | |||
6c54328391 | |||
1a26816f7a | |||
8538334d08 | |||
9387ebc569 | |||
c99dce68ed | |||
6dea84c6d2 | |||
39060374c2 | |||
d3ebb5d13f | |||
4e7c10d3d9 | |||
e93ea66d2d | |||
152dd70ea5 | |||
7b94cf9f84 | |||
d70e27a865 | |||
b780ea336c | |||
bd9f589d32 | |||
d9d18bd8f9 | |||
ffdaa6bc56 | |||
c7f60e337e | |||
7f265dbd52 | |||
8929c5cabc | |||
4a610f3b0a | |||
55ec19edb5 | |||
c319c61832 | |||
66db99b8cd | |||
ff2162974d | |||
78e86af086 | |||
2dcf89eecf | |||
fdf94be998 | |||
0e913a5727 | |||
f3be077adc | |||
a6e0471f8c | |||
c5d734f9ad | |||
ee12d887ae | |||
b78d24be1e | |||
d5379e2b36 | |||
cf36557084 | |||
fd1ee129dc | |||
1471b7a6b5 | |||
1d39d7efcb | |||
69ee97f6e2 | |||
12092e6083 | |||
6e29e40b8b | |||
842c9e735b | |||
2f63a25058 | |||
d3b084003c | |||
0da9d3d8b0 | |||
58f3c6aab7 | |||
22e79675ad | |||
e5c350d740 | |||
210124ac34 | |||
7f9a35d7ac | |||
71a30f9001 | |||
95a34d55fb | |||
34f052b672 | |||
0178c2e696 | |||
5cb0c07627 | |||
d8fdbfe164 | |||
74e0b2734d | |||
3f5785bd03 | |||
15e5c69c15 | |||
57019c0b40 |
@ -5,6 +5,15 @@ ChangeLog
|
|||||||
|
|
||||||
This document describes breaking changes only.
|
This document describes breaking changes only.
|
||||||
|
|
||||||
|
7.0.0
|
||||||
|
-----
|
||||||
|
|
||||||
|
### Migration
|
||||||
|
|
||||||
|
起動する前に、`node cli/migration/7.0.0`してください。
|
||||||
|
|
||||||
|
Please run `node cli/migration/7.0.0` before launch.
|
||||||
|
|
||||||
6.0.0
|
6.0.0
|
||||||
-----
|
-----
|
||||||
|
|
||||||
|
72
README.md
72
README.md
@ -7,10 +7,12 @@
|
|||||||
[![][dependencies-badge]][dependencies-link]
|
[![][dependencies-badge]][dependencies-link]
|
||||||
[](http://makeapullrequest.com) [](https://greenkeeper.io/)
|
[](http://makeapullrequest.com) [](https://greenkeeper.io/)
|
||||||
|
|
||||||
**Microblogging. Redefined.**
|
Sophisticated microblogging platform, evolving forever.
|
||||||
|
|
||||||
**[Misskey](https://misskey.xyz)** is a completely open source,
|
[Misskey](https://misskey.xyz) is a decentralized microblogging platform born on Earth.
|
||||||
ultimately sophisticated professional microblogging software.
|
Since it exists within the Fediverse (a universe where various social media platforms are organized),
|
||||||
|
it is mutually linked with other social media platforms.
|
||||||
|
Why don't you take a short break from the hustle and bustle of the city, and dive into a new Internet?
|
||||||
|
|
||||||
<a href="https://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>
|
||||||
|
|
||||||
@ -28,7 +30,7 @@ ultimately sophisticated professional microblogging software.
|
|||||||
|
|
||||||
and more! You can see it with your own eyes at [misskey.xyz](https://misskey.xyz).
|
and more! You can see it with your own eyes at [misskey.xyz](https://misskey.xyz).
|
||||||
|
|
||||||
:package: Create your instance
|
:package: Create your own instance
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
If you want to run your own instance of Misskey,
|
If you want to run your own instance of Misskey,
|
||||||
please see [Setup and installation guide](./docs/setup.en.md).
|
please see [Setup and installation guide](./docs/setup.en.md).
|
||||||
@ -43,34 +45,40 @@ If you want to...
|
|||||||
|
|
||||||
:heart: Backers & Sponsors
|
:heart: Backers & Sponsors
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
<table>
|
<!-- PATREON_START -->
|
||||||
<tr>
|
<table><tr>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/619786/32cf01444db24e578cd1982c197f6fc6/1?token-time=2145916800&token-hash=tB1e_r8RlZ5sFL0KV_e8dugapxatNBRK1Z3h67TO1g8%3D"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12378075/0156f769e20f412594fa6b87d85fe228/1?token-time=2145916800&token-hash=IsIJRUXszzoD6-7pDnRY8I05T9nSznc4GTaxj7C9SwU%3D" alt="39ff"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12378075/0156f769e20f412594fa6b87d85fe228/1?token-time=2145916800&token-hash=IsIJRUXszzoD6-7pDnRY8I05T9nSznc4GTaxj7C9SwU%3D"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12731202/0995c46cdcb54153ab5f073f5869b70a/1?token-time=2145916800&token-hash=Yd60FK_SWfQO56SeiJpy1tDHOnCV4xdEywQe8gn5_Wo%3D" alt="negao"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/4503830/ccf2cc867ea64de0b524bb2e24b9a1cb/1?token-time=2145916800&token-hash=S1zP0QyLU52Dqq6dtc9qNYyWfW86XrYHiR4NMbeOrnA%3D"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12913507/f7181eacafe8469a93033d85f5969c29/1?token-time=2145916800&token-hash=f03BFb4S2FUx9YEt87TnEmifb4h33OywGBW2akQVtQY%3D" alt="Melilot"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12531784/93a45137841849329ba692da92ac7c60/1?token-time=2145916800&token-hash=tMosUojzUYJCH_3t--tvYA-SMCyrS__hzSndyaRSnbo%3D"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/3384329/8b713330cb27404ea6e9fac50ff96efe/1?token-time=2145916800&token-hash=0eu4-m1gTWA9PhptVZt6rdKcusqcD7RB87rJT23VVFI%3D" alt="べすれい"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12959468/c249e15aebec4424b5c0f427173671b6/1?token-time=2145916800&token-hash=lubpCEdxAkxPlpR2O6bvZ7BIh8Q4nGf-U_mE1qpjVAQ%3D"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12021162/963128bb8d14476dbd8407943db8f31a/1?token-time=2145916800&token-hash=GgJ_NmUB6_nnRNLVGUWjV-WX91On7BOu59LKncYV9fE%3D" alt="gutfuckllc"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12913507/f7181eacafe8469a93033d85f5969c29/1?token-time=2145916800&token-hash=f03BFb4S2FUx9YEt87TnEmifb4h33OywGBW2akQVtQY%3D"></td>
|
<td><img src="https://c8.patreon.com/2/100/12718187" alt="Peter G."></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/5881381/6235ca5d3fb04c8e95ef5b4ff2abcc18/2?token-time=2145916800&token-hash=zElv7ZcPL3viGsXbNG_KWiKrbV0vvw1gk0panx8DJoo%3D"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/5881381/6235ca5d3fb04c8e95ef5b4ff2abcc18/2?token-time=2145916800&token-hash=zElv7ZcPL3viGsXbNG_KWiKrbV0vvw1gk0panx8DJoo%3D" alt="Naoki Kosaka"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12731202/0995c46cdcb54153ab5f073f5869b70a/1?token-time=2145916800&token-hash=Yd60FK_SWfQO56SeiJpy1tDHOnCV4xdEywQe8gn5_Wo%3D"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12931605/ead494101f364dffa90efe49e36fb494/1?token-time=2145916800&token-hash=NzSFPjIlodXyv41rwK61aZWVZWfI4surJaNj8vWKvqM%3D" alt="Reiju"></td>
|
||||||
<td><img src="https://c8.patreon.com/2/100/12718187"></td>
|
</tr><tr>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12931605/ead494101f364dffa90efe49e36fb494/1?token-time=2145916800&token-hash=NzSFPjIlodXyv41rwK61aZWVZWfI4surJaNj8vWKvqM%3D"></td>
|
<td><a href="https://www.patreon.com/user?u=12378075">39ff</a></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12021162/963128bb8d14476dbd8407943db8f31a/1?token-time=2145916800&token-hash=GgJ_NmUB6_nnRNLVGUWjV-WX91On7BOu59LKncYV9fE%3D"></td>
|
<td><a href="https://www.patreon.com/user?u=12731202">negao</a></td>
|
||||||
</tr>
|
<td><a href="https://www.patreon.com/user?u=12913507">Melilot</a></td>
|
||||||
<tr>
|
<td><a href="https://www.patreon.com/user?u=3384329">べすれい</a></td>
|
||||||
<td><a href="https://www.patreon.com/mastodon">Gargron</a></td>
|
<td><a href="https://www.patreon.com/gutfuckllc">gutfuckllc</a></td>
|
||||||
<td><a href="https://www.patreon.com/user/creators?u=12378075">39ff</a></td>
|
<td><a href="https://www.patreon.com/user?u=12718187">Peter G.</a></td>
|
||||||
<td><a href="https://www.patreon.com/dansup">dansup</a></td>
|
<td><a href="https://www.patreon.com/user?u=5881381">Naoki Kosaka</a></td>
|
||||||
<td><a href="https://www.patreon.com/user/creators?u=12531784">Takashi Shibuya</a></td>
|
<td><a href="https://www.patreon.com/user?u=12931605">Reiju</a></td>
|
||||||
<td><a href="https://www.patreon.com/fujishan">fujishan</a></td>
|
</tr></table>
|
||||||
<td><a href="https://www.patreon.com/user?u=12913507">Melilot</a></td>
|
<table><tr>
|
||||||
<td><a href="https://www.patreon.com/user?u=5881381">Naoki Kosaka</a></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/4503830/ccf2cc867ea64de0b524bb2e24b9a1cb/1?token-time=2145916800&token-hash=S1zP0QyLU52Dqq6dtc9qNYyWfW86XrYHiR4NMbeOrnA%3D" alt="dansup"></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=12731202">negao</a></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/4950409/28e7d016209243759d9316be2e21381d/2?token-time=2145916800&token-hash=LuEaDkchH3GQWUcTOhBQ8xfKQYF0s5FjlZRd7Yduia8%3D" alt="mikan54951"></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=12718187">Peter G.</a></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12531784/93a45137841849329ba692da92ac7c60/1?token-time=2145916800&token-hash=tMosUojzUYJCH_3t--tvYA-SMCyrS__hzSndyaRSnbo%3D" alt="Takashi Shibuya"></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=12931605">Reiju</a></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12959468/c249e15aebec4424b5c0f427173671b6/1?token-time=2145916800&token-hash=lubpCEdxAkxPlpR2O6bvZ7BIh8Q4nGf-U_mE1qpjVAQ%3D" alt="fujishan"></td>
|
||||||
<td><a href="https://www.patreon.com/gutfuckllc">gutfuckllc</a></td>
|
</tr><tr>
|
||||||
</tr>
|
<td><a href="https://www.patreon.com/dansup">dansup</a></td>
|
||||||
</table>
|
<td><a href="https://www.patreon.com/user?u=4950409">mikan54951</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/fujishan">fujishan</a></td>
|
||||||
|
</tr></table>
|
||||||
|
|
||||||
|
**Last updated:** Sat, 18 Aug 2018 02:02:58 UTC
|
||||||
|
<!-- PATREON_END -->
|
||||||
|
|
||||||
:four_leaf_clover: Copyright
|
:four_leaf_clover: Copyright
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
|
@ -1,101 +0,0 @@
|
|||||||
const chalk = require('chalk');
|
|
||||||
const log = require('single-line-log').stdout;
|
|
||||||
const sequential = require('promise-sequential');
|
|
||||||
const { default: DriveFile, DriveFileChunk } = require('../built/models/drive-file');
|
|
||||||
const { default: DriveFileThumbnail, DriveFileThumbnailChunk } = require('../built/models/drive-file-thumbnail');
|
|
||||||
const { default: User } = require('../built/models/user');
|
|
||||||
|
|
||||||
const q = {
|
|
||||||
'metadata._user.host': {
|
|
||||||
$ne: null
|
|
||||||
},
|
|
||||||
'metadata.withoutChunks': false
|
|
||||||
};
|
|
||||||
|
|
||||||
async function main() {
|
|
||||||
const promiseGens = [];
|
|
||||||
|
|
||||||
const count = await DriveFile.count(q);
|
|
||||||
|
|
||||||
let prev;
|
|
||||||
|
|
||||||
for (let i = 0; i < count; i++) {
|
|
||||||
promiseGens.push(() => {
|
|
||||||
const promise = new Promise(async (res, rej) => {
|
|
||||||
const file = await DriveFile.findOne(prev ? Object.assign({
|
|
||||||
_id: { $lt: prev._id }
|
|
||||||
}, q) : q, {
|
|
||||||
sort: {
|
|
||||||
_id: -1
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
prev = file;
|
|
||||||
|
|
||||||
function skip() {
|
|
||||||
res([i, file, false]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (file == null) return skip();
|
|
||||||
|
|
||||||
log(chalk`{gray ${i}} scanning {bold ${file._id}} ${file.filename} ...`);
|
|
||||||
|
|
||||||
const attachingUsersCount = await User.count({
|
|
||||||
$or: [{
|
|
||||||
avatarId: file._id
|
|
||||||
}, {
|
|
||||||
bannerId: file._id
|
|
||||||
}]
|
|
||||||
}, { limit: 1 });
|
|
||||||
if (attachingUsersCount !== 0) return skip();
|
|
||||||
|
|
||||||
Promise.all([
|
|
||||||
// チャンクをすべて削除
|
|
||||||
DriveFileChunk.remove({
|
|
||||||
files_id: file._id
|
|
||||||
}),
|
|
||||||
|
|
||||||
DriveFile.update({ _id: file._id }, {
|
|
||||||
$set: {
|
|
||||||
'metadata.withoutChunks': true
|
|
||||||
}
|
|
||||||
})
|
|
||||||
]).then(async () => {
|
|
||||||
res([i, file, true]);
|
|
||||||
|
|
||||||
//#region サムネイルもあれば削除
|
|
||||||
const thumbnail = await DriveFileThumbnail.findOne({
|
|
||||||
'metadata.originalId': file._id
|
|
||||||
});
|
|
||||||
|
|
||||||
if (thumbnail) {
|
|
||||||
DriveFileThumbnailChunk.remove({
|
|
||||||
files_id: thumbnail._id
|
|
||||||
});
|
|
||||||
|
|
||||||
DriveFileThumbnail.remove({ _id: thumbnail._id });
|
|
||||||
}
|
|
||||||
//#endregion
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
promise.then(([i, file, deleted]) => {
|
|
||||||
if (deleted) {
|
|
||||||
log(chalk`{gray ${i}} {red deleted: {bold ${file._id}} ${file.filename}}`);
|
|
||||||
} else {
|
|
||||||
log(chalk`{gray ${i}} {green skipped: {bold ${file._id}} ${file.filename}}`);
|
|
||||||
}
|
|
||||||
log.clear();
|
|
||||||
console.log();
|
|
||||||
});
|
|
||||||
|
|
||||||
return promise;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return await sequential(promiseGens);
|
|
||||||
}
|
|
||||||
|
|
||||||
main().then(() => {
|
|
||||||
console.log('ALL DONE');
|
|
||||||
}).catch(console.error);
|
|
@ -1,80 +0,0 @@
|
|||||||
const chalk = require('chalk');
|
|
||||||
const log = require('single-line-log').stdout;
|
|
||||||
const sequential = require('promise-sequential');
|
|
||||||
const { default: DriveFile, deleteDriveFile } = require('../built/models/drive-file');
|
|
||||||
const { default: Note } = require('../built/models/note');
|
|
||||||
const { default: MessagingMessage } = require('../built/models/messaging-message');
|
|
||||||
const { default: User } = require('../built/models/user');
|
|
||||||
|
|
||||||
async function main() {
|
|
||||||
const promiseGens = [];
|
|
||||||
|
|
||||||
const count = await DriveFile.count({});
|
|
||||||
|
|
||||||
let prev;
|
|
||||||
|
|
||||||
for (let i = 0; i < count; i++) {
|
|
||||||
promiseGens.push(() => {
|
|
||||||
const promise = new Promise(async (res, rej) => {
|
|
||||||
const file = await DriveFile.findOne(prev ? {
|
|
||||||
_id: { $lt: prev._id }
|
|
||||||
} : {}, {
|
|
||||||
sort: {
|
|
||||||
_id: -1
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
prev = file;
|
|
||||||
|
|
||||||
function skip() {
|
|
||||||
res([i, file, false]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (file == null) return skip();
|
|
||||||
|
|
||||||
log(chalk`{gray ${i}} scanning {bold ${file._id}} ${file.filename} ...`);
|
|
||||||
|
|
||||||
const attachingUsersCount = await User.count({
|
|
||||||
$or: [{
|
|
||||||
avatarId: file._id
|
|
||||||
}, {
|
|
||||||
bannerId: file._id
|
|
||||||
}]
|
|
||||||
}, { limit: 1 });
|
|
||||||
if (attachingUsersCount !== 0) return skip();
|
|
||||||
|
|
||||||
const attachingNotesCount = await Note.count({
|
|
||||||
mediaIds: file._id
|
|
||||||
}, { limit: 1 });
|
|
||||||
if (attachingNotesCount !== 0) return skip();
|
|
||||||
|
|
||||||
const attachingMessagesCount = await MessagingMessage.count({
|
|
||||||
fileId: file._id
|
|
||||||
}, { limit: 1 });
|
|
||||||
if (attachingMessagesCount !== 0) return skip();
|
|
||||||
|
|
||||||
deleteDriveFile(file).then(() => {
|
|
||||||
res([i, file, true]);
|
|
||||||
}).catch(rej);
|
|
||||||
});
|
|
||||||
|
|
||||||
promise.then(([i, file, deleted]) => {
|
|
||||||
if (deleted) {
|
|
||||||
log(chalk`{gray ${i}} {red deleted: {bold ${file._id}} ${file.filename}}`);
|
|
||||||
} else {
|
|
||||||
log(chalk`{gray ${i}} {green skipped: {bold ${file._id}} ${file.filename}}`);
|
|
||||||
}
|
|
||||||
log.clear();
|
|
||||||
console.log();
|
|
||||||
});
|
|
||||||
|
|
||||||
return promise;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return await sequential(promiseGens);
|
|
||||||
}
|
|
||||||
|
|
||||||
main().then(() => {
|
|
||||||
console.log('done');
|
|
||||||
}).catch(console.error);
|
|
134
cli/migration/7.0.0.js
Normal file
134
cli/migration/7.0.0.js
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
const { default: Stats } = require('../../built/models/stats');
|
||||||
|
const { default: User } = require('../../built/models/user');
|
||||||
|
const { default: Note } = require('../../built/models/note');
|
||||||
|
const { default: DriveFile } = require('../../built/models/drive-file');
|
||||||
|
|
||||||
|
const now = new Date();
|
||||||
|
const y = now.getFullYear();
|
||||||
|
const m = now.getMonth();
|
||||||
|
const d = now.getDate();
|
||||||
|
const today = new Date(y, m, d);
|
||||||
|
|
||||||
|
async function main() {
|
||||||
|
const localUsersCount = await User.count({
|
||||||
|
host: null
|
||||||
|
});
|
||||||
|
|
||||||
|
const remoteUsersCount = await User.count({
|
||||||
|
host: { $ne: null }
|
||||||
|
});
|
||||||
|
|
||||||
|
const localNotesCount = await Note.count({
|
||||||
|
'_user.host': null
|
||||||
|
});
|
||||||
|
|
||||||
|
const remoteNotesCount = await Note.count({
|
||||||
|
'_user.host': { $ne: null }
|
||||||
|
});
|
||||||
|
|
||||||
|
const localDriveFilesCount = await DriveFile.count({
|
||||||
|
'metadata._user.host': null
|
||||||
|
});
|
||||||
|
|
||||||
|
const remoteDriveFilesCount = await DriveFile.count({
|
||||||
|
'metadata._user.host': { $ne: null }
|
||||||
|
});
|
||||||
|
|
||||||
|
const localDriveFilesSize = await DriveFile
|
||||||
|
.aggregate([{
|
||||||
|
$match: {
|
||||||
|
'metadata._user.host': null,
|
||||||
|
'metadata.deletedAt': { $exists: false }
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
$project: {
|
||||||
|
length: true
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
$group: {
|
||||||
|
_id: null,
|
||||||
|
usage: { $sum: '$length' }
|
||||||
|
}
|
||||||
|
}])
|
||||||
|
.then(aggregates => {
|
||||||
|
if (aggregates.length > 0) {
|
||||||
|
return aggregates[0].usage;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
});
|
||||||
|
|
||||||
|
const remoteDriveFilesSize = await DriveFile
|
||||||
|
.aggregate([{
|
||||||
|
$match: {
|
||||||
|
'metadata._user.host': { $ne: null },
|
||||||
|
'metadata.deletedAt': { $exists: false }
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
$project: {
|
||||||
|
length: true
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
$group: {
|
||||||
|
_id: null,
|
||||||
|
usage: { $sum: '$length' }
|
||||||
|
}
|
||||||
|
}])
|
||||||
|
.then(aggregates => {
|
||||||
|
if (aggregates.length > 0) {
|
||||||
|
return aggregates[0].usage;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
});
|
||||||
|
|
||||||
|
await Stats.insert({
|
||||||
|
date: today,
|
||||||
|
users: {
|
||||||
|
local: {
|
||||||
|
total: localUsersCount,
|
||||||
|
diff: 0
|
||||||
|
},
|
||||||
|
remote: {
|
||||||
|
total: remoteUsersCount,
|
||||||
|
diff: 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
notes: {
|
||||||
|
local: {
|
||||||
|
total: localNotesCount,
|
||||||
|
diff: 0,
|
||||||
|
diffs: {
|
||||||
|
normal: 0,
|
||||||
|
reply: 0,
|
||||||
|
renote: 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
remote: {
|
||||||
|
total: remoteNotesCount,
|
||||||
|
diff: 0,
|
||||||
|
diffs: {
|
||||||
|
normal: 0,
|
||||||
|
reply: 0,
|
||||||
|
renote: 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
drive: {
|
||||||
|
local: {
|
||||||
|
totalCount: localDriveFilesCount,
|
||||||
|
totalSize: localDriveFilesSize,
|
||||||
|
diffCount: 0,
|
||||||
|
diffSize: 0
|
||||||
|
},
|
||||||
|
remote: {
|
||||||
|
totalCount: remoteDriveFilesCount,
|
||||||
|
totalSize: remoteDriveFilesSize,
|
||||||
|
diffCount: 0,
|
||||||
|
diffSize: 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('done');
|
||||||
|
}
|
||||||
|
|
||||||
|
main();
|
@ -33,14 +33,3 @@ node cli/suspend @syuilo@misskey.xyz
|
|||||||
``` shell
|
``` shell
|
||||||
node cli/reset-password (User-ID or Username)
|
node cli/reset-password (User-ID or Username)
|
||||||
```
|
```
|
||||||
|
|
||||||
## Clean up cached remote files
|
|
||||||
``` shell
|
|
||||||
node cli/clean-cached-remote-files
|
|
||||||
```
|
|
||||||
|
|
||||||
## Clean up unused drive files
|
|
||||||
``` shell
|
|
||||||
node cli/clean-unused-drive-files
|
|
||||||
```
|
|
||||||
> We recommend that you announce a user that unused drive files will be deleted before performing this operation, as it may delete the user's important files.
|
|
||||||
|
@ -33,14 +33,3 @@ node cli/suspend @syuilo@misskey.xyz
|
|||||||
``` shell
|
``` shell
|
||||||
node cli/reset-password (ユーザーID または ユーザー名)
|
node cli/reset-password (ユーザーID または ユーザー名)
|
||||||
```
|
```
|
||||||
|
|
||||||
## キャッシュされたリモートファイルをクリーンアップする
|
|
||||||
``` shell
|
|
||||||
node cli/clean-cached-remote-files
|
|
||||||
```
|
|
||||||
|
|
||||||
## 使われていないドライブのファイルをクリーンアップする
|
|
||||||
``` shell
|
|
||||||
node cli/clean-unused-drive-files
|
|
||||||
```
|
|
||||||
> ユーザーの大事なファイルを削除する可能性があるので、この操作を実行する前にユーザーに告知することをお勧めします。
|
|
||||||
|
5
locales/README.md
Normal file
5
locales/README.md
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# **Please DO NOT edit these files** except `ja.yml`.
|
||||||
|
|
||||||
|
If you want to...
|
||||||
|
* i18n ... please see [Translation guide](../docs/translate.en.md).
|
||||||
|
* l10n ... please visit https://crowdin.com/project/misskey
|
@ -84,7 +84,7 @@ common:
|
|||||||
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
||||||
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
||||||
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
||||||
verified-user: "認証済みのユーザー"
|
verified-user: "公式アカウント"
|
||||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "引き分け"
|
drawn: "引き分け"
|
||||||
@ -287,7 +287,10 @@ common/views/components/signin.vue:
|
|||||||
signin: "サインイン"
|
signin: "サインイン"
|
||||||
or: "または"
|
or: "または"
|
||||||
signin-with-twitter: "Twitterでログイン"
|
signin-with-twitter: "Twitterでログイン"
|
||||||
|
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||||
common/views/components/signup.vue:
|
common/views/components/signup.vue:
|
||||||
|
invitation-code: "招待コード"
|
||||||
|
invitation-info: "招待コードをお持ちでない方は、<a href=\"{}\">管理者</a>までご連絡ください。"
|
||||||
username: "ユーザー名"
|
username: "ユーザー名"
|
||||||
checking: "確認しています..."
|
checking: "確認しています..."
|
||||||
available: "利用できます"
|
available: "利用できます"
|
||||||
@ -440,6 +443,7 @@ desktop/views/components/drive-window.vue:
|
|||||||
desktop/views/components/drive.file.vue:
|
desktop/views/components/drive.file.vue:
|
||||||
avatar: "アイコン"
|
avatar: "アイコン"
|
||||||
banner: "バナー"
|
banner: "バナー"
|
||||||
|
nsfw: "閲覧注意"
|
||||||
contextmenu:
|
contextmenu:
|
||||||
rename: "名前を変更"
|
rename: "名前を変更"
|
||||||
mark-as-sensitive: "閲覧注意に設定"
|
mark-as-sensitive: "閲覧注意に設定"
|
||||||
@ -625,9 +629,11 @@ desktop/views/components/settings.vue:
|
|||||||
circle-icons: "円形のアイコンを使用"
|
circle-icons: "円形のアイコンを使用"
|
||||||
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
||||||
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
||||||
|
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||||
show-reply-target: "リプライ先を表示する"
|
show-reply-target: "リプライ先を表示する"
|
||||||
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
|
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
|
||||||
show-renoted-my-notes: "Renoteされた自分の投稿をタイムラインに表示する"
|
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
|
||||||
|
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
|
||||||
show-maps: "マップの自動展開"
|
show-maps: "マップの自動展開"
|
||||||
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
|
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
|
||||||
sound: "サウンド"
|
sound: "サウンド"
|
||||||
@ -795,6 +801,7 @@ desktop/views/pages/admin/admin.dashboard.vue:
|
|||||||
original-users: "このインスタンスのユーザー"
|
original-users: "このインスタンスのユーザー"
|
||||||
all-notes: "全てのノート"
|
all-notes: "全てのノート"
|
||||||
original-notes: "このインスタンスのノート"
|
original-notes: "このインスタンスのノート"
|
||||||
|
invite: "招待"
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
desktop/views/pages/admin/admin.suspend-user.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
suspend-user: "ユーザーの凍結"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
@ -803,6 +810,26 @@ desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|||||||
unsuspend-user: "ユーザーの凍結の解除"
|
unsuspend-user: "ユーザーの凍結の解除"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
|
desktop/views/pages/admin/admin.verify-user.vue:
|
||||||
|
verify-user: "ユーザーの公式アカウント設定"
|
||||||
|
verify: "公式アカウントにする"
|
||||||
|
verified: "公式アカウントにしました"
|
||||||
|
desktop/views/pages/admin/admin.unverify-user.vue:
|
||||||
|
unverify-user: "ユーザーの公式アカウント解除"
|
||||||
|
unverify: "公式アカウントを解除する"
|
||||||
|
unverified: "公式アカウントを解除しました"
|
||||||
|
desktop/views/pages/admin/admin.notes-chart.vue:
|
||||||
|
title: "投稿"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
desktop/views/pages/admin/admin.users-chart.vue:
|
||||||
|
title: "ユーザー"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
desktop/views/pages/admin/admin.drive-chart.vue:
|
||||||
|
title: "ドライブ"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "メディア投稿のみ"
|
is-media-only: "メディア投稿のみ"
|
||||||
is-media-view: "メディアビュー"
|
is-media-view: "メディアビュー"
|
||||||
@ -835,7 +862,7 @@ desktop/views/pages/selectdrive.vue:
|
|||||||
cancel: "キャンセル"
|
cancel: "キャンセル"
|
||||||
upload: "PCからドライブにファイルをアップロード"
|
upload: "PCからドライブにファイルをアップロード"
|
||||||
desktop/views/pages/search.vue:
|
desktop/views/pages/search.vue:
|
||||||
not-available: "検索機能を利用することができません。"
|
not-available: "検索機能はインスタンスの設定で無効になっています。"
|
||||||
not-found: "「{}」に関する投稿は見つかりませんでした。"
|
not-found: "「{}」に関する投稿は見つかりませんでした。"
|
||||||
desktop/views/pages/share.vue:
|
desktop/views/pages/share.vue:
|
||||||
share-with: "{}で共有"
|
share-with: "{}で共有"
|
||||||
@ -928,12 +955,15 @@ mobile/views/components/drive-file-chooser.vue:
|
|||||||
select-file: "ファイルを選択"
|
select-file: "ファイルを選択"
|
||||||
mobile/views/components/drive-folder-chooser.vue:
|
mobile/views/components/drive-folder-chooser.vue:
|
||||||
select-folder: "フォルダーを選択"
|
select-folder: "フォルダーを選択"
|
||||||
|
mobile/views/components/drive.file.vue:
|
||||||
|
nsfw: "閲覧注意"
|
||||||
mobile/views/components/drive.file-detail.vue:
|
mobile/views/components/drive.file-detail.vue:
|
||||||
download: "ダウンロード"
|
download: "ダウンロード"
|
||||||
rename: "名前を変更"
|
rename: "名前を変更"
|
||||||
move: "移動"
|
move: "移動"
|
||||||
hash: "ハッシュ (md5)"
|
hash: "ハッシュ (md5)"
|
||||||
exif: "EXIF"
|
exif: "EXIF"
|
||||||
|
nsfw: "閲覧注意"
|
||||||
mobile/views/components/media-image.vue:
|
mobile/views/components/media-image.vue:
|
||||||
sensitive: "閲覧注意"
|
sensitive: "閲覧注意"
|
||||||
click-to-show: "クリックして表示"
|
click-to-show: "クリックして表示"
|
||||||
@ -1106,7 +1136,8 @@ mobile/views/pages/settings.vue:
|
|||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
show-reply-target: "リプライ先を表示する"
|
show-reply-target: "リプライ先を表示する"
|
||||||
show-my-renotes: "自分の行ったRenoteを表示する"
|
show-my-renotes: "自分の行ったRenoteを表示する"
|
||||||
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
|
show-renoted-my-notes: "自分の投稿のRenoteを表示する"
|
||||||
|
show-local-renotes: "ローカルの投稿のRenoteを表示する"
|
||||||
post-style: "投稿の表示スタイル"
|
post-style: "投稿の表示スタイル"
|
||||||
post-style-standard: "標準"
|
post-style-standard: "標準"
|
||||||
post-style-smart: "スマート"
|
post-style-smart: "スマート"
|
||||||
|
@ -84,7 +84,7 @@ common:
|
|||||||
my-token-regenerated: "Dein Token wurde generiert. Du wirst jetzt abgemeldet."
|
my-token-regenerated: "Dein Token wurde generiert. Du wirst jetzt abgemeldet."
|
||||||
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
||||||
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
||||||
verified-user: "認証済みのユーザー"
|
verified-user: "公式アカウント"
|
||||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "引き分け"
|
drawn: "引き分け"
|
||||||
@ -287,7 +287,10 @@ common/views/components/signin.vue:
|
|||||||
signin: "Anmelden"
|
signin: "Anmelden"
|
||||||
or: "または"
|
or: "または"
|
||||||
signin-with-twitter: "Twitterでログイン"
|
signin-with-twitter: "Twitterでログイン"
|
||||||
|
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||||
common/views/components/signup.vue:
|
common/views/components/signup.vue:
|
||||||
|
invitation-code: "招待コード"
|
||||||
|
invitation-info: "招待コードをお持ちでない方は、<a href=\"{}\">管理者</a>までご連絡ください。"
|
||||||
username: "Benutzername"
|
username: "Benutzername"
|
||||||
checking: "Überprüfung..."
|
checking: "Überprüfung..."
|
||||||
available: "Verfügbar"
|
available: "Verfügbar"
|
||||||
@ -440,6 +443,7 @@ desktop/views/components/drive-window.vue:
|
|||||||
desktop/views/components/drive.file.vue:
|
desktop/views/components/drive.file.vue:
|
||||||
avatar: "Avatar"
|
avatar: "Avatar"
|
||||||
banner: "Banner"
|
banner: "Banner"
|
||||||
|
nsfw: "閲覧注意"
|
||||||
contextmenu:
|
contextmenu:
|
||||||
rename: "Umbenennen"
|
rename: "Umbenennen"
|
||||||
mark-as-sensitive: "閲覧注意に設定"
|
mark-as-sensitive: "閲覧注意に設定"
|
||||||
@ -625,9 +629,11 @@ desktop/views/components/settings.vue:
|
|||||||
circle-icons: "Kreisförmige Icons"
|
circle-icons: "Kreisförmige Icons"
|
||||||
gradient-window-header: "Übergang in Fensterköpfen"
|
gradient-window-header: "Übergang in Fensterköpfen"
|
||||||
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
||||||
|
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||||
show-reply-target: "Zeige Antworten"
|
show-reply-target: "Zeige Antworten"
|
||||||
show-my-renotes: "Zeige meine Reposts auf der Zeitleiste"
|
show-my-renotes: "Zeige meine Reposts auf der Zeitleiste"
|
||||||
show-renoted-my-notes: "Zeige meine Reposts, die geteilt wurden, auf der Zeitleiste"
|
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
|
||||||
|
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
|
||||||
show-maps: "Karte anzeigen"
|
show-maps: "Karte anzeigen"
|
||||||
show-maps-desc: "Zeige den Standort zu diesem Beitrag automatisch an."
|
show-maps-desc: "Zeige den Standort zu diesem Beitrag automatisch an."
|
||||||
sound: "Ton"
|
sound: "Ton"
|
||||||
@ -795,6 +801,7 @@ desktop/views/pages/admin/admin.dashboard.vue:
|
|||||||
original-users: "このインスタンスのユーザー"
|
original-users: "このインスタンスのユーザー"
|
||||||
all-notes: "全てのノート"
|
all-notes: "全てのノート"
|
||||||
original-notes: "このインスタンスのノート"
|
original-notes: "このインスタンスのノート"
|
||||||
|
invite: "招待"
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
desktop/views/pages/admin/admin.suspend-user.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
suspend-user: "ユーザーの凍結"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
@ -803,6 +810,26 @@ desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|||||||
unsuspend-user: "ユーザーの凍結の解除"
|
unsuspend-user: "ユーザーの凍結の解除"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
|
desktop/views/pages/admin/admin.verify-user.vue:
|
||||||
|
verify-user: "ユーザーの公式アカウント設定"
|
||||||
|
verify: "公式アカウントにする"
|
||||||
|
verified: "公式アカウントにしました"
|
||||||
|
desktop/views/pages/admin/admin.unverify-user.vue:
|
||||||
|
unverify-user: "ユーザーの公式アカウント解除"
|
||||||
|
unverify: "公式アカウントを解除する"
|
||||||
|
unverified: "公式アカウントを解除しました"
|
||||||
|
desktop/views/pages/admin/admin.notes-chart.vue:
|
||||||
|
title: "投稿"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
desktop/views/pages/admin/admin.users-chart.vue:
|
||||||
|
title: "ユーザー"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
desktop/views/pages/admin/admin.drive-chart.vue:
|
||||||
|
title: "ドライブ"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "メディア投稿のみ"
|
is-media-only: "メディア投稿のみ"
|
||||||
is-media-view: "メディアビュー"
|
is-media-view: "メディアビュー"
|
||||||
@ -835,7 +862,7 @@ desktop/views/pages/selectdrive.vue:
|
|||||||
cancel: "Abbrechen"
|
cancel: "Abbrechen"
|
||||||
upload: "PCからドライブにファイルをアップロード"
|
upload: "PCからドライブにファイルをアップロード"
|
||||||
desktop/views/pages/search.vue:
|
desktop/views/pages/search.vue:
|
||||||
not-available: "検索機能を利用することができません。"
|
not-available: "検索機能はインスタンスの設定で無効になっています。"
|
||||||
not-found: "「{}」に関する投稿は見つかりませんでした。"
|
not-found: "「{}」に関する投稿は見つかりませんでした。"
|
||||||
desktop/views/pages/share.vue:
|
desktop/views/pages/share.vue:
|
||||||
share-with: "{}で共有"
|
share-with: "{}で共有"
|
||||||
@ -928,12 +955,15 @@ mobile/views/components/drive-file-chooser.vue:
|
|||||||
select-file: "ファイルを選択"
|
select-file: "ファイルを選択"
|
||||||
mobile/views/components/drive-folder-chooser.vue:
|
mobile/views/components/drive-folder-chooser.vue:
|
||||||
select-folder: "フォルダーを選択"
|
select-folder: "フォルダーを選択"
|
||||||
|
mobile/views/components/drive.file.vue:
|
||||||
|
nsfw: "閲覧注意"
|
||||||
mobile/views/components/drive.file-detail.vue:
|
mobile/views/components/drive.file-detail.vue:
|
||||||
download: "ダウンロード"
|
download: "ダウンロード"
|
||||||
rename: "名前を変更"
|
rename: "名前を変更"
|
||||||
move: "移動"
|
move: "移動"
|
||||||
hash: "ハッシュ (md5)"
|
hash: "ハッシュ (md5)"
|
||||||
exif: "EXIF"
|
exif: "EXIF"
|
||||||
|
nsfw: "閲覧注意"
|
||||||
mobile/views/components/media-image.vue:
|
mobile/views/components/media-image.vue:
|
||||||
sensitive: "閲覧注意"
|
sensitive: "閲覧注意"
|
||||||
click-to-show: "クリックして表示"
|
click-to-show: "クリックして表示"
|
||||||
@ -1106,7 +1136,8 @@ mobile/views/pages/settings.vue:
|
|||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
show-reply-target: "リプライ先を表示する"
|
show-reply-target: "リプライ先を表示する"
|
||||||
show-my-renotes: "自分の行ったRenoteを表示する"
|
show-my-renotes: "自分の行ったRenoteを表示する"
|
||||||
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
|
show-renoted-my-notes: "自分の投稿のRenoteを表示する"
|
||||||
|
show-local-renotes: "ローカルの投稿のRenoteを表示する"
|
||||||
post-style: "投稿の表示スタイル"
|
post-style: "投稿の表示スタイル"
|
||||||
post-style-standard: "標準"
|
post-style-standard: "標準"
|
||||||
post-style-smart: "スマート"
|
post-style-smart: "スマート"
|
||||||
|
129
locales/en.yml
129
locales/en.yml
@ -16,7 +16,7 @@ common:
|
|||||||
customization-tips:
|
customization-tips:
|
||||||
title: "Customization tips"
|
title: "Customization tips"
|
||||||
paragraph1: "Home customization allows you to add/delete, drag and drop and rearrange widgets."
|
paragraph1: "Home customization allows you to add/delete, drag and drop and rearrange widgets."
|
||||||
paragraph2: "You can change the display by <strong>right clicking</strong> on some widgets."
|
paragraph2: "You can change the display by <strong><strong>right</strong> clicking</strong> on some widgets."
|
||||||
paragraph3: "To delete a widget, drag and drop the widget onto <strong>the area labeled \"Trash\"</strong> in the header."
|
paragraph3: "To delete a widget, drag and drop the widget onto <strong>the area labeled \"Trash\"</strong> in the header."
|
||||||
paragraph4: "To finish the customization, click \"Finish\" on the upper right."
|
paragraph4: "To finish the customization, click \"Finish\" on the upper right."
|
||||||
gotit: "Got it!"
|
gotit: "Got it!"
|
||||||
@ -72,9 +72,9 @@ common:
|
|||||||
a: "What are you doing?"
|
a: "What are you doing?"
|
||||||
b: "What's happening?"
|
b: "What's happening?"
|
||||||
c: "What’s on your mind?"
|
c: "What’s on your mind?"
|
||||||
d: "What do you wish to say?"
|
d: "Would you post any words?"
|
||||||
e: "Write here"
|
e: "Write here"
|
||||||
f: "Waiting for your writing..."
|
f: "Waiting for your writing."
|
||||||
search: "Search"
|
search: "Search"
|
||||||
delete: "Delete"
|
delete: "Delete"
|
||||||
loading: "Loading"
|
loading: "Loading"
|
||||||
@ -84,7 +84,7 @@ common:
|
|||||||
my-token-regenerated: "Your token has been regenerated, so you will be signed out."
|
my-token-regenerated: "Your token has been regenerated, so you will be signed out."
|
||||||
i-like-sushi: "I prefer sushi rather than pudding"
|
i-like-sushi: "I prefer sushi rather than pudding"
|
||||||
show-reversi-board-labels: "Show row and column labels in Reversi"
|
show-reversi-board-labels: "Show row and column labels in Reversi"
|
||||||
verified-user: "Authorized User"
|
verified-user: "Verified account"
|
||||||
disable-animated-mfm: "Disable animated texts in a post"
|
disable-animated-mfm: "Disable animated texts in a post"
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "Draw"
|
drawn: "Draw"
|
||||||
@ -141,11 +141,11 @@ common:
|
|||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "Would you <b>allow</b> <i>{{ app.name }}</i> to access your account?"
|
share-access: "Would you <b>allow</b> <i>{{ app.name }}</i> to access your account?"
|
||||||
permission-ask: "This application requires the following permissions:"
|
permission-ask: "This application requires the following permissions:"
|
||||||
account-read: "Viewing account information:"
|
account-read: "View account information."
|
||||||
account-write: "Modify account informations:"
|
account-write: "Modify account information."
|
||||||
note-write: "Post."
|
note-write: "Post."
|
||||||
like-write: "To react to posts."
|
like-write: "React to posts."
|
||||||
following-write: "Follow or unfollow."
|
following-write: "Follow and unfollow."
|
||||||
drive-read: "Read your drive."
|
drive-read: "Read your drive."
|
||||||
drive-write: "Upload/delete files in your drive."
|
drive-write: "Upload/delete files in your drive."
|
||||||
notification-read: "Read your notifications."
|
notification-read: "Read your notifications."
|
||||||
@ -154,10 +154,10 @@ auth/views/form.vue:
|
|||||||
accept: "Allow access."
|
accept: "Allow access."
|
||||||
auth/views/index.vue:
|
auth/views/index.vue:
|
||||||
loading: "Loading"
|
loading: "Loading"
|
||||||
denied: "Application authorization denied."
|
denied: "Application authorization has been denied."
|
||||||
denied-paragraph: "This application will not access your account."
|
denied-paragraph: "This application will not access your account."
|
||||||
already-authorized: "This application has already been authorized."
|
already-authorized: "This application has already been authorized."
|
||||||
allowed: "Application authorizations allowed.+"
|
allowed: "Application authorizations allowed."
|
||||||
callback-url: "Going back to the application."
|
callback-url: "Going back to the application."
|
||||||
please-go-back: "Please go back to the application."
|
please-go-back: "Please go back to the application."
|
||||||
error: "Session does not exist."
|
error: "Session does not exist."
|
||||||
@ -169,7 +169,7 @@ common/views/components/games/reversi/reversi.vue:
|
|||||||
common/views/components/games/reversi/reversi.game.vue:
|
common/views/components/games/reversi/reversi.game.vue:
|
||||||
surrender: "Surrender"
|
surrender: "Surrender"
|
||||||
surrendered: "By surrender"
|
surrendered: "By surrender"
|
||||||
is-llotheo: "The lesser one wins"
|
is-llotheo: "The lesser one wins(Llotheo)"
|
||||||
looped-map: "Looped map"
|
looped-map: "Looped map"
|
||||||
can-put-everywhere: "Can put everywhere"
|
can-put-everywhere: "Can put everywhere"
|
||||||
common/views/components/games/reversi/reversi.index.vue:
|
common/views/components/games/reversi/reversi.index.vue:
|
||||||
@ -200,7 +200,7 @@ common/views/components/games/reversi/reversi.room.vue:
|
|||||||
settings-of-the-bot: "Bot settings"
|
settings-of-the-bot: "Bot settings"
|
||||||
this-game-is-started-soon: "The game will begin in seconds"
|
this-game-is-started-soon: "The game will begin in seconds"
|
||||||
waiting-for-other: "Waiting for the opponent"
|
waiting-for-other: "Waiting for the opponent"
|
||||||
waiting-for-me: "Waiting for you"
|
waiting-for-me: "Waiting for the your preparation"
|
||||||
waiting-for-both: "Prepareing"
|
waiting-for-both: "Prepareing"
|
||||||
cancel: "Cancel"
|
cancel: "Cancel"
|
||||||
ready: "Ready"
|
ready: "Ready"
|
||||||
@ -226,7 +226,7 @@ common/views/components/connect-failed.troubleshooter.vue:
|
|||||||
no-server: "Unable to connect to the Misskey server"
|
no-server: "Unable to connect to the Misskey server"
|
||||||
no-server-desc: "The network connection of your device is normal, but you could not connect to the Misskey server. There is a possibility that the server is either down, or under maintenance, please try again later."
|
no-server-desc: "The network connection of your device is normal, but you could not connect to the Misskey server. There is a possibility that the server is either down, or under maintenance, please try again later."
|
||||||
success: "Successfully connected to the Misskey server"
|
success: "Successfully connected to the Misskey server"
|
||||||
success-desc: "It seems to be able to connect. Please reload the page."
|
success-desc: "Looks like we have a connection. Please reload the page."
|
||||||
flush: "Clean cache"
|
flush: "Clean cache"
|
||||||
set-version: "Specify version"
|
set-version: "Specify version"
|
||||||
common/views/components/messaging.vue:
|
common/views/components/messaging.vue:
|
||||||
@ -278,7 +278,7 @@ common/views/components/poll-editor.vue:
|
|||||||
add: "+ Add a choice"
|
add: "+ Add a choice"
|
||||||
destroy: "Discard the poll"
|
destroy: "Discard the poll"
|
||||||
common/views/components/reaction-picker.vue:
|
common/views/components/reaction-picker.vue:
|
||||||
choose-reaction: "Express a reaction"
|
choose-reaction: "Send a reaction"
|
||||||
common/views/components/signin.vue:
|
common/views/components/signin.vue:
|
||||||
username: "Username"
|
username: "Username"
|
||||||
password: "Password"
|
password: "Password"
|
||||||
@ -287,7 +287,10 @@ common/views/components/signin.vue:
|
|||||||
signin: "Sign in"
|
signin: "Sign in"
|
||||||
or: "Or"
|
or: "Or"
|
||||||
signin-with-twitter: "Log in with Twitter"
|
signin-with-twitter: "Log in with Twitter"
|
||||||
|
login-failed: "Log in failed. Make sure you have entered your correct username and password."
|
||||||
common/views/components/signup.vue:
|
common/views/components/signup.vue:
|
||||||
|
invitation-code: "Invitation code"
|
||||||
|
invitation-info: "If you do not have an invitation code, please contact an <a href=\"{}\">administrator</a>."
|
||||||
username: "Username"
|
username: "Username"
|
||||||
checking: "Confirming..."
|
checking: "Confirming..."
|
||||||
available: "Available"
|
available: "Available"
|
||||||
@ -347,7 +350,7 @@ common/views/widgets/calendar.vue:
|
|||||||
this-year: "This year: "
|
this-year: "This year: "
|
||||||
common/views/widgets/donation.vue:
|
common/views/widgets/donation.vue:
|
||||||
title: "Request for donations"
|
title: "Request for donations"
|
||||||
text: "To keep Misskey up and running, we have to spend money on our domain name, the server costs and so on. Since we don't receive money from advertisements, we count on donations from all of you. If you're interested in helping, contact {}. Thank you for your contribution!"
|
text: "To keep Misskey up and running, there have to happen some expense for the domain name, the server and so on. Since our policy is not to display any advertisements, we count on your donations. If you're interested in helping, contact {}. Thank you for your contribution!"
|
||||||
common/views/widgets/photo-stream.vue:
|
common/views/widgets/photo-stream.vue:
|
||||||
title: "Photo stream"
|
title: "Photo stream"
|
||||||
no-photos: "No photos"
|
no-photos: "No photos"
|
||||||
@ -388,8 +391,8 @@ common/views/widgets/tips.vue:
|
|||||||
tips-line20: "The percentage of the calendar widget shows the percentage of time elapsed."
|
tips-line20: "The percentage of the calendar widget shows the percentage of time elapsed."
|
||||||
tips-line21: "You can also use the API to develop bots."
|
tips-line21: "You can also use the API to develop bots."
|
||||||
tips-line23: "Mayu is so cute with its eyebrows."
|
tips-line23: "Mayu is so cute with its eyebrows."
|
||||||
tips-line24: "Misskey started in 2014."
|
tips-line24: "Misskey has been running since 2014."
|
||||||
tips-line25: "You can receive notification even if Misskey is not open in a compatible browser."
|
tips-line25: "In a browser compatible with notification features, you can receive notifications in case Misskey is not open"
|
||||||
common/views/pages/follow.vue:
|
common/views/pages/follow.vue:
|
||||||
signed-in-as: "Signed in as {}"
|
signed-in-as: "Signed in as {}"
|
||||||
following: "Following"
|
following: "Following"
|
||||||
@ -440,6 +443,7 @@ desktop/views/components/drive-window.vue:
|
|||||||
desktop/views/components/drive.file.vue:
|
desktop/views/components/drive.file.vue:
|
||||||
avatar: "Avatar"
|
avatar: "Avatar"
|
||||||
banner: "Banner"
|
banner: "Banner"
|
||||||
|
nsfw: "NSFW"
|
||||||
contextmenu:
|
contextmenu:
|
||||||
rename: "Rename"
|
rename: "Rename"
|
||||||
mark-as-sensitive: "Mark as 'sensitive'"
|
mark-as-sensitive: "Mark as 'sensitive'"
|
||||||
@ -470,7 +474,7 @@ desktop/views/components/drive.nav-folder.vue:
|
|||||||
desktop/views/components/drive.vue:
|
desktop/views/components/drive.vue:
|
||||||
search: "Search"
|
search: "Search"
|
||||||
load-more: "Load more"
|
load-more: "Load more"
|
||||||
empty-draghover: "Drop it here, don't I look cute?"
|
empty-draghover: "Drop it here! Yep, cuz you know I'm cute, right?"
|
||||||
empty-drive: "Your media storage is empty"
|
empty-drive: "Your media storage is empty"
|
||||||
empty-drive-description: "Right-click to open the menu, or drag and drop a file onto here for uploading."
|
empty-drive-description: "Right-click to open the menu, or drag and drop a file onto here for uploading."
|
||||||
empty-folder: "This folder is empty"
|
empty-folder: "This folder is empty"
|
||||||
@ -480,7 +484,7 @@ desktop/views/components/drive.vue:
|
|||||||
url-upload: "Upload from a URL"
|
url-upload: "Upload from a URL"
|
||||||
url-of-file: "URL of file you want to upload"
|
url-of-file: "URL of file you want to upload"
|
||||||
url-upload-requested: "Upload requested"
|
url-upload-requested: "Upload requested"
|
||||||
may-take-time: "It may take some time for the upload to complete."
|
may-take-time: "It may take some time until the upload is complete."
|
||||||
create-folder: "Create a folder"
|
create-folder: "Create a folder"
|
||||||
folder-name: "Folder name"
|
folder-name: "Folder name"
|
||||||
contextmenu:
|
contextmenu:
|
||||||
@ -505,7 +509,7 @@ desktop/views/components/followers.vue:
|
|||||||
desktop/views/components/following-window.vue:
|
desktop/views/components/following-window.vue:
|
||||||
following: "Following {}"
|
following: "Following {}"
|
||||||
desktop/views/components/following.vue:
|
desktop/views/components/following.vue:
|
||||||
empty: "You don’t follow anyone."
|
empty: "It seems you don't have any following users…"
|
||||||
desktop/views/components/friends-maker.vue:
|
desktop/views/components/friends-maker.vue:
|
||||||
title: "Recommended users:"
|
title: "Recommended users:"
|
||||||
empty: "Couldn't find any recommended users."
|
empty: "Couldn't find any recommended users."
|
||||||
@ -554,7 +558,7 @@ desktop/views/components/post-form.vue:
|
|||||||
add-visible-user: "+Add a user"
|
add-visible-user: "+Add a user"
|
||||||
attach-location-information: "Attach location information"
|
attach-location-information: "Attach location information"
|
||||||
hide-contents: "Hide contents"
|
hide-contents: "Hide contents"
|
||||||
reply-placeholder: "Reply to this Post..."
|
reply-placeholder: "Reply to this post..."
|
||||||
quote-placeholder: "Quote this Post..."
|
quote-placeholder: "Quote this Post..."
|
||||||
submit: "Post"
|
submit: "Post"
|
||||||
reply: "Reply"
|
reply: "Reply"
|
||||||
@ -575,7 +579,7 @@ desktop/views/components/post-form.vue:
|
|||||||
recent-tags: "Recent"
|
recent-tags: "Recent"
|
||||||
click-to-tagging: "Click to tagging"
|
click-to-tagging: "Click to tagging"
|
||||||
visibility: "Visibility"
|
visibility: "Visibility"
|
||||||
geolocation-alert: "Your device can not measure location infomation"
|
geolocation-alert: "Your device does not provide location services."
|
||||||
error: "Error"
|
error: "Error"
|
||||||
enter-username: "Please enter a username..."
|
enter-username: "Please enter a username..."
|
||||||
annotations: "Annotations for the post (optional)"
|
annotations: "Annotations for the post (optional)"
|
||||||
@ -613,7 +617,7 @@ desktop/views/components/settings.vue:
|
|||||||
fetch-on-scroll: "Endless loading on scroll"
|
fetch-on-scroll: "Endless loading on scroll"
|
||||||
fetch-on-scroll-desc: "When you scroll down the page, it automatically fetches additional content."
|
fetch-on-scroll-desc: "When you scroll down the page, it automatically fetches additional content."
|
||||||
auto-popout: "Auto pop-out window"
|
auto-popout: "Auto pop-out window"
|
||||||
auto-popout-desc: "Pops-out a newly opened window (onto a new tab), if possible. This setting is stored in the browser."
|
auto-popout-desc: "If it's possible, pop-out display will be used instead of opening a new window. This setting is stored in your browser."
|
||||||
advanced: "Advanced settings"
|
advanced: "Advanced settings"
|
||||||
api-via-stream: "API request via stream"
|
api-via-stream: "API request via stream"
|
||||||
api-via-stream-desc: "API request is performed via the WebSocket connection instead of native fetch API (for better performance). This setting is stored in the browser."
|
api-via-stream-desc: "API request is performed via the WebSocket connection instead of native fetch API (for better performance). This setting is stored in the browser."
|
||||||
@ -625,11 +629,13 @@ desktop/views/components/settings.vue:
|
|||||||
circle-icons: "Use circle icons"
|
circle-icons: "Use circle icons"
|
||||||
gradient-window-header: "Use gradients on window headers"
|
gradient-window-header: "Use gradients on window headers"
|
||||||
post-form-on-timeline: "Display post form at the top of the timeline"
|
post-form-on-timeline: "Display post form at the top of the timeline"
|
||||||
|
suggest-recent-hashtags: "Show recent popular hashtags on the post form"
|
||||||
show-reply-target: "Display reply target"
|
show-reply-target: "Display reply target"
|
||||||
show-my-renotes: "Show my reposts in the timeline"
|
show-my-renotes: "Show my renotes in the timeline"
|
||||||
show-renoted-my-notes: "Show my posts that have been shared in the timeline"
|
show-renoted-my-notes: "Show renoted my posts in timelines"
|
||||||
show-maps: "Show the map"
|
show-local-renotes: "Show renoted local posts in timelines"
|
||||||
show-maps-desc: "Automatically show the location on the map attached to this post."
|
show-maps: "Display a map to show the location"
|
||||||
|
show-maps-desc: "If there comes a post contains location information, show a map to display the location."
|
||||||
sound: "Sound"
|
sound: "Sound"
|
||||||
enable-sounds: "Enable sound"
|
enable-sounds: "Enable sound"
|
||||||
enable-sounds-desc: "Play a sound when you receive a post/message. This setting is stored in the browser."
|
enable-sounds-desc: "Play a sound when you receive a post/message. This setting is stored in the browser."
|
||||||
@ -674,18 +680,18 @@ desktop/views/components/settings.vue:
|
|||||||
third-parties: "Third-parties"
|
third-parties: "Third-parties"
|
||||||
desktop/views/components/settings.2fa.vue:
|
desktop/views/components/settings.2fa.vue:
|
||||||
intro: "If you set up 2-step verification, you will not only need a password at sign-in, but also a pre-registered physical device (such as your smartphone), which will improve security."
|
intro: "If you set up 2-step verification, you will not only need a password at sign-in, but also a pre-registered physical device (such as your smartphone), which will improve security."
|
||||||
detail: "See details..."
|
detail: "Details…"
|
||||||
url: "https://www.google.com/landing/2step/"
|
url: "https://www.google.com/landing/2step/"
|
||||||
caution: "If you lose access to your device, you won't be able to connect to Misskey anymore!"
|
caution: "If you lose access to your registered device, you won't be able to connect to Misskey anymore!"
|
||||||
register: "Register a device"
|
register: "Register a device"
|
||||||
already-registered: "A device is already registered"
|
already-registered: "This device is already registered"
|
||||||
unregister: "Disable"
|
unregister: "Unregister"
|
||||||
unregistered: "Two-factor authentication has been disabled."
|
unregistered: "Two-factor authentication has been disabled."
|
||||||
enter-password: "Enter the password"
|
enter-password: "Enter the password"
|
||||||
authenticator: "First, you need to install Google Authenticator on your device:"
|
authenticator: "First, you need to install Google Authenticator on your device:"
|
||||||
howtoinstall: "How to install"
|
howtoinstall: "How to install"
|
||||||
scan: "And then, scan the QR code:"
|
scan: "And then, scan the QR code:"
|
||||||
done: "Please enter the token displaying on your device:"
|
done: "Please enter the token displayed on your device:"
|
||||||
submit: "Submit"
|
submit: "Submit"
|
||||||
success: "Settings saved!"
|
success: "Settings saved!"
|
||||||
failed: "Failed to setup. Please ensure that the token is correct."
|
failed: "Failed to setup. Please ensure that the token is correct."
|
||||||
@ -693,15 +699,15 @@ desktop/views/components/settings.2fa.vue:
|
|||||||
desktop/views/components/settings.api.vue:
|
desktop/views/components/settings.api.vue:
|
||||||
intro: "To access the API, set this token as the key 'i' of request parameters."
|
intro: "To access the API, set this token as the key 'i' of request parameters."
|
||||||
caution: "Do not enter this token to any apps nor tell this token to others otherwise your account may get compromised."
|
caution: "Do not enter this token to any apps nor tell this token to others otherwise your account may get compromised."
|
||||||
regeneration-of-token: "In case this token (may) leaks out, you want to regenerate it so that you’ll be safe."
|
regeneration-of-token: "If your token gets leaked, you can regenerate it."
|
||||||
regenerate-token: "Regenerate the token"
|
regenerate-token: "Regenerate the token"
|
||||||
token: "Token:"
|
token: "Token:"
|
||||||
enter-password: "Please enter the password"
|
enter-password: "Please enter the password"
|
||||||
desktop/views/components/settings.apps.vue:
|
desktop/views/components/settings.apps.vue:
|
||||||
no-apps: "No linked applications"
|
no-apps: "No linked applications"
|
||||||
desktop/views/components/settings.drive.vue:
|
desktop/views/components/settings.drive.vue:
|
||||||
max: "Max "
|
max: "Max"
|
||||||
in-use: " in use."
|
in-use: "In use"
|
||||||
desktop/views/components/settings.mute.vue:
|
desktop/views/components/settings.mute.vue:
|
||||||
no-users: "No muted users"
|
no-users: "No muted users"
|
||||||
desktop/views/components/settings.password.vue:
|
desktop/views/components/settings.password.vue:
|
||||||
@ -724,7 +730,7 @@ desktop/views/components/settings.profile.vue:
|
|||||||
other: "Other"
|
other: "Other"
|
||||||
is-bot: "This account is a Bot"
|
is-bot: "This account is a Bot"
|
||||||
is-cat: "This account is a Cat"
|
is-cat: "This account is a Cat"
|
||||||
profile-updated: "Profile has successfully updated"
|
profile-updated: "Your profile has been updated"
|
||||||
desktop/views/components/sub-note-content.vue:
|
desktop/views/components/sub-note-content.vue:
|
||||||
private: "This post is private"
|
private: "This post is private"
|
||||||
deleted: "This post has been deleted"
|
deleted: "This post has been deleted"
|
||||||
@ -740,7 +746,7 @@ desktop/views/components/timeline.vue:
|
|||||||
list: "Lists"
|
list: "Lists"
|
||||||
desktop/views/components/ui.header.vue:
|
desktop/views/components/ui.header.vue:
|
||||||
welcome-back: "Welcome back,"
|
welcome-back: "Welcome back,"
|
||||||
adjective: "Sir "
|
adjective: "-san"
|
||||||
desktop/views/components/ui.header.account.vue:
|
desktop/views/components/ui.header.account.vue:
|
||||||
profile: "Your profile"
|
profile: "Your profile"
|
||||||
drive: "Media storage"
|
drive: "Media storage"
|
||||||
@ -768,7 +774,7 @@ desktop/views/components/received-follow-requests-window.vue:
|
|||||||
reject: "Reject"
|
reject: "Reject"
|
||||||
desktop/views/components/user-lists-window.vue:
|
desktop/views/components/user-lists-window.vue:
|
||||||
title: "User lists"
|
title: "User lists"
|
||||||
create-list: "Create new list"
|
create-list: "Create list"
|
||||||
list-name: "List name"
|
list-name: "List name"
|
||||||
desktop/views/components/user-preview.vue:
|
desktop/views/components/user-preview.vue:
|
||||||
notes: "Posts"
|
notes: "Posts"
|
||||||
@ -795,6 +801,7 @@ desktop/views/pages/admin/admin.dashboard.vue:
|
|||||||
original-users: "Users on this instance"
|
original-users: "Users on this instance"
|
||||||
all-notes: "All Posts"
|
all-notes: "All Posts"
|
||||||
original-notes: "Posts on this instance"
|
original-notes: "Posts on this instance"
|
||||||
|
invite: "Invite"
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
desktop/views/pages/admin/admin.suspend-user.vue:
|
||||||
suspend-user: "Suspend a user"
|
suspend-user: "Suspend a user"
|
||||||
suspend: "Suspend"
|
suspend: "Suspend"
|
||||||
@ -803,6 +810,26 @@ desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|||||||
unsuspend-user: "Unsuspend users"
|
unsuspend-user: "Unsuspend users"
|
||||||
unsuspend: "Unsuspend"
|
unsuspend: "Unsuspend"
|
||||||
unsuspended: "The user has successfully unsuspended."
|
unsuspended: "The user has successfully unsuspended."
|
||||||
|
desktop/views/pages/admin/admin.verify-user.vue:
|
||||||
|
verify-user: "User account verification settings"
|
||||||
|
verify: "Verify account"
|
||||||
|
verified: "The account is now being verified"
|
||||||
|
desktop/views/pages/admin/admin.unverify-user.vue:
|
||||||
|
unverify-user: "User account unverification settings"
|
||||||
|
unverify: "Unverify account"
|
||||||
|
unverified: "The account is now being unverified"
|
||||||
|
desktop/views/pages/admin/admin.notes-chart.vue:
|
||||||
|
title: "Posts"
|
||||||
|
local: "Local"
|
||||||
|
remote: "Remote"
|
||||||
|
desktop/views/pages/admin/admin.users-chart.vue:
|
||||||
|
title: "Users"
|
||||||
|
local: "Local"
|
||||||
|
remote: "Remote"
|
||||||
|
desktop/views/pages/admin/admin.drive-chart.vue:
|
||||||
|
title: "Drive"
|
||||||
|
local: "Local"
|
||||||
|
remote: "Remote"
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "Only media posts"
|
is-media-only: "Only media posts"
|
||||||
is-media-view: "Media view"
|
is-media-view: "Media view"
|
||||||
@ -835,7 +862,7 @@ desktop/views/pages/selectdrive.vue:
|
|||||||
cancel: "Cancel"
|
cancel: "Cancel"
|
||||||
upload: "Upload files from your device"
|
upload: "Upload files from your device"
|
||||||
desktop/views/pages/search.vue:
|
desktop/views/pages/search.vue:
|
||||||
not-available: "The search feature is not available."
|
not-available: "Search feature is turned off in the settings for this instance."
|
||||||
not-found: "No posts were found for '{}'"
|
not-found: "No posts were found for '{}'"
|
||||||
desktop/views/pages/share.vue:
|
desktop/views/pages/share.vue:
|
||||||
share-with: "Share with {}."
|
share-with: "Share with {}."
|
||||||
@ -855,7 +882,7 @@ desktop/views/pages/user/user.friends.vue:
|
|||||||
no-users: "No frequent mentions"
|
no-users: "No frequent mentions"
|
||||||
desktop/views/pages/user/user.vue:
|
desktop/views/pages/user/user.vue:
|
||||||
is-suspended: "This account has been suspended."
|
is-suspended: "This account has been suspended."
|
||||||
is-remote: "The user is a remote user. Information about them that you see here may not complete."
|
is-remote: "The user is a remote user. The profile that you see here may not complete."
|
||||||
view-remote: "See their complete profile"
|
view-remote: "See their complete profile"
|
||||||
desktop/views/pages/user/user.home.vue:
|
desktop/views/pages/user/user.home.vue:
|
||||||
last-used-at: "Last active:"
|
last-used-at: "Last active:"
|
||||||
@ -928,12 +955,15 @@ mobile/views/components/drive-file-chooser.vue:
|
|||||||
select-file: "Choose files"
|
select-file: "Choose files"
|
||||||
mobile/views/components/drive-folder-chooser.vue:
|
mobile/views/components/drive-folder-chooser.vue:
|
||||||
select-folder: "Choose a folder"
|
select-folder: "Choose a folder"
|
||||||
|
mobile/views/components/drive.file.vue:
|
||||||
|
nsfw: "NSFW"
|
||||||
mobile/views/components/drive.file-detail.vue:
|
mobile/views/components/drive.file-detail.vue:
|
||||||
download: "Download"
|
download: "Download"
|
||||||
rename: "Rename"
|
rename: "Rename"
|
||||||
move: "Move"
|
move: "Move"
|
||||||
hash: "Hash (md5)"
|
hash: "Hash (md5)"
|
||||||
exif: "EXIF"
|
exif: "EXIF"
|
||||||
|
nsfw: "NSFW"
|
||||||
mobile/views/components/media-image.vue:
|
mobile/views/components/media-image.vue:
|
||||||
sensitive: "NSFW"
|
sensitive: "NSFW"
|
||||||
click-to-show: "Click to show"
|
click-to-show: "Click to show"
|
||||||
@ -1012,7 +1042,7 @@ mobile/views/components/ui.nav.vue:
|
|||||||
user-lists: "Lists"
|
user-lists: "Lists"
|
||||||
widgets: "Widgets"
|
widgets: "Widgets"
|
||||||
game: "Games"
|
game: "Games"
|
||||||
darkmode: "Dark mode"
|
darkmode: "Dark theme"
|
||||||
settings: "Settings"
|
settings: "Settings"
|
||||||
about: "About Misskey"
|
about: "About Misskey"
|
||||||
mobile/views/components/user-timeline.vue:
|
mobile/views/components/user-timeline.vue:
|
||||||
@ -1106,7 +1136,8 @@ mobile/views/pages/settings.vue:
|
|||||||
timeline: "Timeline"
|
timeline: "Timeline"
|
||||||
show-reply-target: "Show reply target"
|
show-reply-target: "Show reply target"
|
||||||
show-my-renotes: "Show my reposts"
|
show-my-renotes: "Show my reposts"
|
||||||
show-renoted-my-notes: "Show my reposted posts"
|
show-renoted-my-notes: "Show renoted my posts"
|
||||||
|
show-local-renotes: "Show renoted local posts"
|
||||||
post-style: "Post design"
|
post-style: "Post design"
|
||||||
post-style-standard: "Standard"
|
post-style-standard: "Standard"
|
||||||
post-style-smart: "Smart"
|
post-style-smart: "Smart"
|
||||||
@ -1139,8 +1170,8 @@ mobile/views/pages/user.vue:
|
|||||||
timeline: "Timeline"
|
timeline: "Timeline"
|
||||||
media: "Media"
|
media: "Media"
|
||||||
is-suspended: "This account has been suspended."
|
is-suspended: "This account has been suspended."
|
||||||
is-remote: "This user is a remote user, so the information you see here is not complete."
|
is-remote: "The user is a remote user. The profile that you see here may not complete."
|
||||||
view-remote: "See their complete profile"
|
view-remote: "See his/her complete profile"
|
||||||
mobile/views/pages/user/home.vue:
|
mobile/views/pages/user/home.vue:
|
||||||
recent-notes: "Recent notes"
|
recent-notes: "Recent notes"
|
||||||
images: "Images"
|
images: "Images"
|
||||||
@ -1163,8 +1194,8 @@ mobile/views/pages/user/home.photos.vue:
|
|||||||
loading: "Loading"
|
loading: "Loading"
|
||||||
no-photos: "No photos"
|
no-photos: "No photos"
|
||||||
docs:
|
docs:
|
||||||
edit-this-page-on-github: "Did you find an error or do you want to contribute to the documentation? "
|
edit-this-page-on-github: "Found a mistake or want to contribute for the documentation?"
|
||||||
edit-this-page-on-github-link: "Edit this page on Github!"
|
edit-this-page-on-github-link: "Edit this page at GitHub!"
|
||||||
api:
|
api:
|
||||||
entities:
|
entities:
|
||||||
properties: "Properties"
|
properties: "Properties"
|
||||||
@ -1175,11 +1206,11 @@ docs:
|
|||||||
require-credential: "This endpoint requires the authentication information."
|
require-credential: "This endpoint requires the authentication information."
|
||||||
require-permission: "This endpoint requires {permission} permission."
|
require-permission: "This endpoint requires {permission} permission."
|
||||||
has-limit: "There is a rate limit."
|
has-limit: "There is a rate limit."
|
||||||
duration-limit: "You can't request when a frequency of a request in during {duration} milliseconds exceeds {max} times."
|
duration-limit: "If you have sent your requests more than {max} times in {duration} milliseconds, you will be unable to send more requests."
|
||||||
min-interval-limit: "You can't request before {interval} milliseconds have passed since the previous request."
|
min-interval-limit: "If {interval} milliseconds haven't passed since the last request, you can't send a request."
|
||||||
show-src: "You can view the source code for this endpoint."
|
show-src: "You can view the source code for this endpoint."
|
||||||
show-src-link: "See the code on GitHub"
|
show-src-link: "See the code on GitHub"
|
||||||
generated: "This doc is generated by an API definition."
|
generated: "This document is generated by the API definition."
|
||||||
props:
|
props:
|
||||||
name: "Name"
|
name: "Name"
|
||||||
type: "Type"
|
type: "Type"
|
||||||
|
@ -84,7 +84,7 @@ common:
|
|||||||
my-token-regenerated: "Tu token se ha regenerado vas a ser desconectado."
|
my-token-regenerated: "Tu token se ha regenerado vas a ser desconectado."
|
||||||
i-like-sushi: "Prefiero sushi a pudín"
|
i-like-sushi: "Prefiero sushi a pudín"
|
||||||
show-reversi-board-labels: "Mostrar etiquetas de filas y columnas en Reversi"
|
show-reversi-board-labels: "Mostrar etiquetas de filas y columnas en Reversi"
|
||||||
verified-user: "Usuario verificado"
|
verified-user: "公式アカウント"
|
||||||
disable-animated-mfm: "Desactivar texto animado en una publicación"
|
disable-animated-mfm: "Desactivar texto animado en una publicación"
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "Empatado"
|
drawn: "Empatado"
|
||||||
@ -287,7 +287,10 @@ common/views/components/signin.vue:
|
|||||||
signin: "Entra"
|
signin: "Entra"
|
||||||
or: "O"
|
or: "O"
|
||||||
signin-with-twitter: "Ingresar con Twitter"
|
signin-with-twitter: "Ingresar con Twitter"
|
||||||
|
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||||
common/views/components/signup.vue:
|
common/views/components/signup.vue:
|
||||||
|
invitation-code: "招待コード"
|
||||||
|
invitation-info: "招待コードをお持ちでない方は、<a href=\"{}\">管理者</a>までご連絡ください。"
|
||||||
username: "Usuario"
|
username: "Usuario"
|
||||||
checking: "Comprobando..."
|
checking: "Comprobando..."
|
||||||
available: "Disponible"
|
available: "Disponible"
|
||||||
@ -440,6 +443,7 @@ desktop/views/components/drive-window.vue:
|
|||||||
desktop/views/components/drive.file.vue:
|
desktop/views/components/drive.file.vue:
|
||||||
avatar: "Avatar"
|
avatar: "Avatar"
|
||||||
banner: "Banner"
|
banner: "Banner"
|
||||||
|
nsfw: "閲覧注意"
|
||||||
contextmenu:
|
contextmenu:
|
||||||
rename: "Renombrar"
|
rename: "Renombrar"
|
||||||
mark-as-sensitive: "Marcar como 'sensible'"
|
mark-as-sensitive: "Marcar como 'sensible'"
|
||||||
@ -625,9 +629,11 @@ desktop/views/components/settings.vue:
|
|||||||
circle-icons: "Usar iconos circulares"
|
circle-icons: "Usar iconos circulares"
|
||||||
gradient-window-header: "Usar degradados en las cabeceras de las páginas"
|
gradient-window-header: "Usar degradados en las cabeceras de las páginas"
|
||||||
post-form-on-timeline: "Mostrar el formulario de las entradas encima de la línea de tiempo"
|
post-form-on-timeline: "Mostrar el formulario de las entradas encima de la línea de tiempo"
|
||||||
|
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||||
show-reply-target: "リプライ先を表示する"
|
show-reply-target: "リプライ先を表示する"
|
||||||
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
|
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
|
||||||
show-renoted-my-notes: "Renoteされた自分の投稿をタイムラインに表示する"
|
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
|
||||||
|
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
|
||||||
show-maps: "マップの自動展開"
|
show-maps: "マップの自動展開"
|
||||||
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
|
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
|
||||||
sound: "サウンド"
|
sound: "サウンド"
|
||||||
@ -795,6 +801,7 @@ desktop/views/pages/admin/admin.dashboard.vue:
|
|||||||
original-users: "このインスタンスのユーザー"
|
original-users: "このインスタンスのユーザー"
|
||||||
all-notes: "全てのノート"
|
all-notes: "全てのノート"
|
||||||
original-notes: "このインスタンスのノート"
|
original-notes: "このインスタンスのノート"
|
||||||
|
invite: "招待"
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
desktop/views/pages/admin/admin.suspend-user.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
suspend-user: "ユーザーの凍結"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
@ -803,6 +810,26 @@ desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|||||||
unsuspend-user: "ユーザーの凍結の解除"
|
unsuspend-user: "ユーザーの凍結の解除"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
|
desktop/views/pages/admin/admin.verify-user.vue:
|
||||||
|
verify-user: "ユーザーの公式アカウント設定"
|
||||||
|
verify: "公式アカウントにする"
|
||||||
|
verified: "公式アカウントにしました"
|
||||||
|
desktop/views/pages/admin/admin.unverify-user.vue:
|
||||||
|
unverify-user: "ユーザーの公式アカウント解除"
|
||||||
|
unverify: "公式アカウントを解除する"
|
||||||
|
unverified: "公式アカウントを解除しました"
|
||||||
|
desktop/views/pages/admin/admin.notes-chart.vue:
|
||||||
|
title: "投稿"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
desktop/views/pages/admin/admin.users-chart.vue:
|
||||||
|
title: "ユーザー"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
desktop/views/pages/admin/admin.drive-chart.vue:
|
||||||
|
title: "ドライブ"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "メディア投稿のみ"
|
is-media-only: "メディア投稿のみ"
|
||||||
is-media-view: "メディアビュー"
|
is-media-view: "メディアビュー"
|
||||||
@ -835,7 +862,7 @@ desktop/views/pages/selectdrive.vue:
|
|||||||
cancel: "キャンセル"
|
cancel: "キャンセル"
|
||||||
upload: "PCからドライブにファイルをアップロード"
|
upload: "PCからドライブにファイルをアップロード"
|
||||||
desktop/views/pages/search.vue:
|
desktop/views/pages/search.vue:
|
||||||
not-available: "検索機能を利用することができません。"
|
not-available: "検索機能はインスタンスの設定で無効になっています。"
|
||||||
not-found: "「{}」に関する投稿は見つかりませんでした。"
|
not-found: "「{}」に関する投稿は見つかりませんでした。"
|
||||||
desktop/views/pages/share.vue:
|
desktop/views/pages/share.vue:
|
||||||
share-with: "{}で共有"
|
share-with: "{}で共有"
|
||||||
@ -928,12 +955,15 @@ mobile/views/components/drive-file-chooser.vue:
|
|||||||
select-file: "ファイルを選択"
|
select-file: "ファイルを選択"
|
||||||
mobile/views/components/drive-folder-chooser.vue:
|
mobile/views/components/drive-folder-chooser.vue:
|
||||||
select-folder: "フォルダーを選択"
|
select-folder: "フォルダーを選択"
|
||||||
|
mobile/views/components/drive.file.vue:
|
||||||
|
nsfw: "閲覧注意"
|
||||||
mobile/views/components/drive.file-detail.vue:
|
mobile/views/components/drive.file-detail.vue:
|
||||||
download: "ダウンロード"
|
download: "ダウンロード"
|
||||||
rename: "名前を変更"
|
rename: "名前を変更"
|
||||||
move: "移動"
|
move: "移動"
|
||||||
hash: "ハッシュ (md5)"
|
hash: "ハッシュ (md5)"
|
||||||
exif: "EXIF"
|
exif: "EXIF"
|
||||||
|
nsfw: "閲覧注意"
|
||||||
mobile/views/components/media-image.vue:
|
mobile/views/components/media-image.vue:
|
||||||
sensitive: "閲覧注意"
|
sensitive: "閲覧注意"
|
||||||
click-to-show: "クリックして表示"
|
click-to-show: "クリックして表示"
|
||||||
@ -1106,7 +1136,8 @@ mobile/views/pages/settings.vue:
|
|||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
show-reply-target: "リプライ先を表示する"
|
show-reply-target: "リプライ先を表示する"
|
||||||
show-my-renotes: "自分の行ったRenoteを表示する"
|
show-my-renotes: "自分の行ったRenoteを表示する"
|
||||||
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
|
show-renoted-my-notes: "自分の投稿のRenoteを表示する"
|
||||||
|
show-local-renotes: "ローカルの投稿のRenoteを表示する"
|
||||||
post-style: "投稿の表示スタイル"
|
post-style: "投稿の表示スタイル"
|
||||||
post-style-standard: "標準"
|
post-style-standard: "標準"
|
||||||
post-style-smart: "スマート"
|
post-style-smart: "スマート"
|
||||||
|
201
locales/fr.yml
201
locales/fr.yml
@ -4,10 +4,10 @@ meta:
|
|||||||
divider: ""
|
divider: ""
|
||||||
common:
|
common:
|
||||||
misskey: "Une ⭐ du fédiverse"
|
misskey: "Une ⭐ du fédiverse"
|
||||||
about-title: "Une ⭐ du fédiverse."
|
about-title: "Une ⭐ du fédivers."
|
||||||
about: "Merci d'avoir découvert Misskey. Misskey est une <b>plateforme de micro-blogging distribuée</b> née sur Terre. Parce qu'il fait partie du Fédiverse (un univers composé de diverses plateformes de réseaux sociaux organisées), il est mutuellement connecté avec d'autres plateformes de réseaux sociaux. Désirez-vous prendre une pause, pendant un instant, loin de l'agitation de la ville et plonger dans un nouvel Internet ?"
|
about: "Merci d'avoir découvert Misskey. Misskey est une <b>plateforme de microblogage distribuée</b> née sur Terre. Parce qu'il fait partie du Fédivers (un univers composé de diverses plateformes de réseaux sociaux organisées), il est mutuellement connecté avec d'autres plateformes de réseaux sociaux. Désirez-vous prendre une pause, pendant un instant, loin de l'agitation de la ville et plonger dans un nouvel Internet ?"
|
||||||
adblock:
|
adblock:
|
||||||
detected: "Veuillez désactiver le bloqueur de publicités"
|
detected: "Veuillez désactiver votre bloqueur de publicités"
|
||||||
warning: "<strong>Misskey n'utilise pas de publicités</strong>, mais quelques options peuvent être non disponibles ou fonctionneraient mal si un bloqueur de publicités est activé."
|
warning: "<strong>Misskey n'utilise pas de publicités</strong>, mais quelques options peuvent être non disponibles ou fonctionneraient mal si un bloqueur de publicités est activé."
|
||||||
application-authorization: "Permissions de l'application"
|
application-authorization: "Permissions de l'application"
|
||||||
close: "Fermer"
|
close: "Fermer"
|
||||||
@ -17,7 +17,7 @@ common:
|
|||||||
title: "Conseils de personnalisation"
|
title: "Conseils de personnalisation"
|
||||||
paragraph1: "La personnalisation à la maison vous permet d'ajouter / supprimer, glisser et déposer et réorganiser les widgets."
|
paragraph1: "La personnalisation à la maison vous permet d'ajouter / supprimer, glisser et déposer et réorganiser les widgets."
|
||||||
paragraph2: "Vous pouvez changer l'affichage en <strong>cliquant droit</strong> sur certains widgets."
|
paragraph2: "Vous pouvez changer l'affichage en <strong>cliquant droit</strong> sur certains widgets."
|
||||||
paragraph3: "Pour supprimer un widget, <strong>glissez et déposez le widget sur la zone étiquetée \"Corbeille\"</strong> dans l'en-tête."
|
paragraph3: "Pour supprimer un widget, <strong>glissez et déposez le widget sur la zone étiquetée « Corbeille »</strong> dans l'en-tête."
|
||||||
paragraph4: "Pour terminer la personnalisation, cliquez sur \"Terminer\" dans le coin supérieur droit."
|
paragraph4: "Pour terminer la personnalisation, cliquez sur \"Terminer\" dans le coin supérieur droit."
|
||||||
gotit: "Compris!"
|
gotit: "Compris!"
|
||||||
notification:
|
notification:
|
||||||
@ -69,7 +69,7 @@ common:
|
|||||||
rip: "RIP"
|
rip: "RIP"
|
||||||
pudding: "Pudding"
|
pudding: "Pudding"
|
||||||
note-placeholders:
|
note-placeholders:
|
||||||
a: "Que faîtes vous maintenant ?"
|
a: "Que faites vous maintenant ?"
|
||||||
b: "Quoi de neuf ?"
|
b: "Quoi de neuf ?"
|
||||||
c: "Qu'avez-vous en tête ?"
|
c: "Qu'avez-vous en tête ?"
|
||||||
d: "Voulez-vous exprimer quelque chose ?"
|
d: "Voulez-vous exprimer quelque chose ?"
|
||||||
@ -82,9 +82,9 @@ common:
|
|||||||
update-available-title: "Mise à jour disponible"
|
update-available-title: "Mise à jour disponible"
|
||||||
update-available: "Une nouvelle version de Misskey est disponible ({newer}, version actuelle: {current}). Veuillez recharger la page pour appliquer la mise à jour."
|
update-available: "Une nouvelle version de Misskey est disponible ({newer}, version actuelle: {current}). Veuillez recharger la page pour appliquer la mise à jour."
|
||||||
my-token-regenerated: "Votre token vient d'être généré, vous allez maintenant être déconnecté."
|
my-token-regenerated: "Votre token vient d'être généré, vous allez maintenant être déconnecté."
|
||||||
i-like-sushi: "Je préfère les sushis (au pudding)"
|
i-like-sushi: "Je préfère les sushis plutôt que le pudding"
|
||||||
show-reversi-board-labels: "Afficher les étiquettes des lignes et colonnes dans Reversi"
|
show-reversi-board-labels: "Afficher les étiquettes des lignes et colonnes dans Reversi"
|
||||||
verified-user: "Utilisateur·trice vérifié·e"
|
verified-user: "Compte vérifié"
|
||||||
disable-animated-mfm: "Désactiver les textes animés dans les publications"
|
disable-animated-mfm: "Désactiver les textes animés dans les publications"
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "Partie nulle"
|
drawn: "Partie nulle"
|
||||||
@ -101,18 +101,18 @@ common:
|
|||||||
analog-clock: "Horloge analogique"
|
analog-clock: "Horloge analogique"
|
||||||
profile: "Profil"
|
profile: "Profil"
|
||||||
calendar: "Calendrier"
|
calendar: "Calendrier"
|
||||||
timemachine: "Calendrier (Machine de temps)"
|
timemachine: "Calendrier (Machine temporelle)"
|
||||||
activity: "Activité"
|
activity: "Activité"
|
||||||
rss: "Lecteur de flux RSS"
|
rss: "Lecteur de flux RSS"
|
||||||
memo: "Pense-bête"
|
memo: "Pense-bête"
|
||||||
trends: "Tendances"
|
trends: "Tendances"
|
||||||
photo-stream: "Flux de photos"
|
photo-stream: "Flux de photos"
|
||||||
posts-monitor: "Graph des publications"
|
posts-monitor: "Graphe des publications"
|
||||||
slideshow: "Diaporama"
|
slideshow: "Diaporama"
|
||||||
version: "Version"
|
version: "Version"
|
||||||
broadcast: "Diffusion"
|
broadcast: "Diffusion"
|
||||||
notifications: "Notifications"
|
notifications: "Notifications"
|
||||||
users: "Utilisateurs"
|
users: "Utilisateur·rice·s"
|
||||||
polls: "Sondages"
|
polls: "Sondages"
|
||||||
post-form: "Formulaire de publication"
|
post-form: "Formulaire de publication"
|
||||||
messaging: "Messagerie"
|
messaging: "Messagerie"
|
||||||
@ -174,16 +174,16 @@ common/views/components/games/reversi/reversi.game.vue:
|
|||||||
can-put-everywhere: "どこでも置けるモード"
|
can-put-everywhere: "どこでも置けるモード"
|
||||||
common/views/components/games/reversi/reversi.index.vue:
|
common/views/components/games/reversi/reversi.index.vue:
|
||||||
title: "Misskey Reversi"
|
title: "Misskey Reversi"
|
||||||
sub-title: "Jouer à Reversi avec vos amis·es !"
|
sub-title: "Jouer à Reversi avec vos ami·e·s !"
|
||||||
invite: "Inviter"
|
invite: "Inviter"
|
||||||
rule: "Comment Jouer ?"
|
rule: "Comment jouer ?"
|
||||||
rule-desc: "リバーシは、相手と交互に石をボードに置いて、相手の石を挟んで自分の色に変えてゆき、最終的に残った石が多い方が勝ちというボードゲームです。"
|
rule-desc: "リバーシは、相手と交互に石をボードに置いて、相手の石を挟んで自分の色に変えてゆき、最終的に残った石が多い方が勝ちというボードゲームです。"
|
||||||
mode-invite: "Inviter"
|
mode-invite: "Inviter"
|
||||||
mode-invite-desc: "Inviter un joueur."
|
mode-invite-desc: "Inviter un·e joueur·se."
|
||||||
invitations: "Vous avez reçu une invitation !"
|
invitations: "Vous avez reçu une invitation !"
|
||||||
my-games: "Mes jeux"
|
my-games: "Mes jeux"
|
||||||
all-games: "Tous les jeux"
|
all-games: "Tous les jeux"
|
||||||
enter-username: "Saisir un nom d'utilisateur"
|
enter-username: "Saisir un nom d'utilisateur·rice"
|
||||||
game-state:
|
game-state:
|
||||||
ended: "Terminée"
|
ended: "Terminée"
|
||||||
playing: "En cours"
|
playing: "En cours"
|
||||||
@ -204,7 +204,7 @@ common/views/components/games/reversi/reversi.room.vue:
|
|||||||
waiting-for-both: "En attente que vous soyez prêt"
|
waiting-for-both: "En attente que vous soyez prêt"
|
||||||
cancel: "Annuler"
|
cancel: "Annuler"
|
||||||
ready: "Prêt"
|
ready: "Prêt"
|
||||||
cancel-ready: "Annuler \"Je suis prêt\""
|
cancel-ready: "Annuler « Prêt »"
|
||||||
common/views/components/connect-failed.vue:
|
common/views/components/connect-failed.vue:
|
||||||
title: "Échec de connexion au serveur"
|
title: "Échec de connexion au serveur"
|
||||||
description: "Il y a soit un problème avec votre connexion internet, soit le serveur est hors-ligne ou en maintenance. Veuillez {ressayer} plus tard."
|
description: "Il y a soit un problème avec votre connexion internet, soit le serveur est hors-ligne ou en maintenance. Veuillez {ressayer} plus tard."
|
||||||
@ -230,20 +230,20 @@ common/views/components/connect-failed.troubleshooter.vue:
|
|||||||
flush: "Vider le cache"
|
flush: "Vider le cache"
|
||||||
set-version: "Choisissez une version"
|
set-version: "Choisissez une version"
|
||||||
common/views/components/messaging.vue:
|
common/views/components/messaging.vue:
|
||||||
search-user: "Trouver un utilisateur"
|
search-user: "Trouver un·e utilisateur·rice"
|
||||||
you: "Vous"
|
you: "Vous"
|
||||||
no-history: "Pas d'historique"
|
no-history: "Pas d'historique"
|
||||||
common/views/components/messaging-room.vue:
|
common/views/components/messaging-room.vue:
|
||||||
empty: "Pas de conversations"
|
empty: "Pas de conversations"
|
||||||
more: "Voir Plus"
|
more: "Voir plus"
|
||||||
no-history: "Il n'y a pas plus d'historique"
|
no-history: "Il n'y a pas plus d'historique"
|
||||||
resize-form: "Faites glisser pour redimensionner"
|
resize-form: "Faites glisser pour redimensionner"
|
||||||
new-message: "Nouveau message"
|
new-message: "Nouveau message"
|
||||||
only-one-file-attached: "Un seul fichier uniquement peut être joint au message"
|
only-one-file-attached: "Un seul fichier peut être joint au message"
|
||||||
common/views/components/messaging-room.form.vue:
|
common/views/components/messaging-room.form.vue:
|
||||||
input-message-here: "Tapez ici votre message"
|
input-message-here: "Tapez ici votre message"
|
||||||
send: "Envoyer"
|
send: "Envoyer"
|
||||||
attach-from-local: "Joindre un fichier depuis votre PC"
|
attach-from-local: "Joindre un fichier depuis votre ordinateur"
|
||||||
attach-from-drive: "Joindre un fichier depuis votre Drive"
|
attach-from-drive: "Joindre un fichier depuis votre Drive"
|
||||||
only-one-file-attached: "Un seul fichier uniquement peut être joint au message"
|
only-one-file-attached: "Un seul fichier uniquement peut être joint au message"
|
||||||
common/views/components/messaging-room.message.vue:
|
common/views/components/messaging-room.message.vue:
|
||||||
@ -251,23 +251,23 @@ common/views/components/messaging-room.message.vue:
|
|||||||
deleted: "Ce message a été supprimé"
|
deleted: "Ce message a été supprimé"
|
||||||
common/views/components/nav.vue:
|
common/views/components/nav.vue:
|
||||||
about: "À propos"
|
about: "À propos"
|
||||||
stats: "Stats"
|
stats: "Statistiques"
|
||||||
status: "Status"
|
status: "Statut"
|
||||||
wiki: "Wiki"
|
wiki: "Wiki"
|
||||||
donors: "Donateurs"
|
donors: "Donateur·rice·s"
|
||||||
repository: "Repo"
|
repository: "Dépôt"
|
||||||
develop: "Développeurs"
|
develop: "Développeur·se·s"
|
||||||
feedback: "Remarques"
|
feedback: "Remarques"
|
||||||
common/views/components/note-menu.vue:
|
common/views/components/note-menu.vue:
|
||||||
favorite: "Favorite this note"
|
favorite: "Mettre cette note en favoris"
|
||||||
pin: "Épingler sur votre profile"
|
pin: "Épingler sur votre profil"
|
||||||
delete: "Supprimer"
|
delete: "Supprimer"
|
||||||
delete-confirm: "Supprimer cette publication ?"
|
delete-confirm: "Supprimer cette publication ?"
|
||||||
remote: "Afficher les note originale"
|
remote: "Afficher la note originale"
|
||||||
common/views/components/poll.vue:
|
common/views/components/poll.vue:
|
||||||
vote-to: "Voter pour '{}'"
|
vote-to: "Voter pour '{}'"
|
||||||
vote-count: "{} votes"
|
vote-count: "{} votes"
|
||||||
total-users: "{} utilisateurs ont voté"
|
total-users: "{} utilisateur·rice·s ont voté·e·s"
|
||||||
vote: "Vote"
|
vote: "Vote"
|
||||||
show-result: "Montrer les résultats"
|
show-result: "Montrer les résultats"
|
||||||
voted: "Voté"
|
voted: "Voté"
|
||||||
@ -280,31 +280,34 @@ common/views/components/poll-editor.vue:
|
|||||||
common/views/components/reaction-picker.vue:
|
common/views/components/reaction-picker.vue:
|
||||||
choose-reaction: "Choisissez votre réaction"
|
choose-reaction: "Choisissez votre réaction"
|
||||||
common/views/components/signin.vue:
|
common/views/components/signin.vue:
|
||||||
username: "Nom d'utilisateur"
|
username: "Nom d'utilisateur·rice"
|
||||||
password: "Mot de passe"
|
password: "Mot de passe"
|
||||||
token: "Token"
|
token: "Token"
|
||||||
signing-in: "Connexion...."
|
signing-in: "Connexion…"
|
||||||
signin: "Se connecter"
|
signin: "Se connecter"
|
||||||
or: "Ou"
|
or: "Ou"
|
||||||
signin-with-twitter: "Se connecter via Twitter"
|
signin-with-twitter: "Se connecter via Twitter"
|
||||||
|
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||||
common/views/components/signup.vue:
|
common/views/components/signup.vue:
|
||||||
username: "Nom d'utilisateur"
|
invitation-code: "Code d’invitation"
|
||||||
checking: "Vérification"
|
invitation-info: "Si vous n’avez pas de code d’invitation, contactez un·e <a href=\"{}\">administrateur·rice</a>."
|
||||||
|
username: "Nom d'utilisateur·rice"
|
||||||
|
checking: "Vérification…"
|
||||||
available: "Disponible"
|
available: "Disponible"
|
||||||
unavailable: "Non disponible"
|
unavailable: "Non disponible"
|
||||||
error: "Erreur de réseau"
|
error: "Erreur du réseau"
|
||||||
invalid-format: "Utilisez seulement des lettres, nombres et/ou -."
|
invalid-format: "Vous pouvez utiliser des lettres, des nombres et _."
|
||||||
too-short: "Veuillez saisir au moins un caractère !"
|
too-short: "Veuillez saisir au moins un caractère !"
|
||||||
too-long: "Veuillez entrer au maximum 20 caractères."
|
too-long: "Veuillez entrer au maximum 20 caractères."
|
||||||
password: "Mot de Passe"
|
password: "Mot de passe"
|
||||||
password-placeholder: "Nous recommendons au moins 8 caractères."
|
password-placeholder: "Nous recommandons au moins 8 caractères."
|
||||||
weak-password: "Faible"
|
weak-password: "Faible"
|
||||||
normal-password: "Moyen"
|
normal-password: "Moyen"
|
||||||
strong-password: "Fort"
|
strong-password: "Fort"
|
||||||
retype: "Retapez"
|
retype: "Retapez"
|
||||||
retype-placeholder: "Confirmez votre mot de passe"
|
retype-placeholder: "Confirmez votre mot de passe"
|
||||||
password-matched: "OK"
|
password-matched: "OK"
|
||||||
password-not-matched: "Les mots de passes ne correspondent pas."
|
password-not-matched: "Les mots de passe ne correspondent pas."
|
||||||
recaptcha: "Vérifier"
|
recaptcha: "Vérifier"
|
||||||
create: "Créer un compte"
|
create: "Créer un compte"
|
||||||
some-error: "La création du compte a échoué. Veuillez réessayer."
|
some-error: "La création du compte a échoué. Veuillez réessayer."
|
||||||
@ -316,14 +319,14 @@ common/views/components/stream-indicator.vue:
|
|||||||
reconnecting: "Reconnexion en cours"
|
reconnecting: "Reconnexion en cours"
|
||||||
connected: "Connecté"
|
connected: "Connecté"
|
||||||
common/views/components/twitter-setting.vue:
|
common/views/components/twitter-setting.vue:
|
||||||
description: "Si vous liez votre compte Twitter à votre compte Misskey, vous verrez ensuite votre compte Twitter s'afficher sur votre profile, vous aurez aussi la possibilité de vous connecter à Misskey en utilisant votre compte Twitter."
|
description: "Si vous liez votre compte Twitter à votre compte Misskey, vous verrez ensuite votre compte Twitter s'afficher sur votre profil, vous aurez aussi la possibilité de vous connecter à Misskey en utilisant votre compte Twitter."
|
||||||
connected-to: "Vous êtes connecté à ce compte Twitter"
|
connected-to: "Vous êtes connecté à ce compte Twitter"
|
||||||
detail: "Détails …"
|
detail: "Détails…"
|
||||||
reconnect: "Reconnecter"
|
reconnect: "Reconnexion"
|
||||||
connect: "Lier votre compte Twitter"
|
connect: "Lier votre compte Twitter"
|
||||||
disconnect: "Déconnecter"
|
disconnect: "Déconnexion"
|
||||||
common/views/components/uploader.vue:
|
common/views/components/uploader.vue:
|
||||||
waiting: "En attente"
|
waiting: "Veuillez patienter"
|
||||||
common/views/components/visibility-chooser.vue:
|
common/views/components/visibility-chooser.vue:
|
||||||
public: "Public"
|
public: "Public"
|
||||||
home: "Accueil"
|
home: "Accueil"
|
||||||
@ -331,42 +334,42 @@ common/views/components/visibility-chooser.vue:
|
|||||||
followers: "Abonné·e·s"
|
followers: "Abonné·e·s"
|
||||||
followers-desc: "Publier à vos abonné·e·s uniquement"
|
followers-desc: "Publier à vos abonné·e·s uniquement"
|
||||||
specified: "Direct"
|
specified: "Direct"
|
||||||
specified-desc: "Publier aux utilisateurs·trices mentionné·es"
|
specified-desc: "Publier aux utilisateur·rice·s mentionné·e·s"
|
||||||
private: "Privé"
|
private: "Privé"
|
||||||
common/views/widgets/broadcast.vue:
|
common/views/widgets/broadcast.vue:
|
||||||
fetching: "Récuperation"
|
fetching: "Récupération"
|
||||||
no-broadcasts: "Aucune annonce"
|
no-broadcasts: "Aucune annonce"
|
||||||
have-a-nice-day: "Passez une bonne journée !"
|
have-a-nice-day: "Passez une bonne journée !"
|
||||||
next: "Suivant"
|
next: "Suivant"
|
||||||
common/views/widgets/calendar.vue:
|
common/views/widgets/calendar.vue:
|
||||||
year: "{} année"
|
year: "Année {}"
|
||||||
month: "{} mois"
|
month: "Mois {}"
|
||||||
day: "{} jour"
|
day: "Jour {}"
|
||||||
today: "Aujourd'hui :"
|
today: "Aujourd'hui :"
|
||||||
this-month: "Ce mois-ci :"
|
this-month: "Ce mois-ci :"
|
||||||
this-year: "Cette année :"
|
this-year: "Cette année :"
|
||||||
common/views/widgets/donation.vue:
|
common/views/widgets/donation.vue:
|
||||||
title: "Dons"
|
title: "Faire un don"
|
||||||
text: "Les frais pour faire fonctionner Misskey sortent directement de notre poche. Nous ne recevons pas d'argent issu de la publicité, si vous pouvez nous faire des dons, on vous serait éternellement reconnaissants. Si vous êtes intéressé·es veuillez contacter {}. Merci pour votre contribution !"
|
text: "Les frais pour faire fonctionner Misskey sortent directement de notre poche. Nous ne recevons pas d'argent issu de la publicité, si vous pouvez nous faire des dons, on vous serait éternellement reconnaissants. Si vous êtes intéressé·es veuillez contacter {}. Merci pour votre contribution !"
|
||||||
common/views/widgets/photo-stream.vue:
|
common/views/widgets/photo-stream.vue:
|
||||||
title: "Flux de photo"
|
title: "Flux de photos"
|
||||||
no-photos: "Pas de photos"
|
no-photos: "Pas de photo"
|
||||||
common/views/widgets/posts-monitor.vue:
|
common/views/widgets/posts-monitor.vue:
|
||||||
title: "Graph des publications"
|
title: "Graphe des publications"
|
||||||
toggle: "Basculer entre les vues"
|
toggle: "Basculer entre les vues"
|
||||||
common/views/widgets/hashtags.vue:
|
common/views/widgets/hashtags.vue:
|
||||||
title: "Étiquettes"
|
title: "Étiquettes"
|
||||||
count: "{} utilisateurs mentionnés"
|
count: "{} utilisateur·rice·s mentionné·e·s"
|
||||||
empty: "Aucune tendance"
|
empty: "Aucune tendance"
|
||||||
common/views/widgets/server.vue:
|
common/views/widgets/server.vue:
|
||||||
title: "Info sur le serveur"
|
title: "Informations sur le serveur"
|
||||||
toggle: "Afficher les vues"
|
toggle: "Afficher les vues"
|
||||||
common/views/widgets/memo.vue:
|
common/views/widgets/memo.vue:
|
||||||
title: "Pense-bête"
|
title: "Pense-bête"
|
||||||
memo: "Écrivez ici !"
|
memo: "Écrivez ici !"
|
||||||
save: "Enregistrer"
|
save: "Enregistrer"
|
||||||
common/views/widgets/slideshow.vue:
|
common/views/widgets/slideshow.vue:
|
||||||
folder-customize-mode: "Veuillez quitter le mode personnalisé pour pouvour spécifier un dossier"
|
folder-customize-mode: "Pour pouvoir spécifier un dossier, veuillez quitter le mode de personnalisation"
|
||||||
folder: "Veuillez cliquer pour spécifier le dossier"
|
folder: "Veuillez cliquer pour spécifier le dossier"
|
||||||
no-image: "Il n'y a aucune image dans ce dossier"
|
no-image: "Il n'y a aucune image dans ce dossier"
|
||||||
common/views/widgets/tips.vue:
|
common/views/widgets/tips.vue:
|
||||||
@ -374,13 +377,13 @@ common/views/widgets/tips.vue:
|
|||||||
tips-line2: "<kbd>p</kbd>または<kbd>n</kbd>で投稿フォームを開きます"
|
tips-line2: "<kbd>p</kbd>または<kbd>n</kbd>で投稿フォームを開きます"
|
||||||
tips-line3: "Vous pouvez glisser et déposer des fichiers sur la fenêtre de la note"
|
tips-line3: "Vous pouvez glisser et déposer des fichiers sur la fenêtre de la note"
|
||||||
tips-line4: "Vous pouvez coller des images à partir du presse-papier sur la fenêtre de la note"
|
tips-line4: "Vous pouvez coller des images à partir du presse-papier sur la fenêtre de la note"
|
||||||
tips-line5: "Vous pouvez téléverser des fichiers sur le Drive en faisant un glisser/déplacer"
|
tips-line5: "Vous pouvez téléverser des fichiers sur le Drive en faisant un glisser-déposer"
|
||||||
tips-line6: "ドライブでファイルをドラッグしてフォルダ移動できます"
|
tips-line6: "ドライブでファイルをドラッグしてフォルダ移動できます"
|
||||||
tips-line7: "ドライブでフォルダをドラッグしてフォルダ移動できます"
|
tips-line7: "ドライブでフォルダをドラッグしてフォルダ移動できます"
|
||||||
tips-line8: "Vous pouvez personnaliser l'Accueil via les paramètres"
|
tips-line8: "Vous pouvez personnaliser l'Accueil via les paramètres"
|
||||||
tips-line9: "Misskey est sous licence AGPLv3"
|
tips-line9: "Misskey est sous licence AGPLv3"
|
||||||
tips-line10: "タイムマシンウィジェットを利用すると、簡単に過去のタイムラインに遡れます"
|
tips-line10: "タイムマシンウィジェットを利用すると、簡単に過去のタイムラインに遡れます"
|
||||||
tips-line11: "Vous pouvez épingler des notes sur votre page en appuyant sur \"…\""
|
tips-line11: "Vous pouvez épingler des notes sur votre page en cliquant sur « … »"
|
||||||
tips-line13: "Tous les fichiers attachés à cette publication sont sauvegardés dans le Drive"
|
tips-line13: "Tous les fichiers attachés à cette publication sont sauvegardés dans le Drive"
|
||||||
tips-line14: "ホームのカスタマイズ中、ウィジェットを右クリックしてデザインを変更できます"
|
tips-line14: "ホームのカスタマイズ中、ウィジェットを右クリックしてデザインを変更できます"
|
||||||
tips-line17: "Vous pouvez mettre un texte en surbrillance en le mettant entre ** **"
|
tips-line17: "Vous pouvez mettre un texte en surbrillance en le mettant entre ** **"
|
||||||
@ -391,18 +394,18 @@ common/views/widgets/tips.vue:
|
|||||||
tips-line24: "Misskey a vu le jour en 2014"
|
tips-line24: "Misskey a vu le jour en 2014"
|
||||||
tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
|
tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
|
||||||
common/views/pages/follow.vue:
|
common/views/pages/follow.vue:
|
||||||
signed-in-as: "Connecté·é en tant que {}"
|
signed-in-as: "Connecté·e en tant que {}"
|
||||||
following: "Suit"
|
following: "Suit"
|
||||||
follow: "Suivre"
|
follow: "Suivre"
|
||||||
request-pending: "Demande d'abonnement en attente"
|
request-pending: "Demande d'abonnement en attente"
|
||||||
follow-request: "Demande d'abonnement"
|
follow-request: "Demande d'abonnement"
|
||||||
desktop:
|
desktop:
|
||||||
banner-crop-title: "Découpez la partie qui apparaîtra comme une bannière"
|
banner-crop-title: "Découpez la partie qui apparaitra comme bannière"
|
||||||
banner: "Bannière"
|
banner: "Bannière"
|
||||||
uploading-banner: "Téléversement d'une nouvelle bannière"
|
uploading-banner: "Téléversement d'une nouvelle bannière"
|
||||||
banner-updated: "La bannière est mise à jour"
|
banner-updated: "La bannière est mise à jour"
|
||||||
choose-banner: "Choisir une bannière"
|
choose-banner: "Choisir une bannière"
|
||||||
avatar-crop-title: "Découpez la partie qui apparaîtra dans l'avatar"
|
avatar-crop-title: "Découpez la partie qui apparaitra comme avatar"
|
||||||
avatar: "Avatar"
|
avatar: "Avatar"
|
||||||
uploading-avatar: "Téléversement du nouvel avatar"
|
uploading-avatar: "Téléversement du nouvel avatar"
|
||||||
avatar-updated: "L'avatar est mis à jour"
|
avatar-updated: "L'avatar est mis à jour"
|
||||||
@ -413,16 +416,16 @@ desktop/views/components/activity.chart.vue:
|
|||||||
replies: "Rouge ... Réponses"
|
replies: "Rouge ... Réponses"
|
||||||
renotes: "Vert ... Partages"
|
renotes: "Vert ... Partages"
|
||||||
desktop/views/components/activity.vue:
|
desktop/views/components/activity.vue:
|
||||||
title: "Activitié"
|
title: "Activité"
|
||||||
toggle: "Afficher les vues"
|
toggle: "Afficher les vues"
|
||||||
desktop/views/components/calendar.vue:
|
desktop/views/components/calendar.vue:
|
||||||
title: "{1} / {2}"
|
title: "{1} / {2}"
|
||||||
prev: "Mois dernier"
|
prev: "Mois dernier"
|
||||||
next: "Mois prochain"
|
next: "Mois prochain"
|
||||||
go: "Cliquer pour naviguer"
|
go: "Cliquez pour naviguer"
|
||||||
desktop/views/components/choose-file-from-drive-window.vue:
|
desktop/views/components/choose-file-from-drive-window.vue:
|
||||||
choose-file: "Sélection de fichiers"
|
choose-file: "Sélection de fichiers"
|
||||||
upload: "Téléverser des fichiers à partir de votre PC"
|
upload: "Téléverser des fichiers à partir de votre ordinateur"
|
||||||
cancel: "Annuler"
|
cancel: "Annuler"
|
||||||
ok: "OK"
|
ok: "OK"
|
||||||
choose-prompt: "Choisir un fichier"
|
choose-prompt: "Choisir un fichier"
|
||||||
@ -440,6 +443,7 @@ desktop/views/components/drive-window.vue:
|
|||||||
desktop/views/components/drive.file.vue:
|
desktop/views/components/drive.file.vue:
|
||||||
avatar: "Avatar"
|
avatar: "Avatar"
|
||||||
banner: "Bannière"
|
banner: "Bannière"
|
||||||
|
nsfw: "閲覧注意"
|
||||||
contextmenu:
|
contextmenu:
|
||||||
rename: "Renommer"
|
rename: "Renommer"
|
||||||
mark-as-sensitive: "Marquer comme sensible"
|
mark-as-sensitive: "Marquer comme sensible"
|
||||||
@ -453,14 +457,14 @@ desktop/views/components/drive.file.vue:
|
|||||||
add-app: "Ajouter une application"
|
add-app: "Ajouter une application"
|
||||||
rename-file: "Renommer le ficher"
|
rename-file: "Renommer le ficher"
|
||||||
input-new-file-name: "Entrer un nouveau nom"
|
input-new-file-name: "Entrer un nouveau nom"
|
||||||
copied: "Copied"
|
copied: "Copié"
|
||||||
copied-url-to-clipboard: "L'URL a été copié dans le presse-papier"
|
copied-url-to-clipboard: "L'URL a été copiée dans le presse-papier"
|
||||||
desktop/views/components/drive.folder.vue:
|
desktop/views/components/drive.folder.vue:
|
||||||
unable-to-process: "L'opération n'a pas pu être complétée"
|
unable-to-process: "L'opération n'a pas pu être complétée"
|
||||||
circular-reference-detected: "Le dossier de destination est un sous-dossier du dossier que vous souhaitez déplacer."
|
circular-reference-detected: "Le dossier de destination est un sous-dossier du dossier que vous souhaitez déplacer."
|
||||||
unhandled-error: "Erreur inconnue"
|
unhandled-error: "Erreur inconnue"
|
||||||
contextmenu:
|
contextmenu:
|
||||||
move-to-this-folder: "Bouger dans ce dossier"
|
move-to-this-folder: "Déplacer dans ce dossier"
|
||||||
show-in-new-window: "Ouvrir dans une nouvelle fenêtre"
|
show-in-new-window: "Ouvrir dans une nouvelle fenêtre"
|
||||||
rename: "Renommer"
|
rename: "Renommer"
|
||||||
rename-folder: "Renommer le dossier"
|
rename-folder: "Renommer le dossier"
|
||||||
@ -625,9 +629,11 @@ desktop/views/components/settings.vue:
|
|||||||
circle-icons: "Utiliser des icônes circulaires"
|
circle-icons: "Utiliser des icônes circulaires"
|
||||||
gradient-window-header: "Utiliser les dégradés sur la barre de titre de la fenêtre"
|
gradient-window-header: "Utiliser les dégradés sur la barre de titre de la fenêtre"
|
||||||
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
||||||
|
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||||
show-reply-target: "Afficher les réponses"
|
show-reply-target: "Afficher les réponses"
|
||||||
show-my-renotes: "Afficher mes republications dans le fil"
|
show-my-renotes: "Afficher mes republications dans le fil"
|
||||||
show-renoted-my-notes: "Renoteされた自分の投稿をタイムラインに表示する"
|
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
|
||||||
|
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
|
||||||
show-maps: "Afficher la carte"
|
show-maps: "Afficher la carte"
|
||||||
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
|
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
|
||||||
sound: "Son"
|
sound: "Son"
|
||||||
@ -786,23 +792,44 @@ desktop/views/components/window.vue:
|
|||||||
close: "Fermer"
|
close: "Fermer"
|
||||||
desktop/views/pages/admin/admin.vue:
|
desktop/views/pages/admin/admin.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
drive: "ドライブ"
|
drive: "Drive"
|
||||||
users: "ユーザー"
|
users: "Utilisateur·rice·s"
|
||||||
update: "更新"
|
update: "Mises à jour"
|
||||||
desktop/views/pages/admin/admin.dashboard.vue:
|
desktop/views/pages/admin/admin.dashboard.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
all-users: "全てのユーザー"
|
all-users: "Tou·te·s les utilisateur·rice·s"
|
||||||
original-users: "このインスタンスのユーザー"
|
original-users: "Utilisateur·rice·s sur cette instance"
|
||||||
all-notes: "全てのノート"
|
all-notes: "Toutes les publications"
|
||||||
original-notes: "このインスタンスのノート"
|
original-notes: "Publication sur cette instance"
|
||||||
|
invite: "Invitation"
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
desktop/views/pages/admin/admin.suspend-user.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
suspend-user: "Suspendre un·e utilisateur·rice"
|
||||||
suspend: "凍結"
|
suspend: "Suspendre"
|
||||||
suspended: "凍結しました"
|
suspended: "Suspendu avec succès"
|
||||||
desktop/views/pages/admin/admin.unsuspend-user.vue:
|
desktop/views/pages/admin/admin.unsuspend-user.vue:
|
||||||
unsuspend-user: "ユーザーの凍結の解除"
|
unsuspend-user: "Lever la suspension d’utilisateur·rice·s"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "Suspension levée"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "La suspension de l’utilisateur·rice a été levée avec succès"
|
||||||
|
desktop/views/pages/admin/admin.verify-user.vue:
|
||||||
|
verify-user: "ユーザーの公式アカウント設定"
|
||||||
|
verify: "Vérification du compte"
|
||||||
|
verified: "Le compte a été vérifié"
|
||||||
|
desktop/views/pages/admin/admin.unverify-user.vue:
|
||||||
|
unverify-user: "ユーザーの公式アカウント解除"
|
||||||
|
unverify: "公式アカウントを解除する"
|
||||||
|
unverified: "公式アカウントを解除しました"
|
||||||
|
desktop/views/pages/admin/admin.notes-chart.vue:
|
||||||
|
title: "投稿"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
desktop/views/pages/admin/admin.users-chart.vue:
|
||||||
|
title: "ユーザー"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
desktop/views/pages/admin/admin.drive-chart.vue:
|
||||||
|
title: "ドライブ"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "Les publications médias uniquement"
|
is-media-only: "Les publications médias uniquement"
|
||||||
is-media-view: "Vue média"
|
is-media-view: "Vue média"
|
||||||
@ -835,7 +862,7 @@ desktop/views/pages/selectdrive.vue:
|
|||||||
cancel: "Annuler"
|
cancel: "Annuler"
|
||||||
upload: "Uploader un ou plusieurs fichier(s) depuis votre PC"
|
upload: "Uploader un ou plusieurs fichier(s) depuis votre PC"
|
||||||
desktop/views/pages/search.vue:
|
desktop/views/pages/search.vue:
|
||||||
not-available: "Vous ne pouvez pas utiliser la fonctionnalité de recherche."
|
not-available: "検索機能はインスタンスの設定で無効になっています。"
|
||||||
not-found: "Aucun message trouvé pour '{}'"
|
not-found: "Aucun message trouvé pour '{}'"
|
||||||
desktop/views/pages/share.vue:
|
desktop/views/pages/share.vue:
|
||||||
share-with: "Partager avec {}"
|
share-with: "Partager avec {}"
|
||||||
@ -928,12 +955,15 @@ mobile/views/components/drive-file-chooser.vue:
|
|||||||
select-file: "Choisissez un fichier"
|
select-file: "Choisissez un fichier"
|
||||||
mobile/views/components/drive-folder-chooser.vue:
|
mobile/views/components/drive-folder-chooser.vue:
|
||||||
select-folder: "Choisissez un dossier"
|
select-folder: "Choisissez un dossier"
|
||||||
|
mobile/views/components/drive.file.vue:
|
||||||
|
nsfw: "閲覧注意"
|
||||||
mobile/views/components/drive.file-detail.vue:
|
mobile/views/components/drive.file-detail.vue:
|
||||||
download: "Télécharger"
|
download: "Télécharger"
|
||||||
rename: "Renommer"
|
rename: "Renommer"
|
||||||
move: "Déplacer"
|
move: "Déplacer"
|
||||||
hash: "Hash (md5)"
|
hash: "Hash (md5)"
|
||||||
exif: "EXIF"
|
exif: "EXIF"
|
||||||
|
nsfw: "閲覧注意"
|
||||||
mobile/views/components/media-image.vue:
|
mobile/views/components/media-image.vue:
|
||||||
sensitive: "Le contenu est NSFW"
|
sensitive: "Le contenu est NSFW"
|
||||||
click-to-show: "Cliquer pour afficher"
|
click-to-show: "Cliquer pour afficher"
|
||||||
@ -1106,7 +1136,8 @@ mobile/views/pages/settings.vue:
|
|||||||
timeline: "Fil d'actualité"
|
timeline: "Fil d'actualité"
|
||||||
show-reply-target: "Afficher les réponses"
|
show-reply-target: "Afficher les réponses"
|
||||||
show-my-renotes: "Afficher mes republications"
|
show-my-renotes: "Afficher mes republications"
|
||||||
show-renoted-my-notes: "Afficher les notes que j'ai repartagé"
|
show-renoted-my-notes: "自分の投稿のRenoteを表示する"
|
||||||
|
show-local-renotes: "ローカルの投稿のRenoteを表示する"
|
||||||
post-style: "Style de la publication"
|
post-style: "Style de la publication"
|
||||||
post-style-standard: "Standard"
|
post-style-standard: "Standard"
|
||||||
post-style-smart: "Intelligent"
|
post-style-smart: "Intelligent"
|
||||||
@ -1172,14 +1203,14 @@ docs:
|
|||||||
params: "Paramètres"
|
params: "Paramètres"
|
||||||
no-params: "Aucun paramètre"
|
no-params: "Aucun paramètre"
|
||||||
res: "Réponse"
|
res: "Réponse"
|
||||||
require-credential: "このエンドポイントは認証情報が必須です。"
|
require-credential: "Ce point de communication nécessite une authentification."
|
||||||
require-permission: "このエンドポイントは{permission}の権限を必要とします。"
|
require-permission: "Ce point de communication nécessite la permission {permission}."
|
||||||
has-limit: "レートリミットがあります。"
|
has-limit: "レートリミットがあります。"
|
||||||
duration-limit: "直近{duration}ミリ秒の間のこのエンドポイントへのリクエスト数の合計が{max}を超える場合はリクエストできません。"
|
duration-limit: "直近{duration}ミリ秒の間のこのエンドポイントへのリクエスト数の合計が{max}を超える場合はリクエストできません。"
|
||||||
min-interval-limit: "前回のリクエストから{interval}ミリ秒経っていない場合はリクエストできません。"
|
min-interval-limit: "前回のリクエストから{interval}ミリ秒経っていない場合はリクエストできません。"
|
||||||
show-src: "このエンドポイントのソースコードも閲覧できます。"
|
show-src: "Vous pouvez voir le code source ce point de communication."
|
||||||
show-src-link: "Consulter le code sur GitHub"
|
show-src-link: "Consulter le code sur GitHub"
|
||||||
generated: "このドキュメントはAPI定義に基づき自動生成されています。"
|
generated: "Ce document est généré à partir de la définition de l’API."
|
||||||
props:
|
props:
|
||||||
name: "Nom"
|
name: "Nom"
|
||||||
type: "Type"
|
type: "Type"
|
||||||
|
@ -15,6 +15,7 @@ const langs = {
|
|||||||
'en': loadLang('en'),
|
'en': loadLang('en'),
|
||||||
'fr': loadLang('fr'),
|
'fr': loadLang('fr'),
|
||||||
'ja': native,
|
'ja': native,
|
||||||
|
'ja-ks': loadLang('ja-ks'),
|
||||||
'pl': loadLang('pl'),
|
'pl': loadLang('pl'),
|
||||||
'es': loadLang('es')
|
'es': loadLang('es')
|
||||||
};
|
};
|
||||||
|
@ -84,7 +84,7 @@ common:
|
|||||||
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
||||||
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
||||||
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
||||||
verified-user: "認証済みのユーザー"
|
verified-user: "公式アカウント"
|
||||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "引き分け"
|
drawn: "引き分け"
|
||||||
@ -287,7 +287,10 @@ common/views/components/signin.vue:
|
|||||||
signin: "サインイン"
|
signin: "サインイン"
|
||||||
or: "または"
|
or: "または"
|
||||||
signin-with-twitter: "Twitterでログイン"
|
signin-with-twitter: "Twitterでログイン"
|
||||||
|
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||||
common/views/components/signup.vue:
|
common/views/components/signup.vue:
|
||||||
|
invitation-code: "招待コード"
|
||||||
|
invitation-info: "招待コードをお持ちでない方は、<a href=\"{}\">管理者</a>までご連絡ください。"
|
||||||
username: "ユーザー名"
|
username: "ユーザー名"
|
||||||
checking: "確認しています..."
|
checking: "確認しています..."
|
||||||
available: "利用できます"
|
available: "利用できます"
|
||||||
@ -440,6 +443,7 @@ desktop/views/components/drive-window.vue:
|
|||||||
desktop/views/components/drive.file.vue:
|
desktop/views/components/drive.file.vue:
|
||||||
avatar: "アイコン"
|
avatar: "アイコン"
|
||||||
banner: "バナー"
|
banner: "バナー"
|
||||||
|
nsfw: "閲覧注意"
|
||||||
contextmenu:
|
contextmenu:
|
||||||
rename: "名前を変更"
|
rename: "名前を変更"
|
||||||
mark-as-sensitive: "閲覧注意に設定"
|
mark-as-sensitive: "閲覧注意に設定"
|
||||||
@ -625,9 +629,11 @@ desktop/views/components/settings.vue:
|
|||||||
circle-icons: "円形のアイコンを使用"
|
circle-icons: "円形のアイコンを使用"
|
||||||
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
||||||
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
||||||
|
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||||
show-reply-target: "リプライ先を表示する"
|
show-reply-target: "リプライ先を表示する"
|
||||||
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
|
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
|
||||||
show-renoted-my-notes: "Renoteされた自分の投稿をタイムラインに表示する"
|
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
|
||||||
|
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
|
||||||
show-maps: "マップの自動展開"
|
show-maps: "マップの自動展開"
|
||||||
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
|
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
|
||||||
sound: "サウンド"
|
sound: "サウンド"
|
||||||
@ -795,6 +801,7 @@ desktop/views/pages/admin/admin.dashboard.vue:
|
|||||||
original-users: "このインスタンスのユーザー"
|
original-users: "このインスタンスのユーザー"
|
||||||
all-notes: "全てのノート"
|
all-notes: "全てのノート"
|
||||||
original-notes: "このインスタンスのノート"
|
original-notes: "このインスタンスのノート"
|
||||||
|
invite: "招待"
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
desktop/views/pages/admin/admin.suspend-user.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
suspend-user: "ユーザーの凍結"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
@ -803,6 +810,26 @@ desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|||||||
unsuspend-user: "ユーザーの凍結の解除"
|
unsuspend-user: "ユーザーの凍結の解除"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
|
desktop/views/pages/admin/admin.verify-user.vue:
|
||||||
|
verify-user: "ユーザーの公式アカウント設定"
|
||||||
|
verify: "公式アカウントにする"
|
||||||
|
verified: "公式アカウントにしました"
|
||||||
|
desktop/views/pages/admin/admin.unverify-user.vue:
|
||||||
|
unverify-user: "ユーザーの公式アカウント解除"
|
||||||
|
unverify: "公式アカウントを解除する"
|
||||||
|
unverified: "公式アカウントを解除しました"
|
||||||
|
desktop/views/pages/admin/admin.notes-chart.vue:
|
||||||
|
title: "投稿"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
desktop/views/pages/admin/admin.users-chart.vue:
|
||||||
|
title: "ユーザー"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
desktop/views/pages/admin/admin.drive-chart.vue:
|
||||||
|
title: "ドライブ"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "メディア投稿のみ"
|
is-media-only: "メディア投稿のみ"
|
||||||
is-media-view: "メディアビュー"
|
is-media-view: "メディアビュー"
|
||||||
@ -835,7 +862,7 @@ desktop/views/pages/selectdrive.vue:
|
|||||||
cancel: "キャンセル"
|
cancel: "キャンセル"
|
||||||
upload: "PCからドライブにファイルをアップロード"
|
upload: "PCからドライブにファイルをアップロード"
|
||||||
desktop/views/pages/search.vue:
|
desktop/views/pages/search.vue:
|
||||||
not-available: "検索機能を利用することができません。"
|
not-available: "検索機能はインスタンスの設定で無効になっています。"
|
||||||
not-found: "「{}」に関する投稿は見つかりませんでした。"
|
not-found: "「{}」に関する投稿は見つかりませんでした。"
|
||||||
desktop/views/pages/share.vue:
|
desktop/views/pages/share.vue:
|
||||||
share-with: "{}で共有"
|
share-with: "{}で共有"
|
||||||
@ -928,12 +955,15 @@ mobile/views/components/drive-file-chooser.vue:
|
|||||||
select-file: "ファイルを選択"
|
select-file: "ファイルを選択"
|
||||||
mobile/views/components/drive-folder-chooser.vue:
|
mobile/views/components/drive-folder-chooser.vue:
|
||||||
select-folder: "フォルダーを選択"
|
select-folder: "フォルダーを選択"
|
||||||
|
mobile/views/components/drive.file.vue:
|
||||||
|
nsfw: "閲覧注意"
|
||||||
mobile/views/components/drive.file-detail.vue:
|
mobile/views/components/drive.file-detail.vue:
|
||||||
download: "ダウンロード"
|
download: "ダウンロード"
|
||||||
rename: "名前を変更"
|
rename: "名前を変更"
|
||||||
move: "移動"
|
move: "移動"
|
||||||
hash: "ハッシュ (md5)"
|
hash: "ハッシュ (md5)"
|
||||||
exif: "EXIF"
|
exif: "EXIF"
|
||||||
|
nsfw: "閲覧注意"
|
||||||
mobile/views/components/media-image.vue:
|
mobile/views/components/media-image.vue:
|
||||||
sensitive: "閲覧注意"
|
sensitive: "閲覧注意"
|
||||||
click-to-show: "クリックして表示"
|
click-to-show: "クリックして表示"
|
||||||
@ -1106,7 +1136,8 @@ mobile/views/pages/settings.vue:
|
|||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
show-reply-target: "リプライ先を表示する"
|
show-reply-target: "リプライ先を表示する"
|
||||||
show-my-renotes: "自分の行ったRenoteを表示する"
|
show-my-renotes: "自分の行ったRenoteを表示する"
|
||||||
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
|
show-renoted-my-notes: "自分の投稿のRenoteを表示する"
|
||||||
|
show-local-renotes: "ローカルの投稿のRenoteを表示する"
|
||||||
post-style: "投稿の表示スタイル"
|
post-style: "投稿の表示スタイル"
|
||||||
post-style-standard: "標準"
|
post-style-standard: "標準"
|
||||||
post-style-smart: "スマート"
|
post-style-smart: "スマート"
|
||||||
|
1412
locales/ja-ks.yml
Normal file
1412
locales/ja-ks.yml
Normal file
File diff suppressed because it is too large
Load Diff
240
locales/ja.yml
240
locales/ja.yml
File diff suppressed because it is too large
Load Diff
@ -12,7 +12,7 @@ common:
|
|||||||
application-authorization: "앱의 연계"
|
application-authorization: "앱의 연계"
|
||||||
close: "닫기"
|
close: "닫기"
|
||||||
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
|
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
|
||||||
got-it: "わかった"
|
got-it: "알았습니다"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "사용자 정의 팁"
|
title: "사용자 정의 팁"
|
||||||
paragraph1: "홈 정의는 위젯을 추가 / 삭제하거나 드래그 앤 드롭하여 정렬 할 수 있습니다."
|
paragraph1: "홈 정의는 위젯을 추가 / 삭제하거나 드래그 앤 드롭하여 정렬 할 수 있습니다."
|
||||||
@ -39,7 +39,7 @@ common:
|
|||||||
weeks_ago: "{}주전"
|
weeks_ago: "{}주전"
|
||||||
months_ago: "{}개월전"
|
months_ago: "{}개월전"
|
||||||
years_ago: "{}년전"
|
years_ago: "{}년전"
|
||||||
month-and-day: "{month}月 {day}日"
|
month-and-day: "{month}월 {day}일"
|
||||||
trash: "휴지통"
|
trash: "휴지통"
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "일"
|
sunday: "일"
|
||||||
@ -84,7 +84,7 @@ common:
|
|||||||
my-token-regenerated: "당신의 토큰이 업데이트되어 있기 때문에 로그 아웃합니다."
|
my-token-regenerated: "당신의 토큰이 업데이트되어 있기 때문에 로그 아웃합니다."
|
||||||
i-like-sushi: "나는(푸딩보다 오히려)스시가 좋아"
|
i-like-sushi: "나는(푸딩보다 오히려)스시가 좋아"
|
||||||
show-reversi-board-labels: "리버시 보드의 행과 열 레이블을 표시"
|
show-reversi-board-labels: "리버시 보드의 행과 열 레이블을 표시"
|
||||||
verified-user: "인증 된 사용자"
|
verified-user: "公式アカウント"
|
||||||
disable-animated-mfm: "게시물의 문자 애니메이션을 비활성화 할"
|
disable-animated-mfm: "게시물의 문자 애니메이션을 비활성화 할"
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "무승부"
|
drawn: "무승부"
|
||||||
@ -122,13 +122,13 @@ common:
|
|||||||
tips: "팁"
|
tips: "팁"
|
||||||
hashtags: "해시 태그"
|
hashtags: "해시 태그"
|
||||||
deck:
|
deck:
|
||||||
widgets: "ウィジェット"
|
widgets: "위젯"
|
||||||
home: "ホーム"
|
home: "홈"
|
||||||
local: "ローカル"
|
local: "로컬"
|
||||||
hybrid: "ソーシャル"
|
hybrid: "소셜"
|
||||||
global: "グローバル"
|
global: "글로벌"
|
||||||
notifications: "通知"
|
notifications: "통지"
|
||||||
list: "リスト"
|
list: "목록"
|
||||||
swap-left: "左に移動"
|
swap-left: "左に移動"
|
||||||
swap-right: "右に移動"
|
swap-right: "右に移動"
|
||||||
swap-up: "上に移動"
|
swap-up: "上に移動"
|
||||||
@ -150,10 +150,10 @@ auth/views/form.vue:
|
|||||||
drive-write: "ドライブを操作する。"
|
drive-write: "ドライブを操作する。"
|
||||||
notification-read: "通知を見る。"
|
notification-read: "通知を見る。"
|
||||||
notification-write: "通知を操作する。"
|
notification-write: "通知を操作する。"
|
||||||
cancel: "キャンセル"
|
cancel: "취소"
|
||||||
accept: "アクセスを許可"
|
accept: "アクセスを許可"
|
||||||
auth/views/index.vue:
|
auth/views/index.vue:
|
||||||
loading: "読み込み中"
|
loading: "로드 중"
|
||||||
denied: "アプリケーションの連携をキャンセルしました。"
|
denied: "アプリケーションの連携をキャンセルしました。"
|
||||||
denied-paragraph: "このアプリがあなたのアカウントにアクセスすることはありません。"
|
denied-paragraph: "このアプリがあなたのアカウントにアクセスすることはありません。"
|
||||||
already-authorized: "このアプリは既に連携済みです"
|
already-authorized: "このアプリは既に連携済みです"
|
||||||
@ -165,18 +165,18 @@ auth/views/index.vue:
|
|||||||
common/views/components/games/reversi/reversi.vue:
|
common/views/components/games/reversi/reversi.vue:
|
||||||
matching:
|
matching:
|
||||||
waiting-for: "{}を待っています"
|
waiting-for: "{}を待っています"
|
||||||
cancel: "キャンセル"
|
cancel: "취소"
|
||||||
common/views/components/games/reversi/reversi.game.vue:
|
common/views/components/games/reversi/reversi.game.vue:
|
||||||
surrender: "投了"
|
surrender: "기권"
|
||||||
surrendered: "投了により"
|
surrendered: "投了により"
|
||||||
is-llotheo: "石の少ない方が勝ち(ロセオ)"
|
is-llotheo: "石の少ない方が勝ち(ロセオ)"
|
||||||
looped-map: "ループマップ"
|
looped-map: "루프 지도"
|
||||||
can-put-everywhere: "どこでも置けるモード"
|
can-put-everywhere: "どこでも置けるモード"
|
||||||
common/views/components/games/reversi/reversi.index.vue:
|
common/views/components/games/reversi/reversi.index.vue:
|
||||||
title: "Misskey Reversi"
|
title: "Misskey Reversi"
|
||||||
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
||||||
invite: "招待"
|
invite: "초대"
|
||||||
rule: "遊び方"
|
rule: "게임 방법"
|
||||||
rule-desc: "リバーシは、相手と交互に石をボードに置いて、相手の石を挟んで自分の色に変えてゆき、最終的に残った石が多い方が勝ちというボードゲームです。"
|
rule-desc: "リバーシは、相手と交互に石をボードに置いて、相手の石を挟んで自分の色に変えてゆき、最終的に残った石が多い方が勝ちというボードゲームです。"
|
||||||
mode-invite: "招待"
|
mode-invite: "招待"
|
||||||
mode-invite-desc: "指定したユーザーと対戦するモードです。"
|
mode-invite-desc: "指定したユーザーと対戦するモードです。"
|
||||||
@ -185,26 +185,26 @@ common/views/components/games/reversi/reversi.index.vue:
|
|||||||
all-games: "みんなの対局"
|
all-games: "みんなの対局"
|
||||||
enter-username: "ユーザー名を入力してください"
|
enter-username: "ユーザー名を入力してください"
|
||||||
game-state:
|
game-state:
|
||||||
ended: "終了"
|
ended: "종료"
|
||||||
playing: "進行中"
|
playing: "진행중"
|
||||||
common/views/components/games/reversi/reversi.room.vue:
|
common/views/components/games/reversi/reversi.room.vue:
|
||||||
settings-of-the-game: "ゲームの設定"
|
settings-of-the-game: "ゲームの設定"
|
||||||
choose-map: "マップを選択"
|
choose-map: "マップを選択"
|
||||||
random: "ランダム"
|
random: "ランダム"
|
||||||
black-or-white: "先手/後手"
|
black-or-white: "先手/後手"
|
||||||
black-is: "{}が黒"
|
black-is: "{}が黒"
|
||||||
rules: "ルール"
|
rules: "규칙"
|
||||||
is-llotheo: "石の少ない方が勝ち(ロセオ)"
|
is-llotheo: "石の少ない方が勝ち(ロセオ)"
|
||||||
looped-map: "ループマップ"
|
looped-map: "루프 지도"
|
||||||
can-put-everywhere: "どこでも置けるモード"
|
can-put-everywhere: "どこでも置けるモード"
|
||||||
settings-of-the-bot: "Botの設定"
|
settings-of-the-bot: "Botの設定"
|
||||||
this-game-is-started-soon: "ゲームは数秒後に開始されます"
|
this-game-is-started-soon: "ゲームは数秒後に開始されます"
|
||||||
waiting-for-other: "相手の準備が完了するのを待っています"
|
waiting-for-other: "相手の準備が完了するのを待っています"
|
||||||
waiting-for-me: "あなたの準備が完了するのを待っています"
|
waiting-for-me: "あなたの準備が完了するのを待っています"
|
||||||
waiting-for-both: "準備中"
|
waiting-for-both: "준비중"
|
||||||
cancel: "キャンセル"
|
cancel: "취소"
|
||||||
ready: "準備完了"
|
ready: "준비 완료"
|
||||||
cancel-ready: "準備続行"
|
cancel-ready: "준비 계속"
|
||||||
common/views/components/connect-failed.vue:
|
common/views/components/connect-failed.vue:
|
||||||
title: "サーバーに接続できません"
|
title: "サーバーに接続できません"
|
||||||
description: "インターネット回線に問題があるか、サーバーがダウンまたはメンテナンスしている可能性があります。しばらくしてから{再度お試し}ください。"
|
description: "インターネット回線に問題があるか、サーバーがダウンまたはメンテナンスしている可能性があります。しばらくしてから{再度お試し}ください。"
|
||||||
@ -231,7 +231,7 @@ common/views/components/connect-failed.troubleshooter.vue:
|
|||||||
set-version: "バージョン指定"
|
set-version: "バージョン指定"
|
||||||
common/views/components/messaging.vue:
|
common/views/components/messaging.vue:
|
||||||
search-user: "ユーザーを探す"
|
search-user: "ユーザーを探す"
|
||||||
you: "あなた"
|
you: "당신"
|
||||||
no-history: "履歴はありません"
|
no-history: "履歴はありません"
|
||||||
common/views/components/messaging-room.vue:
|
common/views/components/messaging-room.vue:
|
||||||
empty: "このユーザーと話したことはありません"
|
empty: "このユーザーと話したことはありません"
|
||||||
@ -242,12 +242,12 @@ common/views/components/messaging-room.vue:
|
|||||||
only-one-file-attached: "メッセージに添付できるのはひとつのファイルのみです"
|
only-one-file-attached: "メッセージに添付できるのはひとつのファイルのみです"
|
||||||
common/views/components/messaging-room.form.vue:
|
common/views/components/messaging-room.form.vue:
|
||||||
input-message-here: "ここにメッセージを入力"
|
input-message-here: "ここにメッセージを入力"
|
||||||
send: "送信"
|
send: "전송"
|
||||||
attach-from-local: "PCからファイルを添付する"
|
attach-from-local: "PCからファイルを添付する"
|
||||||
attach-from-drive: "ドライブからファイルを添付する"
|
attach-from-drive: "ドライブからファイルを添付する"
|
||||||
only-one-file-attached: "メッセージに添付できるのはひとつのファイルのみです"
|
only-one-file-attached: "メッセージに添付できるのはひとつのファイルのみです"
|
||||||
common/views/components/messaging-room.message.vue:
|
common/views/components/messaging-room.message.vue:
|
||||||
is-read: "既読"
|
is-read: "읽음"
|
||||||
deleted: "このメッセージは削除されました"
|
deleted: "このメッセージは削除されました"
|
||||||
common/views/components/nav.vue:
|
common/views/components/nav.vue:
|
||||||
about: "Misskeyについて"
|
about: "Misskeyについて"
|
||||||
@ -287,7 +287,10 @@ common/views/components/signin.vue:
|
|||||||
signin: "サインイン"
|
signin: "サインイン"
|
||||||
or: "または"
|
or: "または"
|
||||||
signin-with-twitter: "Twitterでログイン"
|
signin-with-twitter: "Twitterでログイン"
|
||||||
|
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||||
common/views/components/signup.vue:
|
common/views/components/signup.vue:
|
||||||
|
invitation-code: "招待コード"
|
||||||
|
invitation-info: "招待コードをお持ちでない方は、<a href=\"{}\">管理者</a>までご連絡ください。"
|
||||||
username: "ユーザー名"
|
username: "ユーザー名"
|
||||||
checking: "確認しています..."
|
checking: "確認しています..."
|
||||||
available: "利用できます"
|
available: "利用できます"
|
||||||
@ -440,6 +443,7 @@ desktop/views/components/drive-window.vue:
|
|||||||
desktop/views/components/drive.file.vue:
|
desktop/views/components/drive.file.vue:
|
||||||
avatar: "アイコン"
|
avatar: "アイコン"
|
||||||
banner: "バナー"
|
banner: "バナー"
|
||||||
|
nsfw: "閲覧注意"
|
||||||
contextmenu:
|
contextmenu:
|
||||||
rename: "名前を変更"
|
rename: "名前を変更"
|
||||||
mark-as-sensitive: "閲覧注意に設定"
|
mark-as-sensitive: "閲覧注意に設定"
|
||||||
@ -625,9 +629,11 @@ desktop/views/components/settings.vue:
|
|||||||
circle-icons: "円形のアイコンを使用"
|
circle-icons: "円形のアイコンを使用"
|
||||||
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
||||||
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
||||||
|
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||||
show-reply-target: "リプライ先を表示する"
|
show-reply-target: "リプライ先を表示する"
|
||||||
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
|
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
|
||||||
show-renoted-my-notes: "Renoteされた自分の投稿をタイムラインに表示する"
|
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
|
||||||
|
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
|
||||||
show-maps: "マップの自動展開"
|
show-maps: "マップの自動展開"
|
||||||
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
|
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
|
||||||
sound: "サウンド"
|
sound: "サウンド"
|
||||||
@ -795,6 +801,7 @@ desktop/views/pages/admin/admin.dashboard.vue:
|
|||||||
original-users: "このインスタンスのユーザー"
|
original-users: "このインスタンスのユーザー"
|
||||||
all-notes: "全てのノート"
|
all-notes: "全てのノート"
|
||||||
original-notes: "このインスタンスのノート"
|
original-notes: "このインスタンスのノート"
|
||||||
|
invite: "招待"
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
desktop/views/pages/admin/admin.suspend-user.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
suspend-user: "ユーザーの凍結"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
@ -803,6 +810,26 @@ desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|||||||
unsuspend-user: "ユーザーの凍結の解除"
|
unsuspend-user: "ユーザーの凍結の解除"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
|
desktop/views/pages/admin/admin.verify-user.vue:
|
||||||
|
verify-user: "ユーザーの公式アカウント設定"
|
||||||
|
verify: "公式アカウントにする"
|
||||||
|
verified: "公式アカウントにしました"
|
||||||
|
desktop/views/pages/admin/admin.unverify-user.vue:
|
||||||
|
unverify-user: "ユーザーの公式アカウント解除"
|
||||||
|
unverify: "公式アカウントを解除する"
|
||||||
|
unverified: "公式アカウントを解除しました"
|
||||||
|
desktop/views/pages/admin/admin.notes-chart.vue:
|
||||||
|
title: "投稿"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
desktop/views/pages/admin/admin.users-chart.vue:
|
||||||
|
title: "ユーザー"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
desktop/views/pages/admin/admin.drive-chart.vue:
|
||||||
|
title: "ドライブ"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "メディア投稿のみ"
|
is-media-only: "メディア投稿のみ"
|
||||||
is-media-view: "メディアビュー"
|
is-media-view: "メディアビュー"
|
||||||
@ -835,7 +862,7 @@ desktop/views/pages/selectdrive.vue:
|
|||||||
cancel: "キャンセル"
|
cancel: "キャンセル"
|
||||||
upload: "PCからドライブにファイルをアップロード"
|
upload: "PCからドライブにファイルをアップロード"
|
||||||
desktop/views/pages/search.vue:
|
desktop/views/pages/search.vue:
|
||||||
not-available: "検索機能を利用することができません。"
|
not-available: "検索機能はインスタンスの設定で無効になっています。"
|
||||||
not-found: "「{}」に関する投稿は見つかりませんでした。"
|
not-found: "「{}」に関する投稿は見つかりませんでした。"
|
||||||
desktop/views/pages/share.vue:
|
desktop/views/pages/share.vue:
|
||||||
share-with: "{}で共有"
|
share-with: "{}で共有"
|
||||||
@ -928,12 +955,15 @@ mobile/views/components/drive-file-chooser.vue:
|
|||||||
select-file: "ファイルを選択"
|
select-file: "ファイルを選択"
|
||||||
mobile/views/components/drive-folder-chooser.vue:
|
mobile/views/components/drive-folder-chooser.vue:
|
||||||
select-folder: "フォルダーを選択"
|
select-folder: "フォルダーを選択"
|
||||||
|
mobile/views/components/drive.file.vue:
|
||||||
|
nsfw: "閲覧注意"
|
||||||
mobile/views/components/drive.file-detail.vue:
|
mobile/views/components/drive.file-detail.vue:
|
||||||
download: "ダウンロード"
|
download: "ダウンロード"
|
||||||
rename: "名前を変更"
|
rename: "名前を変更"
|
||||||
move: "移動"
|
move: "移動"
|
||||||
hash: "ハッシュ (md5)"
|
hash: "ハッシュ (md5)"
|
||||||
exif: "EXIF"
|
exif: "EXIF"
|
||||||
|
nsfw: "閲覧注意"
|
||||||
mobile/views/components/media-image.vue:
|
mobile/views/components/media-image.vue:
|
||||||
sensitive: "閲覧注意"
|
sensitive: "閲覧注意"
|
||||||
click-to-show: "クリックして表示"
|
click-to-show: "クリックして表示"
|
||||||
@ -1106,7 +1136,8 @@ mobile/views/pages/settings.vue:
|
|||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
show-reply-target: "リプライ先を表示する"
|
show-reply-target: "リプライ先を表示する"
|
||||||
show-my-renotes: "自分の行ったRenoteを表示する"
|
show-my-renotes: "自分の行ったRenoteを表示する"
|
||||||
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
|
show-renoted-my-notes: "自分の投稿のRenoteを表示する"
|
||||||
|
show-local-renotes: "ローカルの投稿のRenoteを表示する"
|
||||||
post-style: "投稿の表示スタイル"
|
post-style: "投稿の表示スタイル"
|
||||||
post-style-standard: "標準"
|
post-style-standard: "標準"
|
||||||
post-style-smart: "スマート"
|
post-style-smart: "スマート"
|
||||||
|
@ -84,7 +84,7 @@ common:
|
|||||||
my-token-regenerated: "Twój token został wygenerowany. Zostaniesz wylogowany."
|
my-token-regenerated: "Twój token został wygenerowany. Zostaniesz wylogowany."
|
||||||
i-like-sushi: "Wolę sushi od puddingu"
|
i-like-sushi: "Wolę sushi od puddingu"
|
||||||
show-reversi-board-labels: "Pokazuj podpisy wierszy i kolumn w Reversi"
|
show-reversi-board-labels: "Pokazuj podpisy wierszy i kolumn w Reversi"
|
||||||
verified-user: "Zweryfikowany użytkownik"
|
verified-user: "公式アカウント"
|
||||||
disable-animated-mfm: "Wyłącz animowany tekst we wpisach"
|
disable-animated-mfm: "Wyłącz animowany tekst we wpisach"
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "Remis"
|
drawn: "Remis"
|
||||||
@ -287,7 +287,10 @@ common/views/components/signin.vue:
|
|||||||
signin: "Zaloguj"
|
signin: "Zaloguj"
|
||||||
or: "または"
|
or: "または"
|
||||||
signin-with-twitter: "Zaloguj się za pomocą Twittera"
|
signin-with-twitter: "Zaloguj się za pomocą Twittera"
|
||||||
|
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||||
common/views/components/signup.vue:
|
common/views/components/signup.vue:
|
||||||
|
invitation-code: "招待コード"
|
||||||
|
invitation-info: "招待コードをお持ちでない方は、<a href=\"{}\">管理者</a>までご連絡ください。"
|
||||||
username: "Nazwa użytkownika"
|
username: "Nazwa użytkownika"
|
||||||
checking: "Sprawdzanie…"
|
checking: "Sprawdzanie…"
|
||||||
available: "Dostępna"
|
available: "Dostępna"
|
||||||
@ -440,6 +443,7 @@ desktop/views/components/drive-window.vue:
|
|||||||
desktop/views/components/drive.file.vue:
|
desktop/views/components/drive.file.vue:
|
||||||
avatar: "Awatar"
|
avatar: "Awatar"
|
||||||
banner: "Baner"
|
banner: "Baner"
|
||||||
|
nsfw: "閲覧注意"
|
||||||
contextmenu:
|
contextmenu:
|
||||||
rename: "Zmień nazwę"
|
rename: "Zmień nazwę"
|
||||||
mark-as-sensitive: "Oznacz jako zawartość wrażliwą"
|
mark-as-sensitive: "Oznacz jako zawartość wrażliwą"
|
||||||
@ -625,9 +629,11 @@ desktop/views/components/settings.vue:
|
|||||||
circle-icons: "Używaj okrągłych ikon"
|
circle-icons: "Używaj okrągłych ikon"
|
||||||
gradient-window-header: "Używaj gradientów na pasku tytułu okna"
|
gradient-window-header: "Używaj gradientów na pasku tytułu okna"
|
||||||
post-form-on-timeline: "Wyświetlaj formularz tworzenia wpisu w górnej części osi czasu"
|
post-form-on-timeline: "Wyświetlaj formularz tworzenia wpisu w górnej części osi czasu"
|
||||||
|
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||||
show-reply-target: "Pokazuj cel odpowiedzi"
|
show-reply-target: "Pokazuj cel odpowiedzi"
|
||||||
show-my-renotes: "Pokazuj moje udostępnienia na osi czasu"
|
show-my-renotes: "Pokazuj moje udostępnienia na osi czasu"
|
||||||
show-renoted-my-notes: "Pokazuj udostępnienia moich wpisów na osi czasu"
|
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
|
||||||
|
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
|
||||||
show-maps: "Automatycznie pokazuj mapę"
|
show-maps: "Automatycznie pokazuj mapę"
|
||||||
show-maps-desc: "Mapa będzie automatycznie rozwijana dla wpisów zawierających informacje o lokalizacji."
|
show-maps-desc: "Mapa będzie automatycznie rozwijana dla wpisów zawierających informacje o lokalizacji."
|
||||||
sound: "Dźwięk"
|
sound: "Dźwięk"
|
||||||
@ -795,6 +801,7 @@ desktop/views/pages/admin/admin.dashboard.vue:
|
|||||||
original-users: "このインスタンスのユーザー"
|
original-users: "このインスタンスのユーザー"
|
||||||
all-notes: "全てのノート"
|
all-notes: "全てのノート"
|
||||||
original-notes: "このインスタンスのノート"
|
original-notes: "このインスタンスのノート"
|
||||||
|
invite: "招待"
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
desktop/views/pages/admin/admin.suspend-user.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
suspend-user: "ユーザーの凍結"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
@ -803,6 +810,26 @@ desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|||||||
unsuspend-user: "ユーザーの凍結の解除"
|
unsuspend-user: "ユーザーの凍結の解除"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
|
desktop/views/pages/admin/admin.verify-user.vue:
|
||||||
|
verify-user: "ユーザーの公式アカウント設定"
|
||||||
|
verify: "公式アカウントにする"
|
||||||
|
verified: "公式アカウントにしました"
|
||||||
|
desktop/views/pages/admin/admin.unverify-user.vue:
|
||||||
|
unverify-user: "ユーザーの公式アカウント解除"
|
||||||
|
unverify: "公式アカウントを解除する"
|
||||||
|
unverified: "公式アカウントを解除しました"
|
||||||
|
desktop/views/pages/admin/admin.notes-chart.vue:
|
||||||
|
title: "投稿"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
desktop/views/pages/admin/admin.users-chart.vue:
|
||||||
|
title: "ユーザー"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
desktop/views/pages/admin/admin.drive-chart.vue:
|
||||||
|
title: "ドライブ"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "Tylko wpisy z zawartością multimedialną"
|
is-media-only: "Tylko wpisy z zawartością multimedialną"
|
||||||
is-media-view: "Widok multimediów"
|
is-media-view: "Widok multimediów"
|
||||||
@ -835,7 +862,7 @@ desktop/views/pages/selectdrive.vue:
|
|||||||
cancel: "Anuluj"
|
cancel: "Anuluj"
|
||||||
upload: "Wyślij pliki z Twojego komputera"
|
upload: "Wyślij pliki z Twojego komputera"
|
||||||
desktop/views/pages/search.vue:
|
desktop/views/pages/search.vue:
|
||||||
not-available: "Funkcja wyszukiwania nie może zostać wykorzystywana."
|
not-available: "検索機能はインスタンスの設定で無効になっています。"
|
||||||
not-found: "Nie znaleziono wpisów zawierających „{}”"
|
not-found: "Nie znaleziono wpisów zawierających „{}”"
|
||||||
desktop/views/pages/share.vue:
|
desktop/views/pages/share.vue:
|
||||||
share-with: "Udostępnij z {}."
|
share-with: "Udostępnij z {}."
|
||||||
@ -928,12 +955,15 @@ mobile/views/components/drive-file-chooser.vue:
|
|||||||
select-file: "Wybierz plik"
|
select-file: "Wybierz plik"
|
||||||
mobile/views/components/drive-folder-chooser.vue:
|
mobile/views/components/drive-folder-chooser.vue:
|
||||||
select-folder: "Wybierz katalog"
|
select-folder: "Wybierz katalog"
|
||||||
|
mobile/views/components/drive.file.vue:
|
||||||
|
nsfw: "閲覧注意"
|
||||||
mobile/views/components/drive.file-detail.vue:
|
mobile/views/components/drive.file-detail.vue:
|
||||||
download: "Pobierz"
|
download: "Pobierz"
|
||||||
rename: "Zmień nazwę"
|
rename: "Zmień nazwę"
|
||||||
move: "Przenieś"
|
move: "Przenieś"
|
||||||
hash: "Hash (md5)"
|
hash: "Hash (md5)"
|
||||||
exif: "EXIF"
|
exif: "EXIF"
|
||||||
|
nsfw: "閲覧注意"
|
||||||
mobile/views/components/media-image.vue:
|
mobile/views/components/media-image.vue:
|
||||||
sensitive: "To jest zawartość NSFW"
|
sensitive: "To jest zawartość NSFW"
|
||||||
click-to-show: "Naciśnij aby wyświetlić"
|
click-to-show: "Naciśnij aby wyświetlić"
|
||||||
@ -1106,7 +1136,8 @@ mobile/views/pages/settings.vue:
|
|||||||
timeline: "Oś czasu"
|
timeline: "Oś czasu"
|
||||||
show-reply-target: "Pokazuj cel odpowiedzi"
|
show-reply-target: "Pokazuj cel odpowiedzi"
|
||||||
show-my-renotes: "Pokazuj moje udostępnienia"
|
show-my-renotes: "Pokazuj moje udostępnienia"
|
||||||
show-renoted-my-notes: "Pokazuj udostępnienia moich wpisów"
|
show-renoted-my-notes: "自分の投稿のRenoteを表示する"
|
||||||
|
show-local-renotes: "ローカルの投稿のRenoteを表示する"
|
||||||
post-style: "Styl wpisów"
|
post-style: "Styl wpisów"
|
||||||
post-style-standard: "Standardowy"
|
post-style-standard: "Standardowy"
|
||||||
post-style-smart: "Inteligentny"
|
post-style-smart: "Inteligentny"
|
||||||
|
@ -84,7 +84,7 @@ common:
|
|||||||
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
||||||
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
||||||
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
||||||
verified-user: "認証済みのユーザー"
|
verified-user: "公式アカウント"
|
||||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "引き分け"
|
drawn: "引き分け"
|
||||||
@ -287,7 +287,10 @@ common/views/components/signin.vue:
|
|||||||
signin: "サインイン"
|
signin: "サインイン"
|
||||||
or: "または"
|
or: "または"
|
||||||
signin-with-twitter: "Twitterでログイン"
|
signin-with-twitter: "Twitterでログイン"
|
||||||
|
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||||
common/views/components/signup.vue:
|
common/views/components/signup.vue:
|
||||||
|
invitation-code: "招待コード"
|
||||||
|
invitation-info: "招待コードをお持ちでない方は、<a href=\"{}\">管理者</a>までご連絡ください。"
|
||||||
username: "ユーザー名"
|
username: "ユーザー名"
|
||||||
checking: "確認しています..."
|
checking: "確認しています..."
|
||||||
available: "利用できます"
|
available: "利用できます"
|
||||||
@ -440,6 +443,7 @@ desktop/views/components/drive-window.vue:
|
|||||||
desktop/views/components/drive.file.vue:
|
desktop/views/components/drive.file.vue:
|
||||||
avatar: "アイコン"
|
avatar: "アイコン"
|
||||||
banner: "バナー"
|
banner: "バナー"
|
||||||
|
nsfw: "閲覧注意"
|
||||||
contextmenu:
|
contextmenu:
|
||||||
rename: "名前を変更"
|
rename: "名前を変更"
|
||||||
mark-as-sensitive: "閲覧注意に設定"
|
mark-as-sensitive: "閲覧注意に設定"
|
||||||
@ -625,9 +629,11 @@ desktop/views/components/settings.vue:
|
|||||||
circle-icons: "円形のアイコンを使用"
|
circle-icons: "円形のアイコンを使用"
|
||||||
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
||||||
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
||||||
|
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||||
show-reply-target: "リプライ先を表示する"
|
show-reply-target: "リプライ先を表示する"
|
||||||
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
|
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
|
||||||
show-renoted-my-notes: "Renoteされた自分の投稿をタイムラインに表示する"
|
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
|
||||||
|
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
|
||||||
show-maps: "マップの自動展開"
|
show-maps: "マップの自動展開"
|
||||||
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
|
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
|
||||||
sound: "サウンド"
|
sound: "サウンド"
|
||||||
@ -795,6 +801,7 @@ desktop/views/pages/admin/admin.dashboard.vue:
|
|||||||
original-users: "このインスタンスのユーザー"
|
original-users: "このインスタンスのユーザー"
|
||||||
all-notes: "全てのノート"
|
all-notes: "全てのノート"
|
||||||
original-notes: "このインスタンスのノート"
|
original-notes: "このインスタンスのノート"
|
||||||
|
invite: "招待"
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
desktop/views/pages/admin/admin.suspend-user.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
suspend-user: "ユーザーの凍結"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
@ -803,6 +810,26 @@ desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|||||||
unsuspend-user: "ユーザーの凍結の解除"
|
unsuspend-user: "ユーザーの凍結の解除"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
|
desktop/views/pages/admin/admin.verify-user.vue:
|
||||||
|
verify-user: "ユーザーの公式アカウント設定"
|
||||||
|
verify: "公式アカウントにする"
|
||||||
|
verified: "公式アカウントにしました"
|
||||||
|
desktop/views/pages/admin/admin.unverify-user.vue:
|
||||||
|
unverify-user: "ユーザーの公式アカウント解除"
|
||||||
|
unverify: "公式アカウントを解除する"
|
||||||
|
unverified: "公式アカウントを解除しました"
|
||||||
|
desktop/views/pages/admin/admin.notes-chart.vue:
|
||||||
|
title: "投稿"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
desktop/views/pages/admin/admin.users-chart.vue:
|
||||||
|
title: "ユーザー"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
desktop/views/pages/admin/admin.drive-chart.vue:
|
||||||
|
title: "ドライブ"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "メディア投稿のみ"
|
is-media-only: "メディア投稿のみ"
|
||||||
is-media-view: "メディアビュー"
|
is-media-view: "メディアビュー"
|
||||||
@ -835,7 +862,7 @@ desktop/views/pages/selectdrive.vue:
|
|||||||
cancel: "キャンセル"
|
cancel: "キャンセル"
|
||||||
upload: "PCからドライブにファイルをアップロード"
|
upload: "PCからドライブにファイルをアップロード"
|
||||||
desktop/views/pages/search.vue:
|
desktop/views/pages/search.vue:
|
||||||
not-available: "検索機能を利用することができません。"
|
not-available: "検索機能はインスタンスの設定で無効になっています。"
|
||||||
not-found: "「{}」に関する投稿は見つかりませんでした。"
|
not-found: "「{}」に関する投稿は見つかりませんでした。"
|
||||||
desktop/views/pages/share.vue:
|
desktop/views/pages/share.vue:
|
||||||
share-with: "{}で共有"
|
share-with: "{}で共有"
|
||||||
@ -928,12 +955,15 @@ mobile/views/components/drive-file-chooser.vue:
|
|||||||
select-file: "ファイルを選択"
|
select-file: "ファイルを選択"
|
||||||
mobile/views/components/drive-folder-chooser.vue:
|
mobile/views/components/drive-folder-chooser.vue:
|
||||||
select-folder: "フォルダーを選択"
|
select-folder: "フォルダーを選択"
|
||||||
|
mobile/views/components/drive.file.vue:
|
||||||
|
nsfw: "閲覧注意"
|
||||||
mobile/views/components/drive.file-detail.vue:
|
mobile/views/components/drive.file-detail.vue:
|
||||||
download: "ダウンロード"
|
download: "ダウンロード"
|
||||||
rename: "名前を変更"
|
rename: "名前を変更"
|
||||||
move: "移動"
|
move: "移動"
|
||||||
hash: "ハッシュ (md5)"
|
hash: "ハッシュ (md5)"
|
||||||
exif: "EXIF"
|
exif: "EXIF"
|
||||||
|
nsfw: "閲覧注意"
|
||||||
mobile/views/components/media-image.vue:
|
mobile/views/components/media-image.vue:
|
||||||
sensitive: "閲覧注意"
|
sensitive: "閲覧注意"
|
||||||
click-to-show: "クリックして表示"
|
click-to-show: "クリックして表示"
|
||||||
@ -1106,7 +1136,8 @@ mobile/views/pages/settings.vue:
|
|||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
show-reply-target: "リプライ先を表示する"
|
show-reply-target: "リプライ先を表示する"
|
||||||
show-my-renotes: "自分の行ったRenoteを表示する"
|
show-my-renotes: "自分の行ったRenoteを表示する"
|
||||||
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
|
show-renoted-my-notes: "自分の投稿のRenoteを表示する"
|
||||||
|
show-local-renotes: "ローカルの投稿のRenoteを表示する"
|
||||||
post-style: "投稿の表示スタイル"
|
post-style: "投稿の表示スタイル"
|
||||||
post-style-standard: "標準"
|
post-style-standard: "標準"
|
||||||
post-style-smart: "スマート"
|
post-style-smart: "スマート"
|
||||||
|
@ -84,7 +84,7 @@ common:
|
|||||||
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
||||||
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
||||||
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
||||||
verified-user: "認証済みのユーザー"
|
verified-user: "公式アカウント"
|
||||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "引き分け"
|
drawn: "引き分け"
|
||||||
@ -287,7 +287,10 @@ common/views/components/signin.vue:
|
|||||||
signin: "サインイン"
|
signin: "サインイン"
|
||||||
or: "または"
|
or: "または"
|
||||||
signin-with-twitter: "Twitterでログイン"
|
signin-with-twitter: "Twitterでログイン"
|
||||||
|
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||||
common/views/components/signup.vue:
|
common/views/components/signup.vue:
|
||||||
|
invitation-code: "招待コード"
|
||||||
|
invitation-info: "招待コードをお持ちでない方は、<a href=\"{}\">管理者</a>までご連絡ください。"
|
||||||
username: "ユーザー名"
|
username: "ユーザー名"
|
||||||
checking: "確認しています..."
|
checking: "確認しています..."
|
||||||
available: "利用できます"
|
available: "利用できます"
|
||||||
@ -440,6 +443,7 @@ desktop/views/components/drive-window.vue:
|
|||||||
desktop/views/components/drive.file.vue:
|
desktop/views/components/drive.file.vue:
|
||||||
avatar: "アイコン"
|
avatar: "アイコン"
|
||||||
banner: "バナー"
|
banner: "バナー"
|
||||||
|
nsfw: "閲覧注意"
|
||||||
contextmenu:
|
contextmenu:
|
||||||
rename: "名前を変更"
|
rename: "名前を変更"
|
||||||
mark-as-sensitive: "閲覧注意に設定"
|
mark-as-sensitive: "閲覧注意に設定"
|
||||||
@ -625,9 +629,11 @@ desktop/views/components/settings.vue:
|
|||||||
circle-icons: "円形のアイコンを使用"
|
circle-icons: "円形のアイコンを使用"
|
||||||
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
||||||
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
||||||
|
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||||
show-reply-target: "リプライ先を表示する"
|
show-reply-target: "リプライ先を表示する"
|
||||||
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
|
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
|
||||||
show-renoted-my-notes: "Renoteされた自分の投稿をタイムラインに表示する"
|
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
|
||||||
|
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
|
||||||
show-maps: "マップの自動展開"
|
show-maps: "マップの自動展開"
|
||||||
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
|
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
|
||||||
sound: "サウンド"
|
sound: "サウンド"
|
||||||
@ -795,6 +801,7 @@ desktop/views/pages/admin/admin.dashboard.vue:
|
|||||||
original-users: "このインスタンスのユーザー"
|
original-users: "このインスタンスのユーザー"
|
||||||
all-notes: "全てのノート"
|
all-notes: "全てのノート"
|
||||||
original-notes: "このインスタンスのノート"
|
original-notes: "このインスタンスのノート"
|
||||||
|
invite: "招待"
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
desktop/views/pages/admin/admin.suspend-user.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
suspend-user: "ユーザーの凍結"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
@ -803,6 +810,26 @@ desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|||||||
unsuspend-user: "ユーザーの凍結の解除"
|
unsuspend-user: "ユーザーの凍結の解除"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
|
desktop/views/pages/admin/admin.verify-user.vue:
|
||||||
|
verify-user: "ユーザーの公式アカウント設定"
|
||||||
|
verify: "公式アカウントにする"
|
||||||
|
verified: "公式アカウントにしました"
|
||||||
|
desktop/views/pages/admin/admin.unverify-user.vue:
|
||||||
|
unverify-user: "ユーザーの公式アカウント解除"
|
||||||
|
unverify: "公式アカウントを解除する"
|
||||||
|
unverified: "公式アカウントを解除しました"
|
||||||
|
desktop/views/pages/admin/admin.notes-chart.vue:
|
||||||
|
title: "投稿"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
desktop/views/pages/admin/admin.users-chart.vue:
|
||||||
|
title: "ユーザー"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
desktop/views/pages/admin/admin.drive-chart.vue:
|
||||||
|
title: "ドライブ"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "メディア投稿のみ"
|
is-media-only: "メディア投稿のみ"
|
||||||
is-media-view: "メディアビュー"
|
is-media-view: "メディアビュー"
|
||||||
@ -835,7 +862,7 @@ desktop/views/pages/selectdrive.vue:
|
|||||||
cancel: "キャンセル"
|
cancel: "キャンセル"
|
||||||
upload: "PCからドライブにファイルをアップロード"
|
upload: "PCからドライブにファイルをアップロード"
|
||||||
desktop/views/pages/search.vue:
|
desktop/views/pages/search.vue:
|
||||||
not-available: "検索機能を利用することができません。"
|
not-available: "検索機能はインスタンスの設定で無効になっています。"
|
||||||
not-found: "「{}」に関する投稿は見つかりませんでした。"
|
not-found: "「{}」に関する投稿は見つかりませんでした。"
|
||||||
desktop/views/pages/share.vue:
|
desktop/views/pages/share.vue:
|
||||||
share-with: "{}で共有"
|
share-with: "{}で共有"
|
||||||
@ -928,12 +955,15 @@ mobile/views/components/drive-file-chooser.vue:
|
|||||||
select-file: "ファイルを選択"
|
select-file: "ファイルを選択"
|
||||||
mobile/views/components/drive-folder-chooser.vue:
|
mobile/views/components/drive-folder-chooser.vue:
|
||||||
select-folder: "フォルダーを選択"
|
select-folder: "フォルダーを選択"
|
||||||
|
mobile/views/components/drive.file.vue:
|
||||||
|
nsfw: "閲覧注意"
|
||||||
mobile/views/components/drive.file-detail.vue:
|
mobile/views/components/drive.file-detail.vue:
|
||||||
download: "ダウンロード"
|
download: "ダウンロード"
|
||||||
rename: "名前を変更"
|
rename: "名前を変更"
|
||||||
move: "移動"
|
move: "移動"
|
||||||
hash: "ハッシュ (md5)"
|
hash: "ハッシュ (md5)"
|
||||||
exif: "EXIF"
|
exif: "EXIF"
|
||||||
|
nsfw: "閲覧注意"
|
||||||
mobile/views/components/media-image.vue:
|
mobile/views/components/media-image.vue:
|
||||||
sensitive: "閲覧注意"
|
sensitive: "閲覧注意"
|
||||||
click-to-show: "クリックして表示"
|
click-to-show: "クリックして表示"
|
||||||
@ -1106,7 +1136,8 @@ mobile/views/pages/settings.vue:
|
|||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
show-reply-target: "リプライ先を表示する"
|
show-reply-target: "リプライ先を表示する"
|
||||||
show-my-renotes: "自分の行ったRenoteを表示する"
|
show-my-renotes: "自分の行ったRenoteを表示する"
|
||||||
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
|
show-renoted-my-notes: "自分の投稿のRenoteを表示する"
|
||||||
|
show-local-renotes: "ローカルの投稿のRenoteを表示する"
|
||||||
post-style: "投稿の表示スタイル"
|
post-style: "投稿の表示スタイル"
|
||||||
post-style-standard: "標準"
|
post-style-standard: "標準"
|
||||||
post-style-smart: "スマート"
|
post-style-smart: "スマート"
|
||||||
|
@ -84,7 +84,7 @@ common:
|
|||||||
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
||||||
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
||||||
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
||||||
verified-user: "認証済みのユーザー"
|
verified-user: "公式アカウント"
|
||||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "引き分け"
|
drawn: "引き分け"
|
||||||
@ -287,7 +287,10 @@ common/views/components/signin.vue:
|
|||||||
signin: "サインイン"
|
signin: "サインイン"
|
||||||
or: "または"
|
or: "または"
|
||||||
signin-with-twitter: "Twitterでログイン"
|
signin-with-twitter: "Twitterでログイン"
|
||||||
|
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||||
common/views/components/signup.vue:
|
common/views/components/signup.vue:
|
||||||
|
invitation-code: "招待コード"
|
||||||
|
invitation-info: "招待コードをお持ちでない方は、<a href=\"{}\">管理者</a>までご連絡ください。"
|
||||||
username: "ユーザー名"
|
username: "ユーザー名"
|
||||||
checking: "確認しています..."
|
checking: "確認しています..."
|
||||||
available: "利用できます"
|
available: "利用できます"
|
||||||
@ -440,6 +443,7 @@ desktop/views/components/drive-window.vue:
|
|||||||
desktop/views/components/drive.file.vue:
|
desktop/views/components/drive.file.vue:
|
||||||
avatar: "アイコン"
|
avatar: "アイコン"
|
||||||
banner: "バナー"
|
banner: "バナー"
|
||||||
|
nsfw: "閲覧注意"
|
||||||
contextmenu:
|
contextmenu:
|
||||||
rename: "名前を変更"
|
rename: "名前を変更"
|
||||||
mark-as-sensitive: "閲覧注意に設定"
|
mark-as-sensitive: "閲覧注意に設定"
|
||||||
@ -625,9 +629,11 @@ desktop/views/components/settings.vue:
|
|||||||
circle-icons: "円形のアイコンを使用"
|
circle-icons: "円形のアイコンを使用"
|
||||||
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
||||||
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
||||||
|
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||||
show-reply-target: "リプライ先を表示する"
|
show-reply-target: "リプライ先を表示する"
|
||||||
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
|
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
|
||||||
show-renoted-my-notes: "Renoteされた自分の投稿をタイムラインに表示する"
|
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
|
||||||
|
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
|
||||||
show-maps: "マップの自動展開"
|
show-maps: "マップの自動展開"
|
||||||
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
|
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
|
||||||
sound: "サウンド"
|
sound: "サウンド"
|
||||||
@ -795,6 +801,7 @@ desktop/views/pages/admin/admin.dashboard.vue:
|
|||||||
original-users: "このインスタンスのユーザー"
|
original-users: "このインスタンスのユーザー"
|
||||||
all-notes: "全てのノート"
|
all-notes: "全てのノート"
|
||||||
original-notes: "このインスタンスのノート"
|
original-notes: "このインスタンスのノート"
|
||||||
|
invite: "招待"
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
desktop/views/pages/admin/admin.suspend-user.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
suspend-user: "ユーザーの凍結"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
@ -803,6 +810,26 @@ desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|||||||
unsuspend-user: "ユーザーの凍結の解除"
|
unsuspend-user: "ユーザーの凍結の解除"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
|
desktop/views/pages/admin/admin.verify-user.vue:
|
||||||
|
verify-user: "ユーザーの公式アカウント設定"
|
||||||
|
verify: "公式アカウントにする"
|
||||||
|
verified: "公式アカウントにしました"
|
||||||
|
desktop/views/pages/admin/admin.unverify-user.vue:
|
||||||
|
unverify-user: "ユーザーの公式アカウント解除"
|
||||||
|
unverify: "公式アカウントを解除する"
|
||||||
|
unverified: "公式アカウントを解除しました"
|
||||||
|
desktop/views/pages/admin/admin.notes-chart.vue:
|
||||||
|
title: "投稿"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
desktop/views/pages/admin/admin.users-chart.vue:
|
||||||
|
title: "ユーザー"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
desktop/views/pages/admin/admin.drive-chart.vue:
|
||||||
|
title: "ドライブ"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "メディア投稿のみ"
|
is-media-only: "メディア投稿のみ"
|
||||||
is-media-view: "メディアビュー"
|
is-media-view: "メディアビュー"
|
||||||
@ -835,7 +862,7 @@ desktop/views/pages/selectdrive.vue:
|
|||||||
cancel: "キャンセル"
|
cancel: "キャンセル"
|
||||||
upload: "PCからドライブにファイルをアップロード"
|
upload: "PCからドライブにファイルをアップロード"
|
||||||
desktop/views/pages/search.vue:
|
desktop/views/pages/search.vue:
|
||||||
not-available: "検索機能を利用することができません。"
|
not-available: "検索機能はインスタンスの設定で無効になっています。"
|
||||||
not-found: "「{}」に関する投稿は見つかりませんでした。"
|
not-found: "「{}」に関する投稿は見つかりませんでした。"
|
||||||
desktop/views/pages/share.vue:
|
desktop/views/pages/share.vue:
|
||||||
share-with: "{}で共有"
|
share-with: "{}で共有"
|
||||||
@ -928,12 +955,15 @@ mobile/views/components/drive-file-chooser.vue:
|
|||||||
select-file: "ファイルを選択"
|
select-file: "ファイルを選択"
|
||||||
mobile/views/components/drive-folder-chooser.vue:
|
mobile/views/components/drive-folder-chooser.vue:
|
||||||
select-folder: "フォルダーを選択"
|
select-folder: "フォルダーを選択"
|
||||||
|
mobile/views/components/drive.file.vue:
|
||||||
|
nsfw: "閲覧注意"
|
||||||
mobile/views/components/drive.file-detail.vue:
|
mobile/views/components/drive.file-detail.vue:
|
||||||
download: "ダウンロード"
|
download: "ダウンロード"
|
||||||
rename: "名前を変更"
|
rename: "名前を変更"
|
||||||
move: "移動"
|
move: "移動"
|
||||||
hash: "ハッシュ (md5)"
|
hash: "ハッシュ (md5)"
|
||||||
exif: "EXIF"
|
exif: "EXIF"
|
||||||
|
nsfw: "閲覧注意"
|
||||||
mobile/views/components/media-image.vue:
|
mobile/views/components/media-image.vue:
|
||||||
sensitive: "閲覧注意"
|
sensitive: "閲覧注意"
|
||||||
click-to-show: "クリックして表示"
|
click-to-show: "クリックして表示"
|
||||||
@ -1106,7 +1136,8 @@ mobile/views/pages/settings.vue:
|
|||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
show-reply-target: "リプライ先を表示する"
|
show-reply-target: "リプライ先を表示する"
|
||||||
show-my-renotes: "自分の行ったRenoteを表示する"
|
show-my-renotes: "自分の行ったRenoteを表示する"
|
||||||
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
|
show-renoted-my-notes: "自分の投稿のRenoteを表示する"
|
||||||
|
show-local-renotes: "ローカルの投稿のRenoteを表示する"
|
||||||
post-style: "投稿の表示スタイル"
|
post-style: "投稿の表示スタイル"
|
||||||
post-style-standard: "標準"
|
post-style-standard: "標準"
|
||||||
post-style-smart: "スマート"
|
post-style-smart: "スマート"
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"name": "misskey",
|
"name": "misskey",
|
||||||
"author": "syuilo <i@syuilo.com>",
|
"author": "syuilo <i@syuilo.com>",
|
||||||
"version": "6.0.2",
|
"version": "7.1.0",
|
||||||
"clientVersion": "1.0.8367",
|
"clientVersion": "1.0.8685",
|
||||||
"codename": "nighthike",
|
"codename": "nighthike",
|
||||||
"main": "./built/index.js",
|
"main": "./built/index.js",
|
||||||
"private": true,
|
"private": true,
|
||||||
@ -126,7 +126,7 @@
|
|||||||
"gulp-util": "3.0.8",
|
"gulp-util": "3.0.8",
|
||||||
"hard-source-webpack-plugin": "0.12.0",
|
"hard-source-webpack-plugin": "0.12.0",
|
||||||
"highlight.js": "9.12.0",
|
"highlight.js": "9.12.0",
|
||||||
"html-minifier": "3.5.19",
|
"html-minifier": "3.5.20",
|
||||||
"http-signature": "1.2.0",
|
"http-signature": "1.2.0",
|
||||||
"insert-text-at-cursor": "0.1.1",
|
"insert-text-at-cursor": "0.1.1",
|
||||||
"is-root": "2.0.0",
|
"is-root": "2.0.0",
|
||||||
@ -201,7 +201,7 @@
|
|||||||
"typescript": "2.9.2",
|
"typescript": "2.9.2",
|
||||||
"typescript-eslint-parser": "18.0.0",
|
"typescript-eslint-parser": "18.0.0",
|
||||||
"uglify-es": "3.3.9",
|
"uglify-es": "3.3.9",
|
||||||
"url-loader": "1.1.0",
|
"url-loader": "1.1.1",
|
||||||
"uuid": "3.3.2",
|
"uuid": "3.3.2",
|
||||||
"v-animate-css": "0.0.2",
|
"v-animate-css": "0.0.2",
|
||||||
"vue": "2.5.17",
|
"vue": "2.5.17",
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<div class="app">
|
<div class="app">
|
||||||
<section>
|
<section>
|
||||||
<h2>{{ app.name }}</h2>
|
<h2>{{ app.name }}</h2>
|
||||||
<p class="nid">{{ app.nameId }}</p>
|
<p class="id">{{ app.id }}</p>
|
||||||
<p class="description">{{ app.description }}</p>
|
<p class="description">{{ app.description }}</p>
|
||||||
</section>
|
</section>
|
||||||
<section>
|
<section>
|
||||||
|
10
src/client/app/common/scripts/get-face.ts
Normal file
10
src/client/app/common/scripts/get-face.ts
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
const faces = [
|
||||||
|
'(=^・・^=)',
|
||||||
|
'v(\'ω\')v',
|
||||||
|
'🐡( \'-\' 🐡 )フグパンチ!!!!',
|
||||||
|
'🖕(´・_・`)🖕',
|
||||||
|
'(。>﹏<。)',
|
||||||
|
'(Δ・x・Δ)'
|
||||||
|
];
|
||||||
|
|
||||||
|
export default () => faces[Math.floor(Math.random() * faces.length)];
|
@ -1,9 +0,0 @@
|
|||||||
const kaos = [
|
|
||||||
'(=^・・^=)',
|
|
||||||
'v(\'ω\')v',
|
|
||||||
'🐡( \'-\' 🐡 )フグパンチ!!!!',
|
|
||||||
'🖕(´・_・`)🖕',
|
|
||||||
'(。>﹏<。)'
|
|
||||||
];
|
|
||||||
|
|
||||||
export default () => kaos[Math.floor(Math.random() * kaos.length)];
|
|
@ -32,6 +32,7 @@
|
|||||||
<mk-avatar class="avatar" :user="g.user2"/>
|
<mk-avatar class="avatar" :user="g.user2"/>
|
||||||
<span><b>{{ g.user1 | userName }}</b> vs <b>{{ g.user2 | userName }}</b></span>
|
<span><b>{{ g.user1 | userName }}</b> vs <b>{{ g.user2 | userName }}</b></span>
|
||||||
<span class="state">{{ g.isEnded ? '%i18n:@game-state.ended%' : '%i18n:@game-state.playing%' }}</span>
|
<span class="state">{{ g.isEnded ? '%i18n:@game-state.ended%' : '%i18n:@game-state.playing%' }}</span>
|
||||||
|
<mk-time :time="g.createdAt" />
|
||||||
</a>
|
</a>
|
||||||
</section>
|
</section>
|
||||||
<section v-if="games.length > 0">
|
<section v-if="games.length > 0">
|
||||||
@ -41,6 +42,7 @@
|
|||||||
<mk-avatar class="avatar" :user="g.user2"/>
|
<mk-avatar class="avatar" :user="g.user2"/>
|
||||||
<span><b>{{ g.user1 | userName }}</b> vs <b>{{ g.user2 | userName }}</b></span>
|
<span><b>{{ g.user1 | userName }}</b> vs <b>{{ g.user2 | userName }}</b></span>
|
||||||
<span class="state">{{ g.isEnded ? '%i18n:@game-state.ended%' : '%i18n:@game-state.playing%' }}</span>
|
<span class="state">{{ g.isEnded ? '%i18n:@game-state.ended%' : '%i18n:@game-state.playing%' }}</span>
|
||||||
|
<mk-time :time="g.createdAt" />
|
||||||
</a>
|
</a>
|
||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
|
@ -12,13 +12,13 @@
|
|||||||
</ui-input>
|
</ui-input>
|
||||||
<ui-input v-if="user && user.twoFactorEnabled" v-model="token" type="number" required/>
|
<ui-input v-if="user && user.twoFactorEnabled" v-model="token" type="number" required/>
|
||||||
<ui-button type="submit" :disabled="signing">{{ signing ? '%i18n:@signing-in%' : '%i18n:@signin%' }}</ui-button>
|
<ui-button type="submit" :disabled="signing">{{ signing ? '%i18n:@signing-in%' : '%i18n:@signin%' }}</ui-button>
|
||||||
<p style="margin: 8px 0;" v-if="twitterIntegration">%i18n:@or%<a :href="`${apiUrl}/signin/twitter`">%i18n:@signin-with-twitter%</a></p>
|
<p style="margin: 8px 0;">%i18n:@or% <a :href="`${apiUrl}/signin/twitter`">%i18n:@signin-with-twitter%</a></p>
|
||||||
</form>
|
</form>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import { apiUrl, host, twitterIntegration } from '../../../config';
|
import { apiUrl, host } from '../../../config';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
props: {
|
props: {
|
||||||
@ -60,7 +60,7 @@ export default Vue.extend({
|
|||||||
}).then(() => {
|
}).then(() => {
|
||||||
location.reload();
|
location.reload();
|
||||||
}).catch(() => {
|
}).catch(() => {
|
||||||
alert('something happened');
|
alert('%i18n:@login-failed%');
|
||||||
this.signing = false;
|
this.signing = false;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,10 @@
|
|||||||
<template>
|
<template>
|
||||||
<form class="mk-signup" @submit.prevent="onSubmit" :autocomplete="Math.random()">
|
<form class="mk-signup" @submit.prevent="onSubmit" :autocomplete="Math.random()">
|
||||||
|
<ui-input v-if="meta.disableRegistration" v-model="invitationCode" type="text" :autocomplete="Math.random()" spellcheck="false" required>
|
||||||
|
<span>%i18n:@invitation-code%</span>
|
||||||
|
<span slot="prefix">%fa:id-card-alt%</span>
|
||||||
|
<p slot="text" v-html="'%i18n:@invitation-info%'.replace('{}', meta.maintainer.url)"></p>
|
||||||
|
</ui-input>
|
||||||
<ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]{1,20}$" :autocomplete="Math.random()" spellcheck="false" required @input="onChangeUsername">
|
<ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]{1,20}$" :autocomplete="Math.random()" spellcheck="false" required @input="onChangeUsername">
|
||||||
<span>%i18n:@username%</span>
|
<span>%i18n:@username%</span>
|
||||||
<span slot="prefix">@</span>
|
<span slot="prefix">@</span>
|
||||||
@ -29,7 +34,7 @@
|
|||||||
<p slot="text" v-if="passwordRetypeState == 'not-match'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@password-not-matched%</p>
|
<p slot="text" v-if="passwordRetypeState == 'not-match'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@password-not-matched%</p>
|
||||||
</div>
|
</div>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
<div v-if="recaptchaSitekey != null" class="g-recaptcha" :data-sitekey="recaptchaSitekey" style="margin: 16px 0;"></div>
|
<div v-if="meta && meta.recaptchaSitekey != null" class="g-recaptcha" :data-sitekey="meta.recaptchaSitekey" style="margin: 16px 0;"></div>
|
||||||
<ui-button type="submit">%i18n:@create%</ui-button>
|
<ui-button type="submit">%i18n:@create%</ui-button>
|
||||||
</form>
|
</form>
|
||||||
</template>
|
</template>
|
||||||
@ -37,7 +42,7 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
const getPasswordStrength = require('syuilo-password-strength');
|
const getPasswordStrength = require('syuilo-password-strength');
|
||||||
import { host, url, recaptchaSitekey } from '../../../config';
|
import { host, url } from '../../../config';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
data() {
|
data() {
|
||||||
@ -46,11 +51,12 @@ export default Vue.extend({
|
|||||||
username: '',
|
username: '',
|
||||||
password: '',
|
password: '',
|
||||||
retypedPassword: '',
|
retypedPassword: '',
|
||||||
|
invitationCode: '',
|
||||||
url,
|
url,
|
||||||
recaptchaSitekey,
|
|
||||||
usernameState: null,
|
usernameState: null,
|
||||||
passwordStrength: '',
|
passwordStrength: '',
|
||||||
passwordRetypeState: null
|
passwordRetypeState: null,
|
||||||
|
meta: null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
@ -61,6 +67,17 @@ export default Vue.extend({
|
|||||||
this.usernameState != 'max-range');
|
this.usernameState != 'max-range');
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
created() {
|
||||||
|
(this as any).os.getMeta().then(meta => {
|
||||||
|
this.meta = meta;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
const head = document.getElementsByTagName('head')[0];
|
||||||
|
const script = document.createElement('script');
|
||||||
|
script.setAttribute('src', 'https://www.google.com/recaptcha/api.js');
|
||||||
|
head.appendChild(script);
|
||||||
|
},
|
||||||
methods: {
|
methods: {
|
||||||
onChangeUsername() {
|
onChangeUsername() {
|
||||||
if (this.username == '') {
|
if (this.username == '') {
|
||||||
@ -110,7 +127,8 @@ export default Vue.extend({
|
|||||||
(this as any).api('signup', {
|
(this as any).api('signup', {
|
||||||
username: this.username,
|
username: this.username,
|
||||||
password: this.password,
|
password: this.password,
|
||||||
'g-recaptcha-response': recaptchaSitekey != null ? (window as any).grecaptcha.getResponse() : null
|
invitationCode: this.invitationCode,
|
||||||
|
'g-recaptcha-response': this.meta.recaptchaSitekey != null ? (window as any).grecaptcha.getResponse() : null
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
(this as any).api('signin', {
|
(this as any).api('signin', {
|
||||||
username: this.username,
|
username: this.username,
|
||||||
@ -121,19 +139,11 @@ export default Vue.extend({
|
|||||||
}).catch(() => {
|
}).catch(() => {
|
||||||
alert('%i18n:@some-error%');
|
alert('%i18n:@some-error%');
|
||||||
|
|
||||||
if (recaptchaSitekey != null) {
|
if (this.meta.recaptchaSitekey != null) {
|
||||||
(window as any).grecaptcha.reset();
|
(window as any).grecaptcha.reset();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
},
|
|
||||||
mounted() {
|
|
||||||
if (recaptchaSitekey != null) {
|
|
||||||
const head = document.getElementsByTagName('head')[0];
|
|
||||||
const script = document.createElement('script');
|
|
||||||
script.setAttribute('src', 'https://www.google.com/recaptcha/api.js');
|
|
||||||
head.appendChild(script);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
@ -44,7 +44,12 @@ import Vue from 'vue';
|
|||||||
import * as anime from 'animejs';
|
import * as anime from 'animejs';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
props: ['source', 'compact', 'v'],
|
props: ['source', 'compact'],
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
v: this.$store.state.device.visibility || 'public'
|
||||||
|
}
|
||||||
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
const popover = this.$refs.popover as any;
|
const popover = this.$refs.popover as any;
|
||||||
@ -92,6 +97,7 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
choose(visibility) {
|
choose(visibility) {
|
||||||
|
this.$store.commit('device/setVisibility', visibility);
|
||||||
this.$emit('chosen', visibility);
|
this.$emit('chosen', visibility);
|
||||||
this.$destroy();
|
this.$destroy();
|
||||||
},
|
},
|
||||||
|
@ -122,7 +122,7 @@ export default Vue.extend({
|
|||||||
this.memP = (stats.mem.used / stats.mem.total * 100).toFixed(0);
|
this.memP = (stats.mem.used / stats.mem.total * 100).toFixed(0);
|
||||||
},
|
},
|
||||||
onStatsLog(statsLog) {
|
onStatsLog(statsLog) {
|
||||||
statsLog.forEach(stats => this.onStats(stats));
|
statsLog.reverse().forEach(stats => this.onStats(stats));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -1,51 +1,22 @@
|
|||||||
declare const _HOST_: string;
|
|
||||||
declare const _HOSTNAME_: string;
|
|
||||||
declare const _URL_: string;
|
|
||||||
declare const _NAME_: string;
|
|
||||||
declare const _DESCRIPTION_: string;
|
|
||||||
declare const _API_URL_: string;
|
|
||||||
declare const _WS_URL_: string;
|
|
||||||
declare const _DOCS_URL_: string;
|
|
||||||
declare const _STATS_URL_: string;
|
|
||||||
declare const _STATUS_URL_: string;
|
|
||||||
declare const _DEV_URL_: string;
|
|
||||||
declare const _REPOSITORY_URL_: string;
|
|
||||||
declare const _FEEDBACK_URL_: string;
|
|
||||||
declare const _LANG_: string;
|
declare const _LANG_: string;
|
||||||
declare const _LANGS_: string;
|
declare const _LANGS_: string;
|
||||||
declare const _RECAPTCHA_SITEKEY_: string;
|
|
||||||
declare const _SW_PUBLICKEY_: string;
|
|
||||||
declare const _THEME_COLOR_: string;
|
declare const _THEME_COLOR_: string;
|
||||||
declare const _COPYRIGHT_: string;
|
declare const _COPYRIGHT_: string;
|
||||||
declare const _VERSION_: string;
|
declare const _VERSION_: string;
|
||||||
declare const _CODENAME_: string;
|
declare const _CODENAME_: string;
|
||||||
declare const _LICENSE_: string;
|
declare const _LICENSE_: string;
|
||||||
declare const _GOOGLE_MAPS_API_KEY_: string;
|
|
||||||
declare const _WELCOME_BG_URL_: string;
|
|
||||||
declare const _TWITTER_INTEGRATION_: boolean;
|
|
||||||
|
|
||||||
export const host = _HOST_;
|
const address = new URL(location.href);
|
||||||
export const hostname = _HOSTNAME_;
|
|
||||||
export const url = _URL_;
|
export const host = address.host;
|
||||||
export const name = _NAME_;
|
export const hostname = address.hostname;
|
||||||
export const description = _DESCRIPTION_;
|
export const url = address.origin;
|
||||||
export const apiUrl = _API_URL_;
|
export const apiUrl = url + '/api';
|
||||||
export const wsUrl = _WS_URL_;
|
export const wsUrl = url.replace('http://', 'ws://').replace('https://', 'wss://');
|
||||||
export const docsUrl = _DOCS_URL_;
|
|
||||||
export const statsUrl = _STATS_URL_;
|
|
||||||
export const statusUrl = _STATUS_URL_;
|
|
||||||
export const devUrl = _DEV_URL_;
|
|
||||||
export const repositoryUrl = _REPOSITORY_URL_;
|
|
||||||
export const feedbackUrl = _FEEDBACK_URL_;
|
|
||||||
export const lang = _LANG_;
|
export const lang = _LANG_;
|
||||||
export const langs = _LANGS_;
|
export const langs = _LANGS_;
|
||||||
export const recaptchaSitekey = _RECAPTCHA_SITEKEY_;
|
|
||||||
export const swPublickey = _SW_PUBLICKEY_;
|
|
||||||
export const themeColor = _THEME_COLOR_;
|
export const themeColor = _THEME_COLOR_;
|
||||||
export const copyright = _COPYRIGHT_;
|
export const copyright = _COPYRIGHT_;
|
||||||
export const version = _VERSION_;
|
export const version = _VERSION_;
|
||||||
export const codename = _CODENAME_;
|
export const codename = _CODENAME_;
|
||||||
export const license = _LICENSE_;
|
export const license = _LICENSE_;
|
||||||
export const googleMapsApiKey = _GOOGLE_MAPS_API_KEY_;
|
|
||||||
export const welcomeBgUrl = _WELCOME_BG_URL_;
|
|
||||||
export const twitterIntegration = _TWITTER_INTEGRATION_;
|
|
||||||
|
@ -9,12 +9,18 @@
|
|||||||
@contextmenu.prevent.stop="onContextmenu"
|
@contextmenu.prevent.stop="onContextmenu"
|
||||||
:title="title"
|
:title="title"
|
||||||
>
|
>
|
||||||
<div class="label" v-if="$store.state.i.avatarId == file.id"><img src="/assets/label.svg"/>
|
<div class="label" v-if="$store.state.i.avatarId == file.id">
|
||||||
|
<img src="/assets/label.svg"/>
|
||||||
<p>%i18n:@avatar%</p>
|
<p>%i18n:@avatar%</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="label" v-if="$store.state.i.bannerId == file.id"><img src="/assets/label.svg"/>
|
<div class="label" v-if="$store.state.i.bannerId == file.id">
|
||||||
|
<img src="/assets/label.svg"/>
|
||||||
<p>%i18n:@banner%</p>
|
<p>%i18n:@banner%</p>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="label red" v-if="file.isSensitive">
|
||||||
|
<img src="/assets/label-red.svg"/>
|
||||||
|
<p>%i18n:@nsfw%</p>
|
||||||
|
</div>
|
||||||
<div class="thumbnail" ref="thumbnail" :style="`background-color: ${ background }`">
|
<div class="thumbnail" ref="thumbnail" :style="`background-color: ${ background }`">
|
||||||
<img :src="file.thumbnailUrl" alt="" @load="onThumbnailLoaded"/>
|
<img :src="file.thumbnailUrl" alt="" @load="onThumbnailLoaded"/>
|
||||||
</div>
|
</div>
|
||||||
@ -212,6 +218,11 @@ root(isDark)
|
|||||||
&:after
|
&:after
|
||||||
background #0b65a5
|
background #0b65a5
|
||||||
|
|
||||||
|
&.red
|
||||||
|
&:before
|
||||||
|
&:after
|
||||||
|
background #c12113
|
||||||
|
|
||||||
&:active
|
&:active
|
||||||
background rgba(#000, 0.1)
|
background rgba(#000, 0.1)
|
||||||
|
|
||||||
@ -220,6 +231,11 @@ root(isDark)
|
|||||||
&:after
|
&:after
|
||||||
background #0b588c
|
background #0b588c
|
||||||
|
|
||||||
|
&.red
|
||||||
|
&:before
|
||||||
|
&:after
|
||||||
|
background #ce2212
|
||||||
|
|
||||||
&[data-is-selected]
|
&[data-is-selected]
|
||||||
background $theme-color
|
background $theme-color
|
||||||
|
|
||||||
@ -256,26 +272,29 @@ root(isDark)
|
|||||||
pointer-events none
|
pointer-events none
|
||||||
|
|
||||||
&:before
|
&:before
|
||||||
content ""
|
|
||||||
display block
|
|
||||||
position absolute
|
|
||||||
z-index 1
|
|
||||||
top 0
|
|
||||||
left 57px
|
|
||||||
width 28px
|
|
||||||
height 8px
|
|
||||||
background #0c7ac9
|
|
||||||
|
|
||||||
&:after
|
&:after
|
||||||
content ""
|
content ""
|
||||||
display block
|
display block
|
||||||
position absolute
|
position absolute
|
||||||
z-index 1
|
z-index 1
|
||||||
|
background #0c7ac9
|
||||||
|
|
||||||
|
&:before
|
||||||
|
top 0
|
||||||
|
left 57px
|
||||||
|
width 28px
|
||||||
|
height 8px
|
||||||
|
|
||||||
|
&:after
|
||||||
top 57px
|
top 57px
|
||||||
left 0
|
left 0
|
||||||
width 8px
|
width 8px
|
||||||
height 28px
|
height 28px
|
||||||
background #0c7ac9
|
|
||||||
|
&.red
|
||||||
|
&:before
|
||||||
|
&:after
|
||||||
|
background #c12113
|
||||||
|
|
||||||
> img
|
> img
|
||||||
position absolute
|
position absolute
|
||||||
|
@ -55,15 +55,15 @@
|
|||||||
</div>
|
</div>
|
||||||
<footer>
|
<footer>
|
||||||
<mk-reactions-viewer :note="p"/>
|
<mk-reactions-viewer :note="p"/>
|
||||||
<button @click="reply" title="">
|
<button class="replyButton" @click="reply" title="">
|
||||||
<template v-if="p.reply">%fa:reply-all%</template>
|
<template v-if="p.reply">%fa:reply-all%</template>
|
||||||
<template v-else>%fa:reply%</template>
|
<template v-else>%fa:reply%</template>
|
||||||
<p class="count" v-if="p.repliesCount > 0">{{ p.repliesCount }}</p>
|
<p class="count" v-if="p.repliesCount > 0">{{ p.repliesCount }}</p>
|
||||||
</button>
|
</button>
|
||||||
<button @click="renote" title="%i18n:@renote%">
|
<button class="renoteButton" @click="renote" title="%i18n:@renote%">
|
||||||
%fa:retweet%<p class="count" v-if="p.renoteCount > 0">{{ p.renoteCount }}</p>
|
%fa:retweet%<p class="count" v-if="p.renoteCount > 0">{{ p.renoteCount }}</p>
|
||||||
</button>
|
</button>
|
||||||
<button :class="{ reacted: p.myReaction != null }" @click="react" ref="reactButton" title="%i18n:@add-reaction%">
|
<button class="reactionButton" :class="{ reacted: p.myReaction != null }" @click="react" ref="reactButton" title="%i18n:@add-reaction%">
|
||||||
%fa:plus%<p class="count" v-if="p.reactions_count > 0">{{ p.reactions_count }}</p>
|
%fa:plus%<p class="count" v-if="p.reactions_count > 0">{{ p.reactions_count }}</p>
|
||||||
</button>
|
</button>
|
||||||
<button @click="menu" ref="menuButton">
|
<button @click="menu" ref="menuButton">
|
||||||
@ -372,15 +372,24 @@ root(isDark)
|
|||||||
cursor pointer
|
cursor pointer
|
||||||
|
|
||||||
&:hover
|
&:hover
|
||||||
color isDark ? #9198af : #666
|
color isDark ? #a1a8bf : #444
|
||||||
|
|
||||||
|
&.replyButton:hover
|
||||||
|
color #0af
|
||||||
|
|
||||||
|
&.renoteButton:hover
|
||||||
|
color #8d0
|
||||||
|
|
||||||
|
&.reactionButton:hover
|
||||||
|
color #fa0
|
||||||
|
|
||||||
> .count
|
> .count
|
||||||
display inline
|
display inline
|
||||||
margin 0 0 0 8px
|
margin 0 0 0 8px
|
||||||
color #999
|
color #999
|
||||||
|
|
||||||
&.reacted
|
&.reacted, &.reacted:hover
|
||||||
color $theme-color
|
color #fa0
|
||||||
|
|
||||||
> .replies
|
> .replies
|
||||||
> *
|
> *
|
||||||
|
@ -42,15 +42,15 @@
|
|||||||
</div>
|
</div>
|
||||||
<footer>
|
<footer>
|
||||||
<mk-reactions-viewer :note="p" ref="reactionsViewer"/>
|
<mk-reactions-viewer :note="p" ref="reactionsViewer"/>
|
||||||
<button @click="reply" title="%i18n:@reply%">
|
<button class="replyButton" @click="reply" title="%i18n:@reply%">
|
||||||
<template v-if="p.reply">%fa:reply-all%</template>
|
<template v-if="p.reply">%fa:reply-all%</template>
|
||||||
<template v-else>%fa:reply%</template>
|
<template v-else>%fa:reply%</template>
|
||||||
<p class="count" v-if="p.repliesCount > 0">{{ p.repliesCount }}</p>
|
<p class="count" v-if="p.repliesCount > 0">{{ p.repliesCount }}</p>
|
||||||
</button>
|
</button>
|
||||||
<button @click="renote" title="%i18n:@renote%">
|
<button class="renoteButton" @click="renote" title="%i18n:@renote%">
|
||||||
%fa:retweet%<p class="count" v-if="p.renoteCount > 0">{{ p.renoteCount }}</p>
|
%fa:retweet%<p class="count" v-if="p.renoteCount > 0">{{ p.renoteCount }}</p>
|
||||||
</button>
|
</button>
|
||||||
<button :class="{ reacted: p.myReaction != null }" @click="react" ref="reactButton" title="%i18n:@add-reaction%">
|
<button class="reactionButton" :class="{ reacted: p.myReaction != null }" @click="react" ref="reactButton" title="%i18n:@add-reaction%">
|
||||||
%fa:plus%<p class="count" v-if="p.reactions_count > 0">{{ p.reactions_count }}</p>
|
%fa:plus%<p class="count" v-if="p.reactions_count > 0">{{ p.reactions_count }}</p>
|
||||||
</button>
|
</button>
|
||||||
<button @click="menu" ref="menuButton">
|
<button @click="menu" ref="menuButton">
|
||||||
@ -487,20 +487,24 @@ root(isDark)
|
|||||||
cursor pointer
|
cursor pointer
|
||||||
|
|
||||||
&:hover
|
&:hover
|
||||||
color isDark ? #9198af : #666
|
color isDark ? #a1a8bf : #444
|
||||||
|
|
||||||
|
&.replyButton:hover
|
||||||
|
color #0af
|
||||||
|
|
||||||
|
&.renoteButton:hover
|
||||||
|
color #8d0
|
||||||
|
|
||||||
|
&.reactionButton:hover
|
||||||
|
color #fa0
|
||||||
|
|
||||||
> .count
|
> .count
|
||||||
display inline
|
display inline
|
||||||
margin 0 0 0 8px
|
margin 0 0 0 8px
|
||||||
color #999
|
color #999
|
||||||
|
|
||||||
&.reacted
|
&.reacted, &.reacted:hover
|
||||||
color $theme-color
|
color #fa0
|
||||||
|
|
||||||
&:last-child
|
|
||||||
position absolute
|
|
||||||
right 0
|
|
||||||
margin 0
|
|
||||||
|
|
||||||
> .detail
|
> .detail
|
||||||
padding-top 4px
|
padding-top 4px
|
||||||
|
@ -135,6 +135,12 @@ export default Vue.extend({
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this.$store.state.settings.showLocalRenotes === false) {
|
||||||
|
if (isPureRenote && (note.renote.user.host == null)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
// 投稿が自分のものではないかつ、タブが非表示またはスクロール位置が最上部ではないならタイトルで通知
|
// 投稿が自分のものではないかつ、タブが非表示またはスクロール位置が最上部ではないならタイトルで通知
|
||||||
@ -187,7 +193,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
clearNotification() {
|
clearNotification() {
|
||||||
this.unreadCount = 0;
|
this.unreadCount = 0;
|
||||||
document.title = config.name;
|
document.title = (this as any).os.instanceName;
|
||||||
},
|
},
|
||||||
|
|
||||||
onVisibilitychange() {
|
onVisibilitychange() {
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
<span v-for="u in visibleUsers">{{ u | userName }}<a @click="removeVisibleUser(u)">[x]</a></span>
|
<span v-for="u in visibleUsers">{{ u | userName }}<a @click="removeVisibleUser(u)">[x]</a></span>
|
||||||
<a @click="addVisibleUser">%i18n:@add-visible-user%</a>
|
<a @click="addVisibleUser">%i18n:@add-visible-user%</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="hashtags" v-if="recentHashtags.length > 0">
|
<div class="hashtags" v-if="recentHashtags.length > 0 && $store.state.settings.suggestRecentHashtags">
|
||||||
<b>%i18n:@recent-tags%:</b>
|
<b>%i18n:@recent-tags%:</b>
|
||||||
<a v-for="tag in recentHashtags.slice(0, 5)" @click="addTag(tag)" title="%@click-to-tagging%">#{{ tag }}</a>
|
<a v-for="tag in recentHashtags.slice(0, 5)" @click="addTag(tag)" title="%@click-to-tagging%">#{{ tag }}</a>
|
||||||
</div>
|
</div>
|
||||||
@ -23,7 +23,7 @@
|
|||||||
<div class="medias" :class="{ with: poll }" v-show="files.length != 0">
|
<div class="medias" :class="{ with: poll }" v-show="files.length != 0">
|
||||||
<x-draggable :list="files" :options="{ animation: 150 }">
|
<x-draggable :list="files" :options="{ animation: 150 }">
|
||||||
<div v-for="file in files" :key="file.id">
|
<div v-for="file in files" :key="file.id">
|
||||||
<div class="img" :style="{ backgroundImage: `url(${file.url})` }" :title="file.name"></div>
|
<div class="img" :style="{ backgroundImage: `url(${file.thumbnailUrl})` }" :title="file.name"></div>
|
||||||
<img class="remove" @click="detachMedia(file.id)" src="/assets/desktop/remove.png" title="%i18n:@attach-cancel%" alt=""/>
|
<img class="remove" @click="detachMedia(file.id)" src="/assets/desktop/remove.png" title="%i18n:@attach-cancel%" alt=""/>
|
||||||
</div>
|
</div>
|
||||||
</x-draggable>
|
</x-draggable>
|
||||||
@ -58,7 +58,7 @@
|
|||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import insertTextAtCursor from 'insert-text-at-cursor';
|
import insertTextAtCursor from 'insert-text-at-cursor';
|
||||||
import * as XDraggable from 'vuedraggable';
|
import * as XDraggable from 'vuedraggable';
|
||||||
import getKao from '../../../common/scripts/get-kao';
|
import getFace from '../../../common/scripts/get-face';
|
||||||
import MkVisibilityChooser from '../../../common/views/components/visibility-chooser.vue';
|
import MkVisibilityChooser from '../../../common/views/components/visibility-chooser.vue';
|
||||||
import parse from '../../../../../mfm/parse';
|
import parse from '../../../../../mfm/parse';
|
||||||
import { host } from '../../../config';
|
import { host } from '../../../config';
|
||||||
@ -99,7 +99,7 @@ export default Vue.extend({
|
|||||||
useCw: false,
|
useCw: false,
|
||||||
cw: null,
|
cw: null,
|
||||||
geo: null,
|
geo: null,
|
||||||
visibility: 'public',
|
visibility: this.$store.state.device.visibility || 'public',
|
||||||
visibleUsers: [],
|
visibleUsers: [],
|
||||||
autocomplete: null,
|
autocomplete: null,
|
||||||
draghover: false,
|
draghover: false,
|
||||||
@ -326,8 +326,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
setVisibility() {
|
setVisibility() {
|
||||||
const w = (this as any).os.new(MkVisibilityChooser, {
|
const w = (this as any).os.new(MkVisibilityChooser, {
|
||||||
source: this.$refs.visibilityButton,
|
source: this.$refs.visibilityButton
|
||||||
v: this.visibility
|
|
||||||
});
|
});
|
||||||
w.$once('chosen', v => {
|
w.$once('chosen', v => {
|
||||||
this.visibility = v;
|
this.visibility = v;
|
||||||
@ -422,7 +421,7 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
kao() {
|
kao() {
|
||||||
this.text += getKao();
|
this.text += getFace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -48,9 +48,11 @@
|
|||||||
<mk-switch v-model="$store.state.settings.iLikeSushi" @change="onChangeILikeSushi" text="%i18n:common.i-like-sushi%"/>
|
<mk-switch v-model="$store.state.settings.iLikeSushi" @change="onChangeILikeSushi" text="%i18n:common.i-like-sushi%"/>
|
||||||
</div>
|
</div>
|
||||||
<mk-switch v-model="$store.state.settings.showPostFormOnTopOfTl" @change="onChangeShowPostFormOnTopOfTl" text="%i18n:@post-form-on-timeline%"/>
|
<mk-switch v-model="$store.state.settings.showPostFormOnTopOfTl" @change="onChangeShowPostFormOnTopOfTl" text="%i18n:@post-form-on-timeline%"/>
|
||||||
|
<mk-switch v-model="$store.state.settings.suggestRecentHashtags" @change="onChangeSuggestRecentHashtags" text="%i18n:@suggest-recent-hashtags%"/>
|
||||||
<mk-switch v-model="$store.state.settings.showReplyTarget" @change="onChangeShowReplyTarget" text="%i18n:@show-reply-target%"/>
|
<mk-switch v-model="$store.state.settings.showReplyTarget" @change="onChangeShowReplyTarget" text="%i18n:@show-reply-target%"/>
|
||||||
<mk-switch v-model="$store.state.settings.showMyRenotes" @change="onChangeShowMyRenotes" text="%i18n:@show-my-renotes%"/>
|
<mk-switch v-model="$store.state.settings.showMyRenotes" @change="onChangeShowMyRenotes" text="%i18n:@show-my-renotes%"/>
|
||||||
<mk-switch v-model="$store.state.settings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes" text="%i18n:@show-renoted-my-notes%"/>
|
<mk-switch v-model="$store.state.settings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes" text="%i18n:@show-renoted-my-notes%"/>
|
||||||
|
<mk-switch v-model="$store.state.settings.showLocalRenotes" @change="onChangeShowLocalRenotes" text="%i18n:@show-local-renotes%"/>
|
||||||
<mk-switch v-model="$store.state.settings.showMaps" @change="onChangeShowMaps" text="%i18n:@show-maps%">
|
<mk-switch v-model="$store.state.settings.showMaps" @change="onChangeShowMaps" text="%i18n:@show-maps%">
|
||||||
<span>%i18n:@show-maps-desc%</span>
|
<span>%i18n:@show-maps-desc%</span>
|
||||||
</mk-switch>
|
</mk-switch>
|
||||||
@ -335,6 +337,12 @@ export default Vue.extend({
|
|||||||
value: v
|
value: v
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
onChangeSuggestRecentHashtags(v) {
|
||||||
|
this.$store.dispatch('settings/set', {
|
||||||
|
key: 'suggestRecentHashtags',
|
||||||
|
value: v
|
||||||
|
});
|
||||||
|
},
|
||||||
onChangeShowReplyTarget(v) {
|
onChangeShowReplyTarget(v) {
|
||||||
this.$store.dispatch('settings/set', {
|
this.$store.dispatch('settings/set', {
|
||||||
key: 'showReplyTarget',
|
key: 'showReplyTarget',
|
||||||
@ -353,6 +361,12 @@ export default Vue.extend({
|
|||||||
value: v
|
value: v
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
onChangeShowLocalRenotes(v) {
|
||||||
|
this.$store.dispatch('settings/set', {
|
||||||
|
key: 'showLocalRenotes',
|
||||||
|
value: v
|
||||||
|
});
|
||||||
|
},
|
||||||
onChangeShowMaps(v) {
|
onChangeShowMaps(v) {
|
||||||
this.$store.dispatch('settings/set', {
|
this.$store.dispatch('settings/set', {
|
||||||
key: 'showMaps',
|
key: 'showMaps',
|
||||||
|
@ -100,7 +100,8 @@ export default Vue.extend({
|
|||||||
limit: fetchLimit + 1,
|
limit: fetchLimit + 1,
|
||||||
untilDate: this.date ? this.date.getTime() : undefined,
|
untilDate: this.date ? this.date.getTime() : undefined,
|
||||||
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
||||||
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
|
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
|
||||||
|
includeLocalRenotes: this.$store.state.settings.showLocalRenotes
|
||||||
}).then(notes => {
|
}).then(notes => {
|
||||||
if (notes.length == fetchLimit + 1) {
|
if (notes.length == fetchLimit + 1) {
|
||||||
notes.pop();
|
notes.pop();
|
||||||
@ -122,7 +123,8 @@ export default Vue.extend({
|
|||||||
limit: fetchLimit + 1,
|
limit: fetchLimit + 1,
|
||||||
untilId: (this.$refs.timeline as any).tail().id,
|
untilId: (this.$refs.timeline as any).tail().id,
|
||||||
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
||||||
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
|
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
|
||||||
|
includeLocalRenotes: this.$store.state.settings.showLocalRenotes
|
||||||
});
|
});
|
||||||
|
|
||||||
promise.then(notes => {
|
promise.then(notes => {
|
||||||
|
@ -47,7 +47,8 @@ export default Vue.extend({
|
|||||||
listId: this.list.id,
|
listId: this.list.id,
|
||||||
limit: fetchLimit + 1,
|
limit: fetchLimit + 1,
|
||||||
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
||||||
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
|
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
|
||||||
|
includeLocalRenotes: this.$store.state.settings.showLocalRenotes
|
||||||
}).then(notes => {
|
}).then(notes => {
|
||||||
if (notes.length == fetchLimit + 1) {
|
if (notes.length == fetchLimit + 1) {
|
||||||
notes.pop();
|
notes.pop();
|
||||||
@ -67,7 +68,8 @@ export default Vue.extend({
|
|||||||
limit: fetchLimit + 1,
|
limit: fetchLimit + 1,
|
||||||
untilId: (this.$refs.timeline as any).tail().id,
|
untilId: (this.$refs.timeline as any).tail().id,
|
||||||
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
||||||
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
|
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
|
||||||
|
includeLocalRenotes: this.$store.state.settings.showLocalRenotes
|
||||||
});
|
});
|
||||||
|
|
||||||
promise.then(notes => {
|
promise.then(notes => {
|
||||||
|
144
src/client/app/desktop/views/pages/admin/admin.cpu-memory.vue
Normal file
144
src/client/app/desktop/views/pages/admin/admin.cpu-memory.vue
Normal file
@ -0,0 +1,144 @@
|
|||||||
|
<template>
|
||||||
|
<div class="zyknedwtlthezamcjlolyusmipqmjgxz">
|
||||||
|
<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`">
|
||||||
|
<defs>
|
||||||
|
<linearGradient :id="cpuGradientId" x1="0" x2="0" y1="1" y2="0">
|
||||||
|
<stop offset="0%" stop-color="hsl(180, 80%, 70%)"></stop>
|
||||||
|
<stop offset="100%" stop-color="hsl(0, 80%, 70%)"></stop>
|
||||||
|
</linearGradient>
|
||||||
|
<mask :id="cpuMaskId" x="0" y="0" :width="viewBoxX" :height="viewBoxY">
|
||||||
|
<polygon
|
||||||
|
:points="cpuPolygonPoints"
|
||||||
|
fill="#fff"
|
||||||
|
fill-opacity="0.5"/>
|
||||||
|
<polyline
|
||||||
|
:points="cpuPolylinePoints"
|
||||||
|
fill="none"
|
||||||
|
stroke="#fff"
|
||||||
|
stroke-width="1"/>
|
||||||
|
</mask>
|
||||||
|
</defs>
|
||||||
|
<rect
|
||||||
|
x="0" y="0"
|
||||||
|
:width="viewBoxX" :height="viewBoxY"
|
||||||
|
:style="`stroke: none; fill: url(#${ cpuGradientId }); mask: url(#${ cpuMaskId })`"/>
|
||||||
|
<text x="1" y="12">CPU <tspan>{{ cpuP }}%</tspan></text>
|
||||||
|
</svg>
|
||||||
|
<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`">
|
||||||
|
<defs>
|
||||||
|
<linearGradient :id="memGradientId" x1="0" x2="0" y1="1" y2="0">
|
||||||
|
<stop offset="0%" stop-color="hsl(180, 80%, 70%)"></stop>
|
||||||
|
<stop offset="100%" stop-color="hsl(0, 80%, 70%)"></stop>
|
||||||
|
</linearGradient>
|
||||||
|
<mask :id="memMaskId" x="0" y="0" :width="viewBoxX" :height="viewBoxY">
|
||||||
|
<polygon
|
||||||
|
:points="memPolygonPoints"
|
||||||
|
fill="#fff"
|
||||||
|
fill-opacity="0.5"/>
|
||||||
|
<polyline
|
||||||
|
:points="memPolylinePoints"
|
||||||
|
fill="none"
|
||||||
|
stroke="#fff"
|
||||||
|
stroke-width="1"/>
|
||||||
|
</mask>
|
||||||
|
</defs>
|
||||||
|
<rect
|
||||||
|
x="0" y="0"
|
||||||
|
:width="viewBoxX" :height="viewBoxY"
|
||||||
|
:style="`stroke: none; fill: url(#${ memGradientId }); mask: url(#${ memMaskId })`"/>
|
||||||
|
<text x="1" y="12">MEM <tspan>{{ memP }}%</tspan></text>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
import * as uuid from 'uuid';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
props: ['connection'],
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
viewBoxX: 200,
|
||||||
|
viewBoxY: 70,
|
||||||
|
stats: [],
|
||||||
|
cpuGradientId: uuid(),
|
||||||
|
cpuMaskId: uuid(),
|
||||||
|
memGradientId: uuid(),
|
||||||
|
memMaskId: uuid(),
|
||||||
|
cpuPolylinePoints: '',
|
||||||
|
memPolylinePoints: '',
|
||||||
|
cpuPolygonPoints: '',
|
||||||
|
memPolygonPoints: '',
|
||||||
|
cpuP: '',
|
||||||
|
memP: ''
|
||||||
|
};
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
this.connection.on('stats', this.onStats);
|
||||||
|
this.connection.on('statsLog', this.onStatsLog);
|
||||||
|
this.connection.send({
|
||||||
|
type: 'requestLog',
|
||||||
|
id: Math.random().toString(),
|
||||||
|
length: 200
|
||||||
|
});
|
||||||
|
},
|
||||||
|
beforeDestroy() {
|
||||||
|
this.connection.off('stats', this.onStats);
|
||||||
|
this.connection.off('statsLog', this.onStatsLog);
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
onStats(stats) {
|
||||||
|
this.stats.push(stats);
|
||||||
|
if (this.stats.length > 200) this.stats.shift();
|
||||||
|
|
||||||
|
const cpuPolylinePoints = this.stats.map((s, i) => [this.viewBoxX - ((this.stats.length - 1) - i), (1 - s.cpu_usage) * this.viewBoxY]);
|
||||||
|
const memPolylinePoints = this.stats.map((s, i) => [this.viewBoxX - ((this.stats.length - 1) - i), (1 - (s.mem.used / s.mem.total)) * this.viewBoxY]);
|
||||||
|
this.cpuPolylinePoints = cpuPolylinePoints.map(xy => `${xy[0]},${xy[1]}`).join(' ');
|
||||||
|
this.memPolylinePoints = memPolylinePoints.map(xy => `${xy[0]},${xy[1]}`).join(' ');
|
||||||
|
|
||||||
|
this.cpuPolygonPoints = `${this.viewBoxX - (this.stats.length - 1)},${this.viewBoxY} ${this.cpuPolylinePoints} ${this.viewBoxX},${this.viewBoxY}`;
|
||||||
|
this.memPolygonPoints = `${this.viewBoxX - (this.stats.length - 1)},${this.viewBoxY} ${this.memPolylinePoints} ${this.viewBoxX},${this.viewBoxY}`;
|
||||||
|
|
||||||
|
this.cpuP = (stats.cpu_usage * 100).toFixed(0);
|
||||||
|
this.memP = (stats.mem.used / stats.mem.total * 100).toFixed(0);
|
||||||
|
},
|
||||||
|
onStatsLog(statsLog) {
|
||||||
|
statsLog.reverse().forEach(stats => this.onStats(stats));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
root(isDark)
|
||||||
|
> svg
|
||||||
|
display block
|
||||||
|
width 50%
|
||||||
|
float left
|
||||||
|
|
||||||
|
&:first-child
|
||||||
|
padding-right 5px
|
||||||
|
|
||||||
|
&:last-child
|
||||||
|
padding-left 5px
|
||||||
|
|
||||||
|
> text
|
||||||
|
font-size 10px
|
||||||
|
fill isDark ? rgba(#fff, 0.55) : rgba(#000, 0.55)
|
||||||
|
|
||||||
|
> tspan
|
||||||
|
opacity 0.5
|
||||||
|
|
||||||
|
&:after
|
||||||
|
content ""
|
||||||
|
display block
|
||||||
|
clear both
|
||||||
|
|
||||||
|
.zyknedwtlthezamcjlolyusmipqmjgxz[data-darkmode]
|
||||||
|
root(true)
|
||||||
|
|
||||||
|
.zyknedwtlthezamcjlolyusmipqmjgxz:not([data-darkmode])
|
||||||
|
root(false)
|
||||||
|
|
||||||
|
</style>
|
@ -1,37 +1,86 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div class="obdskegsannmntldydackcpzezagxqfy card">
|
||||||
<h1>%i18n:@dashboard%</h1>
|
<header>%i18n:@dashboard%</header>
|
||||||
<div v-if="stats">
|
<div v-if="stats" class="stats">
|
||||||
<p><b>%i18n:@all-users%</b>: <span>{{ stats.usersCount | number }}</span></p>
|
<div><b>%fa:user% {{ stats.originalUsersCount | number }}</b><span>%i18n:@original-users%</span></div>
|
||||||
<p><b>%i18n:@original-users%</b>: <span>{{ stats.originalUsersCount | number }}</span></p>
|
<div><span>%fa:user% {{ stats.usersCount | number }}</span><span>%i18n:@all-users%</span></div>
|
||||||
<p><b>%i18n:@all-notes%</b>: <span>{{ stats.notesCount | number }}</span></p>
|
<div><b>%fa:pen% {{ stats.originalNotesCount | number }}</b><span>%i18n:@original-notes%</span></div>
|
||||||
<p><b>%i18n:@original-notes%</b>: <span>{{ stats.originalNotesCount | number }}</span></p>
|
<div><span>%fa:pen% {{ stats.notesCount | number }}</span><span>%i18n:@all-notes%</span></div>
|
||||||
|
</div>
|
||||||
|
<div class="cpu-memory">
|
||||||
|
<x-cpu-memory :connection="connection"/>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<button class="ui" @click="invite">%i18n:@invite%</button>
|
||||||
|
<p v-if="inviteCode">Code: <code>{{ inviteCode }}</code></p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from "vue";
|
import Vue from "vue";
|
||||||
|
import XCpuMemory from "./admin.cpu-memory.vue";
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
|
components: {
|
||||||
|
XCpuMemory
|
||||||
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
stats: null
|
stats: null,
|
||||||
|
inviteCode: null,
|
||||||
|
connection: null,
|
||||||
|
connectionId: null
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
|
this.connection = (this as any).os.streams.serverStatsStream.getConnection();
|
||||||
|
this.connectionId = (this as any).os.streams.serverStatsStream.use();
|
||||||
|
|
||||||
(this as any).api('stats').then(stats => {
|
(this as any).api('stats').then(stats => {
|
||||||
this.stats = stats;
|
this.stats = stats;
|
||||||
});
|
});
|
||||||
|
},
|
||||||
|
beforeDestroy() {
|
||||||
|
(this as any).os.streams.serverStatsStream.dispose(this.connectionId);
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
invite() {
|
||||||
|
(this as any).api('admin/invite').then(x => {
|
||||||
|
this.inviteCode = x.code;
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="stylus" scoped>
|
<style lang="stylus" scoped>
|
||||||
h1
|
@import '~const.styl'
|
||||||
margin 0 0 1em 0
|
|
||||||
padding 0 0 8px 0
|
.obdskegsannmntldydackcpzezagxqfy
|
||||||
font-size 1em
|
> .stats
|
||||||
color #555
|
display flex
|
||||||
border-bottom solid 1px #eee
|
justify-content center
|
||||||
|
margin-bottom 16px
|
||||||
|
padding 16px
|
||||||
|
border solid 1px #eee
|
||||||
|
border-radius 8px
|
||||||
|
|
||||||
|
> div
|
||||||
|
flex 1
|
||||||
|
text-align center
|
||||||
|
|
||||||
|
> *:first-child
|
||||||
|
display block
|
||||||
|
color $theme-color
|
||||||
|
|
||||||
|
> *:last-child
|
||||||
|
font-size 70%
|
||||||
|
|
||||||
|
> .cpu-memory
|
||||||
|
margin-bottom 16px
|
||||||
|
padding 16px
|
||||||
|
border solid 1px #eee
|
||||||
|
border-radius: 8px
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
@ -0,0 +1,51 @@
|
|||||||
|
<template>
|
||||||
|
<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`">
|
||||||
|
<polyline
|
||||||
|
:points="points"
|
||||||
|
fill="none"
|
||||||
|
stroke-width="1"
|
||||||
|
stroke="#555"/>
|
||||||
|
</svg>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
props: {
|
||||||
|
chart: {
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
type: {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
viewBoxX: 365,
|
||||||
|
viewBoxY: 70,
|
||||||
|
points: null
|
||||||
|
};
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
const peak = Math.max.apply(null, this.chart.map(d => this.type == 'local' ? d.drive.local.totalSize : d.drive.remote.totalSize));
|
||||||
|
|
||||||
|
if (peak != 0) {
|
||||||
|
const data = this.chart.slice().reverse().map(x => ({
|
||||||
|
size: this.type == 'local' ? x.drive.local.totalSize : x.drive.remote.totalSize
|
||||||
|
}));
|
||||||
|
|
||||||
|
this.points = data.map((d, i) => `${i},${(1 - (d.size / peak)) * this.viewBoxY}`).join(' ');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
svg
|
||||||
|
display block
|
||||||
|
padding 10px
|
||||||
|
width 100%
|
||||||
|
|
||||||
|
</style>
|
@ -0,0 +1,34 @@
|
|||||||
|
<template>
|
||||||
|
<div class="card">
|
||||||
|
<header>%i18n:@title%</header>
|
||||||
|
<div class="card">
|
||||||
|
<header>%i18n:@local%</header>
|
||||||
|
<x-chart v-if="chart" :chart="chart" type="local"/>
|
||||||
|
</div>
|
||||||
|
<div class="card">
|
||||||
|
<header>%i18n:@remote%</header>
|
||||||
|
<x-chart v-if="chart" :chart="chart" type="remote"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from "vue";
|
||||||
|
import XChart from "./admin.drive-chart.chart.vue";
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
components: {
|
||||||
|
XChart
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
chart: {
|
||||||
|
required: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
@import '~const.styl'
|
||||||
|
|
||||||
|
</style>
|
@ -0,0 +1,76 @@
|
|||||||
|
<template>
|
||||||
|
<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`">
|
||||||
|
<polyline
|
||||||
|
:points="pointsNote"
|
||||||
|
fill="none"
|
||||||
|
stroke-width="1"
|
||||||
|
stroke="#41ddde"/>
|
||||||
|
<polyline
|
||||||
|
:points="pointsReply"
|
||||||
|
fill="none"
|
||||||
|
stroke-width="1"
|
||||||
|
stroke="#f7796c"/>
|
||||||
|
<polyline
|
||||||
|
:points="pointsRenote"
|
||||||
|
fill="none"
|
||||||
|
stroke-width="1"
|
||||||
|
stroke="#a1de41"/>
|
||||||
|
<polyline
|
||||||
|
:points="pointsTotal"
|
||||||
|
fill="none"
|
||||||
|
stroke-width="1"
|
||||||
|
stroke="#555"
|
||||||
|
stroke-dasharray="2 2"/>
|
||||||
|
</svg>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
props: {
|
||||||
|
chart: {
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
type: {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
viewBoxX: 365,
|
||||||
|
viewBoxY: 70,
|
||||||
|
pointsNote: null,
|
||||||
|
pointsReply: null,
|
||||||
|
pointsRenote: null,
|
||||||
|
pointsTotal: null
|
||||||
|
};
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
const peak = Math.max.apply(null, this.chart.map(d => this.type == 'local' ? d.notes.local.diff : d.notes.remote.diff));
|
||||||
|
|
||||||
|
if (peak != 0) {
|
||||||
|
const data = this.chart.slice().reverse().map(x => ({
|
||||||
|
normal: this.type == 'local' ? x.notes.local.diffs.normal : x.notes.remote.diffs.normal,
|
||||||
|
reply: this.type == 'local' ? x.notes.local.diffs.reply : x.notes.remote.diffs.reply,
|
||||||
|
renote: this.type == 'local' ? x.notes.local.diffs.renote : x.notes.remote.diffs.renote,
|
||||||
|
total: this.type == 'local' ? x.notes.local.diff : x.notes.remote.diff
|
||||||
|
}));
|
||||||
|
|
||||||
|
this.pointsNote = data.map((d, i) => `${i},${(1 - (d.normal / peak)) * this.viewBoxY}`).join(' ');
|
||||||
|
this.pointsReply = data.map((d, i) => `${i},${(1 - (d.reply / peak)) * this.viewBoxY}`).join(' ');
|
||||||
|
this.pointsRenote = data.map((d, i) => `${i},${(1 - (d.renote / peak)) * this.viewBoxY}`).join(' ');
|
||||||
|
this.pointsTotal = data.map((d, i) => `${i},${(1 - (d.total / peak)) * this.viewBoxY}`).join(' ');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
svg
|
||||||
|
display block
|
||||||
|
padding 10px
|
||||||
|
width 100%
|
||||||
|
|
||||||
|
</style>
|
@ -0,0 +1,34 @@
|
|||||||
|
<template>
|
||||||
|
<div class="card">
|
||||||
|
<header>%i18n:@title%</header>
|
||||||
|
<div class="card">
|
||||||
|
<header>%i18n:@local%</header>
|
||||||
|
<x-chart v-if="chart" :chart="chart" type="local"/>
|
||||||
|
</div>
|
||||||
|
<div class="card">
|
||||||
|
<header>%i18n:@remote%</header>
|
||||||
|
<x-chart v-if="chart" :chart="chart" type="remote"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from "vue";
|
||||||
|
import XChart from "./admin.notes-chart.chart.vue";
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
components: {
|
||||||
|
XChart
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
chart: {
|
||||||
|
required: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
@import '~const.styl'
|
||||||
|
|
||||||
|
</style>
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div class="card">
|
||||||
<header>%i18n:@suspend-user%</header>
|
<header>%i18n:@suspend-user%</header>
|
||||||
<input v-model="username" type="text" class="ui"/>
|
<input v-model="username" type="text" class="ui"/>
|
||||||
<button class="ui" @click="suspendUser" :disabled="suspending">%i18n:@suspend%</button>
|
<button class="ui" @click="suspendUser" :disabled="suspending">%i18n:@suspend%</button>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div class="card">
|
||||||
<header>%i18n:@unsuspend-user%</header>
|
<header>%i18n:@unsuspend-user%</header>
|
||||||
<input v-model="username" type="text" class="ui"/>
|
<input v-model="username" type="text" class="ui"/>
|
||||||
<button class="ui" @click="unsuspendUser" :disabled="unsuspending">%i18n:@unsuspend%</button>
|
<button class="ui" @click="unsuspendUser" :disabled="unsuspending">%i18n:@unsuspend%</button>
|
||||||
|
@ -0,0 +1,51 @@
|
|||||||
|
<template>
|
||||||
|
<div class="card">
|
||||||
|
<header>%i18n:@unverify-user%</header>
|
||||||
|
<input v-model="username" type="text" class="ui"/>
|
||||||
|
<button class="ui" @click="unverifyUser" :disabled="unverifying">%i18n:@unverify%</button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from "vue";
|
||||||
|
import parseAcct from "../../../../../../misc/acct/parse";
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
username: null,
|
||||||
|
unverifying: false
|
||||||
|
};
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
async unverifyUser() {
|
||||||
|
this.unverifying = true;
|
||||||
|
|
||||||
|
const user = await (this as any).os.api(
|
||||||
|
"users/show",
|
||||||
|
parseAcct(this.username)
|
||||||
|
);
|
||||||
|
|
||||||
|
await (this as any).os.api("admin/unverify-user", {
|
||||||
|
userId: user.id
|
||||||
|
});
|
||||||
|
|
||||||
|
this.unverifying = false;
|
||||||
|
|
||||||
|
(this as any).os.apis.dialog({ text: "%i18n:@unverified%" });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
@import '~const.styl'
|
||||||
|
|
||||||
|
header
|
||||||
|
margin 10px 0
|
||||||
|
|
||||||
|
|
||||||
|
button
|
||||||
|
margin 16px 0
|
||||||
|
|
||||||
|
</style>
|
@ -0,0 +1,51 @@
|
|||||||
|
<template>
|
||||||
|
<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`">
|
||||||
|
<polyline
|
||||||
|
:points="points"
|
||||||
|
fill="none"
|
||||||
|
stroke-width="1"
|
||||||
|
stroke="#555"/>
|
||||||
|
</svg>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
props: {
|
||||||
|
chart: {
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
type: {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
viewBoxX: 365,
|
||||||
|
viewBoxY: 70,
|
||||||
|
points: null
|
||||||
|
};
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
const peak = Math.max.apply(null, this.chart.map(d => this.type == 'local' ? d.users.local.diff : d.users.remote.diff));
|
||||||
|
|
||||||
|
if (peak != 0) {
|
||||||
|
const data = this.chart.slice().reverse().map(x => ({
|
||||||
|
count: this.type == 'local' ? x.users.local.diff : x.users.remote.diff
|
||||||
|
}));
|
||||||
|
|
||||||
|
this.points = data.map((d, i) => `${i},${(1 - (d.count / peak)) * this.viewBoxY}`).join(' ');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
svg
|
||||||
|
display block
|
||||||
|
padding 10px
|
||||||
|
width 100%
|
||||||
|
|
||||||
|
</style>
|
@ -0,0 +1,34 @@
|
|||||||
|
<template>
|
||||||
|
<div class="card">
|
||||||
|
<header>%i18n:@title%</header>
|
||||||
|
<div class="card">
|
||||||
|
<header>%i18n:@local%</header>
|
||||||
|
<x-chart v-if="chart" :chart="chart" type="local"/>
|
||||||
|
</div>
|
||||||
|
<div class="card">
|
||||||
|
<header>%i18n:@remote%</header>
|
||||||
|
<x-chart v-if="chart" :chart="chart" type="remote"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from "vue";
|
||||||
|
import XChart from "./admin.users-chart.chart.vue";
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
components: {
|
||||||
|
XChart
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
chart: {
|
||||||
|
required: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
@import '~const.styl'
|
||||||
|
|
||||||
|
</style>
|
@ -0,0 +1,51 @@
|
|||||||
|
<template>
|
||||||
|
<div class="card">
|
||||||
|
<header>%i18n:@verify-user%</header>
|
||||||
|
<input v-model="username" type="text" class="ui"/>
|
||||||
|
<button class="ui" @click="verifyUser" :disabled="verifying">%i18n:@verify%</button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from "vue";
|
||||||
|
import parseAcct from "../../../../../../misc/acct/parse";
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
username: null,
|
||||||
|
verifying: false
|
||||||
|
};
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
async verifyUser() {
|
||||||
|
this.verifying = true;
|
||||||
|
|
||||||
|
const user = await (this as any).os.api(
|
||||||
|
"users/show",
|
||||||
|
parseAcct(this.username)
|
||||||
|
);
|
||||||
|
|
||||||
|
await (this as any).os.api("admin/verify-user", {
|
||||||
|
userId: user.id
|
||||||
|
});
|
||||||
|
|
||||||
|
this.verifying = false;
|
||||||
|
|
||||||
|
(this as any).os.apis.dialog({ text: "%i18n:@verified%" });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
@import '~const.styl'
|
||||||
|
|
||||||
|
header
|
||||||
|
margin 10px 0
|
||||||
|
|
||||||
|
|
||||||
|
button
|
||||||
|
margin 16px 0
|
||||||
|
|
||||||
|
</style>
|
@ -9,12 +9,17 @@
|
|||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
<main>
|
<main>
|
||||||
<div v-if="page == 'dashboard'">
|
<div v-show="page == 'dashboard'">
|
||||||
<x-dashboard/>
|
<x-dashboard/>
|
||||||
|
<x-users-chart :chart="chart"/>
|
||||||
|
<x-notes-chart :chart="chart"/>
|
||||||
|
<x-drive-chart :chart="chart"/>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="page == 'users'">
|
<div v-if="page == 'users'">
|
||||||
<x-suspend-user/>
|
<x-suspend-user/>
|
||||||
<x-unsuspend-user/>
|
<x-unsuspend-user/>
|
||||||
|
<x-verify-user/>
|
||||||
|
<x-unverify-user/>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="page == 'drive'"></div>
|
<div v-if="page == 'drive'"></div>
|
||||||
<div v-if="page == 'update'"></div>
|
<div v-if="page == 'update'"></div>
|
||||||
@ -27,18 +32,34 @@ import Vue from "vue";
|
|||||||
import XDashboard from "./admin.dashboard.vue";
|
import XDashboard from "./admin.dashboard.vue";
|
||||||
import XSuspendUser from "./admin.suspend-user.vue";
|
import XSuspendUser from "./admin.suspend-user.vue";
|
||||||
import XUnsuspendUser from "./admin.unsuspend-user.vue";
|
import XUnsuspendUser from "./admin.unsuspend-user.vue";
|
||||||
|
import XVerifyUser from "./admin.verify-user.vue";
|
||||||
|
import XUnverifyUser from "./admin.unverify-user.vue";
|
||||||
|
import XUsersChart from "./admin.users-chart.vue";
|
||||||
|
import XNotesChart from "./admin.notes-chart.vue";
|
||||||
|
import XDriveChart from "./admin.drive-chart.vue";
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
components: {
|
components: {
|
||||||
XDashboard,
|
XDashboard,
|
||||||
XSuspendUser,
|
XSuspendUser,
|
||||||
XUnsuspendUser
|
XUnsuspendUser,
|
||||||
|
XVerifyUser,
|
||||||
|
XUnverifyUser,
|
||||||
|
XUsersChart,
|
||||||
|
XNotesChart,
|
||||||
|
XDriveChart
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
page: 'dashboard'
|
page: 'dashboard',
|
||||||
|
chart: null
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
created() {
|
||||||
|
(this as any).api('admin/chart').then(chart => {
|
||||||
|
this.chart = chart;
|
||||||
|
});
|
||||||
|
},
|
||||||
methods: {
|
methods: {
|
||||||
nav(page: string) {
|
nav(page: string) {
|
||||||
this.page = page;
|
this.page = page;
|
||||||
@ -47,7 +68,7 @@ export default Vue.extend({
|
|||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="stylus" scoped>
|
<style lang="stylus">
|
||||||
@import '~const.styl'
|
@import '~const.styl'
|
||||||
|
|
||||||
.mk-admin
|
.mk-admin
|
||||||
@ -90,13 +111,23 @@ export default Vue.extend({
|
|||||||
width 100%
|
width 100%
|
||||||
padding 16px 32px
|
padding 16px 32px
|
||||||
|
|
||||||
header
|
> div
|
||||||
margin 10px 0
|
> div
|
||||||
|
max-width 800px
|
||||||
|
|
||||||
|
.card
|
||||||
|
padding 32px
|
||||||
|
background #fff
|
||||||
|
box-shadow 0 2px 8px rgba(#000, 0.1)
|
||||||
|
|
||||||
button
|
&:not(:last-child)
|
||||||
margin 16px 0
|
margin-bottom 16px
|
||||||
position absolute
|
|
||||||
right 0
|
> header
|
||||||
|
margin 0 0 1em 0
|
||||||
|
padding 0 0 8px 0
|
||||||
|
font-size 1em
|
||||||
|
color #555
|
||||||
|
border-bottom solid 1px #eee
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
@ -70,7 +70,8 @@ export default Vue.extend({
|
|||||||
limit: fetchLimit + 1,
|
limit: fetchLimit + 1,
|
||||||
mediaOnly: this.mediaOnly,
|
mediaOnly: this.mediaOnly,
|
||||||
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
||||||
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
|
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
|
||||||
|
includeLocalRenotes: this.$store.state.settings.showLocalRenotes
|
||||||
}).then(notes => {
|
}).then(notes => {
|
||||||
if (notes.length == fetchLimit + 1) {
|
if (notes.length == fetchLimit + 1) {
|
||||||
notes.pop();
|
notes.pop();
|
||||||
@ -91,7 +92,8 @@ export default Vue.extend({
|
|||||||
untilId: (this.$refs.timeline as any).tail().id,
|
untilId: (this.$refs.timeline as any).tail().id,
|
||||||
mediaOnly: this.mediaOnly,
|
mediaOnly: this.mediaOnly,
|
||||||
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
||||||
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
|
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
|
||||||
|
includeLocalRenotes: this.$store.state.settings.showLocalRenotes
|
||||||
});
|
});
|
||||||
|
|
||||||
promise.then(notes => {
|
promise.then(notes => {
|
||||||
|
@ -140,6 +140,12 @@ export default Vue.extend({
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this.$store.state.settings.showLocalRenotes === false) {
|
||||||
|
if (isPureRenote && (note.renote.user.host == null)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
if (this.isScrollTop()) {
|
if (this.isScrollTop()) {
|
||||||
|
@ -98,7 +98,8 @@ export default Vue.extend({
|
|||||||
limit: fetchLimit + 1,
|
limit: fetchLimit + 1,
|
||||||
mediaOnly: this.mediaOnly,
|
mediaOnly: this.mediaOnly,
|
||||||
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
||||||
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
|
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
|
||||||
|
includeLocalRenotes: this.$store.state.settings.showLocalRenotes
|
||||||
}).then(notes => {
|
}).then(notes => {
|
||||||
if (notes.length == fetchLimit + 1) {
|
if (notes.length == fetchLimit + 1) {
|
||||||
notes.pop();
|
notes.pop();
|
||||||
@ -119,7 +120,8 @@ export default Vue.extend({
|
|||||||
mediaOnly: this.mediaOnly,
|
mediaOnly: this.mediaOnly,
|
||||||
untilId: (this.$refs.timeline as any).tail().id,
|
untilId: (this.$refs.timeline as any).tail().id,
|
||||||
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
||||||
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
|
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
|
||||||
|
includeLocalRenotes: this.$store.state.settings.showLocalRenotes
|
||||||
});
|
});
|
||||||
|
|
||||||
promise.then(notes => {
|
promise.then(notes => {
|
||||||
|
@ -4,11 +4,10 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import * as config from '../../../config';
|
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
mounted() {
|
mounted() {
|
||||||
document.title = `${config.name} - %i18n:@title%`;
|
document.title = `${(this as any).os.instanceName} - %i18n:@title%`;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
@ -7,7 +7,6 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import Progress from '../../../common/scripts/loading';
|
import Progress from '../../../common/scripts/loading';
|
||||||
import * as config from '../../../config';
|
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
props: {
|
props: {
|
||||||
@ -17,7 +16,7 @@ export default Vue.extend({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
document.title = config.name;
|
document.title = (this as any).os.instanceName;
|
||||||
|
|
||||||
Progress.start();
|
Progress.start();
|
||||||
},
|
},
|
||||||
|
@ -12,12 +12,11 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import * as config from '../../../config';
|
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
name: config.name,
|
name: (this as any).os.instanceName,
|
||||||
posted: false,
|
posted: false,
|
||||||
text: new URLSearchParams(location.search).get('text')
|
text: new URLSearchParams(location.search).get('text')
|
||||||
};
|
};
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
<template v-if="$store.state.device.darkmode">%fa:moon%</template>
|
<template v-if="$store.state.device.darkmode">%fa:moon%</template>
|
||||||
<template v-else>%fa:R moon%</template>
|
<template v-else>%fa:R moon%</template>
|
||||||
</button>
|
</button>
|
||||||
<div class="body" :style="{ backgroundImage: `url('${ welcomeBgUrl }')` }">
|
<div class="body">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="info">
|
<div class="info">
|
||||||
<span><b>{{ host }}</b></span>
|
<span><b>{{ host }}</b></span>
|
||||||
@ -46,22 +46,26 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import { host, name, description, copyright, welcomeBgUrl } from '../../../config';
|
import { host, copyright } from '../../../config';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
stats: null,
|
stats: null,
|
||||||
copyright,
|
copyright,
|
||||||
welcomeBgUrl,
|
|
||||||
host,
|
host,
|
||||||
name,
|
name: 'Misskey',
|
||||||
description,
|
description: '',
|
||||||
pointerInterval: null,
|
pointerInterval: null,
|
||||||
tags: []
|
tags: []
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
|
(this as any).os.getMeta().then(meta => {
|
||||||
|
this.name = meta.name;
|
||||||
|
this.description = meta.description;
|
||||||
|
});
|
||||||
|
|
||||||
(this as any).api('stats').then(stats => {
|
(this as any).api('stats').then(stats => {
|
||||||
this.stats = stats;
|
this.stats = stats;
|
||||||
});
|
});
|
||||||
|
@ -5,16 +5,6 @@
|
|||||||
<b-form-group label="アプリケーション名" description="あなたのアプリの名称。">
|
<b-form-group label="アプリケーション名" description="あなたのアプリの名称。">
|
||||||
<b-form-input v-model="name" type="text" placeholder="ex) Misskey for iOS" autocomplete="off" required/>
|
<b-form-input v-model="name" type="text" placeholder="ex) Misskey for iOS" autocomplete="off" required/>
|
||||||
</b-form-group>
|
</b-form-group>
|
||||||
<b-form-group label="ID" description="あなたのアプリのID。">
|
|
||||||
<b-input v-model="nid" type="text" pattern="^[a-zA-Z0-9_]{1,30}$" placeholder="ex) misskey-for-ios" autocomplete="off" required/>
|
|
||||||
<p class="info" v-if="nidState == 'wait'" style="color:#999">%fa:spinner .pulse .fw%確認しています...</p>
|
|
||||||
<p class="info" v-if="nidState == 'ok'" style="color:#3CB7B5">%fa:fw check%利用できます</p>
|
|
||||||
<p class="info" v-if="nidState == 'unavailable'" style="color:#FF1161">%fa:fw exclamation-triangle%既に利用されています</p>
|
|
||||||
<p class="info" v-if="nidState == 'error'" style="color:#FF1161">%fa:fw exclamation-triangle%通信エラー</p>
|
|
||||||
<p class="info" v-if="nidState == 'invalid-format'" style="color:#FF1161">%fa:fw exclamation-triangle%a~z、A~Z、0~9、_が使えます</p>
|
|
||||||
<p class="info" v-if="nidState == 'min-range'" style="color:#FF1161">%fa:fw exclamation-triangle%1文字以上でお願いします!</p>
|
|
||||||
<p class="info" v-if="nidState == 'max-range'" style="color:#FF1161">%fa:fw exclamation-triangle%30文字以内でお願いします</p>
|
|
||||||
</b-form-group>
|
|
||||||
<b-form-group label="アプリの概要" description="あなたのアプリの簡単な説明や紹介。">
|
<b-form-group label="アプリの概要" description="あなたのアプリの簡単な説明や紹介。">
|
||||||
<b-textarea v-model="description" placeholder="ex) Misskey iOSクライアント。" autocomplete="off" required></b-textarea>
|
<b-textarea v-model="description" placeholder="ex) Misskey iOSクライアント。" autocomplete="off" required></b-textarea>
|
||||||
</b-form-group>
|
</b-form-group>
|
||||||
@ -50,52 +40,21 @@ export default Vue.extend({
|
|||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
name: '',
|
name: '',
|
||||||
nid: '',
|
|
||||||
description: '',
|
description: '',
|
||||||
cb: '',
|
cb: '',
|
||||||
nidState: null,
|
nidState: null,
|
||||||
permission: []
|
permission: []
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
watch: {
|
|
||||||
nid() {
|
|
||||||
if (this.nid == null || this.nid == '') {
|
|
||||||
this.nidState = null;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const err =
|
|
||||||
!this.nid.match(/^[a-zA-Z0-9_]+$/) ? 'invalid-format' :
|
|
||||||
this.nid.length < 1 ? 'min-range' :
|
|
||||||
this.nid.length > 30 ? 'max-range' :
|
|
||||||
null;
|
|
||||||
|
|
||||||
if (err) {
|
|
||||||
this.nidState = err;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.nidState = 'wait';
|
|
||||||
|
|
||||||
(this as any).api('app/name_id/available', {
|
|
||||||
nameId: this.nid
|
|
||||||
}).then(result => {
|
|
||||||
this.nidState = result.available ? 'ok' : 'unavailable';
|
|
||||||
}).catch(err => {
|
|
||||||
this.nidState = 'error';
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
methods: {
|
||||||
onSubmit() {
|
onSubmit() {
|
||||||
(this as any).api('app/create', {
|
(this as any).api('app/create', {
|
||||||
name: this.name,
|
name: this.name,
|
||||||
nameId: this.nid,
|
|
||||||
description: this.description,
|
description: this.description,
|
||||||
callbackUrl: this.cb,
|
callbackUrl: this.cb,
|
||||||
permission: this.permission
|
permission: this.permission
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
location.href = '/apps';
|
location.href = '/dev/apps';
|
||||||
}).catch(() => {
|
}).catch(() => {
|
||||||
alert('アプリの作成に失敗しました。再度お試しください。');
|
alert('アプリの作成に失敗しました。再度お試しください。');
|
||||||
});
|
});
|
||||||
|
@ -70,6 +70,10 @@ export default class MiOS extends EventEmitter {
|
|||||||
chachedAt: Date;
|
chachedAt: Date;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
public get instanceName() {
|
||||||
|
return this.meta ? this.meta.data.name : 'Misskey';
|
||||||
|
}
|
||||||
|
|
||||||
private isMetaFetching = false;
|
private isMetaFetching = false;
|
||||||
|
|
||||||
public app: Vue;
|
public app: Vue;
|
||||||
|
@ -30,6 +30,10 @@
|
|||||||
<span class="data-size">{{ file.datasize | bytes }}</span>
|
<span class="data-size">{{ file.datasize | bytes }}</span>
|
||||||
<span class="separator"></span>
|
<span class="separator"></span>
|
||||||
<span class="created-at" @click="showCreatedAt">%fa:R clock%<mk-time :time="file.createdAt"/></span>
|
<span class="created-at" @click="showCreatedAt">%fa:R clock%<mk-time :time="file.createdAt"/></span>
|
||||||
|
<template v-if="file.isSensitive">
|
||||||
|
<span class="separator"></span>
|
||||||
|
<span class="nsfw">%fa:eye-slash% %i18n:@nsfw%</span>
|
||||||
|
</template>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="menu">
|
<div class="menu">
|
||||||
@ -198,6 +202,9 @@ export default Vue.extend({
|
|||||||
> [data-fa]
|
> [data-fa]
|
||||||
margin-right 2px
|
margin-right 2px
|
||||||
|
|
||||||
|
> .nsfw
|
||||||
|
color #bf4633
|
||||||
|
|
||||||
> .menu
|
> .menu
|
||||||
padding 14px
|
padding 14px
|
||||||
border-top solid 1px #dfdfdf
|
border-top solid 1px #dfdfdf
|
||||||
|
@ -14,13 +14,17 @@
|
|||||||
li.tag(style={background: tag.color, color: contrast(tag.color)})= tag.name
|
li.tag(style={background: tag.color, color: contrast(tag.color)})= tag.name
|
||||||
-->
|
-->
|
||||||
<footer>
|
<footer>
|
||||||
<p class="type"><mk-file-type-icon :type="file.type"/>{{ file.type }}</p>
|
<span class="type"><mk-file-type-icon :type="file.type"/>{{ file.type }}</span>
|
||||||
<p class="separator"></p>
|
<span class="separator"></span>
|
||||||
<p class="data-size">{{ file.datasize | bytes }}</p>
|
<span class="data-size">{{ file.datasize | bytes }}</span>
|
||||||
<p class="separator"></p>
|
<span class="separator"></span>
|
||||||
<p class="created-at">
|
<span class="created-at">
|
||||||
%fa:R clock%<mk-time :time="file.createdAt"/>
|
%fa:R clock%<mk-time :time="file.createdAt"/>
|
||||||
</p>
|
</span>
|
||||||
|
<template v-if="file.isSensitive">
|
||||||
|
<span class="separator"></span>
|
||||||
|
<span class="nsfw">%fa:eye-slash% %i18n:@nsfw%</span>
|
||||||
|
</template>
|
||||||
</footer>
|
</footer>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -133,35 +137,27 @@ export default Vue.extend({
|
|||||||
font-size 0.7em
|
font-size 0.7em
|
||||||
|
|
||||||
> .separator
|
> .separator
|
||||||
display inline
|
|
||||||
margin 0
|
|
||||||
padding 0 4px
|
padding 0 4px
|
||||||
color #CDCDCD
|
color #CDCDCD
|
||||||
|
|
||||||
> .type
|
> .type
|
||||||
display inline
|
|
||||||
margin 0
|
|
||||||
padding 0
|
|
||||||
color #9D9D9D
|
color #9D9D9D
|
||||||
|
|
||||||
> .mk-file-type-icon
|
> .mk-file-type-icon
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
> .data-size
|
> .data-size
|
||||||
display inline
|
|
||||||
margin 0
|
|
||||||
padding 0
|
|
||||||
color #9D9D9D
|
color #9D9D9D
|
||||||
|
|
||||||
> .created-at
|
> .created-at
|
||||||
display inline
|
|
||||||
margin 0
|
|
||||||
padding 0
|
|
||||||
color #BDBDBD
|
color #BDBDBD
|
||||||
|
|
||||||
> [data-fa]
|
> [data-fa]
|
||||||
margin-right 2px
|
margin-right 2px
|
||||||
|
|
||||||
|
> .nsfw
|
||||||
|
color #bf4633
|
||||||
|
|
||||||
&[data-is-selected]
|
&[data-is-selected]
|
||||||
background $theme-color
|
background $theme-color
|
||||||
|
|
||||||
|
@ -38,7 +38,6 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import getNoteSummary from '../../../../../misc/get-note-summary';
|
import getNoteSummary from '../../../../../misc/get-note-summary';
|
||||||
import * as config from '../../../config';
|
|
||||||
|
|
||||||
const displayLimit = 30;
|
const displayLimit = 30;
|
||||||
|
|
||||||
@ -139,6 +138,12 @@ export default Vue.extend({
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this.$store.state.settings.showLocalRenotes === false) {
|
||||||
|
if (isPureRenote && (note.renote.user.host == null)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
// 投稿が自分のものではないかつ、タブが非表示またはスクロール位置が最上部ではないならタイトルで通知
|
// 投稿が自分のものではないかつ、タブが非表示またはスクロール位置が最上部ではないならタイトルで通知
|
||||||
@ -184,7 +189,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
clearNotification() {
|
clearNotification() {
|
||||||
this.unreadCount = 0;
|
this.unreadCount = 0;
|
||||||
document.title = config.name;
|
document.title = (this as any).os.instanceName;
|
||||||
},
|
},
|
||||||
|
|
||||||
onVisibilitychange() {
|
onVisibilitychange() {
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
<div class="attaches" v-show="files.length != 0">
|
<div class="attaches" v-show="files.length != 0">
|
||||||
<x-draggable class="files" :list="files" :options="{ animation: 150 }">
|
<x-draggable class="files" :list="files" :options="{ animation: 150 }">
|
||||||
<div class="file" v-for="file in files" :key="file.id">
|
<div class="file" v-for="file in files" :key="file.id">
|
||||||
<div class="img" :style="`background-image: url(${file.url})`" @click="detachMedia(file)"></div>
|
<div class="img" :style="`background-image: url(${file.thumbnailUrl})`" @click="detachMedia(file)"></div>
|
||||||
</div>
|
</div>
|
||||||
</x-draggable>
|
</x-draggable>
|
||||||
</div>
|
</div>
|
||||||
@ -45,7 +45,7 @@
|
|||||||
<input ref="file" class="file" type="file" accept="image/*" multiple="multiple" @change="onChangeFile"/>
|
<input ref="file" class="file" type="file" accept="image/*" multiple="multiple" @change="onChangeFile"/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="hashtags" v-if="recentHashtags.length > 0">
|
<div class="hashtags" v-if="recentHashtags.length > 0 && $store.state.settings.suggestRecentHashtags">
|
||||||
<a v-for="tag in recentHashtags.slice(0, 5)" @click="addTag(tag)">#{{ tag }}</a>
|
<a v-for="tag in recentHashtags.slice(0, 5)" @click="addTag(tag)">#{{ tag }}</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -56,7 +56,7 @@ import Vue from 'vue';
|
|||||||
import insertTextAtCursor from 'insert-text-at-cursor';
|
import insertTextAtCursor from 'insert-text-at-cursor';
|
||||||
import * as XDraggable from 'vuedraggable';
|
import * as XDraggable from 'vuedraggable';
|
||||||
import MkVisibilityChooser from '../../../common/views/components/visibility-chooser.vue';
|
import MkVisibilityChooser from '../../../common/views/components/visibility-chooser.vue';
|
||||||
import getKao from '../../../common/scripts/get-kao';
|
import getFace from '../../../common/scripts/get-face';
|
||||||
import parse from '../../../../../mfm/parse';
|
import parse from '../../../../../mfm/parse';
|
||||||
import { host } from '../../../config';
|
import { host } from '../../../config';
|
||||||
|
|
||||||
@ -94,7 +94,7 @@ export default Vue.extend({
|
|||||||
files: [],
|
files: [],
|
||||||
poll: false,
|
poll: false,
|
||||||
geo: null,
|
geo: null,
|
||||||
visibility: 'public',
|
visibility: this.$store.state.device.visibility || 'public',
|
||||||
visibleUsers: [],
|
visibleUsers: [],
|
||||||
useCw: false,
|
useCw: false,
|
||||||
cw: null,
|
cw: null,
|
||||||
@ -240,8 +240,7 @@ export default Vue.extend({
|
|||||||
setVisibility() {
|
setVisibility() {
|
||||||
const w = (this as any).os.new(MkVisibilityChooser, {
|
const w = (this as any).os.new(MkVisibilityChooser, {
|
||||||
source: this.$refs.visibilityButton,
|
source: this.$refs.visibilityButton,
|
||||||
compact: true,
|
compact: true
|
||||||
v: this.visibility
|
|
||||||
});
|
});
|
||||||
w.$once('chosen', v => {
|
w.$once('chosen', v => {
|
||||||
this.visibility = v;
|
this.visibility = v;
|
||||||
@ -314,7 +313,7 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
kao() {
|
kao() {
|
||||||
this.text += getKao();
|
this.text += getFace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
<button class="nav" @click="$parent.isDrawerOpening = true">%fa:bars%</button>
|
<button class="nav" @click="$parent.isDrawerOpening = true">%fa:bars%</button>
|
||||||
<template v-if="hasUnreadNotification || hasUnreadMessagingMessage || hasGameInvitation">%fa:circle%</template>
|
<template v-if="hasUnreadNotification || hasUnreadMessagingMessage || hasGameInvitation">%fa:circle%</template>
|
||||||
<h1>
|
<h1>
|
||||||
<slot>config.name</slot>
|
<slot>{{ os.instanceName }}</slot>
|
||||||
</h1>
|
</h1>
|
||||||
<slot name="func"></slot>
|
<slot name="func"></slot>
|
||||||
</div>
|
</div>
|
||||||
@ -20,13 +20,11 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import * as anime from 'animejs';
|
import * as anime from 'animejs';
|
||||||
import * as config from '../../../config';
|
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
props: ['func'],
|
props: ['func'],
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
config,
|
|
||||||
hasGameInvitation: false,
|
hasGameInvitation: false,
|
||||||
connection: null,
|
connection: null,
|
||||||
connectionId: null
|
connectionId: null
|
||||||
|
@ -59,7 +59,8 @@ export default Vue.extend({
|
|||||||
listId: this.list.id,
|
listId: this.list.id,
|
||||||
limit: fetchLimit + 1,
|
limit: fetchLimit + 1,
|
||||||
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
||||||
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
|
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
|
||||||
|
includeLocalRenotes: this.$store.state.settings.showLocalRenotes
|
||||||
}).then(notes => {
|
}).then(notes => {
|
||||||
if (notes.length == fetchLimit + 1) {
|
if (notes.length == fetchLimit + 1) {
|
||||||
notes.pop();
|
notes.pop();
|
||||||
@ -82,7 +83,8 @@ export default Vue.extend({
|
|||||||
limit: fetchLimit + 1,
|
limit: fetchLimit + 1,
|
||||||
untilId: (this.$refs.timeline as any).tail().id,
|
untilId: (this.$refs.timeline as any).tail().id,
|
||||||
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
||||||
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
|
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
|
||||||
|
includeLocalRenotes: this.$store.state.settings.showLocalRenotes
|
||||||
});
|
});
|
||||||
|
|
||||||
promise.then(notes => {
|
promise.then(notes => {
|
||||||
|
@ -25,7 +25,6 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import Progress from '../../../common/scripts/loading';
|
import Progress from '../../../common/scripts/loading';
|
||||||
import * as config from '../../../config';
|
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
data() {
|
data() {
|
||||||
@ -44,7 +43,7 @@ export default Vue.extend({
|
|||||||
window.addEventListener('popstate', this.onPopState);
|
window.addEventListener('popstate', this.onPopState);
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
document.title = `${config.name} Drive`;
|
document.title = `${(this as any).os.instanceName} Drive`;
|
||||||
document.documentElement.style.background = '#fff';
|
document.documentElement.style.background = '#fff';
|
||||||
},
|
},
|
||||||
beforeDestroy() {
|
beforeDestroy() {
|
||||||
@ -64,7 +63,7 @@ export default Vue.extend({
|
|||||||
(this.$refs as any).browser.openContextMenu();
|
(this.$refs as any).browser.openContextMenu();
|
||||||
},
|
},
|
||||||
onMoveRoot(silent) {
|
onMoveRoot(silent) {
|
||||||
const title = `${config.name} Drive`;
|
const title = `${(this as any).os.instanceName} Drive`;
|
||||||
|
|
||||||
if (!silent) {
|
if (!silent) {
|
||||||
// Rewrite URL
|
// Rewrite URL
|
||||||
@ -77,7 +76,7 @@ export default Vue.extend({
|
|||||||
this.folder = null;
|
this.folder = null;
|
||||||
},
|
},
|
||||||
onOpenFolder(folder, silent) {
|
onOpenFolder(folder, silent) {
|
||||||
const title = `${folder.name} | ${config.name} Drive`;
|
const title = `${folder.name} | ${(this as any).os.instanceName} Drive`;
|
||||||
|
|
||||||
if (!silent) {
|
if (!silent) {
|
||||||
// Rewrite URL
|
// Rewrite URL
|
||||||
@ -90,7 +89,7 @@ export default Vue.extend({
|
|||||||
this.folder = folder;
|
this.folder = folder;
|
||||||
},
|
},
|
||||||
onOpenFile(file, silent) {
|
onOpenFile(file, silent) {
|
||||||
const title = `${file.name} | ${config.name} Drive`;
|
const title = `${file.name} | ${(this as any).os.instanceName} Drive`;
|
||||||
|
|
||||||
if (!silent) {
|
if (!silent) {
|
||||||
// Rewrite URL
|
// Rewrite URL
|
||||||
|
@ -14,7 +14,6 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import Progress from '../../../common/scripts/loading';
|
import Progress from '../../../common/scripts/loading';
|
||||||
import * as config from '../../../config';
|
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
data() {
|
data() {
|
||||||
@ -29,7 +28,7 @@ export default Vue.extend({
|
|||||||
this.fetch();
|
this.fetch();
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
document.title = `${config.name} | %i18n:@notifications%`;
|
document.title = `${(this as any).os.instanceName} | %i18n:@notifications%`;
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
fetch() {
|
fetch() {
|
||||||
|
@ -21,7 +21,6 @@ import Vue from 'vue';
|
|||||||
import Progress from '../../../common/scripts/loading';
|
import Progress from '../../../common/scripts/loading';
|
||||||
import parseAcct from '../../../../../misc/acct/parse';
|
import parseAcct from '../../../../../misc/acct/parse';
|
||||||
import getUserName from '../../../../../misc/get-user-name';
|
import getUserName from '../../../../../misc/get-user-name';
|
||||||
import * as config from '../../../config';
|
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
data() {
|
data() {
|
||||||
@ -50,7 +49,7 @@ export default Vue.extend({
|
|||||||
this.user = user;
|
this.user = user;
|
||||||
this.fetching = false;
|
this.fetching = false;
|
||||||
|
|
||||||
document.title = '%i18n:@followers-of%'.replace('{}', this.name) + ' | ' + config.name;
|
document.title = '%i18n:@followers-of%'.replace('{}', this.name) + ' | ' + (this as any).os.instanceName;
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
onLoaded() {
|
onLoaded() {
|
||||||
|
@ -20,7 +20,6 @@
|
|||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import Progress from '../../../common/scripts/loading';
|
import Progress from '../../../common/scripts/loading';
|
||||||
import parseAcct from '../../../../../misc/acct/parse';
|
import parseAcct from '../../../../../misc/acct/parse';
|
||||||
import * as config from '../../../config';
|
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
data() {
|
data() {
|
||||||
@ -49,7 +48,7 @@ export default Vue.extend({
|
|||||||
this.user = user;
|
this.user = user;
|
||||||
this.fetching = false;
|
this.fetching = false;
|
||||||
|
|
||||||
document.title = '%i18n:@followers-of%'.replace('{}', this.name) + ' | ' + config.name;
|
document.title = '%i18n:@followers-of%'.replace('{}', this.name) + ' | ' + (this as any).os.instanceName;
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
onLoaded() {
|
onLoaded() {
|
||||||
|
@ -7,11 +7,10 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import * as config from '../../../../config';
|
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
mounted() {
|
mounted() {
|
||||||
document.title = `${config.name} %i18n:@reversi%`;
|
document.title = `${(this as any).os.instanceName} %i18n:@reversi%`;
|
||||||
document.documentElement.style.background = '#fff';
|
document.documentElement.style.background = '#fff';
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
@ -95,7 +95,8 @@ export default Vue.extend({
|
|||||||
limit: fetchLimit + 1,
|
limit: fetchLimit + 1,
|
||||||
untilDate: this.date ? this.date.getTime() : undefined,
|
untilDate: this.date ? this.date.getTime() : undefined,
|
||||||
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
||||||
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
|
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
|
||||||
|
includeLocalRenotes: this.$store.state.settings.showLocalRenotes
|
||||||
}).then(notes => {
|
}).then(notes => {
|
||||||
if (notes.length == fetchLimit + 1) {
|
if (notes.length == fetchLimit + 1) {
|
||||||
notes.pop();
|
notes.pop();
|
||||||
@ -117,7 +118,8 @@ export default Vue.extend({
|
|||||||
limit: fetchLimit + 1,
|
limit: fetchLimit + 1,
|
||||||
untilId: (this.$refs.timeline as any).tail().id,
|
untilId: (this.$refs.timeline as any).tail().id,
|
||||||
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
||||||
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
|
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
|
||||||
|
includeLocalRenotes: this.$store.state.settings.showLocalRenotes
|
||||||
});
|
});
|
||||||
|
|
||||||
promise.then(notes => {
|
promise.then(notes => {
|
||||||
|
@ -49,7 +49,6 @@
|
|||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import Progress from '../../../common/scripts/loading';
|
import Progress from '../../../common/scripts/loading';
|
||||||
import XTl from './home.timeline.vue';
|
import XTl from './home.timeline.vue';
|
||||||
import * as config from '../../../config';
|
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
components: {
|
components: {
|
||||||
@ -97,7 +96,7 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
mounted() {
|
mounted() {
|
||||||
document.title = config.name;
|
document.title = (this as any).os.instanceName;
|
||||||
|
|
||||||
Progress.start();
|
Progress.start();
|
||||||
|
|
||||||
|
@ -11,7 +11,6 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import parseAcct from '../../../../../misc/acct/parse';
|
import parseAcct from '../../../../../misc/acct/parse';
|
||||||
import * as config from '../../../config';
|
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
data() {
|
data() {
|
||||||
@ -48,7 +47,7 @@ export default Vue.extend({
|
|||||||
this.user = user;
|
this.user = user;
|
||||||
this.fetching = false;
|
this.fetching = false;
|
||||||
|
|
||||||
document.title = `%i18n:@messaging%: ${Vue.filter('userName')(this.user)} | ${config.name}`;
|
document.title = `%i18n:@messaging%: ${Vue.filter('userName')(this.user)} | ${(this as any).os.instanceName}`;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,11 +8,10 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import getAcct from '../../../../../misc/acct/render';
|
import getAcct from '../../../../../misc/acct/render';
|
||||||
import * as config from '../../../config';
|
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
mounted() {
|
mounted() {
|
||||||
document.title = `${config.name} %i18n:@messaging%`;
|
document.title = `${(this as any).os.instanceName} %i18n:@messaging%`;
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
navigate(user) {
|
navigate(user) {
|
||||||
|
@ -16,7 +16,6 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import Progress from '../../../common/scripts/loading';
|
import Progress from '../../../common/scripts/loading';
|
||||||
import * as config from '../../../config';
|
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
data() {
|
data() {
|
||||||
@ -32,7 +31,7 @@ export default Vue.extend({
|
|||||||
this.fetch();
|
this.fetch();
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
document.title = config.name;
|
document.title = (this as any).os.instanceName;
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
fetch() {
|
fetch() {
|
||||||
|
@ -12,7 +12,6 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import Progress from '../../../common/scripts/loading';
|
import Progress from '../../../common/scripts/loading';
|
||||||
import * as config from '../../../config';
|
|
||||||
|
|
||||||
const limit = 20;
|
const limit = 20;
|
||||||
|
|
||||||
@ -35,7 +34,7 @@ export default Vue.extend({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
document.title = `%i18n:@search%: ${this.q} | ${config.name}`;
|
document.title = `%i18n:@search%: ${this.q} | ${(this as any).os.instanceName}`;
|
||||||
|
|
||||||
this.fetch();
|
this.fetch();
|
||||||
},
|
},
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
<ui-switch v-model="$store.state.settings.showReplyTarget" @change="onChangeShowReplyTarget">%i18n:@show-reply-target%</ui-switch>
|
<ui-switch v-model="$store.state.settings.showReplyTarget" @change="onChangeShowReplyTarget">%i18n:@show-reply-target%</ui-switch>
|
||||||
<ui-switch v-model="$store.state.settings.showMyRenotes" @change="onChangeShowMyRenotes">%i18n:@show-my-renotes%</ui-switch>
|
<ui-switch v-model="$store.state.settings.showMyRenotes" @change="onChangeShowMyRenotes">%i18n:@show-my-renotes%</ui-switch>
|
||||||
<ui-switch v-model="$store.state.settings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes">%i18n:@show-renoted-my-notes%</ui-switch>
|
<ui-switch v-model="$store.state.settings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes">%i18n:@show-renoted-my-notes%</ui-switch>
|
||||||
|
<ui-switch v-model="$store.state.settings.showLocalRenotes" @change="onChangeShowLocalRenotes">%i18n:@show-local-renotes%</ui-switch>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
@ -221,6 +222,13 @@ export default Vue.extend({
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
onChangeShowLocalRenotes(v) {
|
||||||
|
this.$store.dispatch('settings/set', {
|
||||||
|
key: 'showLocalRenotes',
|
||||||
|
value: v
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
checkForUpdate() {
|
checkForUpdate() {
|
||||||
this.checkingForUpdate = true;
|
this.checkingForUpdate = true;
|
||||||
checkForUpdate((this as any).os, true, true).then(newer => {
|
checkForUpdate((this as any).os, true, true).then(newer => {
|
||||||
|
@ -61,7 +61,6 @@ export default Vue.extend({
|
|||||||
birthday: null,
|
birthday: null,
|
||||||
avatarId: null,
|
avatarId: null,
|
||||||
bannerId: null,
|
bannerId: null,
|
||||||
isBot: false,
|
|
||||||
isCat: false,
|
isCat: false,
|
||||||
saving: false,
|
saving: false,
|
||||||
avatarUploading: false,
|
avatarUploading: false,
|
||||||
@ -77,7 +76,6 @@ export default Vue.extend({
|
|||||||
this.birthday = this.$store.state.i.profile.birthday;
|
this.birthday = this.$store.state.i.profile.birthday;
|
||||||
this.avatarId = this.$store.state.i.avatarId;
|
this.avatarId = this.$store.state.i.avatarId;
|
||||||
this.bannerId = this.$store.state.i.bannerId;
|
this.bannerId = this.$store.state.i.bannerId;
|
||||||
this.isBot = this.$store.state.i.isBot;
|
|
||||||
this.isCat = this.$store.state.i.isCat;
|
this.isCat = this.$store.state.i.isCat;
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -93,15 +91,15 @@ export default Vue.extend({
|
|||||||
method: 'POST',
|
method: 'POST',
|
||||||
body: data
|
body: data
|
||||||
})
|
})
|
||||||
.then(response => response.json())
|
.then(response => response.json())
|
||||||
.then(f => {
|
.then(f => {
|
||||||
this.avatarId = f.id;
|
this.avatarId = f.id;
|
||||||
this.avatarUploading = false;
|
this.avatarUploading = false;
|
||||||
})
|
})
|
||||||
.catch(e => {
|
.catch(e => {
|
||||||
this.avatarUploading = false;
|
this.avatarUploading = false;
|
||||||
alert('%18n:!@upload-failed%');
|
alert('%18n:@upload-failed%');
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
onBannerChange([file]) {
|
onBannerChange([file]) {
|
||||||
@ -115,15 +113,15 @@ export default Vue.extend({
|
|||||||
method: 'POST',
|
method: 'POST',
|
||||||
body: data
|
body: data
|
||||||
})
|
})
|
||||||
.then(response => response.json())
|
.then(response => response.json())
|
||||||
.then(f => {
|
.then(f => {
|
||||||
this.bannerId = f.id;
|
this.bannerId = f.id;
|
||||||
this.bannerUploading = false;
|
this.bannerUploading = false;
|
||||||
})
|
})
|
||||||
.catch(e => {
|
.catch(e => {
|
||||||
this.bannerUploading = false;
|
this.bannerUploading = false;
|
||||||
alert('%18n:!@upload-failed%');
|
alert('%18n:@upload-failed%');
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
save() {
|
save() {
|
||||||
@ -136,7 +134,6 @@ export default Vue.extend({
|
|||||||
birthday: this.birthday || null,
|
birthday: this.birthday || null,
|
||||||
avatarId: this.avatarId,
|
avatarId: this.avatarId,
|
||||||
bannerId: this.bannerId,
|
bannerId: this.bannerId,
|
||||||
isBot: this.isBot,
|
|
||||||
isCat: this.isCat
|
isCat: this.isCat
|
||||||
}).then(i => {
|
}).then(i => {
|
||||||
this.saving = false;
|
this.saving = false;
|
||||||
|
@ -12,12 +12,11 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import * as config from '../../../config';
|
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
name: config.name,
|
name: (this as any).os.instanceName,
|
||||||
posted: false,
|
posted: false,
|
||||||
text: new URLSearchParams(location.search).get('text')
|
text: new URLSearchParams(location.search).get('text')
|
||||||
};
|
};
|
||||||
|
@ -67,7 +67,6 @@ import * as age from 's-age';
|
|||||||
import parseAcct from '../../../../../misc/acct/parse';
|
import parseAcct from '../../../../../misc/acct/parse';
|
||||||
import Progress from '../../../common/scripts/loading';
|
import Progress from '../../../common/scripts/loading';
|
||||||
import XHome from './user/home.vue';
|
import XHome from './user/home.vue';
|
||||||
import * as config from '../../../config';
|
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
components: {
|
components: {
|
||||||
@ -107,7 +106,7 @@ export default Vue.extend({
|
|||||||
this.fetching = false;
|
this.fetching = false;
|
||||||
|
|
||||||
Progress.done();
|
Progress.done();
|
||||||
document.title = Vue.filter('userName')(this.user) + ' | ' + config.name;
|
document.title = Vue.filter('userName')(this.user) + ' | ' + (this as any).os.instanceName;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -30,7 +30,7 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import { apiUrl, copyright, host, name, description } from '../../../config';
|
import { apiUrl, copyright, host } from '../../../config';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
data() {
|
data() {
|
||||||
@ -39,12 +39,17 @@ export default Vue.extend({
|
|||||||
copyright,
|
copyright,
|
||||||
stats: null,
|
stats: null,
|
||||||
host,
|
host,
|
||||||
name,
|
name: 'Misskey',
|
||||||
description,
|
description: '',
|
||||||
tags: []
|
tags: []
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
|
(this as any).os.getMeta().then(meta => {
|
||||||
|
this.name = meta.name;
|
||||||
|
this.description = meta.description;
|
||||||
|
});
|
||||||
|
|
||||||
(this as any).api('stats').then(stats => {
|
(this as any).api('stats').then(stats => {
|
||||||
this.stats = stats;
|
this.stats = stats;
|
||||||
});
|
});
|
||||||
|
@ -53,7 +53,6 @@
|
|||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import * as XDraggable from 'vuedraggable';
|
import * as XDraggable from 'vuedraggable';
|
||||||
import * as uuid from 'uuid';
|
import * as uuid from 'uuid';
|
||||||
import * as config from '../../../config';
|
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
components: {
|
components: {
|
||||||
@ -103,7 +102,7 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
mounted() {
|
mounted() {
|
||||||
document.title = config.name;
|
document.title = (this as any).os.instanceName;
|
||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
|
@ -1,10 +0,0 @@
|
|||||||
@import "../app"
|
|
||||||
@import "../reset"
|
|
||||||
|
|
||||||
html
|
|
||||||
color #456267
|
|
||||||
background #fff
|
|
||||||
|
|
||||||
body
|
|
||||||
margin 0
|
|
||||||
padding 0
|
|
@ -1,209 +0,0 @@
|
|||||||
<mk-index>
|
|
||||||
<h1>Misskey<i>Statistics</i></h1>
|
|
||||||
<main v-if="!initializing">
|
|
||||||
<mk-users stats={ stats }/>
|
|
||||||
<mk-notes stats={ stats }/>
|
|
||||||
</main>
|
|
||||||
<footer><a href={ _URL_ }>{ _HOST_ }</a></footer>
|
|
||||||
<style lang="stylus" scoped>
|
|
||||||
:scope
|
|
||||||
display block
|
|
||||||
margin 0 auto
|
|
||||||
padding 0 16px
|
|
||||||
max-width 700px
|
|
||||||
|
|
||||||
> h1
|
|
||||||
margin 0
|
|
||||||
padding 24px 0 0 0
|
|
||||||
font-size 24px
|
|
||||||
font-weight normal
|
|
||||||
|
|
||||||
> i
|
|
||||||
font-style normal
|
|
||||||
color #f43b16
|
|
||||||
|
|
||||||
> main
|
|
||||||
> *
|
|
||||||
margin 24px 0
|
|
||||||
padding-top 24px
|
|
||||||
border-top solid 1px #eee
|
|
||||||
|
|
||||||
> h2
|
|
||||||
margin 0 0 12px 0
|
|
||||||
font-size 18px
|
|
||||||
font-weight normal
|
|
||||||
|
|
||||||
> footer
|
|
||||||
margin 24px 0
|
|
||||||
text-align center
|
|
||||||
|
|
||||||
> a
|
|
||||||
color #546567
|
|
||||||
</style>
|
|
||||||
<script lang="typescript">
|
|
||||||
this.mixin('api');
|
|
||||||
|
|
||||||
this.initializing = true;
|
|
||||||
|
|
||||||
this.on('mount', () => {
|
|
||||||
this.$root.$data.os.api('stats').then(stats => {
|
|
||||||
this.update({
|
|
||||||
initializing: false,
|
|
||||||
stats
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
</mk-index>
|
|
||||||
|
|
||||||
<mk-notes>
|
|
||||||
<h2>%i18n:stats.notes-count% <b>{ stats.notesCount }</b></h2>
|
|
||||||
<mk-notes-chart v-if="!initializing" data={ data }/>
|
|
||||||
<style lang="stylus" scoped>
|
|
||||||
:scope
|
|
||||||
display block
|
|
||||||
</style>
|
|
||||||
<script lang="typescript">
|
|
||||||
this.mixin('api');
|
|
||||||
|
|
||||||
this.initializing = true;
|
|
||||||
this.stats = this.opts.stats;
|
|
||||||
|
|
||||||
this.on('mount', () => {
|
|
||||||
this.$root.$data.os.api('aggregation/notes', {
|
|
||||||
limit: 365
|
|
||||||
}).then(data => {
|
|
||||||
this.update({
|
|
||||||
initializing: false,
|
|
||||||
data
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
</mk-notes>
|
|
||||||
|
|
||||||
<mk-users>
|
|
||||||
<h2>%i18n:stats.users-count% <b>{ stats.usersCount }</b></h2>
|
|
||||||
<mk-users-chart v-if="!initializing" data={ data }/>
|
|
||||||
<style lang="stylus" scoped>
|
|
||||||
:scope
|
|
||||||
display block
|
|
||||||
</style>
|
|
||||||
<script lang="typescript">
|
|
||||||
this.mixin('api');
|
|
||||||
|
|
||||||
this.initializing = true;
|
|
||||||
this.stats = this.opts.stats;
|
|
||||||
|
|
||||||
this.on('mount', () => {
|
|
||||||
this.$root.$data.os.api('aggregation/users', {
|
|
||||||
limit: 365
|
|
||||||
}).then(data => {
|
|
||||||
this.update({
|
|
||||||
initializing: false,
|
|
||||||
data
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
</mk-users>
|
|
||||||
|
|
||||||
<mk-notes-chart>
|
|
||||||
<svg riot-viewBox="0 0 { viewBoxX } { viewBoxY }" preserveAspectRatio="none">
|
|
||||||
<title>Black ... Total<br/>Blue ... Notes<br/>Red ... Replies<br/>Green ... Renotes</title>
|
|
||||||
<polyline
|
|
||||||
riot-points={ pointsNote }
|
|
||||||
fill="none"
|
|
||||||
stroke-width="1"
|
|
||||||
stroke="#41ddde"/>
|
|
||||||
<polyline
|
|
||||||
riot-points={ pointsReply }
|
|
||||||
fill="none"
|
|
||||||
stroke-width="1"
|
|
||||||
stroke="#f7796c"/>
|
|
||||||
<polyline
|
|
||||||
riot-points={ pointsRenote }
|
|
||||||
fill="none"
|
|
||||||
stroke-width="1"
|
|
||||||
stroke="#a1de41"/>
|
|
||||||
<polyline
|
|
||||||
riot-points={ pointsTotal }
|
|
||||||
fill="none"
|
|
||||||
stroke-width="1"
|
|
||||||
stroke="#555"
|
|
||||||
stroke-dasharray="2 2"/>
|
|
||||||
</svg>
|
|
||||||
<style lang="stylus" scoped>
|
|
||||||
:scope
|
|
||||||
display block
|
|
||||||
|
|
||||||
> svg
|
|
||||||
display block
|
|
||||||
padding 1px
|
|
||||||
width 100%
|
|
||||||
</style>
|
|
||||||
<script lang="typescript">
|
|
||||||
this.viewBoxX = 365;
|
|
||||||
this.viewBoxY = 80;
|
|
||||||
|
|
||||||
this.data = this.opts.data.reverse();
|
|
||||||
this.data.forEach(d => d.total = d.notes + d.replies + d.renotes);
|
|
||||||
const peak = Math.max.apply(null, this.data.map(d => d.total));
|
|
||||||
|
|
||||||
this.on('mount', () => {
|
|
||||||
this.render();
|
|
||||||
});
|
|
||||||
|
|
||||||
this.render = () => {
|
|
||||||
this.update({
|
|
||||||
pointsNote: this.data.map((d, i) => `${i},${(1 - (d.notes / peak)) * this.viewBoxY}`).join(' '),
|
|
||||||
pointsReply: this.data.map((d, i) => `${i},${(1 - (d.replies / peak)) * this.viewBoxY}`).join(' '),
|
|
||||||
pointsRenote: this.data.map((d, i) => `${i},${(1 - (d.renotes / peak)) * this.viewBoxY}`).join(' '),
|
|
||||||
pointsTotal: this.data.map((d, i) => `${i},${(1 - (d.total / peak)) * this.viewBoxY}`).join(' ')
|
|
||||||
});
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
</mk-notes-chart>
|
|
||||||
|
|
||||||
<mk-users-chart>
|
|
||||||
<svg riot-viewBox="0 0 { viewBoxX } { viewBoxY }" preserveAspectRatio="none">
|
|
||||||
<polyline
|
|
||||||
riot-points={ createdPoints }
|
|
||||||
fill="none"
|
|
||||||
stroke-width="1"
|
|
||||||
stroke="#1cde84"/>
|
|
||||||
<polyline
|
|
||||||
riot-points={ totalPoints }
|
|
||||||
fill="none"
|
|
||||||
stroke-width="1"
|
|
||||||
stroke="#555"/>
|
|
||||||
</svg>
|
|
||||||
<style lang="stylus" scoped>
|
|
||||||
:scope
|
|
||||||
display block
|
|
||||||
|
|
||||||
> svg
|
|
||||||
display block
|
|
||||||
padding 1px
|
|
||||||
width 100%
|
|
||||||
</style>
|
|
||||||
<script lang="typescript">
|
|
||||||
this.viewBoxX = 365;
|
|
||||||
this.viewBoxY = 80;
|
|
||||||
|
|
||||||
this.data = this.opts.data.reverse();
|
|
||||||
const totalPeak = Math.max.apply(null, this.data.map(d => d.total));
|
|
||||||
const createdPeak = Math.max.apply(null, this.data.map(d => d.created));
|
|
||||||
|
|
||||||
this.on('mount', () => {
|
|
||||||
this.render();
|
|
||||||
});
|
|
||||||
|
|
||||||
this.render = () => {
|
|
||||||
this.update({
|
|
||||||
totalPoints: this.data.map((d, i) => `${i},${(1 - (d.total / totalPeak)) * this.viewBoxY}`).join(' '),
|
|
||||||
createdPoints: this.data.map((d, i) => `${i},${(1 - (d.created / createdPeak)) * this.viewBoxY}`).join(' ')
|
|
||||||
});
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
</mk-users-chart>
|
|
@ -1 +0,0 @@
|
|||||||
require('./index.tag');
|
|
@ -1,10 +0,0 @@
|
|||||||
@import "../app"
|
|
||||||
@import "../reset"
|
|
||||||
|
|
||||||
html
|
|
||||||
color #456267
|
|
||||||
background #fff
|
|
||||||
|
|
||||||
body
|
|
||||||
margin 0
|
|
||||||
padding 0
|
|
@ -1,201 +0,0 @@
|
|||||||
<mk-index>
|
|
||||||
<h1>Misskey<i>Status</i></h1>
|
|
||||||
<p>%fa:info-circle%%i18n:status.all-systems-maybe-operational%</p>
|
|
||||||
<main>
|
|
||||||
<mk-cpu-usage connection={ connection }/>
|
|
||||||
<mk-mem-usage connection={ connection }/>
|
|
||||||
</main>
|
|
||||||
<footer><a href={ _URL_ }>{ _HOST_ }</a></footer>
|
|
||||||
<style lang="stylus" scoped>
|
|
||||||
:scope
|
|
||||||
display block
|
|
||||||
margin 0 auto
|
|
||||||
padding 0 16px
|
|
||||||
max-width 700px
|
|
||||||
|
|
||||||
> h1
|
|
||||||
margin 0
|
|
||||||
padding 24px 0 16px 0
|
|
||||||
font-size 24px
|
|
||||||
font-weight normal
|
|
||||||
|
|
||||||
> [data-fa]
|
|
||||||
font-style normal
|
|
||||||
color #f43b16
|
|
||||||
|
|
||||||
> p
|
|
||||||
display block
|
|
||||||
margin 0
|
|
||||||
padding 12px 16px
|
|
||||||
background #eaf4ef
|
|
||||||
//border solid 1px #99ccb2
|
|
||||||
border-radius 4px
|
|
||||||
|
|
||||||
> [data-fa]
|
|
||||||
margin-right 5px
|
|
||||||
|
|
||||||
> main
|
|
||||||
> *
|
|
||||||
margin 24px 0
|
|
||||||
|
|
||||||
> h2
|
|
||||||
margin 0 0 12px 0
|
|
||||||
font-size 18px
|
|
||||||
font-weight normal
|
|
||||||
|
|
||||||
> footer
|
|
||||||
margin 24px 0
|
|
||||||
text-align center
|
|
||||||
|
|
||||||
> a
|
|
||||||
color #546567
|
|
||||||
</style>
|
|
||||||
<script lang="typescript">
|
|
||||||
import Connection from '../../common/scripts/streaming/server-stream';
|
|
||||||
|
|
||||||
this.mixin('api');
|
|
||||||
|
|
||||||
this.initializing = true;
|
|
||||||
this.connection = new Connection();
|
|
||||||
|
|
||||||
this.on('mount', () => {
|
|
||||||
this.$root.$data.os.api('meta').then(meta => {
|
|
||||||
this.update({
|
|
||||||
initializing: false,
|
|
||||||
meta
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
this.on('unmount', () => {
|
|
||||||
this.connection.close();
|
|
||||||
});
|
|
||||||
|
|
||||||
</script>
|
|
||||||
</mk-index>
|
|
||||||
|
|
||||||
<mk-cpu-usage>
|
|
||||||
<h2>CPU <b>{ percentage }%</b></h2>
|
|
||||||
<mk-line-chart ref="chart"/>
|
|
||||||
<style lang="stylus" scoped>
|
|
||||||
:scope
|
|
||||||
display block
|
|
||||||
</style>
|
|
||||||
<script lang="typescript">
|
|
||||||
this.connection = this.opts.connection;
|
|
||||||
|
|
||||||
this.on('mount', () => {
|
|
||||||
this.connection.on('stats', this.onStats);
|
|
||||||
});
|
|
||||||
|
|
||||||
this.on('unmount', () => {
|
|
||||||
this.connection.off('stats', this.onStats);
|
|
||||||
});
|
|
||||||
|
|
||||||
this.onStats = stats => {
|
|
||||||
this.$refs.chart.addData(1 - stats.cpu_usage);
|
|
||||||
|
|
||||||
const percentage = (stats.cpu_usage * 100).toFixed(0);
|
|
||||||
|
|
||||||
this.update({
|
|
||||||
percentage
|
|
||||||
});
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
</mk-cpu-usage>
|
|
||||||
|
|
||||||
<mk-mem-usage>
|
|
||||||
<h2>MEM <b>{ percentage }%</b></h2>
|
|
||||||
<mk-line-chart ref="chart"/>
|
|
||||||
<style lang="stylus" scoped>
|
|
||||||
:scope
|
|
||||||
display block
|
|
||||||
</style>
|
|
||||||
<script lang="typescript">
|
|
||||||
this.connection = this.opts.connection;
|
|
||||||
|
|
||||||
this.on('mount', () => {
|
|
||||||
this.connection.on('stats', this.onStats);
|
|
||||||
});
|
|
||||||
|
|
||||||
this.on('unmount', () => {
|
|
||||||
this.connection.off('stats', this.onStats);
|
|
||||||
});
|
|
||||||
|
|
||||||
this.onStats = stats => {
|
|
||||||
stats.mem.used = stats.mem.total - stats.mem.free;
|
|
||||||
this.$refs.chart.addData(1 - (stats.mem.used / stats.mem.total));
|
|
||||||
|
|
||||||
const percentage = (stats.mem.used / stats.mem.total * 100).toFixed(0);
|
|
||||||
|
|
||||||
this.update({
|
|
||||||
percentage
|
|
||||||
});
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
</mk-mem-usage>
|
|
||||||
|
|
||||||
<mk-line-chart>
|
|
||||||
<svg riot-viewBox="0 0 { viewBoxX } { viewBoxY }" preserveAspectRatio="none">
|
|
||||||
<defs>
|
|
||||||
<linearGradient id={ gradientId } x1="0" x2="0" y1="1" y2="0">
|
|
||||||
<stop offset="0%" stop-color="rgba(244, 59, 22, 0)"></stop>
|
|
||||||
<stop offset="100%" stop-color="#f43b16"></stop>
|
|
||||||
</linearGradient>
|
|
||||||
<mask id={ maskId } x="0" y="0" riot-width={ viewBoxX } riot-height={ viewBoxY }>
|
|
||||||
<polygon
|
|
||||||
riot-points={ polygonPoints }
|
|
||||||
fill="#fff"
|
|
||||||
fill-opacity="0.5"/>
|
|
||||||
</mask>
|
|
||||||
</defs>
|
|
||||||
<line x1="0" y1="0" riot-x2={ viewBoxX } y2="0" stroke="rgba(255, 255, 255, 0.1)" stroke-width="0.25" stroke-dasharray="1"/>
|
|
||||||
<line x1="0" y1="25%" riot-x2={ viewBoxX } y2="25%" stroke="rgba(255, 255, 255, 0.1)" stroke-width="0.25" stroke-dasharray="1"/>
|
|
||||||
<line x1="0" y1="50%" riot-x2={ viewBoxX } y2="50%" stroke="rgba(255, 255, 255, 0.1)" stroke-width="0.25" stroke-dasharray="1"/>
|
|
||||||
<line x1="0" y1="75%" riot-x2={ viewBoxX } y2="75%" stroke="rgba(255, 255, 255, 0.1)" stroke-width="0.25" stroke-dasharray="1"/>
|
|
||||||
<line x1="0" y1="100%" riot-x2={ viewBoxX } y2="100%" stroke="rgba(255, 255, 255, 0.1)" stroke-width="0.25" stroke-dasharray="1"/>
|
|
||||||
<rect
|
|
||||||
x="-1" y="-1"
|
|
||||||
riot-width={ viewBoxX + 2 } riot-height={ viewBoxY + 2 }
|
|
||||||
style="stroke: none; fill: url(#{ gradientId }); mask: url(#{ maskId })"/>
|
|
||||||
<polyline
|
|
||||||
riot-points={ polylinePoints }
|
|
||||||
fill="none"
|
|
||||||
stroke="#f43b16"
|
|
||||||
stroke-width="0.5"/>
|
|
||||||
</svg>
|
|
||||||
<style lang="stylus" scoped>
|
|
||||||
:scope
|
|
||||||
display block
|
|
||||||
padding 16px
|
|
||||||
border-radius 8px
|
|
||||||
background #1c2531
|
|
||||||
|
|
||||||
> svg
|
|
||||||
display block
|
|
||||||
padding 1px
|
|
||||||
width 100%
|
|
||||||
</style>
|
|
||||||
<script lang="typescript">
|
|
||||||
import uuid from 'uuid';
|
|
||||||
|
|
||||||
this.viewBoxX = 100;
|
|
||||||
this.viewBoxY = 30;
|
|
||||||
this.data = [];
|
|
||||||
this.gradientId = uuid();
|
|
||||||
this.maskId = uuid();
|
|
||||||
|
|
||||||
this.addData = data => {
|
|
||||||
this.data.push(data);
|
|
||||||
if (this.data.length > 100) this.data.shift();
|
|
||||||
|
|
||||||
const polylinePoints = this.data.map((d, i) => `${this.viewBoxX - ((this.data.length - 1) - i)},${d * this.viewBoxY}`).join(' ');
|
|
||||||
const polygonPoints = `${this.viewBoxX - (this.data.length - 1)},${ this.viewBoxY } ${ polylinePoints } ${ this.viewBoxX },${ this.viewBoxY }`;
|
|
||||||
|
|
||||||
this.update({
|
|
||||||
polylinePoints,
|
|
||||||
polygonPoints
|
|
||||||
});
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
</mk-line-chart>
|
|
@ -1 +0,0 @@
|
|||||||
require('./index.tag');
|
|
@ -11,11 +11,13 @@ const defaultSettings = {
|
|||||||
fetchOnScroll: true,
|
fetchOnScroll: true,
|
||||||
showMaps: true,
|
showMaps: true,
|
||||||
showPostFormOnTopOfTl: false,
|
showPostFormOnTopOfTl: false,
|
||||||
|
suggestRecentHashtags: true,
|
||||||
circleIcons: true,
|
circleIcons: true,
|
||||||
gradientWindowHeader: false,
|
gradientWindowHeader: false,
|
||||||
showReplyTarget: true,
|
showReplyTarget: true,
|
||||||
showMyRenotes: true,
|
showMyRenotes: true,
|
||||||
showRenotedMyNotes: true,
|
showRenotedMyNotes: true,
|
||||||
|
showLocalRenotes: true,
|
||||||
loadRemoteMedia: true,
|
loadRemoteMedia: true,
|
||||||
disableViaMobile: false,
|
disableViaMobile: false,
|
||||||
memo: null,
|
memo: null,
|
||||||
@ -108,6 +110,10 @@ export default (os: MiOS) => new Vuex.Store({
|
|||||||
src: x.src,
|
src: x.src,
|
||||||
arg: x.arg
|
arg: x.arg
|
||||||
};
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
setVisibility(state, visibility) {
|
||||||
|
state.visibility = visibility;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
6
src/client/assets/label-red.svg
Normal file
6
src/client/assets/label-red.svg
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
|
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
|
||||||
|
y="0px" width="96px" height="96px" viewBox="0 0 96 96" enable-background="new 0 0 96 96" xml:space="preserve">
|
||||||
|
<polygon fill="#ea2412" points="0,45.255 45.254,0 84.854,0 0,84.854 "/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 441 B |
@ -15,8 +15,8 @@ const interval = 1000;
|
|||||||
export default function() {
|
export default function() {
|
||||||
const log = new Deque<any>();
|
const log = new Deque<any>();
|
||||||
|
|
||||||
ev.on('requestServerStatsLog', id => {
|
ev.on('requestServerStatsLog', x => {
|
||||||
ev.emit('serverStatsLog:' + id, log.toArray());
|
ev.emit('serverStatsLog:' + x.id, log.toArray().slice(0, x.length || 50));
|
||||||
});
|
});
|
||||||
|
|
||||||
async function tick() {
|
async function tick() {
|
||||||
@ -36,8 +36,8 @@ export default function() {
|
|||||||
process_uptime: process.uptime()
|
process_uptime: process.uptime()
|
||||||
};
|
};
|
||||||
ev.emit('serverStats', stats);
|
ev.emit('serverStats', stats);
|
||||||
log.push(stats);
|
log.unshift(stats);
|
||||||
if (log.length > 50) log.shift();
|
if (log.length > 200) log.pop();
|
||||||
}
|
}
|
||||||
|
|
||||||
tick();
|
tick();
|
||||||
|
@ -28,7 +28,7 @@ import { Config } from './config/types';
|
|||||||
const clusterLog = debug('misskey:cluster');
|
const clusterLog = debug('misskey:cluster');
|
||||||
const ev = new Xev();
|
const ev = new Xev();
|
||||||
|
|
||||||
if (process.env.NODE_ENV != 'production') {
|
if (process.env.NODE_ENV != 'production' && process.env.DEBUG == null) {
|
||||||
debug.enable('misskey');
|
debug.enable('misskey');
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -112,7 +112,7 @@ async function workerMain() {
|
|||||||
async function init(): Promise<Config> {
|
async function init(): Promise<Config> {
|
||||||
Logger.info('Welcome to Misskey!');
|
Logger.info('Welcome to Misskey!');
|
||||||
|
|
||||||
(new Logger('Deps')).info(`Node.js ${process.version}`);
|
new Logger('Deps').info(`Node.js ${process.version}`);
|
||||||
MachineInfo.show();
|
MachineInfo.show();
|
||||||
EnvironmentInfo.show();
|
EnvironmentInfo.show();
|
||||||
new DependencyInfo().showAll();
|
new DependencyInfo().showAll();
|
||||||
|
@ -5,6 +5,10 @@ import config from '../config';
|
|||||||
import { INote } from '../models/note';
|
import { INote } from '../models/note';
|
||||||
import { TextElement } from './parse';
|
import { TextElement } from './parse';
|
||||||
|
|
||||||
|
function intersperse<T>(sep: T, xs: T[]): T[] {
|
||||||
|
return [].concat(...xs.map(x => [sep, x])).slice(1);
|
||||||
|
}
|
||||||
|
|
||||||
const handlers: { [key: string]: (window: any, token: any, mentionedRemoteUsers: INote['mentionedRemoteUsers']) => void } = {
|
const handlers: { [key: string]: (window: any, token: any, mentionedRemoteUsers: INote['mentionedRemoteUsers']) => void } = {
|
||||||
bold({ document }, { bold }) {
|
bold({ document }, { bold }) {
|
||||||
const b = document.createElement('b');
|
const b = document.createElement('b');
|
||||||
@ -80,12 +84,9 @@ const handlers: { [key: string]: (window: any, token: any, mentionedRemoteUsers:
|
|||||||
},
|
},
|
||||||
|
|
||||||
text({ document }, { content }) {
|
text({ document }, { content }) {
|
||||||
for (const text of content.split('\n')) {
|
const nodes = (content as string).split('\n').map(x => document.createTextNode(x));
|
||||||
const node = document.createTextNode(text);
|
for (const x of intersperse(document.createElement('br'), nodes)) {
|
||||||
document.body.appendChild(node);
|
document.body.appendChild(x);
|
||||||
|
|
||||||
const br = document.createElement('br');
|
|
||||||
document.body.appendChild(br);
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -5,8 +5,6 @@ import db from '../db/mongodb';
|
|||||||
import config from '../config';
|
import config from '../config';
|
||||||
|
|
||||||
const App = db.get<IApp>('apps');
|
const App = db.get<IApp>('apps');
|
||||||
App.createIndex('nameId');
|
|
||||||
App.createIndex('nameIdLower');
|
|
||||||
App.createIndex('secret');
|
App.createIndex('secret');
|
||||||
export default App;
|
export default App;
|
||||||
|
|
||||||
@ -16,17 +14,11 @@ export type IApp = {
|
|||||||
userId: mongo.ObjectID | null;
|
userId: mongo.ObjectID | null;
|
||||||
secret: string;
|
secret: string;
|
||||||
name: string;
|
name: string;
|
||||||
nameId: string;
|
|
||||||
nameIdLower: string;
|
|
||||||
description: string;
|
description: string;
|
||||||
permission: string[];
|
permission: string[];
|
||||||
callbackUrl: string;
|
callbackUrl: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
export function isValidNameId(nameId: string): boolean {
|
|
||||||
return typeof nameId == 'string' && /^[a-zA-Z0-9_]{1,30}$/.test(nameId);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Pack an app for API response
|
* Pack an app for API response
|
||||||
*
|
*
|
||||||
@ -76,8 +68,6 @@ export const pack = (
|
|||||||
_app.id = _app._id;
|
_app.id = _app._id;
|
||||||
delete _app._id;
|
delete _app._id;
|
||||||
|
|
||||||
delete _app.nameIdLower;
|
|
||||||
|
|
||||||
// Visible by only owner
|
// Visible by only owner
|
||||||
if (!opts.includeSecret) {
|
if (!opts.includeSecret) {
|
||||||
delete _app.secret;
|
delete _app.secret;
|
||||||
|
@ -52,6 +52,11 @@ export type IDriveFile = {
|
|||||||
filename: string;
|
filename: string;
|
||||||
contentType: string;
|
contentType: string;
|
||||||
metadata: IMetadata;
|
metadata: IMetadata;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ファイルサイズ
|
||||||
|
*/
|
||||||
|
length: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
export function validateFileName(name: string): boolean {
|
export function validateFileName(name: string): boolean {
|
||||||
|
@ -11,4 +11,5 @@ export type IMeta = {
|
|||||||
usersCount: number;
|
usersCount: number;
|
||||||
originalUsersCount: number;
|
originalUsersCount: number;
|
||||||
};
|
};
|
||||||
|
disableRegistration: boolean;
|
||||||
};
|
};
|
||||||
|
12
src/models/registration-tickets.ts
Normal file
12
src/models/registration-tickets.ts
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
import * as mongo from 'mongodb';
|
||||||
|
import db from '../db/mongodb';
|
||||||
|
|
||||||
|
const RegistrationTicket = db.get<IRegistrationTicket>('registrationTickets');
|
||||||
|
RegistrationTicket.createIndex('code', { unique: true });
|
||||||
|
export default RegistrationTicket;
|
||||||
|
|
||||||
|
export interface IRegistrationTicket {
|
||||||
|
_id: mongo.ObjectID;
|
||||||
|
createdAt: Date;
|
||||||
|
code: string;
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user