Compare commits
279 Commits
Author | SHA1 | Date | |
---|---|---|---|
28d953933a | |||
77d9ae92f6 | |||
7d00754587 | |||
982b5eb698 | |||
20a9c25d70 | |||
eebed9944c | |||
507a192489 | |||
689dc3b9d5 | |||
d765803b83 | |||
0fabb6a057 | |||
23efaae85e | |||
5b2f15726f | |||
bc3a5f3512 | |||
ba05f236bd | |||
6ac92ac4b8 | |||
d9a1cd082c | |||
a32071541a | |||
eb4f625bbd | |||
e36d45507a | |||
e32884f07f | |||
1344ffa67d | |||
e07210524f | |||
6f3996c061 | |||
fd06fd4dc1 | |||
d86d5feae3 | |||
0e20a8f07b | |||
a40d784e3a | |||
e145131b95 | |||
92873b8bb5 | |||
d359b71c81 | |||
f1a0bf4257 | |||
ea4e2da58d | |||
1301b3b49e | |||
424625846e | |||
0790dd7a2c | |||
b238d7b934 | |||
011e4fded2 | |||
2fe872a9c9 | |||
02c1515a0f | |||
408118a1e8 | |||
6a45bb21c3 | |||
5d4e9aa949 | |||
c87b98c2af | |||
5a13c38a6d | |||
67f60ab307 | |||
08c278578d | |||
5e9d2d079d | |||
0e01fb5fc3 | |||
d44dc7e00d | |||
82ee3a538b | |||
fdc16253d1 | |||
7e83cd2d74 | |||
083eb75eff | |||
f50afa768f | |||
1a80fe91ce | |||
4de1a5ef6c | |||
d0d389299b | |||
dc70804350 | |||
78d691571b | |||
b7cbf4a42a | |||
87ca7c50b4 | |||
6c7550b3f3 | |||
4239ffa13f | |||
c6cfb0df76 | |||
380cf0de69 | |||
11f25ea2e7 | |||
ef62497777 | |||
2824d8a5b6 | |||
1c84c0828e | |||
39e4494836 | |||
dc174ca759 | |||
b61cfd0407 | |||
53405e54a8 | |||
c7ef7531a9 | |||
626b4bf314 | |||
323d0e0154 | |||
6d1338317b | |||
1ce26d8aec | |||
7ba3d3ec98 | |||
24f58b3ecb | |||
d1d8587096 | |||
96db630f5e | |||
91fae0ae8b | |||
bfa1235b48 | |||
95d324a413 | |||
ef3535319b | |||
e9c04f4fa0 | |||
e7180d529a | |||
b8cd872738 | |||
efaaa76185 | |||
19e1f996a6 | |||
40a69bf200 | |||
9e3abb9989 | |||
5ba48e06f7 | |||
8b3a0a524b | |||
d9fe9cc5df | |||
b202c7906a | |||
b9c868cac6 | |||
33adf3c88d | |||
8b84f40975 | |||
fa131d2023 | |||
a83b38b50a | |||
dcd7b286ef | |||
b85bf769cd | |||
630a20d61e | |||
88c3794cf1 | |||
42eb457ad0 | |||
d153a8de20 | |||
7f7551f44c | |||
23082b55a4 | |||
dac7387a7f | |||
8c6856d894 | |||
2c0e514fb2 | |||
1917b0339e | |||
c05419f223 | |||
e0deaec695 | |||
d70e2a788e | |||
7343e6e2e8 | |||
106d4cc0d6 | |||
c98879cb7a | |||
9ca755c313 | |||
25e0b98840 | |||
5599c43c71 | |||
eb7597d7e4 | |||
d5767e92c4 | |||
ba3749d373 | |||
d8088acdf2 | |||
ad93e0aa3d | |||
691e58f03d | |||
95d5bccfca | |||
2aa8e0a4bf | |||
6e96d6677d | |||
8816c20f51 | |||
e955fe1ffd | |||
5cbcac713a | |||
2b50364ab4 | |||
fa04ac789e | |||
95ce8dce3d | |||
0b5eec4ca8 | |||
6d9716f90e | |||
aa31061d90 | |||
acc7797dff | |||
7959196dc7 | |||
c6ff6939a5 | |||
769960f29e | |||
d92e9759f3 | |||
bf7e19b288 | |||
98954cd6d4 | |||
538bb978ed | |||
10232c5866 | |||
5cd6a0db16 | |||
ff0a05a2d6 | |||
e34b264af2 | |||
00d79487cd | |||
3cace734c7 | |||
f428372869 | |||
5dd2feba9b | |||
a1b026239e | |||
40735ce76b | |||
4a00c13b33 | |||
8e359d54bd | |||
fb76dff836 | |||
2448bf4e4e | |||
91e0fc8c62 | |||
b4f86feddb | |||
7167c8c593 | |||
51b79d4250 | |||
925fcc1c64 | |||
fcdc14862c | |||
dac2844cae | |||
706b0cea16 | |||
842e7844c7 | |||
1dceda50d8 | |||
af8b9abba4 | |||
07b07685fa | |||
cde43fe3c8 | |||
2fe84aa75b | |||
7d79a4840d | |||
3ee9479572 | |||
ccf8e44acc | |||
451acb77df | |||
e2c6227f47 | |||
ebd1c877ad | |||
498094b3c7 | |||
1cc183ecdb | |||
e8948452fd | |||
ade7e62836 | |||
395cfa6108 | |||
b5ff2abdb9 | |||
229e85b2c5 | |||
37058e3480 | |||
a1b82e9723 | |||
db943df0c8 | |||
ff8d300ea8 | |||
8b490b9b94 | |||
f83f8631ac | |||
16da91d8d1 | |||
8ffd62b462 | |||
935367e167 | |||
00618260f2 | |||
77d66fac7b | |||
17d7f59b06 | |||
2561547db1 | |||
7738438616 | |||
3d8fc4a794 | |||
87b4e7905e | |||
13c5d4985a | |||
f0df4096fd | |||
5044424549 | |||
8ce67cdcd6 | |||
1915ccabdd | |||
6fea2f52f1 | |||
f77eaaa08a | |||
7c5bc03492 | |||
72a1af6cd4 | |||
4bce6f14f3 | |||
a38ce86f87 | |||
f539491502 | |||
d279f8e9ff | |||
eaec936fa6 | |||
a0735b0e7a | |||
5b039a1bee | |||
921609cab1 | |||
199573ccee | |||
977200b7cd | |||
6abff253ea | |||
ba64de334a | |||
dc1d7fa9d7 | |||
f42665d4bc | |||
a5eb19c878 | |||
60fa8e13d6 | |||
ecbaea463b | |||
814ddeb436 | |||
d6466106e8 | |||
633f5384f9 | |||
fa7989772c | |||
0e395612a6 | |||
fb3f52f3ad | |||
ba11c71d65 | |||
bdc3081167 | |||
430efcf1b9 | |||
996450dd7c | |||
fa779f0417 | |||
25cec6d28a | |||
c5f8403cea | |||
881df20f1b | |||
7d269c0441 | |||
639b483e6c | |||
e894ed5a8b | |||
d7808299fd | |||
f92e0c16d2 | |||
a951c337b8 | |||
db3efb3791 | |||
5f9a9867eb | |||
059a8e07d2 | |||
cf82f56e66 | |||
2778bd14d4 | |||
5b0446739c | |||
55f235d0ac | |||
4ec44c68e9 | |||
e6952d499a | |||
e0b82f827b | |||
0bccb17e82 | |||
b251b8c6a9 | |||
c2a62f632b | |||
37b5afa1a3 | |||
b80d0a3b12 | |||
9f60688d37 | |||
ca0ea9e57c | |||
a77a7e8112 | |||
b26ea2edc0 | |||
02b99dfd76 | |||
af02b0f115 | |||
9b3c379678 | |||
a423fd7695 | |||
de6e1d8c9b | |||
d9db3e8629 | |||
ac1c81b7d6 | |||
49b2eec534 |
@ -1,4 +1,4 @@
|
||||
<img src="https://github.com/syuilo/misskey/blob/b3f42e62af698a67c2250533c437569559f1fdf9/src/himasaku/resources/himasaku.png?raw=true" align="right" width="320px"/>
|
||||
<img src="https://github.com/syuilo/misskey/blob/develop/assets/ai-orig.png?raw=true" align="right" height="320px"/>
|
||||
|
||||
[](https://misskey.xyz/)
|
||||
================================================================
|
||||
@ -7,7 +7,7 @@
|
||||
[![][dependencies-badge]][dependencies-link]
|
||||
[](http://makeapullrequest.com) [](https://greenkeeper.io/)
|
||||
|
||||
Sophisticated microblogging platform, evolving forever.
|
||||
**Sophisticated microblogging platform, evolving forever.**
|
||||
|
||||
[Misskey](https://misskey.xyz) is a decentralized microblogging platform born on Earth.
|
||||
Since it exists within the Fediverse (a universe where various social media platforms are organized),
|
||||
|
BIN
assets/about/drive.png
Normal file
After Width: | Height: | Size: 110 KiB |
BIN
assets/about/post.png
Normal file
After Width: | Height: | Size: 344 KiB |
BIN
assets/about/reaction.png
Normal file
After Width: | Height: | Size: 24 KiB |
BIN
assets/about/ui.png
Normal file
After Width: | Height: | Size: 125 KiB |
BIN
assets/ai-orig.png
Normal file
After Width: | Height: | Size: 256 KiB |
BIN
assets/ai.png
Normal file
After Width: | Height: | Size: 243 KiB |
@ -109,6 +109,7 @@ Restart=always
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
CentOSで1024以下のポートを使用してMisskeyを使用する場合は`ExecStart=/usr/bin/sudo /usr/bin/npm start`に変更する必要があります。
|
||||
|
||||
3. `systemctl daemon-reload ; systemctl enable misskey` systemdを再読み込みしmisskeyサービスを有効化
|
||||
4. `systemctl start misskey` misskeyサービスの起動
|
||||
|
@ -6,6 +6,19 @@ common:
|
||||
misskey: "A ⭐ of fediverse"
|
||||
about-title: "A ⭐ of fediverse."
|
||||
about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。"
|
||||
intro:
|
||||
title: "Misskeyって?"
|
||||
about: "Misskeyはオープンソースの<b>分散型マイクロブログSNS</b>です。リッチで高度にカスタマイズできるUI、投稿へのリアクション、ファイルを一元管理できるドライブなど、先進的な機能を揃えています。また、Fediverseと呼ばれるネットワークに接続できるため、他のSNSともやり取りできます。例えば、あなたが何か投稿すると、その投稿はMisskeyだけでなく他のSNSにも伝わります。ちょうどある惑星から他の惑星に電波を発信している様子をイメージしてください。"
|
||||
features: "特徴"
|
||||
rich-contents: "投稿"
|
||||
rich-contents-desc: "自分の考え、話題の出来事、皆と共有したいことについて発信してください。必要であれば、様々な構文を使って投稿を装飾したり、好きな画像、動画などのファイルやアンケートを添付することもできます。"
|
||||
reaction: "リアクション"
|
||||
reaction-desc: "あなたの気持ちを伝える最も簡単な方法です。Misskeyは、他のユーザーの投稿に様々なリアクションを付けることができます。いちどMisskeyのリアクション機能を体験してしまうと、もう「いいね」の概念しか存在しないSNSには戻れなくなるかもしれません。"
|
||||
ui: "インターフェース"
|
||||
ui-desc: "どのようなUIが使いやすいかは人それぞれです。だから、Misskeyは自由度の高いUIを持っています。レイアウトやデザインを調整したり、カスタマイズ可能な様々なウィジェットを配置したりして、自分だけのホームを作ってください。"
|
||||
drive: "ドライブ"
|
||||
drive-desc: "以前投稿したことのある画像をまた投稿したくなったことはありませんか?もしくは、アップロードしたファイルをフォルダ分けして整理したくなったことはありませんか?Misskeyの根幹に組み込まれたドライブ機能によってそれらが解決します。ファイルの共有も簡単です。"
|
||||
outro: "他にもMisskeyにしかない機能はまだまだあるので、ぜひあなた自身の目で確かめてください。Misskeyは分散型SNSなので、このインスタンスが気に入らなければ他のインスタンスを試すこともできます。それでは、GLHF!"
|
||||
adblock:
|
||||
detected: "広告ブロッカーを無効にしてください"
|
||||
warning: "<strong>Misskeyは広告を掲載していません</strong>が、広告をブロックする機能が有効だと一部の機能が利用できなかったり、不具合が発生する場合があります。"
|
||||
@ -68,6 +81,15 @@ common:
|
||||
confused: "こまこまのこまり"
|
||||
rip: "RIP"
|
||||
pudding: "Pudding"
|
||||
note-visibility:
|
||||
public: "公開"
|
||||
home: "ホーム"
|
||||
home-desc: "ホームタイムラインにのみ公開"
|
||||
followers: "フォロワー"
|
||||
followers-desc: "自分のフォロワーにのみ公開"
|
||||
specified: "ダイレクト"
|
||||
specified-desc: "指定したユーザーにのみ公開"
|
||||
private: "非公開"
|
||||
note-placeholders:
|
||||
a: "今どうしてる?"
|
||||
b: "何かありましたか?"
|
||||
@ -87,6 +109,7 @@ common:
|
||||
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
||||
verified-user: "公式アカウント"
|
||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||
reversi:
|
||||
drawn: "引き分け"
|
||||
my-turn: "あなたのターンです"
|
||||
@ -260,6 +283,8 @@ common/views/components/nav.vue:
|
||||
develop: "開発者"
|
||||
feedback: "フィードバック"
|
||||
common/views/components/note-menu.vue:
|
||||
detail: "詳細"
|
||||
copy-link: "リンクをコピー"
|
||||
favorite: "お気に入り"
|
||||
pin: "ピン留め"
|
||||
delete: "削除"
|
||||
@ -337,6 +362,9 @@ common/views/components/visibility-chooser.vue:
|
||||
specified: "ダイレクト"
|
||||
specified-desc: "指定したユーザーにのみ公開"
|
||||
private: "非公開"
|
||||
common/views/components/trends.vue:
|
||||
count: "{}人が投稿"
|
||||
empty: "トレンドなし"
|
||||
common/views/widgets/broadcast.vue:
|
||||
fetching: "確認中"
|
||||
no-broadcasts: "お知らせはありません"
|
||||
@ -360,8 +388,6 @@ common/views/widgets/posts-monitor.vue:
|
||||
toggle: "表示を切り替え"
|
||||
common/views/widgets/hashtags.vue:
|
||||
title: "ハッシュタグ"
|
||||
count: "{}人が投稿"
|
||||
empty: "トレンドなし"
|
||||
common/views/widgets/server.vue:
|
||||
title: "サーバー情報"
|
||||
toggle: "表示を切り替え"
|
||||
@ -636,6 +662,9 @@ desktop/views/components/settings.vue:
|
||||
behaviour: "動作"
|
||||
fetch-on-scroll: "スクロールで自動読み込み"
|
||||
fetch-on-scroll-desc: "ページを下までスクロールしたときに自動で追加のコンテンツを読み込みます。"
|
||||
note-visibility: "投稿の公開範囲"
|
||||
default-note-visibility: "デフォルトの公開範囲"
|
||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||
auto-popout: "ウィンドウの自動ポップアウト"
|
||||
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
||||
advanced: "詳細設定"
|
||||
@ -647,6 +676,7 @@ desktop/views/components/settings.vue:
|
||||
delete-wallpaper: "壁紙を削除"
|
||||
dark-mode: "ダークモード"
|
||||
circle-icons: "円形のアイコンを使用"
|
||||
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
||||
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||
@ -861,7 +891,10 @@ desktop/views/pages/welcome.vue:
|
||||
signin-button: "やってる"
|
||||
signup-button: "やる"
|
||||
timeline: "タイムライン"
|
||||
announcements: "お知らせ"
|
||||
photos: "最近の画像"
|
||||
powered-by-misskey: "Powered by <b>Misskey</b>."
|
||||
info: "情報"
|
||||
desktop/views/pages/drive.vue:
|
||||
title: "Misskey Drive"
|
||||
desktop/views/pages/favorites.vue:
|
||||
@ -1149,6 +1182,7 @@ mobile/views/pages/settings.vue:
|
||||
dark-mode: "ダークモード"
|
||||
i-am-under-limited-internet: "私は通信を制限されている"
|
||||
circle-icons: "円形のアイコンを使用"
|
||||
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||
timeline: "タイムライン"
|
||||
show-reply-target: "リプライ先を表示する"
|
||||
show-my-renotes: "自分の行ったRenoteを表示する"
|
||||
@ -1157,8 +1191,14 @@ mobile/views/pages/settings.vue:
|
||||
post-style: "投稿の表示スタイル"
|
||||
post-style-standard: "標準"
|
||||
post-style-smart: "スマート"
|
||||
notification-position: "通知の表示"
|
||||
notification-position-bottom: "下"
|
||||
notification-position-top: "上"
|
||||
behavior: "動作"
|
||||
fetch-on-scroll: "スクロールで自動読み込み"
|
||||
note-visibility: "投稿の公開範囲"
|
||||
default-note-visibility: "デフォルトの公開範囲"
|
||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
|
||||
load-raw-images: "添付された画像を高画質で表示する"
|
||||
load-remote-media: "リモートサーバーのメディアを表示する"
|
||||
@ -1178,7 +1218,7 @@ mobile/views/pages/settings.vue:
|
||||
settings: "設定"
|
||||
signout: "サインアウト"
|
||||
sound: "サウンド"
|
||||
enableSounds: "サウンドを有効にする"
|
||||
enable-sounds: "サウンドを有効にする"
|
||||
mobile/views/pages/user.vue:
|
||||
follows-you: "フォローされています"
|
||||
following: "フォロー"
|
||||
|
@ -6,6 +6,19 @@ common:
|
||||
misskey: "A ⭐ of fediverse"
|
||||
about-title: "A ⭐ of fediverse."
|
||||
about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。"
|
||||
intro:
|
||||
title: "Misskeyって?"
|
||||
about: "Misskeyはオープンソースの<b>分散型マイクロブログSNS</b>です。リッチで高度にカスタマイズできるUI、投稿へのリアクション、ファイルを一元管理できるドライブなど、先進的な機能を揃えています。また、Fediverseと呼ばれるネットワークに接続できるため、他のSNSともやり取りできます。例えば、あなたが何か投稿すると、その投稿はMisskeyだけでなく他のSNSにも伝わります。ちょうどある惑星から他の惑星に電波を発信している様子をイメージしてください。"
|
||||
features: "特徴"
|
||||
rich-contents: "投稿"
|
||||
rich-contents-desc: "自分の考え、話題の出来事、皆と共有したいことについて発信してください。必要であれば、様々な構文を使って投稿を装飾したり、好きな画像、動画などのファイルやアンケートを添付することもできます。"
|
||||
reaction: "リアクション"
|
||||
reaction-desc: "あなたの気持ちを伝える最も簡単な方法です。Misskeyは、他のユーザーの投稿に様々なリアクションを付けることができます。いちどMisskeyのリアクション機能を体験してしまうと、もう「いいね」の概念しか存在しないSNSには戻れなくなるかもしれません。"
|
||||
ui: "インターフェース"
|
||||
ui-desc: "どのようなUIが使いやすいかは人それぞれです。だから、Misskeyは自由度の高いUIを持っています。レイアウトやデザインを調整したり、カスタマイズ可能な様々なウィジェットを配置したりして、自分だけのホームを作ってください。"
|
||||
drive: "ドライブ"
|
||||
drive-desc: "以前投稿したことのある画像をまた投稿したくなったことはありませんか?もしくは、アップロードしたファイルをフォルダ分けして整理したくなったことはありませんか?Misskeyの根幹に組み込まれたドライブ機能によってそれらが解決します。ファイルの共有も簡単です。"
|
||||
outro: "他にもMisskeyにしかない機能はまだまだあるので、ぜひあなた自身の目で確かめてください。Misskeyは分散型SNSなので、このインスタンスが気に入らなければ他のインスタンスを試すこともできます。それでは、GLHF!"
|
||||
adblock:
|
||||
detected: "広告ブロッカーを無効にしてください"
|
||||
warning: "<strong>Misskeyは広告を掲載していません</strong>が、広告をブロックする機能が有効だと一部の機能が利用できなかったり、不具合が発生する場合があります。"
|
||||
@ -68,6 +81,15 @@ common:
|
||||
confused: "Verwirrt"
|
||||
rip: "RIP"
|
||||
pudding: "Pudding"
|
||||
note-visibility:
|
||||
public: "公開"
|
||||
home: "ホーム"
|
||||
home-desc: "ホームタイムラインにのみ公開"
|
||||
followers: "フォロワー"
|
||||
followers-desc: "自分のフォロワーにのみ公開"
|
||||
specified: "ダイレクト"
|
||||
specified-desc: "指定したユーザーにのみ公開"
|
||||
private: "非公開"
|
||||
note-placeholders:
|
||||
a: "Was machst du gerade?"
|
||||
b: "Was ist so passiert?"
|
||||
@ -87,6 +109,7 @@ common:
|
||||
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
||||
verified-user: "公式アカウント"
|
||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||
reversi:
|
||||
drawn: "引き分け"
|
||||
my-turn: "あなたのターンです"
|
||||
@ -260,6 +283,8 @@ common/views/components/nav.vue:
|
||||
develop: "Entwickler"
|
||||
feedback: "Feedback"
|
||||
common/views/components/note-menu.vue:
|
||||
detail: "詳細"
|
||||
copy-link: "リンクをコピー"
|
||||
favorite: "Diese Anmerkung favorisieren"
|
||||
pin: "An die Profilseite pinnen"
|
||||
delete: "Löschen"
|
||||
@ -337,6 +362,9 @@ common/views/components/visibility-chooser.vue:
|
||||
specified: "Direkt"
|
||||
specified-desc: "Poste nur für bestimmte Benutzer"
|
||||
private: "Privat"
|
||||
common/views/components/trends.vue:
|
||||
count: "{}人が投稿"
|
||||
empty: "トレンドなし"
|
||||
common/views/widgets/broadcast.vue:
|
||||
fetching: "Laden"
|
||||
no-broadcasts: "Keine Broadcasts"
|
||||
@ -360,8 +388,6 @@ common/views/widgets/posts-monitor.vue:
|
||||
toggle: "表示を切り替え"
|
||||
common/views/widgets/hashtags.vue:
|
||||
title: "ハッシュタグ"
|
||||
count: "{}人が投稿"
|
||||
empty: "トレンドなし"
|
||||
common/views/widgets/server.vue:
|
||||
title: "Serverinformationen"
|
||||
toggle: "Sicht umschalten"
|
||||
@ -636,6 +662,9 @@ desktop/views/components/settings.vue:
|
||||
behaviour: "Verhalten"
|
||||
fetch-on-scroll: "Aktualisieren beim scrollen"
|
||||
fetch-on-scroll-desc: "Wenn du runterscrollst empfängt die Seite automatisch zusätzliche Inhalte."
|
||||
note-visibility: "投稿の公開範囲"
|
||||
default-note-visibility: "デフォルトの公開範囲"
|
||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||
auto-popout: "Automatische Pop-out Fenster"
|
||||
auto-popout-desc: "Pop-out ein offenes Fenster wenn möglich. Diese Einstellung wird im Browser gespeichert."
|
||||
advanced: "Erweiterte Einstellungen"
|
||||
@ -647,6 +676,7 @@ desktop/views/components/settings.vue:
|
||||
delete-wallpaper: "壁紙を削除"
|
||||
dark-mode: "Nacht Modus"
|
||||
circle-icons: "Kreisförmige Icons"
|
||||
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||
gradient-window-header: "Übergang in Fensterköpfen"
|
||||
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||
@ -861,7 +891,10 @@ desktop/views/pages/welcome.vue:
|
||||
signin-button: "やってる"
|
||||
signup-button: "やる"
|
||||
timeline: "タイムライン"
|
||||
announcements: "お知らせ"
|
||||
photos: "最近の画像"
|
||||
powered-by-misskey: "Powered by <b>Misskey</b>."
|
||||
info: "情報"
|
||||
desktop/views/pages/drive.vue:
|
||||
title: "Misskey Drive"
|
||||
desktop/views/pages/favorites.vue:
|
||||
@ -1149,6 +1182,7 @@ mobile/views/pages/settings.vue:
|
||||
dark-mode: "ダークモード"
|
||||
i-am-under-limited-internet: "私は通信を制限されている"
|
||||
circle-icons: "円形のアイコンを使用"
|
||||
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||
timeline: "タイムライン"
|
||||
show-reply-target: "リプライ先を表示する"
|
||||
show-my-renotes: "自分の行ったRenoteを表示する"
|
||||
@ -1157,8 +1191,14 @@ mobile/views/pages/settings.vue:
|
||||
post-style: "投稿の表示スタイル"
|
||||
post-style-standard: "標準"
|
||||
post-style-smart: "スマート"
|
||||
notification-position: "通知の表示"
|
||||
notification-position-bottom: "下"
|
||||
notification-position-top: "上"
|
||||
behavior: "動作"
|
||||
fetch-on-scroll: "スクロールで自動読み込み"
|
||||
note-visibility: "投稿の公開範囲"
|
||||
default-note-visibility: "デフォルトの公開範囲"
|
||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
|
||||
load-raw-images: "添付された画像を高画質で表示する"
|
||||
load-remote-media: "リモートサーバーのメディアを表示する"
|
||||
@ -1178,7 +1218,7 @@ mobile/views/pages/settings.vue:
|
||||
settings: "設定"
|
||||
signout: "サインアウト"
|
||||
sound: "サウンド"
|
||||
enableSounds: "サウンドを有効にする"
|
||||
enable-sounds: "サウンドを有効にする"
|
||||
mobile/views/pages/user.vue:
|
||||
follows-you: "フォローされています"
|
||||
following: "フォロー"
|
||||
|
@ -6,6 +6,19 @@ common:
|
||||
misskey: "A ⭐ of the fediverse"
|
||||
about-title: "A ⭐ of the fediverse."
|
||||
about: "Thank you for finding Misskey. Misskey is a <b>decentralized microblogging platform</b> born on Earth. Since it exists within the Fediverse (a universe where various social media platforms are organized), it is mutually linked with other social media platforms. Why don't you take a short break from the hustle and bustle of the city, and dive into a new Internet?"
|
||||
intro:
|
||||
title: "What is Misskey?"
|
||||
about: "Misskey is a open-source <b>decentralized microblogging service</b>. Sophisticated fully customizable Ui, varieties of reaction for posts, free file storage providing integrated management system and other advancing functions are available. Also, network system called “Fediverse” enables us to communicate with users on other SNSs. Like, if you post something, then your posts will sent not only to Misskey but also mastodon. Just imagine that the planet is sending a microwave to other planet to communication."
|
||||
features: "Features"
|
||||
rich-contents: "Post"
|
||||
rich-contents-desc: "Just post your idea, hot topics and anything you want to share. You may want to decorate your words, attach your favorite pictures, send files including movies and create a poll - those are the things you can do on Misskey!"
|
||||
reaction: "Reactions"
|
||||
reaction-desc: "Easiest way to tell your emotions. Misskey allows you to add various type of reactions to other’s post. The emotional experience on Misskey will never be on other SNSs which only able to push “likes”."
|
||||
ui: "Interface"
|
||||
ui-desc: "No UI fits for everyone. Therefore, Misskey has a highly customizable UI for your taste. You can edit layouts of your timeline, place selectable widgets you can easily move and create your unique home as this place will be your home."
|
||||
drive: "Misskey Drive"
|
||||
drive-desc: "Wanna post a picture you have already uploaded? Wish to organize, name and create a folder for your uploaded files? Misskey Drive is the best solution for you. Very easy to share your files online."
|
||||
outro: "Check further Misskey-unique features on your eyes! Feeling like this is not for you, try other instances as Misskey is a decentralized SNS so that you can easily find your mates. Then, GLHF!"
|
||||
adblock:
|
||||
detected: "Please disable ad blocker."
|
||||
warning: "Some features may be unavailable or cause malfunctions if ad blocking features are enabled. <strong>Misskey is not running ads</strong>."
|
||||
@ -68,6 +81,15 @@ common:
|
||||
confused: "Confused"
|
||||
rip: "RIP"
|
||||
pudding: "Pudding"
|
||||
note-visibility:
|
||||
public: "Public"
|
||||
home: "Home"
|
||||
home-desc: "Post to the home timeline only"
|
||||
followers: "Followers"
|
||||
followers-desc: "Post to followers only"
|
||||
specified: "Direct"
|
||||
specified-desc: "Post to specified users only"
|
||||
private: "Private"
|
||||
note-placeholders:
|
||||
a: "What are you doing?"
|
||||
b: "What's happening?"
|
||||
@ -84,9 +106,10 @@ common:
|
||||
my-token-regenerated: "Your token has been regenerated, so you will be signed out."
|
||||
i-like-sushi: "I prefer sushi rather than pudding"
|
||||
show-reversi-board-labels: "Show row and column labels in Reversi"
|
||||
use-contrast-reversi-stones: "Make the stone color clear"
|
||||
use-contrast-reversi-stones: "Make the stone color clear in reversi"
|
||||
verified-user: "Verified account"
|
||||
disable-animated-mfm: "Disable animated texts in a post"
|
||||
do-not-use-in-production: 'As this is for development, do not use this in production.'
|
||||
reversi:
|
||||
drawn: "Draw"
|
||||
my-turn: "Your turn"
|
||||
@ -260,6 +283,8 @@ common/views/components/nav.vue:
|
||||
develop: "Developers"
|
||||
feedback: "Feedback"
|
||||
common/views/components/note-menu.vue:
|
||||
detail: "Details"
|
||||
copy-link: "Copy link"
|
||||
favorite: "Favorite this note"
|
||||
pin: "Pin to your profile"
|
||||
delete: "Delete"
|
||||
@ -337,6 +362,9 @@ common/views/components/visibility-chooser.vue:
|
||||
specified: "Direct"
|
||||
specified-desc: "Post to specified users only"
|
||||
private: "Private"
|
||||
common/views/components/trends.vue:
|
||||
count: "{} users mentioned"
|
||||
empty: "No popular hashtag trends"
|
||||
common/views/widgets/broadcast.vue:
|
||||
fetching: "Fetching"
|
||||
no-broadcasts: "No announcements"
|
||||
@ -360,8 +388,6 @@ common/views/widgets/posts-monitor.vue:
|
||||
toggle: "Toggle views"
|
||||
common/views/widgets/hashtags.vue:
|
||||
title: "Hashtags"
|
||||
count: "{} users mentioned"
|
||||
empty: "No popular hashtag trends"
|
||||
common/views/widgets/server.vue:
|
||||
title: "Server info"
|
||||
toggle: "Toggle views"
|
||||
@ -636,6 +662,9 @@ desktop/views/components/settings.vue:
|
||||
behaviour: "Behavior"
|
||||
fetch-on-scroll: "Endless loading on scroll"
|
||||
fetch-on-scroll-desc: "When you scroll down the page, it automatically fetches additional content."
|
||||
note-visibility: "Post visibility"
|
||||
default-note-visibility: "Default visibility"
|
||||
remember-note-visibility: "Remember post visibility"
|
||||
auto-popout: "Auto pop-out window"
|
||||
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"
|
||||
@ -647,6 +676,7 @@ desktop/views/components/settings.vue:
|
||||
delete-wallpaper: "Remove background"
|
||||
dark-mode: "Dark Mode"
|
||||
circle-icons: "Use circle icons"
|
||||
contrasted-acct: "Add contrast to username"
|
||||
gradient-window-header: "Use gradients on window headers"
|
||||
post-form-on-timeline: "Display post form at the top of the timeline"
|
||||
suggest-recent-hashtags: "Show recent popular hashtags on the post form"
|
||||
@ -861,7 +891,10 @@ desktop/views/pages/welcome.vue:
|
||||
signin-button: "Logging in..."
|
||||
signup-button: "Sign up"
|
||||
timeline: "Timeline"
|
||||
announcements: "Announcements"
|
||||
photos: "Recent uploaded"
|
||||
powered-by-misskey: "Powered by <b>Misskey</b>."
|
||||
info: "Information"
|
||||
desktop/views/pages/drive.vue:
|
||||
title: "Misskey storage"
|
||||
desktop/views/pages/favorites.vue:
|
||||
@ -897,7 +930,7 @@ desktop/views/pages/user/user.friends.vue:
|
||||
no-users: "No frequent mentions"
|
||||
desktop/views/pages/user/user.vue:
|
||||
is-suspended: "This account has been suspended."
|
||||
is-remote: "The user is a remote user. The profile that you see here may not complete."
|
||||
is-remote: "This profile belongs to a remote user. The profile that you see here may not be complete. "
|
||||
view-remote: "See their complete profile"
|
||||
desktop/views/pages/user/user.home.vue:
|
||||
last-used-at: "Last active:"
|
||||
@ -1149,6 +1182,7 @@ mobile/views/pages/settings.vue:
|
||||
dark-mode: "Dark Mode"
|
||||
i-am-under-limited-internet: "I'm in limited bandwidth"
|
||||
circle-icons: "Use circle icons"
|
||||
contrasted-acct: "Add contrast to username"
|
||||
timeline: "Timeline"
|
||||
show-reply-target: "Show reply target"
|
||||
show-my-renotes: "Show my reposts"
|
||||
@ -1157,8 +1191,14 @@ mobile/views/pages/settings.vue:
|
||||
post-style: "Post design"
|
||||
post-style-standard: "Standard"
|
||||
post-style-smart: "Smart"
|
||||
notification-position: "Notification style"
|
||||
notification-position-bottom: "Bottom"
|
||||
notification-position-top: "Top"
|
||||
behavior: "Behavior"
|
||||
fetch-on-scroll: "Endless loading on scroll"
|
||||
note-visibility: "Post visibility"
|
||||
default-note-visibility: "Default visibility"
|
||||
remember-note-visibility: "Remember post visibility"
|
||||
disable-via-mobile: "Don't mark the post as 'from mobile'"
|
||||
load-raw-images: "Show attached images in original quality"
|
||||
load-remote-media: "Show media from a remote server"
|
||||
@ -1178,7 +1218,7 @@ mobile/views/pages/settings.vue:
|
||||
settings: "Settings"
|
||||
signout: "Sign out"
|
||||
sound: "Sounds"
|
||||
enableSounds: "Enable sounds"
|
||||
enable-sounds: "Enable sounds"
|
||||
mobile/views/pages/user.vue:
|
||||
follows-you: "Follows you"
|
||||
following: "Following"
|
||||
|
@ -6,12 +6,25 @@ common:
|
||||
misskey: "Una ⭐️ del fediverso"
|
||||
about-title: "Una ⭐️ del fediverso"
|
||||
about: "Gracias por encontrae Misskey. Misskey es una <b>plataforma descentralizada de microblogging</b> nacida en la Tierra. Gracias a existir dentro del Fediverso (un universo donde se organizan varias plataformas sociales) se encuentra enlazada mutuamente con otras plataformas sociales. ¿Por què no te tomas un respiro del caos de la ciudad y te sumerges es una nueva manera de entender Internet?"
|
||||
intro:
|
||||
title: "Misskeyって?"
|
||||
about: "Misskeyはオープンソースの<b>分散型マイクロブログSNS</b>です。リッチで高度にカスタマイズできるUI、投稿へのリアクション、ファイルを一元管理できるドライブなど、先進的な機能を揃えています。また、Fediverseと呼ばれるネットワークに接続できるため、他のSNSともやり取りできます。例えば、あなたが何か投稿すると、その投稿はMisskeyだけでなく他のSNSにも伝わります。ちょうどある惑星から他の惑星に電波を発信している様子をイメージしてください。"
|
||||
features: "特徴"
|
||||
rich-contents: "投稿"
|
||||
rich-contents-desc: "自分の考え、話題の出来事、皆と共有したいことについて発信してください。必要であれば、様々な構文を使って投稿を装飾したり、好きな画像、動画などのファイルやアンケートを添付することもできます。"
|
||||
reaction: "リアクション"
|
||||
reaction-desc: "あなたの気持ちを伝える最も簡単な方法です。Misskeyは、他のユーザーの投稿に様々なリアクションを付けることができます。いちどMisskeyのリアクション機能を体験してしまうと、もう「いいね」の概念しか存在しないSNSには戻れなくなるかもしれません。"
|
||||
ui: "インターフェース"
|
||||
ui-desc: "どのようなUIが使いやすいかは人それぞれです。だから、Misskeyは自由度の高いUIを持っています。レイアウトやデザインを調整したり、カスタマイズ可能な様々なウィジェットを配置したりして、自分だけのホームを作ってください。"
|
||||
drive: "ドライブ"
|
||||
drive-desc: "以前投稿したことのある画像をまた投稿したくなったことはありませんか?もしくは、アップロードしたファイルをフォルダ分けして整理したくなったことはありませんか?Misskeyの根幹に組み込まれたドライブ機能によってそれらが解決します。ファイルの共有も簡単です。"
|
||||
outro: "他にもMisskeyにしかない機能はまだまだあるので、ぜひあなた自身の目で確かめてください。Misskeyは分散型SNSなので、このインスタンスが気に入らなければ他のインスタンスを試すこともできます。それでは、GLHF!"
|
||||
adblock:
|
||||
detected: "Por favor, desactive el bloqueador de publicidad."
|
||||
warning: "<strong>Misskey no tiene anuncios publicitarios.</strong> Sin embargo, algunas características podrían no estar disponibles si el bloqueador de publicidad está habilitado."
|
||||
application-authorization: "Autorizaciones de la aplicación."
|
||||
close: "Cerrar"
|
||||
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
|
||||
do-not-copy-paste: "Por favor no copies código aquí. Tu cuenta puede resultar comprometida."
|
||||
got-it: "¡Listo!"
|
||||
customization-tips:
|
||||
title: "Consejos de personalización"
|
||||
@ -58,7 +71,7 @@ common:
|
||||
friday: "Viernes"
|
||||
saturday: "Sábado"
|
||||
reactions:
|
||||
like: "いいね"
|
||||
like: "Me gusta"
|
||||
love: "amor"
|
||||
laugh: "risa"
|
||||
hmm: "hmm"
|
||||
@ -68,6 +81,15 @@ common:
|
||||
confused: "confundido"
|
||||
rip: "RIP"
|
||||
pudding: "Chafado"
|
||||
note-visibility:
|
||||
public: "公開"
|
||||
home: "ホーム"
|
||||
home-desc: "ホームタイムラインにのみ公開"
|
||||
followers: "フォロワー"
|
||||
followers-desc: "自分のフォロワーにのみ公開"
|
||||
specified: "ダイレクト"
|
||||
specified-desc: "指定したユーザーにのみ公開"
|
||||
private: "非公開"
|
||||
note-placeholders:
|
||||
a: "¿Qué haces?"
|
||||
b: "¿Qué está pasando?"
|
||||
@ -84,9 +106,10 @@ common:
|
||||
my-token-regenerated: "Tu token se ha regenerado vas a ser desconectado."
|
||||
i-like-sushi: "Prefiero sushi a pudín"
|
||||
show-reversi-board-labels: "Mostrar etiquetas de filas y columnas en Reversi"
|
||||
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
||||
verified-user: "公式アカウント"
|
||||
use-contrast-reversi-stones: "Hacer el color de la piedra claro en Reversi"
|
||||
verified-user: "Cuenta verificada"
|
||||
disable-animated-mfm: "Desactivar texto animado en una publicación"
|
||||
do-not-use-in-production: 'Esto está en desarrollo, no usarlo para producción.'
|
||||
reversi:
|
||||
drawn: "Empatado"
|
||||
my-turn: "Mi turno"
|
||||
@ -170,9 +193,9 @@ common/views/components/games/reversi/reversi.vue:
|
||||
common/views/components/games/reversi/reversi.game.vue:
|
||||
surrender: "Rendirse"
|
||||
surrendered: "Por rendirse"
|
||||
is-llotheo: "石の少ない方が勝ち(ロセオ)"
|
||||
looped-map: "ループマップ"
|
||||
can-put-everywhere: "どこでも置けるモード"
|
||||
is-llotheo: "El último gana (Llotheo)"
|
||||
looped-map: "Mapa en bucle"
|
||||
can-put-everywhere: "Puedes colocar donde quieras"
|
||||
common/views/components/games/reversi/reversi.index.vue:
|
||||
title: "Misskey Reversi"
|
||||
sub-title: "¡Juega Reversi con tus amigos!"
|
||||
@ -260,6 +283,8 @@ common/views/components/nav.vue:
|
||||
develop: "Desarrolladores"
|
||||
feedback: "Opiniones"
|
||||
common/views/components/note-menu.vue:
|
||||
detail: "Detalles"
|
||||
copy-link: "Copiar enlace"
|
||||
favorite: "Me gusta esta nota"
|
||||
pin: "Fijar en el perfil"
|
||||
delete: "Borrar"
|
||||
@ -288,10 +313,10 @@ common/views/components/signin.vue:
|
||||
signin: "Entra"
|
||||
or: "O"
|
||||
signin-with-twitter: "Ingresar con Twitter"
|
||||
login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
|
||||
login-failed: "Autenticación fallida. Asegúrate de haber usado el nombre de usuario y contraseña correctos."
|
||||
common/views/components/signup.vue:
|
||||
invitation-code: "招待コード"
|
||||
invitation-info: "招待コードをお持ちでない方は、<a href=\"{}\">管理者</a>までご連絡ください。"
|
||||
invitation-code: "Código de invitación"
|
||||
invitation-info: "Si no tienes un código de invitación, por favor contacta un <a href=\"{}\">administrador</a>."
|
||||
username: "Usuario"
|
||||
checking: "Comprobando..."
|
||||
available: "Disponible"
|
||||
@ -337,6 +362,9 @@ common/views/components/visibility-chooser.vue:
|
||||
specified: "Directo"
|
||||
specified-desc: "Publica solo para los seguidores que quieras"
|
||||
private: "Privada"
|
||||
common/views/components/trends.vue:
|
||||
count: "{}人が投稿"
|
||||
empty: "トレンドなし"
|
||||
common/views/widgets/broadcast.vue:
|
||||
fetching: "Recuperando"
|
||||
no-broadcasts: "Sin emisión"
|
||||
@ -360,8 +388,6 @@ common/views/widgets/posts-monitor.vue:
|
||||
toggle: "Alternar vistas"
|
||||
common/views/widgets/hashtags.vue:
|
||||
title: "Etiquetas"
|
||||
count: "{} usuarios mencionados"
|
||||
empty: "Ninguna tendencia popular ahora"
|
||||
common/views/widgets/server.vue:
|
||||
title: "Información del servidor"
|
||||
toggle: "Alternar vistas"
|
||||
@ -411,7 +437,7 @@ desktop:
|
||||
uploading-avatar: "Cargando un nuevo avatar"
|
||||
avatar-updated: "Avatar actualizado"
|
||||
choose-avatar: "Escoge una imagen de avatar"
|
||||
invalid-filetype: "この形式のファイルはサポートされていません"
|
||||
invalid-filetype: "Este tipo de archivo no es compatible aquí"
|
||||
desktop/views/components/activity.chart.vue:
|
||||
total: "Negro ... Total"
|
||||
notes: "Azul ... Notas"
|
||||
@ -426,23 +452,23 @@ desktop/views/components/calendar.vue:
|
||||
next: "Próximo mes"
|
||||
go: "Click para navegar"
|
||||
desktop/views/components/charts.vue:
|
||||
title: "チャート"
|
||||
per-day: "1日ごと"
|
||||
per-hour: "1時間ごと"
|
||||
notes: "投稿"
|
||||
users: "ユーザー"
|
||||
drive: "ドライブ"
|
||||
title: "Gráficos"
|
||||
per-day: "por día"
|
||||
per-hour: "por hora"
|
||||
notes: "Publicaciones"
|
||||
users: "Usuarios"
|
||||
drive: "Unidad"
|
||||
charts:
|
||||
notes: "投稿の増減 (統合)"
|
||||
local-notes: "投稿の増減 (ローカル)"
|
||||
remote-notes: "投稿の増減 (リモート)"
|
||||
notes-total: "投稿の累計"
|
||||
users: "ユーザーの増減"
|
||||
users-total: "ユーザーの累計"
|
||||
drive: "ドライブ使用量の増減"
|
||||
drive-total: "ドライブ使用量の累計"
|
||||
drive-files: "ドライブのファイル数の増減"
|
||||
drive-files-total: "ドライブのファイル数の累計"
|
||||
notes: "Número de publicaciones: aumentar/disminuir (Combinado)"
|
||||
local-notes: "Número de publicaciones: aumentar/disminuir (Local)"
|
||||
remote-notes: "Número de publicaciones: aumentar/disminuir (Remoto)"
|
||||
notes-total: "Número de publicaciones: Acumulativo total"
|
||||
users: "Número de usuarios: aumentar/disminuir"
|
||||
users-total: "Número de usuarios: Acumulativo total"
|
||||
drive: "Capacidad de almacenamiento usada: aumentar/disminuir"
|
||||
drive-total: "Capacidad de almacenamiento usada: Acumulativa total"
|
||||
drive-files: "Número de archivos almacenados: aumentar/disminuir"
|
||||
drive-files-total: "Número de archivos almacenados: Acumulativo total"
|
||||
desktop/views/components/choose-file-from-drive-window.vue:
|
||||
choose-file: "Escoger archivos"
|
||||
upload: "Cargar archivos de tu dispositivo"
|
||||
@ -463,7 +489,7 @@ desktop/views/components/drive-window.vue:
|
||||
desktop/views/components/drive.file.vue:
|
||||
avatar: "Avatar"
|
||||
banner: "Banner"
|
||||
nsfw: "閲覧注意"
|
||||
nsfw: "Ver más"
|
||||
contextmenu:
|
||||
rename: "Renombrar"
|
||||
mark-as-sensitive: "Marcar como 'sensible'"
|
||||
@ -515,31 +541,31 @@ desktop/views/components/media-image.vue:
|
||||
sensitive: "El contenido es NSFW (no seguro para ver en el trabajo, 'not safe for work')"
|
||||
click-to-show: "Click para mostrar"
|
||||
desktop/views/components/media-video.vue:
|
||||
sensitive: "閲覧注意"
|
||||
click-to-show: "クリックして表示"
|
||||
sensitive: "Este contenido no es apropiado para ver en el trabajo"
|
||||
click-to-show: "Click para mostrar"
|
||||
desktop/views/components/follow-button.vue:
|
||||
following: "Siguiendo"
|
||||
follow: "Sigue"
|
||||
request-pending: "Pendiente de aprobación"
|
||||
follow-request: "フォロー申請"
|
||||
follow-request: "Solicitud de seguir"
|
||||
desktop/views/components/followers-window.vue:
|
||||
followers: "{} のフォロワー"
|
||||
followers: "{} seguidores"
|
||||
desktop/views/components/followers.vue:
|
||||
empty: "フォロワーはいないようです。"
|
||||
empty: "Parece que no tienes seguidores aún."
|
||||
desktop/views/components/following-window.vue:
|
||||
following: "{} のフォロー"
|
||||
following: "Siguiendo {}"
|
||||
desktop/views/components/following.vue:
|
||||
empty: "フォロー中のユーザーはいないようです。"
|
||||
empty: "Parece que aún no sigues a nadie."
|
||||
desktop/views/components/friends-maker.vue:
|
||||
title: "気になるユーザーをフォロー:"
|
||||
empty: "おすすめのユーザーは見つかりませんでした。"
|
||||
fetching: "読み込んでいます"
|
||||
refresh: "もっと見る"
|
||||
close: "閉じる"
|
||||
title: "Usuarios recomendados:"
|
||||
empty: "No se pudieron encontrar usuarios para recomendar"
|
||||
fetching: "Cargando"
|
||||
refresh: "Más"
|
||||
close: "Cerrar"
|
||||
desktop/views/components/game-window.vue:
|
||||
game: "リバーシ"
|
||||
game: "Reversi"
|
||||
desktop/views/components/home.vue:
|
||||
done: "完了"
|
||||
done: "Listo"
|
||||
add-widget: "Agregar accesorio:"
|
||||
add: "Agregar"
|
||||
desktop/views/input-dialog.vue:
|
||||
@ -565,8 +591,8 @@ desktop/views/components/notes.note.vue:
|
||||
detail: "Mostrar detalles"
|
||||
private: "Esta publicación es privada"
|
||||
deleted: "Esta publicación ha sido borrada"
|
||||
hide: "隠す"
|
||||
see-more: "もっと見る"
|
||||
hide: "Esconder"
|
||||
see-more: "Ver más"
|
||||
desktop/views/components/notes.vue:
|
||||
error: "Error al cargar."
|
||||
retry: "Reintentar"
|
||||
@ -602,7 +628,7 @@ desktop/views/components/post-form.vue:
|
||||
geolocation-alert: "Tu dispositivo no tiene soporte de geolocalización."
|
||||
error: "Error"
|
||||
enter-username: "Por favor escribe un nombre de usuario..."
|
||||
annotations: "内容への注釈 (オプション)"
|
||||
annotations: "Anotaciones a la publicación (opcional)"
|
||||
desktop/views/components/post-form-window.vue:
|
||||
note: "Nota nueva"
|
||||
reply: "Responder"
|
||||
@ -636,6 +662,9 @@ desktop/views/components/settings.vue:
|
||||
behaviour: "Acciones"
|
||||
fetch-on-scroll: "Desplazamiento infinito"
|
||||
fetch-on-scroll-desc: "Cuando te deslizas al final de la página nuevo contenido se carga automáticamente."
|
||||
note-visibility: "投稿の公開範囲"
|
||||
default-note-visibility: "デフォルトの公開範囲"
|
||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||
auto-popout: "Ventana emergente automática"
|
||||
auto-popout-desc: "Muestra una ventana emergente si es posible. Esta configuración depende del navegador."
|
||||
advanced: "Configuración avanzada"
|
||||
@ -647,6 +676,7 @@ desktop/views/components/settings.vue:
|
||||
delete-wallpaper: "Suprimir fondo"
|
||||
dark-mode: "Modo Nocturno"
|
||||
circle-icons: "Usar iconos circulares"
|
||||
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||
gradient-window-header: "Usar degradados en las cabeceras de las páginas"
|
||||
post-form-on-timeline: "Mostrar el formulario de las entradas encima de la línea de tiempo"
|
||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||
@ -766,40 +796,40 @@ desktop/views/components/timeline.vue:
|
||||
global: "グローバル"
|
||||
list: "リスト"
|
||||
desktop/views/components/ui.header.vue:
|
||||
welcome-back: "おかえりなさい、"
|
||||
adjective: "さん"
|
||||
welcome-back: "Bienvenido/a de vuelta,"
|
||||
adjective: "-san"
|
||||
desktop/views/components/ui.header.account.vue:
|
||||
profile: "プロフィール"
|
||||
drive: "ドライブ"
|
||||
favorites: "お気に入り"
|
||||
lists: "リスト"
|
||||
follow-requests: "フォロー申請"
|
||||
customize: "ホームのカスタマイズ"
|
||||
admin: "管理"
|
||||
settings: "設定"
|
||||
signout: "サインアウト"
|
||||
dark: "闇に飲まれる"
|
||||
profile: "Tu perfil"
|
||||
drive: "Unidad"
|
||||
favorites: "Favoritos"
|
||||
lists: "Listas"
|
||||
follow-requests: "Solicitudes de seguimiento"
|
||||
customize: "Personalizar la página de inicio"
|
||||
admin: "Admin"
|
||||
settings: "Configuraciones"
|
||||
signout: "Desconectarse"
|
||||
dark: "Sumergirse en la oscuridad"
|
||||
desktop/views/components/ui.header.nav.vue:
|
||||
home: "ホーム"
|
||||
deck: "デッキ"
|
||||
messaging: "メッセージ"
|
||||
game: "ゲーム"
|
||||
home: "Inicio"
|
||||
deck: "Cubierta"
|
||||
messaging: "Mensajes"
|
||||
game: "Juegos"
|
||||
desktop/views/components/ui.header.notifications.vue:
|
||||
title: "通知"
|
||||
title: "Notificaciones"
|
||||
desktop/views/components/ui.header.post.vue:
|
||||
post: "新規投稿"
|
||||
post: "Crear una publicación"
|
||||
desktop/views/components/ui.header.search.vue:
|
||||
placeholder: "検索"
|
||||
placeholder: "Buscar"
|
||||
desktop/views/components/received-follow-requests-window.vue:
|
||||
title: "フォロー申請"
|
||||
accept: "承認"
|
||||
reject: "拒否"
|
||||
title: "Solicitudes de seguidores"
|
||||
accept: "Aceptar"
|
||||
reject: "Rechazar"
|
||||
desktop/views/components/user-lists-window.vue:
|
||||
title: "リスト"
|
||||
create-list: "リストを作成"
|
||||
list-name: "リスト名"
|
||||
title: "Listas de usuario"
|
||||
create-list: "Crear lista"
|
||||
list-name: "Nombre de lista"
|
||||
desktop/views/components/user-preview.vue:
|
||||
notes: "投稿"
|
||||
notes: "Publicaciones"
|
||||
following: "フォロー"
|
||||
followers: "フォロワー"
|
||||
desktop/views/components/users-list.vue:
|
||||
@ -861,7 +891,10 @@ desktop/views/pages/welcome.vue:
|
||||
signin-button: "やってる"
|
||||
signup-button: "やる"
|
||||
timeline: "タイムライン"
|
||||
announcements: "お知らせ"
|
||||
photos: "最近の画像"
|
||||
powered-by-misskey: "Powered by <b>Misskey</b>."
|
||||
info: "情報"
|
||||
desktop/views/pages/drive.vue:
|
||||
title: "Misskey Drive"
|
||||
desktop/views/pages/favorites.vue:
|
||||
@ -1149,6 +1182,7 @@ mobile/views/pages/settings.vue:
|
||||
dark-mode: "ダークモード"
|
||||
i-am-under-limited-internet: "私は通信を制限されている"
|
||||
circle-icons: "円形のアイコンを使用"
|
||||
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||
timeline: "タイムライン"
|
||||
show-reply-target: "リプライ先を表示する"
|
||||
show-my-renotes: "自分の行ったRenoteを表示する"
|
||||
@ -1157,8 +1191,14 @@ mobile/views/pages/settings.vue:
|
||||
post-style: "投稿の表示スタイル"
|
||||
post-style-standard: "標準"
|
||||
post-style-smart: "スマート"
|
||||
notification-position: "通知の表示"
|
||||
notification-position-bottom: "下"
|
||||
notification-position-top: "上"
|
||||
behavior: "動作"
|
||||
fetch-on-scroll: "スクロールで自動読み込み"
|
||||
note-visibility: "投稿の公開範囲"
|
||||
default-note-visibility: "デフォルトの公開範囲"
|
||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
|
||||
load-raw-images: "添付された画像を高画質で表示する"
|
||||
load-remote-media: "リモートサーバーのメディアを表示する"
|
||||
@ -1178,7 +1218,7 @@ mobile/views/pages/settings.vue:
|
||||
settings: "設定"
|
||||
signout: "サインアウト"
|
||||
sound: "サウンド"
|
||||
enableSounds: "サウンドを有効にする"
|
||||
enable-sounds: "サウンドを有効にする"
|
||||
mobile/views/pages/user.vue:
|
||||
follows-you: "フォローされています"
|
||||
following: "フォロー"
|
||||
|
@ -6,6 +6,19 @@ common:
|
||||
misskey: "Une ⭐ du fédiverse"
|
||||
about-title: "Une ⭐ du fédivers."
|
||||
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 ?"
|
||||
intro:
|
||||
title: "C’est quoi Misskey ?"
|
||||
about: "Misskeyはオープンソースの<b>分散型マイクロブログSNS</b>です。リッチで高度にカスタマイズできるUI、投稿へのリアクション、ファイルを一元管理できるドライブなど、先進的な機能を揃えています。また、Fediverseと呼ばれるネットワークに接続できるため、他のSNSともやり取りできます。例えば、あなたが何か投稿すると、その投稿はMisskeyだけでなく他のSNSにも伝わります。ちょうどある惑星から他の惑星に電波を発信している様子をイメージしてください。"
|
||||
features: "Fonctionnalités"
|
||||
rich-contents: "Notes"
|
||||
rich-contents-desc: "自分の考え、話題の出来事、皆と共有したいことについて発信してください。必要であれば、様々な構文を使って投稿を装飾したり、好きな画像、動画などのファイルやアンケートを添付することもできます。"
|
||||
reaction: "Réactions"
|
||||
reaction-desc: "あなたの気持ちを伝える最も簡単な方法です。Misskeyは、他のユーザーの投稿に様々なリアクションを付けることができます。いちどMisskeyのリアクション機能を体験してしまうと、もう「いいね」の概念しか存在しないSNSには戻れなくなるかもしれません。"
|
||||
ui: "Interface utilisateur"
|
||||
ui-desc: "どのようなUIが使いやすいかは人それぞれです。だから、Misskeyは自由度の高いUIを持っています。レイアウトやデザインを調整したり、カスタマイズ可能な様々なウィジェットを配置したりして、自分だけのホームを作ってください。"
|
||||
drive: "Drive"
|
||||
drive-desc: "以前投稿したことのある画像をまた投稿したくなったことはありませんか?もしくは、アップロードしたファイルをフォルダ分けして整理したくなったことはありませんか?Misskeyの根幹に組み込まれたドライブ機能によってそれらが解決します。ファイルの共有も簡単です。"
|
||||
outro: "他にもMisskeyにしかない機能はまだまだあるので、ぜひあなた自身の目で確かめてください。Misskeyは分散型SNSなので、このインスタンスが気に入らなければ他のインスタンスを試すこともできます。それでは、GLHF!"
|
||||
adblock:
|
||||
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é."
|
||||
@ -68,6 +81,15 @@ common:
|
||||
confused: "Confus"
|
||||
rip: "RIP"
|
||||
pudding: "Pudding"
|
||||
note-visibility:
|
||||
public: "Public"
|
||||
home: "Accueil"
|
||||
home-desc: "Publier sur le fil local uniquement"
|
||||
followers: "Abonnés·es"
|
||||
followers-desc: "Publier à vos abonnés·es uniquement"
|
||||
specified: "Direct"
|
||||
specified-desc: "Publier aux utilisateurs·trices mentionnés·es"
|
||||
private: "Privé"
|
||||
note-placeholders:
|
||||
a: "Que faites-vous maintenant ?"
|
||||
b: "Quoi de neuf ?"
|
||||
@ -87,6 +109,7 @@ common:
|
||||
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
||||
verified-user: "Compte vérifié"
|
||||
disable-animated-mfm: "Désactiver les textes animés dans les publications"
|
||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||
reversi:
|
||||
drawn: "Partie nulle"
|
||||
my-turn: "C’est votre tour"
|
||||
@ -172,7 +195,7 @@ common/views/components/games/reversi/reversi.game.vue:
|
||||
surrendered: "Par abandon"
|
||||
is-llotheo: "石の少ない方が勝ち(ロセオ)"
|
||||
looped-map: "Carte en boucle"
|
||||
can-put-everywhere: "どこでも置けるモード"
|
||||
can-put-everywhere: "Peut poser partout"
|
||||
common/views/components/games/reversi/reversi.index.vue:
|
||||
title: "Misskey Reversi"
|
||||
sub-title: "Jouer à Reversi avec vos ami·e·s !"
|
||||
@ -260,6 +283,8 @@ common/views/components/nav.vue:
|
||||
develop: "Développeur·se·s"
|
||||
feedback: "Remarques"
|
||||
common/views/components/note-menu.vue:
|
||||
detail: "Détails"
|
||||
copy-link: "Copier le lien"
|
||||
favorite: "Mettre cette note en favoris"
|
||||
pin: "Épingler sur votre profil"
|
||||
delete: "Supprimer"
|
||||
@ -337,6 +362,9 @@ common/views/components/visibility-chooser.vue:
|
||||
specified: "Direct"
|
||||
specified-desc: "Publier aux utilisateur·rice·s mentionné·e·s"
|
||||
private: "Privé"
|
||||
common/views/components/trends.vue:
|
||||
count: "{} utilisateurs·trices mentionnés·es"
|
||||
empty: "Aucune tendance"
|
||||
common/views/widgets/broadcast.vue:
|
||||
fetching: "Récupération"
|
||||
no-broadcasts: "Aucune annonce"
|
||||
@ -360,8 +388,6 @@ common/views/widgets/posts-monitor.vue:
|
||||
toggle: "Basculer entre les vues"
|
||||
common/views/widgets/hashtags.vue:
|
||||
title: "Étiquettes"
|
||||
count: "{} utilisateur·rice·s mentionné·e·s"
|
||||
empty: "Aucune tendance"
|
||||
common/views/widgets/server.vue:
|
||||
title: "Informations sur le serveur"
|
||||
toggle: "Afficher les vues"
|
||||
@ -391,7 +417,7 @@ common/views/widgets/tips.vue:
|
||||
tips-line19: "いくつかのウィンドウはブラウザの外に切り離すことができます"
|
||||
tips-line20: "カレンダーウィジェットのパーセンテージは、経過の割合を示しています"
|
||||
tips-line21: "Vous pouvez aussi utiliser l'API pour développer des Bots."
|
||||
tips-line23: "まゆかわいいよまゆ"
|
||||
tips-line23: "Mayu est mignone avec ses sourcils."
|
||||
tips-line24: "Misskey a vu le jour en 2014"
|
||||
tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
|
||||
common/views/pages/follow.vue:
|
||||
@ -437,8 +463,8 @@ desktop/views/components/charts.vue:
|
||||
local-notes: "投稿の増減 (ローカル)"
|
||||
remote-notes: "投稿の増減 (リモート)"
|
||||
notes-total: "投稿の累計"
|
||||
users: "ユーザーの増減"
|
||||
users-total: "ユーザーの累計"
|
||||
users: "Nombre d’utilisateurs·trices : augmentation/diminution"
|
||||
users-total: "Nombre total d’utilisateurs·trices : total cumulé"
|
||||
drive: "ドライブ使用量の増減"
|
||||
drive-total: "ドライブ使用量の累計"
|
||||
drive-files: "ドライブのファイル数の増減"
|
||||
@ -636,6 +662,9 @@ desktop/views/components/settings.vue:
|
||||
behaviour: "Comportement"
|
||||
fetch-on-scroll: "Chargement lors du défilement"
|
||||
fetch-on-scroll-desc: "Chargement automatique du contenu lors du défilement de la page."
|
||||
note-visibility: "Visibilité de la publication"
|
||||
default-note-visibility: "Visibilité par défaut"
|
||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||
auto-popout: "Fenêtre contextuelle automatique"
|
||||
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
||||
advanced: "Paramètres avancés"
|
||||
@ -647,8 +676,9 @@ desktop/views/components/settings.vue:
|
||||
delete-wallpaper: "Supprimer le fond d'écran"
|
||||
dark-mode: "Mode nuit"
|
||||
circle-icons: "Utiliser des icônes circulaires"
|
||||
contrasted-acct: "Nom d’utilisateur contrasté"
|
||||
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: "Afficher le formulaire en haut du fil"
|
||||
suggest-recent-hashtags: "Afficher les hashtags populaires dans le champs de saisie"
|
||||
show-clock-on-header: "Afficher l'horloge à droite sur le coté supérieur"
|
||||
show-reply-target: "Afficher les réponses"
|
||||
@ -861,7 +891,10 @@ desktop/views/pages/welcome.vue:
|
||||
signin-button: "Se connecter"
|
||||
signup-button: "S'inscrire"
|
||||
timeline: "Fil d'actualité"
|
||||
announcements: "Notices"
|
||||
photos: "Images récentes"
|
||||
powered-by-misskey: "Propulsé par <b>Misskey</b>."
|
||||
info: "Informations"
|
||||
desktop/views/pages/drive.vue:
|
||||
title: "Lecteur de Misskey"
|
||||
desktop/views/pages/favorites.vue:
|
||||
@ -971,14 +1004,14 @@ mobile/views/components/drive-file-chooser.vue:
|
||||
mobile/views/components/drive-folder-chooser.vue:
|
||||
select-folder: "Choisissez un dossier"
|
||||
mobile/views/components/drive.file.vue:
|
||||
nsfw: "閲覧注意"
|
||||
nsfw: "CW"
|
||||
mobile/views/components/drive.file-detail.vue:
|
||||
download: "Télécharger"
|
||||
rename: "Renommer"
|
||||
move: "Déplacer"
|
||||
hash: "Hash (md5)"
|
||||
exif: "EXIF"
|
||||
nsfw: "閲覧注意"
|
||||
nsfw: "CW"
|
||||
mobile/views/components/media-image.vue:
|
||||
sensitive: "Le contenu est NSFW"
|
||||
click-to-show: "Cliquer pour afficher"
|
||||
@ -1045,7 +1078,7 @@ mobile/views/components/timeline.vue:
|
||||
load-more: "Afficher plus"
|
||||
mobile/views/components/ui.header.vue:
|
||||
welcome-back: "Content de vous revoir ! "
|
||||
adjective: "さん"
|
||||
adjective: "M."
|
||||
mobile/views/components/ui.nav.vue:
|
||||
timeline: "Fil d'actualité"
|
||||
notifications: "Notifications"
|
||||
@ -1149,6 +1182,7 @@ mobile/views/pages/settings.vue:
|
||||
dark-mode: "Mode nuit"
|
||||
i-am-under-limited-internet: "J'ai un accès Internet limité"
|
||||
circle-icons: "Utiliser des icônes circulaires"
|
||||
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||
timeline: "Fil d'actualité"
|
||||
show-reply-target: "Afficher les réponses"
|
||||
show-my-renotes: "Afficher mes republications"
|
||||
@ -1157,8 +1191,14 @@ mobile/views/pages/settings.vue:
|
||||
post-style: "Style de la publication"
|
||||
post-style-standard: "Standard"
|
||||
post-style-smart: "Intelligent"
|
||||
notification-position: "Style de notification"
|
||||
notification-position-bottom: "en bas"
|
||||
notification-position-top: "en haut"
|
||||
behavior: "Comportement"
|
||||
fetch-on-scroll: "Chargement lors du défilement"
|
||||
note-visibility: "Visibilité de la publication"
|
||||
default-note-visibility: "Visibilité par défaut"
|
||||
remember-note-visibility: "Se souvenir du mode de visibilité de la publication"
|
||||
disable-via-mobile: "Ne pas mentionner que ma publication provient d'un 'périphérique mobile'"
|
||||
load-raw-images: "Afficher les photos jointes en haute qualité"
|
||||
load-remote-media: "Afficher les médias sur le serveur distant"
|
||||
@ -1178,7 +1218,7 @@ mobile/views/pages/settings.vue:
|
||||
settings: "Réglages"
|
||||
signout: "Déconnexion"
|
||||
sound: "Sons"
|
||||
enableSounds: "Activer le son"
|
||||
enable-sounds: "Activer les sons"
|
||||
mobile/views/pages/user.vue:
|
||||
follows-you: "vous suit"
|
||||
following: "Abonnements"
|
||||
@ -1223,7 +1263,7 @@ docs:
|
||||
res: "Réponse"
|
||||
require-credential: "Ce point de communication nécessite une authentification."
|
||||
require-permission: "Ce point de communication nécessite la permission {permission}."
|
||||
has-limit: "レートリミットがあります。"
|
||||
has-limit: "Il y’a un taux limite."
|
||||
duration-limit: "直近{duration}ミリ秒の間のこのエンドポイントへのリクエスト数の合計が{max}を超える場合はリクエストできません。"
|
||||
min-interval-limit: "前回のリクエストから{interval}ミリ秒経っていない場合はリクエストできません。"
|
||||
show-src: "Vous pouvez voir le code source ce point de communication."
|
||||
|
@ -5,7 +5,7 @@
|
||||
const fs = require('fs');
|
||||
const yaml = require('js-yaml');
|
||||
|
||||
const langs = ['de-DE', 'en-US', 'fr-FR', 'ja-JP', 'ja-KS', 'pl-PL', 'es-ES'];
|
||||
const langs = ['de-DE', 'en-US', 'fr-FR', 'ja-JP', 'ja-KS', 'pl-PL', 'es-ES', 'nl-NL'];
|
||||
|
||||
const loadLocale = lang => yaml.safeLoad(fs.readFileSync(`${__dirname}/${lang}.yml`, 'utf-8'));
|
||||
const locales = langs.map(lang => ({ [lang]: loadLocale(lang) }));
|
||||
|
@ -6,6 +6,19 @@ common:
|
||||
misskey: "A ⭐ of fediverse"
|
||||
about-title: "A ⭐ of fediverse."
|
||||
about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。"
|
||||
intro:
|
||||
title: "Misskeyって?"
|
||||
about: "Misskeyはオープンソースの<b>分散型マイクロブログSNS</b>です。リッチで高度にカスタマイズできるUI、投稿へのリアクション、ファイルを一元管理できるドライブなど、先進的な機能を揃えています。また、Fediverseと呼ばれるネットワークに接続できるため、他のSNSともやり取りできます。例えば、あなたが何か投稿すると、その投稿はMisskeyだけでなく他のSNSにも伝わります。ちょうどある惑星から他の惑星に電波を発信している様子をイメージしてください。"
|
||||
features: "特徴"
|
||||
rich-contents: "投稿"
|
||||
rich-contents-desc: "自分の考え、話題の出来事、皆と共有したいことについて発信してください。必要であれば、様々な構文を使って投稿を装飾したり、好きな画像、動画などのファイルやアンケートを添付することもできます。"
|
||||
reaction: "リアクション"
|
||||
reaction-desc: "あなたの気持ちを伝える最も簡単な方法です。Misskeyは、他のユーザーの投稿に様々なリアクションを付けることができます。いちどMisskeyのリアクション機能を体験してしまうと、もう「いいね」の概念しか存在しないSNSには戻れなくなるかもしれません。"
|
||||
ui: "インターフェース"
|
||||
ui-desc: "どのようなUIが使いやすいかは人それぞれです。だから、Misskeyは自由度の高いUIを持っています。レイアウトやデザインを調整したり、カスタマイズ可能な様々なウィジェットを配置したりして、自分だけのホームを作ってください。"
|
||||
drive: "ドライブ"
|
||||
drive-desc: "以前投稿したことのある画像をまた投稿したくなったことはありませんか?もしくは、アップロードしたファイルをフォルダ分けして整理したくなったことはありませんか?Misskeyの根幹に組み込まれたドライブ機能によってそれらが解決します。ファイルの共有も簡単です。"
|
||||
outro: "他にもMisskeyにしかない機能はまだまだあるので、ぜひあなた自身の目で確かめてください。Misskeyは分散型SNSなので、このインスタンスが気に入らなければ他のインスタンスを試すこともできます。それでは、GLHF!"
|
||||
adblock:
|
||||
detected: "広告ブロッカーを無効にしてください"
|
||||
warning: "<strong>Misskeyは広告を掲載していません</strong>が、広告をブロックする機能が有効だと一部の機能が利用できなかったり、不具合が発生する場合があります。"
|
||||
@ -68,6 +81,15 @@ common:
|
||||
confused: "こまこまのこまり"
|
||||
rip: "RIP"
|
||||
pudding: "Pudding"
|
||||
note-visibility:
|
||||
public: "公開"
|
||||
home: "ホーム"
|
||||
home-desc: "ホームタイムラインにのみ公開"
|
||||
followers: "フォロワー"
|
||||
followers-desc: "自分のフォロワーにのみ公開"
|
||||
specified: "ダイレクト"
|
||||
specified-desc: "指定したユーザーにのみ公開"
|
||||
private: "非公開"
|
||||
note-placeholders:
|
||||
a: "今どうしてる?"
|
||||
b: "何かありましたか?"
|
||||
@ -87,6 +109,7 @@ common:
|
||||
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
||||
verified-user: "公式アカウント"
|
||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||
reversi:
|
||||
drawn: "引き分け"
|
||||
my-turn: "あなたのターンです"
|
||||
@ -260,6 +283,8 @@ common/views/components/nav.vue:
|
||||
develop: "開発者"
|
||||
feedback: "フィードバック"
|
||||
common/views/components/note-menu.vue:
|
||||
detail: "詳細"
|
||||
copy-link: "リンクをコピー"
|
||||
favorite: "お気に入り"
|
||||
pin: "ピン留め"
|
||||
delete: "削除"
|
||||
@ -337,6 +362,9 @@ common/views/components/visibility-chooser.vue:
|
||||
specified: "ダイレクト"
|
||||
specified-desc: "指定したユーザーにのみ公開"
|
||||
private: "非公開"
|
||||
common/views/components/trends.vue:
|
||||
count: "{}人が投稿"
|
||||
empty: "トレンドなし"
|
||||
common/views/widgets/broadcast.vue:
|
||||
fetching: "確認中"
|
||||
no-broadcasts: "お知らせはありません"
|
||||
@ -360,8 +388,6 @@ common/views/widgets/posts-monitor.vue:
|
||||
toggle: "表示を切り替え"
|
||||
common/views/widgets/hashtags.vue:
|
||||
title: "ハッシュタグ"
|
||||
count: "{}人が投稿"
|
||||
empty: "トレンドなし"
|
||||
common/views/widgets/server.vue:
|
||||
title: "サーバー情報"
|
||||
toggle: "表示を切り替え"
|
||||
@ -636,6 +662,9 @@ desktop/views/components/settings.vue:
|
||||
behaviour: "動作"
|
||||
fetch-on-scroll: "スクロールで自動読み込み"
|
||||
fetch-on-scroll-desc: "ページを下までスクロールしたときに自動で追加のコンテンツを読み込みます。"
|
||||
note-visibility: "投稿の公開範囲"
|
||||
default-note-visibility: "デフォルトの公開範囲"
|
||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||
auto-popout: "ウィンドウの自動ポップアウト"
|
||||
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
||||
advanced: "詳細設定"
|
||||
@ -647,6 +676,7 @@ desktop/views/components/settings.vue:
|
||||
delete-wallpaper: "壁紙を削除"
|
||||
dark-mode: "ダークモード"
|
||||
circle-icons: "円形のアイコンを使用"
|
||||
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
||||
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||
@ -861,7 +891,10 @@ desktop/views/pages/welcome.vue:
|
||||
signin-button: "やってる"
|
||||
signup-button: "やる"
|
||||
timeline: "タイムライン"
|
||||
announcements: "お知らせ"
|
||||
photos: "最近の画像"
|
||||
powered-by-misskey: "Powered by <b>Misskey</b>."
|
||||
info: "情報"
|
||||
desktop/views/pages/drive.vue:
|
||||
title: "Misskey Drive"
|
||||
desktop/views/pages/favorites.vue:
|
||||
@ -1149,6 +1182,7 @@ mobile/views/pages/settings.vue:
|
||||
dark-mode: "ダークモード"
|
||||
i-am-under-limited-internet: "私は通信を制限されている"
|
||||
circle-icons: "円形のアイコンを使用"
|
||||
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||
timeline: "タイムライン"
|
||||
show-reply-target: "リプライ先を表示する"
|
||||
show-my-renotes: "自分の行ったRenoteを表示する"
|
||||
@ -1157,8 +1191,14 @@ mobile/views/pages/settings.vue:
|
||||
post-style: "投稿の表示スタイル"
|
||||
post-style-standard: "標準"
|
||||
post-style-smart: "スマート"
|
||||
notification-position: "通知の表示"
|
||||
notification-position-bottom: "下"
|
||||
notification-position-top: "上"
|
||||
behavior: "動作"
|
||||
fetch-on-scroll: "スクロールで自動読み込み"
|
||||
note-visibility: "投稿の公開範囲"
|
||||
default-note-visibility: "デフォルトの公開範囲"
|
||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
|
||||
load-raw-images: "添付された画像を高画質で表示する"
|
||||
load-remote-media: "リモートサーバーのメディアを表示する"
|
||||
@ -1178,7 +1218,7 @@ mobile/views/pages/settings.vue:
|
||||
settings: "設定"
|
||||
signout: "サインアウト"
|
||||
sound: "サウンド"
|
||||
enableSounds: "サウンドを有効にする"
|
||||
enable-sounds: "サウンドを有効にする"
|
||||
mobile/views/pages/user.vue:
|
||||
follows-you: "フォローされています"
|
||||
following: "フォロー"
|
||||
|
@ -6,6 +6,19 @@ common:
|
||||
misskey: "A ⭐ of fediverse"
|
||||
about-title: "A ⭐ of fediverse."
|
||||
about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。"
|
||||
intro:
|
||||
title: "Misskeyって?"
|
||||
about: "Misskeyはオープンソースの<b>分散型マイクロブログSNS</b>です。リッチで高度にカスタマイズできるUI、投稿へのリアクション、ファイルを一元管理できるドライブなど、先進的な機能を揃えています。また、Fediverseと呼ばれるネットワークに接続できるため、他のSNSともやり取りできます。例えば、あなたが何か投稿すると、その投稿はMisskeyだけでなく他のSNSにも伝わります。ちょうどある惑星から他の惑星に電波を発信している様子をイメージしてください。"
|
||||
features: "特徴"
|
||||
rich-contents: "投稿"
|
||||
rich-contents-desc: "自分の考え、話題の出来事、皆と共有したいことについて発信してください。必要であれば、様々な構文を使って投稿を装飾したり、好きな画像、動画などのファイルやアンケートを添付することもできます。"
|
||||
reaction: "リアクション"
|
||||
reaction-desc: "あなたの気持ちを伝える最も簡単な方法です。Misskeyは、他のユーザーの投稿に様々なリアクションを付けることができます。いちどMisskeyのリアクション機能を体験してしまうと、もう「いいね」の概念しか存在しないSNSには戻れなくなるかもしれません。"
|
||||
ui: "インターフェース"
|
||||
ui-desc: "どのようなUIが使いやすいかは人それぞれです。だから、Misskeyは自由度の高いUIを持っています。レイアウトやデザインを調整したり、カスタマイズ可能な様々なウィジェットを配置したりして、自分だけのホームを作ってください。"
|
||||
drive: "ドライブ"
|
||||
drive-desc: "以前投稿したことのある画像をまた投稿したくなったことはありませんか?もしくは、アップロードしたファイルをフォルダ分けして整理したくなったことはありませんか?Misskeyの根幹に組み込まれたドライブ機能によってそれらが解決します。ファイルの共有も簡単です。"
|
||||
outro: "他にもMisskeyにしかない機能はまだまだあるので、ぜひあなた自身の目で確かめてください。Misskeyは分散型SNSなので、このインスタンスが気に入らなければ他のインスタンスを試すこともできます。それでは、GLHF!"
|
||||
adblock:
|
||||
detected: "広告ブロッカーを無効にしてください"
|
||||
warning: "<strong>Misskeyは広告を掲載していません</strong>が、広告をブロックする機能が有効だと一部の機能が利用できなかったり、不具合が発生する場合があります。"
|
||||
@ -73,6 +86,16 @@ common:
|
||||
rip: "RIP"
|
||||
pudding: "Pudding"
|
||||
|
||||
note-visibility:
|
||||
public: "公開"
|
||||
home: "ホーム"
|
||||
home-desc: "ホームタイムラインにのみ公開"
|
||||
followers: "フォロワー"
|
||||
followers-desc: "自分のフォロワーにのみ公開"
|
||||
specified: "ダイレクト"
|
||||
specified-desc: "指定したユーザーにのみ公開"
|
||||
private: "非公開"
|
||||
|
||||
note-placeholders:
|
||||
a: "今どうしてる?"
|
||||
b: "何かありましたか?"
|
||||
@ -724,6 +747,9 @@ desktop/views/components/settings.vue:
|
||||
behaviour: "動作"
|
||||
fetch-on-scroll: "スクロールで自動読み込み"
|
||||
fetch-on-scroll-desc: "ページを下までスクロールしたときに自動で追加のコンテンツを読み込みます。"
|
||||
note-visibility: "投稿の公開範囲"
|
||||
default-note-visibility: "デフォルトの公開範囲"
|
||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||
auto-popout: "ウィンドウの自動ポップアウト"
|
||||
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
||||
advanced: "詳細設定"
|
||||
@ -736,6 +762,7 @@ desktop/views/components/settings.vue:
|
||||
delete-wallpaper: "壁紙を削除"
|
||||
dark-mode: "ダークモード"
|
||||
circle-icons: "円形のアイコンを使用"
|
||||
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
||||
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||
@ -990,7 +1017,10 @@ desktop/views/pages/welcome.vue:
|
||||
signin-button: "やってる"
|
||||
signup-button: "やる"
|
||||
timeline: "タイムライン"
|
||||
announcements: "お知らせ"
|
||||
photos: "最近の画像"
|
||||
powered-by-misskey: "Powered by <b>Misskey</b>."
|
||||
info: "情報"
|
||||
|
||||
desktop/views/pages/drive.vue:
|
||||
title: "Misskey Drive"
|
||||
@ -1347,6 +1377,7 @@ mobile/views/pages/settings.vue:
|
||||
dark-mode: "ダークモード"
|
||||
i-am-under-limited-internet: "私は通信を制限されている"
|
||||
circle-icons: "円形のアイコンを使用"
|
||||
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||
timeline: "タイムライン"
|
||||
show-reply-target: "リプライ先を表示する"
|
||||
show-my-renotes: "自分の行ったRenoteを表示する"
|
||||
@ -1355,8 +1386,14 @@ mobile/views/pages/settings.vue:
|
||||
post-style: "投稿の表示スタイル"
|
||||
post-style-standard: "標準"
|
||||
post-style-smart: "スマート"
|
||||
notification-position: "通知の表示"
|
||||
notification-position-bottom: "下"
|
||||
notification-position-top: "上"
|
||||
behavior: "動作"
|
||||
fetch-on-scroll: "スクロールで自動読み込み"
|
||||
note-visibility: "投稿の公開範囲"
|
||||
default-note-visibility: "デフォルトの公開範囲"
|
||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
|
||||
load-raw-images: "添付された画像を高画質で表示する"
|
||||
load-remote-media: "リモートサーバーのメディアを表示する"
|
||||
@ -1376,7 +1413,7 @@ mobile/views/pages/settings.vue:
|
||||
settings: "設定"
|
||||
signout: "サインアウト"
|
||||
sound: "サウンド"
|
||||
enableSounds: "サウンドを有効にする"
|
||||
enable-sounds: "サウンドを有効にする"
|
||||
|
||||
mobile/views/pages/user.vue:
|
||||
follows-you: "フォローされています"
|
||||
|
@ -6,6 +6,19 @@ common:
|
||||
misskey: "A ⭐ of fediverse"
|
||||
about-title: "A ⭐ of fediverse."
|
||||
about: "ようMisskeyを見つけてくれて、おおきにやで。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>やねん。Fediverse(ぎょうさんのSNSで構成されとる宇宙)っちゅうもんの中におるから、お隣さんのSNSとも仲良うさせてもろてんねん。ちょいとやかましい心斎橋から離れて、新しいインターネットにダイブしてみぃひん?"
|
||||
intro:
|
||||
title: "Misskeyって?"
|
||||
about: "Misskeyはオープンソースの<b>分散型マイクロブログSNS</b>です。リッチで高度にカスタマイズできるUI、投稿へのリアクション、ファイルを一元管理できるドライブなど、先進的な機能を揃えています。また、Fediverseと呼ばれるネットワークに接続できるため、他のSNSともやり取りできます。例えば、あなたが何か投稿すると、その投稿はMisskeyだけでなく他のSNSにも伝わります。ちょうどある惑星から他の惑星に電波を発信している様子をイメージしてください。"
|
||||
features: "特徴"
|
||||
rich-contents: "投稿"
|
||||
rich-contents-desc: "自分の考え、話題の出来事、皆と共有したいことについて発信してください。必要であれば、様々な構文を使って投稿を装飾したり、好きな画像、動画などのファイルやアンケートを添付することもできます。"
|
||||
reaction: "リアクション"
|
||||
reaction-desc: "あなたの気持ちを伝える最も簡単な方法です。Misskeyは、他のユーザーの投稿に様々なリアクションを付けることができます。いちどMisskeyのリアクション機能を体験してしまうと、もう「いいね」の概念しか存在しないSNSには戻れなくなるかもしれません。"
|
||||
ui: "インターフェース"
|
||||
ui-desc: "どのようなUIが使いやすいかは人それぞれです。だから、Misskeyは自由度の高いUIを持っています。レイアウトやデザインを調整したり、カスタマイズ可能な様々なウィジェットを配置したりして、自分だけのホームを作ってください。"
|
||||
drive: "ドライブ"
|
||||
drive-desc: "以前投稿したことのある画像をまた投稿したくなったことはありませんか?もしくは、アップロードしたファイルをフォルダ分けして整理したくなったことはありませんか?Misskeyの根幹に組み込まれたドライブ機能によってそれらが解決します。ファイルの共有も簡単です。"
|
||||
outro: "他にもMisskeyにしかない機能はまだまだあるので、ぜひあなた自身の目で確かめてください。Misskeyは分散型SNSなので、このインスタンスが気に入らなければ他のインスタンスを試すこともできます。それでは、GLHF!"
|
||||
adblock:
|
||||
detected: "広告ブロッカーを無効にしてや"
|
||||
warning: "<strong>Misskeyは広告を掲載してへん</strong>けど、広告をブロックしはる機能がおると一部の機能が利用できんくなったり、不具合が発生するかも分からん。知らんけど。"
|
||||
@ -68,6 +81,15 @@ common:
|
||||
confused: "こまこまのこまりやわぁ"
|
||||
rip: "RIP"
|
||||
pudding: "アメちゃんちゃうんちゃう?"
|
||||
note-visibility:
|
||||
public: "公開"
|
||||
home: "ホーム"
|
||||
home-desc: "ホームタイムラインにのみ公開"
|
||||
followers: "フォロワー"
|
||||
followers-desc: "自分のフォロワーにのみ公開"
|
||||
specified: "ダイレクト"
|
||||
specified-desc: "指定したユーザーにのみ公開"
|
||||
private: "非公開"
|
||||
note-placeholders:
|
||||
a: "今なにしてん?"
|
||||
b: "何かあったんか?"
|
||||
@ -87,6 +109,7 @@ common:
|
||||
use-contrast-reversi-stones: "リバーシのアイコンにコントラストをつけんで!"
|
||||
verified-user: "アメちゃん付きアカウント"
|
||||
disable-animated-mfm: "投稿内のちょろちょろ動いてんのを止める"
|
||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||
reversi:
|
||||
drawn: "おあいこ"
|
||||
my-turn: "あんさんのターンや"
|
||||
@ -260,6 +283,8 @@ common/views/components/nav.vue:
|
||||
develop: "開発者"
|
||||
feedback: "フィードバック"
|
||||
common/views/components/note-menu.vue:
|
||||
detail: "詳細"
|
||||
copy-link: "リンクをコピー"
|
||||
favorite: "お気に入り"
|
||||
pin: "ピン留め"
|
||||
delete: "ほかす"
|
||||
@ -337,6 +362,9 @@ common/views/components/visibility-chooser.vue:
|
||||
specified: "ダイレクト"
|
||||
specified-desc: "指定したユーザーにのみ公開"
|
||||
private: "非公開"
|
||||
common/views/components/trends.vue:
|
||||
count: "{}人が投稿"
|
||||
empty: "トレンドなし"
|
||||
common/views/widgets/broadcast.vue:
|
||||
fetching: "確認中"
|
||||
no-broadcasts: "お知らせはあらへんで"
|
||||
@ -360,8 +388,6 @@ common/views/widgets/posts-monitor.vue:
|
||||
toggle: "表示を切り替え"
|
||||
common/views/widgets/hashtags.vue:
|
||||
title: "ハッシュタグ"
|
||||
count: "{}人が投稿"
|
||||
empty: "流行は自分で作るんや"
|
||||
common/views/widgets/server.vue:
|
||||
title: "サーバー情報"
|
||||
toggle: "表示を切り替え"
|
||||
@ -636,6 +662,9 @@ desktop/views/components/settings.vue:
|
||||
behaviour: "動作"
|
||||
fetch-on-scroll: "スクロールで自動読み込み"
|
||||
fetch-on-scroll-desc: "ページを下までスクロールしたときに自動で追加のコンテンツを読み込みます。"
|
||||
note-visibility: "投稿の公開範囲"
|
||||
default-note-visibility: "デフォルトの公開範囲"
|
||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||
auto-popout: "ウィンドウの自動ポップアウト"
|
||||
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
||||
advanced: "詳細設定"
|
||||
@ -647,6 +676,7 @@ desktop/views/components/settings.vue:
|
||||
delete-wallpaper: "壁紙を削除"
|
||||
dark-mode: "ダークモード"
|
||||
circle-icons: "円形のアイコンを使用"
|
||||
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
||||
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||
@ -861,7 +891,10 @@ desktop/views/pages/welcome.vue:
|
||||
signin-button: "サインイン中…"
|
||||
signup-button: "サインアップ"
|
||||
timeline: "タイムライン"
|
||||
announcements: "お知らせ"
|
||||
photos: "最近の画像"
|
||||
powered-by-misskey: "Powered by <b>Misskey</b>."
|
||||
info: "情報"
|
||||
desktop/views/pages/drive.vue:
|
||||
title: "ドライブ"
|
||||
desktop/views/pages/favorites.vue:
|
||||
@ -1149,6 +1182,7 @@ mobile/views/pages/settings.vue:
|
||||
dark-mode: "ダークモード"
|
||||
i-am-under-limited-internet: "私は通信を制限されている"
|
||||
circle-icons: "円形のアイコンを使用"
|
||||
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||
timeline: "タイムライン"
|
||||
show-reply-target: "リプライ先を表示する"
|
||||
show-my-renotes: "自分の行ったRenoteを表示する"
|
||||
@ -1157,8 +1191,14 @@ mobile/views/pages/settings.vue:
|
||||
post-style: "投稿の表示スタイル"
|
||||
post-style-standard: "標準"
|
||||
post-style-smart: "べっぴんさん"
|
||||
notification-position: "通知の表示"
|
||||
notification-position-bottom: "下"
|
||||
notification-position-top: "上"
|
||||
behavior: "動作"
|
||||
fetch-on-scroll: "スクロールで自動読み込み"
|
||||
note-visibility: "投稿の公開範囲"
|
||||
default-note-visibility: "デフォルトの公開範囲"
|
||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
|
||||
load-raw-images: "添付された画像を高画質で表示する"
|
||||
load-remote-media: "リモートサーバーのメディアを表示する"
|
||||
@ -1178,7 +1218,7 @@ mobile/views/pages/settings.vue:
|
||||
settings: "設定"
|
||||
signout: "サインアウト"
|
||||
sound: "サウンド"
|
||||
enableSounds: "サウンドを有効にする"
|
||||
enable-sounds: "サウンドを有効にする"
|
||||
mobile/views/pages/user.vue:
|
||||
follows-you: "フォローされています"
|
||||
following: "フォロー"
|
||||
|
@ -6,6 +6,19 @@ common:
|
||||
misskey: "A ⭐ of fediverse"
|
||||
about-title: "A ⭐ of fediverse."
|
||||
about: "Misskey를 찾아 주셔서 감사합니다. Misskey은 지구에서 태어난 <b>분산 마이크로 블로그 SNS </b> 입니다. Fediverse (다양한 SNS로 구성되는 우주)에 존재하는 다른 SNS와 상호 연결되어 있습니다. 잠시 도시의 번잡함에서 벗어나 새로운 인터넷에 다이브 해 보지 않겠습니까."
|
||||
intro:
|
||||
title: "Misskeyって?"
|
||||
about: "Misskeyはオープンソースの<b>分散型マイクロブログSNS</b>です。リッチで高度にカスタマイズできるUI、投稿へのリアクション、ファイルを一元管理できるドライブなど、先進的な機能を揃えています。また、Fediverseと呼ばれるネットワークに接続できるため、他のSNSともやり取りできます。例えば、あなたが何か投稿すると、その投稿はMisskeyだけでなく他のSNSにも伝わります。ちょうどある惑星から他の惑星に電波を発信している様子をイメージしてください。"
|
||||
features: "特徴"
|
||||
rich-contents: "投稿"
|
||||
rich-contents-desc: "自分の考え、話題の出来事、皆と共有したいことについて発信してください。必要であれば、様々な構文を使って投稿を装飾したり、好きな画像、動画などのファイルやアンケートを添付することもできます。"
|
||||
reaction: "リアクション"
|
||||
reaction-desc: "あなたの気持ちを伝える最も簡単な方法です。Misskeyは、他のユーザーの投稿に様々なリアクションを付けることができます。いちどMisskeyのリアクション機能を体験してしまうと、もう「いいね」の概念しか存在しないSNSには戻れなくなるかもしれません。"
|
||||
ui: "インターフェース"
|
||||
ui-desc: "どのようなUIが使いやすいかは人それぞれです。だから、Misskeyは自由度の高いUIを持っています。レイアウトやデザインを調整したり、カスタマイズ可能な様々なウィジェットを配置したりして、自分だけのホームを作ってください。"
|
||||
drive: "ドライブ"
|
||||
drive-desc: "以前投稿したことのある画像をまた投稿したくなったことはありませんか?もしくは、アップロードしたファイルをフォルダ分けして整理したくなったことはありませんか?Misskeyの根幹に組み込まれたドライブ機能によってそれらが解決します。ファイルの共有も簡単です。"
|
||||
outro: "他にもMisskeyにしかない機能はまだまだあるので、ぜひあなた自身の目で確かめてください。Misskeyは分散型SNSなので、このインスタンスが気に入らなければ他のインスタンスを試すこともできます。それでは、GLHF!"
|
||||
adblock:
|
||||
detected: "광고 차단기를 해제하십시오"
|
||||
warning: "<strong>Misskey는 광고를 게재하지 않습니다</strong> 그러나 광고를 차단하는 기능 기능을 사용할 경우 일부 기능을 사용할 수 없게 될 가능성이나 결함이 발생하는 경우가 있습니다."
|
||||
@ -68,6 +81,15 @@ common:
|
||||
confused: "곤란하고 있어"
|
||||
rip: "RIP"
|
||||
pudding: "Pudding"
|
||||
note-visibility:
|
||||
public: "公開"
|
||||
home: "ホーム"
|
||||
home-desc: "ホームタイムラインにのみ公開"
|
||||
followers: "フォロワー"
|
||||
followers-desc: "自分のフォロワーにのみ公開"
|
||||
specified: "ダイレクト"
|
||||
specified-desc: "指定したユーザーにのみ公開"
|
||||
private: "非公開"
|
||||
note-placeholders:
|
||||
a: "지금 어떻게하고있어?"
|
||||
b: "뭔가 있었습니까?"
|
||||
@ -87,6 +109,7 @@ common:
|
||||
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
||||
verified-user: "公式アカウント"
|
||||
disable-animated-mfm: "게시물의 문자 애니메이션을 비활성화 할"
|
||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||
reversi:
|
||||
drawn: "무승부"
|
||||
my-turn: "당신의 차례입니다"
|
||||
@ -260,6 +283,8 @@ common/views/components/nav.vue:
|
||||
develop: "開発者"
|
||||
feedback: "フィードバック"
|
||||
common/views/components/note-menu.vue:
|
||||
detail: "詳細"
|
||||
copy-link: "リンクをコピー"
|
||||
favorite: "お気に入り"
|
||||
pin: "ピン留め"
|
||||
delete: "削除"
|
||||
@ -337,6 +362,9 @@ common/views/components/visibility-chooser.vue:
|
||||
specified: "ダイレクト"
|
||||
specified-desc: "指定したユーザーにのみ公開"
|
||||
private: "非公開"
|
||||
common/views/components/trends.vue:
|
||||
count: "{}人が投稿"
|
||||
empty: "トレンドなし"
|
||||
common/views/widgets/broadcast.vue:
|
||||
fetching: "確認中"
|
||||
no-broadcasts: "お知らせはありません"
|
||||
@ -360,8 +388,6 @@ common/views/widgets/posts-monitor.vue:
|
||||
toggle: "表示を切り替え"
|
||||
common/views/widgets/hashtags.vue:
|
||||
title: "ハッシュタグ"
|
||||
count: "{}人が投稿"
|
||||
empty: "トレンドなし"
|
||||
common/views/widgets/server.vue:
|
||||
title: "サーバー情報"
|
||||
toggle: "表示を切り替え"
|
||||
@ -636,6 +662,9 @@ desktop/views/components/settings.vue:
|
||||
behaviour: "動作"
|
||||
fetch-on-scroll: "スクロールで自動読み込み"
|
||||
fetch-on-scroll-desc: "ページを下までスクロールしたときに自動で追加のコンテンツを読み込みます。"
|
||||
note-visibility: "投稿の公開範囲"
|
||||
default-note-visibility: "デフォルトの公開範囲"
|
||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||
auto-popout: "ウィンドウの自動ポップアウト"
|
||||
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
||||
advanced: "詳細設定"
|
||||
@ -647,6 +676,7 @@ desktop/views/components/settings.vue:
|
||||
delete-wallpaper: "壁紙を削除"
|
||||
dark-mode: "ダークモード"
|
||||
circle-icons: "円形のアイコンを使用"
|
||||
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
||||
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||
@ -861,7 +891,10 @@ desktop/views/pages/welcome.vue:
|
||||
signin-button: "やってる"
|
||||
signup-button: "やる"
|
||||
timeline: "タイムライン"
|
||||
announcements: "お知らせ"
|
||||
photos: "最近の画像"
|
||||
powered-by-misskey: "Powered by <b>Misskey</b>."
|
||||
info: "情報"
|
||||
desktop/views/pages/drive.vue:
|
||||
title: "Misskey Drive"
|
||||
desktop/views/pages/favorites.vue:
|
||||
@ -1149,6 +1182,7 @@ mobile/views/pages/settings.vue:
|
||||
dark-mode: "ダークモード"
|
||||
i-am-under-limited-internet: "私は通信を制限されている"
|
||||
circle-icons: "円形のアイコンを使用"
|
||||
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||
timeline: "タイムライン"
|
||||
show-reply-target: "リプライ先を表示する"
|
||||
show-my-renotes: "自分の行ったRenoteを表示する"
|
||||
@ -1157,8 +1191,14 @@ mobile/views/pages/settings.vue:
|
||||
post-style: "投稿の表示スタイル"
|
||||
post-style-standard: "標準"
|
||||
post-style-smart: "スマート"
|
||||
notification-position: "通知の表示"
|
||||
notification-position-bottom: "下"
|
||||
notification-position-top: "上"
|
||||
behavior: "動作"
|
||||
fetch-on-scroll: "スクロールで自動読み込み"
|
||||
note-visibility: "投稿の公開範囲"
|
||||
default-note-visibility: "デフォルトの公開範囲"
|
||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
|
||||
load-raw-images: "添付された画像を高画質で表示する"
|
||||
load-remote-media: "リモートサーバーのメディアを表示する"
|
||||
@ -1178,7 +1218,7 @@ mobile/views/pages/settings.vue:
|
||||
settings: "設定"
|
||||
signout: "サインアウト"
|
||||
sound: "サウンド"
|
||||
enableSounds: "サウンドを有効にする"
|
||||
enable-sounds: "サウンドを有効にする"
|
||||
mobile/views/pages/user.vue:
|
||||
follows-you: "フォローされています"
|
||||
following: "フォロー"
|
||||
|
1277
locales/nl-NL.yml
Normal file
1277
locales/no-NO.yml
Normal file
@ -6,6 +6,19 @@ common:
|
||||
misskey: "⭐ Fediwersum"
|
||||
about-title: "⭐ Fediwersum"
|
||||
about: "Dziękujemy za znalezienie Misskey. Misskey jest <b>zdecentralizowaną platformą mikroblogową</b> powstałą na Ziemi. Ponieważ działa ona w Fediwersum (uniwersum, w którego skład wchodzi wiele sieci społecznościowych), jest ona połączona z innymi platformami społecznościowymi. Spróbujesz odpocząć od zatłoczoneo miasta i zanurzyć się w nowym Internecie?"
|
||||
intro:
|
||||
title: "Misskeyって?"
|
||||
about: "Misskeyはオープンソースの<b>分散型マイクロブログSNS</b>です。リッチで高度にカスタマイズできるUI、投稿へのリアクション、ファイルを一元管理できるドライブなど、先進的な機能を揃えています。また、Fediverseと呼ばれるネットワークに接続できるため、他のSNSともやり取りできます。例えば、あなたが何か投稿すると、その投稿はMisskeyだけでなく他のSNSにも伝わります。ちょうどある惑星から他の惑星に電波を発信している様子をイメージしてください。"
|
||||
features: "特徴"
|
||||
rich-contents: "投稿"
|
||||
rich-contents-desc: "自分の考え、話題の出来事、皆と共有したいことについて発信してください。必要であれば、様々な構文を使って投稿を装飾したり、好きな画像、動画などのファイルやアンケートを添付することもできます。"
|
||||
reaction: "リアクション"
|
||||
reaction-desc: "あなたの気持ちを伝える最も簡単な方法です。Misskeyは、他のユーザーの投稿に様々なリアクションを付けることができます。いちどMisskeyのリアクション機能を体験してしまうと、もう「いいね」の概念しか存在しないSNSには戻れなくなるかもしれません。"
|
||||
ui: "インターフェース"
|
||||
ui-desc: "どのようなUIが使いやすいかは人それぞれです。だから、Misskeyは自由度の高いUIを持っています。レイアウトやデザインを調整したり、カスタマイズ可能な様々なウィジェットを配置したりして、自分だけのホームを作ってください。"
|
||||
drive: "ドライブ"
|
||||
drive-desc: "以前投稿したことのある画像をまた投稿したくなったことはありませんか?もしくは、アップロードしたファイルをフォルダ分けして整理したくなったことはありませんか?Misskeyの根幹に組み込まれたドライブ機能によってそれらが解決します。ファイルの共有も簡単です。"
|
||||
outro: "他にもMisskeyにしかない機能はまだまだあるので、ぜひあなた自身の目で確かめてください。Misskeyは分散型SNSなので、このインスタンスが気に入らなければ他のインスタンスを試すこともできます。それでは、GLHF!"
|
||||
adblock:
|
||||
detected: "Spróbuj wyłączyć blokadę reklam."
|
||||
warning: "<strong>Misskey nie zawiera reklam</strong>, ale część funkcji może nie działać prawidłowo z włączonym blokowaniem reklam."
|
||||
@ -68,6 +81,15 @@ common:
|
||||
confused: "Zmieszany"
|
||||
rip: "RIP"
|
||||
pudding: "Pudding"
|
||||
note-visibility:
|
||||
public: "公開"
|
||||
home: "ホーム"
|
||||
home-desc: "ホームタイムラインにのみ公開"
|
||||
followers: "フォロワー"
|
||||
followers-desc: "自分のフォロワーにのみ公開"
|
||||
specified: "ダイレクト"
|
||||
specified-desc: "指定したユーザーにのみ公開"
|
||||
private: "非公開"
|
||||
note-placeholders:
|
||||
a: "Co robisz?"
|
||||
b: "Co się wydarzyło?"
|
||||
@ -87,6 +109,7 @@ common:
|
||||
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
||||
verified-user: "公式アカウント"
|
||||
disable-animated-mfm: "Wyłącz animowany tekst we wpisach"
|
||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||
reversi:
|
||||
drawn: "Remis"
|
||||
my-turn: "Twoja kolej"
|
||||
@ -260,6 +283,8 @@ common/views/components/nav.vue:
|
||||
develop: "Autorzy"
|
||||
feedback: "Podziel się opinią"
|
||||
common/views/components/note-menu.vue:
|
||||
detail: "詳細"
|
||||
copy-link: "リンクをコピー"
|
||||
favorite: "Dodaj do ulubionych"
|
||||
pin: "Przypnij do profilu"
|
||||
delete: "Usuń"
|
||||
@ -337,6 +362,9 @@ common/views/components/visibility-chooser.vue:
|
||||
specified: "Bezpośredni"
|
||||
specified-desc: "Tylko dla określonych użytkowników"
|
||||
private: "Prywatny"
|
||||
common/views/components/trends.vue:
|
||||
count: "{}人が投稿"
|
||||
empty: "トレンドなし"
|
||||
common/views/widgets/broadcast.vue:
|
||||
fetching: "Sprawdzanie"
|
||||
no-broadcasts: "Brak transmisji"
|
||||
@ -360,8 +388,6 @@ common/views/widgets/posts-monitor.vue:
|
||||
toggle: "Przełącz widok"
|
||||
common/views/widgets/hashtags.vue:
|
||||
title: "Hashtagi"
|
||||
count: "Wspomniany przez {} użytkowników"
|
||||
empty: "Brak popularnych hashtagów"
|
||||
common/views/widgets/server.vue:
|
||||
title: "Informacje o serwerze"
|
||||
toggle: "Przełącz widok"
|
||||
@ -636,6 +662,9 @@ desktop/views/components/settings.vue:
|
||||
behaviour: "Zachowanie"
|
||||
fetch-on-scroll: "Automatycznie ładuj po przeciągnięciu w dół"
|
||||
fetch-on-scroll-desc: "Po przewinięciu na dół strony automatycznie zostaną załadowane nowe treści."
|
||||
note-visibility: "投稿の公開範囲"
|
||||
default-note-visibility: "デフォルトの公開範囲"
|
||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||
auto-popout: "Automatycznie pojawiające się okna"
|
||||
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
||||
advanced: "Ustawienia zaawansowane"
|
||||
@ -647,6 +676,7 @@ desktop/views/components/settings.vue:
|
||||
delete-wallpaper: "Usuń tło"
|
||||
dark-mode: "Tryb ciemny"
|
||||
circle-icons: "Używaj okrągłych ikon"
|
||||
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||
gradient-window-header: "Używaj gradientów na pasku tytułu okna"
|
||||
post-form-on-timeline: "Wyświetlaj formularz tworzenia wpisu w górnej części osi czasu"
|
||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||
@ -861,7 +891,10 @@ desktop/views/pages/welcome.vue:
|
||||
signin-button: "Zaloguj się"
|
||||
signup-button: "Zarejestruj się"
|
||||
timeline: "Oś czasu"
|
||||
announcements: "お知らせ"
|
||||
photos: "最近の画像"
|
||||
powered-by-misskey: "Oparto o <b>Misskey</b>."
|
||||
info: "情報"
|
||||
desktop/views/pages/drive.vue:
|
||||
title: "Dysk Misskey"
|
||||
desktop/views/pages/favorites.vue:
|
||||
@ -1149,6 +1182,7 @@ mobile/views/pages/settings.vue:
|
||||
dark-mode: "Tryb ciemny"
|
||||
i-am-under-limited-internet: "Ograniczaj zużycie transferu"
|
||||
circle-icons: "Używaj okrągłych ikon"
|
||||
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||
timeline: "Oś czasu"
|
||||
show-reply-target: "Pokazuj cel odpowiedzi"
|
||||
show-my-renotes: "Pokazuj moje udostępnienia"
|
||||
@ -1157,8 +1191,14 @@ mobile/views/pages/settings.vue:
|
||||
post-style: "Styl wpisów"
|
||||
post-style-standard: "Standardowy"
|
||||
post-style-smart: "Inteligentny"
|
||||
notification-position: "通知の表示"
|
||||
notification-position-bottom: "下"
|
||||
notification-position-top: "上"
|
||||
behavior: "Zachowanie"
|
||||
fetch-on-scroll: "Automatycznie ładuj po przeciągnięciu w dół"
|
||||
note-visibility: "投稿の公開範囲"
|
||||
default-note-visibility: "デフォルトの公開範囲"
|
||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||
disable-via-mobile: "Nie oznaczaj wpisów jako „wysłane z telefonu”"
|
||||
load-raw-images: "Wyświetlaj załączone zdjęcia w wysokiej jakości"
|
||||
load-remote-media: "Wyświetlaj zawartość multimedialną ze zdalnych serwerów"
|
||||
@ -1178,7 +1218,7 @@ mobile/views/pages/settings.vue:
|
||||
settings: "Ustawienia"
|
||||
signout: "Wyloguj"
|
||||
sound: "サウンド"
|
||||
enableSounds: "サウンドを有効にする"
|
||||
enable-sounds: "サウンドを有効にする"
|
||||
mobile/views/pages/user.vue:
|
||||
follows-you: "Śledzi Cię"
|
||||
following: "Śledzeni"
|
||||
|
@ -6,6 +6,19 @@ common:
|
||||
misskey: "Uma ⭐ do fediverso"
|
||||
about-title: "Uma ⭐ do fediverso."
|
||||
about: "Obrigado por encontrar Misskey. Uma <b>plataforma descentralizada de microblog</b> nascida na Terra. Já que ela existe no Fediverso (um universo onde várias plataformas de mídia social são organizadas), ela é ligada com outras plataformas.Por que você não tira uma folga do agito e confusão da cidade, e mergulha em uma nova internet?"
|
||||
intro:
|
||||
title: "Misskeyって?"
|
||||
about: "Misskeyはオープンソースの<b>分散型マイクロブログSNS</b>です。リッチで高度にカスタマイズできるUI、投稿へのリアクション、ファイルを一元管理できるドライブなど、先進的な機能を揃えています。また、Fediverseと呼ばれるネットワークに接続できるため、他のSNSともやり取りできます。例えば、あなたが何か投稿すると、その投稿はMisskeyだけでなく他のSNSにも伝わります。ちょうどある惑星から他の惑星に電波を発信している様子をイメージしてください。"
|
||||
features: "特徴"
|
||||
rich-contents: "投稿"
|
||||
rich-contents-desc: "自分の考え、話題の出来事、皆と共有したいことについて発信してください。必要であれば、様々な構文を使って投稿を装飾したり、好きな画像、動画などのファイルやアンケートを添付することもできます。"
|
||||
reaction: "リアクション"
|
||||
reaction-desc: "あなたの気持ちを伝える最も簡単な方法です。Misskeyは、他のユーザーの投稿に様々なリアクションを付けることができます。いちどMisskeyのリアクション機能を体験してしまうと、もう「いいね」の概念しか存在しないSNSには戻れなくなるかもしれません。"
|
||||
ui: "インターフェース"
|
||||
ui-desc: "どのようなUIが使いやすいかは人それぞれです。だから、Misskeyは自由度の高いUIを持っています。レイアウトやデザインを調整したり、カスタマイズ可能な様々なウィジェットを配置したりして、自分だけのホームを作ってください。"
|
||||
drive: "ドライブ"
|
||||
drive-desc: "以前投稿したことのある画像をまた投稿したくなったことはありませんか?もしくは、アップロードしたファイルをフォルダ分けして整理したくなったことはありませんか?Misskeyの根幹に組み込まれたドライブ機能によってそれらが解決します。ファイルの共有も簡単です。"
|
||||
outro: "他にもMisskeyにしかない機能はまだまだあるので、ぜひあなた自身の目で確かめてください。Misskeyは分散型SNSなので、このインスタンスが気に入らなければ他のインスタンスを試すこともできます。それでは、GLHF!"
|
||||
adblock:
|
||||
detected: "Por favor, desative o bloqueador de anúncios."
|
||||
warning: "Alguns recursos podem não estar disponíveis ou apresentar mal funcionamento se o bloqueio de anúncios estiver ativado. <strong>Misskey não está usando anúncios</strong>"
|
||||
@ -68,6 +81,15 @@ common:
|
||||
confused: "Confuso"
|
||||
rip: "RIP"
|
||||
pudding: "Pudim"
|
||||
note-visibility:
|
||||
public: "公開"
|
||||
home: "ホーム"
|
||||
home-desc: "ホームタイムラインにのみ公開"
|
||||
followers: "フォロワー"
|
||||
followers-desc: "自分のフォロワーにのみ公開"
|
||||
specified: "ダイレクト"
|
||||
specified-desc: "指定したユーザーにのみ公開"
|
||||
private: "非公開"
|
||||
note-placeholders:
|
||||
a: "O que está fazendo?"
|
||||
b: "O que está acontecendo?"
|
||||
@ -87,6 +109,7 @@ common:
|
||||
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
||||
verified-user: "Conta verificada"
|
||||
disable-animated-mfm: "Desativar texto animado nas publicações"
|
||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||
reversi:
|
||||
drawn: "Empatado"
|
||||
my-turn: "Seu turno"
|
||||
@ -260,6 +283,8 @@ common/views/components/nav.vue:
|
||||
develop: "開発者"
|
||||
feedback: "フィードバック"
|
||||
common/views/components/note-menu.vue:
|
||||
detail: "詳細"
|
||||
copy-link: "リンクをコピー"
|
||||
favorite: "お気に入り"
|
||||
pin: "ピン留め"
|
||||
delete: "削除"
|
||||
@ -337,6 +362,9 @@ common/views/components/visibility-chooser.vue:
|
||||
specified: "ダイレクト"
|
||||
specified-desc: "指定したユーザーにのみ公開"
|
||||
private: "非公開"
|
||||
common/views/components/trends.vue:
|
||||
count: "{}人が投稿"
|
||||
empty: "トレンドなし"
|
||||
common/views/widgets/broadcast.vue:
|
||||
fetching: "確認中"
|
||||
no-broadcasts: "お知らせはありません"
|
||||
@ -360,8 +388,6 @@ common/views/widgets/posts-monitor.vue:
|
||||
toggle: "表示を切り替え"
|
||||
common/views/widgets/hashtags.vue:
|
||||
title: "ハッシュタグ"
|
||||
count: "{}人が投稿"
|
||||
empty: "トレンドなし"
|
||||
common/views/widgets/server.vue:
|
||||
title: "サーバー情報"
|
||||
toggle: "表示を切り替え"
|
||||
@ -636,6 +662,9 @@ desktop/views/components/settings.vue:
|
||||
behaviour: "動作"
|
||||
fetch-on-scroll: "スクロールで自動読み込み"
|
||||
fetch-on-scroll-desc: "ページを下までスクロールしたときに自動で追加のコンテンツを読み込みます。"
|
||||
note-visibility: "投稿の公開範囲"
|
||||
default-note-visibility: "デフォルトの公開範囲"
|
||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||
auto-popout: "ウィンドウの自動ポップアウト"
|
||||
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
||||
advanced: "詳細設定"
|
||||
@ -647,6 +676,7 @@ desktop/views/components/settings.vue:
|
||||
delete-wallpaper: "壁紙を削除"
|
||||
dark-mode: "ダークモード"
|
||||
circle-icons: "円形のアイコンを使用"
|
||||
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
||||
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||
@ -861,7 +891,10 @@ desktop/views/pages/welcome.vue:
|
||||
signin-button: "やってる"
|
||||
signup-button: "やる"
|
||||
timeline: "Timeline"
|
||||
announcements: "お知らせ"
|
||||
photos: "最近の画像"
|
||||
powered-by-misskey: "Desenvolvido por <b>Misskey</b>."
|
||||
info: "情報"
|
||||
desktop/views/pages/drive.vue:
|
||||
title: "Drive Misskey"
|
||||
desktop/views/pages/favorites.vue:
|
||||
@ -1149,6 +1182,7 @@ mobile/views/pages/settings.vue:
|
||||
dark-mode: "ダークモード"
|
||||
i-am-under-limited-internet: "私は通信を制限されている"
|
||||
circle-icons: "円形のアイコンを使用"
|
||||
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||
timeline: "タイムライン"
|
||||
show-reply-target: "リプライ先を表示する"
|
||||
show-my-renotes: "自分の行ったRenoteを表示する"
|
||||
@ -1157,8 +1191,14 @@ mobile/views/pages/settings.vue:
|
||||
post-style: "投稿の表示スタイル"
|
||||
post-style-standard: "標準"
|
||||
post-style-smart: "スマート"
|
||||
notification-position: "通知の表示"
|
||||
notification-position-bottom: "下"
|
||||
notification-position-top: "上"
|
||||
behavior: "動作"
|
||||
fetch-on-scroll: "スクロールで自動読み込み"
|
||||
note-visibility: "投稿の公開範囲"
|
||||
default-note-visibility: "デフォルトの公開範囲"
|
||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
|
||||
load-raw-images: "添付された画像を高画質で表示する"
|
||||
load-remote-media: "リモートサーバーのメディアを表示する"
|
||||
@ -1178,7 +1218,7 @@ mobile/views/pages/settings.vue:
|
||||
settings: "設定"
|
||||
signout: "サインアウト"
|
||||
sound: "サウンド"
|
||||
enableSounds: "サウンドを有効にする"
|
||||
enable-sounds: "サウンドを有効にする"
|
||||
mobile/views/pages/user.vue:
|
||||
follows-you: "フォローされています"
|
||||
following: "フォロー"
|
||||
|
@ -6,6 +6,19 @@ common:
|
||||
misskey: "A ⭐ of fediverse"
|
||||
about-title: "A ⭐ of fediverse."
|
||||
about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。"
|
||||
intro:
|
||||
title: "Misskeyって?"
|
||||
about: "Misskeyはオープンソースの<b>分散型マイクロブログSNS</b>です。リッチで高度にカスタマイズできるUI、投稿へのリアクション、ファイルを一元管理できるドライブなど、先進的な機能を揃えています。また、Fediverseと呼ばれるネットワークに接続できるため、他のSNSともやり取りできます。例えば、あなたが何か投稿すると、その投稿はMisskeyだけでなく他のSNSにも伝わります。ちょうどある惑星から他の惑星に電波を発信している様子をイメージしてください。"
|
||||
features: "特徴"
|
||||
rich-contents: "投稿"
|
||||
rich-contents-desc: "自分の考え、話題の出来事、皆と共有したいことについて発信してください。必要であれば、様々な構文を使って投稿を装飾したり、好きな画像、動画などのファイルやアンケートを添付することもできます。"
|
||||
reaction: "リアクション"
|
||||
reaction-desc: "あなたの気持ちを伝える最も簡単な方法です。Misskeyは、他のユーザーの投稿に様々なリアクションを付けることができます。いちどMisskeyのリアクション機能を体験してしまうと、もう「いいね」の概念しか存在しないSNSには戻れなくなるかもしれません。"
|
||||
ui: "インターフェース"
|
||||
ui-desc: "どのようなUIが使いやすいかは人それぞれです。だから、Misskeyは自由度の高いUIを持っています。レイアウトやデザインを調整したり、カスタマイズ可能な様々なウィジェットを配置したりして、自分だけのホームを作ってください。"
|
||||
drive: "ドライブ"
|
||||
drive-desc: "以前投稿したことのある画像をまた投稿したくなったことはありませんか?もしくは、アップロードしたファイルをフォルダ分けして整理したくなったことはありませんか?Misskeyの根幹に組み込まれたドライブ機能によってそれらが解決します。ファイルの共有も簡単です。"
|
||||
outro: "他にもMisskeyにしかない機能はまだまだあるので、ぜひあなた自身の目で確かめてください。Misskeyは分散型SNSなので、このインスタンスが気に入らなければ他のインスタンスを試すこともできます。それでは、GLHF!"
|
||||
adblock:
|
||||
detected: "広告ブロッカーを無効にしてください"
|
||||
warning: "<strong>Misskeyは広告を掲載していません</strong>が、広告をブロックする機能が有効だと一部の機能が利用できなかったり、不具合が発生する場合があります。"
|
||||
@ -68,6 +81,15 @@ common:
|
||||
confused: "こまこまのこまり"
|
||||
rip: "RIP"
|
||||
pudding: "Pudding"
|
||||
note-visibility:
|
||||
public: "公開"
|
||||
home: "ホーム"
|
||||
home-desc: "ホームタイムラインにのみ公開"
|
||||
followers: "フォロワー"
|
||||
followers-desc: "自分のフォロワーにのみ公開"
|
||||
specified: "ダイレクト"
|
||||
specified-desc: "指定したユーザーにのみ公開"
|
||||
private: "非公開"
|
||||
note-placeholders:
|
||||
a: "今どうしてる?"
|
||||
b: "何かありましたか?"
|
||||
@ -87,6 +109,7 @@ common:
|
||||
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
||||
verified-user: "公式アカウント"
|
||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||
reversi:
|
||||
drawn: "引き分け"
|
||||
my-turn: "あなたのターンです"
|
||||
@ -260,6 +283,8 @@ common/views/components/nav.vue:
|
||||
develop: "開発者"
|
||||
feedback: "フィードバック"
|
||||
common/views/components/note-menu.vue:
|
||||
detail: "詳細"
|
||||
copy-link: "リンクをコピー"
|
||||
favorite: "お気に入り"
|
||||
pin: "ピン留め"
|
||||
delete: "削除"
|
||||
@ -337,6 +362,9 @@ common/views/components/visibility-chooser.vue:
|
||||
specified: "ダイレクト"
|
||||
specified-desc: "指定したユーザーにのみ公開"
|
||||
private: "非公開"
|
||||
common/views/components/trends.vue:
|
||||
count: "{}人が投稿"
|
||||
empty: "トレンドなし"
|
||||
common/views/widgets/broadcast.vue:
|
||||
fetching: "確認中"
|
||||
no-broadcasts: "お知らせはありません"
|
||||
@ -360,8 +388,6 @@ common/views/widgets/posts-monitor.vue:
|
||||
toggle: "表示を切り替え"
|
||||
common/views/widgets/hashtags.vue:
|
||||
title: "ハッシュタグ"
|
||||
count: "{}人が投稿"
|
||||
empty: "トレンドなし"
|
||||
common/views/widgets/server.vue:
|
||||
title: "サーバー情報"
|
||||
toggle: "表示を切り替え"
|
||||
@ -636,6 +662,9 @@ desktop/views/components/settings.vue:
|
||||
behaviour: "動作"
|
||||
fetch-on-scroll: "スクロールで自動読み込み"
|
||||
fetch-on-scroll-desc: "ページを下までスクロールしたときに自動で追加のコンテンツを読み込みます。"
|
||||
note-visibility: "投稿の公開範囲"
|
||||
default-note-visibility: "デフォルトの公開範囲"
|
||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||
auto-popout: "ウィンドウの自動ポップアウト"
|
||||
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
||||
advanced: "詳細設定"
|
||||
@ -647,6 +676,7 @@ desktop/views/components/settings.vue:
|
||||
delete-wallpaper: "壁紙を削除"
|
||||
dark-mode: "ダークモード"
|
||||
circle-icons: "円形のアイコンを使用"
|
||||
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
||||
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||
@ -861,7 +891,10 @@ desktop/views/pages/welcome.vue:
|
||||
signin-button: "やってる"
|
||||
signup-button: "やる"
|
||||
timeline: "タイムライン"
|
||||
announcements: "お知らせ"
|
||||
photos: "最近の画像"
|
||||
powered-by-misskey: "Powered by <b>Misskey</b>."
|
||||
info: "情報"
|
||||
desktop/views/pages/drive.vue:
|
||||
title: "Misskey Drive"
|
||||
desktop/views/pages/favorites.vue:
|
||||
@ -1149,6 +1182,7 @@ mobile/views/pages/settings.vue:
|
||||
dark-mode: "ダークモード"
|
||||
i-am-under-limited-internet: "私は通信を制限されている"
|
||||
circle-icons: "円形のアイコンを使用"
|
||||
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||
timeline: "タイムライン"
|
||||
show-reply-target: "リプライ先を表示する"
|
||||
show-my-renotes: "自分の行ったRenoteを表示する"
|
||||
@ -1157,8 +1191,14 @@ mobile/views/pages/settings.vue:
|
||||
post-style: "投稿の表示スタイル"
|
||||
post-style-standard: "標準"
|
||||
post-style-smart: "スマート"
|
||||
notification-position: "通知の表示"
|
||||
notification-position-bottom: "下"
|
||||
notification-position-top: "上"
|
||||
behavior: "動作"
|
||||
fetch-on-scroll: "スクロールで自動読み込み"
|
||||
note-visibility: "投稿の公開範囲"
|
||||
default-note-visibility: "デフォルトの公開範囲"
|
||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
|
||||
load-raw-images: "添付された画像を高画質で表示する"
|
||||
load-remote-media: "リモートサーバーのメディアを表示する"
|
||||
@ -1178,7 +1218,7 @@ mobile/views/pages/settings.vue:
|
||||
settings: "設定"
|
||||
signout: "サインアウト"
|
||||
sound: "サウンド"
|
||||
enableSounds: "サウンドを有効にする"
|
||||
enable-sounds: "サウンドを有効にする"
|
||||
mobile/views/pages/user.vue:
|
||||
follows-you: "フォローされています"
|
||||
following: "フォロー"
|
||||
|
@ -6,6 +6,19 @@ common:
|
||||
misskey: "A ⭐ of fediverse"
|
||||
about-title: "A ⭐ of fediverse."
|
||||
about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。"
|
||||
intro:
|
||||
title: "Misskeyって?"
|
||||
about: "Misskeyはオープンソースの<b>分散型マイクロブログSNS</b>です。リッチで高度にカスタマイズできるUI、投稿へのリアクション、ファイルを一元管理できるドライブなど、先進的な機能を揃えています。また、Fediverseと呼ばれるネットワークに接続できるため、他のSNSともやり取りできます。例えば、あなたが何か投稿すると、その投稿はMisskeyだけでなく他のSNSにも伝わります。ちょうどある惑星から他の惑星に電波を発信している様子をイメージしてください。"
|
||||
features: "特徴"
|
||||
rich-contents: "投稿"
|
||||
rich-contents-desc: "自分の考え、話題の出来事、皆と共有したいことについて発信してください。必要であれば、様々な構文を使って投稿を装飾したり、好きな画像、動画などのファイルやアンケートを添付することもできます。"
|
||||
reaction: "リアクション"
|
||||
reaction-desc: "あなたの気持ちを伝える最も簡単な方法です。Misskeyは、他のユーザーの投稿に様々なリアクションを付けることができます。いちどMisskeyのリアクション機能を体験してしまうと、もう「いいね」の概念しか存在しないSNSには戻れなくなるかもしれません。"
|
||||
ui: "インターフェース"
|
||||
ui-desc: "どのようなUIが使いやすいかは人それぞれです。だから、Misskeyは自由度の高いUIを持っています。レイアウトやデザインを調整したり、カスタマイズ可能な様々なウィジェットを配置したりして、自分だけのホームを作ってください。"
|
||||
drive: "ドライブ"
|
||||
drive-desc: "以前投稿したことのある画像をまた投稿したくなったことはありませんか?もしくは、アップロードしたファイルをフォルダ分けして整理したくなったことはありませんか?Misskeyの根幹に組み込まれたドライブ機能によってそれらが解決します。ファイルの共有も簡単です。"
|
||||
outro: "他にもMisskeyにしかない機能はまだまだあるので、ぜひあなた自身の目で確かめてください。Misskeyは分散型SNSなので、このインスタンスが気に入らなければ他のインスタンスを試すこともできます。それでは、GLHF!"
|
||||
adblock:
|
||||
detected: "広告ブロッカーを無効にしてください"
|
||||
warning: "<strong>Misskeyは広告を掲載していません</strong>が、広告をブロックする機能が有効だと一部の機能が利用できなかったり、不具合が発生する場合があります。"
|
||||
@ -68,6 +81,15 @@ common:
|
||||
confused: "こまこまのこまり"
|
||||
rip: "RIP"
|
||||
pudding: "Pudding"
|
||||
note-visibility:
|
||||
public: "公開"
|
||||
home: "ホーム"
|
||||
home-desc: "ホームタイムラインにのみ公開"
|
||||
followers: "フォロワー"
|
||||
followers-desc: "自分のフォロワーにのみ公開"
|
||||
specified: "ダイレクト"
|
||||
specified-desc: "指定したユーザーにのみ公開"
|
||||
private: "非公開"
|
||||
note-placeholders:
|
||||
a: "今どうしてる?"
|
||||
b: "何かありましたか?"
|
||||
@ -87,6 +109,7 @@ common:
|
||||
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
||||
verified-user: "公式アカウント"
|
||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||
reversi:
|
||||
drawn: "引き分け"
|
||||
my-turn: "あなたのターンです"
|
||||
@ -260,6 +283,8 @@ common/views/components/nav.vue:
|
||||
develop: "開発者"
|
||||
feedback: "フィードバック"
|
||||
common/views/components/note-menu.vue:
|
||||
detail: "詳細"
|
||||
copy-link: "リンクをコピー"
|
||||
favorite: "お気に入り"
|
||||
pin: "ピン留め"
|
||||
delete: "削除"
|
||||
@ -337,6 +362,9 @@ common/views/components/visibility-chooser.vue:
|
||||
specified: "ダイレクト"
|
||||
specified-desc: "指定したユーザーにのみ公開"
|
||||
private: "非公開"
|
||||
common/views/components/trends.vue:
|
||||
count: "{}人が投稿"
|
||||
empty: "トレンドなし"
|
||||
common/views/widgets/broadcast.vue:
|
||||
fetching: "確認中"
|
||||
no-broadcasts: "お知らせはありません"
|
||||
@ -360,8 +388,6 @@ common/views/widgets/posts-monitor.vue:
|
||||
toggle: "表示を切り替え"
|
||||
common/views/widgets/hashtags.vue:
|
||||
title: "ハッシュタグ"
|
||||
count: "{}人が投稿"
|
||||
empty: "トレンドなし"
|
||||
common/views/widgets/server.vue:
|
||||
title: "サーバー情報"
|
||||
toggle: "表示を切り替え"
|
||||
@ -636,6 +662,9 @@ desktop/views/components/settings.vue:
|
||||
behaviour: "動作"
|
||||
fetch-on-scroll: "スクロールで自動読み込み"
|
||||
fetch-on-scroll-desc: "ページを下までスクロールしたときに自動で追加のコンテンツを読み込みます。"
|
||||
note-visibility: "投稿の公開範囲"
|
||||
default-note-visibility: "デフォルトの公開範囲"
|
||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||
auto-popout: "ウィンドウの自動ポップアウト"
|
||||
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
||||
advanced: "詳細設定"
|
||||
@ -647,6 +676,7 @@ desktop/views/components/settings.vue:
|
||||
delete-wallpaper: "壁紙を削除"
|
||||
dark-mode: "ダークモード"
|
||||
circle-icons: "円形のアイコンを使用"
|
||||
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
||||
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||
@ -861,7 +891,10 @@ desktop/views/pages/welcome.vue:
|
||||
signin-button: "やってる"
|
||||
signup-button: "やる"
|
||||
timeline: "タイムライン"
|
||||
announcements: "お知らせ"
|
||||
photos: "最近の画像"
|
||||
powered-by-misskey: "Powered by <b>Misskey</b>."
|
||||
info: "情報"
|
||||
desktop/views/pages/drive.vue:
|
||||
title: "Misskey Drive"
|
||||
desktop/views/pages/favorites.vue:
|
||||
@ -1149,6 +1182,7 @@ mobile/views/pages/settings.vue:
|
||||
dark-mode: "ダークモード"
|
||||
i-am-under-limited-internet: "私は通信を制限されている"
|
||||
circle-icons: "円形のアイコンを使用"
|
||||
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||
timeline: "タイムライン"
|
||||
show-reply-target: "リプライ先を表示する"
|
||||
show-my-renotes: "自分の行ったRenoteを表示する"
|
||||
@ -1157,8 +1191,14 @@ mobile/views/pages/settings.vue:
|
||||
post-style: "投稿の表示スタイル"
|
||||
post-style-standard: "標準"
|
||||
post-style-smart: "スマート"
|
||||
notification-position: "通知の表示"
|
||||
notification-position-bottom: "下"
|
||||
notification-position-top: "上"
|
||||
behavior: "動作"
|
||||
fetch-on-scroll: "スクロールで自動読み込み"
|
||||
note-visibility: "投稿の公開範囲"
|
||||
default-note-visibility: "デフォルトの公開範囲"
|
||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
|
||||
load-raw-images: "添付された画像を高画質で表示する"
|
||||
load-remote-media: "リモートサーバーのメディアを表示する"
|
||||
@ -1178,7 +1218,7 @@ mobile/views/pages/settings.vue:
|
||||
settings: "設定"
|
||||
signout: "サインアウト"
|
||||
sound: "サウンド"
|
||||
enableSounds: "サウンドを有効にする"
|
||||
enable-sounds: "サウンドを有効にする"
|
||||
mobile/views/pages/user.vue:
|
||||
follows-you: "フォローされています"
|
||||
following: "フォロー"
|
||||
|
19
package.json
@ -1,8 +1,8 @@
|
||||
{
|
||||
"name": "misskey",
|
||||
"author": "syuilo <i@syuilo.com>",
|
||||
"version": "8.24.0",
|
||||
"clientVersion": "1.0.9289",
|
||||
"version": "8.34.2",
|
||||
"clientVersion": "1.0.9567",
|
||||
"codename": "nighthike",
|
||||
"main": "./built/index.js",
|
||||
"private": true,
|
||||
@ -55,7 +55,7 @@
|
||||
"@types/koa-send": "4.1.1",
|
||||
"@types/koa-views": "2.0.3",
|
||||
"@types/koa__cors": "2.2.3",
|
||||
"@types/minio": "6.0.2",
|
||||
"@types/minio": "7.0.0",
|
||||
"@types/mkdirp": "0.5.2",
|
||||
"@types/mocha": "5.2.3",
|
||||
"@types/mongodb": "3.1.4",
|
||||
@ -80,7 +80,7 @@
|
||||
"@types/webpack": "4.4.11",
|
||||
"@types/webpack-stream": "3.2.10",
|
||||
"@types/websocket": "0.0.40",
|
||||
"@types/ws": "6.0.0",
|
||||
"@types/ws": "6.0.1",
|
||||
"animejs": "2.2.0",
|
||||
"autosize": "4.0.2",
|
||||
"autwh": "0.1.0",
|
||||
@ -151,7 +151,7 @@
|
||||
"lodash.assign": "4.2.0",
|
||||
"mecab-async": "0.1.2",
|
||||
"merge-options": "1.0.1",
|
||||
"minio": "7.0.0",
|
||||
"minio": "7.0.1",
|
||||
"mkdirp": "0.5.1",
|
||||
"mocha": "5.2.0",
|
||||
"moji": "0.5.1",
|
||||
@ -161,7 +161,7 @@
|
||||
"nan": "2.11.0",
|
||||
"nested-property": "0.0.7",
|
||||
"node-sass": "4.9.3",
|
||||
"node-sass-json-importer": "3.3.1",
|
||||
"node-sass-json-importer": "4.0.1",
|
||||
"nprogress": "0.2.0",
|
||||
"object-assign-deep": "0.4.0",
|
||||
"on-build-webpack": "0.1.0",
|
||||
@ -194,7 +194,7 @@
|
||||
"stylus": "0.54.5",
|
||||
"stylus-loader": "3.0.2",
|
||||
"summaly": "2.2.0",
|
||||
"systeminformation": "3.44.2",
|
||||
"systeminformation": "3.45.1",
|
||||
"syuilo-password-strength": "0.0.1",
|
||||
"textarea-caret": "3.1.0",
|
||||
"tmp": "0.0.33",
|
||||
@ -210,18 +210,19 @@
|
||||
"vue": "2.5.17",
|
||||
"vue-chartjs": "3.4.0",
|
||||
"vue-cropperjs": "2.2.1",
|
||||
"vue-js-modal": "1.3.25",
|
||||
"vue-js-modal": "1.3.26",
|
||||
"vue-json-tree-view": "2.1.4",
|
||||
"vue-loader": "15.4.1",
|
||||
"vue-router": "3.0.1",
|
||||
"vue-style-loader": "4.1.2",
|
||||
"vue-template-compiler": "2.5.17",
|
||||
"vuedraggable": "2.16.0",
|
||||
"vuewordcloud": "18.7.11",
|
||||
"vuex": "3.0.1",
|
||||
"vuex-persistedstate": "2.5.4",
|
||||
"web-push": "3.3.2",
|
||||
"webfinger.js": "2.6.6",
|
||||
"webpack": "4.17.1",
|
||||
"webpack": "4.17.2",
|
||||
"webpack-cli": "3.1.0",
|
||||
"websocket": "1.0.26",
|
||||
"ws": "6.0.0",
|
||||
|
@ -140,7 +140,7 @@
|
||||
// Random
|
||||
localStorage.setItem('salt', Math.random().toString());
|
||||
|
||||
// Clear cache (serive worker)
|
||||
// Clear cache (service worker)
|
||||
try {
|
||||
navigator.serviceWorker.controller.postMessage('clear');
|
||||
|
||||
|
@ -9,7 +9,7 @@ export default async function(mios: MiOS, force = false, silent = false) {
|
||||
localStorage.setItem('should-refresh', 'true');
|
||||
localStorage.setItem('v', newer);
|
||||
|
||||
// Clear cache (serive worker)
|
||||
// Clear cache (service worker)
|
||||
try {
|
||||
if (navigator.serviceWorker.controller) {
|
||||
navigator.serviceWorker.controller.postMessage('clear');
|
||||
|
@ -1,2 +0,0 @@
|
||||
const gcd = (a, b) => !b ? a : gcd(b, a % b);
|
||||
export default gcd;
|
@ -1,53 +0,0 @@
|
||||
export default function(qs: string) {
|
||||
const q = {
|
||||
text: ''
|
||||
};
|
||||
|
||||
qs.split(' ').forEach(x => {
|
||||
if (/^([a-z_]+?):(.+?)$/.test(x)) {
|
||||
const [key, value] = x.split(':');
|
||||
switch (key) {
|
||||
case 'user':
|
||||
q['includeUserUsernames'] = value.split(',');
|
||||
break;
|
||||
case 'exclude_user':
|
||||
q['excludeUserUsernames'] = value.split(',');
|
||||
break;
|
||||
case 'follow':
|
||||
q['following'] = value == 'null' ? null : value == 'true';
|
||||
break;
|
||||
case 'reply':
|
||||
q['reply'] = value == 'null' ? null : value == 'true';
|
||||
break;
|
||||
case 'renote':
|
||||
q['renote'] = value == 'null' ? null : value == 'true';
|
||||
break;
|
||||
case 'media':
|
||||
q['media'] = value == 'null' ? null : value == 'true';
|
||||
break;
|
||||
case 'poll':
|
||||
q['poll'] = value == 'null' ? null : value == 'true';
|
||||
break;
|
||||
case 'until':
|
||||
case 'since':
|
||||
// YYYY-MM-DD
|
||||
if (/^[0-9]+\-[0-9]+\-[0-9]+$/) {
|
||||
const [yyyy, mm, dd] = value.split('-');
|
||||
q[`${key}_date`] = (new Date(parseInt(yyyy, 10), parseInt(mm, 10) - 1, parseInt(dd, 10))).getTime();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
q[key] = value;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
q.text += x + ' ';
|
||||
}
|
||||
});
|
||||
|
||||
if (q.text) {
|
||||
q.text = q.text.trim();
|
||||
}
|
||||
|
||||
return q;
|
||||
}
|
@ -3,8 +3,10 @@ import MiOS from '../../../../../mios';
|
||||
|
||||
export class ReversiGameStream extends Stream {
|
||||
constructor(os: MiOS, me, game) {
|
||||
super(os, 'games/reversi-game', {
|
||||
i: me ? me.token : null,
|
||||
super(os, 'games/reversi-game', me ? {
|
||||
i: me.token,
|
||||
game: game.id
|
||||
} : {
|
||||
game: game.id
|
||||
});
|
||||
}
|
||||
|
@ -7,9 +7,9 @@ import MiOS from '../../../mios';
|
||||
*/
|
||||
export class LocalTimelineStream extends Stream {
|
||||
constructor(os: MiOS, me) {
|
||||
super(os, 'local-timeline', {
|
||||
super(os, 'local-timeline', me ? {
|
||||
i: me.token
|
||||
});
|
||||
} : {});
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
import { EventEmitter } from 'eventemitter3';
|
||||
import * as uuid from 'uuid';
|
||||
import Connection from './stream';
|
||||
import { erase } from '../../../../../prelude/array';
|
||||
|
||||
/**
|
||||
* ストリーム接続を管理するクラス
|
||||
@ -89,7 +90,7 @@ export default abstract class StreamManager<T extends Connection> extends EventE
|
||||
* @param userId use で発行したユーザーID
|
||||
*/
|
||||
public dispose(userId) {
|
||||
this.users = this.users.filter(id => id != userId);
|
||||
this.users = erase(userId, this.users);
|
||||
|
||||
this._connection.user = `Managed (${ this.users.length })`;
|
||||
|
||||
|
@ -1,19 +1,25 @@
|
||||
<template>
|
||||
<span class="mk-acct">
|
||||
<span class="name">@{{ user.username }}</span>
|
||||
<span class="host" v-if="user.host">@{{ user.host }}</span>
|
||||
<span class="host" :class="{ fade: $store.state.settings.contrastedAcct }" v-if="user.host || detail">@{{ user.host || host }}</span>
|
||||
</span>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import { host } from '../../../config';
|
||||
export default Vue.extend({
|
||||
props: ['user']
|
||||
props: ['user', 'detail'],
|
||||
data() {
|
||||
return {
|
||||
host
|
||||
};
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
.mk-acct
|
||||
> .host
|
||||
> .host.fade
|
||||
opacity 0.5
|
||||
</style>
|
||||
|
@ -1,5 +1,6 @@
|
||||
import Vue from 'vue';
|
||||
|
||||
import tagCloud from './tag-cloud.vue';
|
||||
import trends from './trends.vue';
|
||||
import analogClock from './analog-clock.vue';
|
||||
import menu from './menu.vue';
|
||||
@ -41,6 +42,7 @@ import uiSelect from './ui/select.vue';
|
||||
import formButton from './ui/form/button.vue';
|
||||
import formRadio from './ui/form/radio.vue';
|
||||
|
||||
Vue.component('mk-tag-cloud', tagCloud);
|
||||
Vue.component('mk-trends', trends);
|
||||
Vue.component('mk-analog-clock', analogClock);
|
||||
Vue.component('mk-menu', menu);
|
||||
|
@ -20,6 +20,7 @@
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import { erase } from '../../../../../prelude/array';
|
||||
export default Vue.extend({
|
||||
data() {
|
||||
return {
|
||||
@ -53,7 +54,7 @@ export default Vue.extend({
|
||||
|
||||
get() {
|
||||
return {
|
||||
choices: this.choices.filter(choice => choice != '')
|
||||
choices: erase('', this.choices)
|
||||
}
|
||||
},
|
||||
|
||||
|
@ -21,6 +21,7 @@
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import { sum } from '../../../../../prelude/array';
|
||||
export default Vue.extend({
|
||||
props: ['note'],
|
||||
data() {
|
||||
@ -33,7 +34,7 @@ export default Vue.extend({
|
||||
return this.note.poll;
|
||||
},
|
||||
total(): number {
|
||||
return this.poll.choices.reduce((a, b) => a + b.votes, 0);
|
||||
return sum(this.poll.choices.map(x => x.votes));
|
||||
},
|
||||
isVoted(): boolean {
|
||||
return this.poll.choices.some(c => c.isVoted);
|
||||
|
@ -1,17 +1,17 @@
|
||||
<template>
|
||||
<span class="mk-reaction-icon">
|
||||
<img v-if="reaction == 'like'" src="/assets/reactions/like.png" alt="%i18n:common.reactions.like%">
|
||||
<img v-if="reaction == 'love'" src="/assets/reactions/love.png" alt="%i18n:common.reactions.love%">
|
||||
<img v-if="reaction == 'laugh'" src="/assets/reactions/laugh.png" alt="%i18n:common.reactions.laugh%">
|
||||
<img v-if="reaction == 'hmm'" src="/assets/reactions/hmm.png" alt="%i18n:common.reactions.hmm%">
|
||||
<img v-if="reaction == 'surprise'" src="/assets/reactions/surprise.png" alt="%i18n:common.reactions.surprise%">
|
||||
<img v-if="reaction == 'congrats'" src="/assets/reactions/congrats.png" alt="%i18n:common.reactions.congrats%">
|
||||
<img v-if="reaction == 'angry'" src="/assets/reactions/angry.png" alt="%i18n:common.reactions.angry%">
|
||||
<img v-if="reaction == 'confused'" src="/assets/reactions/confused.png" alt="%i18n:common.reactions.confused%">
|
||||
<img v-if="reaction == 'rip'" src="/assets/reactions/rip.png" alt="%i18n:common.reactions.rip%">
|
||||
<img v-if="reaction == 'like'" src="https://twemoji.maxcdn.com/2/svg/1f44d.svg" alt="%i18n:common.reactions.like%">
|
||||
<img v-if="reaction == 'love'" src="https://twemoji.maxcdn.com/2/svg/2764.svg" alt="%i18n:common.reactions.love%">
|
||||
<img v-if="reaction == 'laugh'" src="https://twemoji.maxcdn.com/2/svg/1f606.svg" alt="%i18n:common.reactions.laugh%">
|
||||
<img v-if="reaction == 'hmm'" src="https://twemoji.maxcdn.com/2/svg/1f914.svg" alt="%i18n:common.reactions.hmm%">
|
||||
<img v-if="reaction == 'surprise'" src="https://twemoji.maxcdn.com/2/svg/1f62e.svg" alt="%i18n:common.reactions.surprise%">
|
||||
<img v-if="reaction == 'congrats'" src="https://twemoji.maxcdn.com/2/svg/1f389.svg" alt="%i18n:common.reactions.congrats%">
|
||||
<img v-if="reaction == 'angry'" src="https://twemoji.maxcdn.com/2/svg/1f4a2.svg" alt="%i18n:common.reactions.angry%">
|
||||
<img v-if="reaction == 'confused'" src="https://twemoji.maxcdn.com/2/svg/1f625.svg" alt="%i18n:common.reactions.confused%">
|
||||
<img v-if="reaction == 'rip'" src="https://twemoji.maxcdn.com/2/svg/1f607.svg" alt="%i18n:common.reactions.rip%">
|
||||
<template v-if="reaction == 'pudding'">
|
||||
<img v-if="$store.getters.isSignedIn && $store.state.settings.iLikeSushi" src="/assets/reactions/sushi.png" alt="%i18n:common.reactions.pudding%">
|
||||
<img v-else src="/assets/reactions/pudding.png" alt="%i18n:common.reactions.pudding%">
|
||||
<img v-if="$store.getters.isSignedIn && $store.state.settings.iLikeSushi" src="https://twemoji.maxcdn.com/2/svg/1f363.svg" alt="%i18n:common.reactions.pudding%">
|
||||
<img v-else src="https://twemoji.maxcdn.com/2/svg/1f36e.svg" alt="%i18n:common.reactions.pudding%">
|
||||
</template>
|
||||
</span>
|
||||
</template>
|
||||
|
90
src/client/app/common/views/components/tag-cloud.vue
Normal file
@ -0,0 +1,90 @@
|
||||
<template>
|
||||
<div class="jtivnzhfwquxpsfidertopbmwmchmnmo">
|
||||
<p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p>
|
||||
<p class="empty" v-else-if="tags.length == 0">%fa:exclamation-circle%%i18n:@empty%</p>
|
||||
<div v-else>
|
||||
<vue-word-cloud
|
||||
:words="tags.slice(0, 20).map(x => [x.name, x.count])"
|
||||
:color="color"
|
||||
:spacing="1">
|
||||
<template slot-scope="{word, text, weight}">
|
||||
<div style="cursor: pointer;" :title="weight">
|
||||
{{ text }}
|
||||
</div>
|
||||
</template>
|
||||
</vue-word-cloud>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import * as VueWordCloud from 'vuewordcloud';
|
||||
|
||||
export default Vue.extend({
|
||||
components: {
|
||||
[VueWordCloud.name]: VueWordCloud
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
tags: [],
|
||||
fetching: true,
|
||||
clock: null
|
||||
};
|
||||
},
|
||||
mounted() {
|
||||
this.fetch();
|
||||
this.clock = setInterval(this.fetch, 1000 * 60);
|
||||
},
|
||||
beforeDestroy() {
|
||||
clearInterval(this.clock);
|
||||
},
|
||||
methods: {
|
||||
fetch() {
|
||||
(this as any).api('aggregation/hashtags').then(tags => {
|
||||
this.tags = tags;
|
||||
this.fetching = false;
|
||||
});
|
||||
},
|
||||
color([, weight]) {
|
||||
const peak = Math.max.apply(null, this.tags.map(x => x.count));
|
||||
const w = weight / peak;
|
||||
|
||||
if (w > 0.9) {
|
||||
return this.$store.state.device.darkmode ? '#ff4e69' : '#ff4e69';
|
||||
} else if (w > 0.5) {
|
||||
return this.$store.state.device.darkmode ? '#3bc4c7' : '#3bc4c7';
|
||||
} else {
|
||||
return this.$store.state.device.darkmode ? '#fff' : '#555';
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
root(isDark)
|
||||
height 100%
|
||||
width 100%
|
||||
|
||||
> .fetching
|
||||
> .empty
|
||||
margin 0
|
||||
padding 16px
|
||||
text-align center
|
||||
color #aaa
|
||||
|
||||
> [data-fa]
|
||||
margin-right 4px
|
||||
|
||||
> div
|
||||
height 100%
|
||||
width 100%
|
||||
|
||||
.jtivnzhfwquxpsfidertopbmwmchmnmo[data-darkmode]
|
||||
root(true)
|
||||
|
||||
.jtivnzhfwquxpsfidertopbmwmchmnmo:not([data-darkmode])
|
||||
root(false)
|
||||
|
||||
</style>
|
@ -24,19 +24,34 @@ export default Vue.extend({
|
||||
|
||||
root(isDark)
|
||||
margin 16px
|
||||
padding 16px
|
||||
color isDark ? #fff : #000
|
||||
background isDark ? #282C37 : #fff
|
||||
box-shadow 0 3px 1px -2px rgba(#000, 0.2), 0 2px 2px 0 rgba(#000, 0.14), 0 1px 5px 0 rgba(#000, 0.12)
|
||||
|
||||
@media (min-width 500px)
|
||||
padding 32px
|
||||
|
||||
> header
|
||||
font-weight normal
|
||||
font-size 24px
|
||||
padding 16px
|
||||
font-weight bold
|
||||
font-size 20px
|
||||
color isDark ? #fff : #444
|
||||
|
||||
@media (min-width 500px)
|
||||
padding 24px 32px
|
||||
|
||||
> section
|
||||
padding 20px 16px
|
||||
border-top solid 1px isDark ? rgba(#000, 0.3) : rgba(#000, 0.1)
|
||||
|
||||
@media (min-width 500px)
|
||||
padding 32px
|
||||
|
||||
&.fit-top
|
||||
padding-top 0
|
||||
|
||||
> header
|
||||
margin-bottom 16px
|
||||
font-weight bold
|
||||
color isDark ? #fff : #444
|
||||
|
||||
.ui-card[data-darkmode]
|
||||
root(true)
|
||||
|
||||
|
@ -55,7 +55,7 @@ export default Vue.extend({
|
||||
|
||||
root(isDark)
|
||||
display inline-block
|
||||
margin 32px 32px 32px 0
|
||||
margin 0 32px 0 0
|
||||
cursor pointer
|
||||
transition all 0.3s
|
||||
|
||||
|
@ -64,6 +64,12 @@ root(isDark)
|
||||
cursor pointer
|
||||
transition all 0.3s
|
||||
|
||||
&:first-child
|
||||
margin-top 0
|
||||
|
||||
&:last-child
|
||||
margin-bottom 0
|
||||
|
||||
> *
|
||||
user-select none
|
||||
|
||||
@ -89,6 +95,7 @@ root(isDark)
|
||||
|
||||
> .button
|
||||
display inline-block
|
||||
flex-shrink 0
|
||||
margin 3px 0 0 0
|
||||
width 34px
|
||||
height 14px
|
||||
|
@ -14,7 +14,7 @@
|
||||
<header>
|
||||
<h1>{{ title }}</h1>
|
||||
</header>
|
||||
<p>{{ description }}</p>
|
||||
<p>{{ description.length > 85 ? description.slice(0, 85) + '…' : description }}</p>
|
||||
<footer>
|
||||
<img class="icon" v-if="icon" :src="icon"/>
|
||||
<p>{{ sitename }}</p>
|
||||
|
@ -47,7 +47,7 @@ export default Vue.extend({
|
||||
props: ['source', 'compact'],
|
||||
data() {
|
||||
return {
|
||||
v: this.$store.state.device.visibility || 'public'
|
||||
v: this.$store.state.settings.rememberNoteVisibility ? (this.$store.state.device.visibility || this.$store.state.settings.defaultNoteVisibility) : this.$store.state.settings.defaultNoteVisibility
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
@ -97,7 +97,9 @@ export default Vue.extend({
|
||||
},
|
||||
methods: {
|
||||
choose(visibility) {
|
||||
this.$store.commit('device/setVisibility', visibility);
|
||||
if (this.$store.state.settings.rememberNoteVisibility) {
|
||||
this.$store.commit('device/setVisibility', visibility);
|
||||
}
|
||||
this.$emit('chosen', visibility);
|
||||
this.$destroy();
|
||||
},
|
||||
|
@ -1,22 +1,24 @@
|
||||
<template>
|
||||
<div class="mk-welcome-timeline">
|
||||
<div v-for="note in notes">
|
||||
<mk-avatar class="avatar" :user="note.user" target="_blank"/>
|
||||
<div class="body">
|
||||
<header>
|
||||
<router-link class="name" :to="note.user | userPage" v-user-preview="note.user.id">{{ note.user | userName }}</router-link>
|
||||
<span class="username">@{{ note.user | acct }}</span>
|
||||
<div class="info">
|
||||
<router-link class="created-at" :to="note | notePage">
|
||||
<mk-time :time="note.createdAt"/>
|
||||
</router-link>
|
||||
<transition-group name="ldzpakcixzickvggyixyrhqwjaefknon" tag="div">
|
||||
<div v-for="note in notes" :key="note.id">
|
||||
<mk-avatar class="avatar" :user="note.user" target="_blank"/>
|
||||
<div class="body">
|
||||
<header>
|
||||
<router-link class="name" :to="note.user | userPage" v-user-preview="note.user.id">{{ note.user | userName }}</router-link>
|
||||
<span class="username">@{{ note.user | acct }}</span>
|
||||
<div class="info">
|
||||
<router-link class="created-at" :to="note | notePage">
|
||||
<mk-time :time="note.createdAt"/>
|
||||
</router-link>
|
||||
</div>
|
||||
</header>
|
||||
<div class="text">
|
||||
<misskey-flavored-markdown v-if="note.text" :text="note.text"/>
|
||||
</div>
|
||||
</header>
|
||||
<div class="text">
|
||||
<misskey-flavored-markdown v-if="note.text" :text="note.text"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</transition-group>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@ -31,15 +33,30 @@ export default Vue.extend({
|
||||
default: undefined
|
||||
}
|
||||
},
|
||||
|
||||
data() {
|
||||
return {
|
||||
fetching: true,
|
||||
notes: []
|
||||
notes: [],
|
||||
connection: null,
|
||||
connectionId: null
|
||||
};
|
||||
},
|
||||
|
||||
mounted() {
|
||||
this.fetch();
|
||||
|
||||
this.connection = (this as any).os.streams.localTimelineStream.getConnection();
|
||||
this.connectionId = (this as any).os.streams.localTimelineStream.use();
|
||||
|
||||
this.connection.on('note', this.onNote);
|
||||
},
|
||||
|
||||
beforeDestroy() {
|
||||
this.connection.off('note', this.onNote);
|
||||
(this as any).os.streams.localTimelineStream.dispose(this.connectionId);
|
||||
},
|
||||
|
||||
methods: {
|
||||
fetch(cb?) {
|
||||
this.fetching = true;
|
||||
@ -48,77 +65,93 @@ export default Vue.extend({
|
||||
local: true,
|
||||
reply: false,
|
||||
renote: false,
|
||||
media: false,
|
||||
poll: false,
|
||||
bot: false
|
||||
file: false,
|
||||
poll: false
|
||||
}).then(notes => {
|
||||
this.notes = notes;
|
||||
this.fetching = false;
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
onNote(note) {
|
||||
if (note.replyId != null) return;
|
||||
if (note.renoteId != null) return;
|
||||
if (note.poll != null) return;
|
||||
|
||||
this.notes.unshift(note);
|
||||
},
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
.ldzpakcixzickvggyixyrhqwjaefknon-enter
|
||||
.ldzpakcixzickvggyixyrhqwjaefknon-leave-to
|
||||
opacity 0
|
||||
transform translateY(-30px)
|
||||
|
||||
root(isDark)
|
||||
background isDark ? #282C37 : #fff
|
||||
|
||||
> div
|
||||
padding 16px
|
||||
overflow-wrap break-word
|
||||
font-size .9em
|
||||
color isDark ? #fff : #4C4C4C
|
||||
border-bottom 1px solid isDark ? rgba(#000, 0.1) : rgba(#000, 0.05)
|
||||
> *
|
||||
transition transform .3s ease, opacity .3s ease
|
||||
|
||||
&:after
|
||||
content ""
|
||||
display block
|
||||
clear both
|
||||
> div
|
||||
padding 16px
|
||||
overflow-wrap break-word
|
||||
font-size .9em
|
||||
color isDark ? #fff : #4C4C4C
|
||||
border-bottom 1px solid isDark ? rgba(#000, 0.1) : rgba(#000, 0.05)
|
||||
|
||||
> .avatar
|
||||
display block
|
||||
float left
|
||||
position -webkit-sticky
|
||||
position sticky
|
||||
top 16px
|
||||
width 42px
|
||||
height 42px
|
||||
border-radius 6px
|
||||
&:after
|
||||
content ""
|
||||
display block
|
||||
clear both
|
||||
|
||||
> .body
|
||||
float right
|
||||
width calc(100% - 42px)
|
||||
padding-left 12px
|
||||
> .avatar
|
||||
display block
|
||||
float left
|
||||
position -webkit-sticky
|
||||
position sticky
|
||||
top 16px
|
||||
width 42px
|
||||
height 42px
|
||||
border-radius 6px
|
||||
|
||||
> header
|
||||
display flex
|
||||
align-items center
|
||||
margin-bottom 4px
|
||||
white-space nowrap
|
||||
> .body
|
||||
float right
|
||||
width calc(100% - 42px)
|
||||
padding-left 12px
|
||||
|
||||
> .name
|
||||
display block
|
||||
margin 0 .5em 0 0
|
||||
padding 0
|
||||
overflow hidden
|
||||
font-weight bold
|
||||
text-overflow ellipsis
|
||||
color isDark ? #fff : #627079
|
||||
> header
|
||||
display flex
|
||||
align-items center
|
||||
margin-bottom 4px
|
||||
white-space nowrap
|
||||
|
||||
> .username
|
||||
margin 0 .5em 0 0
|
||||
color isDark ? #606984 : #ccc
|
||||
> .name
|
||||
display block
|
||||
margin 0 .5em 0 0
|
||||
padding 0
|
||||
overflow hidden
|
||||
font-weight bold
|
||||
text-overflow ellipsis
|
||||
color isDark ? #fff : #627079
|
||||
|
||||
> .info
|
||||
margin-left auto
|
||||
font-size 0.9em
|
||||
> .username
|
||||
margin 0 .5em 0 0
|
||||
color isDark ? #606984 : #ccc
|
||||
|
||||
> .created-at
|
||||
color isDark ? #606984 : #c0c0c0
|
||||
> .info
|
||||
margin-left auto
|
||||
font-size 0.9em
|
||||
|
||||
> .text
|
||||
text-align left
|
||||
> .created-at
|
||||
color isDark ? #606984 : #c0c0c0
|
||||
|
||||
> .text
|
||||
text-align left
|
||||
|
||||
.mk-welcome-timeline[data-darkmode]
|
||||
root(true)
|
||||
|
@ -83,7 +83,7 @@ export default Vue.extend({
|
||||
userId: this.user.id
|
||||
});
|
||||
} else {
|
||||
if (this.user.isLocked && this.user.hasPendingFollowRequestFromYou) {
|
||||
if (this.user.hasPendingFollowRequestFromYou) {
|
||||
this.user = await (this as any).api('following/requests/cancel', {
|
||||
userId: this.user.id
|
||||
});
|
||||
|
@ -1,8 +1,8 @@
|
||||
<template>
|
||||
<div class="mkw-analog-clock">
|
||||
<mk-widget-container :naked="!(props.design % 2)" :show-header="false">
|
||||
<mk-widget-container :naked="props.style % 2 === 0" :show-header="false">
|
||||
<div class="mkw-analog-clock--body">
|
||||
<mk-analog-clock :dark="$store.state.device.darkmode" :smooth="!(props.design && ~props.design)"/>
|
||||
<mk-analog-clock :dark="$store.state.device.darkmode" :smooth="props.style < 2"/>
|
||||
</div>
|
||||
</mk-widget-container>
|
||||
</div>
|
||||
@ -13,13 +13,12 @@ import define from '../../../common/define-widget';
|
||||
export default define({
|
||||
name: 'analog-clock',
|
||||
props: () => ({
|
||||
design: -1
|
||||
style: 0
|
||||
})
|
||||
}).extend({
|
||||
methods: {
|
||||
func() {
|
||||
if (++this.props.design > 2)
|
||||
this.props.design = -1;
|
||||
this.props.style = (this.props.style + 1) % 4;
|
||||
this.save();
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div class="mkw-broadcast"
|
||||
:data-found="broadcasts.length != 0"
|
||||
<div class="anltbovirfeutcigvwgmgxipejaeozxi"
|
||||
:data-found="announcements && announcements.length != 0"
|
||||
:data-melt="props.design == 1"
|
||||
:data-mobile="platform == 'mobile'"
|
||||
>
|
||||
@ -14,18 +14,17 @@
|
||||
</svg>
|
||||
</div>
|
||||
<p class="fetching" v-if="fetching">%i18n:@fetching%<mk-ellipsis/></p>
|
||||
<h1 v-if="!fetching">{{ broadcasts.length == 0 ? '%i18n:@no-broadcasts%' : broadcasts[i].title }}</h1>
|
||||
<h1 v-if="!fetching">{{ announcements.length == 0 ? '%i18n:@no-broadcasts%' : announcements[i].title }}</h1>
|
||||
<p v-if="!fetching">
|
||||
<span v-if="broadcasts.length != 0" v-html="broadcasts[i].text"></span>
|
||||
<template v-if="broadcasts.length == 0">%i18n:@have-a-nice-day%</template>
|
||||
<span v-if="announcements.length != 0" v-html="announcements[i].text"></span>
|
||||
<template v-if="announcements.length == 0">%i18n:@have-a-nice-day%</template>
|
||||
</p>
|
||||
<a v-if="broadcasts.length > 1" @click="next">%i18n:@next% >></a>
|
||||
<a v-if="announcements.length > 1" @click="next">%i18n:@next% >></a>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import define from '../../../common/define-widget';
|
||||
import { lang } from '../../../config';
|
||||
|
||||
export default define({
|
||||
name: 'broadcast',
|
||||
@ -37,18 +36,18 @@ export default define({
|
||||
return {
|
||||
i: 0,
|
||||
fetching: true,
|
||||
broadcasts: []
|
||||
announcements: []
|
||||
};
|
||||
},
|
||||
mounted() {
|
||||
(this as any).os.getMeta().then(meta => {
|
||||
this.broadcasts = meta.broadcasts;
|
||||
this.announcements = meta.broadcasts;
|
||||
this.fetching = false;
|
||||
});
|
||||
},
|
||||
methods: {
|
||||
next() {
|
||||
if (this.i == this.broadcasts.length - 1) {
|
||||
if (this.i == this.announcements.length - 1) {
|
||||
this.i = 0;
|
||||
} else {
|
||||
this.i++;
|
||||
@ -67,7 +66,7 @@ export default define({
|
||||
</script>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
.mkw-broadcast
|
||||
root(isDark)
|
||||
padding 10px
|
||||
border solid 1px #4078c0
|
||||
border-radius 6px
|
||||
@ -127,22 +126,18 @@ export default define({
|
||||
margin 0
|
||||
font-size 0.95em
|
||||
font-weight normal
|
||||
color #4078c0
|
||||
color isDark ? #539eff : #4078c0
|
||||
|
||||
> p
|
||||
display block
|
||||
z-index 1
|
||||
margin 0
|
||||
font-size 0.7em
|
||||
color #555
|
||||
color isDark ? #fff : #555
|
||||
|
||||
&.fetching
|
||||
text-align center
|
||||
|
||||
a
|
||||
color #555
|
||||
text-decoration underline
|
||||
|
||||
> a
|
||||
display block
|
||||
font-size 0.7em
|
||||
@ -151,4 +146,10 @@ export default define({
|
||||
> p
|
||||
color #fff
|
||||
|
||||
.anltbovirfeutcigvwgmgxipejaeozxi[data-darkmode]
|
||||
root(true)
|
||||
|
||||
.anltbovirfeutcigvwgmgxipejaeozxi:not([data-darkmode])
|
||||
root(false)
|
||||
|
||||
</style>
|
||||
|
@ -55,13 +55,15 @@ export default Vue.extend({
|
||||
methods: {
|
||||
onFollow(user) {
|
||||
if (user.id == this.u.id) {
|
||||
this.user.isFollowing = user.isFollowing;
|
||||
this.u.isFollowing = user.isFollowing;
|
||||
this.u.hasPendingFollowRequestFromYou = user.hasPendingFollowRequestFromYou;
|
||||
}
|
||||
},
|
||||
|
||||
onUnfollow(user) {
|
||||
if (user.id == this.u.id) {
|
||||
this.user.isFollowing = user.isFollowing;
|
||||
this.u.isFollowing = user.isFollowing;
|
||||
this.u.hasPendingFollowRequestFromYou = user.hasPendingFollowRequestFromYou;
|
||||
}
|
||||
},
|
||||
|
||||
@ -74,7 +76,7 @@ export default Vue.extend({
|
||||
userId: this.u.id
|
||||
});
|
||||
} else {
|
||||
if (this.u.isLocked && this.u.hasPendingFollowRequestFromYou) {
|
||||
if (this.u.hasPendingFollowRequestFromYou) {
|
||||
this.u = await (this as any).api('following/requests/cancel', {
|
||||
userId: this.u.id
|
||||
});
|
||||
|
@ -42,8 +42,8 @@
|
||||
<span v-if="p.deletedAt" style="opacity: 0.5">%i18n:@deleted%</span>
|
||||
<misskey-flavored-markdown v-if="p.text" :text="p.text" :i="$store.state.i"/>
|
||||
</div>
|
||||
<div class="media" v-if="p.media.length > 0">
|
||||
<mk-media-list :media-list="p.media" :raw="true"/>
|
||||
<div class="files" v-if="p.files.length > 0">
|
||||
<mk-media-list :media-list="p.files" :raw="true"/>
|
||||
</div>
|
||||
<mk-poll v-if="p.poll" :note="p"/>
|
||||
<mk-url-preview v-for="url in urls" :url="url" :key="url" :detail="true"/>
|
||||
@ -86,6 +86,7 @@ import MkRenoteFormWindow from './renote-form-window.vue';
|
||||
import MkNoteMenu from '../../../common/views/components/note-menu.vue';
|
||||
import MkReactionPicker from '../../../common/views/components/reaction-picker.vue';
|
||||
import XSub from './notes.note.sub.vue';
|
||||
import { sum } from '../../../../../prelude/array';
|
||||
|
||||
export default Vue.extend({
|
||||
components: {
|
||||
@ -114,7 +115,7 @@ export default Vue.extend({
|
||||
isRenote(): boolean {
|
||||
return (this.note.renote &&
|
||||
this.note.text == null &&
|
||||
this.note.mediaIds.length == 0 &&
|
||||
this.note.fileIds.length == 0 &&
|
||||
this.note.poll == null);
|
||||
},
|
||||
p(): any {
|
||||
@ -122,9 +123,7 @@ export default Vue.extend({
|
||||
},
|
||||
reactionsCount(): number {
|
||||
return this.p.reactionCounts
|
||||
? Object.keys(this.p.reactionCounts)
|
||||
.map(key => this.p.reactionCounts[key])
|
||||
.reduce((a, b) => a + b)
|
||||
? sum(Object.values(this.p.reactionCounts))
|
||||
: 0;
|
||||
},
|
||||
title(): string {
|
||||
|
@ -28,8 +28,8 @@
|
||||
<misskey-flavored-markdown v-if="p.text" :text="p.text" :i="$store.state.i" :class="$style.text"/>
|
||||
<a class="rp" v-if="p.renote">RP:</a>
|
||||
</div>
|
||||
<div class="media" v-if="p.media.length > 0">
|
||||
<mk-media-list :media-list="p.media"/>
|
||||
<div class="files" v-if="p.files.length > 0">
|
||||
<mk-media-list :media-list="p.files"/>
|
||||
</div>
|
||||
<mk-poll v-if="p.poll" :note="p" ref="pollViewer"/>
|
||||
<a class="location" v-if="p.geo" :href="`https://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% 位置情報</a>
|
||||
@ -78,6 +78,7 @@ import MkRenoteFormWindow from './renote-form-window.vue';
|
||||
import MkNoteMenu from '../../../common/views/components/note-menu.vue';
|
||||
import MkReactionPicker from '../../../common/views/components/reaction-picker.vue';
|
||||
import XSub from './notes.note.sub.vue';
|
||||
import { sum } from '../../../../../prelude/array';
|
||||
|
||||
function focus(el, fn) {
|
||||
const target = fn(el);
|
||||
@ -110,7 +111,7 @@ export default Vue.extend({
|
||||
isRenote(): boolean {
|
||||
return (this.note.renote &&
|
||||
this.note.text == null &&
|
||||
this.note.mediaIds.length == 0 &&
|
||||
this.note.fileIds.length == 0 &&
|
||||
this.note.poll == null);
|
||||
},
|
||||
|
||||
@ -120,9 +121,7 @@ export default Vue.extend({
|
||||
|
||||
reactionsCount(): number {
|
||||
return this.p.reactionCounts
|
||||
? Object.keys(this.p.reactionCounts)
|
||||
.map(key => this.p.reactionCounts[key])
|
||||
.reduce((a, b) => a + b)
|
||||
? sum(Object.values(this.p.reactionCounts))
|
||||
: 0;
|
||||
},
|
||||
|
||||
|
@ -122,7 +122,7 @@ export default Vue.extend({
|
||||
prepend(note, silent = false) {
|
||||
//#region 弾く
|
||||
const isMyNote = note.userId == this.$store.state.i.id;
|
||||
const isPureRenote = note.renoteId != null && note.text == null && note.mediaIds.length == 0 && note.poll == null;
|
||||
const isPureRenote = note.renoteId != null && note.text == null && note.fileIds.length == 0 && note.poll == null;
|
||||
|
||||
if (this.$store.state.settings.showMyRenotes === false) {
|
||||
if (isMyNote && isPureRenote) {
|
||||
|
@ -4,7 +4,7 @@
|
||||
<span class="icon" v-if="geo">%fa:map-marker-alt%</span>
|
||||
<span v-if="!reply">%i18n:@note%</span>
|
||||
<span v-if="reply">%i18n:@reply%</span>
|
||||
<span class="count" v-if="media.length != 0">{{ '%i18n:@attaches%'.replace('{}', media.length) }}</span>
|
||||
<span class="count" v-if="files.length != 0">{{ '%i18n:@attaches%'.replace('{}', files.length) }}</span>
|
||||
<span class="count" v-if="uploadings.length != 0">{{ '%i18n:@uploading-media%'.replace('{}', uploadings.length) }}<mk-ellipsis/></span>
|
||||
</span>
|
||||
|
||||
@ -14,7 +14,7 @@
|
||||
:reply="reply"
|
||||
@posted="onPosted"
|
||||
@change-uploadings="onChangeUploadings"
|
||||
@change-attached-media="onChangeMedia"
|
||||
@change-attached-files="onChangeFiles"
|
||||
@geo-attached="onGeoAttached"
|
||||
@geo-dettached="onGeoDettached"/>
|
||||
</div>
|
||||
@ -29,7 +29,7 @@ export default Vue.extend({
|
||||
data() {
|
||||
return {
|
||||
uploadings: [],
|
||||
media: [],
|
||||
files: [],
|
||||
geo: null
|
||||
};
|
||||
},
|
||||
@ -42,8 +42,8 @@ export default Vue.extend({
|
||||
onChangeUploadings(files) {
|
||||
this.uploadings = files;
|
||||
},
|
||||
onChangeMedia(media) {
|
||||
this.media = media;
|
||||
onChangeFiles(files) {
|
||||
this.files = files;
|
||||
},
|
||||
onGeoAttached(geo) {
|
||||
this.geo = geo;
|
||||
|
@ -20,7 +20,7 @@
|
||||
@keydown="onKeydown" @paste="onPaste" :placeholder="placeholder"
|
||||
v-autocomplete="'text'"
|
||||
></textarea>
|
||||
<div class="medias" :class="{ with: poll }" v-show="files.length != 0">
|
||||
<div class="files" :class="{ with: poll }" v-show="files.length != 0">
|
||||
<x-draggable :list="files" :options="{ animation: 150 }">
|
||||
<div v-for="file in files" :key="file.id">
|
||||
<div class="img" :style="{ backgroundImage: `url(${file.thumbnailUrl})` }" :title="file.name"></div>
|
||||
@ -62,6 +62,8 @@ import getFace from '../../../common/scripts/get-face';
|
||||
import MkVisibilityChooser from '../../../common/views/components/visibility-chooser.vue';
|
||||
import parse from '../../../../../mfm/parse';
|
||||
import { host } from '../../../config';
|
||||
import { erase } from '../../../../../prelude/array';
|
||||
import parseAcct from '../../../../../misc/acct/parse';
|
||||
|
||||
export default Vue.extend({
|
||||
components: {
|
||||
@ -99,7 +101,7 @@ export default Vue.extend({
|
||||
useCw: false,
|
||||
cw: null,
|
||||
geo: null,
|
||||
visibility: this.$store.state.device.visibility || 'public',
|
||||
visibility: this.$store.state.settings.rememberNoteVisibility ? (this.$store.state.device.visibility || this.$store.state.settings.defaultNoteVisibility) : this.$store.state.settings.defaultNoteVisibility,
|
||||
visibleUsers: [],
|
||||
autocomplete: null,
|
||||
draghover: false,
|
||||
@ -188,7 +190,7 @@ export default Vue.extend({
|
||||
(this.$refs.poll as any).set(draft.data.poll);
|
||||
});
|
||||
}
|
||||
this.$emit('change-attached-media', this.files);
|
||||
this.$emit('change-attached-files', this.files);
|
||||
}
|
||||
}
|
||||
|
||||
@ -225,12 +227,12 @@ export default Vue.extend({
|
||||
|
||||
attachMedia(driveFile) {
|
||||
this.files.push(driveFile);
|
||||
this.$emit('change-attached-media', this.files);
|
||||
this.$emit('change-attached-files', this.files);
|
||||
},
|
||||
|
||||
detachMedia(id) {
|
||||
this.files = this.files.filter(x => x.id != id);
|
||||
this.$emit('change-attached-media', this.files);
|
||||
this.$emit('change-attached-files', this.files);
|
||||
},
|
||||
|
||||
onChangeFile() {
|
||||
@ -249,7 +251,7 @@ export default Vue.extend({
|
||||
this.text = '';
|
||||
this.files = [];
|
||||
this.poll = false;
|
||||
this.$emit('change-attached-media', this.files);
|
||||
this.$emit('change-attached-files', this.files);
|
||||
},
|
||||
|
||||
onKeydown(e) {
|
||||
@ -297,7 +299,7 @@ export default Vue.extend({
|
||||
if (driveFile != null && driveFile != '') {
|
||||
const file = JSON.parse(driveFile);
|
||||
this.files.push(file);
|
||||
this.$emit('change-attached-media', this.files);
|
||||
this.$emit('change-attached-files', this.files);
|
||||
e.preventDefault();
|
||||
}
|
||||
//#endregion
|
||||
@ -336,17 +338,16 @@ export default Vue.extend({
|
||||
addVisibleUser() {
|
||||
(this as any).apis.input({
|
||||
title: '%i18n:@enter-username%'
|
||||
}).then(username => {
|
||||
(this as any).api('users/show', {
|
||||
username
|
||||
}).then(user => {
|
||||
}).then(acct => {
|
||||
if (acct.startsWith('@')) acct = acct.substr(1);
|
||||
(this as any).api('users/show', parseAcct(acct)).then(user => {
|
||||
this.visibleUsers.push(user);
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
removeVisibleUser(user) {
|
||||
this.visibleUsers = this.visibleUsers.filter(u => u != user);
|
||||
this.visibleUsers = erase(user, this.visibleUsers);
|
||||
},
|
||||
|
||||
post() {
|
||||
@ -354,7 +355,7 @@ export default Vue.extend({
|
||||
|
||||
(this as any).api('notes/create', {
|
||||
text: this.text == '' ? undefined : this.text,
|
||||
mediaIds: this.files.length > 0 ? this.files.map(f => f.id) : undefined,
|
||||
fileIds: this.files.length > 0 ? this.files.map(f => f.id) : undefined,
|
||||
replyId: this.reply ? this.reply.id : undefined,
|
||||
renoteId: this.renote ? this.renote.id : undefined,
|
||||
poll: this.poll ? (this.$refs.poll as any).get() : undefined,
|
||||
@ -514,7 +515,7 @@ root(isDark)
|
||||
margin-right 8px
|
||||
white-space nowrap
|
||||
|
||||
> .medias
|
||||
> .files
|
||||
margin 0
|
||||
padding 0
|
||||
background isDark ? #181b23 : lighten($theme-color, 98%)
|
||||
|
@ -26,6 +26,22 @@
|
||||
<mk-switch v-model="autoPopout" text="%i18n:@auto-popout%">
|
||||
<span>%i18n:@auto-popout-desc%</span>
|
||||
</mk-switch>
|
||||
|
||||
<section>
|
||||
<header>%i18n:@note-visibility%</header>
|
||||
<mk-switch v-model="$store.state.settings.rememberNoteVisibility" @change="onChangeRememberNoteVisibility" text="%i18n:@remember-note-visibility%"/>
|
||||
<section>
|
||||
<header>%i18n:@default-note-visibility%</header>
|
||||
<ui-select v-model="defaultNoteVisibility">
|
||||
<option value="public">%i18n:common.note-visibility.public%</option>
|
||||
<option value="home">%i18n:common.note-visibility.home%</option>
|
||||
<option value="followers">%i18n:common.note-visibility.followers%</option>
|
||||
<option value="specified">%i18n:common.note-visibility.specified%</option>
|
||||
<option value="private">%i18n:common.note-visibility.private%</option>
|
||||
</ui-select>
|
||||
</section>
|
||||
</section>
|
||||
|
||||
<details>
|
||||
<summary>%i18n:@advanced%</summary>
|
||||
<mk-switch v-model="apiViaStream" text="%i18n:@api-via-stream%">
|
||||
@ -44,6 +60,7 @@
|
||||
<button class="ui" @click="deleteWallpaper">%i18n:@delete-wallpaper%</button>
|
||||
<mk-switch v-model="darkmode" text="%i18n:@dark-mode%"/>
|
||||
<mk-switch v-model="$store.state.settings.circleIcons" @change="onChangeCircleIcons" text="%i18n:@circle-icons%"/>
|
||||
<mk-switch v-model="$store.state.settings.contrastedAcct" @change="onChangeContrastedAcct" text="%i18n:@contrasted-acct%"/>
|
||||
<mk-switch v-model="$store.state.settings.gradientWindowHeader" @change="onChangeGradientWindowHeader" text="%i18n:@gradient-window-header%"/>
|
||||
<mk-switch v-model="$store.state.settings.iLikeSushi" @change="onChangeILikeSushi" text="%i18n:common.i-like-sushi%"/>
|
||||
</div>
|
||||
@ -238,6 +255,11 @@ export default Vue.extend({
|
||||
set(value) { this.$store.commit('device/set', { key: 'apiViaStream', value }); }
|
||||
},
|
||||
|
||||
defaultNoteVisibility: {
|
||||
get() { return this.$store.state.settings.defaultNoteVisibility; },
|
||||
set(value) { this.$store.commit('settings/set', { key: 'defaultNoteVisibility', value }); }
|
||||
},
|
||||
|
||||
autoPopout: {
|
||||
get() { return this.$store.state.device.autoPopout; },
|
||||
set(value) { this.$store.commit('device/set', { key: 'autoPopout', value }); }
|
||||
@ -311,6 +333,12 @@ export default Vue.extend({
|
||||
value: v
|
||||
});
|
||||
},
|
||||
onChangeRememberNoteVisibility(v) {
|
||||
this.$store.dispatch('settings/set', {
|
||||
key: 'rememberNoteVisibility',
|
||||
value: v
|
||||
});
|
||||
},
|
||||
onChangeAutoWatch(v) {
|
||||
(this as any).api('i/update', {
|
||||
autoWatch: v
|
||||
@ -376,6 +404,12 @@ export default Vue.extend({
|
||||
value: v
|
||||
});
|
||||
},
|
||||
onChangeContrastedAcct(v) {
|
||||
this.$store.dispatch('settings/set', {
|
||||
key: 'contrastedAcct',
|
||||
value: v
|
||||
});
|
||||
},
|
||||
onChangeILikeSushi(v) {
|
||||
this.$store.dispatch('settings/set', {
|
||||
key: 'iLikeSushi',
|
||||
|
@ -7,9 +7,9 @@
|
||||
<misskey-flavored-markdown v-if="note.text" :text="note.text" :i="$store.state.i"/>
|
||||
<a class="rp" v-if="note.renoteId" :href="`/notes/${note.renoteId}`">RP: ...</a>
|
||||
</div>
|
||||
<details v-if="note.media.length > 0">
|
||||
<summary>({{ '%i18n:@media-count%'.replace('{}', note.media.length) }})</summary>
|
||||
<mk-media-list :media-list="note.media"/>
|
||||
<details v-if="note.files.length > 0">
|
||||
<summary>({{ '%i18n:@media-count%'.replace('{}', note.files.length) }})</summary>
|
||||
<mk-media-list :media-list="note.files"/>
|
||||
</details>
|
||||
<details v-if="note.poll">
|
||||
<summary>%i18n:@poll%</summary>
|
||||
|
41
src/client/app/desktop/views/pages/admin/admin.hashtags.vue
Normal file
@ -0,0 +1,41 @@
|
||||
<template>
|
||||
<div class="jdnqwkzlnxcfftthoybjxrebyolvoucw mk-admin-card">
|
||||
<header>%i18n:@hided-tags%</header>
|
||||
<textarea v-model="hidedTags"></textarea>
|
||||
<button class="ui" @click="save">%i18n:@save%</button>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from "vue";
|
||||
|
||||
export default Vue.extend({
|
||||
data() {
|
||||
return {
|
||||
hidedTags: '',
|
||||
};
|
||||
},
|
||||
created() {
|
||||
(this as any).os.getMeta().then(meta => {
|
||||
this.hidedTags = meta.hidedTags.join('\n');
|
||||
});
|
||||
},
|
||||
methods: {
|
||||
save() {
|
||||
(this as any).api('admin/update-meta', {
|
||||
hidedTags: this.hidedTags.split('\n')
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
@import '~const.styl'
|
||||
|
||||
.jdnqwkzlnxcfftthoybjxrebyolvoucw
|
||||
textarea
|
||||
width 100%
|
||||
min-height 300px
|
||||
|
||||
</style>
|
@ -5,6 +5,8 @@
|
||||
<li @click="nav('dashboard')" :class="{ active: page == 'dashboard' }">%fa:chalkboard .fw%%i18n:@dashboard%</li>
|
||||
<li @click="nav('users')" :class="{ active: page == 'users' }">%fa:users .fw%%i18n:@users%</li>
|
||||
<li @click="nav('announcements')" :class="{ active: page == 'announcements' }">%fa:broadcast-tower .fw%%i18n:@announcements%</li>
|
||||
<li @click="nav('hashtags')" :class="{ active: page == 'hashtags' }">%fa:hashtag .fw%%i18n:@hashtags%</li>
|
||||
|
||||
<!-- <li @click="nav('drive')" :class="{ active: page == 'drive' }">%fa:cloud .fw%%i18n:@drive%</li> -->
|
||||
<!-- <li @click="nav('update')" :class="{ active: page == 'update' }">%i18n:@update%</li> -->
|
||||
</ul>
|
||||
@ -17,6 +19,9 @@
|
||||
<div v-show="page == 'announcements'">
|
||||
<x-announcements/>
|
||||
</div>
|
||||
<div v-show="page == 'hashtags'">
|
||||
<x-hashtags/>
|
||||
</div>
|
||||
<div v-if="page == 'users'">
|
||||
<x-suspend-user/>
|
||||
<x-unsuspend-user/>
|
||||
@ -33,6 +38,7 @@
|
||||
import Vue from "vue";
|
||||
import XDashboard from "./admin.dashboard.vue";
|
||||
import XAnnouncements from "./admin.announcements.vue";
|
||||
import XHashtags from "./admin.hashtags.vue";
|
||||
import XSuspendUser from "./admin.suspend-user.vue";
|
||||
import XUnsuspendUser from "./admin.unsuspend-user.vue";
|
||||
import XVerifyUser from "./admin.verify-user.vue";
|
||||
@ -43,6 +49,7 @@ export default Vue.extend({
|
||||
components: {
|
||||
XDashboard,
|
||||
XAnnouncements,
|
||||
XHashtags,
|
||||
XSuspendUser,
|
||||
XUnsuspendUser,
|
||||
XVerifyUser,
|
||||
|
@ -28,6 +28,7 @@
|
||||
import Vue from 'vue';
|
||||
import Menu from '../../../../common/views/components/menu.vue';
|
||||
import contextmenu from '../../../api/contextmenu';
|
||||
import { countIf } from '../../../../../../prelude/array';
|
||||
|
||||
export default Vue.extend({
|
||||
props: {
|
||||
@ -117,7 +118,7 @@ export default Vue.extend({
|
||||
toggleActive() {
|
||||
if (!this.isStacked) return;
|
||||
const vms = this.$store.state.settings.deck.layout.find(ids => ids.indexOf(this.column.id) != -1).map(id => this.getColumnVm(id));
|
||||
if (this.active && vms.filter(vm => vm.$el.classList.contains('active')).length == 1) return;
|
||||
if (this.active && countIf(vm => vm.$el.classList.contains('active'), vms) == 1) return;
|
||||
this.active = !this.active;
|
||||
},
|
||||
|
||||
|
@ -68,7 +68,7 @@ export default Vue.extend({
|
||||
(this as any).api('notes/user-list-timeline', {
|
||||
listId: this.list.id,
|
||||
limit: fetchLimit + 1,
|
||||
mediaOnly: this.mediaOnly,
|
||||
withFiles: this.mediaOnly,
|
||||
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
||||
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
|
||||
includeLocalRenotes: this.$store.state.settings.showLocalRenotes
|
||||
@ -90,7 +90,7 @@ export default Vue.extend({
|
||||
listId: this.list.id,
|
||||
limit: fetchLimit + 1,
|
||||
untilId: (this.$refs.timeline as any).tail().id,
|
||||
mediaOnly: this.mediaOnly,
|
||||
withFiles: this.mediaOnly,
|
||||
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
||||
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
|
||||
includeLocalRenotes: this.$store.state.settings.showLocalRenotes
|
||||
@ -109,7 +109,7 @@ export default Vue.extend({
|
||||
return promise;
|
||||
},
|
||||
onNote(note) {
|
||||
if (this.mediaOnly && note.media.length == 0) return;
|
||||
if (this.mediaOnly && note.files.length == 0) return;
|
||||
|
||||
// Prepend a note
|
||||
(this.$refs.timeline as any).prepend(note);
|
||||
|
@ -28,8 +28,8 @@
|
||||
<misskey-flavored-markdown v-if="p.text" :text="p.text" :i="$store.state.i"/>
|
||||
<a class="rp" v-if="p.renote != null">RP:</a>
|
||||
</div>
|
||||
<div class="media" v-if="p.media.length > 0">
|
||||
<mk-media-list :media-list="p.media"/>
|
||||
<div class="files" v-if="p.files.length > 0">
|
||||
<mk-media-list :media-list="p.files"/>
|
||||
</div>
|
||||
<mk-poll v-if="p.poll" :note="p" ref="pollViewer"/>
|
||||
<a class="location" v-if="p.geo" :href="`https://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% %i18n:@location%</a>
|
||||
@ -54,11 +54,11 @@
|
||||
</article>
|
||||
</div>
|
||||
<div v-else class="srwrkujossgfuhrbnvqkybtzxpblgchi">
|
||||
<div v-if="note.media.length > 0">
|
||||
<mk-media-list :media-list="note.media"/>
|
||||
<div v-if="note.files.length > 0">
|
||||
<mk-media-list :media-list="note.files"/>
|
||||
</div>
|
||||
<div v-if="note.renote && note.renote.media.length > 0">
|
||||
<mk-media-list :media-list="note.renote.media"/>
|
||||
<div v-if="note.renote && note.renote.files.length > 0">
|
||||
<mk-media-list :media-list="note.renote.files"/>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
@ -100,7 +100,7 @@ export default Vue.extend({
|
||||
isRenote(): boolean {
|
||||
return (this.note.renote &&
|
||||
this.note.text == null &&
|
||||
this.note.mediaIds.length == 0 &&
|
||||
this.note.fileIds.length == 0 &&
|
||||
this.note.poll == null);
|
||||
},
|
||||
|
||||
@ -371,7 +371,7 @@ root(isDark)
|
||||
.mk-url-preview
|
||||
margin-top 8px
|
||||
|
||||
> .media
|
||||
> .files
|
||||
> img
|
||||
display block
|
||||
max-width 100%
|
||||
|
@ -127,7 +127,7 @@ export default Vue.extend({
|
||||
prepend(note, silent = false) {
|
||||
//#region 弾く
|
||||
const isMyNote = note.userId == this.$store.state.i.id;
|
||||
const isPureRenote = note.renoteId != null && note.text == null && note.mediaIds.length == 0 && note.poll == null;
|
||||
const isPureRenote = note.renoteId != null && note.text == null && note.fileIds.length == 0 && note.poll == null;
|
||||
|
||||
if (this.$store.state.settings.showMyRenotes === false) {
|
||||
if (isMyNote && isPureRenote) {
|
||||
|
@ -96,7 +96,7 @@ export default Vue.extend({
|
||||
(this.$refs.timeline as any).init(() => new Promise((res, rej) => {
|
||||
(this as any).api(this.endpoint, {
|
||||
limit: fetchLimit + 1,
|
||||
mediaOnly: this.mediaOnly,
|
||||
withFiles: this.mediaOnly,
|
||||
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
||||
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
|
||||
includeLocalRenotes: this.$store.state.settings.showLocalRenotes
|
||||
@ -117,7 +117,7 @@ export default Vue.extend({
|
||||
|
||||
const promise = (this as any).api(this.endpoint, {
|
||||
limit: fetchLimit + 1,
|
||||
mediaOnly: this.mediaOnly,
|
||||
withFiles: this.mediaOnly,
|
||||
untilId: (this.$refs.timeline as any).tail().id,
|
||||
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
||||
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
|
||||
@ -138,7 +138,7 @@ export default Vue.extend({
|
||||
},
|
||||
|
||||
onNote(note) {
|
||||
if (this.mediaOnly && note.media.length == 0) return;
|
||||
if (this.mediaOnly && note.files.length == 0) return;
|
||||
|
||||
// Prepend a note
|
||||
(this.$refs.timeline as any).prepend(note);
|
||||
|
@ -85,6 +85,7 @@ export default Vue.extend({
|
||||
},
|
||||
|
||||
mounted() {
|
||||
document.title = (this as any).os.instanceName;
|
||||
document.documentElement.style.overflow = 'hidden';
|
||||
},
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
<div class="title">
|
||||
<p class="name">{{ user | userName }}</p>
|
||||
<div>
|
||||
<span class="username"><mk-acct :user="user"/></span>
|
||||
<span class="username"><mk-acct :user="user" :detail="true" /></span>
|
||||
<span v-if="user.isBot" title="%i18n:@is-bot%">%fa:robot%</span>
|
||||
<span class="location" v-if="user.host === null && user.profile.location">%fa:map-marker% {{ user.profile.location }}</span>
|
||||
<span class="birthday" v-if="user.host === null && user.profile.birthday">%fa:birthday-cake% {{ user.profile.birthday.replace('-', '年').replace('-', '月') + '日' }} ({{ age }}歳)</span>
|
||||
|
@ -24,12 +24,12 @@ export default Vue.extend({
|
||||
mounted() {
|
||||
(this as any).api('users/notes', {
|
||||
userId: this.user.id,
|
||||
withMedia: true,
|
||||
withFiles: true,
|
||||
limit: 9
|
||||
}).then(notes => {
|
||||
notes.forEach(note => {
|
||||
note.media.forEach(media => {
|
||||
if (this.images.length < 9) this.images.push(media);
|
||||
note.files.forEach(file => {
|
||||
if (this.images.length < 9) this.images.push(file);
|
||||
});
|
||||
});
|
||||
this.fetching = false;
|
||||
|
@ -66,7 +66,7 @@ export default Vue.extend({
|
||||
limit: fetchLimit + 1,
|
||||
untilDate: this.date ? this.date.getTime() : undefined,
|
||||
includeReplies: this.mode == 'with-replies',
|
||||
withMedia: this.mode == 'with-media'
|
||||
withFiles: this.mode == 'with-media'
|
||||
}).then(notes => {
|
||||
if (notes.length == fetchLimit + 1) {
|
||||
notes.pop();
|
||||
@ -86,7 +86,7 @@ export default Vue.extend({
|
||||
userId: this.user.id,
|
||||
limit: fetchLimit + 1,
|
||||
includeReplies: this.mode == 'with-replies',
|
||||
withMedia: this.mode == 'with-media',
|
||||
withFiles: this.mode == 'with-media',
|
||||
untilId: (this.$refs.timeline as any).tail().id
|
||||
});
|
||||
|
||||
|
@ -7,45 +7,130 @@
|
||||
|
||||
<mk-forkit class="forkit"/>
|
||||
|
||||
<div class="body">
|
||||
<div class="main block">
|
||||
<h1 v-if="name != 'Misskey'">{{ name }}</h1>
|
||||
<h1 v-else><img :src="$store.state.device.darkmode ? 'assets/title.dark.svg' : 'assets/title.light.svg'" :alt="name"></h1>
|
||||
<main>
|
||||
<div class="body">
|
||||
<div class="main block">
|
||||
<div>
|
||||
<h1 v-if="name != 'Misskey'">{{ name }}</h1>
|
||||
<h1 v-else><img :src="$store.state.device.darkmode ? 'assets/title.dark.svg' : 'assets/title.light.svg'" :alt="name"></h1>
|
||||
|
||||
<div class="info">
|
||||
<span><b>{{ host }}</b> - <span v-html="'%i18n:@powered-by-misskey%'"></span></span>
|
||||
<span class="stats" v-if="stats">
|
||||
<span>%fa:user% {{ stats.originalUsersCount | number }}</span>
|
||||
<span>%fa:pencil-alt% {{ stats.originalNotesCount | number }}</span>
|
||||
</span>
|
||||
<div class="info">
|
||||
<span><b>{{ host }}</b> - <span v-html="'%i18n:@powered-by-misskey%'"></span></span>
|
||||
<span class="stats" v-if="stats">
|
||||
<span>%fa:user% {{ stats.originalUsersCount | number }}</span>
|
||||
<span>%fa:pencil-alt% {{ stats.originalNotesCount | number }}</span>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div class="desc">
|
||||
<span class="desc" v-html="description || '%i18n:common.about%'"></span>
|
||||
<a class="about" @click="about">%i18n:@about%</a>
|
||||
</div>
|
||||
|
||||
<p class="sign">
|
||||
<span class="signup" @click="signup">%i18n:@signup%</span>
|
||||
<span class="divider">|</span>
|
||||
<span class="signin" @click="signin">%i18n:@signin%</span>
|
||||
</p>
|
||||
|
||||
<img src="/assets/ai.png" alt="" title="藍" class="char">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<p class="desc" v-html="description || '%i18n:common.about%'"></p>
|
||||
<div class="announcements block">
|
||||
<header>%fa:broadcast-tower% %i18n:@announcements%</header>
|
||||
<div v-if="announcements && announcements.length > 0">
|
||||
<div v-for="announcement in announcements">
|
||||
<h1 v-html="announcement.title"></h1>
|
||||
<div v-html="announcement.text"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<p class="sign">
|
||||
<span class="signup" @click="signup">%i18n:@signup%</span>
|
||||
<span class="divider">|</span>
|
||||
<span class="signin" @click="signin">%i18n:@signin%</span>
|
||||
</p>
|
||||
</div>
|
||||
<div class="photos block">
|
||||
<header>%fa:images% %i18n:@photos%</header>
|
||||
<div>
|
||||
<div v-for="photo in photos" :style="`background-image: url(${photo.thumbnailUrl})`"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="broadcasts block">
|
||||
<div v-for="broadcast in broadcasts">
|
||||
<h1 v-html="broadcast.title"></h1>
|
||||
<div v-html="broadcast.text"></div>
|
||||
<div class="tag-cloud block">
|
||||
<div>
|
||||
<mk-tag-cloud/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="nav block">
|
||||
<div>
|
||||
<mk-nav class="nav"/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="side">
|
||||
<div class="trends block">
|
||||
<div>
|
||||
<mk-trends/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="tl block">
|
||||
<header>%fa:comment-alt R% %i18n:@timeline%</header>
|
||||
<div>
|
||||
<mk-welcome-timeline class="tl" :max="20"/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="info block">
|
||||
<header>%fa:info-circle% %i18n:@info%</header>
|
||||
<div>
|
||||
<div v-if="meta" class="body">
|
||||
<p>Version: <b>{{ meta.version }}</b></p>
|
||||
<p>Maintainer: <b><a :href="meta.maintainer.url" target="_blank">{{ meta.maintainer.name }}</a></b></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<div class="nav block">
|
||||
<mk-nav class="nav"/>
|
||||
</div>
|
||||
|
||||
<div class="side">
|
||||
<mk-trends class="trends block"/>
|
||||
|
||||
<mk-welcome-timeline class="tl block" :max="20"/>
|
||||
</div>
|
||||
</div>
|
||||
<modal name="about" :class="$store.state.device.darkmode ? ['about', 'modal-dark'] : ['about', 'modal-light']" width="800px" height="auto" scrollable>
|
||||
<article class="fpdezooorhntlzyeszemrsqdlgbysvxq">
|
||||
<h1>%i18n:common.intro.title%</h1>
|
||||
<p v-html="'%i18n:common.intro.about%'"></p>
|
||||
<section>
|
||||
<h2>%i18n:common.intro.features%</h2>
|
||||
<section>
|
||||
<div class="body">
|
||||
<h3>%i18n:common.intro.rich-contents%</h3>
|
||||
<p v-html="'%i18n:common.intro.rich-contents-desc%'"></p>
|
||||
</div>
|
||||
<div class="image"><img src="/assets/about/post.png" alt=""></div>
|
||||
</section>
|
||||
<section>
|
||||
<div class="body">
|
||||
<h3>%i18n:common.intro.reaction%</h3>
|
||||
<p v-html="'%i18n:common.intro.reaction-desc%'"></p>
|
||||
</div>
|
||||
<div class="image"><img src="/assets/about/reaction.png" alt=""></div>
|
||||
</section>
|
||||
<section>
|
||||
<div class="body">
|
||||
<h3>%i18n:common.intro.ui%</h3>
|
||||
<p v-html="'%i18n:common.intro.ui-desc%'"></p>
|
||||
</div>
|
||||
<div class="image"><img src="/assets/about/ui.png" alt=""></div>
|
||||
</section>
|
||||
<section>
|
||||
<div class="body">
|
||||
<h3>%i18n:common.intro.drive%</h3>
|
||||
<p v-html="'%i18n:common.intro.drive-desc%'"></p>
|
||||
</div>
|
||||
<div class="image"><img src="/assets/about/drive.png" alt=""></div>
|
||||
</section>
|
||||
</section>
|
||||
<p v-html="'%i18n:common.intro.outro%'"></p>
|
||||
</article>
|
||||
</modal>
|
||||
|
||||
<modal name="signup" :class="$store.state.device.darkmode ? 'modal-dark' : 'modal-light'" width="450px" height="auto" scrollable>
|
||||
<header class="formHeader">%i18n:@signup%</header>
|
||||
@ -62,37 +147,62 @@
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import { host, copyright } from '../../../config';
|
||||
import { concat } from '../../../../../prelude/array';
|
||||
|
||||
export default Vue.extend({
|
||||
data() {
|
||||
return {
|
||||
meta: null,
|
||||
stats: null,
|
||||
copyright,
|
||||
host,
|
||||
name: 'Misskey',
|
||||
description: '',
|
||||
broadcasts: []
|
||||
announcements: [],
|
||||
photos: []
|
||||
};
|
||||
},
|
||||
|
||||
created() {
|
||||
(this as any).os.getMeta().then(meta => {
|
||||
this.meta = meta;
|
||||
this.name = meta.name;
|
||||
this.description = meta.description;
|
||||
this.broadcasts = meta.broadcasts;
|
||||
this.announcements = meta.broadcasts;
|
||||
});
|
||||
|
||||
(this as any).api('stats').then(stats => {
|
||||
this.stats = stats;
|
||||
});
|
||||
|
||||
const image = [
|
||||
'image/jpeg',
|
||||
'image/png',
|
||||
'image/gif'
|
||||
];
|
||||
|
||||
(this as any).api('notes/local-timeline', {
|
||||
fileType: image,
|
||||
limit: 6
|
||||
}).then((notes: any[]) => {
|
||||
const files = concat(notes.map((n: any): any[] => n.files));
|
||||
this.photos = files.filter(f => image.includes(f.type)).slice(0, 6);
|
||||
});
|
||||
},
|
||||
|
||||
methods: {
|
||||
about() {
|
||||
this.$modal.show('about');
|
||||
},
|
||||
|
||||
signup() {
|
||||
this.$modal.show('signup');
|
||||
},
|
||||
|
||||
signin() {
|
||||
this.$modal.show('signin');
|
||||
},
|
||||
|
||||
dark() {
|
||||
this.$store.commit('device/set', {
|
||||
key: 'darkmode',
|
||||
@ -137,6 +247,54 @@ export default Vue.extend({
|
||||
margin 0 48px
|
||||
font-size 1.5em
|
||||
|
||||
.v--modal-overlay.about
|
||||
.v--modal-box.v--modal
|
||||
margin 32px 0
|
||||
|
||||
.fpdezooorhntlzyeszemrsqdlgbysvxq
|
||||
padding 64px
|
||||
|
||||
> p:last-child
|
||||
margin-bottom 0
|
||||
|
||||
> h1
|
||||
margin-top 0
|
||||
|
||||
> section
|
||||
> h2
|
||||
border-bottom 1px solid isDark ? rgba(#000, 0.2) : rgba(#000, 0.05)
|
||||
|
||||
> section
|
||||
display grid
|
||||
grid-template-rows 1fr
|
||||
grid-template-columns 180px 1fr
|
||||
gap 32px
|
||||
margin-bottom 32px
|
||||
padding-bottom 32px
|
||||
border-bottom 1px solid isDark ? rgba(#000, 0.2) : rgba(#000, 0.05)
|
||||
|
||||
&:nth-child(odd)
|
||||
grid-template-columns 1fr 180px
|
||||
|
||||
> .body
|
||||
grid-column 1
|
||||
|
||||
> .image
|
||||
grid-column 2
|
||||
|
||||
> .body
|
||||
grid-row 1
|
||||
grid-column 2
|
||||
|
||||
> .image
|
||||
grid-row 1
|
||||
grid-column 1
|
||||
|
||||
> img
|
||||
display block
|
||||
width 100%
|
||||
height 100%
|
||||
object-fit cover
|
||||
</style>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
@ -164,115 +322,176 @@ root(isDark)
|
||||
font-size 18px
|
||||
color isDark ? #fff : #444
|
||||
|
||||
> .body
|
||||
display grid
|
||||
grid-template-rows 0.5fr 0.5fr 64px
|
||||
grid-template-columns 1fr 350px
|
||||
gap 16px
|
||||
width 100%
|
||||
max-width 1200px
|
||||
height 100vh
|
||||
> main
|
||||
margin 0 auto
|
||||
padding 64px
|
||||
width 100%
|
||||
max-width 1200px
|
||||
|
||||
.block
|
||||
color isDark ? #fff : #444
|
||||
background isDark ? #313543 : #fff
|
||||
background isDark ? #282C37 : #fff
|
||||
box-shadow 0 3px 8px rgba(0, 0, 0, 0.2)
|
||||
//border-radius 8px
|
||||
overflow auto
|
||||
|
||||
> .main
|
||||
grid-row 1
|
||||
grid-column 1
|
||||
padding 32px
|
||||
border-top solid 5px $theme-color
|
||||
> header
|
||||
z-index 1
|
||||
padding 0 16px
|
||||
line-height 48px
|
||||
background isDark ? #313543 : #fff
|
||||
|
||||
> h1
|
||||
margin 0
|
||||
if !isDark
|
||||
box-shadow 0 1px 0px rgba(0, 0, 0, 0.1)
|
||||
|
||||
> img
|
||||
margin -8px 0 0 -16px
|
||||
max-width 280px
|
||||
|
||||
> .info
|
||||
margin 0 auto 16px auto
|
||||
width $width
|
||||
font-size 14px
|
||||
|
||||
> .stats
|
||||
margin-left 16px
|
||||
padding-left 16px
|
||||
border-left solid 1px isDark ? #fff : #444
|
||||
|
||||
> *
|
||||
margin-right 16px
|
||||
|
||||
> .sign
|
||||
font-size 120%
|
||||
|
||||
> .divider
|
||||
margin 0 16px
|
||||
|
||||
> .signin
|
||||
> .signup
|
||||
cursor pointer
|
||||
|
||||
&:hover
|
||||
color $theme-color
|
||||
|
||||
> .hashtags
|
||||
margin 16px auto
|
||||
width $width
|
||||
font-size 14px
|
||||
background rgba(#000, 0.3)
|
||||
border-radius 8px
|
||||
|
||||
> *
|
||||
display inline-block
|
||||
margin 14px
|
||||
|
||||
> .broadcasts
|
||||
grid-row 2
|
||||
grid-column 1
|
||||
padding 32px
|
||||
& + div
|
||||
max-height calc(100% - 48px)
|
||||
|
||||
> div
|
||||
padding 0 0 16px 0
|
||||
margin 0 0 16px 0
|
||||
border-bottom 1px solid isDark ? rgba(#000, 0.2) : rgba(#000, 0.05)
|
||||
|
||||
> h1
|
||||
margin 0
|
||||
font-size 1.5em
|
||||
|
||||
> .nav
|
||||
display flex
|
||||
justify-content center
|
||||
align-items center
|
||||
grid-row 3
|
||||
grid-column 1
|
||||
font-size 14px
|
||||
|
||||
> .side
|
||||
display grid
|
||||
grid-row 1 / 4
|
||||
grid-column 2
|
||||
grid-template-rows 1fr 350px
|
||||
grid-template-columns 1fr
|
||||
gap 16px
|
||||
|
||||
> .tl
|
||||
grid-row 1
|
||||
grid-column 1
|
||||
text-align left
|
||||
max-height 100%
|
||||
overflow auto
|
||||
|
||||
> .trends
|
||||
> .body
|
||||
display grid
|
||||
grid-template-rows 390px 1fr 256px 64px
|
||||
grid-template-columns 1fr 1fr 350px
|
||||
gap 16px
|
||||
height 1150px
|
||||
|
||||
> .main
|
||||
grid-row 1
|
||||
grid-column 1 / 3
|
||||
border-top solid 5px $theme-color
|
||||
|
||||
> div
|
||||
padding 32px
|
||||
min-height 100%
|
||||
|
||||
> h1
|
||||
margin 0
|
||||
|
||||
> img
|
||||
margin -8px 0 0 -16px
|
||||
max-width 280px
|
||||
|
||||
> .info
|
||||
margin 0 auto 16px auto
|
||||
width $width
|
||||
font-size 14px
|
||||
|
||||
> .stats
|
||||
margin-left 16px
|
||||
padding-left 16px
|
||||
border-left solid 1px isDark ? #fff : #444
|
||||
|
||||
> *
|
||||
margin-right 16px
|
||||
|
||||
> .desc
|
||||
max-width calc(100% - 150px)
|
||||
|
||||
> .sign
|
||||
font-size 120%
|
||||
margin-bottom 0
|
||||
|
||||
> .divider
|
||||
margin 0 16px
|
||||
|
||||
> .signin
|
||||
> .signup
|
||||
cursor pointer
|
||||
|
||||
&:hover
|
||||
color $theme-color
|
||||
|
||||
> .char
|
||||
display block
|
||||
position absolute
|
||||
right 16px
|
||||
bottom 0
|
||||
height 320px
|
||||
opacity 0.7
|
||||
|
||||
> *:not(.char)
|
||||
z-index 1
|
||||
|
||||
> .announcements
|
||||
grid-row 2
|
||||
grid-column 1
|
||||
padding 8px
|
||||
|
||||
> div
|
||||
padding 32px
|
||||
|
||||
> div
|
||||
padding 0 0 16px 0
|
||||
margin 0 0 16px 0
|
||||
border-bottom 1px solid isDark ? rgba(#000, 0.2) : rgba(#000, 0.05)
|
||||
|
||||
> h1
|
||||
margin 0
|
||||
font-size 1.25em
|
||||
|
||||
> .photos
|
||||
grid-row 2
|
||||
grid-column 2
|
||||
|
||||
> div
|
||||
display grid
|
||||
grid-template-rows 1fr 1fr 1fr
|
||||
grid-template-columns 1fr 1fr
|
||||
gap 8px
|
||||
height 100%
|
||||
padding 16px
|
||||
|
||||
> div
|
||||
//border-radius 4px
|
||||
background-position center center
|
||||
background-size cover
|
||||
|
||||
> .tag-cloud
|
||||
grid-row 3
|
||||
grid-column 1 / 3
|
||||
|
||||
> div
|
||||
height 256px
|
||||
padding 32px
|
||||
|
||||
> .nav
|
||||
display flex
|
||||
justify-content center
|
||||
align-items center
|
||||
grid-row 4
|
||||
grid-column 1 / 3
|
||||
font-size 14px
|
||||
|
||||
> .side
|
||||
display grid
|
||||
grid-row 1 / 5
|
||||
grid-column 3
|
||||
grid-template-rows 1fr 350px
|
||||
grid-template-columns 1fr
|
||||
gap 16px
|
||||
|
||||
> .tl
|
||||
grid-row 1
|
||||
grid-column 1
|
||||
overflow auto
|
||||
|
||||
> .trends
|
||||
grid-row 2
|
||||
grid-column 1
|
||||
padding 8px
|
||||
|
||||
> .info
|
||||
grid-row 3
|
||||
grid-column 1
|
||||
|
||||
> div
|
||||
padding 16px
|
||||
|
||||
> .body
|
||||
> p
|
||||
display block
|
||||
margin 0
|
||||
|
||||
.mk-welcome[data-darkmode]
|
||||
root(true)
|
||||
|
@ -49,7 +49,7 @@ export default define({
|
||||
offset: this.offset,
|
||||
renote: false,
|
||||
reply: false,
|
||||
media: false,
|
||||
file: false,
|
||||
poll: false
|
||||
}).then(notes => {
|
||||
const note = notes ? notes[0] : null;
|
||||
|
@ -3,7 +3,7 @@ import { EventEmitter } from 'eventemitter3';
|
||||
import * as uuid from 'uuid';
|
||||
|
||||
import initStore from './store';
|
||||
import { apiUrl, swPublickey, version, lang, googleMapsApiKey } from './config';
|
||||
import { apiUrl, version, lang } from './config';
|
||||
import Progress from './common/scripts/loading';
|
||||
import Connection from './common/scripts/streaming/stream';
|
||||
import { HomeStreamManager } from './common/scripts/streaming/home';
|
||||
@ -17,6 +17,7 @@ import Err from './common/views/components/connect-failed.vue';
|
||||
import { LocalTimelineStreamManager } from './common/scripts/streaming/local-timeline';
|
||||
import { HybridTimelineStreamManager } from './common/scripts/streaming/hybrid-timeline';
|
||||
import { GlobalTimelineStreamManager } from './common/scripts/streaming/global-timeline';
|
||||
import { erase } from '../../prelude/array';
|
||||
|
||||
//#region api requests
|
||||
let spinner = null;
|
||||
@ -230,13 +231,13 @@ export default class MiOS extends EventEmitter {
|
||||
//#region Init stream managers
|
||||
this.streams.serverStatsStream = new ServerStatsStreamManager(this);
|
||||
this.streams.notesStatsStream = new NotesStatsStreamManager(this);
|
||||
this.streams.localTimelineStream = new LocalTimelineStreamManager(this, this.store.state.i);
|
||||
|
||||
this.once('signedin', () => {
|
||||
// Init home stream manager
|
||||
this.stream = new HomeStreamManager(this, this.store.state.i);
|
||||
|
||||
// Init other stream manager
|
||||
this.streams.localTimelineStream = new LocalTimelineStreamManager(this, this.store.state.i);
|
||||
this.streams.hybridTimelineStream = new HybridTimelineStreamManager(this, this.store.state.i);
|
||||
this.streams.globalTimelineStream = new GlobalTimelineStreamManager(this, this.store.state.i);
|
||||
this.streams.driveStream = new DriveStreamManager(this, this.store.state.i);
|
||||
@ -361,7 +362,7 @@ export default class MiOS extends EventEmitter {
|
||||
|
||||
// A public key your push server will use to send
|
||||
// messages to client apps via a push server.
|
||||
applicationServerKey: urlBase64ToUint8Array(swPublickey)
|
||||
applicationServerKey: urlBase64ToUint8Array(this.meta.data.swPublickey)
|
||||
};
|
||||
|
||||
// Subscribe push notification
|
||||
@ -537,7 +538,7 @@ export default class MiOS extends EventEmitter {
|
||||
}
|
||||
|
||||
public unregisterStreamConnection(connection: Connection) {
|
||||
this.connections = this.connections.filter(c => c != connection);
|
||||
this.connections = erase(connection, this.connections);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -67,7 +67,7 @@
|
||||
import Vue from 'vue';
|
||||
import * as EXIF from 'exif-js';
|
||||
import * as hljs from 'highlight.js';
|
||||
import gcd from '../../../common/scripts/gcd';
|
||||
import { gcd } from '../../../../../prelude/math';
|
||||
|
||||
export default Vue.extend({
|
||||
props: ['file'],
|
||||
|
@ -48,12 +48,14 @@ export default Vue.extend({
|
||||
onFollow(user) {
|
||||
if (user.id == this.u.id) {
|
||||
this.u.isFollowing = user.isFollowing;
|
||||
this.u.hasPendingFollowRequestFromYou = user.hasPendingFollowRequestFromYou;
|
||||
}
|
||||
},
|
||||
|
||||
onUnfollow(user) {
|
||||
if (user.id == this.u.id) {
|
||||
this.u.isFollowing = user.isFollowing;
|
||||
this.u.hasPendingFollowRequestFromYou = user.hasPendingFollowRequestFromYou;
|
||||
}
|
||||
},
|
||||
|
||||
@ -66,7 +68,7 @@ export default Vue.extend({
|
||||
userId: this.u.id
|
||||
});
|
||||
} else {
|
||||
if (this.u.isLocked && this.u.hasPendingFollowRequestFromYou) {
|
||||
if (this.u.hasPendingFollowRequestFromYou) {
|
||||
this.u = await (this as any).api('following/requests/cancel', {
|
||||
userId: this.u.id
|
||||
});
|
||||
|
@ -40,8 +40,8 @@
|
||||
<span v-if="p.deletedAt" style="opacity: 0.5">(%i18n:@deleted%)</span>
|
||||
<misskey-flavored-markdown v-if="p.text" :text="p.text" :i="$store.state.i"/>
|
||||
</div>
|
||||
<div class="media" v-if="p.media.length > 0">
|
||||
<mk-media-list :media-list="p.media" :raw="true"/>
|
||||
<div class="files" v-if="p.files.length > 0">
|
||||
<mk-media-list :media-list="p.files" :raw="true"/>
|
||||
</div>
|
||||
<mk-poll v-if="p.poll" :note="p"/>
|
||||
<mk-url-preview v-for="url in urls" :url="url" :key="url" :detail="true"/>
|
||||
@ -85,6 +85,7 @@ import parse from '../../../../../mfm/parse';
|
||||
import MkNoteMenu from '../../../common/views/components/note-menu.vue';
|
||||
import MkReactionPicker from '../../../common/views/components/reaction-picker.vue';
|
||||
import XSub from './note.sub.vue';
|
||||
import { sum } from '../../../../../prelude/array';
|
||||
|
||||
export default Vue.extend({
|
||||
components: {
|
||||
@ -113,7 +114,7 @@ export default Vue.extend({
|
||||
isRenote(): boolean {
|
||||
return (this.note.renote &&
|
||||
this.note.text == null &&
|
||||
this.note.mediaIds.length == 0 &&
|
||||
this.note.fileIds.length == 0 &&
|
||||
this.note.poll == null);
|
||||
},
|
||||
|
||||
@ -123,9 +124,7 @@ export default Vue.extend({
|
||||
|
||||
reactionsCount(): number {
|
||||
return this.p.reactionCounts
|
||||
? Object.keys(this.p.reactionCounts)
|
||||
.map(key => this.p.reactionCounts[key])
|
||||
.reduce((a, b) => a + b)
|
||||
? sum(Object.values(this.p.reactionCounts))
|
||||
: 0;
|
||||
},
|
||||
|
||||
@ -369,7 +368,7 @@ root(isDark)
|
||||
> .mk-url-preview
|
||||
margin-top 8px
|
||||
|
||||
> .media
|
||||
> .files
|
||||
> img
|
||||
display block
|
||||
max-width 100%
|
||||
|
@ -28,8 +28,8 @@
|
||||
<misskey-flavored-markdown v-if="p.text" :text="p.text" :i="$store.state.i" :class="$style.text"/>
|
||||
<a class="rp" v-if="p.renote != null">RP:</a>
|
||||
</div>
|
||||
<div class="media" v-if="p.media.length > 0">
|
||||
<mk-media-list :media-list="p.media"/>
|
||||
<div class="files" v-if="p.files.length > 0">
|
||||
<mk-media-list :media-list="p.files"/>
|
||||
</div>
|
||||
<mk-poll v-if="p.poll" :note="p" ref="pollViewer"/>
|
||||
<mk-url-preview v-for="url in urls" :url="url" :key="url"/>
|
||||
@ -70,6 +70,7 @@ import parse from '../../../../../mfm/parse';
|
||||
import MkNoteMenu from '../../../common/views/components/note-menu.vue';
|
||||
import MkReactionPicker from '../../../common/views/components/reaction-picker.vue';
|
||||
import XSub from './note.sub.vue';
|
||||
import { sum } from '../../../../../prelude/array';
|
||||
|
||||
export default Vue.extend({
|
||||
components: {
|
||||
@ -90,7 +91,7 @@ export default Vue.extend({
|
||||
isRenote(): boolean {
|
||||
return (this.note.renote &&
|
||||
this.note.text == null &&
|
||||
this.note.mediaIds.length == 0 &&
|
||||
this.note.fileIds.length == 0 &&
|
||||
this.note.poll == null);
|
||||
},
|
||||
|
||||
@ -100,9 +101,7 @@ export default Vue.extend({
|
||||
|
||||
reactionsCount(): number {
|
||||
return this.p.reactionCounts
|
||||
? Object.keys(this.p.reactionCounts)
|
||||
.map(key => this.p.reactionCounts[key])
|
||||
.reduce((a, b) => a + b)
|
||||
? sum(Object.values(this.p.reactionCounts))
|
||||
: 0;
|
||||
},
|
||||
|
||||
@ -414,7 +413,7 @@ root(isDark)
|
||||
.mk-url-preview
|
||||
margin-top 8px
|
||||
|
||||
> .media
|
||||
> .files
|
||||
> img
|
||||
display block
|
||||
max-width 100%
|
||||
|
@ -125,7 +125,7 @@ export default Vue.extend({
|
||||
prepend(note, silent = false) {
|
||||
//#region 弾く
|
||||
const isMyNote = note.userId == this.$store.state.i.id;
|
||||
const isPureRenote = note.renoteId != null && note.text == null && note.mediaIds.length == 0 && note.poll == null;
|
||||
const isPureRenote = note.renoteId != null && note.text == null && note.fileIds.length == 0 && note.poll == null;
|
||||
|
||||
if (this.$store.state.settings.showMyRenotes === false) {
|
||||
if (isMyNote && isPureRenote) {
|
||||
|
@ -1,6 +1,8 @@
|
||||
<template>
|
||||
<div class="mk-notify">
|
||||
<mk-notification-preview :notification="notification"/>
|
||||
<div class="mk-notify" :class="pos">
|
||||
<div>
|
||||
<mk-notification-preview :notification="notification"/>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@ -10,11 +12,16 @@ import * as anime from 'animejs';
|
||||
|
||||
export default Vue.extend({
|
||||
props: ['notification'],
|
||||
computed: {
|
||||
pos() {
|
||||
return this.$store.state.device.mobileNotificationPosition;
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.$nextTick(() => {
|
||||
anime({
|
||||
targets: this.$el,
|
||||
bottom: '0px',
|
||||
[this.pos]: '0px',
|
||||
duration: 500,
|
||||
easing: 'easeOutQuad'
|
||||
});
|
||||
@ -22,7 +29,7 @@ export default Vue.extend({
|
||||
setTimeout(() => {
|
||||
anime({
|
||||
targets: this.$el,
|
||||
bottom: '-64px',
|
||||
[this.pos]: `-${this.$el.offsetHeight}px`,
|
||||
duration: 500,
|
||||
easing: 'easeOutQuad',
|
||||
complete: () => this.$destroy()
|
||||
@ -35,15 +42,32 @@ export default Vue.extend({
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
.mk-notify
|
||||
$height = 78px
|
||||
|
||||
position fixed
|
||||
z-index 1024
|
||||
bottom -64px
|
||||
left 0
|
||||
right 0
|
||||
width 100%
|
||||
height 64px
|
||||
max-width 500px
|
||||
height $height
|
||||
margin 0 auto
|
||||
padding 8px
|
||||
pointer-events none
|
||||
-webkit-backdrop-filter blur(2px)
|
||||
backdrop-filter blur(2px)
|
||||
background-color rgba(#000, 0.5)
|
||||
font-size 80%
|
||||
|
||||
&.bottom
|
||||
bottom -($height)
|
||||
|
||||
&.top
|
||||
top -($height)
|
||||
|
||||
> div
|
||||
height 100%
|
||||
-webkit-backdrop-filter blur(2px)
|
||||
backdrop-filter blur(2px)
|
||||
background-color rgba(#000, 0.5)
|
||||
border-radius 7px
|
||||
overflow hidden
|
||||
|
||||
</style>
|
||||
|
@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<div class="ulveipglmagnxfgvitaxyszerjwiqmwl">
|
||||
<div class="bg" ref="bg" @click="onBgClick"></div>
|
||||
<div class="main" ref="main" @click.self="onBgClick">
|
||||
<div class="bg" ref="bg"></div>
|
||||
<div class="main" ref="main">
|
||||
<mk-post-form ref="form"
|
||||
:reply="reply"
|
||||
:renote="renote"
|
||||
@ -83,11 +83,6 @@ export default Vue.extend({
|
||||
});
|
||||
},
|
||||
|
||||
onBgClick() {
|
||||
this.$emit('cancel');
|
||||
this.close();
|
||||
},
|
||||
|
||||
onPosted() {
|
||||
this.$emit('posted');
|
||||
this.close();
|
||||
|
@ -59,6 +59,8 @@ import MkVisibilityChooser from '../../../common/views/components/visibility-cho
|
||||
import getFace from '../../../common/scripts/get-face';
|
||||
import parse from '../../../../../mfm/parse';
|
||||
import { host } from '../../../config';
|
||||
import { erase } from '../../../../../prelude/array';
|
||||
import parseAcct from '../../../../../misc/acct/parse';
|
||||
|
||||
export default Vue.extend({
|
||||
components: {
|
||||
@ -94,7 +96,7 @@ export default Vue.extend({
|
||||
files: [],
|
||||
poll: false,
|
||||
geo: null,
|
||||
visibility: this.$store.state.device.visibility || 'public',
|
||||
visibility: this.$store.state.settings.rememberNoteVisibility ? (this.$store.state.device.visibility || this.$store.state.settings.defaultNoteVisibility) : this.$store.state.settings.defaultNoteVisibility,
|
||||
visibleUsers: [],
|
||||
useCw: false,
|
||||
cw: null,
|
||||
@ -200,12 +202,12 @@ export default Vue.extend({
|
||||
|
||||
attachMedia(driveFile) {
|
||||
this.files.push(driveFile);
|
||||
this.$emit('change-attached-media', this.files);
|
||||
this.$emit('change-attached-files', this.files);
|
||||
},
|
||||
|
||||
detachMedia(file) {
|
||||
this.files = this.files.filter(x => x.id != file.id);
|
||||
this.$emit('change-attached-media', this.files);
|
||||
this.$emit('change-attached-files', this.files);
|
||||
},
|
||||
|
||||
onChangeFile() {
|
||||
@ -252,24 +254,23 @@ export default Vue.extend({
|
||||
addVisibleUser() {
|
||||
(this as any).apis.input({
|
||||
title: '%i18n:@username-prompt%'
|
||||
}).then(username => {
|
||||
(this as any).api('users/show', {
|
||||
username
|
||||
}).then(user => {
|
||||
}).then(acct => {
|
||||
if (acct.startsWith('@')) acct = acct.substr(1);
|
||||
(this as any).api('users/show', parseAcct(acct)).then(user => {
|
||||
this.visibleUsers.push(user);
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
removeVisibleUser(user) {
|
||||
this.visibleUsers = this.visibleUsers.filter(u => u != user);
|
||||
this.visibleUsers = erase(user, this.visibleUsers);
|
||||
},
|
||||
|
||||
clear() {
|
||||
this.text = '';
|
||||
this.files = [];
|
||||
this.poll = false;
|
||||
this.$emit('change-attached-media');
|
||||
this.$emit('change-attached-files');
|
||||
},
|
||||
|
||||
post() {
|
||||
@ -277,7 +278,7 @@ export default Vue.extend({
|
||||
const viaMobile = this.$store.state.settings.disableViaMobile !== true;
|
||||
(this as any).api('notes/create', {
|
||||
text: this.text == '' ? undefined : this.text,
|
||||
mediaIds: this.files.length > 0 ? this.files.map(f => f.id) : undefined,
|
||||
fileIds: this.files.length > 0 ? this.files.map(f => f.id) : undefined,
|
||||
replyId: this.reply ? this.reply.id : undefined,
|
||||
renoteId: this.renote ? this.renote.id : undefined,
|
||||
poll: this.poll ? (this.$refs.poll as any).get() : undefined,
|
||||
|
@ -7,9 +7,9 @@
|
||||
<misskey-flavored-markdown v-if="note.text" :text="note.text" :i="$store.state.i"/>
|
||||
<a class="rp" v-if="note.renoteId">RP: ...</a>
|
||||
</div>
|
||||
<details v-if="note.media.length > 0">
|
||||
<summary>({{ '%i18n:@media-count%'.replace('{}', note.media.length) }})</summary>
|
||||
<mk-media-list :media-list="note.media"/>
|
||||
<details v-if="note.files.length > 0">
|
||||
<summary>({{ '%i18n:@media-count%'.replace('{}', note.files.length) }})</summary>
|
||||
<mk-media-list :media-list="note.files"/>
|
||||
</details>
|
||||
<details v-if="note.poll">
|
||||
<summary>%i18n:@poll%</summary>
|
||||
|
@ -34,6 +34,12 @@
|
||||
<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>
|
||||
</div>
|
||||
<div class="announcements" v-if="announcements && announcements.length > 0">
|
||||
<article v-for="announcement in announcements">
|
||||
<span v-html="announcement.title" class="title"></span>
|
||||
<div v-html="announcement.text"></div>
|
||||
</article>
|
||||
</div>
|
||||
<a :href="aboutUrl"><p class="about">%i18n:@about%</p></a>
|
||||
</div>
|
||||
</transition>
|
||||
@ -46,23 +52,32 @@ import { lang } from '../../../config';
|
||||
|
||||
export default Vue.extend({
|
||||
props: ['isOpen'],
|
||||
|
||||
data() {
|
||||
return {
|
||||
hasGameInvitation: false,
|
||||
connection: null,
|
||||
connectionId: null,
|
||||
aboutUrl: `/docs/${lang}/about`
|
||||
aboutUrl: `/docs/${lang}/about`,
|
||||
announcements: []
|
||||
};
|
||||
},
|
||||
|
||||
computed: {
|
||||
hasUnreadNotification(): boolean {
|
||||
return this.$store.getters.isSignedIn && this.$store.state.i.hasUnreadNotification;
|
||||
},
|
||||
|
||||
hasUnreadMessagingMessage(): boolean {
|
||||
return this.$store.getters.isSignedIn && this.$store.state.i.hasUnreadMessagingMessage;
|
||||
}
|
||||
},
|
||||
|
||||
mounted() {
|
||||
(this as any).os.getMeta().then(meta => {
|
||||
this.announcements = meta.broadcasts;
|
||||
});
|
||||
|
||||
if (this.$store.getters.isSignedIn) {
|
||||
this.connection = (this as any).os.stream.getConnection();
|
||||
this.connectionId = (this as any).os.stream.use();
|
||||
@ -71,6 +86,7 @@ export default Vue.extend({
|
||||
this.connection.on('reversi_no_invites', this.onReversiNoInvites);
|
||||
}
|
||||
},
|
||||
|
||||
beforeDestroy() {
|
||||
if (this.$store.getters.isSignedIn) {
|
||||
this.connection.off('reversi_invited', this.onReversiInvited);
|
||||
@ -78,18 +94,22 @@ export default Vue.extend({
|
||||
(this as any).os.stream.dispose(this.connectionId);
|
||||
}
|
||||
},
|
||||
|
||||
methods: {
|
||||
search() {
|
||||
const query = window.prompt('%i18n:@search%');
|
||||
if (query == null || query == '') return;
|
||||
this.$router.push(`/search?q=${encodeURIComponent(query)}`);
|
||||
},
|
||||
|
||||
onReversiInvited() {
|
||||
this.hasGameInvitation = true;
|
||||
},
|
||||
|
||||
onReversiNoInvites() {
|
||||
this.hasGameInvitation = false;
|
||||
},
|
||||
|
||||
dark() {
|
||||
this.$store.commit('device/set', {
|
||||
key: 'darkmode',
|
||||
@ -204,6 +224,17 @@ root(isDark)
|
||||
color $color
|
||||
opacity 0.5
|
||||
|
||||
.announcements
|
||||
> article
|
||||
background isDark ? rgba(30, 129, 216, 0.2) : rgba(155, 196, 232, 0.2)
|
||||
color isDark ? #fff : #3f4967
|
||||
padding 16px
|
||||
margin 8px 0
|
||||
font-size 12px
|
||||
|
||||
> .title
|
||||
font-weight bold
|
||||
|
||||
.about
|
||||
margin 0 0 8px 0
|
||||
padding 1em 0
|
||||
|
@ -41,7 +41,7 @@ export default Vue.extend({
|
||||
(this.$refs.timeline as any).init(() => new Promise((res, rej) => {
|
||||
(this as any).api('users/notes', {
|
||||
userId: this.user.id,
|
||||
withMedia: this.withMedia,
|
||||
withFiles: this.withMedia,
|
||||
limit: fetchLimit + 1
|
||||
}).then(notes => {
|
||||
if (notes.length == fetchLimit + 1) {
|
||||
@ -62,7 +62,7 @@ export default Vue.extend({
|
||||
|
||||
const promise = (this as any).api('users/notes', {
|
||||
userId: this.user.id,
|
||||
withMedia: this.withMedia,
|
||||
withFiles: this.withMedia,
|
||||
limit: fetchLimit + 1,
|
||||
untilId: (this.$refs.timeline as any).tail().id
|
||||
});
|
||||
|
@ -10,80 +10,117 @@
|
||||
<ui-card>
|
||||
<div slot="title">%fa:palette% %i18n:@design%</div>
|
||||
|
||||
<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.iLikeSushi" @change="onChangeILikeSushi">%i18n:common.i-like-sushi%</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>
|
||||
<section>
|
||||
<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.contrastedAcct" @change="onChangeContrastedAcct">%i18n:@contrasted-acct%</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.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>
|
||||
</section>
|
||||
|
||||
<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.showMyRenotes" @change="onChangeShowMyRenotes">%i18n:@show-my-renotes%</ui-switch>
|
||||
<ui-switch v-model="$store.state.settings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes">%i18n:@show-renoted-my-notes%</ui-switch>
|
||||
<ui-switch v-model="$store.state.settings.showLocalRenotes" @change="onChangeShowLocalRenotes">%i18n:@show-local-renotes%</ui-switch>
|
||||
</div>
|
||||
<section>
|
||||
<header>%i18n:@timeline%</header>
|
||||
<div>
|
||||
<ui-switch v-model="$store.state.settings.showReplyTarget" @change="onChangeShowReplyTarget">%i18n:@show-reply-target%</ui-switch>
|
||||
<ui-switch v-model="$store.state.settings.showMyRenotes" @change="onChangeShowMyRenotes">%i18n:@show-my-renotes%</ui-switch>
|
||||
<ui-switch v-model="$store.state.settings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes">%i18n:@show-renoted-my-notes%</ui-switch>
|
||||
<ui-switch v-model="$store.state.settings.showLocalRenotes" @change="onChangeShowLocalRenotes">%i18n:@show-local-renotes%</ui-switch>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<div>
|
||||
<div>%i18n:@post-style%</div>
|
||||
<section>
|
||||
<header>%i18n:@post-style%</header>
|
||||
<ui-radio v-model="postStyle" value="standard">%i18n:@post-style-standard%</ui-radio>
|
||||
<ui-radio v-model="postStyle" value="smart">%i18n:@post-style-smart%</ui-radio>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<header>%i18n:@notification-position%</header>
|
||||
<ui-radio v-model="mobileNotificationPosition" value="bottom">%i18n:@notification-position-bottom%</ui-radio>
|
||||
<ui-radio v-model="mobileNotificationPosition" value="top">%i18n:@notification-position-top%</ui-radio>
|
||||
</section>
|
||||
</ui-card>
|
||||
|
||||
<ui-card>
|
||||
<div slot="title">%fa:cog% %i18n:@behavior%</div>
|
||||
<ui-switch v-model="$store.state.settings.fetchOnScroll" @change="onChangeFetchOnScroll">%i18n:@fetch-on-scroll%</ui-switch>
|
||||
<ui-switch v-model="$store.state.settings.disableViaMobile" @change="onChangeDisableViaMobile">%i18n:@disable-via-mobile%</ui-switch>
|
||||
<ui-switch v-model="loadRawImages">%i18n:@load-raw-images%</ui-switch>
|
||||
<ui-switch v-model="$store.state.settings.loadRemoteMedia" @change="onChangeLoadRemoteMedia">%i18n:@load-remote-media%</ui-switch>
|
||||
<ui-switch v-model="lightmode">%i18n:@i-am-under-limited-internet%</ui-switch>
|
||||
|
||||
<section>
|
||||
<ui-switch v-model="$store.state.settings.fetchOnScroll" @change="onChangeFetchOnScroll">%i18n:@fetch-on-scroll%</ui-switch>
|
||||
<ui-switch v-model="$store.state.settings.disableViaMobile" @change="onChangeDisableViaMobile">%i18n:@disable-via-mobile%</ui-switch>
|
||||
<ui-switch v-model="loadRawImages">%i18n:@load-raw-images%</ui-switch>
|
||||
<ui-switch v-model="$store.state.settings.loadRemoteMedia" @change="onChangeLoadRemoteMedia">%i18n:@load-remote-media%</ui-switch>
|
||||
<ui-switch v-model="lightmode">%i18n:@i-am-under-limited-internet%</ui-switch>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<header>%i18n:@note-visibility%</header>
|
||||
<ui-switch v-model="$store.state.settings.rememberNoteVisibility" @change="onChangeRememberNoteVisibility">%i18n:@remember-note-visibility%</ui-switch>
|
||||
<section>
|
||||
<header>%i18n:@default-note-visibility%</header>
|
||||
<ui-select v-model="defaultNoteVisibility">
|
||||
<option value="public">%i18n:common.note-visibility.public%</option>
|
||||
<option value="home">%i18n:common.note-visibility.home%</option>
|
||||
<option value="followers">%i18n:common.note-visibility.followers%</option>
|
||||
<option value="specified">%i18n:common.note-visibility.specified%</option>
|
||||
<option value="private">%i18n:common.note-visibility.private%</option>
|
||||
</ui-select>
|
||||
</section>
|
||||
</section>
|
||||
</ui-card>
|
||||
|
||||
<ui-card>
|
||||
<div slot="title">%fa:volume-up% %i18n:@sound%</div>
|
||||
|
||||
<ui-switch v-model="enableSounds">%i18n:@enable-sounds%</ui-switch>
|
||||
<section>
|
||||
<ui-switch v-model="enableSounds">%i18n:@enable-sounds%</ui-switch>
|
||||
</section>
|
||||
</ui-card>
|
||||
|
||||
<ui-card>
|
||||
<div slot="title">%fa:language% %i18n:@lang%</div>
|
||||
|
||||
<ui-select v-model="lang" placeholder="%i18n:@auto%">
|
||||
<optgroup label="%i18n:@recommended%">
|
||||
<option value="">%i18n:@auto%</option>
|
||||
</optgroup>
|
||||
<section class="fit-top">
|
||||
<ui-select v-model="lang" placeholder="%i18n:@auto%">
|
||||
<optgroup label="%i18n:@recommended%">
|
||||
<option value="">%i18n:@auto%</option>
|
||||
</optgroup>
|
||||
|
||||
<optgroup label="%i18n:@specify-language%">
|
||||
<option v-for="x in langs" :value="x[0]" :key="x[0]">{{ x[1] }}</option>
|
||||
</optgroup>
|
||||
</ui-select>
|
||||
<span>%fa:info-circle% %i18n:@lang-tip%</span>
|
||||
<optgroup label="%i18n:@specify-language%">
|
||||
<option v-for="x in langs" :value="x[0]" :key="x[0]">{{ x[1] }}</option>
|
||||
</optgroup>
|
||||
</ui-select>
|
||||
<span>%fa:info-circle% %i18n:@lang-tip%</span>
|
||||
</section>
|
||||
</ui-card>
|
||||
|
||||
<ui-card>
|
||||
<div slot="title">%fa:B twitter% %i18n:@twitter%</div>
|
||||
|
||||
<p class="account" v-if="$store.state.i.twitter"><a :href="`https://twitter.com/${$store.state.i.twitter.screenName}`" target="_blank">@{{ $store.state.i.twitter.screenName }}</a></p>
|
||||
<p>
|
||||
<a :href="`${apiUrl}/connect/twitter`" target="_blank">{{ $store.state.i.twitter ? '%i18n:@twitter-reconnect%' : '%i18n:@twitter-connect%' }}</a>
|
||||
<span v-if="$store.state.i.twitter"> or </span>
|
||||
<a :href="`${apiUrl}/disconnect/twitter`" target="_blank" v-if="$store.state.i.twitter">%i18n:@twitter-disconnect%</a>
|
||||
</p>
|
||||
<section>
|
||||
<p class="account" v-if="$store.state.i.twitter"><a :href="`https://twitter.com/${$store.state.i.twitter.screenName}`" target="_blank">@{{ $store.state.i.twitter.screenName }}</a></p>
|
||||
<p>
|
||||
<a :href="`${apiUrl}/connect/twitter`" target="_blank">{{ $store.state.i.twitter ? '%i18n:@twitter-reconnect%' : '%i18n:@twitter-connect%' }}</a>
|
||||
<span v-if="$store.state.i.twitter"> or </span>
|
||||
<a :href="`${apiUrl}/disconnect/twitter`" target="_blank" v-if="$store.state.i.twitter">%i18n:@twitter-disconnect%</a>
|
||||
</p>
|
||||
</section>
|
||||
</ui-card>
|
||||
|
||||
<ui-card>
|
||||
<div slot="title">%fa:sync-alt% %i18n:@update%</div>
|
||||
|
||||
<div>%i18n:@version% <i>{{ version }}</i></div>
|
||||
<template v-if="latestVersion !== undefined">
|
||||
<div>%i18n:@latest-version% <i>{{ latestVersion ? latestVersion : version }}</i></div>
|
||||
</template>
|
||||
<ui-button @click="checkForUpdate" :disabled="checkingForUpdate">
|
||||
<template v-if="checkingForUpdate">%i18n:@update-checking%<mk-ellipsis/></template>
|
||||
<template v-else>%i18n:@check-for-updates%</template>
|
||||
</ui-button>
|
||||
<section>
|
||||
<div>%i18n:@version% <i>{{ version }}</i></div>
|
||||
<template v-if="latestVersion !== undefined">
|
||||
<div>%i18n:@latest-version% <i>{{ latestVersion ? latestVersion : version }}</i></div>
|
||||
</template>
|
||||
<ui-button @click="checkForUpdate" :disabled="checkingForUpdate">
|
||||
<template v-if="checkingForUpdate">%i18n:@update-checking%<mk-ellipsis/></template>
|
||||
<template v-else>%i18n:@check-for-updates%</template>
|
||||
</ui-button>
|
||||
</section>
|
||||
</ui-card>
|
||||
</div>
|
||||
|
||||
@ -134,6 +171,16 @@ export default Vue.extend({
|
||||
set(value) { this.$store.commit('device/set', { key: 'postStyle', value }); }
|
||||
},
|
||||
|
||||
mobileNotificationPosition: {
|
||||
get() { return this.$store.state.device.mobileNotificationPosition; },
|
||||
set(value) { this.$store.commit('device/set', { key: 'mobileNotificationPosition', value }); }
|
||||
},
|
||||
|
||||
defaultNoteVisibility: {
|
||||
get() { return this.$store.state.settings.defaultNoteVisibility; },
|
||||
set(value) { this.$store.commit('settings/set', { key: 'defaultNoteVisibility', value }); }
|
||||
},
|
||||
|
||||
lightmode: {
|
||||
get() { return this.$store.state.device.lightmode; },
|
||||
set(value) { this.$store.commit('device/set', { key: 'lightmode', value }); }
|
||||
@ -171,6 +218,13 @@ export default Vue.extend({
|
||||
});
|
||||
},
|
||||
|
||||
onChangeRememberNoteVisibility(v) {
|
||||
this.$store.dispatch('settings/set', {
|
||||
key: 'rememberNoteVisibility',
|
||||
value: v
|
||||
});
|
||||
},
|
||||
|
||||
onChangeDisableViaMobile(v) {
|
||||
this.$store.dispatch('settings/set', {
|
||||
key: 'disableViaMobile',
|
||||
@ -192,6 +246,13 @@ export default Vue.extend({
|
||||
});
|
||||
},
|
||||
|
||||
onChangeContrastedAcct(v) {
|
||||
this.$store.dispatch('settings/set', {
|
||||
key: 'contrastedAcct',
|
||||
value: v
|
||||
});
|
||||
},
|
||||
|
||||
onChangeILikeSushi(v) {
|
||||
this.$store.dispatch('settings/set', {
|
||||
key: 'iLikeSushi',
|
||||
@ -273,7 +334,7 @@ export default Vue.extend({
|
||||
<style lang="stylus" scoped>
|
||||
root(isDark)
|
||||
margin 0 auto
|
||||
max-width 500px
|
||||
max-width 600px
|
||||
width 100%
|
||||
|
||||
> .signin-as
|
||||
|
@ -2,47 +2,49 @@
|
||||
<ui-card>
|
||||
<div slot="title">%fa:user% %i18n:@title%</div>
|
||||
|
||||
<ui-form :disabled="saving">
|
||||
<ui-input v-model="name" :max="30">
|
||||
<span>%i18n:@name%</span>
|
||||
</ui-input>
|
||||
<section class="fit-top">
|
||||
<ui-form :disabled="saving">
|
||||
<ui-input v-model="name" :max="30">
|
||||
<span>%i18n:@name%</span>
|
||||
</ui-input>
|
||||
|
||||
<ui-input v-model="username" readonly>
|
||||
<span>%i18n:@account%</span>
|
||||
<span slot="prefix">@</span>
|
||||
<span slot="suffix">@{{ host }}</span>
|
||||
</ui-input>
|
||||
<ui-input v-model="username" readonly>
|
||||
<span>%i18n:@account%</span>
|
||||
<span slot="prefix">@</span>
|
||||
<span slot="suffix">@{{ host }}</span>
|
||||
</ui-input>
|
||||
|
||||
<ui-input v-model="location">
|
||||
<span>%i18n:@location%</span>
|
||||
<span slot="prefix">%fa:map-marker-alt%</span>
|
||||
</ui-input>
|
||||
<ui-input v-model="location">
|
||||
<span>%i18n:@location%</span>
|
||||
<span slot="prefix">%fa:map-marker-alt%</span>
|
||||
</ui-input>
|
||||
|
||||
<ui-input v-model="birthday" type="date">
|
||||
<span>%i18n:@birthday%</span>
|
||||
<span slot="prefix">%fa:birthday-cake%</span>
|
||||
</ui-input>
|
||||
<ui-input v-model="birthday" type="date">
|
||||
<span>%i18n:@birthday%</span>
|
||||
<span slot="prefix">%fa:birthday-cake%</span>
|
||||
</ui-input>
|
||||
|
||||
<ui-textarea v-model="description" :max="500">
|
||||
<span>%i18n:@description%</span>
|
||||
</ui-textarea>
|
||||
<ui-textarea v-model="description" :max="500">
|
||||
<span>%i18n:@description%</span>
|
||||
</ui-textarea>
|
||||
|
||||
<ui-input type="file" @change="onAvatarChange">
|
||||
<span>%i18n:@avatar%</span>
|
||||
<span slot="icon">%fa:image%</span>
|
||||
<span slot="text" v-if="avatarUploading">%i18n:@uploading%<mk-ellipsis/></span>
|
||||
</ui-input>
|
||||
<ui-input type="file" @change="onAvatarChange">
|
||||
<span>%i18n:@avatar%</span>
|
||||
<span slot="icon">%fa:image%</span>
|
||||
<span slot="text" v-if="avatarUploading">%i18n:@uploading%<mk-ellipsis/></span>
|
||||
</ui-input>
|
||||
|
||||
<ui-input type="file" @change="onBannerChange">
|
||||
<span>%i18n:@banner%</span>
|
||||
<span slot="icon">%fa:image%</span>
|
||||
<span slot="text" v-if="bannerUploading">%i18n:@uploading%<mk-ellipsis/></span>
|
||||
</ui-input>
|
||||
<ui-input type="file" @change="onBannerChange">
|
||||
<span>%i18n:@banner%</span>
|
||||
<span slot="icon">%fa:image%</span>
|
||||
<span slot="text" v-if="bannerUploading">%i18n:@uploading%<mk-ellipsis/></span>
|
||||
</ui-input>
|
||||
|
||||
<ui-switch v-model="isCat">%i18n:@is-cat%</ui-switch>
|
||||
<ui-switch v-model="isCat">%i18n:@is-cat%</ui-switch>
|
||||
|
||||
<ui-button @click="save">%i18n:@save%</ui-button>
|
||||
</ui-form>
|
||||
<ui-button @click="save">%i18n:@save%</ui-button>
|
||||
</ui-form>
|
||||
</section>
|
||||
</ui-card>
|
||||
</template>
|
||||
|
||||
|
@ -16,7 +16,7 @@
|
||||
</div>
|
||||
<div class="title">
|
||||
<h1>{{ user | userName }}</h1>
|
||||
<span class="username"><mk-acct :user="user"/></span>
|
||||
<span class="username"><mk-acct :user="user" :detail="true" /></span>
|
||||
<span class="followed" v-if="user.isFollowed">%i18n:@follows-you%</span>
|
||||
</div>
|
||||
<div class="description">
|
||||
|
@ -26,7 +26,7 @@ export default Vue.extend({
|
||||
mounted() {
|
||||
(this as any).api('users/notes', {
|
||||
userId: this.user.id,
|
||||
withMedia: true,
|
||||
withFiles: true,
|
||||
limit: 6
|
||||
}).then(notes => {
|
||||
notes.forEach(note => {
|
||||
|
@ -1,5 +1,5 @@
|
||||
<template>
|
||||
<div class="welcome">
|
||||
<div class="wgwfgvvimdjvhjfwxropcwksnzftjqes">
|
||||
<div>
|
||||
<img :src="$store.state.device.darkmode ? 'assets/title.dark.svg' : 'assets/title.light.svg'" :alt="name">
|
||||
<p class="host">{{ host }}</p>
|
||||
@ -15,12 +15,53 @@
|
||||
<mk-welcome-timeline/>
|
||||
</div>
|
||||
<div class="hashtags">
|
||||
<router-link v-for="tag in tags" :key="tag" :to="`/tags/${ tag }`" :title="tag">#{{ tag }}</router-link>
|
||||
<mk-tag-cloud/>
|
||||
</div>
|
||||
<div class="photos">
|
||||
<div v-for="photo in photos" :style="`background-image: url(${photo.thumbnailUrl})`"></div>
|
||||
</div>
|
||||
<div class="stats" v-if="stats">
|
||||
<span>%fa:user% {{ stats.originalUsersCount | number }}</span>
|
||||
<span>%fa:pencil-alt% {{ stats.originalNotesCount | number }}</span>
|
||||
</div>
|
||||
<div class="announcements" v-if="announcements && announcements.length > 0">
|
||||
<article v-for="announcement in announcements">
|
||||
<span class="title" v-html="announcement.title"></span>
|
||||
<div v-html="announcement.text"></div>
|
||||
</article>
|
||||
</div>
|
||||
<article class="about-misskey">
|
||||
<h1>%i18n:common.intro.title%</h1>
|
||||
<p v-html="'%i18n:common.intro.about%'"></p>
|
||||
<section>
|
||||
<h2>%i18n:common.intro.features%</h2>
|
||||
<section>
|
||||
<h3>%i18n:common.intro.rich-contents%</h3>
|
||||
<div class="image"><img src="/assets/about/post.png" alt=""></div>
|
||||
<p v-html="'%i18n:common.intro.rich-contents-desc%'"></p>
|
||||
</section>
|
||||
<section>
|
||||
<h3>%i18n:common.intro.reaction%</h3>
|
||||
<div class="image"><img src="/assets/about/reaction.png" alt=""></div>
|
||||
<p v-html="'%i18n:common.intro.reaction-desc%'"></p>
|
||||
</section>
|
||||
<section>
|
||||
<h3>%i18n:common.intro.ui%</h3>
|
||||
<div class="image"><img src="/assets/about/ui.png" alt=""></div>
|
||||
<p v-html="'%i18n:common.intro.ui-desc%'"></p>
|
||||
</section>
|
||||
<section>
|
||||
<h3>%i18n:common.intro.drive%</h3>
|
||||
<div class="image"><img src="/assets/about/drive.png" alt=""></div>
|
||||
<p v-html="'%i18n:common.intro.drive-desc%'"></p>
|
||||
</section>
|
||||
</section>
|
||||
<p v-html="'%i18n:common.intro.outro%'"></p>
|
||||
</article>
|
||||
<div class="info" v-if="meta">
|
||||
<p>Version: <b>{{ meta.version }}</b></p>
|
||||
<p>Maintainer: <b><a :href="meta.maintainer.url" target="_blank">{{ meta.maintainer.name }}</a></b></p>
|
||||
</div>
|
||||
<footer>
|
||||
<small>{{ copyright }}</small>
|
||||
</footer>
|
||||
@ -30,39 +71,53 @@
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import { apiUrl, copyright, host } from '../../../config';
|
||||
import { copyright, host } from '../../../config';
|
||||
import { concat } from '../../../../../prelude/array';
|
||||
|
||||
export default Vue.extend({
|
||||
data() {
|
||||
return {
|
||||
apiUrl,
|
||||
meta: null,
|
||||
copyright,
|
||||
stats: null,
|
||||
host,
|
||||
name: 'Misskey',
|
||||
description: '',
|
||||
tags: []
|
||||
photos: [],
|
||||
announcements: []
|
||||
};
|
||||
},
|
||||
created() {
|
||||
(this as any).os.getMeta().then(meta => {
|
||||
this.meta = meta;
|
||||
this.name = meta.name;
|
||||
this.description = meta.description;
|
||||
this.announcements = meta.broadcasts;
|
||||
});
|
||||
|
||||
(this as any).api('stats').then(stats => {
|
||||
this.stats = stats;
|
||||
});
|
||||
|
||||
(this as any).api('hashtags/trend').then(stats => {
|
||||
this.tags = stats.map(x => x.tag);
|
||||
const image = [
|
||||
'image/jpeg',
|
||||
'image/png',
|
||||
'image/gif'
|
||||
];
|
||||
|
||||
(this as any).api('notes/local-timeline', {
|
||||
fileType: image,
|
||||
limit: 6
|
||||
}).then((notes: any[]) => {
|
||||
const files = concat(notes.map((n: any): any[] => n.files));
|
||||
this.photos = files.filter(f => image.includes(f.type)).slice(0, 6);
|
||||
});
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
.welcome
|
||||
root(isDark)
|
||||
text-align center
|
||||
//background #fff
|
||||
|
||||
@ -138,12 +193,21 @@ export default Vue.extend({
|
||||
-webkit-overflow-scrolling touch
|
||||
|
||||
> .hashtags
|
||||
padding 16px 0
|
||||
border solid 2px #ddd
|
||||
border-radius 8px
|
||||
padding 0 8px
|
||||
height 200px
|
||||
|
||||
> *
|
||||
margin 0 16px
|
||||
> .photos
|
||||
display grid
|
||||
grid-template-rows 1fr 1fr 1fr
|
||||
grid-template-columns 1fr 1fr
|
||||
gap 8px
|
||||
height 300px
|
||||
margin-top 16px
|
||||
|
||||
> div
|
||||
border-radius 4px
|
||||
background-position center center
|
||||
background-size cover
|
||||
|
||||
> .stats
|
||||
margin 16px 0
|
||||
@ -156,6 +220,68 @@ export default Vue.extend({
|
||||
> *
|
||||
margin 0 8px
|
||||
|
||||
> .announcements
|
||||
margin 16px 0
|
||||
|
||||
> article
|
||||
background isDark ? rgba(30, 129, 216, 0.2) : rgba(155, 196, 232, 0.2)
|
||||
border-radius 6px
|
||||
color isDark ? #fff : #3f4967
|
||||
padding 16px
|
||||
margin 8px 0
|
||||
font-size 12px
|
||||
|
||||
> .title
|
||||
font-weight bold
|
||||
|
||||
> .about-misskey
|
||||
margin 16px 0
|
||||
padding 32px
|
||||
font-size 14px
|
||||
background #fff
|
||||
border-radius 6px
|
||||
overflow hidden
|
||||
color #3a3e46
|
||||
|
||||
> h1
|
||||
margin 0
|
||||
|
||||
& + p
|
||||
margin-top 8px
|
||||
|
||||
> p:last-child
|
||||
margin-bottom 0
|
||||
|
||||
> section
|
||||
> h2
|
||||
border-bottom 1px solid isDark ? rgba(#000, 0.2) : rgba(#000, 0.05)
|
||||
|
||||
> section
|
||||
margin-bottom 16px
|
||||
padding-bottom 16px
|
||||
border-bottom 1px solid isDark ? rgba(#000, 0.2) : rgba(#000, 0.05)
|
||||
|
||||
> h3
|
||||
margin-bottom 8px
|
||||
|
||||
> p
|
||||
margin-bottom 0
|
||||
|
||||
> .image
|
||||
> img
|
||||
display block
|
||||
width 100%
|
||||
height 120px
|
||||
object-fit cover
|
||||
|
||||
> .info
|
||||
padding 16px 0
|
||||
border solid 2px #ddd
|
||||
border-radius 8px
|
||||
|
||||
> *
|
||||
margin 0 16px
|
||||
|
||||
> footer
|
||||
text-align center
|
||||
color #444
|
||||
@ -165,4 +291,10 @@ export default Vue.extend({
|
||||
margin 16px 0 0 0
|
||||
opacity 0.7
|
||||
|
||||
.wgwfgvvimdjvhjfwxropcwksnzftjqes[data-darkmode]
|
||||
root(true)
|
||||
|
||||
.wgwfgvvimdjvhjfwxropcwksnzftjqes:not([data-darkmode])
|
||||
root(false)
|
||||
|
||||
</style>
|
||||
|
@ -4,6 +4,7 @@ import * as nestedProperty from 'nested-property';
|
||||
|
||||
import MiOS from './mios';
|
||||
import { hostname } from './config';
|
||||
import { erase } from '../../prelude/array';
|
||||
|
||||
const defaultSettings = {
|
||||
home: null,
|
||||
@ -15,6 +16,7 @@ const defaultSettings = {
|
||||
suggestRecentHashtags: true,
|
||||
showClockOnHeader: true,
|
||||
circleIcons: true,
|
||||
contrastedAcct: true,
|
||||
gradientWindowHeader: false,
|
||||
showReplyTarget: true,
|
||||
showMyRenotes: true,
|
||||
@ -24,6 +26,8 @@ const defaultSettings = {
|
||||
disableViaMobile: false,
|
||||
memo: null,
|
||||
iLikeSushi: false,
|
||||
rememberNoteVisibility: false,
|
||||
defaultNoteVisibility: 'public',
|
||||
games: {
|
||||
reversi: {
|
||||
showBoardLabels: false,
|
||||
@ -43,7 +47,8 @@ const defaultDeviceSettings = {
|
||||
debug: false,
|
||||
lightmode: false,
|
||||
loadRawImages: false,
|
||||
postStyle: 'standard'
|
||||
postStyle: 'standard',
|
||||
mobileNotificationPosition: 'bottom'
|
||||
};
|
||||
|
||||
export default (os: MiOS) => new Vuex.Store({
|
||||
@ -194,7 +199,7 @@ export default (os: MiOS) => new Vuex.Store({
|
||||
|
||||
removeDeckColumn(state, id) {
|
||||
state.deck.columns = state.deck.columns.filter(c => c.id != id);
|
||||
state.deck.layout = state.deck.layout.map(ids => ids.filter(x => x != id));
|
||||
state.deck.layout = state.deck.layout.map(ids => erase(id, ids));
|
||||
state.deck.layout = state.deck.layout.filter(ids => ids.length > 0);
|
||||
},
|
||||
|
||||
@ -265,7 +270,7 @@ export default (os: MiOS) => new Vuex.Store({
|
||||
|
||||
stackLeftDeckColumn(state, id) {
|
||||
const i = state.deck.layout.findIndex(ids => ids.indexOf(id) != -1);
|
||||
state.deck.layout = state.deck.layout.map(ids => ids.filter(x => x != id));
|
||||
state.deck.layout = state.deck.layout.map(ids => erase(id, ids));
|
||||
const left = state.deck.layout[i - 1];
|
||||
if (left) state.deck.layout[i - 1].push(id);
|
||||
state.deck.layout = state.deck.layout.filter(ids => ids.length > 0);
|
||||
@ -273,7 +278,7 @@ export default (os: MiOS) => new Vuex.Store({
|
||||
|
||||
popRightDeckColumn(state, id) {
|
||||
const i = state.deck.layout.findIndex(ids => ids.indexOf(id) != -1);
|
||||
state.deck.layout = state.deck.layout.map(ids => ids.filter(x => x != id));
|
||||
state.deck.layout = state.deck.layout.map(ids => erase(id, ids));
|
||||
state.deck.layout.splice(i + 1, 0, [id]);
|
||||
state.deck.layout = state.deck.layout.filter(ids => ids.length > 0);
|
||||
},
|
||||
|
@ -3,6 +3,7 @@
|
||||
*/
|
||||
|
||||
import composeNotification from './common/scripts/compose-notification';
|
||||
import { erase } from '../../prelude/array';
|
||||
|
||||
// キャッシュするリソース
|
||||
const cachee = [
|
||||
@ -24,8 +25,7 @@ self.addEventListener('activate', ev => {
|
||||
// Clean up old caches
|
||||
ev.waitUntil(
|
||||
caches.keys().then(keys => Promise.all(
|
||||
keys
|
||||
.filter(key => key != _VERSION_)
|
||||
erase(_VERSION_, keys)
|
||||
.map(key => caches.delete(key))
|
||||
))
|
||||
);
|
||||
|
Before Width: | Height: | Size: 232 KiB After Width: | Height: | Size: 274 KiB |
Before Width: | Height: | Size: 4.5 KiB |
Before Width: | Height: | Size: 5.9 KiB |
Before Width: | Height: | Size: 9.8 KiB |
Before Width: | Height: | Size: 5.7 KiB |
Before Width: | Height: | Size: 6.8 KiB |
Before Width: | Height: | Size: 4.7 KiB |
Before Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 7.4 KiB |
Before Width: | Height: | Size: 6.6 KiB |
Before Width: | Height: | Size: 3.7 KiB |
Before Width: | Height: | Size: 8.4 KiB |
@ -7,6 +7,7 @@ import { URL } from 'url';
|
||||
import * as yaml from 'js-yaml';
|
||||
import { Source, Mixin } from './types';
|
||||
import isUrl = require('is-url');
|
||||
const pkg = require('../../package.json');
|
||||
|
||||
/**
|
||||
* Path of configuration directory
|
||||
@ -43,6 +44,7 @@ export default function load() {
|
||||
mixin.stats_url = `${mixin.scheme}://${mixin.host}/stats`;
|
||||
mixin.status_url = `${mixin.scheme}://${mixin.host}/status`;
|
||||
mixin.drive_url = `${mixin.scheme}://${mixin.host}/files`;
|
||||
mixin.user_agent = `Misskey/${pkg.version} (${config.url})`;
|
||||
|
||||
if (config.localDriveCapacityMb == null) config.localDriveCapacityMb = 256;
|
||||
if (config.remoteDriveCapacityMb == null) config.remoteDriveCapacityMb = 8;
|
||||
|