Compare commits
96 Commits
Author | SHA1 | Date | |
---|---|---|---|
0790dd7a2c | |||
408118a1e8 | |||
6a45bb21c3 | |||
5d4e9aa949 | |||
c87b98c2af | |||
5a13c38a6d | |||
67f60ab307 | |||
08c278578d | |||
0e01fb5fc3 | |||
d44dc7e00d | |||
82ee3a538b | |||
380cf0de69 | |||
11f25ea2e7 | |||
ef62497777 | |||
2824d8a5b6 | |||
1c84c0828e | |||
39e4494836 | |||
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 | |||
fb76dff836 | |||
7167c8c593 | |||
51b79d4250 | |||
925fcc1c64 | |||
fcdc14862c | |||
dac2844cae | |||
706b0cea16 | |||
842e7844c7 | |||
1dceda50d8 | |||
af8b9abba4 | |||
07b07685fa | |||
cde43fe3c8 | |||
2fe84aa75b | |||
7d79a4840d | |||
3ee9479572 | |||
16da91d8d1 | |||
8ffd62b462 | |||
935367e167 | |||
00618260f2 | |||
77d66fac7b | |||
17d7f59b06 | |||
2561547db1 | |||
7738438616 | |||
3d8fc4a794 | |||
87b4e7905e | |||
13c5d4985a | |||
f0df4096fd | |||
5044424549 | |||
8ce67cdcd6 |
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]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
```
|
```
|
||||||
|
CentOSで1024以下のポートを使用してMisskeyを使用する場合は`ExecStart=/usr/bin/sudo /usr/bin/npm start`に変更する必要があります。
|
||||||
|
|
||||||
3. `systemctl daemon-reload ; systemctl enable misskey` systemdを再読み込みしmisskeyサービスを有効化
|
3. `systemctl daemon-reload ; systemctl enable misskey` systemdを再読み込みしmisskeyサービスを有効化
|
||||||
4. `systemctl start misskey` misskeyサービスの起動
|
4. `systemctl start misskey` misskeyサービスの起動
|
||||||
|
@ -651,6 +651,7 @@ desktop/views/components/settings.vue:
|
|||||||
delete-wallpaper: "壁紙を削除"
|
delete-wallpaper: "壁紙を削除"
|
||||||
dark-mode: "ダークモード"
|
dark-mode: "ダークモード"
|
||||||
circle-icons: "円形のアイコンを使用"
|
circle-icons: "円形のアイコンを使用"
|
||||||
|
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||||
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
||||||
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
||||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||||
@ -868,6 +869,7 @@ desktop/views/pages/welcome.vue:
|
|||||||
announcements: "お知らせ"
|
announcements: "お知らせ"
|
||||||
photos: "最近の画像"
|
photos: "最近の画像"
|
||||||
powered-by-misskey: "Powered by <b>Misskey</b>."
|
powered-by-misskey: "Powered by <b>Misskey</b>."
|
||||||
|
info: "情報"
|
||||||
desktop/views/pages/drive.vue:
|
desktop/views/pages/drive.vue:
|
||||||
title: "Misskey Drive"
|
title: "Misskey Drive"
|
||||||
desktop/views/pages/favorites.vue:
|
desktop/views/pages/favorites.vue:
|
||||||
@ -1155,6 +1157,7 @@ mobile/views/pages/settings.vue:
|
|||||||
dark-mode: "ダークモード"
|
dark-mode: "ダークモード"
|
||||||
i-am-under-limited-internet: "私は通信を制限されている"
|
i-am-under-limited-internet: "私は通信を制限されている"
|
||||||
circle-icons: "円形のアイコンを使用"
|
circle-icons: "円形のアイコンを使用"
|
||||||
|
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
show-reply-target: "リプライ先を表示する"
|
show-reply-target: "リプライ先を表示する"
|
||||||
show-my-renotes: "自分の行ったRenoteを表示する"
|
show-my-renotes: "自分の行ったRenoteを表示する"
|
||||||
@ -1187,7 +1190,7 @@ mobile/views/pages/settings.vue:
|
|||||||
settings: "設定"
|
settings: "設定"
|
||||||
signout: "サインアウト"
|
signout: "サインアウト"
|
||||||
sound: "サウンド"
|
sound: "サウンド"
|
||||||
enableSounds: "サウンドを有効にする"
|
enable-sounds: "サウンドを有効にする"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
follows-you: "フォローされています"
|
follows-you: "フォローされています"
|
||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
|
@ -651,6 +651,7 @@ desktop/views/components/settings.vue:
|
|||||||
delete-wallpaper: "壁紙を削除"
|
delete-wallpaper: "壁紙を削除"
|
||||||
dark-mode: "Nacht Modus"
|
dark-mode: "Nacht Modus"
|
||||||
circle-icons: "Kreisförmige Icons"
|
circle-icons: "Kreisförmige Icons"
|
||||||
|
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||||
gradient-window-header: "Übergang in Fensterköpfen"
|
gradient-window-header: "Übergang in Fensterköpfen"
|
||||||
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
||||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||||
@ -868,6 +869,7 @@ desktop/views/pages/welcome.vue:
|
|||||||
announcements: "お知らせ"
|
announcements: "お知らせ"
|
||||||
photos: "最近の画像"
|
photos: "最近の画像"
|
||||||
powered-by-misskey: "Powered by <b>Misskey</b>."
|
powered-by-misskey: "Powered by <b>Misskey</b>."
|
||||||
|
info: "情報"
|
||||||
desktop/views/pages/drive.vue:
|
desktop/views/pages/drive.vue:
|
||||||
title: "Misskey Drive"
|
title: "Misskey Drive"
|
||||||
desktop/views/pages/favorites.vue:
|
desktop/views/pages/favorites.vue:
|
||||||
@ -1155,6 +1157,7 @@ mobile/views/pages/settings.vue:
|
|||||||
dark-mode: "ダークモード"
|
dark-mode: "ダークモード"
|
||||||
i-am-under-limited-internet: "私は通信を制限されている"
|
i-am-under-limited-internet: "私は通信を制限されている"
|
||||||
circle-icons: "円形のアイコンを使用"
|
circle-icons: "円形のアイコンを使用"
|
||||||
|
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
show-reply-target: "リプライ先を表示する"
|
show-reply-target: "リプライ先を表示する"
|
||||||
show-my-renotes: "自分の行ったRenoteを表示する"
|
show-my-renotes: "自分の行ったRenoteを表示する"
|
||||||
@ -1187,7 +1190,7 @@ mobile/views/pages/settings.vue:
|
|||||||
settings: "設定"
|
settings: "設定"
|
||||||
signout: "サインアウト"
|
signout: "サインアウト"
|
||||||
sound: "サウンド"
|
sound: "サウンド"
|
||||||
enableSounds: "サウンドを有効にする"
|
enable-sounds: "サウンドを有効にする"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
follows-you: "フォローされています"
|
follows-you: "フォローされています"
|
||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
|
@ -651,6 +651,7 @@ desktop/views/components/settings.vue:
|
|||||||
delete-wallpaper: "Remove background"
|
delete-wallpaper: "Remove background"
|
||||||
dark-mode: "Dark Mode"
|
dark-mode: "Dark Mode"
|
||||||
circle-icons: "Use circle icons"
|
circle-icons: "Use circle icons"
|
||||||
|
contrasted-acct: "Add contrast to username"
|
||||||
gradient-window-header: "Use gradients on window headers"
|
gradient-window-header: "Use gradients on window headers"
|
||||||
post-form-on-timeline: "Display post form at the top of the timeline"
|
post-form-on-timeline: "Display post form at the top of the timeline"
|
||||||
suggest-recent-hashtags: "Show recent popular hashtags on the post form"
|
suggest-recent-hashtags: "Show recent popular hashtags on the post form"
|
||||||
@ -868,6 +869,7 @@ desktop/views/pages/welcome.vue:
|
|||||||
announcements: "Announcements"
|
announcements: "Announcements"
|
||||||
photos: "Recent uploaded"
|
photos: "Recent uploaded"
|
||||||
powered-by-misskey: "Powered by <b>Misskey</b>."
|
powered-by-misskey: "Powered by <b>Misskey</b>."
|
||||||
|
info: "Information"
|
||||||
desktop/views/pages/drive.vue:
|
desktop/views/pages/drive.vue:
|
||||||
title: "Misskey storage"
|
title: "Misskey storage"
|
||||||
desktop/views/pages/favorites.vue:
|
desktop/views/pages/favorites.vue:
|
||||||
@ -1155,6 +1157,7 @@ mobile/views/pages/settings.vue:
|
|||||||
dark-mode: "Dark Mode"
|
dark-mode: "Dark Mode"
|
||||||
i-am-under-limited-internet: "I'm in limited bandwidth"
|
i-am-under-limited-internet: "I'm in limited bandwidth"
|
||||||
circle-icons: "Use circle icons"
|
circle-icons: "Use circle icons"
|
||||||
|
contrasted-acct: "Add contrast to username"
|
||||||
timeline: "Timeline"
|
timeline: "Timeline"
|
||||||
show-reply-target: "Show reply target"
|
show-reply-target: "Show reply target"
|
||||||
show-my-renotes: "Show my reposts"
|
show-my-renotes: "Show my reposts"
|
||||||
@ -1187,7 +1190,7 @@ mobile/views/pages/settings.vue:
|
|||||||
settings: "Settings"
|
settings: "Settings"
|
||||||
signout: "Sign out"
|
signout: "Sign out"
|
||||||
sound: "Sounds"
|
sound: "Sounds"
|
||||||
enableSounds: "Enable sounds"
|
enable-sounds: "Enable sounds"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
follows-you: "Follows you"
|
follows-you: "Follows you"
|
||||||
following: "Following"
|
following: "Following"
|
||||||
|
@ -651,6 +651,7 @@ desktop/views/components/settings.vue:
|
|||||||
delete-wallpaper: "Suprimir fondo"
|
delete-wallpaper: "Suprimir fondo"
|
||||||
dark-mode: "Modo Nocturno"
|
dark-mode: "Modo Nocturno"
|
||||||
circle-icons: "Usar iconos circulares"
|
circle-icons: "Usar iconos circulares"
|
||||||
|
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||||
gradient-window-header: "Usar degradados en las cabeceras de las páginas"
|
gradient-window-header: "Usar degradados en las cabeceras de las páginas"
|
||||||
post-form-on-timeline: "Mostrar el formulario de las entradas encima de la línea de tiempo"
|
post-form-on-timeline: "Mostrar el formulario de las entradas encima de la línea de tiempo"
|
||||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||||
@ -868,6 +869,7 @@ desktop/views/pages/welcome.vue:
|
|||||||
announcements: "お知らせ"
|
announcements: "お知らせ"
|
||||||
photos: "最近の画像"
|
photos: "最近の画像"
|
||||||
powered-by-misskey: "Powered by <b>Misskey</b>."
|
powered-by-misskey: "Powered by <b>Misskey</b>."
|
||||||
|
info: "情報"
|
||||||
desktop/views/pages/drive.vue:
|
desktop/views/pages/drive.vue:
|
||||||
title: "Misskey Drive"
|
title: "Misskey Drive"
|
||||||
desktop/views/pages/favorites.vue:
|
desktop/views/pages/favorites.vue:
|
||||||
@ -1155,6 +1157,7 @@ mobile/views/pages/settings.vue:
|
|||||||
dark-mode: "ダークモード"
|
dark-mode: "ダークモード"
|
||||||
i-am-under-limited-internet: "私は通信を制限されている"
|
i-am-under-limited-internet: "私は通信を制限されている"
|
||||||
circle-icons: "円形のアイコンを使用"
|
circle-icons: "円形のアイコンを使用"
|
||||||
|
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
show-reply-target: "リプライ先を表示する"
|
show-reply-target: "リプライ先を表示する"
|
||||||
show-my-renotes: "自分の行ったRenoteを表示する"
|
show-my-renotes: "自分の行ったRenoteを表示する"
|
||||||
@ -1187,7 +1190,7 @@ mobile/views/pages/settings.vue:
|
|||||||
settings: "設定"
|
settings: "設定"
|
||||||
signout: "サインアウト"
|
signout: "サインアウト"
|
||||||
sound: "サウンド"
|
sound: "サウンド"
|
||||||
enableSounds: "サウンドを有効にする"
|
enable-sounds: "サウンドを有効にする"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
follows-you: "フォローされています"
|
follows-you: "フォローされています"
|
||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
|
@ -651,6 +651,7 @@ desktop/views/components/settings.vue:
|
|||||||
delete-wallpaper: "Supprimer le fond d'écran"
|
delete-wallpaper: "Supprimer le fond d'écran"
|
||||||
dark-mode: "Mode nuit"
|
dark-mode: "Mode nuit"
|
||||||
circle-icons: "Utiliser des icônes circulaires"
|
circle-icons: "Utiliser des icônes circulaires"
|
||||||
|
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||||
gradient-window-header: "Utiliser les dégradés sur la barre de titre de la fenêtre"
|
gradient-window-header: "Utiliser les dégradés sur la barre de titre de la fenêtre"
|
||||||
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
||||||
suggest-recent-hashtags: "Afficher les hashtags populaires dans le champs de saisie"
|
suggest-recent-hashtags: "Afficher les hashtags populaires dans le champs de saisie"
|
||||||
@ -868,6 +869,7 @@ desktop/views/pages/welcome.vue:
|
|||||||
announcements: "お知らせ"
|
announcements: "お知らせ"
|
||||||
photos: "最近の画像"
|
photos: "最近の画像"
|
||||||
powered-by-misskey: "Propulsé par <b>Misskey</b>."
|
powered-by-misskey: "Propulsé par <b>Misskey</b>."
|
||||||
|
info: "情報"
|
||||||
desktop/views/pages/drive.vue:
|
desktop/views/pages/drive.vue:
|
||||||
title: "Lecteur de Misskey"
|
title: "Lecteur de Misskey"
|
||||||
desktop/views/pages/favorites.vue:
|
desktop/views/pages/favorites.vue:
|
||||||
@ -1155,6 +1157,7 @@ mobile/views/pages/settings.vue:
|
|||||||
dark-mode: "Mode nuit"
|
dark-mode: "Mode nuit"
|
||||||
i-am-under-limited-internet: "J'ai un accès Internet limité"
|
i-am-under-limited-internet: "J'ai un accès Internet limité"
|
||||||
circle-icons: "Utiliser des icônes circulaires"
|
circle-icons: "Utiliser des icônes circulaires"
|
||||||
|
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||||
timeline: "Fil d'actualité"
|
timeline: "Fil d'actualité"
|
||||||
show-reply-target: "Afficher les réponses"
|
show-reply-target: "Afficher les réponses"
|
||||||
show-my-renotes: "Afficher mes republications"
|
show-my-renotes: "Afficher mes republications"
|
||||||
@ -1187,7 +1190,7 @@ mobile/views/pages/settings.vue:
|
|||||||
settings: "Réglages"
|
settings: "Réglages"
|
||||||
signout: "Déconnexion"
|
signout: "Déconnexion"
|
||||||
sound: "Sons"
|
sound: "Sons"
|
||||||
enableSounds: "Activer le son"
|
enable-sounds: "サウンドを有効にする"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
follows-you: "vous suit"
|
follows-you: "vous suit"
|
||||||
following: "Abonnements"
|
following: "Abonnements"
|
||||||
|
@ -651,6 +651,7 @@ desktop/views/components/settings.vue:
|
|||||||
delete-wallpaper: "壁紙を削除"
|
delete-wallpaper: "壁紙を削除"
|
||||||
dark-mode: "ダークモード"
|
dark-mode: "ダークモード"
|
||||||
circle-icons: "円形のアイコンを使用"
|
circle-icons: "円形のアイコンを使用"
|
||||||
|
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||||
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
||||||
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
||||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||||
@ -868,6 +869,7 @@ desktop/views/pages/welcome.vue:
|
|||||||
announcements: "お知らせ"
|
announcements: "お知らせ"
|
||||||
photos: "最近の画像"
|
photos: "最近の画像"
|
||||||
powered-by-misskey: "Powered by <b>Misskey</b>."
|
powered-by-misskey: "Powered by <b>Misskey</b>."
|
||||||
|
info: "情報"
|
||||||
desktop/views/pages/drive.vue:
|
desktop/views/pages/drive.vue:
|
||||||
title: "Misskey Drive"
|
title: "Misskey Drive"
|
||||||
desktop/views/pages/favorites.vue:
|
desktop/views/pages/favorites.vue:
|
||||||
@ -1155,6 +1157,7 @@ mobile/views/pages/settings.vue:
|
|||||||
dark-mode: "ダークモード"
|
dark-mode: "ダークモード"
|
||||||
i-am-under-limited-internet: "私は通信を制限されている"
|
i-am-under-limited-internet: "私は通信を制限されている"
|
||||||
circle-icons: "円形のアイコンを使用"
|
circle-icons: "円形のアイコンを使用"
|
||||||
|
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
show-reply-target: "リプライ先を表示する"
|
show-reply-target: "リプライ先を表示する"
|
||||||
show-my-renotes: "自分の行ったRenoteを表示する"
|
show-my-renotes: "自分の行ったRenoteを表示する"
|
||||||
@ -1187,7 +1190,7 @@ mobile/views/pages/settings.vue:
|
|||||||
settings: "設定"
|
settings: "設定"
|
||||||
signout: "サインアウト"
|
signout: "サインアウト"
|
||||||
sound: "サウンド"
|
sound: "サウンド"
|
||||||
enableSounds: "サウンドを有効にする"
|
enable-sounds: "サウンドを有効にする"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
follows-you: "フォローされています"
|
follows-you: "フォローされています"
|
||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
|
@ -6,6 +6,19 @@ common:
|
|||||||
misskey: "A ⭐ of fediverse"
|
misskey: "A ⭐ of fediverse"
|
||||||
about-title: "A ⭐ of fediverse."
|
about-title: "A ⭐ of fediverse."
|
||||||
about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。"
|
about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。"
|
||||||
|
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:
|
adblock:
|
||||||
detected: "広告ブロッカーを無効にしてください"
|
detected: "広告ブロッカーを無効にしてください"
|
||||||
warning: "<strong>Misskeyは広告を掲載していません</strong>が、広告をブロックする機能が有効だと一部の機能が利用できなかったり、不具合が発生する場合があります。"
|
warning: "<strong>Misskeyは広告を掲載していません</strong>が、広告をブロックする機能が有効だと一部の機能が利用できなかったり、不具合が発生する場合があります。"
|
||||||
@ -73,6 +86,16 @@ common:
|
|||||||
rip: "RIP"
|
rip: "RIP"
|
||||||
pudding: "Pudding"
|
pudding: "Pudding"
|
||||||
|
|
||||||
|
note-visibility:
|
||||||
|
public: "公開"
|
||||||
|
home: "ホーム"
|
||||||
|
home-desc: "ホームタイムラインにのみ公開"
|
||||||
|
followers: "フォロワー"
|
||||||
|
followers-desc: "自分のフォロワーにのみ公開"
|
||||||
|
specified: "ダイレクト"
|
||||||
|
specified-desc: "指定したユーザーにのみ公開"
|
||||||
|
private: "非公開"
|
||||||
|
|
||||||
note-placeholders:
|
note-placeholders:
|
||||||
a: "今どうしてる?"
|
a: "今どうしてる?"
|
||||||
b: "何かありましたか?"
|
b: "何かありましたか?"
|
||||||
@ -724,6 +747,9 @@ desktop/views/components/settings.vue:
|
|||||||
behaviour: "動作"
|
behaviour: "動作"
|
||||||
fetch-on-scroll: "スクロールで自動読み込み"
|
fetch-on-scroll: "スクロールで自動読み込み"
|
||||||
fetch-on-scroll-desc: "ページを下までスクロールしたときに自動で追加のコンテンツを読み込みます。"
|
fetch-on-scroll-desc: "ページを下までスクロールしたときに自動で追加のコンテンツを読み込みます。"
|
||||||
|
note-visibility: "投稿の公開範囲"
|
||||||
|
default-note-visibility: "デフォルトの公開範囲"
|
||||||
|
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||||
auto-popout: "ウィンドウの自動ポップアウト"
|
auto-popout: "ウィンドウの自動ポップアウト"
|
||||||
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
||||||
advanced: "詳細設定"
|
advanced: "詳細設定"
|
||||||
@ -736,6 +762,7 @@ desktop/views/components/settings.vue:
|
|||||||
delete-wallpaper: "壁紙を削除"
|
delete-wallpaper: "壁紙を削除"
|
||||||
dark-mode: "ダークモード"
|
dark-mode: "ダークモード"
|
||||||
circle-icons: "円形のアイコンを使用"
|
circle-icons: "円形のアイコンを使用"
|
||||||
|
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||||
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
||||||
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
||||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||||
@ -993,6 +1020,7 @@ desktop/views/pages/welcome.vue:
|
|||||||
announcements: "お知らせ"
|
announcements: "お知らせ"
|
||||||
photos: "最近の画像"
|
photos: "最近の画像"
|
||||||
powered-by-misskey: "Powered by <b>Misskey</b>."
|
powered-by-misskey: "Powered by <b>Misskey</b>."
|
||||||
|
info: "情報"
|
||||||
|
|
||||||
desktop/views/pages/drive.vue:
|
desktop/views/pages/drive.vue:
|
||||||
title: "Misskey Drive"
|
title: "Misskey Drive"
|
||||||
@ -1349,6 +1377,7 @@ mobile/views/pages/settings.vue:
|
|||||||
dark-mode: "ダークモード"
|
dark-mode: "ダークモード"
|
||||||
i-am-under-limited-internet: "私は通信を制限されている"
|
i-am-under-limited-internet: "私は通信を制限されている"
|
||||||
circle-icons: "円形のアイコンを使用"
|
circle-icons: "円形のアイコンを使用"
|
||||||
|
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
show-reply-target: "リプライ先を表示する"
|
show-reply-target: "リプライ先を表示する"
|
||||||
show-my-renotes: "自分の行ったRenoteを表示する"
|
show-my-renotes: "自分の行ったRenoteを表示する"
|
||||||
@ -1362,6 +1391,9 @@ mobile/views/pages/settings.vue:
|
|||||||
notification-position-top: "上"
|
notification-position-top: "上"
|
||||||
behavior: "動作"
|
behavior: "動作"
|
||||||
fetch-on-scroll: "スクロールで自動読み込み"
|
fetch-on-scroll: "スクロールで自動読み込み"
|
||||||
|
note-visibility: "投稿の公開範囲"
|
||||||
|
default-note-visibility: "デフォルトの公開範囲"
|
||||||
|
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||||
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
|
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
|
||||||
load-raw-images: "添付された画像を高画質で表示する"
|
load-raw-images: "添付された画像を高画質で表示する"
|
||||||
load-remote-media: "リモートサーバーのメディアを表示する"
|
load-remote-media: "リモートサーバーのメディアを表示する"
|
||||||
@ -1381,7 +1413,7 @@ mobile/views/pages/settings.vue:
|
|||||||
settings: "設定"
|
settings: "設定"
|
||||||
signout: "サインアウト"
|
signout: "サインアウト"
|
||||||
sound: "サウンド"
|
sound: "サウンド"
|
||||||
enableSounds: "サウンドを有効にする"
|
enable-sounds: "サウンドを有効にする"
|
||||||
|
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
follows-you: "フォローされています"
|
follows-you: "フォローされています"
|
||||||
|
@ -651,6 +651,7 @@ desktop/views/components/settings.vue:
|
|||||||
delete-wallpaper: "壁紙を削除"
|
delete-wallpaper: "壁紙を削除"
|
||||||
dark-mode: "ダークモード"
|
dark-mode: "ダークモード"
|
||||||
circle-icons: "円形のアイコンを使用"
|
circle-icons: "円形のアイコンを使用"
|
||||||
|
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||||
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
||||||
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
||||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||||
@ -868,6 +869,7 @@ desktop/views/pages/welcome.vue:
|
|||||||
announcements: "お知らせ"
|
announcements: "お知らせ"
|
||||||
photos: "最近の画像"
|
photos: "最近の画像"
|
||||||
powered-by-misskey: "Powered by <b>Misskey</b>."
|
powered-by-misskey: "Powered by <b>Misskey</b>."
|
||||||
|
info: "情報"
|
||||||
desktop/views/pages/drive.vue:
|
desktop/views/pages/drive.vue:
|
||||||
title: "ドライブ"
|
title: "ドライブ"
|
||||||
desktop/views/pages/favorites.vue:
|
desktop/views/pages/favorites.vue:
|
||||||
@ -1155,6 +1157,7 @@ mobile/views/pages/settings.vue:
|
|||||||
dark-mode: "ダークモード"
|
dark-mode: "ダークモード"
|
||||||
i-am-under-limited-internet: "私は通信を制限されている"
|
i-am-under-limited-internet: "私は通信を制限されている"
|
||||||
circle-icons: "円形のアイコンを使用"
|
circle-icons: "円形のアイコンを使用"
|
||||||
|
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
show-reply-target: "リプライ先を表示する"
|
show-reply-target: "リプライ先を表示する"
|
||||||
show-my-renotes: "自分の行ったRenoteを表示する"
|
show-my-renotes: "自分の行ったRenoteを表示する"
|
||||||
@ -1187,7 +1190,7 @@ mobile/views/pages/settings.vue:
|
|||||||
settings: "設定"
|
settings: "設定"
|
||||||
signout: "サインアウト"
|
signout: "サインアウト"
|
||||||
sound: "サウンド"
|
sound: "サウンド"
|
||||||
enableSounds: "サウンドを有効にする"
|
enable-sounds: "サウンドを有効にする"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
follows-you: "フォローされています"
|
follows-you: "フォローされています"
|
||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
|
@ -651,6 +651,7 @@ desktop/views/components/settings.vue:
|
|||||||
delete-wallpaper: "壁紙を削除"
|
delete-wallpaper: "壁紙を削除"
|
||||||
dark-mode: "ダークモード"
|
dark-mode: "ダークモード"
|
||||||
circle-icons: "円形のアイコンを使用"
|
circle-icons: "円形のアイコンを使用"
|
||||||
|
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||||
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
||||||
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
||||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||||
@ -868,6 +869,7 @@ desktop/views/pages/welcome.vue:
|
|||||||
announcements: "お知らせ"
|
announcements: "お知らせ"
|
||||||
photos: "最近の画像"
|
photos: "最近の画像"
|
||||||
powered-by-misskey: "Powered by <b>Misskey</b>."
|
powered-by-misskey: "Powered by <b>Misskey</b>."
|
||||||
|
info: "情報"
|
||||||
desktop/views/pages/drive.vue:
|
desktop/views/pages/drive.vue:
|
||||||
title: "Misskey Drive"
|
title: "Misskey Drive"
|
||||||
desktop/views/pages/favorites.vue:
|
desktop/views/pages/favorites.vue:
|
||||||
@ -1155,6 +1157,7 @@ mobile/views/pages/settings.vue:
|
|||||||
dark-mode: "ダークモード"
|
dark-mode: "ダークモード"
|
||||||
i-am-under-limited-internet: "私は通信を制限されている"
|
i-am-under-limited-internet: "私は通信を制限されている"
|
||||||
circle-icons: "円形のアイコンを使用"
|
circle-icons: "円形のアイコンを使用"
|
||||||
|
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
show-reply-target: "リプライ先を表示する"
|
show-reply-target: "リプライ先を表示する"
|
||||||
show-my-renotes: "自分の行ったRenoteを表示する"
|
show-my-renotes: "自分の行ったRenoteを表示する"
|
||||||
@ -1187,7 +1190,7 @@ mobile/views/pages/settings.vue:
|
|||||||
settings: "設定"
|
settings: "設定"
|
||||||
signout: "サインアウト"
|
signout: "サインアウト"
|
||||||
sound: "サウンド"
|
sound: "サウンド"
|
||||||
enableSounds: "サウンドを有効にする"
|
enable-sounds: "サウンドを有効にする"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
follows-you: "フォローされています"
|
follows-you: "フォローされています"
|
||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
|
@ -651,6 +651,7 @@ desktop/views/components/settings.vue:
|
|||||||
delete-wallpaper: "壁紙を削除"
|
delete-wallpaper: "壁紙を削除"
|
||||||
dark-mode: "Donkere modus"
|
dark-mode: "Donkere modus"
|
||||||
circle-icons: "Ronde pictogrammen gebruiken"
|
circle-icons: "Ronde pictogrammen gebruiken"
|
||||||
|
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||||
gradient-window-header: "Kleurverloop gebruiken op vensterkoppen"
|
gradient-window-header: "Kleurverloop gebruiken op vensterkoppen"
|
||||||
post-form-on-timeline: "Berichtformulier boven de tijdlijn tonen"
|
post-form-on-timeline: "Berichtformulier boven de tijdlijn tonen"
|
||||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||||
@ -868,6 +869,7 @@ desktop/views/pages/welcome.vue:
|
|||||||
announcements: "お知らせ"
|
announcements: "お知らせ"
|
||||||
photos: "最近の画像"
|
photos: "最近の画像"
|
||||||
powered-by-misskey: "Powered by <b>Misskey</b>."
|
powered-by-misskey: "Powered by <b>Misskey</b>."
|
||||||
|
info: "情報"
|
||||||
desktop/views/pages/drive.vue:
|
desktop/views/pages/drive.vue:
|
||||||
title: "Misskey Drive"
|
title: "Misskey Drive"
|
||||||
desktop/views/pages/favorites.vue:
|
desktop/views/pages/favorites.vue:
|
||||||
@ -1155,6 +1157,7 @@ mobile/views/pages/settings.vue:
|
|||||||
dark-mode: "Donkere modus"
|
dark-mode: "Donkere modus"
|
||||||
i-am-under-limited-internet: "Ik heb beperkt internet"
|
i-am-under-limited-internet: "Ik heb beperkt internet"
|
||||||
circle-icons: "Ronde pictogrammen gebruiken"
|
circle-icons: "Ronde pictogrammen gebruiken"
|
||||||
|
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||||
timeline: "Tijdlijn"
|
timeline: "Tijdlijn"
|
||||||
show-reply-target: "Antwoordknop tonen"
|
show-reply-target: "Antwoordknop tonen"
|
||||||
show-my-renotes: "Mijn renotes tonen"
|
show-my-renotes: "Mijn renotes tonen"
|
||||||
@ -1187,7 +1190,7 @@ mobile/views/pages/settings.vue:
|
|||||||
settings: "Instellingen"
|
settings: "Instellingen"
|
||||||
signout: "Uitloggen"
|
signout: "Uitloggen"
|
||||||
sound: "サウンド"
|
sound: "サウンド"
|
||||||
enableSounds: "サウンドを有効にする"
|
enable-sounds: "サウンドを有効にする"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
follows-you: "Volgt jou"
|
follows-you: "Volgt jou"
|
||||||
following: "Volgend"
|
following: "Volgend"
|
||||||
|
@ -651,6 +651,7 @@ desktop/views/components/settings.vue:
|
|||||||
delete-wallpaper: "壁紙を削除"
|
delete-wallpaper: "壁紙を削除"
|
||||||
dark-mode: "ダークモード"
|
dark-mode: "ダークモード"
|
||||||
circle-icons: "円形のアイコンを使用"
|
circle-icons: "円形のアイコンを使用"
|
||||||
|
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||||
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
||||||
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
||||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||||
@ -868,6 +869,7 @@ desktop/views/pages/welcome.vue:
|
|||||||
announcements: "お知らせ"
|
announcements: "お知らせ"
|
||||||
photos: "最近の画像"
|
photos: "最近の画像"
|
||||||
powered-by-misskey: "Powered by <b>Misskey</b>."
|
powered-by-misskey: "Powered by <b>Misskey</b>."
|
||||||
|
info: "情報"
|
||||||
desktop/views/pages/drive.vue:
|
desktop/views/pages/drive.vue:
|
||||||
title: "Misskey Drive"
|
title: "Misskey Drive"
|
||||||
desktop/views/pages/favorites.vue:
|
desktop/views/pages/favorites.vue:
|
||||||
@ -1155,6 +1157,7 @@ mobile/views/pages/settings.vue:
|
|||||||
dark-mode: "ダークモード"
|
dark-mode: "ダークモード"
|
||||||
i-am-under-limited-internet: "私は通信を制限されている"
|
i-am-under-limited-internet: "私は通信を制限されている"
|
||||||
circle-icons: "円形のアイコンを使用"
|
circle-icons: "円形のアイコンを使用"
|
||||||
|
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
show-reply-target: "リプライ先を表示する"
|
show-reply-target: "リプライ先を表示する"
|
||||||
show-my-renotes: "自分の行ったRenoteを表示する"
|
show-my-renotes: "自分の行ったRenoteを表示する"
|
||||||
@ -1187,7 +1190,7 @@ mobile/views/pages/settings.vue:
|
|||||||
settings: "設定"
|
settings: "設定"
|
||||||
signout: "サインアウト"
|
signout: "サインアウト"
|
||||||
sound: "サウンド"
|
sound: "サウンド"
|
||||||
enableSounds: "サウンドを有効にする"
|
enable-sounds: "サウンドを有効にする"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
follows-you: "フォローされています"
|
follows-you: "フォローされています"
|
||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
|
@ -651,6 +651,7 @@ desktop/views/components/settings.vue:
|
|||||||
delete-wallpaper: "Usuń tło"
|
delete-wallpaper: "Usuń tło"
|
||||||
dark-mode: "Tryb ciemny"
|
dark-mode: "Tryb ciemny"
|
||||||
circle-icons: "Używaj okrągłych ikon"
|
circle-icons: "Używaj okrągłych ikon"
|
||||||
|
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||||
gradient-window-header: "Używaj gradientów na pasku tytułu okna"
|
gradient-window-header: "Używaj gradientów na pasku tytułu okna"
|
||||||
post-form-on-timeline: "Wyświetlaj formularz tworzenia wpisu w górnej części osi czasu"
|
post-form-on-timeline: "Wyświetlaj formularz tworzenia wpisu w górnej części osi czasu"
|
||||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||||
@ -868,6 +869,7 @@ desktop/views/pages/welcome.vue:
|
|||||||
announcements: "お知らせ"
|
announcements: "お知らせ"
|
||||||
photos: "最近の画像"
|
photos: "最近の画像"
|
||||||
powered-by-misskey: "Oparto o <b>Misskey</b>."
|
powered-by-misskey: "Oparto o <b>Misskey</b>."
|
||||||
|
info: "情報"
|
||||||
desktop/views/pages/drive.vue:
|
desktop/views/pages/drive.vue:
|
||||||
title: "Dysk Misskey"
|
title: "Dysk Misskey"
|
||||||
desktop/views/pages/favorites.vue:
|
desktop/views/pages/favorites.vue:
|
||||||
@ -1155,6 +1157,7 @@ mobile/views/pages/settings.vue:
|
|||||||
dark-mode: "Tryb ciemny"
|
dark-mode: "Tryb ciemny"
|
||||||
i-am-under-limited-internet: "Ograniczaj zużycie transferu"
|
i-am-under-limited-internet: "Ograniczaj zużycie transferu"
|
||||||
circle-icons: "Używaj okrągłych ikon"
|
circle-icons: "Używaj okrągłych ikon"
|
||||||
|
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||||
timeline: "Oś czasu"
|
timeline: "Oś czasu"
|
||||||
show-reply-target: "Pokazuj cel odpowiedzi"
|
show-reply-target: "Pokazuj cel odpowiedzi"
|
||||||
show-my-renotes: "Pokazuj moje udostępnienia"
|
show-my-renotes: "Pokazuj moje udostępnienia"
|
||||||
@ -1187,7 +1190,7 @@ mobile/views/pages/settings.vue:
|
|||||||
settings: "Ustawienia"
|
settings: "Ustawienia"
|
||||||
signout: "Wyloguj"
|
signout: "Wyloguj"
|
||||||
sound: "サウンド"
|
sound: "サウンド"
|
||||||
enableSounds: "サウンドを有効にする"
|
enable-sounds: "サウンドを有効にする"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
follows-you: "Śledzi Cię"
|
follows-you: "Śledzi Cię"
|
||||||
following: "Śledzeni"
|
following: "Śledzeni"
|
||||||
|
@ -651,6 +651,7 @@ desktop/views/components/settings.vue:
|
|||||||
delete-wallpaper: "壁紙を削除"
|
delete-wallpaper: "壁紙を削除"
|
||||||
dark-mode: "ダークモード"
|
dark-mode: "ダークモード"
|
||||||
circle-icons: "円形のアイコンを使用"
|
circle-icons: "円形のアイコンを使用"
|
||||||
|
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||||
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
||||||
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
||||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||||
@ -868,6 +869,7 @@ desktop/views/pages/welcome.vue:
|
|||||||
announcements: "お知らせ"
|
announcements: "お知らせ"
|
||||||
photos: "最近の画像"
|
photos: "最近の画像"
|
||||||
powered-by-misskey: "Desenvolvido por <b>Misskey</b>."
|
powered-by-misskey: "Desenvolvido por <b>Misskey</b>."
|
||||||
|
info: "情報"
|
||||||
desktop/views/pages/drive.vue:
|
desktop/views/pages/drive.vue:
|
||||||
title: "Drive Misskey"
|
title: "Drive Misskey"
|
||||||
desktop/views/pages/favorites.vue:
|
desktop/views/pages/favorites.vue:
|
||||||
@ -1155,6 +1157,7 @@ mobile/views/pages/settings.vue:
|
|||||||
dark-mode: "ダークモード"
|
dark-mode: "ダークモード"
|
||||||
i-am-under-limited-internet: "私は通信を制限されている"
|
i-am-under-limited-internet: "私は通信を制限されている"
|
||||||
circle-icons: "円形のアイコンを使用"
|
circle-icons: "円形のアイコンを使用"
|
||||||
|
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
show-reply-target: "リプライ先を表示する"
|
show-reply-target: "リプライ先を表示する"
|
||||||
show-my-renotes: "自分の行ったRenoteを表示する"
|
show-my-renotes: "自分の行ったRenoteを表示する"
|
||||||
@ -1187,7 +1190,7 @@ mobile/views/pages/settings.vue:
|
|||||||
settings: "設定"
|
settings: "設定"
|
||||||
signout: "サインアウト"
|
signout: "サインアウト"
|
||||||
sound: "サウンド"
|
sound: "サウンド"
|
||||||
enableSounds: "サウンドを有効にする"
|
enable-sounds: "サウンドを有効にする"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
follows-you: "フォローされています"
|
follows-you: "フォローされています"
|
||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
|
@ -651,6 +651,7 @@ desktop/views/components/settings.vue:
|
|||||||
delete-wallpaper: "壁紙を削除"
|
delete-wallpaper: "壁紙を削除"
|
||||||
dark-mode: "ダークモード"
|
dark-mode: "ダークモード"
|
||||||
circle-icons: "円形のアイコンを使用"
|
circle-icons: "円形のアイコンを使用"
|
||||||
|
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||||
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
||||||
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
||||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||||
@ -868,6 +869,7 @@ desktop/views/pages/welcome.vue:
|
|||||||
announcements: "お知らせ"
|
announcements: "お知らせ"
|
||||||
photos: "最近の画像"
|
photos: "最近の画像"
|
||||||
powered-by-misskey: "Powered by <b>Misskey</b>."
|
powered-by-misskey: "Powered by <b>Misskey</b>."
|
||||||
|
info: "情報"
|
||||||
desktop/views/pages/drive.vue:
|
desktop/views/pages/drive.vue:
|
||||||
title: "Misskey Drive"
|
title: "Misskey Drive"
|
||||||
desktop/views/pages/favorites.vue:
|
desktop/views/pages/favorites.vue:
|
||||||
@ -1155,6 +1157,7 @@ mobile/views/pages/settings.vue:
|
|||||||
dark-mode: "ダークモード"
|
dark-mode: "ダークモード"
|
||||||
i-am-under-limited-internet: "私は通信を制限されている"
|
i-am-under-limited-internet: "私は通信を制限されている"
|
||||||
circle-icons: "円形のアイコンを使用"
|
circle-icons: "円形のアイコンを使用"
|
||||||
|
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
show-reply-target: "リプライ先を表示する"
|
show-reply-target: "リプライ先を表示する"
|
||||||
show-my-renotes: "自分の行ったRenoteを表示する"
|
show-my-renotes: "自分の行ったRenoteを表示する"
|
||||||
@ -1187,7 +1190,7 @@ mobile/views/pages/settings.vue:
|
|||||||
settings: "設定"
|
settings: "設定"
|
||||||
signout: "サインアウト"
|
signout: "サインアウト"
|
||||||
sound: "サウンド"
|
sound: "サウンド"
|
||||||
enableSounds: "サウンドを有効にする"
|
enable-sounds: "サウンドを有効にする"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
follows-you: "フォローされています"
|
follows-you: "フォローされています"
|
||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
|
@ -651,6 +651,7 @@ desktop/views/components/settings.vue:
|
|||||||
delete-wallpaper: "壁紙を削除"
|
delete-wallpaper: "壁紙を削除"
|
||||||
dark-mode: "ダークモード"
|
dark-mode: "ダークモード"
|
||||||
circle-icons: "円形のアイコンを使用"
|
circle-icons: "円形のアイコンを使用"
|
||||||
|
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||||
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
|
||||||
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
|
||||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||||
@ -868,6 +869,7 @@ desktop/views/pages/welcome.vue:
|
|||||||
announcements: "お知らせ"
|
announcements: "お知らせ"
|
||||||
photos: "最近の画像"
|
photos: "最近の画像"
|
||||||
powered-by-misskey: "Powered by <b>Misskey</b>."
|
powered-by-misskey: "Powered by <b>Misskey</b>."
|
||||||
|
info: "情報"
|
||||||
desktop/views/pages/drive.vue:
|
desktop/views/pages/drive.vue:
|
||||||
title: "Misskey Drive"
|
title: "Misskey Drive"
|
||||||
desktop/views/pages/favorites.vue:
|
desktop/views/pages/favorites.vue:
|
||||||
@ -1155,6 +1157,7 @@ mobile/views/pages/settings.vue:
|
|||||||
dark-mode: "ダークモード"
|
dark-mode: "ダークモード"
|
||||||
i-am-under-limited-internet: "私は通信を制限されている"
|
i-am-under-limited-internet: "私は通信を制限されている"
|
||||||
circle-icons: "円形のアイコンを使用"
|
circle-icons: "円形のアイコンを使用"
|
||||||
|
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
show-reply-target: "リプライ先を表示する"
|
show-reply-target: "リプライ先を表示する"
|
||||||
show-my-renotes: "自分の行ったRenoteを表示する"
|
show-my-renotes: "自分の行ったRenoteを表示する"
|
||||||
@ -1187,7 +1190,7 @@ mobile/views/pages/settings.vue:
|
|||||||
settings: "設定"
|
settings: "設定"
|
||||||
signout: "サインアウト"
|
signout: "サインアウト"
|
||||||
sound: "サウンド"
|
sound: "サウンド"
|
||||||
enableSounds: "サウンドを有効にする"
|
enable-sounds: "サウンドを有効にする"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
follows-you: "フォローされています"
|
follows-you: "フォローされています"
|
||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"name": "misskey",
|
"name": "misskey",
|
||||||
"author": "syuilo <i@syuilo.com>",
|
"author": "syuilo <i@syuilo.com>",
|
||||||
"version": "8.28.1",
|
"version": "8.33.1",
|
||||||
"clientVersion": "1.0.9400",
|
"clientVersion": "1.0.9497",
|
||||||
"codename": "nighthike",
|
"codename": "nighthike",
|
||||||
"main": "./built/index.js",
|
"main": "./built/index.js",
|
||||||
"private": true,
|
"private": true,
|
||||||
@ -151,7 +151,7 @@
|
|||||||
"lodash.assign": "4.2.0",
|
"lodash.assign": "4.2.0",
|
||||||
"mecab-async": "0.1.2",
|
"mecab-async": "0.1.2",
|
||||||
"merge-options": "1.0.1",
|
"merge-options": "1.0.1",
|
||||||
"minio": "7.0.0",
|
"minio": "7.0.1",
|
||||||
"mkdirp": "0.5.1",
|
"mkdirp": "0.5.1",
|
||||||
"mocha": "5.2.0",
|
"mocha": "5.2.0",
|
||||||
"moji": "0.5.1",
|
"moji": "0.5.1",
|
||||||
@ -217,6 +217,7 @@
|
|||||||
"vue-style-loader": "4.1.2",
|
"vue-style-loader": "4.1.2",
|
||||||
"vue-template-compiler": "2.5.17",
|
"vue-template-compiler": "2.5.17",
|
||||||
"vuedraggable": "2.16.0",
|
"vuedraggable": "2.16.0",
|
||||||
|
"vuewordcloud": "18.7.11",
|
||||||
"vuex": "3.0.1",
|
"vuex": "3.0.1",
|
||||||
"vuex-persistedstate": "2.5.4",
|
"vuex-persistedstate": "2.5.4",
|
||||||
"web-push": "3.3.2",
|
"web-push": "3.3.2",
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<span class="mk-acct">
|
<span class="mk-acct">
|
||||||
<span class="name">@{{ user.username }}</span>
|
<span class="name">@{{ user.username }}</span>
|
||||||
<span class="host" v-if="user.host || detail">@{{ user.host || host }}</span>
|
<span class="host" :class="{ fade: $store.state.settings.contrastedAcct }" v-if="user.host || detail">@{{ user.host || host }}</span>
|
||||||
</span>
|
</span>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -20,6 +20,6 @@ export default Vue.extend({
|
|||||||
|
|
||||||
<style lang="stylus" scoped>
|
<style lang="stylus" scoped>
|
||||||
.mk-acct
|
.mk-acct
|
||||||
> .host
|
> .host.fade
|
||||||
opacity 0.5
|
opacity 0.5
|
||||||
</style>
|
</style>
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
|
|
||||||
|
import tagCloud from './tag-cloud.vue';
|
||||||
import trends from './trends.vue';
|
import trends from './trends.vue';
|
||||||
import analogClock from './analog-clock.vue';
|
import analogClock from './analog-clock.vue';
|
||||||
import menu from './menu.vue';
|
import menu from './menu.vue';
|
||||||
@ -41,6 +42,7 @@ import uiSelect from './ui/select.vue';
|
|||||||
import formButton from './ui/form/button.vue';
|
import formButton from './ui/form/button.vue';
|
||||||
import formRadio from './ui/form/radio.vue';
|
import formRadio from './ui/form/radio.vue';
|
||||||
|
|
||||||
|
Vue.component('mk-tag-cloud', tagCloud);
|
||||||
Vue.component('mk-trends', trends);
|
Vue.component('mk-trends', trends);
|
||||||
Vue.component('mk-analog-clock', analogClock);
|
Vue.component('mk-analog-clock', analogClock);
|
||||||
Vue.component('mk-menu', menu);
|
Vue.component('mk-menu', menu);
|
||||||
|
@ -1,17 +1,17 @@
|
|||||||
<template>
|
<template>
|
||||||
<span class="mk-reaction-icon">
|
<span class="mk-reaction-icon">
|
||||||
<img v-if="reaction == 'like'" src="/assets/reactions/like.png" alt="%i18n:common.reactions.like%">
|
<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="/assets/reactions/love.png" alt="%i18n:common.reactions.love%">
|
<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="/assets/reactions/laugh.png" alt="%i18n:common.reactions.laugh%">
|
<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="/assets/reactions/hmm.png" alt="%i18n:common.reactions.hmm%">
|
<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="/assets/reactions/surprise.png" alt="%i18n:common.reactions.surprise%">
|
<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="/assets/reactions/congrats.png" alt="%i18n:common.reactions.congrats%">
|
<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="/assets/reactions/angry.png" alt="%i18n:common.reactions.angry%">
|
<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="/assets/reactions/confused.png" alt="%i18n:common.reactions.confused%">
|
<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="/assets/reactions/rip.png" alt="%i18n:common.reactions.rip%">
|
<img v-if="reaction == 'rip'" src="https://twemoji.maxcdn.com/2/svg/1f607.svg" alt="%i18n:common.reactions.rip%">
|
||||||
<template v-if="reaction == 'pudding'">
|
<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-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="/assets/reactions/pudding.png" alt="%i18n:common.reactions.pudding%">
|
<img v-else src="https://twemoji.maxcdn.com/2/svg/1f36e.svg" alt="%i18n:common.reactions.pudding%">
|
||||||
</template>
|
</template>
|
||||||
</span>
|
</span>
|
||||||
</template>
|
</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>
|
@ -14,7 +14,7 @@
|
|||||||
<header>
|
<header>
|
||||||
<h1>{{ title }}</h1>
|
<h1>{{ title }}</h1>
|
||||||
</header>
|
</header>
|
||||||
<p>{{ description }}</p>
|
<p>{{ description.length > 85 ? description.slice(0, 85) + '…' : description }}</p>
|
||||||
<footer>
|
<footer>
|
||||||
<img class="icon" v-if="icon" :src="icon"/>
|
<img class="icon" v-if="icon" :src="icon"/>
|
||||||
<p>{{ sitename }}</p>
|
<p>{{ sitename }}</p>
|
||||||
|
@ -47,7 +47,7 @@ export default Vue.extend({
|
|||||||
props: ['source', 'compact'],
|
props: ['source', 'compact'],
|
||||||
data() {
|
data() {
|
||||||
return {
|
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() {
|
mounted() {
|
||||||
@ -97,7 +97,9 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
choose(visibility) {
|
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.$emit('chosen', visibility);
|
||||||
this.$destroy();
|
this.$destroy();
|
||||||
},
|
},
|
||||||
|
@ -1,22 +1,24 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mk-welcome-timeline">
|
<div class="mk-welcome-timeline">
|
||||||
<div v-for="note in notes">
|
<transition-group name="ldzpakcixzickvggyixyrhqwjaefknon" tag="div">
|
||||||
<mk-avatar class="avatar" :user="note.user" target="_blank"/>
|
<div v-for="note in notes" :key="note.id">
|
||||||
<div class="body">
|
<mk-avatar class="avatar" :user="note.user" target="_blank"/>
|
||||||
<header>
|
<div class="body">
|
||||||
<router-link class="name" :to="note.user | userPage" v-user-preview="note.user.id">{{ note.user | userName }}</router-link>
|
<header>
|
||||||
<span class="username">@{{ note.user | acct }}</span>
|
<router-link class="name" :to="note.user | userPage" v-user-preview="note.user.id">{{ note.user | userName }}</router-link>
|
||||||
<div class="info">
|
<span class="username">@{{ note.user | acct }}</span>
|
||||||
<router-link class="created-at" :to="note | notePage">
|
<div class="info">
|
||||||
<mk-time :time="note.createdAt"/>
|
<router-link class="created-at" :to="note | notePage">
|
||||||
</router-link>
|
<mk-time :time="note.createdAt"/>
|
||||||
|
</router-link>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<div class="text">
|
||||||
|
<misskey-flavored-markdown v-if="note.text" :text="note.text"/>
|
||||||
</div>
|
</div>
|
||||||
</header>
|
|
||||||
<div class="text">
|
|
||||||
<misskey-flavored-markdown v-if="note.text" :text="note.text"/>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</transition-group>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -83,64 +85,73 @@ export default Vue.extend({
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="stylus" scoped>
|
<style lang="stylus" scoped>
|
||||||
|
.ldzpakcixzickvggyixyrhqwjaefknon-enter
|
||||||
|
.ldzpakcixzickvggyixyrhqwjaefknon-leave-to
|
||||||
|
opacity 0
|
||||||
|
transform translateY(-30px)
|
||||||
|
|
||||||
root(isDark)
|
root(isDark)
|
||||||
background isDark ? #282C37 : #fff
|
background isDark ? #282C37 : #fff
|
||||||
|
|
||||||
> div
|
> div
|
||||||
padding 16px
|
> *
|
||||||
overflow-wrap break-word
|
transition transform .3s ease, opacity .3s ease
|
||||||
font-size .9em
|
|
||||||
color isDark ? #fff : #4C4C4C
|
|
||||||
border-bottom 1px solid isDark ? rgba(#000, 0.1) : rgba(#000, 0.05)
|
|
||||||
|
|
||||||
&:after
|
> div
|
||||||
content ""
|
padding 16px
|
||||||
display block
|
overflow-wrap break-word
|
||||||
clear both
|
font-size .9em
|
||||||
|
color isDark ? #fff : #4C4C4C
|
||||||
|
border-bottom 1px solid isDark ? rgba(#000, 0.1) : rgba(#000, 0.05)
|
||||||
|
|
||||||
> .avatar
|
&:after
|
||||||
display block
|
content ""
|
||||||
float left
|
display block
|
||||||
position -webkit-sticky
|
clear both
|
||||||
position sticky
|
|
||||||
top 16px
|
|
||||||
width 42px
|
|
||||||
height 42px
|
|
||||||
border-radius 6px
|
|
||||||
|
|
||||||
> .body
|
> .avatar
|
||||||
float right
|
display block
|
||||||
width calc(100% - 42px)
|
float left
|
||||||
padding-left 12px
|
position -webkit-sticky
|
||||||
|
position sticky
|
||||||
|
top 16px
|
||||||
|
width 42px
|
||||||
|
height 42px
|
||||||
|
border-radius 6px
|
||||||
|
|
||||||
> header
|
> .body
|
||||||
display flex
|
float right
|
||||||
align-items center
|
width calc(100% - 42px)
|
||||||
margin-bottom 4px
|
padding-left 12px
|
||||||
white-space nowrap
|
|
||||||
|
|
||||||
> .name
|
> header
|
||||||
display block
|
display flex
|
||||||
margin 0 .5em 0 0
|
align-items center
|
||||||
padding 0
|
margin-bottom 4px
|
||||||
overflow hidden
|
white-space nowrap
|
||||||
font-weight bold
|
|
||||||
text-overflow ellipsis
|
|
||||||
color isDark ? #fff : #627079
|
|
||||||
|
|
||||||
> .username
|
> .name
|
||||||
margin 0 .5em 0 0
|
display block
|
||||||
color isDark ? #606984 : #ccc
|
margin 0 .5em 0 0
|
||||||
|
padding 0
|
||||||
|
overflow hidden
|
||||||
|
font-weight bold
|
||||||
|
text-overflow ellipsis
|
||||||
|
color isDark ? #fff : #627079
|
||||||
|
|
||||||
> .info
|
> .username
|
||||||
margin-left auto
|
margin 0 .5em 0 0
|
||||||
font-size 0.9em
|
color isDark ? #606984 : #ccc
|
||||||
|
|
||||||
> .created-at
|
> .info
|
||||||
color isDark ? #606984 : #c0c0c0
|
margin-left auto
|
||||||
|
font-size 0.9em
|
||||||
|
|
||||||
> .text
|
> .created-at
|
||||||
text-align left
|
color isDark ? #606984 : #c0c0c0
|
||||||
|
|
||||||
|
> .text
|
||||||
|
text-align left
|
||||||
|
|
||||||
.mk-welcome-timeline[data-darkmode]
|
.mk-welcome-timeline[data-darkmode]
|
||||||
root(true)
|
root(true)
|
||||||
|
@ -126,7 +126,7 @@ root(isDark)
|
|||||||
margin 0
|
margin 0
|
||||||
font-size 0.95em
|
font-size 0.95em
|
||||||
font-weight normal
|
font-weight normal
|
||||||
color #4078c0
|
color isDark ? #539eff : #4078c0
|
||||||
|
|
||||||
> p
|
> p
|
||||||
display block
|
display block
|
||||||
|
@ -100,7 +100,7 @@ export default Vue.extend({
|
|||||||
useCw: false,
|
useCw: false,
|
||||||
cw: null,
|
cw: null,
|
||||||
geo: 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: [],
|
visibleUsers: [],
|
||||||
autocomplete: null,
|
autocomplete: null,
|
||||||
draghover: false,
|
draghover: false,
|
||||||
|
@ -26,6 +26,22 @@
|
|||||||
<mk-switch v-model="autoPopout" text="%i18n:@auto-popout%">
|
<mk-switch v-model="autoPopout" text="%i18n:@auto-popout%">
|
||||||
<span>%i18n:@auto-popout-desc%</span>
|
<span>%i18n:@auto-popout-desc%</span>
|
||||||
</mk-switch>
|
</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>
|
<details>
|
||||||
<summary>%i18n:@advanced%</summary>
|
<summary>%i18n:@advanced%</summary>
|
||||||
<mk-switch v-model="apiViaStream" text="%i18n:@api-via-stream%">
|
<mk-switch v-model="apiViaStream" text="%i18n:@api-via-stream%">
|
||||||
@ -44,6 +60,7 @@
|
|||||||
<button class="ui" @click="deleteWallpaper">%i18n:@delete-wallpaper%</button>
|
<button class="ui" @click="deleteWallpaper">%i18n:@delete-wallpaper%</button>
|
||||||
<mk-switch v-model="darkmode" text="%i18n:@dark-mode%"/>
|
<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.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.gradientWindowHeader" @change="onChangeGradientWindowHeader" text="%i18n:@gradient-window-header%"/>
|
||||||
<mk-switch v-model="$store.state.settings.iLikeSushi" @change="onChangeILikeSushi" text="%i18n:common.i-like-sushi%"/>
|
<mk-switch v-model="$store.state.settings.iLikeSushi" @change="onChangeILikeSushi" text="%i18n:common.i-like-sushi%"/>
|
||||||
</div>
|
</div>
|
||||||
@ -238,6 +255,11 @@ export default Vue.extend({
|
|||||||
set(value) { this.$store.commit('device/set', { key: 'apiViaStream', value }); }
|
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: {
|
autoPopout: {
|
||||||
get() { return this.$store.state.device.autoPopout; },
|
get() { return this.$store.state.device.autoPopout; },
|
||||||
set(value) { this.$store.commit('device/set', { key: 'autoPopout', value }); }
|
set(value) { this.$store.commit('device/set', { key: 'autoPopout', value }); }
|
||||||
@ -311,6 +333,12 @@ export default Vue.extend({
|
|||||||
value: v
|
value: v
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
onChangeRememberNoteVisibility(v) {
|
||||||
|
this.$store.dispatch('settings/set', {
|
||||||
|
key: 'rememberNoteVisibility',
|
||||||
|
value: v
|
||||||
|
});
|
||||||
|
},
|
||||||
onChangeAutoWatch(v) {
|
onChangeAutoWatch(v) {
|
||||||
(this as any).api('i/update', {
|
(this as any).api('i/update', {
|
||||||
autoWatch: v
|
autoWatch: v
|
||||||
@ -376,6 +404,12 @@ export default Vue.extend({
|
|||||||
value: v
|
value: v
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
onChangeContrastedAcct(v) {
|
||||||
|
this.$store.dispatch('settings/set', {
|
||||||
|
key: 'contrastedAcct',
|
||||||
|
value: v
|
||||||
|
});
|
||||||
|
},
|
||||||
onChangeILikeSushi(v) {
|
onChangeILikeSushi(v) {
|
||||||
this.$store.dispatch('settings/set', {
|
this.$store.dispatch('settings/set', {
|
||||||
key: 'iLikeSushi',
|
key: 'iLikeSushi',
|
||||||
|
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('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('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('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('drive')" :class="{ active: page == 'drive' }">%fa:cloud .fw%%i18n:@drive%</li> -->
|
||||||
<!-- <li @click="nav('update')" :class="{ active: page == 'update' }">%i18n:@update%</li> -->
|
<!-- <li @click="nav('update')" :class="{ active: page == 'update' }">%i18n:@update%</li> -->
|
||||||
</ul>
|
</ul>
|
||||||
@ -17,6 +19,9 @@
|
|||||||
<div v-show="page == 'announcements'">
|
<div v-show="page == 'announcements'">
|
||||||
<x-announcements/>
|
<x-announcements/>
|
||||||
</div>
|
</div>
|
||||||
|
<div v-show="page == 'hashtags'">
|
||||||
|
<x-hashtags/>
|
||||||
|
</div>
|
||||||
<div v-if="page == 'users'">
|
<div v-if="page == 'users'">
|
||||||
<x-suspend-user/>
|
<x-suspend-user/>
|
||||||
<x-unsuspend-user/>
|
<x-unsuspend-user/>
|
||||||
@ -33,6 +38,7 @@
|
|||||||
import Vue from "vue";
|
import Vue from "vue";
|
||||||
import XDashboard from "./admin.dashboard.vue";
|
import XDashboard from "./admin.dashboard.vue";
|
||||||
import XAnnouncements from "./admin.announcements.vue";
|
import XAnnouncements from "./admin.announcements.vue";
|
||||||
|
import XHashtags from "./admin.hashtags.vue";
|
||||||
import XSuspendUser from "./admin.suspend-user.vue";
|
import XSuspendUser from "./admin.suspend-user.vue";
|
||||||
import XUnsuspendUser from "./admin.unsuspend-user.vue";
|
import XUnsuspendUser from "./admin.unsuspend-user.vue";
|
||||||
import XVerifyUser from "./admin.verify-user.vue";
|
import XVerifyUser from "./admin.verify-user.vue";
|
||||||
@ -43,6 +49,7 @@ export default Vue.extend({
|
|||||||
components: {
|
components: {
|
||||||
XDashboard,
|
XDashboard,
|
||||||
XAnnouncements,
|
XAnnouncements,
|
||||||
|
XHashtags,
|
||||||
XSuspendUser,
|
XSuspendUser,
|
||||||
XUnsuspendUser,
|
XUnsuspendUser,
|
||||||
XVerifyUser,
|
XVerifyUser,
|
||||||
|
@ -85,6 +85,7 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
mounted() {
|
mounted() {
|
||||||
|
document.title = (this as any).os.instanceName;
|
||||||
document.documentElement.style.overflow = 'hidden';
|
document.documentElement.style.overflow = 'hidden';
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -7,70 +7,130 @@
|
|||||||
|
|
||||||
<mk-forkit class="forkit"/>
|
<mk-forkit class="forkit"/>
|
||||||
|
|
||||||
<div class="body">
|
<main>
|
||||||
<div class="main block">
|
<div class="body">
|
||||||
<div>
|
<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>
|
|
||||||
|
|
||||||
<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>
|
|
||||||
|
|
||||||
<p class="desc" v-html="description || '%i18n:common.about%'"></p>
|
|
||||||
|
|
||||||
<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/pointer.png" alt="" class="char">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<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>
|
|
||||||
|
|
||||||
<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="nav block">
|
|
||||||
<div>
|
|
||||||
<mk-nav class="nav"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="side">
|
|
||||||
<div class="trends block">
|
|
||||||
<div>
|
<div>
|
||||||
<mk-trends/>
|
<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>
|
||||||
|
|
||||||
|
<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>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="tl block">
|
<div class="announcements block">
|
||||||
<header>%fa:comment-alt R% %i18n:@timeline%</header>
|
<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>
|
||||||
|
|
||||||
|
<div class="photos block">
|
||||||
|
<header>%fa:images% %i18n:@photos%</header>
|
||||||
<div>
|
<div>
|
||||||
<mk-welcome-timeline class="tl" :max="20"/>
|
<div v-for="photo in photos" :style="`background-image: url(${photo.thumbnailUrl})`"></div>
|
||||||
|
</div>
|
||||||
|
</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>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</main>
|
||||||
|
|
||||||
|
<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>
|
<modal name="signup" :class="$store.state.device.darkmode ? 'modal-dark' : 'modal-light'" width="450px" height="auto" scrollable>
|
||||||
<header class="formHeader">%i18n:@signup%</header>
|
<header class="formHeader">%i18n:@signup%</header>
|
||||||
@ -92,6 +152,7 @@ import { concat } from '../../../../../prelude/array';
|
|||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
meta: null,
|
||||||
stats: null,
|
stats: null,
|
||||||
copyright,
|
copyright,
|
||||||
host,
|
host,
|
||||||
@ -104,6 +165,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
created() {
|
created() {
|
||||||
(this as any).os.getMeta().then(meta => {
|
(this as any).os.getMeta().then(meta => {
|
||||||
|
this.meta = meta;
|
||||||
this.name = meta.name;
|
this.name = meta.name;
|
||||||
this.description = meta.description;
|
this.description = meta.description;
|
||||||
this.announcements = meta.broadcasts;
|
this.announcements = meta.broadcasts;
|
||||||
@ -129,6 +191,10 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
|
about() {
|
||||||
|
this.$modal.show('about');
|
||||||
|
},
|
||||||
|
|
||||||
signup() {
|
signup() {
|
||||||
this.$modal.show('signup');
|
this.$modal.show('signup');
|
||||||
},
|
},
|
||||||
@ -181,6 +247,54 @@ export default Vue.extend({
|
|||||||
margin 0 48px
|
margin 0 48px
|
||||||
font-size 1.5em
|
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>
|
||||||
|
|
||||||
<style lang="stylus" scoped>
|
<style lang="stylus" scoped>
|
||||||
@ -208,17 +322,11 @@ root(isDark)
|
|||||||
font-size 18px
|
font-size 18px
|
||||||
color isDark ? #fff : #444
|
color isDark ? #fff : #444
|
||||||
|
|
||||||
> .body
|
> main
|
||||||
display grid
|
|
||||||
grid-template-rows 1fr 1fr 64px
|
|
||||||
grid-template-columns 1fr 1fr 350px
|
|
||||||
gap 16px
|
|
||||||
width 100%
|
|
||||||
max-width 1200px
|
|
||||||
height 100vh
|
|
||||||
min-height 950px
|
|
||||||
margin 0 auto
|
margin 0 auto
|
||||||
padding 64px
|
padding 64px
|
||||||
|
width 100%
|
||||||
|
max-width 1200px
|
||||||
|
|
||||||
.block
|
.block
|
||||||
color isDark ? #fff : #444
|
color isDark ? #fff : #444
|
||||||
@ -242,117 +350,148 @@ root(isDark)
|
|||||||
> div
|
> div
|
||||||
overflow auto
|
overflow auto
|
||||||
|
|
||||||
> .main
|
> .body
|
||||||
grid-row 1
|
display grid
|
||||||
grid-column 1 / 3
|
grid-template-rows 390px 1fr 256px 64px
|
||||||
border-top solid 5px $theme-color
|
grid-template-columns 1fr 1fr 350px
|
||||||
|
gap 16px
|
||||||
|
height 1150px
|
||||||
|
|
||||||
> div
|
> .main
|
||||||
padding 32px
|
grid-row 1
|
||||||
min-height 100%
|
grid-column 1 / 3
|
||||||
|
border-top solid 5px $theme-color
|
||||||
> 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
|
|
||||||
|
|
||||||
> .sign
|
|
||||||
font-size 120%
|
|
||||||
|
|
||||||
> .divider
|
|
||||||
margin 0 16px
|
|
||||||
|
|
||||||
> .signin
|
|
||||||
> .signup
|
|
||||||
cursor pointer
|
|
||||||
|
|
||||||
&:hover
|
|
||||||
color $theme-color
|
|
||||||
|
|
||||||
> .char
|
|
||||||
display block
|
|
||||||
position absolute
|
|
||||||
right 0
|
|
||||||
bottom 0
|
|
||||||
width 180px
|
|
||||||
opacity 0.3
|
|
||||||
|
|
||||||
> *:not(.char)
|
|
||||||
z-index 1
|
|
||||||
|
|
||||||
> .announcements
|
|
||||||
grid-row 2
|
|
||||||
grid-column 1
|
|
||||||
|
|
||||||
> div
|
|
||||||
padding 32px
|
|
||||||
|
|
||||||
> div
|
> div
|
||||||
padding 0 0 16px 0
|
padding 32px
|
||||||
margin 0 0 16px 0
|
min-height 100%
|
||||||
border-bottom 1px solid isDark ? rgba(#000, 0.2) : rgba(#000, 0.05)
|
|
||||||
|
|
||||||
> h1
|
> h1
|
||||||
margin 0
|
margin 0
|
||||||
font-size 1.25em
|
|
||||||
|
|
||||||
> .photos
|
> img
|
||||||
grid-row 2
|
margin -8px 0 0 -16px
|
||||||
grid-column 2
|
max-width 280px
|
||||||
|
|
||||||
> div
|
> .info
|
||||||
display grid
|
margin 0 auto 16px auto
|
||||||
grid-template-rows 1fr 1fr 1fr
|
width $width
|
||||||
grid-template-columns 1fr 1fr
|
font-size 14px
|
||||||
gap 8px
|
|
||||||
height 100%
|
|
||||||
padding 16px
|
|
||||||
|
|
||||||
> div
|
> .stats
|
||||||
//border-radius 4px
|
margin-left 16px
|
||||||
background-position center center
|
padding-left 16px
|
||||||
background-size cover
|
border-left solid 1px isDark ? #fff : #444
|
||||||
|
|
||||||
> .nav
|
> *
|
||||||
display flex
|
margin-right 16px
|
||||||
justify-content center
|
|
||||||
align-items center
|
|
||||||
grid-row 3
|
|
||||||
grid-column 1 / 3
|
|
||||||
font-size 14px
|
|
||||||
|
|
||||||
> .side
|
> .desc
|
||||||
display grid
|
max-width calc(100% - 150px)
|
||||||
grid-row 1 / 4
|
|
||||||
grid-column 3
|
|
||||||
grid-template-rows 1fr 350px
|
|
||||||
grid-template-columns 1fr
|
|
||||||
gap 16px
|
|
||||||
|
|
||||||
> .tl
|
> .sign
|
||||||
grid-row 1
|
font-size 120%
|
||||||
grid-column 1
|
margin-bottom 0
|
||||||
overflow auto
|
|
||||||
|
|
||||||
> .trends
|
> .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-row 2
|
||||||
grid-column 1
|
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]
|
.mk-welcome[data-darkmode]
|
||||||
root(true)
|
root(true)
|
||||||
|
@ -95,7 +95,7 @@ export default Vue.extend({
|
|||||||
files: [],
|
files: [],
|
||||||
poll: false,
|
poll: false,
|
||||||
geo: 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: [],
|
visibleUsers: [],
|
||||||
useCw: false,
|
useCw: false,
|
||||||
cw: null,
|
cw: null,
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
<section>
|
<section>
|
||||||
<ui-switch v-model="darkmode">%i18n:@dark-mode%</ui-switch>
|
<ui-switch v-model="darkmode">%i18n:@dark-mode%</ui-switch>
|
||||||
<ui-switch v-model="$store.state.settings.circleIcons" @change="onChangeCircleIcons">%i18n:@circle-icons%</ui-switch>
|
<ui-switch v-model="$store.state.settings.circleIcons" @change="onChangeCircleIcons">%i18n:@circle-icons%</ui-switch>
|
||||||
|
<ui-switch v-model="$store.state.settings.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.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.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.showBoardLabels" @change="onChangeReversiBoardLabels">%i18n:common.show-reversi-board-labels%</ui-switch>
|
||||||
@ -52,6 +53,21 @@
|
|||||||
<ui-switch v-model="$store.state.settings.loadRemoteMedia" @change="onChangeLoadRemoteMedia">%i18n:@load-remote-media%</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>
|
<ui-switch v-model="lightmode">%i18n:@i-am-under-limited-internet%</ui-switch>
|
||||||
</section>
|
</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>
|
||||||
|
|
||||||
<ui-card>
|
<ui-card>
|
||||||
@ -160,6 +176,11 @@ export default Vue.extend({
|
|||||||
set(value) { this.$store.commit('device/set', { key: 'mobileNotificationPosition', value }); }
|
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: {
|
lightmode: {
|
||||||
get() { return this.$store.state.device.lightmode; },
|
get() { return this.$store.state.device.lightmode; },
|
||||||
set(value) { this.$store.commit('device/set', { key: 'lightmode', value }); }
|
set(value) { this.$store.commit('device/set', { key: 'lightmode', value }); }
|
||||||
@ -197,6 +218,13 @@ export default Vue.extend({
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
onChangeRememberNoteVisibility(v) {
|
||||||
|
this.$store.dispatch('settings/set', {
|
||||||
|
key: 'rememberNoteVisibility',
|
||||||
|
value: v
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
onChangeDisableViaMobile(v) {
|
onChangeDisableViaMobile(v) {
|
||||||
this.$store.dispatch('settings/set', {
|
this.$store.dispatch('settings/set', {
|
||||||
key: 'disableViaMobile',
|
key: 'disableViaMobile',
|
||||||
@ -218,6 +246,13 @@ export default Vue.extend({
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
onChangeContrastedAcct(v) {
|
||||||
|
this.$store.dispatch('settings/set', {
|
||||||
|
key: 'contrastedAcct',
|
||||||
|
value: v
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
onChangeILikeSushi(v) {
|
onChangeILikeSushi(v) {
|
||||||
this.$store.dispatch('settings/set', {
|
this.$store.dispatch('settings/set', {
|
||||||
key: 'iLikeSushi',
|
key: 'iLikeSushi',
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
<mk-welcome-timeline/>
|
<mk-welcome-timeline/>
|
||||||
</div>
|
</div>
|
||||||
<div class="hashtags">
|
<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>
|
||||||
<div class="photos">
|
<div class="photos">
|
||||||
<div v-for="photo in photos" :style="`background-image: url(${photo.thumbnailUrl})`"></div>
|
<div v-for="photo in photos" :style="`background-image: url(${photo.thumbnailUrl})`"></div>
|
||||||
@ -30,6 +30,38 @@
|
|||||||
<div v-html="announcement.text"></div>
|
<div v-html="announcement.text"></div>
|
||||||
</article>
|
</article>
|
||||||
</div>
|
</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>
|
<footer>
|
||||||
<small>{{ copyright }}</small>
|
<small>{{ copyright }}</small>
|
||||||
</footer>
|
</footer>
|
||||||
@ -39,25 +71,25 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import { apiUrl, copyright, host } from '../../../config';
|
import { copyright, host } from '../../../config';
|
||||||
import { concat } from '../../../../../prelude/array';
|
import { concat } from '../../../../../prelude/array';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
apiUrl,
|
meta: null,
|
||||||
copyright,
|
copyright,
|
||||||
stats: null,
|
stats: null,
|
||||||
host,
|
host,
|
||||||
name: 'Misskey',
|
name: 'Misskey',
|
||||||
description: '',
|
description: '',
|
||||||
tags: [],
|
|
||||||
photos: [],
|
photos: [],
|
||||||
announcements: []
|
announcements: []
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
(this as any).os.getMeta().then(meta => {
|
(this as any).os.getMeta().then(meta => {
|
||||||
|
this.meta = meta;
|
||||||
this.name = meta.name;
|
this.name = meta.name;
|
||||||
this.description = meta.description;
|
this.description = meta.description;
|
||||||
this.announcements = meta.broadcasts;
|
this.announcements = meta.broadcasts;
|
||||||
@ -67,10 +99,6 @@ export default Vue.extend({
|
|||||||
this.stats = stats;
|
this.stats = stats;
|
||||||
});
|
});
|
||||||
|
|
||||||
(this as any).api('hashtags/trend').then(stats => {
|
|
||||||
this.tags = stats.map(x => x.tag);
|
|
||||||
});
|
|
||||||
|
|
||||||
const image = [
|
const image = [
|
||||||
'image/jpeg',
|
'image/jpeg',
|
||||||
'image/png',
|
'image/png',
|
||||||
@ -165,12 +193,8 @@ root(isDark)
|
|||||||
-webkit-overflow-scrolling touch
|
-webkit-overflow-scrolling touch
|
||||||
|
|
||||||
> .hashtags
|
> .hashtags
|
||||||
padding 16px 0
|
padding 0 8px
|
||||||
border solid 2px #ddd
|
height 200px
|
||||||
border-radius 8px
|
|
||||||
|
|
||||||
> *
|
|
||||||
margin 0 16px
|
|
||||||
|
|
||||||
> .photos
|
> .photos
|
||||||
display grid
|
display grid
|
||||||
@ -210,6 +234,54 @@ root(isDark)
|
|||||||
> .title
|
> .title
|
||||||
font-weight bold
|
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
|
> footer
|
||||||
text-align center
|
text-align center
|
||||||
color #444
|
color #444
|
||||||
|
@ -16,6 +16,7 @@ const defaultSettings = {
|
|||||||
suggestRecentHashtags: true,
|
suggestRecentHashtags: true,
|
||||||
showClockOnHeader: true,
|
showClockOnHeader: true,
|
||||||
circleIcons: true,
|
circleIcons: true,
|
||||||
|
contrastedAcct: true,
|
||||||
gradientWindowHeader: false,
|
gradientWindowHeader: false,
|
||||||
showReplyTarget: true,
|
showReplyTarget: true,
|
||||||
showMyRenotes: true,
|
showMyRenotes: true,
|
||||||
@ -25,6 +26,8 @@ const defaultSettings = {
|
|||||||
disableViaMobile: false,
|
disableViaMobile: false,
|
||||||
memo: null,
|
memo: null,
|
||||||
iLikeSushi: false,
|
iLikeSushi: false,
|
||||||
|
rememberNoteVisibility: false,
|
||||||
|
defaultNoteVisibility: 'public',
|
||||||
games: {
|
games: {
|
||||||
reversi: {
|
reversi: {
|
||||||
showBoardLabels: false,
|
showBoardLabels: false,
|
||||||
|
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 |
@ -4,12 +4,13 @@ const Meta = db.get<IMeta>('meta');
|
|||||||
export default Meta;
|
export default Meta;
|
||||||
|
|
||||||
export type IMeta = {
|
export type IMeta = {
|
||||||
broadcasts: any[];
|
broadcasts?: any[];
|
||||||
stats: {
|
stats?: {
|
||||||
notesCount: number;
|
notesCount: number;
|
||||||
originalNotesCount: number;
|
originalNotesCount: number;
|
||||||
usersCount: number;
|
usersCount: number;
|
||||||
originalUsersCount: number;
|
originalUsersCount: number;
|
||||||
};
|
};
|
||||||
disableRegistration: boolean;
|
disableRegistration?: boolean;
|
||||||
|
hidedTags?: string[];
|
||||||
};
|
};
|
||||||
|
@ -21,16 +21,6 @@ Note.createIndex('_files.contentType');
|
|||||||
Note.createIndex({
|
Note.createIndex({
|
||||||
createdAt: -1
|
createdAt: -1
|
||||||
});
|
});
|
||||||
|
|
||||||
// 後方互換性のため
|
|
||||||
Note.update({}, {
|
|
||||||
$rename: {
|
|
||||||
mediaIds: 'fileIds'
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
multi: true
|
|
||||||
});
|
|
||||||
|
|
||||||
export default Note;
|
export default Note;
|
||||||
|
|
||||||
export function isValidText(text: string): boolean {
|
export function isValidText(text: string): boolean {
|
||||||
|
@ -5,7 +5,7 @@ export default (object: any, note: INote) => {
|
|||||||
const attributedTo = `${config.url}/users/${note.userId}`;
|
const attributedTo = `${config.url}/users/${note.userId}`;
|
||||||
|
|
||||||
return {
|
return {
|
||||||
id: `${config.url}/notes/${note._id}`,
|
id: `${config.url}/notes/${note._id}/activity`,
|
||||||
actor: `${config.url}/users/${note.userId}`,
|
actor: `${config.url}/users/${note.userId}`,
|
||||||
type: 'Announce',
|
type: 'Announce',
|
||||||
published: note.createdAt.toISOString(),
|
published: note.createdAt.toISOString(),
|
||||||
|
@ -10,7 +10,7 @@ import User, { isLocalUser, ILocalUser, IUser } from '../models/user';
|
|||||||
import renderNote from '../remote/activitypub/renderer/note';
|
import renderNote from '../remote/activitypub/renderer/note';
|
||||||
import renderKey from '../remote/activitypub/renderer/key';
|
import renderKey from '../remote/activitypub/renderer/key';
|
||||||
import renderPerson from '../remote/activitypub/renderer/person';
|
import renderPerson from '../remote/activitypub/renderer/person';
|
||||||
import Outbox from './activitypub/outbox';
|
import Outbox, { packActivity } from './activitypub/outbox';
|
||||||
import Followers from './activitypub/followers';
|
import Followers from './activitypub/followers';
|
||||||
import Following from './activitypub/following';
|
import Following from './activitypub/following';
|
||||||
|
|
||||||
@ -77,6 +77,22 @@ router.get('/notes/:note', async (ctx, next) => {
|
|||||||
setResponseType(ctx);
|
setResponseType(ctx);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// note activity
|
||||||
|
router.get('/notes/:note/activity', async ctx => {
|
||||||
|
const note = await Note.findOne({
|
||||||
|
_id: new mongo.ObjectID(ctx.params.note),
|
||||||
|
visibility: { $in: ['public', 'home'] }
|
||||||
|
});
|
||||||
|
|
||||||
|
if (note === null) {
|
||||||
|
ctx.status = 404;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx.body = pack(await packActivity(note));
|
||||||
|
setResponseType(ctx);
|
||||||
|
});
|
||||||
|
|
||||||
// outbox
|
// outbox
|
||||||
router.get('/users/:user/outbox', Outbox);
|
router.get('/users/:user/outbox', Outbox);
|
||||||
|
|
||||||
|
@ -8,8 +8,10 @@ import renderOrderedCollection from '../../remote/activitypub/renderer/ordered-c
|
|||||||
import renderOrderedCollectionPage from '../../remote/activitypub/renderer/ordered-collection-page';
|
import renderOrderedCollectionPage from '../../remote/activitypub/renderer/ordered-collection-page';
|
||||||
import { setResponseType } from '../activitypub';
|
import { setResponseType } from '../activitypub';
|
||||||
|
|
||||||
import Note from '../../models/note';
|
import Note, { INote } from '../../models/note';
|
||||||
import renderNote from '../../remote/activitypub/renderer/note';
|
import renderNote from '../../remote/activitypub/renderer/note';
|
||||||
|
import renderCreate from '../../remote/activitypub/renderer/create';
|
||||||
|
import renderAnnounce from '../../remote/activitypub/renderer/announce';
|
||||||
import { countIf } from '../../prelude/array';
|
import { countIf } from '../../prelude/array';
|
||||||
|
|
||||||
export default async (ctx: Router.IRouterContext) => {
|
export default async (ctx: Router.IRouterContext) => {
|
||||||
@ -53,15 +55,7 @@ export default async (ctx: Router.IRouterContext) => {
|
|||||||
|
|
||||||
const query = {
|
const query = {
|
||||||
userId: user._id,
|
userId: user._id,
|
||||||
$and: [{
|
visibility: { $in: ['public', 'home'] }
|
||||||
$or: [ { visibility: 'public' }, { visibility: 'home' } ]
|
|
||||||
}, { // exclude renote, but include quote
|
|
||||||
$or: [{
|
|
||||||
text: { $ne: null }
|
|
||||||
}, {
|
|
||||||
fileIds: { $ne: [] }
|
|
||||||
}]
|
|
||||||
}]
|
|
||||||
} as any;
|
} as any;
|
||||||
|
|
||||||
if (sinceId) {
|
if (sinceId) {
|
||||||
@ -85,10 +79,10 @@ export default async (ctx: Router.IRouterContext) => {
|
|||||||
|
|
||||||
if (sinceId) notes.reverse();
|
if (sinceId) notes.reverse();
|
||||||
|
|
||||||
const renderedNotes = await Promise.all(notes.map(note => renderNote(note, false)));
|
const activities = await Promise.all(notes.map(note => packActivity(note)));
|
||||||
const rendered = renderOrderedCollectionPage(
|
const rendered = renderOrderedCollectionPage(
|
||||||
`${partOf}?page=true${sinceId ? `&since_id=${sinceId}` : ''}${untilId ? `&until_id=${untilId}` : ''}`,
|
`${partOf}?page=true${sinceId ? `&since_id=${sinceId}` : ''}${untilId ? `&until_id=${untilId}` : ''}`,
|
||||||
user.notesCount, renderedNotes, partOf,
|
user.notesCount, activities, partOf,
|
||||||
notes.length > 0 ? `${partOf}?page=true&since_id=${notes[0]._id}` : null,
|
notes.length > 0 ? `${partOf}?page=true&since_id=${notes[0]._id}` : null,
|
||||||
notes.length > 0 ? `${partOf}?page=true&until_id=${notes[notes.length - 1]._id}` : null
|
notes.length > 0 ? `${partOf}?page=true&until_id=${notes[notes.length - 1]._id}` : null
|
||||||
);
|
);
|
||||||
@ -105,3 +99,16 @@ export default async (ctx: Router.IRouterContext) => {
|
|||||||
setResponseType(ctx);
|
setResponseType(ctx);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pack Create<Note> or Announce Activity
|
||||||
|
* @param note Note
|
||||||
|
*/
|
||||||
|
export async function packActivity(note: INote): Promise<object> {
|
||||||
|
if (note.renoteId && note.text == null) {
|
||||||
|
const renote = await Note.findOne(note.renoteId);
|
||||||
|
return renderAnnounce(renote.uri ? renote.uri : `${config.url}/notes/${renote._id}`, note);
|
||||||
|
}
|
||||||
|
|
||||||
|
return renderCreate(await renderNote(note, false), note);
|
||||||
|
}
|
||||||
|
@ -21,7 +21,13 @@ export const meta = {
|
|||||||
desc: {
|
desc: {
|
||||||
'ja-JP': '招待制か否か'
|
'ja-JP': '招待制か否か'
|
||||||
}
|
}
|
||||||
})
|
}),
|
||||||
|
|
||||||
|
hidedTags: $.arr($.str).optional.nullable.note({
|
||||||
|
desc: {
|
||||||
|
'ja-JP': '統計などで無視するハッシュタグ'
|
||||||
|
}
|
||||||
|
}),
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -39,6 +45,10 @@ export default (params: any) => new Promise(async (res, rej) => {
|
|||||||
set.disableRegistration = ps.disableRegistration;
|
set.disableRegistration = ps.disableRegistration;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Array.isArray(ps.hidedTags)) {
|
||||||
|
set.hidedTags = ps.hidedTags;
|
||||||
|
}
|
||||||
|
|
||||||
await Meta.update({}, {
|
await Meta.update({}, {
|
||||||
$set: set
|
$set: set
|
||||||
}, { upsert: true });
|
}, { upsert: true });
|
||||||
|
66
src/server/api/endpoints/aggregation/hashtags.ts
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
import Note from '../../../../models/note';
|
||||||
|
import Meta from '../../../../models/meta';
|
||||||
|
|
||||||
|
export default () => new Promise(async (res, rej) => {
|
||||||
|
const meta = await Meta.findOne({});
|
||||||
|
const hidedTags = (meta.hidedTags || []).map(t => t.toLowerCase());
|
||||||
|
|
||||||
|
const span = 1000 * 60 * 60 * 24 * 7; // 1週間
|
||||||
|
|
||||||
|
//#region 1. 指定期間の内に投稿されたハッシュタグ(とユーザーのペア)を集計
|
||||||
|
const data = await Note.aggregate([{
|
||||||
|
$match: {
|
||||||
|
createdAt: {
|
||||||
|
$gt: new Date(Date.now() - span)
|
||||||
|
},
|
||||||
|
tagsLower: {
|
||||||
|
$exists: true,
|
||||||
|
$ne: []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
$unwind: '$tagsLower'
|
||||||
|
}, {
|
||||||
|
$group: {
|
||||||
|
_id: { tag: '$tagsLower', userId: '$userId' }
|
||||||
|
}
|
||||||
|
}]) as Array<{
|
||||||
|
_id: {
|
||||||
|
tag: string;
|
||||||
|
userId: any;
|
||||||
|
}
|
||||||
|
}>;
|
||||||
|
//#endregion
|
||||||
|
|
||||||
|
if (data.length == 0) {
|
||||||
|
return res([]);
|
||||||
|
}
|
||||||
|
|
||||||
|
let tags: Array<{
|
||||||
|
name: string;
|
||||||
|
count: number;
|
||||||
|
}> = [];
|
||||||
|
|
||||||
|
// カウント
|
||||||
|
data.map(x => x._id).forEach(x => {
|
||||||
|
// ブラックリストに登録されているタグなら弾く
|
||||||
|
if (hidedTags.includes(x.tag)) return;
|
||||||
|
|
||||||
|
const i = tags.findIndex(tag => tag.name == x.tag);
|
||||||
|
if (i != -1) {
|
||||||
|
tags[i].count++;
|
||||||
|
} else {
|
||||||
|
tags.push({
|
||||||
|
name: x.tag,
|
||||||
|
count: 1
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// タグを人気順に並べ替え
|
||||||
|
tags = tags.sort((a, b) => b.count - a.count);
|
||||||
|
|
||||||
|
tags = tags.slice(0, 30);
|
||||||
|
|
||||||
|
res(tags);
|
||||||
|
});
|
@ -1,5 +1,6 @@
|
|||||||
import Note from '../../../../models/note';
|
import Note from '../../../../models/note';
|
||||||
import { erase } from '../../../../prelude/array';
|
import { erase } from '../../../../prelude/array';
|
||||||
|
import Meta from '../../../../models/meta';
|
||||||
|
|
||||||
/*
|
/*
|
||||||
トレンドに載るためには「『直近a分間のユニーク投稿数が今からa分前~今からb分前の間のユニーク投稿数のn倍以上』のハッシュタグの上位5位以内に入る」ことが必要
|
トレンドに載るためには「『直近a分間のユニーク投稿数が今からa分前~今からb分前の間のユニーク投稿数のn倍以上』のハッシュタグの上位5位以内に入る」ことが必要
|
||||||
@ -17,6 +18,9 @@ const max = 5;
|
|||||||
* Get trends of hashtags
|
* Get trends of hashtags
|
||||||
*/
|
*/
|
||||||
export default () => new Promise(async (res, rej) => {
|
export default () => new Promise(async (res, rej) => {
|
||||||
|
const meta = await Meta.findOne({});
|
||||||
|
const hidedTags = (meta.hidedTags || []).map(t => t.toLowerCase());
|
||||||
|
|
||||||
//#region 1. 直近Aの内に投稿されたハッシュタグ(とユーザーのペア)を集計
|
//#region 1. 直近Aの内に投稿されたハッシュタグ(とユーザーのペア)を集計
|
||||||
const data = await Note.aggregate([{
|
const data = await Note.aggregate([{
|
||||||
$match: {
|
$match: {
|
||||||
@ -53,6 +57,9 @@ export default () => new Promise(async (res, rej) => {
|
|||||||
|
|
||||||
// カウント
|
// カウント
|
||||||
data.map(x => x._id).forEach(x => {
|
data.map(x => x._id).forEach(x => {
|
||||||
|
// ブラックリストに登録されているタグなら弾く
|
||||||
|
if (hidedTags.includes(x.tag)) return;
|
||||||
|
|
||||||
const i = tags.findIndex(tag => tag.name == x.tag);
|
const i = tags.findIndex(tag => tag.name == x.tag);
|
||||||
if (i != -1) {
|
if (i != -1) {
|
||||||
tags[i].count++;
|
tags[i].count++;
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
import * as os from 'os';
|
import * as os from 'os';
|
||||||
import config from '../../../config';
|
import config from '../../../config';
|
||||||
import Meta from '../../../models/meta';
|
import Meta from '../../../models/meta';
|
||||||
|
import { ILocalUser } from '../../../models/user';
|
||||||
|
|
||||||
const pkg = require('../../../../package.json');
|
const pkg = require('../../../../package.json');
|
||||||
const client = require('../../../../built/client/meta.json');
|
const client = require('../../../../built/client/meta.json');
|
||||||
@ -11,7 +12,7 @@ const client = require('../../../../built/client/meta.json');
|
|||||||
/**
|
/**
|
||||||
* Show core info
|
* Show core info
|
||||||
*/
|
*/
|
||||||
export default () => new Promise(async (res, rej) => {
|
export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
|
||||||
const meta: any = (await Meta.findOne()) || {};
|
const meta: any = (await Meta.findOne()) || {};
|
||||||
|
|
||||||
res({
|
res({
|
||||||
@ -35,6 +36,7 @@ export default () => new Promise(async (res, rej) => {
|
|||||||
disableRegistration: meta.disableRegistration,
|
disableRegistration: meta.disableRegistration,
|
||||||
driveCapacityPerLocalUserMb: config.localDriveCapacityMb,
|
driveCapacityPerLocalUserMb: config.localDriveCapacityMb,
|
||||||
recaptchaSitekey: config.recaptcha ? config.recaptcha.site_key : null,
|
recaptchaSitekey: config.recaptcha ? config.recaptcha.site_key : null,
|
||||||
swPublickey: config.sw ? config.sw.public_key : null
|
swPublickey: config.sw ? config.sw.public_key : null,
|
||||||
|
hidedTags: (me && me.isAdmin) ? meta.hidedTags : undefined
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -6,7 +6,7 @@ block vars
|
|||||||
- const url = `${config.url}/notes/${note.id}`;
|
- const url = `${config.url}/notes/${note.id}`;
|
||||||
|
|
||||||
block title
|
block title
|
||||||
= `${title} | Misskey`
|
= `${title} | ${config.name}`
|
||||||
|
|
||||||
block desc
|
block desc
|
||||||
meta(name='description' content= summary)
|
meta(name='description' content= summary)
|
||||||
@ -23,3 +23,6 @@ block meta
|
|||||||
link(rel='prev' href=`${config.url}/notes/${note.prev}`)
|
link(rel='prev' href=`${config.url}/notes/${note.prev}`)
|
||||||
if note.next
|
if note.next
|
||||||
link(rel='next' href=`${config.url}/notes/${note.next}`)
|
link(rel='next' href=`${config.url}/notes/${note.next}`)
|
||||||
|
|
||||||
|
if !user.host
|
||||||
|
link(rel='alternate' href=url type='application/activity+json')
|
||||||
|
@ -6,7 +6,7 @@ block vars
|
|||||||
- const img = user.avatarId ? `${config.drive_url}/${user.avatarId}` : null;
|
- const img = user.avatarId ? `${config.drive_url}/${user.avatarId}` : null;
|
||||||
|
|
||||||
block title
|
block title
|
||||||
= `${title} | Misskey`
|
= `${title} | ${config.name}`
|
||||||
|
|
||||||
block desc
|
block desc
|
||||||
meta(name='description' content= user.description)
|
meta(name='description' content= user.description)
|
||||||
@ -18,3 +18,10 @@ block meta
|
|||||||
meta(property='og:description' content= user.description)
|
meta(property='og:description' content= user.description)
|
||||||
meta(property='og:url' content= url)
|
meta(property='og:url' content= url)
|
||||||
meta(property='og:image' content= img)
|
meta(property='og:image' content= img)
|
||||||
|
|
||||||
|
if !user.host
|
||||||
|
link(rel='alternate' href=`${config.url}/users/${user._id}` type='application/activity+json')
|
||||||
|
if user.uri
|
||||||
|
link(rel='alternate' href=user.uri type='application/activity+json')
|
||||||
|
if user.url
|
||||||
|
link(rel='alternate' href=user.url type='text/html')
|
||||||
|