Compare commits

..

81 Commits

Author SHA1 Message Date
e7180d529a 8.30.0 2018-09-07 21:14:27 +09:00
b8cd872738 Merge pull request #2659 from syuilo/greenkeeper/commander-2.18.0
Update commander to the latest version 🚀
2018-09-07 21:14:02 +09:00
efaaa76185 Improve note visibility settings
Closes #2312
Closes #2313
2018-09-07 21:13:15 +09:00
19e1f996a6 Fix bug 2018-09-07 21:10:31 +09:00
40a69bf200 Merge pull request #2654 from syuilo/l10n_develop
New Crowdin translations
2018-09-07 20:41:54 +09:00
9e3abb9989 Improve welcome page 2018-09-07 20:41:12 +09:00
5ba48e06f7 New translations ja-JP.yml (English) 2018-09-07 20:31:22 +09:00
8b3a0a524b Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2018-09-07 20:24:00 +09:00
d9fe9cc5df 返すタグの数を制限 2018-09-07 20:23:46 +09:00
b202c7906a New translations ja-JP.yml (Norwegian) 2018-09-07 20:23:33 +09:00
b9c868cac6 New translations ja-JP.yml (Dutch) 2018-09-07 20:23:30 +09:00
33adf3c88d New translations ja-JP.yml (Japanese, Kansai) 2018-09-07 20:23:28 +09:00
8b84f40975 New translations ja-JP.yml (Spanish) 2018-09-07 20:23:25 +09:00
fa131d2023 New translations ja-JP.yml (Russian) 2018-09-07 20:23:23 +09:00
a83b38b50a New translations ja-JP.yml (Portuguese) 2018-09-07 20:23:20 +09:00
dcd7b286ef New translations ja-JP.yml (Polish) 2018-09-07 20:23:18 +09:00
b85bf769cd New translations ja-JP.yml (Korean) 2018-09-07 20:23:15 +09:00
630a20d61e New translations ja-JP.yml (Italian) 2018-09-07 20:23:12 +09:00
88c3794cf1 New translations ja-JP.yml (German) 2018-09-07 20:23:10 +09:00
42eb457ad0 New translations ja-JP.yml (French) 2018-09-07 20:23:08 +09:00
d153a8de20 New translations ja-JP.yml (English) 2018-09-07 20:23:06 +09:00
7f7551f44c New translations ja-JP.yml (Chinese Simplified) 2018-09-07 20:23:03 +09:00
23082b55a4 New translations ja-JP.yml (Catalan) 2018-09-07 20:23:00 +09:00
dac7387a7f fix(package): update minio to version 7.0.1 (#2655) 2018-09-07 20:22:04 +09:00
8c6856d894 Improve welcome page 2018-09-07 20:21:25 +09:00
2c0e514fb2 fix(package): update commander to version 2.18.0 2018-09-07 10:32:06 +00:00
1917b0339e #2652 (#2658) 2018-09-07 19:24:18 +09:00
c05419f223 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2018-09-07 19:23:51 +09:00
e0deaec695 Implement new endpoint 2018-09-07 19:23:39 +09:00
d70e2a788e Add some meta alternate links (#2657) 2018-09-07 19:22:14 +09:00
7343e6e2e8 統計で無視するハッシュタグを設定できるように 2018-09-07 19:20:50 +09:00
106d4cc0d6 🎨 2018-09-07 06:04:00 +09:00
c98879cb7a New translations ja-JP.yml (Norwegian) 2018-09-07 05:52:06 +09:00
9ca755c313 New translations ja-JP.yml (Dutch) 2018-09-07 05:52:04 +09:00
25e0b98840 New translations ja-JP.yml (Japanese, Kansai) 2018-09-07 05:52:01 +09:00
5599c43c71 New translations ja-JP.yml (Spanish) 2018-09-07 05:51:59 +09:00
eb7597d7e4 New translations ja-JP.yml (Russian) 2018-09-07 05:51:56 +09:00
d5767e92c4 New translations ja-JP.yml (Portuguese) 2018-09-07 05:51:54 +09:00
ba3749d373 New translations ja-JP.yml (Polish) 2018-09-07 05:51:51 +09:00
d8088acdf2 New translations ja-JP.yml (Korean) 2018-09-07 05:51:49 +09:00
ad93e0aa3d New translations ja-JP.yml (Italian) 2018-09-07 05:51:46 +09:00
691e58f03d New translations ja-JP.yml (German) 2018-09-07 05:51:44 +09:00
95d5bccfca New translations ja-JP.yml (French) 2018-09-07 05:51:42 +09:00
2aa8e0a4bf New translations ja-JP.yml (English) 2018-09-07 05:51:39 +09:00
6e96d6677d New translations ja-JP.yml (Chinese Simplified) 2018-09-07 05:51:36 +09:00
8816c20f51 New translations ja-JP.yml (Catalan) 2018-09-07 05:51:34 +09:00
e955fe1ffd 8.29.0 2018-09-07 05:47:47 +09:00
5cbcac713a Fix 2018-09-07 05:47:19 +09:00
2b50364ab4 ユーザー名にコントラストを付けるデザインのオンオフを切り替えられるように 2018-09-07 05:45:13 +09:00
fa04ac789e 🎨 2018-09-07 05:37:15 +09:00
95ce8dce3d 8.28.1 2018-09-07 05:32:18 +09:00
0b5eec4ca8 Fix bug 2018-09-07 05:32:09 +09:00
fb76dff836 New translations ja-JP.yml (English) 2018-09-06 05:01:19 +09:00
7167c8c593 New translations ja-JP.yml (Norwegian) 2018-09-06 04:36:02 +09:00
51b79d4250 New translations ja-JP.yml (Dutch) 2018-09-06 04:36:00 +09:00
925fcc1c64 New translations ja-JP.yml (Japanese, Kansai) 2018-09-06 04:35:54 +09:00
fcdc14862c New translations ja-JP.yml (Spanish) 2018-09-06 04:35:50 +09:00
dac2844cae New translations ja-JP.yml (Russian) 2018-09-06 04:35:45 +09:00
706b0cea16 New translations ja-JP.yml (Portuguese) 2018-09-06 04:35:41 +09:00
842e7844c7 New translations ja-JP.yml (Polish) 2018-09-06 04:35:39 +09:00
1dceda50d8 New translations ja-JP.yml (Korean) 2018-09-06 04:35:33 +09:00
af8b9abba4 New translations ja-JP.yml (Italian) 2018-09-06 04:35:28 +09:00
07b07685fa New translations ja-JP.yml (German) 2018-09-06 04:35:26 +09:00
cde43fe3c8 New translations ja-JP.yml (French) 2018-09-06 04:35:24 +09:00
2fe84aa75b New translations ja-JP.yml (English) 2018-09-06 04:35:21 +09:00
7d79a4840d New translations ja-JP.yml (Chinese Simplified) 2018-09-06 04:35:19 +09:00
3ee9479572 New translations ja-JP.yml (Catalan) 2018-09-06 04:35:16 +09:00
16da91d8d1 New translations ja-JP.yml (Norwegian) 2018-09-05 13:51:56 +09:00
8ffd62b462 New translations ja-JP.yml (Dutch) 2018-09-05 13:51:54 +09:00
935367e167 New translations ja-JP.yml (Japanese, Kansai) 2018-09-05 13:51:50 +09:00
00618260f2 New translations ja-JP.yml (Spanish) 2018-09-05 13:51:46 +09:00
77d66fac7b New translations ja-JP.yml (Russian) 2018-09-05 13:51:40 +09:00
17d7f59b06 New translations ja-JP.yml (Portuguese) 2018-09-05 13:51:38 +09:00
2561547db1 New translations ja-JP.yml (Polish) 2018-09-05 13:51:36 +09:00
7738438616 New translations ja-JP.yml (Korean) 2018-09-05 13:51:34 +09:00
3d8fc4a794 New translations ja-JP.yml (Italian) 2018-09-05 13:51:28 +09:00
87b4e7905e New translations ja-JP.yml (German) 2018-09-05 13:51:25 +09:00
13c5d4985a New translations ja-JP.yml (French) 2018-09-05 13:51:23 +09:00
f0df4096fd New translations ja-JP.yml (English) 2018-09-05 13:51:21 +09:00
5044424549 New translations ja-JP.yml (Chinese Simplified) 2018-09-05 13:51:19 +09:00
8ce67cdcd6 New translations ja-JP.yml (Catalan) 2018-09-05 13:51:16 +09:00
39 changed files with 467 additions and 54 deletions

View File

@ -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: "フォロー"

View File

@ -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: "フォロー"

View File

@ -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"

View File

@ -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: "フォロー"

View File

@ -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"

View File

@ -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: "フォロー"

View File

@ -73,6 +73,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 +734,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 +749,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 +1007,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 +1364,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 +1378,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 +1400,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: "フォローされています"

View File

@ -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: "フォロー"

View File

@ -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: "フォロー"

View File

@ -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"

View File

@ -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: "フォロー"

View File

@ -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"

View File

@ -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: "フォロー"

View File

@ -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: "フォロー"

View File

@ -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: "フォロー"

View File

@ -1,8 +1,8 @@
{ {
"name": "misskey", "name": "misskey",
"author": "syuilo <i@syuilo.com>", "author": "syuilo <i@syuilo.com>",
"version": "8.28.0", "version": "8.30.0",
"clientVersion": "1.0.9400", "clientVersion": "1.0.9481",
"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",

View File

@ -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>

View File

@ -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);

View 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.map(x => [x.name, x.count])"
:color="color"
font-family="Roboto">
<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 == 1) {
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>

View File

@ -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>

View File

@ -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();
}, },

View File

@ -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

View File

@ -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,

View File

@ -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',

View 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>

View File

@ -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,

View File

@ -50,6 +50,12 @@
</div> </div>
</div> </div>
<div class="tag-cloud block">
<div>
<mk-tag-cloud/>
</div>
</div>
<div class="nav block"> <div class="nav block">
<div> <div>
<mk-nav class="nav"/> <mk-nav class="nav"/>
@ -69,6 +75,16 @@
<mk-welcome-timeline class="tl" :max="20"/> <mk-welcome-timeline class="tl" :max="20"/>
</div> </div>
</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>
@ -92,6 +108,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 +121,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;
@ -210,13 +228,12 @@ root(isDark)
> .body > .body
display grid display grid
grid-template-rows 1fr 1fr 64px grid-template-rows 1fr 1fr 256px 64px
grid-template-columns 1fr 1fr 350px grid-template-columns 1fr 1fr 350px
gap 16px gap 16px
width 100% width 100%
max-width 1200px max-width 1200px
height 100vh height 1200px
min-height 950px
margin 0 auto margin 0 auto
padding 64px padding 64px
@ -287,8 +304,8 @@ root(isDark)
> .char > .char
display block display block
position absolute position absolute
right 0 right 16px
bottom 0 bottom 16px
width 180px width 180px
opacity 0.3 opacity 0.3
@ -328,17 +345,25 @@ root(isDark)
background-position center center background-position center center
background-size cover background-size cover
> .tag-cloud
grid-row 3
grid-column 1 / 3
> div
height 256px
padding 32px
> .nav > .nav
display flex display flex
justify-content center justify-content center
align-items center align-items center
grid-row 3 grid-row 4
grid-column 1 / 3 grid-column 1 / 3
font-size 14px font-size 14px
> .side > .side
display grid display grid
grid-row 1 / 4 grid-row 1 / 5
grid-column 3 grid-column 3
grid-template-rows 1fr 350px grid-template-rows 1fr 350px
grid-template-columns 1fr grid-template-columns 1fr
@ -354,6 +379,18 @@ root(isDark)
grid-column 1 grid-column 1
padding 8px 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)

View File

@ -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,

View File

@ -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',

View File

@ -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,10 @@
<div v-html="announcement.text"></div> <div v-html="announcement.text"></div>
</article> </article>
</div> </div>
<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 +43,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 +71,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 +165,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 +206,14 @@ root(isDark)
> .title > .title
font-weight bold font-weight bold
> .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

View File

@ -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,

View File

@ -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[];
}; };

View File

@ -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 });

View 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);
});

View File

@ -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++;

View File

@ -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
}); });
}); });

View File

@ -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')

View File

@ -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')

View File

@ -196,7 +196,7 @@ module.exports = {
}, { }, {
loader: 'sass-loader', loader: 'sass-loader',
options: { options: {
importer: jsonImporter, importer: jsonImporter(),
} }
}] }]
}, { }, {