Compare commits
384 Commits
Author | SHA1 | Date | |
---|---|---|---|
35a1fa5bf0 | |||
8d3f71d490 | |||
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 | |||
9d6641be3a | |||
ac15c2e71f | |||
1fc9206c6d | |||
a8fb0d477f | |||
0c372b68d4 | |||
e7d9018944 | |||
ce16884587 | |||
3345733d00 | |||
f91cccb6b1 | |||
6183262037 | |||
1c7a194950 | |||
286e15b967 | |||
744d366874 | |||
afa62d3d44 | |||
270c7997c6 | |||
fa95641f88 | |||
aa9fe38c25 | |||
0d33cbbbbb | |||
bf077da72f | |||
d8f8e19d06 | |||
3c3d3e4c0c | |||
0efbeb36df | |||
73c396cb39 | |||
8e75f8a125 | |||
e8a7e95c65 | |||
70a6889fe5 | |||
6aff7375f6 | |||
d2ef95a8c3 | |||
1ae51df74a | |||
3098c6a915 | |||
ab3f8fd10c | |||
4bdef3720c | |||
c02cecc9e5 | |||
08b431723a | |||
83dcfec053 | |||
69ac7b739f | |||
9ccf9a2496 | |||
78563ef9a0 | |||
019d157b92 | |||
14de35e3f5 | |||
a860479e88 | |||
b351b3fae5 | |||
89918a9f79 | |||
cadd020915 | |||
e80933b8ae | |||
4c0832884f | |||
e4ca940979 | |||
3fd9be3967 | |||
79ec7aba1d | |||
42b1f7eddd | |||
889a73caa4 | |||
c34a89e962 | |||
2b4bf681e5 | |||
d1d59e3557 | |||
668c21830c | |||
7c37ed07f8 | |||
a135d8fd59 | |||
0db9aae162 | |||
1875c362af | |||
9b36dd9565 | |||
69452a27de | |||
6aa5c5895f | |||
12f20c67b1 | |||
66b8e5647d | |||
188a23fec7 | |||
b408b45000 | |||
c53cb94250 | |||
ba2eeabe38 | |||
259fac224e | |||
aad5440c9e | |||
5c40f0010f | |||
fb1d181424 | |||
12cbd8ef5b | |||
cfc4385d1f | |||
880ef024d0 | |||
c6c6edbc0a | |||
83ba951bf9 | |||
9c22b1a68a | |||
cd6a1d3446 | |||
4a9fc0c8ed | |||
fada899b30 | |||
22b099fa8a | |||
e0bc0d2830 | |||
90768d30aa | |||
177c549493 | |||
5e1ee68189 | |||
175f6303bc | |||
cf9f2a5562 | |||
f04526baca | |||
f085ecedb3 | |||
0986301788 | |||
fe418d8d9a | |||
6009be34dc | |||
01a0a54a2c | |||
cfcaf77e21 | |||
3b37bdc0b9 | |||
ec07112f94 | |||
464faf2673 | |||
bde20a1a65 | |||
86c7276da9 | |||
fec988bb79 | |||
0702d0974b | |||
f443d36dbb | |||
5477f0a865 | |||
dc02168f33 | |||
cc5c32b4d2 | |||
a35680a838 | |||
770cba73a6 | |||
401fc758fd | |||
e8503e6351 | |||
de23753409 | |||
4857d86cdd | |||
dc4a072678 | |||
c6ee5ccd88 | |||
68b630cb37 | |||
94c0238d3a | |||
dbea387433 | |||
d35f62d0e4 | |||
09b8e81a77 | |||
3b38979a34 | |||
0fd8c86c24 | |||
58d0ed1a2e | |||
8939452036 | |||
a2931d6f7e | |||
38b75ad977 | |||
dc4f585954 | |||
1fbe5365f7 | |||
04257db938 | |||
ba08d1aa53 | |||
c29cb5bfb9 | |||
fb1e2efbdd | |||
131a454e7c | |||
92e5cff285 | |||
b24e32e14e | |||
943805bdcd | |||
ba9340a26b | |||
00119328f2 | |||
a73c65da07 | |||
9021bb5694 | |||
a3cf63823f | |||
f15878cc6f | |||
33469ff87a | |||
23b0723168 | |||
fda1ab3e05 | |||
490c05a869 | |||
f0137daebe | |||
b9fc0e6d71 | |||
979efee412 | |||
f079041827 | |||
4edd9efc0b | |||
2913c7ccfb | |||
e1f460f90f | |||
70f927ea43 | |||
80d343bb0b | |||
9e41fddea3 | |||
8384efc8c7 | |||
7797c86581 | |||
4da8cc478f | |||
285deeec52 | |||
2916e49422 | |||
41e5b9134b | |||
d0d853dcb2 | |||
be46c7e4c5 | |||
8e0f41d608 | |||
a7b438072c | |||
99958e2fce | |||
b82843d359 | |||
4dfc2dfa89 | |||
50c945607f | |||
01f28b21dd | |||
2cb39a8882 | |||
6ddb6bc160 | |||
92befbb4cc | |||
ab701bb93e | |||
7f9a88fd1c | |||
c5073b33ef | |||
765b922a8b | |||
9b7d6274fa | |||
26b384aef1 | |||
0b1e5e3e08 | |||
5b7506756e | |||
1f28a0dfeb | |||
f56ec82f6b | |||
8ccbabf5ca | |||
7c763600b7 | |||
499491003b | |||
3a77d871d5 | |||
4ee6d0b549 | |||
64aa733b16 | |||
c8c4ec6ad4 | |||
c9ee737078 | |||
ebc2cca0b4 | |||
fc94df06eb | |||
190a03103e | |||
0d75ae9d9a | |||
3129f8f073 | |||
7f751d3f20 | |||
0b5b834f8b | |||
0f649f7d37 | |||
a1b100d412 | |||
dd4ee1627e | |||
1da0fdcf78 | |||
800eec73b8 | |||
166cb5e179 | |||
4a5e145048 | |||
be68f42220 | |||
7942aa677f | |||
2fcf9288a5 | |||
9bc17974f2 | |||
19c872a1f3 | |||
9252c59d90 | |||
a8f142096c | |||
3c90abfb96 | |||
12037fab9b | |||
73cc425093 | |||
5c97da935d | |||
0b154ac7ba | |||
d4eb0c8df9 | |||
5ba6f20701 | |||
695a082582 | |||
a52c588f49 | |||
fa469725c7 | |||
a1f0cb1bc7 | |||
fbbd33ded2 | |||
9658e2b3fb | |||
3d10b19727 | |||
ab7725ff69 | |||
6372451d17 | |||
2c11cc3f0a | |||
7f65f896f9 | |||
def823ceea | |||
454d294cf3 | |||
1affdbdbab | |||
52286f4be8 | |||
1b9f293959 | |||
7289d5b401 | |||
5bdbf98f8c | |||
4e915e96a5 | |||
e148f6ce5e | |||
652d7d2c05 | |||
0b0111fe23 | |||
5d097fb29d | |||
f29fe986af | |||
0c774979c0 | |||
f0bc2ed1d7 | |||
b174e5e57a | |||
ae50b71c07 | |||
b2eb50f260 | |||
790c7f2249 | |||
6a0f34c283 | |||
d151445db7 | |||
18a3007273 | |||
bea8c3c65c | |||
391ee01fe3 | |||
be7cf9f731 | |||
b92c2aa40e | |||
45ebcbf785 | |||
5f32484be0 | |||
e245122f12 | |||
21570e2111 | |||
63e1165a01 | |||
89b5a69127 | |||
1152a9d03a | |||
10092d4570 | |||
429b4bec64 | |||
99f96583b6 | |||
5adb765f85 | |||
0eb787e0d0 | |||
4493c856a9 | |||
59d3d4a749 |
25
.autogen/README.foot.md
Normal file
25
.autogen/README.foot.md
Normal file
@ -0,0 +1,25 @@
|
||||
:four_leaf_clover: Copyright
|
||||
----------------------------------------------------------------
|
||||
> Copyright (c) 2014-2018 syuilo
|
||||
|
||||
Misskey is an open-source software licensed under the [GNU AGPLv3](LICENSE).
|
||||
|
||||
[![][agpl-3.0-badge]][AGPL-3.0]
|
||||
|
||||
[agpl-3.0]: https://www.gnu.org/licenses/agpl-3.0.en.html
|
||||
[agpl-3.0-badge]: https://img.shields.io/badge/license-AGPL--3.0-444444.svg?style=flat-square
|
||||
[travis-link]: https://travis-ci.org/syuilo/misskey
|
||||
[travis-badge]: http://img.shields.io/travis/syuilo/misskey/master.svg?style=flat-square
|
||||
[dependencies-link]: https://david-dm.org/syuilo/misskey
|
||||
[dependencies-badge]: https://img.shields.io/david/syuilo/misskey.svg?style=flat-square
|
||||
|
||||
[backer-url]: #backers
|
||||
[backer-badge]: https://opencollective.com/misskey/backers/badge.svg
|
||||
[backers-image]: https://opencollective.com/misskey/backers.svg
|
||||
[sponsor-url]: #sponsors
|
||||
[sponsor-badge]: https://opencollective.com/misskey/sponsors/badge.svg
|
||||
[sponsors-image]: https://opencollective.com/misskey/sponsors.svg
|
||||
[support-url]: https://opencollective.com/misskey#support
|
||||
|
||||
[syuilo-link]: https://syuilo.com
|
||||
[syuilo-icon]: https://avatars2.githubusercontent.com/u/4439005?v=3&s=70
|
45
.autogen/README.head.md
Normal file
45
.autogen/README.head.md
Normal file
@ -0,0 +1,45 @@
|
||||
<img src="https://github.com/syuilo/misskey/blob/b3f42e62af698a67c2250533c437569559f1fdf9/src/himasaku/resources/himasaku.png?raw=true" align="right" width="320px"/>
|
||||
|
||||
[](https://misskey.xyz/)
|
||||
================================================================
|
||||
|
||||
[![][travis-badge]][travis-link]
|
||||
[![][dependencies-badge]][dependencies-link]
|
||||
[](http://makeapullrequest.com) [](https://greenkeeper.io/)
|
||||
|
||||
**Microblogging. Redefined.**
|
||||
|
||||
**[Misskey](https://misskey.xyz)** is a completely open source,
|
||||
ultimately sophisticated professional microblogging software.
|
||||
|
||||
<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>
|
||||
|
||||

|
||||
|
||||
:sparkles: Features
|
||||
----------------------------------------------------------------
|
||||
* Rich text contents
|
||||
* Reactions
|
||||
* User lists
|
||||
* Customizable column view (called MisskeyDeck)
|
||||
* and widgets!
|
||||
* Private messages
|
||||
* ActivityPub support
|
||||
|
||||
and more! You can see it with your own eyes at [misskey.xyz](https://misskey.xyz).
|
||||
|
||||
:package: Create your instance
|
||||
----------------------------------------------------------------
|
||||
If you want to run your own instance of Misskey,
|
||||
please see [Setup and installation guide](./docs/setup.en.md).
|
||||
|
||||
:wrench: Contribute
|
||||
----------------------------------------------------------------
|
||||
**[PR](https://github.com/syuilo/misskey/pulls)s welcome!**
|
||||
|
||||
If you want to...
|
||||
* i18n ... please see [Translation guide](./docs/translate.en.md).
|
||||
* l10n ... please visit https://crowdin.com/project/misskey
|
||||
|
||||
:heart: Backers & Sponsors
|
||||
----------------------------------------------------------------
|
@ -50,8 +50,11 @@ remoteDriveCapacityMb: 8
|
||||
# If enabled:
|
||||
# Server will not cache remote files (Using direct link instead).
|
||||
# You can save your storage.
|
||||
# Users cannot see remote images when they turn off "Show media from a remote server" setting.
|
||||
preventCache: false
|
||||
#
|
||||
# NOTE:
|
||||
# * Users cannot see remote images when they turn off "Show media from a remote server" setting.
|
||||
# * Since thumbnails are not provided, traffic increases.
|
||||
preventCacheRemoteFiles: false
|
||||
|
||||
drive:
|
||||
storage: 'db'
|
||||
@ -64,7 +67,7 @@ drive:
|
||||
# config:
|
||||
# endPoint:
|
||||
# port:
|
||||
# secure:
|
||||
# useSSL:
|
||||
# accessKey:
|
||||
# secretKey:
|
||||
|
||||
@ -75,7 +78,7 @@ drive:
|
||||
# config:
|
||||
# endPoint: s3-us-west-2.amazonaws.com
|
||||
# region: us-west-2
|
||||
# secure: true
|
||||
# useSSL: true
|
||||
# accessKey: XXX
|
||||
# secretKey: YYY
|
||||
|
||||
@ -87,7 +90,7 @@ drive:
|
||||
# config:
|
||||
# endPoint: s3-us-west-2.amazonaws.com
|
||||
# region: us-west-2
|
||||
# secure: true
|
||||
# useSSL: true
|
||||
# accessKey: XXX
|
||||
# secretKey: YYY
|
||||
|
||||
@ -123,6 +126,7 @@ drive:
|
||||
# google_maps_api_key: example-google-maps-api-key
|
||||
|
||||
# Twitter integration
|
||||
# You need to set the oauth callback url as : https://<your-misskey-instance>/api/tw/cb
|
||||
# twitter:
|
||||
# consumer_key: example-twitter-consumer-key
|
||||
# consumer_secret: example-twitter-consumer-secret-key
|
||||
|
@ -22,7 +22,6 @@ addons:
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- g++-4.8
|
||||
- graphicsmagick
|
||||
|
||||
cache:
|
||||
directories:
|
||||
|
4
.vsls.json
Normal file
4
.vsls.json
Normal file
@ -0,0 +1,4 @@
|
||||
{
|
||||
"$schema": "http://json.schemastore.org/vsls",
|
||||
"gitignore": "exclude"
|
||||
}
|
@ -5,6 +5,15 @@ ChangeLog
|
||||
|
||||
This document describes breaking changes only.
|
||||
|
||||
6.0.0
|
||||
-----
|
||||
|
||||
### Migration
|
||||
|
||||
オブジェクトストレージを使用している場合、設定ファイルの`drive.config.secure`を`drive.config.useSSL`にリネームしてください。
|
||||
|
||||
If you use object storage, please rename `drive.config.secure` to `drive.config.useSSL` in config.
|
||||
|
||||
5.0.0
|
||||
-----
|
||||
|
||||
|
31
README.md
31
README.md
@ -43,9 +43,34 @@ If you want to...
|
||||
|
||||
:heart: Backers & Sponsors
|
||||
----------------------------------------------------------------
|
||||
| <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"> | <img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12378075/0156f769e20f412594fa6b87d85fe228/1?token-time=2145916800&token-hash=IsIJRUXszzoD6-7pDnRY8I05T9nSznc4GTaxj7C9SwU%3D"> | <img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/4503830/ccf2cc867ea64de0b524bb2e24b9a1cb/1?token-time=2145916800&token-hash=S1zP0QyLU52Dqq6dtc9qNYyWfW86XrYHiR4NMbeOrnA%3D"> | <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"> |
|
||||
|:-:|:-:|:-:|:-:|
|
||||
| [Gargron](https://www.patreon.com/mastodon) | [39ff](https://www.patreon.com/user/creators?u=12378075) | [dansup](https://www.patreon.com/dansup) | [Takashi Shibuya](https://www.patreon.com/user/creators?u=12531784) |
|
||||
<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"></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/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/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/12913507/f7181eacafe8469a93033d85f5969c29/1?token-time=2145916800&token-hash=f03BFb4S2FUx9YEt87TnEmifb4h33OywGBW2akQVtQY%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"></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://c8.patreon.com/2/100/12718187"></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"></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>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="https://www.patreon.com/mastodon">Gargron</a></td>
|
||||
<td><a href="https://www.patreon.com/user/creators?u=12378075">39ff</a></td>
|
||||
<td><a href="https://www.patreon.com/dansup">dansup</a></td>
|
||||
<td><a href="https://www.patreon.com/user/creators?u=12531784">Takashi Shibuya</a></td>
|
||||
<td><a href="https://www.patreon.com/fujishan">fujishan</a></td>
|
||||
<td><a href="https://www.patreon.com/user?u=12913507">Melilot</a></td>
|
||||
<td><a href="https://www.patreon.com/user?u=5881381">Naoki Kosaka</a></td>
|
||||
<td><a href="https://www.patreon.com/user?u=12731202">negao</a></td>
|
||||
<td><a href="https://www.patreon.com/user?u=12718187">Peter G.</a></td>
|
||||
<td><a href="https://www.patreon.com/user?u=12931605">Reiju</a></td>
|
||||
<td><a href="https://www.patreon.com/gutfuckllc">gutfuckllc</a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
:four_leaf_clover: Copyright
|
||||
----------------------------------------------------------------
|
||||
|
@ -1,26 +0,0 @@
|
||||
FROM base/archlinux
|
||||
|
||||
MAINTAINER Aya Morisawa
|
||||
|
||||
RUN rm /etc/pacman.d/mirrorlist
|
||||
RUN echo 'Server = http://ftp.jaist.ac.jp/pub/Linux/ArchLinux/$repo/os/$arch' >> /etc/pacman.d/mirrorlist
|
||||
RUN echo 'Server = http://ftp.tsukuba.wide.ad.jp/Linux/archlinux/$repo/os/$arch' >> /etc/pacman.d/mirrorlist
|
||||
|
||||
RUN rm /etc/localtime
|
||||
RUN ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
|
||||
|
||||
RUN pacman -Sy --noconfirm
|
||||
RUN pacman -S --noconfirm pacman
|
||||
RUN pacman-db-upgrade
|
||||
RUN pacman -S --noconfirm archlinux-keyring
|
||||
RUN pacman -Syyu --noconfirm
|
||||
RUN pacman -S --noconfirm git nodejs npm mongodb redis
|
||||
|
||||
COPY misskey.sh /root/misskey.sh
|
||||
RUN chmod u+x /root/misskey.sh
|
||||
|
||||
EXPOSE 80
|
||||
EXPOSE 443
|
||||
EXPOSE 27017
|
||||
|
||||
CMD ["/root/misskey.sh"]
|
@ -1,6 +0,0 @@
|
||||
#!/bin/sh
|
||||
redis-server --daemonize yes
|
||||
mongod > /dev/null &
|
||||
cd /root/misskey
|
||||
npm start
|
||||
tail -f /dev/null
|
@ -1,29 +0,0 @@
|
||||
Setup with Docker :whale:
|
||||
================================================================
|
||||
|
||||
Ensure that the working directory is the repository root directory.
|
||||
|
||||
To create misskey image:
|
||||
``` console
|
||||
$ sudo docker build -t misskey ./docker
|
||||
```
|
||||
|
||||
To run misskey:
|
||||
``` console
|
||||
$ sudo docker run --rm -i -t -p $PORT:80 -v $(pwd):/root/misskey -v $DBPATH:/data/db misskey
|
||||
```
|
||||
|
||||
where `$PORT` is the port used to access Misskey Web from host browser
|
||||
and `$DBPATH` is the path of MongoDB database on the host for data persistence.
|
||||
|
||||
ex:
|
||||
``` console
|
||||
$ sudo docker run --rm -i -t -p 80:80 -v $(pwd):/root/misskey -v /data/db:/data/db misskey
|
||||
```
|
||||
|
||||
If you want to run misskey in production mode, add `--env NODE_ENV=production` like this:
|
||||
``` console
|
||||
$ sudo docker run --rm -i -t -p 80:80 -v $(pwd):/root/misskey -v /data/db:/data/db --env NODE_ENV=production misskey
|
||||
```
|
||||
|
||||
Note that `$(pwd)` is the working directory.
|
@ -62,6 +62,13 @@ npm install web-push -g
|
||||
web-push generate-vapid-keys
|
||||
```
|
||||
|
||||
*(optional)* Create a twitter application
|
||||
----------------------------------------------------------------
|
||||
If you want to enable the twitter integration, you need to create a twitter app at [https://developer.twitter.com/en/apply/user](https://developer.twitter.com/en/apply/user).
|
||||
|
||||
In the app you need to set the oauth callback url as : https://misskey-instance/api/tw/cb
|
||||
|
||||
|
||||
*5.* Make configuration file
|
||||
----------------------------------------------------------------
|
||||
1. `cp .config/example.yml .config/default.yml` Copy the `.config/example.yml` and rename it to `default.yml`.
|
||||
|
@ -66,6 +66,7 @@ common:
|
||||
congrats: "おめでとう"
|
||||
angry: "おこ"
|
||||
confused: "こまこまのこまり"
|
||||
rip: "RIP"
|
||||
pudding: "Pudding"
|
||||
note-placeholders:
|
||||
a: "今どうしてる?"
|
||||
@ -83,7 +84,7 @@ common:
|
||||
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
||||
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
||||
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
||||
verified-user: "認証済みのユーザー"
|
||||
verified-user: "公式アカウント"
|
||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||
reversi:
|
||||
drawn: "引き分け"
|
||||
@ -168,6 +169,9 @@ common/views/components/games/reversi/reversi.vue:
|
||||
common/views/components/games/reversi/reversi.game.vue:
|
||||
surrender: "投了"
|
||||
surrendered: "投了により"
|
||||
is-llotheo: "石の少ない方が勝ち(ロセオ)"
|
||||
looped-map: "ループマップ"
|
||||
can-put-everywhere: "どこでも置けるモード"
|
||||
common/views/components/games/reversi/reversi.index.vue:
|
||||
title: "Misskey Reversi"
|
||||
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
||||
@ -283,6 +287,7 @@ common/views/components/signin.vue:
|
||||
signin: "サインイン"
|
||||
or: "または"
|
||||
signin-with-twitter: "Twitterでログイン"
|
||||
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||
common/views/components/signup.vue:
|
||||
username: "ユーザー名"
|
||||
checking: "確認しています..."
|
||||
@ -621,9 +626,11 @@ desktop/views/components/settings.vue:
|
||||
circle-icons: "円形のアイコンを使用"
|
||||
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
||||
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||
show-reply-target: "リプライ先を表示する"
|
||||
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
|
||||
show-renoted-my-notes: "Renoteされた自分の投稿をタイムラインに表示する"
|
||||
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
|
||||
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
|
||||
show-maps: "マップの自動展開"
|
||||
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
|
||||
sound: "サウンド"
|
||||
@ -780,6 +787,25 @@ desktop/views/components/users-list-item.vue:
|
||||
desktop/views/components/window.vue:
|
||||
popout: "ポップアウト"
|
||||
close: "閉じる"
|
||||
desktop/views/pages/admin/admin.vue:
|
||||
dashboard: "ダッシュボード"
|
||||
drive: "ドライブ"
|
||||
users: "ユーザー"
|
||||
update: "更新"
|
||||
desktop/views/pages/admin/admin.dashboard.vue:
|
||||
dashboard: "ダッシュボード"
|
||||
all-users: "全てのユーザー"
|
||||
original-users: "このインスタンスのユーザー"
|
||||
all-notes: "全てのノート"
|
||||
original-notes: "このインスタンスのノート"
|
||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
||||
suspend-user: "ユーザーの凍結"
|
||||
suspend: "凍結"
|
||||
suspended: "凍結しました"
|
||||
desktop/views/pages/admin/admin.unsuspend-user.vue:
|
||||
unsuspend-user: "ユーザーの凍結の解除"
|
||||
unsuspend: "凍結の解除"
|
||||
unsuspended: "凍結を解除しました"
|
||||
desktop/views/pages/deck/deck.tl-column.vue:
|
||||
is-media-only: "メディア投稿のみ"
|
||||
is-media-view: "メディアビュー"
|
||||
@ -1083,7 +1109,8 @@ mobile/views/pages/settings.vue:
|
||||
timeline: "タイムライン"
|
||||
show-reply-target: "リプライ先を表示する"
|
||||
show-my-renotes: "自分の行ったRenoteを表示する"
|
||||
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
|
||||
show-renoted-my-notes: "自分の投稿のRenoteを表示する"
|
||||
show-local-renotes: "ローカルの投稿のRenoteを表示する"
|
||||
post-style: "投稿の表示スタイル"
|
||||
post-style-standard: "標準"
|
||||
post-style-smart: "スマート"
|
||||
|
@ -66,6 +66,7 @@ common:
|
||||
congrats: "Glückwunsch!"
|
||||
angry: "Wütend"
|
||||
confused: "Verwirrt"
|
||||
rip: "RIP"
|
||||
pudding: "Pudding"
|
||||
note-placeholders:
|
||||
a: "Was machst du gerade?"
|
||||
@ -83,7 +84,7 @@ common:
|
||||
my-token-regenerated: "Dein Token wurde generiert. Du wirst jetzt abgemeldet."
|
||||
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
||||
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
||||
verified-user: "認証済みのユーザー"
|
||||
verified-user: "公式アカウント"
|
||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||
reversi:
|
||||
drawn: "引き分け"
|
||||
@ -168,6 +169,9 @@ common/views/components/games/reversi/reversi.vue:
|
||||
common/views/components/games/reversi/reversi.game.vue:
|
||||
surrender: "投了"
|
||||
surrendered: "投了により"
|
||||
is-llotheo: "石の少ない方が勝ち(ロセオ)"
|
||||
looped-map: "ループマップ"
|
||||
can-put-everywhere: "どこでも置けるモード"
|
||||
common/views/components/games/reversi/reversi.index.vue:
|
||||
title: "Misskey Reversi"
|
||||
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
||||
@ -283,6 +287,7 @@ common/views/components/signin.vue:
|
||||
signin: "Anmelden"
|
||||
or: "または"
|
||||
signin-with-twitter: "Twitterでログイン"
|
||||
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||
common/views/components/signup.vue:
|
||||
username: "Benutzername"
|
||||
checking: "Überprüfung..."
|
||||
@ -621,9 +626,11 @@ desktop/views/components/settings.vue:
|
||||
circle-icons: "Kreisförmige Icons"
|
||||
gradient-window-header: "Übergang in Fensterköpfen"
|
||||
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||
show-reply-target: "Zeige Antworten"
|
||||
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-desc: "Zeige den Standort zu diesem Beitrag automatisch an."
|
||||
sound: "Ton"
|
||||
@ -780,6 +787,25 @@ desktop/views/components/users-list-item.vue:
|
||||
desktop/views/components/window.vue:
|
||||
popout: "ポップアウト"
|
||||
close: "閉じる"
|
||||
desktop/views/pages/admin/admin.vue:
|
||||
dashboard: "ダッシュボード"
|
||||
drive: "ドライブ"
|
||||
users: "ユーザー"
|
||||
update: "更新"
|
||||
desktop/views/pages/admin/admin.dashboard.vue:
|
||||
dashboard: "ダッシュボード"
|
||||
all-users: "全てのユーザー"
|
||||
original-users: "このインスタンスのユーザー"
|
||||
all-notes: "全てのノート"
|
||||
original-notes: "このインスタンスのノート"
|
||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
||||
suspend-user: "ユーザーの凍結"
|
||||
suspend: "凍結"
|
||||
suspended: "凍結しました"
|
||||
desktop/views/pages/admin/admin.unsuspend-user.vue:
|
||||
unsuspend-user: "ユーザーの凍結の解除"
|
||||
unsuspend: "凍結の解除"
|
||||
unsuspended: "凍結を解除しました"
|
||||
desktop/views/pages/deck/deck.tl-column.vue:
|
||||
is-media-only: "メディア投稿のみ"
|
||||
is-media-view: "メディアビュー"
|
||||
@ -1083,7 +1109,8 @@ mobile/views/pages/settings.vue:
|
||||
timeline: "タイムライン"
|
||||
show-reply-target: "リプライ先を表示する"
|
||||
show-my-renotes: "自分の行ったRenoteを表示する"
|
||||
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
|
||||
show-renoted-my-notes: "自分の投稿のRenoteを表示する"
|
||||
show-local-renotes: "ローカルの投稿のRenoteを表示する"
|
||||
post-style: "投稿の表示スタイル"
|
||||
post-style-standard: "標準"
|
||||
post-style-smart: "スマート"
|
||||
|
265
locales/en.yml
265
locales/en.yml
@ -8,17 +8,17 @@ common:
|
||||
about: "Thank you for finding Misskey. Misskey is a <b>decentralized microblogging platform</b> born on Earth. Since it exists within the Fediverse (a universe where various social media platforms are organized), it is mutually linked with other social media platforms. Why don't you take a short break from the hustle and bustle of the city, and dive into a new Internet?"
|
||||
adblock:
|
||||
detected: "Please disable ad blocker."
|
||||
warning: "<strong>Misskey is not running ads</strong>, but some features may be unavailable or malfunctioning if ad blocking features are enabled."
|
||||
application-authorization: "Application authorizations."
|
||||
warning: "Some features may be unavailable or cause malfunctions if ad blocking features are enabled. <strong>Misskey is not running ads</strong>."
|
||||
application-authorization: "Application authorizations"
|
||||
close: "Close"
|
||||
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
|
||||
do-not-copy-paste: "Please do not enter or paste the code here. Account may be compromised."
|
||||
got-it: "Got it!"
|
||||
customization-tips:
|
||||
title: "Customization tips"
|
||||
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."
|
||||
paragraph3: "To delete a widget, <strong>drag and drop the widget onto the area labeled \"Trash\"</strong> in the header."
|
||||
paragraph4: "To finish the customization, click \"Finish\" in the upper right."
|
||||
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."
|
||||
paragraph4: "To finish the customization, click \"Finish\" on the upper right."
|
||||
gotit: "Got it!"
|
||||
notification:
|
||||
file-uploaded: "File uploaded!"
|
||||
@ -66,14 +66,15 @@ common:
|
||||
congrats: "Congrats!"
|
||||
angry: "Angry"
|
||||
confused: "Confused"
|
||||
rip: "RIP"
|
||||
pudding: "Pudding"
|
||||
note-placeholders:
|
||||
a: "What are you doing?"
|
||||
b: "What's happening?"
|
||||
c: "What’s on your mind?"
|
||||
d: "What do you wish to say?"
|
||||
d: "Would you post any words?"
|
||||
e: "Write here"
|
||||
f: "Waiting for your writing..."
|
||||
f: "Waiting for your writing."
|
||||
search: "Search"
|
||||
delete: "Delete"
|
||||
loading: "Loading"
|
||||
@ -83,7 +84,7 @@ common:
|
||||
my-token-regenerated: "Your token has been regenerated, so you will be signed out."
|
||||
i-like-sushi: "I prefer sushi rather than pudding"
|
||||
show-reversi-board-labels: "Show row and column labels in Reversi"
|
||||
verified-user: "Verified user"
|
||||
verified-user: "Verified account"
|
||||
disable-animated-mfm: "Disable animated texts in a post"
|
||||
reversi:
|
||||
drawn: "Draw"
|
||||
@ -140,23 +141,23 @@ common:
|
||||
auth/views/form.vue:
|
||||
share-access: "Would you <b>allow</b> <i>{{ app.name }}</i> to access your account?"
|
||||
permission-ask: "This application requires the following permissions:"
|
||||
account-read: "Viewing account information:"
|
||||
account-write: "Modify account informations:"
|
||||
account-read: "View account information."
|
||||
account-write: "Modify account information."
|
||||
note-write: "Post."
|
||||
like-write: "To react to posts."
|
||||
following-write: "Follow or unfollow."
|
||||
like-write: "React to posts."
|
||||
following-write: "Follow and unfollow."
|
||||
drive-read: "Read your drive."
|
||||
drive-write: "Upload/delete files in your drive."
|
||||
notification-read: "Read your notifications."
|
||||
notification-write: "Manage your notifications."
|
||||
cancel: "Cancel"
|
||||
accept: "Grant access."
|
||||
accept: "Allow access."
|
||||
auth/views/index.vue:
|
||||
loading: "Loading"
|
||||
denied: "Application authorization denied."
|
||||
denied: "Application authorization has been denied."
|
||||
denied-paragraph: "This application will not access your account."
|
||||
already-authorized: "This application has already been authorized."
|
||||
allowed: "Application authorizations allowed.+"
|
||||
allowed: "Application authorizations allowed."
|
||||
callback-url: "Going back to the application."
|
||||
please-go-back: "Please go back to the application."
|
||||
error: "Session does not exist."
|
||||
@ -168,6 +169,9 @@ common/views/components/games/reversi/reversi.vue:
|
||||
common/views/components/games/reversi/reversi.game.vue:
|
||||
surrender: "Surrender"
|
||||
surrendered: "By surrender"
|
||||
is-llotheo: "The lesser one wins(Llotheo)"
|
||||
looped-map: "Looped map"
|
||||
can-put-everywhere: "Can put everywhere"
|
||||
common/views/components/games/reversi/reversi.index.vue:
|
||||
title: "Misskey Reversi"
|
||||
sub-title: "Play reversi with your friends!"
|
||||
@ -175,13 +179,13 @@ common/views/components/games/reversi/reversi.index.vue:
|
||||
rule: "How to play"
|
||||
rule-desc: "Reversi is a strategy board game for two players, played on an 8×8 uncheckered board. There are sixty-four identical game pieces called disks (often spelled \"discs\"), which are light on one side and dark on the other. Players take turns placing disks on the board with their assigned color facing up. During a play, any disks of the opponent's color that are in a straight line and bounded by the disk just placed and another disk of the current player's color are turned over to the current player's color. The object of the game is to have the majority of disks turned to display your color when the last playable empty square is filled."
|
||||
mode-invite: "Invite"
|
||||
mode-invite-desc: "Invite to the game a user."
|
||||
invitations: "You received invitation!"
|
||||
my-games: "My games"
|
||||
mode-invite-desc: "Game with a specified user."
|
||||
invitations: "You’ve got an invitation!"
|
||||
my-games: "My game"
|
||||
all-games: "All games"
|
||||
enter-username: "Enter username"
|
||||
enter-username: "Enter a username"
|
||||
game-state:
|
||||
ended: "Ended"
|
||||
ended: "Finished"
|
||||
playing: "In Progress"
|
||||
common/views/components/games/reversi/reversi.room.vue:
|
||||
settings-of-the-game: "Game settings"
|
||||
@ -190,14 +194,14 @@ common/views/components/games/reversi/reversi.room.vue:
|
||||
black-or-white: "Black/White"
|
||||
black-is: "Black is {}"
|
||||
rules: "Rules"
|
||||
is-llotheo: "The lesser one wins"
|
||||
is-llotheo: "The lesser side wins"
|
||||
looped-map: "Looped map"
|
||||
can-put-everywhere: "Can put everywhere"
|
||||
settings-of-the-bot: "Bot settings"
|
||||
this-game-is-started-soon: "The game will begin soon"
|
||||
waiting-for-other: "Waiting for the other party's preparation"
|
||||
this-game-is-started-soon: "The game will begin in seconds"
|
||||
waiting-for-other: "Waiting for the opponent"
|
||||
waiting-for-me: "Waiting for the your preparation"
|
||||
waiting-for-both: "Waiting for yours"
|
||||
waiting-for-both: "Prepareing"
|
||||
cancel: "Cancel"
|
||||
ready: "Ready"
|
||||
cancel-ready: "Cancel \"Ready\""
|
||||
@ -222,7 +226,7 @@ common/views/components/connect-failed.troubleshooter.vue:
|
||||
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."
|
||||
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"
|
||||
set-version: "Specify version"
|
||||
common/views/components/messaging.vue:
|
||||
@ -235,13 +239,13 @@ common/views/components/messaging-room.vue:
|
||||
no-history: "There is no further history"
|
||||
resize-form: "Drag to resize"
|
||||
new-message: "New message"
|
||||
only-one-file-attached: "メッセージに添付できるのはひとつのファイルのみです"
|
||||
only-one-file-attached: "Only ONE file can be attached to a message."
|
||||
common/views/components/messaging-room.form.vue:
|
||||
input-message-here: "Enter message here"
|
||||
send: "Send"
|
||||
attach-from-local: "Attach files from your device"
|
||||
attach-from-drive: "Attach files from your Drive"
|
||||
only-one-file-attached: "メッセージに添付できるのはひとつのファイルのみです"
|
||||
only-one-file-attached: "Only one file can be attached to the message."
|
||||
common/views/components/messaging-room.message.vue:
|
||||
is-read: "Read"
|
||||
deleted: "This message has been deleted"
|
||||
@ -256,9 +260,9 @@ common/views/components/nav.vue:
|
||||
feedback: "Feedback"
|
||||
common/views/components/note-menu.vue:
|
||||
favorite: "Favorite this note"
|
||||
pin: "Pin to your profile page"
|
||||
pin: "Pin to your profile"
|
||||
delete: "Delete"
|
||||
delete-confirm: "Are you sure you want to delete this post?"
|
||||
delete-confirm: "Delete this post?"
|
||||
remote: "Show original note"
|
||||
common/views/components/poll.vue:
|
||||
vote-to: "Vote for '{}'"
|
||||
@ -268,13 +272,13 @@ common/views/components/poll.vue:
|
||||
show-result: "Show results"
|
||||
voted: "Voted"
|
||||
common/views/components/poll-editor.vue:
|
||||
no-only-one-choice: "At least two choices are required for this survey."
|
||||
no-only-one-choice: "At least two choices are required"
|
||||
choice-n: "Choice {}"
|
||||
remove: "Delete this choice"
|
||||
remove: "Delete the choice"
|
||||
add: "+ Add a choice"
|
||||
destroy: "Discard the poll"
|
||||
common/views/components/reaction-picker.vue:
|
||||
choose-reaction: "Express a reaction"
|
||||
choose-reaction: "Send a reaction"
|
||||
common/views/components/signin.vue:
|
||||
username: "Username"
|
||||
password: "Password"
|
||||
@ -283,17 +287,18 @@ common/views/components/signin.vue:
|
||||
signin: "Sign in"
|
||||
or: "Or"
|
||||
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:
|
||||
username: "Username"
|
||||
checking: "Checking..."
|
||||
checking: "Confirming..."
|
||||
available: "Available"
|
||||
unavailable: "Unavailable"
|
||||
error: "Network error"
|
||||
invalid-format: "Only use letters, numbers and -."
|
||||
too-short: "Please enter at least 1 character!"
|
||||
too-long: "Please enter up to 20 characters."
|
||||
invalid-format: "letters, numbers and _ are acceptable."
|
||||
too-short: "Should not be blank!"
|
||||
too-long: "Enter within 20 characters."
|
||||
password: "Password"
|
||||
password-placeholder: "We recommend more than 8 characters."
|
||||
password-placeholder: "More than 8 characters are recommended."
|
||||
weak-password: "Weak password"
|
||||
normal-password: "Fair password"
|
||||
strong-password: "Strong password"
|
||||
@ -323,9 +328,9 @@ common/views/components/uploader.vue:
|
||||
common/views/components/visibility-chooser.vue:
|
||||
public: "Public"
|
||||
home: "Home"
|
||||
home-desc: "Post to the home timeline only"
|
||||
home-desc: "Post to Home only"
|
||||
followers: "Followers"
|
||||
followers-desc: "Post to followers only"
|
||||
followers-desc: "Post to Followers only"
|
||||
specified: "Direct"
|
||||
specified-desc: "Post to specified users only"
|
||||
private: "Private"
|
||||
@ -336,14 +341,14 @@ common/views/widgets/broadcast.vue:
|
||||
next: "Next"
|
||||
common/views/widgets/calendar.vue:
|
||||
year: "Year {}"
|
||||
month: "Month {}"
|
||||
day: "Day {}"
|
||||
month: "{},"
|
||||
day: "{}"
|
||||
today: "Today: "
|
||||
this-month: "This month: "
|
||||
this-year: "This year: "
|
||||
common/views/widgets/donation.vue:
|
||||
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:
|
||||
title: "Photo stream"
|
||||
no-photos: "No photos"
|
||||
@ -384,8 +389,8 @@ common/views/widgets/tips.vue:
|
||||
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-line23: "Mayu is so cute with its eyebrows."
|
||||
tips-line24: "Misskey started in 2014."
|
||||
tips-line25: "You can receive notification even if Misskey is not open in a compatible browser."
|
||||
tips-line24: "Misskey has been running since 2014."
|
||||
tips-line25: "In a browser compatible with notification features, you can receive notifications in case Misskey is not open"
|
||||
common/views/pages/follow.vue:
|
||||
signed-in-as: "Signed in as {}"
|
||||
following: "Following"
|
||||
@ -396,13 +401,13 @@ desktop:
|
||||
banner-crop-title: "Crop the part that appears as a banner"
|
||||
banner: "Banner"
|
||||
uploading-banner: "Uploading a new banner"
|
||||
banner-updated: "Updated the banner"
|
||||
banner-updated: "Successfully updated the banner"
|
||||
choose-banner: "Choose the banner"
|
||||
avatar-crop-title: "Crop the part that appears as an avatar"
|
||||
avatar: "Avatar"
|
||||
uploading-avatar: "Uploading a new avatar"
|
||||
avatar-updated: "Updated the avatar"
|
||||
choose-avatar: "Choose an avatar image"
|
||||
avatar-updated: "Successfully updated the avatar"
|
||||
choose-avatar: "Select an image for the avatar"
|
||||
desktop/views/components/activity.chart.vue:
|
||||
total: "Black ... Total"
|
||||
notes: "Blue ... Notes"
|
||||
@ -450,7 +455,7 @@ desktop/views/components/drive.file.vue:
|
||||
rename-file: "Rename file"
|
||||
input-new-file-name: "Enter new name"
|
||||
copied: "Copied"
|
||||
copied-url-to-clipboard: "Copied URL to clipboard"
|
||||
copied-url-to-clipboard: "URL has been copied to clipboard"
|
||||
desktop/views/components/drive.folder.vue:
|
||||
unable-to-process: "The operation could not be completed."
|
||||
circular-reference-detected: "The destination folder is a subfolder of the folder you wish to move."
|
||||
@ -466,7 +471,7 @@ desktop/views/components/drive.nav-folder.vue:
|
||||
desktop/views/components/drive.vue:
|
||||
search: "Search"
|
||||
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-description: "Right-click to open the menu, or drag and drop a file onto here for uploading."
|
||||
empty-folder: "This folder is empty"
|
||||
@ -476,7 +481,7 @@ desktop/views/components/drive.vue:
|
||||
url-upload: "Upload from a URL"
|
||||
url-of-file: "URL of file you want to upload"
|
||||
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"
|
||||
folder-name: "Folder name"
|
||||
contextmenu:
|
||||
@ -484,7 +489,7 @@ desktop/views/components/drive.vue:
|
||||
upload: "Upload a file"
|
||||
url-upload: "Upload from a URL"
|
||||
desktop/views/components/media-image.vue:
|
||||
sensitive: "The content is NSFW"
|
||||
sensitive: "NSFW"
|
||||
click-to-show: "Click to show"
|
||||
desktop/views/components/media-video.vue:
|
||||
sensitive: "The content is NSFW"
|
||||
@ -501,7 +506,7 @@ desktop/views/components/followers.vue:
|
||||
desktop/views/components/following-window.vue:
|
||||
following: "Following {}"
|
||||
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:
|
||||
title: "Recommended users:"
|
||||
empty: "Couldn't find any recommended users."
|
||||
@ -523,8 +528,8 @@ desktop/views/components/messaging-window.vue:
|
||||
title: "Messaging"
|
||||
desktop/views/components/note-detail.vue:
|
||||
more: "Load more conversations"
|
||||
private: "This post is private"
|
||||
deleted: "This post has been removed"
|
||||
private: "Post is private"
|
||||
deleted: "Post has been removed"
|
||||
reposted-by: "Reposted by {}"
|
||||
location: "Location"
|
||||
renote: "Repost"
|
||||
@ -535,8 +540,8 @@ desktop/views/components/notes.note.vue:
|
||||
renote: "Repost"
|
||||
add-reaction: "Add a reaction"
|
||||
detail: "Show details"
|
||||
private: "This post is private"
|
||||
deleted: "The post has been deleted"
|
||||
private: "Post is private"
|
||||
deleted: "Post has been deleted"
|
||||
hide: "Hide"
|
||||
see-more: "See more"
|
||||
desktop/views/components/notes.vue:
|
||||
@ -550,15 +555,15 @@ desktop/views/components/post-form.vue:
|
||||
add-visible-user: "+Add a user"
|
||||
attach-location-information: "Attach location information"
|
||||
hide-contents: "Hide contents"
|
||||
reply-placeholder: "Reply to this note..."
|
||||
quote-placeholder: "Quote this note..."
|
||||
reply-placeholder: "Reply to this post..."
|
||||
quote-placeholder: "Quote this Post..."
|
||||
submit: "Post"
|
||||
reply: "Reply"
|
||||
renote: "Repost"
|
||||
posted: "Posted!"
|
||||
replied: "Replied!"
|
||||
reposted: "Reposted!"
|
||||
note-failed: "Failed to post the note"
|
||||
note-failed: "Failed to post"
|
||||
reply-failed: "Failed to reply"
|
||||
renote-failed: "Failed to repost"
|
||||
posting: "Posting"
|
||||
@ -571,12 +576,12 @@ desktop/views/components/post-form.vue:
|
||||
recent-tags: "Recent"
|
||||
click-to-tagging: "Click to tagging"
|
||||
visibility: "Visibility"
|
||||
geolocation-alert: "Your device does not support geolocalization."
|
||||
geolocation-alert: "Your device does not provide location services."
|
||||
error: "Error"
|
||||
enter-username: "Please enter a username..."
|
||||
annotations: "内容への注釈 (オプション)"
|
||||
annotations: "Annotations for the post (optional)"
|
||||
desktop/views/components/post-form-window.vue:
|
||||
note: "New note"
|
||||
note: "New Post"
|
||||
reply: "Reply"
|
||||
attaches: "{} media attached"
|
||||
uploading-media: "Uploading {} media"
|
||||
@ -588,9 +593,9 @@ desktop/views/components/renote-form.vue:
|
||||
renote: "Repost"
|
||||
reposting: "Reposting..."
|
||||
success: "Reposted!"
|
||||
failure: "Repost failed"
|
||||
failure: "Failed to Repost"
|
||||
desktop/views/components/renote-form-window.vue:
|
||||
title: "Are you sure you want to repost this?"
|
||||
title: "Do you want to Repost it?"
|
||||
desktop/views/components/settings-window.vue:
|
||||
settings: "Settings"
|
||||
desktop/views/components/settings.vue:
|
||||
@ -609,7 +614,7 @@ desktop/views/components/settings.vue:
|
||||
fetch-on-scroll: "Endless loading on scroll"
|
||||
fetch-on-scroll-desc: "When you scroll down the page, it automatically fetches additional content."
|
||||
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"
|
||||
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."
|
||||
@ -621,11 +626,13 @@ desktop/views/components/settings.vue:
|
||||
circle-icons: "Use circle icons"
|
||||
gradient-window-header: "Use gradients on window headers"
|
||||
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-my-renotes: "Show my reposts in the timeline"
|
||||
show-renoted-my-notes: "Show my posts that have been shared in the timeline"
|
||||
show-maps: "Show the map"
|
||||
show-maps-desc: "Automatically show the location on the map attached to this post."
|
||||
show-my-renotes: "Show my renotes in the timeline"
|
||||
show-renoted-my-notes: "Show renoted my posts in timelines"
|
||||
show-local-renotes: "Show renoted local posts in timelines"
|
||||
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"
|
||||
enable-sounds: "Enable sound"
|
||||
enable-sounds-desc: "Play a sound when you receive a post/message. This setting is stored in the browser."
|
||||
@ -670,34 +677,34 @@ desktop/views/components/settings.vue:
|
||||
third-parties: "Third-parties"
|
||||
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."
|
||||
detail: "See details..."
|
||||
detail: "Details…"
|
||||
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"
|
||||
already-registered: "A device is already registered"
|
||||
unregister: "Disable"
|
||||
already-registered: "This device is already registered"
|
||||
unregister: "Unregister"
|
||||
unregistered: "Two-factor authentication has been disabled."
|
||||
enter-password: "Enter the password"
|
||||
authenticator: "First, you need to install Google Authenticator on your device:"
|
||||
howtoinstall: "How to install"
|
||||
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"
|
||||
success: "Settings saved!"
|
||||
failed: "Failed to setup. Please ensure that the token is correct."
|
||||
info: "From now on, enter the token that is displayed on your device in addition to your password when signing-in to Misskey."
|
||||
info: "From the next time you sign in to Misskey, the token displayed on your device will be necessary too, as well as the password."
|
||||
desktop/views/components/settings.api.vue:
|
||||
intro: "To access the API, set this token as the key 'i' of request parameters."
|
||||
caution: "Please do not show this token to third parties (do not enter it somewhere else other than here) otherwise your account could get compromised."
|
||||
regeneration-of-token: "In the unlikely event that this token leaks out, you can regenerate it."
|
||||
caution: "Do not enter this token to any apps nor tell this token to others otherwise your account may get compromised."
|
||||
regeneration-of-token: "If your token gets leaked, you can regenerate it."
|
||||
regenerate-token: "Regenerate the token"
|
||||
token: "Token:"
|
||||
enter-password: "Please enter the password"
|
||||
desktop/views/components/settings.apps.vue:
|
||||
no-apps: "No linked applications"
|
||||
desktop/views/components/settings.drive.vue:
|
||||
max: "Max "
|
||||
in-use: " in use."
|
||||
max: "Max"
|
||||
in-use: "In use"
|
||||
desktop/views/components/settings.mute.vue:
|
||||
no-users: "No muted users"
|
||||
desktop/views/components/settings.password.vue:
|
||||
@ -709,18 +716,18 @@ desktop/views/components/settings.password.vue:
|
||||
changed: "Password updated"
|
||||
desktop/views/components/settings.profile.vue:
|
||||
avatar: "Avatar"
|
||||
choice-avatar: "Choose an image"
|
||||
choice-avatar: "Select an image"
|
||||
name: "Name"
|
||||
location: "Location"
|
||||
description: "Description"
|
||||
birthday: "Birthday"
|
||||
save: "Update profile"
|
||||
locked-account: "Protect your account"
|
||||
is-locked: "Make a note private"
|
||||
is-locked: "Make your posts private"
|
||||
other: "Other"
|
||||
is-bot: "This account is a Bot"
|
||||
is-cat: "This account is a Cat"
|
||||
profile-updated: "Profile updated"
|
||||
profile-updated: "Your profile has been updated"
|
||||
desktop/views/components/sub-note-content.vue:
|
||||
private: "This post is private"
|
||||
deleted: "This post has been deleted"
|
||||
@ -736,7 +743,7 @@ desktop/views/components/timeline.vue:
|
||||
list: "Lists"
|
||||
desktop/views/components/ui.header.vue:
|
||||
welcome-back: "Welcome back,"
|
||||
adjective: "さん"
|
||||
adjective: "-san"
|
||||
desktop/views/components/ui.header.account.vue:
|
||||
profile: "Your profile"
|
||||
drive: "Media storage"
|
||||
@ -764,7 +771,7 @@ desktop/views/components/received-follow-requests-window.vue:
|
||||
reject: "Reject"
|
||||
desktop/views/components/user-lists-window.vue:
|
||||
title: "User lists"
|
||||
create-list: "Create new list"
|
||||
create-list: "Create list"
|
||||
list-name: "List name"
|
||||
desktop/views/components/user-preview.vue:
|
||||
notes: "Posts"
|
||||
@ -780,6 +787,25 @@ desktop/views/components/users-list-item.vue:
|
||||
desktop/views/components/window.vue:
|
||||
popout: "Pop-out"
|
||||
close: "Close"
|
||||
desktop/views/pages/admin/admin.vue:
|
||||
dashboard: "Dashboard"
|
||||
drive: "Drive"
|
||||
users: "Users"
|
||||
update: "Updates"
|
||||
desktop/views/pages/admin/admin.dashboard.vue:
|
||||
dashboard: "Dashboard"
|
||||
all-users: "All Users"
|
||||
original-users: "Users on this instance"
|
||||
all-notes: "All Posts"
|
||||
original-notes: "Posts on this instance"
|
||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
||||
suspend-user: "Suspend a user"
|
||||
suspend: "Suspend"
|
||||
suspended: "Successfully suspended."
|
||||
desktop/views/pages/admin/admin.unsuspend-user.vue:
|
||||
unsuspend-user: "Unsuspend users"
|
||||
unsuspend: "Unsuspend"
|
||||
unsuspended: "The user has successfully unsuspended."
|
||||
desktop/views/pages/deck/deck.tl-column.vue:
|
||||
is-media-only: "Only media posts"
|
||||
is-media-view: "Media view"
|
||||
@ -793,7 +819,7 @@ desktop/views/pages/welcome.vue:
|
||||
gotit: "Got it!"
|
||||
signin: "Log In"
|
||||
signup: "Sign up"
|
||||
signin-button: "Log in"
|
||||
signin-button: "Logging in..."
|
||||
signup-button: "Sign up"
|
||||
timeline: "Timeline"
|
||||
powered-by-misskey: "Powered by <b>Misskey</b>."
|
||||
@ -804,35 +830,35 @@ desktop/views/pages/favorites.vue:
|
||||
desktop/views/pages/home-customize.vue:
|
||||
title: "Customize home layout"
|
||||
desktop/views/pages/note.vue:
|
||||
prev: "Previous note"
|
||||
next: "Next note"
|
||||
prev: "Previous post"
|
||||
next: "Next post"
|
||||
desktop/views/pages/selectdrive.vue:
|
||||
title: "Choose file(s)"
|
||||
ok: "OK"
|
||||
cancel: "Cancel"
|
||||
upload: "Upload files from your device"
|
||||
desktop/views/pages/search.vue:
|
||||
not-available: "The search feature is not available."
|
||||
not-available: "The search feature is not available for now."
|
||||
not-found: "No posts were found for '{}'"
|
||||
desktop/views/pages/share.vue:
|
||||
share-with: "Share with {}."
|
||||
desktop/views/pages/tag.vue:
|
||||
no-posts-found: "No posts \"{}\" found."
|
||||
no-posts-found: "No posts contains \"{}\" found."
|
||||
desktop/views/pages/user-list.users.vue:
|
||||
users: "User"
|
||||
add-user: "Add a user"
|
||||
username: "Username"
|
||||
desktop/views/pages/user/user.followers-you-know.vue:
|
||||
title: "Followers you know"
|
||||
title: "Followers you may know"
|
||||
loading: "Loading"
|
||||
no-users: "No followers you know"
|
||||
desktop/views/pages/user/user.friends.vue:
|
||||
title: "Frequent mentions"
|
||||
loading: "Loading"
|
||||
no-users: "No users"
|
||||
no-users: "No frequent mentions"
|
||||
desktop/views/pages/user/user.vue:
|
||||
is-suspended: "This account has been suspended."
|
||||
is-remote: "This user is a remote user, so the information about them that 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"
|
||||
desktop/views/pages/user/user.home.vue:
|
||||
last-used-at: "Last active:"
|
||||
@ -849,7 +875,7 @@ desktop/views/pages/user/user.profile.vue:
|
||||
muted: "Muting"
|
||||
unmute: "Unmute"
|
||||
push-to-a-list: "Add to list"
|
||||
list-pushed: "You added {user} to {list}."
|
||||
list-pushed: "Successfully added {user} to {list}."
|
||||
desktop/views/pages/user/user.header.vue:
|
||||
posts: "Notes"
|
||||
following: "Following"
|
||||
@ -857,18 +883,18 @@ desktop/views/pages/user/user.header.vue:
|
||||
is-bot: "This account is a Bot"
|
||||
desktop/views/pages/user/user.timeline.vue:
|
||||
default: "Posts"
|
||||
with-replies: "Notes and replies"
|
||||
with-replies: "Posts and replies"
|
||||
with-media: "Media"
|
||||
empty: "This user doesn't seem to have posted anything yet."
|
||||
desktop/views/widgets/messaging.vue:
|
||||
title: "Messaging"
|
||||
title: "Message"
|
||||
desktop/views/widgets/notifications.vue:
|
||||
title: "Notifications"
|
||||
settings: "Settings"
|
||||
desktop/views/widgets/polls.vue:
|
||||
title: "Polls"
|
||||
refresh: "refresh"
|
||||
nothing: "Nothing"
|
||||
nothing: "No polls found!"
|
||||
desktop/views/widgets/post-form.vue:
|
||||
title: "Post"
|
||||
note: "Post"
|
||||
@ -878,11 +904,11 @@ desktop/views/widgets/profile.vue:
|
||||
desktop/views/widgets/trends.vue:
|
||||
title: "Trend"
|
||||
refresh: "refresh"
|
||||
nothing: "Nothing"
|
||||
nothing: "No trends found!"
|
||||
desktop/views/widgets/users.vue:
|
||||
title: "Recommended users"
|
||||
refresh: "refresh"
|
||||
no-one: "No one"
|
||||
no-one: "Anyone!"
|
||||
mobile/views/components/drive.vue:
|
||||
drive: "Media storage"
|
||||
used: "used"
|
||||
@ -912,7 +938,7 @@ mobile/views/components/drive.file-detail.vue:
|
||||
hash: "Hash (md5)"
|
||||
exif: "EXIF"
|
||||
mobile/views/components/media-image.vue:
|
||||
sensitive: "The content is NSFW"
|
||||
sensitive: "NSFW"
|
||||
click-to-show: "Click to show"
|
||||
mobile/views/components/media-video.vue:
|
||||
sensitive: "The content is NSFW"
|
||||
@ -923,7 +949,7 @@ mobile/views/components/follow-button.vue:
|
||||
request-pending: "Pending follow request"
|
||||
follow-request: "Follow request"
|
||||
mobile/views/components/friends-maker.vue:
|
||||
title: "Let's follow users"
|
||||
title: "Let's follow them"
|
||||
empty: "Featured user was not found."
|
||||
fetching: "Loading"
|
||||
refresh: "See more"
|
||||
@ -954,7 +980,7 @@ mobile/views/components/notes.vue:
|
||||
failed: "Failed to load"
|
||||
retry: "Retry"
|
||||
mobile/views/components/notifications.vue:
|
||||
more: "More"
|
||||
more: "See more"
|
||||
empty: "No notifications"
|
||||
mobile/views/components/post-form.vue:
|
||||
add-visible-user: "Add a user"
|
||||
@ -963,7 +989,7 @@ mobile/views/components/post-form.vue:
|
||||
renote: "Renote"
|
||||
quote-placeholder: "Quote this post... (optional)"
|
||||
reply-placeholder: "Reply to this note..."
|
||||
cw-placeholder: "Comments about content (optional)"
|
||||
cw-placeholder: "Comments for the post (optional)"
|
||||
location-alert: "Your device does not provide location services"
|
||||
error: "Error"
|
||||
username-prompt: "Enter user name"
|
||||
@ -977,7 +1003,7 @@ mobile/views/components/timeline.vue:
|
||||
load-more: "More"
|
||||
mobile/views/components/ui.header.vue:
|
||||
welcome-back: "Welcome back, "
|
||||
adjective: "さん"
|
||||
adjective: "Sir"
|
||||
mobile/views/components/ui.nav.vue:
|
||||
timeline: "Timeline"
|
||||
notifications: "Notifications"
|
||||
@ -989,12 +1015,12 @@ mobile/views/components/ui.nav.vue:
|
||||
user-lists: "Lists"
|
||||
widgets: "Widgets"
|
||||
game: "Games"
|
||||
darkmode: "Dark mode"
|
||||
darkmode: "Dark theme"
|
||||
settings: "Settings"
|
||||
about: "About Misskey"
|
||||
mobile/views/components/user-timeline.vue:
|
||||
no-notes: "It seems this user hasn't posted anything yet."
|
||||
no-notes-with-media: "There are no notes with media attachments"
|
||||
no-notes-with-media: "There are no posts attaching media"
|
||||
load-more: "More"
|
||||
mobile/views/components/users-list.vue:
|
||||
all: "All"
|
||||
@ -1009,7 +1035,7 @@ mobile/views/pages/drive.vue:
|
||||
drive: "Drive"
|
||||
more: "Load more"
|
||||
mobile/views/pages/signup.vue:
|
||||
lets-start: "Let's start! 📦"
|
||||
lets-start: "Your account is now ready! 📦"
|
||||
mobile/views/pages/followers.vue:
|
||||
followers-of: "Followers of {}"
|
||||
mobile/views/pages/following.vue:
|
||||
@ -1066,7 +1092,7 @@ mobile/views/pages/settings/settings.profile.vue:
|
||||
mobile/views/pages/search.vue:
|
||||
search: "Search"
|
||||
empty: "No posts were found for '{}'"
|
||||
not-found: "「{}」に関する投稿は見つかりませんでした。"
|
||||
not-found: "No posts were found for \"{}\"."
|
||||
mobile/views/pages/selectdrive.vue:
|
||||
select-file: "Choose files"
|
||||
mobile/views/pages/settings.vue:
|
||||
@ -1078,19 +1104,20 @@ mobile/views/pages/settings.vue:
|
||||
specify-language: "Select your language"
|
||||
design: "Design and display"
|
||||
dark-mode: "Dark Mode"
|
||||
i-am-under-limited-internet: "I'm under limited internet"
|
||||
i-am-under-limited-internet: "I'm in limited bandwidth"
|
||||
circle-icons: "Use circle icons"
|
||||
timeline: "Timeline"
|
||||
show-reply-target: "Show reply target"
|
||||
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-standard: "Standard"
|
||||
post-style-smart: "Smart"
|
||||
behavior: "Behavior"
|
||||
fetch-on-scroll: "Endless loading on scroll"
|
||||
disable-via-mobile: "Don't mark the post as 'from mobile'"
|
||||
load-raw-images: "Show attached images in high-quality"
|
||||
load-raw-images: "Show attached images in original quality"
|
||||
load-remote-media: "Show media from a remote server"
|
||||
twitter: "Twitter integration"
|
||||
twitter-connect: "Connect to your Twitter account"
|
||||
@ -1111,13 +1138,13 @@ mobile/views/pages/user.vue:
|
||||
follows-you: "Follows you"
|
||||
following: "Following"
|
||||
followers: "Followers"
|
||||
notes: "Notes"
|
||||
notes: "Posts"
|
||||
overview: "Overview"
|
||||
timeline: "Timeline"
|
||||
media: "Media"
|
||||
is-suspended: "This account has been suspended."
|
||||
is-remote: "This user is a remote user, so the information you see here is not complete."
|
||||
view-remote: "See their complete profile"
|
||||
is-remote: "The user is a remote user. The profile that you see here may not complete."
|
||||
view-remote: "See his/her complete profile"
|
||||
mobile/views/pages/user/home.vue:
|
||||
recent-notes: "Recent notes"
|
||||
images: "Images"
|
||||
@ -1140,8 +1167,8 @@ mobile/views/pages/user/home.photos.vue:
|
||||
loading: "Loading"
|
||||
no-photos: "No photos"
|
||||
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-link: "Edit this page on Github!"
|
||||
edit-this-page-on-github: "Found a mistake or want to contribute for the documentation?"
|
||||
edit-this-page-on-github-link: "Edit this page at GitHub!"
|
||||
api:
|
||||
entities:
|
||||
properties: "Properties"
|
||||
@ -1152,11 +1179,11 @@ docs:
|
||||
require-credential: "This endpoint requires the authentication information."
|
||||
require-permission: "This endpoint requires {permission} permission."
|
||||
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."
|
||||
min-interval-limit: "You can't request before {interval} milliseconds have passed since the previous request."
|
||||
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: "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-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:
|
||||
name: "Name"
|
||||
type: "Type"
|
||||
|
189
locales/es.yml
189
locales/es.yml
@ -39,7 +39,7 @@ common:
|
||||
weeks_ago: "Hace {} semana(s)"
|
||||
months_ago: "Hace {} mes(es)"
|
||||
years_ago: "Hace {} año(s)"
|
||||
month-and-day: "{month}月 {day}日"
|
||||
month-and-day: "{day} de {month}"
|
||||
trash: "Papelera"
|
||||
weekday-short:
|
||||
sunday: "domingo"
|
||||
@ -66,6 +66,7 @@ common:
|
||||
congrats: "felicidades"
|
||||
angry: "enfadado"
|
||||
confused: "confundido"
|
||||
rip: "RIP"
|
||||
pudding: "Chafado"
|
||||
note-placeholders:
|
||||
a: "¿Qué haces?"
|
||||
@ -83,7 +84,7 @@ common:
|
||||
my-token-regenerated: "Tu token se ha regenerado vas a ser desconectado."
|
||||
i-like-sushi: "Prefiero sushi a pudín"
|
||||
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"
|
||||
reversi:
|
||||
drawn: "Empatado"
|
||||
@ -168,6 +169,9 @@ common/views/components/games/reversi/reversi.vue:
|
||||
common/views/components/games/reversi/reversi.game.vue:
|
||||
surrender: "Rendirse"
|
||||
surrendered: "Por rendirse"
|
||||
is-llotheo: "石の少ない方が勝ち(ロセオ)"
|
||||
looped-map: "ループマップ"
|
||||
can-put-everywhere: "どこでも置けるモード"
|
||||
common/views/components/games/reversi/reversi.index.vue:
|
||||
title: "Misskey Reversi"
|
||||
sub-title: "¡Juega Reversi con tus amigos!"
|
||||
@ -235,13 +239,13 @@ common/views/components/messaging-room.vue:
|
||||
no-history: "El historial se ha acabado"
|
||||
resize-form: "Arrastra para redimensionar"
|
||||
new-message: "Nuevo mensaje"
|
||||
only-one-file-attached: "メッセージに添付できるのはひとつのファイルのみです"
|
||||
only-one-file-attached: "Un único archivo se puede conectar al mensaje"
|
||||
common/views/components/messaging-room.form.vue:
|
||||
input-message-here: "Escribe el mensaje aquí"
|
||||
send: "Enviar"
|
||||
attach-from-local: "Adjunta ficheros desde tu PC"
|
||||
attach-from-drive: "Adjunta ficheros desde tu disco"
|
||||
only-one-file-attached: "メッセージに添付できるのはひとつのファイルのみです"
|
||||
only-one-file-attached: "Un único archivo se puede conectar al mensaje"
|
||||
common/views/components/messaging-room.message.vue:
|
||||
is-read: "Leer"
|
||||
deleted: "El mensaje se ha borrado"
|
||||
@ -283,6 +287,7 @@ common/views/components/signin.vue:
|
||||
signin: "Entra"
|
||||
or: "O"
|
||||
signin-with-twitter: "Ingresar con Twitter"
|
||||
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||
common/views/components/signup.vue:
|
||||
username: "Usuario"
|
||||
checking: "Comprobando..."
|
||||
@ -378,56 +383,56 @@ common/views/widgets/tips.vue:
|
||||
tips-line10: "Usando el accesorio de Máquina del Tiempo puedes encontrar publicaciones antiguas"
|
||||
tips-line11: "Puedes resaltar publicaciones en la página de usuario haciendo click en \"...\""
|
||||
tips-line13: "Todos los archivos añadidos a la publicación se han guardado en tu unidad."
|
||||
tips-line14: "ホームのカスタマイズ中、ウィジェットを右クリックしてデザインを変更できます"
|
||||
tips-line17: "「**」でテキストを囲むと**強調表示**されます"
|
||||
tips-line19: "いくつかのウィンドウはブラウザの外に切り離すことができます"
|
||||
tips-line20: "カレンダーウィジェットのパーセンテージは、経過の割合を示しています"
|
||||
tips-line21: "APIを利用してbotの開発なども行えます"
|
||||
tips-line23: "まゆかわいいよまゆ"
|
||||
tips-line24: "Misskeyは2014年にサービスを開始しました"
|
||||
tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
|
||||
tips-line14: "Cuando personalizas el inicio puedas dar click derecho a un accesorio y cambiar el diseño."
|
||||
tips-line17: "Al colocar ** delante y luego del texto, lo estarás destacando en negrillas"
|
||||
tips-line19: "Algunas ventanas pueden ser separadas fuera del navegador"
|
||||
tips-line20: "El porcentaje mostrando en el accesorio de calendario indica el porcentaje de tiempo transcurrido."
|
||||
tips-line21: "También puedes usar la API para desarrollar tus propios bots."
|
||||
tips-line23: "Mayu is tan bonito con sus cejas."
|
||||
tips-line24: "Misskey inició en 2014."
|
||||
tips-line25: "Puedes recibir notificaciones incluso si Misskey no está abierto en un navegador compatible."
|
||||
common/views/pages/follow.vue:
|
||||
signed-in-as: "{}としてサインイン中"
|
||||
following: "フォロー中"
|
||||
follow: "フォロー"
|
||||
request-pending: "フォロー許可待ち"
|
||||
follow-request: "フォロー申請"
|
||||
signed-in-as: "Autenticado como {}"
|
||||
following: "Siguiendo"
|
||||
follow: "Seguir"
|
||||
request-pending: "Solicitud pendiente"
|
||||
follow-request: "Solicitar suscripción"
|
||||
desktop:
|
||||
banner-crop-title: "バナーとして表示する部分を選択"
|
||||
banner: "バナー"
|
||||
uploading-banner: "新しいバナーをアップロードしています"
|
||||
banner-updated: "バナーを更新しました"
|
||||
choose-banner: "バナーにする画像を選択"
|
||||
avatar-crop-title: "アバターとして表示する部分を選択"
|
||||
avatar: "アバター"
|
||||
uploading-avatar: "新しいアバターをアップロードしています"
|
||||
avatar-updated: "アバターを更新しました"
|
||||
choose-avatar: "アバターにする画像を選択"
|
||||
banner-crop-title: "Corta la parte que aparece como un banner"
|
||||
banner: "Banner"
|
||||
uploading-banner: "Cargando un nuevo banner"
|
||||
banner-updated: "Banner actualizado"
|
||||
choose-banner: "Escoge un banner"
|
||||
avatar-crop-title: "Corta la parte que aparece como un avatar"
|
||||
avatar: "Avatar"
|
||||
uploading-avatar: "Cargando un nuevo avatar"
|
||||
avatar-updated: "Avatar actualizado"
|
||||
choose-avatar: "Escoge una imagen de avatar"
|
||||
desktop/views/components/activity.chart.vue:
|
||||
total: "Black ... Total"
|
||||
notes: "Blue ... Notes"
|
||||
replies: "Red ... Replies"
|
||||
renotes: "Green ... Renotes"
|
||||
total: "Negro ... Total"
|
||||
notes: "Azul ... Notas"
|
||||
replies: "Rojo ... Respuestas"
|
||||
renotes: "Verde ... Republicaciones"
|
||||
desktop/views/components/activity.vue:
|
||||
title: "アクティビティ"
|
||||
toggle: "表示を切り替え"
|
||||
title: "Actividad"
|
||||
toggle: "Alternar vistas"
|
||||
desktop/views/components/calendar.vue:
|
||||
title: "{1}年 {2}月"
|
||||
prev: "前の月"
|
||||
next: "次の月"
|
||||
go: "クリックして時間遡行"
|
||||
title: "{1} / {2}"
|
||||
prev: "Mes anterior"
|
||||
next: "Próximo mes"
|
||||
go: "Click para navegar"
|
||||
desktop/views/components/choose-file-from-drive-window.vue:
|
||||
choose-file: "ファイル選択中"
|
||||
upload: "PCからドライブにファイルをアップロード"
|
||||
cancel: "キャンセル"
|
||||
ok: "決定"
|
||||
choose-prompt: "ファイルを選択"
|
||||
choose-file: "Escoger archivos"
|
||||
upload: "Cargar archivos de tu dispositivo"
|
||||
cancel: "Cancelar"
|
||||
ok: "OK"
|
||||
choose-prompt: "Escoger archivos"
|
||||
desktop/views/components/choose-folder-from-drive-window.vue:
|
||||
cancel: "キャンセル"
|
||||
ok: "決定"
|
||||
cancel: "Cancelar"
|
||||
ok: "OK"
|
||||
choose-prompt: "Escoge una Carpeta"
|
||||
desktop/views/components/crop-window.vue:
|
||||
skip: "クロップをスキップ"
|
||||
skip: "Ignorar el cortado"
|
||||
cancel: "Cancelar"
|
||||
ok: "OK"
|
||||
desktop/views/components/drive-window.vue:
|
||||
@ -438,8 +443,8 @@ desktop/views/components/drive.file.vue:
|
||||
banner: "Banner"
|
||||
contextmenu:
|
||||
rename: "Renombrar"
|
||||
mark-as-sensitive: "閲覧注意に設定"
|
||||
unmark-as-sensitive: "閲覧注意を解除"
|
||||
mark-as-sensitive: "Marcar como 'sensible'"
|
||||
unmark-as-sensitive: "Desmarcar como 'sensible'"
|
||||
copy-url: "Copia la URL"
|
||||
download: "Descargar"
|
||||
else-files: "Otros"
|
||||
@ -484,8 +489,8 @@ desktop/views/components/drive.vue:
|
||||
upload: "Subir fichero"
|
||||
url-upload: "Subir desde una URL"
|
||||
desktop/views/components/media-image.vue:
|
||||
sensitive: "閲覧注意"
|
||||
click-to-show: "クリックして表示"
|
||||
sensitive: "El contenido es NSFW (no seguro para ver en el trabajo, 'not safe for work')"
|
||||
click-to-show: "Click para mostrar"
|
||||
desktop/views/components/media-video.vue:
|
||||
sensitive: "閲覧注意"
|
||||
click-to-show: "クリックして表示"
|
||||
@ -621,9 +626,11 @@ desktop/views/components/settings.vue:
|
||||
circle-icons: "Usar iconos circulares"
|
||||
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"
|
||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||
show-reply-target: "リプライ先を表示する"
|
||||
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
|
||||
show-renoted-my-notes: "Renoteされた自分の投稿をタイムラインに表示する"
|
||||
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
|
||||
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
|
||||
show-maps: "マップの自動展開"
|
||||
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
|
||||
sound: "サウンド"
|
||||
@ -652,26 +659,26 @@ desktop/views/components/settings.vue:
|
||||
version: "バージョン:"
|
||||
latest-version: "最新のバージョン:"
|
||||
update-checking: "アップデートを確認中"
|
||||
do-update: "アップデートを確認"
|
||||
update-settings: "詳細設定"
|
||||
prevent-update: "アップデートを延期する(非推奨)"
|
||||
prevent-update-desc: "この設定をオンにしてもアップデートが反映される場合があります。この設定はこのデバイスのみ有効です。"
|
||||
no-updates: "利用可能な更新はありません"
|
||||
no-updates-desc: "お使いのMisskeyは最新です。"
|
||||
update-available: "新しいバージョンが利用可能です"
|
||||
update-available-desc: "ページを再度読み込みすると更新が適用されます。"
|
||||
advanced-settings: "高度な設定"
|
||||
debug-mode: "デバッグモードを有効にする"
|
||||
debug-mode-desc: "この設定はブラウザに記憶されます。"
|
||||
experimental: "実験的機能を有効にする"
|
||||
experimental-desc: "実験的機能を有効にするとMisskeyの動作が不安定になる可能性があります。この設定はブラウザに記憶されます。"
|
||||
tools: "ツール"
|
||||
task-manager: "タスクマネージャ"
|
||||
third-parties: "サードパーティ"
|
||||
do-update: "Chequear por actualizaciones"
|
||||
update-settings: "Configuración avanzada"
|
||||
prevent-update: "Posponer actualizaciones (no recomendado)"
|
||||
prevent-update-desc: "Incluso si activas esta configuración, algunas actualizaciones podrían aplicarse. Esta configuración está habilitada sólo para este dispositivo."
|
||||
no-updates: "No hay actualizaciones disponibles"
|
||||
no-updates-desc: "Tu Misskey está actualizado"
|
||||
update-available: "Una nueva versión está disponible"
|
||||
update-available-desc: "Las actualizaciones se aplicarán cuando actualices la página nuevamente."
|
||||
advanced-settings: "Avanzado"
|
||||
debug-mode: "Habilitar modo de depuración"
|
||||
debug-mode-desc: "Esta configuración se ha guardado en el navegador."
|
||||
experimental: "Habilitar herramientas experimentales"
|
||||
experimental-desc: "Activar esto puede hacer que tu cliente de Misskey se vuelva inestable. La configuración se ha guardado en el navegador."
|
||||
tools: "Herramientas"
|
||||
task-manager: "Navegador de tareas"
|
||||
third-parties: "Servicios externos"
|
||||
desktop/views/components/settings.2fa.vue:
|
||||
intro: "二段階認証を設定すると、サインイン時にパスワードだけでなく、予め登録しておいた物理的なデバイス(例えばあなたのスマートフォンなど)も必要になり、よりセキュリティが向上します。"
|
||||
detail: "詳細..."
|
||||
url: "https://www.google.co.jp/intl/ja/landing/2step/"
|
||||
detail: "Ver detalles..."
|
||||
url: "https://www.google.com/landing/2step/"
|
||||
caution: "Si pierdes acceso al dispositivo, no podrás conectarte a Misskey."
|
||||
register: "Registrar un dispositivo"
|
||||
already-registered: "Un dispositivo ya fue registrado"
|
||||
@ -704,19 +711,19 @@ desktop/views/components/settings.password.vue:
|
||||
reset: "Cambiar contraseña"
|
||||
enter-current-password: "Ingresar contraseña actual"
|
||||
enter-new-password: "Ingresar nueva contraseña"
|
||||
enter-new-password-again: "もう一度新しいパスワードを入力してください"
|
||||
not-match: "新しいパスワードが一致しません"
|
||||
changed: "パスワードを変更しました"
|
||||
enter-new-password-again: "Ingresar nueva contraseña de nuevo"
|
||||
not-match: "Las nuevas contraseñas no se corresponden consigo mismas"
|
||||
changed: "Contraseña actualizada"
|
||||
desktop/views/components/settings.profile.vue:
|
||||
avatar: "アイコン"
|
||||
choice-avatar: "画像を選択"
|
||||
name: "名前"
|
||||
location: "場所"
|
||||
description: "自己紹介"
|
||||
birthday: "誕生日"
|
||||
save: "保存"
|
||||
locked-account: "アカウントの保護"
|
||||
is-locked: "投稿を非公開にする"
|
||||
avatar: "Avatar"
|
||||
choice-avatar: "Escoger una imagen"
|
||||
name: "Nombre"
|
||||
location: "Localización"
|
||||
description: "Descripción"
|
||||
birthday: "Fecha de nacimiento"
|
||||
save: "Perfil actualizado"
|
||||
locked-account: "Protege tu cuenta"
|
||||
is-locked: "Crear una nota privada"
|
||||
other: "その他"
|
||||
is-bot: "このアカウントはBotです"
|
||||
is-cat: "このアカウントはCatです"
|
||||
@ -780,6 +787,25 @@ desktop/views/components/users-list-item.vue:
|
||||
desktop/views/components/window.vue:
|
||||
popout: "ポップアウト"
|
||||
close: "閉じる"
|
||||
desktop/views/pages/admin/admin.vue:
|
||||
dashboard: "ダッシュボード"
|
||||
drive: "ドライブ"
|
||||
users: "ユーザー"
|
||||
update: "更新"
|
||||
desktop/views/pages/admin/admin.dashboard.vue:
|
||||
dashboard: "ダッシュボード"
|
||||
all-users: "全てのユーザー"
|
||||
original-users: "このインスタンスのユーザー"
|
||||
all-notes: "全てのノート"
|
||||
original-notes: "このインスタンスのノート"
|
||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
||||
suspend-user: "ユーザーの凍結"
|
||||
suspend: "凍結"
|
||||
suspended: "凍結しました"
|
||||
desktop/views/pages/admin/admin.unsuspend-user.vue:
|
||||
unsuspend-user: "ユーザーの凍結の解除"
|
||||
unsuspend: "凍結の解除"
|
||||
unsuspended: "凍結を解除しました"
|
||||
desktop/views/pages/deck/deck.tl-column.vue:
|
||||
is-media-only: "メディア投稿のみ"
|
||||
is-media-view: "メディアビュー"
|
||||
@ -1083,7 +1109,8 @@ mobile/views/pages/settings.vue:
|
||||
timeline: "タイムライン"
|
||||
show-reply-target: "リプライ先を表示する"
|
||||
show-my-renotes: "自分の行ったRenoteを表示する"
|
||||
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
|
||||
show-renoted-my-notes: "自分の投稿のRenoteを表示する"
|
||||
show-local-renotes: "ローカルの投稿のRenoteを表示する"
|
||||
post-style: "投稿の表示スタイル"
|
||||
post-style-standard: "標準"
|
||||
post-style-smart: "スマート"
|
||||
|
@ -11,7 +11,7 @@ common:
|
||||
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"
|
||||
close: "Fermer"
|
||||
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
|
||||
do-not-copy-paste: "Veuillez ne pas entrer ou coller le code ici. Le compte peut être compromis."
|
||||
got-it: "J'ai compris !"
|
||||
customization-tips:
|
||||
title: "Conseils de personnalisation"
|
||||
@ -66,6 +66,7 @@ common:
|
||||
congrats: "Félicitations !"
|
||||
angry: "En colère"
|
||||
confused: "Confus"
|
||||
rip: "RIP"
|
||||
pudding: "Pudding"
|
||||
note-placeholders:
|
||||
a: "Que faîtes vous maintenant ?"
|
||||
@ -83,7 +84,7 @@ common:
|
||||
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)"
|
||||
show-reversi-board-labels: "Afficher les étiquettes des lignes et colonnes dans Reversi"
|
||||
verified-user: "Utilisateur·trice vérifié·e"
|
||||
verified-user: "公式アカウント"
|
||||
disable-animated-mfm: "Désactiver les textes animés dans les publications"
|
||||
reversi:
|
||||
drawn: "Partie nulle"
|
||||
@ -168,6 +169,9 @@ common/views/components/games/reversi/reversi.vue:
|
||||
common/views/components/games/reversi/reversi.game.vue:
|
||||
surrender: "Se rendre"
|
||||
surrendered: "Par abandon"
|
||||
is-llotheo: "石の少ない方が勝ち(ロセオ)"
|
||||
looped-map: "Carte en boucle"
|
||||
can-put-everywhere: "どこでも置けるモード"
|
||||
common/views/components/games/reversi/reversi.index.vue:
|
||||
title: "Misskey Reversi"
|
||||
sub-title: "Jouer à Reversi avec vos amis·es !"
|
||||
@ -283,6 +287,7 @@ common/views/components/signin.vue:
|
||||
signin: "Se connecter"
|
||||
or: "Ou"
|
||||
signin-with-twitter: "Se connecter via Twitter"
|
||||
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||
common/views/components/signup.vue:
|
||||
username: "Nom d'utilisateur"
|
||||
checking: "Vérification"
|
||||
@ -621,9 +626,11 @@ desktop/views/components/settings.vue:
|
||||
circle-icons: "Utiliser des icônes circulaires"
|
||||
gradient-window-header: "Utiliser les dégradés sur la barre de titre de la fenêtre"
|
||||
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||
show-reply-target: "Afficher les réponses"
|
||||
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-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
|
||||
sound: "Son"
|
||||
@ -780,6 +787,25 @@ desktop/views/components/users-list-item.vue:
|
||||
desktop/views/components/window.vue:
|
||||
popout: "ポップアウト"
|
||||
close: "Fermer"
|
||||
desktop/views/pages/admin/admin.vue:
|
||||
dashboard: "ダッシュボード"
|
||||
drive: "ドライブ"
|
||||
users: "ユーザー"
|
||||
update: "更新"
|
||||
desktop/views/pages/admin/admin.dashboard.vue:
|
||||
dashboard: "ダッシュボード"
|
||||
all-users: "全てのユーザー"
|
||||
original-users: "このインスタンスのユーザー"
|
||||
all-notes: "全てのノート"
|
||||
original-notes: "このインスタンスのノート"
|
||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
||||
suspend-user: "ユーザーの凍結"
|
||||
suspend: "凍結"
|
||||
suspended: "凍結しました"
|
||||
desktop/views/pages/admin/admin.unsuspend-user.vue:
|
||||
unsuspend-user: "ユーザーの凍結の解除"
|
||||
unsuspend: "凍結の解除"
|
||||
unsuspended: "凍結を解除しました"
|
||||
desktop/views/pages/deck/deck.tl-column.vue:
|
||||
is-media-only: "Les publications médias uniquement"
|
||||
is-media-view: "Vue média"
|
||||
@ -817,7 +843,7 @@ desktop/views/pages/search.vue:
|
||||
desktop/views/pages/share.vue:
|
||||
share-with: "Partager avec {}"
|
||||
desktop/views/pages/tag.vue:
|
||||
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
|
||||
no-posts-found: "Pas de message avec un hashtag {} trouvé."
|
||||
desktop/views/pages/user-list.users.vue:
|
||||
users: "Utilisateurs"
|
||||
add-user: "Ajouter un utilisateur"
|
||||
@ -842,7 +868,7 @@ desktop/views/pages/user/user.photos.vue:
|
||||
no-photos: "Pas de photos"
|
||||
desktop/views/pages/user/user.profile.vue:
|
||||
follows-you: "Vous suis"
|
||||
stalk: "ストークする"
|
||||
stalk: "Traquer"
|
||||
stalking: "ストーキングしています"
|
||||
unstalk: "ストーク解除"
|
||||
mute: "Mettre en sourdine"
|
||||
@ -892,11 +918,11 @@ mobile/views/components/drive.vue:
|
||||
load-more: "Charger plus"
|
||||
nothing-in-drive: "Rien"
|
||||
folder-is-empty: "Ce dossier est vide"
|
||||
prompt: "何をしますか?(数字を入力してください): <1 → ファイルをアップロード | 2 → ファイルをURLでアップロード | 3 → フォルダ作成 | 4 → このフォルダ名を変更 | 5 → このフォルダを移動 | 6 → このフォルダを削除>"
|
||||
prompt: "Que veux-tu faire ? (Entrez un nombre): <1 → Télécharger le fichier | 2 → Télécharger le fichier avec l'URL | 3 → Créer le dossier | 4 → Modifier le nom du dossier | 5 → Déplacer ce dossier | 6 → Supprimer ce dossier >"
|
||||
deletion-alert: "Désolé ! La suppression d’un dossier n’est pas encore implémentée."
|
||||
folder-name: "Nom du dossier"
|
||||
root-rename-alert: "現在いる場所はルートで、フォルダではないため名前の変更はできません。名前を変更したいフォルダに移動してからやってください。"
|
||||
root-move-alert: "現在いる場所はルートで、フォルダではないため移動はできません。移動したいフォルダに移動してからやってください。"
|
||||
root-rename-alert: "L'emplacement actuel est la racine, pas le dossier, vous ne pouvez donc pas le renommer. Veuillez vous déplacer dans le dossier dont vous souhaitez modifier le nom."
|
||||
root-move-alert: "L'emplacement actuel est la racine, ce n'est pas un dossier et il ne peut pas être déplacé. Veuillez vous déplacer dans le dossier que vous souhaitez déplacer."
|
||||
url-prompt: "URL du fichier que vous souhaitez téléverser"
|
||||
uploading: "アップロードをリクエストしました。アップロードが完了するまで時間がかかる場合があります。"
|
||||
mobile/views/components/drive-file-detail.vue:
|
||||
@ -976,7 +1002,7 @@ mobile/views/components/timeline.vue:
|
||||
empty: "Pas de notes"
|
||||
load-more: "Afficher plus"
|
||||
mobile/views/components/ui.header.vue:
|
||||
welcome-back: "Bon retour parmi nous !"
|
||||
welcome-back: "Content de vous revoir ! "
|
||||
adjective: "さん"
|
||||
mobile/views/components/ui.nav.vue:
|
||||
timeline: "Fil d'actualité"
|
||||
@ -1020,7 +1046,7 @@ mobile/views/pages/home.vue:
|
||||
hybrid: "Social"
|
||||
global: "Global"
|
||||
mobile/views/pages/tag.vue:
|
||||
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
|
||||
no-posts-found: "Pas de message avec un hashtag {} trouvé."
|
||||
mobile/views/pages/welcome.vue:
|
||||
signup: "S'enregistrer"
|
||||
mobile/views/pages/widgets.vue:
|
||||
@ -1066,7 +1092,7 @@ mobile/views/pages/settings/settings.profile.vue:
|
||||
mobile/views/pages/search.vue:
|
||||
search: "Chercher"
|
||||
empty: "Aucun message trouvé pour '{}' "
|
||||
not-found: "「{}」に関する投稿は見つかりませんでした。"
|
||||
not-found: "Aucun post pour {} n'a été trouvé."
|
||||
mobile/views/pages/selectdrive.vue:
|
||||
select-file: "Choisissez un fichier"
|
||||
mobile/views/pages/settings.vue:
|
||||
@ -1083,7 +1109,8 @@ mobile/views/pages/settings.vue:
|
||||
timeline: "Fil d'actualité"
|
||||
show-reply-target: "Afficher les réponses"
|
||||
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-standard: "Standard"
|
||||
post-style-smart: "Intelligent"
|
||||
|
@ -66,6 +66,7 @@ common:
|
||||
congrats: "おめでとう"
|
||||
angry: "おこ"
|
||||
confused: "こまこまのこまり"
|
||||
rip: "RIP"
|
||||
pudding: "Pudding"
|
||||
note-placeholders:
|
||||
a: "今どうしてる?"
|
||||
@ -83,7 +84,7 @@ common:
|
||||
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
||||
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
||||
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
||||
verified-user: "認証済みのユーザー"
|
||||
verified-user: "公式アカウント"
|
||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||
reversi:
|
||||
drawn: "引き分け"
|
||||
@ -168,6 +169,9 @@ common/views/components/games/reversi/reversi.vue:
|
||||
common/views/components/games/reversi/reversi.game.vue:
|
||||
surrender: "投了"
|
||||
surrendered: "投了により"
|
||||
is-llotheo: "石の少ない方が勝ち(ロセオ)"
|
||||
looped-map: "ループマップ"
|
||||
can-put-everywhere: "どこでも置けるモード"
|
||||
common/views/components/games/reversi/reversi.index.vue:
|
||||
title: "Misskey Reversi"
|
||||
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
||||
@ -283,6 +287,7 @@ common/views/components/signin.vue:
|
||||
signin: "サインイン"
|
||||
or: "または"
|
||||
signin-with-twitter: "Twitterでログイン"
|
||||
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||
common/views/components/signup.vue:
|
||||
username: "ユーザー名"
|
||||
checking: "確認しています..."
|
||||
@ -621,9 +626,11 @@ desktop/views/components/settings.vue:
|
||||
circle-icons: "円形のアイコンを使用"
|
||||
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
||||
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||
show-reply-target: "リプライ先を表示する"
|
||||
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
|
||||
show-renoted-my-notes: "Renoteされた自分の投稿をタイムラインに表示する"
|
||||
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
|
||||
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
|
||||
show-maps: "マップの自動展開"
|
||||
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
|
||||
sound: "サウンド"
|
||||
@ -780,6 +787,25 @@ desktop/views/components/users-list-item.vue:
|
||||
desktop/views/components/window.vue:
|
||||
popout: "ポップアウト"
|
||||
close: "閉じる"
|
||||
desktop/views/pages/admin/admin.vue:
|
||||
dashboard: "ダッシュボード"
|
||||
drive: "ドライブ"
|
||||
users: "ユーザー"
|
||||
update: "更新"
|
||||
desktop/views/pages/admin/admin.dashboard.vue:
|
||||
dashboard: "ダッシュボード"
|
||||
all-users: "全てのユーザー"
|
||||
original-users: "このインスタンスのユーザー"
|
||||
all-notes: "全てのノート"
|
||||
original-notes: "このインスタンスのノート"
|
||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
||||
suspend-user: "ユーザーの凍結"
|
||||
suspend: "凍結"
|
||||
suspended: "凍結しました"
|
||||
desktop/views/pages/admin/admin.unsuspend-user.vue:
|
||||
unsuspend-user: "ユーザーの凍結の解除"
|
||||
unsuspend: "凍結の解除"
|
||||
unsuspended: "凍結を解除しました"
|
||||
desktop/views/pages/deck/deck.tl-column.vue:
|
||||
is-media-only: "メディア投稿のみ"
|
||||
is-media-view: "メディアビュー"
|
||||
@ -1083,7 +1109,8 @@ mobile/views/pages/settings.vue:
|
||||
timeline: "タイムライン"
|
||||
show-reply-target: "リプライ先を表示する"
|
||||
show-my-renotes: "自分の行ったRenoteを表示する"
|
||||
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
|
||||
show-renoted-my-notes: "自分の投稿のRenoteを表示する"
|
||||
show-local-renotes: "ローカルの投稿のRenoteを表示する"
|
||||
post-style: "投稿の表示スタイル"
|
||||
post-style-standard: "標準"
|
||||
post-style-smart: "スマート"
|
||||
|
@ -70,6 +70,7 @@ common:
|
||||
congrats: "おめでとう"
|
||||
angry: "おこ"
|
||||
confused: "こまこまのこまり"
|
||||
rip: "RIP"
|
||||
pudding: "Pudding"
|
||||
|
||||
note-placeholders:
|
||||
@ -89,7 +90,7 @@ common:
|
||||
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
||||
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
||||
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
||||
verified-user: "認証済みのユーザー"
|
||||
verified-user: "公式アカウント"
|
||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||
|
||||
reversi:
|
||||
@ -181,6 +182,9 @@ common/views/components/games/reversi/reversi.vue:
|
||||
common/views/components/games/reversi/reversi.game.vue:
|
||||
surrender: "投了"
|
||||
surrendered: "投了により"
|
||||
is-llotheo: "石の少ない方が勝ち(ロセオ)"
|
||||
looped-map: "ループマップ"
|
||||
can-put-everywhere: "どこでも置けるモード"
|
||||
|
||||
common/views/components/games/reversi/reversi.index.vue:
|
||||
title: "Misskey Reversi"
|
||||
@ -310,8 +314,11 @@ common/views/components/signin.vue:
|
||||
signin: "サインイン"
|
||||
or: "または"
|
||||
signin-with-twitter: "Twitterでログイン"
|
||||
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||
|
||||
common/views/components/signup.vue:
|
||||
invitation-code: "招待コード"
|
||||
invitation-info: "招待コードをお持ちでない方は、<a href=\"{}\">管理者</a>までご連絡ください。"
|
||||
username: "ユーザー名"
|
||||
checking: "確認しています..."
|
||||
available: "利用できます"
|
||||
@ -703,9 +710,11 @@ desktop/views/components/settings.vue:
|
||||
circle-icons: "円形のアイコンを使用"
|
||||
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
||||
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||
show-reply-target: "リプライ先を表示する"
|
||||
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
|
||||
show-renoted-my-notes: "Renoteされた自分の投稿をタイムラインに表示する"
|
||||
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
|
||||
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
|
||||
show-maps: "マップの自動展開"
|
||||
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
|
||||
|
||||
@ -893,6 +902,29 @@ desktop/views/components/window.vue:
|
||||
popout: "ポップアウト"
|
||||
close: "閉じる"
|
||||
|
||||
desktop/views/pages/admin/admin.vue:
|
||||
dashboard: "ダッシュボード"
|
||||
drive: "ドライブ"
|
||||
users: "ユーザー"
|
||||
update: "更新"
|
||||
|
||||
desktop/views/pages/admin/admin.dashboard.vue:
|
||||
dashboard: "ダッシュボード"
|
||||
all-users: "全てのユーザー"
|
||||
original-users: "このインスタンスのユーザー"
|
||||
all-notes: "全てのノート"
|
||||
original-notes: "このインスタンスのノート"
|
||||
|
||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
||||
suspend-user: "ユーザーの凍結"
|
||||
suspend: "凍結"
|
||||
suspended: "凍結しました"
|
||||
|
||||
desktop/views/pages/admin/admin.unsuspend-user.vue:
|
||||
unsuspend-user: "ユーザーの凍結の解除"
|
||||
unsuspend: "凍結の解除"
|
||||
unsuspended: "凍結を解除しました"
|
||||
|
||||
desktop/views/pages/deck/deck.tl-column.vue:
|
||||
is-media-only: "メディア投稿のみ"
|
||||
is-media-view: "メディアビュー"
|
||||
@ -1266,7 +1298,8 @@ mobile/views/pages/settings.vue:
|
||||
timeline: "タイムライン"
|
||||
show-reply-target: "リプライ先を表示する"
|
||||
show-my-renotes: "自分の行ったRenoteを表示する"
|
||||
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
|
||||
show-renoted-my-notes: "自分の投稿のRenoteを表示する"
|
||||
show-local-renotes: "ローカルの投稿のRenoteを表示する"
|
||||
post-style: "投稿の表示スタイル"
|
||||
post-style-standard: "標準"
|
||||
post-style-smart: "スマート"
|
||||
|
@ -12,7 +12,7 @@ common:
|
||||
application-authorization: "앱의 연계"
|
||||
close: "닫기"
|
||||
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
|
||||
got-it: "わかった"
|
||||
got-it: "알았습니다"
|
||||
customization-tips:
|
||||
title: "사용자 정의 팁"
|
||||
paragraph1: "홈 정의는 위젯을 추가 / 삭제하거나 드래그 앤 드롭하여 정렬 할 수 있습니다."
|
||||
@ -39,7 +39,7 @@ common:
|
||||
weeks_ago: "{}주전"
|
||||
months_ago: "{}개월전"
|
||||
years_ago: "{}년전"
|
||||
month-and-day: "{month}月 {day}日"
|
||||
month-and-day: "{month}월 {day}일"
|
||||
trash: "휴지통"
|
||||
weekday-short:
|
||||
sunday: "일"
|
||||
@ -66,6 +66,7 @@ common:
|
||||
congrats: "받으세요"
|
||||
angry: "화냈어"
|
||||
confused: "곤란하고 있어"
|
||||
rip: "RIP"
|
||||
pudding: "Pudding"
|
||||
note-placeholders:
|
||||
a: "지금 어떻게하고있어?"
|
||||
@ -83,7 +84,7 @@ common:
|
||||
my-token-regenerated: "당신의 토큰이 업데이트되어 있기 때문에 로그 아웃합니다."
|
||||
i-like-sushi: "나는(푸딩보다 오히려)스시가 좋아"
|
||||
show-reversi-board-labels: "리버시 보드의 행과 열 레이블을 표시"
|
||||
verified-user: "인증 된 사용자"
|
||||
verified-user: "公式アカウント"
|
||||
disable-animated-mfm: "게시물의 문자 애니메이션을 비활성화 할"
|
||||
reversi:
|
||||
drawn: "무승부"
|
||||
@ -121,13 +122,13 @@ common:
|
||||
tips: "팁"
|
||||
hashtags: "해시 태그"
|
||||
deck:
|
||||
widgets: "ウィジェット"
|
||||
home: "ホーム"
|
||||
local: "ローカル"
|
||||
hybrid: "ソーシャル"
|
||||
global: "グローバル"
|
||||
notifications: "通知"
|
||||
list: "リスト"
|
||||
widgets: "위젯"
|
||||
home: "홈"
|
||||
local: "로컬"
|
||||
hybrid: "소셜"
|
||||
global: "글로벌"
|
||||
notifications: "통지"
|
||||
list: "목록"
|
||||
swap-left: "左に移動"
|
||||
swap-right: "右に移動"
|
||||
swap-up: "上に移動"
|
||||
@ -149,10 +150,10 @@ auth/views/form.vue:
|
||||
drive-write: "ドライブを操作する。"
|
||||
notification-read: "通知を見る。"
|
||||
notification-write: "通知を操作する。"
|
||||
cancel: "キャンセル"
|
||||
cancel: "취소"
|
||||
accept: "アクセスを許可"
|
||||
auth/views/index.vue:
|
||||
loading: "読み込み中"
|
||||
loading: "로드 중"
|
||||
denied: "アプリケーションの連携をキャンセルしました。"
|
||||
denied-paragraph: "このアプリがあなたのアカウントにアクセスすることはありません。"
|
||||
already-authorized: "このアプリは既に連携済みです"
|
||||
@ -164,15 +165,18 @@ auth/views/index.vue:
|
||||
common/views/components/games/reversi/reversi.vue:
|
||||
matching:
|
||||
waiting-for: "{}を待っています"
|
||||
cancel: "キャンセル"
|
||||
cancel: "취소"
|
||||
common/views/components/games/reversi/reversi.game.vue:
|
||||
surrender: "投了"
|
||||
surrender: "기권"
|
||||
surrendered: "投了により"
|
||||
is-llotheo: "石の少ない方が勝ち(ロセオ)"
|
||||
looped-map: "루프 지도"
|
||||
can-put-everywhere: "どこでも置けるモード"
|
||||
common/views/components/games/reversi/reversi.index.vue:
|
||||
title: "Misskey Reversi"
|
||||
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
||||
invite: "招待"
|
||||
rule: "遊び方"
|
||||
invite: "초대"
|
||||
rule: "게임 방법"
|
||||
rule-desc: "リバーシは、相手と交互に石をボードに置いて、相手の石を挟んで自分の色に変えてゆき、最終的に残った石が多い方が勝ちというボードゲームです。"
|
||||
mode-invite: "招待"
|
||||
mode-invite-desc: "指定したユーザーと対戦するモードです。"
|
||||
@ -181,26 +185,26 @@ common/views/components/games/reversi/reversi.index.vue:
|
||||
all-games: "みんなの対局"
|
||||
enter-username: "ユーザー名を入力してください"
|
||||
game-state:
|
||||
ended: "終了"
|
||||
playing: "進行中"
|
||||
ended: "종료"
|
||||
playing: "진행중"
|
||||
common/views/components/games/reversi/reversi.room.vue:
|
||||
settings-of-the-game: "ゲームの設定"
|
||||
choose-map: "マップを選択"
|
||||
random: "ランダム"
|
||||
black-or-white: "先手/後手"
|
||||
black-is: "{}が黒"
|
||||
rules: "ルール"
|
||||
rules: "규칙"
|
||||
is-llotheo: "石の少ない方が勝ち(ロセオ)"
|
||||
looped-map: "ループマップ"
|
||||
looped-map: "루프 지도"
|
||||
can-put-everywhere: "どこでも置けるモード"
|
||||
settings-of-the-bot: "Botの設定"
|
||||
this-game-is-started-soon: "ゲームは数秒後に開始されます"
|
||||
waiting-for-other: "相手の準備が完了するのを待っています"
|
||||
waiting-for-me: "あなたの準備が完了するのを待っています"
|
||||
waiting-for-both: "準備中"
|
||||
cancel: "キャンセル"
|
||||
ready: "準備完了"
|
||||
cancel-ready: "準備続行"
|
||||
waiting-for-both: "준비중"
|
||||
cancel: "취소"
|
||||
ready: "준비 완료"
|
||||
cancel-ready: "준비 계속"
|
||||
common/views/components/connect-failed.vue:
|
||||
title: "サーバーに接続できません"
|
||||
description: "インターネット回線に問題があるか、サーバーがダウンまたはメンテナンスしている可能性があります。しばらくしてから{再度お試し}ください。"
|
||||
@ -227,7 +231,7 @@ common/views/components/connect-failed.troubleshooter.vue:
|
||||
set-version: "バージョン指定"
|
||||
common/views/components/messaging.vue:
|
||||
search-user: "ユーザーを探す"
|
||||
you: "あなた"
|
||||
you: "당신"
|
||||
no-history: "履歴はありません"
|
||||
common/views/components/messaging-room.vue:
|
||||
empty: "このユーザーと話したことはありません"
|
||||
@ -238,12 +242,12 @@ common/views/components/messaging-room.vue:
|
||||
only-one-file-attached: "メッセージに添付できるのはひとつのファイルのみです"
|
||||
common/views/components/messaging-room.form.vue:
|
||||
input-message-here: "ここにメッセージを入力"
|
||||
send: "送信"
|
||||
send: "전송"
|
||||
attach-from-local: "PCからファイルを添付する"
|
||||
attach-from-drive: "ドライブからファイルを添付する"
|
||||
only-one-file-attached: "メッセージに添付できるのはひとつのファイルのみです"
|
||||
common/views/components/messaging-room.message.vue:
|
||||
is-read: "既読"
|
||||
is-read: "읽음"
|
||||
deleted: "このメッセージは削除されました"
|
||||
common/views/components/nav.vue:
|
||||
about: "Misskeyについて"
|
||||
@ -283,6 +287,7 @@ common/views/components/signin.vue:
|
||||
signin: "サインイン"
|
||||
or: "または"
|
||||
signin-with-twitter: "Twitterでログイン"
|
||||
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||
common/views/components/signup.vue:
|
||||
username: "ユーザー名"
|
||||
checking: "確認しています..."
|
||||
@ -621,9 +626,11 @@ desktop/views/components/settings.vue:
|
||||
circle-icons: "円形のアイコンを使用"
|
||||
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
||||
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||
show-reply-target: "リプライ先を表示する"
|
||||
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
|
||||
show-renoted-my-notes: "Renoteされた自分の投稿をタイムラインに表示する"
|
||||
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
|
||||
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
|
||||
show-maps: "マップの自動展開"
|
||||
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
|
||||
sound: "サウンド"
|
||||
@ -780,6 +787,25 @@ desktop/views/components/users-list-item.vue:
|
||||
desktop/views/components/window.vue:
|
||||
popout: "ポップアウト"
|
||||
close: "閉じる"
|
||||
desktop/views/pages/admin/admin.vue:
|
||||
dashboard: "ダッシュボード"
|
||||
drive: "ドライブ"
|
||||
users: "ユーザー"
|
||||
update: "更新"
|
||||
desktop/views/pages/admin/admin.dashboard.vue:
|
||||
dashboard: "ダッシュボード"
|
||||
all-users: "全てのユーザー"
|
||||
original-users: "このインスタンスのユーザー"
|
||||
all-notes: "全てのノート"
|
||||
original-notes: "このインスタンスのノート"
|
||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
||||
suspend-user: "ユーザーの凍結"
|
||||
suspend: "凍結"
|
||||
suspended: "凍結しました"
|
||||
desktop/views/pages/admin/admin.unsuspend-user.vue:
|
||||
unsuspend-user: "ユーザーの凍結の解除"
|
||||
unsuspend: "凍結の解除"
|
||||
unsuspended: "凍結を解除しました"
|
||||
desktop/views/pages/deck/deck.tl-column.vue:
|
||||
is-media-only: "メディア投稿のみ"
|
||||
is-media-view: "メディアビュー"
|
||||
@ -1083,7 +1109,8 @@ mobile/views/pages/settings.vue:
|
||||
timeline: "タイムライン"
|
||||
show-reply-target: "リプライ先を表示する"
|
||||
show-my-renotes: "自分の行ったRenoteを表示する"
|
||||
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
|
||||
show-renoted-my-notes: "自分の投稿のRenoteを表示する"
|
||||
show-local-renotes: "ローカルの投稿のRenoteを表示する"
|
||||
post-style: "投稿の表示スタイル"
|
||||
post-style-standard: "標準"
|
||||
post-style-smart: "スマート"
|
||||
|
@ -39,7 +39,7 @@ common:
|
||||
weeks_ago: "{} tyg. temu"
|
||||
months_ago: "{} mies. temu"
|
||||
years_ago: "{} lat temu"
|
||||
month-and-day: "{month}月 {day}日"
|
||||
month-and-day: "{month}-{day}"
|
||||
trash: "Kosz"
|
||||
weekday-short:
|
||||
sunday: "N"
|
||||
@ -66,6 +66,7 @@ common:
|
||||
congrats: "Gratuluję!"
|
||||
angry: "Wściekły"
|
||||
confused: "Zmieszany"
|
||||
rip: "RIP"
|
||||
pudding: "Pudding"
|
||||
note-placeholders:
|
||||
a: "Co robisz?"
|
||||
@ -83,7 +84,7 @@ common:
|
||||
my-token-regenerated: "Twój token został wygenerowany. Zostaniesz wylogowany."
|
||||
i-like-sushi: "Wolę sushi od puddingu"
|
||||
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"
|
||||
reversi:
|
||||
drawn: "Remis"
|
||||
@ -168,6 +169,9 @@ common/views/components/games/reversi/reversi.vue:
|
||||
common/views/components/games/reversi/reversi.game.vue:
|
||||
surrender: "投了"
|
||||
surrendered: "投了により"
|
||||
is-llotheo: "石の少ない方が勝ち(ロセオ)"
|
||||
looped-map: "ループマップ"
|
||||
can-put-everywhere: "どこでも置けるモード"
|
||||
common/views/components/games/reversi/reversi.index.vue:
|
||||
title: "Misskey Reversi"
|
||||
sub-title: "Zagraj w Reversi ze znajomymi!"
|
||||
@ -283,6 +287,7 @@ common/views/components/signin.vue:
|
||||
signin: "Zaloguj"
|
||||
or: "または"
|
||||
signin-with-twitter: "Zaloguj się za pomocą Twittera"
|
||||
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||
common/views/components/signup.vue:
|
||||
username: "Nazwa użytkownika"
|
||||
checking: "Sprawdzanie…"
|
||||
@ -394,15 +399,15 @@ common/views/pages/follow.vue:
|
||||
follow-request: "Poproś o śledzenie"
|
||||
desktop:
|
||||
banner-crop-title: "バナーとして表示する部分を選択"
|
||||
banner: "バナー"
|
||||
uploading-banner: "新しいバナーをアップロードしています"
|
||||
banner-updated: "バナーを更新しました"
|
||||
choose-banner: "バナーにする画像を選択"
|
||||
avatar-crop-title: "アバターとして表示する部分を選択"
|
||||
avatar: "アバター"
|
||||
uploading-avatar: "新しいアバターをアップロードしています"
|
||||
avatar-updated: "アバターを更新しました"
|
||||
choose-avatar: "アバターにする画像を選択"
|
||||
banner: "Baner"
|
||||
uploading-banner: "Wysyłanie baneru"
|
||||
banner-updated: "Zmieniono baner"
|
||||
choose-banner: "Wybierz baner"
|
||||
avatar-crop-title: "Wybierz część obrazu, która zostanie użyta jako awatar"
|
||||
avatar: "Awatar"
|
||||
uploading-avatar: "Wysyłanie awatara"
|
||||
avatar-updated: "Wysłano awatar"
|
||||
choose-avatar: "Wybierz awatar"
|
||||
desktop/views/components/activity.chart.vue:
|
||||
total: "Czarny … Łącznie"
|
||||
notes: "Niebieski … Wpisy"
|
||||
@ -621,9 +626,11 @@ desktop/views/components/settings.vue:
|
||||
circle-icons: "Używaj okrągłych ikon"
|
||||
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"
|
||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||
show-reply-target: "Pokazuj cel odpowiedzi"
|
||||
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-desc: "Mapa będzie automatycznie rozwijana dla wpisów zawierających informacje o lokalizacji."
|
||||
sound: "Dźwięk"
|
||||
@ -780,6 +787,25 @@ desktop/views/components/users-list-item.vue:
|
||||
desktop/views/components/window.vue:
|
||||
popout: "Pop-out"
|
||||
close: "Zamknij"
|
||||
desktop/views/pages/admin/admin.vue:
|
||||
dashboard: "ダッシュボード"
|
||||
drive: "ドライブ"
|
||||
users: "ユーザー"
|
||||
update: "更新"
|
||||
desktop/views/pages/admin/admin.dashboard.vue:
|
||||
dashboard: "ダッシュボード"
|
||||
all-users: "全てのユーザー"
|
||||
original-users: "このインスタンスのユーザー"
|
||||
all-notes: "全てのノート"
|
||||
original-notes: "このインスタンスのノート"
|
||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
||||
suspend-user: "ユーザーの凍結"
|
||||
suspend: "凍結"
|
||||
suspended: "凍結しました"
|
||||
desktop/views/pages/admin/admin.unsuspend-user.vue:
|
||||
unsuspend-user: "ユーザーの凍結の解除"
|
||||
unsuspend: "凍結の解除"
|
||||
unsuspended: "凍結を解除しました"
|
||||
desktop/views/pages/deck/deck.tl-column.vue:
|
||||
is-media-only: "Tylko wpisy z zawartością multimedialną"
|
||||
is-media-view: "Widok multimediów"
|
||||
@ -1083,7 +1109,8 @@ mobile/views/pages/settings.vue:
|
||||
timeline: "Oś czasu"
|
||||
show-reply-target: "Pokazuj cel odpowiedzi"
|
||||
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-standard: "Standardowy"
|
||||
post-style-smart: "Inteligentny"
|
||||
@ -1162,4 +1189,4 @@ docs:
|
||||
type: "Rodzaj"
|
||||
description: "Opis"
|
||||
dev/views/index.vue:
|
||||
manage-apps: "アプリの管理"
|
||||
manage-apps: "Zarządzaj aplikacjami"
|
||||
|
@ -66,6 +66,7 @@ common:
|
||||
congrats: "おめでとう"
|
||||
angry: "おこ"
|
||||
confused: "こまこまのこまり"
|
||||
rip: "RIP"
|
||||
pudding: "Pudding"
|
||||
note-placeholders:
|
||||
a: "今どうしてる?"
|
||||
@ -83,7 +84,7 @@ common:
|
||||
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
||||
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
||||
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
||||
verified-user: "認証済みのユーザー"
|
||||
verified-user: "公式アカウント"
|
||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||
reversi:
|
||||
drawn: "引き分け"
|
||||
@ -168,6 +169,9 @@ common/views/components/games/reversi/reversi.vue:
|
||||
common/views/components/games/reversi/reversi.game.vue:
|
||||
surrender: "投了"
|
||||
surrendered: "投了により"
|
||||
is-llotheo: "石の少ない方が勝ち(ロセオ)"
|
||||
looped-map: "ループマップ"
|
||||
can-put-everywhere: "どこでも置けるモード"
|
||||
common/views/components/games/reversi/reversi.index.vue:
|
||||
title: "Misskey Reversi"
|
||||
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
||||
@ -283,6 +287,7 @@ common/views/components/signin.vue:
|
||||
signin: "サインイン"
|
||||
or: "または"
|
||||
signin-with-twitter: "Twitterでログイン"
|
||||
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||
common/views/components/signup.vue:
|
||||
username: "ユーザー名"
|
||||
checking: "確認しています..."
|
||||
@ -621,9 +626,11 @@ desktop/views/components/settings.vue:
|
||||
circle-icons: "円形のアイコンを使用"
|
||||
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
||||
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||
show-reply-target: "リプライ先を表示する"
|
||||
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
|
||||
show-renoted-my-notes: "Renoteされた自分の投稿をタイムラインに表示する"
|
||||
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
|
||||
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
|
||||
show-maps: "マップの自動展開"
|
||||
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
|
||||
sound: "サウンド"
|
||||
@ -780,6 +787,25 @@ desktop/views/components/users-list-item.vue:
|
||||
desktop/views/components/window.vue:
|
||||
popout: "ポップアウト"
|
||||
close: "閉じる"
|
||||
desktop/views/pages/admin/admin.vue:
|
||||
dashboard: "ダッシュボード"
|
||||
drive: "ドライブ"
|
||||
users: "ユーザー"
|
||||
update: "更新"
|
||||
desktop/views/pages/admin/admin.dashboard.vue:
|
||||
dashboard: "ダッシュボード"
|
||||
all-users: "全てのユーザー"
|
||||
original-users: "このインスタンスのユーザー"
|
||||
all-notes: "全てのノート"
|
||||
original-notes: "このインスタンスのノート"
|
||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
||||
suspend-user: "ユーザーの凍結"
|
||||
suspend: "凍結"
|
||||
suspended: "凍結しました"
|
||||
desktop/views/pages/admin/admin.unsuspend-user.vue:
|
||||
unsuspend-user: "ユーザーの凍結の解除"
|
||||
unsuspend: "凍結の解除"
|
||||
unsuspended: "凍結を解除しました"
|
||||
desktop/views/pages/deck/deck.tl-column.vue:
|
||||
is-media-only: "メディア投稿のみ"
|
||||
is-media-view: "メディアビュー"
|
||||
@ -1083,7 +1109,8 @@ mobile/views/pages/settings.vue:
|
||||
timeline: "タイムライン"
|
||||
show-reply-target: "リプライ先を表示する"
|
||||
show-my-renotes: "自分の行ったRenoteを表示する"
|
||||
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
|
||||
show-renoted-my-notes: "自分の投稿のRenoteを表示する"
|
||||
show-local-renotes: "ローカルの投稿のRenoteを表示する"
|
||||
post-style: "投稿の表示スタイル"
|
||||
post-style-standard: "標準"
|
||||
post-style-smart: "スマート"
|
||||
|
@ -66,6 +66,7 @@ common:
|
||||
congrats: "おめでとう"
|
||||
angry: "おこ"
|
||||
confused: "こまこまのこまり"
|
||||
rip: "RIP"
|
||||
pudding: "Pudding"
|
||||
note-placeholders:
|
||||
a: "今どうしてる?"
|
||||
@ -83,7 +84,7 @@ common:
|
||||
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
||||
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
||||
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
||||
verified-user: "認証済みのユーザー"
|
||||
verified-user: "公式アカウント"
|
||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||
reversi:
|
||||
drawn: "引き分け"
|
||||
@ -168,6 +169,9 @@ common/views/components/games/reversi/reversi.vue:
|
||||
common/views/components/games/reversi/reversi.game.vue:
|
||||
surrender: "投了"
|
||||
surrendered: "投了により"
|
||||
is-llotheo: "石の少ない方が勝ち(ロセオ)"
|
||||
looped-map: "ループマップ"
|
||||
can-put-everywhere: "どこでも置けるモード"
|
||||
common/views/components/games/reversi/reversi.index.vue:
|
||||
title: "Misskey Reversi"
|
||||
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
||||
@ -283,6 +287,7 @@ common/views/components/signin.vue:
|
||||
signin: "サインイン"
|
||||
or: "または"
|
||||
signin-with-twitter: "Twitterでログイン"
|
||||
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||
common/views/components/signup.vue:
|
||||
username: "ユーザー名"
|
||||
checking: "確認しています..."
|
||||
@ -621,9 +626,11 @@ desktop/views/components/settings.vue:
|
||||
circle-icons: "円形のアイコンを使用"
|
||||
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
||||
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||
show-reply-target: "リプライ先を表示する"
|
||||
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
|
||||
show-renoted-my-notes: "Renoteされた自分の投稿をタイムラインに表示する"
|
||||
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
|
||||
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
|
||||
show-maps: "マップの自動展開"
|
||||
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
|
||||
sound: "サウンド"
|
||||
@ -780,6 +787,25 @@ desktop/views/components/users-list-item.vue:
|
||||
desktop/views/components/window.vue:
|
||||
popout: "ポップアウト"
|
||||
close: "閉じる"
|
||||
desktop/views/pages/admin/admin.vue:
|
||||
dashboard: "ダッシュボード"
|
||||
drive: "ドライブ"
|
||||
users: "ユーザー"
|
||||
update: "更新"
|
||||
desktop/views/pages/admin/admin.dashboard.vue:
|
||||
dashboard: "ダッシュボード"
|
||||
all-users: "全てのユーザー"
|
||||
original-users: "このインスタンスのユーザー"
|
||||
all-notes: "全てのノート"
|
||||
original-notes: "このインスタンスのノート"
|
||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
||||
suspend-user: "ユーザーの凍結"
|
||||
suspend: "凍結"
|
||||
suspended: "凍結しました"
|
||||
desktop/views/pages/admin/admin.unsuspend-user.vue:
|
||||
unsuspend-user: "ユーザーの凍結の解除"
|
||||
unsuspend: "凍結の解除"
|
||||
unsuspended: "凍結を解除しました"
|
||||
desktop/views/pages/deck/deck.tl-column.vue:
|
||||
is-media-only: "メディア投稿のみ"
|
||||
is-media-view: "メディアビュー"
|
||||
@ -1083,7 +1109,8 @@ mobile/views/pages/settings.vue:
|
||||
timeline: "タイムライン"
|
||||
show-reply-target: "リプライ先を表示する"
|
||||
show-my-renotes: "自分の行ったRenoteを表示する"
|
||||
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
|
||||
show-renoted-my-notes: "自分の投稿のRenoteを表示する"
|
||||
show-local-renotes: "ローカルの投稿のRenoteを表示する"
|
||||
post-style: "投稿の表示スタイル"
|
||||
post-style-standard: "標準"
|
||||
post-style-smart: "スマート"
|
||||
|
@ -66,6 +66,7 @@ common:
|
||||
congrats: "おめでとう"
|
||||
angry: "おこ"
|
||||
confused: "こまこまのこまり"
|
||||
rip: "RIP"
|
||||
pudding: "Pudding"
|
||||
note-placeholders:
|
||||
a: "今どうしてる?"
|
||||
@ -83,7 +84,7 @@ common:
|
||||
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
||||
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
||||
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
||||
verified-user: "認証済みのユーザー"
|
||||
verified-user: "公式アカウント"
|
||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||
reversi:
|
||||
drawn: "引き分け"
|
||||
@ -168,6 +169,9 @@ common/views/components/games/reversi/reversi.vue:
|
||||
common/views/components/games/reversi/reversi.game.vue:
|
||||
surrender: "投了"
|
||||
surrendered: "投了により"
|
||||
is-llotheo: "石の少ない方が勝ち(ロセオ)"
|
||||
looped-map: "ループマップ"
|
||||
can-put-everywhere: "どこでも置けるモード"
|
||||
common/views/components/games/reversi/reversi.index.vue:
|
||||
title: "Misskey Reversi"
|
||||
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
||||
@ -283,6 +287,7 @@ common/views/components/signin.vue:
|
||||
signin: "サインイン"
|
||||
or: "または"
|
||||
signin-with-twitter: "Twitterでログイン"
|
||||
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||
common/views/components/signup.vue:
|
||||
username: "ユーザー名"
|
||||
checking: "確認しています..."
|
||||
@ -621,9 +626,11 @@ desktop/views/components/settings.vue:
|
||||
circle-icons: "円形のアイコンを使用"
|
||||
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
||||
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||
show-reply-target: "リプライ先を表示する"
|
||||
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
|
||||
show-renoted-my-notes: "Renoteされた自分の投稿をタイムラインに表示する"
|
||||
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
|
||||
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
|
||||
show-maps: "マップの自動展開"
|
||||
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
|
||||
sound: "サウンド"
|
||||
@ -780,6 +787,25 @@ desktop/views/components/users-list-item.vue:
|
||||
desktop/views/components/window.vue:
|
||||
popout: "ポップアウト"
|
||||
close: "閉じる"
|
||||
desktop/views/pages/admin/admin.vue:
|
||||
dashboard: "ダッシュボード"
|
||||
drive: "ドライブ"
|
||||
users: "ユーザー"
|
||||
update: "更新"
|
||||
desktop/views/pages/admin/admin.dashboard.vue:
|
||||
dashboard: "ダッシュボード"
|
||||
all-users: "全てのユーザー"
|
||||
original-users: "このインスタンスのユーザー"
|
||||
all-notes: "全てのノート"
|
||||
original-notes: "このインスタンスのノート"
|
||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
||||
suspend-user: "ユーザーの凍結"
|
||||
suspend: "凍結"
|
||||
suspended: "凍結しました"
|
||||
desktop/views/pages/admin/admin.unsuspend-user.vue:
|
||||
unsuspend-user: "ユーザーの凍結の解除"
|
||||
unsuspend: "凍結の解除"
|
||||
unsuspended: "凍結を解除しました"
|
||||
desktop/views/pages/deck/deck.tl-column.vue:
|
||||
is-media-only: "メディア投稿のみ"
|
||||
is-media-view: "メディアビュー"
|
||||
@ -1083,7 +1109,8 @@ mobile/views/pages/settings.vue:
|
||||
timeline: "タイムライン"
|
||||
show-reply-target: "リプライ先を表示する"
|
||||
show-my-renotes: "自分の行ったRenoteを表示する"
|
||||
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
|
||||
show-renoted-my-notes: "自分の投稿のRenoteを表示する"
|
||||
show-local-renotes: "ローカルの投稿のRenoteを表示する"
|
||||
post-style: "投稿の表示スタイル"
|
||||
post-style-standard: "標準"
|
||||
post-style-smart: "スマート"
|
||||
|
39
package.json
39
package.json
@ -1,8 +1,8 @@
|
||||
{
|
||||
"name": "misskey",
|
||||
"author": "syuilo <i@syuilo.com>",
|
||||
"version": "5.20.0",
|
||||
"clientVersion": "1.0.8099",
|
||||
"version": "6.3.0",
|
||||
"clientVersion": "1.0.8483",
|
||||
"codename": "nighthike",
|
||||
"main": "./built/index.js",
|
||||
"private": true,
|
||||
@ -31,6 +31,7 @@
|
||||
"@types/dateformat": "1.0.1",
|
||||
"@types/debug": "0.0.30",
|
||||
"@types/deep-equal": "1.0.1",
|
||||
"@types/double-ended-queue": "2.1.0",
|
||||
"@types/elasticsearch": "5.0.25",
|
||||
"@types/file-type": "5.2.1",
|
||||
"@types/gulp": "3.8.36",
|
||||
@ -57,9 +58,9 @@
|
||||
"@types/minio": "6.0.2",
|
||||
"@types/mkdirp": "0.5.2",
|
||||
"@types/mocha": "5.2.3",
|
||||
"@types/mongodb": "3.1.3",
|
||||
"@types/mongodb": "3.1.4",
|
||||
"@types/ms": "0.7.30",
|
||||
"@types/node": "10.5.7",
|
||||
"@types/node": "10.7.1",
|
||||
"@types/portscanner": "2.1.0",
|
||||
"@types/pug": "2.0.4",
|
||||
"@types/qrcode": "1.2.0",
|
||||
@ -76,10 +77,10 @@
|
||||
"@types/systeminformation": "3.23.0",
|
||||
"@types/tmp": "0.0.33",
|
||||
"@types/uuid": "3.4.3",
|
||||
"@types/webpack": "4.4.9",
|
||||
"@types/webpack": "4.4.10",
|
||||
"@types/webpack-stream": "3.2.10",
|
||||
"@types/websocket": "0.0.39",
|
||||
"@types/ws": "5.1.2",
|
||||
"@types/ws": "6.0.0",
|
||||
"animejs": "2.2.0",
|
||||
"autosize": "4.0.2",
|
||||
"autwh": "0.1.0",
|
||||
@ -97,8 +98,9 @@
|
||||
"deepcopy": "0.6.3",
|
||||
"diskusage": "0.2.4",
|
||||
"dompurify": "1.0.5",
|
||||
"double-ended-queue": "2.1.0-0",
|
||||
"elasticsearch": "15.1.1",
|
||||
"element-ui": "2.4.5",
|
||||
"element-ui": "2.4.6",
|
||||
"emojilib": "2.3.0",
|
||||
"escape-regexp": "0.0.1",
|
||||
"eslint": "5.0.1",
|
||||
@ -106,7 +108,7 @@
|
||||
"eventemitter3": "3.1.0",
|
||||
"exif-js": "2.3.0",
|
||||
"file-loader": "1.1.11",
|
||||
"file-type": "8.1.0",
|
||||
"file-type": "9.0.0",
|
||||
"fuckadblock": "3.2.1",
|
||||
"gulp": "3.9.1",
|
||||
"gulp-cssnano": "2.1.3",
|
||||
@ -145,8 +147,9 @@
|
||||
"koa-slow": "2.1.0",
|
||||
"koa-views": "6.1.4",
|
||||
"loader-utils": "1.1.0",
|
||||
"lodash.assign": "4.2.0",
|
||||
"mecab-async": "0.1.2",
|
||||
"minio": "6.0.0",
|
||||
"minio": "7.0.0",
|
||||
"mkdirp": "0.5.1",
|
||||
"mocha": "5.2.0",
|
||||
"moji": "0.5.1",
|
||||
@ -154,13 +157,13 @@
|
||||
"monk": "6.0.6",
|
||||
"ms": "2.1.1",
|
||||
"nan": "2.10.0",
|
||||
"node-sass": "4.9.2",
|
||||
"node-sass": "4.9.3",
|
||||
"node-sass-json-importer": "3.3.1",
|
||||
"nprogress": "0.2.0",
|
||||
"object-assign-deep": "0.4.0",
|
||||
"on-build-webpack": "0.1.0",
|
||||
"os-utils": "0.0.14",
|
||||
"parse5": "5.0.0",
|
||||
"parse5": "5.1.0",
|
||||
"portscanner": "2.2.0",
|
||||
"progress-bar-webpack-plugin": "1.11.0",
|
||||
"promise-sequential": "1.1.1",
|
||||
@ -171,13 +174,13 @@
|
||||
"recaptcha-promise": "0.1.3",
|
||||
"reconnecting-websocket": "3.2.2",
|
||||
"redis": "2.8.0",
|
||||
"request": "2.87.0",
|
||||
"request": "2.88.0",
|
||||
"request-promise-native": "1.0.5",
|
||||
"rimraf": "2.6.2",
|
||||
"rndstr": "1.0.0",
|
||||
"s-age": "1.1.2",
|
||||
"sass-loader": "7.1.0",
|
||||
"seedrandom": "2.4.3",
|
||||
"seedrandom": "2.4.4",
|
||||
"sharp": "0.20.5",
|
||||
"showdown": "1.8.6",
|
||||
"showdown-highlightjs-extension": "0.1.2",
|
||||
@ -187,27 +190,27 @@
|
||||
"style-loader": "0.22.1",
|
||||
"stylus": "0.54.5",
|
||||
"stylus-loader": "3.0.2",
|
||||
"summaly": "2.0.6",
|
||||
"summaly": "2.1.3",
|
||||
"systeminformation": "3.42.9",
|
||||
"syuilo-password-strength": "0.0.1",
|
||||
"textarea-caret": "3.1.0",
|
||||
"tmp": "0.0.33",
|
||||
"ts-loader": "4.4.1",
|
||||
"ts-node": "7.0.0",
|
||||
"ts-node": "7.0.1",
|
||||
"tslint": "5.10.0",
|
||||
"typescript": "2.9.2",
|
||||
"typescript-eslint-parser": "18.0.0",
|
||||
"uglify-es": "3.3.9",
|
||||
"url-loader": "1.0.1",
|
||||
"url-loader": "1.1.0",
|
||||
"uuid": "3.3.2",
|
||||
"v-animate-css": "0.0.2",
|
||||
"vue": "2.5.17",
|
||||
"vue-cropperjs": "2.2.1",
|
||||
"vue-js-modal": "1.3.16",
|
||||
"vue-js-modal": "1.3.17",
|
||||
"vue-json-tree-view": "2.1.4",
|
||||
"vue-loader": "15.3.0",
|
||||
"vue-router": "3.0.1",
|
||||
"vue-style-loader": "4.1.1",
|
||||
"vue-style-loader": "4.1.2",
|
||||
"vue-template-compiler": "2.5.17",
|
||||
"vuedraggable": "2.16.0",
|
||||
"vuex": "3.0.1",
|
||||
|
@ -1,5 +1,9 @@
|
||||
export default () => [
|
||||
const kaos = [
|
||||
'(=^・・^=)',
|
||||
'v(\'ω\')v',
|
||||
'🐡( \'-\' 🐡 )フグパンチ!!!!'
|
||||
][Math.floor(Math.random() * 3)];
|
||||
'🐡( \'-\' 🐡 )フグパンチ!!!!',
|
||||
'🖕(´・_・`)🖕',
|
||||
'(。>﹏<。)'
|
||||
];
|
||||
|
||||
export default () => kaos[Math.floor(Math.random() * kaos.length)];
|
||||
|
@ -1,6 +1,16 @@
|
||||
<template>
|
||||
<router-link class="mk-avatar" :to="user | userPage" :title="user | acct" :target="target" :style="style" v-if="disablePreview"></router-link>
|
||||
<router-link class="mk-avatar" :to="user | userPage" :title="user | acct" :target="target" :style="style" v-else v-user-preview="user.id"></router-link>
|
||||
<span class="mk-avatar" :class="{ cat }" :title="user | acct" v-if="disableLink && !disablePreview" v-user-preview="user.id" @click="onClick">
|
||||
<span class="inner" :style="style"></span>
|
||||
</span>
|
||||
<span class="mk-avatar" :class="{ cat }" :title="user | acct" v-else-if="disableLink && disablePreview" @click="onClick">
|
||||
<span class="inner" :style="style"></span>
|
||||
</span>
|
||||
<router-link class="mk-avatar" :class="{ cat }" :to="user | userPage" :title="user | acct" :target="target" v-else-if="!disableLink && !disablePreview" v-user-preview="user.id">
|
||||
<span class="inner" :style="style"></span>
|
||||
</router-link>
|
||||
<router-link class="mk-avatar" :class="{ cat }" :to="user | userPage" :title="user | acct" :target="target" v-else-if="!disableLink && disablePreview">
|
||||
<span class="inner" :style="style"></span>
|
||||
</router-link>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
@ -15,6 +25,10 @@ export default Vue.extend({
|
||||
required: false,
|
||||
default: null
|
||||
},
|
||||
disableLink: {
|
||||
required: false,
|
||||
default: false
|
||||
},
|
||||
disablePreview: {
|
||||
required: false,
|
||||
default: false
|
||||
@ -24,26 +38,71 @@ export default Vue.extend({
|
||||
lightmode(): boolean {
|
||||
return this.$store.state.device.lightmode;
|
||||
},
|
||||
cat(): boolean {
|
||||
return this.user.isCat && this.$store.state.settings.circleIcons;
|
||||
},
|
||||
style(): any {
|
||||
return {
|
||||
backgroundColor: this.lightmode
|
||||
? `rgb(${ this.user.avatarColor.slice(0, 3).join(',') })`
|
||||
? `rgb(${this.user.avatarColor.slice(0, 3).join(',')})`
|
||||
: this.user.avatarColor && this.user.avatarColor.length == 3
|
||||
? `rgb(${ this.user.avatarColor.join(',') })`
|
||||
? `rgb(${this.user.avatarColor.join(',')})`
|
||||
: null,
|
||||
backgroundImage: this.lightmode ? null : `url(${ this.user.avatarUrl })`,
|
||||
backgroundImage: this.lightmode ? null : `url(${this.user.avatarUrl})`,
|
||||
borderRadius: this.$store.state.settings.circleIcons ? '100%' : null
|
||||
};
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
onClick(e) {
|
||||
this.$emit('click', e);
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
.mk-avatar
|
||||
|
||||
root(isDark)
|
||||
display inline-block
|
||||
vertical-align bottom
|
||||
background-size cover
|
||||
background-position center center
|
||||
transition border-radius 1s ease
|
||||
|
||||
&:not(.cat)
|
||||
overflow hidden
|
||||
border-radius 8px
|
||||
|
||||
&.cat::before,
|
||||
&.cat::after
|
||||
background #df548f
|
||||
border solid 4px isDark ? #e0eefd : #202224
|
||||
box-sizing border-box
|
||||
content ''
|
||||
display inline-block
|
||||
height 50%
|
||||
width 50%
|
||||
|
||||
&.cat::before
|
||||
border-radius 0 75% 75%
|
||||
transform rotate(37.5deg) skew(30deg)
|
||||
|
||||
&.cat::after
|
||||
border-radius 75% 0 75% 75%
|
||||
transform rotate(-37.5deg) skew(-30deg)
|
||||
|
||||
.inner
|
||||
background-position center center
|
||||
background-size cover
|
||||
bottom 0
|
||||
left 0
|
||||
position absolute
|
||||
right 0
|
||||
top 0
|
||||
transition border-radius 1s ease
|
||||
z-index 1
|
||||
|
||||
.mk-avatar[data-darkmode]
|
||||
root(true)
|
||||
|
||||
.mk-avatar:not([data-darkmode])
|
||||
root(false)
|
||||
</style>
|
||||
|
@ -60,6 +60,12 @@
|
||||
<el-button type="primary" @click="logPos = logs.length" :disabled="logPos == logs.length">%fa:angle-double-right%</el-button>
|
||||
</el-button-group>
|
||||
</div>
|
||||
|
||||
<div class="info">
|
||||
<p v-if="game.settings.isLlotheo">%i18n:@is-llotheo%</p>
|
||||
<p v-if="game.settings.loopedBoard">%i18n:@looped-map%</p>
|
||||
<p v-if="game.settings.canPutEverywhere">%i18n:@can-put-everywhere%</p>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
<header class="bvonvjxbwzaiskogyhbwgyxvcgserpmu">
|
||||
<mk-avatar class="avatar" :user="note.user" v-if="$store.state.device.postStyle == 'smart'"/>
|
||||
<router-link class="name" :to="note.user | userPage" v-user-preview="note.user.id">{{ note.user | userName }}</router-link>
|
||||
<span class="is-verified" v-if="note.user.isVerified" title="%i18n:common.verified-user%">%fa:bookmark%</span>
|
||||
<span class="is-verified" v-if="note.user.isVerified" title="%i18n:common.verified-user%">%fa:star%</span>
|
||||
<span class="is-admin" v-if="note.user.isAdmin">admin</span>
|
||||
<span class="is-bot" v-if="note.user.isBot">bot</span>
|
||||
<span class="is-cat" v-if="note.user.isCat">cat</span>
|
||||
|
@ -8,6 +8,7 @@
|
||||
<img v-if="reaction == 'congrats'" src="/assets/reactions/congrats.png" alt="%i18n:common.reactions.congrats%">
|
||||
<img v-if="reaction == 'angry'" src="/assets/reactions/angry.png" alt="%i18n:common.reactions.angry%">
|
||||
<img v-if="reaction == 'confused'" src="/assets/reactions/confused.png" alt="%i18n:common.reactions.confused%">
|
||||
<img v-if="reaction == 'rip'" src="/assets/reactions/rip.png" alt="%i18n:common.reactions.rip%">
|
||||
<template v-if="reaction == 'pudding'">
|
||||
<img v-if="$store.getters.isSignedIn && $store.state.settings.iLikeSushi" src="/assets/reactions/sushi.png" alt="%i18n:common.reactions.pudding%">
|
||||
<img v-else src="/assets/reactions/pudding.png" alt="%i18n:common.reactions.pudding%">
|
||||
|
@ -10,9 +10,10 @@
|
||||
<button @click="react('hmm')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="4" title="%i18n:common.reactions.hmm%"><mk-reaction-icon reaction='hmm'/></button>
|
||||
<button @click="react('surprise')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="5" title="%i18n:common.reactions.surprise%"><mk-reaction-icon reaction='surprise'/></button>
|
||||
<button @click="react('congrats')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="6" title="%i18n:common.reactions.congrats%"><mk-reaction-icon reaction='congrats'/></button>
|
||||
<button @click="react('angry')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="4" title="%i18n:common.reactions.angry%"><mk-reaction-icon reaction='angry'/></button>
|
||||
<button @click="react('confused')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="5" title="%i18n:common.reactions.confused%"><mk-reaction-icon reaction='confused'/></button>
|
||||
<button @click="react('pudding')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="6" title="%i18n:common.reactions.pudding%"><mk-reaction-icon reaction='pudding'/></button>
|
||||
<button @click="react('angry')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="7" title="%i18n:common.reactions.angry%"><mk-reaction-icon reaction='angry'/></button>
|
||||
<button @click="react('confused')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="8" title="%i18n:common.reactions.confused%"><mk-reaction-icon reaction='confused'/></button>
|
||||
<button @click="react('rip')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="9" title="%i18n:common.reactions.rip%"><mk-reaction-icon reaction='rip'/></button>
|
||||
<button @click="react('pudding')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="10" title="%i18n:common.reactions.pudding%"><mk-reaction-icon reaction='pudding'/></button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -1,15 +1,16 @@
|
||||
<template>
|
||||
<div class="mk-reactions-viewer">
|
||||
<template v-if="reactions">
|
||||
<span v-if="reactions.like"><mk-reaction-icon reaction="like"/><span>{{ reactions.like }}</span></span>
|
||||
<span v-if="reactions.love"><mk-reaction-icon reaction="love"/><span>{{ reactions.love }}</span></span>
|
||||
<span v-if="reactions.laugh"><mk-reaction-icon reaction="laugh"/><span>{{ reactions.laugh }}</span></span>
|
||||
<span v-if="reactions.hmm"><mk-reaction-icon reaction="hmm"/><span>{{ reactions.hmm }}</span></span>
|
||||
<span v-if="reactions.surprise"><mk-reaction-icon reaction="surprise"/><span>{{ reactions.surprise }}</span></span>
|
||||
<span v-if="reactions.congrats"><mk-reaction-icon reaction="congrats"/><span>{{ reactions.congrats }}</span></span>
|
||||
<span v-if="reactions.angry"><mk-reaction-icon reaction="angry"/><span>{{ reactions.angry }}</span></span>
|
||||
<span v-if="reactions.confused"><mk-reaction-icon reaction="confused"/><span>{{ reactions.confused }}</span></span>
|
||||
<span v-if="reactions.pudding"><mk-reaction-icon reaction="pudding"/><span>{{ reactions.pudding }}</span></span>
|
||||
<span :class="{notReacted}" @click="react('like')" v-if="reactions.like"><mk-reaction-icon reaction="like"/><span>{{ reactions.like }}</span></span>
|
||||
<span :class="{notReacted}" @click="react('love')" v-if="reactions.love"><mk-reaction-icon reaction="love"/><span>{{ reactions.love }}</span></span>
|
||||
<span :class="{notReacted}" @click="react('laugh')" v-if="reactions.laugh"><mk-reaction-icon reaction="laugh"/><span>{{ reactions.laugh }}</span></span>
|
||||
<span :class="{notReacted}" @click="react('hmm')" v-if="reactions.hmm"><mk-reaction-icon reaction="hmm"/><span>{{ reactions.hmm }}</span></span>
|
||||
<span :class="{notReacted}" @click="react('surprise')" v-if="reactions.surprise"><mk-reaction-icon reaction="surprise"/><span>{{ reactions.surprise }}</span></span>
|
||||
<span :class="{notReacted}" @click="react('congrats')" v-if="reactions.congrats"><mk-reaction-icon reaction="congrats"/><span>{{ reactions.congrats }}</span></span>
|
||||
<span :class="{notReacted}" @click="react('angry')" v-if="reactions.angry"><mk-reaction-icon reaction="angry"/><span>{{ reactions.angry }}</span></span>
|
||||
<span :class="{notReacted}" @click="react('confused')" v-if="reactions.confused"><mk-reaction-icon reaction="confused"/><span>{{ reactions.confused }}</span></span>
|
||||
<span :class="{notReacted}" @click="react('rip')" v-if="reactions.rip"><mk-reaction-icon reaction="rip"/><span>{{ reactions.rip }}</span></span>
|
||||
<span :class="{notReacted}" @click="react('pudding')" v-if="reactions.pudding"><mk-reaction-icon reaction="pudding"/><span>{{ reactions.pudding }}</span></span>
|
||||
</template>
|
||||
</div>
|
||||
</template>
|
||||
@ -21,6 +22,17 @@ export default Vue.extend({
|
||||
computed: {
|
||||
reactions(): number {
|
||||
return this.note.reactionCounts;
|
||||
},
|
||||
notReacted(): boolean {
|
||||
return this.note.myReaction == null;
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
react(reaction: string) {
|
||||
(this as any).api('notes/reactions/create', {
|
||||
noteId: this.note.id,
|
||||
reaction: reaction
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
@ -39,6 +51,9 @@ root(isDark)
|
||||
> span
|
||||
margin-right 8px
|
||||
|
||||
&.notReacted
|
||||
cursor pointer
|
||||
|
||||
> .mk-reaction-icon
|
||||
font-size 1.4em
|
||||
|
||||
|
@ -12,13 +12,13 @@
|
||||
</ui-input>
|
||||
<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>
|
||||
<p style="margin: 8px 0;">%i18n:@or%<a :href="`${apiUrl}/signin/twitter`">%i18n:@signin-with-twitter%</a></p>
|
||||
<p style="margin: 8px 0;" v-if="twitterIntegration">%i18n:@or% <a :href="`${apiUrl}/signin/twitter`">%i18n:@signin-with-twitter%</a></p>
|
||||
</form>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import { apiUrl, host } from '../../../config';
|
||||
import { apiUrl, host, twitterIntegration } from '../../../config';
|
||||
|
||||
export default Vue.extend({
|
||||
props: {
|
||||
@ -36,7 +36,8 @@ export default Vue.extend({
|
||||
password: '',
|
||||
token: '',
|
||||
apiUrl,
|
||||
host
|
||||
host,
|
||||
twitterIntegration
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
@ -59,7 +60,7 @@ export default Vue.extend({
|
||||
}).then(() => {
|
||||
location.reload();
|
||||
}).catch(() => {
|
||||
alert('something happened');
|
||||
alert('%i18n:@login-failed%');
|
||||
this.signing = false;
|
||||
});
|
||||
}
|
||||
|
@ -1,5 +1,10 @@
|
||||
<template>
|
||||
<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">
|
||||
<span>%i18n:@username%</span>
|
||||
<span slot="prefix">@</span>
|
||||
@ -46,11 +51,13 @@ export default Vue.extend({
|
||||
username: '',
|
||||
password: '',
|
||||
retypedPassword: '',
|
||||
invitationCode: '',
|
||||
url,
|
||||
recaptchaSitekey,
|
||||
usernameState: null,
|
||||
passwordStrength: '',
|
||||
passwordRetypeState: null
|
||||
passwordRetypeState: null,
|
||||
meta: null
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
@ -61,6 +68,11 @@ export default Vue.extend({
|
||||
this.usernameState != 'max-range');
|
||||
}
|
||||
},
|
||||
created() {
|
||||
(this as any).os.getMeta().then(meta => {
|
||||
this.meta = meta;
|
||||
});
|
||||
},
|
||||
methods: {
|
||||
onChangeUsername() {
|
||||
if (this.username == '') {
|
||||
@ -110,6 +122,7 @@ export default Vue.extend({
|
||||
(this as any).api('signup', {
|
||||
username: this.username,
|
||||
password: this.password,
|
||||
invitationCode: this.invitationCode,
|
||||
'g-recaptcha-response': recaptchaSitekey != null ? (window as any).grecaptcha.getResponse() : null
|
||||
}).then(() => {
|
||||
(this as any).api('signin', {
|
||||
|
@ -1,13 +1,5 @@
|
||||
<template>
|
||||
<iframe v-if="youtubeId" type="text/html" height="250"
|
||||
:src="`https://www.youtube.com/embed/${youtubeId}?origin=${misskeyUrl}`"
|
||||
frameborder="0"/>
|
||||
<iframe v-else-if="spotifyId"
|
||||
:src="`https://open.spotify.com/embed/track/${spotifyId}`"
|
||||
frameborder="0" allowtransparency="true" allow="encrypted-media" />
|
||||
<iframe v-else-if="nicovideoId"
|
||||
:src="`https://embed.nicovideo.jp/watch/${nicovideoId}?oldScript=1&referer=${misskeyUrl}&from=${position || '0'}&allowProgrammaticFullScreen=1`"
|
||||
frameborder="0" allow="autoplay; encrypted-media" allowfullscreen />
|
||||
<iframe v-if="player" :src="player" heigth="250" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen />
|
||||
<div v-else-if="tweetUrl && detail" class="twitter">
|
||||
<blockquote ref="tweet" class="twitter-tweet" :data-theme="$store.state.device.darkmode ? 'dark' : null">
|
||||
<a :href="url"></a>
|
||||
@ -54,10 +46,7 @@ export default Vue.extend({
|
||||
thumbnail: null,
|
||||
icon: null,
|
||||
sitename: null,
|
||||
youtubeId: null,
|
||||
spotifyId: null,
|
||||
nicovideoId: null,
|
||||
position: null,
|
||||
player: null,
|
||||
tweetUrl: null,
|
||||
misskeyUrl
|
||||
};
|
||||
@ -65,23 +54,7 @@ export default Vue.extend({
|
||||
created() {
|
||||
const url = new URL(this.url);
|
||||
|
||||
if (url.hostname == 'www.youtube.com') {
|
||||
this.youtubeId = url.searchParams.get('v');
|
||||
return;
|
||||
} else if (url.hostname == 'youtu.be') {
|
||||
this.youtubeId = url.pathname;
|
||||
return;
|
||||
} else if (url.hostname == 'open.spotify.com') {
|
||||
this.spotifyId = url.pathname.split('/').reverse().filter(x => x !== '')[0];
|
||||
return;
|
||||
} else if (['nicovideo.jp', 'www.nicovideo.jp', 'nico.ms'].includes(url.hostname)) {
|
||||
const id = url.pathname.split('/').reverse().filter(x => x !== '')[0];
|
||||
if (['sm', 'nm', 'ax', 'ca', 'cd', 'cw', 'fx', 'ig', 'na', 'om', 'sd', 'sk', 'yk', 'yo', 'za', 'zb', 'zc', 'zd', 'ze', 'nl', 'so', ...Array(10).keys()].some(x => id.startsWith(x)) {
|
||||
this.nicovideoId = id;
|
||||
this.position = url.searchParams.get('from');
|
||||
return;
|
||||
}
|
||||
} else if (this.detail && url.hostname == 'twitter.com' && /^\/.+\/status(es)?\/\d+/.test(url.pathname)) {
|
||||
if (this.detail && url.hostname == 'twitter.com' && /^\/.+\/status(es)?\/\d+/.test(url.pathname)) {
|
||||
this.tweetUrl = url;
|
||||
const twttr = (window as any).twttr || {};
|
||||
const loadTweet = () => twttr.widgets.load(this.$refs.tweet);
|
||||
@ -104,16 +77,95 @@ export default Vue.extend({
|
||||
}
|
||||
fetch('/url?url=' + encodeURIComponent(this.url)).then(res => {
|
||||
res.json().then(info => {
|
||||
this.title = info.title;
|
||||
this.description = info.description;
|
||||
this.thumbnail = info.thumbnail;
|
||||
this.icon = info.icon;
|
||||
this.sitename = info.sitename;
|
||||
|
||||
this.fetching = false;
|
||||
});
|
||||
});
|
||||
}
|
||||
if (info.url != null) {
|
||||
this.title = info.title;
|
||||
this.description = info.description;
|
||||
this.thumbnail = info.thumbnail;
|
||||
this.icon = info.icon;
|
||||
this.sitename = info.sitename;
|
||||
this.fetching = false;
|
||||
if ([ // THIS IS THE WHITELIST FOR THE EMBED PLAYER
|
||||
'afreecatv.com',
|
||||
'aparat.com',
|
||||
'applemusic.com',
|
||||
'amazon.com',
|
||||
'awa.fm',
|
||||
'bandcamp.com',
|
||||
'bbc.co.uk',
|
||||
'beatport.com',
|
||||
'bilibili.com',
|
||||
'boomstream.com',
|
||||
'breakers.tv',
|
||||
'cam4.com',
|
||||
'cavelis.net',
|
||||
'chaturbate.com',
|
||||
'cnn.com',
|
||||
'cybergame.tv',
|
||||
'dailymotion.com',
|
||||
'deezer.com',
|
||||
'djlive.pl',
|
||||
'e-onkyo.com',
|
||||
'eventials.com',
|
||||
'facebook.com',
|
||||
'fc2.com',
|
||||
'gameplank.tv',
|
||||
'goodgame.ru',
|
||||
'google.com',
|
||||
'hardtunes.com',
|
||||
'instagram.com',
|
||||
'johnnylooch.com',
|
||||
'kexp.org',
|
||||
'lahzenegar.com',
|
||||
'liveedu.tv',
|
||||
'livetube.cc',
|
||||
'livestream.com',
|
||||
'meridix.com',
|
||||
'mixcloud.com',
|
||||
'mixer.com',
|
||||
'mobcrush.com',
|
||||
'mylive.in.th',
|
||||
'myspace.com',
|
||||
'netflix.com',
|
||||
'newretrowave.com',
|
||||
'nhk.or.jp',
|
||||
'nicovideo.jp',
|
||||
'nico.ms',
|
||||
'noisetrade.com',
|
||||
'nood.tv',
|
||||
'npr.org',
|
||||
'openrec.tv',
|
||||
'pandora.com',
|
||||
'pandora.tv',
|
||||
'picarto.tv',
|
||||
'pscp.tv',
|
||||
'restream.io',
|
||||
'reverbnation.com',
|
||||
'sermonaudio.com',
|
||||
'smashcast.tv',
|
||||
'songkick.com',
|
||||
'soundcloud.com',
|
||||
'spinninrecords.com',
|
||||
'spotify.com',
|
||||
'stitcher.com',
|
||||
'stream.me',
|
||||
'switchboard.live',
|
||||
'tunein.com',
|
||||
'twitcasting.tv',
|
||||
'twitch.tv',
|
||||
'twitter.com',
|
||||
'vaughnlive.tv',
|
||||
'veoh.com',
|
||||
'vimeo.com',
|
||||
'watchpeoplecode.com',
|
||||
'web.tv',
|
||||
'youtube.com',
|
||||
'youtu.be'
|
||||
].some(x => x == url.hostname || url.hostname.endsWith(`.${x}`)))
|
||||
this.player = info.player;
|
||||
} // info.url
|
||||
}) // json
|
||||
}); // fetch
|
||||
} // created
|
||||
});
|
||||
</script>
|
||||
|
||||
|
@ -44,7 +44,12 @@ import Vue from 'vue';
|
||||
import * as anime from 'animejs';
|
||||
|
||||
export default Vue.extend({
|
||||
props: ['source', 'compact', 'v'],
|
||||
props: ['source', 'compact'],
|
||||
data() {
|
||||
return {
|
||||
v: this.$store.state.device.visibility || 'public'
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.$nextTick(() => {
|
||||
const popover = this.$refs.popover as any;
|
||||
@ -92,6 +97,7 @@ export default Vue.extend({
|
||||
},
|
||||
methods: {
|
||||
choose(visibility) {
|
||||
this.$store.commit('device/setVisibility', visibility);
|
||||
this.$emit('chosen', visibility);
|
||||
this.$destroy();
|
||||
},
|
||||
|
@ -22,6 +22,7 @@ declare const _CODENAME_: 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_;
|
||||
export const hostname = _HOSTNAME_;
|
||||
@ -47,3 +48,4 @@ export const codename = _CODENAME_;
|
||||
export const license = _LICENSE_;
|
||||
export const googleMapsApiKey = _GOOGLE_MAPS_API_KEY_;
|
||||
export const welcomeBgUrl = _WELCOME_BG_URL_;
|
||||
export const twitterIntegration = _TWITTER_INTEGRATION_;
|
||||
|
@ -24,6 +24,7 @@ import updateBanner from './api/update-banner';
|
||||
|
||||
import MkIndex from './views/pages/index.vue';
|
||||
import MkDeck from './views/pages/deck/deck.vue';
|
||||
import MkAdmin from './views/pages/admin/admin.vue';
|
||||
import MkUser from './views/pages/user/user.vue';
|
||||
import MkFavorites from './views/pages/favorites.vue';
|
||||
import MkSelectDrive from './views/pages/selectdrive.vue';
|
||||
@ -55,6 +56,7 @@ init(async (launch) => {
|
||||
routes: [
|
||||
{ path: '/', name: 'index', component: MkIndex },
|
||||
{ path: '/deck', name: 'deck', component: MkDeck },
|
||||
{ path: '/admin', name: 'admin', component: MkAdmin },
|
||||
{ path: '/i/customize-home', component: MkHomeCustomize },
|
||||
{ path: '/i/favorites', component: MkFavorites },
|
||||
{ path: '/i/messaging/:user', component: MkMessagingRoom },
|
||||
|
@ -16,7 +16,7 @@
|
||||
<p>%i18n:@banner%</p>
|
||||
</div>
|
||||
<div class="thumbnail" ref="thumbnail" :style="`background-color: ${ background }`">
|
||||
<img :src="file.url" alt="" @load="onThumbnailLoaded"/>
|
||||
<img :src="file.thumbnailUrl" alt="" @load="onThumbnailLoaded"/>
|
||||
</div>
|
||||
<p class="name">
|
||||
<span>{{ file.name.lastIndexOf('.') != -1 ? file.name.substr(0, file.name.lastIndexOf('.')) : file.name }}</span>
|
||||
@ -99,7 +99,7 @@ export default Vue.extend({
|
||||
text: '%i18n:@contextmenu.set-as-banner%',
|
||||
action: this.setAsBanner
|
||||
}]
|
||||
}, {
|
||||
}, /*{
|
||||
type: 'nest',
|
||||
text: '%i18n:@contextmenu.open-in-app%',
|
||||
menu: [{
|
||||
@ -107,11 +107,11 @@ export default Vue.extend({
|
||||
text: '%i18n:@contextmenu.add-app%...',
|
||||
action: this.addApp
|
||||
}]
|
||||
}], {
|
||||
closed: () => {
|
||||
this.isContextmenuShowing = false;
|
||||
}
|
||||
});
|
||||
}*/], {
|
||||
closed: () => {
|
||||
this.isContextmenuShowing = false;
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
onDragstart(e) {
|
||||
|
@ -67,16 +67,16 @@ export default Vue.extend({
|
||||
text: '%i18n:@contextmenu.rename%',
|
||||
icon: '%fa:i-cursor%',
|
||||
action: this.rename
|
||||
}, null, {
|
||||
}/*, null, {
|
||||
type: 'item',
|
||||
text: '%i18n:common.delete%',
|
||||
icon: '%fa:R trash-alt%',
|
||||
action: this.deleteFolder
|
||||
}], {
|
||||
closed: () => {
|
||||
this.isContextmenuShowing = false;
|
||||
}
|
||||
});
|
||||
}*/], {
|
||||
closed: () => {
|
||||
this.isContextmenuShowing = false;
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
onMouseover() {
|
||||
|
@ -567,6 +567,7 @@ export default Vue.extend({
|
||||
// ファイル一覧取得
|
||||
(this as any).api('drive/files', {
|
||||
folderId: this.folder ? this.folder.id : null,
|
||||
untilId: this.files[this.files.length - 1].id,
|
||||
limit: max + 1
|
||||
}).then(files => {
|
||||
if (files.length == max + 1) {
|
||||
|
@ -37,7 +37,7 @@ export default Vue.extend({
|
||||
style(): any {
|
||||
return {
|
||||
'background-color': this.image.properties.avgColor && this.image.properties.avgColor.length == 3 ? `rgb(${this.image.properties.avgColor.join(',')})` : 'transparent',
|
||||
'background-image': this.raw ? `url(${this.image.url})` : `url(${this.image.url})`
|
||||
'background-image': this.raw ? `url(${this.image.url})` : `url(${this.image.thumbnailUrl})`
|
||||
};
|
||||
}
|
||||
},
|
||||
|
@ -55,15 +55,15 @@
|
||||
</div>
|
||||
<footer>
|
||||
<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-else>%fa:reply%</template>
|
||||
<p class="count" v-if="p.repliesCount > 0">{{ p.repliesCount }}</p>
|
||||
</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>
|
||||
</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>
|
||||
</button>
|
||||
<button @click="menu" ref="menuButton">
|
||||
@ -372,15 +372,24 @@ root(isDark)
|
||||
cursor pointer
|
||||
|
||||
&:hover
|
||||
color isDark ? #9198af : #666
|
||||
color isDark ? #a1a8bf : #444
|
||||
|
||||
&.replyButton:hover
|
||||
color #0af
|
||||
|
||||
&.renoteButton:hover
|
||||
color #8d0
|
||||
|
||||
&.reactionButton:hover
|
||||
color #fa0
|
||||
|
||||
> .count
|
||||
display inline
|
||||
margin 0 0 0 8px
|
||||
color #999
|
||||
|
||||
&.reacted
|
||||
color $theme-color
|
||||
&.reacted, &.reacted:hover
|
||||
color #fa0
|
||||
|
||||
> .replies
|
||||
> *
|
||||
|
@ -42,15 +42,15 @@
|
||||
</div>
|
||||
<footer>
|
||||
<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-else>%fa:reply%</template>
|
||||
<p class="count" v-if="p.repliesCount > 0">{{ p.repliesCount }}</p>
|
||||
</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>
|
||||
</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>
|
||||
</button>
|
||||
<button @click="menu" ref="menuButton">
|
||||
@ -487,20 +487,24 @@ root(isDark)
|
||||
cursor pointer
|
||||
|
||||
&:hover
|
||||
color isDark ? #9198af : #666
|
||||
color isDark ? #a1a8bf : #444
|
||||
|
||||
&.replyButton:hover
|
||||
color #0af
|
||||
|
||||
&.renoteButton:hover
|
||||
color #8d0
|
||||
|
||||
&.reactionButton:hover
|
||||
color #fa0
|
||||
|
||||
> .count
|
||||
display inline
|
||||
margin 0 0 0 8px
|
||||
color #999
|
||||
|
||||
&.reacted
|
||||
color $theme-color
|
||||
|
||||
&:last-child
|
||||
position absolute
|
||||
right 0
|
||||
margin 0
|
||||
&.reacted, &.reacted:hover
|
||||
color #fa0
|
||||
|
||||
> .detail
|
||||
padding-top 4px
|
||||
|
@ -135,6 +135,12 @@ export default Vue.extend({
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (this.$store.state.settings.showLocalRenotes === false) {
|
||||
if (isPureRenote && (note.renote.user.host == null)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
//#endregion
|
||||
|
||||
// 投稿が自分のものではないかつ、タブが非表示またはスクロール位置が最上部ではないならタイトルで通知
|
||||
|
@ -10,7 +10,7 @@
|
||||
<span v-for="u in visibleUsers">{{ u | userName }}<a @click="removeVisibleUser(u)">[x]</a></span>
|
||||
<a @click="addVisibleUser">%i18n:@add-visible-user%</a>
|
||||
</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>
|
||||
<a v-for="tag in recentHashtags.slice(0, 5)" @click="addTag(tag)" title="%@click-to-tagging%">#{{ tag }}</a>
|
||||
</div>
|
||||
@ -23,7 +23,7 @@
|
||||
<div class="medias" :class="{ with: poll }" v-show="files.length != 0">
|
||||
<x-draggable :list="files" :options="{ animation: 150 }">
|
||||
<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=""/>
|
||||
</div>
|
||||
</x-draggable>
|
||||
@ -99,7 +99,7 @@ export default Vue.extend({
|
||||
useCw: false,
|
||||
cw: null,
|
||||
geo: null,
|
||||
visibility: 'public',
|
||||
visibility: this.$store.state.device.visibility || 'public',
|
||||
visibleUsers: [],
|
||||
autocomplete: null,
|
||||
draghover: false,
|
||||
@ -326,8 +326,7 @@ export default Vue.extend({
|
||||
|
||||
setVisibility() {
|
||||
const w = (this as any).os.new(MkVisibilityChooser, {
|
||||
source: this.$refs.visibilityButton,
|
||||
v: this.visibility
|
||||
source: this.$refs.visibilityButton
|
||||
});
|
||||
w.$once('chosen', v => {
|
||||
this.visibility = v;
|
||||
|
@ -48,9 +48,11 @@
|
||||
<mk-switch v-model="$store.state.settings.iLikeSushi" @change="onChangeILikeSushi" text="%i18n:common.i-like-sushi%"/>
|
||||
</div>
|
||||
<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.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.showLocalRenotes" @change="onChangeShowLocalRenotes" text="%i18n:@show-local-renotes%"/>
|
||||
<mk-switch v-model="$store.state.settings.showMaps" @change="onChangeShowMaps" text="%i18n:@show-maps%">
|
||||
<span>%i18n:@show-maps-desc%</span>
|
||||
</mk-switch>
|
||||
@ -335,6 +337,12 @@ export default Vue.extend({
|
||||
value: v
|
||||
});
|
||||
},
|
||||
onChangeSuggestRecentHashtags(v) {
|
||||
this.$store.dispatch('settings/set', {
|
||||
key: 'suggestRecentHashtags',
|
||||
value: v
|
||||
});
|
||||
},
|
||||
onChangeShowReplyTarget(v) {
|
||||
this.$store.dispatch('settings/set', {
|
||||
key: 'showReplyTarget',
|
||||
@ -353,6 +361,12 @@ export default Vue.extend({
|
||||
value: v
|
||||
});
|
||||
},
|
||||
onChangeShowLocalRenotes(v) {
|
||||
this.$store.dispatch('settings/set', {
|
||||
key: 'showLocalRenotes',
|
||||
value: v
|
||||
});
|
||||
},
|
||||
onChangeShowMaps(v) {
|
||||
this.$store.dispatch('settings/set', {
|
||||
key: 'showMaps',
|
||||
|
@ -100,7 +100,8 @@ export default Vue.extend({
|
||||
limit: fetchLimit + 1,
|
||||
untilDate: this.date ? this.date.getTime() : undefined,
|
||||
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 => {
|
||||
if (notes.length == fetchLimit + 1) {
|
||||
notes.pop();
|
||||
@ -122,7 +123,8 @@ export default Vue.extend({
|
||||
limit: fetchLimit + 1,
|
||||
untilId: (this.$refs.timeline as any).tail().id,
|
||||
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 => {
|
||||
|
@ -155,10 +155,15 @@ root(isDark)
|
||||
max-width 1300px
|
||||
margin 0 auto
|
||||
|
||||
> *
|
||||
position absolute
|
||||
height 48px
|
||||
|
||||
> .center
|
||||
margin auto
|
||||
right 0
|
||||
|
||||
> .icon
|
||||
margin auto
|
||||
display block
|
||||
width 48px
|
||||
height 48px
|
||||
@ -169,11 +174,12 @@ root(isDark)
|
||||
opacity 0.3
|
||||
cursor pointer
|
||||
|
||||
> .left
|
||||
height 48px
|
||||
> .left,
|
||||
> .center
|
||||
left 0
|
||||
|
||||
> .right
|
||||
height 48px
|
||||
right 0
|
||||
|
||||
> *
|
||||
display inline-block
|
||||
|
@ -47,7 +47,8 @@ export default Vue.extend({
|
||||
listId: this.list.id,
|
||||
limit: fetchLimit + 1,
|
||||
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 => {
|
||||
if (notes.length == fetchLimit + 1) {
|
||||
notes.pop();
|
||||
@ -67,7 +68,8 @@ export default Vue.extend({
|
||||
limit: fetchLimit + 1,
|
||||
untilId: (this.$refs.timeline as any).tail().id,
|
||||
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 => {
|
||||
|
@ -10,13 +10,13 @@
|
||||
<div class="description">{{ u.description }}</div>
|
||||
<div class="status">
|
||||
<div>
|
||||
<p>%i18n:@notes%</p><a>{{ u.notesCount }}</a>
|
||||
<p>%i18n:@notes%</p><span>{{ u.notesCount }}</span>
|
||||
</div>
|
||||
<div>
|
||||
<p>%i18n:@following%</p><a>{{ u.followingCount }}</a>
|
||||
<p>%i18n:@following%</p><span>{{ u.followingCount }}</span>
|
||||
</div>
|
||||
<div>
|
||||
<p>%i18n:@followers%</p><a>{{ u.followersCount }}</a>
|
||||
<p>%i18n:@followers%</p><span>{{ u.followersCount }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<mk-follow-button v-if="$store.getters.isSignedIn && u.id != $store.state.i.id" :user="u"/>
|
||||
@ -149,7 +149,7 @@ root(isDark)
|
||||
font-size 0.7em
|
||||
color #aaa
|
||||
|
||||
> a
|
||||
> span
|
||||
font-size 1em
|
||||
color $theme-color
|
||||
|
||||
|
49
src/client/app/desktop/views/pages/admin/admin.dashboard.vue
Normal file
49
src/client/app/desktop/views/pages/admin/admin.dashboard.vue
Normal file
@ -0,0 +1,49 @@
|
||||
<template>
|
||||
<div>
|
||||
<h1>%i18n:@dashboard%</h1>
|
||||
<div v-if="stats">
|
||||
<p><b>%i18n:@all-users%</b>: <span>{{ stats.usersCount | number }}</span></p>
|
||||
<p><b>%i18n:@original-users%</b>: <span>{{ stats.originalUsersCount | number }}</span></p>
|
||||
<p><b>%i18n:@all-notes%</b>: <span>{{ stats.notesCount | number }}</span></p>
|
||||
<p><b>%i18n:@original-notes%</b>: <span>{{ stats.originalNotesCount | number }}</span></p>
|
||||
</div>
|
||||
<div>
|
||||
<button class="ui" @click="invite">%i18n:@invite%</button>
|
||||
<p v-if="inviteCode">Code: <code>{{ inviteCode }}</code></p>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from "vue";
|
||||
|
||||
export default Vue.extend({
|
||||
data() {
|
||||
return {
|
||||
stats: null,
|
||||
inviteCode: null
|
||||
};
|
||||
},
|
||||
created() {
|
||||
(this as any).api('stats').then(stats => {
|
||||
this.stats = stats;
|
||||
});
|
||||
},
|
||||
methods: {
|
||||
invite() {
|
||||
(this as any).api('admin/invite').then(x => {
|
||||
this.inviteCode = x.code;
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
h1
|
||||
margin 0 0 1em 0
|
||||
padding 0 0 8px 0
|
||||
font-size 1em
|
||||
color #555
|
||||
border-bottom solid 1px #eee
|
||||
</style>
|
@ -0,0 +1,51 @@
|
||||
<template>
|
||||
<div>
|
||||
<header>%i18n:@suspend-user%</header>
|
||||
<input v-model="username" type="text" class="ui"/>
|
||||
<button class="ui" @click="suspendUser" :disabled="suspending">%i18n:@suspend%</button>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from "vue";
|
||||
import parseAcct from "../../../../../../misc/acct/parse";
|
||||
|
||||
export default Vue.extend({
|
||||
data() {
|
||||
return {
|
||||
username: null,
|
||||
suspending: false
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
async suspendUser() {
|
||||
this.suspending = true;
|
||||
|
||||
const user = await (this as any).os.api(
|
||||
"users/show",
|
||||
parseAcct(this.username)
|
||||
);
|
||||
|
||||
await (this as any).os.api("admin/suspend-user", {
|
||||
userId: user.id
|
||||
});
|
||||
|
||||
this.suspending = false;
|
||||
|
||||
(this as any).os.apis.dialog({ text: "%i18n:@suspended%" });
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
@import '~const.styl'
|
||||
|
||||
header
|
||||
margin 10px 0
|
||||
|
||||
|
||||
button
|
||||
margin 16px 0
|
||||
|
||||
</style>
|
@ -0,0 +1,51 @@
|
||||
<template>
|
||||
<div>
|
||||
<header>%i18n:@unsuspend-user%</header>
|
||||
<input v-model="username" type="text" class="ui"/>
|
||||
<button class="ui" @click="unsuspendUser" :disabled="unsuspending">%i18n:@unsuspend%</button>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from "vue";
|
||||
import parseAcct from "../../../../../../misc/acct/parse";
|
||||
|
||||
export default Vue.extend({
|
||||
data() {
|
||||
return {
|
||||
username: null,
|
||||
unsuspending: false
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
async unsuspendUser() {
|
||||
this.unsuspending = true;
|
||||
|
||||
const user = await (this as any).os.api(
|
||||
"users/show",
|
||||
parseAcct(this.username)
|
||||
);
|
||||
|
||||
await (this as any).os.api("admin/unsuspend-user", {
|
||||
userId: user.id
|
||||
});
|
||||
|
||||
this.unsuspending = false;
|
||||
|
||||
(this as any).os.apis.dialog({ text: "%i18n:@unsuspended%" });
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
@import '~const.styl'
|
||||
|
||||
header
|
||||
margin 10px 0
|
||||
|
||||
|
||||
button
|
||||
margin 16px 0
|
||||
|
||||
</style>
|
102
src/client/app/desktop/views/pages/admin/admin.vue
Normal file
102
src/client/app/desktop/views/pages/admin/admin.vue
Normal file
@ -0,0 +1,102 @@
|
||||
<template>
|
||||
<div class="mk-admin">
|
||||
<nav>
|
||||
<ul>
|
||||
<li @click="nav('dashboard')" :class="{ active: page == 'dashboard' }">%fa:chalkboard .fw%%i18n:@dashboard%</li>
|
||||
<li @click="nav('users')" :class="{ active: page == 'users' }">%fa:users .fw%%i18n:@users%</li>
|
||||
<!-- <li @click="nav('drive')" :class="{ active: page == 'drive' }">%fa:cloud .fw%%i18n:@drive%</li> -->
|
||||
<!-- <li @click="nav('update')" :class="{ active: page == 'update' }">%i18n:@update%</li> -->
|
||||
</ul>
|
||||
</nav>
|
||||
<main>
|
||||
<div v-if="page == 'dashboard'">
|
||||
<x-dashboard/>
|
||||
</div>
|
||||
<div v-if="page == 'users'">
|
||||
<x-suspend-user/>
|
||||
<x-unsuspend-user/>
|
||||
</div>
|
||||
<div v-if="page == 'drive'"></div>
|
||||
<div v-if="page == 'update'"></div>
|
||||
</main>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from "vue";
|
||||
import XDashboard from "./admin.dashboard.vue";
|
||||
import XSuspendUser from "./admin.suspend-user.vue";
|
||||
import XUnsuspendUser from "./admin.unsuspend-user.vue";
|
||||
|
||||
export default Vue.extend({
|
||||
components: {
|
||||
XDashboard,
|
||||
XSuspendUser,
|
||||
XUnsuspendUser
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
page: 'dashboard'
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
nav(page: string) {
|
||||
this.page = page;
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
@import '~const.styl'
|
||||
|
||||
.mk-admin
|
||||
display flex
|
||||
height 100%
|
||||
margin 32px
|
||||
|
||||
> nav
|
||||
flex 0 0 250px
|
||||
width 100%
|
||||
height 100%
|
||||
padding 16px 0 0 0
|
||||
overflow auto
|
||||
border-right solid 1px #ddd
|
||||
|
||||
> ul
|
||||
list-style none
|
||||
|
||||
> li
|
||||
display block
|
||||
padding 10px 16px
|
||||
margin 0
|
||||
color #666
|
||||
cursor pointer
|
||||
user-select none
|
||||
transition margin-left 0.2s ease
|
||||
|
||||
> [data-fa]
|
||||
margin-right 4px
|
||||
|
||||
|
||||
&:hover
|
||||
color #555
|
||||
|
||||
&.active
|
||||
margin-left 8px
|
||||
color $theme-color !important
|
||||
|
||||
> main
|
||||
width 100%
|
||||
padding 16px 32px
|
||||
|
||||
header
|
||||
margin 10px 0
|
||||
|
||||
|
||||
button
|
||||
margin 16px 0
|
||||
position absolute
|
||||
right 0
|
||||
|
||||
</style>
|
@ -70,7 +70,8 @@ export default Vue.extend({
|
||||
limit: fetchLimit + 1,
|
||||
mediaOnly: this.mediaOnly,
|
||||
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 => {
|
||||
if (notes.length == fetchLimit + 1) {
|
||||
notes.pop();
|
||||
@ -91,7 +92,8 @@ export default Vue.extend({
|
||||
untilId: (this.$refs.timeline as any).tail().id,
|
||||
mediaOnly: this.mediaOnly,
|
||||
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 => {
|
||||
|
@ -140,6 +140,12 @@ export default Vue.extend({
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (this.$store.state.settings.showLocalRenotes === false) {
|
||||
if (isPureRenote && (note.renote.user.host == null)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
//#endregion
|
||||
|
||||
if (this.isScrollTop()) {
|
||||
|
@ -98,7 +98,8 @@ export default Vue.extend({
|
||||
limit: fetchLimit + 1,
|
||||
mediaOnly: this.mediaOnly,
|
||||
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 => {
|
||||
if (notes.length == fetchLimit + 1) {
|
||||
notes.pop();
|
||||
@ -119,7 +120,8 @@ export default Vue.extend({
|
||||
mediaOnly: this.mediaOnly,
|
||||
untilId: (this.$refs.timeline as any).tail().id,
|
||||
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 => {
|
||||
|
@ -176,6 +176,10 @@ root(isDark)
|
||||
height 120px
|
||||
box-shadow 1px 1px 3px rgba(#000, 0.2)
|
||||
|
||||
> &.cat::before,
|
||||
> &.cat::after
|
||||
border-width 8px
|
||||
|
||||
> .body
|
||||
padding 16px 16px 16px 154px
|
||||
color isDark ? #c5ced6 : #555
|
||||
|
@ -18,7 +18,7 @@
|
||||
<div class="about">
|
||||
<h1 v-if="name != 'Misskey'">{{ name }}</h1>
|
||||
<h1 v-else><img :src="$store.state.device.darkmode ? 'assets/title.dark.svg' : 'assets/title.light.svg'" :alt="name"></h1>
|
||||
<p class="powerd-by" v-if="name != 'Misskey'">%i18n:@powered-by-misskey%</p>
|
||||
<p class="powerd-by" v-if="name != 'Misskey'" v-html="'%i18n:@powered-by-misskey%'"></p>
|
||||
<p class="desc" v-html="description || '%i18n:common.about%'"></p>
|
||||
<a ref="signup" @click="signup">📦 %i18n:@signup%</a>
|
||||
</div>
|
||||
|
@ -6,10 +6,11 @@
|
||||
<div class="banner"
|
||||
:style="$store.state.i.bannerUrl ? `background-image: url(${$store.state.i.bannerUrl})` : ''"
|
||||
title="%i18n:@update-banner%"
|
||||
@click="os.apis.updateBanner"
|
||||
@click="() => os.apis.updateBanner()"
|
||||
></div>
|
||||
<mk-avatar class="avatar" :user="$store.state.i"
|
||||
@click="os.apis.updateAvatar"
|
||||
:disable-link="true"
|
||||
@click="() => os.apis.updateAvatar()"
|
||||
title="%i18n:@update-avatar%"
|
||||
/>
|
||||
<router-link class="name" :to="$store.state.i | userPage">{{ $store.state.i | userName }}</router-link>
|
||||
|
@ -43,7 +43,7 @@ export default Vue.extend({
|
||||
thumbnail(): any {
|
||||
return {
|
||||
'background-color': this.file.properties.avgColor && this.file.properties.avgColor.length == 3 ? `rgb(${this.file.properties.avgColor.join(',')})` : 'transparent',
|
||||
'background-image': `url(${this.file.url})`
|
||||
'background-image': `url(${this.file.thumbnailUrl})`
|
||||
};
|
||||
}
|
||||
},
|
||||
|
@ -27,7 +27,7 @@ export default Vue.extend({
|
||||
},
|
||||
computed: {
|
||||
style(): any {
|
||||
let url = `url(${this.image.url})`;
|
||||
let url = `url(${this.image.thumbnailUrl})`;
|
||||
|
||||
if (this.$store.state.device.loadRemoteMedia || this.$store.state.device.lightmode) {
|
||||
url = null;
|
||||
|
@ -139,6 +139,12 @@ export default Vue.extend({
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (this.$store.state.settings.showLocalRenotes === false) {
|
||||
if (isPureRenote && (note.renote.user.host == null)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
//#endregion
|
||||
|
||||
// 投稿が自分のものではないかつ、タブが非表示またはスクロール位置が最上部ではないならタイトルで通知
|
||||
|
@ -21,7 +21,7 @@
|
||||
<div class="attaches" v-show="files.length != 0">
|
||||
<x-draggable class="files" :list="files" :options="{ animation: 150 }">
|
||||
<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>
|
||||
</x-draggable>
|
||||
</div>
|
||||
@ -45,7 +45,7 @@
|
||||
<input ref="file" class="file" type="file" accept="image/*" multiple="multiple" @change="onChangeFile"/>
|
||||
</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>
|
||||
</div>
|
||||
</div>
|
||||
@ -94,7 +94,7 @@ export default Vue.extend({
|
||||
files: [],
|
||||
poll: false,
|
||||
geo: null,
|
||||
visibility: 'public',
|
||||
visibility: this.$store.state.device.visibility || 'public',
|
||||
visibleUsers: [],
|
||||
useCw: false,
|
||||
cw: null,
|
||||
@ -240,8 +240,7 @@ export default Vue.extend({
|
||||
setVisibility() {
|
||||
const w = (this as any).os.new(MkVisibilityChooser, {
|
||||
source: this.$refs.visibilityButton,
|
||||
compact: true,
|
||||
v: this.visibility
|
||||
compact: true
|
||||
});
|
||||
w.$once('chosen', v => {
|
||||
this.visibility = v;
|
||||
|
@ -59,7 +59,8 @@ export default Vue.extend({
|
||||
listId: this.list.id,
|
||||
limit: fetchLimit + 1,
|
||||
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 => {
|
||||
if (notes.length == fetchLimit + 1) {
|
||||
notes.pop();
|
||||
@ -82,7 +83,8 @@ export default Vue.extend({
|
||||
limit: fetchLimit + 1,
|
||||
untilId: (this.$refs.timeline as any).tail().id,
|
||||
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 => {
|
||||
|
@ -95,7 +95,8 @@ export default Vue.extend({
|
||||
limit: fetchLimit + 1,
|
||||
untilDate: this.date ? this.date.getTime() : undefined,
|
||||
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 => {
|
||||
if (notes.length == fetchLimit + 1) {
|
||||
notes.pop();
|
||||
@ -117,7 +118,8 @@ export default Vue.extend({
|
||||
limit: fetchLimit + 1,
|
||||
untilId: (this.$refs.timeline as any).tail().id,
|
||||
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 => {
|
||||
|
@ -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.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.showLocalRenotes" @change="onChangeShowLocalRenotes">%i18n:@show-local-renotes%</ui-switch>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
@ -221,6 +222,13 @@ export default Vue.extend({
|
||||
});
|
||||
},
|
||||
|
||||
onChangeShowLocalRenotes(v) {
|
||||
this.$store.dispatch('settings/set', {
|
||||
key: 'showLocalRenotes',
|
||||
value: v
|
||||
});
|
||||
},
|
||||
|
||||
checkForUpdate() {
|
||||
this.checkingForUpdate = true;
|
||||
checkForUpdate((this as any).os, true, true).then(newer => {
|
||||
|
@ -61,7 +61,6 @@ export default Vue.extend({
|
||||
birthday: null,
|
||||
avatarId: null,
|
||||
bannerId: null,
|
||||
isBot: false,
|
||||
isCat: false,
|
||||
saving: false,
|
||||
avatarUploading: false,
|
||||
@ -77,7 +76,6 @@ export default Vue.extend({
|
||||
this.birthday = this.$store.state.i.profile.birthday;
|
||||
this.avatarId = this.$store.state.i.avatarId;
|
||||
this.bannerId = this.$store.state.i.bannerId;
|
||||
this.isBot = this.$store.state.i.isBot;
|
||||
this.isCat = this.$store.state.i.isCat;
|
||||
},
|
||||
|
||||
@ -136,7 +134,6 @@ export default Vue.extend({
|
||||
birthday: this.birthday || null,
|
||||
avatarId: this.avatarId,
|
||||
bannerId: this.bannerId,
|
||||
isBot: this.isBot,
|
||||
isCat: this.isCat
|
||||
}).then(i => {
|
||||
this.saving = false;
|
||||
|
@ -11,11 +11,13 @@ const defaultSettings = {
|
||||
fetchOnScroll: true,
|
||||
showMaps: true,
|
||||
showPostFormOnTopOfTl: false,
|
||||
suggestRecentHashtags: true,
|
||||
circleIcons: true,
|
||||
gradientWindowHeader: false,
|
||||
showReplyTarget: true,
|
||||
showMyRenotes: true,
|
||||
showRenotedMyNotes: true,
|
||||
showLocalRenotes: true,
|
||||
loadRemoteMedia: true,
|
||||
disableViaMobile: false,
|
||||
memo: null,
|
||||
@ -108,6 +110,10 @@ export default (os: MiOS) => new Vuex.Store({
|
||||
src: x.src,
|
||||
arg: x.arg
|
||||
};
|
||||
},
|
||||
|
||||
setVisibility(state, visibility) {
|
||||
state.visibility = visibility;
|
||||
}
|
||||
}
|
||||
},
|
||||
|
BIN
src/client/assets/reactions/rip.png
Normal file
BIN
src/client/assets/reactions/rip.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 6.6 KiB |
@ -1,5 +1,5 @@
|
||||
{
|
||||
"copyright": "Copyright (c) 2014-2018 syuilo",
|
||||
"themeColor": "#f66e4f",
|
||||
"themeColor": "#f6584f",
|
||||
"themeColorForeground": "#fff"
|
||||
}
|
||||
|
@ -1,10 +1,11 @@
|
||||
import * as childProcess from 'child_process';
|
||||
import * as Deque from 'double-ended-queue';
|
||||
import Xev from 'xev';
|
||||
|
||||
const ev = new Xev();
|
||||
|
||||
export default function() {
|
||||
const log: any[] = [];
|
||||
const log = new Deque<any>();
|
||||
|
||||
const p = childProcess.fork(__dirname + '/notes-stats-child.js');
|
||||
|
||||
@ -15,7 +16,7 @@ export default function() {
|
||||
});
|
||||
|
||||
ev.on('requestNotesStatsLog', id => {
|
||||
ev.emit('notesStatsLog:' + id, log);
|
||||
ev.emit('notesStatsLog:' + id, log.toArray());
|
||||
});
|
||||
|
||||
process.on('exit', code => {
|
||||
|
@ -1,6 +1,7 @@
|
||||
import * as os from 'os';
|
||||
import * as sysUtils from 'systeminformation';
|
||||
import * as diskusage from 'diskusage';
|
||||
import * as Deque from 'double-ended-queue';
|
||||
import Xev from 'xev';
|
||||
const osUtils = require('os-utils');
|
||||
|
||||
@ -12,10 +13,10 @@ const interval = 1000;
|
||||
* Report server stats regularly
|
||||
*/
|
||||
export default function() {
|
||||
const log: any[] = [];
|
||||
const log = new Deque<any>();
|
||||
|
||||
ev.on('requestServerStatsLog', id => {
|
||||
ev.emit('serverStatsLog:' + id, log);
|
||||
ev.emit('serverStatsLog:' + id, log.toArray());
|
||||
});
|
||||
|
||||
async function tick() {
|
||||
|
@ -3,9 +3,7 @@ import config from '../config';
|
||||
const u = config.mongodb.user ? encodeURIComponent(config.mongodb.user) : null;
|
||||
const p = config.mongodb.pass ? encodeURIComponent(config.mongodb.pass) : null;
|
||||
|
||||
const uri = u && p
|
||||
? `mongodb://${u}:${p}@${config.mongodb.host}:${config.mongodb.port}/${config.mongodb.db}`
|
||||
: `mongodb://${config.mongodb.host}:${config.mongodb.port}/${config.mongodb.db}`;
|
||||
const uri = `mongodb://${u && p ? `${u}:${p}@` : ''}${config.mongodb.host}:${config.mongodb.port}/${config.mongodb.db}`;
|
||||
|
||||
/**
|
||||
* monk
|
||||
|
41
src/docs/api/entities/drive-folder.yaml
Normal file
41
src/docs/api/entities/drive-folder.yaml
Normal file
@ -0,0 +1,41 @@
|
||||
name: "DriveFolder"
|
||||
|
||||
desc:
|
||||
ja: "ドライブのフォルダを表します。"
|
||||
en: "A folder of Drive."
|
||||
|
||||
props:
|
||||
id:
|
||||
type: "id"
|
||||
optional: false
|
||||
desc:
|
||||
ja: "フォルダID"
|
||||
en: "The ID of this folder"
|
||||
|
||||
createdAt:
|
||||
type: "date"
|
||||
optional: false
|
||||
desc:
|
||||
ja: "作成日時"
|
||||
en: "The created date of this folder"
|
||||
|
||||
userId:
|
||||
type: "id(User)"
|
||||
optional: false
|
||||
desc:
|
||||
ja: "所有者ID"
|
||||
en: "The ID of the owner of this folder"
|
||||
|
||||
parentId:
|
||||
type: "entity(DriveFolder)"
|
||||
optional: false
|
||||
desc:
|
||||
ja: "親フォルダのID (ルートなら null)"
|
||||
en: "The ID of parent folder"
|
||||
|
||||
name:
|
||||
type: "string"
|
||||
optional: false
|
||||
desc:
|
||||
ja: "フォルダ名"
|
||||
en: "The name of this folder"
|
15
src/index.ts
15
src/index.ts
@ -28,7 +28,7 @@ import { Config } from './config/types';
|
||||
const clusterLog = debug('misskey:cluster');
|
||||
const ev = new Xev();
|
||||
|
||||
if (process.env.NODE_ENV != 'production') {
|
||||
if (process.env.NODE_ENV != 'production' && process.env.DEBUG == null) {
|
||||
debug.enable('misskey');
|
||||
}
|
||||
|
||||
@ -48,7 +48,7 @@ main();
|
||||
* Init process
|
||||
*/
|
||||
function main() {
|
||||
process.title = `Misskey (${ cluster.isMaster ? 'master' : 'worker' })`;
|
||||
process.title = `Misskey (${cluster.isMaster ? 'master' : 'worker'})`;
|
||||
|
||||
if (cluster.isMaster || program.disableClustering) {
|
||||
masterMain();
|
||||
@ -112,7 +112,7 @@ async function workerMain() {
|
||||
async function init(): Promise<Config> {
|
||||
Logger.info('Welcome to Misskey!');
|
||||
|
||||
(new Logger('Deps')).info(`Node.js ${process.version}`);
|
||||
new Logger('Deps').info(`Node.js ${process.version}`);
|
||||
MachineInfo.show();
|
||||
EnvironmentInfo.show();
|
||||
new DependencyInfo().showAll();
|
||||
@ -154,11 +154,10 @@ async function init(): Promise<Config> {
|
||||
|
||||
function checkMongoDb(config: Config) {
|
||||
const mongoDBLogger = new Logger('MongoDB');
|
||||
mongoDBLogger.info(`Host: ${config.mongodb.host}`);
|
||||
mongoDBLogger.info(`Port: ${config.mongodb.port}`);
|
||||
mongoDBLogger.info(`DB: ${config.mongodb.db}`);
|
||||
if (config.mongodb.user) mongoDBLogger.info(`User: ${config.mongodb.user}`);
|
||||
if (config.mongodb.pass) mongoDBLogger.info(`Pass: ****`);
|
||||
const u = config.mongodb.user ? encodeURIComponent(config.mongodb.user) : null;
|
||||
const p = config.mongodb.pass ? encodeURIComponent(config.mongodb.pass) : null;
|
||||
const uri = `mongodb://${u && p ? `${u}:****@` : ''}${config.mongodb.host}:${config.mongodb.port}/${config.mongodb.db}`;
|
||||
mongoDBLogger.info(`Connecting to ${uri}`);
|
||||
require('./db/mongodb');
|
||||
mongoDBLogger.succ('Connectivity confirmed');
|
||||
}
|
||||
|
@ -15,6 +15,6 @@ export default function(text: string) {
|
||||
return {
|
||||
type: 'bold',
|
||||
content: bold,
|
||||
bold: bold.substr(2, bold.length - 4)
|
||||
bold: match[1]
|
||||
} as TextElementBold;
|
||||
}
|
||||
|
@ -18,7 +18,7 @@ export default function(text: string) {
|
||||
return {
|
||||
type: 'code',
|
||||
content: code,
|
||||
code: code.substr(3, code.length - 6).trim(),
|
||||
html: genHtml(code.substr(3, code.length - 6).trim())
|
||||
code: match[1],
|
||||
html: genHtml(match[1].trim())
|
||||
} as TextElementCode;
|
||||
}
|
||||
|
@ -9,12 +9,12 @@ export type TextElementEmoji = {
|
||||
};
|
||||
|
||||
export default function(text: string) {
|
||||
const match = text.match(/^:[a-zA-Z0-9+-_]+:/);
|
||||
const match = text.match(/^:([a-zA-Z0-9+-_]+):/);
|
||||
if (!match) return null;
|
||||
const emoji = match[0];
|
||||
return {
|
||||
type: 'emoji',
|
||||
content: emoji,
|
||||
emoji: emoji.substr(1, emoji.length - 2)
|
||||
emoji: match[1]
|
||||
} as TextElementEmoji;
|
||||
}
|
||||
|
@ -14,11 +14,12 @@ export type TextElementInlineCode = {
|
||||
export default function(text: string) {
|
||||
const match = text.match(/^`(.+?)`/);
|
||||
if (!match) return null;
|
||||
if (match[1].includes('´')) return null;
|
||||
const code = match[0];
|
||||
return {
|
||||
type: 'inline-code',
|
||||
content: code,
|
||||
code: code.substr(1, code.length - 2).trim(),
|
||||
html: genHtml(code.substr(1, code.length - 2).trim())
|
||||
code: match[1],
|
||||
html: genHtml(match[1])
|
||||
} as TextElementInlineCode;
|
||||
}
|
||||
|
@ -15,6 +15,6 @@ export default function(text: string) {
|
||||
return {
|
||||
type: 'quote',
|
||||
content: quote,
|
||||
quote: quote.substr(1, quote.length - 2).trim(),
|
||||
quote: match[1].trim(),
|
||||
} as TextElementQuote;
|
||||
}
|
||||
|
@ -9,7 +9,7 @@ export type TextElementSearch = {
|
||||
};
|
||||
|
||||
export default function(text: string) {
|
||||
const match = text.match(/^(.+?) (検索|Search)(\n|$)/i);
|
||||
const match = text.match(/^(.+?)( | )(検索|\[検索\]|Search|\[Search\])(\n|$)/i);
|
||||
if (!match) return null;
|
||||
return {
|
||||
type: 'search',
|
||||
|
@ -8,6 +8,7 @@ export default function(reaction: string): string {
|
||||
case 'congrats': return '🎉';
|
||||
case 'angry': return '💢';
|
||||
case 'confused': return '😥';
|
||||
case 'rip': return '😇';
|
||||
case 'pudding': return '🍮';
|
||||
default: return '';
|
||||
}
|
||||
|
@ -13,7 +13,7 @@ export default App;
|
||||
export type IApp = {
|
||||
_id: mongo.ObjectID;
|
||||
createdAt: Date;
|
||||
userId: mongo.ObjectID;
|
||||
userId: mongo.ObjectID | null;
|
||||
secret: string;
|
||||
name: string;
|
||||
nameId: string;
|
||||
|
@ -10,7 +10,7 @@ import DriveFileThumbnail, { deleteDriveFileThumbnail } from './drive-file-thumb
|
||||
|
||||
const DriveFile = monkDb.get<IDriveFile>('driveFiles.files');
|
||||
DriveFile.createIndex('md5');
|
||||
DriveFile.createIndex('metadata.uri', { sparse: true, unique: true });
|
||||
DriveFile.createIndex('metadata.uri');
|
||||
export default DriveFile;
|
||||
|
||||
export const DriveFileChunk = monkDb.get('driveFiles.chunks');
|
||||
@ -31,6 +31,7 @@ export type IMetadata = {
|
||||
comment: string;
|
||||
uri?: string;
|
||||
url?: string;
|
||||
thumbnailUrl?: string;
|
||||
src?: string;
|
||||
deletedAt?: Date;
|
||||
withoutChunks?: boolean;
|
||||
@ -164,6 +165,7 @@ export const pack = (
|
||||
_target = Object.assign(_target, _file.metadata);
|
||||
|
||||
_target.url = _file.metadata.url ? _file.metadata.url : `${config.drive_url}/${_target.id}/${encodeURIComponent(_target.name)}`;
|
||||
_target.thumbnailUrl = _file.metadata.thumbnailUrl ? _file.metadata.thumbnailUrl : _file.metadata.url ? _file.metadata.url : `${config.drive_url}/${_target.id}/${encodeURIComponent(_target.name)}?thumbnail`;
|
||||
_target.isRemote = _file.metadata.isRemote;
|
||||
|
||||
if (_target.properties == null) _target.properties = {};
|
||||
|
@ -11,4 +11,5 @@ export type IMeta = {
|
||||
usersCount: number;
|
||||
originalUsersCount: number;
|
||||
};
|
||||
disableRegistration: boolean;
|
||||
};
|
||||
|
@ -26,6 +26,7 @@ export const validateReaction = $.str.or([
|
||||
'congrats',
|
||||
'angry',
|
||||
'confused',
|
||||
'rip',
|
||||
'pudding'
|
||||
]);
|
||||
|
||||
|
@ -340,7 +340,7 @@ export const pack = async (
|
||||
_note = await rap(_note);
|
||||
|
||||
if (_note.user.isCat && _note.text) {
|
||||
_note.text = _note.text.replace(/な/g, 'にゃ').replace(/ナ/g, 'ニャ');
|
||||
_note.text = _note.text.replace(/な/g, 'にゃ').replace(/ナ/g, 'ニャ').replace(/ナ/g, 'ニャ');
|
||||
}
|
||||
|
||||
if (hide) {
|
||||
|
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;
|
||||
}
|
@ -7,7 +7,7 @@ export default async (job: bq.Job, done: any): Promise<void> => {
|
||||
await request(job.data.user, job.data.to, job.data.content);
|
||||
done();
|
||||
} catch (res) {
|
||||
if (!res.hasOwnProperty('statusCode')) {
|
||||
if (res == null || !res.hasOwnProperty('statusCode')) {
|
||||
console.warn(`deliver failed (unknown): ${res}`);
|
||||
return done();
|
||||
}
|
||||
|
@ -40,11 +40,13 @@ export default async function(resolver: Resolver, actor: IRemoteUser, activity:
|
||||
if (!note.to.includes('https://www.w3.org/ns/activitystreams#Public')) {
|
||||
if (note.cc.includes('https://www.w3.org/ns/activitystreams#Public')) {
|
||||
visibility = 'home';
|
||||
} else if (note.to.includes(`${actor.uri}/followers`)) { // TODO: person.followerと照合するべき?
|
||||
visibility = 'followers';
|
||||
} else {
|
||||
visibility = 'specified';
|
||||
visibleUsers = await Promise.all(note.to.map(uri => resolvePerson(uri)));
|
||||
}
|
||||
} if (activity.cc.length == 0) visibility = 'followers';
|
||||
}
|
||||
//#endergion
|
||||
|
||||
await post(actor, {
|
||||
|
@ -69,12 +69,13 @@ export async function createNote(value: any, resolver?: Resolver, silent = false
|
||||
if (!note.to.includes('https://www.w3.org/ns/activitystreams#Public')) {
|
||||
if (note.cc.includes('https://www.w3.org/ns/activitystreams#Public')) {
|
||||
visibility = 'home';
|
||||
} else if (note.to.includes(`${actor.uri}/followers`)) { // TODO: person.followerと照合するべき?
|
||||
visibility = 'followers';
|
||||
} else {
|
||||
visibility = 'specified';
|
||||
visibleUsers = await Promise.all(note.to.map(uri => resolvePerson(uri)));
|
||||
}
|
||||
}
|
||||
if (note.cc.length == 0) visibility = 'followers';
|
||||
//#endergion
|
||||
|
||||
// 添付メディア
|
||||
|
@ -1,4 +1,15 @@
|
||||
export default (object: any) => ({
|
||||
type: 'Announce',
|
||||
object
|
||||
});
|
||||
import config from '../../../config';
|
||||
import { INote } from '../../../models/note';
|
||||
|
||||
export default (object: any, note: INote) => {
|
||||
const attributedTo = `${config.url}/users/${note.userId}`;
|
||||
|
||||
return {
|
||||
id: `${config.url}/notes/${note._id}`,
|
||||
type: 'Announce',
|
||||
published: note.createdAt.toISOString(),
|
||||
to: ['https://www.w3.org/ns/activitystreams#Public'],
|
||||
cc: [attributedTo, `${attributedTo}/followers`],
|
||||
object
|
||||
};
|
||||
};
|
||||
|
@ -4,5 +4,5 @@ import { IDriveFile } from '../../../models/drive-file';
|
||||
export default (file: IDriveFile) => ({
|
||||
type: 'Document',
|
||||
mediaType: file.contentType,
|
||||
url: `${config.drive_url}/${file._id}`
|
||||
url: file.metadata.url || `${config.drive_url}/${file._id}`
|
||||
});
|
||||
|
16
src/remote/activitypub/renderer/follow-user.ts
Normal file
16
src/remote/activitypub/renderer/follow-user.ts
Normal file
@ -0,0 +1,16 @@
|
||||
import config from '../../../config';
|
||||
import * as mongo from 'mongodb';
|
||||
import User, { isLocalUser } from '../../../models/user';
|
||||
|
||||
/**
|
||||
* Convert (local|remote)(Follower|Followee)ID to URL
|
||||
* @param id Follower|Followee ID
|
||||
*/
|
||||
export default async function renderFollowUser(id: mongo.ObjectID): Promise<any> {
|
||||
|
||||
const user = await User.findOne({
|
||||
_id: id
|
||||
});
|
||||
|
||||
return isLocalUser(user) ? `${config.url}/users/${user._id}` : user.uri;
|
||||
}
|
@ -3,6 +3,6 @@ import { IDriveFile } from '../../../models/drive-file';
|
||||
|
||||
export default (file: IDriveFile) => ({
|
||||
type: 'Image',
|
||||
url: `${config.drive_url}/${file._id}`,
|
||||
url: file.metadata.url || `${config.drive_url}/${file._id}`,
|
||||
sensitive: file.metadata.isSensitive
|
||||
});
|
||||
|
@ -50,9 +50,21 @@ export default async function renderNote(note: INote, dive = true): Promise<any>
|
||||
? note.mentionedRemoteUsers.map(x => x.uri)
|
||||
: [];
|
||||
|
||||
const cc = ['public', 'home', 'followers'].includes(note.visibility)
|
||||
? [`${attributedTo}/followers`].concat(mentions)
|
||||
: [];
|
||||
let to: string[] = [];
|
||||
let cc: string[] = [];
|
||||
|
||||
if (note.visibility == 'public') {
|
||||
to = ['https://www.w3.org/ns/activitystreams#Public'];
|
||||
cc = [`${attributedTo}/followers`].concat(mentions);
|
||||
} else if (note.visibility == 'home') {
|
||||
to = [`${attributedTo}/followers`];
|
||||
cc = ['https://www.w3.org/ns/activitystreams#Public'].concat(mentions);
|
||||
} else if (note.visibility == 'followers') {
|
||||
to = [`${attributedTo}/followers`];
|
||||
cc = mentions;
|
||||
} else {
|
||||
to = mentions;
|
||||
}
|
||||
|
||||
const mentionedUsers = note.mentions ? await User.find({
|
||||
_id: {
|
||||
@ -74,7 +86,7 @@ export default async function renderNote(note: INote, dive = true): Promise<any>
|
||||
summary: note.cw,
|
||||
content: toHtml(note),
|
||||
published: note.createdAt.toISOString(),
|
||||
to: 'https://www.w3.org/ns/activitystreams#Public',
|
||||
to,
|
||||
cc,
|
||||
inReplyTo,
|
||||
attachment: (await promisedFiles).map(renderDocument),
|
||||
|
23
src/remote/activitypub/renderer/ordered-collection-page.ts
Normal file
23
src/remote/activitypub/renderer/ordered-collection-page.ts
Normal file
@ -0,0 +1,23 @@
|
||||
/**
|
||||
* Render OrderedCollectionPage
|
||||
* @param id URL of self
|
||||
* @param totalItems Number of total items
|
||||
* @param orderedItems Items
|
||||
* @param partOf URL of base
|
||||
* @param prev URL of prev page (optional)
|
||||
* @param next URL of next page (optional)
|
||||
*/
|
||||
export default function(id: string, totalItems: any, orderedItems: any, partOf: string, prev: string, next: string) {
|
||||
const page = {
|
||||
id,
|
||||
partOf,
|
||||
type: 'OrderedCollectionPage',
|
||||
totalItems,
|
||||
orderedItems
|
||||
} as any;
|
||||
|
||||
if (prev) page.prev = prev;
|
||||
if (next) page.next = next;
|
||||
|
||||
return page;
|
||||
}
|
@ -1,6 +1,19 @@
|
||||
export default (id: string, totalItems: any, orderedItems: any) => ({
|
||||
id,
|
||||
type: 'OrderedCollection',
|
||||
totalItems,
|
||||
orderedItems
|
||||
});
|
||||
/**
|
||||
* Render OrderedCollection
|
||||
* @param id URL of self
|
||||
* @param totalItems Total number of items
|
||||
* @param first URL of first page (optional)
|
||||
* @param last URL of last page (optional)
|
||||
*/
|
||||
export default function(id: string, totalItems: any, first: string, last: string) {
|
||||
const page: any = {
|
||||
id,
|
||||
type: 'OrderedCollection',
|
||||
totalItems,
|
||||
};
|
||||
|
||||
if (first) page.first = first;
|
||||
if (last) page.last = last;
|
||||
|
||||
return page;
|
||||
}
|
||||
|
@ -19,6 +19,8 @@ export default async (user: ILocalUser) => {
|
||||
id,
|
||||
inbox: `${id}/inbox`,
|
||||
outbox: `${id}/outbox`,
|
||||
followers: `${id}/followers`,
|
||||
following: `${id}/following`,
|
||||
sharedInbox: `${config.url}/inbox`,
|
||||
url: `${config.url}/@${user.username}`,
|
||||
preferredUsername: user.username,
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user