Compare commits
464 Commits
Author | SHA1 | Date | |
---|---|---|---|
87f248b8ec | |||
027140eccc | |||
92cf205c66 | |||
fa3299840f | |||
2d4b183c14 | |||
03b20e11ca | |||
e0e006e284 | |||
a294a881ec | |||
53926082e7 | |||
5b5de6a89c | |||
a11c991f83 | |||
a0adcf0d1a | |||
93b2b82993 | |||
4dee7d91b1 | |||
839be6477d | |||
59e2ed8ab0 | |||
83790004dd | |||
efae7a7bce | |||
e59f13e8ff | |||
31ed8949b9 | |||
f1174a15e0 | |||
912ffae600 | |||
71a5662195 | |||
774834a31f | |||
91f1c3a10a | |||
8fc1e07136 | |||
a62e2b83ff | |||
e31a2f7e55 | |||
1598e996b1 | |||
4fb7ee760a | |||
37865cb381 | |||
ab8b882435 | |||
1b2996947e | |||
ea56d368e3 | |||
dbd3a750f5 | |||
f41818141f | |||
d2f576accd | |||
4e483856d4 | |||
2997f26e3c | |||
cdab596240 | |||
fca7a9da94 | |||
8ba178f795 | |||
d98c67e13c | |||
d129151fdf | |||
1b9c69f793 | |||
42dd092334 | |||
8dc9ec06f8 | |||
ae5da782e5 | |||
313b0cec65 | |||
12a51972ed | |||
a2f3b2966f | |||
0c2627f08b | |||
9535df12dd | |||
2400471a0d | |||
784da8c37b | |||
3778f9c521 | |||
e1cec85f1e | |||
ca9c087060 | |||
5b2d91baad | |||
08e099b88d | |||
4153b0db38 | |||
88701a21bb | |||
3ddc73ca94 | |||
693d793265 | |||
5d685233dd | |||
16575751d9 | |||
1f6295f437 | |||
6737fe2ead | |||
4e77939fca | |||
21f528c07d | |||
23f835fac0 | |||
f21343225c | |||
f13a59f7db | |||
0315b9274c | |||
da88043962 | |||
0352bf0cc2 | |||
baa71070a8 | |||
2713064f27 | |||
f6387ac115 | |||
d704aca035 | |||
2b54b4ac06 | |||
7410f2f4c0 | |||
99c3c1258a | |||
e51184931d | |||
3bc9a40b48 | |||
9f49ca8fdb | |||
550d1547b4 | |||
ca0b56ee57 | |||
ef1d854f2c | |||
a5023271ef | |||
c3747db670 | |||
fe1e60a28c | |||
f91d2e8c8d | |||
dccc2c60e3 | |||
933e25804c | |||
0b503661af | |||
58082431ff | |||
2536bfb5f5 | |||
6428066552 | |||
4bf3827b73 | |||
3cad494404 | |||
ef0793311f | |||
6f3e341e89 | |||
2fea3be7c0 | |||
82059d4fd9 | |||
07ddeae2f1 | |||
f2279758b2 | |||
1ed189a518 | |||
137741d307 | |||
d702f6e090 | |||
f33701233c | |||
70003269e5 | |||
61896d2386 | |||
52d640c5a7 | |||
c65f5761e1 | |||
3016ac4805 | |||
28a47cd331 | |||
6ecb88b0d1 | |||
8df1278c8e | |||
52bec430d4 | |||
da4cec8767 | |||
ad0087d7dd | |||
9630860035 | |||
75e4c8d74d | |||
1a5ee81e7e | |||
3476be16ab | |||
c42f61a0f4 | |||
b42a9e1c4e | |||
4495525705 | |||
a603602f32 | |||
67b28f9b6e | |||
fd947407af | |||
30444e5f1a | |||
f0d818de24 | |||
3fb98e808f | |||
2c9bacfcea | |||
ae0284b1b1 | |||
166c4ebda0 | |||
319eed029b | |||
ec5aa10167 | |||
a542765cf8 | |||
fd3f8d43db | |||
4f4496078a | |||
8f4f5b4ce0 | |||
bdc6718ae5 | |||
09d1f1c20d | |||
0efb7af17b | |||
a45a78b94f | |||
6337c26cf0 | |||
208dec25d9 | |||
7d65a0c3d5 | |||
bb925e5de3 | |||
c9de5b65d4 | |||
9bc3fcf74f | |||
19d979c330 | |||
bb7b335491 | |||
be5a0b4794 | |||
48eea03386 | |||
566317dc83 | |||
d4334645c2 | |||
d60c3c4ee3 | |||
452514f7fe | |||
58abb0ce8f | |||
000d9cc1ce | |||
8cc017354a | |||
60269d15e8 | |||
7caa083612 | |||
68e1b00eb1 | |||
1d904c756a | |||
0a1db1f595 | |||
e30e8267dd | |||
288a881817 | |||
f593790872 | |||
1044ad8589 | |||
6e24015e68 | |||
b9a2c449ff | |||
7c390cbf7b | |||
a657d1c774 | |||
f3936a79aa | |||
78b560d89a | |||
2fc6313380 | |||
c2b882a5d7 | |||
667b18fe24 | |||
60c0dac5f2 | |||
79f3e60dac | |||
c4e04d6bf2 | |||
49f8219e54 | |||
abd873e0a8 | |||
0e45d0d47f | |||
043b66f5da | |||
5d6e1fc391 | |||
fe292e77de | |||
c996b5d0c8 | |||
7beb592f0c | |||
b3b11acd96 | |||
3bcdfbbd00 | |||
fdad5d149f | |||
2e712a9212 | |||
86c8e634bb | |||
197a9306c4 | |||
2e502a6b61 | |||
aa8a40e950 | |||
2f45ac3712 | |||
8ecf3db608 | |||
f59c68022f | |||
7aac2c4e29 | |||
0481de6629 | |||
f59d0a75e4 | |||
22f4b3cc7b | |||
a4283c415a | |||
c0fbcee38a | |||
335200c31e | |||
df71c90f9f | |||
4220bdc963 | |||
97f3b1e46f | |||
3a9dc358f8 | |||
2a3ab46a3d | |||
200a01f65f | |||
e68936911d | |||
634ffeec54 | |||
8486cb785d | |||
a9eda4e6e2 | |||
f918f9b307 | |||
d404d02d2d | |||
61f7a3974f | |||
cad8e4dea2 | |||
ef79903811 | |||
c3cd0451ad | |||
773fe28fcb | |||
69e2576387 | |||
908a5a1bb4 | |||
ffbd9ffc75 | |||
96223dd5e3 | |||
3231f12b93 | |||
1408f39d9a | |||
4ba06541aa | |||
5c78ed645a | |||
33e19447aa | |||
b52d995719 | |||
db5b90c093 | |||
39bc75a7f9 | |||
3492067ecf | |||
e342a8da05 | |||
671d71dd47 | |||
2f18d2ed8f | |||
f6e8165db0 | |||
eab3b22772 | |||
7664aa5a8c | |||
a366392cbe | |||
c8c1bc09f9 | |||
11bb1608cf | |||
b1d77775aa | |||
bc3f5e0d78 | |||
53ea709697 | |||
b7adbbb9bf | |||
31aaf559ac | |||
160185b108 | |||
848ff4440b | |||
74291b2cae | |||
ae6c4e0c5f | |||
ecb1840e27 | |||
42eb82a859 | |||
89a22908ce | |||
bc3a94aa57 | |||
77fe579d9b | |||
e8c7803a2f | |||
1abaef624c | |||
72cf2344a9 | |||
0462512e62 | |||
1d6b2bd969 | |||
5df90fdc4a | |||
607a5326d9 | |||
2cbd35acc4 | |||
9a0224ee21 | |||
2beedc5978 | |||
6d53e64798 | |||
3478cdea08 | |||
b360f2ed45 | |||
7b0c4c29b4 | |||
03f5d7575c | |||
e922d8904c | |||
45b55a8c98 | |||
8973b76bda | |||
41cf856e26 | |||
b7aeb10304 | |||
b8d9c1aa45 | |||
d7dbe503b6 | |||
c625dd074a | |||
f8a977f1c0 | |||
c35e760fd3 | |||
bc34ac82cf | |||
98f25c9159 | |||
ae9c13df66 | |||
9f8d21b2bc | |||
e05e97561a | |||
f9d21fd34a | |||
86aef5f3e0 | |||
e6bc7922ac | |||
b2f40b7d3e | |||
3878793405 | |||
33c7aef220 | |||
e927f7a4ec | |||
cd09fa5a28 | |||
9ca9757418 | |||
1fae2ffc37 | |||
71657ddb98 | |||
63845e0ba7 | |||
6781b68d33 | |||
d058eff59a | |||
f409faea2c | |||
77da98cd39 | |||
471afcbd57 | |||
72809f9d78 | |||
743fb45c3c | |||
93d6b71a31 | |||
9b10e93fba | |||
0740837b6a | |||
ff49eacee4 | |||
fbc6b267ff | |||
10cae8894e | |||
42addfed85 | |||
0dd6494ab9 | |||
9f4c6a3aef | |||
9438dc560d | |||
003ef65b59 | |||
978fb7e63a | |||
6203577696 | |||
f2b61f6a7e | |||
6f4aa69723 | |||
b308e1bb2b | |||
ab3dad2d84 | |||
0af103f399 | |||
873608a7de | |||
b04ad167da | |||
ad0d06c0d8 | |||
151476ae8a | |||
fbf43c1450 | |||
35a1fa5bf0 | |||
8d3f71d490 | |||
2239eddf88 | |||
94ea21d482 | |||
6a39f92431 | |||
7b2efa35c7 | |||
c41ea84568 | |||
0e8262e623 | |||
4d97946943 | |||
96d48b5519 | |||
4cc54d081e | |||
aab5a2ffbd | |||
c8f165b4ad | |||
9776d8e06b | |||
10f845ae76 | |||
2c8f962889 | |||
1721a82352 | |||
59bec546e4 | |||
86503f2d69 | |||
e4b8c688bb | |||
4535ab4c43 | |||
dcdb57df9d | |||
cfc2808c56 | |||
4a3d74c608 | |||
e18655d18f | |||
12b4b78763 | |||
550a528fc1 | |||
4e3429a5c7 | |||
ef98383075 | |||
d66d1f142f | |||
c896055cb1 | |||
2e8b2e0cf9 | |||
59012b5693 | |||
dfb51e8d26 | |||
5107824352 | |||
bf7ec18316 | |||
77d82d2d17 | |||
2777460150 | |||
9476a240d9 | |||
bddb878931 | |||
b0768d8a4a | |||
46bb7f9efb | |||
a507b7c0b0 | |||
939c0dc5f9 | |||
a89c206572 | |||
8b55263e72 | |||
f2ad1e4639 | |||
0fbcec1c16 | |||
ec2b73d076 | |||
6630bb0b39 | |||
bef0d4c8bd | |||
a57cb3bd31 | |||
1e4577a988 | |||
fe792b5bbb | |||
d4005133d0 | |||
abe8e80268 | |||
e38e4940b4 | |||
48dc1678c3 | |||
431383ab54 | |||
7a8d252f63 | |||
04525e2997 | |||
a2f96f3f20 | |||
a81ecb0b28 | |||
1122368ee0 | |||
6c54328391 | |||
1a26816f7a | |||
8538334d08 | |||
9387ebc569 | |||
c99dce68ed | |||
6dea84c6d2 | |||
39060374c2 | |||
d3ebb5d13f | |||
4e7c10d3d9 | |||
e93ea66d2d | |||
152dd70ea5 | |||
7b94cf9f84 | |||
d70e27a865 | |||
b780ea336c | |||
bd9f589d32 | |||
d9d18bd8f9 | |||
ffdaa6bc56 | |||
c7f60e337e | |||
7f265dbd52 | |||
8929c5cabc | |||
4a610f3b0a | |||
55ec19edb5 | |||
c319c61832 | |||
66db99b8cd | |||
ff2162974d | |||
78e86af086 | |||
2dcf89eecf | |||
fdf94be998 | |||
0e913a5727 | |||
f3be077adc | |||
a6e0471f8c | |||
c5d734f9ad | |||
ee12d887ae | |||
b78d24be1e | |||
d5379e2b36 | |||
cf36557084 | |||
fd1ee129dc | |||
1471b7a6b5 | |||
1d39d7efcb | |||
69ee97f6e2 | |||
12092e6083 | |||
6e29e40b8b | |||
842c9e735b | |||
2f63a25058 | |||
d3b084003c | |||
0da9d3d8b0 | |||
58f3c6aab7 | |||
22e79675ad | |||
e5c350d740 | |||
210124ac34 | |||
7f9a35d7ac | |||
71a30f9001 | |||
95a34d55fb | |||
34f052b672 | |||
0178c2e696 | |||
5cb0c07627 | |||
d8fdbfe164 | |||
74e0b2734d | |||
3f5785bd03 | |||
15e5c69c15 | |||
57019c0b40 | |||
9d6641be3a | |||
ac15c2e71f |
86
.autogen/autogen.sh
Executable file
86
.autogen/autogen.sh
Executable file
@ -0,0 +1,86 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# BEARER_TOKEN=
|
||||||
|
# CAMPAIGN_ID=
|
||||||
|
# GITHUB_TOKEN=
|
||||||
|
# HEAD='acid-chicken:patch-autogen'
|
||||||
|
# REPO='syuilo/misskey'
|
||||||
|
test "$(curl -LSs -w '\n' -- "https://api.github.com/repos/$REPO/pulls?access_token=$GITHUB_TOKEN" | jq -r '.[].head.label' | grep $HEAD)" && exit 1
|
||||||
|
cd "$(dirname $0)/.." && \
|
||||||
|
touch null.cache && \
|
||||||
|
rm *.cache && \
|
||||||
|
git checkout master && \
|
||||||
|
git pull origin master && \
|
||||||
|
git pull upstream master && \
|
||||||
|
git stash && \
|
||||||
|
git rebase -f upstream/master && \
|
||||||
|
git branch patch-autogen && \
|
||||||
|
git checkout patch-autogen && \
|
||||||
|
git reset --hard HEAD || \
|
||||||
|
exit 1
|
||||||
|
touch patreon.md.cache && \
|
||||||
|
rm patreon.md.cache && \
|
||||||
|
echo '<!-- PATREON_START -->' > patreon.md.cache && \
|
||||||
|
URL="https://www.patreon.com/api/oauth2/v2/campaigns/$CAMPAIGN_ID/members?include=currently_entitled_tiers,user&fields%5Btier%5D=title&fields%5Buser%5D=full_name,thumb_url,url,hide_pledges"
|
||||||
|
while :
|
||||||
|
do
|
||||||
|
touch patreon.raw.cache && \
|
||||||
|
rm patreon.raw.cache && \
|
||||||
|
curl -LSs -w '\n' -H "Authorization: Bearer $BEARER_TOKEN" -- $URL > patreon.raw.cache && \
|
||||||
|
touch patreon.cache && \
|
||||||
|
rm patreon.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(.attributes.hide_pledges==false))|map(select(.id as$id|$data|contains([$id])))|map(.attributes|[.full_name,.thumb_url,.url]|@tsv)|.[]|@text' >> patreon.cache && \
|
||||||
|
echo '<table><tr>' >> patreon.md.cache && \
|
||||||
|
cat patreon.cache | \
|
||||||
|
awk -F'\t' '{print $2,$1}' | \
|
||||||
|
sed -e 's/ /\\" alt=\\"/' | \
|
||||||
|
xargs -I% echo '<td><img src="%"></td>' >> patreon.md.cache && \
|
||||||
|
echo '</tr><tr>' >> patreon.md.cache && \
|
||||||
|
cat patreon.cache | \
|
||||||
|
awk -F'\t' '{print $3,$1}' | \
|
||||||
|
sed -e 's/ /\\">/' | \
|
||||||
|
xargs -I% echo '<td><a href="%</a></td>' >> patreon.md.cache && \
|
||||||
|
echo '</tr></table>' >> patreon.md.cache || \
|
||||||
|
exit 1
|
||||||
|
NEW_URL="$(cat patreon.raw.cache | jq -r '.links.next')"
|
||||||
|
test "$NEW_URL" = 'null' && \
|
||||||
|
break || \
|
||||||
|
URL="$NEW_URL"
|
||||||
|
done
|
||||||
|
IGNORE= && \
|
||||||
|
echo -e "\n**Last updated:** $(date -uR | sed 's/\+0000/UTC/')\n<!-- PATREON_END -->" >> patreon.md.cache && \
|
||||||
|
touch README.md && \
|
||||||
|
touch .autogen/README.md && \
|
||||||
|
rm .autogen/README.md && \
|
||||||
|
mv README.md .autogen/README.md && \
|
||||||
|
cat .autogen/README.md | while IFS= read LINE;
|
||||||
|
do
|
||||||
|
if [[ -z "$IGNORE" ]]
|
||||||
|
then
|
||||||
|
if [[ "$LINE" = '<!-- PATREON_START -->' ]]
|
||||||
|
then
|
||||||
|
IGNORE='PATREON_INSIDE'
|
||||||
|
else
|
||||||
|
echo "$LINE" >> README.md
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
if [[ "$LINE" = '<!-- PATREON_END -->' ]]
|
||||||
|
then
|
||||||
|
IGNORE=
|
||||||
|
cat patreon.md.cache >> README.md
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
cat patreon.md.cache
|
||||||
|
touch null.cache && \
|
||||||
|
rm *.cache && \
|
||||||
|
diff .autogen/README.md README.md > diff.cache
|
||||||
|
cat diff.cache && \
|
||||||
|
test 4 -lt $(cat diff.cache | wc -l) && \
|
||||||
|
git add README.md && \
|
||||||
|
git commit -m 'Update README.md [AUTOGEN]' && \
|
||||||
|
git push -f origin patch-autogen && \
|
||||||
|
curl -LSs -w '\n' -X POST -d '{"title":"[AUTOMATED] Update README.md","body":"*This pull request was created by a tool.*","head":"'$HEAD'","base":"master"}' -- "https://api.github.com/repos/$REPO/pulls?access_token=$GITHUB_TOKEN"
|
||||||
|
git stash
|
||||||
|
git checkout master
|
||||||
|
git branch -D patch-autogen
|
@ -5,6 +5,15 @@ ChangeLog
|
|||||||
|
|
||||||
This document describes breaking changes only.
|
This document describes breaking changes only.
|
||||||
|
|
||||||
|
7.0.0
|
||||||
|
-----
|
||||||
|
|
||||||
|
### Migration
|
||||||
|
|
||||||
|
起動する前に、`node cli/migration/7.0.0`してください。
|
||||||
|
|
||||||
|
Please run `node cli/migration/7.0.0` before launch.
|
||||||
|
|
||||||
6.0.0
|
6.0.0
|
||||||
-----
|
-----
|
||||||
|
|
||||||
|
86
README.md
86
README.md
@ -7,10 +7,12 @@
|
|||||||
[![][dependencies-badge]][dependencies-link]
|
[![][dependencies-badge]][dependencies-link]
|
||||||
[](http://makeapullrequest.com) [](https://greenkeeper.io/)
|
[](http://makeapullrequest.com) [](https://greenkeeper.io/)
|
||||||
|
|
||||||
**Microblogging. Redefined.**
|
Sophisticated microblogging platform, evolving forever.
|
||||||
|
|
||||||
**[Misskey](https://misskey.xyz)** is a completely open source,
|
[Misskey](https://misskey.xyz) is a decentralized microblogging platform born on Earth.
|
||||||
ultimately sophisticated professional microblogging software.
|
Since it exists within the Fediverse (a universe where various social media platforms are organized),
|
||||||
|
it is mutually linked with other social media platforms.
|
||||||
|
Why don't you take a short break from the hustle and bustle of the city, and dive into a new Internet?
|
||||||
|
|
||||||
<a href="https://www.patreon.com/syuilo"><img src="https://c5.patreon.com/external/logo/become_a_patron_button@2x.png" alt="Become a Patron!" width="160" /></a>
|
<a href="https://www.patreon.com/syuilo"><img src="https://c5.patreon.com/external/logo/become_a_patron_button@2x.png" alt="Become a Patron!" width="160" /></a>
|
||||||
|
|
||||||
@ -28,7 +30,7 @@ ultimately sophisticated professional microblogging software.
|
|||||||
|
|
||||||
and more! You can see it with your own eyes at [misskey.xyz](https://misskey.xyz).
|
and more! You can see it with your own eyes at [misskey.xyz](https://misskey.xyz).
|
||||||
|
|
||||||
:package: Create your instance
|
:package: Create your own instance
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
If you want to run your own instance of Misskey,
|
If you want to run your own instance of Misskey,
|
||||||
please see [Setup and installation guide](./docs/setup.en.md).
|
please see [Setup and installation guide](./docs/setup.en.md).
|
||||||
@ -37,40 +39,58 @@ please see [Setup and installation guide](./docs/setup.en.md).
|
|||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
**[PR](https://github.com/syuilo/misskey/pulls)s welcome!**
|
**[PR](https://github.com/syuilo/misskey/pulls)s welcome!**
|
||||||
|
|
||||||
If you want to...
|
### i18n
|
||||||
* i18n ... please see [Translation guide](./docs/translate.en.md).
|
|
||||||
* l10n ... please visit https://crowdin.com/project/misskey
|
Please see [Translation guide](./docs/translate.en.md).
|
||||||
|
|
||||||
|
### l10n
|
||||||
|
|
||||||
|
Misskey is using Crowdin for l10n.
|
||||||
|
|
||||||
|
[](https://crowdin.com/project/misskey)
|
||||||
|
|
||||||
:heart: Backers & Sponsors
|
:heart: Backers & Sponsors
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
<table>
|
<!-- PATREON_START -->
|
||||||
<tr>
|
<table><tr>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/619786/32cf01444db24e578cd1982c197f6fc6/1?token-time=2145916800&token-hash=tB1e_r8RlZ5sFL0KV_e8dugapxatNBRK1Z3h67TO1g8%3D"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12378075/0156f769e20f412594fa6b87d85fe228/1?token-time=2145916800&token-hash=IsIJRUXszzoD6-7pDnRY8I05T9nSznc4GTaxj7C9SwU%3D" alt="39ff"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12378075/0156f769e20f412594fa6b87d85fe228/1?token-time=2145916800&token-hash=IsIJRUXszzoD6-7pDnRY8I05T9nSznc4GTaxj7C9SwU%3D"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12731202/0995c46cdcb54153ab5f073f5869b70a/1?token-time=2145916800&token-hash=Yd60FK_SWfQO56SeiJpy1tDHOnCV4xdEywQe8gn5_Wo%3D" alt="negao"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/4503830/ccf2cc867ea64de0b524bb2e24b9a1cb/1?token-time=2145916800&token-hash=S1zP0QyLU52Dqq6dtc9qNYyWfW86XrYHiR4NMbeOrnA%3D"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/13099460/43cecdbaa63a40d79bf50a96b9910b9d/1?token-time=2145916800&token-hash=d6P5MWHHsCMxUuBAEPAoVc5wLUR19mIhqAq7Ma9h9rI%3D" alt="ne_moni"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12531784/93a45137841849329ba692da92ac7c60/1?token-time=2145916800&token-hash=tMosUojzUYJCH_3t--tvYA-SMCyrS__hzSndyaRSnbo%3D"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12913507/f7181eacafe8469a93033d85f5969c29/1?token-time=2145916800&token-hash=f03BFb4S2FUx9YEt87TnEmifb4h33OywGBW2akQVtQY%3D" alt="Melilot"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12959468/c249e15aebec4424b5c0f427173671b6/1?token-time=2145916800&token-hash=lubpCEdxAkxPlpR2O6bvZ7BIh8Q4nGf-U_mE1qpjVAQ%3D"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/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/12913507/f7181eacafe8469a93033d85f5969c29/1?token-time=2145916800&token-hash=f03BFb4S2FUx9YEt87TnEmifb4h33OywGBW2akQVtQY%3D"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/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/5881381/6235ca5d3fb04c8e95ef5b4ff2abcc18/2?token-time=2145916800&token-hash=zElv7ZcPL3viGsXbNG_KWiKrbV0vvw1gk0panx8DJoo%3D"></td>
|
<td><img src="https://c8.patreon.com/2/100/12718187" alt="Peter G."></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12731202/0995c46cdcb54153ab5f073f5869b70a/1?token-time=2145916800&token-hash=Yd60FK_SWfQO56SeiJpy1tDHOnCV4xdEywQe8gn5_Wo%3D"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/13039004/509d0c412eb14ae08d6a812a3054f7d6/1?token-time=2145916800&token-hash=zwSu01tOtn5xTUucDZHuPsCxF2HBEMVs9ROJKTlEV_o%3D" alt="nemu"></td>
|
||||||
<td><img src="https://c8.patreon.com/2/100/12718187"></td>
|
</tr><tr>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12931605/ead494101f364dffa90efe49e36fb494/1?token-time=2145916800&token-hash=NzSFPjIlodXyv41rwK61aZWVZWfI4surJaNj8vWKvqM%3D"></td>
|
<td><a href="https://www.patreon.com/user?u=12378075">39ff</a></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12021162/963128bb8d14476dbd8407943db8f31a/1?token-time=2145916800&token-hash=GgJ_NmUB6_nnRNLVGUWjV-WX91On7BOu59LKncYV9fE%3D"></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td><a href="https://www.patreon.com/mastodon">Gargron</a></td>
|
|
||||||
<td><a href="https://www.patreon.com/user/creators?u=12378075">39ff</a></td>
|
|
||||||
<td><a href="https://www.patreon.com/dansup">dansup</a></td>
|
|
||||||
<td><a href="https://www.patreon.com/user/creators?u=12531784">Takashi Shibuya</a></td>
|
|
||||||
<td><a href="https://www.patreon.com/fujishan">fujishan</a></td>
|
|
||||||
<td><a href="https://www.patreon.com/user?u=12913507">Melilot</a></td>
|
|
||||||
<td><a href="https://www.patreon.com/user?u=5881381">Naoki Kosaka</a></td>
|
|
||||||
<td><a href="https://www.patreon.com/user?u=12731202">negao</a></td>
|
<td><a href="https://www.patreon.com/user?u=12731202">negao</a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=12718187">Peter G.</a></td>
|
<td><a href="https://www.patreon.com/user?u=13099460">ne_moni</a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=12931605">Reiju</a></td>
|
<td><a href="https://www.patreon.com/user?u=12913507">Melilot</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>
|
||||||
</tr>
|
<td><a href="https://www.patreon.com/user?u=12718187">Peter G.</a></td>
|
||||||
</table>
|
<td><a href="https://www.patreon.com/user?u=13039004">nemu</a></td>
|
||||||
|
</tr></table>
|
||||||
|
<table><tr>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/5881381/6235ca5d3fb04c8e95ef5b4ff2abcc18/2?token-time=2145916800&token-hash=zElv7ZcPL3viGsXbNG_KWiKrbV0vvw1gk0panx8DJoo%3D" alt="Naoki Kosaka"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12931605/ead494101f364dffa90efe49e36fb494/1?token-time=2145916800&token-hash=NzSFPjIlodXyv41rwK61aZWVZWfI4surJaNj8vWKvqM%3D" alt="Reiju"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/13034746/c711c7f58e204ecfbc2fd646bc8a4eee/1?token-time=2145916800&token-hash=UERBN4OyP7Nh5XwwdDg0N0IE5cD6_qUQMO81Z5Wizso%3D" alt="Hiratake"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/4503830/ccf2cc867ea64de0b524bb2e24b9a1cb/1?token-time=2145916800&token-hash=S1zP0QyLU52Dqq6dtc9qNYyWfW86XrYHiR4NMbeOrnA%3D" alt="dansup"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/4950409/28e7d016209243759d9316be2e21381d/2?token-time=2145916800&token-hash=LuEaDkchH3GQWUcTOhBQ8xfKQYF0s5FjlZRd7Yduia8%3D" alt="mikan54951"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12531784/93a45137841849329ba692da92ac7c60/1?token-time=2145916800&token-hash=tMosUojzUYJCH_3t--tvYA-SMCyrS__hzSndyaRSnbo%3D" alt="Takashi Shibuya"></td>
|
||||||
|
<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12959468/c249e15aebec4424b5c0f427173671b6/1?token-time=2145916800&token-hash=lubpCEdxAkxPlpR2O6bvZ7BIh8Q4nGf-U_mE1qpjVAQ%3D" alt="fujishan"></td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=5881381">Naoki Kosaka</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=12931605">Reiju</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/hiratake">Hiratake</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/dansup">dansup</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=4950409">mikan54951</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td>
|
||||||
|
<td><a href="https://www.patreon.com/fujishan">fujishan</a></td>
|
||||||
|
</tr></table>
|
||||||
|
|
||||||
|
**Last updated:** Wed, 22 Aug 2018 05:25:06 UTC
|
||||||
|
<!-- PATREON_END -->
|
||||||
|
|
||||||
:four_leaf_clover: Copyright
|
:four_leaf_clover: Copyright
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
|
@ -1,101 +0,0 @@
|
|||||||
const chalk = require('chalk');
|
|
||||||
const log = require('single-line-log').stdout;
|
|
||||||
const sequential = require('promise-sequential');
|
|
||||||
const { default: DriveFile, DriveFileChunk } = require('../built/models/drive-file');
|
|
||||||
const { default: DriveFileThumbnail, DriveFileThumbnailChunk } = require('../built/models/drive-file-thumbnail');
|
|
||||||
const { default: User } = require('../built/models/user');
|
|
||||||
|
|
||||||
const q = {
|
|
||||||
'metadata._user.host': {
|
|
||||||
$ne: null
|
|
||||||
},
|
|
||||||
'metadata.withoutChunks': false
|
|
||||||
};
|
|
||||||
|
|
||||||
async function main() {
|
|
||||||
const promiseGens = [];
|
|
||||||
|
|
||||||
const count = await DriveFile.count(q);
|
|
||||||
|
|
||||||
let prev;
|
|
||||||
|
|
||||||
for (let i = 0; i < count; i++) {
|
|
||||||
promiseGens.push(() => {
|
|
||||||
const promise = new Promise(async (res, rej) => {
|
|
||||||
const file = await DriveFile.findOne(prev ? Object.assign({
|
|
||||||
_id: { $lt: prev._id }
|
|
||||||
}, q) : q, {
|
|
||||||
sort: {
|
|
||||||
_id: -1
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
prev = file;
|
|
||||||
|
|
||||||
function skip() {
|
|
||||||
res([i, file, false]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (file == null) return skip();
|
|
||||||
|
|
||||||
log(chalk`{gray ${i}} scanning {bold ${file._id}} ${file.filename} ...`);
|
|
||||||
|
|
||||||
const attachingUsersCount = await User.count({
|
|
||||||
$or: [{
|
|
||||||
avatarId: file._id
|
|
||||||
}, {
|
|
||||||
bannerId: file._id
|
|
||||||
}]
|
|
||||||
}, { limit: 1 });
|
|
||||||
if (attachingUsersCount !== 0) return skip();
|
|
||||||
|
|
||||||
Promise.all([
|
|
||||||
// チャンクをすべて削除
|
|
||||||
DriveFileChunk.remove({
|
|
||||||
files_id: file._id
|
|
||||||
}),
|
|
||||||
|
|
||||||
DriveFile.update({ _id: file._id }, {
|
|
||||||
$set: {
|
|
||||||
'metadata.withoutChunks': true
|
|
||||||
}
|
|
||||||
})
|
|
||||||
]).then(async () => {
|
|
||||||
res([i, file, true]);
|
|
||||||
|
|
||||||
//#region サムネイルもあれば削除
|
|
||||||
const thumbnail = await DriveFileThumbnail.findOne({
|
|
||||||
'metadata.originalId': file._id
|
|
||||||
});
|
|
||||||
|
|
||||||
if (thumbnail) {
|
|
||||||
DriveFileThumbnailChunk.remove({
|
|
||||||
files_id: thumbnail._id
|
|
||||||
});
|
|
||||||
|
|
||||||
DriveFileThumbnail.remove({ _id: thumbnail._id });
|
|
||||||
}
|
|
||||||
//#endregion
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
promise.then(([i, file, deleted]) => {
|
|
||||||
if (deleted) {
|
|
||||||
log(chalk`{gray ${i}} {red deleted: {bold ${file._id}} ${file.filename}}`);
|
|
||||||
} else {
|
|
||||||
log(chalk`{gray ${i}} {green skipped: {bold ${file._id}} ${file.filename}}`);
|
|
||||||
}
|
|
||||||
log.clear();
|
|
||||||
console.log();
|
|
||||||
});
|
|
||||||
|
|
||||||
return promise;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return await sequential(promiseGens);
|
|
||||||
}
|
|
||||||
|
|
||||||
main().then(() => {
|
|
||||||
console.log('ALL DONE');
|
|
||||||
}).catch(console.error);
|
|
@ -1,80 +0,0 @@
|
|||||||
const chalk = require('chalk');
|
|
||||||
const log = require('single-line-log').stdout;
|
|
||||||
const sequential = require('promise-sequential');
|
|
||||||
const { default: DriveFile, deleteDriveFile } = require('../built/models/drive-file');
|
|
||||||
const { default: Note } = require('../built/models/note');
|
|
||||||
const { default: MessagingMessage } = require('../built/models/messaging-message');
|
|
||||||
const { default: User } = require('../built/models/user');
|
|
||||||
|
|
||||||
async function main() {
|
|
||||||
const promiseGens = [];
|
|
||||||
|
|
||||||
const count = await DriveFile.count({});
|
|
||||||
|
|
||||||
let prev;
|
|
||||||
|
|
||||||
for (let i = 0; i < count; i++) {
|
|
||||||
promiseGens.push(() => {
|
|
||||||
const promise = new Promise(async (res, rej) => {
|
|
||||||
const file = await DriveFile.findOne(prev ? {
|
|
||||||
_id: { $lt: prev._id }
|
|
||||||
} : {}, {
|
|
||||||
sort: {
|
|
||||||
_id: -1
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
prev = file;
|
|
||||||
|
|
||||||
function skip() {
|
|
||||||
res([i, file, false]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (file == null) return skip();
|
|
||||||
|
|
||||||
log(chalk`{gray ${i}} scanning {bold ${file._id}} ${file.filename} ...`);
|
|
||||||
|
|
||||||
const attachingUsersCount = await User.count({
|
|
||||||
$or: [{
|
|
||||||
avatarId: file._id
|
|
||||||
}, {
|
|
||||||
bannerId: file._id
|
|
||||||
}]
|
|
||||||
}, { limit: 1 });
|
|
||||||
if (attachingUsersCount !== 0) return skip();
|
|
||||||
|
|
||||||
const attachingNotesCount = await Note.count({
|
|
||||||
mediaIds: file._id
|
|
||||||
}, { limit: 1 });
|
|
||||||
if (attachingNotesCount !== 0) return skip();
|
|
||||||
|
|
||||||
const attachingMessagesCount = await MessagingMessage.count({
|
|
||||||
fileId: file._id
|
|
||||||
}, { limit: 1 });
|
|
||||||
if (attachingMessagesCount !== 0) return skip();
|
|
||||||
|
|
||||||
deleteDriveFile(file).then(() => {
|
|
||||||
res([i, file, true]);
|
|
||||||
}).catch(rej);
|
|
||||||
});
|
|
||||||
|
|
||||||
promise.then(([i, file, deleted]) => {
|
|
||||||
if (deleted) {
|
|
||||||
log(chalk`{gray ${i}} {red deleted: {bold ${file._id}} ${file.filename}}`);
|
|
||||||
} else {
|
|
||||||
log(chalk`{gray ${i}} {green skipped: {bold ${file._id}} ${file.filename}}`);
|
|
||||||
}
|
|
||||||
log.clear();
|
|
||||||
console.log();
|
|
||||||
});
|
|
||||||
|
|
||||||
return promise;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return await sequential(promiseGens);
|
|
||||||
}
|
|
||||||
|
|
||||||
main().then(() => {
|
|
||||||
console.log('done');
|
|
||||||
}).catch(console.error);
|
|
134
cli/migration/7.0.0.js
Normal file
134
cli/migration/7.0.0.js
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
const { default: Stats } = require('../../built/models/stats');
|
||||||
|
const { default: User } = require('../../built/models/user');
|
||||||
|
const { default: Note } = require('../../built/models/note');
|
||||||
|
const { default: DriveFile } = require('../../built/models/drive-file');
|
||||||
|
|
||||||
|
const now = new Date();
|
||||||
|
const y = now.getFullYear();
|
||||||
|
const m = now.getMonth();
|
||||||
|
const d = now.getDate();
|
||||||
|
const today = new Date(y, m, d);
|
||||||
|
|
||||||
|
async function main() {
|
||||||
|
const localUsersCount = await User.count({
|
||||||
|
host: null
|
||||||
|
});
|
||||||
|
|
||||||
|
const remoteUsersCount = await User.count({
|
||||||
|
host: { $ne: null }
|
||||||
|
});
|
||||||
|
|
||||||
|
const localNotesCount = await Note.count({
|
||||||
|
'_user.host': null
|
||||||
|
});
|
||||||
|
|
||||||
|
const remoteNotesCount = await Note.count({
|
||||||
|
'_user.host': { $ne: null }
|
||||||
|
});
|
||||||
|
|
||||||
|
const localDriveFilesCount = await DriveFile.count({
|
||||||
|
'metadata._user.host': null
|
||||||
|
});
|
||||||
|
|
||||||
|
const remoteDriveFilesCount = await DriveFile.count({
|
||||||
|
'metadata._user.host': { $ne: null }
|
||||||
|
});
|
||||||
|
|
||||||
|
const localDriveFilesSize = await DriveFile
|
||||||
|
.aggregate([{
|
||||||
|
$match: {
|
||||||
|
'metadata._user.host': null,
|
||||||
|
'metadata.deletedAt': { $exists: false }
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
$project: {
|
||||||
|
length: true
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
$group: {
|
||||||
|
_id: null,
|
||||||
|
usage: { $sum: '$length' }
|
||||||
|
}
|
||||||
|
}])
|
||||||
|
.then(aggregates => {
|
||||||
|
if (aggregates.length > 0) {
|
||||||
|
return aggregates[0].usage;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
});
|
||||||
|
|
||||||
|
const remoteDriveFilesSize = await DriveFile
|
||||||
|
.aggregate([{
|
||||||
|
$match: {
|
||||||
|
'metadata._user.host': { $ne: null },
|
||||||
|
'metadata.deletedAt': { $exists: false }
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
$project: {
|
||||||
|
length: true
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
$group: {
|
||||||
|
_id: null,
|
||||||
|
usage: { $sum: '$length' }
|
||||||
|
}
|
||||||
|
}])
|
||||||
|
.then(aggregates => {
|
||||||
|
if (aggregates.length > 0) {
|
||||||
|
return aggregates[0].usage;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
});
|
||||||
|
|
||||||
|
await Stats.insert({
|
||||||
|
date: today,
|
||||||
|
users: {
|
||||||
|
local: {
|
||||||
|
total: localUsersCount,
|
||||||
|
diff: 0
|
||||||
|
},
|
||||||
|
remote: {
|
||||||
|
total: remoteUsersCount,
|
||||||
|
diff: 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
notes: {
|
||||||
|
local: {
|
||||||
|
total: localNotesCount,
|
||||||
|
diff: 0,
|
||||||
|
diffs: {
|
||||||
|
normal: 0,
|
||||||
|
reply: 0,
|
||||||
|
renote: 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
remote: {
|
||||||
|
total: remoteNotesCount,
|
||||||
|
diff: 0,
|
||||||
|
diffs: {
|
||||||
|
normal: 0,
|
||||||
|
reply: 0,
|
||||||
|
renote: 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
drive: {
|
||||||
|
local: {
|
||||||
|
totalCount: localDriveFilesCount,
|
||||||
|
totalSize: localDriveFilesSize,
|
||||||
|
diffCount: 0,
|
||||||
|
diffSize: 0
|
||||||
|
},
|
||||||
|
remote: {
|
||||||
|
totalCount: remoteDriveFilesCount,
|
||||||
|
totalSize: remoteDriveFilesSize,
|
||||||
|
diffCount: 0,
|
||||||
|
diffSize: 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('done');
|
||||||
|
}
|
||||||
|
|
||||||
|
main();
|
144
cli/migration/8.0.0.js
Normal file
144
cli/migration/8.0.0.js
Normal file
@ -0,0 +1,144 @@
|
|||||||
|
const { default: Stats } = require('../../built/models/stats');
|
||||||
|
const { default: User } = require('../../built/models/user');
|
||||||
|
const { default: Note } = require('../../built/models/note');
|
||||||
|
const { default: DriveFile } = require('../../built/models/drive-file');
|
||||||
|
|
||||||
|
const now = new Date();
|
||||||
|
const y = now.getFullYear();
|
||||||
|
const m = now.getMonth();
|
||||||
|
const d = now.getDate();
|
||||||
|
const h = now.getHours();
|
||||||
|
const date = new Date(y, m, d, h);
|
||||||
|
|
||||||
|
async function main() {
|
||||||
|
await Stats.update({}, {
|
||||||
|
$set: {
|
||||||
|
span: 'day'
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
multi: true
|
||||||
|
});
|
||||||
|
|
||||||
|
const localUsersCount = await User.count({
|
||||||
|
host: null
|
||||||
|
});
|
||||||
|
|
||||||
|
const remoteUsersCount = await User.count({
|
||||||
|
host: { $ne: null }
|
||||||
|
});
|
||||||
|
|
||||||
|
const localNotesCount = await Note.count({
|
||||||
|
'_user.host': null
|
||||||
|
});
|
||||||
|
|
||||||
|
const remoteNotesCount = await Note.count({
|
||||||
|
'_user.host': { $ne: null }
|
||||||
|
});
|
||||||
|
|
||||||
|
const localDriveFilesCount = await DriveFile.count({
|
||||||
|
'metadata._user.host': null
|
||||||
|
});
|
||||||
|
|
||||||
|
const remoteDriveFilesCount = await DriveFile.count({
|
||||||
|
'metadata._user.host': { $ne: null }
|
||||||
|
});
|
||||||
|
|
||||||
|
const localDriveFilesSize = await DriveFile
|
||||||
|
.aggregate([{
|
||||||
|
$match: {
|
||||||
|
'metadata._user.host': null,
|
||||||
|
'metadata.deletedAt': { $exists: false }
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
$project: {
|
||||||
|
length: true
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
$group: {
|
||||||
|
_id: null,
|
||||||
|
usage: { $sum: '$length' }
|
||||||
|
}
|
||||||
|
}])
|
||||||
|
.then(aggregates => {
|
||||||
|
if (aggregates.length > 0) {
|
||||||
|
return aggregates[0].usage;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
});
|
||||||
|
|
||||||
|
const remoteDriveFilesSize = await DriveFile
|
||||||
|
.aggregate([{
|
||||||
|
$match: {
|
||||||
|
'metadata._user.host': { $ne: null },
|
||||||
|
'metadata.deletedAt': { $exists: false }
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
$project: {
|
||||||
|
length: true
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
$group: {
|
||||||
|
_id: null,
|
||||||
|
usage: { $sum: '$length' }
|
||||||
|
}
|
||||||
|
}])
|
||||||
|
.then(aggregates => {
|
||||||
|
if (aggregates.length > 0) {
|
||||||
|
return aggregates[0].usage;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
});
|
||||||
|
|
||||||
|
await Stats.insert({
|
||||||
|
date: date,
|
||||||
|
span: 'hour',
|
||||||
|
users: {
|
||||||
|
local: {
|
||||||
|
total: localUsersCount,
|
||||||
|
diff: 0
|
||||||
|
},
|
||||||
|
remote: {
|
||||||
|
total: remoteUsersCount,
|
||||||
|
diff: 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
notes: {
|
||||||
|
local: {
|
||||||
|
total: localNotesCount,
|
||||||
|
diff: 0,
|
||||||
|
diffs: {
|
||||||
|
normal: 0,
|
||||||
|
reply: 0,
|
||||||
|
renote: 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
remote: {
|
||||||
|
total: remoteNotesCount,
|
||||||
|
diff: 0,
|
||||||
|
diffs: {
|
||||||
|
normal: 0,
|
||||||
|
reply: 0,
|
||||||
|
renote: 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
drive: {
|
||||||
|
local: {
|
||||||
|
totalCount: localDriveFilesCount,
|
||||||
|
totalSize: localDriveFilesSize,
|
||||||
|
diffCount: 0,
|
||||||
|
diffSize: 0
|
||||||
|
},
|
||||||
|
remote: {
|
||||||
|
totalCount: remoteDriveFilesCount,
|
||||||
|
totalSize: remoteDriveFilesSize,
|
||||||
|
diffCount: 0,
|
||||||
|
diffSize: 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('done');
|
||||||
|
}
|
||||||
|
|
||||||
|
main();
|
@ -1,3 +1,3 @@
|
|||||||
files:
|
files:
|
||||||
- source: /locales/ja.yml
|
- source: /locales/ja-JP.yml
|
||||||
translation: /locales/%two_letters_code%.yml
|
translation: /locales/%locale%.yml
|
||||||
|
@ -33,14 +33,3 @@ node cli/suspend @syuilo@misskey.xyz
|
|||||||
``` shell
|
``` shell
|
||||||
node cli/reset-password (User-ID or Username)
|
node cli/reset-password (User-ID or Username)
|
||||||
```
|
```
|
||||||
|
|
||||||
## Clean up cached remote files
|
|
||||||
``` shell
|
|
||||||
node cli/clean-cached-remote-files
|
|
||||||
```
|
|
||||||
|
|
||||||
## Clean up unused drive files
|
|
||||||
``` shell
|
|
||||||
node cli/clean-unused-drive-files
|
|
||||||
```
|
|
||||||
> We recommend that you announce a user that unused drive files will be deleted before performing this operation, as it may delete the user's important files.
|
|
||||||
|
@ -33,14 +33,3 @@ node cli/suspend @syuilo@misskey.xyz
|
|||||||
``` shell
|
``` shell
|
||||||
node cli/reset-password (ユーザーID または ユーザー名)
|
node cli/reset-password (ユーザーID または ユーザー名)
|
||||||
```
|
```
|
||||||
|
|
||||||
## キャッシュされたリモートファイルをクリーンアップする
|
|
||||||
``` shell
|
|
||||||
node cli/clean-cached-remote-files
|
|
||||||
```
|
|
||||||
|
|
||||||
## 使われていないドライブのファイルをクリーンアップする
|
|
||||||
``` shell
|
|
||||||
node cli/clean-unused-drive-files
|
|
||||||
```
|
|
||||||
> ユーザーの大事なファイルを削除する可能性があるので、この操作を実行する前にユーザーに告知することをお勧めします。
|
|
||||||
|
@ -11,12 +11,12 @@ If you find an untranslated part on Misskey:
|
|||||||
- In fact, `foo` should be a word that is appropriate for the situation and is easy to understand in English.
|
- In fact, `foo` should be a word that is appropriate for the situation and is easy to understand in English.
|
||||||
- For example, if the untranslated portion is the following "タイムライン" you must write: `%i18n:@timeline%`.
|
- For example, if the untranslated portion is the following "タイムライン" you must write: `%i18n:@timeline%`.
|
||||||
|
|
||||||
3. Open the `locales/ja.yml`, check whether the <strong>file name (path)</strong> found in step 1 exists, if not, create it.
|
3. Open the `locales/ja-JP.yml`, check whether the <strong>file name (path)</strong> found in step 1 exists, if not, create it.
|
||||||
- Do not put the beginning of the path `src/client/app/` in the locale file.
|
- Do not put the beginning of the path `src/client/app/` in the locale file.
|
||||||
- For example, in this case we want to modify untranslated parts of `src/client/app/mobile/views/pages/home.vue`, so the key is `mobile/views/pages/home.vue`.
|
- For example, in this case we want to modify untranslated parts of `src/client/app/mobile/views/pages/home.vue`, so the key is `mobile/views/pages/home.vue`.
|
||||||
|
|
||||||
4. Add the text property using the `foo` keyword below the path that you found or created in step 2. Make sure to type your text in quotation marks. Text should always be inside of quotes.
|
4. Add the text property using the `foo` keyword below the path that you found or created in step 2. Make sure to type your text in quotation marks. Text should always be inside of quotes.
|
||||||
- For example, in this case we add timeline: `timeline: "タイムライン"` to `locales/ja.yml`.
|
- For example, in this case we add timeline: `timeline: "タイムライン"` to `locales/ja-JP.yml`.
|
||||||
|
|
||||||
5. And done!
|
5. And done!
|
||||||
|
|
||||||
|
@ -16,7 +16,7 @@ Si vous trouvez un segment non-traduit sur Misskey :
|
|||||||
- Par exemple, dans ce cas de figure, nous voulons modifier le segment non-traduit de : `src/client/app/mobile/views/pages/home.vue`donc il faut juste écrire : `mobile/views/pages/home.vue` dans les fichiers linguistiques.
|
- Par exemple, dans ce cas de figure, nous voulons modifier le segment non-traduit de : `src/client/app/mobile/views/pages/home.vue`donc il faut juste écrire : `mobile/views/pages/home.vue` dans les fichiers linguistiques.
|
||||||
|
|
||||||
4. Ajoutez la propriété du texte traduit grâce à la clef `foo`, en-dessous du chemin correspondant à votre modification que vous avez trouvé ou créé dans l'étape 2. À côté, veuillez indiquer entre "guillemets" la valeur de votre traduction.
|
4. Ajoutez la propriété du texte traduit grâce à la clef `foo`, en-dessous du chemin correspondant à votre modification que vous avez trouvé ou créé dans l'étape 2. À côté, veuillez indiquer entre "guillemets" la valeur de votre traduction.
|
||||||
- Par exemple, dans ce cas de figure, nous ajoutons la propriété et la traduction `timeline: "Timeline"` à `locales/fr.yml`, mais aussi la propriété et la version originale `timeline: "タイムライン"` à `locales/ja.yml`.
|
- Par exemple, dans ce cas de figure, nous ajoutons la propriété et la traduction `timeline: "Timeline"` à `locales/fr.yml`, mais aussi la propriété et la version originale `timeline: "タイムライン"` à `locales/ja-JP.yml`.
|
||||||
|
|
||||||
5. Vous avez réussi à traduire une portion de misskey !
|
5. Vous avez réussi à traduire une portion de misskey !
|
||||||
|
|
||||||
|
@ -11,12 +11,12 @@ Misskey内の未翻訳箇所を見つけたら
|
|||||||
- `foo`は実際にはその場に適したわかりやすい(英語の)名前にしてください。
|
- `foo`は実際にはその場に適したわかりやすい(英語の)名前にしてください。
|
||||||
- 例えば未翻訳箇所が「タイムライン」というテキストだった場合、`%i18n:@timeline%`のようにします。
|
- 例えば未翻訳箇所が「タイムライン」というテキストだった場合、`%i18n:@timeline%`のようにします。
|
||||||
|
|
||||||
3. `locales/ja.yml`を開き、1.で見つけた<strong>ファイル名(パス)</strong>のキーが存在するか確認し、無ければ作成してください。
|
3. `locales/ja-JP.yml`を開き、1.で見つけた<strong>ファイル名(パス)</strong>のキーが存在するか確認し、無ければ作成してください。
|
||||||
- パスの`src/client/app/`は省略してください。
|
- パスの`src/client/app/`は省略してください。
|
||||||
- 例えば、今回の例では`src/client/app/mobile/views/pages/home.vue`の未翻訳箇所を修正したいので、キーは`mobile/views/pages/home.vue`になります。
|
- 例えば、今回の例では`src/client/app/mobile/views/pages/home.vue`の未翻訳箇所を修正したいので、キーは`mobile/views/pages/home.vue`になります。
|
||||||
|
|
||||||
4. そのキーの直下に2.で置換した`foo`の部分をキーとし、テキストを値とするプロパティを追加します。
|
4. そのキーの直下に2.で置換した`foo`の部分をキーとし、テキストを値とするプロパティを追加します。
|
||||||
- 例えば、今回の例で言うと`locales/ja.yml`に`timeline: "タイムライン"`を追加します。
|
- 例えば、今回の例で言うと`locales/ja-JP.yml`に`timeline: "タイムライン"`を追加します。
|
||||||
|
|
||||||
5. 完了です!
|
5. 完了です!
|
||||||
|
|
||||||
|
13
gulpfile.ts
13
gulpfile.ts
@ -23,7 +23,6 @@ const uglifyes = require('uglify-es');
|
|||||||
|
|
||||||
const locales = require('./locales');
|
const locales = require('./locales');
|
||||||
import { fa } from './src/misc/fa';
|
import { fa } from './src/misc/fa';
|
||||||
import config from './src/config';
|
|
||||||
|
|
||||||
const uglify = uglifyComposer(uglifyes, console);
|
const uglify = uglifyComposer(uglifyes, console);
|
||||||
|
|
||||||
@ -60,7 +59,16 @@ gulp.task('build:copy:views', () =>
|
|||||||
gulp.src('./src/server/web/views/**/*').pipe(gulp.dest('./built/server/web/views'))
|
gulp.src('./src/server/web/views/**/*').pipe(gulp.dest('./built/server/web/views'))
|
||||||
);
|
);
|
||||||
|
|
||||||
gulp.task('build:copy', ['build:copy:views'], () =>
|
// 互換性のため
|
||||||
|
gulp.task('build:copy:lang', () =>
|
||||||
|
gulp.src(['./built/client/assets/*.*-*.js'])
|
||||||
|
.pipe(rename(path => {
|
||||||
|
path.basename = path.basename.replace(/\-(.*)$/, '');
|
||||||
|
}))
|
||||||
|
.pipe(gulp.dest('./built/client/assets/'))
|
||||||
|
);
|
||||||
|
|
||||||
|
gulp.task('build:copy', ['build:copy:views', 'build:copy:lang'], () =>
|
||||||
gulp.src([
|
gulp.src([
|
||||||
'./build/Release/crypto_key.node',
|
'./build/Release/crypto_key.node',
|
||||||
'./src/const.json',
|
'./src/const.json',
|
||||||
@ -118,7 +126,6 @@ gulp.task('build:client:script', () => {
|
|||||||
const client = require('./built/client/meta.json');
|
const client = require('./built/client/meta.json');
|
||||||
return gulp.src(['./src/client/app/boot.js', './src/client/app/safe.js'])
|
return gulp.src(['./src/client/app/boot.js', './src/client/app/safe.js'])
|
||||||
.pipe(replace('VERSION', JSON.stringify(client.version)))
|
.pipe(replace('VERSION', JSON.stringify(client.version)))
|
||||||
.pipe(replace('API', JSON.stringify(config.api_url)))
|
|
||||||
.pipe(replace('ENV', JSON.stringify(env)))
|
.pipe(replace('ENV', JSON.stringify(env)))
|
||||||
.pipe(replace('LANGS', JSON.stringify(Object.keys(locales))))
|
.pipe(replace('LANGS', JSON.stringify(Object.keys(locales))))
|
||||||
.pipe(isProduction ? uglify({
|
.pipe(isProduction ? uglify({
|
||||||
|
5
locales/README.md
Normal file
5
locales/README.md
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# **Please DO NOT edit these files** except `ja-JP.yml`.
|
||||||
|
|
||||||
|
If you want to...
|
||||||
|
* i18n ... please see [Translation guide](../docs/translate.en.md).
|
||||||
|
* l10n ... please visit https://crowdin.com/project/misskey
|
@ -58,7 +58,7 @@ common:
|
|||||||
friday: "金曜日"
|
friday: "金曜日"
|
||||||
saturday: "土曜日"
|
saturday: "土曜日"
|
||||||
reactions:
|
reactions:
|
||||||
like: "いいね"
|
like: "ええやん"
|
||||||
love: "しゅき"
|
love: "しゅき"
|
||||||
laugh: "笑"
|
laugh: "笑"
|
||||||
hmm: "ふぅ~む"
|
hmm: "ふぅ~む"
|
||||||
@ -84,7 +84,7 @@ common:
|
|||||||
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
||||||
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
||||||
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
||||||
verified-user: "認証済みのユーザー"
|
verified-user: "公式アカウント"
|
||||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "引き分け"
|
drawn: "引き分け"
|
||||||
@ -287,7 +287,10 @@ common/views/components/signin.vue:
|
|||||||
signin: "サインイン"
|
signin: "サインイン"
|
||||||
or: "または"
|
or: "または"
|
||||||
signin-with-twitter: "Twitterでログイン"
|
signin-with-twitter: "Twitterでログイン"
|
||||||
|
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||||
common/views/components/signup.vue:
|
common/views/components/signup.vue:
|
||||||
|
invitation-code: "招待コード"
|
||||||
|
invitation-info: "招待コードをお持ちでない方は、<a href=\"{}\">管理者</a>までご連絡ください。"
|
||||||
username: "ユーザー名"
|
username: "ユーザー名"
|
||||||
checking: "確認しています..."
|
checking: "確認しています..."
|
||||||
available: "利用できます"
|
available: "利用できます"
|
||||||
@ -440,6 +443,7 @@ desktop/views/components/drive-window.vue:
|
|||||||
desktop/views/components/drive.file.vue:
|
desktop/views/components/drive.file.vue:
|
||||||
avatar: "アイコン"
|
avatar: "アイコン"
|
||||||
banner: "バナー"
|
banner: "バナー"
|
||||||
|
nsfw: "閲覧注意"
|
||||||
contextmenu:
|
contextmenu:
|
||||||
rename: "名前を変更"
|
rename: "名前を変更"
|
||||||
mark-as-sensitive: "閲覧注意に設定"
|
mark-as-sensitive: "閲覧注意に設定"
|
||||||
@ -625,9 +629,11 @@ desktop/views/components/settings.vue:
|
|||||||
circle-icons: "円形のアイコンを使用"
|
circle-icons: "円形のアイコンを使用"
|
||||||
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
||||||
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
||||||
|
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||||
show-reply-target: "リプライ先を表示する"
|
show-reply-target: "リプライ先を表示する"
|
||||||
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
|
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
|
||||||
show-renoted-my-notes: "Renoteされた自分の投稿をタイムラインに表示する"
|
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
|
||||||
|
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
|
||||||
show-maps: "マップの自動展開"
|
show-maps: "マップの自動展開"
|
||||||
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
|
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
|
||||||
sound: "サウンド"
|
sound: "サウンド"
|
||||||
@ -795,6 +801,7 @@ desktop/views/pages/admin/admin.dashboard.vue:
|
|||||||
original-users: "このインスタンスのユーザー"
|
original-users: "このインスタンスのユーザー"
|
||||||
all-notes: "全てのノート"
|
all-notes: "全てのノート"
|
||||||
original-notes: "このインスタンスのノート"
|
original-notes: "このインスタンスのノート"
|
||||||
|
invite: "招待"
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
desktop/views/pages/admin/admin.suspend-user.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
suspend-user: "ユーザーの凍結"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
@ -803,6 +810,26 @@ desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|||||||
unsuspend-user: "ユーザーの凍結の解除"
|
unsuspend-user: "ユーザーの凍結の解除"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
|
desktop/views/pages/admin/admin.verify-user.vue:
|
||||||
|
verify-user: "ユーザーの公式アカウント設定"
|
||||||
|
verify: "公式アカウントにする"
|
||||||
|
verified: "公式アカウントにしました"
|
||||||
|
desktop/views/pages/admin/admin.unverify-user.vue:
|
||||||
|
unverify-user: "ユーザーの公式アカウント解除"
|
||||||
|
unverify: "公式アカウントを解除する"
|
||||||
|
unverified: "公式アカウントを解除しました"
|
||||||
|
desktop/views/pages/admin/admin.notes-chart.vue:
|
||||||
|
title: "投稿"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
desktop/views/pages/admin/admin.users-chart.vue:
|
||||||
|
title: "ユーザー"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
desktop/views/pages/admin/admin.drive-chart.vue:
|
||||||
|
title: "ドライブ"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "メディア投稿のみ"
|
is-media-only: "メディア投稿のみ"
|
||||||
is-media-view: "メディアビュー"
|
is-media-view: "メディアビュー"
|
||||||
@ -835,7 +862,7 @@ desktop/views/pages/selectdrive.vue:
|
|||||||
cancel: "キャンセル"
|
cancel: "キャンセル"
|
||||||
upload: "PCからドライブにファイルをアップロード"
|
upload: "PCからドライブにファイルをアップロード"
|
||||||
desktop/views/pages/search.vue:
|
desktop/views/pages/search.vue:
|
||||||
not-available: "検索機能を利用することができません。"
|
not-available: "検索機能はインスタンスの設定で無効になっています。"
|
||||||
not-found: "「{}」に関する投稿は見つかりませんでした。"
|
not-found: "「{}」に関する投稿は見つかりませんでした。"
|
||||||
desktop/views/pages/share.vue:
|
desktop/views/pages/share.vue:
|
||||||
share-with: "{}で共有"
|
share-with: "{}で共有"
|
||||||
@ -928,12 +955,15 @@ mobile/views/components/drive-file-chooser.vue:
|
|||||||
select-file: "ファイルを選択"
|
select-file: "ファイルを選択"
|
||||||
mobile/views/components/drive-folder-chooser.vue:
|
mobile/views/components/drive-folder-chooser.vue:
|
||||||
select-folder: "フォルダーを選択"
|
select-folder: "フォルダーを選択"
|
||||||
|
mobile/views/components/drive.file.vue:
|
||||||
|
nsfw: "閲覧注意"
|
||||||
mobile/views/components/drive.file-detail.vue:
|
mobile/views/components/drive.file-detail.vue:
|
||||||
download: "ダウンロード"
|
download: "ダウンロード"
|
||||||
rename: "名前を変更"
|
rename: "名前を変更"
|
||||||
move: "移動"
|
move: "移動"
|
||||||
hash: "ハッシュ (md5)"
|
hash: "ハッシュ (md5)"
|
||||||
exif: "EXIF"
|
exif: "EXIF"
|
||||||
|
nsfw: "閲覧注意"
|
||||||
mobile/views/components/media-image.vue:
|
mobile/views/components/media-image.vue:
|
||||||
sensitive: "閲覧注意"
|
sensitive: "閲覧注意"
|
||||||
click-to-show: "クリックして表示"
|
click-to-show: "クリックして表示"
|
||||||
@ -1106,7 +1136,8 @@ mobile/views/pages/settings.vue:
|
|||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
show-reply-target: "リプライ先を表示する"
|
show-reply-target: "リプライ先を表示する"
|
||||||
show-my-renotes: "自分の行ったRenoteを表示する"
|
show-my-renotes: "自分の行ったRenoteを表示する"
|
||||||
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
|
show-renoted-my-notes: "自分の投稿のRenoteを表示する"
|
||||||
|
show-local-renotes: "ローカルの投稿のRenoteを表示する"
|
||||||
post-style: "投稿の表示スタイル"
|
post-style: "投稿の表示スタイル"
|
||||||
post-style-standard: "標準"
|
post-style-standard: "標準"
|
||||||
post-style-smart: "スマート"
|
post-style-smart: "スマート"
|
@ -58,7 +58,7 @@ common:
|
|||||||
friday: "金曜日"
|
friday: "金曜日"
|
||||||
saturday: "土曜日"
|
saturday: "土曜日"
|
||||||
reactions:
|
reactions:
|
||||||
like: "Gefällt mir"
|
like: "ええやん"
|
||||||
love: "Lieben"
|
love: "Lieben"
|
||||||
laugh: "Lachen"
|
laugh: "Lachen"
|
||||||
hmm: "Hmm...?"
|
hmm: "Hmm...?"
|
||||||
@ -84,7 +84,7 @@ common:
|
|||||||
my-token-regenerated: "Dein Token wurde generiert. Du wirst jetzt abgemeldet."
|
my-token-regenerated: "Dein Token wurde generiert. Du wirst jetzt abgemeldet."
|
||||||
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
||||||
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
||||||
verified-user: "認証済みのユーザー"
|
verified-user: "公式アカウント"
|
||||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "引き分け"
|
drawn: "引き分け"
|
||||||
@ -287,7 +287,10 @@ common/views/components/signin.vue:
|
|||||||
signin: "Anmelden"
|
signin: "Anmelden"
|
||||||
or: "または"
|
or: "または"
|
||||||
signin-with-twitter: "Twitterでログイン"
|
signin-with-twitter: "Twitterでログイン"
|
||||||
|
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||||
common/views/components/signup.vue:
|
common/views/components/signup.vue:
|
||||||
|
invitation-code: "招待コード"
|
||||||
|
invitation-info: "招待コードをお持ちでない方は、<a href=\"{}\">管理者</a>までご連絡ください。"
|
||||||
username: "Benutzername"
|
username: "Benutzername"
|
||||||
checking: "Überprüfung..."
|
checking: "Überprüfung..."
|
||||||
available: "Verfügbar"
|
available: "Verfügbar"
|
||||||
@ -440,6 +443,7 @@ desktop/views/components/drive-window.vue:
|
|||||||
desktop/views/components/drive.file.vue:
|
desktop/views/components/drive.file.vue:
|
||||||
avatar: "Avatar"
|
avatar: "Avatar"
|
||||||
banner: "Banner"
|
banner: "Banner"
|
||||||
|
nsfw: "閲覧注意"
|
||||||
contextmenu:
|
contextmenu:
|
||||||
rename: "Umbenennen"
|
rename: "Umbenennen"
|
||||||
mark-as-sensitive: "閲覧注意に設定"
|
mark-as-sensitive: "閲覧注意に設定"
|
||||||
@ -625,9 +629,11 @@ desktop/views/components/settings.vue:
|
|||||||
circle-icons: "Kreisförmige Icons"
|
circle-icons: "Kreisförmige Icons"
|
||||||
gradient-window-header: "Übergang in Fensterköpfen"
|
gradient-window-header: "Übergang in Fensterköpfen"
|
||||||
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
||||||
|
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||||
show-reply-target: "Zeige Antworten"
|
show-reply-target: "Zeige Antworten"
|
||||||
show-my-renotes: "Zeige meine Reposts auf der Zeitleiste"
|
show-my-renotes: "Zeige meine Reposts auf der Zeitleiste"
|
||||||
show-renoted-my-notes: "Zeige meine Reposts, die geteilt wurden, auf der Zeitleiste"
|
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
|
||||||
|
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
|
||||||
show-maps: "Karte anzeigen"
|
show-maps: "Karte anzeigen"
|
||||||
show-maps-desc: "Zeige den Standort zu diesem Beitrag automatisch an."
|
show-maps-desc: "Zeige den Standort zu diesem Beitrag automatisch an."
|
||||||
sound: "Ton"
|
sound: "Ton"
|
||||||
@ -795,6 +801,7 @@ desktop/views/pages/admin/admin.dashboard.vue:
|
|||||||
original-users: "このインスタンスのユーザー"
|
original-users: "このインスタンスのユーザー"
|
||||||
all-notes: "全てのノート"
|
all-notes: "全てのノート"
|
||||||
original-notes: "このインスタンスのノート"
|
original-notes: "このインスタンスのノート"
|
||||||
|
invite: "招待"
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
desktop/views/pages/admin/admin.suspend-user.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
suspend-user: "ユーザーの凍結"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
@ -803,6 +810,26 @@ desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|||||||
unsuspend-user: "ユーザーの凍結の解除"
|
unsuspend-user: "ユーザーの凍結の解除"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
|
desktop/views/pages/admin/admin.verify-user.vue:
|
||||||
|
verify-user: "ユーザーの公式アカウント設定"
|
||||||
|
verify: "公式アカウントにする"
|
||||||
|
verified: "公式アカウントにしました"
|
||||||
|
desktop/views/pages/admin/admin.unverify-user.vue:
|
||||||
|
unverify-user: "ユーザーの公式アカウント解除"
|
||||||
|
unverify: "公式アカウントを解除する"
|
||||||
|
unverified: "公式アカウントを解除しました"
|
||||||
|
desktop/views/pages/admin/admin.notes-chart.vue:
|
||||||
|
title: "投稿"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
desktop/views/pages/admin/admin.users-chart.vue:
|
||||||
|
title: "ユーザー"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
desktop/views/pages/admin/admin.drive-chart.vue:
|
||||||
|
title: "ドライブ"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "メディア投稿のみ"
|
is-media-only: "メディア投稿のみ"
|
||||||
is-media-view: "メディアビュー"
|
is-media-view: "メディアビュー"
|
||||||
@ -835,7 +862,7 @@ desktop/views/pages/selectdrive.vue:
|
|||||||
cancel: "Abbrechen"
|
cancel: "Abbrechen"
|
||||||
upload: "PCからドライブにファイルをアップロード"
|
upload: "PCからドライブにファイルをアップロード"
|
||||||
desktop/views/pages/search.vue:
|
desktop/views/pages/search.vue:
|
||||||
not-available: "検索機能を利用することができません。"
|
not-available: "検索機能はインスタンスの設定で無効になっています。"
|
||||||
not-found: "「{}」に関する投稿は見つかりませんでした。"
|
not-found: "「{}」に関する投稿は見つかりませんでした。"
|
||||||
desktop/views/pages/share.vue:
|
desktop/views/pages/share.vue:
|
||||||
share-with: "{}で共有"
|
share-with: "{}で共有"
|
||||||
@ -928,12 +955,15 @@ mobile/views/components/drive-file-chooser.vue:
|
|||||||
select-file: "ファイルを選択"
|
select-file: "ファイルを選択"
|
||||||
mobile/views/components/drive-folder-chooser.vue:
|
mobile/views/components/drive-folder-chooser.vue:
|
||||||
select-folder: "フォルダーを選択"
|
select-folder: "フォルダーを選択"
|
||||||
|
mobile/views/components/drive.file.vue:
|
||||||
|
nsfw: "閲覧注意"
|
||||||
mobile/views/components/drive.file-detail.vue:
|
mobile/views/components/drive.file-detail.vue:
|
||||||
download: "ダウンロード"
|
download: "ダウンロード"
|
||||||
rename: "名前を変更"
|
rename: "名前を変更"
|
||||||
move: "移動"
|
move: "移動"
|
||||||
hash: "ハッシュ (md5)"
|
hash: "ハッシュ (md5)"
|
||||||
exif: "EXIF"
|
exif: "EXIF"
|
||||||
|
nsfw: "閲覧注意"
|
||||||
mobile/views/components/media-image.vue:
|
mobile/views/components/media-image.vue:
|
||||||
sensitive: "閲覧注意"
|
sensitive: "閲覧注意"
|
||||||
click-to-show: "クリックして表示"
|
click-to-show: "クリックして表示"
|
||||||
@ -1106,7 +1136,8 @@ mobile/views/pages/settings.vue:
|
|||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
show-reply-target: "リプライ先を表示する"
|
show-reply-target: "リプライ先を表示する"
|
||||||
show-my-renotes: "自分の行ったRenoteを表示する"
|
show-my-renotes: "自分の行ったRenoteを表示する"
|
||||||
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
|
show-renoted-my-notes: "自分の投稿のRenoteを表示する"
|
||||||
|
show-local-renotes: "ローカルの投稿のRenoteを表示する"
|
||||||
post-style: "投稿の表示スタイル"
|
post-style: "投稿の表示スタイル"
|
||||||
post-style-standard: "標準"
|
post-style-standard: "標準"
|
||||||
post-style-smart: "スマート"
|
post-style-smart: "スマート"
|
@ -16,7 +16,7 @@ common:
|
|||||||
customization-tips:
|
customization-tips:
|
||||||
title: "Customization tips"
|
title: "Customization tips"
|
||||||
paragraph1: "Home customization allows you to add/delete, drag and drop and rearrange widgets."
|
paragraph1: "Home customization allows you to add/delete, drag and drop and rearrange widgets."
|
||||||
paragraph2: "You can change the display by <strong>right clicking</strong> on some widgets."
|
paragraph2: "You can change the display by <strong><strong>right</strong> clicking</strong> on some widgets."
|
||||||
paragraph3: "To delete a widget, drag and drop the widget onto <strong>the area labeled \"Trash\"</strong> in the header."
|
paragraph3: "To delete a widget, drag and drop the widget onto <strong>the area labeled \"Trash\"</strong> in the header."
|
||||||
paragraph4: "To finish the customization, click \"Finish\" on the upper right."
|
paragraph4: "To finish the customization, click \"Finish\" on the upper right."
|
||||||
gotit: "Got it!"
|
gotit: "Got it!"
|
||||||
@ -72,9 +72,9 @@ common:
|
|||||||
a: "What are you doing?"
|
a: "What are you doing?"
|
||||||
b: "What's happening?"
|
b: "What's happening?"
|
||||||
c: "What’s on your mind?"
|
c: "What’s on your mind?"
|
||||||
d: "What do you wish to say?"
|
d: "Would you post any words?"
|
||||||
e: "Write here"
|
e: "Write here"
|
||||||
f: "Waiting for your writing..."
|
f: "Waiting for your writing."
|
||||||
search: "Search"
|
search: "Search"
|
||||||
delete: "Delete"
|
delete: "Delete"
|
||||||
loading: "Loading"
|
loading: "Loading"
|
||||||
@ -84,7 +84,7 @@ common:
|
|||||||
my-token-regenerated: "Your token has been regenerated, so you will be signed out."
|
my-token-regenerated: "Your token has been regenerated, so you will be signed out."
|
||||||
i-like-sushi: "I prefer sushi rather than pudding"
|
i-like-sushi: "I prefer sushi rather than pudding"
|
||||||
show-reversi-board-labels: "Show row and column labels in Reversi"
|
show-reversi-board-labels: "Show row and column labels in Reversi"
|
||||||
verified-user: "Authorized User"
|
verified-user: "Verified account"
|
||||||
disable-animated-mfm: "Disable animated texts in a post"
|
disable-animated-mfm: "Disable animated texts in a post"
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "Draw"
|
drawn: "Draw"
|
||||||
@ -141,11 +141,11 @@ common:
|
|||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "Would you <b>allow</b> <i>{{ app.name }}</i> to access your account?"
|
share-access: "Would you <b>allow</b> <i>{{ app.name }}</i> to access your account?"
|
||||||
permission-ask: "This application requires the following permissions:"
|
permission-ask: "This application requires the following permissions:"
|
||||||
account-read: "Viewing account information:"
|
account-read: "View account information."
|
||||||
account-write: "Modify account informations:"
|
account-write: "Modify account information."
|
||||||
note-write: "Post."
|
note-write: "Post."
|
||||||
like-write: "To react to posts."
|
like-write: "React to posts."
|
||||||
following-write: "Follow or unfollow."
|
following-write: "Follow and unfollow."
|
||||||
drive-read: "Read your drive."
|
drive-read: "Read your drive."
|
||||||
drive-write: "Upload/delete files in your drive."
|
drive-write: "Upload/delete files in your drive."
|
||||||
notification-read: "Read your notifications."
|
notification-read: "Read your notifications."
|
||||||
@ -154,10 +154,10 @@ auth/views/form.vue:
|
|||||||
accept: "Allow access."
|
accept: "Allow access."
|
||||||
auth/views/index.vue:
|
auth/views/index.vue:
|
||||||
loading: "Loading"
|
loading: "Loading"
|
||||||
denied: "Application authorization denied."
|
denied: "Application authorization has been denied."
|
||||||
denied-paragraph: "This application will not access your account."
|
denied-paragraph: "This application will not access your account."
|
||||||
already-authorized: "This application has already been authorized."
|
already-authorized: "This application has already been authorized."
|
||||||
allowed: "Application authorizations allowed.+"
|
allowed: "Application authorizations allowed."
|
||||||
callback-url: "Going back to the application."
|
callback-url: "Going back to the application."
|
||||||
please-go-back: "Please go back to the application."
|
please-go-back: "Please go back to the application."
|
||||||
error: "Session does not exist."
|
error: "Session does not exist."
|
||||||
@ -169,7 +169,7 @@ common/views/components/games/reversi/reversi.vue:
|
|||||||
common/views/components/games/reversi/reversi.game.vue:
|
common/views/components/games/reversi/reversi.game.vue:
|
||||||
surrender: "Surrender"
|
surrender: "Surrender"
|
||||||
surrendered: "By surrender"
|
surrendered: "By surrender"
|
||||||
is-llotheo: "The lesser one wins"
|
is-llotheo: "The lesser one wins(Llotheo)"
|
||||||
looped-map: "Looped map"
|
looped-map: "Looped map"
|
||||||
can-put-everywhere: "Can put everywhere"
|
can-put-everywhere: "Can put everywhere"
|
||||||
common/views/components/games/reversi/reversi.index.vue:
|
common/views/components/games/reversi/reversi.index.vue:
|
||||||
@ -200,7 +200,7 @@ common/views/components/games/reversi/reversi.room.vue:
|
|||||||
settings-of-the-bot: "Bot settings"
|
settings-of-the-bot: "Bot settings"
|
||||||
this-game-is-started-soon: "The game will begin in seconds"
|
this-game-is-started-soon: "The game will begin in seconds"
|
||||||
waiting-for-other: "Waiting for the opponent"
|
waiting-for-other: "Waiting for the opponent"
|
||||||
waiting-for-me: "Waiting for you"
|
waiting-for-me: "Waiting for the your preparation"
|
||||||
waiting-for-both: "Prepareing"
|
waiting-for-both: "Prepareing"
|
||||||
cancel: "Cancel"
|
cancel: "Cancel"
|
||||||
ready: "Ready"
|
ready: "Ready"
|
||||||
@ -226,7 +226,7 @@ common/views/components/connect-failed.troubleshooter.vue:
|
|||||||
no-server: "Unable to connect to the Misskey server"
|
no-server: "Unable to connect to the Misskey server"
|
||||||
no-server-desc: "The network connection of your device is normal, but you could not connect to the Misskey server. There is a possibility that the server is either down, or under maintenance, please try again later."
|
no-server-desc: "The network connection of your device is normal, but you could not connect to the Misskey server. There is a possibility that the server is either down, or under maintenance, please try again later."
|
||||||
success: "Successfully connected to the Misskey server"
|
success: "Successfully connected to the Misskey server"
|
||||||
success-desc: "It seems to be able to connect. Please reload the page."
|
success-desc: "Looks like we have a connection. Please reload the page."
|
||||||
flush: "Clean cache"
|
flush: "Clean cache"
|
||||||
set-version: "Specify version"
|
set-version: "Specify version"
|
||||||
common/views/components/messaging.vue:
|
common/views/components/messaging.vue:
|
||||||
@ -278,7 +278,7 @@ common/views/components/poll-editor.vue:
|
|||||||
add: "+ Add a choice"
|
add: "+ Add a choice"
|
||||||
destroy: "Discard the poll"
|
destroy: "Discard the poll"
|
||||||
common/views/components/reaction-picker.vue:
|
common/views/components/reaction-picker.vue:
|
||||||
choose-reaction: "Express a reaction"
|
choose-reaction: "Send a reaction"
|
||||||
common/views/components/signin.vue:
|
common/views/components/signin.vue:
|
||||||
username: "Username"
|
username: "Username"
|
||||||
password: "Password"
|
password: "Password"
|
||||||
@ -287,7 +287,10 @@ common/views/components/signin.vue:
|
|||||||
signin: "Sign in"
|
signin: "Sign in"
|
||||||
or: "Or"
|
or: "Or"
|
||||||
signin-with-twitter: "Log in with Twitter"
|
signin-with-twitter: "Log in with Twitter"
|
||||||
|
login-failed: "Log in failed. Make sure you have entered your correct username and password."
|
||||||
common/views/components/signup.vue:
|
common/views/components/signup.vue:
|
||||||
|
invitation-code: "Invitation code"
|
||||||
|
invitation-info: "If you do not have an invitation code, please contact an <a href=\"{}\">administrator</a>."
|
||||||
username: "Username"
|
username: "Username"
|
||||||
checking: "Confirming..."
|
checking: "Confirming..."
|
||||||
available: "Available"
|
available: "Available"
|
||||||
@ -347,7 +350,7 @@ common/views/widgets/calendar.vue:
|
|||||||
this-year: "This year: "
|
this-year: "This year: "
|
||||||
common/views/widgets/donation.vue:
|
common/views/widgets/donation.vue:
|
||||||
title: "Request for donations"
|
title: "Request for donations"
|
||||||
text: "To keep Misskey up and running, we have to spend money on our domain name, the server costs and so on. Since we don't receive money from advertisements, we count on donations from all of you. If you're interested in helping, contact {}. Thank you for your contribution!"
|
text: "To keep Misskey up and running, there have to happen some expense for the domain name, the server and so on. Since our policy is not to display any advertisements, we count on your donations. If you're interested in helping, contact {}. Thank you for your contribution!"
|
||||||
common/views/widgets/photo-stream.vue:
|
common/views/widgets/photo-stream.vue:
|
||||||
title: "Photo stream"
|
title: "Photo stream"
|
||||||
no-photos: "No photos"
|
no-photos: "No photos"
|
||||||
@ -388,8 +391,8 @@ common/views/widgets/tips.vue:
|
|||||||
tips-line20: "The percentage of the calendar widget shows the percentage of time elapsed."
|
tips-line20: "The percentage of the calendar widget shows the percentage of time elapsed."
|
||||||
tips-line21: "You can also use the API to develop bots."
|
tips-line21: "You can also use the API to develop bots."
|
||||||
tips-line23: "Mayu is so cute with its eyebrows."
|
tips-line23: "Mayu is so cute with its eyebrows."
|
||||||
tips-line24: "Misskey started in 2014."
|
tips-line24: "Misskey has been running since 2014."
|
||||||
tips-line25: "You can receive notification even if Misskey is not open in a compatible browser."
|
tips-line25: "In a browser compatible with notification features, you can receive notifications in case Misskey is not open"
|
||||||
common/views/pages/follow.vue:
|
common/views/pages/follow.vue:
|
||||||
signed-in-as: "Signed in as {}"
|
signed-in-as: "Signed in as {}"
|
||||||
following: "Following"
|
following: "Following"
|
||||||
@ -440,6 +443,7 @@ desktop/views/components/drive-window.vue:
|
|||||||
desktop/views/components/drive.file.vue:
|
desktop/views/components/drive.file.vue:
|
||||||
avatar: "Avatar"
|
avatar: "Avatar"
|
||||||
banner: "Banner"
|
banner: "Banner"
|
||||||
|
nsfw: "NSFW"
|
||||||
contextmenu:
|
contextmenu:
|
||||||
rename: "Rename"
|
rename: "Rename"
|
||||||
mark-as-sensitive: "Mark as 'sensitive'"
|
mark-as-sensitive: "Mark as 'sensitive'"
|
||||||
@ -470,7 +474,7 @@ desktop/views/components/drive.nav-folder.vue:
|
|||||||
desktop/views/components/drive.vue:
|
desktop/views/components/drive.vue:
|
||||||
search: "Search"
|
search: "Search"
|
||||||
load-more: "Load more"
|
load-more: "Load more"
|
||||||
empty-draghover: "Drop it here, don't I look cute?"
|
empty-draghover: "Drop it here! Yep, cuz you know I'm cute, right?"
|
||||||
empty-drive: "Your media storage is empty"
|
empty-drive: "Your media storage is empty"
|
||||||
empty-drive-description: "Right-click to open the menu, or drag and drop a file onto here for uploading."
|
empty-drive-description: "Right-click to open the menu, or drag and drop a file onto here for uploading."
|
||||||
empty-folder: "This folder is empty"
|
empty-folder: "This folder is empty"
|
||||||
@ -480,7 +484,7 @@ desktop/views/components/drive.vue:
|
|||||||
url-upload: "Upload from a URL"
|
url-upload: "Upload from a URL"
|
||||||
url-of-file: "URL of file you want to upload"
|
url-of-file: "URL of file you want to upload"
|
||||||
url-upload-requested: "Upload requested"
|
url-upload-requested: "Upload requested"
|
||||||
may-take-time: "It may take some time for the upload to complete."
|
may-take-time: "It may take some time until the upload is complete."
|
||||||
create-folder: "Create a folder"
|
create-folder: "Create a folder"
|
||||||
folder-name: "Folder name"
|
folder-name: "Folder name"
|
||||||
contextmenu:
|
contextmenu:
|
||||||
@ -505,7 +509,7 @@ desktop/views/components/followers.vue:
|
|||||||
desktop/views/components/following-window.vue:
|
desktop/views/components/following-window.vue:
|
||||||
following: "Following {}"
|
following: "Following {}"
|
||||||
desktop/views/components/following.vue:
|
desktop/views/components/following.vue:
|
||||||
empty: "You don’t follow anyone."
|
empty: "It seems you don't have any following users…"
|
||||||
desktop/views/components/friends-maker.vue:
|
desktop/views/components/friends-maker.vue:
|
||||||
title: "Recommended users:"
|
title: "Recommended users:"
|
||||||
empty: "Couldn't find any recommended users."
|
empty: "Couldn't find any recommended users."
|
||||||
@ -554,7 +558,7 @@ desktop/views/components/post-form.vue:
|
|||||||
add-visible-user: "+Add a user"
|
add-visible-user: "+Add a user"
|
||||||
attach-location-information: "Attach location information"
|
attach-location-information: "Attach location information"
|
||||||
hide-contents: "Hide contents"
|
hide-contents: "Hide contents"
|
||||||
reply-placeholder: "Reply to this Post..."
|
reply-placeholder: "Reply to this post..."
|
||||||
quote-placeholder: "Quote this Post..."
|
quote-placeholder: "Quote this Post..."
|
||||||
submit: "Post"
|
submit: "Post"
|
||||||
reply: "Reply"
|
reply: "Reply"
|
||||||
@ -575,7 +579,7 @@ desktop/views/components/post-form.vue:
|
|||||||
recent-tags: "Recent"
|
recent-tags: "Recent"
|
||||||
click-to-tagging: "Click to tagging"
|
click-to-tagging: "Click to tagging"
|
||||||
visibility: "Visibility"
|
visibility: "Visibility"
|
||||||
geolocation-alert: "Your device can not measure location infomation"
|
geolocation-alert: "Your device does not provide location services."
|
||||||
error: "Error"
|
error: "Error"
|
||||||
enter-username: "Please enter a username..."
|
enter-username: "Please enter a username..."
|
||||||
annotations: "Annotations for the post (optional)"
|
annotations: "Annotations for the post (optional)"
|
||||||
@ -613,7 +617,7 @@ desktop/views/components/settings.vue:
|
|||||||
fetch-on-scroll: "Endless loading on scroll"
|
fetch-on-scroll: "Endless loading on scroll"
|
||||||
fetch-on-scroll-desc: "When you scroll down the page, it automatically fetches additional content."
|
fetch-on-scroll-desc: "When you scroll down the page, it automatically fetches additional content."
|
||||||
auto-popout: "Auto pop-out window"
|
auto-popout: "Auto pop-out window"
|
||||||
auto-popout-desc: "Pops-out a newly opened window (onto a new tab), if possible. This setting is stored in the browser."
|
auto-popout-desc: "If it's possible, pop-out display will be used instead of opening a new window. This setting is stored in your browser."
|
||||||
advanced: "Advanced settings"
|
advanced: "Advanced settings"
|
||||||
api-via-stream: "API request via stream"
|
api-via-stream: "API request via stream"
|
||||||
api-via-stream-desc: "API request is performed via the WebSocket connection instead of native fetch API (for better performance). This setting is stored in the browser."
|
api-via-stream-desc: "API request is performed via the WebSocket connection instead of native fetch API (for better performance). This setting is stored in the browser."
|
||||||
@ -625,11 +629,13 @@ desktop/views/components/settings.vue:
|
|||||||
circle-icons: "Use circle icons"
|
circle-icons: "Use circle icons"
|
||||||
gradient-window-header: "Use gradients on window headers"
|
gradient-window-header: "Use gradients on window headers"
|
||||||
post-form-on-timeline: "Display post form at the top of the timeline"
|
post-form-on-timeline: "Display post form at the top of the timeline"
|
||||||
|
suggest-recent-hashtags: "Show recent popular hashtags on the post form"
|
||||||
show-reply-target: "Display reply target"
|
show-reply-target: "Display reply target"
|
||||||
show-my-renotes: "Show my reposts in the timeline"
|
show-my-renotes: "Show my renotes in the timeline"
|
||||||
show-renoted-my-notes: "Show my posts that have been shared in the timeline"
|
show-renoted-my-notes: "Show renoted my posts in timelines"
|
||||||
show-maps: "Show the map"
|
show-local-renotes: "Show renoted local posts in timelines"
|
||||||
show-maps-desc: "Automatically show the location on the map attached to this post."
|
show-maps: "Display a map to show the location"
|
||||||
|
show-maps-desc: "If there comes a post contains location information, show a map to display the location."
|
||||||
sound: "Sound"
|
sound: "Sound"
|
||||||
enable-sounds: "Enable sound"
|
enable-sounds: "Enable sound"
|
||||||
enable-sounds-desc: "Play a sound when you receive a post/message. This setting is stored in the browser."
|
enable-sounds-desc: "Play a sound when you receive a post/message. This setting is stored in the browser."
|
||||||
@ -674,18 +680,18 @@ desktop/views/components/settings.vue:
|
|||||||
third-parties: "Third-parties"
|
third-parties: "Third-parties"
|
||||||
desktop/views/components/settings.2fa.vue:
|
desktop/views/components/settings.2fa.vue:
|
||||||
intro: "If you set up 2-step verification, you will not only need a password at sign-in, but also a pre-registered physical device (such as your smartphone), which will improve security."
|
intro: "If you set up 2-step verification, you will not only need a password at sign-in, but also a pre-registered physical device (such as your smartphone), which will improve security."
|
||||||
detail: "See details..."
|
detail: "Details…"
|
||||||
url: "https://www.google.com/landing/2step/"
|
url: "https://www.google.com/landing/2step/"
|
||||||
caution: "If you lose access to your device, you won't be able to connect to Misskey anymore!"
|
caution: "If you lose access to your registered device, you won't be able to connect to Misskey anymore!"
|
||||||
register: "Register a device"
|
register: "Register a device"
|
||||||
already-registered: "A device is already registered"
|
already-registered: "This device is already registered"
|
||||||
unregister: "Disable"
|
unregister: "Unregister"
|
||||||
unregistered: "Two-factor authentication has been disabled."
|
unregistered: "Two-factor authentication has been disabled."
|
||||||
enter-password: "Enter the password"
|
enter-password: "Enter the password"
|
||||||
authenticator: "First, you need to install Google Authenticator on your device:"
|
authenticator: "First, you need to install Google Authenticator on your device:"
|
||||||
howtoinstall: "How to install"
|
howtoinstall: "How to install"
|
||||||
scan: "And then, scan the QR code:"
|
scan: "And then, scan the QR code:"
|
||||||
done: "Please enter the token displaying on your device:"
|
done: "Please enter the token displayed on your device:"
|
||||||
submit: "Submit"
|
submit: "Submit"
|
||||||
success: "Settings saved!"
|
success: "Settings saved!"
|
||||||
failed: "Failed to setup. Please ensure that the token is correct."
|
failed: "Failed to setup. Please ensure that the token is correct."
|
||||||
@ -693,7 +699,7 @@ desktop/views/components/settings.2fa.vue:
|
|||||||
desktop/views/components/settings.api.vue:
|
desktop/views/components/settings.api.vue:
|
||||||
intro: "To access the API, set this token as the key 'i' of request parameters."
|
intro: "To access the API, set this token as the key 'i' of request parameters."
|
||||||
caution: "Do not enter this token to any apps nor tell this token to others otherwise your account may get compromised."
|
caution: "Do not enter this token to any apps nor tell this token to others otherwise your account may get compromised."
|
||||||
regeneration-of-token: "In case this token (may) leaks out, you want to regenerate it so that you’ll be safe."
|
regeneration-of-token: "If your token gets leaked, you can regenerate it."
|
||||||
regenerate-token: "Regenerate the token"
|
regenerate-token: "Regenerate the token"
|
||||||
token: "Token:"
|
token: "Token:"
|
||||||
enter-password: "Please enter the password"
|
enter-password: "Please enter the password"
|
||||||
@ -701,7 +707,7 @@ desktop/views/components/settings.apps.vue:
|
|||||||
no-apps: "No linked applications"
|
no-apps: "No linked applications"
|
||||||
desktop/views/components/settings.drive.vue:
|
desktop/views/components/settings.drive.vue:
|
||||||
max: "Max"
|
max: "Max"
|
||||||
in-use: " in use."
|
in-use: "In use"
|
||||||
desktop/views/components/settings.mute.vue:
|
desktop/views/components/settings.mute.vue:
|
||||||
no-users: "No muted users"
|
no-users: "No muted users"
|
||||||
desktop/views/components/settings.password.vue:
|
desktop/views/components/settings.password.vue:
|
||||||
@ -724,7 +730,7 @@ desktop/views/components/settings.profile.vue:
|
|||||||
other: "Other"
|
other: "Other"
|
||||||
is-bot: "This account is a Bot"
|
is-bot: "This account is a Bot"
|
||||||
is-cat: "This account is a Cat"
|
is-cat: "This account is a Cat"
|
||||||
profile-updated: "Profile has successfully updated"
|
profile-updated: "Your profile has been updated"
|
||||||
desktop/views/components/sub-note-content.vue:
|
desktop/views/components/sub-note-content.vue:
|
||||||
private: "This post is private"
|
private: "This post is private"
|
||||||
deleted: "This post has been deleted"
|
deleted: "This post has been deleted"
|
||||||
@ -740,7 +746,7 @@ desktop/views/components/timeline.vue:
|
|||||||
list: "Lists"
|
list: "Lists"
|
||||||
desktop/views/components/ui.header.vue:
|
desktop/views/components/ui.header.vue:
|
||||||
welcome-back: "Welcome back,"
|
welcome-back: "Welcome back,"
|
||||||
adjective: "Sir "
|
adjective: "-san"
|
||||||
desktop/views/components/ui.header.account.vue:
|
desktop/views/components/ui.header.account.vue:
|
||||||
profile: "Your profile"
|
profile: "Your profile"
|
||||||
drive: "Media storage"
|
drive: "Media storage"
|
||||||
@ -768,7 +774,7 @@ desktop/views/components/received-follow-requests-window.vue:
|
|||||||
reject: "Reject"
|
reject: "Reject"
|
||||||
desktop/views/components/user-lists-window.vue:
|
desktop/views/components/user-lists-window.vue:
|
||||||
title: "User lists"
|
title: "User lists"
|
||||||
create-list: "Create new list"
|
create-list: "Create list"
|
||||||
list-name: "List name"
|
list-name: "List name"
|
||||||
desktop/views/components/user-preview.vue:
|
desktop/views/components/user-preview.vue:
|
||||||
notes: "Posts"
|
notes: "Posts"
|
||||||
@ -795,6 +801,7 @@ desktop/views/pages/admin/admin.dashboard.vue:
|
|||||||
original-users: "Users on this instance"
|
original-users: "Users on this instance"
|
||||||
all-notes: "All Posts"
|
all-notes: "All Posts"
|
||||||
original-notes: "Posts on this instance"
|
original-notes: "Posts on this instance"
|
||||||
|
invite: "Invite"
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
desktop/views/pages/admin/admin.suspend-user.vue:
|
||||||
suspend-user: "Suspend a user"
|
suspend-user: "Suspend a user"
|
||||||
suspend: "Suspend"
|
suspend: "Suspend"
|
||||||
@ -803,6 +810,26 @@ desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|||||||
unsuspend-user: "Unsuspend users"
|
unsuspend-user: "Unsuspend users"
|
||||||
unsuspend: "Unsuspend"
|
unsuspend: "Unsuspend"
|
||||||
unsuspended: "The user has successfully unsuspended."
|
unsuspended: "The user has successfully unsuspended."
|
||||||
|
desktop/views/pages/admin/admin.verify-user.vue:
|
||||||
|
verify-user: "User account verification settings"
|
||||||
|
verify: "Verify account"
|
||||||
|
verified: "The account is now being verified"
|
||||||
|
desktop/views/pages/admin/admin.unverify-user.vue:
|
||||||
|
unverify-user: "User account unverification settings"
|
||||||
|
unverify: "Unverify account"
|
||||||
|
unverified: "The account is now being unverified"
|
||||||
|
desktop/views/pages/admin/admin.notes-chart.vue:
|
||||||
|
title: "Posts"
|
||||||
|
local: "Local"
|
||||||
|
remote: "Remote"
|
||||||
|
desktop/views/pages/admin/admin.users-chart.vue:
|
||||||
|
title: "Users"
|
||||||
|
local: "Local"
|
||||||
|
remote: "Remote"
|
||||||
|
desktop/views/pages/admin/admin.drive-chart.vue:
|
||||||
|
title: "Drive"
|
||||||
|
local: "Local"
|
||||||
|
remote: "Remote"
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "Only media posts"
|
is-media-only: "Only media posts"
|
||||||
is-media-view: "Media view"
|
is-media-view: "Media view"
|
||||||
@ -835,7 +862,7 @@ desktop/views/pages/selectdrive.vue:
|
|||||||
cancel: "Cancel"
|
cancel: "Cancel"
|
||||||
upload: "Upload files from your device"
|
upload: "Upload files from your device"
|
||||||
desktop/views/pages/search.vue:
|
desktop/views/pages/search.vue:
|
||||||
not-available: "The search feature is not available."
|
not-available: "Search feature is turned off in the settings for this instance."
|
||||||
not-found: "No posts were found for '{}'"
|
not-found: "No posts were found for '{}'"
|
||||||
desktop/views/pages/share.vue:
|
desktop/views/pages/share.vue:
|
||||||
share-with: "Share with {}."
|
share-with: "Share with {}."
|
||||||
@ -855,7 +882,7 @@ desktop/views/pages/user/user.friends.vue:
|
|||||||
no-users: "No frequent mentions"
|
no-users: "No frequent mentions"
|
||||||
desktop/views/pages/user/user.vue:
|
desktop/views/pages/user/user.vue:
|
||||||
is-suspended: "This account has been suspended."
|
is-suspended: "This account has been suspended."
|
||||||
is-remote: "The user is a remote user. Information about them that you see here may not complete."
|
is-remote: "The user is a remote user. The profile that you see here may not complete."
|
||||||
view-remote: "See their complete profile"
|
view-remote: "See their complete profile"
|
||||||
desktop/views/pages/user/user.home.vue:
|
desktop/views/pages/user/user.home.vue:
|
||||||
last-used-at: "Last active:"
|
last-used-at: "Last active:"
|
||||||
@ -928,12 +955,15 @@ mobile/views/components/drive-file-chooser.vue:
|
|||||||
select-file: "Choose files"
|
select-file: "Choose files"
|
||||||
mobile/views/components/drive-folder-chooser.vue:
|
mobile/views/components/drive-folder-chooser.vue:
|
||||||
select-folder: "Choose a folder"
|
select-folder: "Choose a folder"
|
||||||
|
mobile/views/components/drive.file.vue:
|
||||||
|
nsfw: "NSFW"
|
||||||
mobile/views/components/drive.file-detail.vue:
|
mobile/views/components/drive.file-detail.vue:
|
||||||
download: "Download"
|
download: "Download"
|
||||||
rename: "Rename"
|
rename: "Rename"
|
||||||
move: "Move"
|
move: "Move"
|
||||||
hash: "Hash (md5)"
|
hash: "Hash (md5)"
|
||||||
exif: "EXIF"
|
exif: "EXIF"
|
||||||
|
nsfw: "NSFW"
|
||||||
mobile/views/components/media-image.vue:
|
mobile/views/components/media-image.vue:
|
||||||
sensitive: "NSFW"
|
sensitive: "NSFW"
|
||||||
click-to-show: "Click to show"
|
click-to-show: "Click to show"
|
||||||
@ -1012,7 +1042,7 @@ mobile/views/components/ui.nav.vue:
|
|||||||
user-lists: "Lists"
|
user-lists: "Lists"
|
||||||
widgets: "Widgets"
|
widgets: "Widgets"
|
||||||
game: "Games"
|
game: "Games"
|
||||||
darkmode: "Dark mode"
|
darkmode: "Dark theme"
|
||||||
settings: "Settings"
|
settings: "Settings"
|
||||||
about: "About Misskey"
|
about: "About Misskey"
|
||||||
mobile/views/components/user-timeline.vue:
|
mobile/views/components/user-timeline.vue:
|
||||||
@ -1106,7 +1136,8 @@ mobile/views/pages/settings.vue:
|
|||||||
timeline: "Timeline"
|
timeline: "Timeline"
|
||||||
show-reply-target: "Show reply target"
|
show-reply-target: "Show reply target"
|
||||||
show-my-renotes: "Show my reposts"
|
show-my-renotes: "Show my reposts"
|
||||||
show-renoted-my-notes: "Show my reposted posts"
|
show-renoted-my-notes: "Show renoted my posts"
|
||||||
|
show-local-renotes: "Show renoted local posts"
|
||||||
post-style: "Post design"
|
post-style: "Post design"
|
||||||
post-style-standard: "Standard"
|
post-style-standard: "Standard"
|
||||||
post-style-smart: "Smart"
|
post-style-smart: "Smart"
|
||||||
@ -1139,8 +1170,8 @@ mobile/views/pages/user.vue:
|
|||||||
timeline: "Timeline"
|
timeline: "Timeline"
|
||||||
media: "Media"
|
media: "Media"
|
||||||
is-suspended: "This account has been suspended."
|
is-suspended: "This account has been suspended."
|
||||||
is-remote: "This user is a remote user, so the information you see here is not complete."
|
is-remote: "The user is a remote user. The profile that you see here may not complete."
|
||||||
view-remote: "See their complete profile"
|
view-remote: "See his/her complete profile"
|
||||||
mobile/views/pages/user/home.vue:
|
mobile/views/pages/user/home.vue:
|
||||||
recent-notes: "Recent notes"
|
recent-notes: "Recent notes"
|
||||||
images: "Images"
|
images: "Images"
|
||||||
@ -1163,8 +1194,8 @@ mobile/views/pages/user/home.photos.vue:
|
|||||||
loading: "Loading"
|
loading: "Loading"
|
||||||
no-photos: "No photos"
|
no-photos: "No photos"
|
||||||
docs:
|
docs:
|
||||||
edit-this-page-on-github: "Did you find an error or do you want to contribute to the documentation? "
|
edit-this-page-on-github: "Found a mistake or want to contribute for the documentation?"
|
||||||
edit-this-page-on-github-link: "Edit this page on Github!"
|
edit-this-page-on-github-link: "Edit this page at GitHub!"
|
||||||
api:
|
api:
|
||||||
entities:
|
entities:
|
||||||
properties: "Properties"
|
properties: "Properties"
|
||||||
@ -1175,11 +1206,11 @@ docs:
|
|||||||
require-credential: "This endpoint requires the authentication information."
|
require-credential: "This endpoint requires the authentication information."
|
||||||
require-permission: "This endpoint requires {permission} permission."
|
require-permission: "This endpoint requires {permission} permission."
|
||||||
has-limit: "There is a rate limit."
|
has-limit: "There is a rate limit."
|
||||||
duration-limit: "You can't request when a frequency of a request in during {duration} milliseconds exceeds {max} times."
|
duration-limit: "If you have sent your requests more than {max} times in {duration} milliseconds, you will be unable to send more requests."
|
||||||
min-interval-limit: "You can't request before {interval} milliseconds have passed since the previous request."
|
min-interval-limit: "If {interval} milliseconds haven't passed since the last request, you can't send a request."
|
||||||
show-src: "You can view the source code for this endpoint."
|
show-src: "You can view the source code for this endpoint."
|
||||||
show-src-link: "See the code on GitHub"
|
show-src-link: "See the code on GitHub"
|
||||||
generated: "This doc is generated by an API definition."
|
generated: "This document is generated by the API definition."
|
||||||
props:
|
props:
|
||||||
name: "Name"
|
name: "Name"
|
||||||
type: "Type"
|
type: "Type"
|
@ -58,7 +58,7 @@ common:
|
|||||||
friday: "Viernes"
|
friday: "Viernes"
|
||||||
saturday: "Sábado"
|
saturday: "Sábado"
|
||||||
reactions:
|
reactions:
|
||||||
like: "me gusta"
|
like: "ええやん"
|
||||||
love: "amor"
|
love: "amor"
|
||||||
laugh: "risa"
|
laugh: "risa"
|
||||||
hmm: "hmm"
|
hmm: "hmm"
|
||||||
@ -84,7 +84,7 @@ common:
|
|||||||
my-token-regenerated: "Tu token se ha regenerado vas a ser desconectado."
|
my-token-regenerated: "Tu token se ha regenerado vas a ser desconectado."
|
||||||
i-like-sushi: "Prefiero sushi a pudín"
|
i-like-sushi: "Prefiero sushi a pudín"
|
||||||
show-reversi-board-labels: "Mostrar etiquetas de filas y columnas en Reversi"
|
show-reversi-board-labels: "Mostrar etiquetas de filas y columnas en Reversi"
|
||||||
verified-user: "Usuario verificado"
|
verified-user: "公式アカウント"
|
||||||
disable-animated-mfm: "Desactivar texto animado en una publicación"
|
disable-animated-mfm: "Desactivar texto animado en una publicación"
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "Empatado"
|
drawn: "Empatado"
|
||||||
@ -287,7 +287,10 @@ common/views/components/signin.vue:
|
|||||||
signin: "Entra"
|
signin: "Entra"
|
||||||
or: "O"
|
or: "O"
|
||||||
signin-with-twitter: "Ingresar con Twitter"
|
signin-with-twitter: "Ingresar con Twitter"
|
||||||
|
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||||
common/views/components/signup.vue:
|
common/views/components/signup.vue:
|
||||||
|
invitation-code: "招待コード"
|
||||||
|
invitation-info: "招待コードをお持ちでない方は、<a href=\"{}\">管理者</a>までご連絡ください。"
|
||||||
username: "Usuario"
|
username: "Usuario"
|
||||||
checking: "Comprobando..."
|
checking: "Comprobando..."
|
||||||
available: "Disponible"
|
available: "Disponible"
|
||||||
@ -440,6 +443,7 @@ desktop/views/components/drive-window.vue:
|
|||||||
desktop/views/components/drive.file.vue:
|
desktop/views/components/drive.file.vue:
|
||||||
avatar: "Avatar"
|
avatar: "Avatar"
|
||||||
banner: "Banner"
|
banner: "Banner"
|
||||||
|
nsfw: "閲覧注意"
|
||||||
contextmenu:
|
contextmenu:
|
||||||
rename: "Renombrar"
|
rename: "Renombrar"
|
||||||
mark-as-sensitive: "Marcar como 'sensible'"
|
mark-as-sensitive: "Marcar como 'sensible'"
|
||||||
@ -625,9 +629,11 @@ desktop/views/components/settings.vue:
|
|||||||
circle-icons: "Usar iconos circulares"
|
circle-icons: "Usar iconos circulares"
|
||||||
gradient-window-header: "Usar degradados en las cabeceras de las páginas"
|
gradient-window-header: "Usar degradados en las cabeceras de las páginas"
|
||||||
post-form-on-timeline: "Mostrar el formulario de las entradas encima de la línea de tiempo"
|
post-form-on-timeline: "Mostrar el formulario de las entradas encima de la línea de tiempo"
|
||||||
|
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||||
show-reply-target: "リプライ先を表示する"
|
show-reply-target: "リプライ先を表示する"
|
||||||
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
|
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
|
||||||
show-renoted-my-notes: "Renoteされた自分の投稿をタイムラインに表示する"
|
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
|
||||||
|
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
|
||||||
show-maps: "マップの自動展開"
|
show-maps: "マップの自動展開"
|
||||||
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
|
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
|
||||||
sound: "サウンド"
|
sound: "サウンド"
|
||||||
@ -795,6 +801,7 @@ desktop/views/pages/admin/admin.dashboard.vue:
|
|||||||
original-users: "このインスタンスのユーザー"
|
original-users: "このインスタンスのユーザー"
|
||||||
all-notes: "全てのノート"
|
all-notes: "全てのノート"
|
||||||
original-notes: "このインスタンスのノート"
|
original-notes: "このインスタンスのノート"
|
||||||
|
invite: "招待"
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
desktop/views/pages/admin/admin.suspend-user.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
suspend-user: "ユーザーの凍結"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
@ -803,6 +810,26 @@ desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|||||||
unsuspend-user: "ユーザーの凍結の解除"
|
unsuspend-user: "ユーザーの凍結の解除"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
|
desktop/views/pages/admin/admin.verify-user.vue:
|
||||||
|
verify-user: "ユーザーの公式アカウント設定"
|
||||||
|
verify: "公式アカウントにする"
|
||||||
|
verified: "公式アカウントにしました"
|
||||||
|
desktop/views/pages/admin/admin.unverify-user.vue:
|
||||||
|
unverify-user: "ユーザーの公式アカウント解除"
|
||||||
|
unverify: "公式アカウントを解除する"
|
||||||
|
unverified: "公式アカウントを解除しました"
|
||||||
|
desktop/views/pages/admin/admin.notes-chart.vue:
|
||||||
|
title: "投稿"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
desktop/views/pages/admin/admin.users-chart.vue:
|
||||||
|
title: "ユーザー"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
desktop/views/pages/admin/admin.drive-chart.vue:
|
||||||
|
title: "ドライブ"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "メディア投稿のみ"
|
is-media-only: "メディア投稿のみ"
|
||||||
is-media-view: "メディアビュー"
|
is-media-view: "メディアビュー"
|
||||||
@ -835,7 +862,7 @@ desktop/views/pages/selectdrive.vue:
|
|||||||
cancel: "キャンセル"
|
cancel: "キャンセル"
|
||||||
upload: "PCからドライブにファイルをアップロード"
|
upload: "PCからドライブにファイルをアップロード"
|
||||||
desktop/views/pages/search.vue:
|
desktop/views/pages/search.vue:
|
||||||
not-available: "検索機能を利用することができません。"
|
not-available: "検索機能はインスタンスの設定で無効になっています。"
|
||||||
not-found: "「{}」に関する投稿は見つかりませんでした。"
|
not-found: "「{}」に関する投稿は見つかりませんでした。"
|
||||||
desktop/views/pages/share.vue:
|
desktop/views/pages/share.vue:
|
||||||
share-with: "{}で共有"
|
share-with: "{}で共有"
|
||||||
@ -928,12 +955,15 @@ mobile/views/components/drive-file-chooser.vue:
|
|||||||
select-file: "ファイルを選択"
|
select-file: "ファイルを選択"
|
||||||
mobile/views/components/drive-folder-chooser.vue:
|
mobile/views/components/drive-folder-chooser.vue:
|
||||||
select-folder: "フォルダーを選択"
|
select-folder: "フォルダーを選択"
|
||||||
|
mobile/views/components/drive.file.vue:
|
||||||
|
nsfw: "閲覧注意"
|
||||||
mobile/views/components/drive.file-detail.vue:
|
mobile/views/components/drive.file-detail.vue:
|
||||||
download: "ダウンロード"
|
download: "ダウンロード"
|
||||||
rename: "名前を変更"
|
rename: "名前を変更"
|
||||||
move: "移動"
|
move: "移動"
|
||||||
hash: "ハッシュ (md5)"
|
hash: "ハッシュ (md5)"
|
||||||
exif: "EXIF"
|
exif: "EXIF"
|
||||||
|
nsfw: "閲覧注意"
|
||||||
mobile/views/components/media-image.vue:
|
mobile/views/components/media-image.vue:
|
||||||
sensitive: "閲覧注意"
|
sensitive: "閲覧注意"
|
||||||
click-to-show: "クリックして表示"
|
click-to-show: "クリックして表示"
|
||||||
@ -1106,7 +1136,8 @@ mobile/views/pages/settings.vue:
|
|||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
show-reply-target: "リプライ先を表示する"
|
show-reply-target: "リプライ先を表示する"
|
||||||
show-my-renotes: "自分の行ったRenoteを表示する"
|
show-my-renotes: "自分の行ったRenoteを表示する"
|
||||||
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
|
show-renoted-my-notes: "自分の投稿のRenoteを表示する"
|
||||||
|
show-local-renotes: "ローカルの投稿のRenoteを表示する"
|
||||||
post-style: "投稿の表示スタイル"
|
post-style: "投稿の表示スタイル"
|
||||||
post-style-standard: "標準"
|
post-style-standard: "標準"
|
||||||
post-style-smart: "スマート"
|
post-style-smart: "スマート"
|
@ -4,10 +4,10 @@ meta:
|
|||||||
divider: ""
|
divider: ""
|
||||||
common:
|
common:
|
||||||
misskey: "Une ⭐ du fédiverse"
|
misskey: "Une ⭐ du fédiverse"
|
||||||
about-title: "Une ⭐ du fédiverse."
|
about-title: "Une ⭐ du fédivers."
|
||||||
about: "Merci d'avoir découvert Misskey. Misskey est une <b>plateforme de micro-blogging distribuée</b> née sur Terre. Parce qu'il fait partie du Fédiverse (un univers composé de diverses plateformes de réseaux sociaux organisées), il est mutuellement connecté avec d'autres plateformes de réseaux sociaux. Désirez-vous prendre une pause, pendant un instant, loin de l'agitation de la ville et plonger dans un nouvel Internet ?"
|
about: "Merci d'avoir découvert Misskey. Misskey est une <b>plateforme de microblogage distribuée</b> née sur Terre. Parce qu'il fait partie du Fédivers (un univers composé de diverses plateformes de réseaux sociaux organisées), il est mutuellement connecté avec d'autres plateformes de réseaux sociaux. Désirez-vous prendre une pause, pendant un instant, loin de l'agitation de la ville et plonger dans un nouvel Internet ?"
|
||||||
adblock:
|
adblock:
|
||||||
detected: "Veuillez désactiver le bloqueur de publicités"
|
detected: "Veuillez désactiver votre bloqueur de publicités"
|
||||||
warning: "<strong>Misskey n'utilise pas de publicités</strong>, mais quelques options peuvent être non disponibles ou fonctionneraient mal si un bloqueur de publicités est activé."
|
warning: "<strong>Misskey n'utilise pas de publicités</strong>, mais quelques options peuvent être non disponibles ou fonctionneraient mal si un bloqueur de publicités est activé."
|
||||||
application-authorization: "Permissions de l'application"
|
application-authorization: "Permissions de l'application"
|
||||||
close: "Fermer"
|
close: "Fermer"
|
||||||
@ -17,7 +17,7 @@ common:
|
|||||||
title: "Conseils de personnalisation"
|
title: "Conseils de personnalisation"
|
||||||
paragraph1: "La personnalisation à la maison vous permet d'ajouter / supprimer, glisser et déposer et réorganiser les widgets."
|
paragraph1: "La personnalisation à la maison vous permet d'ajouter / supprimer, glisser et déposer et réorganiser les widgets."
|
||||||
paragraph2: "Vous pouvez changer l'affichage en <strong>cliquant droit</strong> sur certains widgets."
|
paragraph2: "Vous pouvez changer l'affichage en <strong>cliquant droit</strong> sur certains widgets."
|
||||||
paragraph3: "Pour supprimer un widget, <strong>glissez et déposez le widget sur la zone étiquetée \"Corbeille\"</strong> dans l'en-tête."
|
paragraph3: "Pour supprimer un widget, <strong>glissez et déposez le widget sur la zone étiquetée « Corbeille »</strong> dans l'en-tête."
|
||||||
paragraph4: "Pour terminer la personnalisation, cliquez sur \"Terminer\" dans le coin supérieur droit."
|
paragraph4: "Pour terminer la personnalisation, cliquez sur \"Terminer\" dans le coin supérieur droit."
|
||||||
gotit: "Compris!"
|
gotit: "Compris!"
|
||||||
notification:
|
notification:
|
||||||
@ -30,7 +30,7 @@ common:
|
|||||||
quoted-by: "Cité·e par {} :"
|
quoted-by: "Cité·e par {} :"
|
||||||
time:
|
time:
|
||||||
unknown: "inconnu"
|
unknown: "inconnu"
|
||||||
future: "future"
|
future: "à l'instant"
|
||||||
just_now: "à l'instant"
|
just_now: "à l'instant"
|
||||||
seconds_ago: "Il y a {} seconde·s"
|
seconds_ago: "Il y a {} seconde·s"
|
||||||
minutes_ago: "Il y a {} minute·s"
|
minutes_ago: "Il y a {} minute·s"
|
||||||
@ -58,7 +58,7 @@ common:
|
|||||||
friday: "Vendredi"
|
friday: "Vendredi"
|
||||||
saturday: "Samedi"
|
saturday: "Samedi"
|
||||||
reactions:
|
reactions:
|
||||||
like: "Aime"
|
like: "ええやん"
|
||||||
love: "Adore"
|
love: "Adore"
|
||||||
laugh: "Rire"
|
laugh: "Rire"
|
||||||
hmm: "Hmm ... ?"
|
hmm: "Hmm ... ?"
|
||||||
@ -69,7 +69,7 @@ common:
|
|||||||
rip: "RIP"
|
rip: "RIP"
|
||||||
pudding: "Pudding"
|
pudding: "Pudding"
|
||||||
note-placeholders:
|
note-placeholders:
|
||||||
a: "Que faîtes vous maintenant ?"
|
a: "Que faites vous maintenant ?"
|
||||||
b: "Quoi de neuf ?"
|
b: "Quoi de neuf ?"
|
||||||
c: "Qu'avez-vous en tête ?"
|
c: "Qu'avez-vous en tête ?"
|
||||||
d: "Voulez-vous exprimer quelque chose ?"
|
d: "Voulez-vous exprimer quelque chose ?"
|
||||||
@ -82,9 +82,9 @@ common:
|
|||||||
update-available-title: "Mise à jour disponible"
|
update-available-title: "Mise à jour disponible"
|
||||||
update-available: "Une nouvelle version de Misskey est disponible ({newer}, version actuelle: {current}). Veuillez recharger la page pour appliquer la mise à jour."
|
update-available: "Une nouvelle version de Misskey est disponible ({newer}, version actuelle: {current}). Veuillez recharger la page pour appliquer la mise à jour."
|
||||||
my-token-regenerated: "Votre token vient d'être généré, vous allez maintenant être déconnecté."
|
my-token-regenerated: "Votre token vient d'être généré, vous allez maintenant être déconnecté."
|
||||||
i-like-sushi: "Je préfère les sushis (au pudding)"
|
i-like-sushi: "Je préfère les sushis plutôt que le pudding"
|
||||||
show-reversi-board-labels: "Afficher les étiquettes des lignes et colonnes dans Reversi"
|
show-reversi-board-labels: "Afficher les étiquettes des lignes et colonnes dans Reversi"
|
||||||
verified-user: "Utilisateur·trice vérifié·e"
|
verified-user: "Compte vérifié"
|
||||||
disable-animated-mfm: "Désactiver les textes animés dans les publications"
|
disable-animated-mfm: "Désactiver les textes animés dans les publications"
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "Partie nulle"
|
drawn: "Partie nulle"
|
||||||
@ -101,18 +101,18 @@ common:
|
|||||||
analog-clock: "Horloge analogique"
|
analog-clock: "Horloge analogique"
|
||||||
profile: "Profil"
|
profile: "Profil"
|
||||||
calendar: "Calendrier"
|
calendar: "Calendrier"
|
||||||
timemachine: "Calendrier (Machine de temps)"
|
timemachine: "Calendrier (Machine temporelle)"
|
||||||
activity: "Activité"
|
activity: "Activité"
|
||||||
rss: "Lecteur de flux RSS"
|
rss: "Lecteur de flux RSS"
|
||||||
memo: "Pense-bête"
|
memo: "Pense-bête"
|
||||||
trends: "Tendances"
|
trends: "Tendances"
|
||||||
photo-stream: "Flux de photos"
|
photo-stream: "Flux de photos"
|
||||||
posts-monitor: "Graph des publications"
|
posts-monitor: "Graphe des publications"
|
||||||
slideshow: "Diaporama"
|
slideshow: "Diaporama"
|
||||||
version: "Version"
|
version: "Version"
|
||||||
broadcast: "Diffusion"
|
broadcast: "Diffusion"
|
||||||
notifications: "Notifications"
|
notifications: "Notifications"
|
||||||
users: "Utilisateurs"
|
users: "Utilisateur·rice·s"
|
||||||
polls: "Sondages"
|
polls: "Sondages"
|
||||||
post-form: "Formulaire de publication"
|
post-form: "Formulaire de publication"
|
||||||
messaging: "Messagerie"
|
messaging: "Messagerie"
|
||||||
@ -174,16 +174,16 @@ common/views/components/games/reversi/reversi.game.vue:
|
|||||||
can-put-everywhere: "どこでも置けるモード"
|
can-put-everywhere: "どこでも置けるモード"
|
||||||
common/views/components/games/reversi/reversi.index.vue:
|
common/views/components/games/reversi/reversi.index.vue:
|
||||||
title: "Misskey Reversi"
|
title: "Misskey Reversi"
|
||||||
sub-title: "Jouer à Reversi avec vos amis·es !"
|
sub-title: "Jouer à Reversi avec vos ami·e·s !"
|
||||||
invite: "Inviter"
|
invite: "Inviter"
|
||||||
rule: "Comment Jouer ?"
|
rule: "Comment jouer ?"
|
||||||
rule-desc: "リバーシは、相手と交互に石をボードに置いて、相手の石を挟んで自分の色に変えてゆき、最終的に残った石が多い方が勝ちというボードゲームです。"
|
rule-desc: "リバーシは、相手と交互に石をボードに置いて、相手の石を挟んで自分の色に変えてゆき、最終的に残った石が多い方が勝ちというボードゲームです。"
|
||||||
mode-invite: "Inviter"
|
mode-invite: "Inviter"
|
||||||
mode-invite-desc: "Inviter un joueur."
|
mode-invite-desc: "Inviter un·e joueur·se."
|
||||||
invitations: "Vous avez reçu une invitation !"
|
invitations: "Vous avez reçu une invitation !"
|
||||||
my-games: "Mes jeux"
|
my-games: "Mes jeux"
|
||||||
all-games: "Tous les jeux"
|
all-games: "Tous les jeux"
|
||||||
enter-username: "Saisir un nom d'utilisateur"
|
enter-username: "Saisir un nom d'utilisateur·rice"
|
||||||
game-state:
|
game-state:
|
||||||
ended: "Terminée"
|
ended: "Terminée"
|
||||||
playing: "En cours"
|
playing: "En cours"
|
||||||
@ -204,7 +204,7 @@ common/views/components/games/reversi/reversi.room.vue:
|
|||||||
waiting-for-both: "En attente que vous soyez prêt"
|
waiting-for-both: "En attente que vous soyez prêt"
|
||||||
cancel: "Annuler"
|
cancel: "Annuler"
|
||||||
ready: "Prêt"
|
ready: "Prêt"
|
||||||
cancel-ready: "Annuler \"Je suis prêt\""
|
cancel-ready: "Annuler « Prêt »"
|
||||||
common/views/components/connect-failed.vue:
|
common/views/components/connect-failed.vue:
|
||||||
title: "Échec de connexion au serveur"
|
title: "Échec de connexion au serveur"
|
||||||
description: "Il y a soit un problème avec votre connexion internet, soit le serveur est hors-ligne ou en maintenance. Veuillez {ressayer} plus tard."
|
description: "Il y a soit un problème avec votre connexion internet, soit le serveur est hors-ligne ou en maintenance. Veuillez {ressayer} plus tard."
|
||||||
@ -230,20 +230,20 @@ common/views/components/connect-failed.troubleshooter.vue:
|
|||||||
flush: "Vider le cache"
|
flush: "Vider le cache"
|
||||||
set-version: "Choisissez une version"
|
set-version: "Choisissez une version"
|
||||||
common/views/components/messaging.vue:
|
common/views/components/messaging.vue:
|
||||||
search-user: "Trouver un utilisateur"
|
search-user: "Trouver un·e utilisateur·rice"
|
||||||
you: "Vous"
|
you: "Vous"
|
||||||
no-history: "Pas d'historique"
|
no-history: "Pas d'historique"
|
||||||
common/views/components/messaging-room.vue:
|
common/views/components/messaging-room.vue:
|
||||||
empty: "Pas de conversations"
|
empty: "Pas de conversations"
|
||||||
more: "Voir Plus"
|
more: "Voir plus"
|
||||||
no-history: "Il n'y a pas plus d'historique"
|
no-history: "Il n'y a pas plus d'historique"
|
||||||
resize-form: "Faites glisser pour redimensionner"
|
resize-form: "Faites glisser pour redimensionner"
|
||||||
new-message: "Nouveau message"
|
new-message: "Nouveau message"
|
||||||
only-one-file-attached: "Un seul fichier uniquement peut être joint au message"
|
only-one-file-attached: "Un seul fichier peut être joint au message"
|
||||||
common/views/components/messaging-room.form.vue:
|
common/views/components/messaging-room.form.vue:
|
||||||
input-message-here: "Tapez ici votre message"
|
input-message-here: "Tapez ici votre message"
|
||||||
send: "Envoyer"
|
send: "Envoyer"
|
||||||
attach-from-local: "Joindre un fichier depuis votre PC"
|
attach-from-local: "Joindre un fichier depuis votre ordinateur"
|
||||||
attach-from-drive: "Joindre un fichier depuis votre Drive"
|
attach-from-drive: "Joindre un fichier depuis votre Drive"
|
||||||
only-one-file-attached: "Un seul fichier uniquement peut être joint au message"
|
only-one-file-attached: "Un seul fichier uniquement peut être joint au message"
|
||||||
common/views/components/messaging-room.message.vue:
|
common/views/components/messaging-room.message.vue:
|
||||||
@ -251,23 +251,23 @@ common/views/components/messaging-room.message.vue:
|
|||||||
deleted: "Ce message a été supprimé"
|
deleted: "Ce message a été supprimé"
|
||||||
common/views/components/nav.vue:
|
common/views/components/nav.vue:
|
||||||
about: "À propos"
|
about: "À propos"
|
||||||
stats: "Stats"
|
stats: "Statistiques"
|
||||||
status: "Status"
|
status: "Statut"
|
||||||
wiki: "Wiki"
|
wiki: "Wiki"
|
||||||
donors: "Donateurs"
|
donors: "Donateur·rice·s"
|
||||||
repository: "Repo"
|
repository: "Dépôt"
|
||||||
develop: "Développeurs"
|
develop: "Développeur·se·s"
|
||||||
feedback: "Remarques"
|
feedback: "Remarques"
|
||||||
common/views/components/note-menu.vue:
|
common/views/components/note-menu.vue:
|
||||||
favorite: "Favorite this note"
|
favorite: "Mettre cette note en favoris"
|
||||||
pin: "Épingler sur votre profile"
|
pin: "Épingler sur votre profil"
|
||||||
delete: "Supprimer"
|
delete: "Supprimer"
|
||||||
delete-confirm: "Supprimer cette publication ?"
|
delete-confirm: "Supprimer cette publication ?"
|
||||||
remote: "Afficher les note originale"
|
remote: "Afficher la note originale"
|
||||||
common/views/components/poll.vue:
|
common/views/components/poll.vue:
|
||||||
vote-to: "Voter pour '{}'"
|
vote-to: "Voter pour '{}'"
|
||||||
vote-count: "{} votes"
|
vote-count: "{} votes"
|
||||||
total-users: "{} utilisateurs ont voté"
|
total-users: "{} utilisateur·rice·s ont voté·e·s"
|
||||||
vote: "Vote"
|
vote: "Vote"
|
||||||
show-result: "Montrer les résultats"
|
show-result: "Montrer les résultats"
|
||||||
voted: "Voté"
|
voted: "Voté"
|
||||||
@ -280,31 +280,34 @@ common/views/components/poll-editor.vue:
|
|||||||
common/views/components/reaction-picker.vue:
|
common/views/components/reaction-picker.vue:
|
||||||
choose-reaction: "Choisissez votre réaction"
|
choose-reaction: "Choisissez votre réaction"
|
||||||
common/views/components/signin.vue:
|
common/views/components/signin.vue:
|
||||||
username: "Nom d'utilisateur"
|
username: "Nom d'utilisateur·rice"
|
||||||
password: "Mot de passe"
|
password: "Mot de passe"
|
||||||
token: "Token"
|
token: "Token"
|
||||||
signing-in: "Connexion...."
|
signing-in: "Connexion…"
|
||||||
signin: "Se connecter"
|
signin: "Se connecter"
|
||||||
or: "Ou"
|
or: "Ou"
|
||||||
signin-with-twitter: "Se connecter via Twitter"
|
signin-with-twitter: "Se connecter via Twitter"
|
||||||
|
login-failed: "Échec d'authentification. Veuillez vérifier que votre nom d'utilisateur et mot de passe sont corrects."
|
||||||
common/views/components/signup.vue:
|
common/views/components/signup.vue:
|
||||||
username: "Nom d'utilisateur"
|
invitation-code: "Code d’invitation"
|
||||||
checking: "Vérification"
|
invitation-info: "Si vous n’avez pas de code d’invitation, contactez un·e <a href=\"{}\">administrateur·rice</a>."
|
||||||
|
username: "Nom d'utilisateur·rice"
|
||||||
|
checking: "Vérification…"
|
||||||
available: "Disponible"
|
available: "Disponible"
|
||||||
unavailable: "Non disponible"
|
unavailable: "Non disponible"
|
||||||
error: "Erreur de réseau"
|
error: "Erreur du réseau"
|
||||||
invalid-format: "Utilisez seulement des lettres, nombres et/ou -."
|
invalid-format: "Vous pouvez utiliser des lettres, des nombres et _."
|
||||||
too-short: "Veuillez saisir au moins un caractère !"
|
too-short: "Veuillez saisir au moins un caractère !"
|
||||||
too-long: "Veuillez entrer au maximum 20 caractères."
|
too-long: "Veuillez entrer au maximum 20 caractères."
|
||||||
password: "Mot de Passe"
|
password: "Mot de passe"
|
||||||
password-placeholder: "Nous recommendons au moins 8 caractères."
|
password-placeholder: "Nous recommandons au moins 8 caractères."
|
||||||
weak-password: "Faible"
|
weak-password: "Faible"
|
||||||
normal-password: "Moyen"
|
normal-password: "Moyen"
|
||||||
strong-password: "Fort"
|
strong-password: "Fort"
|
||||||
retype: "Retapez"
|
retype: "Retapez"
|
||||||
retype-placeholder: "Confirmez votre mot de passe"
|
retype-placeholder: "Confirmez votre mot de passe"
|
||||||
password-matched: "OK"
|
password-matched: "OK"
|
||||||
password-not-matched: "Les mots de passes ne correspondent pas."
|
password-not-matched: "Les mots de passe ne correspondent pas."
|
||||||
recaptcha: "Vérifier"
|
recaptcha: "Vérifier"
|
||||||
create: "Créer un compte"
|
create: "Créer un compte"
|
||||||
some-error: "La création du compte a échoué. Veuillez réessayer."
|
some-error: "La création du compte a échoué. Veuillez réessayer."
|
||||||
@ -316,14 +319,14 @@ common/views/components/stream-indicator.vue:
|
|||||||
reconnecting: "Reconnexion en cours"
|
reconnecting: "Reconnexion en cours"
|
||||||
connected: "Connecté"
|
connected: "Connecté"
|
||||||
common/views/components/twitter-setting.vue:
|
common/views/components/twitter-setting.vue:
|
||||||
description: "Si vous liez votre compte Twitter à votre compte Misskey, vous verrez ensuite votre compte Twitter s'afficher sur votre profile, vous aurez aussi la possibilité de vous connecter à Misskey en utilisant votre compte Twitter."
|
description: "Si vous liez votre compte Twitter à votre compte Misskey, vous verrez ensuite votre compte Twitter s'afficher sur votre profil, vous aurez aussi la possibilité de vous connecter à Misskey en utilisant votre compte Twitter."
|
||||||
connected-to: "Vous êtes connecté à ce compte Twitter"
|
connected-to: "Vous êtes connecté à ce compte Twitter"
|
||||||
detail: "Détails…"
|
detail: "Détails…"
|
||||||
reconnect: "Reconnecter"
|
reconnect: "Reconnexion"
|
||||||
connect: "Lier votre compte Twitter"
|
connect: "Lier votre compte Twitter"
|
||||||
disconnect: "Déconnecter"
|
disconnect: "Déconnexion"
|
||||||
common/views/components/uploader.vue:
|
common/views/components/uploader.vue:
|
||||||
waiting: "En attente"
|
waiting: "Veuillez patienter"
|
||||||
common/views/components/visibility-chooser.vue:
|
common/views/components/visibility-chooser.vue:
|
||||||
public: "Public"
|
public: "Public"
|
||||||
home: "Accueil"
|
home: "Accueil"
|
||||||
@ -331,42 +334,42 @@ common/views/components/visibility-chooser.vue:
|
|||||||
followers: "Abonné·e·s"
|
followers: "Abonné·e·s"
|
||||||
followers-desc: "Publier à vos abonné·e·s uniquement"
|
followers-desc: "Publier à vos abonné·e·s uniquement"
|
||||||
specified: "Direct"
|
specified: "Direct"
|
||||||
specified-desc: "Publier aux utilisateurs·trices mentionné·es"
|
specified-desc: "Publier aux utilisateur·rice·s mentionné·e·s"
|
||||||
private: "Privé"
|
private: "Privé"
|
||||||
common/views/widgets/broadcast.vue:
|
common/views/widgets/broadcast.vue:
|
||||||
fetching: "Récuperation"
|
fetching: "Récupération"
|
||||||
no-broadcasts: "Aucune annonce"
|
no-broadcasts: "Aucune annonce"
|
||||||
have-a-nice-day: "Passez une bonne journée !"
|
have-a-nice-day: "Passez une bonne journée !"
|
||||||
next: "Suivant"
|
next: "Suivant"
|
||||||
common/views/widgets/calendar.vue:
|
common/views/widgets/calendar.vue:
|
||||||
year: "{} année"
|
year: "Année {}"
|
||||||
month: "{} mois"
|
month: "Mois {}"
|
||||||
day: "{} jour"
|
day: "Jour {}"
|
||||||
today: "Aujourd'hui :"
|
today: "Aujourd'hui :"
|
||||||
this-month: "Ce mois-ci :"
|
this-month: "Ce mois-ci :"
|
||||||
this-year: "Cette année :"
|
this-year: "Cette année :"
|
||||||
common/views/widgets/donation.vue:
|
common/views/widgets/donation.vue:
|
||||||
title: "Dons"
|
title: "Faire un don"
|
||||||
text: "Les frais pour faire fonctionner Misskey sortent directement de notre poche. Nous ne recevons pas d'argent issu de la publicité, si vous pouvez nous faire des dons, on vous serait éternellement reconnaissants. Si vous êtes intéressé·es veuillez contacter {}. Merci pour votre contribution !"
|
text: "Les frais pour faire fonctionner Misskey sortent directement de notre poche. Nous ne recevons pas d'argent issu de la publicité, si vous pouvez nous faire des dons, on vous serait éternellement reconnaissants. Si vous êtes intéressé·es veuillez contacter {}. Merci pour votre contribution !"
|
||||||
common/views/widgets/photo-stream.vue:
|
common/views/widgets/photo-stream.vue:
|
||||||
title: "Flux de photo"
|
title: "Flux de photos"
|
||||||
no-photos: "Pas de photos"
|
no-photos: "Pas de photo"
|
||||||
common/views/widgets/posts-monitor.vue:
|
common/views/widgets/posts-monitor.vue:
|
||||||
title: "Graph des publications"
|
title: "Graphe des publications"
|
||||||
toggle: "Basculer entre les vues"
|
toggle: "Basculer entre les vues"
|
||||||
common/views/widgets/hashtags.vue:
|
common/views/widgets/hashtags.vue:
|
||||||
title: "Étiquettes"
|
title: "Étiquettes"
|
||||||
count: "{} utilisateurs mentionnés"
|
count: "{} utilisateur·rice·s mentionné·e·s"
|
||||||
empty: "Aucune tendance"
|
empty: "Aucune tendance"
|
||||||
common/views/widgets/server.vue:
|
common/views/widgets/server.vue:
|
||||||
title: "Info sur le serveur"
|
title: "Informations sur le serveur"
|
||||||
toggle: "Afficher les vues"
|
toggle: "Afficher les vues"
|
||||||
common/views/widgets/memo.vue:
|
common/views/widgets/memo.vue:
|
||||||
title: "Pense-bête"
|
title: "Pense-bête"
|
||||||
memo: "Écrivez ici !"
|
memo: "Écrivez ici !"
|
||||||
save: "Enregistrer"
|
save: "Enregistrer"
|
||||||
common/views/widgets/slideshow.vue:
|
common/views/widgets/slideshow.vue:
|
||||||
folder-customize-mode: "Veuillez quitter le mode personnalisé pour pouvour spécifier un dossier"
|
folder-customize-mode: "Pour pouvoir spécifier un dossier, veuillez quitter le mode de personnalisation"
|
||||||
folder: "Veuillez cliquer pour spécifier le dossier"
|
folder: "Veuillez cliquer pour spécifier le dossier"
|
||||||
no-image: "Il n'y a aucune image dans ce dossier"
|
no-image: "Il n'y a aucune image dans ce dossier"
|
||||||
common/views/widgets/tips.vue:
|
common/views/widgets/tips.vue:
|
||||||
@ -374,13 +377,13 @@ common/views/widgets/tips.vue:
|
|||||||
tips-line2: "<kbd>p</kbd>または<kbd>n</kbd>で投稿フォームを開きます"
|
tips-line2: "<kbd>p</kbd>または<kbd>n</kbd>で投稿フォームを開きます"
|
||||||
tips-line3: "Vous pouvez glisser et déposer des fichiers sur la fenêtre de la note"
|
tips-line3: "Vous pouvez glisser et déposer des fichiers sur la fenêtre de la note"
|
||||||
tips-line4: "Vous pouvez coller des images à partir du presse-papier sur la fenêtre de la note"
|
tips-line4: "Vous pouvez coller des images à partir du presse-papier sur la fenêtre de la note"
|
||||||
tips-line5: "Vous pouvez téléverser des fichiers sur le Drive en faisant un glisser/déplacer"
|
tips-line5: "Vous pouvez téléverser des fichiers sur le Drive en faisant un glisser-déposer"
|
||||||
tips-line6: "ドライブでファイルをドラッグしてフォルダ移動できます"
|
tips-line6: "ドライブでファイルをドラッグしてフォルダ移動できます"
|
||||||
tips-line7: "ドライブでフォルダをドラッグしてフォルダ移動できます"
|
tips-line7: "ドライブでフォルダをドラッグしてフォルダ移動できます"
|
||||||
tips-line8: "Vous pouvez personnaliser l'Accueil via les paramètres"
|
tips-line8: "Vous pouvez personnaliser l'Accueil via les paramètres"
|
||||||
tips-line9: "Misskey est sous licence AGPLv3"
|
tips-line9: "Misskey est sous licence AGPLv3"
|
||||||
tips-line10: "タイムマシンウィジェットを利用すると、簡単に過去のタイムラインに遡れます"
|
tips-line10: "タイムマシンウィジェットを利用すると、簡単に過去のタイムラインに遡れます"
|
||||||
tips-line11: "Vous pouvez épingler des notes sur votre page en appuyant sur \"…\""
|
tips-line11: "Vous pouvez épingler des notes sur votre page en cliquant sur « … »"
|
||||||
tips-line13: "Tous les fichiers attachés à cette publication sont sauvegardés dans le Drive"
|
tips-line13: "Tous les fichiers attachés à cette publication sont sauvegardés dans le Drive"
|
||||||
tips-line14: "ホームのカスタマイズ中、ウィジェットを右クリックしてデザインを変更できます"
|
tips-line14: "ホームのカスタマイズ中、ウィジェットを右クリックしてデザインを変更できます"
|
||||||
tips-line17: "Vous pouvez mettre un texte en surbrillance en le mettant entre ** **"
|
tips-line17: "Vous pouvez mettre un texte en surbrillance en le mettant entre ** **"
|
||||||
@ -391,18 +394,18 @@ common/views/widgets/tips.vue:
|
|||||||
tips-line24: "Misskey a vu le jour en 2014"
|
tips-line24: "Misskey a vu le jour en 2014"
|
||||||
tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
|
tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
|
||||||
common/views/pages/follow.vue:
|
common/views/pages/follow.vue:
|
||||||
signed-in-as: "Connecté·é en tant que {}"
|
signed-in-as: "Connecté·e en tant que {}"
|
||||||
following: "Suit"
|
following: "Suit"
|
||||||
follow: "Suivre"
|
follow: "Suivre"
|
||||||
request-pending: "Demande d'abonnement en attente"
|
request-pending: "Demande d'abonnement en attente"
|
||||||
follow-request: "Demande d'abonnement"
|
follow-request: "Demande d'abonnement"
|
||||||
desktop:
|
desktop:
|
||||||
banner-crop-title: "Découpez la partie qui apparaîtra comme une bannière"
|
banner-crop-title: "Découpez la partie qui apparaitra comme bannière"
|
||||||
banner: "Bannière"
|
banner: "Bannière"
|
||||||
uploading-banner: "Téléversement d'une nouvelle bannière"
|
uploading-banner: "Téléversement d'une nouvelle bannière"
|
||||||
banner-updated: "La bannière est mise à jour"
|
banner-updated: "La bannière est mise à jour"
|
||||||
choose-banner: "Choisir une bannière"
|
choose-banner: "Choisir une bannière"
|
||||||
avatar-crop-title: "Découpez la partie qui apparaîtra dans l'avatar"
|
avatar-crop-title: "Découpez la partie qui apparaitra comme avatar"
|
||||||
avatar: "Avatar"
|
avatar: "Avatar"
|
||||||
uploading-avatar: "Téléversement du nouvel avatar"
|
uploading-avatar: "Téléversement du nouvel avatar"
|
||||||
avatar-updated: "L'avatar est mis à jour"
|
avatar-updated: "L'avatar est mis à jour"
|
||||||
@ -413,16 +416,16 @@ desktop/views/components/activity.chart.vue:
|
|||||||
replies: "Rouge ... Réponses"
|
replies: "Rouge ... Réponses"
|
||||||
renotes: "Vert ... Partages"
|
renotes: "Vert ... Partages"
|
||||||
desktop/views/components/activity.vue:
|
desktop/views/components/activity.vue:
|
||||||
title: "Activitié"
|
title: "Activité"
|
||||||
toggle: "Afficher les vues"
|
toggle: "Afficher les vues"
|
||||||
desktop/views/components/calendar.vue:
|
desktop/views/components/calendar.vue:
|
||||||
title: "{1} / {2}"
|
title: "{1} / {2}"
|
||||||
prev: "Mois dernier"
|
prev: "Mois dernier"
|
||||||
next: "Mois prochain"
|
next: "Mois prochain"
|
||||||
go: "Cliquer pour naviguer"
|
go: "Cliquez pour naviguer"
|
||||||
desktop/views/components/choose-file-from-drive-window.vue:
|
desktop/views/components/choose-file-from-drive-window.vue:
|
||||||
choose-file: "Sélection de fichiers"
|
choose-file: "Sélection de fichiers"
|
||||||
upload: "Téléverser des fichiers à partir de votre PC"
|
upload: "Téléverser des fichiers à partir de votre ordinateur"
|
||||||
cancel: "Annuler"
|
cancel: "Annuler"
|
||||||
ok: "OK"
|
ok: "OK"
|
||||||
choose-prompt: "Choisir un fichier"
|
choose-prompt: "Choisir un fichier"
|
||||||
@ -440,6 +443,7 @@ desktop/views/components/drive-window.vue:
|
|||||||
desktop/views/components/drive.file.vue:
|
desktop/views/components/drive.file.vue:
|
||||||
avatar: "Avatar"
|
avatar: "Avatar"
|
||||||
banner: "Bannière"
|
banner: "Bannière"
|
||||||
|
nsfw: "CW"
|
||||||
contextmenu:
|
contextmenu:
|
||||||
rename: "Renommer"
|
rename: "Renommer"
|
||||||
mark-as-sensitive: "Marquer comme sensible"
|
mark-as-sensitive: "Marquer comme sensible"
|
||||||
@ -453,14 +457,14 @@ desktop/views/components/drive.file.vue:
|
|||||||
add-app: "Ajouter une application"
|
add-app: "Ajouter une application"
|
||||||
rename-file: "Renommer le ficher"
|
rename-file: "Renommer le ficher"
|
||||||
input-new-file-name: "Entrer un nouveau nom"
|
input-new-file-name: "Entrer un nouveau nom"
|
||||||
copied: "Copied"
|
copied: "Copié"
|
||||||
copied-url-to-clipboard: "L'URL a été copié dans le presse-papier"
|
copied-url-to-clipboard: "L'URL a été copiée dans le presse-papier"
|
||||||
desktop/views/components/drive.folder.vue:
|
desktop/views/components/drive.folder.vue:
|
||||||
unable-to-process: "L'opération n'a pas pu être complétée"
|
unable-to-process: "L'opération n'a pas pu être complétée"
|
||||||
circular-reference-detected: "Le dossier de destination est un sous-dossier du dossier que vous souhaitez déplacer."
|
circular-reference-detected: "Le dossier de destination est un sous-dossier du dossier que vous souhaitez déplacer."
|
||||||
unhandled-error: "Erreur inconnue"
|
unhandled-error: "Erreur inconnue"
|
||||||
contextmenu:
|
contextmenu:
|
||||||
move-to-this-folder: "Bouger dans ce dossier"
|
move-to-this-folder: "Déplacer dans ce dossier"
|
||||||
show-in-new-window: "Ouvrir dans une nouvelle fenêtre"
|
show-in-new-window: "Ouvrir dans une nouvelle fenêtre"
|
||||||
rename: "Renommer"
|
rename: "Renommer"
|
||||||
rename-folder: "Renommer le dossier"
|
rename-folder: "Renommer le dossier"
|
||||||
@ -625,14 +629,16 @@ desktop/views/components/settings.vue:
|
|||||||
circle-icons: "Utiliser des icônes circulaires"
|
circle-icons: "Utiliser des icônes circulaires"
|
||||||
gradient-window-header: "Utiliser les dégradés sur la barre de titre de la fenêtre"
|
gradient-window-header: "Utiliser les dégradés sur la barre de titre de la fenêtre"
|
||||||
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
||||||
|
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||||
show-reply-target: "Afficher les réponses"
|
show-reply-target: "Afficher les réponses"
|
||||||
show-my-renotes: "Afficher mes republications dans le fil"
|
show-my-renotes: "Afficher mes republications dans le fil"
|
||||||
show-renoted-my-notes: "Renoteされた自分の投稿をタイムラインに表示する"
|
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
|
||||||
|
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
|
||||||
show-maps: "Afficher la carte"
|
show-maps: "Afficher la carte"
|
||||||
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
|
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
|
||||||
sound: "Son"
|
sound: "Son"
|
||||||
enable-sounds: "Activer le son"
|
enable-sounds: "Activer le son"
|
||||||
enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。"
|
enable-sounds-desc: "Jouer un son lorsque vous recevez un message. Ce paramètre est sauvegardé dans le navigateur."
|
||||||
volume: "Volume"
|
volume: "Volume"
|
||||||
test: "Test"
|
test: "Test"
|
||||||
mobile: "Mobile"
|
mobile: "Mobile"
|
||||||
@ -693,7 +699,7 @@ desktop/views/components/settings.2fa.vue:
|
|||||||
desktop/views/components/settings.api.vue:
|
desktop/views/components/settings.api.vue:
|
||||||
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
|
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
|
||||||
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
|
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
|
||||||
regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
|
regeneration-of-token: "Si votre jeton est compromis, vous pouvez le régénérer."
|
||||||
regenerate-token: "Regenerer le token"
|
regenerate-token: "Regenerer le token"
|
||||||
token: "Jeton :"
|
token: "Jeton :"
|
||||||
enter-password: "Veuillez entrer le mot de passe"
|
enter-password: "Veuillez entrer le mot de passe"
|
||||||
@ -786,23 +792,44 @@ desktop/views/components/window.vue:
|
|||||||
close: "Fermer"
|
close: "Fermer"
|
||||||
desktop/views/pages/admin/admin.vue:
|
desktop/views/pages/admin/admin.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
drive: "ドライブ"
|
drive: "Drive"
|
||||||
users: "ユーザー"
|
users: "Utilisateur·rice·s"
|
||||||
update: "更新"
|
update: "Mises à jour"
|
||||||
desktop/views/pages/admin/admin.dashboard.vue:
|
desktop/views/pages/admin/admin.dashboard.vue:
|
||||||
dashboard: "ダッシュボード"
|
dashboard: "ダッシュボード"
|
||||||
all-users: "全てのユーザー"
|
all-users: "Tou·te·s les utilisateur·rice·s"
|
||||||
original-users: "このインスタンスのユーザー"
|
original-users: "Utilisateur·rice·s sur cette instance"
|
||||||
all-notes: "全てのノート"
|
all-notes: "Toutes les publications"
|
||||||
original-notes: "このインスタンスのノート"
|
original-notes: "Publication sur cette instance"
|
||||||
|
invite: "Invitation"
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
desktop/views/pages/admin/admin.suspend-user.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
suspend-user: "Suspendre un·e utilisateur·rice"
|
||||||
suspend: "凍結"
|
suspend: "Suspendre"
|
||||||
suspended: "凍結しました"
|
suspended: "Suspendu avec succès"
|
||||||
desktop/views/pages/admin/admin.unsuspend-user.vue:
|
desktop/views/pages/admin/admin.unsuspend-user.vue:
|
||||||
unsuspend-user: "ユーザーの凍結の解除"
|
unsuspend-user: "Lever la suspension d’utilisateur·rice·s"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "Suspension levée"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "La suspension de l’utilisateur·rice a été levée avec succès"
|
||||||
|
desktop/views/pages/admin/admin.verify-user.vue:
|
||||||
|
verify-user: "ユーザーの公式アカウント設定"
|
||||||
|
verify: "Vérification du compte"
|
||||||
|
verified: "Le compte a été vérifié"
|
||||||
|
desktop/views/pages/admin/admin.unverify-user.vue:
|
||||||
|
unverify-user: "ユーザーの公式アカウント解除"
|
||||||
|
unverify: "公式アカウントを解除する"
|
||||||
|
unverified: "公式アカウントを解除しました"
|
||||||
|
desktop/views/pages/admin/admin.notes-chart.vue:
|
||||||
|
title: "投稿"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
desktop/views/pages/admin/admin.users-chart.vue:
|
||||||
|
title: "ユーザー"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
desktop/views/pages/admin/admin.drive-chart.vue:
|
||||||
|
title: "ドライブ"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "Les publications médias uniquement"
|
is-media-only: "Les publications médias uniquement"
|
||||||
is-media-view: "Vue média"
|
is-media-view: "Vue média"
|
||||||
@ -835,7 +862,7 @@ desktop/views/pages/selectdrive.vue:
|
|||||||
cancel: "Annuler"
|
cancel: "Annuler"
|
||||||
upload: "Uploader un ou plusieurs fichier(s) depuis votre PC"
|
upload: "Uploader un ou plusieurs fichier(s) depuis votre PC"
|
||||||
desktop/views/pages/search.vue:
|
desktop/views/pages/search.vue:
|
||||||
not-available: "Vous ne pouvez pas utiliser la fonctionnalité de recherche."
|
not-available: "検索機能はインスタンスの設定で無効になっています。"
|
||||||
not-found: "Aucun message trouvé pour '{}'"
|
not-found: "Aucun message trouvé pour '{}'"
|
||||||
desktop/views/pages/share.vue:
|
desktop/views/pages/share.vue:
|
||||||
share-with: "Partager avec {}"
|
share-with: "Partager avec {}"
|
||||||
@ -928,12 +955,15 @@ mobile/views/components/drive-file-chooser.vue:
|
|||||||
select-file: "Choisissez un fichier"
|
select-file: "Choisissez un fichier"
|
||||||
mobile/views/components/drive-folder-chooser.vue:
|
mobile/views/components/drive-folder-chooser.vue:
|
||||||
select-folder: "Choisissez un dossier"
|
select-folder: "Choisissez un dossier"
|
||||||
|
mobile/views/components/drive.file.vue:
|
||||||
|
nsfw: "閲覧注意"
|
||||||
mobile/views/components/drive.file-detail.vue:
|
mobile/views/components/drive.file-detail.vue:
|
||||||
download: "Télécharger"
|
download: "Télécharger"
|
||||||
rename: "Renommer"
|
rename: "Renommer"
|
||||||
move: "Déplacer"
|
move: "Déplacer"
|
||||||
hash: "Hash (md5)"
|
hash: "Hash (md5)"
|
||||||
exif: "EXIF"
|
exif: "EXIF"
|
||||||
|
nsfw: "閲覧注意"
|
||||||
mobile/views/components/media-image.vue:
|
mobile/views/components/media-image.vue:
|
||||||
sensitive: "Le contenu est NSFW"
|
sensitive: "Le contenu est NSFW"
|
||||||
click-to-show: "Cliquer pour afficher"
|
click-to-show: "Cliquer pour afficher"
|
||||||
@ -1106,7 +1136,8 @@ mobile/views/pages/settings.vue:
|
|||||||
timeline: "Fil d'actualité"
|
timeline: "Fil d'actualité"
|
||||||
show-reply-target: "Afficher les réponses"
|
show-reply-target: "Afficher les réponses"
|
||||||
show-my-renotes: "Afficher mes republications"
|
show-my-renotes: "Afficher mes republications"
|
||||||
show-renoted-my-notes: "Afficher les notes que j'ai repartagé"
|
show-renoted-my-notes: "自分の投稿のRenoteを表示する"
|
||||||
|
show-local-renotes: "ローカルの投稿のRenoteを表示する"
|
||||||
post-style: "Style de la publication"
|
post-style: "Style de la publication"
|
||||||
post-style-standard: "Standard"
|
post-style-standard: "Standard"
|
||||||
post-style-smart: "Intelligent"
|
post-style-smart: "Intelligent"
|
||||||
@ -1172,14 +1203,14 @@ docs:
|
|||||||
params: "Paramètres"
|
params: "Paramètres"
|
||||||
no-params: "Aucun paramètre"
|
no-params: "Aucun paramètre"
|
||||||
res: "Réponse"
|
res: "Réponse"
|
||||||
require-credential: "このエンドポイントは認証情報が必須です。"
|
require-credential: "Ce point de communication nécessite une authentification."
|
||||||
require-permission: "このエンドポイントは{permission}の権限を必要とします。"
|
require-permission: "Ce point de communication nécessite la permission {permission}."
|
||||||
has-limit: "レートリミットがあります。"
|
has-limit: "レートリミットがあります。"
|
||||||
duration-limit: "直近{duration}ミリ秒の間のこのエンドポイントへのリクエスト数の合計が{max}を超える場合はリクエストできません。"
|
duration-limit: "直近{duration}ミリ秒の間のこのエンドポイントへのリクエスト数の合計が{max}を超える場合はリクエストできません。"
|
||||||
min-interval-limit: "前回のリクエストから{interval}ミリ秒経っていない場合はリクエストできません。"
|
min-interval-limit: "前回のリクエストから{interval}ミリ秒経っていない場合はリクエストできません。"
|
||||||
show-src: "このエンドポイントのソースコードも閲覧できます。"
|
show-src: "Vous pouvez voir le code source ce point de communication."
|
||||||
show-src-link: "Consulter le code sur GitHub"
|
show-src-link: "Consulter le code sur GitHub"
|
||||||
generated: "このドキュメントはAPI定義に基づき自動生成されています。"
|
generated: "Ce document est généré à partir de la définition de l’API."
|
||||||
props:
|
props:
|
||||||
name: "Nom"
|
name: "Nom"
|
||||||
type: "Type"
|
type: "Type"
|
@ -8,15 +8,16 @@ const yaml = require('js-yaml');
|
|||||||
const loadLang = lang => yaml.safeLoad(
|
const loadLang = lang => yaml.safeLoad(
|
||||||
fs.readFileSync(`${__dirname}/${lang}.yml`, 'utf-8'));
|
fs.readFileSync(`${__dirname}/${lang}.yml`, 'utf-8'));
|
||||||
|
|
||||||
const native = loadLang('ja');
|
const native = loadLang('ja-JP');
|
||||||
|
|
||||||
const langs = {
|
const langs = {
|
||||||
'de': loadLang('de'),
|
'de-DE': loadLang('de-DE'),
|
||||||
'en': loadLang('en'),
|
'en-US': loadLang('en-US'),
|
||||||
'fr': loadLang('fr'),
|
'fr-FR': loadLang('fr-FR'),
|
||||||
'ja': native,
|
'ja-JP': native,
|
||||||
'pl': loadLang('pl'),
|
'ja-KS': loadLang('ja-KS'),
|
||||||
'es': loadLang('es')
|
'pl-PL': loadLang('pl-PL'),
|
||||||
|
'es-ES': loadLang('es-ES')
|
||||||
};
|
};
|
||||||
|
|
||||||
Object.values(langs).forEach(locale => {
|
Object.values(langs).forEach(locale => {
|
||||||
|
@ -58,7 +58,7 @@ common:
|
|||||||
friday: "金曜日"
|
friday: "金曜日"
|
||||||
saturday: "土曜日"
|
saturday: "土曜日"
|
||||||
reactions:
|
reactions:
|
||||||
like: "いいね"
|
like: "ええやん"
|
||||||
love: "しゅき"
|
love: "しゅき"
|
||||||
laugh: "笑"
|
laugh: "笑"
|
||||||
hmm: "ふぅ~む"
|
hmm: "ふぅ~む"
|
||||||
@ -84,7 +84,7 @@ common:
|
|||||||
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
||||||
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
||||||
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
||||||
verified-user: "認証済みのユーザー"
|
verified-user: "公式アカウント"
|
||||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "引き分け"
|
drawn: "引き分け"
|
||||||
@ -287,7 +287,10 @@ common/views/components/signin.vue:
|
|||||||
signin: "サインイン"
|
signin: "サインイン"
|
||||||
or: "または"
|
or: "または"
|
||||||
signin-with-twitter: "Twitterでログイン"
|
signin-with-twitter: "Twitterでログイン"
|
||||||
|
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||||
common/views/components/signup.vue:
|
common/views/components/signup.vue:
|
||||||
|
invitation-code: "招待コード"
|
||||||
|
invitation-info: "招待コードをお持ちでない方は、<a href=\"{}\">管理者</a>までご連絡ください。"
|
||||||
username: "ユーザー名"
|
username: "ユーザー名"
|
||||||
checking: "確認しています..."
|
checking: "確認しています..."
|
||||||
available: "利用できます"
|
available: "利用できます"
|
||||||
@ -440,6 +443,7 @@ desktop/views/components/drive-window.vue:
|
|||||||
desktop/views/components/drive.file.vue:
|
desktop/views/components/drive.file.vue:
|
||||||
avatar: "アイコン"
|
avatar: "アイコン"
|
||||||
banner: "バナー"
|
banner: "バナー"
|
||||||
|
nsfw: "閲覧注意"
|
||||||
contextmenu:
|
contextmenu:
|
||||||
rename: "名前を変更"
|
rename: "名前を変更"
|
||||||
mark-as-sensitive: "閲覧注意に設定"
|
mark-as-sensitive: "閲覧注意に設定"
|
||||||
@ -625,9 +629,11 @@ desktop/views/components/settings.vue:
|
|||||||
circle-icons: "円形のアイコンを使用"
|
circle-icons: "円形のアイコンを使用"
|
||||||
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
||||||
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
||||||
|
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||||
show-reply-target: "リプライ先を表示する"
|
show-reply-target: "リプライ先を表示する"
|
||||||
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
|
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
|
||||||
show-renoted-my-notes: "Renoteされた自分の投稿をタイムラインに表示する"
|
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
|
||||||
|
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
|
||||||
show-maps: "マップの自動展開"
|
show-maps: "マップの自動展開"
|
||||||
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
|
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
|
||||||
sound: "サウンド"
|
sound: "サウンド"
|
||||||
@ -795,6 +801,7 @@ desktop/views/pages/admin/admin.dashboard.vue:
|
|||||||
original-users: "このインスタンスのユーザー"
|
original-users: "このインスタンスのユーザー"
|
||||||
all-notes: "全てのノート"
|
all-notes: "全てのノート"
|
||||||
original-notes: "このインスタンスのノート"
|
original-notes: "このインスタンスのノート"
|
||||||
|
invite: "招待"
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
desktop/views/pages/admin/admin.suspend-user.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
suspend-user: "ユーザーの凍結"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
@ -803,6 +810,26 @@ desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|||||||
unsuspend-user: "ユーザーの凍結の解除"
|
unsuspend-user: "ユーザーの凍結の解除"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
|
desktop/views/pages/admin/admin.verify-user.vue:
|
||||||
|
verify-user: "ユーザーの公式アカウント設定"
|
||||||
|
verify: "公式アカウントにする"
|
||||||
|
verified: "公式アカウントにしました"
|
||||||
|
desktop/views/pages/admin/admin.unverify-user.vue:
|
||||||
|
unverify-user: "ユーザーの公式アカウント解除"
|
||||||
|
unverify: "公式アカウントを解除する"
|
||||||
|
unverified: "公式アカウントを解除しました"
|
||||||
|
desktop/views/pages/admin/admin.notes-chart.vue:
|
||||||
|
title: "投稿"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
desktop/views/pages/admin/admin.users-chart.vue:
|
||||||
|
title: "ユーザー"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
desktop/views/pages/admin/admin.drive-chart.vue:
|
||||||
|
title: "ドライブ"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "メディア投稿のみ"
|
is-media-only: "メディア投稿のみ"
|
||||||
is-media-view: "メディアビュー"
|
is-media-view: "メディアビュー"
|
||||||
@ -835,7 +862,7 @@ desktop/views/pages/selectdrive.vue:
|
|||||||
cancel: "キャンセル"
|
cancel: "キャンセル"
|
||||||
upload: "PCからドライブにファイルをアップロード"
|
upload: "PCからドライブにファイルをアップロード"
|
||||||
desktop/views/pages/search.vue:
|
desktop/views/pages/search.vue:
|
||||||
not-available: "検索機能を利用することができません。"
|
not-available: "検索機能はインスタンスの設定で無効になっています。"
|
||||||
not-found: "「{}」に関する投稿は見つかりませんでした。"
|
not-found: "「{}」に関する投稿は見つかりませんでした。"
|
||||||
desktop/views/pages/share.vue:
|
desktop/views/pages/share.vue:
|
||||||
share-with: "{}で共有"
|
share-with: "{}で共有"
|
||||||
@ -928,12 +955,15 @@ mobile/views/components/drive-file-chooser.vue:
|
|||||||
select-file: "ファイルを選択"
|
select-file: "ファイルを選択"
|
||||||
mobile/views/components/drive-folder-chooser.vue:
|
mobile/views/components/drive-folder-chooser.vue:
|
||||||
select-folder: "フォルダーを選択"
|
select-folder: "フォルダーを選択"
|
||||||
|
mobile/views/components/drive.file.vue:
|
||||||
|
nsfw: "閲覧注意"
|
||||||
mobile/views/components/drive.file-detail.vue:
|
mobile/views/components/drive.file-detail.vue:
|
||||||
download: "ダウンロード"
|
download: "ダウンロード"
|
||||||
rename: "名前を変更"
|
rename: "名前を変更"
|
||||||
move: "移動"
|
move: "移動"
|
||||||
hash: "ハッシュ (md5)"
|
hash: "ハッシュ (md5)"
|
||||||
exif: "EXIF"
|
exif: "EXIF"
|
||||||
|
nsfw: "閲覧注意"
|
||||||
mobile/views/components/media-image.vue:
|
mobile/views/components/media-image.vue:
|
||||||
sensitive: "閲覧注意"
|
sensitive: "閲覧注意"
|
||||||
click-to-show: "クリックして表示"
|
click-to-show: "クリックして表示"
|
||||||
@ -1106,7 +1136,8 @@ mobile/views/pages/settings.vue:
|
|||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
show-reply-target: "リプライ先を表示する"
|
show-reply-target: "リプライ先を表示する"
|
||||||
show-my-renotes: "自分の行ったRenoteを表示する"
|
show-my-renotes: "自分の行ったRenoteを表示する"
|
||||||
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
|
show-renoted-my-notes: "自分の投稿のRenoteを表示する"
|
||||||
|
show-local-renotes: "ローカルの投稿のRenoteを表示する"
|
||||||
post-style: "投稿の表示スタイル"
|
post-style: "投稿の表示スタイル"
|
||||||
post-style-standard: "標準"
|
post-style-standard: "標準"
|
||||||
post-style-smart: "スマート"
|
post-style-smart: "スマート"
|
@ -90,7 +90,8 @@ common:
|
|||||||
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
||||||
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
||||||
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
||||||
verified-user: "認証済みのユーザー"
|
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
||||||
|
verified-user: "公式アカウント"
|
||||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||||
|
|
||||||
reversi:
|
reversi:
|
||||||
@ -314,8 +315,11 @@ common/views/components/signin.vue:
|
|||||||
signin: "サインイン"
|
signin: "サインイン"
|
||||||
or: "または"
|
or: "または"
|
||||||
signin-with-twitter: "Twitterでログイン"
|
signin-with-twitter: "Twitterでログイン"
|
||||||
|
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||||
|
|
||||||
common/views/components/signup.vue:
|
common/views/components/signup.vue:
|
||||||
|
invitation-code: "招待コード"
|
||||||
|
invitation-info: "招待コードをお持ちでない方は、<a href=\"{}\">管理者</a>までご連絡ください。"
|
||||||
username: "ユーザー名"
|
username: "ユーザー名"
|
||||||
checking: "確認しています..."
|
checking: "確認しています..."
|
||||||
available: "利用できます"
|
available: "利用できます"
|
||||||
@ -493,6 +497,7 @@ desktop/views/components/drive-window.vue:
|
|||||||
desktop/views/components/drive.file.vue:
|
desktop/views/components/drive.file.vue:
|
||||||
avatar: "アイコン"
|
avatar: "アイコン"
|
||||||
banner: "バナー"
|
banner: "バナー"
|
||||||
|
nsfw: "閲覧注意"
|
||||||
contextmenu:
|
contextmenu:
|
||||||
rename: "名前を変更"
|
rename: "名前を変更"
|
||||||
mark-as-sensitive: "閲覧注意に設定"
|
mark-as-sensitive: "閲覧注意に設定"
|
||||||
@ -707,9 +712,11 @@ desktop/views/components/settings.vue:
|
|||||||
circle-icons: "円形のアイコンを使用"
|
circle-icons: "円形のアイコンを使用"
|
||||||
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
||||||
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
||||||
|
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||||
show-reply-target: "リプライ先を表示する"
|
show-reply-target: "リプライ先を表示する"
|
||||||
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
|
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
|
||||||
show-renoted-my-notes: "Renoteされた自分の投稿をタイムラインに表示する"
|
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
|
||||||
|
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
|
||||||
show-maps: "マップの自動展開"
|
show-maps: "マップの自動展開"
|
||||||
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
|
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
|
||||||
|
|
||||||
@ -850,6 +857,7 @@ desktop/views/components/ui.header.account.vue:
|
|||||||
lists: "リスト"
|
lists: "リスト"
|
||||||
follow-requests: "フォロー申請"
|
follow-requests: "フォロー申請"
|
||||||
customize: "ホームのカスタマイズ"
|
customize: "ホームのカスタマイズ"
|
||||||
|
admin: "管理"
|
||||||
settings: "設定"
|
settings: "設定"
|
||||||
signout: "サインアウト"
|
signout: "サインアウト"
|
||||||
dark: "闇に飲まれる"
|
dark: "闇に飲まれる"
|
||||||
@ -909,6 +917,7 @@ desktop/views/pages/admin/admin.dashboard.vue:
|
|||||||
original-users: "このインスタンスのユーザー"
|
original-users: "このインスタンスのユーザー"
|
||||||
all-notes: "全てのノート"
|
all-notes: "全てのノート"
|
||||||
original-notes: "このインスタンスのノート"
|
original-notes: "このインスタンスのノート"
|
||||||
|
invite: "招待"
|
||||||
|
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
desktop/views/pages/admin/admin.suspend-user.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
suspend-user: "ユーザーの凍結"
|
||||||
@ -920,6 +929,40 @@ desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
|
|
||||||
|
desktop/views/pages/admin/admin.verify-user.vue:
|
||||||
|
verify-user: "ユーザーの公式アカウント設定"
|
||||||
|
verify: "公式アカウントにする"
|
||||||
|
verified: "公式アカウントにしました"
|
||||||
|
|
||||||
|
desktop/views/pages/admin/admin.unverify-user.vue:
|
||||||
|
unverify-user: "ユーザーの公式アカウント解除"
|
||||||
|
unverify: "公式アカウントを解除する"
|
||||||
|
unverified: "公式アカウントを解除しました"
|
||||||
|
|
||||||
|
desktop/views/pages/admin/admin.chart.vue:
|
||||||
|
title: "チャート"
|
||||||
|
per-day: "1時間ごと"
|
||||||
|
per-hour: "1日ごと"
|
||||||
|
notes: "投稿"
|
||||||
|
users: "ユーザー"
|
||||||
|
drive: "ドライブ"
|
||||||
|
local-notes: "ローカルの投稿"
|
||||||
|
remote-notes: "リモートの投稿"
|
||||||
|
local-notes-total: "ローカルの投稿 (累計)"
|
||||||
|
remote-notes-total: "リモートの投稿 (累計)"
|
||||||
|
local-users: "ローカルのユーザー"
|
||||||
|
remote-users: "リモートのユーザー"
|
||||||
|
local-users-total: "ローカルのユーザー (累計)"
|
||||||
|
remote-users-total: "リモートのユーザー (累計)"
|
||||||
|
local-drive: "ローカルのドライブ使用量"
|
||||||
|
remote-drive: "リモートのドライブ使用量"
|
||||||
|
local-drive-total: "ローカルのドライブ使用量 (累計)"
|
||||||
|
remote-drive-total: "リモートのドライブ使用量 (累計)"
|
||||||
|
local-drive-files: "ローカルのドライブのファイル数"
|
||||||
|
remote-drive-files: "リモートのドライブのファイル数"
|
||||||
|
local-drive-files-total: "ローカルのドライブのファイル数 (累計)"
|
||||||
|
remote-drive-files-total: "リモートのドライブのファイル数 (累計)"
|
||||||
|
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "メディア投稿のみ"
|
is-media-only: "メディア投稿のみ"
|
||||||
is-media-view: "メディアビュー"
|
is-media-view: "メディアビュー"
|
||||||
@ -960,7 +1003,7 @@ desktop/views/pages/selectdrive.vue:
|
|||||||
upload: "PCからドライブにファイルをアップロード"
|
upload: "PCからドライブにファイルをアップロード"
|
||||||
|
|
||||||
desktop/views/pages/search.vue:
|
desktop/views/pages/search.vue:
|
||||||
not-available: "検索機能を利用することができません。"
|
not-available: "検索機能はインスタンスの設定で無効になっています。"
|
||||||
not-found: "「{}」に関する投稿は見つかりませんでした。"
|
not-found: "「{}」に関する投稿は見つかりませんでした。"
|
||||||
|
|
||||||
desktop/views/pages/share.vue:
|
desktop/views/pages/share.vue:
|
||||||
@ -1076,12 +1119,16 @@ mobile/views/components/drive-file-chooser.vue:
|
|||||||
mobile/views/components/drive-folder-chooser.vue:
|
mobile/views/components/drive-folder-chooser.vue:
|
||||||
select-folder: "フォルダーを選択"
|
select-folder: "フォルダーを選択"
|
||||||
|
|
||||||
|
mobile/views/components/drive.file.vue:
|
||||||
|
nsfw: "閲覧注意"
|
||||||
|
|
||||||
mobile/views/components/drive.file-detail.vue:
|
mobile/views/components/drive.file-detail.vue:
|
||||||
download: "ダウンロード"
|
download: "ダウンロード"
|
||||||
rename: "名前を変更"
|
rename: "名前を変更"
|
||||||
move: "移動"
|
move: "移動"
|
||||||
hash: "ハッシュ (md5)"
|
hash: "ハッシュ (md5)"
|
||||||
exif: "EXIF"
|
exif: "EXIF"
|
||||||
|
nsfw: "閲覧注意"
|
||||||
|
|
||||||
mobile/views/components/media-image.vue:
|
mobile/views/components/media-image.vue:
|
||||||
sensitive: "閲覧注意"
|
sensitive: "閲覧注意"
|
||||||
@ -1177,6 +1224,7 @@ mobile/views/components/ui.nav.vue:
|
|||||||
game: "ゲーム"
|
game: "ゲーム"
|
||||||
darkmode: "ダークモード"
|
darkmode: "ダークモード"
|
||||||
settings: "設定"
|
settings: "設定"
|
||||||
|
admin: "管理"
|
||||||
about: "Misskeyについて"
|
about: "Misskeyについて"
|
||||||
|
|
||||||
mobile/views/components/user-timeline.vue:
|
mobile/views/components/user-timeline.vue:
|
||||||
@ -1293,7 +1341,8 @@ mobile/views/pages/settings.vue:
|
|||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
show-reply-target: "リプライ先を表示する"
|
show-reply-target: "リプライ先を表示する"
|
||||||
show-my-renotes: "自分の行ったRenoteを表示する"
|
show-my-renotes: "自分の行ったRenoteを表示する"
|
||||||
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
|
show-renoted-my-notes: "自分の投稿のRenoteを表示する"
|
||||||
|
show-local-renotes: "ローカルの投稿のRenoteを表示する"
|
||||||
post-style: "投稿の表示スタイル"
|
post-style: "投稿の表示スタイル"
|
||||||
post-style-standard: "標準"
|
post-style-standard: "標準"
|
||||||
post-style-smart: "スマート"
|
post-style-smart: "スマート"
|
||||||
@ -1380,6 +1429,5 @@ docs:
|
|||||||
type: "型"
|
type: "型"
|
||||||
description: "説明"
|
description: "説明"
|
||||||
|
|
||||||
|
|
||||||
dev/views/index.vue:
|
dev/views/index.vue:
|
||||||
manage-apps: "アプリの管理"
|
manage-apps: "アプリの管理"
|
@ -1,33 +1,33 @@
|
|||||||
---
|
---
|
||||||
meta:
|
meta:
|
||||||
lang: "Português"
|
lang: "日本語 (関西弁)"
|
||||||
divider: ""
|
divider: ""
|
||||||
common:
|
common:
|
||||||
misskey: "A ⭐ of fediverse"
|
misskey: "A ⭐ of fediverse"
|
||||||
about-title: "A ⭐ of fediverse."
|
about-title: "A ⭐ of fediverse."
|
||||||
about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。"
|
about: "ようMisskeyを見つけてくれて、おおきにやで。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>やねん。Fediverse(ぎょうさんのSNSで構成されとる宇宙)っちゅうもんの中におるから、お隣さんのSNSとも仲良うさせてもろてんねん。ちょいとやかましい心斎橋から離れて、新しいインターネットにダイブしてみぃひん?"
|
||||||
adblock:
|
adblock:
|
||||||
detected: "広告ブロッカーを無効にしてください"
|
detected: "広告ブロッカーを無効にしてや"
|
||||||
warning: "<strong>Misskeyは広告を掲載していません</strong>が、広告をブロックする機能が有効だと一部の機能が利用できなかったり、不具合が発生する場合があります。"
|
warning: "<strong>Misskeyは広告を掲載してへん</strong>けど、広告をブロックしはる機能がおると一部の機能が利用できんくなったり、不具合が発生するかも分からん。知らんけど。"
|
||||||
application-authorization: "アプリの連携"
|
application-authorization: "アプリの連携"
|
||||||
close: "閉じる"
|
close: "さいなら"
|
||||||
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
|
do-not-copy-paste: "ここにコードを入力したり張り付けたりせんといてください。アカウントが不正利用されるかも分からん。知らんけど。"
|
||||||
got-it: "わかった"
|
got-it: "ほい"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "カスタマイズのヒント"
|
title: "カスタマイズのヒント"
|
||||||
paragraph1: "ホームのカスタマイズでは、ウィジェットを追加/削除したり、ドラッグ&ドロップして並べ替えたりすることができます。"
|
paragraph1: "ホームのカスタマイズやと、ウィジェットを追加/削除したり、ドラッグ&ドロップして並べ替えたりできんねやわ。"
|
||||||
paragraph2: "一部のウィジェットは、<strong><strong>右</strong>クリック</strong>することで表示を変更することができます。"
|
paragraph2: "一部のウィジェットは、<strong><strong>右</strong>クリック</strong>したったら表示を変更できんねやわ。"
|
||||||
paragraph3: "ウィジェットを削除するには、ヘッダーの<strong>「ゴミ箱」</strong>と書かれたエリアにウィジェットをドラッグ&ドロップします。"
|
paragraph3: "ウィジェットを削除するんやったら、ヘッダーの<strong>「ゴミ箱」</strong>と書いたぁるエリアにウィジェットをドラッグ&ドロップしてな。"
|
||||||
paragraph4: "カスタマイズを終了するには、右上の「完了」をクリックします。"
|
paragraph4: "カスタマイズを終了するんやったら、右上の「完了」をクリックしてな。"
|
||||||
gotit: "Got it!"
|
gotit: "Got it!"
|
||||||
notification:
|
notification:
|
||||||
file-uploaded: "ファイルがアップロードされました"
|
file-uploaded: "ファイルがアップロードされたで"
|
||||||
message-from: "{}さんからメッセージ:"
|
message-from: "{}はんからメッセージ:"
|
||||||
reversi-invited: "対局への招待があります"
|
reversi-invited: "対局への招待がきとるで"
|
||||||
reversi-invited-by: "{}さんから"
|
reversi-invited-by: "{}はんから"
|
||||||
notified-by: "{}さんから"
|
notified-by: "{}はんから"
|
||||||
reply-from: "{}さんから返信:"
|
reply-from: "{}はんから返信:"
|
||||||
quoted-by: "{}さんが引用:"
|
quoted-by: "{}はんが引用:"
|
||||||
time:
|
time:
|
||||||
unknown: "なぞのじかん"
|
unknown: "なぞのじかん"
|
||||||
future: "未来"
|
future: "未来"
|
||||||
@ -58,41 +58,41 @@ common:
|
|||||||
friday: "金曜日"
|
friday: "金曜日"
|
||||||
saturday: "土曜日"
|
saturday: "土曜日"
|
||||||
reactions:
|
reactions:
|
||||||
like: "いいね"
|
like: "ええやん"
|
||||||
love: "しゅき"
|
love: "好きやねん"
|
||||||
laugh: "笑"
|
laugh: "わろた"
|
||||||
hmm: "ふぅ~む"
|
hmm: "ふぅ~む"
|
||||||
surprise: "わお"
|
surprise: "わお"
|
||||||
congrats: "おめでとう"
|
congrats: "おめでとうさん"
|
||||||
angry: "おこ"
|
angry: "何言うてまんねん"
|
||||||
confused: "こまこまのこまり"
|
confused: "こまこまのこまりやわぁ"
|
||||||
rip: "RIP"
|
rip: "RIP"
|
||||||
pudding: "Pudding"
|
pudding: "アメちゃんちゃうんちゃう?"
|
||||||
note-placeholders:
|
note-placeholders:
|
||||||
a: "今どうしてる?"
|
a: "今なにしてん?"
|
||||||
b: "何かありましたか?"
|
b: "何かあったんか?"
|
||||||
c: "何をお考えですか?"
|
c: "何考えとりますん?"
|
||||||
d: "言いたいことは?"
|
d: "言うときたいことは?"
|
||||||
e: "ここに書いてください"
|
e: "ここに書いてや"
|
||||||
f: "あなたが書くのを待っています..."
|
f: "あんさんが書くんを待っちょります..."
|
||||||
search: "検索"
|
search: "検索"
|
||||||
delete: "削除"
|
delete: "削除"
|
||||||
loading: "読み込み中"
|
loading: "読み込み中"
|
||||||
ok: "わかった"
|
ok: "ほい"
|
||||||
update-available-title: "更新があります"
|
update-available-title: "更新があんで"
|
||||||
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
|
update-available: "Misskeyの新しいバージョンがあんで({newer}。現在{current}をつこてるわ)。ページを再度読み込みしたると更新が適用されるわ。"
|
||||||
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
my-token-regenerated: "あんさんのトークンが更新されたらしいわ。すまんがとりあえずサインアウトすんで。"
|
||||||
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
i-like-sushi: "寿司(のほうがプリンよりむしろ)ウマい、タコ焼きはあらへんけど。"
|
||||||
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示や!"
|
||||||
verified-user: "認証済みのユーザー"
|
verified-user: "アメちゃん付きアカウント"
|
||||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
disable-animated-mfm: "投稿内のちょろちょろ動いてんのを止める"
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "引き分け"
|
drawn: "おあいこ"
|
||||||
my-turn: "あなたのターンです"
|
my-turn: "あんさんのターンや"
|
||||||
opponent-turn: "相手のターンです"
|
opponent-turn: "相手のターンや"
|
||||||
turn-of: "{}のターンです"
|
turn-of: "{}のターンや"
|
||||||
past-turn-of: "{}のターン"
|
past-turn-of: "{}のターン"
|
||||||
won: "{}の勝ち"
|
won: "{}の勝ちや!"
|
||||||
black: "黒"
|
black: "黒"
|
||||||
white: "白"
|
white: "白"
|
||||||
total: "合計"
|
total: "合計"
|
||||||
@ -123,67 +123,67 @@ common:
|
|||||||
hashtags: "ハッシュタグ"
|
hashtags: "ハッシュタグ"
|
||||||
deck:
|
deck:
|
||||||
widgets: "ウィジェット"
|
widgets: "ウィジェット"
|
||||||
home: "ホーム"
|
home: "うち"
|
||||||
local: "ローカル"
|
local: "ローカル"
|
||||||
hybrid: "ソーシャル"
|
hybrid: "ソーシャル"
|
||||||
global: "グローバル"
|
global: "グローバル"
|
||||||
notifications: "通知"
|
notifications: "通知"
|
||||||
list: "リスト"
|
list: "リスト"
|
||||||
swap-left: "左に移動"
|
swap-left: "左に移動や!"
|
||||||
swap-right: "右に移動"
|
swap-right: "右に移動や!"
|
||||||
swap-up: "上に移動"
|
swap-up: "上に移動!"
|
||||||
swap-down: "下に移動"
|
swap-down: "下に移動!"
|
||||||
remove: "カラムを削除"
|
remove: "カラムを削除や!"
|
||||||
add-column: "カラムを追加"
|
add-column: "カラムを追加!"
|
||||||
rename: "名前を変更"
|
rename: "名前を変更や!"
|
||||||
stack-left: "左に重ねる"
|
stack-left: "左に重ねんで!"
|
||||||
pop-right: "右に出す"
|
pop-right: "右に出すで!"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
|
share-access: "<i>{{ app.name }}</i>があんさんのアカウントにアクセスすんのを<b>許可</b>してもええか?"
|
||||||
permission-ask: "このアプリは次の権限を要求しています:"
|
permission-ask: "このアプリは次の権限を要求してんで:"
|
||||||
account-read: "アカウントの情報を見る。"
|
account-read: "アカウントの情報を見させてもらうで。"
|
||||||
account-write: "アカウントの情報を操作する。"
|
account-write: "アカウントの情報を操作させてもらうで。"
|
||||||
note-write: "投稿する。"
|
note-write: "投稿させてもらうで。"
|
||||||
like-write: "いいねしたりいいね解除する。"
|
like-write: "いいねしたりいいね解除させてもらうで。"
|
||||||
following-write: "フォローしたりフォロー解除する。"
|
following-write: "フォローしたりフォロー解除させてもらうで。"
|
||||||
drive-read: "ドライブを見る。"
|
drive-read: "ドライブを見させてもらうで。"
|
||||||
drive-write: "ドライブを操作する。"
|
drive-write: "ドライブを操作させてもらうで。"
|
||||||
notification-read: "通知を見る。"
|
notification-read: "通知を見させてもらうで。"
|
||||||
notification-write: "通知を操作する。"
|
notification-write: "通知を操作させてもらうで。"
|
||||||
cancel: "キャンセル"
|
cancel: "やめとくわ"
|
||||||
accept: "アクセスを許可"
|
accept: "アクセスを許可や!"
|
||||||
auth/views/index.vue:
|
auth/views/index.vue:
|
||||||
loading: "読み込み中"
|
loading: "読み込み中"
|
||||||
denied: "アプリケーションの連携をキャンセルしました。"
|
denied: "アプリケーションの連携をやめといたわ。"
|
||||||
denied-paragraph: "このアプリがあなたのアカウントにアクセスすることはありません。"
|
denied-paragraph: "このアプリがあんさんのアカウントにアクセスすることは多分あらへん。知らんけど。"
|
||||||
already-authorized: "このアプリは既に連携済みです"
|
already-authorized: "このアプリはもう連携済みやったわ"
|
||||||
allowed: "アプリケーションの連携を許可しました"
|
allowed: "アプリケーションの連携を許可したで"
|
||||||
callback-url: "アプリケーションに戻っています"
|
callback-url: "アプリケーションに戻っとります"
|
||||||
please-go-back: "アプリケーションに戻って、やっていってください。"
|
please-go-back: "アプリケーションに戻って、気張ってってな。"
|
||||||
error: "セッションが存在しません。"
|
error: "セッションが存在してへん。"
|
||||||
sign-in: "サインインしてください"
|
sign-in: "サインインしてや"
|
||||||
common/views/components/games/reversi/reversi.vue:
|
common/views/components/games/reversi/reversi.vue:
|
||||||
matching:
|
matching:
|
||||||
waiting-for: "{}を待っています"
|
waiting-for: "{}を待っとります"
|
||||||
cancel: "キャンセル"
|
cancel: "やめとくわ"
|
||||||
common/views/components/games/reversi/reversi.game.vue:
|
common/views/components/games/reversi/reversi.game.vue:
|
||||||
surrender: "投了"
|
surrender: "投了や..."
|
||||||
surrendered: "投了により"
|
surrendered: "投了により"
|
||||||
is-llotheo: "石の少ない方が勝ち(ロセオ)"
|
is-llotheo: "石の少ない方が勝ち(ロセオ)"
|
||||||
looped-map: "ループマップ"
|
looped-map: "ループマップ"
|
||||||
can-put-everywhere: "どこでも置けるモード"
|
can-put-everywhere: "どこに置いてもええモード"
|
||||||
common/views/components/games/reversi/reversi.index.vue:
|
common/views/components/games/reversi/reversi.index.vue:
|
||||||
title: "Misskey Reversi"
|
title: "Misskey Reversi"
|
||||||
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
sub-title: "お隣のミスキストはんらとリバーシで対戦や!"
|
||||||
invite: "招待"
|
invite: "招待"
|
||||||
rule: "遊び方"
|
rule: "遊び方"
|
||||||
rule-desc: "リバーシは、相手と交互に石をボードに置いて、相手の石を挟んで自分の色に変えてゆき、最終的に残った石が多い方が勝ちというボードゲームです。"
|
rule-desc: "リバーシは、相手と交互に石をボードに置いて、相手の石を挟んで自分の色に変えてって、最終的に残った石が多い方が勝ちっちゅうボードゲームや。"
|
||||||
mode-invite: "招待"
|
mode-invite: "招待"
|
||||||
mode-invite-desc: "指定したユーザーと対戦するモードです。"
|
mode-invite-desc: "指定したユーザーと対戦するモードや。"
|
||||||
invitations: "対局の招待があります!"
|
invitations: "対局の招待がきてんで!"
|
||||||
my-games: "自分の対局"
|
my-games: "自分の対局"
|
||||||
all-games: "みんなの対局"
|
all-games: "みんなの対局"
|
||||||
enter-username: "ユーザー名を入力してください"
|
enter-username: "ユーザー名を入力してや"
|
||||||
game-state:
|
game-state:
|
||||||
ended: "終了"
|
ended: "終了"
|
||||||
playing: "進行中"
|
playing: "進行中"
|
||||||
@ -202,7 +202,7 @@ common/views/components/games/reversi/reversi.room.vue:
|
|||||||
waiting-for-other: "相手の準備が完了するのを待っています"
|
waiting-for-other: "相手の準備が完了するのを待っています"
|
||||||
waiting-for-me: "あなたの準備が完了するのを待っています"
|
waiting-for-me: "あなたの準備が完了するのを待っています"
|
||||||
waiting-for-both: "準備中"
|
waiting-for-both: "準備中"
|
||||||
cancel: "キャンセル"
|
cancel: "やめとくわ"
|
||||||
ready: "準備完了"
|
ready: "準備完了"
|
||||||
cancel-ready: "準備続行"
|
cancel-ready: "準備続行"
|
||||||
common/views/components/connect-failed.vue:
|
common/views/components/connect-failed.vue:
|
||||||
@ -287,7 +287,10 @@ common/views/components/signin.vue:
|
|||||||
signin: "サインイン"
|
signin: "サインイン"
|
||||||
or: "または"
|
or: "または"
|
||||||
signin-with-twitter: "Twitterでログイン"
|
signin-with-twitter: "Twitterでログイン"
|
||||||
|
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||||
common/views/components/signup.vue:
|
common/views/components/signup.vue:
|
||||||
|
invitation-code: "招待コード"
|
||||||
|
invitation-info: "招待コードをお持ちでない方は、<a href=\"{}\">管理者</a>までご連絡ください。"
|
||||||
username: "ユーザー名"
|
username: "ユーザー名"
|
||||||
checking: "確認しています..."
|
checking: "確認しています..."
|
||||||
available: "利用できます"
|
available: "利用できます"
|
||||||
@ -423,16 +426,16 @@ desktop/views/components/calendar.vue:
|
|||||||
desktop/views/components/choose-file-from-drive-window.vue:
|
desktop/views/components/choose-file-from-drive-window.vue:
|
||||||
choose-file: "ファイル選択中"
|
choose-file: "ファイル選択中"
|
||||||
upload: "PCからドライブにファイルをアップロード"
|
upload: "PCからドライブにファイルをアップロード"
|
||||||
cancel: "キャンセル"
|
cancel: "やめとくわ"
|
||||||
ok: "決定"
|
ok: "決定"
|
||||||
choose-prompt: "ファイルを選択"
|
choose-prompt: "ファイルを選択"
|
||||||
desktop/views/components/choose-folder-from-drive-window.vue:
|
desktop/views/components/choose-folder-from-drive-window.vue:
|
||||||
cancel: "キャンセル"
|
cancel: "やめとくわ"
|
||||||
ok: "決定"
|
ok: "決定"
|
||||||
choose-prompt: "フォルダを選択"
|
choose-prompt: "フォルダを選択"
|
||||||
desktop/views/components/crop-window.vue:
|
desktop/views/components/crop-window.vue:
|
||||||
skip: "クロップをスキップ"
|
skip: "クロップをスキップ"
|
||||||
cancel: "キャンセル"
|
cancel: "やめとくわ"
|
||||||
ok: "決定"
|
ok: "決定"
|
||||||
desktop/views/components/drive-window.vue:
|
desktop/views/components/drive-window.vue:
|
||||||
used: "使用中"
|
used: "使用中"
|
||||||
@ -440,6 +443,7 @@ desktop/views/components/drive-window.vue:
|
|||||||
desktop/views/components/drive.file.vue:
|
desktop/views/components/drive.file.vue:
|
||||||
avatar: "アイコン"
|
avatar: "アイコン"
|
||||||
banner: "バナー"
|
banner: "バナー"
|
||||||
|
nsfw: "閲覧注意"
|
||||||
contextmenu:
|
contextmenu:
|
||||||
rename: "名前を変更"
|
rename: "名前を変更"
|
||||||
mark-as-sensitive: "閲覧注意に設定"
|
mark-as-sensitive: "閲覧注意に設定"
|
||||||
@ -519,7 +523,7 @@ desktop/views/components/home.vue:
|
|||||||
add-widget: "ウィジェットを追加:"
|
add-widget: "ウィジェットを追加:"
|
||||||
add: "追加"
|
add: "追加"
|
||||||
desktop/views/input-dialog.vue:
|
desktop/views/input-dialog.vue:
|
||||||
cancel: "キャンセル"
|
cancel: "やめとくわ"
|
||||||
ok: "決定"
|
ok: "決定"
|
||||||
desktop/views/components/messaging-room-window.vue:
|
desktop/views/components/messaging-room-window.vue:
|
||||||
title: "メッセージ:"
|
title: "メッセージ:"
|
||||||
@ -588,7 +592,7 @@ desktop/views/components/progress-dialog.vue:
|
|||||||
waiting: "待機中"
|
waiting: "待機中"
|
||||||
desktop/views/components/renote-form.vue:
|
desktop/views/components/renote-form.vue:
|
||||||
quote: "引用する..."
|
quote: "引用する..."
|
||||||
cancel: "キャンセル"
|
cancel: "やめとくわ"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
reposting: "しています..."
|
reposting: "しています..."
|
||||||
success: "Renoteしました!"
|
success: "Renoteしました!"
|
||||||
@ -625,9 +629,11 @@ desktop/views/components/settings.vue:
|
|||||||
circle-icons: "円形のアイコンを使用"
|
circle-icons: "円形のアイコンを使用"
|
||||||
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
||||||
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
||||||
|
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||||
show-reply-target: "リプライ先を表示する"
|
show-reply-target: "リプライ先を表示する"
|
||||||
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
|
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
|
||||||
show-renoted-my-notes: "Renoteされた自分の投稿をタイムラインに表示する"
|
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
|
||||||
|
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
|
||||||
show-maps: "マップの自動展開"
|
show-maps: "マップの自動展開"
|
||||||
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
|
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
|
||||||
sound: "サウンド"
|
sound: "サウンド"
|
||||||
@ -795,6 +801,7 @@ desktop/views/pages/admin/admin.dashboard.vue:
|
|||||||
original-users: "このインスタンスのユーザー"
|
original-users: "このインスタンスのユーザー"
|
||||||
all-notes: "全てのノート"
|
all-notes: "全てのノート"
|
||||||
original-notes: "このインスタンスのノート"
|
original-notes: "このインスタンスのノート"
|
||||||
|
invite: "招待"
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
desktop/views/pages/admin/admin.suspend-user.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
suspend-user: "ユーザーの凍結"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
@ -803,6 +810,26 @@ desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|||||||
unsuspend-user: "ユーザーの凍結の解除"
|
unsuspend-user: "ユーザーの凍結の解除"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
|
desktop/views/pages/admin/admin.verify-user.vue:
|
||||||
|
verify-user: "ユーザーの公式アカウント設定"
|
||||||
|
verify: "公式アカウントにする"
|
||||||
|
verified: "公式アカウントにしました"
|
||||||
|
desktop/views/pages/admin/admin.unverify-user.vue:
|
||||||
|
unverify-user: "ユーザーの公式アカウント解除"
|
||||||
|
unverify: "公式アカウントを解除する"
|
||||||
|
unverified: "公式アカウントを解除しました"
|
||||||
|
desktop/views/pages/admin/admin.notes-chart.vue:
|
||||||
|
title: "投稿"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
desktop/views/pages/admin/admin.users-chart.vue:
|
||||||
|
title: "ユーザー"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
desktop/views/pages/admin/admin.drive-chart.vue:
|
||||||
|
title: "ドライブ"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "メディア投稿のみ"
|
is-media-only: "メディア投稿のみ"
|
||||||
is-media-view: "メディアビュー"
|
is-media-view: "メディアビュー"
|
||||||
@ -832,10 +859,10 @@ desktop/views/pages/note.vue:
|
|||||||
desktop/views/pages/selectdrive.vue:
|
desktop/views/pages/selectdrive.vue:
|
||||||
title: "ファイルを選択してください"
|
title: "ファイルを選択してください"
|
||||||
ok: "決定"
|
ok: "決定"
|
||||||
cancel: "キャンセル"
|
cancel: "やめとくわ"
|
||||||
upload: "PCからドライブにファイルをアップロード"
|
upload: "PCからドライブにファイルをアップロード"
|
||||||
desktop/views/pages/search.vue:
|
desktop/views/pages/search.vue:
|
||||||
not-available: "検索機能を利用することができません。"
|
not-available: "検索機能はインスタンスの設定で無効になっています。"
|
||||||
not-found: "「{}」に関する投稿は見つかりませんでした。"
|
not-found: "「{}」に関する投稿は見つかりませんでした。"
|
||||||
desktop/views/pages/share.vue:
|
desktop/views/pages/share.vue:
|
||||||
share-with: "{}で共有"
|
share-with: "{}で共有"
|
||||||
@ -928,12 +955,15 @@ mobile/views/components/drive-file-chooser.vue:
|
|||||||
select-file: "ファイルを選択"
|
select-file: "ファイルを選択"
|
||||||
mobile/views/components/drive-folder-chooser.vue:
|
mobile/views/components/drive-folder-chooser.vue:
|
||||||
select-folder: "フォルダーを選択"
|
select-folder: "フォルダーを選択"
|
||||||
|
mobile/views/components/drive.file.vue:
|
||||||
|
nsfw: "閲覧注意"
|
||||||
mobile/views/components/drive.file-detail.vue:
|
mobile/views/components/drive.file-detail.vue:
|
||||||
download: "ダウンロード"
|
download: "ダウンロード"
|
||||||
rename: "名前を変更"
|
rename: "名前を変更"
|
||||||
move: "移動"
|
move: "移動"
|
||||||
hash: "ハッシュ (md5)"
|
hash: "ハッシュ (md5)"
|
||||||
exif: "EXIF"
|
exif: "EXIF"
|
||||||
|
nsfw: "閲覧注意"
|
||||||
mobile/views/components/media-image.vue:
|
mobile/views/components/media-image.vue:
|
||||||
sensitive: "閲覧注意"
|
sensitive: "閲覧注意"
|
||||||
click-to-show: "クリックして表示"
|
click-to-show: "クリックして表示"
|
||||||
@ -1106,7 +1136,8 @@ mobile/views/pages/settings.vue:
|
|||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
show-reply-target: "リプライ先を表示する"
|
show-reply-target: "リプライ先を表示する"
|
||||||
show-my-renotes: "自分の行ったRenoteを表示する"
|
show-my-renotes: "自分の行ったRenoteを表示する"
|
||||||
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
|
show-renoted-my-notes: "自分の投稿のRenoteを表示する"
|
||||||
|
show-local-renotes: "ローカルの投稿のRenoteを表示する"
|
||||||
post-style: "投稿の表示スタイル"
|
post-style: "投稿の表示スタイル"
|
||||||
post-style-standard: "標準"
|
post-style-standard: "標準"
|
||||||
post-style-smart: "スマート"
|
post-style-smart: "スマート"
|
@ -12,7 +12,7 @@ common:
|
|||||||
application-authorization: "앱의 연계"
|
application-authorization: "앱의 연계"
|
||||||
close: "닫기"
|
close: "닫기"
|
||||||
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
|
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
|
||||||
got-it: "わかった"
|
got-it: "알았습니다"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "사용자 정의 팁"
|
title: "사용자 정의 팁"
|
||||||
paragraph1: "홈 정의는 위젯을 추가 / 삭제하거나 드래그 앤 드롭하여 정렬 할 수 있습니다."
|
paragraph1: "홈 정의는 위젯을 추가 / 삭제하거나 드래그 앤 드롭하여 정렬 할 수 있습니다."
|
||||||
@ -39,7 +39,7 @@ common:
|
|||||||
weeks_ago: "{}주전"
|
weeks_ago: "{}주전"
|
||||||
months_ago: "{}개월전"
|
months_ago: "{}개월전"
|
||||||
years_ago: "{}년전"
|
years_ago: "{}년전"
|
||||||
month-and-day: "{month}月 {day}日"
|
month-and-day: "{month}월 {day}일"
|
||||||
trash: "휴지통"
|
trash: "휴지통"
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "일"
|
sunday: "일"
|
||||||
@ -58,7 +58,7 @@ common:
|
|||||||
friday: "금요일"
|
friday: "금요일"
|
||||||
saturday: "토요일"
|
saturday: "토요일"
|
||||||
reactions:
|
reactions:
|
||||||
like: "좋네"
|
like: "ええやん"
|
||||||
love: "좋아"
|
love: "좋아"
|
||||||
laugh: "크크"
|
laugh: "크크"
|
||||||
hmm: "음..."
|
hmm: "음..."
|
||||||
@ -84,7 +84,7 @@ common:
|
|||||||
my-token-regenerated: "당신의 토큰이 업데이트되어 있기 때문에 로그 아웃합니다."
|
my-token-regenerated: "당신의 토큰이 업데이트되어 있기 때문에 로그 아웃합니다."
|
||||||
i-like-sushi: "나는(푸딩보다 오히려)스시가 좋아"
|
i-like-sushi: "나는(푸딩보다 오히려)스시가 좋아"
|
||||||
show-reversi-board-labels: "리버시 보드의 행과 열 레이블을 표시"
|
show-reversi-board-labels: "리버시 보드의 행과 열 레이블을 표시"
|
||||||
verified-user: "인증 된 사용자"
|
verified-user: "公式アカウント"
|
||||||
disable-animated-mfm: "게시물의 문자 애니메이션을 비활성화 할"
|
disable-animated-mfm: "게시물의 문자 애니메이션을 비활성화 할"
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "무승부"
|
drawn: "무승부"
|
||||||
@ -122,13 +122,13 @@ common:
|
|||||||
tips: "팁"
|
tips: "팁"
|
||||||
hashtags: "해시 태그"
|
hashtags: "해시 태그"
|
||||||
deck:
|
deck:
|
||||||
widgets: "ウィジェット"
|
widgets: "위젯"
|
||||||
home: "ホーム"
|
home: "홈"
|
||||||
local: "ローカル"
|
local: "로컬"
|
||||||
hybrid: "ソーシャル"
|
hybrid: "소셜"
|
||||||
global: "グローバル"
|
global: "글로벌"
|
||||||
notifications: "通知"
|
notifications: "통지"
|
||||||
list: "リスト"
|
list: "목록"
|
||||||
swap-left: "左に移動"
|
swap-left: "左に移動"
|
||||||
swap-right: "右に移動"
|
swap-right: "右に移動"
|
||||||
swap-up: "上に移動"
|
swap-up: "上に移動"
|
||||||
@ -150,10 +150,10 @@ auth/views/form.vue:
|
|||||||
drive-write: "ドライブを操作する。"
|
drive-write: "ドライブを操作する。"
|
||||||
notification-read: "通知を見る。"
|
notification-read: "通知を見る。"
|
||||||
notification-write: "通知を操作する。"
|
notification-write: "通知を操作する。"
|
||||||
cancel: "キャンセル"
|
cancel: "취소"
|
||||||
accept: "アクセスを許可"
|
accept: "アクセスを許可"
|
||||||
auth/views/index.vue:
|
auth/views/index.vue:
|
||||||
loading: "読み込み中"
|
loading: "로드 중"
|
||||||
denied: "アプリケーションの連携をキャンセルしました。"
|
denied: "アプリケーションの連携をキャンセルしました。"
|
||||||
denied-paragraph: "このアプリがあなたのアカウントにアクセスすることはありません。"
|
denied-paragraph: "このアプリがあなたのアカウントにアクセスすることはありません。"
|
||||||
already-authorized: "このアプリは既に連携済みです"
|
already-authorized: "このアプリは既に連携済みです"
|
||||||
@ -165,18 +165,18 @@ auth/views/index.vue:
|
|||||||
common/views/components/games/reversi/reversi.vue:
|
common/views/components/games/reversi/reversi.vue:
|
||||||
matching:
|
matching:
|
||||||
waiting-for: "{}を待っています"
|
waiting-for: "{}を待っています"
|
||||||
cancel: "キャンセル"
|
cancel: "취소"
|
||||||
common/views/components/games/reversi/reversi.game.vue:
|
common/views/components/games/reversi/reversi.game.vue:
|
||||||
surrender: "投了"
|
surrender: "기권"
|
||||||
surrendered: "投了により"
|
surrendered: "投了により"
|
||||||
is-llotheo: "石の少ない方が勝ち(ロセオ)"
|
is-llotheo: "石の少ない方が勝ち(ロセオ)"
|
||||||
looped-map: "ループマップ"
|
looped-map: "루프 지도"
|
||||||
can-put-everywhere: "どこでも置けるモード"
|
can-put-everywhere: "どこでも置けるモード"
|
||||||
common/views/components/games/reversi/reversi.index.vue:
|
common/views/components/games/reversi/reversi.index.vue:
|
||||||
title: "Misskey Reversi"
|
title: "Misskey Reversi"
|
||||||
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
||||||
invite: "招待"
|
invite: "초대"
|
||||||
rule: "遊び方"
|
rule: "게임 방법"
|
||||||
rule-desc: "リバーシは、相手と交互に石をボードに置いて、相手の石を挟んで自分の色に変えてゆき、最終的に残った石が多い方が勝ちというボードゲームです。"
|
rule-desc: "リバーシは、相手と交互に石をボードに置いて、相手の石を挟んで自分の色に変えてゆき、最終的に残った石が多い方が勝ちというボードゲームです。"
|
||||||
mode-invite: "招待"
|
mode-invite: "招待"
|
||||||
mode-invite-desc: "指定したユーザーと対戦するモードです。"
|
mode-invite-desc: "指定したユーザーと対戦するモードです。"
|
||||||
@ -185,26 +185,26 @@ common/views/components/games/reversi/reversi.index.vue:
|
|||||||
all-games: "みんなの対局"
|
all-games: "みんなの対局"
|
||||||
enter-username: "ユーザー名を入力してください"
|
enter-username: "ユーザー名を入力してください"
|
||||||
game-state:
|
game-state:
|
||||||
ended: "終了"
|
ended: "종료"
|
||||||
playing: "進行中"
|
playing: "진행중"
|
||||||
common/views/components/games/reversi/reversi.room.vue:
|
common/views/components/games/reversi/reversi.room.vue:
|
||||||
settings-of-the-game: "ゲームの設定"
|
settings-of-the-game: "ゲームの設定"
|
||||||
choose-map: "マップを選択"
|
choose-map: "マップを選択"
|
||||||
random: "ランダム"
|
random: "ランダム"
|
||||||
black-or-white: "先手/後手"
|
black-or-white: "先手/後手"
|
||||||
black-is: "{}が黒"
|
black-is: "{}が黒"
|
||||||
rules: "ルール"
|
rules: "규칙"
|
||||||
is-llotheo: "石の少ない方が勝ち(ロセオ)"
|
is-llotheo: "石の少ない方が勝ち(ロセオ)"
|
||||||
looped-map: "ループマップ"
|
looped-map: "루프 지도"
|
||||||
can-put-everywhere: "どこでも置けるモード"
|
can-put-everywhere: "どこでも置けるモード"
|
||||||
settings-of-the-bot: "Botの設定"
|
settings-of-the-bot: "Botの設定"
|
||||||
this-game-is-started-soon: "ゲームは数秒後に開始されます"
|
this-game-is-started-soon: "ゲームは数秒後に開始されます"
|
||||||
waiting-for-other: "相手の準備が完了するのを待っています"
|
waiting-for-other: "相手の準備が完了するのを待っています"
|
||||||
waiting-for-me: "あなたの準備が完了するのを待っています"
|
waiting-for-me: "あなたの準備が完了するのを待っています"
|
||||||
waiting-for-both: "準備中"
|
waiting-for-both: "준비중"
|
||||||
cancel: "キャンセル"
|
cancel: "취소"
|
||||||
ready: "準備完了"
|
ready: "준비 완료"
|
||||||
cancel-ready: "準備続行"
|
cancel-ready: "준비 계속"
|
||||||
common/views/components/connect-failed.vue:
|
common/views/components/connect-failed.vue:
|
||||||
title: "サーバーに接続できません"
|
title: "サーバーに接続できません"
|
||||||
description: "インターネット回線に問題があるか、サーバーがダウンまたはメンテナンスしている可能性があります。しばらくしてから{再度お試し}ください。"
|
description: "インターネット回線に問題があるか、サーバーがダウンまたはメンテナンスしている可能性があります。しばらくしてから{再度お試し}ください。"
|
||||||
@ -231,7 +231,7 @@ common/views/components/connect-failed.troubleshooter.vue:
|
|||||||
set-version: "バージョン指定"
|
set-version: "バージョン指定"
|
||||||
common/views/components/messaging.vue:
|
common/views/components/messaging.vue:
|
||||||
search-user: "ユーザーを探す"
|
search-user: "ユーザーを探す"
|
||||||
you: "あなた"
|
you: "당신"
|
||||||
no-history: "履歴はありません"
|
no-history: "履歴はありません"
|
||||||
common/views/components/messaging-room.vue:
|
common/views/components/messaging-room.vue:
|
||||||
empty: "このユーザーと話したことはありません"
|
empty: "このユーザーと話したことはありません"
|
||||||
@ -242,12 +242,12 @@ common/views/components/messaging-room.vue:
|
|||||||
only-one-file-attached: "メッセージに添付できるのはひとつのファイルのみです"
|
only-one-file-attached: "メッセージに添付できるのはひとつのファイルのみです"
|
||||||
common/views/components/messaging-room.form.vue:
|
common/views/components/messaging-room.form.vue:
|
||||||
input-message-here: "ここにメッセージを入力"
|
input-message-here: "ここにメッセージを入力"
|
||||||
send: "送信"
|
send: "전송"
|
||||||
attach-from-local: "PCからファイルを添付する"
|
attach-from-local: "PCからファイルを添付する"
|
||||||
attach-from-drive: "ドライブからファイルを添付する"
|
attach-from-drive: "ドライブからファイルを添付する"
|
||||||
only-one-file-attached: "メッセージに添付できるのはひとつのファイルのみです"
|
only-one-file-attached: "メッセージに添付できるのはひとつのファイルのみです"
|
||||||
common/views/components/messaging-room.message.vue:
|
common/views/components/messaging-room.message.vue:
|
||||||
is-read: "既読"
|
is-read: "읽음"
|
||||||
deleted: "このメッセージは削除されました"
|
deleted: "このメッセージは削除されました"
|
||||||
common/views/components/nav.vue:
|
common/views/components/nav.vue:
|
||||||
about: "Misskeyについて"
|
about: "Misskeyについて"
|
||||||
@ -287,7 +287,10 @@ common/views/components/signin.vue:
|
|||||||
signin: "サインイン"
|
signin: "サインイン"
|
||||||
or: "または"
|
or: "または"
|
||||||
signin-with-twitter: "Twitterでログイン"
|
signin-with-twitter: "Twitterでログイン"
|
||||||
|
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||||
common/views/components/signup.vue:
|
common/views/components/signup.vue:
|
||||||
|
invitation-code: "招待コード"
|
||||||
|
invitation-info: "招待コードをお持ちでない方は、<a href=\"{}\">管理者</a>までご連絡ください。"
|
||||||
username: "ユーザー名"
|
username: "ユーザー名"
|
||||||
checking: "確認しています..."
|
checking: "確認しています..."
|
||||||
available: "利用できます"
|
available: "利用できます"
|
||||||
@ -440,6 +443,7 @@ desktop/views/components/drive-window.vue:
|
|||||||
desktop/views/components/drive.file.vue:
|
desktop/views/components/drive.file.vue:
|
||||||
avatar: "アイコン"
|
avatar: "アイコン"
|
||||||
banner: "バナー"
|
banner: "バナー"
|
||||||
|
nsfw: "閲覧注意"
|
||||||
contextmenu:
|
contextmenu:
|
||||||
rename: "名前を変更"
|
rename: "名前を変更"
|
||||||
mark-as-sensitive: "閲覧注意に設定"
|
mark-as-sensitive: "閲覧注意に設定"
|
||||||
@ -625,9 +629,11 @@ desktop/views/components/settings.vue:
|
|||||||
circle-icons: "円形のアイコンを使用"
|
circle-icons: "円形のアイコンを使用"
|
||||||
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
||||||
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
||||||
|
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||||
show-reply-target: "リプライ先を表示する"
|
show-reply-target: "リプライ先を表示する"
|
||||||
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
|
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
|
||||||
show-renoted-my-notes: "Renoteされた自分の投稿をタイムラインに表示する"
|
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
|
||||||
|
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
|
||||||
show-maps: "マップの自動展開"
|
show-maps: "マップの自動展開"
|
||||||
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
|
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
|
||||||
sound: "サウンド"
|
sound: "サウンド"
|
||||||
@ -795,6 +801,7 @@ desktop/views/pages/admin/admin.dashboard.vue:
|
|||||||
original-users: "このインスタンスのユーザー"
|
original-users: "このインスタンスのユーザー"
|
||||||
all-notes: "全てのノート"
|
all-notes: "全てのノート"
|
||||||
original-notes: "このインスタンスのノート"
|
original-notes: "このインスタンスのノート"
|
||||||
|
invite: "招待"
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
desktop/views/pages/admin/admin.suspend-user.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
suspend-user: "ユーザーの凍結"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
@ -803,6 +810,26 @@ desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|||||||
unsuspend-user: "ユーザーの凍結の解除"
|
unsuspend-user: "ユーザーの凍結の解除"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
|
desktop/views/pages/admin/admin.verify-user.vue:
|
||||||
|
verify-user: "ユーザーの公式アカウント設定"
|
||||||
|
verify: "公式アカウントにする"
|
||||||
|
verified: "公式アカウントにしました"
|
||||||
|
desktop/views/pages/admin/admin.unverify-user.vue:
|
||||||
|
unverify-user: "ユーザーの公式アカウント解除"
|
||||||
|
unverify: "公式アカウントを解除する"
|
||||||
|
unverified: "公式アカウントを解除しました"
|
||||||
|
desktop/views/pages/admin/admin.notes-chart.vue:
|
||||||
|
title: "投稿"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
desktop/views/pages/admin/admin.users-chart.vue:
|
||||||
|
title: "ユーザー"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
desktop/views/pages/admin/admin.drive-chart.vue:
|
||||||
|
title: "ドライブ"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "メディア投稿のみ"
|
is-media-only: "メディア投稿のみ"
|
||||||
is-media-view: "メディアビュー"
|
is-media-view: "メディアビュー"
|
||||||
@ -835,7 +862,7 @@ desktop/views/pages/selectdrive.vue:
|
|||||||
cancel: "キャンセル"
|
cancel: "キャンセル"
|
||||||
upload: "PCからドライブにファイルをアップロード"
|
upload: "PCからドライブにファイルをアップロード"
|
||||||
desktop/views/pages/search.vue:
|
desktop/views/pages/search.vue:
|
||||||
not-available: "検索機能を利用することができません。"
|
not-available: "検索機能はインスタンスの設定で無効になっています。"
|
||||||
not-found: "「{}」に関する投稿は見つかりませんでした。"
|
not-found: "「{}」に関する投稿は見つかりませんでした。"
|
||||||
desktop/views/pages/share.vue:
|
desktop/views/pages/share.vue:
|
||||||
share-with: "{}で共有"
|
share-with: "{}で共有"
|
||||||
@ -928,12 +955,15 @@ mobile/views/components/drive-file-chooser.vue:
|
|||||||
select-file: "ファイルを選択"
|
select-file: "ファイルを選択"
|
||||||
mobile/views/components/drive-folder-chooser.vue:
|
mobile/views/components/drive-folder-chooser.vue:
|
||||||
select-folder: "フォルダーを選択"
|
select-folder: "フォルダーを選択"
|
||||||
|
mobile/views/components/drive.file.vue:
|
||||||
|
nsfw: "閲覧注意"
|
||||||
mobile/views/components/drive.file-detail.vue:
|
mobile/views/components/drive.file-detail.vue:
|
||||||
download: "ダウンロード"
|
download: "ダウンロード"
|
||||||
rename: "名前を変更"
|
rename: "名前を変更"
|
||||||
move: "移動"
|
move: "移動"
|
||||||
hash: "ハッシュ (md5)"
|
hash: "ハッシュ (md5)"
|
||||||
exif: "EXIF"
|
exif: "EXIF"
|
||||||
|
nsfw: "閲覧注意"
|
||||||
mobile/views/components/media-image.vue:
|
mobile/views/components/media-image.vue:
|
||||||
sensitive: "閲覧注意"
|
sensitive: "閲覧注意"
|
||||||
click-to-show: "クリックして表示"
|
click-to-show: "クリックして表示"
|
||||||
@ -1106,7 +1136,8 @@ mobile/views/pages/settings.vue:
|
|||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
show-reply-target: "リプライ先を表示する"
|
show-reply-target: "リプライ先を表示する"
|
||||||
show-my-renotes: "自分の行ったRenoteを表示する"
|
show-my-renotes: "自分の行ったRenoteを表示する"
|
||||||
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
|
show-renoted-my-notes: "自分の投稿のRenoteを表示する"
|
||||||
|
show-local-renotes: "ローカルの投稿のRenoteを表示する"
|
||||||
post-style: "投稿の表示スタイル"
|
post-style: "投稿の表示スタイル"
|
||||||
post-style-standard: "標準"
|
post-style-standard: "標準"
|
||||||
post-style-smart: "スマート"
|
post-style-smart: "スマート"
|
@ -58,7 +58,7 @@ common:
|
|||||||
friday: "Piątek"
|
friday: "Piątek"
|
||||||
saturday: "Sobota"
|
saturday: "Sobota"
|
||||||
reactions:
|
reactions:
|
||||||
like: "Lubię"
|
like: "ええやん"
|
||||||
love: "Kocham"
|
love: "Kocham"
|
||||||
laugh: "Śmieszne"
|
laugh: "Śmieszne"
|
||||||
hmm: "Hmm…?"
|
hmm: "Hmm…?"
|
||||||
@ -84,7 +84,7 @@ common:
|
|||||||
my-token-regenerated: "Twój token został wygenerowany. Zostaniesz wylogowany."
|
my-token-regenerated: "Twój token został wygenerowany. Zostaniesz wylogowany."
|
||||||
i-like-sushi: "Wolę sushi od puddingu"
|
i-like-sushi: "Wolę sushi od puddingu"
|
||||||
show-reversi-board-labels: "Pokazuj podpisy wierszy i kolumn w Reversi"
|
show-reversi-board-labels: "Pokazuj podpisy wierszy i kolumn w Reversi"
|
||||||
verified-user: "Zweryfikowany użytkownik"
|
verified-user: "公式アカウント"
|
||||||
disable-animated-mfm: "Wyłącz animowany tekst we wpisach"
|
disable-animated-mfm: "Wyłącz animowany tekst we wpisach"
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "Remis"
|
drawn: "Remis"
|
||||||
@ -287,7 +287,10 @@ common/views/components/signin.vue:
|
|||||||
signin: "Zaloguj"
|
signin: "Zaloguj"
|
||||||
or: "または"
|
or: "または"
|
||||||
signin-with-twitter: "Zaloguj się za pomocą Twittera"
|
signin-with-twitter: "Zaloguj się za pomocą Twittera"
|
||||||
|
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||||
common/views/components/signup.vue:
|
common/views/components/signup.vue:
|
||||||
|
invitation-code: "招待コード"
|
||||||
|
invitation-info: "招待コードをお持ちでない方は、<a href=\"{}\">管理者</a>までご連絡ください。"
|
||||||
username: "Nazwa użytkownika"
|
username: "Nazwa użytkownika"
|
||||||
checking: "Sprawdzanie…"
|
checking: "Sprawdzanie…"
|
||||||
available: "Dostępna"
|
available: "Dostępna"
|
||||||
@ -440,6 +443,7 @@ desktop/views/components/drive-window.vue:
|
|||||||
desktop/views/components/drive.file.vue:
|
desktop/views/components/drive.file.vue:
|
||||||
avatar: "Awatar"
|
avatar: "Awatar"
|
||||||
banner: "Baner"
|
banner: "Baner"
|
||||||
|
nsfw: "閲覧注意"
|
||||||
contextmenu:
|
contextmenu:
|
||||||
rename: "Zmień nazwę"
|
rename: "Zmień nazwę"
|
||||||
mark-as-sensitive: "Oznacz jako zawartość wrażliwą"
|
mark-as-sensitive: "Oznacz jako zawartość wrażliwą"
|
||||||
@ -625,9 +629,11 @@ desktop/views/components/settings.vue:
|
|||||||
circle-icons: "Używaj okrągłych ikon"
|
circle-icons: "Używaj okrągłych ikon"
|
||||||
gradient-window-header: "Używaj gradientów na pasku tytułu okna"
|
gradient-window-header: "Używaj gradientów na pasku tytułu okna"
|
||||||
post-form-on-timeline: "Wyświetlaj formularz tworzenia wpisu w górnej części osi czasu"
|
post-form-on-timeline: "Wyświetlaj formularz tworzenia wpisu w górnej części osi czasu"
|
||||||
|
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||||
show-reply-target: "Pokazuj cel odpowiedzi"
|
show-reply-target: "Pokazuj cel odpowiedzi"
|
||||||
show-my-renotes: "Pokazuj moje udostępnienia na osi czasu"
|
show-my-renotes: "Pokazuj moje udostępnienia na osi czasu"
|
||||||
show-renoted-my-notes: "Pokazuj udostępnienia moich wpisów na osi czasu"
|
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
|
||||||
|
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
|
||||||
show-maps: "Automatycznie pokazuj mapę"
|
show-maps: "Automatycznie pokazuj mapę"
|
||||||
show-maps-desc: "Mapa będzie automatycznie rozwijana dla wpisów zawierających informacje o lokalizacji."
|
show-maps-desc: "Mapa będzie automatycznie rozwijana dla wpisów zawierających informacje o lokalizacji."
|
||||||
sound: "Dźwięk"
|
sound: "Dźwięk"
|
||||||
@ -795,6 +801,7 @@ desktop/views/pages/admin/admin.dashboard.vue:
|
|||||||
original-users: "このインスタンスのユーザー"
|
original-users: "このインスタンスのユーザー"
|
||||||
all-notes: "全てのノート"
|
all-notes: "全てのノート"
|
||||||
original-notes: "このインスタンスのノート"
|
original-notes: "このインスタンスのノート"
|
||||||
|
invite: "招待"
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
desktop/views/pages/admin/admin.suspend-user.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
suspend-user: "ユーザーの凍結"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
@ -803,6 +810,26 @@ desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|||||||
unsuspend-user: "ユーザーの凍結の解除"
|
unsuspend-user: "ユーザーの凍結の解除"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
|
desktop/views/pages/admin/admin.verify-user.vue:
|
||||||
|
verify-user: "ユーザーの公式アカウント設定"
|
||||||
|
verify: "公式アカウントにする"
|
||||||
|
verified: "公式アカウントにしました"
|
||||||
|
desktop/views/pages/admin/admin.unverify-user.vue:
|
||||||
|
unverify-user: "ユーザーの公式アカウント解除"
|
||||||
|
unverify: "公式アカウントを解除する"
|
||||||
|
unverified: "公式アカウントを解除しました"
|
||||||
|
desktop/views/pages/admin/admin.notes-chart.vue:
|
||||||
|
title: "投稿"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
desktop/views/pages/admin/admin.users-chart.vue:
|
||||||
|
title: "ユーザー"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
desktop/views/pages/admin/admin.drive-chart.vue:
|
||||||
|
title: "ドライブ"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "Tylko wpisy z zawartością multimedialną"
|
is-media-only: "Tylko wpisy z zawartością multimedialną"
|
||||||
is-media-view: "Widok multimediów"
|
is-media-view: "Widok multimediów"
|
||||||
@ -835,7 +862,7 @@ desktop/views/pages/selectdrive.vue:
|
|||||||
cancel: "Anuluj"
|
cancel: "Anuluj"
|
||||||
upload: "Wyślij pliki z Twojego komputera"
|
upload: "Wyślij pliki z Twojego komputera"
|
||||||
desktop/views/pages/search.vue:
|
desktop/views/pages/search.vue:
|
||||||
not-available: "Funkcja wyszukiwania nie może zostać wykorzystywana."
|
not-available: "検索機能はインスタンスの設定で無効になっています。"
|
||||||
not-found: "Nie znaleziono wpisów zawierających „{}”"
|
not-found: "Nie znaleziono wpisów zawierających „{}”"
|
||||||
desktop/views/pages/share.vue:
|
desktop/views/pages/share.vue:
|
||||||
share-with: "Udostępnij z {}."
|
share-with: "Udostępnij z {}."
|
||||||
@ -928,12 +955,15 @@ mobile/views/components/drive-file-chooser.vue:
|
|||||||
select-file: "Wybierz plik"
|
select-file: "Wybierz plik"
|
||||||
mobile/views/components/drive-folder-chooser.vue:
|
mobile/views/components/drive-folder-chooser.vue:
|
||||||
select-folder: "Wybierz katalog"
|
select-folder: "Wybierz katalog"
|
||||||
|
mobile/views/components/drive.file.vue:
|
||||||
|
nsfw: "閲覧注意"
|
||||||
mobile/views/components/drive.file-detail.vue:
|
mobile/views/components/drive.file-detail.vue:
|
||||||
download: "Pobierz"
|
download: "Pobierz"
|
||||||
rename: "Zmień nazwę"
|
rename: "Zmień nazwę"
|
||||||
move: "Przenieś"
|
move: "Przenieś"
|
||||||
hash: "Hash (md5)"
|
hash: "Hash (md5)"
|
||||||
exif: "EXIF"
|
exif: "EXIF"
|
||||||
|
nsfw: "閲覧注意"
|
||||||
mobile/views/components/media-image.vue:
|
mobile/views/components/media-image.vue:
|
||||||
sensitive: "To jest zawartość NSFW"
|
sensitive: "To jest zawartość NSFW"
|
||||||
click-to-show: "Naciśnij aby wyświetlić"
|
click-to-show: "Naciśnij aby wyświetlić"
|
||||||
@ -1106,7 +1136,8 @@ mobile/views/pages/settings.vue:
|
|||||||
timeline: "Oś czasu"
|
timeline: "Oś czasu"
|
||||||
show-reply-target: "Pokazuj cel odpowiedzi"
|
show-reply-target: "Pokazuj cel odpowiedzi"
|
||||||
show-my-renotes: "Pokazuj moje udostępnienia"
|
show-my-renotes: "Pokazuj moje udostępnienia"
|
||||||
show-renoted-my-notes: "Pokazuj udostępnienia moich wpisów"
|
show-renoted-my-notes: "自分の投稿のRenoteを表示する"
|
||||||
|
show-local-renotes: "ローカルの投稿のRenoteを表示する"
|
||||||
post-style: "Styl wpisów"
|
post-style: "Styl wpisów"
|
||||||
post-style-standard: "Standardowy"
|
post-style-standard: "Standardowy"
|
||||||
post-style-smart: "Inteligentny"
|
post-style-smart: "Inteligentny"
|
1219
locales/pt-PT.yml
Normal file
1219
locales/pt-PT.yml
Normal file
File diff suppressed because it is too large
Load Diff
@ -58,7 +58,7 @@ common:
|
|||||||
friday: "金曜日"
|
friday: "金曜日"
|
||||||
saturday: "土曜日"
|
saturday: "土曜日"
|
||||||
reactions:
|
reactions:
|
||||||
like: "いいね"
|
like: "ええやん"
|
||||||
love: "しゅき"
|
love: "しゅき"
|
||||||
laugh: "笑"
|
laugh: "笑"
|
||||||
hmm: "ふぅ~む"
|
hmm: "ふぅ~む"
|
||||||
@ -84,7 +84,7 @@ common:
|
|||||||
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
||||||
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
||||||
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
||||||
verified-user: "認証済みのユーザー"
|
verified-user: "公式アカウント"
|
||||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "引き分け"
|
drawn: "引き分け"
|
||||||
@ -287,7 +287,10 @@ common/views/components/signin.vue:
|
|||||||
signin: "サインイン"
|
signin: "サインイン"
|
||||||
or: "または"
|
or: "または"
|
||||||
signin-with-twitter: "Twitterでログイン"
|
signin-with-twitter: "Twitterでログイン"
|
||||||
|
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||||
common/views/components/signup.vue:
|
common/views/components/signup.vue:
|
||||||
|
invitation-code: "招待コード"
|
||||||
|
invitation-info: "招待コードをお持ちでない方は、<a href=\"{}\">管理者</a>までご連絡ください。"
|
||||||
username: "ユーザー名"
|
username: "ユーザー名"
|
||||||
checking: "確認しています..."
|
checking: "確認しています..."
|
||||||
available: "利用できます"
|
available: "利用できます"
|
||||||
@ -440,6 +443,7 @@ desktop/views/components/drive-window.vue:
|
|||||||
desktop/views/components/drive.file.vue:
|
desktop/views/components/drive.file.vue:
|
||||||
avatar: "アイコン"
|
avatar: "アイコン"
|
||||||
banner: "バナー"
|
banner: "バナー"
|
||||||
|
nsfw: "閲覧注意"
|
||||||
contextmenu:
|
contextmenu:
|
||||||
rename: "名前を変更"
|
rename: "名前を変更"
|
||||||
mark-as-sensitive: "閲覧注意に設定"
|
mark-as-sensitive: "閲覧注意に設定"
|
||||||
@ -625,9 +629,11 @@ desktop/views/components/settings.vue:
|
|||||||
circle-icons: "円形のアイコンを使用"
|
circle-icons: "円形のアイコンを使用"
|
||||||
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
||||||
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
||||||
|
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||||
show-reply-target: "リプライ先を表示する"
|
show-reply-target: "リプライ先を表示する"
|
||||||
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
|
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
|
||||||
show-renoted-my-notes: "Renoteされた自分の投稿をタイムラインに表示する"
|
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
|
||||||
|
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
|
||||||
show-maps: "マップの自動展開"
|
show-maps: "マップの自動展開"
|
||||||
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
|
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
|
||||||
sound: "サウンド"
|
sound: "サウンド"
|
||||||
@ -795,6 +801,7 @@ desktop/views/pages/admin/admin.dashboard.vue:
|
|||||||
original-users: "このインスタンスのユーザー"
|
original-users: "このインスタンスのユーザー"
|
||||||
all-notes: "全てのノート"
|
all-notes: "全てのノート"
|
||||||
original-notes: "このインスタンスのノート"
|
original-notes: "このインスタンスのノート"
|
||||||
|
invite: "招待"
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
desktop/views/pages/admin/admin.suspend-user.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
suspend-user: "ユーザーの凍結"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
@ -803,6 +810,26 @@ desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|||||||
unsuspend-user: "ユーザーの凍結の解除"
|
unsuspend-user: "ユーザーの凍結の解除"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
|
desktop/views/pages/admin/admin.verify-user.vue:
|
||||||
|
verify-user: "ユーザーの公式アカウント設定"
|
||||||
|
verify: "公式アカウントにする"
|
||||||
|
verified: "公式アカウントにしました"
|
||||||
|
desktop/views/pages/admin/admin.unverify-user.vue:
|
||||||
|
unverify-user: "ユーザーの公式アカウント解除"
|
||||||
|
unverify: "公式アカウントを解除する"
|
||||||
|
unverified: "公式アカウントを解除しました"
|
||||||
|
desktop/views/pages/admin/admin.notes-chart.vue:
|
||||||
|
title: "投稿"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
desktop/views/pages/admin/admin.users-chart.vue:
|
||||||
|
title: "ユーザー"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
desktop/views/pages/admin/admin.drive-chart.vue:
|
||||||
|
title: "ドライブ"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "メディア投稿のみ"
|
is-media-only: "メディア投稿のみ"
|
||||||
is-media-view: "メディアビュー"
|
is-media-view: "メディアビュー"
|
||||||
@ -835,7 +862,7 @@ desktop/views/pages/selectdrive.vue:
|
|||||||
cancel: "キャンセル"
|
cancel: "キャンセル"
|
||||||
upload: "PCからドライブにファイルをアップロード"
|
upload: "PCからドライブにファイルをアップロード"
|
||||||
desktop/views/pages/search.vue:
|
desktop/views/pages/search.vue:
|
||||||
not-available: "検索機能を利用することができません。"
|
not-available: "検索機能はインスタンスの設定で無効になっています。"
|
||||||
not-found: "「{}」に関する投稿は見つかりませんでした。"
|
not-found: "「{}」に関する投稿は見つかりませんでした。"
|
||||||
desktop/views/pages/share.vue:
|
desktop/views/pages/share.vue:
|
||||||
share-with: "{}で共有"
|
share-with: "{}で共有"
|
||||||
@ -928,12 +955,15 @@ mobile/views/components/drive-file-chooser.vue:
|
|||||||
select-file: "ファイルを選択"
|
select-file: "ファイルを選択"
|
||||||
mobile/views/components/drive-folder-chooser.vue:
|
mobile/views/components/drive-folder-chooser.vue:
|
||||||
select-folder: "フォルダーを選択"
|
select-folder: "フォルダーを選択"
|
||||||
|
mobile/views/components/drive.file.vue:
|
||||||
|
nsfw: "閲覧注意"
|
||||||
mobile/views/components/drive.file-detail.vue:
|
mobile/views/components/drive.file-detail.vue:
|
||||||
download: "ダウンロード"
|
download: "ダウンロード"
|
||||||
rename: "名前を変更"
|
rename: "名前を変更"
|
||||||
move: "移動"
|
move: "移動"
|
||||||
hash: "ハッシュ (md5)"
|
hash: "ハッシュ (md5)"
|
||||||
exif: "EXIF"
|
exif: "EXIF"
|
||||||
|
nsfw: "閲覧注意"
|
||||||
mobile/views/components/media-image.vue:
|
mobile/views/components/media-image.vue:
|
||||||
sensitive: "閲覧注意"
|
sensitive: "閲覧注意"
|
||||||
click-to-show: "クリックして表示"
|
click-to-show: "クリックして表示"
|
||||||
@ -1106,7 +1136,8 @@ mobile/views/pages/settings.vue:
|
|||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
show-reply-target: "リプライ先を表示する"
|
show-reply-target: "リプライ先を表示する"
|
||||||
show-my-renotes: "自分の行ったRenoteを表示する"
|
show-my-renotes: "自分の行ったRenoteを表示する"
|
||||||
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
|
show-renoted-my-notes: "自分の投稿のRenoteを表示する"
|
||||||
|
show-local-renotes: "ローカルの投稿のRenoteを表示する"
|
||||||
post-style: "投稿の表示スタイル"
|
post-style: "投稿の表示スタイル"
|
||||||
post-style-standard: "標準"
|
post-style-standard: "標準"
|
||||||
post-style-smart: "スマート"
|
post-style-smart: "スマート"
|
@ -58,7 +58,7 @@ common:
|
|||||||
friday: "金曜日"
|
friday: "金曜日"
|
||||||
saturday: "土曜日"
|
saturday: "土曜日"
|
||||||
reactions:
|
reactions:
|
||||||
like: "いいね"
|
like: "ええやん"
|
||||||
love: "しゅき"
|
love: "しゅき"
|
||||||
laugh: "笑"
|
laugh: "笑"
|
||||||
hmm: "ふぅ~む"
|
hmm: "ふぅ~む"
|
||||||
@ -84,7 +84,7 @@ common:
|
|||||||
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
||||||
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
||||||
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
||||||
verified-user: "認証済みのユーザー"
|
verified-user: "公式アカウント"
|
||||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "引き分け"
|
drawn: "引き分け"
|
||||||
@ -287,7 +287,10 @@ common/views/components/signin.vue:
|
|||||||
signin: "サインイン"
|
signin: "サインイン"
|
||||||
or: "または"
|
or: "または"
|
||||||
signin-with-twitter: "Twitterでログイン"
|
signin-with-twitter: "Twitterでログイン"
|
||||||
|
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||||
common/views/components/signup.vue:
|
common/views/components/signup.vue:
|
||||||
|
invitation-code: "招待コード"
|
||||||
|
invitation-info: "招待コードをお持ちでない方は、<a href=\"{}\">管理者</a>までご連絡ください。"
|
||||||
username: "ユーザー名"
|
username: "ユーザー名"
|
||||||
checking: "確認しています..."
|
checking: "確認しています..."
|
||||||
available: "利用できます"
|
available: "利用できます"
|
||||||
@ -440,6 +443,7 @@ desktop/views/components/drive-window.vue:
|
|||||||
desktop/views/components/drive.file.vue:
|
desktop/views/components/drive.file.vue:
|
||||||
avatar: "アイコン"
|
avatar: "アイコン"
|
||||||
banner: "バナー"
|
banner: "バナー"
|
||||||
|
nsfw: "閲覧注意"
|
||||||
contextmenu:
|
contextmenu:
|
||||||
rename: "名前を変更"
|
rename: "名前を変更"
|
||||||
mark-as-sensitive: "閲覧注意に設定"
|
mark-as-sensitive: "閲覧注意に設定"
|
||||||
@ -625,9 +629,11 @@ desktop/views/components/settings.vue:
|
|||||||
circle-icons: "円形のアイコンを使用"
|
circle-icons: "円形のアイコンを使用"
|
||||||
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
||||||
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
||||||
|
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||||
show-reply-target: "リプライ先を表示する"
|
show-reply-target: "リプライ先を表示する"
|
||||||
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
|
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
|
||||||
show-renoted-my-notes: "Renoteされた自分の投稿をタイムラインに表示する"
|
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
|
||||||
|
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
|
||||||
show-maps: "マップの自動展開"
|
show-maps: "マップの自動展開"
|
||||||
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
|
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
|
||||||
sound: "サウンド"
|
sound: "サウンド"
|
||||||
@ -795,6 +801,7 @@ desktop/views/pages/admin/admin.dashboard.vue:
|
|||||||
original-users: "このインスタンスのユーザー"
|
original-users: "このインスタンスのユーザー"
|
||||||
all-notes: "全てのノート"
|
all-notes: "全てのノート"
|
||||||
original-notes: "このインスタンスのノート"
|
original-notes: "このインスタンスのノート"
|
||||||
|
invite: "招待"
|
||||||
desktop/views/pages/admin/admin.suspend-user.vue:
|
desktop/views/pages/admin/admin.suspend-user.vue:
|
||||||
suspend-user: "ユーザーの凍結"
|
suspend-user: "ユーザーの凍結"
|
||||||
suspend: "凍結"
|
suspend: "凍結"
|
||||||
@ -803,6 +810,26 @@ desktop/views/pages/admin/admin.unsuspend-user.vue:
|
|||||||
unsuspend-user: "ユーザーの凍結の解除"
|
unsuspend-user: "ユーザーの凍結の解除"
|
||||||
unsuspend: "凍結の解除"
|
unsuspend: "凍結の解除"
|
||||||
unsuspended: "凍結を解除しました"
|
unsuspended: "凍結を解除しました"
|
||||||
|
desktop/views/pages/admin/admin.verify-user.vue:
|
||||||
|
verify-user: "ユーザーの公式アカウント設定"
|
||||||
|
verify: "公式アカウントにする"
|
||||||
|
verified: "公式アカウントにしました"
|
||||||
|
desktop/views/pages/admin/admin.unverify-user.vue:
|
||||||
|
unverify-user: "ユーザーの公式アカウント解除"
|
||||||
|
unverify: "公式アカウントを解除する"
|
||||||
|
unverified: "公式アカウントを解除しました"
|
||||||
|
desktop/views/pages/admin/admin.notes-chart.vue:
|
||||||
|
title: "投稿"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
desktop/views/pages/admin/admin.users-chart.vue:
|
||||||
|
title: "ユーザー"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
|
desktop/views/pages/admin/admin.drive-chart.vue:
|
||||||
|
title: "ドライブ"
|
||||||
|
local: "ローカル"
|
||||||
|
remote: "リモート"
|
||||||
desktop/views/pages/deck/deck.tl-column.vue:
|
desktop/views/pages/deck/deck.tl-column.vue:
|
||||||
is-media-only: "メディア投稿のみ"
|
is-media-only: "メディア投稿のみ"
|
||||||
is-media-view: "メディアビュー"
|
is-media-view: "メディアビュー"
|
||||||
@ -835,7 +862,7 @@ desktop/views/pages/selectdrive.vue:
|
|||||||
cancel: "キャンセル"
|
cancel: "キャンセル"
|
||||||
upload: "PCからドライブにファイルをアップロード"
|
upload: "PCからドライブにファイルをアップロード"
|
||||||
desktop/views/pages/search.vue:
|
desktop/views/pages/search.vue:
|
||||||
not-available: "検索機能を利用することができません。"
|
not-available: "検索機能はインスタンスの設定で無効になっています。"
|
||||||
not-found: "「{}」に関する投稿は見つかりませんでした。"
|
not-found: "「{}」に関する投稿は見つかりませんでした。"
|
||||||
desktop/views/pages/share.vue:
|
desktop/views/pages/share.vue:
|
||||||
share-with: "{}で共有"
|
share-with: "{}で共有"
|
||||||
@ -928,12 +955,15 @@ mobile/views/components/drive-file-chooser.vue:
|
|||||||
select-file: "ファイルを選択"
|
select-file: "ファイルを選択"
|
||||||
mobile/views/components/drive-folder-chooser.vue:
|
mobile/views/components/drive-folder-chooser.vue:
|
||||||
select-folder: "フォルダーを選択"
|
select-folder: "フォルダーを選択"
|
||||||
|
mobile/views/components/drive.file.vue:
|
||||||
|
nsfw: "閲覧注意"
|
||||||
mobile/views/components/drive.file-detail.vue:
|
mobile/views/components/drive.file-detail.vue:
|
||||||
download: "ダウンロード"
|
download: "ダウンロード"
|
||||||
rename: "名前を変更"
|
rename: "名前を変更"
|
||||||
move: "移動"
|
move: "移動"
|
||||||
hash: "ハッシュ (md5)"
|
hash: "ハッシュ (md5)"
|
||||||
exif: "EXIF"
|
exif: "EXIF"
|
||||||
|
nsfw: "閲覧注意"
|
||||||
mobile/views/components/media-image.vue:
|
mobile/views/components/media-image.vue:
|
||||||
sensitive: "閲覧注意"
|
sensitive: "閲覧注意"
|
||||||
click-to-show: "クリックして表示"
|
click-to-show: "クリックして表示"
|
||||||
@ -1106,7 +1136,8 @@ mobile/views/pages/settings.vue:
|
|||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
show-reply-target: "リプライ先を表示する"
|
show-reply-target: "リプライ先を表示する"
|
||||||
show-my-renotes: "自分の行ったRenoteを表示する"
|
show-my-renotes: "自分の行ったRenoteを表示する"
|
||||||
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
|
show-renoted-my-notes: "自分の投稿のRenoteを表示する"
|
||||||
|
show-local-renotes: "ローカルの投稿のRenoteを表示する"
|
||||||
post-style: "投稿の表示スタイル"
|
post-style: "投稿の表示スタイル"
|
||||||
post-style-standard: "標準"
|
post-style-standard: "標準"
|
||||||
post-style-smart: "スマート"
|
post-style-smart: "スマート"
|
22
package.json
22
package.json
@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"name": "misskey",
|
"name": "misskey",
|
||||||
"author": "syuilo <i@syuilo.com>",
|
"author": "syuilo <i@syuilo.com>",
|
||||||
"version": "6.0.0",
|
"version": "8.3.1",
|
||||||
"clientVersion": "1.0.8367",
|
"clientVersion": "1.0.8828",
|
||||||
"codename": "nighthike",
|
"codename": "nighthike",
|
||||||
"main": "./built/index.js",
|
"main": "./built/index.js",
|
||||||
"private": true,
|
"private": true,
|
||||||
@ -89,6 +89,7 @@
|
|||||||
"bootstrap-vue": "2.0.0-rc.11",
|
"bootstrap-vue": "2.0.0-rc.11",
|
||||||
"cafy": "11.3.0",
|
"cafy": "11.3.0",
|
||||||
"chalk": "2.4.1",
|
"chalk": "2.4.1",
|
||||||
|
"chart.js": "2.7.2",
|
||||||
"commander": "2.17.1",
|
"commander": "2.17.1",
|
||||||
"crc-32": "1.2.0",
|
"crc-32": "1.2.0",
|
||||||
"css-loader": "1.0.0",
|
"css-loader": "1.0.0",
|
||||||
@ -126,7 +127,7 @@
|
|||||||
"gulp-util": "3.0.8",
|
"gulp-util": "3.0.8",
|
||||||
"hard-source-webpack-plugin": "0.12.0",
|
"hard-source-webpack-plugin": "0.12.0",
|
||||||
"highlight.js": "9.12.0",
|
"highlight.js": "9.12.0",
|
||||||
"html-minifier": "3.5.19",
|
"html-minifier": "3.5.20",
|
||||||
"http-signature": "1.2.0",
|
"http-signature": "1.2.0",
|
||||||
"insert-text-at-cursor": "0.1.1",
|
"insert-text-at-cursor": "0.1.1",
|
||||||
"is-root": "2.0.0",
|
"is-root": "2.0.0",
|
||||||
@ -149,6 +150,7 @@
|
|||||||
"loader-utils": "1.1.0",
|
"loader-utils": "1.1.0",
|
||||||
"lodash.assign": "4.2.0",
|
"lodash.assign": "4.2.0",
|
||||||
"mecab-async": "0.1.2",
|
"mecab-async": "0.1.2",
|
||||||
|
"merge-options": "1.0.1",
|
||||||
"minio": "7.0.0",
|
"minio": "7.0.0",
|
||||||
"mkdirp": "0.5.1",
|
"mkdirp": "0.5.1",
|
||||||
"mocha": "5.2.0",
|
"mocha": "5.2.0",
|
||||||
@ -157,6 +159,7 @@
|
|||||||
"monk": "6.0.6",
|
"monk": "6.0.6",
|
||||||
"ms": "2.1.1",
|
"ms": "2.1.1",
|
||||||
"nan": "2.10.0",
|
"nan": "2.10.0",
|
||||||
|
"nested-property": "0.0.7",
|
||||||
"node-sass": "4.9.3",
|
"node-sass": "4.9.3",
|
||||||
"node-sass-json-importer": "3.3.1",
|
"node-sass-json-importer": "3.3.1",
|
||||||
"nprogress": "0.2.0",
|
"nprogress": "0.2.0",
|
||||||
@ -181,7 +184,7 @@
|
|||||||
"s-age": "1.1.2",
|
"s-age": "1.1.2",
|
||||||
"sass-loader": "7.1.0",
|
"sass-loader": "7.1.0",
|
||||||
"seedrandom": "2.4.4",
|
"seedrandom": "2.4.4",
|
||||||
"sharp": "0.20.5",
|
"sharp": "0.20.7",
|
||||||
"showdown": "1.8.6",
|
"showdown": "1.8.6",
|
||||||
"showdown-highlightjs-extension": "0.1.2",
|
"showdown-highlightjs-extension": "0.1.2",
|
||||||
"single-line-log": "1.1.2",
|
"single-line-log": "1.1.2",
|
||||||
@ -190,7 +193,7 @@
|
|||||||
"style-loader": "0.22.1",
|
"style-loader": "0.22.1",
|
||||||
"stylus": "0.54.5",
|
"stylus": "0.54.5",
|
||||||
"stylus-loader": "3.0.2",
|
"stylus-loader": "3.0.2",
|
||||||
"summaly": "2.1.3",
|
"summaly": "2.1.4",
|
||||||
"systeminformation": "3.42.9",
|
"systeminformation": "3.42.9",
|
||||||
"syuilo-password-strength": "0.0.1",
|
"syuilo-password-strength": "0.0.1",
|
||||||
"textarea-caret": "3.1.0",
|
"textarea-caret": "3.1.0",
|
||||||
@ -201,14 +204,15 @@
|
|||||||
"typescript": "2.9.2",
|
"typescript": "2.9.2",
|
||||||
"typescript-eslint-parser": "18.0.0",
|
"typescript-eslint-parser": "18.0.0",
|
||||||
"uglify-es": "3.3.9",
|
"uglify-es": "3.3.9",
|
||||||
"url-loader": "1.1.0",
|
"url-loader": "1.1.1",
|
||||||
"uuid": "3.3.2",
|
"uuid": "3.3.2",
|
||||||
"v-animate-css": "0.0.2",
|
"v-animate-css": "0.0.2",
|
||||||
"vue": "2.5.17",
|
"vue": "2.5.17",
|
||||||
|
"vue-chartjs": "3.4.0",
|
||||||
"vue-cropperjs": "2.2.1",
|
"vue-cropperjs": "2.2.1",
|
||||||
"vue-js-modal": "1.3.17",
|
"vue-js-modal": "1.3.18",
|
||||||
"vue-json-tree-view": "2.1.4",
|
"vue-json-tree-view": "2.1.4",
|
||||||
"vue-loader": "15.3.0",
|
"vue-loader": "15.4.0",
|
||||||
"vue-router": "3.0.1",
|
"vue-router": "3.0.1",
|
||||||
"vue-style-loader": "4.1.2",
|
"vue-style-loader": "4.1.2",
|
||||||
"vue-template-compiler": "2.5.17",
|
"vue-template-compiler": "2.5.17",
|
||||||
@ -217,7 +221,7 @@
|
|||||||
"vuex-persistedstate": "2.5.4",
|
"vuex-persistedstate": "2.5.4",
|
||||||
"web-push": "3.3.2",
|
"web-push": "3.3.2",
|
||||||
"webfinger.js": "2.6.6",
|
"webfinger.js": "2.6.6",
|
||||||
"webpack": "4.16.5",
|
"webpack": "4.17.1",
|
||||||
"webpack-cli": "3.1.0",
|
"webpack-cli": "3.1.0",
|
||||||
"websocket": "1.0.26",
|
"websocket": "1.0.26",
|
||||||
"ws": "6.0.0",
|
"ws": "6.0.0",
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<div class="app">
|
<div class="app">
|
||||||
<section>
|
<section>
|
||||||
<h2>{{ app.name }}</h2>
|
<h2>{{ app.name }}</h2>
|
||||||
<p class="nid">{{ app.nameId }}</p>
|
<p class="id">{{ app.id }}</p>
|
||||||
<p class="description">{{ app.description }}</p>
|
<p class="description">{{ app.description }}</p>
|
||||||
</section>
|
</section>
|
||||||
<section>
|
<section>
|
||||||
|
@ -32,16 +32,24 @@
|
|||||||
//#region Detect app name
|
//#region Detect app name
|
||||||
let app = null;
|
let app = null;
|
||||||
|
|
||||||
if (url.pathname == '/docs' || url.pathname.startsWith('/docs/')) app = 'docs';
|
if (`${url.pathname}/`.startsWith('/docs/')) app = 'docs';
|
||||||
if (url.pathname == '/dev' || url.pathname.startsWith('/dev/')) app = 'dev';
|
if (`${url.pathname}/`.startsWith('/dev/')) app = 'dev';
|
||||||
if (url.pathname == '/auth' || url.pathname.startsWith('/auth/')) app = 'auth';
|
if (`${url.pathname}/`.startsWith('/auth/')) app = 'auth';
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
//#region Detect the user language
|
//#region Detect the user language
|
||||||
let lang = navigator.language.split('-')[0];
|
let lang = null;
|
||||||
|
|
||||||
// The default language is English
|
if (LANGS.includes(navigator.language)) {
|
||||||
if (!LANGS.includes(lang)) lang = 'en';
|
lang = navigator.language;
|
||||||
|
} else {
|
||||||
|
lang = LANGS.find(x => x.split('-')[0] == navigator.language);
|
||||||
|
|
||||||
|
if (lang == null) {
|
||||||
|
// Fallback
|
||||||
|
lang = 'en-US';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (settings) {
|
if (settings) {
|
||||||
if (settings.device.lang) lang = settings.device.lang;
|
if (settings.device.lang) lang = settings.device.lang;
|
||||||
@ -104,7 +112,7 @@
|
|||||||
// グローバルにタイマーIDを代入しておく
|
// グローバルにタイマーIDを代入しておく
|
||||||
window.mkBootTimer = window.setTimeout(async () => {
|
window.mkBootTimer = window.setTimeout(async () => {
|
||||||
// Fetch meta
|
// Fetch meta
|
||||||
const res = await fetch(API + '/meta', {
|
const res = await fetch('/api/meta', {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
cache: 'no-cache'
|
cache: 'no-cache'
|
||||||
});
|
});
|
||||||
|
10
src/client/app/common/scripts/get-face.ts
Normal file
10
src/client/app/common/scripts/get-face.ts
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
const faces = [
|
||||||
|
'(=^・・^=)',
|
||||||
|
'v(\'ω\')v',
|
||||||
|
'🐡( \'-\' 🐡 )フグパンチ!!!!',
|
||||||
|
'🖕(´・_・`)🖕',
|
||||||
|
'(。>﹏<。)',
|
||||||
|
'(Δ・x・Δ)'
|
||||||
|
];
|
||||||
|
|
||||||
|
export default () => faces[Math.floor(Math.random() * faces.length)];
|
@ -1,9 +0,0 @@
|
|||||||
const kaos = [
|
|
||||||
'(=^・・^=)',
|
|
||||||
'v(\'ω\')v',
|
|
||||||
'🐡( \'-\' 🐡 )フグパンチ!!!!',
|
|
||||||
'🖕(´・_・`)🖕',
|
|
||||||
'(。>﹏<。)'
|
|
||||||
];
|
|
||||||
|
|
||||||
export default () => kaos[Math.floor(Math.random() * kaos.length)];
|
|
@ -18,11 +18,11 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="board">
|
<div class="board">
|
||||||
<div class="labels-x" v-if="this.$store.state.settings.reversiBoardLabels">
|
<div class="labels-x" v-if="this.$store.state.settings.games.reversi.showBoardLabels">
|
||||||
<span v-for="i in game.settings.map[0].length">{{ String.fromCharCode(64 + i) }}</span>
|
<span v-for="i in game.settings.map[0].length">{{ String.fromCharCode(64 + i) }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex">
|
<div class="flex">
|
||||||
<div class="labels-y" v-if="this.$store.state.settings.reversiBoardLabels">
|
<div class="labels-y" v-if="this.$store.state.settings.games.reversi.showBoardLabels">
|
||||||
<div v-for="i in game.settings.map.length">{{ i }}</div>
|
<div v-for="i in game.settings.map.length">{{ i }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="cells" :style="cellsStyle">
|
<div class="cells" :style="cellsStyle">
|
||||||
@ -30,15 +30,15 @@
|
|||||||
:class="{ empty: stone == null, none: o.map[i] == 'null', isEnded: game.isEnded, myTurn: !game.isEnded && isMyTurn, can: turnUser ? o.canPut(turnUser.id == blackUser.id, i) : null, prev: o.prevPos == i }"
|
:class="{ empty: stone == null, none: o.map[i] == 'null', isEnded: game.isEnded, myTurn: !game.isEnded && isMyTurn, can: turnUser ? o.canPut(turnUser.id == blackUser.id, i) : null, prev: o.prevPos == i }"
|
||||||
@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}`">
|
||||||
<img v-if="stone === true" :src="blackUser.avatarUrl" alt="">
|
<img v-if="stone === true" :src="blackUser.avatarUrl" alt="black" :class="{ contrast: $store.state.settings.games.reversi.useContrastStones }">
|
||||||
<img v-if="stone === false" :src="whiteUser.avatarUrl" alt="">
|
<img v-if="stone === false" :src="whiteUser.avatarUrl" alt="white" :class="{ contrast: $store.state.settings.games.reversi.useContrastStones }">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="labels-y" v-if="this.$store.state.settings.reversiBoardLabels">
|
<div class="labels-y" v-if="this.$store.state.settings.games.reversi.showBoardLabels">
|
||||||
<div v-for="i in game.settings.map.length">{{ i }}</div>
|
<div v-for="i in game.settings.map.length">{{ i }}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="labels-x" v-if="this.$store.state.settings.reversiBoardLabels">
|
<div class="labels-x" v-if="this.$store.state.settings.games.reversi.showBoardLabels">
|
||||||
<span v-for="i in game.settings.map[0].length">{{ String.fromCharCode(64 + i) }}</span>
|
<span v-for="i in game.settings.map[0].length">{{ String.fromCharCode(64 + i) }}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -421,6 +421,13 @@ root(isDark)
|
|||||||
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)
|
||||||
|
@ -32,6 +32,7 @@
|
|||||||
<mk-avatar class="avatar" :user="g.user2"/>
|
<mk-avatar class="avatar" :user="g.user2"/>
|
||||||
<span><b>{{ g.user1 | userName }}</b> vs <b>{{ g.user2 | userName }}</b></span>
|
<span><b>{{ g.user1 | userName }}</b> vs <b>{{ g.user2 | userName }}</b></span>
|
||||||
<span class="state">{{ g.isEnded ? '%i18n:@game-state.ended%' : '%i18n:@game-state.playing%' }}</span>
|
<span class="state">{{ g.isEnded ? '%i18n:@game-state.ended%' : '%i18n:@game-state.playing%' }}</span>
|
||||||
|
<mk-time :time="g.createdAt" />
|
||||||
</a>
|
</a>
|
||||||
</section>
|
</section>
|
||||||
<section v-if="games.length > 0">
|
<section v-if="games.length > 0">
|
||||||
@ -41,6 +42,7 @@
|
|||||||
<mk-avatar class="avatar" :user="g.user2"/>
|
<mk-avatar class="avatar" :user="g.user2"/>
|
||||||
<span><b>{{ g.user1 | userName }}</b> vs <b>{{ g.user2 | userName }}</b></span>
|
<span><b>{{ g.user1 | userName }}</b> vs <b>{{ g.user2 | userName }}</b></span>
|
||||||
<span class="state">{{ g.isEnded ? '%i18n:@game-state.ended%' : '%i18n:@game-state.playing%' }}</span>
|
<span class="state">{{ g.isEnded ? '%i18n:@game-state.ended%' : '%i18n:@game-state.playing%' }}</span>
|
||||||
|
<mk-time :time="g.createdAt" />
|
||||||
</a>
|
</a>
|
||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
<i>・</i>
|
<i>・</i>
|
||||||
<a :href="feedbackUrl" target="_blank">%i18n:@feedback%</a>
|
<a :href="feedbackUrl" target="_blank">%i18n:@feedback%</a>
|
||||||
<i>・</i>
|
<i>・</i>
|
||||||
<a :href="devUrl">%i18n:@develop%</a>
|
<a href="/dev">%i18n:@develop%</a>
|
||||||
<i>・</i>
|
<i>・</i>
|
||||||
<a href="https://twitter.com/misskey_xyz" target="_blank">Follow us on %fa:B twitter%</a>
|
<a href="https://twitter.com/misskey_xyz" target="_blank">Follow us on %fa:B twitter%</a>
|
||||||
</span>
|
</span>
|
||||||
@ -14,18 +14,21 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import { docsUrl, statsUrl, statusUrl, devUrl, repositoryUrl, feedbackUrl, lang } from '../../../config';
|
import { lang } from '../../../config';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
aboutUrl: `${docsUrl}/${lang}/about`,
|
aboutUrl: `/docs/${lang}/about`,
|
||||||
statsUrl,
|
repositoryUrl: 'https://github.com/syuilo/misskey',
|
||||||
statusUrl,
|
feedbackUrl: 'https://github.com/syuilo/misskey/issues/new'
|
||||||
devUrl,
|
|
||||||
repositoryUrl: repositoryUrl || `https://github.com/syuilo/misskey`,
|
|
||||||
feedbackUrl: feedbackUrl || `https://github.com/syuilo/misskey/issues/new`
|
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
(this as any).os.getMeta().then(meta => {
|
||||||
|
if (meta.repositoryUrl) this.repositoryUrl = meta.repositoryUrl;
|
||||||
|
if (meta.feedbackUrl) this.feedbackUrl = meta.feedbackUrl;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
@ -12,13 +12,13 @@
|
|||||||
</ui-input>
|
</ui-input>
|
||||||
<ui-input v-if="user && user.twoFactorEnabled" v-model="token" type="number" required/>
|
<ui-input v-if="user && user.twoFactorEnabled" v-model="token" type="number" required/>
|
||||||
<ui-button type="submit" :disabled="signing">{{ signing ? '%i18n:@signing-in%' : '%i18n:@signin%' }}</ui-button>
|
<ui-button type="submit" :disabled="signing">{{ signing ? '%i18n:@signing-in%' : '%i18n:@signin%' }}</ui-button>
|
||||||
<p style="margin: 8px 0;" v-if="twitterIntegration">%i18n:@or%<a :href="`${apiUrl}/signin/twitter`">%i18n:@signin-with-twitter%</a></p>
|
<p style="margin: 8px 0;">%i18n:@or% <a :href="`${apiUrl}/signin/twitter`">%i18n:@signin-with-twitter%</a></p>
|
||||||
</form>
|
</form>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import { apiUrl, host, twitterIntegration } from '../../../config';
|
import { apiUrl, host } from '../../../config';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
props: {
|
props: {
|
||||||
@ -36,8 +36,7 @@ export default Vue.extend({
|
|||||||
password: '',
|
password: '',
|
||||||
token: '',
|
token: '',
|
||||||
apiUrl,
|
apiUrl,
|
||||||
host,
|
host
|
||||||
twitterIntegration
|
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
@ -60,7 +59,7 @@ export default Vue.extend({
|
|||||||
}).then(() => {
|
}).then(() => {
|
||||||
location.reload();
|
location.reload();
|
||||||
}).catch(() => {
|
}).catch(() => {
|
||||||
alert('something happened');
|
alert('%i18n:@login-failed%');
|
||||||
this.signing = false;
|
this.signing = false;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,11 @@
|
|||||||
<template>
|
<template>
|
||||||
<form class="mk-signup" @submit.prevent="onSubmit" :autocomplete="Math.random()">
|
<form class="mk-signup" @submit.prevent="onSubmit" :autocomplete="Math.random()">
|
||||||
|
<template v-if="meta">
|
||||||
|
<ui-input v-if="meta.disableRegistration" v-model="invitationCode" type="text" :autocomplete="Math.random()" spellcheck="false" required>
|
||||||
|
<span>%i18n:@invitation-code%</span>
|
||||||
|
<span slot="prefix">%fa:id-card-alt%</span>
|
||||||
|
<p slot="text" v-html="'%i18n:@invitation-info%'.replace('{}', meta.maintainer.url)"></p>
|
||||||
|
</ui-input>
|
||||||
<ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]{1,20}$" :autocomplete="Math.random()" spellcheck="false" required @input="onChangeUsername">
|
<ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]{1,20}$" :autocomplete="Math.random()" spellcheck="false" required @input="onChangeUsername">
|
||||||
<span>%i18n:@username%</span>
|
<span>%i18n:@username%</span>
|
||||||
<span slot="prefix">@</span>
|
<span slot="prefix">@</span>
|
||||||
@ -29,15 +35,16 @@
|
|||||||
<p slot="text" v-if="passwordRetypeState == 'not-match'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@password-not-matched%</p>
|
<p slot="text" v-if="passwordRetypeState == 'not-match'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@password-not-matched%</p>
|
||||||
</div>
|
</div>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
<div v-if="recaptchaSitekey != null" class="g-recaptcha" :data-sitekey="recaptchaSitekey" style="margin: 16px 0;"></div>
|
<div v-if="meta.recaptchaSitekey != null" class="g-recaptcha" :data-sitekey="meta.recaptchaSitekey" style="margin: 16px 0;"></div>
|
||||||
<ui-button type="submit">%i18n:@create%</ui-button>
|
<ui-button type="submit">%i18n:@create%</ui-button>
|
||||||
|
</template>
|
||||||
</form>
|
</form>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
const getPasswordStrength = require('syuilo-password-strength');
|
const getPasswordStrength = require('syuilo-password-strength');
|
||||||
import { host, url, recaptchaSitekey } from '../../../config';
|
import { host, url } from '../../../config';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
data() {
|
data() {
|
||||||
@ -46,11 +53,12 @@ export default Vue.extend({
|
|||||||
username: '',
|
username: '',
|
||||||
password: '',
|
password: '',
|
||||||
retypedPassword: '',
|
retypedPassword: '',
|
||||||
|
invitationCode: '',
|
||||||
url,
|
url,
|
||||||
recaptchaSitekey,
|
|
||||||
usernameState: null,
|
usernameState: null,
|
||||||
passwordStrength: '',
|
passwordStrength: '',
|
||||||
passwordRetypeState: null
|
passwordRetypeState: null,
|
||||||
|
meta: null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
@ -61,6 +69,17 @@ export default Vue.extend({
|
|||||||
this.usernameState != 'max-range');
|
this.usernameState != 'max-range');
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
created() {
|
||||||
|
(this as any).os.getMeta().then(meta => {
|
||||||
|
this.meta = meta;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
const head = document.getElementsByTagName('head')[0];
|
||||||
|
const script = document.createElement('script');
|
||||||
|
script.setAttribute('src', 'https://www.google.com/recaptcha/api.js');
|
||||||
|
head.appendChild(script);
|
||||||
|
},
|
||||||
methods: {
|
methods: {
|
||||||
onChangeUsername() {
|
onChangeUsername() {
|
||||||
if (this.username == '') {
|
if (this.username == '') {
|
||||||
@ -110,7 +129,8 @@ export default Vue.extend({
|
|||||||
(this as any).api('signup', {
|
(this as any).api('signup', {
|
||||||
username: this.username,
|
username: this.username,
|
||||||
password: this.password,
|
password: this.password,
|
||||||
'g-recaptcha-response': recaptchaSitekey != null ? (window as any).grecaptcha.getResponse() : null
|
invitationCode: this.invitationCode,
|
||||||
|
'g-recaptcha-response': this.meta.recaptchaSitekey != null ? (window as any).grecaptcha.getResponse() : null
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
(this as any).api('signin', {
|
(this as any).api('signin', {
|
||||||
username: this.username,
|
username: this.username,
|
||||||
@ -121,19 +141,11 @@ export default Vue.extend({
|
|||||||
}).catch(() => {
|
}).catch(() => {
|
||||||
alert('%i18n:@some-error%');
|
alert('%i18n:@some-error%');
|
||||||
|
|
||||||
if (recaptchaSitekey != null) {
|
if (this.meta.recaptchaSitekey != null) {
|
||||||
(window as any).grecaptcha.reset();
|
(window as any).grecaptcha.reset();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
},
|
|
||||||
mounted() {
|
|
||||||
if (recaptchaSitekey != null) {
|
|
||||||
const head = document.getElementsByTagName('head')[0];
|
|
||||||
const script = document.createElement('script');
|
|
||||||
script.setAttribute('src', 'https://www.google.com/recaptcha/api.js');
|
|
||||||
head.appendChild(script);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<iframe v-if="player" :src="player" heigth="250" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen />
|
<div v-if="player.url" class="player" :style="`padding: ${(player.height || 0) / (player.width || 1) * 100}% 0 0`">
|
||||||
|
<iframe :src="player.url" :width="player.width || '100%'" :heigth="player.height || 250" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen />
|
||||||
|
</div>
|
||||||
<div v-else-if="tweetUrl && detail" class="twitter">
|
<div v-else-if="tweetUrl && detail" class="twitter">
|
||||||
<blockquote ref="tweet" class="twitter-tweet" :data-theme="$store.state.device.darkmode ? 'dark' : null">
|
<blockquote ref="tweet" class="twitter-tweet" :data-theme="$store.state.device.darkmode ? 'dark' : null">
|
||||||
<a :href="url"></a>
|
<a :href="url"></a>
|
||||||
@ -46,7 +48,11 @@ export default Vue.extend({
|
|||||||
thumbnail: null,
|
thumbnail: null,
|
||||||
icon: null,
|
icon: null,
|
||||||
sitename: null,
|
sitename: null,
|
||||||
player: null,
|
player: {
|
||||||
|
url: null,
|
||||||
|
width: null,
|
||||||
|
height: null
|
||||||
|
},
|
||||||
tweetUrl: null,
|
tweetUrl: null,
|
||||||
misskeyUrl
|
misskeyUrl
|
||||||
};
|
};
|
||||||
@ -170,7 +176,15 @@ export default Vue.extend({
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="stylus" scoped>
|
<style lang="stylus" scoped>
|
||||||
iframe
|
.player
|
||||||
|
position relative
|
||||||
|
width 100%
|
||||||
|
|
||||||
|
> iframe
|
||||||
|
height 100%
|
||||||
|
left 0
|
||||||
|
position absolute
|
||||||
|
top 0
|
||||||
width 100%
|
width 100%
|
||||||
|
|
||||||
root(isDark)
|
root(isDark)
|
||||||
|
@ -44,7 +44,12 @@ import Vue from 'vue';
|
|||||||
import * as anime from 'animejs';
|
import * as anime from 'animejs';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
props: ['source', 'compact', 'v'],
|
props: ['source', 'compact'],
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
v: this.$store.state.device.visibility || 'public'
|
||||||
|
}
|
||||||
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
const popover = this.$refs.popover as any;
|
const popover = this.$refs.popover as any;
|
||||||
@ -92,6 +97,7 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
choose(visibility) {
|
choose(visibility) {
|
||||||
|
this.$store.commit('device/setVisibility', visibility);
|
||||||
this.$emit('chosen', visibility);
|
this.$emit('chosen', visibility);
|
||||||
this.$destroy();
|
this.$destroy();
|
||||||
},
|
},
|
||||||
|
@ -122,7 +122,7 @@ export default Vue.extend({
|
|||||||
this.memP = (stats.mem.used / stats.mem.total * 100).toFixed(0);
|
this.memP = (stats.mem.used / stats.mem.total * 100).toFixed(0);
|
||||||
},
|
},
|
||||||
onStatsLog(statsLog) {
|
onStatsLog(statsLog) {
|
||||||
statsLog.forEach(stats => this.onStats(stats));
|
statsLog.reverse().forEach(stats => this.onStats(stats));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -1,51 +1,20 @@
|
|||||||
declare const _HOST_: string;
|
|
||||||
declare const _HOSTNAME_: string;
|
|
||||||
declare const _URL_: string;
|
|
||||||
declare const _NAME_: string;
|
|
||||||
declare const _DESCRIPTION_: string;
|
|
||||||
declare const _API_URL_: string;
|
|
||||||
declare const _WS_URL_: string;
|
|
||||||
declare const _DOCS_URL_: string;
|
|
||||||
declare const _STATS_URL_: string;
|
|
||||||
declare const _STATUS_URL_: string;
|
|
||||||
declare const _DEV_URL_: string;
|
|
||||||
declare const _REPOSITORY_URL_: string;
|
|
||||||
declare const _FEEDBACK_URL_: string;
|
|
||||||
declare const _LANG_: string;
|
declare const _LANG_: string;
|
||||||
declare const _LANGS_: string;
|
declare const _LANGS_: string;
|
||||||
declare const _RECAPTCHA_SITEKEY_: string;
|
|
||||||
declare const _SW_PUBLICKEY_: string;
|
|
||||||
declare const _THEME_COLOR_: string;
|
declare const _THEME_COLOR_: string;
|
||||||
declare const _COPYRIGHT_: string;
|
declare const _COPYRIGHT_: string;
|
||||||
declare const _VERSION_: string;
|
declare const _VERSION_: string;
|
||||||
declare const _CODENAME_: string;
|
declare const _CODENAME_: string;
|
||||||
declare const _LICENSE_: string;
|
|
||||||
declare const _GOOGLE_MAPS_API_KEY_: string;
|
|
||||||
declare const _WELCOME_BG_URL_: string;
|
|
||||||
declare const _TWITTER_INTEGRATION_: boolean;
|
|
||||||
|
|
||||||
export const host = _HOST_;
|
const address = new URL(location.href);
|
||||||
export const hostname = _HOSTNAME_;
|
|
||||||
export const url = _URL_;
|
export const host = address.host;
|
||||||
export const name = _NAME_;
|
export const hostname = address.hostname;
|
||||||
export const description = _DESCRIPTION_;
|
export const url = address.origin;
|
||||||
export const apiUrl = _API_URL_;
|
export const apiUrl = url + '/api';
|
||||||
export const wsUrl = _WS_URL_;
|
export const wsUrl = url.replace('http://', 'ws://').replace('https://', 'wss://');
|
||||||
export const docsUrl = _DOCS_URL_;
|
|
||||||
export const statsUrl = _STATS_URL_;
|
|
||||||
export const statusUrl = _STATUS_URL_;
|
|
||||||
export const devUrl = _DEV_URL_;
|
|
||||||
export const repositoryUrl = _REPOSITORY_URL_;
|
|
||||||
export const feedbackUrl = _FEEDBACK_URL_;
|
|
||||||
export const lang = _LANG_;
|
export const lang = _LANG_;
|
||||||
export const langs = _LANGS_;
|
export const langs = _LANGS_;
|
||||||
export const recaptchaSitekey = _RECAPTCHA_SITEKEY_;
|
|
||||||
export const swPublickey = _SW_PUBLICKEY_;
|
|
||||||
export const themeColor = _THEME_COLOR_;
|
export const themeColor = _THEME_COLOR_;
|
||||||
export const copyright = _COPYRIGHT_;
|
export const copyright = _COPYRIGHT_;
|
||||||
export const version = _VERSION_;
|
export const version = _VERSION_;
|
||||||
export const codename = _CODENAME_;
|
export const codename = _CODENAME_;
|
||||||
export const license = _LICENSE_;
|
|
||||||
export const googleMapsApiKey = _GOOGLE_MAPS_API_KEY_;
|
|
||||||
export const welcomeBgUrl = _WELCOME_BG_URL_;
|
|
||||||
export const twitterIntegration = _TWITTER_INTEGRATION_;
|
|
||||||
|
@ -9,12 +9,18 @@
|
|||||||
@contextmenu.prevent.stop="onContextmenu"
|
@contextmenu.prevent.stop="onContextmenu"
|
||||||
:title="title"
|
:title="title"
|
||||||
>
|
>
|
||||||
<div class="label" v-if="$store.state.i.avatarId == file.id"><img src="/assets/label.svg"/>
|
<div class="label" v-if="$store.state.i.avatarId == file.id">
|
||||||
|
<img src="/assets/label.svg"/>
|
||||||
<p>%i18n:@avatar%</p>
|
<p>%i18n:@avatar%</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="label" v-if="$store.state.i.bannerId == file.id"><img src="/assets/label.svg"/>
|
<div class="label" v-if="$store.state.i.bannerId == file.id">
|
||||||
|
<img src="/assets/label.svg"/>
|
||||||
<p>%i18n:@banner%</p>
|
<p>%i18n:@banner%</p>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="label red" v-if="file.isSensitive">
|
||||||
|
<img src="/assets/label-red.svg"/>
|
||||||
|
<p>%i18n:@nsfw%</p>
|
||||||
|
</div>
|
||||||
<div class="thumbnail" ref="thumbnail" :style="`background-color: ${ background }`">
|
<div class="thumbnail" ref="thumbnail" :style="`background-color: ${ background }`">
|
||||||
<img :src="file.thumbnailUrl" alt="" @load="onThumbnailLoaded"/>
|
<img :src="file.thumbnailUrl" alt="" @load="onThumbnailLoaded"/>
|
||||||
</div>
|
</div>
|
||||||
@ -212,6 +218,11 @@ root(isDark)
|
|||||||
&:after
|
&:after
|
||||||
background #0b65a5
|
background #0b65a5
|
||||||
|
|
||||||
|
&.red
|
||||||
|
&:before
|
||||||
|
&:after
|
||||||
|
background #c12113
|
||||||
|
|
||||||
&:active
|
&:active
|
||||||
background rgba(#000, 0.1)
|
background rgba(#000, 0.1)
|
||||||
|
|
||||||
@ -220,6 +231,11 @@ root(isDark)
|
|||||||
&:after
|
&:after
|
||||||
background #0b588c
|
background #0b588c
|
||||||
|
|
||||||
|
&.red
|
||||||
|
&:before
|
||||||
|
&:after
|
||||||
|
background #ce2212
|
||||||
|
|
||||||
&[data-is-selected]
|
&[data-is-selected]
|
||||||
background $theme-color
|
background $theme-color
|
||||||
|
|
||||||
@ -256,26 +272,29 @@ root(isDark)
|
|||||||
pointer-events none
|
pointer-events none
|
||||||
|
|
||||||
&:before
|
&:before
|
||||||
content ""
|
|
||||||
display block
|
|
||||||
position absolute
|
|
||||||
z-index 1
|
|
||||||
top 0
|
|
||||||
left 57px
|
|
||||||
width 28px
|
|
||||||
height 8px
|
|
||||||
background #0c7ac9
|
|
||||||
|
|
||||||
&:after
|
&:after
|
||||||
content ""
|
content ""
|
||||||
display block
|
display block
|
||||||
position absolute
|
position absolute
|
||||||
z-index 1
|
z-index 1
|
||||||
|
background #0c7ac9
|
||||||
|
|
||||||
|
&:before
|
||||||
|
top 0
|
||||||
|
left 57px
|
||||||
|
width 28px
|
||||||
|
height 8px
|
||||||
|
|
||||||
|
&:after
|
||||||
top 57px
|
top 57px
|
||||||
left 0
|
left 0
|
||||||
width 8px
|
width 8px
|
||||||
height 28px
|
height 28px
|
||||||
background #0c7ac9
|
|
||||||
|
&.red
|
||||||
|
&:before
|
||||||
|
&:after
|
||||||
|
background #c12113
|
||||||
|
|
||||||
> img
|
> img
|
||||||
position absolute
|
position absolute
|
||||||
|
@ -55,15 +55,15 @@
|
|||||||
</div>
|
</div>
|
||||||
<footer>
|
<footer>
|
||||||
<mk-reactions-viewer :note="p"/>
|
<mk-reactions-viewer :note="p"/>
|
||||||
<button @click="reply" title="">
|
<button class="replyButton" @click="reply" title="">
|
||||||
<template v-if="p.reply">%fa:reply-all%</template>
|
<template v-if="p.reply">%fa:reply-all%</template>
|
||||||
<template v-else>%fa:reply%</template>
|
<template v-else>%fa:reply%</template>
|
||||||
<p class="count" v-if="p.repliesCount > 0">{{ p.repliesCount }}</p>
|
<p class="count" v-if="p.repliesCount > 0">{{ p.repliesCount }}</p>
|
||||||
</button>
|
</button>
|
||||||
<button @click="renote" title="%i18n:@renote%">
|
<button class="renoteButton" @click="renote" title="%i18n:@renote%">
|
||||||
%fa:retweet%<p class="count" v-if="p.renoteCount > 0">{{ p.renoteCount }}</p>
|
%fa:retweet%<p class="count" v-if="p.renoteCount > 0">{{ p.renoteCount }}</p>
|
||||||
</button>
|
</button>
|
||||||
<button :class="{ reacted: p.myReaction != null }" @click="react" ref="reactButton" title="%i18n:@add-reaction%">
|
<button class="reactionButton" :class="{ reacted: p.myReaction != null }" @click="react" ref="reactButton" title="%i18n:@add-reaction%">
|
||||||
%fa:plus%<p class="count" v-if="p.reactions_count > 0">{{ p.reactions_count }}</p>
|
%fa:plus%<p class="count" v-if="p.reactions_count > 0">{{ p.reactions_count }}</p>
|
||||||
</button>
|
</button>
|
||||||
<button @click="menu" ref="menuButton">
|
<button @click="menu" ref="menuButton">
|
||||||
@ -372,15 +372,24 @@ root(isDark)
|
|||||||
cursor pointer
|
cursor pointer
|
||||||
|
|
||||||
&:hover
|
&:hover
|
||||||
color isDark ? #9198af : #666
|
color isDark ? #a1a8bf : #444
|
||||||
|
|
||||||
|
&.replyButton:hover
|
||||||
|
color #0af
|
||||||
|
|
||||||
|
&.renoteButton:hover
|
||||||
|
color #8d0
|
||||||
|
|
||||||
|
&.reactionButton:hover
|
||||||
|
color #fa0
|
||||||
|
|
||||||
> .count
|
> .count
|
||||||
display inline
|
display inline
|
||||||
margin 0 0 0 8px
|
margin 0 0 0 8px
|
||||||
color #999
|
color #999
|
||||||
|
|
||||||
&.reacted
|
&.reacted, &.reacted:hover
|
||||||
color $theme-color
|
color #fa0
|
||||||
|
|
||||||
> .replies
|
> .replies
|
||||||
> *
|
> *
|
||||||
|
@ -42,15 +42,15 @@
|
|||||||
</div>
|
</div>
|
||||||
<footer>
|
<footer>
|
||||||
<mk-reactions-viewer :note="p" ref="reactionsViewer"/>
|
<mk-reactions-viewer :note="p" ref="reactionsViewer"/>
|
||||||
<button @click="reply" title="%i18n:@reply%">
|
<button class="replyButton" @click="reply" title="%i18n:@reply%">
|
||||||
<template v-if="p.reply">%fa:reply-all%</template>
|
<template v-if="p.reply">%fa:reply-all%</template>
|
||||||
<template v-else>%fa:reply%</template>
|
<template v-else>%fa:reply%</template>
|
||||||
<p class="count" v-if="p.repliesCount > 0">{{ p.repliesCount }}</p>
|
<p class="count" v-if="p.repliesCount > 0">{{ p.repliesCount }}</p>
|
||||||
</button>
|
</button>
|
||||||
<button @click="renote" title="%i18n:@renote%">
|
<button class="renoteButton" @click="renote" title="%i18n:@renote%">
|
||||||
%fa:retweet%<p class="count" v-if="p.renoteCount > 0">{{ p.renoteCount }}</p>
|
%fa:retweet%<p class="count" v-if="p.renoteCount > 0">{{ p.renoteCount }}</p>
|
||||||
</button>
|
</button>
|
||||||
<button :class="{ reacted: p.myReaction != null }" @click="react" ref="reactButton" title="%i18n:@add-reaction%">
|
<button class="reactionButton" :class="{ reacted: p.myReaction != null }" @click="react" ref="reactButton" title="%i18n:@add-reaction%">
|
||||||
%fa:plus%<p class="count" v-if="p.reactions_count > 0">{{ p.reactions_count }}</p>
|
%fa:plus%<p class="count" v-if="p.reactions_count > 0">{{ p.reactions_count }}</p>
|
||||||
</button>
|
</button>
|
||||||
<button @click="menu" ref="menuButton">
|
<button @click="menu" ref="menuButton">
|
||||||
@ -487,20 +487,24 @@ root(isDark)
|
|||||||
cursor pointer
|
cursor pointer
|
||||||
|
|
||||||
&:hover
|
&:hover
|
||||||
color isDark ? #9198af : #666
|
color isDark ? #a1a8bf : #444
|
||||||
|
|
||||||
|
&.replyButton:hover
|
||||||
|
color #0af
|
||||||
|
|
||||||
|
&.renoteButton:hover
|
||||||
|
color #8d0
|
||||||
|
|
||||||
|
&.reactionButton:hover
|
||||||
|
color #fa0
|
||||||
|
|
||||||
> .count
|
> .count
|
||||||
display inline
|
display inline
|
||||||
margin 0 0 0 8px
|
margin 0 0 0 8px
|
||||||
color #999
|
color #999
|
||||||
|
|
||||||
&.reacted
|
&.reacted, &.reacted:hover
|
||||||
color $theme-color
|
color #fa0
|
||||||
|
|
||||||
&:last-child
|
|
||||||
position absolute
|
|
||||||
right 0
|
|
||||||
margin 0
|
|
||||||
|
|
||||||
> .detail
|
> .detail
|
||||||
padding-top 4px
|
padding-top 4px
|
||||||
|
@ -135,6 +135,12 @@ export default Vue.extend({
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this.$store.state.settings.showLocalRenotes === false) {
|
||||||
|
if (isPureRenote && (note.renote.user.host == null)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
// 投稿が自分のものではないかつ、タブが非表示またはスクロール位置が最上部ではないならタイトルで通知
|
// 投稿が自分のものではないかつ、タブが非表示またはスクロール位置が最上部ではないならタイトルで通知
|
||||||
@ -187,7 +193,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
clearNotification() {
|
clearNotification() {
|
||||||
this.unreadCount = 0;
|
this.unreadCount = 0;
|
||||||
document.title = config.name;
|
document.title = (this as any).os.instanceName;
|
||||||
},
|
},
|
||||||
|
|
||||||
onVisibilitychange() {
|
onVisibilitychange() {
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
<span v-for="u in visibleUsers">{{ u | userName }}<a @click="removeVisibleUser(u)">[x]</a></span>
|
<span v-for="u in visibleUsers">{{ u | userName }}<a @click="removeVisibleUser(u)">[x]</a></span>
|
||||||
<a @click="addVisibleUser">%i18n:@add-visible-user%</a>
|
<a @click="addVisibleUser">%i18n:@add-visible-user%</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="hashtags" v-if="recentHashtags.length > 0">
|
<div class="hashtags" v-if="recentHashtags.length > 0 && $store.state.settings.suggestRecentHashtags">
|
||||||
<b>%i18n:@recent-tags%:</b>
|
<b>%i18n:@recent-tags%:</b>
|
||||||
<a v-for="tag in recentHashtags.slice(0, 5)" @click="addTag(tag)" title="%@click-to-tagging%">#{{ tag }}</a>
|
<a v-for="tag in recentHashtags.slice(0, 5)" @click="addTag(tag)" title="%@click-to-tagging%">#{{ tag }}</a>
|
||||||
</div>
|
</div>
|
||||||
@ -23,7 +23,7 @@
|
|||||||
<div class="medias" :class="{ with: poll }" v-show="files.length != 0">
|
<div class="medias" :class="{ with: poll }" v-show="files.length != 0">
|
||||||
<x-draggable :list="files" :options="{ animation: 150 }">
|
<x-draggable :list="files" :options="{ animation: 150 }">
|
||||||
<div v-for="file in files" :key="file.id">
|
<div v-for="file in files" :key="file.id">
|
||||||
<div class="img" :style="{ backgroundImage: `url(${file.url})` }" :title="file.name"></div>
|
<div class="img" :style="{ backgroundImage: `url(${file.thumbnailUrl})` }" :title="file.name"></div>
|
||||||
<img class="remove" @click="detachMedia(file.id)" src="/assets/desktop/remove.png" title="%i18n:@attach-cancel%" alt=""/>
|
<img class="remove" @click="detachMedia(file.id)" src="/assets/desktop/remove.png" title="%i18n:@attach-cancel%" alt=""/>
|
||||||
</div>
|
</div>
|
||||||
</x-draggable>
|
</x-draggable>
|
||||||
@ -58,7 +58,7 @@
|
|||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import insertTextAtCursor from 'insert-text-at-cursor';
|
import insertTextAtCursor from 'insert-text-at-cursor';
|
||||||
import * as XDraggable from 'vuedraggable';
|
import * as XDraggable from 'vuedraggable';
|
||||||
import getKao from '../../../common/scripts/get-kao';
|
import getFace from '../../../common/scripts/get-face';
|
||||||
import MkVisibilityChooser from '../../../common/views/components/visibility-chooser.vue';
|
import MkVisibilityChooser from '../../../common/views/components/visibility-chooser.vue';
|
||||||
import parse from '../../../../../mfm/parse';
|
import parse from '../../../../../mfm/parse';
|
||||||
import { host } from '../../../config';
|
import { host } from '../../../config';
|
||||||
@ -99,7 +99,7 @@ export default Vue.extend({
|
|||||||
useCw: false,
|
useCw: false,
|
||||||
cw: null,
|
cw: null,
|
||||||
geo: null,
|
geo: null,
|
||||||
visibility: 'public',
|
visibility: this.$store.state.device.visibility || 'public',
|
||||||
visibleUsers: [],
|
visibleUsers: [],
|
||||||
autocomplete: null,
|
autocomplete: null,
|
||||||
draghover: false,
|
draghover: false,
|
||||||
@ -326,8 +326,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
setVisibility() {
|
setVisibility() {
|
||||||
const w = (this as any).os.new(MkVisibilityChooser, {
|
const w = (this as any).os.new(MkVisibilityChooser, {
|
||||||
source: this.$refs.visibilityButton,
|
source: this.$refs.visibilityButton
|
||||||
v: this.visibility
|
|
||||||
});
|
});
|
||||||
w.$once('chosen', v => {
|
w.$once('chosen', v => {
|
||||||
this.visibility = v;
|
this.visibility = v;
|
||||||
@ -422,7 +421,7 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
kao() {
|
kao() {
|
||||||
this.text += getKao();
|
this.text += getFace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -48,14 +48,17 @@
|
|||||||
<mk-switch v-model="$store.state.settings.iLikeSushi" @change="onChangeILikeSushi" text="%i18n:common.i-like-sushi%"/>
|
<mk-switch v-model="$store.state.settings.iLikeSushi" @change="onChangeILikeSushi" text="%i18n:common.i-like-sushi%"/>
|
||||||
</div>
|
</div>
|
||||||
<mk-switch v-model="$store.state.settings.showPostFormOnTopOfTl" @change="onChangeShowPostFormOnTopOfTl" text="%i18n:@post-form-on-timeline%"/>
|
<mk-switch v-model="$store.state.settings.showPostFormOnTopOfTl" @change="onChangeShowPostFormOnTopOfTl" text="%i18n:@post-form-on-timeline%"/>
|
||||||
|
<mk-switch v-model="$store.state.settings.suggestRecentHashtags" @change="onChangeSuggestRecentHashtags" text="%i18n:@suggest-recent-hashtags%"/>
|
||||||
<mk-switch v-model="$store.state.settings.showReplyTarget" @change="onChangeShowReplyTarget" text="%i18n:@show-reply-target%"/>
|
<mk-switch v-model="$store.state.settings.showReplyTarget" @change="onChangeShowReplyTarget" text="%i18n:@show-reply-target%"/>
|
||||||
<mk-switch v-model="$store.state.settings.showMyRenotes" @change="onChangeShowMyRenotes" text="%i18n:@show-my-renotes%"/>
|
<mk-switch v-model="$store.state.settings.showMyRenotes" @change="onChangeShowMyRenotes" text="%i18n:@show-my-renotes%"/>
|
||||||
<mk-switch v-model="$store.state.settings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes" text="%i18n:@show-renoted-my-notes%"/>
|
<mk-switch v-model="$store.state.settings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes" text="%i18n:@show-renoted-my-notes%"/>
|
||||||
|
<mk-switch v-model="$store.state.settings.showLocalRenotes" @change="onChangeShowLocalRenotes" text="%i18n:@show-local-renotes%"/>
|
||||||
<mk-switch v-model="$store.state.settings.showMaps" @change="onChangeShowMaps" text="%i18n:@show-maps%">
|
<mk-switch v-model="$store.state.settings.showMaps" @change="onChangeShowMaps" text="%i18n:@show-maps%">
|
||||||
<span>%i18n:@show-maps-desc%</span>
|
<span>%i18n:@show-maps-desc%</span>
|
||||||
</mk-switch>
|
</mk-switch>
|
||||||
<mk-switch v-model="$store.state.settings.reversiBoardLabels" @change="onChangeReversiBoardLabels" text="%i18n:common.show-reversi-board-labels%"/>
|
|
||||||
<mk-switch v-model="$store.state.settings.disableAnimatedMfm" @change="onChangeDisableAnimatedMfm" text="%i18n:common.disable-animated-mfm%"/>
|
<mk-switch v-model="$store.state.settings.disableAnimatedMfm" @change="onChangeDisableAnimatedMfm" text="%i18n:common.disable-animated-mfm%"/>
|
||||||
|
<mk-switch v-model="$store.state.settings.games.reversi.showBoardLabels" @change="onChangeReversiBoardLabels" text="%i18n:common.show-reversi-board-labels%"/>
|
||||||
|
<mk-switch v-model="$store.state.settings.games.reversi.useContrastStones" @change="onChangeUseContrastReversiStones" text="%i18n:common.use-contrast-reversi-stones%"/>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section class="web" v-show="page == 'web'">
|
<section class="web" v-show="page == 'web'">
|
||||||
@ -189,12 +192,6 @@
|
|||||||
<button class="ui button block" @click="taskmngr">%i18n:@task-manager%</button>
|
<button class="ui button block" @click="taskmngr">%i18n:@task-manager%</button>
|
||||||
</details>
|
</details>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section class="other" v-show="page == 'other'">
|
|
||||||
<h1>%i18n:@license%</h1>
|
|
||||||
<div v-html="license"></div>
|
|
||||||
<a :href="licenseUrl" target="_blank">%i18n:@third-parties%</a>
|
|
||||||
</section>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@ -209,7 +206,7 @@ import XApi from './settings.api.vue';
|
|||||||
import XApps from './settings.apps.vue';
|
import XApps from './settings.apps.vue';
|
||||||
import XSignins from './settings.signins.vue';
|
import XSignins from './settings.signins.vue';
|
||||||
import XDrive from './settings.drive.vue';
|
import XDrive from './settings.drive.vue';
|
||||||
import { url, docsUrl, license, lang, langs, version } from '../../../config';
|
import { url, langs, version } from '../../../config';
|
||||||
import checkForUpdate from '../../../common/scripts/check-for-update';
|
import checkForUpdate from '../../../common/scripts/check-for-update';
|
||||||
import MkTaskManager from './taskmanager.vue';
|
import MkTaskManager from './taskmanager.vue';
|
||||||
|
|
||||||
@ -228,7 +225,6 @@ export default Vue.extend({
|
|||||||
return {
|
return {
|
||||||
page: 'profile',
|
page: 'profile',
|
||||||
meta: null,
|
meta: null,
|
||||||
license,
|
|
||||||
version,
|
version,
|
||||||
langs,
|
langs,
|
||||||
latestVersion: undefined,
|
latestVersion: undefined,
|
||||||
@ -236,10 +232,6 @@ export default Vue.extend({
|
|||||||
};
|
};
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
licenseUrl(): string {
|
|
||||||
return `${docsUrl}/${lang}/license`;
|
|
||||||
},
|
|
||||||
|
|
||||||
apiViaStream: {
|
apiViaStream: {
|
||||||
get() { return this.$store.state.device.apiViaStream; },
|
get() { return this.$store.state.device.apiViaStream; },
|
||||||
set(value) { this.$store.commit('device/set', { key: 'apiViaStream', value }); }
|
set(value) { this.$store.commit('device/set', { key: 'apiViaStream', value }); }
|
||||||
@ -335,6 +327,12 @@ export default Vue.extend({
|
|||||||
value: v
|
value: v
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
onChangeSuggestRecentHashtags(v) {
|
||||||
|
this.$store.dispatch('settings/set', {
|
||||||
|
key: 'suggestRecentHashtags',
|
||||||
|
value: v
|
||||||
|
});
|
||||||
|
},
|
||||||
onChangeShowReplyTarget(v) {
|
onChangeShowReplyTarget(v) {
|
||||||
this.$store.dispatch('settings/set', {
|
this.$store.dispatch('settings/set', {
|
||||||
key: 'showReplyTarget',
|
key: 'showReplyTarget',
|
||||||
@ -353,6 +351,12 @@ export default Vue.extend({
|
|||||||
value: v
|
value: v
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
onChangeShowLocalRenotes(v) {
|
||||||
|
this.$store.dispatch('settings/set', {
|
||||||
|
key: 'showLocalRenotes',
|
||||||
|
value: v
|
||||||
|
});
|
||||||
|
},
|
||||||
onChangeShowMaps(v) {
|
onChangeShowMaps(v) {
|
||||||
this.$store.dispatch('settings/set', {
|
this.$store.dispatch('settings/set', {
|
||||||
key: 'showMaps',
|
key: 'showMaps',
|
||||||
@ -373,7 +377,13 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
onChangeReversiBoardLabels(v) {
|
onChangeReversiBoardLabels(v) {
|
||||||
this.$store.dispatch('settings/set', {
|
this.$store.dispatch('settings/set', {
|
||||||
key: 'reversiBoardLabels',
|
key: 'games.reversi.showBoardLabels',
|
||||||
|
value: v
|
||||||
|
});
|
||||||
|
},
|
||||||
|
onChangeUseContrastReversiStones(v) {
|
||||||
|
this.$store.dispatch('settings/set', {
|
||||||
|
key: 'games.reversi.useContrastStones',
|
||||||
value: v
|
value: v
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
@ -100,7 +100,8 @@ export default Vue.extend({
|
|||||||
limit: fetchLimit + 1,
|
limit: fetchLimit + 1,
|
||||||
untilDate: this.date ? this.date.getTime() : undefined,
|
untilDate: this.date ? this.date.getTime() : undefined,
|
||||||
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
||||||
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
|
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
|
||||||
|
includeLocalRenotes: this.$store.state.settings.showLocalRenotes
|
||||||
}).then(notes => {
|
}).then(notes => {
|
||||||
if (notes.length == fetchLimit + 1) {
|
if (notes.length == fetchLimit + 1) {
|
||||||
notes.pop();
|
notes.pop();
|
||||||
@ -122,7 +123,8 @@ export default Vue.extend({
|
|||||||
limit: fetchLimit + 1,
|
limit: fetchLimit + 1,
|
||||||
untilId: (this.$refs.timeline as any).tail().id,
|
untilId: (this.$refs.timeline as any).tail().id,
|
||||||
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
||||||
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
|
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
|
||||||
|
includeLocalRenotes: this.$store.state.settings.showLocalRenotes
|
||||||
});
|
});
|
||||||
|
|
||||||
promise.then(notes => {
|
promise.then(notes => {
|
||||||
|
@ -30,10 +30,8 @@
|
|||||||
<li @click="settings">
|
<li @click="settings">
|
||||||
<p>%fa:cog%<span>%i18n:@settings%</span>%fa:angle-right%</p>
|
<p>%fa:cog%<span>%i18n:@settings%</span>%fa:angle-right%</p>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
<li v-if="$store.state.i.isAdmin">
|
||||||
<ul>
|
<router-link to="/admin">%fa:terminal%<span>%i18n:@admin%</span>%fa:angle-right%</router-link>
|
||||||
<li @click="signout">
|
|
||||||
<p class="signout">%fa:power-off%<span>%i18n:@signout%</span></p>
|
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<ul>
|
<ul>
|
||||||
@ -41,6 +39,11 @@
|
|||||||
<p><span>%i18n:@dark%</span><template v-if="$store.state.device.darkmode">%fa:moon%</template><template v-else>%fa:R moon%</template></p>
|
<p><span>%i18n:@dark%</span><template v-if="$store.state.device.darkmode">%fa:moon%</template><template v-else>%fa:R moon%</template></p>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
<ul>
|
||||||
|
<li @click="signout">
|
||||||
|
<p class="signout">%fa:power-off%<span>%i18n:@signout%</span></p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</transition>
|
</transition>
|
||||||
</div>
|
</div>
|
||||||
|
@ -47,7 +47,8 @@ export default Vue.extend({
|
|||||||
listId: this.list.id,
|
listId: this.list.id,
|
||||||
limit: fetchLimit + 1,
|
limit: fetchLimit + 1,
|
||||||
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
||||||
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
|
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
|
||||||
|
includeLocalRenotes: this.$store.state.settings.showLocalRenotes
|
||||||
}).then(notes => {
|
}).then(notes => {
|
||||||
if (notes.length == fetchLimit + 1) {
|
if (notes.length == fetchLimit + 1) {
|
||||||
notes.pop();
|
notes.pop();
|
||||||
@ -67,7 +68,8 @@ export default Vue.extend({
|
|||||||
limit: fetchLimit + 1,
|
limit: fetchLimit + 1,
|
||||||
untilId: (this.$refs.timeline as any).tail().id,
|
untilId: (this.$refs.timeline as any).tail().id,
|
||||||
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
||||||
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
|
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
|
||||||
|
includeLocalRenotes: this.$store.state.settings.showLocalRenotes
|
||||||
});
|
});
|
||||||
|
|
||||||
promise.then(notes => {
|
promise.then(notes => {
|
||||||
|
@ -0,0 +1,36 @@
|
|||||||
|
import Vue from 'vue';
|
||||||
|
import { Line } from 'vue-chartjs';
|
||||||
|
import * as mergeOptions from 'merge-options';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
extends: Line,
|
||||||
|
props: {
|
||||||
|
data: {
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
opts: {
|
||||||
|
required: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
data() {
|
||||||
|
this.render();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
this.render();
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
render() {
|
||||||
|
this.renderChart(this.data, mergeOptions({
|
||||||
|
responsive: false,
|
||||||
|
scales: {
|
||||||
|
xAxes: [{
|
||||||
|
type: 'time',
|
||||||
|
distribution: 'series'
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}, this.opts || {}));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
241
src/client/app/desktop/views/pages/admin/admin.chart.vue
Normal file
241
src/client/app/desktop/views/pages/admin/admin.chart.vue
Normal file
@ -0,0 +1,241 @@
|
|||||||
|
<template>
|
||||||
|
<div class="card gkgckalzgidaygcxnugepioremxvxvpt">
|
||||||
|
<header>
|
||||||
|
<b>%i18n:@title%:</b>
|
||||||
|
<select v-model="chartType">
|
||||||
|
<optgroup label="%i18n:@users%">
|
||||||
|
<option value="local-users">%i18n:@local-users%</option>
|
||||||
|
<option value="remote-users">%i18n:@remote-users%</option>
|
||||||
|
<option value="local-users-total">%i18n:@local-users-total%</option>
|
||||||
|
<option value="remote-users-total">%i18n:@remote-users-total%</option>
|
||||||
|
</optgroup>
|
||||||
|
<optgroup label="%i18n:@notes%">
|
||||||
|
<option value="local-notes">%i18n:@local-notes%</option>
|
||||||
|
<option value="remote-notes">%i18n:@remote-notes%</option>
|
||||||
|
<option value="local-notes-total">%i18n:@local-notes-total%</option>
|
||||||
|
<option value="remote-notes-total">%i18n:@remote-notes-total%</option>
|
||||||
|
</optgroup>
|
||||||
|
<optgroup label="%i18n:@drive%">
|
||||||
|
<option value="local-drive-files">%i18n:@local-drive-files%</option>
|
||||||
|
<option value="remote-drive-files">%i18n:@remote-drive-files%</option>
|
||||||
|
<option value="local-drive-files-total">%i18n:@local-drive-files-total%</option>
|
||||||
|
<option value="remote-drive-files-total">%i18n:@remote-drive-files-total%</option>
|
||||||
|
<option value="local-drive">%i18n:@local-drive%</option>
|
||||||
|
<option value="remote-drive">%i18n:@remote-drive%</option>
|
||||||
|
<option value="local-drive-total">%i18n:@local-drive-total%</option>
|
||||||
|
<option value="remote-drive-total">%i18n:@remote-drive-total%</option>
|
||||||
|
</optgroup>
|
||||||
|
</select>
|
||||||
|
<div>
|
||||||
|
<a @click="span = 'day'">%i18n:@per-day%</a> | <a @click="span = 'hour'">%i18n:@per-hour%</a>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<x-chart v-if="chart" :data="data[0]" :opts="data[1]" :width="720" :height="300"/>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
import XChart from './admin.chart.chart.ts';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
components: {
|
||||||
|
XChart
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
chart: {
|
||||||
|
required: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
chartType: 'local-notes',
|
||||||
|
span: 'hour'
|
||||||
|
};
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
data(): any {
|
||||||
|
if (this.chart == null) return null;
|
||||||
|
switch (this.chartType) {
|
||||||
|
case 'local-users': return this.usersChart(true, false);
|
||||||
|
case 'remote-users': return this.usersChart(false, false);
|
||||||
|
case 'local-users-total': return this.usersChart(true, true);
|
||||||
|
case 'remote-users-total': return this.usersChart(false, true);
|
||||||
|
case 'local-notes': return this.notesChart(true);
|
||||||
|
case 'remote-notes': return this.notesChart(false);
|
||||||
|
case 'local-notes-total': return this.notesTotalChart(true);
|
||||||
|
case 'remote-notes-total': return this.notesTotalChart(false);
|
||||||
|
case 'local-drive': return this.driveChart(true, false);
|
||||||
|
case 'remote-drive': return this.driveChart(false, false);
|
||||||
|
case 'local-drive-total': return this.driveChart(true, true);
|
||||||
|
case 'remote-drive-total': return this.driveChart(false, true);
|
||||||
|
case 'local-drive-files': return this.driveFilesChart(true, false);
|
||||||
|
case 'remote-drive-files': return this.driveFilesChart(false, false);
|
||||||
|
case 'local-drive-files-total': return this.driveFilesChart(true, true);
|
||||||
|
case 'remote-drive-files-total': return this.driveFilesChart(false, true);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
stats(): any[] {
|
||||||
|
return (
|
||||||
|
this.span == 'day' ? this.chart.perDay :
|
||||||
|
this.span == 'hour' ? this.chart.perHour :
|
||||||
|
null
|
||||||
|
);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
notesChart(local: boolean): any {
|
||||||
|
const data = this.stats.slice().reverse().map(x => ({
|
||||||
|
date: new Date(x.date),
|
||||||
|
normal: local ? x.notes.local.diffs.normal : x.notes.remote.diffs.normal,
|
||||||
|
reply: local ? x.notes.local.diffs.reply : x.notes.remote.diffs.reply,
|
||||||
|
renote: local ? x.notes.local.diffs.renote : x.notes.remote.diffs.renote,
|
||||||
|
all: local ? x.notes.local.diff : x.notes.remote.diff
|
||||||
|
}));
|
||||||
|
|
||||||
|
return [{
|
||||||
|
datasets: [{
|
||||||
|
label: 'All',
|
||||||
|
fill: false,
|
||||||
|
borderColor: '#555',
|
||||||
|
borderWidth: 2,
|
||||||
|
pointBackgroundColor: '#fff',
|
||||||
|
lineTension: 0,
|
||||||
|
data: data.map(x => ({ t: x.date, y: x.all }))
|
||||||
|
}, {
|
||||||
|
label: 'Normal',
|
||||||
|
fill: false,
|
||||||
|
borderColor: '#41ddde',
|
||||||
|
borderWidth: 2,
|
||||||
|
pointBackgroundColor: '#fff',
|
||||||
|
lineTension: 0,
|
||||||
|
data: data.map(x => ({ t: x.date, y: x.normal }))
|
||||||
|
}, {
|
||||||
|
label: 'Replies',
|
||||||
|
fill: false,
|
||||||
|
borderColor: '#f7796c',
|
||||||
|
borderWidth: 2,
|
||||||
|
pointBackgroundColor: '#fff',
|
||||||
|
lineTension: 0,
|
||||||
|
data: data.map(x => ({ t: x.date, y: x.reply }))
|
||||||
|
}, {
|
||||||
|
label: 'Renotes',
|
||||||
|
fill: false,
|
||||||
|
borderColor: '#a1de41',
|
||||||
|
borderWidth: 2,
|
||||||
|
pointBackgroundColor: '#fff',
|
||||||
|
lineTension: 0,
|
||||||
|
data: data.map(x => ({ t: x.date, y: x.renote }))
|
||||||
|
}]
|
||||||
|
}];
|
||||||
|
},
|
||||||
|
|
||||||
|
notesTotalChart(local: boolean): any {
|
||||||
|
const data = this.stats.slice().reverse().map(x => ({
|
||||||
|
date: new Date(x.date),
|
||||||
|
count: local ? x.notes.local.total : x.notes.remote.total,
|
||||||
|
}));
|
||||||
|
|
||||||
|
return [{
|
||||||
|
datasets: [{
|
||||||
|
label: local ? 'Local Notes' : 'Remote Notes',
|
||||||
|
fill: false,
|
||||||
|
borderColor: '#f6584f',
|
||||||
|
borderWidth: 2,
|
||||||
|
pointBackgroundColor: '#fff',
|
||||||
|
lineTension: 0,
|
||||||
|
data: data.map(x => ({ t: x.date, y: x.count }))
|
||||||
|
}]
|
||||||
|
}];
|
||||||
|
},
|
||||||
|
|
||||||
|
usersChart(local: boolean, total: boolean): any {
|
||||||
|
const data = this.stats.slice().reverse().map(x => ({
|
||||||
|
date: new Date(x.date),
|
||||||
|
count: local ?
|
||||||
|
total ? x.users.local.total : x.users.local.diff :
|
||||||
|
total ? x.users.remote.total : x.users.remote.diff
|
||||||
|
}));
|
||||||
|
|
||||||
|
return [{
|
||||||
|
datasets: [{
|
||||||
|
label: local ? 'Local Users' : 'Remote Users',
|
||||||
|
fill: false,
|
||||||
|
borderColor: '#f6584f',
|
||||||
|
borderWidth: 2,
|
||||||
|
pointBackgroundColor: '#fff',
|
||||||
|
lineTension: 0,
|
||||||
|
data: data.map(x => ({ t: x.date, y: x.count }))
|
||||||
|
}]
|
||||||
|
}];
|
||||||
|
},
|
||||||
|
|
||||||
|
driveChart(local: boolean, total: boolean): any {
|
||||||
|
const data = this.stats.slice().reverse().map(x => ({
|
||||||
|
date: new Date(x.date),
|
||||||
|
size: local ?
|
||||||
|
total ? x.drive.local.totalSize : x.drive.local.diffSize :
|
||||||
|
total ? x.drive.remote.totalSize : x.drive.remote.diffSize
|
||||||
|
}));
|
||||||
|
|
||||||
|
return [{
|
||||||
|
datasets: [{
|
||||||
|
label: local ? 'Local Drive Usage' : 'Remote Drive Usage',
|
||||||
|
fill: false,
|
||||||
|
borderColor: '#f6584f',
|
||||||
|
borderWidth: 2,
|
||||||
|
pointBackgroundColor: '#fff',
|
||||||
|
lineTension: 0,
|
||||||
|
data: data.map(x => ({ t: x.date, y: x.size }))
|
||||||
|
}]
|
||||||
|
}, {
|
||||||
|
scales: {
|
||||||
|
yAxes: [{
|
||||||
|
ticks: {
|
||||||
|
callback: (value) => {
|
||||||
|
return Vue.filter('bytes')(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}];
|
||||||
|
},
|
||||||
|
|
||||||
|
driveFilesChart(local: boolean, total: boolean): any {
|
||||||
|
const data = this.stats.slice().reverse().map(x => ({
|
||||||
|
date: new Date(x.date),
|
||||||
|
count: local ?
|
||||||
|
total ? x.drive.local.totalCount : x.drive.local.diffCount :
|
||||||
|
total ? x.drive.remote.totalCount : x.drive.remote.diffCount
|
||||||
|
}));
|
||||||
|
|
||||||
|
return [{
|
||||||
|
datasets: [{
|
||||||
|
label: local ? 'Local Drive Files' : 'Remote Drive Files',
|
||||||
|
fill: false,
|
||||||
|
borderColor: '#f6584f',
|
||||||
|
borderWidth: 2,
|
||||||
|
pointBackgroundColor: '#fff',
|
||||||
|
lineTension: 0,
|
||||||
|
data: data.map(x => ({ t: x.date, y: x.count }))
|
||||||
|
}]
|
||||||
|
}];
|
||||||
|
},
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
@import '~const.styl'
|
||||||
|
|
||||||
|
.gkgckalzgidaygcxnugepioremxvxvpt
|
||||||
|
> header
|
||||||
|
display flex
|
||||||
|
|
||||||
|
> b
|
||||||
|
margin-right 8px
|
||||||
|
|
||||||
|
> *:last-child
|
||||||
|
margin-left auto
|
||||||
|
|
||||||
|
</style>
|
144
src/client/app/desktop/views/pages/admin/admin.cpu-memory.vue
Normal file
144
src/client/app/desktop/views/pages/admin/admin.cpu-memory.vue
Normal file
@ -0,0 +1,144 @@
|
|||||||
|
<template>
|
||||||
|
<div class="zyknedwtlthezamcjlolyusmipqmjgxz">
|
||||||
|
<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`">
|
||||||
|
<defs>
|
||||||
|
<linearGradient :id="cpuGradientId" x1="0" x2="0" y1="1" y2="0">
|
||||||
|
<stop offset="0%" stop-color="hsl(180, 80%, 70%)"></stop>
|
||||||
|
<stop offset="100%" stop-color="hsl(0, 80%, 70%)"></stop>
|
||||||
|
</linearGradient>
|
||||||
|
<mask :id="cpuMaskId" x="0" y="0" :width="viewBoxX" :height="viewBoxY">
|
||||||
|
<polygon
|
||||||
|
:points="cpuPolygonPoints"
|
||||||
|
fill="#fff"
|
||||||
|
fill-opacity="0.5"/>
|
||||||
|
<polyline
|
||||||
|
:points="cpuPolylinePoints"
|
||||||
|
fill="none"
|
||||||
|
stroke="#fff"
|
||||||
|
stroke-width="1"/>
|
||||||
|
</mask>
|
||||||
|
</defs>
|
||||||
|
<rect
|
||||||
|
x="0" y="0"
|
||||||
|
:width="viewBoxX" :height="viewBoxY"
|
||||||
|
:style="`stroke: none; fill: url(#${ cpuGradientId }); mask: url(#${ cpuMaskId })`"/>
|
||||||
|
<text x="1" y="12">CPU <tspan>{{ cpuP }}%</tspan></text>
|
||||||
|
</svg>
|
||||||
|
<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`">
|
||||||
|
<defs>
|
||||||
|
<linearGradient :id="memGradientId" x1="0" x2="0" y1="1" y2="0">
|
||||||
|
<stop offset="0%" stop-color="hsl(180, 80%, 70%)"></stop>
|
||||||
|
<stop offset="100%" stop-color="hsl(0, 80%, 70%)"></stop>
|
||||||
|
</linearGradient>
|
||||||
|
<mask :id="memMaskId" x="0" y="0" :width="viewBoxX" :height="viewBoxY">
|
||||||
|
<polygon
|
||||||
|
:points="memPolygonPoints"
|
||||||
|
fill="#fff"
|
||||||
|
fill-opacity="0.5"/>
|
||||||
|
<polyline
|
||||||
|
:points="memPolylinePoints"
|
||||||
|
fill="none"
|
||||||
|
stroke="#fff"
|
||||||
|
stroke-width="1"/>
|
||||||
|
</mask>
|
||||||
|
</defs>
|
||||||
|
<rect
|
||||||
|
x="0" y="0"
|
||||||
|
:width="viewBoxX" :height="viewBoxY"
|
||||||
|
:style="`stroke: none; fill: url(#${ memGradientId }); mask: url(#${ memMaskId })`"/>
|
||||||
|
<text x="1" y="12">MEM <tspan>{{ memP }}%</tspan></text>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
import * as uuid from 'uuid';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
props: ['connection'],
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
viewBoxX: 200,
|
||||||
|
viewBoxY: 70,
|
||||||
|
stats: [],
|
||||||
|
cpuGradientId: uuid(),
|
||||||
|
cpuMaskId: uuid(),
|
||||||
|
memGradientId: uuid(),
|
||||||
|
memMaskId: uuid(),
|
||||||
|
cpuPolylinePoints: '',
|
||||||
|
memPolylinePoints: '',
|
||||||
|
cpuPolygonPoints: '',
|
||||||
|
memPolygonPoints: '',
|
||||||
|
cpuP: '',
|
||||||
|
memP: ''
|
||||||
|
};
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
this.connection.on('stats', this.onStats);
|
||||||
|
this.connection.on('statsLog', this.onStatsLog);
|
||||||
|
this.connection.send({
|
||||||
|
type: 'requestLog',
|
||||||
|
id: Math.random().toString(),
|
||||||
|
length: 200
|
||||||
|
});
|
||||||
|
},
|
||||||
|
beforeDestroy() {
|
||||||
|
this.connection.off('stats', this.onStats);
|
||||||
|
this.connection.off('statsLog', this.onStatsLog);
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
onStats(stats) {
|
||||||
|
this.stats.push(stats);
|
||||||
|
if (this.stats.length > 200) this.stats.shift();
|
||||||
|
|
||||||
|
const cpuPolylinePoints = this.stats.map((s, i) => [this.viewBoxX - ((this.stats.length - 1) - i), (1 - s.cpu_usage) * this.viewBoxY]);
|
||||||
|
const memPolylinePoints = this.stats.map((s, i) => [this.viewBoxX - ((this.stats.length - 1) - i), (1 - (s.mem.used / s.mem.total)) * this.viewBoxY]);
|
||||||
|
this.cpuPolylinePoints = cpuPolylinePoints.map(xy => `${xy[0]},${xy[1]}`).join(' ');
|
||||||
|
this.memPolylinePoints = memPolylinePoints.map(xy => `${xy[0]},${xy[1]}`).join(' ');
|
||||||
|
|
||||||
|
this.cpuPolygonPoints = `${this.viewBoxX - (this.stats.length - 1)},${this.viewBoxY} ${this.cpuPolylinePoints} ${this.viewBoxX},${this.viewBoxY}`;
|
||||||
|
this.memPolygonPoints = `${this.viewBoxX - (this.stats.length - 1)},${this.viewBoxY} ${this.memPolylinePoints} ${this.viewBoxX},${this.viewBoxY}`;
|
||||||
|
|
||||||
|
this.cpuP = (stats.cpu_usage * 100).toFixed(0);
|
||||||
|
this.memP = (stats.mem.used / stats.mem.total * 100).toFixed(0);
|
||||||
|
},
|
||||||
|
onStatsLog(statsLog) {
|
||||||
|
statsLog.reverse().forEach(stats => this.onStats(stats));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
root(isDark)
|
||||||
|
> svg
|
||||||
|
display block
|
||||||
|
width 50%
|
||||||
|
float left
|
||||||
|
|
||||||
|
&:first-child
|
||||||
|
padding-right 5px
|
||||||
|
|
||||||
|
&:last-child
|
||||||
|
padding-left 5px
|
||||||
|
|
||||||
|
> text
|
||||||
|
font-size 10px
|
||||||
|
fill isDark ? rgba(#fff, 0.55) : rgba(#000, 0.55)
|
||||||
|
|
||||||
|
> tspan
|
||||||
|
opacity 0.5
|
||||||
|
|
||||||
|
&:after
|
||||||
|
content ""
|
||||||
|
display block
|
||||||
|
clear both
|
||||||
|
|
||||||
|
.zyknedwtlthezamcjlolyusmipqmjgxz[data-darkmode]
|
||||||
|
root(true)
|
||||||
|
|
||||||
|
.zyknedwtlthezamcjlolyusmipqmjgxz:not([data-darkmode])
|
||||||
|
root(false)
|
||||||
|
|
||||||
|
</style>
|
@ -1,37 +1,100 @@
|
|||||||
<template>
|
<template>
|
||||||
|
<div class="obdskegsannmntldydackcpzezagxqfy card">
|
||||||
|
<header>%i18n:@dashboard%</header>
|
||||||
|
<div v-if="stats" class="stats">
|
||||||
|
<div><b>%fa:user% {{ stats.originalUsersCount | number }}</b><span>%i18n:@original-users%</span></div>
|
||||||
|
<div><span>%fa:user% {{ stats.usersCount | number }}</span><span>%i18n:@all-users%</span></div>
|
||||||
|
<div><b>%fa:pen% {{ stats.originalNotesCount | number }}</b><span>%i18n:@original-notes%</span></div>
|
||||||
|
<div><span>%fa:pen% {{ stats.notesCount | number }}</span><span>%i18n:@all-notes%</span></div>
|
||||||
|
</div>
|
||||||
|
<div class="cpu-memory">
|
||||||
|
<x-cpu-memory :connection="connection"/>
|
||||||
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<h1>%i18n:@dashboard%</h1>
|
<label>
|
||||||
<div v-if="stats">
|
<input type="checkbox" v-model="disableRegistration" @change="updateMeta">
|
||||||
<p><b>%i18n:@all-users%</b>: <span>{{ stats.usersCount | number }}</span></p>
|
<span>disableRegistration</span>
|
||||||
<p><b>%i18n:@original-users%</b>: <span>{{ stats.originalUsersCount | number }}</span></p>
|
</label>
|
||||||
<p><b>%i18n:@all-notes%</b>: <span>{{ stats.notesCount | number }}</span></p>
|
<button class="ui" @click="invite">%i18n:@invite%</button>
|
||||||
<p><b>%i18n:@original-notes%</b>: <span>{{ stats.originalNotesCount | number }}</span></p>
|
<p v-if="inviteCode">Code: <code>{{ inviteCode }}</code></p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from "vue";
|
import Vue from "vue";
|
||||||
|
import XCpuMemory from "./admin.cpu-memory.vue";
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
|
components: {
|
||||||
|
XCpuMemory
|
||||||
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
stats: null
|
stats: null,
|
||||||
|
disableRegistration: false,
|
||||||
|
inviteCode: null,
|
||||||
|
connection: null,
|
||||||
|
connectionId: null
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
|
this.connection = (this as any).os.streams.serverStatsStream.getConnection();
|
||||||
|
this.connectionId = (this as any).os.streams.serverStatsStream.use();
|
||||||
|
|
||||||
|
(this as any).os.getMeta().then(meta => {
|
||||||
|
this.disableRegistration = meta.disableRegistration;
|
||||||
|
});
|
||||||
|
|
||||||
(this as any).api('stats').then(stats => {
|
(this as any).api('stats').then(stats => {
|
||||||
this.stats = stats;
|
this.stats = stats;
|
||||||
});
|
});
|
||||||
|
},
|
||||||
|
beforeDestroy() {
|
||||||
|
(this as any).os.streams.serverStatsStream.dispose(this.connectionId);
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
invite() {
|
||||||
|
(this as any).api('admin/invite').then(x => {
|
||||||
|
this.inviteCode = x.code;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
updateMeta() {
|
||||||
|
(this as any).api('admin/update-meta', {
|
||||||
|
disableRegistration: this.disableRegistration
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="stylus" scoped>
|
<style lang="stylus" scoped>
|
||||||
h1
|
@import '~const.styl'
|
||||||
margin 0 0 1em 0
|
|
||||||
padding 0 0 8px 0
|
.obdskegsannmntldydackcpzezagxqfy
|
||||||
font-size 1em
|
> .stats
|
||||||
color #555
|
display flex
|
||||||
border-bottom solid 1px #eee
|
justify-content center
|
||||||
|
margin-bottom 16px
|
||||||
|
padding 16px
|
||||||
|
border solid 1px #eee
|
||||||
|
border-radius 8px
|
||||||
|
|
||||||
|
> div
|
||||||
|
flex 1
|
||||||
|
text-align center
|
||||||
|
|
||||||
|
> *:first-child
|
||||||
|
display block
|
||||||
|
color $theme-color
|
||||||
|
|
||||||
|
> *:last-child
|
||||||
|
font-size 70%
|
||||||
|
|
||||||
|
> .cpu-memory
|
||||||
|
margin-bottom 16px
|
||||||
|
padding 16px
|
||||||
|
border solid 1px #eee
|
||||||
|
border-radius: 8px
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div class="card">
|
||||||
<header>%i18n:@suspend-user%</header>
|
<header>%i18n:@suspend-user%</header>
|
||||||
<input v-model="username" type="text" class="ui"/>
|
<input v-model="username" type="text" class="ui"/>
|
||||||
<button class="ui" @click="suspendUser" :disabled="suspending">%i18n:@suspend%</button>
|
<button class="ui" @click="suspendUser" :disabled="suspending">%i18n:@suspend%</button>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div class="card">
|
||||||
<header>%i18n:@unsuspend-user%</header>
|
<header>%i18n:@unsuspend-user%</header>
|
||||||
<input v-model="username" type="text" class="ui"/>
|
<input v-model="username" type="text" class="ui"/>
|
||||||
<button class="ui" @click="unsuspendUser" :disabled="unsuspending">%i18n:@unsuspend%</button>
|
<button class="ui" @click="unsuspendUser" :disabled="unsuspending">%i18n:@unsuspend%</button>
|
||||||
|
@ -0,0 +1,51 @@
|
|||||||
|
<template>
|
||||||
|
<div class="card">
|
||||||
|
<header>%i18n:@unverify-user%</header>
|
||||||
|
<input v-model="username" type="text" class="ui"/>
|
||||||
|
<button class="ui" @click="unverifyUser" :disabled="unverifying">%i18n:@unverify%</button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from "vue";
|
||||||
|
import parseAcct from "../../../../../../misc/acct/parse";
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
username: null,
|
||||||
|
unverifying: false
|
||||||
|
};
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
async unverifyUser() {
|
||||||
|
this.unverifying = true;
|
||||||
|
|
||||||
|
const user = await (this as any).os.api(
|
||||||
|
"users/show",
|
||||||
|
parseAcct(this.username)
|
||||||
|
);
|
||||||
|
|
||||||
|
await (this as any).os.api("admin/unverify-user", {
|
||||||
|
userId: user.id
|
||||||
|
});
|
||||||
|
|
||||||
|
this.unverifying = false;
|
||||||
|
|
||||||
|
(this as any).os.apis.dialog({ text: "%i18n:@unverified%" });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
@import '~const.styl'
|
||||||
|
|
||||||
|
header
|
||||||
|
margin 10px 0
|
||||||
|
|
||||||
|
|
||||||
|
button
|
||||||
|
margin 16px 0
|
||||||
|
|
||||||
|
</style>
|
@ -0,0 +1,51 @@
|
|||||||
|
<template>
|
||||||
|
<div class="card">
|
||||||
|
<header>%i18n:@verify-user%</header>
|
||||||
|
<input v-model="username" type="text" class="ui"/>
|
||||||
|
<button class="ui" @click="verifyUser" :disabled="verifying">%i18n:@verify%</button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from "vue";
|
||||||
|
import parseAcct from "../../../../../../misc/acct/parse";
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
username: null,
|
||||||
|
verifying: false
|
||||||
|
};
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
async verifyUser() {
|
||||||
|
this.verifying = true;
|
||||||
|
|
||||||
|
const user = await (this as any).os.api(
|
||||||
|
"users/show",
|
||||||
|
parseAcct(this.username)
|
||||||
|
);
|
||||||
|
|
||||||
|
await (this as any).os.api("admin/verify-user", {
|
||||||
|
userId: user.id
|
||||||
|
});
|
||||||
|
|
||||||
|
this.verifying = false;
|
||||||
|
|
||||||
|
(this as any).os.apis.dialog({ text: "%i18n:@verified%" });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
@import '~const.styl'
|
||||||
|
|
||||||
|
header
|
||||||
|
margin 10px 0
|
||||||
|
|
||||||
|
|
||||||
|
button
|
||||||
|
margin 16px 0
|
||||||
|
|
||||||
|
</style>
|
@ -9,12 +9,15 @@
|
|||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
<main>
|
<main>
|
||||||
<div v-if="page == 'dashboard'">
|
<div v-show="page == 'dashboard'">
|
||||||
<x-dashboard/>
|
<x-dashboard/>
|
||||||
|
<x-chart :chart="chart"/>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="page == 'users'">
|
<div v-if="page == 'users'">
|
||||||
<x-suspend-user/>
|
<x-suspend-user/>
|
||||||
<x-unsuspend-user/>
|
<x-unsuspend-user/>
|
||||||
|
<x-verify-user/>
|
||||||
|
<x-unverify-user/>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="page == 'drive'"></div>
|
<div v-if="page == 'drive'"></div>
|
||||||
<div v-if="page == 'update'"></div>
|
<div v-if="page == 'update'"></div>
|
||||||
@ -27,18 +30,30 @@ import Vue from "vue";
|
|||||||
import XDashboard from "./admin.dashboard.vue";
|
import XDashboard from "./admin.dashboard.vue";
|
||||||
import XSuspendUser from "./admin.suspend-user.vue";
|
import XSuspendUser from "./admin.suspend-user.vue";
|
||||||
import XUnsuspendUser from "./admin.unsuspend-user.vue";
|
import XUnsuspendUser from "./admin.unsuspend-user.vue";
|
||||||
|
import XVerifyUser from "./admin.verify-user.vue";
|
||||||
|
import XUnverifyUser from "./admin.unverify-user.vue";
|
||||||
|
import XChart from "./admin.chart.vue";
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
components: {
|
components: {
|
||||||
XDashboard,
|
XDashboard,
|
||||||
XSuspendUser,
|
XSuspendUser,
|
||||||
XUnsuspendUser
|
XUnsuspendUser,
|
||||||
|
XVerifyUser,
|
||||||
|
XUnverifyUser,
|
||||||
|
XChart
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
page: 'dashboard'
|
page: 'dashboard',
|
||||||
|
chart: null
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
created() {
|
||||||
|
(this as any).api('admin/chart').then(chart => {
|
||||||
|
this.chart = chart;
|
||||||
|
});
|
||||||
|
},
|
||||||
methods: {
|
methods: {
|
||||||
nav(page: string) {
|
nav(page: string) {
|
||||||
this.page = page;
|
this.page = page;
|
||||||
@ -47,7 +62,7 @@ export default Vue.extend({
|
|||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="stylus" scoped>
|
<style lang="stylus">
|
||||||
@import '~const.styl'
|
@import '~const.styl'
|
||||||
|
|
||||||
.mk-admin
|
.mk-admin
|
||||||
@ -90,13 +105,23 @@ export default Vue.extend({
|
|||||||
width 100%
|
width 100%
|
||||||
padding 16px 32px
|
padding 16px 32px
|
||||||
|
|
||||||
header
|
> div
|
||||||
margin 10px 0
|
> div
|
||||||
|
max-width 800px
|
||||||
|
|
||||||
|
.card
|
||||||
|
padding 32px
|
||||||
|
background #fff
|
||||||
|
box-shadow 0 2px 8px rgba(#000, 0.1)
|
||||||
|
|
||||||
button
|
&:not(:last-child)
|
||||||
margin 16px 0
|
margin-bottom 16px
|
||||||
position absolute
|
|
||||||
right 0
|
> header
|
||||||
|
margin 0 0 1em 0
|
||||||
|
padding 0 0 8px 0
|
||||||
|
font-size 1em
|
||||||
|
color #555
|
||||||
|
border-bottom solid 1px #eee
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
@ -70,7 +70,8 @@ export default Vue.extend({
|
|||||||
limit: fetchLimit + 1,
|
limit: fetchLimit + 1,
|
||||||
mediaOnly: this.mediaOnly,
|
mediaOnly: this.mediaOnly,
|
||||||
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
||||||
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
|
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
|
||||||
|
includeLocalRenotes: this.$store.state.settings.showLocalRenotes
|
||||||
}).then(notes => {
|
}).then(notes => {
|
||||||
if (notes.length == fetchLimit + 1) {
|
if (notes.length == fetchLimit + 1) {
|
||||||
notes.pop();
|
notes.pop();
|
||||||
@ -91,7 +92,8 @@ export default Vue.extend({
|
|||||||
untilId: (this.$refs.timeline as any).tail().id,
|
untilId: (this.$refs.timeline as any).tail().id,
|
||||||
mediaOnly: this.mediaOnly,
|
mediaOnly: this.mediaOnly,
|
||||||
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
||||||
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
|
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
|
||||||
|
includeLocalRenotes: this.$store.state.settings.showLocalRenotes
|
||||||
});
|
});
|
||||||
|
|
||||||
promise.then(notes => {
|
promise.then(notes => {
|
||||||
|
@ -140,6 +140,12 @@ export default Vue.extend({
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this.$store.state.settings.showLocalRenotes === false) {
|
||||||
|
if (isPureRenote && (note.renote.user.host == null)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
if (this.isScrollTop()) {
|
if (this.isScrollTop()) {
|
||||||
|
@ -98,7 +98,8 @@ export default Vue.extend({
|
|||||||
limit: fetchLimit + 1,
|
limit: fetchLimit + 1,
|
||||||
mediaOnly: this.mediaOnly,
|
mediaOnly: this.mediaOnly,
|
||||||
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
||||||
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
|
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
|
||||||
|
includeLocalRenotes: this.$store.state.settings.showLocalRenotes
|
||||||
}).then(notes => {
|
}).then(notes => {
|
||||||
if (notes.length == fetchLimit + 1) {
|
if (notes.length == fetchLimit + 1) {
|
||||||
notes.pop();
|
notes.pop();
|
||||||
@ -119,7 +120,8 @@ export default Vue.extend({
|
|||||||
mediaOnly: this.mediaOnly,
|
mediaOnly: this.mediaOnly,
|
||||||
untilId: (this.$refs.timeline as any).tail().id,
|
untilId: (this.$refs.timeline as any).tail().id,
|
||||||
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
||||||
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
|
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
|
||||||
|
includeLocalRenotes: this.$store.state.settings.showLocalRenotes
|
||||||
});
|
});
|
||||||
|
|
||||||
promise.then(notes => {
|
promise.then(notes => {
|
||||||
|
@ -4,11 +4,10 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import * as config from '../../../config';
|
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
mounted() {
|
mounted() {
|
||||||
document.title = `${config.name} - %i18n:@title%`;
|
document.title = `${(this as any).os.instanceName} - %i18n:@title%`;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
@ -7,7 +7,6 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import Progress from '../../../common/scripts/loading';
|
import Progress from '../../../common/scripts/loading';
|
||||||
import * as config from '../../../config';
|
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
props: {
|
props: {
|
||||||
@ -17,7 +16,7 @@ export default Vue.extend({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
document.title = config.name;
|
document.title = (this as any).os.instanceName;
|
||||||
|
|
||||||
Progress.start();
|
Progress.start();
|
||||||
},
|
},
|
||||||
|
@ -12,12 +12,11 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import * as config from '../../../config';
|
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
name: config.name,
|
name: (this as any).os.instanceName,
|
||||||
posted: false,
|
posted: false,
|
||||||
text: new URLSearchParams(location.search).get('text')
|
text: new URLSearchParams(location.search).get('text')
|
||||||
};
|
};
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
<template v-if="$store.state.device.darkmode">%fa:moon%</template>
|
<template v-if="$store.state.device.darkmode">%fa:moon%</template>
|
||||||
<template v-else>%fa:R moon%</template>
|
<template v-else>%fa:R moon%</template>
|
||||||
</button>
|
</button>
|
||||||
<div class="body" :style="{ backgroundImage: `url('${ welcomeBgUrl }')` }">
|
<div class="body">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="info">
|
<div class="info">
|
||||||
<span><b>{{ host }}</b></span>
|
<span><b>{{ host }}</b></span>
|
||||||
@ -46,22 +46,26 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import { host, name, description, copyright, welcomeBgUrl } from '../../../config';
|
import { host, copyright } from '../../../config';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
stats: null,
|
stats: null,
|
||||||
copyright,
|
copyright,
|
||||||
welcomeBgUrl,
|
|
||||||
host,
|
host,
|
||||||
name,
|
name: 'Misskey',
|
||||||
description,
|
description: '',
|
||||||
pointerInterval: null,
|
pointerInterval: null,
|
||||||
tags: []
|
tags: []
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
|
(this as any).os.getMeta().then(meta => {
|
||||||
|
this.name = meta.name;
|
||||||
|
this.description = meta.description;
|
||||||
|
});
|
||||||
|
|
||||||
(this as any).api('stats').then(stats => {
|
(this as any).api('stats').then(stats => {
|
||||||
this.stats = stats;
|
this.stats = stats;
|
||||||
});
|
});
|
||||||
|
@ -5,16 +5,6 @@
|
|||||||
<b-form-group label="アプリケーション名" description="あなたのアプリの名称。">
|
<b-form-group label="アプリケーション名" description="あなたのアプリの名称。">
|
||||||
<b-form-input v-model="name" type="text" placeholder="ex) Misskey for iOS" autocomplete="off" required/>
|
<b-form-input v-model="name" type="text" placeholder="ex) Misskey for iOS" autocomplete="off" required/>
|
||||||
</b-form-group>
|
</b-form-group>
|
||||||
<b-form-group label="ID" description="あなたのアプリのID。">
|
|
||||||
<b-input v-model="nid" type="text" pattern="^[a-zA-Z0-9_]{1,30}$" placeholder="ex) misskey-for-ios" autocomplete="off" required/>
|
|
||||||
<p class="info" v-if="nidState == 'wait'" style="color:#999">%fa:spinner .pulse .fw%確認しています...</p>
|
|
||||||
<p class="info" v-if="nidState == 'ok'" style="color:#3CB7B5">%fa:fw check%利用できます</p>
|
|
||||||
<p class="info" v-if="nidState == 'unavailable'" style="color:#FF1161">%fa:fw exclamation-triangle%既に利用されています</p>
|
|
||||||
<p class="info" v-if="nidState == 'error'" style="color:#FF1161">%fa:fw exclamation-triangle%通信エラー</p>
|
|
||||||
<p class="info" v-if="nidState == 'invalid-format'" style="color:#FF1161">%fa:fw exclamation-triangle%a~z、A~Z、0~9、_が使えます</p>
|
|
||||||
<p class="info" v-if="nidState == 'min-range'" style="color:#FF1161">%fa:fw exclamation-triangle%1文字以上でお願いします!</p>
|
|
||||||
<p class="info" v-if="nidState == 'max-range'" style="color:#FF1161">%fa:fw exclamation-triangle%30文字以内でお願いします</p>
|
|
||||||
</b-form-group>
|
|
||||||
<b-form-group label="アプリの概要" description="あなたのアプリの簡単な説明や紹介。">
|
<b-form-group label="アプリの概要" description="あなたのアプリの簡単な説明や紹介。">
|
||||||
<b-textarea v-model="description" placeholder="ex) Misskey iOSクライアント。" autocomplete="off" required></b-textarea>
|
<b-textarea v-model="description" placeholder="ex) Misskey iOSクライアント。" autocomplete="off" required></b-textarea>
|
||||||
</b-form-group>
|
</b-form-group>
|
||||||
@ -50,52 +40,21 @@ export default Vue.extend({
|
|||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
name: '',
|
name: '',
|
||||||
nid: '',
|
|
||||||
description: '',
|
description: '',
|
||||||
cb: '',
|
cb: '',
|
||||||
nidState: null,
|
nidState: null,
|
||||||
permission: []
|
permission: []
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
watch: {
|
|
||||||
nid() {
|
|
||||||
if (this.nid == null || this.nid == '') {
|
|
||||||
this.nidState = null;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const err =
|
|
||||||
!this.nid.match(/^[a-zA-Z0-9_]+$/) ? 'invalid-format' :
|
|
||||||
this.nid.length < 1 ? 'min-range' :
|
|
||||||
this.nid.length > 30 ? 'max-range' :
|
|
||||||
null;
|
|
||||||
|
|
||||||
if (err) {
|
|
||||||
this.nidState = err;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.nidState = 'wait';
|
|
||||||
|
|
||||||
(this as any).api('app/name_id/available', {
|
|
||||||
nameId: this.nid
|
|
||||||
}).then(result => {
|
|
||||||
this.nidState = result.available ? 'ok' : 'unavailable';
|
|
||||||
}).catch(err => {
|
|
||||||
this.nidState = 'error';
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
methods: {
|
||||||
onSubmit() {
|
onSubmit() {
|
||||||
(this as any).api('app/create', {
|
(this as any).api('app/create', {
|
||||||
name: this.name,
|
name: this.name,
|
||||||
nameId: this.nid,
|
|
||||||
description: this.description,
|
description: this.description,
|
||||||
callbackUrl: this.cb,
|
callbackUrl: this.cb,
|
||||||
permission: this.permission
|
permission: this.permission
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
location.href = '/apps';
|
location.href = '/dev/apps';
|
||||||
}).catch(() => {
|
}).catch(() => {
|
||||||
alert('アプリの作成に失敗しました。再度お試しください。');
|
alert('アプリの作成に失敗しました。再度お試しください。');
|
||||||
});
|
});
|
||||||
|
@ -70,6 +70,10 @@ export default class MiOS extends EventEmitter {
|
|||||||
chachedAt: Date;
|
chachedAt: Date;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
public get instanceName() {
|
||||||
|
return this.meta ? this.meta.data.name : 'Misskey';
|
||||||
|
}
|
||||||
|
|
||||||
private isMetaFetching = false;
|
private isMetaFetching = false;
|
||||||
|
|
||||||
public app: Vue;
|
public app: Vue;
|
||||||
|
@ -30,6 +30,10 @@
|
|||||||
<span class="data-size">{{ file.datasize | bytes }}</span>
|
<span class="data-size">{{ file.datasize | bytes }}</span>
|
||||||
<span class="separator"></span>
|
<span class="separator"></span>
|
||||||
<span class="created-at" @click="showCreatedAt">%fa:R clock%<mk-time :time="file.createdAt"/></span>
|
<span class="created-at" @click="showCreatedAt">%fa:R clock%<mk-time :time="file.createdAt"/></span>
|
||||||
|
<template v-if="file.isSensitive">
|
||||||
|
<span class="separator"></span>
|
||||||
|
<span class="nsfw">%fa:eye-slash% %i18n:@nsfw%</span>
|
||||||
|
</template>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="menu">
|
<div class="menu">
|
||||||
@ -198,6 +202,9 @@ export default Vue.extend({
|
|||||||
> [data-fa]
|
> [data-fa]
|
||||||
margin-right 2px
|
margin-right 2px
|
||||||
|
|
||||||
|
> .nsfw
|
||||||
|
color #bf4633
|
||||||
|
|
||||||
> .menu
|
> .menu
|
||||||
padding 14px
|
padding 14px
|
||||||
border-top solid 1px #dfdfdf
|
border-top solid 1px #dfdfdf
|
||||||
|
@ -14,13 +14,17 @@
|
|||||||
li.tag(style={background: tag.color, color: contrast(tag.color)})= tag.name
|
li.tag(style={background: tag.color, color: contrast(tag.color)})= tag.name
|
||||||
-->
|
-->
|
||||||
<footer>
|
<footer>
|
||||||
<p class="type"><mk-file-type-icon :type="file.type"/>{{ file.type }}</p>
|
<span class="type"><mk-file-type-icon :type="file.type"/>{{ file.type }}</span>
|
||||||
<p class="separator"></p>
|
<span class="separator"></span>
|
||||||
<p class="data-size">{{ file.datasize | bytes }}</p>
|
<span class="data-size">{{ file.datasize | bytes }}</span>
|
||||||
<p class="separator"></p>
|
<span class="separator"></span>
|
||||||
<p class="created-at">
|
<span class="created-at">
|
||||||
%fa:R clock%<mk-time :time="file.createdAt"/>
|
%fa:R clock%<mk-time :time="file.createdAt"/>
|
||||||
</p>
|
</span>
|
||||||
|
<template v-if="file.isSensitive">
|
||||||
|
<span class="separator"></span>
|
||||||
|
<span class="nsfw">%fa:eye-slash% %i18n:@nsfw%</span>
|
||||||
|
</template>
|
||||||
</footer>
|
</footer>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -133,35 +137,27 @@ export default Vue.extend({
|
|||||||
font-size 0.7em
|
font-size 0.7em
|
||||||
|
|
||||||
> .separator
|
> .separator
|
||||||
display inline
|
|
||||||
margin 0
|
|
||||||
padding 0 4px
|
padding 0 4px
|
||||||
color #CDCDCD
|
color #CDCDCD
|
||||||
|
|
||||||
> .type
|
> .type
|
||||||
display inline
|
|
||||||
margin 0
|
|
||||||
padding 0
|
|
||||||
color #9D9D9D
|
color #9D9D9D
|
||||||
|
|
||||||
> .mk-file-type-icon
|
> .mk-file-type-icon
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
> .data-size
|
> .data-size
|
||||||
display inline
|
|
||||||
margin 0
|
|
||||||
padding 0
|
|
||||||
color #9D9D9D
|
color #9D9D9D
|
||||||
|
|
||||||
> .created-at
|
> .created-at
|
||||||
display inline
|
|
||||||
margin 0
|
|
||||||
padding 0
|
|
||||||
color #BDBDBD
|
color #BDBDBD
|
||||||
|
|
||||||
> [data-fa]
|
> [data-fa]
|
||||||
margin-right 2px
|
margin-right 2px
|
||||||
|
|
||||||
|
> .nsfw
|
||||||
|
color #bf4633
|
||||||
|
|
||||||
&[data-is-selected]
|
&[data-is-selected]
|
||||||
background $theme-color
|
background $theme-color
|
||||||
|
|
||||||
|
@ -99,7 +99,7 @@ export default Vue.extend({
|
|||||||
cursor pointer
|
cursor pointer
|
||||||
padding 0 16px
|
padding 0 16px
|
||||||
margin 0
|
margin 0
|
||||||
min-width 150px
|
min-width 100px
|
||||||
line-height 36px
|
line-height 36px
|
||||||
font-size 14px
|
font-size 14px
|
||||||
font-weight bold
|
font-weight bold
|
||||||
|
@ -12,6 +12,7 @@ import noteCard from './note-card.vue';
|
|||||||
import userCard from './user-card.vue';
|
import userCard from './user-card.vue';
|
||||||
import noteDetail from './note-detail.vue';
|
import noteDetail from './note-detail.vue';
|
||||||
import followButton from './follow-button.vue';
|
import followButton from './follow-button.vue';
|
||||||
|
import muteButton from './mute-button.vue';
|
||||||
import friendsMaker from './friends-maker.vue';
|
import friendsMaker from './friends-maker.vue';
|
||||||
import notification from './notification.vue';
|
import notification from './notification.vue';
|
||||||
import notifications from './notifications.vue';
|
import notifications from './notifications.vue';
|
||||||
@ -36,6 +37,7 @@ Vue.component('mk-note-card', noteCard);
|
|||||||
Vue.component('mk-user-card', userCard);
|
Vue.component('mk-user-card', userCard);
|
||||||
Vue.component('mk-note-detail', noteDetail);
|
Vue.component('mk-note-detail', noteDetail);
|
||||||
Vue.component('mk-follow-button', followButton);
|
Vue.component('mk-follow-button', followButton);
|
||||||
|
Vue.component('mk-mute-button', muteButton);
|
||||||
Vue.component('mk-friends-maker', friendsMaker);
|
Vue.component('mk-friends-maker', friendsMaker);
|
||||||
Vue.component('mk-notification', notification);
|
Vue.component('mk-notification', notification);
|
||||||
Vue.component('mk-notifications', notifications);
|
Vue.component('mk-notifications', notifications);
|
||||||
|
79
src/client/app/mobile/views/components/mute-button.vue
Normal file
79
src/client/app/mobile/views/components/mute-button.vue
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
<template>
|
||||||
|
<button
|
||||||
|
class="mk-mute-button"
|
||||||
|
:class="{ active: user.isMuted }"
|
||||||
|
@click="onClick">
|
||||||
|
<span v-if="!user.isMuted">%fa:eye-slash% %i18n:@mute%</span>
|
||||||
|
<span v-else>%fa:eye% %i18n:@unmute%</span>
|
||||||
|
</button>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue'
|
||||||
|
export default Vue.extend({
|
||||||
|
props: {
|
||||||
|
user: {
|
||||||
|
type: Object,
|
||||||
|
required: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
onClick() {
|
||||||
|
if (!this.user.isMuted) {
|
||||||
|
this.mute();
|
||||||
|
} else {
|
||||||
|
this.unmute();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mute() {
|
||||||
|
(this as any).api('mute/create', { userId: this.user.id})
|
||||||
|
.then(() => { this.user.isMuted = true })
|
||||||
|
.catch(() => { alert('error')})
|
||||||
|
},
|
||||||
|
unmute() {
|
||||||
|
(this as any).api('mute/delete', { userId: this.user.id })
|
||||||
|
.then(() => { this.user.isMuted = false })
|
||||||
|
.catch(() => { alert('error') })
|
||||||
|
}
|
||||||
|
},
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
@import '~const.styl'
|
||||||
|
|
||||||
|
.mk-mute-button
|
||||||
|
display block
|
||||||
|
user-select none
|
||||||
|
cursor pointer
|
||||||
|
padding 0 16px
|
||||||
|
margin 0
|
||||||
|
min-width 100px
|
||||||
|
line-height 36px
|
||||||
|
font-size 14px
|
||||||
|
font-weight bold
|
||||||
|
color $theme-color
|
||||||
|
background transparent
|
||||||
|
outline none
|
||||||
|
border solid 1px $theme-color
|
||||||
|
border-radius 36px
|
||||||
|
|
||||||
|
&:hover
|
||||||
|
background rgba($theme-color, 0.1)
|
||||||
|
|
||||||
|
&:active
|
||||||
|
background rgba($theme-color, 0.2)
|
||||||
|
|
||||||
|
&.active
|
||||||
|
color $theme-color-foreground
|
||||||
|
background $theme-color
|
||||||
|
|
||||||
|
&:hover
|
||||||
|
background lighten($theme-color, 10%)
|
||||||
|
border-color lighten($theme-color, 10%)
|
||||||
|
&:active
|
||||||
|
background darken($theme-color, 10%)
|
||||||
|
border-color darken($theme-color, 10%)
|
||||||
|
|
||||||
|
</style>
|
@ -38,7 +38,6 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import getNoteSummary from '../../../../../misc/get-note-summary';
|
import getNoteSummary from '../../../../../misc/get-note-summary';
|
||||||
import * as config from '../../../config';
|
|
||||||
|
|
||||||
const displayLimit = 30;
|
const displayLimit = 30;
|
||||||
|
|
||||||
@ -139,6 +138,12 @@ export default Vue.extend({
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this.$store.state.settings.showLocalRenotes === false) {
|
||||||
|
if (isPureRenote && (note.renote.user.host == null)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
// 投稿が自分のものではないかつ、タブが非表示またはスクロール位置が最上部ではないならタイトルで通知
|
// 投稿が自分のものではないかつ、タブが非表示またはスクロール位置が最上部ではないならタイトルで通知
|
||||||
@ -184,7 +189,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
clearNotification() {
|
clearNotification() {
|
||||||
this.unreadCount = 0;
|
this.unreadCount = 0;
|
||||||
document.title = config.name;
|
document.title = (this as any).os.instanceName;
|
||||||
},
|
},
|
||||||
|
|
||||||
onVisibilitychange() {
|
onVisibilitychange() {
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
<div class="attaches" v-show="files.length != 0">
|
<div class="attaches" v-show="files.length != 0">
|
||||||
<x-draggable class="files" :list="files" :options="{ animation: 150 }">
|
<x-draggable class="files" :list="files" :options="{ animation: 150 }">
|
||||||
<div class="file" v-for="file in files" :key="file.id">
|
<div class="file" v-for="file in files" :key="file.id">
|
||||||
<div class="img" :style="`background-image: url(${file.url})`" @click="detachMedia(file)"></div>
|
<div class="img" :style="`background-image: url(${file.thumbnailUrl})`" @click="detachMedia(file)"></div>
|
||||||
</div>
|
</div>
|
||||||
</x-draggable>
|
</x-draggable>
|
||||||
</div>
|
</div>
|
||||||
@ -45,7 +45,7 @@
|
|||||||
<input ref="file" class="file" type="file" accept="image/*" multiple="multiple" @change="onChangeFile"/>
|
<input ref="file" class="file" type="file" accept="image/*" multiple="multiple" @change="onChangeFile"/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="hashtags" v-if="recentHashtags.length > 0">
|
<div class="hashtags" v-if="recentHashtags.length > 0 && $store.state.settings.suggestRecentHashtags">
|
||||||
<a v-for="tag in recentHashtags.slice(0, 5)" @click="addTag(tag)">#{{ tag }}</a>
|
<a v-for="tag in recentHashtags.slice(0, 5)" @click="addTag(tag)">#{{ tag }}</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -56,7 +56,7 @@ import Vue from 'vue';
|
|||||||
import insertTextAtCursor from 'insert-text-at-cursor';
|
import insertTextAtCursor from 'insert-text-at-cursor';
|
||||||
import * as XDraggable from 'vuedraggable';
|
import * as XDraggable from 'vuedraggable';
|
||||||
import MkVisibilityChooser from '../../../common/views/components/visibility-chooser.vue';
|
import MkVisibilityChooser from '../../../common/views/components/visibility-chooser.vue';
|
||||||
import getKao from '../../../common/scripts/get-kao';
|
import getFace from '../../../common/scripts/get-face';
|
||||||
import parse from '../../../../../mfm/parse';
|
import parse from '../../../../../mfm/parse';
|
||||||
import { host } from '../../../config';
|
import { host } from '../../../config';
|
||||||
|
|
||||||
@ -94,7 +94,7 @@ export default Vue.extend({
|
|||||||
files: [],
|
files: [],
|
||||||
poll: false,
|
poll: false,
|
||||||
geo: null,
|
geo: null,
|
||||||
visibility: 'public',
|
visibility: this.$store.state.device.visibility || 'public',
|
||||||
visibleUsers: [],
|
visibleUsers: [],
|
||||||
useCw: false,
|
useCw: false,
|
||||||
cw: null,
|
cw: null,
|
||||||
@ -240,8 +240,7 @@ export default Vue.extend({
|
|||||||
setVisibility() {
|
setVisibility() {
|
||||||
const w = (this as any).os.new(MkVisibilityChooser, {
|
const w = (this as any).os.new(MkVisibilityChooser, {
|
||||||
source: this.$refs.visibilityButton,
|
source: this.$refs.visibilityButton,
|
||||||
compact: true,
|
compact: true
|
||||||
v: this.visibility
|
|
||||||
});
|
});
|
||||||
w.$once('chosen', v => {
|
w.$once('chosen', v => {
|
||||||
this.visibility = v;
|
this.visibility = v;
|
||||||
@ -314,7 +313,7 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
kao() {
|
kao() {
|
||||||
this.text += getKao();
|
this.text += getFace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
<button class="nav" @click="$parent.isDrawerOpening = true">%fa:bars%</button>
|
<button class="nav" @click="$parent.isDrawerOpening = true">%fa:bars%</button>
|
||||||
<template v-if="hasUnreadNotification || hasUnreadMessagingMessage || hasGameInvitation">%fa:circle%</template>
|
<template v-if="hasUnreadNotification || hasUnreadMessagingMessage || hasGameInvitation">%fa:circle%</template>
|
||||||
<h1>
|
<h1>
|
||||||
<slot>config.name</slot>
|
<slot>{{ os.instanceName }}</slot>
|
||||||
</h1>
|
</h1>
|
||||||
<slot name="func"></slot>
|
<slot name="func"></slot>
|
||||||
</div>
|
</div>
|
||||||
@ -20,13 +20,11 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import * as anime from 'animejs';
|
import * as anime from 'animejs';
|
||||||
import * as config from '../../../config';
|
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
props: ['func'],
|
props: ['func'],
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
config,
|
|
||||||
hasGameInvitation: false,
|
hasGameInvitation: false,
|
||||||
connection: null,
|
connection: null,
|
||||||
connectionId: null
|
connectionId: null
|
||||||
|
@ -30,6 +30,7 @@
|
|||||||
<ul>
|
<ul>
|
||||||
<li><a @click="search">%fa:search%%i18n:@search%%fa:angle-right%</a></li>
|
<li><a @click="search">%fa:search%%i18n:@search%%fa:angle-right%</a></li>
|
||||||
<li><router-link to="/i/settings" :data-active="$route.name == 'settings'">%fa:cog%%i18n:@settings%%fa:angle-right%</router-link></li>
|
<li><router-link to="/i/settings" :data-active="$route.name == 'settings'">%fa:cog%%i18n:@settings%%fa:angle-right%</router-link></li>
|
||||||
|
<li v-if="$store.getters.isSignedIn && $store.state.i.isAdmin"><router-link to="/admin">%fa:terminal%<span>%i18n:@admin%</span>%fa:angle-right%</router-link></li>
|
||||||
<li @click="dark"><p><template v-if="$store.state.device.darkmode">%fa:moon%</template><template v-else>%fa:R moon%</template><span>%i18n:@darkmode%</span></p></li>
|
<li @click="dark"><p><template v-if="$store.state.device.darkmode">%fa:moon%</template><template v-else>%fa:R moon%</template><span>%i18n:@darkmode%</span></p></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
@ -41,7 +42,7 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import { docsUrl, lang } from '../../../config';
|
import { lang } from '../../../config';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
props: ['isOpen'],
|
props: ['isOpen'],
|
||||||
@ -50,7 +51,7 @@ export default Vue.extend({
|
|||||||
hasGameInvitation: false,
|
hasGameInvitation: false,
|
||||||
connection: null,
|
connection: null,
|
||||||
connectionId: null,
|
connectionId: null,
|
||||||
aboutUrl: `${docsUrl}/${lang}/about`
|
aboutUrl: `/docs/${lang}/about`
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
|
@ -59,7 +59,8 @@ export default Vue.extend({
|
|||||||
listId: this.list.id,
|
listId: this.list.id,
|
||||||
limit: fetchLimit + 1,
|
limit: fetchLimit + 1,
|
||||||
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
||||||
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
|
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
|
||||||
|
includeLocalRenotes: this.$store.state.settings.showLocalRenotes
|
||||||
}).then(notes => {
|
}).then(notes => {
|
||||||
if (notes.length == fetchLimit + 1) {
|
if (notes.length == fetchLimit + 1) {
|
||||||
notes.pop();
|
notes.pop();
|
||||||
@ -82,7 +83,8 @@ export default Vue.extend({
|
|||||||
limit: fetchLimit + 1,
|
limit: fetchLimit + 1,
|
||||||
untilId: (this.$refs.timeline as any).tail().id,
|
untilId: (this.$refs.timeline as any).tail().id,
|
||||||
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
||||||
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
|
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
|
||||||
|
includeLocalRenotes: this.$store.state.settings.showLocalRenotes
|
||||||
});
|
});
|
||||||
|
|
||||||
promise.then(notes => {
|
promise.then(notes => {
|
||||||
|
@ -25,7 +25,6 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import Progress from '../../../common/scripts/loading';
|
import Progress from '../../../common/scripts/loading';
|
||||||
import * as config from '../../../config';
|
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
data() {
|
data() {
|
||||||
@ -44,7 +43,7 @@ export default Vue.extend({
|
|||||||
window.addEventListener('popstate', this.onPopState);
|
window.addEventListener('popstate', this.onPopState);
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
document.title = `${config.name} Drive`;
|
document.title = `${(this as any).os.instanceName} Drive`;
|
||||||
document.documentElement.style.background = '#fff';
|
document.documentElement.style.background = '#fff';
|
||||||
},
|
},
|
||||||
beforeDestroy() {
|
beforeDestroy() {
|
||||||
@ -64,7 +63,7 @@ export default Vue.extend({
|
|||||||
(this.$refs as any).browser.openContextMenu();
|
(this.$refs as any).browser.openContextMenu();
|
||||||
},
|
},
|
||||||
onMoveRoot(silent) {
|
onMoveRoot(silent) {
|
||||||
const title = `${config.name} Drive`;
|
const title = `${(this as any).os.instanceName} Drive`;
|
||||||
|
|
||||||
if (!silent) {
|
if (!silent) {
|
||||||
// Rewrite URL
|
// Rewrite URL
|
||||||
@ -77,7 +76,7 @@ export default Vue.extend({
|
|||||||
this.folder = null;
|
this.folder = null;
|
||||||
},
|
},
|
||||||
onOpenFolder(folder, silent) {
|
onOpenFolder(folder, silent) {
|
||||||
const title = `${folder.name} | ${config.name} Drive`;
|
const title = `${folder.name} | ${(this as any).os.instanceName} Drive`;
|
||||||
|
|
||||||
if (!silent) {
|
if (!silent) {
|
||||||
// Rewrite URL
|
// Rewrite URL
|
||||||
@ -90,7 +89,7 @@ export default Vue.extend({
|
|||||||
this.folder = folder;
|
this.folder = folder;
|
||||||
},
|
},
|
||||||
onOpenFile(file, silent) {
|
onOpenFile(file, silent) {
|
||||||
const title = `${file.name} | ${config.name} Drive`;
|
const title = `${file.name} | ${(this as any).os.instanceName} Drive`;
|
||||||
|
|
||||||
if (!silent) {
|
if (!silent) {
|
||||||
// Rewrite URL
|
// Rewrite URL
|
||||||
|
@ -14,7 +14,6 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import Progress from '../../../common/scripts/loading';
|
import Progress from '../../../common/scripts/loading';
|
||||||
import * as config from '../../../config';
|
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
data() {
|
data() {
|
||||||
@ -29,7 +28,7 @@ export default Vue.extend({
|
|||||||
this.fetch();
|
this.fetch();
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
document.title = `${config.name} | %i18n:@notifications%`;
|
document.title = `${(this as any).os.instanceName} | %i18n:@notifications%`;
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
fetch() {
|
fetch() {
|
||||||
|
@ -21,7 +21,6 @@ import Vue from 'vue';
|
|||||||
import Progress from '../../../common/scripts/loading';
|
import Progress from '../../../common/scripts/loading';
|
||||||
import parseAcct from '../../../../../misc/acct/parse';
|
import parseAcct from '../../../../../misc/acct/parse';
|
||||||
import getUserName from '../../../../../misc/get-user-name';
|
import getUserName from '../../../../../misc/get-user-name';
|
||||||
import * as config from '../../../config';
|
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
data() {
|
data() {
|
||||||
@ -50,7 +49,7 @@ export default Vue.extend({
|
|||||||
this.user = user;
|
this.user = user;
|
||||||
this.fetching = false;
|
this.fetching = false;
|
||||||
|
|
||||||
document.title = '%i18n:@followers-of%'.replace('{}', this.name) + ' | ' + config.name;
|
document.title = '%i18n:@followers-of%'.replace('{}', this.name) + ' | ' + (this as any).os.instanceName;
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
onLoaded() {
|
onLoaded() {
|
||||||
|
@ -20,7 +20,6 @@
|
|||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import Progress from '../../../common/scripts/loading';
|
import Progress from '../../../common/scripts/loading';
|
||||||
import parseAcct from '../../../../../misc/acct/parse';
|
import parseAcct from '../../../../../misc/acct/parse';
|
||||||
import * as config from '../../../config';
|
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
data() {
|
data() {
|
||||||
@ -49,7 +48,7 @@ export default Vue.extend({
|
|||||||
this.user = user;
|
this.user = user;
|
||||||
this.fetching = false;
|
this.fetching = false;
|
||||||
|
|
||||||
document.title = '%i18n:@followers-of%'.replace('{}', this.name) + ' | ' + config.name;
|
document.title = '%i18n:@followers-of%'.replace('{}', this.name) + ' | ' + (this as any).os.instanceName;
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
onLoaded() {
|
onLoaded() {
|
||||||
|
@ -7,11 +7,10 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import * as config from '../../../../config';
|
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
mounted() {
|
mounted() {
|
||||||
document.title = `${config.name} %i18n:@reversi%`;
|
document.title = `${(this as any).os.instanceName} %i18n:@reversi%`;
|
||||||
document.documentElement.style.background = '#fff';
|
document.documentElement.style.background = '#fff';
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
@ -95,7 +95,8 @@ export default Vue.extend({
|
|||||||
limit: fetchLimit + 1,
|
limit: fetchLimit + 1,
|
||||||
untilDate: this.date ? this.date.getTime() : undefined,
|
untilDate: this.date ? this.date.getTime() : undefined,
|
||||||
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
||||||
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
|
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
|
||||||
|
includeLocalRenotes: this.$store.state.settings.showLocalRenotes
|
||||||
}).then(notes => {
|
}).then(notes => {
|
||||||
if (notes.length == fetchLimit + 1) {
|
if (notes.length == fetchLimit + 1) {
|
||||||
notes.pop();
|
notes.pop();
|
||||||
@ -117,7 +118,8 @@ export default Vue.extend({
|
|||||||
limit: fetchLimit + 1,
|
limit: fetchLimit + 1,
|
||||||
untilId: (this.$refs.timeline as any).tail().id,
|
untilId: (this.$refs.timeline as any).tail().id,
|
||||||
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
||||||
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes
|
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
|
||||||
|
includeLocalRenotes: this.$store.state.settings.showLocalRenotes
|
||||||
});
|
});
|
||||||
|
|
||||||
promise.then(notes => {
|
promise.then(notes => {
|
||||||
|
@ -49,7 +49,6 @@
|
|||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import Progress from '../../../common/scripts/loading';
|
import Progress from '../../../common/scripts/loading';
|
||||||
import XTl from './home.timeline.vue';
|
import XTl from './home.timeline.vue';
|
||||||
import * as config from '../../../config';
|
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
components: {
|
components: {
|
||||||
@ -97,7 +96,7 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
mounted() {
|
mounted() {
|
||||||
document.title = config.name;
|
document.title = (this as any).os.instanceName;
|
||||||
|
|
||||||
Progress.start();
|
Progress.start();
|
||||||
|
|
||||||
|
@ -11,7 +11,6 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import parseAcct from '../../../../../misc/acct/parse';
|
import parseAcct from '../../../../../misc/acct/parse';
|
||||||
import * as config from '../../../config';
|
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
data() {
|
data() {
|
||||||
@ -48,7 +47,7 @@ export default Vue.extend({
|
|||||||
this.user = user;
|
this.user = user;
|
||||||
this.fetching = false;
|
this.fetching = false;
|
||||||
|
|
||||||
document.title = `%i18n:@messaging%: ${Vue.filter('userName')(this.user)} | ${config.name}`;
|
document.title = `%i18n:@messaging%: ${Vue.filter('userName')(this.user)} | ${(this as any).os.instanceName}`;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,11 +8,10 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import getAcct from '../../../../../misc/acct/render';
|
import getAcct from '../../../../../misc/acct/render';
|
||||||
import * as config from '../../../config';
|
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
mounted() {
|
mounted() {
|
||||||
document.title = `${config.name} %i18n:@messaging%`;
|
document.title = `${(this as any).os.instanceName} %i18n:@messaging%`;
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
navigate(user) {
|
navigate(user) {
|
||||||
|
@ -16,7 +16,6 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import Progress from '../../../common/scripts/loading';
|
import Progress from '../../../common/scripts/loading';
|
||||||
import * as config from '../../../config';
|
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
data() {
|
data() {
|
||||||
@ -32,7 +31,7 @@ export default Vue.extend({
|
|||||||
this.fetch();
|
this.fetch();
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
document.title = config.name;
|
document.title = (this as any).os.instanceName;
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
fetch() {
|
fetch() {
|
||||||
|
@ -12,7 +12,6 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import Progress from '../../../common/scripts/loading';
|
import Progress from '../../../common/scripts/loading';
|
||||||
import * as config from '../../../config';
|
|
||||||
|
|
||||||
const limit = 20;
|
const limit = 20;
|
||||||
|
|
||||||
@ -35,7 +34,7 @@ export default Vue.extend({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
document.title = `%i18n:@search%: ${this.q} | ${config.name}`;
|
document.title = `%i18n:@search%: ${this.q} | ${(this as any).os.instanceName}`;
|
||||||
|
|
||||||
this.fetch();
|
this.fetch();
|
||||||
},
|
},
|
||||||
|
@ -13,14 +13,16 @@
|
|||||||
<ui-switch v-model="darkmode">%i18n:@dark-mode%</ui-switch>
|
<ui-switch v-model="darkmode">%i18n:@dark-mode%</ui-switch>
|
||||||
<ui-switch v-model="$store.state.settings.circleIcons" @change="onChangeCircleIcons">%i18n:@circle-icons%</ui-switch>
|
<ui-switch v-model="$store.state.settings.circleIcons" @change="onChangeCircleIcons">%i18n:@circle-icons%</ui-switch>
|
||||||
<ui-switch v-model="$store.state.settings.iLikeSushi" @change="onChangeILikeSushi">%i18n:common.i-like-sushi%</ui-switch>
|
<ui-switch v-model="$store.state.settings.iLikeSushi" @change="onChangeILikeSushi">%i18n:common.i-like-sushi%</ui-switch>
|
||||||
<ui-switch v-model="$store.state.settings.reversiBoardLabels" @change="onChangeReversiBoardLabels">%i18n:common.show-reversi-board-labels%</ui-switch>
|
|
||||||
<ui-switch v-model="$store.state.settings.disableAnimatedMfm" @change="onChangeDisableAnimatedMfm">%i18n:common.disable-animated-mfm%</ui-switch>
|
<ui-switch v-model="$store.state.settings.disableAnimatedMfm" @change="onChangeDisableAnimatedMfm">%i18n:common.disable-animated-mfm%</ui-switch>
|
||||||
|
<ui-switch v-model="$store.state.settings.games.reversi.showBoardLabels" @change="onChangeReversiBoardLabels">%i18n:common.show-reversi-board-labels%</ui-switch>
|
||||||
|
<ui-switch v-model="$store.state.settings.games.reversi.useContrastStones" @change="onChangeUseContrastReversiStones">%i18n:common.use-contrast-reversi-stones%</ui-switch>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<div>%i18n:@timeline%</div>
|
<div>%i18n:@timeline%</div>
|
||||||
<ui-switch v-model="$store.state.settings.showReplyTarget" @change="onChangeShowReplyTarget">%i18n:@show-reply-target%</ui-switch>
|
<ui-switch v-model="$store.state.settings.showReplyTarget" @change="onChangeShowReplyTarget">%i18n:@show-reply-target%</ui-switch>
|
||||||
<ui-switch v-model="$store.state.settings.showMyRenotes" @change="onChangeShowMyRenotes">%i18n:@show-my-renotes%</ui-switch>
|
<ui-switch v-model="$store.state.settings.showMyRenotes" @change="onChangeShowMyRenotes">%i18n:@show-my-renotes%</ui-switch>
|
||||||
<ui-switch v-model="$store.state.settings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes">%i18n:@show-renoted-my-notes%</ui-switch>
|
<ui-switch v-model="$store.state.settings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes">%i18n:@show-renoted-my-notes%</ui-switch>
|
||||||
|
<ui-switch v-model="$store.state.settings.showLocalRenotes" @change="onChangeShowLocalRenotes">%i18n:@show-local-renotes%</ui-switch>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
@ -188,7 +190,14 @@ export default Vue.extend({
|
|||||||
|
|
||||||
onChangeReversiBoardLabels(v) {
|
onChangeReversiBoardLabels(v) {
|
||||||
this.$store.dispatch('settings/set', {
|
this.$store.dispatch('settings/set', {
|
||||||
key: 'reversiBoardLabels',
|
key: 'games.reversi.showBoardLabels',
|
||||||
|
value: v
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
onChangeUseContrastReversiStones(v) {
|
||||||
|
this.$store.dispatch('settings/set', {
|
||||||
|
key: 'games.reversi.useContrastStones',
|
||||||
value: v
|
value: v
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
@ -221,6 +230,13 @@ export default Vue.extend({
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
onChangeShowLocalRenotes(v) {
|
||||||
|
this.$store.dispatch('settings/set', {
|
||||||
|
key: 'showLocalRenotes',
|
||||||
|
value: v
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
checkForUpdate() {
|
checkForUpdate() {
|
||||||
this.checkingForUpdate = true;
|
this.checkingForUpdate = true;
|
||||||
checkForUpdate((this as any).os, true, true).then(newer => {
|
checkForUpdate((this as any).os, true, true).then(newer => {
|
||||||
|
@ -61,7 +61,6 @@ export default Vue.extend({
|
|||||||
birthday: null,
|
birthday: null,
|
||||||
avatarId: null,
|
avatarId: null,
|
||||||
bannerId: null,
|
bannerId: null,
|
||||||
isBot: false,
|
|
||||||
isCat: false,
|
isCat: false,
|
||||||
saving: false,
|
saving: false,
|
||||||
avatarUploading: false,
|
avatarUploading: false,
|
||||||
@ -77,7 +76,6 @@ export default Vue.extend({
|
|||||||
this.birthday = this.$store.state.i.profile.birthday;
|
this.birthday = this.$store.state.i.profile.birthday;
|
||||||
this.avatarId = this.$store.state.i.avatarId;
|
this.avatarId = this.$store.state.i.avatarId;
|
||||||
this.bannerId = this.$store.state.i.bannerId;
|
this.bannerId = this.$store.state.i.bannerId;
|
||||||
this.isBot = this.$store.state.i.isBot;
|
|
||||||
this.isCat = this.$store.state.i.isCat;
|
this.isCat = this.$store.state.i.isCat;
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -100,7 +98,7 @@ export default Vue.extend({
|
|||||||
})
|
})
|
||||||
.catch(e => {
|
.catch(e => {
|
||||||
this.avatarUploading = false;
|
this.avatarUploading = false;
|
||||||
alert('%18n:!@upload-failed%');
|
alert('%18n:@upload-failed%');
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -122,7 +120,7 @@ export default Vue.extend({
|
|||||||
})
|
})
|
||||||
.catch(e => {
|
.catch(e => {
|
||||||
this.bannerUploading = false;
|
this.bannerUploading = false;
|
||||||
alert('%18n:!@upload-failed%');
|
alert('%18n:@upload-failed%');
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -136,7 +134,6 @@ export default Vue.extend({
|
|||||||
birthday: this.birthday || null,
|
birthday: this.birthday || null,
|
||||||
avatarId: this.avatarId,
|
avatarId: this.avatarId,
|
||||||
bannerId: this.bannerId,
|
bannerId: this.bannerId,
|
||||||
isBot: this.isBot,
|
|
||||||
isCat: this.isCat
|
isCat: this.isCat
|
||||||
}).then(i => {
|
}).then(i => {
|
||||||
this.saving = false;
|
this.saving = false;
|
||||||
|
@ -12,12 +12,11 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import * as config from '../../../config';
|
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
name: config.name,
|
name: (this as any).os.instanceName,
|
||||||
posted: false,
|
posted: false,
|
||||||
text: new URLSearchParams(location.search).get('text')
|
text: new URLSearchParams(location.search).get('text')
|
||||||
};
|
};
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
<a class="avatar">
|
<a class="avatar">
|
||||||
<img :src="user.avatarUrl" alt="avatar"/>
|
<img :src="user.avatarUrl" alt="avatar"/>
|
||||||
</a>
|
</a>
|
||||||
|
<mk-mute-button v-if="$store.state.i.id != user.id" :user="user"/>
|
||||||
<mk-follow-button v-if="$store.getters.isSignedIn && $store.state.i.id != user.id" :user="user"/>
|
<mk-follow-button v-if="$store.getters.isSignedIn && $store.state.i.id != user.id" :user="user"/>
|
||||||
</div>
|
</div>
|
||||||
<div class="title">
|
<div class="title">
|
||||||
@ -67,7 +68,6 @@ import * as age from 's-age';
|
|||||||
import parseAcct from '../../../../../misc/acct/parse';
|
import parseAcct from '../../../../../misc/acct/parse';
|
||||||
import Progress from '../../../common/scripts/loading';
|
import Progress from '../../../common/scripts/loading';
|
||||||
import XHome from './user/home.vue';
|
import XHome from './user/home.vue';
|
||||||
import * as config from '../../../config';
|
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
components: {
|
components: {
|
||||||
@ -107,7 +107,7 @@ export default Vue.extend({
|
|||||||
this.fetching = false;
|
this.fetching = false;
|
||||||
|
|
||||||
Progress.done();
|
Progress.done();
|
||||||
document.title = Vue.filter('userName')(this.user) + ' | ' + config.name;
|
document.title = Vue.filter('userName')(this.user) + ' | ' + (this as any).os.instanceName;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -185,6 +185,9 @@ root(isDark)
|
|||||||
border 4px solid $bg
|
border 4px solid $bg
|
||||||
border-radius 12px
|
border-radius 12px
|
||||||
|
|
||||||
|
> .mk-mute-button
|
||||||
|
float right
|
||||||
|
|
||||||
> .mk-follow-button
|
> .mk-follow-button
|
||||||
float right
|
float right
|
||||||
|
|
||||||
@ -248,7 +251,7 @@ root(isDark)
|
|||||||
top 47px
|
top 47px
|
||||||
box-shadow 0 4px 4px isDark ? rgba(#000, 0.3) : rgba(#000, 0.07)
|
box-shadow 0 4px 4px isDark ? rgba(#000, 0.3) : rgba(#000, 0.07)
|
||||||
background-color $bg
|
background-color $bg
|
||||||
z-index 1
|
z-index 2
|
||||||
|
|
||||||
> .nav-container
|
> .nav-container
|
||||||
display flex
|
display flex
|
||||||
|
@ -30,7 +30,7 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import { apiUrl, copyright, host, name, description } from '../../../config';
|
import { apiUrl, copyright, host } from '../../../config';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
data() {
|
data() {
|
||||||
@ -39,12 +39,17 @@ export default Vue.extend({
|
|||||||
copyright,
|
copyright,
|
||||||
stats: null,
|
stats: null,
|
||||||
host,
|
host,
|
||||||
name,
|
name: 'Misskey',
|
||||||
description,
|
description: '',
|
||||||
tags: []
|
tags: []
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
|
(this as any).os.getMeta().then(meta => {
|
||||||
|
this.name = meta.name;
|
||||||
|
this.description = meta.description;
|
||||||
|
});
|
||||||
|
|
||||||
(this as any).api('stats').then(stats => {
|
(this as any).api('stats').then(stats => {
|
||||||
this.stats = stats;
|
this.stats = stats;
|
||||||
});
|
});
|
||||||
|
@ -53,7 +53,6 @@
|
|||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import * as XDraggable from 'vuedraggable';
|
import * as XDraggable from 'vuedraggable';
|
||||||
import * as uuid from 'uuid';
|
import * as uuid from 'uuid';
|
||||||
import * as config from '../../../config';
|
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
components: {
|
components: {
|
||||||
@ -103,7 +102,7 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
mounted() {
|
mounted() {
|
||||||
document.title = config.name;
|
document.title = (this as any).os.instanceName;
|
||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
|
@ -1,10 +0,0 @@
|
|||||||
@import "../app"
|
|
||||||
@import "../reset"
|
|
||||||
|
|
||||||
html
|
|
||||||
color #456267
|
|
||||||
background #fff
|
|
||||||
|
|
||||||
body
|
|
||||||
margin 0
|
|
||||||
padding 0
|
|
@ -1,209 +0,0 @@
|
|||||||
<mk-index>
|
|
||||||
<h1>Misskey<i>Statistics</i></h1>
|
|
||||||
<main v-if="!initializing">
|
|
||||||
<mk-users stats={ stats }/>
|
|
||||||
<mk-notes stats={ stats }/>
|
|
||||||
</main>
|
|
||||||
<footer><a href={ _URL_ }>{ _HOST_ }</a></footer>
|
|
||||||
<style lang="stylus" scoped>
|
|
||||||
:scope
|
|
||||||
display block
|
|
||||||
margin 0 auto
|
|
||||||
padding 0 16px
|
|
||||||
max-width 700px
|
|
||||||
|
|
||||||
> h1
|
|
||||||
margin 0
|
|
||||||
padding 24px 0 0 0
|
|
||||||
font-size 24px
|
|
||||||
font-weight normal
|
|
||||||
|
|
||||||
> i
|
|
||||||
font-style normal
|
|
||||||
color #f43b16
|
|
||||||
|
|
||||||
> main
|
|
||||||
> *
|
|
||||||
margin 24px 0
|
|
||||||
padding-top 24px
|
|
||||||
border-top solid 1px #eee
|
|
||||||
|
|
||||||
> h2
|
|
||||||
margin 0 0 12px 0
|
|
||||||
font-size 18px
|
|
||||||
font-weight normal
|
|
||||||
|
|
||||||
> footer
|
|
||||||
margin 24px 0
|
|
||||||
text-align center
|
|
||||||
|
|
||||||
> a
|
|
||||||
color #546567
|
|
||||||
</style>
|
|
||||||
<script lang="typescript">
|
|
||||||
this.mixin('api');
|
|
||||||
|
|
||||||
this.initializing = true;
|
|
||||||
|
|
||||||
this.on('mount', () => {
|
|
||||||
this.$root.$data.os.api('stats').then(stats => {
|
|
||||||
this.update({
|
|
||||||
initializing: false,
|
|
||||||
stats
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
</mk-index>
|
|
||||||
|
|
||||||
<mk-notes>
|
|
||||||
<h2>%i18n:stats.notes-count% <b>{ stats.notesCount }</b></h2>
|
|
||||||
<mk-notes-chart v-if="!initializing" data={ data }/>
|
|
||||||
<style lang="stylus" scoped>
|
|
||||||
:scope
|
|
||||||
display block
|
|
||||||
</style>
|
|
||||||
<script lang="typescript">
|
|
||||||
this.mixin('api');
|
|
||||||
|
|
||||||
this.initializing = true;
|
|
||||||
this.stats = this.opts.stats;
|
|
||||||
|
|
||||||
this.on('mount', () => {
|
|
||||||
this.$root.$data.os.api('aggregation/notes', {
|
|
||||||
limit: 365
|
|
||||||
}).then(data => {
|
|
||||||
this.update({
|
|
||||||
initializing: false,
|
|
||||||
data
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
</mk-notes>
|
|
||||||
|
|
||||||
<mk-users>
|
|
||||||
<h2>%i18n:stats.users-count% <b>{ stats.usersCount }</b></h2>
|
|
||||||
<mk-users-chart v-if="!initializing" data={ data }/>
|
|
||||||
<style lang="stylus" scoped>
|
|
||||||
:scope
|
|
||||||
display block
|
|
||||||
</style>
|
|
||||||
<script lang="typescript">
|
|
||||||
this.mixin('api');
|
|
||||||
|
|
||||||
this.initializing = true;
|
|
||||||
this.stats = this.opts.stats;
|
|
||||||
|
|
||||||
this.on('mount', () => {
|
|
||||||
this.$root.$data.os.api('aggregation/users', {
|
|
||||||
limit: 365
|
|
||||||
}).then(data => {
|
|
||||||
this.update({
|
|
||||||
initializing: false,
|
|
||||||
data
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
</mk-users>
|
|
||||||
|
|
||||||
<mk-notes-chart>
|
|
||||||
<svg riot-viewBox="0 0 { viewBoxX } { viewBoxY }" preserveAspectRatio="none">
|
|
||||||
<title>Black ... Total<br/>Blue ... Notes<br/>Red ... Replies<br/>Green ... Renotes</title>
|
|
||||||
<polyline
|
|
||||||
riot-points={ pointsNote }
|
|
||||||
fill="none"
|
|
||||||
stroke-width="1"
|
|
||||||
stroke="#41ddde"/>
|
|
||||||
<polyline
|
|
||||||
riot-points={ pointsReply }
|
|
||||||
fill="none"
|
|
||||||
stroke-width="1"
|
|
||||||
stroke="#f7796c"/>
|
|
||||||
<polyline
|
|
||||||
riot-points={ pointsRenote }
|
|
||||||
fill="none"
|
|
||||||
stroke-width="1"
|
|
||||||
stroke="#a1de41"/>
|
|
||||||
<polyline
|
|
||||||
riot-points={ pointsTotal }
|
|
||||||
fill="none"
|
|
||||||
stroke-width="1"
|
|
||||||
stroke="#555"
|
|
||||||
stroke-dasharray="2 2"/>
|
|
||||||
</svg>
|
|
||||||
<style lang="stylus" scoped>
|
|
||||||
:scope
|
|
||||||
display block
|
|
||||||
|
|
||||||
> svg
|
|
||||||
display block
|
|
||||||
padding 1px
|
|
||||||
width 100%
|
|
||||||
</style>
|
|
||||||
<script lang="typescript">
|
|
||||||
this.viewBoxX = 365;
|
|
||||||
this.viewBoxY = 80;
|
|
||||||
|
|
||||||
this.data = this.opts.data.reverse();
|
|
||||||
this.data.forEach(d => d.total = d.notes + d.replies + d.renotes);
|
|
||||||
const peak = Math.max.apply(null, this.data.map(d => d.total));
|
|
||||||
|
|
||||||
this.on('mount', () => {
|
|
||||||
this.render();
|
|
||||||
});
|
|
||||||
|
|
||||||
this.render = () => {
|
|
||||||
this.update({
|
|
||||||
pointsNote: this.data.map((d, i) => `${i},${(1 - (d.notes / peak)) * this.viewBoxY}`).join(' '),
|
|
||||||
pointsReply: this.data.map((d, i) => `${i},${(1 - (d.replies / peak)) * this.viewBoxY}`).join(' '),
|
|
||||||
pointsRenote: this.data.map((d, i) => `${i},${(1 - (d.renotes / peak)) * this.viewBoxY}`).join(' '),
|
|
||||||
pointsTotal: this.data.map((d, i) => `${i},${(1 - (d.total / peak)) * this.viewBoxY}`).join(' ')
|
|
||||||
});
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
</mk-notes-chart>
|
|
||||||
|
|
||||||
<mk-users-chart>
|
|
||||||
<svg riot-viewBox="0 0 { viewBoxX } { viewBoxY }" preserveAspectRatio="none">
|
|
||||||
<polyline
|
|
||||||
riot-points={ createdPoints }
|
|
||||||
fill="none"
|
|
||||||
stroke-width="1"
|
|
||||||
stroke="#1cde84"/>
|
|
||||||
<polyline
|
|
||||||
riot-points={ totalPoints }
|
|
||||||
fill="none"
|
|
||||||
stroke-width="1"
|
|
||||||
stroke="#555"/>
|
|
||||||
</svg>
|
|
||||||
<style lang="stylus" scoped>
|
|
||||||
:scope
|
|
||||||
display block
|
|
||||||
|
|
||||||
> svg
|
|
||||||
display block
|
|
||||||
padding 1px
|
|
||||||
width 100%
|
|
||||||
</style>
|
|
||||||
<script lang="typescript">
|
|
||||||
this.viewBoxX = 365;
|
|
||||||
this.viewBoxY = 80;
|
|
||||||
|
|
||||||
this.data = this.opts.data.reverse();
|
|
||||||
const totalPeak = Math.max.apply(null, this.data.map(d => d.total));
|
|
||||||
const createdPeak = Math.max.apply(null, this.data.map(d => d.created));
|
|
||||||
|
|
||||||
this.on('mount', () => {
|
|
||||||
this.render();
|
|
||||||
});
|
|
||||||
|
|
||||||
this.render = () => {
|
|
||||||
this.update({
|
|
||||||
totalPoints: this.data.map((d, i) => `${i},${(1 - (d.total / totalPeak)) * this.viewBoxY}`).join(' '),
|
|
||||||
createdPoints: this.data.map((d, i) => `${i},${(1 - (d.created / createdPeak)) * this.viewBoxY}`).join(' ')
|
|
||||||
});
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
</mk-users-chart>
|
|
@ -1 +0,0 @@
|
|||||||
require('./index.tag');
|
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user