Compare commits
187 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
48dc56e834 | ||
![]() |
2c33bd6e31 | ||
![]() |
b6524616bc | ||
![]() |
7e2b70f912 | ||
![]() |
4f071a66b6 | ||
![]() |
39f2303429 | ||
![]() |
cacf072027 | ||
![]() |
6ab1fdfe1a | ||
![]() |
6e5c93f926 | ||
![]() |
1670737075 | ||
![]() |
fee235c4e4 | ||
![]() |
7a39d489f2 | ||
![]() |
7c634218d1 | ||
![]() |
2704c5be73 | ||
![]() |
489b51ba9f | ||
![]() |
21807c29f1 | ||
![]() |
3bc62fe3eb | ||
![]() |
ba0e3c4a5f | ||
![]() |
9ec1fb5e37 | ||
![]() |
d708409462 | ||
![]() |
07d05d4f86 | ||
![]() |
bbdb2ebb40 | ||
![]() |
f7908ba098 | ||
![]() |
f2fda3075e | ||
![]() |
1338a68979 | ||
![]() |
e7da505fb3 | ||
![]() |
5a9228372f | ||
![]() |
c4a6ba9097 | ||
![]() |
d5871b408b | ||
![]() |
7b3338e373 | ||
![]() |
d18ee12d2f | ||
![]() |
ca9cc97940 | ||
![]() |
a70070ac7d | ||
![]() |
069d99b320 | ||
![]() |
37d350dcad | ||
![]() |
8653e09b59 | ||
![]() |
7cd2d59576 | ||
![]() |
a0839de38f | ||
![]() |
b7c5c71c6f | ||
![]() |
adab0adbdd | ||
![]() |
2faa58928f | ||
![]() |
ffb80efe21 | ||
![]() |
6f959218ef | ||
![]() |
be1125dcb9 | ||
![]() |
9ab34c2301 | ||
![]() |
0166d81d9e | ||
![]() |
0b26efbd2f | ||
![]() |
2cbaedf946 | ||
![]() |
b66924fbe8 | ||
![]() |
8c91148954 | ||
![]() |
be0eff3dda | ||
![]() |
85903ac9c6 | ||
![]() |
dbdd778dc7 | ||
![]() |
fc50dfd8d5 | ||
![]() |
f444e132ee | ||
![]() |
68f562c323 | ||
![]() |
820ea69613 | ||
![]() |
6f4b3853a1 | ||
![]() |
a706ad0e80 | ||
![]() |
820116affc | ||
![]() |
52650342be | ||
![]() |
85ddabdc65 | ||
![]() |
0730cc4fa4 | ||
![]() |
17b6ab0ef0 | ||
![]() |
4e208b85bb | ||
![]() |
00f8b29f6d | ||
![]() |
9cf0fcadb1 | ||
![]() |
c595efeead | ||
![]() |
b56c6793a1 | ||
![]() |
ebceffba1e | ||
![]() |
3ae42d9b85 | ||
![]() |
796237b3c6 | ||
![]() |
cb7a97ee4c | ||
![]() |
0cf758b6d1 | ||
![]() |
d28fca320e | ||
![]() |
8bd17703c3 | ||
![]() |
a78eebc43f | ||
![]() |
79fb5246df | ||
![]() |
458b8c78dc | ||
![]() |
64e0cbd6fc | ||
![]() |
7fe937026b | ||
![]() |
656cec65b9 | ||
![]() |
8045bbff1c | ||
![]() |
c1a7a21746 | ||
![]() |
f3ee63fcbe | ||
![]() |
7645c212a3 | ||
![]() |
8b38e2ea58 | ||
![]() |
c9eb6a8919 | ||
![]() |
9a41fd4734 | ||
![]() |
70d96ee076 | ||
![]() |
3b6fb3959b | ||
![]() |
484d705320 | ||
![]() |
786031be66 | ||
![]() |
bc0027ce43 | ||
![]() |
3e7c6d9bdc | ||
![]() |
5463e3e55e | ||
![]() |
84a880086e | ||
![]() |
89419b7136 | ||
![]() |
9106ec74f7 | ||
![]() |
ebf9a0921d | ||
![]() |
c237f49016 | ||
![]() |
709290d2da | ||
![]() |
eb3180f3b6 | ||
![]() |
681997509c | ||
![]() |
79ff5888fd | ||
![]() |
9ee9cf8d81 | ||
![]() |
ee3c0f6f18 | ||
![]() |
9dd463bff4 | ||
![]() |
df297d0031 | ||
![]() |
d18d1cb958 | ||
![]() |
5bc0570888 | ||
![]() |
8b43d75eaf | ||
![]() |
89b37bd73d | ||
![]() |
69f246ce7f | ||
![]() |
6a97f0b7f6 | ||
![]() |
d885b872f3 | ||
![]() |
125849673a | ||
![]() |
30c53e9ee0 | ||
![]() |
981fb9e8f3 | ||
![]() |
9fac22d880 | ||
![]() |
b8f034064a | ||
![]() |
6068227434 | ||
![]() |
69cda49c88 | ||
![]() |
039d821d20 | ||
![]() |
44d93bc408 | ||
![]() |
cfa76ac6f9 | ||
![]() |
0ec2d16522 | ||
![]() |
6bcac1fe14 | ||
![]() |
bc9427d000 | ||
![]() |
07c043361e | ||
![]() |
e676a9a501 | ||
![]() |
09e654c6d2 | ||
![]() |
549cb1ba87 | ||
![]() |
c633827e5e | ||
![]() |
08142ead67 | ||
![]() |
638d81b66e | ||
![]() |
4c83c2f64d | ||
![]() |
bf56f90fdc | ||
![]() |
d8412aad7a | ||
![]() |
c136741710 | ||
![]() |
4fe8454da0 | ||
![]() |
3f2161dadd | ||
![]() |
3db516aa1a | ||
![]() |
367bbbe605 | ||
![]() |
5b70ff561c | ||
![]() |
4486527e5d | ||
![]() |
147e23d332 | ||
![]() |
ee20e6950e | ||
![]() |
1d217154ef | ||
![]() |
27d304a1ab | ||
![]() |
1d1a373ca8 | ||
![]() |
bca3c6f8bf | ||
![]() |
d83d661535 | ||
![]() |
e16906afc3 | ||
![]() |
a6dc0f3684 | ||
![]() |
6120474548 | ||
![]() |
121dd86299 | ||
![]() |
5251d9f668 | ||
![]() |
7ae3f569de | ||
![]() |
142ebead59 | ||
![]() |
e196086c64 | ||
![]() |
8c6ed98505 | ||
![]() |
98a2953c9c | ||
![]() |
61d224695b | ||
![]() |
6967def6c8 | ||
![]() |
68c0600a5c | ||
![]() |
b8163bd0e1 | ||
![]() |
8c25b9dfad | ||
![]() |
bf34f67583 | ||
![]() |
0c63f410d6 | ||
![]() |
069077ace4 | ||
![]() |
5be947ea4d | ||
![]() |
b41ffa75b7 | ||
![]() |
48df08d4dc | ||
![]() |
4de9a08e55 | ||
![]() |
3f46b5259b | ||
![]() |
2faa8ea97c | ||
![]() |
514690cf18 | ||
![]() |
f4f78c1898 | ||
![]() |
2d24befb15 | ||
![]() |
184d88838c | ||
![]() |
4490503d59 | ||
![]() |
99750435ae | ||
![]() |
fae920e578 | ||
![]() |
0243b6d13b | ||
![]() |
12bc725d68 | ||
![]() |
b1a7b781ec |
3
.autogen/check_pr.jq
Normal file
3
.autogen/check_pr.jq
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
.[]
|
||||||
|
.head
|
||||||
|
.label
|
2
.autogen/next_url.jq
Normal file
2
.autogen/next_url.jq
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
.links
|
||||||
|
.next
|
39
.autogen/patreon.jq
Normal file
39
.autogen/patreon.jq
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
(
|
||||||
|
.data |
|
||||||
|
map(
|
||||||
|
select(
|
||||||
|
.relationships
|
||||||
|
.currently_entitled_tiers
|
||||||
|
.data[]
|
||||||
|
)
|
||||||
|
) |
|
||||||
|
map(
|
||||||
|
.relationships
|
||||||
|
.user
|
||||||
|
.data
|
||||||
|
.id
|
||||||
|
)
|
||||||
|
) as $data |
|
||||||
|
.included |
|
||||||
|
map(
|
||||||
|
select(
|
||||||
|
.id as $id |
|
||||||
|
$data |
|
||||||
|
contains(
|
||||||
|
[
|
||||||
|
$id
|
||||||
|
]
|
||||||
|
)
|
||||||
|
)
|
||||||
|
) |
|
||||||
|
map(
|
||||||
|
.attributes |
|
||||||
|
[
|
||||||
|
.full_name,
|
||||||
|
.thumb_url,
|
||||||
|
.url
|
||||||
|
] |
|
||||||
|
@tsv
|
||||||
|
) |
|
||||||
|
.[] |
|
||||||
|
@text
|
@@ -5,7 +5,7 @@
|
|||||||
# __MISSKEY_HEAD=acid-chicken:patch-autogen
|
# __MISSKEY_HEAD=acid-chicken:patch-autogen
|
||||||
# __MISSKEY_REPO=syuilo/misskey
|
# __MISSKEY_REPO=syuilo/misskey
|
||||||
# __MISSKEY_BRANCH=develop
|
# __MISSKEY_BRANCH=develop
|
||||||
test "$(curl -LSs -w '\n' -- "https://api.github.com/repos/$REPO/pulls?access_token=$__MISSKEY_GITHUB_TOKEN" | jq -r '.[].head.label' | grep $__MISSKEY_HEAD)" && exit 1
|
test "$(curl -LSs -w '\n' -- "https://api.github.com/repos/$REPO/pulls?access_token=$__MISSKEY_GITHUB_TOKEN" | jq -r -f check_pr.jq | grep $__MISSKEY_HEAD)" && exit 1
|
||||||
cd "$(dirname $0)/.." && \
|
cd "$(dirname $0)/.." && \
|
||||||
touch null.cache && \
|
touch null.cache && \
|
||||||
rm *.cache && \
|
rm *.cache && \
|
||||||
@@ -30,7 +30,7 @@ while :
|
|||||||
touch patreon.cache && \
|
touch patreon.cache && \
|
||||||
rm patreon.cache && \
|
rm patreon.cache && \
|
||||||
cat patreon.raw.cache | \
|
cat patreon.raw.cache | \
|
||||||
jq -r '(.data|map(select(.relationships.currently_entitled_tiers.data[]))|map(.relationships.user.data.id))as$data|.included|map(select(.id as$id|$data|contains([$id])))|map(.attributes|[.full_name,.thumb_url,.url]|@tsv)|.[]|@text' >> patreon.cache && \
|
jq -r -f patreon.jq >> patreon.cache && \
|
||||||
echo '<table><tr>' >> patreon.md.cache && \
|
echo '<table><tr>' >> patreon.md.cache && \
|
||||||
cat patreon.cache | \
|
cat patreon.cache | \
|
||||||
awk -F'\t' '{print $2,$1}' | \
|
awk -F'\t' '{print $2,$1}' | \
|
||||||
@@ -43,7 +43,7 @@ while :
|
|||||||
xargs -I% echo '<td><a href="%</a></td>' >> patreon.md.cache && \
|
xargs -I% echo '<td><a href="%</a></td>' >> patreon.md.cache && \
|
||||||
echo '</tr></table>' >> patreon.md.cache || \
|
echo '</tr></table>' >> patreon.md.cache || \
|
||||||
exit 1
|
exit 1
|
||||||
new_url="$(cat patreon.raw.cache | jq -r '.links.next')"
|
new_url="$(cat patreon.raw.cache | jq -r -f next_url.jq)"
|
||||||
test "$new_url" = 'null' && \
|
test "$new_url" = 'null' && \
|
||||||
break || \
|
break || \
|
||||||
URL="$url"
|
URL="$url"
|
29
CHANGELOG.md
29
CHANGELOG.md
@@ -1,6 +1,35 @@
|
|||||||
ChangeLog
|
ChangeLog
|
||||||
=========
|
=========
|
||||||
|
|
||||||
|
10.64.2
|
||||||
|
-------
|
||||||
|
* UIの動きを減らすオプションが一部のアニメーションに適用されなかったのを修正
|
||||||
|
|
||||||
|
10.64.1
|
||||||
|
-------
|
||||||
|
* レートリミットの調整
|
||||||
|
* アニメーションの調整
|
||||||
|
|
||||||
|
10.64.0
|
||||||
|
-------
|
||||||
|
* いくつかのアニメーションを追加
|
||||||
|
* OGP向けにインスタンスのバナー画像を提供するように
|
||||||
|
* 管理者ページでドライブのファイルを表示できるように
|
||||||
|
* ユーザビリティの強化
|
||||||
|
* バグ修正
|
||||||
|
|
||||||
|
10.63.1
|
||||||
|
-------
|
||||||
|
* メンションの表示を改善
|
||||||
|
* バグ修正
|
||||||
|
|
||||||
|
10.63.0
|
||||||
|
-------
|
||||||
|
* ActivityPubのユーザーフィールドをユーザーページに表示
|
||||||
|
* 404ページの実装
|
||||||
|
* パフォーマンスの向上
|
||||||
|
* バグ修正
|
||||||
|
|
||||||
10.62.2
|
10.62.2
|
||||||
-------
|
-------
|
||||||
* バグ修正
|
* バグ修正
|
||||||
|
16
README.md
16
README.md
@@ -3,9 +3,9 @@
|
|||||||
[](https://misskey.xyz/)
|
[](https://misskey.xyz/)
|
||||||
================================================================
|
================================================================
|
||||||
|
|
||||||
[](https://circleci.com/gh/syuilo/misskey)
|
[](https://circleci.com/gh/syuilo/misskey)
|
||||||
[![][dependencies-badge]][dependencies-link]
|
[](https://david-dm.org/syuilo/misskey)
|
||||||
[](http://makeapullrequest.com)
|
[](http://makeapullrequest.com)
|
||||||
|
|
||||||
**Sophisticated microblogging platform, evolving forever.**
|
**Sophisticated microblogging platform, evolving forever.**
|
||||||
|
|
||||||
@@ -77,7 +77,7 @@ Please see [Contribution guide](./CONTRIBUTING.md).
|
|||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/13376668/71f3cf87ec6c4393a44b1b9df5ee3d12/1?token-time=2145916800&token-hash=7pSmWqgMfMSJHVIEcNsuuQoKeU3TRluew5p0EGTzWA4%3D" alt="Arctic"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/13376668/71f3cf87ec6c4393a44b1b9df5ee3d12/1?token-time=2145916800&token-hash=7pSmWqgMfMSJHVIEcNsuuQoKeU3TRluew5p0EGTzWA4%3D" alt="Arctic"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12731202/0995c46cdcb54153ab5f073f5869b70a/1?token-time=2145916800&token-hash=Yd60FK_SWfQO56SeiJpy1tDHOnCV4xdEywQe8gn5_Wo%3D" alt="negao"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12731202/0995c46cdcb54153ab5f073f5869b70a/1?token-time=2145916800&token-hash=Yd60FK_SWfQO56SeiJpy1tDHOnCV4xdEywQe8gn5_Wo%3D" alt="negao"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12913507/f7181eacafe8469a93033d85f5969c29/2?token-time=2145916800&token-hash=mgPdX9TqZxEg4TTPuc477dxhIgYk9246qafjWZEqZ7g%3D" alt="Melilot"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12913507/f7181eacafe8469a93033d85f5969c29/2?token-time=2145916800&token-hash=mgPdX9TqZxEg4TTPuc477dxhIgYk9246qafjWZEqZ7g%3D" alt="Melilot"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12999811/5f349fafcce44dd1824a8b1ebbec4564/2?token-time=2145916800&token-hash=rwZ8qvbm_kpA4ib3kc07tVKupXeySpY5ATQFGxfL9v0%3D" alt="Xeltica"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12999811/5f349fafcce44dd1824a8b1ebbec4564/3?token-time=2145916800&token-hash=ybYtxfpte1b-rGg6Zecpys2ZdZDtwR_UNJHQjt-3eoU%3D" alt="Xeltica"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/3384329/8b713330cb27404ea6e9fac50ff96efe/1?token-time=2145916800&token-hash=0eu4-m1gTWA9PhptVZt6rdKcusqcD7RB87rJT23VVFI%3D" alt="べすれい"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/3384329/8b713330cb27404ea6e9fac50ff96efe/1?token-time=2145916800&token-hash=0eu4-m1gTWA9PhptVZt6rdKcusqcD7RB87rJT23VVFI%3D" alt="べすれい"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12021162/963128bb8d14476dbd8407943db8f31a/1?token-time=2145916800&token-hash=GgJ_NmUB6_nnRNLVGUWjV-WX91On7BOu59LKncYV9fE%3D" alt="gutfuckllc"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12021162/963128bb8d14476dbd8407943db8f31a/1?token-time=2145916800&token-hash=GgJ_NmUB6_nnRNLVGUWjV-WX91On7BOu59LKncYV9fE%3D" alt="gutfuckllc"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/11357794/923ce94cd8c44ba788ee931907881839/1?token-time=2145916800&token-hash=I8lJVM8LeW6TSo5W6uIIRZ42cw83zp1wK_FsbzY0mcQ%3D" alt="mydarkstar"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/11357794/923ce94cd8c44ba788ee931907881839/1?token-time=2145916800&token-hash=I8lJVM8LeW6TSo5W6uIIRZ42cw83zp1wK_FsbzY0mcQ%3D" alt="mydarkstar"></td>
|
||||||
@@ -86,7 +86,7 @@ Please see [Contribution guide](./CONTRIBUTING.md).
|
|||||||
<td><a href="https://www.patreon.com/user?u=13376668">Arctic</a></td>
|
<td><a href="https://www.patreon.com/user?u=13376668">Arctic</a></td>
|
||||||
<td><a href="https://www.patreon.com/negao">negao</a></td>
|
<td><a href="https://www.patreon.com/negao">negao</a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=12913507">Melilot</a></td>
|
<td><a href="https://www.patreon.com/user?u=12913507">Melilot</a></td>
|
||||||
<td><a href="https://www.patreon.com/AxellaMC">Xeltica</a></td>
|
<td><a href="https://www.patreon.com/Xeltica">Xeltica</a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=3384329">べすれい</a></td>
|
<td><a href="https://www.patreon.com/user?u=3384329">べすれい</a></td>
|
||||||
<td><a href="https://www.patreon.com/gutfuckllc">gutfuckllc</a></td>
|
<td><a href="https://www.patreon.com/gutfuckllc">gutfuckllc</a></td>
|
||||||
<td><a href="https://www.patreon.com/mydarkstar">mydarkstar</a></td>
|
<td><a href="https://www.patreon.com/mydarkstar">mydarkstar</a></td>
|
||||||
@@ -118,7 +118,7 @@ Please see [Contribution guide](./CONTRIBUTING.md).
|
|||||||
<td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td>
|
<td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td>
|
||||||
</tr></table>
|
</tr></table>
|
||||||
|
|
||||||
**Last updated:** Thu, 06 Dec 2018 14:22:05 UTC
|
**Last updated:** Sun, 16 Dec 2018 18:32:06 UTC
|
||||||
<!-- PATREON_END -->
|
<!-- PATREON_END -->
|
||||||
|
|
||||||
:four_leaf_clover: Copyright
|
:four_leaf_clover: Copyright
|
||||||
@@ -130,9 +130,7 @@ Misskey is an open-source software licensed under the [GNU AGPLv3](LICENSE).
|
|||||||
[![][agpl-3.0-badge]][AGPL-3.0]
|
[![][agpl-3.0-badge]][AGPL-3.0]
|
||||||
|
|
||||||
[agpl-3.0]: https://www.gnu.org/licenses/agpl-3.0.en.html
|
[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
|
[agpl-3.0-badge]: https://img.shields.io/badge/license-AGPL--3.0-444444.svg?style=for-the-badge
|
||||||
[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-url]: #backers
|
||||||
[backer-badge]: https://opencollective.com/misskey/backers/badge.svg
|
[backer-badge]: https://opencollective.com/misskey/backers/badge.svg
|
||||||
|
52
gulpfile.ts
52
gulpfile.ts
@@ -11,14 +11,12 @@ import tslint from 'gulp-tslint';
|
|||||||
const cssnano = require('gulp-cssnano');
|
const cssnano = require('gulp-cssnano');
|
||||||
const stylus = require('gulp-stylus');
|
const stylus = require('gulp-stylus');
|
||||||
import * as uglifyComposer from 'gulp-uglify/composer';
|
import * as uglifyComposer from 'gulp-uglify/composer';
|
||||||
import pug = require('gulp-pug');
|
|
||||||
import * as rimraf from 'rimraf';
|
import * as rimraf from 'rimraf';
|
||||||
import chalk from 'chalk';
|
import chalk from 'chalk';
|
||||||
const imagemin = require('gulp-imagemin');
|
const imagemin = require('gulp-imagemin');
|
||||||
import * as rename from 'gulp-rename';
|
import * as rename from 'gulp-rename';
|
||||||
import * as mocha from 'gulp-mocha';
|
import * as mocha from 'gulp-mocha';
|
||||||
import * as replace from 'gulp-replace';
|
import * as replace from 'gulp-replace';
|
||||||
import * as htmlmin from 'gulp-htmlmin';
|
|
||||||
const uglifyes = require('uglify-es');
|
const uglifyes = require('uglify-es');
|
||||||
|
|
||||||
const locales = require('./locales');
|
const locales = require('./locales');
|
||||||
@@ -34,8 +32,6 @@ if (isDebug) {
|
|||||||
console.warn(chalk.yellow.bold(' built script will not be compressed.'));
|
console.warn(chalk.yellow.bold(' built script will not be compressed.'));
|
||||||
}
|
}
|
||||||
|
|
||||||
const constants = require('./src/const.json');
|
|
||||||
|
|
||||||
gulp.task('build', [
|
gulp.task('build', [
|
||||||
'build:ts',
|
'build:ts',
|
||||||
'build:copy',
|
'build:copy',
|
||||||
@@ -109,7 +105,7 @@ gulp.task('default', ['build']);
|
|||||||
gulp.task('build:client', [
|
gulp.task('build:client', [
|
||||||
'build:ts',
|
'build:ts',
|
||||||
'build:client:script',
|
'build:client:script',
|
||||||
'build:client:pug',
|
'build:client:styles',
|
||||||
'copy:client'
|
'copy:client'
|
||||||
]);
|
]);
|
||||||
|
|
||||||
@@ -148,52 +144,6 @@ gulp.task('copy:client', [
|
|||||||
.pipe(gulp.dest('./built/client/assets/'))
|
.pipe(gulp.dest('./built/client/assets/'))
|
||||||
);
|
);
|
||||||
|
|
||||||
gulp.task('build:client:pug', [
|
|
||||||
'copy:client',
|
|
||||||
'build:client:script',
|
|
||||||
'build:client:styles'
|
|
||||||
], () =>
|
|
||||||
gulp.src('./src/client/app/base.pug')
|
|
||||||
.pipe(pug({
|
|
||||||
locals: {
|
|
||||||
themeColor: constants.themeColor
|
|
||||||
}
|
|
||||||
}))
|
|
||||||
.pipe(htmlmin({
|
|
||||||
// 真理値属性の簡略化 e.g.
|
|
||||||
// <input value="foo" readonly="readonly"> to
|
|
||||||
// <input value="foo" readonly>
|
|
||||||
collapseBooleanAttributes: true,
|
|
||||||
|
|
||||||
// テキストの一部かもしれない空白も削除する e.g.
|
|
||||||
// <div> <p> foo </p> </div> to
|
|
||||||
// <div><p>foo</p></div>
|
|
||||||
collapseWhitespace: true,
|
|
||||||
|
|
||||||
// タグ間の改行を保持する
|
|
||||||
preserveLineBreaks: true,
|
|
||||||
|
|
||||||
// (できる場合は)属性のクォーテーション削除する e.g.
|
|
||||||
// <p class="foo-bar" id="moo" title="blah blah">foo</p> to
|
|
||||||
// <p class=foo-bar id=moo title="blah blah">foo</p>
|
|
||||||
removeAttributeQuotes: true,
|
|
||||||
|
|
||||||
// 省略可能なタグを省略する e.g.
|
|
||||||
// <html><p>yo</p></html> ro
|
|
||||||
// <p>yo</p>
|
|
||||||
removeOptionalTags: true,
|
|
||||||
|
|
||||||
// 属性の値がデフォルトと同じなら省略する e.g.
|
|
||||||
// <input type="text"> to
|
|
||||||
// <input>
|
|
||||||
removeRedundantAttributes: true,
|
|
||||||
|
|
||||||
// CSSも圧縮する
|
|
||||||
minifyCSS: true
|
|
||||||
}))
|
|
||||||
.pipe(gulp.dest('./built/client/app/'))
|
|
||||||
);
|
|
||||||
|
|
||||||
gulp.task('locales', () =>
|
gulp.task('locales', () =>
|
||||||
gulp.src('./locales/*.yml')
|
gulp.src('./locales/*.yml')
|
||||||
.pipe(yaml({ schema: 'DEFAULT_SAFE_SCHEMA' }))
|
.pipe(yaml({ schema: 'DEFAULT_SAFE_SCHEMA' }))
|
||||||
|
@@ -111,7 +111,6 @@ common:
|
|||||||
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
||||||
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
||||||
use-white-black-reversi-stones: "リバーシに白黒の石を使う"
|
use-white-black-reversi-stones: "リバーシに白黒の石を使う"
|
||||||
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
|
||||||
verified-user: "公式アカウント"
|
verified-user: "公式アカウント"
|
||||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||||
@@ -165,6 +164,7 @@ common:
|
|||||||
hashtags: "ハッシュタグ"
|
hashtags: "ハッシュタグ"
|
||||||
dev: "アプリの作成に失敗しました。再度お試しください。"
|
dev: "アプリの作成に失敗しました。再度お試しください。"
|
||||||
ai-chan-kawaii: "藍ちゃかわいい"
|
ai-chan-kawaii: "藍ちゃかわいい"
|
||||||
|
you: "あなた"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "<i>{name}</i>があなたのアカウントにアクセスすることを許可しますか?"
|
share-access: "<i>{name}</i>があなたのアカウントにアクセスすることを許可しますか?"
|
||||||
permission-ask: "このアプリは次の権限を要求しています:"
|
permission-ask: "このアプリは次の権限を要求しています:"
|
||||||
@@ -523,6 +523,8 @@ common/views/widgets/tips.vue:
|
|||||||
tips-line23: "まゆかわいいよまゆ"
|
tips-line23: "まゆかわいいよまゆ"
|
||||||
tips-line24: "Misskeyは2014年にサービスを開始しました"
|
tips-line24: "Misskeyは2014年にサービスを開始しました"
|
||||||
tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
|
tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
|
||||||
|
common/views/pages/404.vue:
|
||||||
|
page-not-found: "ページが見つかりませんでした"
|
||||||
common/views/pages/follow.vue:
|
common/views/pages/follow.vue:
|
||||||
signed-in-as: "{}としてサインイン中"
|
signed-in-as: "{}としてサインイン中"
|
||||||
following: "フォロー中"
|
following: "フォロー中"
|
||||||
@@ -881,6 +883,11 @@ desktop/views/components/sub-note-content.vue:
|
|||||||
deleted: "この投稿は削除されました"
|
deleted: "この投稿は削除されました"
|
||||||
media-count: "{}つのメディア"
|
media-count: "{}つのメディア"
|
||||||
poll: "アンケート"
|
poll: "アンケート"
|
||||||
|
desktop/views/components/settings.tags.vue:
|
||||||
|
title: "タグ"
|
||||||
|
query: "クエリ (省略可)"
|
||||||
|
add: "追加"
|
||||||
|
save: "保存"
|
||||||
desktop/views/components/taskmanager.vue:
|
desktop/views/components/taskmanager.vue:
|
||||||
title: "タスクマネージャ"
|
title: "タスクマネージャ"
|
||||||
desktop/views/components/timeline.vue:
|
desktop/views/components/timeline.vue:
|
||||||
@@ -963,6 +970,7 @@ admin/views/instance.vue:
|
|||||||
instance-description: "インスタンスの紹介"
|
instance-description: "インスタンスの紹介"
|
||||||
host: "ホスト"
|
host: "ホスト"
|
||||||
banner-url: "バナー画像URL"
|
banner-url: "バナー画像URL"
|
||||||
|
error-image-url: "エラー画像URL"
|
||||||
languages: "インスタンスの対象言語"
|
languages: "インスタンスの対象言語"
|
||||||
languages-desc: "スペースで区切って複数設定できます。"
|
languages-desc: "スペースで区切って複数設定できます。"
|
||||||
maintainer-config: "管理者情報"
|
maintainer-config: "管理者情報"
|
||||||
@@ -1046,6 +1054,20 @@ admin/views/charts.vue:
|
|||||||
network-requests: "リクエスト"
|
network-requests: "リクエスト"
|
||||||
network-time: "応答時間"
|
network-time: "応答時間"
|
||||||
network-usage: "通信量"
|
network-usage: "通信量"
|
||||||
|
admin/views/drive.vue:
|
||||||
|
sort:
|
||||||
|
title: "ソート"
|
||||||
|
createdAtAsc: "アップロード日時が古い順"
|
||||||
|
createdAtDesc: "アップロード日時が新しい順"
|
||||||
|
sizeAsc: "サイズが小さい順"
|
||||||
|
sizeDesc: "サイズが大きい順"
|
||||||
|
origin:
|
||||||
|
title: "オリジン"
|
||||||
|
combined: "ローカル+リモート"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
delete: "削除"
|
||||||
|
deleted: "削除しました"
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
operation: "操作"
|
operation: "操作"
|
||||||
username-or-userid: "ユーザー名またはユーザーID"
|
username-or-userid: "ユーザー名またはユーザーID"
|
||||||
|
@@ -111,7 +111,6 @@ common:
|
|||||||
i-like-sushi: "Ich bevorzuge Sushi anstelle von Pudding"
|
i-like-sushi: "Ich bevorzuge Sushi anstelle von Pudding"
|
||||||
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
||||||
use-white-black-reversi-stones: "リバーシに白黒の石を使う"
|
use-white-black-reversi-stones: "リバーシに白黒の石を使う"
|
||||||
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
|
||||||
verified-user: "Verifizierter Benutzer"
|
verified-user: "Verifizierter Benutzer"
|
||||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||||
@@ -165,6 +164,7 @@ common:
|
|||||||
hashtags: "Hashtags"
|
hashtags: "Hashtags"
|
||||||
dev: "Fehler beim Erstellen der Applikation. Bitte versuche es erneut."
|
dev: "Fehler beim Erstellen der Applikation. Bitte versuche es erneut."
|
||||||
ai-chan-kawaii: "藍ちゃかわいい"
|
ai-chan-kawaii: "藍ちゃかわいい"
|
||||||
|
you: "あなた"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "<i>{name}</i>があなたのアカウントにアクセスすることを許可しますか?"
|
share-access: "<i>{name}</i>があなたのアカウントにアクセスすることを許可しますか?"
|
||||||
permission-ask: "このアプリは次の権限を要求しています:"
|
permission-ask: "このアプリは次の権限を要求しています:"
|
||||||
@@ -523,6 +523,8 @@ common/views/widgets/tips.vue:
|
|||||||
tips-line23: "まゆかわいいよまゆ"
|
tips-line23: "まゆかわいいよまゆ"
|
||||||
tips-line24: "Misskeyは2014年にサービスを開始しました"
|
tips-line24: "Misskeyは2014年にサービスを開始しました"
|
||||||
tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
|
tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
|
||||||
|
common/views/pages/404.vue:
|
||||||
|
page-not-found: "ページが見つかりませんでした"
|
||||||
common/views/pages/follow.vue:
|
common/views/pages/follow.vue:
|
||||||
signed-in-as: "{}としてサインイン中"
|
signed-in-as: "{}としてサインイン中"
|
||||||
following: "フォロー中"
|
following: "フォロー中"
|
||||||
@@ -881,6 +883,11 @@ desktop/views/components/sub-note-content.vue:
|
|||||||
deleted: "この投稿は削除されました"
|
deleted: "この投稿は削除されました"
|
||||||
media-count: "{}つのメディア"
|
media-count: "{}つのメディア"
|
||||||
poll: "アンケート"
|
poll: "アンケート"
|
||||||
|
desktop/views/components/settings.tags.vue:
|
||||||
|
title: "タグ"
|
||||||
|
query: "クエリ (省略可)"
|
||||||
|
add: "追加"
|
||||||
|
save: "保存"
|
||||||
desktop/views/components/taskmanager.vue:
|
desktop/views/components/taskmanager.vue:
|
||||||
title: "Taskmanager"
|
title: "Taskmanager"
|
||||||
desktop/views/components/timeline.vue:
|
desktop/views/components/timeline.vue:
|
||||||
@@ -963,6 +970,7 @@ admin/views/instance.vue:
|
|||||||
instance-description: "インスタンスの紹介"
|
instance-description: "インスタンスの紹介"
|
||||||
host: "ホスト"
|
host: "ホスト"
|
||||||
banner-url: "バナー画像URL"
|
banner-url: "バナー画像URL"
|
||||||
|
error-image-url: "エラー画像URL"
|
||||||
languages: "インスタンスの対象言語"
|
languages: "インスタンスの対象言語"
|
||||||
languages-desc: "スペースで区切って複数設定できます。"
|
languages-desc: "スペースで区切って複数設定できます。"
|
||||||
maintainer-config: "管理者情報"
|
maintainer-config: "管理者情報"
|
||||||
@@ -1046,6 +1054,20 @@ admin/views/charts.vue:
|
|||||||
network-requests: "リクエスト"
|
network-requests: "リクエスト"
|
||||||
network-time: "応答時間"
|
network-time: "応答時間"
|
||||||
network-usage: "通信量"
|
network-usage: "通信量"
|
||||||
|
admin/views/drive.vue:
|
||||||
|
sort:
|
||||||
|
title: "ソート"
|
||||||
|
createdAtAsc: "アップロード日時が古い順"
|
||||||
|
createdAtDesc: "アップロード日時が新しい順"
|
||||||
|
sizeAsc: "サイズが小さい順"
|
||||||
|
sizeDesc: "サイズが大きい順"
|
||||||
|
origin:
|
||||||
|
title: "オリジン"
|
||||||
|
combined: "ローカル+リモート"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
delete: "削除"
|
||||||
|
deleted: "削除しました"
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
operation: "操作"
|
operation: "操作"
|
||||||
username-or-userid: "ユーザー名またはユーザーID"
|
username-or-userid: "ユーザー名またはユーザーID"
|
||||||
|
@@ -111,7 +111,6 @@ common:
|
|||||||
i-like-sushi: "I prefer sushi rather than pudding"
|
i-like-sushi: "I prefer sushi rather than pudding"
|
||||||
show-reversi-board-labels: "Show row and column labels in Reversi"
|
show-reversi-board-labels: "Show row and column labels in Reversi"
|
||||||
use-white-black-reversi-stones: "Use white-black stone in reversi"
|
use-white-black-reversi-stones: "Use white-black stone in reversi"
|
||||||
use-contrast-reversi-stones: "Make the stone color clear in reversi"
|
|
||||||
verified-user: "Verified account"
|
verified-user: "Verified account"
|
||||||
disable-animated-mfm: "Disable animated texts in a post"
|
disable-animated-mfm: "Disable animated texts in a post"
|
||||||
suggest-recent-hashtags: "Suggest recently used hashtags within the post composition area"
|
suggest-recent-hashtags: "Suggest recently used hashtags within the post composition area"
|
||||||
@@ -165,6 +164,7 @@ common:
|
|||||||
hashtags: "Hashtags"
|
hashtags: "Hashtags"
|
||||||
dev: "Failed to create the application. Please try again."
|
dev: "Failed to create the application. Please try again."
|
||||||
ai-chan-kawaii: "Ai-chan kawaii!"
|
ai-chan-kawaii: "Ai-chan kawaii!"
|
||||||
|
you: "You"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "Would you allow <i>{name}</i> to access your account?"
|
share-access: "Would you allow <i>{name}</i> to access your account?"
|
||||||
permission-ask: "This application requires the following permissions:"
|
permission-ask: "This application requires the following permissions:"
|
||||||
@@ -523,6 +523,8 @@ common/views/widgets/tips.vue:
|
|||||||
tips-line23: "Mayu is so cute with its eyebrows."
|
tips-line23: "Mayu is so cute with its eyebrows."
|
||||||
tips-line24: "Misskey has been running since 2014."
|
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"
|
tips-line25: "In a browser compatible with notification features, you can receive notifications in case Misskey is not open"
|
||||||
|
common/views/pages/404.vue:
|
||||||
|
page-not-found: "Page not found"
|
||||||
common/views/pages/follow.vue:
|
common/views/pages/follow.vue:
|
||||||
signed-in-as: "Signed in as {}"
|
signed-in-as: "Signed in as {}"
|
||||||
following: "Following"
|
following: "Following"
|
||||||
@@ -881,6 +883,11 @@ desktop/views/components/sub-note-content.vue:
|
|||||||
deleted: "This post has been deleted"
|
deleted: "This post has been deleted"
|
||||||
media-count: "{} media attached"
|
media-count: "{} media attached"
|
||||||
poll: "Poll"
|
poll: "Poll"
|
||||||
|
desktop/views/components/settings.tags.vue:
|
||||||
|
title: "Tags"
|
||||||
|
query: "Query (optional)"
|
||||||
|
add: "Add"
|
||||||
|
save: "Save"
|
||||||
desktop/views/components/taskmanager.vue:
|
desktop/views/components/taskmanager.vue:
|
||||||
title: "Task Manager"
|
title: "Task Manager"
|
||||||
desktop/views/components/timeline.vue:
|
desktop/views/components/timeline.vue:
|
||||||
@@ -963,6 +970,7 @@ admin/views/instance.vue:
|
|||||||
instance-description: "Instance description"
|
instance-description: "Instance description"
|
||||||
host: "Host"
|
host: "Host"
|
||||||
banner-url: "Banner image URL"
|
banner-url: "Banner image URL"
|
||||||
|
error-image-url: "Error image URL"
|
||||||
languages: "Language of this instance"
|
languages: "Language of this instance"
|
||||||
languages-desc: "You can add more than one, separated by spaces."
|
languages-desc: "You can add more than one, separated by spaces."
|
||||||
maintainer-config: "Administrator information"
|
maintainer-config: "Administrator information"
|
||||||
@@ -1046,6 +1054,20 @@ admin/views/charts.vue:
|
|||||||
network-requests: "Requests"
|
network-requests: "Requests"
|
||||||
network-time: "Response time"
|
network-time: "Response time"
|
||||||
network-usage: "Traffic"
|
network-usage: "Traffic"
|
||||||
|
admin/views/drive.vue:
|
||||||
|
sort:
|
||||||
|
title: "Sort"
|
||||||
|
createdAtAsc: "アップロード日時が古い順"
|
||||||
|
createdAtDesc: "アップロード日時が新しい順"
|
||||||
|
sizeAsc: "サイズが小さい順"
|
||||||
|
sizeDesc: "サイズが大きい順"
|
||||||
|
origin:
|
||||||
|
title: "Origin"
|
||||||
|
combined: "Local + Remote"
|
||||||
|
local: "Local"
|
||||||
|
remote: "Remote"
|
||||||
|
delete: "Delete"
|
||||||
|
deleted: "Deleted successfully"
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
operation: "Operations"
|
operation: "Operations"
|
||||||
username-or-userid: "Username or user ID"
|
username-or-userid: "Username or user ID"
|
||||||
|
@@ -111,7 +111,6 @@ common:
|
|||||||
i-like-sushi: "Prefiero sushi a pudín"
|
i-like-sushi: "Prefiero sushi a pudín"
|
||||||
show-reversi-board-labels: "Mostrar etiquetas de filas y columnas en Reversi"
|
show-reversi-board-labels: "Mostrar etiquetas de filas y columnas en Reversi"
|
||||||
use-white-black-reversi-stones: "リバーシに白黒の石を使う"
|
use-white-black-reversi-stones: "リバーシに白黒の石を使う"
|
||||||
use-contrast-reversi-stones: "Hacer el color de la piedra claro en Reversi"
|
|
||||||
verified-user: "Cuenta verificada"
|
verified-user: "Cuenta verificada"
|
||||||
disable-animated-mfm: "Desactivar texto animado en una publicación"
|
disable-animated-mfm: "Desactivar texto animado en una publicación"
|
||||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||||
@@ -165,6 +164,7 @@ common:
|
|||||||
hashtags: "Etiquetas"
|
hashtags: "Etiquetas"
|
||||||
dev: "アプリの作成に失敗しました。再度お試しください。"
|
dev: "アプリの作成に失敗しました。再度お試しください。"
|
||||||
ai-chan-kawaii: "藍ちゃかわいい"
|
ai-chan-kawaii: "藍ちゃかわいい"
|
||||||
|
you: "あなた"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "<i>{name}</i>があなたのアカウントにアクセスすることを許可しますか?"
|
share-access: "<i>{name}</i>があなたのアカウントにアクセスすることを許可しますか?"
|
||||||
permission-ask: "La aplicación requiere los siguientes permisos:"
|
permission-ask: "La aplicación requiere los siguientes permisos:"
|
||||||
@@ -523,6 +523,8 @@ common/views/widgets/tips.vue:
|
|||||||
tips-line23: "Mayu is tan bonito con sus cejas."
|
tips-line23: "Mayu is tan bonito con sus cejas."
|
||||||
tips-line24: "Misskey inició en 2014."
|
tips-line24: "Misskey inició en 2014."
|
||||||
tips-line25: "Puedes recibir notificaciones incluso si Misskey no está abierto en un navegador compatible."
|
tips-line25: "Puedes recibir notificaciones incluso si Misskey no está abierto en un navegador compatible."
|
||||||
|
common/views/pages/404.vue:
|
||||||
|
page-not-found: "ページが見つかりませんでした"
|
||||||
common/views/pages/follow.vue:
|
common/views/pages/follow.vue:
|
||||||
signed-in-as: "Autenticado como {}"
|
signed-in-as: "Autenticado como {}"
|
||||||
following: "Siguiendo"
|
following: "Siguiendo"
|
||||||
@@ -881,6 +883,11 @@ desktop/views/components/sub-note-content.vue:
|
|||||||
deleted: "この投稿は削除されました"
|
deleted: "この投稿は削除されました"
|
||||||
media-count: "{}つのメディア"
|
media-count: "{}つのメディア"
|
||||||
poll: "アンケート"
|
poll: "アンケート"
|
||||||
|
desktop/views/components/settings.tags.vue:
|
||||||
|
title: "タグ"
|
||||||
|
query: "クエリ (省略可)"
|
||||||
|
add: "追加"
|
||||||
|
save: "保存"
|
||||||
desktop/views/components/taskmanager.vue:
|
desktop/views/components/taskmanager.vue:
|
||||||
title: "タスクマネージャ"
|
title: "タスクマネージャ"
|
||||||
desktop/views/components/timeline.vue:
|
desktop/views/components/timeline.vue:
|
||||||
@@ -963,6 +970,7 @@ admin/views/instance.vue:
|
|||||||
instance-description: "インスタンスの紹介"
|
instance-description: "インスタンスの紹介"
|
||||||
host: "ホスト"
|
host: "ホスト"
|
||||||
banner-url: "バナー画像URL"
|
banner-url: "バナー画像URL"
|
||||||
|
error-image-url: "エラー画像URL"
|
||||||
languages: "インスタンスの対象言語"
|
languages: "インスタンスの対象言語"
|
||||||
languages-desc: "スペースで区切って複数設定できます。"
|
languages-desc: "スペースで区切って複数設定できます。"
|
||||||
maintainer-config: "管理者情報"
|
maintainer-config: "管理者情報"
|
||||||
@@ -1046,6 +1054,20 @@ admin/views/charts.vue:
|
|||||||
network-requests: "リクエスト"
|
network-requests: "リクエスト"
|
||||||
network-time: "応答時間"
|
network-time: "応答時間"
|
||||||
network-usage: "通信量"
|
network-usage: "通信量"
|
||||||
|
admin/views/drive.vue:
|
||||||
|
sort:
|
||||||
|
title: "ソート"
|
||||||
|
createdAtAsc: "アップロード日時が古い順"
|
||||||
|
createdAtDesc: "アップロード日時が新しい順"
|
||||||
|
sizeAsc: "サイズが小さい順"
|
||||||
|
sizeDesc: "サイズが大きい順"
|
||||||
|
origin:
|
||||||
|
title: "オリジン"
|
||||||
|
combined: "ローカル+リモート"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
delete: "削除"
|
||||||
|
deleted: "削除しました"
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
operation: "操作"
|
operation: "操作"
|
||||||
username-or-userid: "ユーザー名またはユーザーID"
|
username-or-userid: "ユーザー名またはユーザーID"
|
||||||
|
@@ -47,11 +47,11 @@ common:
|
|||||||
seconds_ago: "Il y a {} seconde·s"
|
seconds_ago: "Il y a {} seconde·s"
|
||||||
minutes_ago: "Il y a {} min"
|
minutes_ago: "Il y a {} min"
|
||||||
hours_ago: "Il y a {} h"
|
hours_ago: "Il y a {} h"
|
||||||
days_ago: "Il y a {} jours"
|
days_ago: "Il y a {} j"
|
||||||
weeks_ago: "Il y a {} semaines·s"
|
weeks_ago: "Il y a {} semaines"
|
||||||
months_ago: "Il y a {} mois"
|
months_ago: "Il y a {} mois"
|
||||||
years_ago: "Il y a {} an·s"
|
years_ago: "Il y a {} an·s"
|
||||||
month-and-day: "{day}/{month}"
|
month-and-day: "{day}-{month}"
|
||||||
trash: "Corbeille"
|
trash: "Corbeille"
|
||||||
drive: "Drive"
|
drive: "Drive"
|
||||||
messaging: "Conversations"
|
messaging: "Conversations"
|
||||||
@@ -111,7 +111,6 @@ common:
|
|||||||
i-like-sushi: "Je préfère les sushis plutôt que le pudding"
|
i-like-sushi: "Je préfère les sushis plutôt que le pudding"
|
||||||
show-reversi-board-labels: "Afficher les étiquettes des lignes et colonnes dans Reversi"
|
show-reversi-board-labels: "Afficher les étiquettes des lignes et colonnes dans Reversi"
|
||||||
use-white-black-reversi-stones: "Jouer avec des pions noirs et blancs sur Reversi"
|
use-white-black-reversi-stones: "Jouer avec des pions noirs et blancs sur Reversi"
|
||||||
use-contrast-reversi-stones: "Icône avec contraste sur Reversi"
|
|
||||||
verified-user: "Compte vérifié"
|
verified-user: "Compte vérifié"
|
||||||
disable-animated-mfm: "Désactiver les textes animés dans les publications"
|
disable-animated-mfm: "Désactiver les textes animés dans les publications"
|
||||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||||
@@ -165,6 +164,7 @@ common:
|
|||||||
hashtags: "Hashtags"
|
hashtags: "Hashtags"
|
||||||
dev: "Échec lors de la création de l’application. Veuillez réessayer."
|
dev: "Échec lors de la création de l’application. Veuillez réessayer."
|
||||||
ai-chan-kawaii: "Ai-Chan est mignonne !"
|
ai-chan-kawaii: "Ai-Chan est mignonne !"
|
||||||
|
you: "Vous"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "Désirez-vous autoriser <i>{name}</i> à avoir accès à votre compte ?"
|
share-access: "Désirez-vous autoriser <i>{name}</i> à avoir accès à votre compte ?"
|
||||||
permission-ask: "Cette application nécessite les autorisations suivantes :"
|
permission-ask: "Cette application nécessite les autorisations suivantes :"
|
||||||
@@ -297,8 +297,8 @@ common/views/components/theme.vue:
|
|||||||
common/views/components/cw-button.vue:
|
common/views/components/cw-button.vue:
|
||||||
hide: "Masquer"
|
hide: "Masquer"
|
||||||
show: "Voir plus"
|
show: "Voir plus"
|
||||||
chars: "{count}文字"
|
chars: "{count} caractères"
|
||||||
files: "{count}ファイル"
|
files: "{count} fichiers"
|
||||||
common/views/components/messaging.vue:
|
common/views/components/messaging.vue:
|
||||||
search-user: "Trouver un·e utilisateur·trice"
|
search-user: "Trouver un·e utilisateur·trice"
|
||||||
you: "Vous"
|
you: "Vous"
|
||||||
@@ -478,7 +478,7 @@ common/views/widgets/broadcast.vue:
|
|||||||
next: "Suivant"
|
next: "Suivant"
|
||||||
common/views/widgets/calendar.vue:
|
common/views/widgets/calendar.vue:
|
||||||
year: "Année {}"
|
year: "Année {}"
|
||||||
month: "Mois {}"
|
month: "{},"
|
||||||
day: "{}"
|
day: "{}"
|
||||||
today: "Aujourd’hui :"
|
today: "Aujourd’hui :"
|
||||||
this-month: "Ce mois-ci :"
|
this-month: "Ce mois-ci :"
|
||||||
@@ -515,7 +515,7 @@ common/views/widgets/tips.vue:
|
|||||||
tips-line10: "タイムマシンウィジェットを利用すると、簡単に過去のタイムラインに遡れます"
|
tips-line10: "タイムマシンウィジェットを利用すると、簡単に過去のタイムラインに遡れます"
|
||||||
tips-line11: "Vous pouvez épingler des notes sur votre page en cliquant sur « … »"
|
tips-line11: "Vous pouvez épingler des notes sur votre page en cliquant sur « … »"
|
||||||
tips-line13: "Tous les fichiers attachés à cette publication sont sauvegardés dans le Drive"
|
tips-line13: "Tous les fichiers attachés à cette publication sont sauvegardés dans le Drive"
|
||||||
tips-line14: "ホームのカスタマイズ中、ウィジェットを右クリックしてデザインを変更できます"
|
tips-line14: "Lorsque vous personnalisez la disposition de votre page d’accueil, vous pouvez effectuer un clique droit sur un widget pour changer son apparence."
|
||||||
tips-line17: "Vous pouvez mettre un texte en surbrillance en le mettant entre ** **"
|
tips-line17: "Vous pouvez mettre un texte en surbrillance en le mettant entre ** **"
|
||||||
tips-line19: "Plusieurs fenêtres peuvent être détachées en dehors du navigateur."
|
tips-line19: "Plusieurs fenêtres peuvent être détachées en dehors du navigateur."
|
||||||
tips-line20: "Pourcentage sur le widget calendrier qui indique le pourcentage de temps passé"
|
tips-line20: "Pourcentage sur le widget calendrier qui indique le pourcentage de temps passé"
|
||||||
@@ -523,6 +523,8 @@ common/views/widgets/tips.vue:
|
|||||||
tips-line23: "Mayu est mignonne avec ses sourcils."
|
tips-line23: "Mayu est mignonne avec ses sourcils."
|
||||||
tips-line24: "Misskey est fonctionnel depuis 2014"
|
tips-line24: "Misskey est fonctionnel depuis 2014"
|
||||||
tips-line25: "Vous pouvez recevoir les notifications de Misskey dans un navigateur web compatible"
|
tips-line25: "Vous pouvez recevoir les notifications de Misskey dans un navigateur web compatible"
|
||||||
|
common/views/pages/404.vue:
|
||||||
|
page-not-found: "La page demandée est introuvable !"
|
||||||
common/views/pages/follow.vue:
|
common/views/pages/follow.vue:
|
||||||
signed-in-as: "Connecté·e en tant que {}"
|
signed-in-as: "Connecté·e en tant que {}"
|
||||||
following: "Suit"
|
following: "Suit"
|
||||||
@@ -551,7 +553,7 @@ desktop/views/components/activity.vue:
|
|||||||
title: "Activité"
|
title: "Activité"
|
||||||
toggle: "Afficher les vues"
|
toggle: "Afficher les vues"
|
||||||
desktop/views/components/calendar.vue:
|
desktop/views/components/calendar.vue:
|
||||||
title: "{month} / {year}"
|
title: "{month} - {year}"
|
||||||
prev: "Mois précédent"
|
prev: "Mois précédent"
|
||||||
next: "Mois suivant"
|
next: "Mois suivant"
|
||||||
go: "Cliquez pour naviguer"
|
go: "Cliquez pour naviguer"
|
||||||
@@ -875,12 +877,17 @@ common/views/components/password-settings.vue:
|
|||||||
enter-new-password-again: "Entrez à nouveau le nouveau mot de passe"
|
enter-new-password-again: "Entrez à nouveau le nouveau mot de passe"
|
||||||
not-match: "Les nouveaux mots de passe ne sont pas identiques"
|
not-match: "Les nouveaux mots de passe ne sont pas identiques"
|
||||||
changed: "Mot de passe modifié avec succès"
|
changed: "Mot de passe modifié avec succès"
|
||||||
failed: "パスワード変更に失敗しました"
|
failed: "Échec lors de la modification du mot de passe"
|
||||||
desktop/views/components/sub-note-content.vue:
|
desktop/views/components/sub-note-content.vue:
|
||||||
private: "cette publication est privée"
|
private: "cette publication est privée"
|
||||||
deleted: "cette publication a été supprimée"
|
deleted: "cette publication a été supprimée"
|
||||||
media-count: "{} médias attachés"
|
media-count: "{} médias attachés"
|
||||||
poll: "Sondage"
|
poll: "Sondage"
|
||||||
|
desktop/views/components/settings.tags.vue:
|
||||||
|
title: "Étiquettes"
|
||||||
|
query: "Requête (optionnelle)"
|
||||||
|
add: "Ajouter"
|
||||||
|
save: "Enregistrer"
|
||||||
desktop/views/components/taskmanager.vue:
|
desktop/views/components/taskmanager.vue:
|
||||||
title: "Gestionnaire de tâches"
|
title: "Gestionnaire de tâches"
|
||||||
desktop/views/components/timeline.vue:
|
desktop/views/components/timeline.vue:
|
||||||
@@ -963,6 +970,7 @@ admin/views/instance.vue:
|
|||||||
instance-description: "Description de l’instance"
|
instance-description: "Description de l’instance"
|
||||||
host: "Hôte"
|
host: "Hôte"
|
||||||
banner-url: "Url de l’image de la bannière"
|
banner-url: "Url de l’image de la bannière"
|
||||||
|
error-image-url: "URL de l’image d’erreur"
|
||||||
languages: "Langue de l’instance"
|
languages: "Langue de l’instance"
|
||||||
languages-desc: "Vous pouvez en définir plus d’une, séparées par des espaces."
|
languages-desc: "Vous pouvez en définir plus d’une, séparées par des espaces."
|
||||||
maintainer-config: "Informations de l’administrateur"
|
maintainer-config: "Informations de l’administrateur"
|
||||||
@@ -1046,6 +1054,20 @@ admin/views/charts.vue:
|
|||||||
network-requests: "Requêtes"
|
network-requests: "Requêtes"
|
||||||
network-time: "Temps de réponse"
|
network-time: "Temps de réponse"
|
||||||
network-usage: "Traffic"
|
network-usage: "Traffic"
|
||||||
|
admin/views/drive.vue:
|
||||||
|
sort:
|
||||||
|
title: "Tri"
|
||||||
|
createdAtAsc: "アップロード日時が古い順"
|
||||||
|
createdAtDesc: "アップロード日時が新しい順"
|
||||||
|
sizeAsc: "Taille - Ascendant"
|
||||||
|
sizeDesc: "Taille - Volumineux en premier"
|
||||||
|
origin:
|
||||||
|
title: "Origine"
|
||||||
|
combined: "Locaux et distants combinés"
|
||||||
|
local: "Local"
|
||||||
|
remote: "Distant"
|
||||||
|
delete: "Supprimer"
|
||||||
|
deleted: "Supprimé"
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
operation: "Actions"
|
operation: "Actions"
|
||||||
username-or-userid: "Nom d’utilisateur·rice ou ID utilisateur"
|
username-or-userid: "Nom d’utilisateur·rice ou ID utilisateur"
|
||||||
@@ -1068,7 +1090,7 @@ admin/views/users.vue:
|
|||||||
createdAtAsc: "Date d’inscription (Ascendant)"
|
createdAtAsc: "Date d’inscription (Ascendant)"
|
||||||
createdAtDesc: "Date d’inscription (Descendant)"
|
createdAtDesc: "Date d’inscription (Descendant)"
|
||||||
updatedAtAsc: "Mis à jour récemment (Ascendant)"
|
updatedAtAsc: "Mis à jour récemment (Ascendant)"
|
||||||
updatedAtDesc: "更新日時が新しい順"
|
updatedAtDesc: "Mis à jour récemment (descendant)"
|
||||||
origin:
|
origin:
|
||||||
title: "Origine"
|
title: "Origine"
|
||||||
combined: "Locaux + distants"
|
combined: "Locaux + distants"
|
||||||
@@ -1181,7 +1203,7 @@ desktop/views/pages/user/user.header.vue:
|
|||||||
years-old: "{age} ans"
|
years-old: "{age} ans"
|
||||||
year: "/"
|
year: "/"
|
||||||
month: "/"
|
month: "/"
|
||||||
day: "/"
|
day: "-"
|
||||||
desktop/views/pages/user/user.timeline.vue:
|
desktop/views/pages/user/user.timeline.vue:
|
||||||
default: "Publications"
|
default: "Publications"
|
||||||
with-replies: "Publications et réponses"
|
with-replies: "Publications et réponses"
|
||||||
@@ -1341,7 +1363,7 @@ mobile/views/pages/welcome.vue:
|
|||||||
signup: "S'enregistrer"
|
signup: "S'enregistrer"
|
||||||
mobile/views/pages/widgets.vue:
|
mobile/views/pages/widgets.vue:
|
||||||
dashboard: "Tableau de bord"
|
dashboard: "Tableau de bord"
|
||||||
widgets-hints: "ウィジェットを追加/削除したり並べ替えたりできます。ウィジェットを移動するには「三」をドラッグします。ウィジェットを削除するには「x」をタップします。いくつかのウィジェットはタップすることで表示を変更できます。"
|
widgets-hints: "Vous pouvez ajouter, supprimer et réaranger les widgets. Faites glisser « 三 » pour déplacer le widget. Appuyez sur « x » pour supprimer le widget. Certains widgets peuvent changer d’apparence en cliquant dessus."
|
||||||
add-widget: "Ajouter"
|
add-widget: "Ajouter"
|
||||||
customization-tips: "Conseils de personnalisation"
|
customization-tips: "Conseils de personnalisation"
|
||||||
mobile/views/pages/widgets/activity.vue:
|
mobile/views/pages/widgets/activity.vue:
|
||||||
|
@@ -111,7 +111,6 @@ common:
|
|||||||
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
||||||
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
||||||
use-white-black-reversi-stones: "リバーシに白黒の石を使う"
|
use-white-black-reversi-stones: "リバーシに白黒の石を使う"
|
||||||
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
|
||||||
verified-user: "公式アカウント"
|
verified-user: "公式アカウント"
|
||||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||||
@@ -165,6 +164,7 @@ common:
|
|||||||
hashtags: "ハッシュタグ"
|
hashtags: "ハッシュタグ"
|
||||||
dev: "アプリの作成に失敗しました。再度お試しください。"
|
dev: "アプリの作成に失敗しました。再度お試しください。"
|
||||||
ai-chan-kawaii: "藍ちゃかわいい"
|
ai-chan-kawaii: "藍ちゃかわいい"
|
||||||
|
you: "あなた"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "<i>{name}</i>があなたのアカウントにアクセスすることを許可しますか?"
|
share-access: "<i>{name}</i>があなたのアカウントにアクセスすることを許可しますか?"
|
||||||
permission-ask: "このアプリは次の権限を要求しています:"
|
permission-ask: "このアプリは次の権限を要求しています:"
|
||||||
@@ -523,6 +523,8 @@ common/views/widgets/tips.vue:
|
|||||||
tips-line23: "まゆかわいいよまゆ"
|
tips-line23: "まゆかわいいよまゆ"
|
||||||
tips-line24: "Misskeyは2014年にサービスを開始しました"
|
tips-line24: "Misskeyは2014年にサービスを開始しました"
|
||||||
tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
|
tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
|
||||||
|
common/views/pages/404.vue:
|
||||||
|
page-not-found: "ページが見つかりませんでした"
|
||||||
common/views/pages/follow.vue:
|
common/views/pages/follow.vue:
|
||||||
signed-in-as: "{}としてサインイン中"
|
signed-in-as: "{}としてサインイン中"
|
||||||
following: "フォロー中"
|
following: "フォロー中"
|
||||||
@@ -881,6 +883,11 @@ desktop/views/components/sub-note-content.vue:
|
|||||||
deleted: "この投稿は削除されました"
|
deleted: "この投稿は削除されました"
|
||||||
media-count: "{}つのメディア"
|
media-count: "{}つのメディア"
|
||||||
poll: "アンケート"
|
poll: "アンケート"
|
||||||
|
desktop/views/components/settings.tags.vue:
|
||||||
|
title: "タグ"
|
||||||
|
query: "クエリ (省略可)"
|
||||||
|
add: "追加"
|
||||||
|
save: "保存"
|
||||||
desktop/views/components/taskmanager.vue:
|
desktop/views/components/taskmanager.vue:
|
||||||
title: "タスクマネージャ"
|
title: "タスクマネージャ"
|
||||||
desktop/views/components/timeline.vue:
|
desktop/views/components/timeline.vue:
|
||||||
@@ -963,6 +970,7 @@ admin/views/instance.vue:
|
|||||||
instance-description: "インスタンスの紹介"
|
instance-description: "インスタンスの紹介"
|
||||||
host: "ホスト"
|
host: "ホスト"
|
||||||
banner-url: "バナー画像URL"
|
banner-url: "バナー画像URL"
|
||||||
|
error-image-url: "エラー画像URL"
|
||||||
languages: "インスタンスの対象言語"
|
languages: "インスタンスの対象言語"
|
||||||
languages-desc: "スペースで区切って複数設定できます。"
|
languages-desc: "スペースで区切って複数設定できます。"
|
||||||
maintainer-config: "管理者情報"
|
maintainer-config: "管理者情報"
|
||||||
@@ -1046,6 +1054,20 @@ admin/views/charts.vue:
|
|||||||
network-requests: "リクエスト"
|
network-requests: "リクエスト"
|
||||||
network-time: "応答時間"
|
network-time: "応答時間"
|
||||||
network-usage: "通信量"
|
network-usage: "通信量"
|
||||||
|
admin/views/drive.vue:
|
||||||
|
sort:
|
||||||
|
title: "ソート"
|
||||||
|
createdAtAsc: "アップロード日時が古い順"
|
||||||
|
createdAtDesc: "アップロード日時が新しい順"
|
||||||
|
sizeAsc: "サイズが小さい順"
|
||||||
|
sizeDesc: "サイズが大きい順"
|
||||||
|
origin:
|
||||||
|
title: "オリジン"
|
||||||
|
combined: "ローカル+リモート"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
delete: "削除"
|
||||||
|
deleted: "削除しました"
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
operation: "操作"
|
operation: "操作"
|
||||||
username-or-userid: "ユーザー名またはユーザーID"
|
username-or-userid: "ユーザー名またはユーザーID"
|
||||||
|
@@ -119,7 +119,6 @@ common:
|
|||||||
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
||||||
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
||||||
use-white-black-reversi-stones: "リバーシに白黒の石を使う"
|
use-white-black-reversi-stones: "リバーシに白黒の石を使う"
|
||||||
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
|
||||||
verified-user: "公式アカウント"
|
verified-user: "公式アカウント"
|
||||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||||
@@ -179,6 +178,7 @@ common:
|
|||||||
|
|
||||||
dev: "アプリの作成に失敗しました。再度お試しください。"
|
dev: "アプリの作成に失敗しました。再度お試しください。"
|
||||||
ai-chan-kawaii: "藍ちゃかわいい"
|
ai-chan-kawaii: "藍ちゃかわいい"
|
||||||
|
you: "あなた"
|
||||||
|
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "<i>{name}</i>があなたのアカウントにアクセスすることを許可しますか?"
|
share-access: "<i>{name}</i>があなたのアカウントにアクセスすることを許可しますか?"
|
||||||
@@ -580,6 +580,9 @@ common/views/widgets/tips.vue:
|
|||||||
tips-line24: "Misskeyは2014年にサービスを開始しました"
|
tips-line24: "Misskeyは2014年にサービスを開始しました"
|
||||||
tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
|
tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
|
||||||
|
|
||||||
|
common/views/pages/404.vue:
|
||||||
|
page-not-found: "ページが見つかりませんでした"
|
||||||
|
|
||||||
common/views/pages/follow.vue:
|
common/views/pages/follow.vue:
|
||||||
signed-in-as: "{}としてサインイン中"
|
signed-in-as: "{}としてサインイン中"
|
||||||
following: "フォロー中"
|
following: "フォロー中"
|
||||||
@@ -1094,6 +1097,7 @@ admin/views/instance.vue:
|
|||||||
instance-description: "インスタンスの紹介"
|
instance-description: "インスタンスの紹介"
|
||||||
host: "ホスト"
|
host: "ホスト"
|
||||||
banner-url: "バナー画像URL"
|
banner-url: "バナー画像URL"
|
||||||
|
error-image-url: "エラー画像URL"
|
||||||
languages: "インスタンスの対象言語"
|
languages: "インスタンスの対象言語"
|
||||||
languages-desc: "スペースで区切って複数設定できます。"
|
languages-desc: "スペースで区切って複数設定できます。"
|
||||||
maintainer-config: "管理者情報"
|
maintainer-config: "管理者情報"
|
||||||
@@ -1179,6 +1183,21 @@ admin/views/charts.vue:
|
|||||||
network-time: "応答時間"
|
network-time: "応答時間"
|
||||||
network-usage: "通信量"
|
network-usage: "通信量"
|
||||||
|
|
||||||
|
admin/views/drive.vue:
|
||||||
|
sort:
|
||||||
|
title: "ソート"
|
||||||
|
createdAtAsc: "アップロード日時が古い順"
|
||||||
|
createdAtDesc: "アップロード日時が新しい順"
|
||||||
|
sizeAsc: "サイズが小さい順"
|
||||||
|
sizeDesc: "サイズが大きい順"
|
||||||
|
origin:
|
||||||
|
title: "オリジン"
|
||||||
|
combined: "ローカル+リモート"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
delete: "削除"
|
||||||
|
deleted: "削除しました"
|
||||||
|
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
operation: "操作"
|
operation: "操作"
|
||||||
username-or-userid: "ユーザー名またはユーザーID"
|
username-or-userid: "ユーザー名またはユーザーID"
|
||||||
|
@@ -111,7 +111,6 @@ common:
|
|||||||
i-like-sushi: "寿司(のほうがプリンよりむしろ)ウマい、タコ焼きはあらへんけど。"
|
i-like-sushi: "寿司(のほうがプリンよりむしろ)ウマい、タコ焼きはあらへんけど。"
|
||||||
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示や!"
|
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示や!"
|
||||||
use-white-black-reversi-stones: "リバーシに白黒の石を使う"
|
use-white-black-reversi-stones: "リバーシに白黒の石を使う"
|
||||||
use-contrast-reversi-stones: "リバーシのアイコンにコントラストをつけんで!"
|
|
||||||
verified-user: "アメちゃん付きアカウント"
|
verified-user: "アメちゃん付きアカウント"
|
||||||
disable-animated-mfm: "投稿内のちょろちょろ動いてんのを止める"
|
disable-animated-mfm: "投稿内のちょろちょろ動いてんのを止める"
|
||||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||||
@@ -165,6 +164,7 @@ common:
|
|||||||
hashtags: "ハッシュタグ"
|
hashtags: "ハッシュタグ"
|
||||||
dev: "アプリの作成あかんかったわ。もっぺんやってみて。"
|
dev: "アプリの作成あかんかったわ。もっぺんやってみて。"
|
||||||
ai-chan-kawaii: "藍ちゃめっさべっぴんさんや"
|
ai-chan-kawaii: "藍ちゃめっさべっぴんさんや"
|
||||||
|
you: "あなた"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "あんたのアカウントに<i>{name}</i>がアクセスしようとしてるで?ええか?"
|
share-access: "あんたのアカウントに<i>{name}</i>がアクセスしようとしてるで?ええか?"
|
||||||
permission-ask: "このアプリは次の権限を要求してんで:"
|
permission-ask: "このアプリは次の権限を要求してんで:"
|
||||||
@@ -523,6 +523,8 @@ common/views/widgets/tips.vue:
|
|||||||
tips-line23: "ウチのタコちゃんかわええやろ…今の突っ込むところや!"
|
tips-line23: "ウチのタコちゃんかわええやろ…今の突っ込むところや!"
|
||||||
tips-line24: "Misskeyは2014年にサービスを開始したんよ"
|
tips-line24: "Misskeyは2014年にサービスを開始したんよ"
|
||||||
tips-line25: "対応ブラウザやったらMisskeyを開いとらんでも通知を受け取れんで"
|
tips-line25: "対応ブラウザやったらMisskeyを開いとらんでも通知を受け取れんで"
|
||||||
|
common/views/pages/404.vue:
|
||||||
|
page-not-found: "ページが見つかりませんでした"
|
||||||
common/views/pages/follow.vue:
|
common/views/pages/follow.vue:
|
||||||
signed-in-as: "{}としてサインイン中"
|
signed-in-as: "{}としてサインイン中"
|
||||||
following: "フォローしとる"
|
following: "フォローしとる"
|
||||||
@@ -881,6 +883,11 @@ desktop/views/components/sub-note-content.vue:
|
|||||||
deleted: "この投稿なんか無くなってもうたわ"
|
deleted: "この投稿なんか無くなってもうたわ"
|
||||||
media-count: "{}つのメディア"
|
media-count: "{}つのメディア"
|
||||||
poll: "アンケート"
|
poll: "アンケート"
|
||||||
|
desktop/views/components/settings.tags.vue:
|
||||||
|
title: "タグ"
|
||||||
|
query: "クエリ (省略可)"
|
||||||
|
add: "追加"
|
||||||
|
save: "保存"
|
||||||
desktop/views/components/taskmanager.vue:
|
desktop/views/components/taskmanager.vue:
|
||||||
title: "タスクマネージャ"
|
title: "タスクマネージャ"
|
||||||
desktop/views/components/timeline.vue:
|
desktop/views/components/timeline.vue:
|
||||||
@@ -963,6 +970,7 @@ admin/views/instance.vue:
|
|||||||
instance-description: "インスタンスの紹介"
|
instance-description: "インスタンスの紹介"
|
||||||
host: "ホスト"
|
host: "ホスト"
|
||||||
banner-url: "バナー画像URL"
|
banner-url: "バナー画像URL"
|
||||||
|
error-image-url: "エラー画像URL"
|
||||||
languages: "インスタンスの対象言語"
|
languages: "インスタンスの対象言語"
|
||||||
languages-desc: "スペースで区切って複数設定できるで。"
|
languages-desc: "スペースで区切って複数設定できるで。"
|
||||||
maintainer-config: "管理者情報"
|
maintainer-config: "管理者情報"
|
||||||
@@ -1046,6 +1054,20 @@ admin/views/charts.vue:
|
|||||||
network-requests: "リクエスト"
|
network-requests: "リクエスト"
|
||||||
network-time: "応答時間"
|
network-time: "応答時間"
|
||||||
network-usage: "通信量"
|
network-usage: "通信量"
|
||||||
|
admin/views/drive.vue:
|
||||||
|
sort:
|
||||||
|
title: "ソート"
|
||||||
|
createdAtAsc: "アップロード日時が古い順"
|
||||||
|
createdAtDesc: "アップロード日時が新しい順"
|
||||||
|
sizeAsc: "サイズが小さい順"
|
||||||
|
sizeDesc: "サイズが大きい順"
|
||||||
|
origin:
|
||||||
|
title: "オリジン"
|
||||||
|
combined: "ローカル+リモート"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
delete: "削除"
|
||||||
|
deleted: "削除しました"
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
operation: "操作"
|
operation: "操作"
|
||||||
username-or-userid: "ユーザー名またはユーザーID"
|
username-or-userid: "ユーザー名またはユーザーID"
|
||||||
|
@@ -111,7 +111,6 @@ common:
|
|||||||
i-like-sushi: "저는 (푸딩보다 차라리) 초밥이 좋아요"
|
i-like-sushi: "저는 (푸딩보다 차라리) 초밥이 좋아요"
|
||||||
show-reversi-board-labels: "리버시 보드의 행과 열 레이블을 표시"
|
show-reversi-board-labels: "리버시 보드의 행과 열 레이블을 표시"
|
||||||
use-white-black-reversi-stones: "리버시에 흑백 돌을 사용"
|
use-white-black-reversi-stones: "리버시에 흑백 돌을 사용"
|
||||||
use-contrast-reversi-stones: "리버시 아이콘의 대비를 높이기"
|
|
||||||
verified-user: "공식 계정"
|
verified-user: "공식 계정"
|
||||||
disable-animated-mfm: "글의 문자 애니메이션을 비활성화"
|
disable-animated-mfm: "글의 문자 애니메이션을 비활성화"
|
||||||
suggest-recent-hashtags: "최근 해시태그를 글 작성란에 표시"
|
suggest-recent-hashtags: "최근 해시태그를 글 작성란에 표시"
|
||||||
@@ -165,6 +164,7 @@ common:
|
|||||||
hashtags: "해시태그"
|
hashtags: "해시태그"
|
||||||
dev: "앱을 만드는 데 실패했습니다. 다시 시도하시기 바랍니다."
|
dev: "앱을 만드는 데 실패했습니다. 다시 시도하시기 바랍니다."
|
||||||
ai-chan-kawaii: "아이쨩 귀여워"
|
ai-chan-kawaii: "아이쨩 귀여워"
|
||||||
|
you: "당신"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "<i>{name}</i>가 당신의 계정에 엑세스하도록 허용하시겠습니까?"
|
share-access: "<i>{name}</i>가 당신의 계정에 엑세스하도록 허용하시겠습니까?"
|
||||||
permission-ask: "이 앱은 다음의 권한을 요청합니다:"
|
permission-ask: "이 앱은 다음의 권한을 요청합니다:"
|
||||||
@@ -523,6 +523,8 @@ common/views/widgets/tips.vue:
|
|||||||
tips-line23: "마유 귀여워요 마유"
|
tips-line23: "마유 귀여워요 마유"
|
||||||
tips-line24: "Misskey는 2014년에 서비스를 시작했습니다"
|
tips-line24: "Misskey는 2014년에 서비스를 시작했습니다"
|
||||||
tips-line25: "대응하는 브라우저인 경우 Misskey를 열어놓지 않아도 알림을 받을 수 있습니다"
|
tips-line25: "대응하는 브라우저인 경우 Misskey를 열어놓지 않아도 알림을 받을 수 있습니다"
|
||||||
|
common/views/pages/404.vue:
|
||||||
|
page-not-found: "페이지를 찾을 수 없습니다"
|
||||||
common/views/pages/follow.vue:
|
common/views/pages/follow.vue:
|
||||||
signed-in-as: "{}으로 로그인"
|
signed-in-as: "{}으로 로그인"
|
||||||
following: "팔로우 중"
|
following: "팔로우 중"
|
||||||
@@ -881,6 +883,11 @@ desktop/views/components/sub-note-content.vue:
|
|||||||
deleted: "이 글은 삭제되었습니다"
|
deleted: "이 글은 삭제되었습니다"
|
||||||
media-count: "{}개의 미디어"
|
media-count: "{}개의 미디어"
|
||||||
poll: "투표"
|
poll: "투표"
|
||||||
|
desktop/views/components/settings.tags.vue:
|
||||||
|
title: "태그"
|
||||||
|
query: "쿼리 (생략 가능)"
|
||||||
|
add: "추가"
|
||||||
|
save: "저장"
|
||||||
desktop/views/components/taskmanager.vue:
|
desktop/views/components/taskmanager.vue:
|
||||||
title: "작업 관리자"
|
title: "작업 관리자"
|
||||||
desktop/views/components/timeline.vue:
|
desktop/views/components/timeline.vue:
|
||||||
@@ -963,6 +970,7 @@ admin/views/instance.vue:
|
|||||||
instance-description: "인스턴스의 소개"
|
instance-description: "인스턴스의 소개"
|
||||||
host: "관리자"
|
host: "관리자"
|
||||||
banner-url: "배너 이미지 URL"
|
banner-url: "배너 이미지 URL"
|
||||||
|
error-image-url: "오류 이미지 URL"
|
||||||
languages: "인스턴스의 대상 언어"
|
languages: "인스턴스의 대상 언어"
|
||||||
languages-desc: "공백으로 구분하여 여러 개 설정할 수 있습니다."
|
languages-desc: "공백으로 구분하여 여러 개 설정할 수 있습니다."
|
||||||
maintainer-config: "관리자 정보"
|
maintainer-config: "관리자 정보"
|
||||||
@@ -1046,6 +1054,20 @@ admin/views/charts.vue:
|
|||||||
network-requests: "요청"
|
network-requests: "요청"
|
||||||
network-time: "응답시간"
|
network-time: "응답시간"
|
||||||
network-usage: "통신량"
|
network-usage: "통신량"
|
||||||
|
admin/views/drive.vue:
|
||||||
|
sort:
|
||||||
|
title: "정렬"
|
||||||
|
createdAtAsc: "업로드 날짜 오랜 순"
|
||||||
|
createdAtDesc: "업로드 날짜 최신순"
|
||||||
|
sizeAsc: "크기가 작은 순"
|
||||||
|
sizeDesc: "크기가 큰 순"
|
||||||
|
origin:
|
||||||
|
title: "출처"
|
||||||
|
combined: "로컬 + 리모트"
|
||||||
|
local: "로컬"
|
||||||
|
remote: "리모트"
|
||||||
|
delete: "삭제"
|
||||||
|
deleted: "삭제하였습니다"
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
operation: "작업"
|
operation: "작업"
|
||||||
username-or-userid: "사용자명 혹은 사용자 ID"
|
username-or-userid: "사용자명 혹은 사용자 ID"
|
||||||
|
@@ -111,7 +111,6 @@ common:
|
|||||||
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
||||||
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
||||||
use-white-black-reversi-stones: "リバーシに白黒の石を使う"
|
use-white-black-reversi-stones: "リバーシに白黒の石を使う"
|
||||||
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
|
||||||
verified-user: "公式アカウント"
|
verified-user: "公式アカウント"
|
||||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||||
@@ -165,6 +164,7 @@ common:
|
|||||||
hashtags: "ハッシュタグ"
|
hashtags: "ハッシュタグ"
|
||||||
dev: "アプリの作成に失敗しました。再度お試しください。"
|
dev: "アプリの作成に失敗しました。再度お試しください。"
|
||||||
ai-chan-kawaii: "藍ちゃかわいい"
|
ai-chan-kawaii: "藍ちゃかわいい"
|
||||||
|
you: "あなた"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "<i>{name}</i>があなたのアカウントにアクセスすることを許可しますか?"
|
share-access: "<i>{name}</i>があなたのアカウントにアクセスすることを許可しますか?"
|
||||||
permission-ask: "このアプリは次の権限を要求しています:"
|
permission-ask: "このアプリは次の権限を要求しています:"
|
||||||
@@ -523,6 +523,8 @@ common/views/widgets/tips.vue:
|
|||||||
tips-line23: "まゆかわいいよまゆ"
|
tips-line23: "まゆかわいいよまゆ"
|
||||||
tips-line24: "Misskeyは2014年にサービスを開始しました"
|
tips-line24: "Misskeyは2014年にサービスを開始しました"
|
||||||
tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
|
tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
|
||||||
|
common/views/pages/404.vue:
|
||||||
|
page-not-found: "ページが見つかりませんでした"
|
||||||
common/views/pages/follow.vue:
|
common/views/pages/follow.vue:
|
||||||
signed-in-as: "{}としてサインイン中"
|
signed-in-as: "{}としてサインイン中"
|
||||||
following: "フォロー中"
|
following: "フォロー中"
|
||||||
@@ -881,6 +883,11 @@ desktop/views/components/sub-note-content.vue:
|
|||||||
deleted: "この投稿は削除されました"
|
deleted: "この投稿は削除されました"
|
||||||
media-count: "{}つのメディア"
|
media-count: "{}つのメディア"
|
||||||
poll: "Peilingen"
|
poll: "Peilingen"
|
||||||
|
desktop/views/components/settings.tags.vue:
|
||||||
|
title: "タグ"
|
||||||
|
query: "クエリ (省略可)"
|
||||||
|
add: "追加"
|
||||||
|
save: "保存"
|
||||||
desktop/views/components/taskmanager.vue:
|
desktop/views/components/taskmanager.vue:
|
||||||
title: "Taakbeheer"
|
title: "Taakbeheer"
|
||||||
desktop/views/components/timeline.vue:
|
desktop/views/components/timeline.vue:
|
||||||
@@ -963,6 +970,7 @@ admin/views/instance.vue:
|
|||||||
instance-description: "インスタンスの紹介"
|
instance-description: "インスタンスの紹介"
|
||||||
host: "ホスト"
|
host: "ホスト"
|
||||||
banner-url: "バナー画像URL"
|
banner-url: "バナー画像URL"
|
||||||
|
error-image-url: "エラー画像URL"
|
||||||
languages: "インスタンスの対象言語"
|
languages: "インスタンスの対象言語"
|
||||||
languages-desc: "スペースで区切って複数設定できます。"
|
languages-desc: "スペースで区切って複数設定できます。"
|
||||||
maintainer-config: "管理者情報"
|
maintainer-config: "管理者情報"
|
||||||
@@ -1046,6 +1054,20 @@ admin/views/charts.vue:
|
|||||||
network-requests: "リクエスト"
|
network-requests: "リクエスト"
|
||||||
network-time: "応答時間"
|
network-time: "応答時間"
|
||||||
network-usage: "通信量"
|
network-usage: "通信量"
|
||||||
|
admin/views/drive.vue:
|
||||||
|
sort:
|
||||||
|
title: "ソート"
|
||||||
|
createdAtAsc: "アップロード日時が古い順"
|
||||||
|
createdAtDesc: "アップロード日時が新しい順"
|
||||||
|
sizeAsc: "サイズが小さい順"
|
||||||
|
sizeDesc: "サイズが大きい順"
|
||||||
|
origin:
|
||||||
|
title: "オリジン"
|
||||||
|
combined: "ローカル+リモート"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
delete: "削除"
|
||||||
|
deleted: "削除しました"
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
operation: "操作"
|
operation: "操作"
|
||||||
username-or-userid: "ユーザー名またはユーザーID"
|
username-or-userid: "ユーザー名またはユーザーID"
|
||||||
|
@@ -111,7 +111,6 @@ common:
|
|||||||
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
||||||
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
||||||
use-white-black-reversi-stones: "リバーシに白黒の石を使う"
|
use-white-black-reversi-stones: "リバーシに白黒の石を使う"
|
||||||
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
|
||||||
verified-user: "公式アカウント"
|
verified-user: "公式アカウント"
|
||||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||||
@@ -165,6 +164,7 @@ common:
|
|||||||
hashtags: "ハッシュタグ"
|
hashtags: "ハッシュタグ"
|
||||||
dev: "アプリの作成に失敗しました。再度お試しください。"
|
dev: "アプリの作成に失敗しました。再度お試しください。"
|
||||||
ai-chan-kawaii: "藍ちゃかわいい"
|
ai-chan-kawaii: "藍ちゃかわいい"
|
||||||
|
you: "あなた"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "<i>{name}</i>があなたのアカウントにアクセスすることを許可しますか?"
|
share-access: "<i>{name}</i>があなたのアカウントにアクセスすることを許可しますか?"
|
||||||
permission-ask: "このアプリは次の権限を要求しています:"
|
permission-ask: "このアプリは次の権限を要求しています:"
|
||||||
@@ -523,6 +523,8 @@ common/views/widgets/tips.vue:
|
|||||||
tips-line23: "まゆかわいいよまゆ"
|
tips-line23: "まゆかわいいよまゆ"
|
||||||
tips-line24: "Misskeyは2014年にサービスを開始しました"
|
tips-line24: "Misskeyは2014年にサービスを開始しました"
|
||||||
tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
|
tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
|
||||||
|
common/views/pages/404.vue:
|
||||||
|
page-not-found: "ページが見つかりませんでした"
|
||||||
common/views/pages/follow.vue:
|
common/views/pages/follow.vue:
|
||||||
signed-in-as: "{}としてサインイン中"
|
signed-in-as: "{}としてサインイン中"
|
||||||
following: "フォロー中"
|
following: "フォロー中"
|
||||||
@@ -881,6 +883,11 @@ desktop/views/components/sub-note-content.vue:
|
|||||||
deleted: "この投稿は削除されました"
|
deleted: "この投稿は削除されました"
|
||||||
media-count: "{}つのメディア"
|
media-count: "{}つのメディア"
|
||||||
poll: "アンケート"
|
poll: "アンケート"
|
||||||
|
desktop/views/components/settings.tags.vue:
|
||||||
|
title: "タグ"
|
||||||
|
query: "クエリ (省略可)"
|
||||||
|
add: "追加"
|
||||||
|
save: "保存"
|
||||||
desktop/views/components/taskmanager.vue:
|
desktop/views/components/taskmanager.vue:
|
||||||
title: "タスクマネージャ"
|
title: "タスクマネージャ"
|
||||||
desktop/views/components/timeline.vue:
|
desktop/views/components/timeline.vue:
|
||||||
@@ -963,6 +970,7 @@ admin/views/instance.vue:
|
|||||||
instance-description: "インスタンスの紹介"
|
instance-description: "インスタンスの紹介"
|
||||||
host: "ホスト"
|
host: "ホスト"
|
||||||
banner-url: "バナー画像URL"
|
banner-url: "バナー画像URL"
|
||||||
|
error-image-url: "エラー画像URL"
|
||||||
languages: "インスタンスの対象言語"
|
languages: "インスタンスの対象言語"
|
||||||
languages-desc: "スペースで区切って複数設定できます。"
|
languages-desc: "スペースで区切って複数設定できます。"
|
||||||
maintainer-config: "管理者情報"
|
maintainer-config: "管理者情報"
|
||||||
@@ -1046,6 +1054,20 @@ admin/views/charts.vue:
|
|||||||
network-requests: "リクエスト"
|
network-requests: "リクエスト"
|
||||||
network-time: "応答時間"
|
network-time: "応答時間"
|
||||||
network-usage: "通信量"
|
network-usage: "通信量"
|
||||||
|
admin/views/drive.vue:
|
||||||
|
sort:
|
||||||
|
title: "ソート"
|
||||||
|
createdAtAsc: "アップロード日時が古い順"
|
||||||
|
createdAtDesc: "アップロード日時が新しい順"
|
||||||
|
sizeAsc: "サイズが小さい順"
|
||||||
|
sizeDesc: "サイズが大きい順"
|
||||||
|
origin:
|
||||||
|
title: "オリジン"
|
||||||
|
combined: "ローカル+リモート"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
delete: "削除"
|
||||||
|
deleted: "削除しました"
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
operation: "操作"
|
operation: "操作"
|
||||||
username-or-userid: "ユーザー名またはユーザーID"
|
username-or-userid: "ユーザー名またはユーザーID"
|
||||||
|
@@ -10,14 +10,14 @@ common:
|
|||||||
title: "Czym jest Misskey?"
|
title: "Czym jest Misskey?"
|
||||||
about: "Misskeyはオープンソースの<b>分散型マイクロブログSNS</b>です。リッチで高度にカスタマイズできるUI、投稿へのリアクション、ファイルを一元管理できるドライブなど、先進的な機能を揃えています。また、Fediverseと呼ばれるネットワークに接続できるため、他のSNSともやり取りできます。例えば、あなたが何か投稿すると、その投稿はMisskeyだけでなく他のSNSにも伝わります。ちょうどある惑星から他の惑星に電波を発信している様子をイメージしてください。"
|
about: "Misskeyはオープンソースの<b>分散型マイクロブログSNS</b>です。リッチで高度にカスタマイズできるUI、投稿へのリアクション、ファイルを一元管理できるドライブなど、先進的な機能を揃えています。また、Fediverseと呼ばれるネットワークに接続できるため、他のSNSともやり取りできます。例えば、あなたが何か投稿すると、その投稿はMisskeyだけでなく他のSNSにも伝わります。ちょうどある惑星から他の惑星に電波を発信している様子をイメージしてください。"
|
||||||
features: "特徴"
|
features: "特徴"
|
||||||
rich-contents: "投稿"
|
rich-contents: "Wpis"
|
||||||
rich-contents-desc: "自分の考え、話題の出来事、皆と共有したいことについて発信してください。必要であれば、様々な構文を使って投稿を装飾したり、好きな画像、動画などのファイルやアンケートを添付することもできます。"
|
rich-contents-desc: "Po prostu opublikuj swój pomysł, gorące tematy i wszystko, co chcesz udostępnić. Możesz ozdobić swoje słowa, dołączyć swoje ulubione zdjęcia, wysłać pliki, w tym filmy i utworzyć ankietę - to są rzeczy, które możesz zrobić w Misskey!"
|
||||||
reaction: "Reakcje"
|
reaction: "Reakcje"
|
||||||
reaction-desc: "あなたの気持ちを伝える最も簡単な方法です。Misskeyは、他のユーザーの投稿に様々なリアクションを付けることができます。いちどMisskeyのリアクション機能を体験してしまうと、もう「いいね」の概念しか存在しないSNSには戻れなくなるかもしれません。"
|
reaction-desc: "あなたの気持ちを伝える最も簡単な方法です。Misskeyは、他のユーザーの投稿に様々なリアクションを付けることができます。いちどMisskeyのリアクション機能を体験してしまうと、もう「いいね」の概念しか存在しないSNSには戻れなくなるかもしれません。"
|
||||||
ui: "Interfejs"
|
ui: "Interfejs"
|
||||||
ui-desc: "どのようなUIが使いやすいかは人それぞれです。だから、Misskeyは自由度の高いUIを持っています。レイアウトやデザインを調整したり、カスタマイズ可能な様々なウィジェットを配置したりして、自分だけのホームを作ってください。"
|
ui-desc: "どのようなUIが使いやすいかは人それぞれです。だから、Misskeyは自由度の高いUIを持っています。レイアウトやデザインを調整したり、カスタマイズ可能な様々なウィジェットを配置したりして、自分だけのホームを作ってください。"
|
||||||
drive: "Dysk"
|
drive: "Dysk"
|
||||||
drive-desc: "以前投稿したことのある画像をまた投稿したくなったことはありませんか?もしくは、アップロードしたファイルをフォルダ分けして整理したくなったことはありませんか?Misskeyの根幹に組み込まれたドライブ機能によってそれらが解決します。ファイルの共有も簡単です。"
|
drive-desc: "Chcesz opublikować zdjęcie, które już przesłałeś? Chcesz uporządkować, nazwać i utworzyć folder dla przesłanych plików? Dysk Misskey to najlepsze rozwiązanie dla Ciebie. Bardzo łatwo udostępniać swoje pliki online."
|
||||||
outro: "他にもMisskeyにしかない機能はまだまだあるので、ぜひあなた自身の目で確かめてください。Misskeyは分散型SNSなので、このインスタンスが気に入らなければ他のインスタンスを試すこともできます。それでは、GLHF!"
|
outro: "他にもMisskeyにしかない機能はまだまだあるので、ぜひあなた自身の目で確かめてください。Misskeyは分散型SNSなので、このインスタンスが気に入らなければ他のインスタンスを試すこともできます。それでは、GLHF!"
|
||||||
adblock:
|
adblock:
|
||||||
detected: "Spróbuj wyłączyć blokadę reklam."
|
detected: "Spróbuj wyłączyć blokadę reklam."
|
||||||
@@ -72,7 +72,7 @@ common:
|
|||||||
friday: "Piątek"
|
friday: "Piątek"
|
||||||
saturday: "Sobota"
|
saturday: "Sobota"
|
||||||
reactions:
|
reactions:
|
||||||
like: "いいね"
|
like: "Lubię"
|
||||||
love: "Kocham"
|
love: "Kocham"
|
||||||
laugh: "Śmieszne"
|
laugh: "Śmieszne"
|
||||||
hmm: "Hmm…?"
|
hmm: "Hmm…?"
|
||||||
@@ -111,22 +111,21 @@ common:
|
|||||||
i-like-sushi: "Wolę sushi od puddingu"
|
i-like-sushi: "Wolę sushi od puddingu"
|
||||||
show-reversi-board-labels: "Pokazuj podpisy wierszy i kolumn w Reversi"
|
show-reversi-board-labels: "Pokazuj podpisy wierszy i kolumn w Reversi"
|
||||||
use-white-black-reversi-stones: "リバーシに白黒の石を使う"
|
use-white-black-reversi-stones: "リバーシに白黒の石を使う"
|
||||||
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
verified-user: "Zweryfikowane konto"
|
||||||
verified-user: "公式アカウント"
|
|
||||||
disable-animated-mfm: "Wyłącz animowany tekst we wpisach"
|
disable-animated-mfm: "Wyłącz animowany tekst we wpisach"
|
||||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||||
always-show-nsfw: "常に閲覧注意のメディアを表示する"
|
always-show-nsfw: "Zawszę pokazuj zawartość NSFW"
|
||||||
always-mark-nsfw: "Zawsze oznaczaj posty z multimediami jako NSFW"
|
always-mark-nsfw: "Zawsze oznaczaj posty z multimediami jako NSFW"
|
||||||
show-full-acct: "ユーザー名のホストを省略しない"
|
show-full-acct: "ユーザー名のホストを省略しない"
|
||||||
show-via: "viaを表示する"
|
show-via: "viaを表示する"
|
||||||
reduce-motion: "UIの動きを減らす"
|
reduce-motion: "Zredukuj ruch w UI"
|
||||||
this-setting-is-this-device-only: "このデバイスのみ"
|
this-setting-is-this-device-only: "このデバイスのみ"
|
||||||
use-os-default-emojis: "Użyj domyślnych Emoji systemowych"
|
use-os-default-emojis: "Użyj domyślnych Emoji systemowych"
|
||||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||||
is-remote-user: "Informacje o użytkowniku są kopiowane."
|
is-remote-user: "Informacje o użytkowniku są kopiowane."
|
||||||
is-remote-post: "この投稿情報はコピーです。"
|
is-remote-post: "この投稿情報はコピーです。"
|
||||||
view-on-remote: "正確な情報を見る"
|
view-on-remote: "正確な情報を見る"
|
||||||
renoted-by: "{user}がRenote"
|
renoted-by: "{user} udostępnił(a)"
|
||||||
error:
|
error:
|
||||||
title: 'Coś poszło nie tak'
|
title: 'Coś poszło nie tak'
|
||||||
retry: 'Ponów próbę'
|
retry: 'Ponów próbę'
|
||||||
@@ -136,7 +135,7 @@ common:
|
|||||||
opponent-turn: "Kolej na przeciwnika"
|
opponent-turn: "Kolej na przeciwnika"
|
||||||
turn-of: "{name}のターンです"
|
turn-of: "{name}のターンです"
|
||||||
past-turn-of: "{name}のターン"
|
past-turn-of: "{name}のターン"
|
||||||
won: "{name}の勝ち"
|
won: "{name} wygrał(a)"
|
||||||
black: "Czarny"
|
black: "Czarny"
|
||||||
white: "Biały"
|
white: "Biały"
|
||||||
total: "Łącznie"
|
total: "Łącznie"
|
||||||
@@ -165,6 +164,7 @@ common:
|
|||||||
hashtags: "Hashtagi"
|
hashtags: "Hashtagi"
|
||||||
dev: "アプリの作成に失敗しました。再度お試しください。"
|
dev: "アプリの作成に失敗しました。再度お試しください。"
|
||||||
ai-chan-kawaii: "藍ちゃかわいい"
|
ai-chan-kawaii: "藍ちゃかわいい"
|
||||||
|
you: "Ty"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "<i>{name}</i>があなたのアカウントにアクセスすることを許可しますか?"
|
share-access: "<i>{name}</i>があなたのアカウントにアクセスすることを許可しますか?"
|
||||||
permission-ask: "Ta aplikacja wymaga następujących uprawnień:"
|
permission-ask: "Ta aplikacja wymaga następujących uprawnień:"
|
||||||
@@ -262,7 +262,7 @@ common/views/components/media-banner.vue:
|
|||||||
common/views/components/theme.vue:
|
common/views/components/theme.vue:
|
||||||
light-theme: "非ダークモード時に使用するテーマ"
|
light-theme: "非ダークモード時に使用するテーマ"
|
||||||
dark-theme: "ダークモード時に使用するテーマ"
|
dark-theme: "ダークモード時に使用するテーマ"
|
||||||
light-themes: "明るいテーマ"
|
light-themes: "Jasny Motyw"
|
||||||
dark-themes: "Ciemny motyw"
|
dark-themes: "Ciemny motyw"
|
||||||
install-a-theme: "Zainstaluj motyw"
|
install-a-theme: "Zainstaluj motyw"
|
||||||
theme-code: "Kod motywu"
|
theme-code: "Kod motywu"
|
||||||
@@ -277,28 +277,28 @@ common/views/components/theme.vue:
|
|||||||
base-theme-light: "Jasny"
|
base-theme-light: "Jasny"
|
||||||
base-theme-dark: "Ciemny"
|
base-theme-dark: "Ciemny"
|
||||||
theme-name: "Nazwa motywu"
|
theme-name: "Nazwa motywu"
|
||||||
preview-created-theme: "プレビュー"
|
preview-created-theme: "Pokaż podgląd"
|
||||||
invalid-theme: "テーマが正しくありません。"
|
invalid-theme: "テーマが正しくありません。"
|
||||||
already-installed: "既にそのテーマはインストールされています。"
|
already-installed: "Ten motyw jest już zainstalowany"
|
||||||
saved: "Zapisano"
|
saved: "Zapisano"
|
||||||
manage-themes: "Zarządzanie motywami"
|
manage-themes: "Zarządzanie motywami"
|
||||||
builtin-themes: "標準テーマ"
|
builtin-themes: "Standardowe motywy"
|
||||||
my-themes: "マイテーマ"
|
my-themes: "Moje motywy"
|
||||||
installed-themes: "インストールされたテーマ"
|
installed-themes: "Zainstalowane motywy"
|
||||||
select-theme: "テーマを選択してください"
|
select-theme: "テーマを選択してください"
|
||||||
uninstall: "アンインストール"
|
uninstall: "Odinstaluj"
|
||||||
uninstalled: "「{}」をアンインストールしました"
|
uninstalled: "\"{}\" został odinstalowany"
|
||||||
author: "Author"
|
author: "Author"
|
||||||
desc: "Opis"
|
desc: "Opis"
|
||||||
export: "エクスポート"
|
export: "エクスポート"
|
||||||
import: "インポート"
|
import: "Importuj"
|
||||||
import-by-code: "lub wklej kod"
|
import-by-code: "lub wklej kod"
|
||||||
theme-name-required: "テーマ名は必須です。"
|
theme-name-required: "Nazwa motywu jest obowiązkowa."
|
||||||
common/views/components/cw-button.vue:
|
common/views/components/cw-button.vue:
|
||||||
hide: "Ukryj"
|
hide: "Ukryj"
|
||||||
show: "Pokaż więcej"
|
show: "Pokaż więcej"
|
||||||
chars: "{count}文字"
|
chars: "{count} znaków"
|
||||||
files: "{count}ファイル"
|
files: "{count} plików"
|
||||||
common/views/components/messaging.vue:
|
common/views/components/messaging.vue:
|
||||||
search-user: "Znajdź użytkownika"
|
search-user: "Znajdź użytkownika"
|
||||||
you: "Ty"
|
you: "Ty"
|
||||||
@@ -353,15 +353,15 @@ common/views/components/poll-editor.vue:
|
|||||||
common/views/components/reaction-picker.vue:
|
common/views/components/reaction-picker.vue:
|
||||||
choose-reaction: "Wybierz reakcję"
|
choose-reaction: "Wybierz reakcję"
|
||||||
common/views/components/emoji-picker.vue:
|
common/views/components/emoji-picker.vue:
|
||||||
custom-emoji: "カスタム絵文字"
|
custom-emoji: "Niestandardowe Emoji"
|
||||||
people: "Ludzie"
|
people: "Ludzie"
|
||||||
animals-and-nature: "動物&自然"
|
animals-and-nature: "Zwierzęta i Natura"
|
||||||
food-and-drink: "食べ物&飲み物"
|
food-and-drink: "Żywność i napoje"
|
||||||
activity: "アクティビティ"
|
activity: "Aktywność"
|
||||||
travel-and-places: "場所"
|
travel-and-places: "Podróże i Miejsca"
|
||||||
objects: "物"
|
objects: "Rzeczy"
|
||||||
symbols: "記号"
|
symbols: "Symbole"
|
||||||
flags: "旗"
|
flags: "Flagi"
|
||||||
common/views/components/signin.vue:
|
common/views/components/signin.vue:
|
||||||
username: "Nazwa użytkownika"
|
username: "Nazwa użytkownika"
|
||||||
password: "Hasło"
|
password: "Hasło"
|
||||||
@@ -405,21 +405,21 @@ common/views/components/stream-indicator.vue:
|
|||||||
connected: "Połączono"
|
connected: "Połączono"
|
||||||
common/views/components/integration-settings.vue:
|
common/views/components/integration-settings.vue:
|
||||||
title: "サービス連携"
|
title: "サービス連携"
|
||||||
connect: "接続する"
|
connect: "Połącz"
|
||||||
disconnect: "切断する"
|
disconnect: "切断する"
|
||||||
connected-to: "次のアカウントに接続されています"
|
connected-to: "次のアカウントに接続されています"
|
||||||
common/views/components/github-setting.vue:
|
common/views/components/github-setting.vue:
|
||||||
description: "お使いのGitHubアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでGitHubアカウント情報が表示されるようになったり、GitHubを用いた便利なサインインを利用できるようになります。"
|
description: "お使いのGitHubアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでGitHubアカウント情報が表示されるようになったり、GitHubを用いた便利なサインインを利用できるようになります。"
|
||||||
connected-to: "次のGitHubアカウントに接続されています"
|
connected-to: "次のGitHubアカウントに接続されています"
|
||||||
detail: "詳細..."
|
detail: "Więcej..."
|
||||||
reconnect: "再接続する"
|
reconnect: "Połącz ponownie"
|
||||||
connect: "GitHubと接続する"
|
connect: "GitHubと接続する"
|
||||||
disconnect: "切断する"
|
disconnect: "切断する"
|
||||||
common/views/components/discord-setting.vue:
|
common/views/components/discord-setting.vue:
|
||||||
description: "お使いのDiscordアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでDiscordアカウント情報が表示されるようになったり、Discordを用いた便利なサインインを利用できるようになります。"
|
description: "お使いのDiscordアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでDiscordアカウント情報が表示されるようになったり、Discordを用いた便利なサインインを利用できるようになります。"
|
||||||
connected-to: "次のDiscordアカウントに接続されています"
|
connected-to: "次のDiscordアカウントに接続されています"
|
||||||
detail: "詳細..."
|
detail: "Szczegóły…"
|
||||||
reconnect: "再接続する"
|
reconnect: "Połącz ponownie"
|
||||||
connect: "Discordと接続する"
|
connect: "Discordと接続する"
|
||||||
disconnect: "切断する"
|
disconnect: "切断する"
|
||||||
common/views/components/uploader.vue:
|
common/views/components/uploader.vue:
|
||||||
@@ -436,15 +436,15 @@ common/views/components/visibility-chooser.vue:
|
|||||||
local-public: "公開 (ローカルのみ)"
|
local-public: "公開 (ローカルのみ)"
|
||||||
local-public-desc: "リモートへは公開しない"
|
local-public-desc: "リモートへは公開しない"
|
||||||
local-home: "ホーム (ローカルのみ)"
|
local-home: "ホーム (ローカルのみ)"
|
||||||
local-followers: "フォロワー (ローカルのみ)"
|
local-followers: "Dla śledzących (tylko lokalnie)"
|
||||||
common/views/components/trends.vue:
|
common/views/components/trends.vue:
|
||||||
count: "{}人が投稿"
|
count: "{}人が投稿"
|
||||||
empty: "トレンドなし"
|
empty: "トレンドなし"
|
||||||
common/views/components/language-settings.vue:
|
common/views/components/language-settings.vue:
|
||||||
title: "Język"
|
title: "Język"
|
||||||
pick-language: "言語を選択"
|
pick-language: "Wybierz język"
|
||||||
recommended: "推奨"
|
recommended: "Zalecane"
|
||||||
auto: "自動"
|
auto: "Automatyczny"
|
||||||
specify-language: "言語を指定"
|
specify-language: "言語を指定"
|
||||||
info: "Musisz odświeżyć stronę, aby zmiany zostały uwzględnione."
|
info: "Musisz odświeżyć stronę, aby zmiany zostały uwzględnione."
|
||||||
common/views/components/profile-editor.vue:
|
common/views/components/profile-editor.vue:
|
||||||
@@ -468,7 +468,7 @@ common/views/components/profile-editor.vue:
|
|||||||
uploading: "アップロード中"
|
uploading: "アップロード中"
|
||||||
upload-failed: "アップロードに失敗しました"
|
upload-failed: "アップロードに失敗しました"
|
||||||
email: "メール設定"
|
email: "メール設定"
|
||||||
email-address: "メールアドレス"
|
email-address: "Adres e-mail"
|
||||||
email-verified: "メールアドレスが確認されました"
|
email-verified: "メールアドレスが確認されました"
|
||||||
email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
|
email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
|
||||||
common/views/widgets/broadcast.vue:
|
common/views/widgets/broadcast.vue:
|
||||||
@@ -523,6 +523,8 @@ common/views/widgets/tips.vue:
|
|||||||
tips-line23: "まゆかわいいよまゆ"
|
tips-line23: "まゆかわいいよまゆ"
|
||||||
tips-line24: "Misskey zaczął działać w 2014."
|
tips-line24: "Misskey zaczął działać w 2014."
|
||||||
tips-line25: "Możesz otrzymywać powiadomienia nawet jeżeli Misskey nie jest otwarty w obsługiwanej przeglądarce."
|
tips-line25: "Możesz otrzymywać powiadomienia nawet jeżeli Misskey nie jest otwarty w obsługiwanej przeglądarce."
|
||||||
|
common/views/pages/404.vue:
|
||||||
|
page-not-found: "ページが見つかりませんでした"
|
||||||
common/views/pages/follow.vue:
|
common/views/pages/follow.vue:
|
||||||
signed-in-as: "Zalogowany jako {}"
|
signed-in-as: "Zalogowany jako {}"
|
||||||
following: "Śledzisz"
|
following: "Śledzisz"
|
||||||
@@ -556,7 +558,7 @@ desktop/views/components/calendar.vue:
|
|||||||
next: "Następny miesiąc"
|
next: "Następny miesiąc"
|
||||||
go: "Naciśnij, aby przejść"
|
go: "Naciśnij, aby przejść"
|
||||||
desktop/views/components/choose-file-from-drive-window.vue:
|
desktop/views/components/choose-file-from-drive-window.vue:
|
||||||
chosen-files: "{count}ファイル選択中"
|
chosen-files: "Wybrano {count} Plik(ów)"
|
||||||
upload: "Wyślij pliki z Twojego komputera"
|
upload: "Wyślij pliki z Twojego komputera"
|
||||||
cancel: "Anuluj"
|
cancel: "Anuluj"
|
||||||
ok: "OK"
|
ok: "OK"
|
||||||
@@ -574,7 +576,7 @@ desktop/views/components/drive-window.vue:
|
|||||||
desktop/views/components/drive.file.vue:
|
desktop/views/components/drive.file.vue:
|
||||||
avatar: "Awatar"
|
avatar: "Awatar"
|
||||||
banner: "Baner"
|
banner: "Baner"
|
||||||
nsfw: "閲覧注意"
|
nsfw: "NSFW"
|
||||||
contextmenu:
|
contextmenu:
|
||||||
rename: "Zmień nazwę"
|
rename: "Zmień nazwę"
|
||||||
mark-as-sensitive: "Oznacz jako zawartość wrażliwą"
|
mark-as-sensitive: "Oznacz jako zawartość wrażliwą"
|
||||||
@@ -656,13 +658,13 @@ desktop/views/components/note-detail.vue:
|
|||||||
private: "ten wpis jest prywatny"
|
private: "ten wpis jest prywatny"
|
||||||
deleted: "ten wpis został usunięty"
|
deleted: "ten wpis został usunięty"
|
||||||
location: "Informacje o lokalizacji"
|
location: "Informacje o lokalizacji"
|
||||||
renote: "Udostępnienie"
|
renote: "Udostępnij"
|
||||||
add-reaction: "Dodaj reakcję"
|
add-reaction: "Dodaj reakcję"
|
||||||
desktop/views/components/note.vue:
|
desktop/views/components/note.vue:
|
||||||
reply: "返信"
|
reply: "Odpowiedz"
|
||||||
renote: "Renote"
|
renote: "Udostępnij"
|
||||||
add-reaction: "リアクション"
|
add-reaction: "Dodaj reakcję"
|
||||||
detail: "詳細"
|
detail: "Szczegóły"
|
||||||
private: "この投稿は非公開です"
|
private: "この投稿は非公開です"
|
||||||
deleted: "この投稿は削除されました"
|
deleted: "この投稿は削除されました"
|
||||||
desktop/views/components/notes.vue:
|
desktop/views/components/notes.vue:
|
||||||
@@ -727,7 +729,7 @@ desktop/views/components/settings.vue:
|
|||||||
notification: "Powiadomienia"
|
notification: "Powiadomienia"
|
||||||
apps: "Aplikacje"
|
apps: "Aplikacje"
|
||||||
tags: "Hashtagi"
|
tags: "Hashtagi"
|
||||||
mute-and-block: "ミュート/ブロック"
|
mute-and-block: "Wycisz / Zablokuj"
|
||||||
blocking: "ブロック"
|
blocking: "ブロック"
|
||||||
security: "Bezpieczeństwo"
|
security: "Bezpieczeństwo"
|
||||||
signin: "Historia logowań"
|
signin: "Historia logowań"
|
||||||
@@ -741,9 +743,9 @@ desktop/views/components/settings.vue:
|
|||||||
fetch-on-scroll-desc: "Po przewinięciu na dół strony automatycznie zostaną załadowane nowe treści."
|
fetch-on-scroll-desc: "Po przewinięciu na dół strony automatycznie zostaną załadowane nowe treści."
|
||||||
note-visibility: "Widoczność wpisów"
|
note-visibility: "Widoczność wpisów"
|
||||||
default-note-visibility: "Domyślna widoczność"
|
default-note-visibility: "Domyślna widoczność"
|
||||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
remember-note-visibility: "Zapamiętaj widoczność wpisów"
|
||||||
web-search-engine: "ウェブ検索エンジン"
|
web-search-engine: "Wyszukiwarka internetowa"
|
||||||
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
|
web-search-engine-desc: "Np: https://www.google.com/?#q={{query}}"
|
||||||
auto-popout: "Automatycznie pojawiające się okna"
|
auto-popout: "Automatycznie pojawiające się okna"
|
||||||
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
||||||
advanced: "Ustawienia zaawansowane"
|
advanced: "Ustawienia zaawansowane"
|
||||||
@@ -751,36 +753,36 @@ desktop/views/components/settings.vue:
|
|||||||
api-via-stream-desc: "この設定をオンにすると、websocket接続を経由してAPIリクエストが行われます(パフォーマンス向上が期待できます)。オフにすると、ネイティブの fetch APIが利用されます。この設定はこのデバイスのみ有効です。"
|
api-via-stream-desc: "この設定をオンにすると、websocket接続を経由してAPIリクエストが行われます(パフォーマンス向上が期待できます)。オフにすると、ネイティブの fetch APIが利用されます。この設定はこのデバイスのみ有効です。"
|
||||||
deck-nav: "デッキ内ナビゲーション"
|
deck-nav: "デッキ内ナビゲーション"
|
||||||
deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
|
deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
|
||||||
deck-default: "デッキをデフォルトのUIにする"
|
deck-default: "Użyj Talię jako domyślne UI"
|
||||||
display: "Wygląd i wyświetlanie"
|
display: "Wygląd i wyświetlanie"
|
||||||
customize: "Dostosuj stronę główną"
|
customize: "Dostosuj stronę główną"
|
||||||
wallpaper: "壁紙"
|
wallpaper: "Tapeta"
|
||||||
choose-wallpaper: "Wybierz tło"
|
choose-wallpaper: "Wybierz tło"
|
||||||
delete-wallpaper: "Usuń tło"
|
delete-wallpaper: "Usuń tło"
|
||||||
dark-mode: "Tryb ciemny"
|
dark-mode: "Tryb ciemny"
|
||||||
use-shadow: "UIに影を使用"
|
use-shadow: "Użyj cieni w UI"
|
||||||
rounded-corners: "UIの角を丸める"
|
rounded-corners: "Zaokrąglaj rogi w UI"
|
||||||
circle-icons: "Używaj okrągłych ikon"
|
circle-icons: "Używaj okrągłych ikon"
|
||||||
contrasted-acct: "ユーザー名にコントラストを付ける"
|
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||||
post-form-on-timeline: "Wyświetlaj formularz tworzenia wpisu w górnej części osi czasu"
|
post-form-on-timeline: "Wyświetlaj formularz tworzenia wpisu w górnej części osi czasu"
|
||||||
show-clock-on-header: "右上に時計を表示する"
|
show-clock-on-header: "右上に時計を表示する"
|
||||||
show-reply-target: "Pokazuj cel odpowiedzi"
|
show-reply-target: "Pokazuj cel odpowiedzi"
|
||||||
timeline: "タイムライン"
|
timeline: "Oś czasu"
|
||||||
show-my-renotes: "Pokazuj moje udostępnienia na osi czasu"
|
show-my-renotes: "Pokazuj moje udostępnienia na osi czasu"
|
||||||
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
|
show-renoted-my-notes: "Pokazuj moje udostępnione wpisy na osi czasu"
|
||||||
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
|
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
|
||||||
show-maps: "Automatycznie pokazuj mapę"
|
show-maps: "Automatycznie pokazuj mapę"
|
||||||
remain-deleted-note: "削除された投稿を表示し続ける"
|
remain-deleted-note: "削除された投稿を表示し続ける"
|
||||||
deck-column-align: "デッキのカラムの配置"
|
deck-column-align: "デッキのカラムの配置"
|
||||||
deck-column-align-center: "中央"
|
deck-column-align-center: "中央"
|
||||||
deck-column-align-left: "左"
|
deck-column-align-left: "Lewo"
|
||||||
deck-column-align-flexible: "Elastyczne"
|
deck-column-align-flexible: "Elastyczne"
|
||||||
deck-column-width: "デッキのカラムの幅"
|
deck-column-width: "Szerokość kolumn w talii"
|
||||||
deck-column-width-narrow: "狭"
|
deck-column-width-narrow: "Wąska"
|
||||||
deck-column-width-narrower: "やや狭"
|
deck-column-width-narrower: "Trochę wąska"
|
||||||
deck-column-width-normal: "普通"
|
deck-column-width-normal: "Normalna"
|
||||||
deck-column-width-wider: "やや広"
|
deck-column-width-wider: "Trochę szeroka"
|
||||||
deck-column-width-wide: "広"
|
deck-column-width-wide: "Szeroka"
|
||||||
sound: "Dźwięk"
|
sound: "Dźwięk"
|
||||||
enable-sounds: "Włącz dźwięk"
|
enable-sounds: "Włącz dźwięk"
|
||||||
enable-sounds-desc: "Odtwarzaj dźwięk przy wstawianiu wpisów, wysyłaniu lub otrzymywaniu wiadomości. Opcja ta jest zapamiętywana przez przeglądarkę."
|
enable-sounds-desc: "Odtwarzaj dźwięk przy wstawianiu wpisów, wysyłaniu lub otrzymywaniu wiadomości. Opcja ta jest zapamiętywana przez przeglądarkę."
|
||||||
@@ -815,10 +817,10 @@ desktop/views/components/settings.vue:
|
|||||||
tools: "Narzędzia"
|
tools: "Narzędzia"
|
||||||
task-manager: "Menedżer zadań"
|
task-manager: "Menedżer zadań"
|
||||||
third-parties: "Autorzy trzeci"
|
third-parties: "Autorzy trzeci"
|
||||||
navbar-position: "ナビゲーションバーの位置"
|
navbar-position: "Pozycja paska nawigacji"
|
||||||
navbar-position-top: "上"
|
navbar-position-top: "Góra"
|
||||||
navbar-position-left: "左"
|
navbar-position-left: "Lewo"
|
||||||
navbar-position-right: "右"
|
navbar-position-right: "Prawo"
|
||||||
desktop/views/components/settings.2fa.vue:
|
desktop/views/components/settings.2fa.vue:
|
||||||
intro: "Jeżeli skonfigurujesz uwierzytelnianie dwuetapowe, aby zablokować się będziesz potrzebować (oprócz hasła) kodu ze skonfigurowanego urządzenia (np. smartfonu), co zwiększy bezpieczeństwo."
|
intro: "Jeżeli skonfigurujesz uwierzytelnianie dwuetapowe, aby zablokować się będziesz potrzebować (oprócz hasła) kodu ze skonfigurowanego urządzenia (np. smartfonu), co zwiększy bezpieczeństwo."
|
||||||
detail: "Zobacz szczegóły…"
|
detail: "Zobacz szczegóły…"
|
||||||
@@ -838,10 +840,10 @@ desktop/views/components/settings.2fa.vue:
|
|||||||
failed: "Nie udało się skonfigurować uwierzytelniania dwuetapowego, upewnij się że wprowadziłeś prawidłowy token."
|
failed: "Nie udało się skonfigurować uwierzytelniania dwuetapowego, upewnij się że wprowadziłeś prawidłowy token."
|
||||||
info: "Od teraz, wprowadzaj token wyświetlany na urządzeniu przy każdym logowaniu do Misskey."
|
info: "Od teraz, wprowadzaj token wyświetlany na urządzeniu przy każdym logowaniu do Misskey."
|
||||||
common/views/components/api-settings.vue:
|
common/views/components/api-settings.vue:
|
||||||
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
|
intro: "Aby uzyskać dostęp do API, ustaw ten token jako klucz 'i' parametrów żądań."
|
||||||
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
|
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
|
||||||
regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
|
regeneration-of-token: "W przypadku wycieku tokenu, możesz wygenerować nowy."
|
||||||
regenerate-token: "トークンを再生成"
|
regenerate-token: "Wygeneruj nowy token"
|
||||||
token: "Token:"
|
token: "Token:"
|
||||||
enter-password: "Wprowadź hasło"
|
enter-password: "Wprowadź hasło"
|
||||||
console:
|
console:
|
||||||
@@ -855,21 +857,21 @@ common/views/components/api-settings.vue:
|
|||||||
desktop/views/components/settings.apps.vue:
|
desktop/views/components/settings.apps.vue:
|
||||||
no-apps: "Brak zautoryzowanych aplikacji"
|
no-apps: "Brak zautoryzowanych aplikacji"
|
||||||
common/views/components/drive-settings.vue:
|
common/views/components/drive-settings.vue:
|
||||||
max: "容量"
|
max: "Max"
|
||||||
in-use: "使用中"
|
in-use: "użyto"
|
||||||
stats: "Statystyki"
|
stats: "Statystyki"
|
||||||
common/views/components/mute-and-block.vue:
|
common/views/components/mute-and-block.vue:
|
||||||
mute-and-block: "Wyczisz / Zablokuj"
|
mute-and-block: "Wycisz / Zablokuj"
|
||||||
mute: "Wycisz"
|
mute: "Wycisz"
|
||||||
block: "ブロック"
|
block: "Zablokuj"
|
||||||
no-muted-users: "Brak wyciszonych użytkowników"
|
no-muted-users: "Brak wyciszonych użytkowników"
|
||||||
no-blocked-users: "Brak zablokowanych użytkowników"
|
no-blocked-users: "Brak zablokowanych użytkowników"
|
||||||
word-mute: "Wyciszenie słowa"
|
word-mute: "Wyciszenie słowa"
|
||||||
muted-words: "ミュートされたキーワード"
|
muted-words: "Wyciszone słowa kluczowe"
|
||||||
muted-words-description: "スペースで区切るとAND指定になり、改行で区切るとOR指定になります"
|
muted-words-description: "スペースで区切るとAND指定になり、改行で区切るとOR指定になります"
|
||||||
save: "Zapisz"
|
save: "Zapisz"
|
||||||
common/views/components/password-settings.vue:
|
common/views/components/password-settings.vue:
|
||||||
reset: "パスワードを変更する"
|
reset: "Zmień hasło"
|
||||||
enter-current-password: "現在のパスワードを入力してください"
|
enter-current-password: "現在のパスワードを入力してください"
|
||||||
enter-new-password: "新しいパスワードを入力してください"
|
enter-new-password: "新しいパスワードを入力してください"
|
||||||
enter-new-password-again: "もう一度新しいパスワードを入力してください"
|
enter-new-password-again: "もう一度新しいパスワードを入力してください"
|
||||||
@@ -881,6 +883,11 @@ desktop/views/components/sub-note-content.vue:
|
|||||||
deleted: "ten wpis został usunięty"
|
deleted: "ten wpis został usunięty"
|
||||||
media-count: "{}zawartości multimedialnej"
|
media-count: "{}zawartości multimedialnej"
|
||||||
poll: "Ankieta"
|
poll: "Ankieta"
|
||||||
|
desktop/views/components/settings.tags.vue:
|
||||||
|
title: "Tagi"
|
||||||
|
query: "クエリ (省略可)"
|
||||||
|
add: "Dodaj"
|
||||||
|
save: "Zapisz"
|
||||||
desktop/views/components/taskmanager.vue:
|
desktop/views/components/taskmanager.vue:
|
||||||
title: "Menedżer zadań"
|
title: "Menedżer zadań"
|
||||||
desktop/views/components/timeline.vue:
|
desktop/views/components/timeline.vue:
|
||||||
@@ -892,8 +899,8 @@ desktop/views/components/timeline.vue:
|
|||||||
messages: "Wiadomości"
|
messages: "Wiadomości"
|
||||||
list: "Listy"
|
list: "Listy"
|
||||||
hashtag: "Hashtag"
|
hashtag: "Hashtag"
|
||||||
add-tag-timeline: "ハッシュタグを追加"
|
add-tag-timeline: "Dodaj hashtag"
|
||||||
add-list: "リストを追加"
|
add-list: "Dodaj listę"
|
||||||
list-name: "リスト名"
|
list-name: "リスト名"
|
||||||
desktop/views/components/ui.header.vue:
|
desktop/views/components/ui.header.vue:
|
||||||
welcome-back: "Witaj ponownie,"
|
welcome-back: "Witaj ponownie,"
|
||||||
@@ -952,7 +959,7 @@ admin/views/index.vue:
|
|||||||
admin/views/dashboard.vue:
|
admin/views/dashboard.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
accounts: "Konta"
|
accounts: "Konta"
|
||||||
notes: "投稿"
|
notes: "Wpisy"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
instances: "インスタンス"
|
instances: "インスタンス"
|
||||||
this-instance: "このインスタンス"
|
this-instance: "このインスタンス"
|
||||||
@@ -963,6 +970,7 @@ admin/views/instance.vue:
|
|||||||
instance-description: "インスタンスの紹介"
|
instance-description: "インスタンスの紹介"
|
||||||
host: "ホスト"
|
host: "ホスト"
|
||||||
banner-url: "バナー画像URL"
|
banner-url: "バナー画像URL"
|
||||||
|
error-image-url: "エラー画像URL"
|
||||||
languages: "インスタンスの対象言語"
|
languages: "インスタンスの対象言語"
|
||||||
languages-desc: "スペースで区切って複数設定できます。"
|
languages-desc: "スペースで区切って複数設定できます。"
|
||||||
maintainer-config: "管理者情報"
|
maintainer-config: "管理者情報"
|
||||||
@@ -1008,7 +1016,7 @@ admin/views/instance.vue:
|
|||||||
user-recommendation-config: "Polecani użytkownicy"
|
user-recommendation-config: "Polecani użytkownicy"
|
||||||
enable-external-user-recommendation: "外部ユーザーレコメンデーションを有効にする"
|
enable-external-user-recommendation: "外部ユーザーレコメンデーションを有効にする"
|
||||||
external-user-recommendation-engine: "Silnik"
|
external-user-recommendation-engine: "Silnik"
|
||||||
external-user-recommendation-engine-desc: "例: https://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}}"
|
external-user-recommendation-engine-desc: "Np: https://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}}"
|
||||||
external-user-recommendation-timeout: "タイムアウト"
|
external-user-recommendation-timeout: "タイムアウト"
|
||||||
external-user-recommendation-timeout-desc: "ミリ秒単位 (例: 300000)"
|
external-user-recommendation-timeout-desc: "ミリ秒単位 (例: 300000)"
|
||||||
email-config: "メールサーバーの設定"
|
email-config: "メールサーバーの設定"
|
||||||
@@ -1046,6 +1054,20 @@ admin/views/charts.vue:
|
|||||||
network-requests: "Żądania"
|
network-requests: "Żądania"
|
||||||
network-time: "Czas reakcji"
|
network-time: "Czas reakcji"
|
||||||
network-usage: "通信量"
|
network-usage: "通信量"
|
||||||
|
admin/views/drive.vue:
|
||||||
|
sort:
|
||||||
|
title: "ソート"
|
||||||
|
createdAtAsc: "アップロード日時が古い順"
|
||||||
|
createdAtDesc: "アップロード日時が新しい順"
|
||||||
|
sizeAsc: "サイズが小さい順"
|
||||||
|
sizeDesc: "サイズが大きい順"
|
||||||
|
origin:
|
||||||
|
title: "Źródło"
|
||||||
|
combined: "ローカル+リモート"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
delete: "Usuń"
|
||||||
|
deleted: "削除しました"
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
operation: "操作"
|
operation: "操作"
|
||||||
username-or-userid: "ユーザー名またはユーザーID"
|
username-or-userid: "ユーザー名またはユーザーID"
|
||||||
@@ -1079,17 +1101,17 @@ admin/views/users.vue:
|
|||||||
admin/views/moderators.vue:
|
admin/views/moderators.vue:
|
||||||
add-moderator:
|
add-moderator:
|
||||||
title: "モデレーターの登録"
|
title: "モデレーターの登録"
|
||||||
add: "登録"
|
add: "Zarejestruj się"
|
||||||
added: "モデレーターを登録しました"
|
added: "モデレーターを登録しました"
|
||||||
admin/views/emoji.vue:
|
admin/views/emoji.vue:
|
||||||
add-emoji:
|
add-emoji:
|
||||||
title: "絵文字の登録"
|
title: "絵文字の登録"
|
||||||
name: "絵文字名"
|
name: "Nazwa Emoji"
|
||||||
name-desc: "a~z 0~9 _ の文字が使えます。"
|
name-desc: "a~z 0~9 _ の文字が使えます。"
|
||||||
aliases: "エイリアス"
|
aliases: "Aliasy"
|
||||||
aliases-desc: "スペースで区切って複数設定できます。"
|
aliases-desc: "スペースで区切って複数設定できます。"
|
||||||
url: "絵文字画像URL"
|
url: "絵文字画像URL"
|
||||||
add: "追加"
|
add: "Dodaj"
|
||||||
info: "50KB以下のPNG画像をおすすめします。"
|
info: "50KB以下のPNG画像をおすすめします。"
|
||||||
added: "絵文字を登録しました"
|
added: "絵文字を登録しました"
|
||||||
emojis:
|
emojis:
|
||||||
@@ -1229,14 +1251,14 @@ mobile/views/components/drive-file-chooser.vue:
|
|||||||
mobile/views/components/drive-folder-chooser.vue:
|
mobile/views/components/drive-folder-chooser.vue:
|
||||||
select-folder: "Wybierz katalog"
|
select-folder: "Wybierz katalog"
|
||||||
mobile/views/components/drive.file.vue:
|
mobile/views/components/drive.file.vue:
|
||||||
nsfw: "閲覧注意"
|
nsfw: "NSFW"
|
||||||
mobile/views/components/drive.file-detail.vue:
|
mobile/views/components/drive.file-detail.vue:
|
||||||
download: "Pobierz"
|
download: "Pobierz"
|
||||||
rename: "Zmień nazwę"
|
rename: "Zmień nazwę"
|
||||||
move: "Przenieś"
|
move: "Przenieś"
|
||||||
hash: "Hash (md5)"
|
hash: "Hash (md5)"
|
||||||
exif: "EXIF"
|
exif: "EXIF"
|
||||||
nsfw: "閲覧注意"
|
nsfw: "NSFW"
|
||||||
mark-as-sensitive: "閲覧注意に設定"
|
mark-as-sensitive: "閲覧注意に設定"
|
||||||
unmark-as-sensitive: "閲覧注意を解除"
|
unmark-as-sensitive: "閲覧注意を解除"
|
||||||
mobile/views/components/media-image.vue:
|
mobile/views/components/media-image.vue:
|
||||||
@@ -1376,7 +1398,7 @@ mobile/views/pages/settings.vue:
|
|||||||
timeline: "Oś czasu"
|
timeline: "Oś czasu"
|
||||||
show-reply-target: "Pokazuj cel odpowiedzi"
|
show-reply-target: "Pokazuj cel odpowiedzi"
|
||||||
show-my-renotes: "Pokazuj moje udostępnienia"
|
show-my-renotes: "Pokazuj moje udostępnienia"
|
||||||
show-renoted-my-notes: "自分の投稿のRenoteを表示する"
|
show-renoted-my-notes: "Pokazuj moje udostępnione wpisy"
|
||||||
show-local-renotes: "ローカルの投稿のRenoteを表示する"
|
show-local-renotes: "ローカルの投稿のRenoteを表示する"
|
||||||
post-style: "Styl wpisów"
|
post-style: "Styl wpisów"
|
||||||
post-style-standard: "Standardowy"
|
post-style-standard: "Standardowy"
|
||||||
@@ -1389,9 +1411,9 @@ mobile/views/pages/settings.vue:
|
|||||||
fetch-on-scroll: "Automatycznie ładuj po przeciągnięciu w dół"
|
fetch-on-scroll: "Automatycznie ładuj po przeciągnięciu w dół"
|
||||||
note-visibility: "Widoczność wpisów"
|
note-visibility: "Widoczność wpisów"
|
||||||
default-note-visibility: "Domyślna widoczność"
|
default-note-visibility: "Domyślna widoczność"
|
||||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
remember-note-visibility: "Zapamiętaj widoczność wpisów"
|
||||||
web-search-engine: "ウェブ検索エンジン"
|
web-search-engine: "Wyszukiwarka internetowa"
|
||||||
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
|
web-search-engine-desc: "Np: https://www.google.com/?#q={{query}}"
|
||||||
disable-via-mobile: "Nie oznaczaj wpisów jako „wysłane z telefonu”"
|
disable-via-mobile: "Nie oznaczaj wpisów jako „wysłane z telefonu”"
|
||||||
load-raw-images: "Wyświetlaj załączone zdjęcia w wysokiej jakości"
|
load-raw-images: "Wyświetlaj załączone zdjęcia w wysokiej jakości"
|
||||||
load-remote-media: "Wyświetlaj zawartość multimedialną ze zdalnych serwerów"
|
load-remote-media: "Wyświetlaj zawartość multimedialną ze zdalnych serwerów"
|
||||||
@@ -1424,7 +1446,7 @@ mobile/views/pages/user.vue:
|
|||||||
block: "Zablokuj"
|
block: "Zablokuj"
|
||||||
unblock: "Odblokuj"
|
unblock: "Odblokuj"
|
||||||
years-old: "{age} lat"
|
years-old: "{age} lat"
|
||||||
push-to-list: "リストに追加"
|
push-to-list: "Dodaj do listy"
|
||||||
select-list: "Wybierz listę"
|
select-list: "Wybierz listę"
|
||||||
list-pushed: "{user}を{list}に追加しました"
|
list-pushed: "{user}を{list}に追加しました"
|
||||||
mobile/views/pages/user/home.vue:
|
mobile/views/pages/user/home.vue:
|
||||||
@@ -1445,22 +1467,22 @@ mobile/views/pages/user/home.notes.vue:
|
|||||||
mobile/views/pages/user/home.photos.vue:
|
mobile/views/pages/user/home.photos.vue:
|
||||||
no-photos: "Brak zdjęć"
|
no-photos: "Brak zdjęć"
|
||||||
deck:
|
deck:
|
||||||
widgets: "ウィジェット"
|
widgets: "Widżety"
|
||||||
home: "ホーム"
|
home: "Strona główna"
|
||||||
local: "ローカル"
|
local: "Lokalne"
|
||||||
hybrid: "ソーシャル"
|
hybrid: "Społeczność"
|
||||||
hashtag: "Hashtag"
|
hashtag: "Hashtag"
|
||||||
global: "グローバル"
|
global: "Globalne"
|
||||||
mentions: "Wspomnienia"
|
mentions: "Wspomnienia"
|
||||||
direct: "ダイレクト投稿"
|
direct: "Bezpośrednie wpisy"
|
||||||
notifications: "通知"
|
notifications: "Powiadomienia"
|
||||||
list: "リスト"
|
list: "Listy"
|
||||||
swap-left: "左に移動"
|
swap-left: "Przesuń w lewo"
|
||||||
swap-right: "右に移動"
|
swap-right: "Przesuń w prawo"
|
||||||
swap-up: "上に移動"
|
swap-up: "Przenieś w górę"
|
||||||
swap-down: "下に移動"
|
swap-down: "下に移動"
|
||||||
remove: "カラムを削除"
|
remove: "Usuń"
|
||||||
add-column: "カラムを追加"
|
add-column: "Dodaj kolumnę"
|
||||||
rename: "Zmień nazwę"
|
rename: "Zmień nazwę"
|
||||||
stack-left: "Przypnij do lewej"
|
stack-left: "Przypnij do lewej"
|
||||||
pop-right: "右に出す"
|
pop-right: "右に出す"
|
||||||
@@ -1470,8 +1492,8 @@ deck/deck.tl-column.vue:
|
|||||||
edit: "Opcje"
|
edit: "Opcje"
|
||||||
deck/deck.user-column.vue:
|
deck/deck.user-column.vue:
|
||||||
posts: "Wpisy"
|
posts: "Wpisy"
|
||||||
following: "フォロー"
|
following: "Śledzeni"
|
||||||
followers: "フォロワー"
|
followers: "Śledzący"
|
||||||
images: "Zdjęcia"
|
images: "Zdjęcia"
|
||||||
activity: "Aktywność"
|
activity: "Aktywność"
|
||||||
timeline: "Oś czasu"
|
timeline: "Oś czasu"
|
||||||
|
@@ -111,7 +111,6 @@ common:
|
|||||||
i-like-sushi: "Eu prefiro sushi a pudim"
|
i-like-sushi: "Eu prefiro sushi a pudim"
|
||||||
show-reversi-board-labels: "Mostrar etiquetas de colunas e linhas no Reversi"
|
show-reversi-board-labels: "Mostrar etiquetas de colunas e linhas no Reversi"
|
||||||
use-white-black-reversi-stones: "リバーシに白黒の石を使う"
|
use-white-black-reversi-stones: "リバーシに白黒の石を使う"
|
||||||
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
|
||||||
verified-user: "Conta verificada"
|
verified-user: "Conta verificada"
|
||||||
disable-animated-mfm: "Desativar texto animado nas publicações"
|
disable-animated-mfm: "Desativar texto animado nas publicações"
|
||||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||||
@@ -165,6 +164,7 @@ common:
|
|||||||
hashtags: "Hashtags"
|
hashtags: "Hashtags"
|
||||||
dev: "アプリの作成に失敗しました。再度お試しください。"
|
dev: "アプリの作成に失敗しました。再度お試しください。"
|
||||||
ai-chan-kawaii: "藍ちゃかわいい"
|
ai-chan-kawaii: "藍ちゃかわいい"
|
||||||
|
you: "あなた"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "<i>{name}</i>があなたのアカウントにアクセスすることを許可しますか?"
|
share-access: "<i>{name}</i>があなたのアカウントにアクセスすることを許可しますか?"
|
||||||
permission-ask: "Este aplicativo precisa das seguintes permissões:"
|
permission-ask: "Este aplicativo precisa das seguintes permissões:"
|
||||||
@@ -523,6 +523,8 @@ common/views/widgets/tips.vue:
|
|||||||
tips-line23: "まゆかわいいよまゆ"
|
tips-line23: "まゆかわいいよまゆ"
|
||||||
tips-line24: "Misskeyは2014年にサービスを開始しました"
|
tips-line24: "Misskeyは2014年にサービスを開始しました"
|
||||||
tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
|
tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
|
||||||
|
common/views/pages/404.vue:
|
||||||
|
page-not-found: "ページが見つかりませんでした"
|
||||||
common/views/pages/follow.vue:
|
common/views/pages/follow.vue:
|
||||||
signed-in-as: "{}としてサインイン中"
|
signed-in-as: "{}としてサインイン中"
|
||||||
following: "フォロー中"
|
following: "フォロー中"
|
||||||
@@ -881,6 +883,11 @@ desktop/views/components/sub-note-content.vue:
|
|||||||
deleted: "この投稿は削除されました"
|
deleted: "この投稿は削除されました"
|
||||||
media-count: "{}つのメディア"
|
media-count: "{}つのメディア"
|
||||||
poll: "アンケート"
|
poll: "アンケート"
|
||||||
|
desktop/views/components/settings.tags.vue:
|
||||||
|
title: "タグ"
|
||||||
|
query: "クエリ (省略可)"
|
||||||
|
add: "追加"
|
||||||
|
save: "保存"
|
||||||
desktop/views/components/taskmanager.vue:
|
desktop/views/components/taskmanager.vue:
|
||||||
title: "タスクマネージャ"
|
title: "タスクマネージャ"
|
||||||
desktop/views/components/timeline.vue:
|
desktop/views/components/timeline.vue:
|
||||||
@@ -963,6 +970,7 @@ admin/views/instance.vue:
|
|||||||
instance-description: "インスタンスの紹介"
|
instance-description: "インスタンスの紹介"
|
||||||
host: "ホスト"
|
host: "ホスト"
|
||||||
banner-url: "バナー画像URL"
|
banner-url: "バナー画像URL"
|
||||||
|
error-image-url: "エラー画像URL"
|
||||||
languages: "インスタンスの対象言語"
|
languages: "インスタンスの対象言語"
|
||||||
languages-desc: "スペースで区切って複数設定できます。"
|
languages-desc: "スペースで区切って複数設定できます。"
|
||||||
maintainer-config: "管理者情報"
|
maintainer-config: "管理者情報"
|
||||||
@@ -1046,6 +1054,20 @@ admin/views/charts.vue:
|
|||||||
network-requests: "リクエスト"
|
network-requests: "リクエスト"
|
||||||
network-time: "応答時間"
|
network-time: "応答時間"
|
||||||
network-usage: "通信量"
|
network-usage: "通信量"
|
||||||
|
admin/views/drive.vue:
|
||||||
|
sort:
|
||||||
|
title: "ソート"
|
||||||
|
createdAtAsc: "アップロード日時が古い順"
|
||||||
|
createdAtDesc: "アップロード日時が新しい順"
|
||||||
|
sizeAsc: "サイズが小さい順"
|
||||||
|
sizeDesc: "サイズが大きい順"
|
||||||
|
origin:
|
||||||
|
title: "オリジン"
|
||||||
|
combined: "ローカル+リモート"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
delete: "削除"
|
||||||
|
deleted: "削除しました"
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
operation: "操作"
|
operation: "操作"
|
||||||
username-or-userid: "ユーザー名またはユーザーID"
|
username-or-userid: "ユーザー名またはユーザーID"
|
||||||
|
@@ -111,7 +111,6 @@ common:
|
|||||||
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
||||||
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
||||||
use-white-black-reversi-stones: "リバーシに白黒の石を使う"
|
use-white-black-reversi-stones: "リバーシに白黒の石を使う"
|
||||||
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
|
||||||
verified-user: "公式アカウント"
|
verified-user: "公式アカウント"
|
||||||
disable-animated-mfm: "Отключить анимированный текст в постах"
|
disable-animated-mfm: "Отключить анимированный текст в постах"
|
||||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||||
@@ -165,6 +164,7 @@ common:
|
|||||||
hashtags: "Хэштеги"
|
hashtags: "Хэштеги"
|
||||||
dev: "Не удалось создать приложение. Пожалуйста, попробуйте ещё раз."
|
dev: "Не удалось создать приложение. Пожалуйста, попробуйте ещё раз."
|
||||||
ai-chan-kawaii: "Ai-chan kawaii!"
|
ai-chan-kawaii: "Ai-chan kawaii!"
|
||||||
|
you: "あなた"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "Вы разрешаете <i>{name}</i> получить доступ к вашему аккаунту?"
|
share-access: "Вы разрешаете <i>{name}</i> получить доступ к вашему аккаунту?"
|
||||||
permission-ask: "このアプリは次の権限を要求しています:"
|
permission-ask: "このアプリは次の権限を要求しています:"
|
||||||
@@ -523,6 +523,8 @@ common/views/widgets/tips.vue:
|
|||||||
tips-line23: "まゆかわいいよまゆ"
|
tips-line23: "まゆかわいいよまゆ"
|
||||||
tips-line24: "Misskeyは2014年にサービスを開始しました"
|
tips-line24: "Misskeyは2014年にサービスを開始しました"
|
||||||
tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
|
tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
|
||||||
|
common/views/pages/404.vue:
|
||||||
|
page-not-found: "ページが見つかりませんでした"
|
||||||
common/views/pages/follow.vue:
|
common/views/pages/follow.vue:
|
||||||
signed-in-as: "{}としてサインイン中"
|
signed-in-as: "{}としてサインイン中"
|
||||||
following: "フォロー中"
|
following: "フォロー中"
|
||||||
@@ -881,6 +883,11 @@ desktop/views/components/sub-note-content.vue:
|
|||||||
deleted: "この投稿は削除されました"
|
deleted: "この投稿は削除されました"
|
||||||
media-count: "{}つのメディア"
|
media-count: "{}つのメディア"
|
||||||
poll: "アンケート"
|
poll: "アンケート"
|
||||||
|
desktop/views/components/settings.tags.vue:
|
||||||
|
title: "タグ"
|
||||||
|
query: "クエリ (省略可)"
|
||||||
|
add: "追加"
|
||||||
|
save: "保存"
|
||||||
desktop/views/components/taskmanager.vue:
|
desktop/views/components/taskmanager.vue:
|
||||||
title: "タスクマネージャ"
|
title: "タスクマネージャ"
|
||||||
desktop/views/components/timeline.vue:
|
desktop/views/components/timeline.vue:
|
||||||
@@ -963,6 +970,7 @@ admin/views/instance.vue:
|
|||||||
instance-description: "インスタンスの紹介"
|
instance-description: "インスタンスの紹介"
|
||||||
host: "ホスト"
|
host: "ホスト"
|
||||||
banner-url: "バナー画像URL"
|
banner-url: "バナー画像URL"
|
||||||
|
error-image-url: "エラー画像URL"
|
||||||
languages: "インスタンスの対象言語"
|
languages: "インスタンスの対象言語"
|
||||||
languages-desc: "スペースで区切って複数設定できます。"
|
languages-desc: "スペースで区切って複数設定できます。"
|
||||||
maintainer-config: "管理者情報"
|
maintainer-config: "管理者情報"
|
||||||
@@ -1046,6 +1054,20 @@ admin/views/charts.vue:
|
|||||||
network-requests: "リクエスト"
|
network-requests: "リクエスト"
|
||||||
network-time: "応答時間"
|
network-time: "応答時間"
|
||||||
network-usage: "通信量"
|
network-usage: "通信量"
|
||||||
|
admin/views/drive.vue:
|
||||||
|
sort:
|
||||||
|
title: "ソート"
|
||||||
|
createdAtAsc: "アップロード日時が古い順"
|
||||||
|
createdAtDesc: "アップロード日時が新しい順"
|
||||||
|
sizeAsc: "サイズが小さい順"
|
||||||
|
sizeDesc: "サイズが大きい順"
|
||||||
|
origin:
|
||||||
|
title: "オリジン"
|
||||||
|
combined: "ローカル+リモート"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
delete: "削除"
|
||||||
|
deleted: "削除しました"
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
operation: "操作"
|
operation: "操作"
|
||||||
username-or-userid: "ユーザー名またはユーザーID"
|
username-or-userid: "ユーザー名またはユーザーID"
|
||||||
|
@@ -111,7 +111,6 @@ common:
|
|||||||
i-like-sushi: "相比于布丁来说, 我更喜欢寿司。"
|
i-like-sushi: "相比于布丁来说, 我更喜欢寿司。"
|
||||||
show-reversi-board-labels: "在 Reversi 中显示行和列表签"
|
show-reversi-board-labels: "在 Reversi 中显示行和列表签"
|
||||||
use-white-black-reversi-stones: "リバーシに白黒の石を使う"
|
use-white-black-reversi-stones: "リバーシに白黒の石を使う"
|
||||||
use-contrast-reversi-stones: "Make the stone color clear in Reversi"
|
|
||||||
verified-user: "认证用户"
|
verified-user: "认证用户"
|
||||||
disable-animated-mfm: "在帖子中禁用动画文本"
|
disable-animated-mfm: "在帖子中禁用动画文本"
|
||||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||||
@@ -165,6 +164,7 @@ common:
|
|||||||
hashtags: "标签"
|
hashtags: "标签"
|
||||||
dev: "构建应用程序失败,请再试一次。"
|
dev: "构建应用程序失败,请再试一次。"
|
||||||
ai-chan-kawaii: "Ai-chan kawaii!"
|
ai-chan-kawaii: "Ai-chan kawaii!"
|
||||||
|
you: "あなた"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "您要允许<i>{name}</i>来访问您的账户吗?"
|
share-access: "您要允许<i>{name}</i>来访问您的账户吗?"
|
||||||
permission-ask: "这个应用程序需要以下权限:"
|
permission-ask: "这个应用程序需要以下权限:"
|
||||||
@@ -523,6 +523,8 @@ common/views/widgets/tips.vue:
|
|||||||
tips-line23: "Mayu的眉毛非常可爱。"
|
tips-line23: "Mayu的眉毛非常可爱。"
|
||||||
tips-line24: "Misskey自2014年开始运营。"
|
tips-line24: "Misskey自2014年开始运营。"
|
||||||
tips-line25: "在与通知功能兼容的浏览器中,您可以在Misskey未打开的情况下接收通知"
|
tips-line25: "在与通知功能兼容的浏览器中,您可以在Misskey未打开的情况下接收通知"
|
||||||
|
common/views/pages/404.vue:
|
||||||
|
page-not-found: "ページが見つかりませんでした"
|
||||||
common/views/pages/follow.vue:
|
common/views/pages/follow.vue:
|
||||||
signed-in-as: "用 {}登录"
|
signed-in-as: "用 {}登录"
|
||||||
following: "正在关注"
|
following: "正在关注"
|
||||||
@@ -881,6 +883,11 @@ desktop/views/components/sub-note-content.vue:
|
|||||||
deleted: "帖子已删除"
|
deleted: "帖子已删除"
|
||||||
media-count: "附加{}媒体"
|
media-count: "附加{}媒体"
|
||||||
poll: "投票"
|
poll: "投票"
|
||||||
|
desktop/views/components/settings.tags.vue:
|
||||||
|
title: "タグ"
|
||||||
|
query: "クエリ (省略可)"
|
||||||
|
add: "追加"
|
||||||
|
save: "保存"
|
||||||
desktop/views/components/taskmanager.vue:
|
desktop/views/components/taskmanager.vue:
|
||||||
title: "任务管理器"
|
title: "任务管理器"
|
||||||
desktop/views/components/timeline.vue:
|
desktop/views/components/timeline.vue:
|
||||||
@@ -963,6 +970,7 @@ admin/views/instance.vue:
|
|||||||
instance-description: "实例介绍"
|
instance-description: "实例介绍"
|
||||||
host: "主机名"
|
host: "主机名"
|
||||||
banner-url: "背景图片地址"
|
banner-url: "背景图片地址"
|
||||||
|
error-image-url: "エラー画像URL"
|
||||||
languages: "实例语言"
|
languages: "实例语言"
|
||||||
languages-desc: "您可以添加多个,以空格分隔。"
|
languages-desc: "您可以添加多个,以空格分隔。"
|
||||||
maintainer-config: "管理员信息"
|
maintainer-config: "管理员信息"
|
||||||
@@ -1046,6 +1054,20 @@ admin/views/charts.vue:
|
|||||||
network-requests: "请求"
|
network-requests: "请求"
|
||||||
network-time: "响应时间"
|
network-time: "响应时间"
|
||||||
network-usage: "网络流量"
|
network-usage: "网络流量"
|
||||||
|
admin/views/drive.vue:
|
||||||
|
sort:
|
||||||
|
title: "ソート"
|
||||||
|
createdAtAsc: "アップロード日時が古い順"
|
||||||
|
createdAtDesc: "アップロード日時が新しい順"
|
||||||
|
sizeAsc: "サイズが小さい順"
|
||||||
|
sizeDesc: "サイズが大きい順"
|
||||||
|
origin:
|
||||||
|
title: "オリジン"
|
||||||
|
combined: "ローカル+リモート"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
delete: "削除"
|
||||||
|
deleted: "削除しました"
|
||||||
admin/views/users.vue:
|
admin/views/users.vue:
|
||||||
operation: "操作"
|
operation: "操作"
|
||||||
username-or-userid: "用户名或用户ID"
|
username-or-userid: "用户名或用户ID"
|
||||||
|
14
package.json
14
package.json
@@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"name": "misskey",
|
"name": "misskey",
|
||||||
"author": "syuilo <i@syuilo.com>",
|
"author": "syuilo <i@syuilo.com>",
|
||||||
"version": "10.62.2",
|
"version": "10.64.2",
|
||||||
"clientVersion": "2.0.12609",
|
"clientVersion": "2.0.12796",
|
||||||
"codename": "nighthike",
|
"codename": "nighthike",
|
||||||
"main": "./built/index.js",
|
"main": "./built/index.js",
|
||||||
"private": true,
|
"private": true,
|
||||||
@@ -37,7 +37,6 @@
|
|||||||
"@types/elasticsearch": "5.0.29",
|
"@types/elasticsearch": "5.0.29",
|
||||||
"@types/file-type": "5.2.2",
|
"@types/file-type": "5.2.2",
|
||||||
"@types/gulp": "3.8.36",
|
"@types/gulp": "3.8.36",
|
||||||
"@types/gulp-htmlmin": "1.3.32",
|
|
||||||
"@types/gulp-mocha": "0.0.32",
|
"@types/gulp-mocha": "0.0.32",
|
||||||
"@types/gulp-rename": "0.0.33",
|
"@types/gulp-rename": "0.0.33",
|
||||||
"@types/gulp-replace": "0.0.31",
|
"@types/gulp-replace": "0.0.31",
|
||||||
@@ -88,7 +87,7 @@
|
|||||||
"@types/websocket": "0.0.40",
|
"@types/websocket": "0.0.40",
|
||||||
"@types/ws": "6.0.1",
|
"@types/ws": "6.0.1",
|
||||||
"animejs": "2.2.0",
|
"animejs": "2.2.0",
|
||||||
"apexcharts": "2.2.4",
|
"apexcharts": "2.4.2",
|
||||||
"autobind-decorator": "2.4.0",
|
"autobind-decorator": "2.4.0",
|
||||||
"autosize": "4.0.2",
|
"autosize": "4.0.2",
|
||||||
"autwh": "0.1.0",
|
"autwh": "0.1.0",
|
||||||
@@ -120,10 +119,8 @@
|
|||||||
"fuckadblock": "3.2.1",
|
"fuckadblock": "3.2.1",
|
||||||
"gulp": "3.9.1",
|
"gulp": "3.9.1",
|
||||||
"gulp-cssnano": "2.1.3",
|
"gulp-cssnano": "2.1.3",
|
||||||
"gulp-htmlmin": "5.0.1",
|
|
||||||
"gulp-imagemin": "4.1.0",
|
"gulp-imagemin": "4.1.0",
|
||||||
"gulp-mocha": "6.0.0",
|
"gulp-mocha": "6.0.0",
|
||||||
"gulp-pug": "4.0.1",
|
|
||||||
"gulp-rename": "1.4.0",
|
"gulp-rename": "1.4.0",
|
||||||
"gulp-replace": "1.0.0",
|
"gulp-replace": "1.0.0",
|
||||||
"gulp-sourcemaps": "2.6.4",
|
"gulp-sourcemaps": "2.6.4",
|
||||||
@@ -158,7 +155,7 @@
|
|||||||
"koa-views": "6.1.4",
|
"koa-views": "6.1.4",
|
||||||
"langmap": "0.0.16",
|
"langmap": "0.0.16",
|
||||||
"loader-utils": "1.1.0",
|
"loader-utils": "1.1.0",
|
||||||
"minio": "7.0.1",
|
"minio": "7.0.2",
|
||||||
"mkdirp": "0.5.1",
|
"mkdirp": "0.5.1",
|
||||||
"mocha": "5.2.0",
|
"mocha": "5.2.0",
|
||||||
"moji": "0.5.1",
|
"moji": "0.5.1",
|
||||||
@@ -213,7 +210,7 @@
|
|||||||
"ts-loader": "5.3.1",
|
"ts-loader": "5.3.1",
|
||||||
"ts-node": "7.0.1",
|
"ts-node": "7.0.1",
|
||||||
"tslint": "5.10.0",
|
"tslint": "5.10.0",
|
||||||
"typescript": "3.1.6",
|
"typescript": "3.2.2",
|
||||||
"typescript-eslint-parser": "21.0.2",
|
"typescript-eslint-parser": "21.0.2",
|
||||||
"uglify-es": "3.3.9",
|
"uglify-es": "3.3.9",
|
||||||
"url-loader": "1.1.2",
|
"url-loader": "1.1.2",
|
||||||
@@ -228,6 +225,7 @@
|
|||||||
"vue-loader": "15.4.2",
|
"vue-loader": "15.4.2",
|
||||||
"vue-marquee-text-component": "1.1.0",
|
"vue-marquee-text-component": "1.1.0",
|
||||||
"vue-router": "3.0.2",
|
"vue-router": "3.0.2",
|
||||||
|
"vue-sequential-entrance": "1.1.3",
|
||||||
"vue-style-loader": "4.1.2",
|
"vue-style-loader": "4.1.2",
|
||||||
"vue-svg-inline-loader": "1.2.4",
|
"vue-svg-inline-loader": "1.2.4",
|
||||||
"vue-template-compiler": "2.5.17",
|
"vue-template-compiler": "2.5.17",
|
||||||
|
@@ -64,9 +64,8 @@ export default abstract class Chart<T> {
|
|||||||
const keys = {
|
const keys = {
|
||||||
span: -1,
|
span: -1,
|
||||||
date: -1
|
date: -1
|
||||||
};
|
} as { [key: string]: 1 | -1; };
|
||||||
if (grouped)
|
if (grouped) keys.group = -1;
|
||||||
keys.group = -1;
|
|
||||||
this.collection.createIndex(keys, { unique: true });
|
this.collection.createIndex(keys, { unique: true });
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -75,14 +74,14 @@ export default abstract class Chart<T> {
|
|||||||
const query: Obj = {};
|
const query: Obj = {};
|
||||||
|
|
||||||
const dive = (x: Obj, path: string) => {
|
const dive = (x: Obj, path: string) => {
|
||||||
Object.entries(x).forEach(([k, v]) => {
|
for (const [k, v] of Object.entries(x)) {
|
||||||
const p = path ? `${path}.${k}` : k;
|
const p = path ? `${path}.${k}` : k;
|
||||||
if (typeof v === 'number') {
|
if (typeof v === 'number') {
|
||||||
query[p] = v;
|
query[p] = v;
|
||||||
} else {
|
} else {
|
||||||
dive(v, p);
|
dive(v, p);
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
dive(x, path);
|
dive(x, path);
|
||||||
@@ -335,14 +334,14 @@ export default abstract class Chart<T> {
|
|||||||
* にする
|
* にする
|
||||||
*/
|
*/
|
||||||
const dive = (x: Obj, path?: string) => {
|
const dive = (x: Obj, path?: string) => {
|
||||||
Object.entries(x).forEach(([k, v]) => {
|
for (const [k, v] of Object.entries(x)) {
|
||||||
const p = path ? `${path}.${k}` : k;
|
const p = path ? `${path}.${k}` : k;
|
||||||
if (typeof v == 'object') {
|
if (typeof v == 'object') {
|
||||||
dive(v, p);
|
dive(v, p);
|
||||||
} else {
|
} else {
|
||||||
nestedProperty.set(res, p, chart.map(s => nestedProperty.get(s, p)));
|
nestedProperty.set(res, p, chart.map(s => nestedProperty.get(s, p)));
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
dive(chart[0]);
|
dive(chart[0]);
|
||||||
|
@@ -9,6 +9,7 @@ import './style.styl';
|
|||||||
|
|
||||||
import init from '../init';
|
import init from '../init';
|
||||||
import Index from './views/index.vue';
|
import Index from './views/index.vue';
|
||||||
|
import NotFound from '../common/views/pages/404.vue';
|
||||||
|
|
||||||
init(launch => {
|
init(launch => {
|
||||||
document.title = 'Admin';
|
document.title = 'Admin';
|
||||||
@@ -19,6 +20,7 @@ init(launch => {
|
|||||||
base: '/admin/',
|
base: '/admin/',
|
||||||
routes: [
|
routes: [
|
||||||
{ path: '/', component: Index },
|
{ path: '/', component: Index },
|
||||||
|
{ path: '*', component: NotFound }
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@@ -56,7 +56,9 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
onLogs(logs) {
|
onLogs(logs) {
|
||||||
logs.reverse().forEach(log => this.onLog(log));
|
for (const log of logs.reverse()) {
|
||||||
|
this.onLog(log)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@@ -132,7 +132,9 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
onStatsLog(statsLog) {
|
onStatsLog(statsLog) {
|
||||||
statsLog.reverse().forEach(stats => this.onStats(stats));
|
for (const stats of statsLog.reverse()) {
|
||||||
|
this.onStats(stats);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@@ -127,12 +127,12 @@ export default Vue.extend({
|
|||||||
this.$root.api('instances', {
|
this.$root.api('instances', {
|
||||||
sort: '+notes'
|
sort: '+notes'
|
||||||
}).then(instances => {
|
}).then(instances => {
|
||||||
instances.forEach(i => {
|
for (const i of instances) {
|
||||||
i.bg = randomColor({
|
i.bg = randomColor({
|
||||||
seed: i.host,
|
seed: i.host,
|
||||||
luminosity: 'dark'
|
luminosity: 'dark'
|
||||||
});
|
});
|
||||||
});
|
}
|
||||||
this.instances = instances;
|
this.instances = instances;
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
175
src/client/app/admin/views/drive.vue
Normal file
175
src/client/app/admin/views/drive.vue
Normal file
@@ -0,0 +1,175 @@
|
|||||||
|
<template>
|
||||||
|
<div class="pwnqwyet">
|
||||||
|
<ui-card>
|
||||||
|
<div slot="title"><fa :icon="faCloud"/> {{ $t('@.drive') }}</div>
|
||||||
|
<section class="fit-top">
|
||||||
|
<ui-horizon-group inputs>
|
||||||
|
<ui-select v-model="sort">
|
||||||
|
<span slot="label">{{ $t('sort.title') }}</span>
|
||||||
|
<option value="-createdAt">{{ $t('sort.createdAtAsc') }}</option>
|
||||||
|
<option value="+createdAt">{{ $t('sort.createdAtDesc') }}</option>
|
||||||
|
<option value="-size">{{ $t('sort.sizeAsc') }}</option>
|
||||||
|
<option value="+size">{{ $t('sort.sizeDesc') }}</option>
|
||||||
|
</ui-select>
|
||||||
|
<ui-select v-model="origin">
|
||||||
|
<span slot="label">{{ $t('origin.title') }}</span>
|
||||||
|
<option value="combined">{{ $t('origin.combined') }}</option>
|
||||||
|
<option value="local">{{ $t('origin.local') }}</option>
|
||||||
|
<option value="remote">{{ $t('origin.remote') }}</option>
|
||||||
|
</ui-select>
|
||||||
|
</ui-horizon-group>
|
||||||
|
<sequential-entrance animation="entranceFromTop" delay="25">
|
||||||
|
<div class="kidvdlkg" v-for="file in files">
|
||||||
|
<div @click="file._open = !file._open">
|
||||||
|
<div>
|
||||||
|
<div class="thumbnail" :style="thumbnail(file)"></div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<header>
|
||||||
|
<b>{{ file.name }}</b>
|
||||||
|
<span class="username">@{{ file.user | acct }}</span>
|
||||||
|
</header>
|
||||||
|
<div>
|
||||||
|
<div>
|
||||||
|
<span style="margin-right:16px;">{{ file.type }}</span>
|
||||||
|
<span>{{ file.datasize | bytes }}</span>
|
||||||
|
</div>
|
||||||
|
<div><mk-time :time="file.createdAt" mode="detail"/></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-show="file._open">
|
||||||
|
<ui-button @click="del(file)"><fa :icon="faTrashAlt"/> {{ $t('delete') }}</ui-button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</sequential-entrance>
|
||||||
|
<ui-button v-if="existMore" @click="fetch">{{ $t('@.load-more') }}</ui-button>
|
||||||
|
</section>
|
||||||
|
</ui-card>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
import i18n from '../../i18n';
|
||||||
|
import { faCloud } from '@fortawesome/free-solid-svg-icons';
|
||||||
|
import { faTrashAlt } from '@fortawesome/free-regular-svg-icons';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
i18n: i18n('admin/views/drive.vue'),
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
sort: '+createdAt',
|
||||||
|
origin: 'combined',
|
||||||
|
limit: 10,
|
||||||
|
offset: 0,
|
||||||
|
files: [],
|
||||||
|
existMore: false,
|
||||||
|
faCloud, faTrashAlt
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
watch: {
|
||||||
|
sort() {
|
||||||
|
this.files = [];
|
||||||
|
this.offset = 0;
|
||||||
|
this.fetch();
|
||||||
|
},
|
||||||
|
|
||||||
|
origin() {
|
||||||
|
this.files = [];
|
||||||
|
this.offset = 0;
|
||||||
|
this.fetch();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted() {
|
||||||
|
this.fetch();
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
fetch() {
|
||||||
|
this.$root.api('admin/drive/files', {
|
||||||
|
origin: this.origin,
|
||||||
|
sort: this.sort,
|
||||||
|
offset: this.offset,
|
||||||
|
limit: this.limit + 1
|
||||||
|
}).then(files => {
|
||||||
|
if (files.length == this.limit + 1) {
|
||||||
|
files.pop();
|
||||||
|
this.existMore = true;
|
||||||
|
} else {
|
||||||
|
this.existMore = false;
|
||||||
|
}
|
||||||
|
for (const x of files) {
|
||||||
|
x._open = false;
|
||||||
|
}
|
||||||
|
this.files = this.files.concat(files);
|
||||||
|
this.offset += this.limit;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
thumbnail(file: any): any {
|
||||||
|
return {
|
||||||
|
'background-color': file.properties.avgColor && file.properties.avgColor.length == 3 ? `rgb(${file.properties.avgColor.join(',')})` : 'transparent',
|
||||||
|
'background-image': `url(${file.thumbnailUrl})`
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
async del(file: any) {
|
||||||
|
const process = async () => {
|
||||||
|
await this.$root.api('drive/files/delete', { fileId: file.id });
|
||||||
|
this.$root.dialog({
|
||||||
|
type: 'success',
|
||||||
|
text: this.$t('deleted')
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
await process().catch(e => {
|
||||||
|
this.$root.dialog({
|
||||||
|
type: 'error',
|
||||||
|
text: e.toString()
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
.pwnqwyet
|
||||||
|
@media (min-width 500px)
|
||||||
|
padding 16px
|
||||||
|
|
||||||
|
.kidvdlkg
|
||||||
|
padding 16px 0
|
||||||
|
border-top solid 1px var(--faceDivider)
|
||||||
|
|
||||||
|
> div:first-child
|
||||||
|
display flex
|
||||||
|
cursor pointer
|
||||||
|
|
||||||
|
> div:nth-child(1)
|
||||||
|
> .thumbnail
|
||||||
|
display block
|
||||||
|
width 64px
|
||||||
|
height 64px
|
||||||
|
background-size cover
|
||||||
|
background-position center center
|
||||||
|
|
||||||
|
> div:nth-child(2)
|
||||||
|
flex 1
|
||||||
|
padding-left 16px
|
||||||
|
|
||||||
|
@media (max-width 500px)
|
||||||
|
font-size 14px
|
||||||
|
|
||||||
|
> header
|
||||||
|
word-break break-word
|
||||||
|
|
||||||
|
> .username
|
||||||
|
margin-left 8px
|
||||||
|
opacity 0.7
|
||||||
|
|
||||||
|
</style>
|
@@ -24,24 +24,28 @@
|
|||||||
|
|
||||||
<ui-card>
|
<ui-card>
|
||||||
<div slot="title"><fa :icon="faGrin"/> {{ $t('emojis.title') }}</div>
|
<div slot="title"><fa :icon="faGrin"/> {{ $t('emojis.title') }}</div>
|
||||||
<section v-for="emoji in emojis">
|
<section v-for="emoji in emojis" class="oryfrbft">
|
||||||
<img :src="emoji.url" :alt="emoji.name" style="width: 64px;"/>
|
<div>
|
||||||
<ui-horizon-group inputs>
|
<img :src="emoji.url" :alt="emoji.name" style="width: 64px;"/>
|
||||||
<ui-input v-model="emoji.name">
|
</div>
|
||||||
<span>{{ $t('add-emoji.name') }}</span>
|
<div>
|
||||||
|
<ui-horizon-group>
|
||||||
|
<ui-input v-model="emoji.name">
|
||||||
|
<span>{{ $t('add-emoji.name') }}</span>
|
||||||
|
</ui-input>
|
||||||
|
<ui-input v-model="emoji.aliases">
|
||||||
|
<span>{{ $t('add-emoji.aliases') }}</span>
|
||||||
|
</ui-input>
|
||||||
|
</ui-horizon-group>
|
||||||
|
<ui-input v-model="emoji.url">
|
||||||
|
<i slot="icon"><fa icon="link"/></i>
|
||||||
|
<span>{{ $t('add-emoji.url') }}</span>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
<ui-input v-model="emoji.aliases">
|
<ui-horizon-group class="fit-bottom">
|
||||||
<span>{{ $t('add-emoji.aliases') }}</span>
|
<ui-button @click="updateEmoji(emoji)"><fa :icon="['far', 'save']"/> {{ $t('emojis.update') }}</ui-button>
|
||||||
</ui-input>
|
<ui-button @click="removeEmoji(emoji)"><fa :icon="['far', 'trash-alt']"/> {{ $t('emojis.remove') }}</ui-button>
|
||||||
</ui-horizon-group>
|
</ui-horizon-group>
|
||||||
<ui-input v-model="emoji.url">
|
</div>
|
||||||
<i slot="icon"><fa icon="link"/></i>
|
|
||||||
<span>{{ $t('add-emoji.url') }}</span>
|
|
||||||
</ui-input>
|
|
||||||
<ui-horizon-group class="fit-bottom">
|
|
||||||
<ui-button @click="updateEmoji(emoji)"><fa :icon="['far', 'save']"/> {{ $t('emojis.update') }}</ui-button>
|
|
||||||
<ui-button @click="removeEmoji(emoji)"><fa :icon="['far', 'trash-alt']"/> {{ $t('emojis.remove') }}</ui-button>
|
|
||||||
</ui-horizon-group>
|
|
||||||
</section>
|
</section>
|
||||||
</ui-card>
|
</ui-card>
|
||||||
</div>
|
</div>
|
||||||
@@ -91,7 +95,9 @@ export default Vue.extend({
|
|||||||
fetchEmojis() {
|
fetchEmojis() {
|
||||||
this.$root.api('admin/emoji/list').then(emojis => {
|
this.$root.api('admin/emoji/list').then(emojis => {
|
||||||
emojis.reverse();
|
emojis.reverse();
|
||||||
emojis.forEach(e => e.aliases = (e.aliases || []).join(' '));
|
for (const e of emojis) {
|
||||||
|
e.aliases = (e.aliases || []).join(' ');
|
||||||
|
}
|
||||||
this.emojis = emojis;
|
this.emojis = emojis;
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
@@ -148,4 +154,21 @@ export default Vue.extend({
|
|||||||
@media (min-width 500px)
|
@media (min-width 500px)
|
||||||
padding 16px
|
padding 16px
|
||||||
|
|
||||||
|
.oryfrbft
|
||||||
|
@media (min-width 500px)
|
||||||
|
display flex
|
||||||
|
|
||||||
|
> div:first-child
|
||||||
|
@media (max-width 500px)
|
||||||
|
padding-bottom 16px
|
||||||
|
|
||||||
|
> img
|
||||||
|
vertical-align bottom
|
||||||
|
|
||||||
|
> div:last-child
|
||||||
|
flex 1
|
||||||
|
|
||||||
|
@media (min-width 500px)
|
||||||
|
padding-left 16px
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
@@ -22,12 +22,11 @@
|
|||||||
<li @click="nav('instance')" :class="{ active: page == 'instance' }"><fa icon="cog" fixed-width/>{{ $t('instance') }}</li>
|
<li @click="nav('instance')" :class="{ active: page == 'instance' }"><fa icon="cog" fixed-width/>{{ $t('instance') }}</li>
|
||||||
<li @click="nav('moderators')" :class="{ active: page == 'moderators' }"><fa :icon="faHeadset" fixed-width/>{{ $t('moderators') }}</li>
|
<li @click="nav('moderators')" :class="{ active: page == 'moderators' }"><fa :icon="faHeadset" fixed-width/>{{ $t('moderators') }}</li>
|
||||||
<li @click="nav('users')" :class="{ active: page == 'users' }"><fa icon="users" fixed-width/>{{ $t('users') }}</li>
|
<li @click="nav('users')" :class="{ active: page == 'users' }"><fa icon="users" fixed-width/>{{ $t('users') }}</li>
|
||||||
|
<li @click="nav('drive')" :class="{ active: page == 'drive' }"><fa icon="cloud" fixed-width/>{{ $t('@.drive') }}</li>
|
||||||
<!-- <li @click="nav('federation')" :class="{ active: page == 'federation' }"><fa :icon="faShareAlt" fixed-width/>{{ $t('federation') }}</li> -->
|
<!-- <li @click="nav('federation')" :class="{ active: page == 'federation' }"><fa :icon="faShareAlt" fixed-width/>{{ $t('federation') }}</li> -->
|
||||||
<li @click="nav('emoji')" :class="{ active: page == 'emoji' }"><fa :icon="faGrin" fixed-width/>{{ $t('emoji') }}</li>
|
<li @click="nav('emoji')" :class="{ active: page == 'emoji' }"><fa :icon="faGrin" fixed-width/>{{ $t('emoji') }}</li>
|
||||||
<li @click="nav('announcements')" :class="{ active: page == 'announcements' }"><fa icon="broadcast-tower" fixed-width/>{{ $t('announcements') }}</li>
|
<li @click="nav('announcements')" :class="{ active: page == 'announcements' }"><fa icon="broadcast-tower" fixed-width/>{{ $t('announcements') }}</li>
|
||||||
<li @click="nav('hashtags')" :class="{ active: page == 'hashtags' }"><fa icon="hashtag" fixed-width/>{{ $t('hashtags') }}</li>
|
<li @click="nav('hashtags')" :class="{ active: page == 'hashtags' }"><fa icon="hashtag" fixed-width/>{{ $t('hashtags') }}</li>
|
||||||
|
|
||||||
<!-- <li @click="nav('drive')" :class="{ active: page == 'drive' }"><fa icon="cloud" fixed-width/>{{ $t('@.drive') }}</li> -->
|
|
||||||
</ul>
|
</ul>
|
||||||
<div class="back-to-misskey">
|
<div class="back-to-misskey">
|
||||||
<a href="/"><fa :icon="faArrowLeft"/> {{ $t('back-to-misskey') }}</a>
|
<a href="/"><fa :icon="faArrowLeft"/> {{ $t('back-to-misskey') }}</a>
|
||||||
@@ -45,7 +44,7 @@
|
|||||||
<div v-if="page == 'emoji'"><x-emoji/></div>
|
<div v-if="page == 'emoji'"><x-emoji/></div>
|
||||||
<div v-if="page == 'announcements'"><x-announcements/></div>
|
<div v-if="page == 'announcements'"><x-announcements/></div>
|
||||||
<div v-if="page == 'hashtags'"><x-hashtags/></div>
|
<div v-if="page == 'hashtags'"><x-hashtags/></div>
|
||||||
<div v-if="page == 'drive'"></div>
|
<div v-if="page == 'drive'"><x-drive/></div>
|
||||||
<div v-if="page == 'update'"></div>
|
<div v-if="page == 'update'"></div>
|
||||||
</div>
|
</div>
|
||||||
</main>
|
</main>
|
||||||
@@ -63,6 +62,7 @@ import XEmoji from "./emoji.vue";
|
|||||||
import XAnnouncements from "./announcements.vue";
|
import XAnnouncements from "./announcements.vue";
|
||||||
import XHashtags from "./hashtags.vue";
|
import XHashtags from "./hashtags.vue";
|
||||||
import XUsers from "./users.vue";
|
import XUsers from "./users.vue";
|
||||||
|
import XDrive from "./drive.vue";
|
||||||
import { faHeadset, faArrowLeft, faShareAlt } from '@fortawesome/free-solid-svg-icons';
|
import { faHeadset, faArrowLeft, faShareAlt } from '@fortawesome/free-solid-svg-icons';
|
||||||
import { faGrin } from '@fortawesome/free-regular-svg-icons';
|
import { faGrin } from '@fortawesome/free-regular-svg-icons';
|
||||||
|
|
||||||
@@ -79,7 +79,8 @@ export default Vue.extend({
|
|||||||
XEmoji,
|
XEmoji,
|
||||||
XAnnouncements,
|
XAnnouncements,
|
||||||
XHashtags,
|
XHashtags,
|
||||||
XUsers
|
XUsers,
|
||||||
|
XDrive,
|
||||||
},
|
},
|
||||||
provide: {
|
provide: {
|
||||||
isMobile
|
isMobile
|
||||||
|
@@ -7,6 +7,7 @@
|
|||||||
<ui-input v-model="name">{{ $t('instance-name') }}</ui-input>
|
<ui-input v-model="name">{{ $t('instance-name') }}</ui-input>
|
||||||
<ui-textarea v-model="description">{{ $t('instance-description') }}</ui-textarea>
|
<ui-textarea v-model="description">{{ $t('instance-description') }}</ui-textarea>
|
||||||
<ui-input v-model="bannerUrl"><i slot="icon"><fa icon="link"/></i>{{ $t('banner-url') }}</ui-input>
|
<ui-input v-model="bannerUrl"><i slot="icon"><fa icon="link"/></i>{{ $t('banner-url') }}</ui-input>
|
||||||
|
<ui-input v-model="errorImageUrl"><i slot="icon"><fa icon="link"/></i>{{ $t('error-image-url') }}</ui-input>
|
||||||
<ui-input v-model="languages"><i slot="icon"><fa icon="language"/></i>{{ $t('languages') }}<span slot="desc">{{ $t('languages-desc') }}</span></ui-input>
|
<ui-input v-model="languages"><i slot="icon"><fa icon="language"/></i>{{ $t('languages') }}<span slot="desc">{{ $t('languages-desc') }}</span></ui-input>
|
||||||
</section>
|
</section>
|
||||||
<section class="fit-bottom">
|
<section class="fit-bottom">
|
||||||
@@ -31,8 +32,10 @@
|
|||||||
<header><fa :icon="faShieldAlt"/> {{ $t('recaptcha-config') }}</header>
|
<header><fa :icon="faShieldAlt"/> {{ $t('recaptcha-config') }}</header>
|
||||||
<ui-switch v-model="enableRecaptcha">{{ $t('enable-recaptcha') }}</ui-switch>
|
<ui-switch v-model="enableRecaptcha">{{ $t('enable-recaptcha') }}</ui-switch>
|
||||||
<ui-info>{{ $t('recaptcha-info') }}</ui-info>
|
<ui-info>{{ $t('recaptcha-info') }}</ui-info>
|
||||||
<ui-input v-model="recaptchaSiteKey" :disabled="!enableRecaptcha"><i slot="icon"><fa icon="key"/></i>{{ $t('recaptcha-site-key') }}</ui-input>
|
<ui-horizon-group inputs>
|
||||||
<ui-input v-model="recaptchaSecretKey" :disabled="!enableRecaptcha"><i slot="icon"><fa icon="key"/></i>{{ $t('recaptcha-secret-key') }}</ui-input>
|
<ui-input v-model="recaptchaSiteKey" :disabled="!enableRecaptcha"><i slot="icon"><fa icon="key"/></i>{{ $t('recaptcha-site-key') }}</ui-input>
|
||||||
|
<ui-input v-model="recaptchaSecretKey" :disabled="!enableRecaptcha"><i slot="icon"><fa icon="key"/></i>{{ $t('recaptcha-secret-key') }}</ui-input>
|
||||||
|
</ui-horizon-group>
|
||||||
</section>
|
</section>
|
||||||
<section>
|
<section>
|
||||||
<header><fa :icon="faGhost"/> {{ $t('proxy-account-config') }}</header>
|
<header><fa :icon="faGhost"/> {{ $t('proxy-account-config') }}</header>
|
||||||
@@ -81,9 +84,11 @@
|
|||||||
<div slot="title"><fa :icon="['fab', 'twitter']"/> {{ $t('twitter-integration-config') }}</div>
|
<div slot="title"><fa :icon="['fab', 'twitter']"/> {{ $t('twitter-integration-config') }}</div>
|
||||||
<section>
|
<section>
|
||||||
<ui-switch v-model="enableTwitterIntegration">{{ $t('enable-twitter-integration') }}</ui-switch>
|
<ui-switch v-model="enableTwitterIntegration">{{ $t('enable-twitter-integration') }}</ui-switch>
|
||||||
|
<ui-horizon-group>
|
||||||
|
<ui-input v-model="twitterConsumerKey" :disabled="!enableTwitterIntegration"><i slot="icon"><fa icon="key"/></i>{{ $t('twitter-integration-consumer-key') }}</ui-input>
|
||||||
|
<ui-input v-model="twitterConsumerSecret" :disabled="!enableTwitterIntegration"><i slot="icon"><fa icon="key"/></i>{{ $t('twitter-integration-consumer-secret') }}</ui-input>
|
||||||
|
</ui-horizon-group>
|
||||||
<ui-info>{{ $t('twitter-integration-info', { url: `${url}/api/tw/cb` }) }}</ui-info>
|
<ui-info>{{ $t('twitter-integration-info', { url: `${url}/api/tw/cb` }) }}</ui-info>
|
||||||
<ui-input v-model="twitterConsumerKey" :disabled="!enableTwitterIntegration"><i slot="icon"><fa icon="key"/></i>{{ $t('twitter-integration-consumer-key') }}</ui-input>
|
|
||||||
<ui-input v-model="twitterConsumerSecret" :disabled="!enableTwitterIntegration"><i slot="icon"><fa icon="key"/></i>{{ $t('twitter-integration-consumer-secret') }}</ui-input>
|
|
||||||
<ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
|
<ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
|
||||||
</section>
|
</section>
|
||||||
</ui-card>
|
</ui-card>
|
||||||
@@ -92,9 +97,11 @@
|
|||||||
<div slot="title"><fa :icon="['fab', 'github']"/> {{ $t('github-integration-config') }}</div>
|
<div slot="title"><fa :icon="['fab', 'github']"/> {{ $t('github-integration-config') }}</div>
|
||||||
<section>
|
<section>
|
||||||
<ui-switch v-model="enableGithubIntegration">{{ $t('enable-github-integration') }}</ui-switch>
|
<ui-switch v-model="enableGithubIntegration">{{ $t('enable-github-integration') }}</ui-switch>
|
||||||
|
<ui-horizon-group>
|
||||||
|
<ui-input v-model="githubClientId" :disabled="!enableGithubIntegration"><i slot="icon"><fa icon="key"/></i>{{ $t('github-integration-client-id') }}</ui-input>
|
||||||
|
<ui-input v-model="githubClientSecret" :disabled="!enableGithubIntegration"><i slot="icon"><fa icon="key"/></i>{{ $t('github-integration-client-secret') }}</ui-input>
|
||||||
|
</ui-horizon-group>
|
||||||
<ui-info>{{ $t('github-integration-info', { url: `${url}/api/gh/cb` }) }}</ui-info>
|
<ui-info>{{ $t('github-integration-info', { url: `${url}/api/gh/cb` }) }}</ui-info>
|
||||||
<ui-input v-model="githubClientId" :disabled="!enableGithubIntegration"><i slot="icon"><fa icon="key"/></i>{{ $t('github-integration-client-id') }}</ui-input>
|
|
||||||
<ui-input v-model="githubClientSecret" :disabled="!enableGithubIntegration"><i slot="icon"><fa icon="key"/></i>{{ $t('github-integration-client-secret') }}</ui-input>
|
|
||||||
<ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
|
<ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
|
||||||
</section>
|
</section>
|
||||||
</ui-card>
|
</ui-card>
|
||||||
@@ -103,9 +110,11 @@
|
|||||||
<div slot="title"><fa :icon="['fab', 'discord']"/> {{ $t('discord-integration-config') }}</div>
|
<div slot="title"><fa :icon="['fab', 'discord']"/> {{ $t('discord-integration-config') }}</div>
|
||||||
<section>
|
<section>
|
||||||
<ui-switch v-model="enableDiscordIntegration">{{ $t('enable-discord-integration') }}</ui-switch>
|
<ui-switch v-model="enableDiscordIntegration">{{ $t('enable-discord-integration') }}</ui-switch>
|
||||||
|
<ui-horizon-group>
|
||||||
|
<ui-input v-model="discordClientId" :disabled="!enableDiscordIntegration"><i slot="icon"><fa icon="key"/></i>{{ $t('discord-integration-client-id') }}</ui-input>
|
||||||
|
<ui-input v-model="discordClientSecret" :disabled="!enableDiscordIntegration"><i slot="icon"><fa icon="key"/></i>{{ $t('discord-integration-client-secret') }}</ui-input>
|
||||||
|
</ui-horizon-group>
|
||||||
<ui-info>{{ $t('discord-integration-info', { url: `${url}/api/dc/cb` }) }}</ui-info>
|
<ui-info>{{ $t('discord-integration-info', { url: `${url}/api/dc/cb` }) }}</ui-info>
|
||||||
<ui-input v-model="discordClientId" :disabled="!enableDiscordIntegration"><i slot="icon"><fa icon="key"/></i>{{ $t('discord-integration-client-id') }}</ui-input>
|
|
||||||
<ui-input v-model="discordClientSecret" :disabled="!enableDiscordIntegration"><i slot="icon"><fa icon="key"/></i>{{ $t('discord-integration-client-secret') }}</ui-input>
|
|
||||||
<ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
|
<ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
|
||||||
</section>
|
</section>
|
||||||
</ui-card>
|
</ui-card>
|
||||||
@@ -132,6 +141,7 @@ export default Vue.extend({
|
|||||||
disableRegistration: false,
|
disableRegistration: false,
|
||||||
disableLocalTimeline: false,
|
disableLocalTimeline: false,
|
||||||
bannerUrl: null,
|
bannerUrl: null,
|
||||||
|
errorImageUrl: null,
|
||||||
name: null,
|
name: null,
|
||||||
description: null,
|
description: null,
|
||||||
languages: null,
|
languages: null,
|
||||||
@@ -172,7 +182,10 @@ export default Vue.extend({
|
|||||||
this.$root.getMeta().then(meta => {
|
this.$root.getMeta().then(meta => {
|
||||||
this.maintainerName = meta.maintainer.name;
|
this.maintainerName = meta.maintainer.name;
|
||||||
this.maintainerEmail = meta.maintainer.email;
|
this.maintainerEmail = meta.maintainer.email;
|
||||||
|
this.disableRegistration = meta.disableRegistration;
|
||||||
|
this.disableLocalTimeline = meta.disableLocalTimeline;
|
||||||
this.bannerUrl = meta.bannerUrl;
|
this.bannerUrl = meta.bannerUrl;
|
||||||
|
this.errorImageUrl = meta.errorImageUrl;
|
||||||
this.name = meta.name;
|
this.name = meta.name;
|
||||||
this.description = meta.description;
|
this.description = meta.description;
|
||||||
this.languages = meta.langs.join(' ');
|
this.languages = meta.langs.join(' ');
|
||||||
@@ -226,6 +239,7 @@ export default Vue.extend({
|
|||||||
disableRegistration: this.disableRegistration,
|
disableRegistration: this.disableRegistration,
|
||||||
disableLocalTimeline: this.disableLocalTimeline,
|
disableLocalTimeline: this.disableLocalTimeline,
|
||||||
bannerUrl: this.bannerUrl,
|
bannerUrl: this.bannerUrl,
|
||||||
|
errorImageUrl: this.errorImageUrl,
|
||||||
name: this.name,
|
name: this.name,
|
||||||
description: this.description,
|
description: this.description,
|
||||||
langs: this.languages.split(' '),
|
langs: this.languages.split(' '),
|
||||||
|
@@ -38,25 +38,27 @@
|
|||||||
<option value="remote">{{ $t('users.origin.remote') }}</option>
|
<option value="remote">{{ $t('users.origin.remote') }}</option>
|
||||||
</ui-select>
|
</ui-select>
|
||||||
</ui-horizon-group>
|
</ui-horizon-group>
|
||||||
<div class="kofvwchc" v-for="user in users">
|
<sequential-entrance animation="entranceFromTop" delay="25">
|
||||||
<div>
|
<div class="kofvwchc" v-for="user in users">
|
||||||
<a :href="user | userPage(null, true)">
|
|
||||||
<mk-avatar class="avatar" :user="user" :disable-link="true"/>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<header>
|
|
||||||
<b><mk-user-name :user="user"/></b>
|
|
||||||
<span class="username">@{{ user | acct }}</span>
|
|
||||||
</header>
|
|
||||||
<div>
|
<div>
|
||||||
<span>{{ $t('users.updatedAt') }}: <mk-time :time="user.updatedAt" mode="detail"/></span>
|
<a :href="user | userPage(null, true)">
|
||||||
|
<mk-avatar class="avatar" :user="user" :disable-link="true"/>
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<span>{{ $t('users.createdAt') }}: <mk-time :time="user.createdAt" mode="detail"/></span>
|
<header>
|
||||||
|
<b><mk-user-name :user="user"/></b>
|
||||||
|
<span class="username">@{{ user | acct }}</span>
|
||||||
|
</header>
|
||||||
|
<div>
|
||||||
|
<span>{{ $t('users.updatedAt') }}: <mk-time :time="user.updatedAt" mode="detail"/></span>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span>{{ $t('users.createdAt') }}: <mk-time :time="user.createdAt" mode="detail"/></span>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</sequential-entrance>
|
||||||
<ui-button v-if="existMore" @click="fetchUsers">{{ $t('@.load-more') }}</ui-button>
|
<ui-button v-if="existMore" @click="fetchUsers">{{ $t('@.load-more') }}</ui-button>
|
||||||
</section>
|
</section>
|
||||||
</ui-card>
|
</ui-card>
|
||||||
@@ -274,6 +276,9 @@ export default Vue.extend({
|
|||||||
flex 1
|
flex 1
|
||||||
padding-left 16px
|
padding-left 16px
|
||||||
|
|
||||||
|
@media (max-width 500px)
|
||||||
|
font-size 14px
|
||||||
|
|
||||||
> header
|
> header
|
||||||
> .username
|
> .username
|
||||||
margin-left 8px
|
margin-left 8px
|
||||||
|
@@ -10,3 +10,19 @@
|
|||||||
opacity: 0;
|
opacity: 0;
|
||||||
transform: scaleY(0);
|
transform: scaleY(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.entranceFromTop {
|
||||||
|
animation-duration: 0.5s;
|
||||||
|
animation-name: entranceFromTop;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes entranceFromTop {
|
||||||
|
from {
|
||||||
|
opacity: 0;
|
||||||
|
transform: translateY(-64px);
|
||||||
|
}
|
||||||
|
to {
|
||||||
|
opacity: 1;
|
||||||
|
transform: translateY(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -9,6 +9,7 @@ import './style.styl';
|
|||||||
|
|
||||||
import init from '../init';
|
import init from '../init';
|
||||||
import Index from './views/index.vue';
|
import Index from './views/index.vue';
|
||||||
|
import NotFound from '../common/views/pages/404.vue';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* init
|
* init
|
||||||
@@ -20,6 +21,7 @@ init(launch => {
|
|||||||
base: '/auth/',
|
base: '/auth/',
|
||||||
routes: [
|
routes: [
|
||||||
{ path: '/:token', component: Index },
|
{ path: '/:token', component: Index },
|
||||||
|
{ path: '*', component: NotFound }
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@@ -17,9 +17,9 @@
|
|||||||
//#region Apply theme
|
//#region Apply theme
|
||||||
const theme = localStorage.getItem('theme');
|
const theme = localStorage.getItem('theme');
|
||||||
if (theme) {
|
if (theme) {
|
||||||
Object.entries(JSON.parse(theme)).forEach(([k, v]) => {
|
for (const [k, v] of Object.entries(JSON.parse(theme))) {
|
||||||
document.documentElement.style.setProperty(`--${k}`, v.toString());
|
document.documentElement.style.setProperty(`--${k}`, v.toString());
|
||||||
});
|
}
|
||||||
}
|
}
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
@@ -160,7 +160,7 @@
|
|||||||
navigator.serviceWorker.controller.postMessage('clear');
|
navigator.serviceWorker.controller.postMessage('clear');
|
||||||
|
|
||||||
navigator.serviceWorker.getRegistrations().then(registrations => {
|
navigator.serviceWorker.getRegistrations().then(registrations => {
|
||||||
registrations.forEach(registration => registration.unregister());
|
for (const registration of registrations) registration.unregister();
|
||||||
});
|
});
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error(e);
|
console.error(e);
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
|
|
||||||
export default function<T extends object>(data: {
|
export default function <T extends object>(data: {
|
||||||
name: string;
|
name: string;
|
||||||
props?: () => T;
|
props?: () => T;
|
||||||
}) {
|
}) {
|
||||||
@@ -53,11 +53,10 @@ export default function<T extends object>(data: {
|
|||||||
mergeProps() {
|
mergeProps() {
|
||||||
if (data.props) {
|
if (data.props) {
|
||||||
const defaultProps = data.props();
|
const defaultProps = data.props();
|
||||||
Object.keys(defaultProps).forEach(prop => {
|
for (const prop of Object.keys(defaultProps)) {
|
||||||
if (!this.props.hasOwnProperty(prop)) {
|
if (this.props.hasOwnProperty(prop)) continue;
|
||||||
Vue.set(this.props, prop, defaultProps[prop]);
|
Vue.set(this.props, prop, defaultProps[prop]);
|
||||||
}
|
}
|
||||||
});
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@@ -28,15 +28,15 @@ const getKeyMap = keymap => Object.entries(keymap).map(([patterns, callback]): a
|
|||||||
shift: false
|
shift: false
|
||||||
} as pattern;
|
} as pattern;
|
||||||
|
|
||||||
part.trim().split('+').forEach(key => {
|
const keys = part.trim().split('+').map(x => x.trim().toLowerCase());
|
||||||
key = key.trim().toLowerCase();
|
for (const key of keys) {
|
||||||
switch (key) {
|
switch (key) {
|
||||||
case 'ctrl': pattern.ctrl = true; break;
|
case 'ctrl': pattern.ctrl = true; break;
|
||||||
case 'alt': pattern.alt = true; break;
|
case 'alt': pattern.alt = true; break;
|
||||||
case 'shift': pattern.shift = true; break;
|
case 'shift': pattern.shift = true; break;
|
||||||
default: pattern.which = keyCode(key).map(k => k.toLowerCase());
|
default: pattern.which = keyCode(key).map(k => k.toLowerCase());
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
|
|
||||||
return pattern;
|
return pattern;
|
||||||
});
|
});
|
||||||
|
@@ -14,9 +14,10 @@ export default async function($root: any, force = false, silent = false) {
|
|||||||
navigator.serviceWorker.controller.postMessage('clear');
|
navigator.serviceWorker.controller.postMessage('clear');
|
||||||
}
|
}
|
||||||
|
|
||||||
navigator.serviceWorker.getRegistrations().then(registrations => {
|
const registrations = await navigator.serviceWorker.getRegistrations();
|
||||||
registrations.forEach(registration => registration.unregister());
|
for (const registration of registrations) {
|
||||||
});
|
registration.unregister();
|
||||||
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error(e);
|
console.error(e);
|
||||||
}
|
}
|
||||||
|
25
src/client/app/common/scripts/format-uptime.ts
Normal file
25
src/client/app/common/scripts/format-uptime.ts
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
|
||||||
|
/**
|
||||||
|
* Format like the uptime command
|
||||||
|
*/
|
||||||
|
export default function(sec) {
|
||||||
|
if (!sec) return sec;
|
||||||
|
|
||||||
|
const day = Math.floor(sec / 86400);
|
||||||
|
const tod = sec % 86400;
|
||||||
|
|
||||||
|
// Days part in string: 2 days, 1 day, null
|
||||||
|
const d = day >= 2 ? `${day} days` : day >= 1 ? `${day} day` : null;
|
||||||
|
|
||||||
|
// Time part in string: 1 sec, 1 min, 1:01
|
||||||
|
const t
|
||||||
|
= tod < 60 ? `${Math.floor(tod)} sec`
|
||||||
|
: tod < 3600 ? `${Math.floor(tod / 60)} min`
|
||||||
|
: `${Math.floor(tod / 60 / 60)}:${Math.floor((tod / 60) % 60).toString().padStart(2, "0")}`;
|
||||||
|
|
||||||
|
let str = '';
|
||||||
|
if (d) str += `${d}, `;
|
||||||
|
str += t;
|
||||||
|
|
||||||
|
return str;
|
||||||
|
}
|
@@ -2,27 +2,8 @@ export default function(me, settings, note) {
|
|||||||
const isMyNote = note.userId == me.id;
|
const isMyNote = note.userId == me.id;
|
||||||
const isPureRenote = note.renoteId != null && note.text == null && note.fileIds.length == 0 && note.poll == null;
|
const isPureRenote = note.renoteId != null && note.text == null && note.fileIds.length == 0 && note.poll == null;
|
||||||
|
|
||||||
if (settings.showMyRenotes === false) {
|
return settings.showMyRenotes === false && isMyNote && isPureRenote ||
|
||||||
if (isMyNote && isPureRenote) {
|
settings.showRenotedMyNotes === false && isPureRenote && note.renote.userId == me.id ||
|
||||||
return true;
|
settings.showLocalRenotes === false && isPureRenote && note.renote.user.host == null ||
|
||||||
}
|
!isMyNote && note.text && settings.mutedWords.some(q => q.length > 0 && !q.some(word => !note.text.includes(word)));
|
||||||
}
|
|
||||||
|
|
||||||
if (settings.showRenotedMyNotes === false) {
|
|
||||||
if (isPureRenote && (note.renote.userId == me.id)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (settings.showLocalRenotes === false) {
|
|
||||||
if (isPureRenote && (note.renote.user.host == null)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!isMyNote && note.text && settings.mutedWords.some(q => q.length > 0 && !q.some(word => !note.text.includes(word)))) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
@@ -111,9 +111,9 @@ export default class Stream extends EventEmitter {
|
|||||||
connections = [this.nonSharedConnections.find(c => c.id === id)];
|
connections = [this.nonSharedConnections.find(c => c.id === id)];
|
||||||
}
|
}
|
||||||
|
|
||||||
connections.filter(c => c != null).forEach(c => {
|
for (const c of connections.filter(c => c != null)) {
|
||||||
c.emit(body.type, body.body);
|
c.emit(body.type, body.body);
|
||||||
});
|
}
|
||||||
} else {
|
} else {
|
||||||
this.emit(type, body);
|
this.emit(type, body);
|
||||||
}
|
}
|
||||||
|
@@ -32,7 +32,7 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import { themeColor } from '../../../config';
|
import * as tinycolor from 'tinycolor2';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
props: {
|
props: {
|
||||||
@@ -75,7 +75,7 @@ export default Vue.extend({
|
|||||||
return this.dark ? '#fff' : '#777';
|
return this.dark ? '#fff' : '#777';
|
||||||
},
|
},
|
||||||
hHandColor(): string {
|
hHandColor(): string {
|
||||||
return themeColor;
|
return tinycolor(getComputedStyle(document.documentElement).getPropertyValue('--themeColor')).toHexString();
|
||||||
},
|
},
|
||||||
|
|
||||||
ms(): number {
|
ms(): number {
|
||||||
|
@@ -57,18 +57,18 @@ const emjdb: EmojiDef[] = lib.map((x: any) => ({
|
|||||||
url: `https://twemoji.maxcdn.com/2/svg/${char2file(x[1].char)}.svg`
|
url: `https://twemoji.maxcdn.com/2/svg/${char2file(x[1].char)}.svg`
|
||||||
}));
|
}));
|
||||||
|
|
||||||
lib.forEach((x: any) => {
|
for (const x of lib as any) {
|
||||||
if (x[1].keywords) {
|
if (x[1].keywords) {
|
||||||
x[1].keywords.forEach(k => {
|
for (const k of x[1].keywords) {
|
||||||
emjdb.push({
|
emjdb.push({
|
||||||
emoji: x[1].char,
|
emoji: x[1].char,
|
||||||
name: k,
|
name: k,
|
||||||
aliasOf: x[0],
|
aliasOf: x[0],
|
||||||
url: `https://twemoji.maxcdn.com/2/svg/${char2file(x[1].char)}.svg`
|
url: `https://twemoji.maxcdn.com/2/svg/${char2file(x[1].char)}.svg`
|
||||||
});
|
});
|
||||||
});
|
}
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
|
|
||||||
emjdb.sort((a, b) => a.name.length - b.name.length);
|
emjdb.sort((a, b) => a.name.length - b.name.length);
|
||||||
|
|
||||||
@@ -120,7 +120,7 @@ export default Vue.extend({
|
|||||||
const customEmojis = (this.$root.getMetaSync() || { emojis: [] }).emojis || [];
|
const customEmojis = (this.$root.getMetaSync() || { emojis: [] }).emojis || [];
|
||||||
const emojiDefinitions: EmojiDef[] = [];
|
const emojiDefinitions: EmojiDef[] = [];
|
||||||
|
|
||||||
customEmojis.forEach(x => {
|
for (const x of customEmojis) {
|
||||||
emojiDefinitions.push({
|
emojiDefinitions.push({
|
||||||
name: x.name,
|
name: x.name,
|
||||||
emoji: `:${x.name}:`,
|
emoji: `:${x.name}:`,
|
||||||
@@ -129,7 +129,7 @@ export default Vue.extend({
|
|||||||
});
|
});
|
||||||
|
|
||||||
if (x.aliases) {
|
if (x.aliases) {
|
||||||
x.aliases.forEach(alias => {
|
for (const alias of x.aliases) {
|
||||||
emojiDefinitions.push({
|
emojiDefinitions.push({
|
||||||
name: alias,
|
name: alias,
|
||||||
aliasOf: x.name,
|
aliasOf: x.name,
|
||||||
@@ -137,9 +137,9 @@ export default Vue.extend({
|
|||||||
url: x.url,
|
url: x.url,
|
||||||
isCustomEmoji: true
|
isCustomEmoji: true
|
||||||
});
|
});
|
||||||
});
|
}
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
|
|
||||||
emojiDefinitions.sort((a, b) => a.name.length - b.name.length);
|
emojiDefinitions.sort((a, b) => a.name.length - b.name.length);
|
||||||
|
|
||||||
@@ -148,9 +148,9 @@ export default Vue.extend({
|
|||||||
|
|
||||||
this.textarea.addEventListener('keydown', this.onKeydown);
|
this.textarea.addEventListener('keydown', this.onKeydown);
|
||||||
|
|
||||||
Array.from(document.querySelectorAll('body *')).forEach(el => {
|
for (const el of Array.from(document.querySelectorAll('body *'))) {
|
||||||
el.addEventListener('mousedown', this.onMousedown);
|
el.addEventListener('mousedown', this.onMousedown);
|
||||||
});
|
}
|
||||||
|
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
this.exec();
|
this.exec();
|
||||||
@@ -166,18 +166,18 @@ export default Vue.extend({
|
|||||||
beforeDestroy() {
|
beforeDestroy() {
|
||||||
this.textarea.removeEventListener('keydown', this.onKeydown);
|
this.textarea.removeEventListener('keydown', this.onKeydown);
|
||||||
|
|
||||||
Array.from(document.querySelectorAll('body *')).forEach(el => {
|
for (const el of Array.from(document.querySelectorAll('body *'))) {
|
||||||
el.removeEventListener('mousedown', this.onMousedown);
|
el.removeEventListener('mousedown', this.onMousedown);
|
||||||
});
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
exec() {
|
exec() {
|
||||||
this.select = -1;
|
this.select = -1;
|
||||||
if (this.$refs.suggests) {
|
if (this.$refs.suggests) {
|
||||||
Array.from(this.items).forEach(el => {
|
for (const el of Array.from(this.items)) {
|
||||||
el.removeAttribute('data-selected');
|
el.removeAttribute('data-selected');
|
||||||
});
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.type == 'user') {
|
if (this.type == 'user') {
|
||||||
@@ -316,9 +316,9 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
applySelect() {
|
applySelect() {
|
||||||
Array.from(this.items).forEach(el => {
|
for (const el of Array.from(this.items)) {
|
||||||
el.removeAttribute('data-selected');
|
el.removeAttribute('data-selected');
|
||||||
});
|
}
|
||||||
|
|
||||||
this.items[this.select].setAttribute('data-selected', 'true');
|
this.items[this.select].setAttribute('data-selected', 'true');
|
||||||
(this.items[this.select] as any).focus();
|
(this.items[this.select] as any).focus();
|
||||||
|
@@ -114,11 +114,11 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
onScroll(e) {
|
onScroll(e) {
|
||||||
const section = this.categories.forEach(x => {
|
for (const x of this.categories) {
|
||||||
const top = e.target.scrollTop;
|
const top = e.target.scrollTop;
|
||||||
const el = this.$refs[x.ref][0];
|
const el = this.$refs[x.ref][0];
|
||||||
x.isActive = el.offsetTop <= top && el.offsetTop + el.offsetHeight > top;
|
x.isActive = el.offsetTop <= top && el.offsetTop + el.offsetHeight > top;
|
||||||
});
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
chosen(emoji) {
|
chosen(emoji) {
|
||||||
|
@@ -31,8 +31,8 @@
|
|||||||
@click="set(i)"
|
@click="set(i)"
|
||||||
:title="`${String.fromCharCode(65 + o.transformPosToXy(i)[0])}${o.transformPosToXy(i)[1] + 1}`">
|
:title="`${String.fromCharCode(65 + o.transformPosToXy(i)[0])}${o.transformPosToXy(i)[1] + 1}`">
|
||||||
<template v-if="!$store.state.settings.games.reversi.useWhiteBlackStones">
|
<template v-if="!$store.state.settings.games.reversi.useWhiteBlackStones">
|
||||||
<img v-if="stone === true" :src="blackUser.avatarUrl" alt="black" :class="{ contrast: $store.state.settings.games.reversi.useContrastStones }">
|
<img v-if="stone === true" :src="blackUser.avatarUrl" alt="black">
|
||||||
<img v-if="stone === false" :src="whiteUser.avatarUrl" alt="white" :class="{ contrast: $store.state.settings.games.reversi.useContrastStones }">
|
<img v-if="stone === false" :src="whiteUser.avatarUrl" alt="white">
|
||||||
</template>
|
</template>
|
||||||
<template v-if="$store.state.settings.games.reversi.useWhiteBlackStones">
|
<template v-if="$store.state.settings.games.reversi.useWhiteBlackStones">
|
||||||
<fa v-if="stone === true" :icon="fasCircle"/>
|
<fa v-if="stone === true" :icon="fasCircle"/>
|
||||||
@@ -185,9 +185,9 @@ export default Vue.extend({
|
|||||||
loopedBoard: this.game.settings.loopedBoard
|
loopedBoard: this.game.settings.loopedBoard
|
||||||
});
|
});
|
||||||
|
|
||||||
this.game.logs.forEach(log => {
|
for (const log of this.game.logs) {
|
||||||
this.o.put(log.color, log.pos);
|
this.o.put(log.color, log.pos);
|
||||||
});
|
}
|
||||||
|
|
||||||
this.logs = this.game.logs;
|
this.logs = this.game.logs;
|
||||||
this.logPos = this.logs.length;
|
this.logPos = this.logs.length;
|
||||||
@@ -287,9 +287,9 @@ export default Vue.extend({
|
|||||||
loopedBoard: this.game.settings.loopedBoard
|
loopedBoard: this.game.settings.loopedBoard
|
||||||
});
|
});
|
||||||
|
|
||||||
this.game.logs.forEach(log => {
|
for (const log of this.game.logs) {
|
||||||
this.o.put(log.color, log.pos, true);
|
this.o.put(log.color, log.pos, true);
|
||||||
});
|
}
|
||||||
|
|
||||||
this.logs = this.game.logs;
|
this.logs = this.game.logs;
|
||||||
this.logPos = this.logs.length;
|
this.logPos = this.logs.length;
|
||||||
@@ -430,13 +430,6 @@ export default Vue.extend({
|
|||||||
width 100%
|
width 100%
|
||||||
height 100%
|
height 100%
|
||||||
|
|
||||||
&.contrast
|
|
||||||
&[alt="black"]
|
|
||||||
filter brightness(.5)
|
|
||||||
|
|
||||||
&[alt="white"]
|
|
||||||
filter brightness(2)
|
|
||||||
|
|
||||||
> .graph
|
> .graph
|
||||||
display grid
|
display grid
|
||||||
grid-template-columns repeat(61, 1fr)
|
grid-template-columns repeat(61, 1fr)
|
||||||
|
@@ -60,7 +60,7 @@
|
|||||||
|
|
||||||
<div>
|
<div>
|
||||||
<template v-for="item in form">
|
<template v-for="item in form">
|
||||||
<ui-switch v-if="item.type == 'switch'" v-model="item.value" :key="item.id" :text="item.label" @change="onChangeForm(item)">{{ item.desc || '' }}</ui-switch>
|
<ui-switch v-if="item.type == 'switch'" v-model="item.value" :key="item.id" @change="onChangeForm(item)">{{ item.label || item.desc || '' }}</ui-switch>
|
||||||
|
|
||||||
<div class="card" v-if="item.type == 'radio'" :key="item.id">
|
<div class="card" v-if="item.type == 'radio'" :key="item.id">
|
||||||
<header>
|
<header>
|
||||||
|
@@ -1,22 +1,22 @@
|
|||||||
<template>
|
<template>
|
||||||
<ui-card>
|
<ui-card v-if="enableTwitterIntegration || enableDiscordIntegration || enableGithubIntegration">
|
||||||
<div slot="title"><fa icon="share-alt"/> {{ $t('title') }}</div>
|
<div slot="title"><fa icon="share-alt"/> {{ $t('title') }}</div>
|
||||||
|
|
||||||
<section>
|
<section v-if="enableTwitterIntegration">
|
||||||
<header><fa :icon="['fab', 'twitter']"/> Twitter</header>
|
<header><fa :icon="['fab', 'twitter']"/> Twitter</header>
|
||||||
<p v-if="$store.state.i.twitter">{{ $t('connected-to') }}: <a :href="`https://twitter.com/${$store.state.i.twitter.screenName}`" target="_blank">@{{ $store.state.i.twitter.screenName }}</a></p>
|
<p v-if="$store.state.i.twitter">{{ $t('connected-to') }}: <a :href="`https://twitter.com/${$store.state.i.twitter.screenName}`" target="_blank">@{{ $store.state.i.twitter.screenName }}</a></p>
|
||||||
<ui-button v-if="$store.state.i.twitter" @click="disconnectTwitter">{{ $t('disconnect') }}</ui-button>
|
<ui-button v-if="$store.state.i.twitter" @click="disconnectTwitter">{{ $t('disconnect') }}</ui-button>
|
||||||
<ui-button v-else @click="connectTwitter">{{ $t('connect') }}</ui-button>
|
<ui-button v-else @click="connectTwitter">{{ $t('connect') }}</ui-button>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section>
|
<section v-if="enableDiscordIntegration">
|
||||||
<header><fa :icon="['fab', 'discord']"/> Discord</header>
|
<header><fa :icon="['fab', 'discord']"/> Discord</header>
|
||||||
<p v-if="$store.state.i.discord">{{ $t('connected-to') }}: <a :href="`https://discordapp.com/users/${$store.state.i.discord.id}`" target="_blank">@{{ $store.state.i.discord.username }}#{{ $store.state.i.discord.discriminator }}</a></p>
|
<p v-if="$store.state.i.discord">{{ $t('connected-to') }}: <a :href="`https://discordapp.com/users/${$store.state.i.discord.id}`" target="_blank">@{{ $store.state.i.discord.username }}#{{ $store.state.i.discord.discriminator }}</a></p>
|
||||||
<ui-button v-if="$store.state.i.discord" @click="disconnectDiscord">{{ $t('disconnect') }}</ui-button>
|
<ui-button v-if="$store.state.i.discord" @click="disconnectDiscord">{{ $t('disconnect') }}</ui-button>
|
||||||
<ui-button v-else @click="connectDiscord">{{ $t('connect') }}</ui-button>
|
<ui-button v-else @click="connectDiscord">{{ $t('connect') }}</ui-button>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section>
|
<section v-if="enableGithubIntegration">
|
||||||
<header><fa :icon="['fab', 'github']"/> GitHub</header>
|
<header><fa :icon="['fab', 'github']"/> GitHub</header>
|
||||||
<p v-if="$store.state.i.github">{{ $t('connected-to') }}: <a :href="`https://github.com/${$store.state.i.github.login}`" target="_blank">@{{ $store.state.i.github.login }}</a></p>
|
<p v-if="$store.state.i.github">{{ $t('connected-to') }}: <a :href="`https://github.com/${$store.state.i.github.login}`" target="_blank">@{{ $store.state.i.github.login }}</a></p>
|
||||||
<ui-button v-if="$store.state.i.github" @click="disconnectGithub">{{ $t('disconnect') }}</ui-button>
|
<ui-button v-if="$store.state.i.github" @click="disconnectGithub">{{ $t('disconnect') }}</ui-button>
|
||||||
@@ -39,14 +39,32 @@ export default Vue.extend({
|
|||||||
twitterForm: null,
|
twitterForm: null,
|
||||||
discordForm: null,
|
discordForm: null,
|
||||||
githubForm: null,
|
githubForm: null,
|
||||||
|
enableTwitterIntegration: false,
|
||||||
|
enableDiscordIntegration: false,
|
||||||
|
enableGithubIntegration: false,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
|
created() {
|
||||||
|
this.$root.getMeta().then(meta => {
|
||||||
|
this.enableTwitterIntegration = meta.enableTwitterIntegration;
|
||||||
|
this.enableDiscordIntegration = meta.enableDiscordIntegration;
|
||||||
|
this.enableGithubIntegration = meta.enableGithubIntegration;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
mounted() {
|
mounted() {
|
||||||
|
document.cookie = `i=${this.$store.state.i.token}`;
|
||||||
this.$watch('$store.state.i', () => {
|
this.$watch('$store.state.i', () => {
|
||||||
if (this.$store.state.i.twitter) {
|
if (this.$store.state.i.twitter) {
|
||||||
if (this.twitterForm) this.twitterForm.close();
|
if (this.twitterForm) this.twitterForm.close();
|
||||||
}
|
}
|
||||||
|
if (this.$store.state.i.discord) {
|
||||||
|
if (this.discordForm) this.discordForm.close();
|
||||||
|
}
|
||||||
|
if (this.$store.state.i.github) {
|
||||||
|
if (this.githubForm) this.githubForm.close();
|
||||||
|
}
|
||||||
}, {
|
}, {
|
||||||
deep: true
|
deep: true
|
||||||
});
|
});
|
||||||
|
70
src/client/app/common/views/components/mention.vue
Normal file
70
src/client/app/common/views/components/mention.vue
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
<template>
|
||||||
|
<router-link class="ldlomzub" :to="`/@${ canonical }`" v-user-preview="canonical">
|
||||||
|
<span class="me" v-if="isMe">{{ $t('@.you') }}</span>
|
||||||
|
<span class="main">
|
||||||
|
<span class="username">@{{ username }}</span>
|
||||||
|
<span class="host" :class="{ fade: $store.state.settings.contrastedAcct }" v-if="(host != localHost) || $store.state.settings.showFullAcct">@{{ toUnicode(host) }}</span>
|
||||||
|
</span>
|
||||||
|
</router-link>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
import i18n from '../../../i18n';
|
||||||
|
import { toUnicode } from 'punycode';
|
||||||
|
import { host as localHost } from '../../../config';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
i18n: i18n(),
|
||||||
|
props: {
|
||||||
|
username: {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
host: {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
localHost
|
||||||
|
};
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
canonical(): string {
|
||||||
|
return `@${this.username}@${toUnicode(this.host)}`;
|
||||||
|
},
|
||||||
|
isMe(): boolean {
|
||||||
|
return this.$store.getters.isSignedIn && this.canonical.toLowerCase() === `@${this.$store.state.i.username}@${toUnicode(localHost)}`.toLowerCase();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
toUnicode
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
.ldlomzub
|
||||||
|
color var(--mfmMention)
|
||||||
|
|
||||||
|
> .me
|
||||||
|
pointer-events none
|
||||||
|
user-select none
|
||||||
|
padding 0 4px
|
||||||
|
background var(--primary)
|
||||||
|
border solid 1px var(--primary)
|
||||||
|
border-radius 4px 0 0 4px
|
||||||
|
color var(--primaryForeground)
|
||||||
|
|
||||||
|
& + .main
|
||||||
|
padding 0 4px
|
||||||
|
border solid 1px var(--primary)
|
||||||
|
border-radius 0 4px 4px 0
|
||||||
|
|
||||||
|
> .main
|
||||||
|
> .host.fade
|
||||||
|
opacity 0.5
|
||||||
|
|
||||||
|
</style>
|
@@ -9,7 +9,7 @@
|
|||||||
@keypress="onKeypress"
|
@keypress="onKeypress"
|
||||||
@paste="onPaste"
|
@paste="onPaste"
|
||||||
:placeholder="$t('input-message-here')"
|
:placeholder="$t('input-message-here')"
|
||||||
v-autocomplete="'text'"
|
v-autocomplete="{ model: 'text' }"
|
||||||
></textarea>
|
></textarea>
|
||||||
<div class="file" @click="file = null" v-if="file">{{ file.name }}</div>
|
<div class="file" @click="file = null" v-if="file">{{ file.name }}</div>
|
||||||
<mk-uploader ref="uploader" @uploaded="onUploaded"/>
|
<mk-uploader ref="uploader" @uploaded="onUploaded"/>
|
||||||
|
@@ -196,12 +196,12 @@ export default Vue.extend({
|
|||||||
|
|
||||||
onRead(ids) {
|
onRead(ids) {
|
||||||
if (!Array.isArray(ids)) ids = [ids];
|
if (!Array.isArray(ids)) ids = [ids];
|
||||||
ids.forEach(id => {
|
for (const id of ids) {
|
||||||
if (this.messages.some(x => x.id == id)) {
|
if (this.messages.some(x => x.id == id)) {
|
||||||
const exist = this.messages.map(x => x.id).indexOf(id);
|
const exist = this.messages.map(x => x.id).indexOf(id);
|
||||||
this.messages[exist].isRead = true;
|
this.messages[exist].isRead = true;
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
isBottom() {
|
isBottom() {
|
||||||
@@ -248,13 +248,13 @@ export default Vue.extend({
|
|||||||
|
|
||||||
onVisibilitychange() {
|
onVisibilitychange() {
|
||||||
if (document.hidden) return;
|
if (document.hidden) return;
|
||||||
this.messages.forEach(message => {
|
for (const message of this.messages) {
|
||||||
if (message.userId !== this.$store.state.i.id && !message.isRead) {
|
if (message.userId !== this.$store.state.i.id && !message.isRead) {
|
||||||
this.connection.send('read', {
|
this.connection.send('read', {
|
||||||
id: message.id
|
id: message.id
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@@ -103,10 +103,10 @@ export default Vue.extend({
|
|||||||
this.messages.unshift(message);
|
this.messages.unshift(message);
|
||||||
},
|
},
|
||||||
onRead(ids) {
|
onRead(ids) {
|
||||||
ids.forEach(id => {
|
for (const id of ids) {
|
||||||
const found = this.messages.find(m => m.id == id);
|
const found = this.messages.find(m => m.id == id);
|
||||||
if (found) found.isRead = true;
|
if (found) found.isRead = true;
|
||||||
});
|
}
|
||||||
},
|
},
|
||||||
search() {
|
search() {
|
||||||
if (this.q == '') {
|
if (this.q == '') {
|
||||||
|
@@ -3,11 +3,12 @@ import { length } from 'stringz';
|
|||||||
import { Node } from '../../../../../mfm/parser';
|
import { Node } from '../../../../../mfm/parser';
|
||||||
import parse from '../../../../../mfm/parse';
|
import parse from '../../../../../mfm/parse';
|
||||||
import MkUrl from './url.vue';
|
import MkUrl from './url.vue';
|
||||||
|
import MkMention from './mention.vue';
|
||||||
import { concat, sum } from '../../../../../prelude/array';
|
import { concat, sum } from '../../../../../prelude/array';
|
||||||
import MkFormula from './formula.vue';
|
import MkFormula from './formula.vue';
|
||||||
import MkGoogle from './google.vue';
|
import MkGoogle from './google.vue';
|
||||||
import { toUnicode } from 'punycode';
|
|
||||||
import syntaxHighlight from '../../../../../mfm/syntax-highlight';
|
import syntaxHighlight from '../../../../../mfm/syntax-highlight';
|
||||||
|
import { host } from '../../../config';
|
||||||
|
|
||||||
function getTextCount(tokens: Node[]): number {
|
function getTextCount(tokens: Node[]): number {
|
||||||
const rootCount = sum(tokens.filter(x => x.name === 'text').map(x => length(x.props.text)));
|
const rootCount = sum(tokens.filter(x => x.name === 'text').map(x => length(x.props.text)));
|
||||||
@@ -158,21 +159,13 @@ export default Vue.component('misskey-flavored-markdown', {
|
|||||||
}
|
}
|
||||||
|
|
||||||
case 'mention': {
|
case 'mention': {
|
||||||
const host = token.props.host == null && this.author && this.author.host != null ? this.author.host : token.props.host;
|
return [createElement(MkMention, {
|
||||||
const canonical = host != null ? `@${token.props.username}@${toUnicode(host)}` : `@${token.props.username}`;
|
|
||||||
return (createElement as any)('router-link', {
|
|
||||||
key: Math.random(),
|
key: Math.random(),
|
||||||
attrs: {
|
props: {
|
||||||
to: `/${canonical}`,
|
host: (token.props.host == null && this.author && this.author.host != null ? this.author.host : token.props.host) || host,
|
||||||
// TODO
|
username: token.props.username
|
||||||
//dataIsMe: (this as any).i && getAcct((this as any).i) == getAcct(token),
|
}
|
||||||
style: 'color:var(--mfmMention);'
|
})];
|
||||||
},
|
|
||||||
directives: [{
|
|
||||||
name: 'user-preview',
|
|
||||||
value: canonical
|
|
||||||
}]
|
|
||||||
}, canonical);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
case 'hashtag': {
|
case 'hashtag': {
|
||||||
|
53
src/client/app/common/views/components/particle.vue
Normal file
53
src/client/app/common/views/components/particle.vue
Normal file
File diff suppressed because one or more lines are too long
@@ -55,12 +55,12 @@ export default Vue.extend({
|
|||||||
noteId: this.note.id,
|
noteId: this.note.id,
|
||||||
choice: id
|
choice: id
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
this.poll.choices.forEach(c => {
|
for (const c of this.poll.choices) {
|
||||||
if (c.id == id) {
|
if (c.id == id) {
|
||||||
c.votes++;
|
c.votes++;
|
||||||
Vue.set(c, 'isVoted', true);
|
Vue.set(c, 'isVoted', true);
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
this.showResult = true;
|
this.showResult = true;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@@ -4,16 +4,16 @@
|
|||||||
<div class="popover" :class="{ compact, big }" ref="popover">
|
<div class="popover" :class="{ compact, big }" ref="popover">
|
||||||
<p v-if="!compact">{{ title }}</p>
|
<p v-if="!compact">{{ title }}</p>
|
||||||
<div ref="buttons" :class="{ showFocus }">
|
<div ref="buttons" :class="{ showFocus }">
|
||||||
<button @click="react('like')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="1" :title="$t('@.reactions.like')"><mk-reaction-icon reaction='like'/></button>
|
<button @click="react('like')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="1" :title="$t('@.reactions.like')" v-particle><mk-reaction-icon reaction="like"/></button>
|
||||||
<button @click="react('love')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="2" :title="$t('@.reactions.love')"><mk-reaction-icon reaction='love'/></button>
|
<button @click="react('love')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="2" :title="$t('@.reactions.love')" v-particle><mk-reaction-icon reaction="love"/></button>
|
||||||
<button @click="react('laugh')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="3" :title="$t('@.reactions.laugh')"><mk-reaction-icon reaction='laugh'/></button>
|
<button @click="react('laugh')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="3" :title="$t('@.reactions.laugh')" v-particle><mk-reaction-icon reaction="laugh"/></button>
|
||||||
<button @click="react('hmm')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="4" :title="$t('@.reactions.hmm')"><mk-reaction-icon reaction='hmm'/></button>
|
<button @click="react('hmm')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="4" :title="$t('@.reactions.hmm')" v-particle><mk-reaction-icon reaction="hmm"/></button>
|
||||||
<button @click="react('surprise')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="5" :title="$t('@.reactions.surprise')"><mk-reaction-icon reaction='surprise'/></button>
|
<button @click="react('surprise')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="5" :title="$t('@.reactions.surprise')" v-particle><mk-reaction-icon reaction="surprise"/></button>
|
||||||
<button @click="react('congrats')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="6" :title="$t('@.reactions.congrats')"><mk-reaction-icon reaction='congrats'/></button>
|
<button @click="react('congrats')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="6" :title="$t('@.reactions.congrats')" v-particle><mk-reaction-icon reaction="congrats"/></button>
|
||||||
<button @click="react('angry')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="7" :title="$t('@.reactions.angry')"><mk-reaction-icon reaction='angry'/></button>
|
<button @click="react('angry')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="7" :title="$t('@.reactions.angry')" v-particle><mk-reaction-icon reaction="angry"/></button>
|
||||||
<button @click="react('confused')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="8" :title="$t('@.reactions.confused')"><mk-reaction-icon reaction='confused'/></button>
|
<button @click="react('confused')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="8" :title="$t('@.reactions.confused')" v-particle><mk-reaction-icon reaction="confused"/></button>
|
||||||
<button @click="react('rip')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="9" :title="$t('@.reactions.rip')"><mk-reaction-icon reaction='rip'/></button>
|
<button @click="react('rip')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="9" :title="$t('@.reactions.rip')" v-particle><mk-reaction-icon reaction="rip"/></button>
|
||||||
<button @click="react('pudding')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="10" :title="$t('@.reactions.pudding')"><mk-reaction-icon reaction='pudding'/></button>
|
<button @click="react('pudding')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="10" :title="$t('@.reactions.pudding')" v-particle><mk-reaction-icon reaction="pudding"/></button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@@ -1,36 +1,106 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mk-reactions-viewer">
|
<div class="mk-reactions-viewer">
|
||||||
<template v-if="reactions">
|
<template v-if="reactions">
|
||||||
<span :class="{ reacted: note.myReaction == 'like' }" @click="react('like')" v-if="reactions.like"><mk-reaction-icon reaction="like"/><span>{{ reactions.like }}</span></span>
|
<span :class="{ reacted: note.myReaction == 'like' }" @click="react('like')" v-if="reactions.like" v-particle><mk-reaction-icon reaction="like" ref="like"/><span>{{ reactions.like }}</span></span>
|
||||||
<span :class="{ reacted: note.myReaction == 'love' }" @click="react('love')" v-if="reactions.love"><mk-reaction-icon reaction="love"/><span>{{ reactions.love }}</span></span>
|
<span :class="{ reacted: note.myReaction == 'love' }" @click="react('love')" v-if="reactions.love" v-particle><mk-reaction-icon reaction="love" ref="love"/><span>{{ reactions.love }}</span></span>
|
||||||
<span :class="{ reacted: note.myReaction == 'laugh' }" @click="react('laugh')" v-if="reactions.laugh"><mk-reaction-icon reaction="laugh"/><span>{{ reactions.laugh }}</span></span>
|
<span :class="{ reacted: note.myReaction == 'laugh' }" @click="react('laugh')" v-if="reactions.laugh" v-particle><mk-reaction-icon reaction="laugh" ref="laugh"/><span>{{ reactions.laugh }}</span></span>
|
||||||
<span :class="{ reacted: note.myReaction == 'hmm' }" @click="react('hmm')" v-if="reactions.hmm"><mk-reaction-icon reaction="hmm"/><span>{{ reactions.hmm }}</span></span>
|
<span :class="{ reacted: note.myReaction == 'hmm' }" @click="react('hmm')" v-if="reactions.hmm" v-particle><mk-reaction-icon reaction="hmm" ref="hmm"/><span>{{ reactions.hmm }}</span></span>
|
||||||
<span :class="{ reacted: note.myReaction == 'surprise' }" @click="react('surprise')" v-if="reactions.surprise"><mk-reaction-icon reaction="surprise"/><span>{{ reactions.surprise }}</span></span>
|
<span :class="{ reacted: note.myReaction == 'surprise' }" @click="react('surprise')" v-if="reactions.surprise" v-particle><mk-reaction-icon reaction="surprise" ref="surprise"/><span>{{ reactions.surprise }}</span></span>
|
||||||
<span :class="{ reacted: note.myReaction == 'congrats' }" @click="react('congrats')" v-if="reactions.congrats"><mk-reaction-icon reaction="congrats"/><span>{{ reactions.congrats }}</span></span>
|
<span :class="{ reacted: note.myReaction == 'congrats' }" @click="react('congrats')" v-if="reactions.congrats" v-particle><mk-reaction-icon reaction="congrats" ref="congrats"/><span>{{ reactions.congrats }}</span></span>
|
||||||
<span :class="{ reacted: note.myReaction == 'angry' }" @click="react('angry')" v-if="reactions.angry"><mk-reaction-icon reaction="angry"/><span>{{ reactions.angry }}</span></span>
|
<span :class="{ reacted: note.myReaction == 'angry' }" @click="react('angry')" v-if="reactions.angry" v-particle><mk-reaction-icon reaction="angry" ref="angry"/><span>{{ reactions.angry }}</span></span>
|
||||||
<span :class="{ reacted: note.myReaction == 'confused' }" @click="react('confused')" v-if="reactions.confused"><mk-reaction-icon reaction="confused"/><span>{{ reactions.confused }}</span></span>
|
<span :class="{ reacted: note.myReaction == 'confused' }" @click="react('confused')" v-if="reactions.confused" v-particle><mk-reaction-icon reaction="confused" ref="confused"/><span>{{ reactions.confused }}</span></span>
|
||||||
<span :class="{ reacted: note.myReaction == 'rip' }" @click="react('rip')" v-if="reactions.rip"><mk-reaction-icon reaction="rip"/><span>{{ reactions.rip }}</span></span>
|
<span :class="{ reacted: note.myReaction == 'rip' }" @click="react('rip')" v-if="reactions.rip" v-particle><mk-reaction-icon reaction="rip" ref="rip"/><span>{{ reactions.rip }}</span></span>
|
||||||
<span :class="{ reacted: note.myReaction == 'pudding' }" @click="react('pudding')" v-if="reactions.pudding"><mk-reaction-icon reaction="pudding"/><span>{{ reactions.pudding }}</span></span>
|
<span :class="{ reacted: note.myReaction == 'pudding' }" @click="react('pudding')" v-if="reactions.pudding" v-particle><mk-reaction-icon reaction="pudding" ref="pudding"/><span>{{ reactions.pudding }}</span></span>
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
|
import Icon from './reaction-icon.vue';
|
||||||
|
import * as anime from 'animejs';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
props: ['note'],
|
props: ['note'],
|
||||||
computed: {
|
computed: {
|
||||||
reactions(): number {
|
reactions(): any {
|
||||||
return this.note.reactionCounts;
|
return this.note.reactionCounts;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
watch: {
|
||||||
|
'reactions.like'() {
|
||||||
|
this.anime('like');
|
||||||
|
},
|
||||||
|
'reactions.love'() {
|
||||||
|
this.anime('love');
|
||||||
|
},
|
||||||
|
'reactions.laugh'() {
|
||||||
|
this.anime('laugh');
|
||||||
|
},
|
||||||
|
'reactions.hmm'() {
|
||||||
|
this.anime('hmm');
|
||||||
|
},
|
||||||
|
'reactions.surprise'() {
|
||||||
|
this.anime('surprise');
|
||||||
|
},
|
||||||
|
'reactions.congrats'() {
|
||||||
|
this.anime('congrats');
|
||||||
|
},
|
||||||
|
'reactions.angry'() {
|
||||||
|
this.anime('angry');
|
||||||
|
},
|
||||||
|
'reactions.confused'() {
|
||||||
|
this.anime('confused');
|
||||||
|
},
|
||||||
|
'reactions.rip'() {
|
||||||
|
this.anime('rip');
|
||||||
|
},
|
||||||
|
'reactions.pudding'() {
|
||||||
|
this.anime('pudding');
|
||||||
|
}
|
||||||
|
},
|
||||||
methods: {
|
methods: {
|
||||||
react(reaction: string) {
|
react(reaction: string) {
|
||||||
this.$root.api('notes/reactions/create', {
|
this.$root.api('notes/reactions/create', {
|
||||||
noteId: this.note.id,
|
noteId: this.note.id,
|
||||||
reaction: reaction
|
reaction: reaction
|
||||||
});
|
});
|
||||||
|
},
|
||||||
|
anime(reaction: string) {
|
||||||
|
if (this.$store.state.device.reduceMotion) return;
|
||||||
|
|
||||||
|
this.$nextTick(() => {
|
||||||
|
const rect = this.$refs[reaction].$el.getBoundingClientRect();
|
||||||
|
|
||||||
|
const x = rect.left;
|
||||||
|
const y = rect.top;
|
||||||
|
|
||||||
|
const icon = new Icon({
|
||||||
|
parent: this,
|
||||||
|
propsData: {
|
||||||
|
reaction: reaction
|
||||||
|
}
|
||||||
|
}).$mount();
|
||||||
|
|
||||||
|
icon.$el.style.position = 'absolute';
|
||||||
|
icon.$el.style.zIndex = 100;
|
||||||
|
icon.$el.style.top = (y + window.scrollY) + 'px';
|
||||||
|
icon.$el.style.left = (x + window.scrollX) + 'px';
|
||||||
|
icon.$el.style.fontSize = window.getComputedStyle(this.$refs[reaction].$el).fontSize;
|
||||||
|
|
||||||
|
document.body.appendChild(icon.$el);
|
||||||
|
|
||||||
|
anime({
|
||||||
|
targets: icon.$el,
|
||||||
|
opacity: [1, 0],
|
||||||
|
translateY: [0, -64],
|
||||||
|
duration: 1000,
|
||||||
|
easing: 'linear',
|
||||||
|
complete: () => {
|
||||||
|
icon.destroyDom();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<component class="dmtdnykelhudezerjlfpbhgovrgnqqgr"
|
<component class="dmtdnykelhudezerjlfpbhgovrgnqqgr"
|
||||||
:is="link ? 'a' : 'button'"
|
:is="link ? 'a' : 'button'"
|
||||||
:class="[styl, { inline, primary }]"
|
:class="{ inline, primary, wait }"
|
||||||
:type="type"
|
:type="type"
|
||||||
@click="$emit('click')"
|
@click="$emit('click')"
|
||||||
@mousedown="onMousedown"
|
@mousedown="onMousedown"
|
||||||
@@ -48,11 +48,11 @@ export default Vue.extend({
|
|||||||
required: false,
|
required: false,
|
||||||
default: false
|
default: false
|
||||||
},
|
},
|
||||||
},
|
wait: {
|
||||||
data() {
|
type: Boolean,
|
||||||
return {
|
required: false,
|
||||||
styl: 'fill'
|
default: false
|
||||||
};
|
},
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
if (this.autofocus) {
|
if (this.autofocus) {
|
||||||
@@ -121,6 +121,24 @@ export default Vue.extend({
|
|||||||
box-shadow none
|
box-shadow none
|
||||||
text-decoration none
|
text-decoration none
|
||||||
user-select none
|
user-select none
|
||||||
|
color var(--text)
|
||||||
|
background var(--buttonBg)
|
||||||
|
|
||||||
|
&:not(:disabled):hover
|
||||||
|
background var(--buttonHoverBg)
|
||||||
|
|
||||||
|
&:not(:disabled):active
|
||||||
|
background var(--buttonActiveBg)
|
||||||
|
|
||||||
|
&.primary
|
||||||
|
color var(--primaryForeground)
|
||||||
|
background var(--primary)
|
||||||
|
|
||||||
|
&:not(:disabled):hover
|
||||||
|
background var(--primaryLighten5)
|
||||||
|
|
||||||
|
&:not(:disabled):active
|
||||||
|
background var(--primaryDarken5)
|
||||||
|
|
||||||
*
|
*
|
||||||
pointer-events none
|
pointer-events none
|
||||||
@@ -152,35 +170,25 @@ export default Vue.extend({
|
|||||||
&.primary
|
&.primary
|
||||||
font-weight bold
|
font-weight bold
|
||||||
|
|
||||||
&.fill
|
&.wait
|
||||||
color var(--text)
|
background linear-gradient(
|
||||||
background var(--buttonBg)
|
45deg,
|
||||||
|
var(--primaryDarken10) 25%,
|
||||||
|
var(--primary) 25%,
|
||||||
|
var(--primary) 50%,
|
||||||
|
var(--primaryDarken10) 50%,
|
||||||
|
var(--primaryDarken10) 75%,
|
||||||
|
var(--primary) 75%,
|
||||||
|
var(--primary)
|
||||||
|
)
|
||||||
|
background-size 32px 32px
|
||||||
|
animation stripe-bg 1.5s linear infinite
|
||||||
|
opacity 0.7
|
||||||
|
cursor wait
|
||||||
|
|
||||||
&:not(:disabled):hover
|
@keyframes stripe-bg
|
||||||
background var(--buttonHoverBg)
|
from {background-position: 0 0;}
|
||||||
|
to {background-position: -64px 32px;}
|
||||||
&:not(:disabled):active
|
|
||||||
background var(--buttonActiveBg)
|
|
||||||
|
|
||||||
&.primary
|
|
||||||
color var(--primaryForeground)
|
|
||||||
background var(--primary)
|
|
||||||
|
|
||||||
&:not(:disabled):hover
|
|
||||||
background var(--primaryLighten5)
|
|
||||||
|
|
||||||
&:not(:disabled):active
|
|
||||||
background var(--primaryDarken5)
|
|
||||||
|
|
||||||
&:not(.fill)
|
|
||||||
color var(--primary)
|
|
||||||
background none
|
|
||||||
|
|
||||||
&:not(:disabled):hover
|
|
||||||
color var(--primaryDarken5)
|
|
||||||
|
|
||||||
&:not(:disabled):active
|
|
||||||
background var(--primaryAlpha03)
|
|
||||||
|
|
||||||
> .ripples
|
> .ripples
|
||||||
position absolute
|
position absolute
|
||||||
|
@@ -170,6 +170,9 @@ export default Vue.extend({
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (url.hostname === 'music.youtube.com')
|
||||||
|
url.hostname = 'youtube.com';
|
||||||
|
|
||||||
fetch(`/url?url=${encodeURIComponent(this.url)}`).then(res => {
|
fetch(`/url?url=${encodeURIComponent(this.url)}`).then(res => {
|
||||||
res.json().then(info => {
|
res.json().then(info => {
|
||||||
if (info.url == null) return;
|
if (info.url == null) return;
|
||||||
|
@@ -21,21 +21,23 @@ class Autocomplete {
|
|||||||
private suggestion: any;
|
private suggestion: any;
|
||||||
private textarea: any;
|
private textarea: any;
|
||||||
private vm: any;
|
private vm: any;
|
||||||
private model: any;
|
|
||||||
private currentType: string;
|
private currentType: string;
|
||||||
|
private opts: {
|
||||||
|
model: string;
|
||||||
|
};
|
||||||
|
|
||||||
private get text(): string {
|
private get text(): string {
|
||||||
return this.vm[this.model];
|
return this.vm[this.opts.model];
|
||||||
}
|
}
|
||||||
|
|
||||||
private set text(text: string) {
|
private set text(text: string) {
|
||||||
this.vm[this.model] = text;
|
this.vm[this.opts.model] = text;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 対象のテキストエリアを与えてインスタンスを初期化します。
|
* 対象のテキストエリアを与えてインスタンスを初期化します。
|
||||||
*/
|
*/
|
||||||
constructor(textarea, vm, model) {
|
constructor(textarea, vm, opts) {
|
||||||
//#region BIND
|
//#region BIND
|
||||||
this.onInput = this.onInput.bind(this);
|
this.onInput = this.onInput.bind(this);
|
||||||
this.complete = this.complete.bind(this);
|
this.complete = this.complete.bind(this);
|
||||||
@@ -45,7 +47,7 @@ class Autocomplete {
|
|||||||
this.suggestion = null;
|
this.suggestion = null;
|
||||||
this.textarea = textarea;
|
this.textarea = textarea;
|
||||||
this.vm = vm;
|
this.vm = vm;
|
||||||
this.model = model;
|
this.opts = opts;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -1,5 +1,7 @@
|
|||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
|
|
||||||
import autocomplete from './autocomplete';
|
import autocomplete from './autocomplete';
|
||||||
|
import particle from './particle';
|
||||||
|
|
||||||
Vue.directive('autocomplete', autocomplete);
|
Vue.directive('autocomplete', autocomplete);
|
||||||
|
Vue.directive('particle', particle);
|
||||||
|
24
src/client/app/common/views/directives/particle.ts
Normal file
24
src/client/app/common/views/directives/particle.ts
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
import Particle from '../components/particle.vue';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
bind(el, binding, vn) {
|
||||||
|
if (vn.context.$store.state.device.reduceMotion) return;
|
||||||
|
|
||||||
|
el.addEventListener('click', () => {
|
||||||
|
const rect = el.getBoundingClientRect();
|
||||||
|
|
||||||
|
const x = rect.left + (el.clientWidth / 2);
|
||||||
|
const y = rect.top + (el.clientHeight / 2);
|
||||||
|
|
||||||
|
const particle = new Particle({
|
||||||
|
parent: vn.context,
|
||||||
|
propsData: {
|
||||||
|
x,
|
||||||
|
y
|
||||||
|
}
|
||||||
|
}).$mount();
|
||||||
|
|
||||||
|
document.body.appendChild(particle.$el);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
65
src/client/app/common/views/pages/404.vue
Normal file
65
src/client/app/common/views/pages/404.vue
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
<template>
|
||||||
|
<figure class="megtcxgu">
|
||||||
|
<img :src="src" alt="">
|
||||||
|
<figcaption>
|
||||||
|
<h1><span>Not found</span></h1>
|
||||||
|
<p><span>{{ $t('page-not-found') }}</span></p>
|
||||||
|
</figcaption>
|
||||||
|
</figure>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue'
|
||||||
|
import i18n from '../../../i18n';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
i18n: i18n('common/views/pages/404.vue'),
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
src: ''
|
||||||
|
}
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
this.$root.getMeta().then(meta => {
|
||||||
|
if (meta.errorImageUrl)
|
||||||
|
this.src = meta.errorImageUrl;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
.megtcxgu
|
||||||
|
align-items center
|
||||||
|
bottom 0
|
||||||
|
display flex
|
||||||
|
justify-content center
|
||||||
|
left 0
|
||||||
|
margin auto
|
||||||
|
position fixed
|
||||||
|
right 0
|
||||||
|
top 0
|
||||||
|
|
||||||
|
> img
|
||||||
|
width 500px
|
||||||
|
|
||||||
|
> figcaption
|
||||||
|
margin 8px
|
||||||
|
|
||||||
|
h1,
|
||||||
|
p
|
||||||
|
color var(--text)
|
||||||
|
display flex
|
||||||
|
flex-flow column
|
||||||
|
|
||||||
|
*
|
||||||
|
position relative
|
||||||
|
width 100%
|
||||||
|
|
||||||
|
@media (max-width: 767px)
|
||||||
|
flex-flow column
|
||||||
|
|
||||||
|
> figcaption
|
||||||
|
text-align center
|
||||||
|
|
||||||
|
</style>
|
@@ -164,7 +164,7 @@ export default define({
|
|||||||
this.draw();
|
this.draw();
|
||||||
},
|
},
|
||||||
onStatsLog(statsLog) {
|
onStatsLog(statsLog) {
|
||||||
statsLog.forEach(stats => this.onStats(stats));
|
for (const stats of statsLog) this.onStats(stats);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@@ -121,7 +121,7 @@ export default Vue.extend({
|
|||||||
this.memP = (stats.mem.used / stats.mem.total * 100).toFixed(0);
|
this.memP = (stats.mem.used / stats.mem.total * 100).toFixed(0);
|
||||||
},
|
},
|
||||||
onStatsLog(statsLog) {
|
onStatsLog(statsLog) {
|
||||||
statsLog.reverse().forEach(stats => this.onStats(stats));
|
for (const stats of statsLog.reverse()) this.onStats(stats);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@@ -1,13 +1,14 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="uptimes">
|
<div class="uptimes">
|
||||||
<p>Uptimes</p>
|
<p>Uptimes</p>
|
||||||
<p>Process: {{ process ? process.toFixed(0) : '---' }}s</p>
|
<p>Process: {{ process }}</p>
|
||||||
<p>OS: {{ os ? os.toFixed(0) : '---' }}s</p>
|
<p>OS: {{ os }}</p>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
|
import formatUptime from '../../scripts/format-uptime';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
props: ['connection'],
|
props: ['connection'],
|
||||||
@@ -25,8 +26,8 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
onStats(stats) {
|
onStats(stats) {
|
||||||
this.process = stats.process_uptime;
|
this.process = formatUptime(stats.process_uptime);
|
||||||
this.os = stats.os_uptime;
|
this.os = formatUptime(stats.os_uptime);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@@ -16,7 +16,6 @@ export const wsUrl = url.replace('http://', 'ws://').replace('https://', 'wss://
|
|||||||
export const lang = window.lang;
|
export const lang = window.lang;
|
||||||
export const langs = _LANGS_;
|
export const langs = _LANGS_;
|
||||||
export const locale = JSON.parse(localStorage.getItem('locale'));
|
export const locale = JSON.parse(localStorage.getItem('locale'));
|
||||||
export const themeColor = _THEME_COLOR_;
|
|
||||||
export const copyright = _COPYRIGHT_;
|
export const copyright = _COPYRIGHT_;
|
||||||
export const version = _VERSION_;
|
export const version = _VERSION_;
|
||||||
export const clientVersion = _CLIENT_VERSION_;
|
export const clientVersion = _CLIENT_VERSION_;
|
||||||
|
@@ -28,6 +28,7 @@ import MkTag from './views/pages/tag.vue';
|
|||||||
import MkReversi from './views/pages/games/reversi.vue';
|
import MkReversi from './views/pages/games/reversi.vue';
|
||||||
import MkShare from './views/pages/share.vue';
|
import MkShare from './views/pages/share.vue';
|
||||||
import MkFollow from '../common/views/pages/follow.vue';
|
import MkFollow from '../common/views/pages/follow.vue';
|
||||||
|
import MkNotFound from '../common/views/pages/404.vue';
|
||||||
|
|
||||||
import Ctx from './views/components/context-menu.vue';
|
import Ctx from './views/components/context-menu.vue';
|
||||||
import PostFormWindow from './views/components/post-form-window.vue';
|
import PostFormWindow from './views/components/post-form-window.vue';
|
||||||
@@ -148,7 +149,8 @@ init(async (launch) => {
|
|||||||
{ path: '/@:user/following', name: 'userFollowing', component: MkUserFollowingOrFollowers },
|
{ path: '/@:user/following', name: 'userFollowing', component: MkUserFollowingOrFollowers },
|
||||||
{ path: '/@:user/followers', name: 'userFollowers', component: MkUserFollowingOrFollowers },
|
{ path: '/@:user/followers', name: 'userFollowers', component: MkUserFollowingOrFollowers },
|
||||||
{ path: '/notes/:note', name: 'note', component: MkNote },
|
{ path: '/notes/:note', name: 'note', component: MkNote },
|
||||||
{ path: '/authorize-follow', component: MkFollow }
|
{ path: '/authorize-follow', component: MkFollow },
|
||||||
|
{ path: '*', component: MkNotFound }
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@@ -29,7 +29,9 @@ import Vue from 'vue';
|
|||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
props: ['data'],
|
props: ['data'],
|
||||||
created() {
|
created() {
|
||||||
this.data.forEach(d => d.total = d.notes + d.replies + d.renotes);
|
for (const d of this.data) {
|
||||||
|
d.total = d.notes + d.replies + d.renotes;
|
||||||
|
}
|
||||||
const peak = Math.max.apply(null, this.data.map(d => d.total));
|
const peak = Math.max.apply(null, this.data.map(d => d.total));
|
||||||
|
|
||||||
const now = new Date();
|
const now = new Date();
|
||||||
|
@@ -57,7 +57,10 @@ export default Vue.extend({
|
|||||||
};
|
};
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
this.data.forEach(d => d.total = d.notes + d.replies + d.renotes);
|
for (const d of this.data) {
|
||||||
|
d.total = d.notes + d.replies + d.renotes;
|
||||||
|
}
|
||||||
|
|
||||||
this.render();
|
this.render();
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
@@ -34,9 +34,9 @@ export default Vue.extend({
|
|||||||
this.$el.style.left = x + 'px';
|
this.$el.style.left = x + 'px';
|
||||||
this.$el.style.top = y + 'px';
|
this.$el.style.top = y + 'px';
|
||||||
|
|
||||||
Array.from(document.querySelectorAll('body *')).forEach(el => {
|
for (const el of Array.from(document.querySelectorAll('body *'))) {
|
||||||
el.addEventListener('mousedown', this.onMousedown);
|
el.addEventListener('mousedown', this.onMousedown);
|
||||||
});
|
}
|
||||||
|
|
||||||
this.$el.style.display = 'block';
|
this.$el.style.display = 'block';
|
||||||
|
|
||||||
@@ -59,9 +59,9 @@ export default Vue.extend({
|
|||||||
this.close();
|
this.close();
|
||||||
},
|
},
|
||||||
close() {
|
close() {
|
||||||
Array.from(document.querySelectorAll('body *')).forEach(el => {
|
for (const el of Array.from(document.querySelectorAll('body *'))) {
|
||||||
el.removeEventListener('mousedown', this.onMousedown);
|
el.removeEventListener('mousedown', this.onMousedown);
|
||||||
});
|
}
|
||||||
|
|
||||||
this.$emit('closed');
|
this.$emit('closed');
|
||||||
this.destroyDom();
|
this.destroyDom();
|
||||||
|
@@ -120,9 +120,9 @@ export default Vue.extend({
|
|||||||
|
|
||||||
// ファイルだったら
|
// ファイルだったら
|
||||||
if (e.dataTransfer.files.length > 0) {
|
if (e.dataTransfer.files.length > 0) {
|
||||||
Array.from(e.dataTransfer.files).forEach(file => {
|
for (const file of Array.from(e.dataTransfer.files)) {
|
||||||
this.browser.upload(file, this.folder);
|
this.browser.upload(file, this.folder);
|
||||||
});
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -68,9 +68,9 @@ export default Vue.extend({
|
|||||||
|
|
||||||
// ファイルだったら
|
// ファイルだったら
|
||||||
if (e.dataTransfer.files.length > 0) {
|
if (e.dataTransfer.files.length > 0) {
|
||||||
Array.from(e.dataTransfer.files).forEach(file => {
|
for (const file of Array.from(e.dataTransfer.files)) {
|
||||||
this.browser.upload(file, this.folder);
|
this.browser.upload(file, this.folder);
|
||||||
});
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -277,9 +277,9 @@ export default Vue.extend({
|
|||||||
|
|
||||||
// ドロップされてきたものがファイルだったら
|
// ドロップされてきたものがファイルだったら
|
||||||
if (e.dataTransfer.files.length > 0) {
|
if (e.dataTransfer.files.length > 0) {
|
||||||
Array.from(e.dataTransfer.files).forEach(file => {
|
for (const file of Array.from(e.dataTransfer.files)) {
|
||||||
this.upload(file, this.folder);
|
this.upload(file, this.folder);
|
||||||
});
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -368,9 +368,9 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
onChangeFileInput() {
|
onChangeFileInput() {
|
||||||
Array.from((this.$refs.fileInput as any).files).forEach(file => {
|
for (const file of Array.from((this.$refs.fileInput as any).files)) {
|
||||||
this.upload(file, this.folder);
|
this.upload(file, this.folder);
|
||||||
});
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
upload(file, folder) {
|
upload(file, folder) {
|
||||||
@@ -549,8 +549,8 @@ export default Vue.extend({
|
|||||||
let flag = false;
|
let flag = false;
|
||||||
const complete = () => {
|
const complete = () => {
|
||||||
if (flag) {
|
if (flag) {
|
||||||
fetchedFolders.forEach(this.appendFolder);
|
for (const x of fetchedFolders) this.appendFolder(x);
|
||||||
fetchedFiles.forEach(this.appendFile);
|
for (const x of fetchedFiles) this.appendFile(x);
|
||||||
this.fetching = false;
|
this.fetching = false;
|
||||||
} else {
|
} else {
|
||||||
flag = true;
|
flag = true;
|
||||||
@@ -575,7 +575,7 @@ export default Vue.extend({
|
|||||||
} else {
|
} else {
|
||||||
this.moreFiles = false;
|
this.moreFiles = false;
|
||||||
}
|
}
|
||||||
files.forEach(this.appendFile);
|
for (const x of files) this.appendFile(x);
|
||||||
this.fetching = false;
|
this.fetching = false;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@@ -43,9 +43,9 @@ export default Vue.extend({
|
|||||||
this.$el.style.left = x + 'px';
|
this.$el.style.left = x + 'px';
|
||||||
this.$el.style.top = y + 'px';
|
this.$el.style.top = y + 'px';
|
||||||
|
|
||||||
Array.from(document.querySelectorAll('body *')).forEach(el => {
|
for (const el of Array.from(document.querySelectorAll('body *'))) {
|
||||||
el.addEventListener('mousedown', this.onMousedown);
|
el.addEventListener('mousedown', this.onMousedown);
|
||||||
});
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -62,9 +62,9 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
close() {
|
close() {
|
||||||
Array.from(document.querySelectorAll('body *')).forEach(el => {
|
for (const el of Array.from(document.querySelectorAll('body *'))) {
|
||||||
el.removeEventListener('mousedown', this.onMousedown);
|
el.removeEventListener('mousedown', this.onMousedown);
|
||||||
});
|
}
|
||||||
|
|
||||||
this.$emit('closed');
|
this.$emit('closed');
|
||||||
this.destroyDom();
|
this.destroyDom();
|
||||||
|
@@ -102,23 +102,23 @@ const defaultDesktopHomeWidgets = {
|
|||||||
//#region Construct home data
|
//#region Construct home data
|
||||||
const _defaultDesktopHomeWidgets = [];
|
const _defaultDesktopHomeWidgets = [];
|
||||||
|
|
||||||
defaultDesktopHomeWidgets.left.forEach(widget => {
|
for (const widget of defaultDesktopHomeWidgets.left) {
|
||||||
_defaultDesktopHomeWidgets.push({
|
_defaultDesktopHomeWidgets.push({
|
||||||
name: widget,
|
name: widget,
|
||||||
id: uuid(),
|
id: uuid(),
|
||||||
place: 'left',
|
place: 'left',
|
||||||
data: {}
|
data: {}
|
||||||
});
|
});
|
||||||
});
|
}
|
||||||
|
|
||||||
defaultDesktopHomeWidgets.right.forEach(widget => {
|
for (const widget of defaultDesktopHomeWidgets.right) {
|
||||||
_defaultDesktopHomeWidgets.push({
|
_defaultDesktopHomeWidgets.push({
|
||||||
name: widget,
|
name: widget,
|
||||||
id: uuid(),
|
id: uuid(),
|
||||||
place: 'right',
|
place: 'right',
|
||||||
data: {}
|
data: {}
|
||||||
});
|
});
|
||||||
});
|
}
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
@@ -220,8 +220,8 @@ export default Vue.extend({
|
|||||||
const left = this.widgets.left;
|
const left = this.widgets.left;
|
||||||
const right = this.widgets.right;
|
const right = this.widgets.right;
|
||||||
this.$store.commit('settings/setHome', left.concat(right));
|
this.$store.commit('settings/setHome', left.concat(right));
|
||||||
left.forEach(w => w.place = 'left');
|
for (const w of left) w.place = 'left';
|
||||||
right.forEach(w => w.place = 'right');
|
for (const w of right) w.place = 'right';
|
||||||
this.$root.api('i/update_home', {
|
this.$root.api('i/update_home', {
|
||||||
home: this.home
|
home: this.home
|
||||||
});
|
});
|
||||||
|
@@ -156,7 +156,9 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
releaseQueue() {
|
releaseQueue() {
|
||||||
this.queue.forEach(n => this.prepend(n, true));
|
for (const n of this.queue) {
|
||||||
|
this.prepend(n, true);
|
||||||
|
}
|
||||||
this.queue = [];
|
this.queue = [];
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@@ -279,9 +279,7 @@ export default Vue.extend({
|
|||||||
.note-preview
|
.note-preview
|
||||||
color var(--noteText)
|
color var(--noteText)
|
||||||
display inline-block
|
display inline-block
|
||||||
overflow hidden
|
word-break break-word
|
||||||
max-height 48px
|
|
||||||
word-break break-all
|
|
||||||
|
|
||||||
.note-ref
|
.note-ref
|
||||||
color var(--noteText)
|
color var(--noteText)
|
||||||
|
@@ -16,13 +16,13 @@
|
|||||||
<b>{{ $t('recent-tags') }}:</b>
|
<b>{{ $t('recent-tags') }}:</b>
|
||||||
<a v-for="tag in recentHashtags.slice(0, 5)" @click="addTag(tag)" :title="$t('click-to-tagging')">#{{ tag }}</a>
|
<a v-for="tag in recentHashtags.slice(0, 5)" @click="addTag(tag)" :title="$t('click-to-tagging')">#{{ tag }}</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="local-only" v-if="this.localOnly == true">{{ $t('local-only-message') }}</div>
|
<div class="local-only" v-if="localOnly == true">{{ $t('local-only-message') }}</div>
|
||||||
<input v-show="useCw" ref="cw" v-model="cw" :placeholder="$t('annotations')" v-autocomplete="'cw'">
|
<input v-show="useCw" ref="cw" v-model="cw" :placeholder="$t('annotations')" v-autocomplete="{ model: 'cw' }">
|
||||||
<div class="textarea">
|
<div class="textarea">
|
||||||
<textarea :class="{ with: (files.length != 0 || poll) }"
|
<textarea :class="{ with: (files.length != 0 || poll) }"
|
||||||
ref="text" v-model="text" :disabled="posting"
|
ref="text" v-model="text" :disabled="posting"
|
||||||
@keydown="onKeydown" @paste="onPaste" :placeholder="placeholder"
|
@keydown="onKeydown" @paste="onPaste" :placeholder="placeholder"
|
||||||
v-autocomplete="'text'"
|
v-autocomplete="{ model: 'text' }"
|
||||||
></textarea>
|
></textarea>
|
||||||
<button class="emoji" @click="emoji" ref="emoji">
|
<button class="emoji" @click="emoji" ref="emoji">
|
||||||
<fa :icon="['far', 'laugh']"/>
|
<fa :icon="['far', 'laugh']"/>
|
||||||
@@ -54,9 +54,9 @@
|
|||||||
<span v-if="visibility === 'private'"><fa icon="lock"/></span>
|
<span v-if="visibility === 'private'"><fa icon="lock"/></span>
|
||||||
</button>
|
</button>
|
||||||
<p class="text-count" :class="{ over: trimmedLength(text) > maxNoteTextLength }">{{ maxNoteTextLength - trimmedLength(text) }}</p>
|
<p class="text-count" :class="{ over: trimmedLength(text) > maxNoteTextLength }">{{ maxNoteTextLength - trimmedLength(text) }}</p>
|
||||||
<button :class="{ posting }" class="submit" :disabled="!canPost" @click="post">
|
<ui-button primary :wait="posting" class="submit" :disabled="!canPost" @click="post">
|
||||||
{{ posting ? $t('posting') : submitText }}<mk-ellipsis v-if="posting"/>
|
{{ posting ? $t('posting') : submitText }}<mk-ellipsis v-if="posting"/>
|
||||||
</button>
|
</ui-button>
|
||||||
<input ref="file" type="file" multiple="multiple" tabindex="-1" @change="onChangeFile"/>
|
<input ref="file" type="file" multiple="multiple" tabindex="-1" @change="onChangeFile"/>
|
||||||
<div class="dropzone" v-if="draghover"></div>
|
<div class="dropzone" v-if="draghover"></div>
|
||||||
</div>
|
</div>
|
||||||
@@ -184,7 +184,8 @@ export default Vue.extend({
|
|||||||
if (this.reply && this.reply.text != null) {
|
if (this.reply && this.reply.text != null) {
|
||||||
const ast = parse(this.reply.text);
|
const ast = parse(this.reply.text);
|
||||||
|
|
||||||
ast.filter(t => t.type == 'mention').forEach(x => {
|
// TODO: 新しいMFMパーサに対応
|
||||||
|
for (const x of ast.filter(t => t.type == 'mention')) {
|
||||||
const mention = x.host ? `@${x.username}@${toASCII(x.host)}` : `@${x.username}`;
|
const mention = x.host ? `@${x.username}@${toASCII(x.host)}` : `@${x.username}`;
|
||||||
|
|
||||||
// 自分は除外
|
// 自分は除外
|
||||||
@@ -195,7 +196,7 @@ export default Vue.extend({
|
|||||||
if (this.text.indexOf(`${mention} `) != -1) return;
|
if (this.text.indexOf(`${mention} `) != -1) return;
|
||||||
|
|
||||||
this.text += `${mention} `;
|
this.text += `${mention} `;
|
||||||
});
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// デフォルト公開範囲
|
// デフォルト公開範囲
|
||||||
@@ -261,7 +262,7 @@ export default Vue.extend({
|
|||||||
this.$chooseDriveFile({
|
this.$chooseDriveFile({
|
||||||
multiple: true
|
multiple: true
|
||||||
}).then(files => {
|
}).then(files => {
|
||||||
files.forEach(this.attachMedia);
|
for (const x of files) this.attachMedia(x);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -276,7 +277,7 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
onChangeFile() {
|
onChangeFile() {
|
||||||
Array.from((this.$refs.file as any).files).forEach(this.upload);
|
for (const x of Array.from((this.$refs.file as any).files)) this.upload(x);
|
||||||
},
|
},
|
||||||
|
|
||||||
onPollUpdate() {
|
onPollUpdate() {
|
||||||
@@ -304,11 +305,11 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
onPaste(e) {
|
onPaste(e) {
|
||||||
Array.from(e.clipboardData.items).forEach((item: any) => {
|
for (const item of Array.from(e.clipboardData.items)) {
|
||||||
if (item.kind == 'file') {
|
if (item.kind == 'file') {
|
||||||
this.upload(item.getAsFile());
|
this.upload(item.getAsFile());
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
onDragover(e) {
|
onDragover(e) {
|
||||||
@@ -335,7 +336,7 @@ export default Vue.extend({
|
|||||||
// ファイルだったら
|
// ファイルだったら
|
||||||
if (e.dataTransfer.files.length > 0) {
|
if (e.dataTransfer.files.length > 0) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
Array.from(e.dataTransfer.files).forEach(this.upload);
|
for (const x of Array.from(e.dataTransfer.files)) this.upload(x);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -683,62 +684,8 @@ export default Vue.extend({
|
|||||||
position absolute
|
position absolute
|
||||||
bottom 16px
|
bottom 16px
|
||||||
right 16px
|
right 16px
|
||||||
cursor pointer
|
|
||||||
padding 0
|
|
||||||
margin 0
|
|
||||||
width 110px
|
width 110px
|
||||||
height 40px
|
height 40px
|
||||||
font-size 1em
|
|
||||||
color var(--primaryForeground)
|
|
||||||
background var(--primary)
|
|
||||||
outline none
|
|
||||||
border none
|
|
||||||
border-radius 4px
|
|
||||||
|
|
||||||
&:not(:disabled)
|
|
||||||
font-weight bold
|
|
||||||
|
|
||||||
&:hover:not(:disabled)
|
|
||||||
background var(--primaryLighten5)
|
|
||||||
|
|
||||||
&:active:not(:disabled)
|
|
||||||
background var(--primaryDarken5)
|
|
||||||
|
|
||||||
&:focus
|
|
||||||
&:after
|
|
||||||
content ""
|
|
||||||
pointer-events none
|
|
||||||
position absolute
|
|
||||||
top -5px
|
|
||||||
right -5px
|
|
||||||
bottom -5px
|
|
||||||
left -5px
|
|
||||||
border 2px solid var(--primaryAlpha03)
|
|
||||||
border-radius 8px
|
|
||||||
|
|
||||||
&:disabled
|
|
||||||
opacity 0.7
|
|
||||||
cursor default
|
|
||||||
|
|
||||||
&.wait
|
|
||||||
background linear-gradient(
|
|
||||||
45deg,
|
|
||||||
var(--primaryDarken10) 25%,
|
|
||||||
var(--primary) 25%,
|
|
||||||
var(--primary) 50%,
|
|
||||||
var(--primaryDarken10) 50%,
|
|
||||||
var(--primaryDarken10) 75%,
|
|
||||||
var(--primary) 75%,
|
|
||||||
var(--primary)
|
|
||||||
)
|
|
||||||
background-size 32px 32px
|
|
||||||
animation stripe-bg 1.5s linear infinite
|
|
||||||
opacity 0.7
|
|
||||||
cursor wait
|
|
||||||
|
|
||||||
@keyframes stripe-bg
|
|
||||||
from {background-position: 0 0;}
|
|
||||||
to {background-position: -64px 32px;}
|
|
||||||
|
|
||||||
> .text-count
|
> .text-count
|
||||||
pointer-events none
|
pointer-events none
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="2fa">
|
<div class="2fa">
|
||||||
<p style="margin-top:0;">{{ $t('intro') }}<a :href="$t('href')" target="_blank">{{ $t('detail') }}</a></p>
|
<p style="margin-top:0;">{{ $t('intro') }}<a :href="$t('url')" target="_blank">{{ $t('detail') }}</a></p>
|
||||||
<ui-info warn>{{ $t('caution') }}</ui-info>
|
<ui-info warn>{{ $t('caution') }}</ui-info>
|
||||||
<p v-if="!data && !$store.state.i.twoFactorEnabled"><ui-button @click="register">{{ $t('register') }}</ui-button></p>
|
<p v-if="!data && !$store.state.i.twoFactorEnabled"><ui-button @click="register">{{ $t('register') }}</ui-button></p>
|
||||||
<template v-if="$store.state.i.twoFactorEnabled">
|
<template v-if="$store.state.i.twoFactorEnabled">
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
</template>
|
</template>
|
||||||
<div v-if="data">
|
<div v-if="data">
|
||||||
<ol>
|
<ol>
|
||||||
<li>{{ $t('authenticator% <a href="https://support.google.com/accounts/answer/1066447" target="_blank">%i18n:@howtoinstall') }}</a></li>
|
<li>{{ $t('authenticator') }}<a href="https://support.google.com/accounts/answer/1066447" target="_blank">{{ $t('howtoinstall') }}</a></li>
|
||||||
<li>{{ $t('scan') }}<br><img :src="data.qr"></li>
|
<li>{{ $t('scan') }}<br><img :src="data.qr"></li>
|
||||||
<li>{{ $t('done') }}<br>
|
<li>{{ $t('done') }}<br>
|
||||||
<input type="number" v-model="token" class="ui">
|
<input type="number" v-model="token" class="ui">
|
||||||
|
@@ -137,7 +137,6 @@
|
|||||||
<section>
|
<section>
|
||||||
<ui-switch v-model="games_reversi_showBoardLabels">{{ $t('@.show-reversi-board-labels') }}</ui-switch>
|
<ui-switch v-model="games_reversi_showBoardLabels">{{ $t('@.show-reversi-board-labels') }}</ui-switch>
|
||||||
<ui-switch v-model="games_reversi_useWhiteBlackStones">{{ $t('@.use-white-black-reversi-stones') }}</ui-switch>
|
<ui-switch v-model="games_reversi_useWhiteBlackStones">{{ $t('@.use-white-black-reversi-stones') }}</ui-switch>
|
||||||
<ui-switch v-model="games_reversi_useContrastStones">{{ $t('@.use-contrast-reversi-stones') }}</ui-switch>
|
|
||||||
</section>
|
</section>
|
||||||
</ui-card>
|
</ui-card>
|
||||||
|
|
||||||
@@ -511,11 +510,6 @@ export default Vue.extend({
|
|||||||
set(value) { this.$store.dispatch('settings/set', { key: 'games.reversi.useWhiteBlackStones', value }); }
|
set(value) { this.$store.dispatch('settings/set', { key: 'games.reversi.useWhiteBlackStones', value }); }
|
||||||
},
|
},
|
||||||
|
|
||||||
games_reversi_useContrastStones: {
|
|
||||||
get() { return this.$store.state.settings.games.reversi.useContrastStones; },
|
|
||||||
set(value) { this.$store.dispatch('settings/set', { key: 'games.reversi.useContrastStones', value }); }
|
|
||||||
},
|
|
||||||
|
|
||||||
disableAnimatedMfm: {
|
disableAnimatedMfm: {
|
||||||
get() { return this.$store.state.settings.disableAnimatedMfm; },
|
get() { return this.$store.state.settings.disableAnimatedMfm; },
|
||||||
set(value) { this.$store.dispatch('settings/set', { key: 'disableAnimatedMfm', value }); }
|
set(value) { this.$store.dispatch('settings/set', { key: 'disableAnimatedMfm', value }); }
|
||||||
|
@@ -149,7 +149,9 @@ export default Vue.extend({
|
|||||||
} else {
|
} else {
|
||||||
this.existMore = false;
|
this.existMore = false;
|
||||||
}
|
}
|
||||||
notes.forEach(n => (this.$refs.timeline as any).append(n));
|
for (const n of notes) {
|
||||||
|
(this.$refs.timeline as any).append(n);
|
||||||
|
}
|
||||||
this.moreFetching = false;
|
this.moreFetching = false;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@@ -120,15 +120,15 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
open() {
|
open() {
|
||||||
this.isOpen = true;
|
this.isOpen = true;
|
||||||
Array.from(document.querySelectorAll('body *')).forEach(el => {
|
for (const el of Array.from(document.querySelectorAll('body *'))) {
|
||||||
el.addEventListener('mousedown', this.onMousedown);
|
el.addEventListener('mousedown', this.onMousedown);
|
||||||
});
|
}
|
||||||
},
|
},
|
||||||
close() {
|
close() {
|
||||||
this.isOpen = false;
|
this.isOpen = false;
|
||||||
Array.from(document.querySelectorAll('body *')).forEach(el => {
|
for (const el of Array.from(document.querySelectorAll('body *'))) {
|
||||||
el.removeEventListener('mousedown', this.onMousedown);
|
el.removeEventListener('mousedown', this.onMousedown);
|
||||||
});
|
}
|
||||||
},
|
},
|
||||||
onMousedown(e) {
|
onMousedown(e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
@@ -42,16 +42,16 @@ export default Vue.extend({
|
|||||||
|
|
||||||
open() {
|
open() {
|
||||||
this.isOpen = true;
|
this.isOpen = true;
|
||||||
Array.from(document.querySelectorAll('body *')).forEach(el => {
|
for (const el of Array.from(document.querySelectorAll('body *'))) {
|
||||||
el.addEventListener('mousedown', this.onMousedown);
|
el.addEventListener('mousedown', this.onMousedown);
|
||||||
});
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
close() {
|
close() {
|
||||||
this.isOpen = false;
|
this.isOpen = false;
|
||||||
Array.from(document.querySelectorAll('body *')).forEach(el => {
|
for (const el of Array.from(document.querySelectorAll('body *'))) {
|
||||||
el.removeEventListener('mousedown', this.onMousedown);
|
el.removeEventListener('mousedown', this.onMousedown);
|
||||||
});
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
onMousedown(e) {
|
onMousedown(e) {
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<form class="search" @submit.prevent="onSubmit">
|
<form class="wlvfdpkp" @submit.prevent="onSubmit">
|
||||||
<i><fa icon="search"/></i>
|
<i><fa icon="search"/></i>
|
||||||
<input v-model="q" type="search" :placeholder="$t('placeholder')"/>
|
<input v-model="q" type="search" :placeholder="$t('placeholder')" v-autocomplete="{ model: 'q' }"/>
|
||||||
<div class="result"></div>
|
<div class="result"></div>
|
||||||
</form>
|
</form>
|
||||||
</template>
|
</template>
|
||||||
@@ -19,10 +19,13 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
onSubmit() {
|
onSubmit() {
|
||||||
if (this.q.startsWith('#')) {
|
const q = this.q.trim();
|
||||||
this.$router.push(`/tags/${encodeURIComponent(this.q.substr(1))}`);
|
if (q.startsWith('@')) {
|
||||||
|
this.$router.push(`/${q}`);
|
||||||
|
} else if (q.startsWith('#')) {
|
||||||
|
this.$router.push(`/tags/${encodeURIComponent(q.substr(1))}`);
|
||||||
} else {
|
} else {
|
||||||
this.$router.push(`/search?q=${encodeURIComponent(this.q)}`);
|
this.$router.push(`/search?q=${encodeURIComponent(q)}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -30,7 +33,7 @@ export default Vue.extend({
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="stylus" scoped>
|
<style lang="stylus" scoped>
|
||||||
.search
|
.wlvfdpkp
|
||||||
@media (max-width 800px)
|
@media (max-width 800px)
|
||||||
display none !important
|
display none !important
|
||||||
|
|
||||||
|
@@ -171,16 +171,16 @@ export default Vue.extend({
|
|||||||
|
|
||||||
openNotifications() {
|
openNotifications() {
|
||||||
this.showNotifications = true;
|
this.showNotifications = true;
|
||||||
Array.from(document.querySelectorAll('body *')).forEach(el => {
|
for (const el of Array.from(document.querySelectorAll('body *'))) {
|
||||||
el.addEventListener('mousedown', this.onMousedown);
|
el.addEventListener('mousedown', this.onMousedown);
|
||||||
});
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
closeNotifications() {
|
closeNotifications() {
|
||||||
this.showNotifications = false;
|
this.showNotifications = false;
|
||||||
Array.from(document.querySelectorAll('body *')).forEach(el => {
|
for (const el of Array.from(document.querySelectorAll('body *'))) {
|
||||||
el.removeEventListener('mousedown', this.onMousedown);
|
el.removeEventListener('mousedown', this.onMousedown);
|
||||||
});
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
onMousedown(e) {
|
onMousedown(e) {
|
||||||
|
@@ -79,7 +79,7 @@ export default Vue.extend({
|
|||||||
} else {
|
} else {
|
||||||
this.existMore = false;
|
this.existMore = false;
|
||||||
}
|
}
|
||||||
notes.forEach(n => (this.$refs.timeline as any).append(n));
|
for (const n of notes) (this.$refs.timeline as any).append(n);
|
||||||
this.moreFetching = false;
|
this.moreFetching = false;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@@ -234,12 +234,12 @@ export default Vue.extend({
|
|||||||
top() {
|
top() {
|
||||||
let z = 0;
|
let z = 0;
|
||||||
|
|
||||||
this.$root.os.windows.getAll().forEach(w => {
|
const ws = Array.from(this.$root.os.windows.getAll()).filter(w => w != this);
|
||||||
if (w == this) return;
|
for (const w of ws) {
|
||||||
const m = w.$refs.main;
|
const m = w.$refs.main;
|
||||||
const mz = Number(document.defaultView.getComputedStyle(m, null).zIndex);
|
const mz = Number(document.defaultView.getComputedStyle(m, null).zIndex);
|
||||||
if (mz > z) z = mz;
|
if (mz > z) z = mz;
|
||||||
});
|
}
|
||||||
|
|
||||||
if (z > 0) {
|
if (z > 0) {
|
||||||
(this.$refs.main as any).style.zIndex = z + 1;
|
(this.$refs.main as any).style.zIndex = z + 1;
|
||||||
|
@@ -224,7 +224,9 @@ export default Vue.extend({
|
|||||||
|
|
||||||
if (this.menu) {
|
if (this.menu) {
|
||||||
items.unshift(null);
|
items.unshift(null);
|
||||||
this.menu.reverse().forEach(i => items.unshift(i));
|
for (const i of this.menu.reverse()) {
|
||||||
|
items.unshift(i);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return items;
|
return items;
|
||||||
|
@@ -77,7 +77,9 @@ export default Vue.extend({
|
|||||||
} else {
|
} else {
|
||||||
this.existMore = false;
|
this.existMore = false;
|
||||||
}
|
}
|
||||||
notes.forEach(n => (this.$refs.timeline as any).append(n));
|
for (const n of notes) {
|
||||||
|
(this.$refs.timeline as any).append(n);
|
||||||
|
}
|
||||||
this.moreFetching = false;
|
this.moreFetching = false;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@@ -102,7 +102,9 @@ export default Vue.extend({
|
|||||||
} else {
|
} else {
|
||||||
this.existMore = false;
|
this.existMore = false;
|
||||||
}
|
}
|
||||||
notes.forEach(n => (this.$refs.timeline as any).append(n));
|
for (const n of notes) {
|
||||||
|
(this.$refs.timeline as any).append(n);
|
||||||
|
}
|
||||||
this.moreFetching = false;
|
this.moreFetching = false;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@@ -104,7 +104,9 @@ export default Vue.extend({
|
|||||||
} else {
|
} else {
|
||||||
this.existMore = false;
|
this.existMore = false;
|
||||||
}
|
}
|
||||||
notes.forEach(n => (this.$refs.timeline as any).append(n));
|
for (const n of notes) {
|
||||||
|
(this.$refs.timeline as any).append(n);
|
||||||
|
}
|
||||||
this.moreFetching = false;
|
this.moreFetching = false;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@@ -75,7 +75,9 @@ export default Vue.extend({
|
|||||||
} else {
|
} else {
|
||||||
this.existMore = false;
|
this.existMore = false;
|
||||||
}
|
}
|
||||||
notes.forEach(n => (this.$refs.timeline as any).append(n));
|
for (const n of notes) {
|
||||||
|
(this.$refs.timeline as any).append(n);
|
||||||
|
}
|
||||||
this.moreFetching = false;
|
this.moreFetching = false;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@@ -11,7 +11,7 @@
|
|||||||
<mk-error v-if="!fetching && requestInitPromise != null" @retry="resolveInitPromise"/>
|
<mk-error v-if="!fetching && requestInitPromise != null" @retry="resolveInitPromise"/>
|
||||||
|
|
||||||
<!-- トランジションを有効にするとなぜかメモリリークする -->
|
<!-- トランジションを有効にするとなぜかメモリリークする -->
|
||||||
<transition-group name="mk-notes" class="transition notes" ref="notes">
|
<transition-group name="mk-notes" class="transition notes" ref="notes" tag="div">
|
||||||
<template v-for="(note, i) in _notes">
|
<template v-for="(note, i) in _notes">
|
||||||
<x-note
|
<x-note
|
||||||
:note="note"
|
:note="note"
|
||||||
@@ -164,7 +164,9 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
releaseQueue() {
|
releaseQueue() {
|
||||||
this.queue.forEach(n => this.prepend(n, true));
|
for (const n of this.queue) {
|
||||||
|
this.prepend(n, true);
|
||||||
|
}
|
||||||
this.queue = [];
|
this.queue = [];
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@@ -7,7 +7,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- トランジションを有効にするとなぜかメモリリークする -->
|
<!-- トランジションを有効にするとなぜかメモリリークする -->
|
||||||
<component :is="!$store.state.device.reduceMotion ? 'transition-group' : 'div'" name="mk-notifications" class="transition notifications">
|
<component :is="!$store.state.device.reduceMotion ? 'transition-group' : 'div'" name="mk-notifications" class="transition notifications" tag="div">
|
||||||
<template v-for="(notification, i) in _notifications">
|
<template v-for="(notification, i) in _notifications">
|
||||||
<x-notification class="notification" :notification="notification" :key="notification.id"/>
|
<x-notification class="notification" :notification="notification" :key="notification.id"/>
|
||||||
<p class="date" v-if="i != notifications.length - 1 && notification._date != _notifications[i + 1]._date" :key="notification.id + '-time'">
|
<p class="date" v-if="i != notifications.length - 1 && notification._date != _notifications[i + 1]._date" :key="notification.id + '-time'">
|
||||||
@@ -142,7 +142,9 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
releaseQueue() {
|
releaseQueue() {
|
||||||
this.queue.forEach(n => this.prepend(n));
|
for (const n of this.queue) {
|
||||||
|
this.prepend(n);
|
||||||
|
}
|
||||||
this.queue = [];
|
this.queue = [];
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@@ -123,7 +123,9 @@ export default Vue.extend({
|
|||||||
} else {
|
} else {
|
||||||
this.existMore = false;
|
this.existMore = false;
|
||||||
}
|
}
|
||||||
notes.forEach(n => (this.$refs.timeline as any).append(n));
|
for (const n of notes) {
|
||||||
|
(this.$refs.timeline as any).append(n);
|
||||||
|
}
|
||||||
this.moreFetching = false;
|
this.moreFetching = false;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@@ -26,6 +26,16 @@
|
|||||||
<div class="description">
|
<div class="description">
|
||||||
<misskey-flavored-markdown v-if="user.description" :text="user.description" :author="user" :i="$store.state.i" :custom-emojis="user.emojis"/>
|
<misskey-flavored-markdown v-if="user.description" :text="user.description" :author="user" :i="$store.state.i" :custom-emojis="user.emojis"/>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="fields" v-if="user.fields">
|
||||||
|
<dl class="field" v-for="(field, i) in user.fields" :key="i">
|
||||||
|
<dt class="name">
|
||||||
|
<misskey-flavored-markdown :text="field.name" :shouldBreak="false" :plainText="true" :custom-emojis="user.emojis"/>
|
||||||
|
</dt>
|
||||||
|
<dd class="value">
|
||||||
|
<misskey-flavored-markdown :text="field.value" :author="user" :i="$store.state.i" :custom-emojis="user.emojis"/>
|
||||||
|
</dd>
|
||||||
|
</dl>
|
||||||
|
</div>
|
||||||
<div class="counts">
|
<div class="counts">
|
||||||
<div>
|
<div>
|
||||||
<b>{{ user.notesCount | number }}</b>
|
<b>{{ user.notesCount | number }}</b>
|
||||||
@@ -159,11 +169,11 @@ export default Vue.extend({
|
|||||||
limit: 9,
|
limit: 9,
|
||||||
untilDate: new Date().getTime() + 1000 * 86400 * 365
|
untilDate: new Date().getTime() + 1000 * 86400 * 365
|
||||||
}).then(notes => {
|
}).then(notes => {
|
||||||
notes.forEach(note => {
|
for (const note of notes) {
|
||||||
note.files.forEach(file => {
|
for (const file of note.files) {
|
||||||
file._note = note;
|
file._note = note;
|
||||||
});
|
}
|
||||||
});
|
}
|
||||||
const files = concat(notes.map((n: any): any[] => n.files));
|
const files = concat(notes.map((n: any): any[] => n.files));
|
||||||
this.images = files.filter(f => image.includes(f.type)).slice(0, 9);
|
this.images = files.filter(f => image.includes(f.type)).slice(0, 9);
|
||||||
});
|
});
|
||||||
@@ -290,7 +300,7 @@ export default Vue.extend({
|
|||||||
} else {
|
} else {
|
||||||
this.existMore = false;
|
this.existMore = false;
|
||||||
}
|
}
|
||||||
notes.forEach(n => (this.$refs.timeline as any).append(n));
|
for (const n of notes) (this.$refs.timeline as any).append(n);
|
||||||
this.moreFetching = false;
|
this.moreFetching = false;
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -416,6 +426,32 @@ export default Vue.extend({
|
|||||||
border-right solid 16px transparent
|
border-right solid 16px transparent
|
||||||
border-bottom solid 16px var(--face)
|
border-bottom solid 16px var(--face)
|
||||||
|
|
||||||
|
> .fields
|
||||||
|
margin-top 8px
|
||||||
|
|
||||||
|
> .field
|
||||||
|
display flex
|
||||||
|
padding 0
|
||||||
|
margin 0
|
||||||
|
align-items center
|
||||||
|
|
||||||
|
> .name
|
||||||
|
padding 4px
|
||||||
|
margin 4px
|
||||||
|
width 30%
|
||||||
|
overflow hidden
|
||||||
|
white-space nowrap
|
||||||
|
text-overflow ellipsis
|
||||||
|
font-weight bold
|
||||||
|
|
||||||
|
> .value
|
||||||
|
padding 4px
|
||||||
|
margin 4px
|
||||||
|
width 70%
|
||||||
|
overflow hidden
|
||||||
|
white-space nowrap
|
||||||
|
text-overflow ellipsis
|
||||||
|
|
||||||
> .counts
|
> .counts
|
||||||
display grid
|
display grid
|
||||||
grid-template-columns 1fr 1fr 1fr
|
grid-template-columns 1fr 1fr 1fr
|
||||||
|
@@ -1,9 +1,11 @@
|
|||||||
<template>
|
<template>
|
||||||
<mk-ui>
|
<mk-ui>
|
||||||
<main v-if="!fetching">
|
<main v-if="!fetching">
|
||||||
<template v-for="favorite in favorites">
|
<sequential-entrance animation="entranceFromTop" delay="25">
|
||||||
<mk-note-detail class="post" :note="favorite.note" :key="favorite.note.id"/>
|
<template v-for="favorite in favorites">
|
||||||
</template>
|
<mk-note-detail class="post" :note="favorite.note" :key="favorite.note.id"/>
|
||||||
|
</template>
|
||||||
|
</sequential-entrance>
|
||||||
<div class="more" v-if="existMore">
|
<div class="more" v-if="existMore">
|
||||||
<ui-button inline @click="more">{{ $t('@.load-more') }}</ui-button>
|
<ui-button inline @click="more">{{ $t('@.load-more') }}</ui-button>
|
||||||
</div>
|
</div>
|
||||||
@@ -75,7 +77,7 @@ main
|
|||||||
padding 16px
|
padding 16px
|
||||||
max-width 700px
|
max-width 700px
|
||||||
|
|
||||||
> .post
|
> * > .post
|
||||||
margin-bottom 16px
|
margin-bottom 16px
|
||||||
|
|
||||||
> .more
|
> .more
|
||||||
|
@@ -94,7 +94,9 @@ export default Vue.extend({
|
|||||||
} else {
|
} else {
|
||||||
this.existMore = false;
|
this.existMore = false;
|
||||||
}
|
}
|
||||||
notes.forEach(n => (this.$refs.timeline as any).append(n));
|
for (const n of notes) {
|
||||||
|
(this.$refs.timeline as any).append(n);
|
||||||
|
}
|
||||||
this.moreFetching = false;
|
this.moreFetching = false;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@@ -83,7 +83,9 @@ export default Vue.extend({
|
|||||||
} else {
|
} else {
|
||||||
this.existMore = false;
|
this.existMore = false;
|
||||||
}
|
}
|
||||||
notes.forEach(n => (this.$refs.timeline as any).append(n));
|
for (const n of notes) {
|
||||||
|
(this.$refs.timeline as any).append(n);
|
||||||
|
}
|
||||||
this.moreFetching = false;
|
this.moreFetching = false;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user