Compare commits
122 Commits
Author | SHA1 | Date | |
---|---|---|---|
f7228e79bb | |||
d3e250288a | |||
38f8043cb2 | |||
a61320ca8c | |||
4bc9bad34f | |||
4392e64672 | |||
74a0d60766 | |||
012a2b6b00 | |||
584bca7658 | |||
5dcd96d926 | |||
bd2be2815c | |||
2a5635492a | |||
eeea7527c1 | |||
d943a9a2f4 | |||
d4335f0e4d | |||
054f7cbdaa | |||
6ff95dab89 | |||
4461bde5da | |||
19152c28cb | |||
dda2967e2d | |||
a680bcda1f | |||
8d24fcba6a | |||
2a96429be8 | |||
5c6f376f4e | |||
1b24fad95f | |||
87743d9ef9 | |||
8ffd0abb1b | |||
2fed09ec18 | |||
6daabb35de | |||
59e98aa06c | |||
3601d95733 | |||
2c57dfd528 | |||
2348f2586c | |||
ed11f954aa | |||
5765a8e38e | |||
4a925fade1 | |||
fca86f43c4 | |||
12005de4c0 | |||
2e3d0d3435 | |||
7d76887517 | |||
bf39ecd1e5 | |||
7ebee09f74 | |||
952a49f749 | |||
8f8c67ad6d | |||
ce659f9926 | |||
c23ec555ff | |||
25b0a93acd | |||
7b2b7d1456 | |||
37444939ab | |||
2fee2e5166 | |||
98bd6c3cb8 | |||
fc31e44fd2 | |||
12f89f0e2e | |||
cdf15fc43a | |||
2a12af28dd | |||
f128fceaba | |||
26c5d66994 | |||
bd390d424a | |||
6b85730361 | |||
d6176d1901 | |||
43f336bea4 | |||
d2ed9e965e | |||
ea73e9d5de | |||
36ef862fc6 | |||
999275ca2c | |||
78c36ec260 | |||
c985fed3e4 | |||
f13fe431b8 | |||
f1d7cc08bb | |||
e662dfbcfb | |||
8aaf667f78 | |||
fdfea73bdb | |||
50161bc84d | |||
8046a4488d | |||
e818c37a0c | |||
16ffa0c3c7 | |||
6a9b839e62 | |||
b5da01931c | |||
99b6896cf4 | |||
0ac05df628 | |||
83726ddcec | |||
be627d488c | |||
e615a3fdf3 | |||
f670345d45 | |||
6032ec3823 | |||
01ed052ae6 | |||
88a9a7c48f | |||
d74755f0a4 | |||
e05871a7f8 | |||
fed44e2f2b | |||
2189f450df | |||
288e8f0f75 | |||
dfe7eaaa04 | |||
51b166b419 | |||
0ac9a85314 | |||
d153297294 | |||
ec71658087 | |||
3f359e67b3 | |||
3220d69a69 | |||
385116bf30 | |||
f3b476a348 | |||
d0dec99222 | |||
b3fa50d4d1 | |||
1dbf245f76 | |||
7c092bc04c | |||
b8f1a8a243 | |||
c2b235b4a3 | |||
19a9d8d254 | |||
c79d29bd6c | |||
14816a1c6d | |||
0c86f1c1aa | |||
8f440ae633 | |||
863a5ba872 | |||
4257fed500 | |||
299f83684b | |||
ebeaef94e2 | |||
2399ba05cd | |||
8bcfa97349 | |||
dd3e3ddcdd | |||
2555e23b10 | |||
1595683904 | |||
d8dcc4da27 |
@ -109,6 +109,11 @@ common:
|
|||||||
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
||||||
verified-user: "公式アカウント"
|
verified-user: "公式アカウント"
|
||||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||||
|
always-show-nsfw: "常に閲覧注意のメディアを表示する"
|
||||||
|
always-mark-nsfw: "常にメディアを閲覧注意として投稿"
|
||||||
|
show-full-acct: "ユーザー名のホストを省略しない"
|
||||||
|
enable-animations: "アニメーションを使用"
|
||||||
|
this-setting-is-this-device-only: "このデバイスのみ"
|
||||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "引き分け"
|
drawn: "引き分け"
|
||||||
@ -253,6 +258,9 @@ common/views/components/connect-failed.troubleshooter.vue:
|
|||||||
success-desc: "正常に接続できるようです。ページを再度読み込みしてください。"
|
success-desc: "正常に接続できるようです。ページを再度読み込みしてください。"
|
||||||
flush: "キャッシュの削除"
|
flush: "キャッシュの削除"
|
||||||
set-version: "バージョン指定"
|
set-version: "バージョン指定"
|
||||||
|
common/views/components/media-banner.vue:
|
||||||
|
sensitive: "閲覧注意"
|
||||||
|
click-to-show: "クリックして表示"
|
||||||
common/views/components/cw-button.vue:
|
common/views/components/cw-button.vue:
|
||||||
hide: "隠す"
|
hide: "隠す"
|
||||||
show: "もっと見る"
|
show: "もっと見る"
|
||||||
@ -461,6 +469,7 @@ desktop/views/components/charts.vue:
|
|||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
|
network: "ネットワーク"
|
||||||
charts:
|
charts:
|
||||||
notes: "投稿の増減 (統合)"
|
notes: "投稿の増減 (統合)"
|
||||||
local-notes: "投稿の増減 (ローカル)"
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
@ -472,6 +481,9 @@ desktop/views/components/charts.vue:
|
|||||||
drive-total: "ドライブ使用量の累計"
|
drive-total: "ドライブ使用量の累計"
|
||||||
drive-files: "ドライブのファイル数の増減"
|
drive-files: "ドライブのファイル数の増減"
|
||||||
drive-files-total: "ドライブのファイル数の累計"
|
drive-files-total: "ドライブのファイル数の累計"
|
||||||
|
network-requests: "リクエスト"
|
||||||
|
network-time: "応答時間"
|
||||||
|
network-usage: "通信量"
|
||||||
desktop/views/components/choose-file-from-drive-window.vue:
|
desktop/views/components/choose-file-from-drive-window.vue:
|
||||||
choose-file: "ファイル選択中"
|
choose-file: "ファイル選択中"
|
||||||
upload: "PCからドライブにファイルをアップロード"
|
upload: "PCからドライブにファイルをアップロード"
|
||||||
|
@ -109,6 +109,11 @@ common:
|
|||||||
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
||||||
verified-user: "公式アカウント"
|
verified-user: "公式アカウント"
|
||||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||||
|
always-show-nsfw: "常に閲覧注意のメディアを表示する"
|
||||||
|
always-mark-nsfw: "常にメディアを閲覧注意として投稿"
|
||||||
|
show-full-acct: "ユーザー名のホストを省略しない"
|
||||||
|
enable-animations: "アニメーションを使用"
|
||||||
|
this-setting-is-this-device-only: "このデバイスのみ"
|
||||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "引き分け"
|
drawn: "引き分け"
|
||||||
@ -253,6 +258,9 @@ common/views/components/connect-failed.troubleshooter.vue:
|
|||||||
success-desc: "Die Verbindung scheint zu funktionieren. Bitte lade die Seite neu."
|
success-desc: "Die Verbindung scheint zu funktionieren. Bitte lade die Seite neu."
|
||||||
flush: "Cache leeren"
|
flush: "Cache leeren"
|
||||||
set-version: "Version angeben"
|
set-version: "Version angeben"
|
||||||
|
common/views/components/media-banner.vue:
|
||||||
|
sensitive: "閲覧注意"
|
||||||
|
click-to-show: "クリックして表示"
|
||||||
common/views/components/cw-button.vue:
|
common/views/components/cw-button.vue:
|
||||||
hide: "隠す"
|
hide: "隠す"
|
||||||
show: "もっと見る"
|
show: "もっと見る"
|
||||||
@ -461,6 +469,7 @@ desktop/views/components/charts.vue:
|
|||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
|
network: "ネットワーク"
|
||||||
charts:
|
charts:
|
||||||
notes: "投稿の増減 (統合)"
|
notes: "投稿の増減 (統合)"
|
||||||
local-notes: "投稿の増減 (ローカル)"
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
@ -472,6 +481,9 @@ desktop/views/components/charts.vue:
|
|||||||
drive-total: "ドライブ使用量の累計"
|
drive-total: "ドライブ使用量の累計"
|
||||||
drive-files: "ドライブのファイル数の増減"
|
drive-files: "ドライブのファイル数の増減"
|
||||||
drive-files-total: "ドライブのファイル数の累計"
|
drive-files-total: "ドライブのファイル数の累計"
|
||||||
|
network-requests: "リクエスト"
|
||||||
|
network-time: "応答時間"
|
||||||
|
network-usage: "通信量"
|
||||||
desktop/views/components/choose-file-from-drive-window.vue:
|
desktop/views/components/choose-file-from-drive-window.vue:
|
||||||
choose-file: "Datei auswählen"
|
choose-file: "Datei auswählen"
|
||||||
upload: "Dateien von deinem PC hochladen"
|
upload: "Dateien von deinem PC hochladen"
|
||||||
|
@ -109,6 +109,11 @@ common:
|
|||||||
use-contrast-reversi-stones: "Make the stone color clear in reversi"
|
use-contrast-reversi-stones: "Make the stone color clear in reversi"
|
||||||
verified-user: "Verified account"
|
verified-user: "Verified account"
|
||||||
disable-animated-mfm: "Disable animated texts in a post"
|
disable-animated-mfm: "Disable animated texts in a post"
|
||||||
|
always-show-nsfw: "常に閲覧注意のメディアを表示する"
|
||||||
|
always-mark-nsfw: "常にメディアを閲覧注意として投稿"
|
||||||
|
show-full-acct: "Do not omit the hostname from the username"
|
||||||
|
enable-animations: "Enable animations"
|
||||||
|
this-setting-is-this-device-only: "Only for this device"
|
||||||
do-not-use-in-production: 'As this is for development, do not use this in production.'
|
do-not-use-in-production: 'As this is for development, do not use this in production.'
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "Draw"
|
drawn: "Draw"
|
||||||
@ -253,6 +258,9 @@ common/views/components/connect-failed.troubleshooter.vue:
|
|||||||
success-desc: "Looks like we have a connection. Please reload the page."
|
success-desc: "Looks like we have a connection. Please reload the page."
|
||||||
flush: "Clean cache"
|
flush: "Clean cache"
|
||||||
set-version: "Specify version"
|
set-version: "Specify version"
|
||||||
|
common/views/components/media-banner.vue:
|
||||||
|
sensitive: "NSFW"
|
||||||
|
click-to-show: "Click to show"
|
||||||
common/views/components/cw-button.vue:
|
common/views/components/cw-button.vue:
|
||||||
hide: "Hide"
|
hide: "Hide"
|
||||||
show: "See more"
|
show: "See more"
|
||||||
@ -461,6 +469,7 @@ desktop/views/components/charts.vue:
|
|||||||
notes: "Posts"
|
notes: "Posts"
|
||||||
users: "Users"
|
users: "Users"
|
||||||
drive: "Drive"
|
drive: "Drive"
|
||||||
|
network: "Network"
|
||||||
charts:
|
charts:
|
||||||
notes: "The number of posts: increase/decrease (Combined)"
|
notes: "The number of posts: increase/decrease (Combined)"
|
||||||
local-notes: "The number of posts: increase/decrease (Local)"
|
local-notes: "The number of posts: increase/decrease (Local)"
|
||||||
@ -472,6 +481,9 @@ desktop/views/components/charts.vue:
|
|||||||
drive-total: "Capacity used as the storage: cumulative total"
|
drive-total: "Capacity used as the storage: cumulative total"
|
||||||
drive-files: "The number of files on the storage: increase/decrease"
|
drive-files: "The number of files on the storage: increase/decrease"
|
||||||
drive-files-total: "The number of files on the storage: cumulative total"
|
drive-files-total: "The number of files on the storage: cumulative total"
|
||||||
|
network-requests: "Requests"
|
||||||
|
network-time: "Response time"
|
||||||
|
network-usage: "Traffic"
|
||||||
desktop/views/components/choose-file-from-drive-window.vue:
|
desktop/views/components/choose-file-from-drive-window.vue:
|
||||||
choose-file: "Choose files"
|
choose-file: "Choose files"
|
||||||
upload: "Upload files from your device"
|
upload: "Upload files from your device"
|
||||||
@ -778,7 +790,7 @@ desktop/views/components/settings.profile.vue:
|
|||||||
birthday: "Birthday"
|
birthday: "Birthday"
|
||||||
save: "Update profile"
|
save: "Update profile"
|
||||||
locked-account: "Protect your account"
|
locked-account: "Protect your account"
|
||||||
is-locked: "フォローを承認制にする"
|
is-locked: "Follow request needs approval"
|
||||||
other: "Other"
|
other: "Other"
|
||||||
is-bot: "This account is a Bot"
|
is-bot: "This account is a Bot"
|
||||||
is-cat: "This account is a Cat"
|
is-cat: "This account is a Cat"
|
||||||
@ -1160,7 +1172,7 @@ mobile/views/pages/settings/settings.profile.vue:
|
|||||||
avatar: "Avatar"
|
avatar: "Avatar"
|
||||||
banner: "Banner"
|
banner: "Banner"
|
||||||
is-cat: "This account is a Cat"
|
is-cat: "This account is a Cat"
|
||||||
is-locked: "フォローを承認制にする"
|
is-locked: "Follow request needs approval"
|
||||||
advanced: "Advanced"
|
advanced: "Advanced"
|
||||||
privacy: "Privacy"
|
privacy: "Privacy"
|
||||||
save: "Update profile"
|
save: "Update profile"
|
||||||
|
@ -109,6 +109,11 @@ common:
|
|||||||
use-contrast-reversi-stones: "Hacer el color de la piedra claro en Reversi"
|
use-contrast-reversi-stones: "Hacer el color de la piedra claro en Reversi"
|
||||||
verified-user: "Cuenta verificada"
|
verified-user: "Cuenta verificada"
|
||||||
disable-animated-mfm: "Desactivar texto animado en una publicación"
|
disable-animated-mfm: "Desactivar texto animado en una publicación"
|
||||||
|
always-show-nsfw: "常に閲覧注意のメディアを表示する"
|
||||||
|
always-mark-nsfw: "常にメディアを閲覧注意として投稿"
|
||||||
|
show-full-acct: "ユーザー名のホストを省略しない"
|
||||||
|
enable-animations: "アニメーションを使用"
|
||||||
|
this-setting-is-this-device-only: "このデバイスのみ"
|
||||||
do-not-use-in-production: 'Esto está en desarrollo, no usarlo para producción.'
|
do-not-use-in-production: 'Esto está en desarrollo, no usarlo para producción.'
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "Empatado"
|
drawn: "Empatado"
|
||||||
@ -253,6 +258,9 @@ common/views/components/connect-failed.troubleshooter.vue:
|
|||||||
success-desc: "Parece que la conexión ha sido posible. Por favor refresca la página."
|
success-desc: "Parece que la conexión ha sido posible. Por favor refresca la página."
|
||||||
flush: "Limpiar la memoria caché"
|
flush: "Limpiar la memoria caché"
|
||||||
set-version: "Escoge la versión"
|
set-version: "Escoge la versión"
|
||||||
|
common/views/components/media-banner.vue:
|
||||||
|
sensitive: "閲覧注意"
|
||||||
|
click-to-show: "クリックして表示"
|
||||||
common/views/components/cw-button.vue:
|
common/views/components/cw-button.vue:
|
||||||
hide: "隠す"
|
hide: "隠す"
|
||||||
show: "もっと見る"
|
show: "もっと見る"
|
||||||
@ -461,6 +469,7 @@ desktop/views/components/charts.vue:
|
|||||||
notes: "Publicaciones"
|
notes: "Publicaciones"
|
||||||
users: "Usuarios"
|
users: "Usuarios"
|
||||||
drive: "Unidad"
|
drive: "Unidad"
|
||||||
|
network: "ネットワーク"
|
||||||
charts:
|
charts:
|
||||||
notes: "Número de publicaciones: aumentar/disminuir (Combinado)"
|
notes: "Número de publicaciones: aumentar/disminuir (Combinado)"
|
||||||
local-notes: "Número de publicaciones: aumentar/disminuir (Local)"
|
local-notes: "Número de publicaciones: aumentar/disminuir (Local)"
|
||||||
@ -472,6 +481,9 @@ desktop/views/components/charts.vue:
|
|||||||
drive-total: "Capacidad de almacenamiento usada: Acumulativa total"
|
drive-total: "Capacidad de almacenamiento usada: Acumulativa total"
|
||||||
drive-files: "Número de archivos almacenados: aumentar/disminuir"
|
drive-files: "Número de archivos almacenados: aumentar/disminuir"
|
||||||
drive-files-total: "Número de archivos almacenados: Acumulativo total"
|
drive-files-total: "Número de archivos almacenados: Acumulativo total"
|
||||||
|
network-requests: "リクエスト"
|
||||||
|
network-time: "応答時間"
|
||||||
|
network-usage: "通信量"
|
||||||
desktop/views/components/choose-file-from-drive-window.vue:
|
desktop/views/components/choose-file-from-drive-window.vue:
|
||||||
choose-file: "Escoger archivos"
|
choose-file: "Escoger archivos"
|
||||||
upload: "Cargar archivos de tu dispositivo"
|
upload: "Cargar archivos de tu dispositivo"
|
||||||
|
@ -109,7 +109,12 @@ common:
|
|||||||
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
||||||
verified-user: "Compte vérifié"
|
verified-user: "Compte vérifié"
|
||||||
disable-animated-mfm: "Désactiver les textes animés dans les publications"
|
disable-animated-mfm: "Désactiver les textes animés dans les publications"
|
||||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
always-show-nsfw: "常に閲覧注意のメディアを表示する"
|
||||||
|
always-mark-nsfw: "常にメディアを閲覧注意として投稿"
|
||||||
|
show-full-acct: "ユーザー名のホストを省略しない"
|
||||||
|
enable-animations: "アニメーションを使用"
|
||||||
|
this-setting-is-this-device-only: "Uniquement sur cet appareil"
|
||||||
|
do-not-use-in-production: 'Il s’agit d’une version de développement. Ne pas utiliser dans un environnement de production.'
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "Partie nulle"
|
drawn: "Partie nulle"
|
||||||
my-turn: "C’est votre tour"
|
my-turn: "C’est votre tour"
|
||||||
@ -253,9 +258,12 @@ common/views/components/connect-failed.troubleshooter.vue:
|
|||||||
success-desc: "Succès de la connexion au serveur de Misskey. Veuillez recharger la page."
|
success-desc: "Succès de la connexion au serveur de Misskey. Veuillez recharger la page."
|
||||||
flush: "Vider le cache"
|
flush: "Vider le cache"
|
||||||
set-version: "Choisissez une version"
|
set-version: "Choisissez une version"
|
||||||
|
common/views/components/media-banner.vue:
|
||||||
|
sensitive: "閲覧注意"
|
||||||
|
click-to-show: "クリックして表示"
|
||||||
common/views/components/cw-button.vue:
|
common/views/components/cw-button.vue:
|
||||||
hide: "隠す"
|
hide: "Masquer"
|
||||||
show: "もっと見る"
|
show: "Voir plus"
|
||||||
common/views/components/messaging.vue:
|
common/views/components/messaging.vue:
|
||||||
search-user: "Trouver un·e utilisateur·trice"
|
search-user: "Trouver un·e utilisateur·trice"
|
||||||
you: "Vous"
|
you: "Vous"
|
||||||
@ -461,6 +469,7 @@ desktop/views/components/charts.vue:
|
|||||||
notes: "Publications"
|
notes: "Publications"
|
||||||
users: "Utilisateurs"
|
users: "Utilisateurs"
|
||||||
drive: "Drive"
|
drive: "Drive"
|
||||||
|
network: "Réseau"
|
||||||
charts:
|
charts:
|
||||||
notes: "投稿の増減 (統合)"
|
notes: "投稿の増減 (統合)"
|
||||||
local-notes: "投稿の増減 (ローカル)"
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
@ -472,6 +481,9 @@ desktop/views/components/charts.vue:
|
|||||||
drive-total: "ドライブ使用量の累計"
|
drive-total: "ドライブ使用量の累計"
|
||||||
drive-files: "ドライブのファイル数の増減"
|
drive-files: "ドライブのファイル数の増減"
|
||||||
drive-files-total: "ドライブのファイル数の累計"
|
drive-files-total: "ドライブのファイル数の累計"
|
||||||
|
network-requests: "Requêtes"
|
||||||
|
network-time: "Temps de réponse"
|
||||||
|
network-usage: "通信量"
|
||||||
desktop/views/components/choose-file-from-drive-window.vue:
|
desktop/views/components/choose-file-from-drive-window.vue:
|
||||||
choose-file: "Sélection de fichiers"
|
choose-file: "Sélection de fichiers"
|
||||||
upload: "Téléverser des fichiers à partir de votre ordinateur"
|
upload: "Téléverser des fichiers à partir de votre ordinateur"
|
||||||
@ -665,7 +677,7 @@ desktop/views/components/settings.vue:
|
|||||||
fetch-on-scroll-desc: "Chargement automatique du contenu lors du défilement de la page."
|
fetch-on-scroll-desc: "Chargement automatique du contenu lors du défilement de la page."
|
||||||
note-visibility: "Visibilité de la publication"
|
note-visibility: "Visibilité de la publication"
|
||||||
default-note-visibility: "Visibilité par défaut"
|
default-note-visibility: "Visibilité par défaut"
|
||||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
remember-note-visibility: "Se souvenir du mode de visibilité de la publication"
|
||||||
auto-popout: "Fenêtre contextuelle automatique"
|
auto-popout: "Fenêtre contextuelle automatique"
|
||||||
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
||||||
advanced: "Paramètres avancés"
|
advanced: "Paramètres avancés"
|
||||||
@ -1161,8 +1173,8 @@ mobile/views/pages/settings/settings.profile.vue:
|
|||||||
banner: "Bannière"
|
banner: "Bannière"
|
||||||
is-cat: "Ce compte est un Bot"
|
is-cat: "Ce compte est un Bot"
|
||||||
is-locked: "フォローを承認制にする"
|
is-locked: "フォローを承認制にする"
|
||||||
advanced: "その他"
|
advanced: "Avancé"
|
||||||
privacy: "プライバシー"
|
privacy: "Vie privée"
|
||||||
save: "Mettre à jour le profil"
|
save: "Mettre à jour le profil"
|
||||||
saved: "Profil mis à jour avec succès"
|
saved: "Profil mis à jour avec succès"
|
||||||
uploading: "En cours d'envoi"
|
uploading: "En cours d'envoi"
|
||||||
@ -1184,7 +1196,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: "ユーザー名にコントラストを付ける"
|
contrasted-acct: "Nom d’utilisateur contrasté"
|
||||||
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"
|
||||||
|
@ -109,6 +109,11 @@ common:
|
|||||||
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
||||||
verified-user: "公式アカウント"
|
verified-user: "公式アカウント"
|
||||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||||
|
always-show-nsfw: "常に閲覧注意のメディアを表示する"
|
||||||
|
always-mark-nsfw: "常にメディアを閲覧注意として投稿"
|
||||||
|
show-full-acct: "ユーザー名のホストを省略しない"
|
||||||
|
enable-animations: "アニメーションを使用"
|
||||||
|
this-setting-is-this-device-only: "このデバイスのみ"
|
||||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "引き分け"
|
drawn: "引き分け"
|
||||||
@ -253,6 +258,9 @@ common/views/components/connect-failed.troubleshooter.vue:
|
|||||||
success-desc: "正常に接続できるようです。ページを再度読み込みしてください。"
|
success-desc: "正常に接続できるようです。ページを再度読み込みしてください。"
|
||||||
flush: "キャッシュの削除"
|
flush: "キャッシュの削除"
|
||||||
set-version: "バージョン指定"
|
set-version: "バージョン指定"
|
||||||
|
common/views/components/media-banner.vue:
|
||||||
|
sensitive: "閲覧注意"
|
||||||
|
click-to-show: "クリックして表示"
|
||||||
common/views/components/cw-button.vue:
|
common/views/components/cw-button.vue:
|
||||||
hide: "隠す"
|
hide: "隠す"
|
||||||
show: "もっと見る"
|
show: "もっと見る"
|
||||||
@ -461,6 +469,7 @@ desktop/views/components/charts.vue:
|
|||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
|
network: "ネットワーク"
|
||||||
charts:
|
charts:
|
||||||
notes: "投稿の増減 (統合)"
|
notes: "投稿の増減 (統合)"
|
||||||
local-notes: "投稿の増減 (ローカル)"
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
@ -472,6 +481,9 @@ desktop/views/components/charts.vue:
|
|||||||
drive-total: "ドライブ使用量の累計"
|
drive-total: "ドライブ使用量の累計"
|
||||||
drive-files: "ドライブのファイル数の増減"
|
drive-files: "ドライブのファイル数の増減"
|
||||||
drive-files-total: "ドライブのファイル数の累計"
|
drive-files-total: "ドライブのファイル数の累計"
|
||||||
|
network-requests: "リクエスト"
|
||||||
|
network-time: "応答時間"
|
||||||
|
network-usage: "通信量"
|
||||||
desktop/views/components/choose-file-from-drive-window.vue:
|
desktop/views/components/choose-file-from-drive-window.vue:
|
||||||
choose-file: "ファイル選択中"
|
choose-file: "ファイル選択中"
|
||||||
upload: "PCからドライブにファイルをアップロード"
|
upload: "PCからドライブにファイルをアップロード"
|
||||||
|
@ -117,6 +117,9 @@ common:
|
|||||||
verified-user: "公式アカウント"
|
verified-user: "公式アカウント"
|
||||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||||
always-show-nsfw: "常に閲覧注意のメディアを表示する"
|
always-show-nsfw: "常に閲覧注意のメディアを表示する"
|
||||||
|
always-mark-nsfw: "常にメディアを閲覧注意として投稿"
|
||||||
|
show-full-acct: "ユーザー名のホストを省略しない"
|
||||||
|
enable-animations: "アニメーションを使用"
|
||||||
this-setting-is-this-device-only: "このデバイスのみ"
|
this-setting-is-this-device-only: "このデバイスのみ"
|
||||||
|
|
||||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||||
@ -275,6 +278,10 @@ common/views/components/connect-failed.troubleshooter.vue:
|
|||||||
flush: "キャッシュの削除"
|
flush: "キャッシュの削除"
|
||||||
set-version: "バージョン指定"
|
set-version: "バージョン指定"
|
||||||
|
|
||||||
|
common/views/components/media-banner.vue:
|
||||||
|
sensitive: "閲覧注意"
|
||||||
|
click-to-show: "クリックして表示"
|
||||||
|
|
||||||
common/views/components/cw-button.vue:
|
common/views/components/cw-button.vue:
|
||||||
hide: "隠す"
|
hide: "隠す"
|
||||||
show: "もっと見る"
|
show: "もっと見る"
|
||||||
@ -516,6 +523,7 @@ desktop/views/components/charts.vue:
|
|||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
|
network: "ネットワーク"
|
||||||
charts:
|
charts:
|
||||||
notes: "投稿の増減 (統合)"
|
notes: "投稿の増減 (統合)"
|
||||||
local-notes: "投稿の増減 (ローカル)"
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
@ -527,6 +535,9 @@ desktop/views/components/charts.vue:
|
|||||||
drive-total: "ドライブ使用量の累計"
|
drive-total: "ドライブ使用量の累計"
|
||||||
drive-files: "ドライブのファイル数の増減"
|
drive-files: "ドライブのファイル数の増減"
|
||||||
drive-files-total: "ドライブのファイル数の累計"
|
drive-files-total: "ドライブのファイル数の累計"
|
||||||
|
network-requests: "リクエスト"
|
||||||
|
network-time: "応答時間"
|
||||||
|
network-usage: "通信量"
|
||||||
|
|
||||||
desktop/views/components/choose-file-from-drive-window.vue:
|
desktop/views/components/choose-file-from-drive-window.vue:
|
||||||
choose-file: "ファイル選択中"
|
choose-file: "ファイル選択中"
|
||||||
|
@ -109,6 +109,11 @@ common:
|
|||||||
use-contrast-reversi-stones: "リバーシのアイコンにコントラストをつけんで!"
|
use-contrast-reversi-stones: "リバーシのアイコンにコントラストをつけんで!"
|
||||||
verified-user: "アメちゃん付きアカウント"
|
verified-user: "アメちゃん付きアカウント"
|
||||||
disable-animated-mfm: "投稿内のちょろちょろ動いてんのを止める"
|
disable-animated-mfm: "投稿内のちょろちょろ動いてんのを止める"
|
||||||
|
always-show-nsfw: "常に閲覧注意のメディアを表示する"
|
||||||
|
always-mark-nsfw: "常にメディアを閲覧注意として投稿"
|
||||||
|
show-full-acct: "ユーザー名のホストを省略しない"
|
||||||
|
enable-animations: "アニメーションを使用"
|
||||||
|
this-setting-is-this-device-only: "このデバイスのみ"
|
||||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "おあいこ"
|
drawn: "おあいこ"
|
||||||
@ -253,6 +258,9 @@ common/views/components/connect-failed.troubleshooter.vue:
|
|||||||
success-desc: "正常に接続できるようやわ。ページを再度読み込みしてな。"
|
success-desc: "正常に接続できるようやわ。ページを再度読み込みしてな。"
|
||||||
flush: "キャッシュの削除"
|
flush: "キャッシュの削除"
|
||||||
set-version: "バージョン指定"
|
set-version: "バージョン指定"
|
||||||
|
common/views/components/media-banner.vue:
|
||||||
|
sensitive: "閲覧注意"
|
||||||
|
click-to-show: "クリックして表示"
|
||||||
common/views/components/cw-button.vue:
|
common/views/components/cw-button.vue:
|
||||||
hide: "隠す"
|
hide: "隠す"
|
||||||
show: "もっと見る"
|
show: "もっと見る"
|
||||||
@ -461,6 +469,7 @@ desktop/views/components/charts.vue:
|
|||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
|
network: "ネットワーク"
|
||||||
charts:
|
charts:
|
||||||
notes: "投稿の増減 (統合)"
|
notes: "投稿の増減 (統合)"
|
||||||
local-notes: "投稿の増減 (ローカル)"
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
@ -472,6 +481,9 @@ desktop/views/components/charts.vue:
|
|||||||
drive-total: "ドライブ使用量の累計"
|
drive-total: "ドライブ使用量の累計"
|
||||||
drive-files: "ドライブのファイル数の増減"
|
drive-files: "ドライブのファイル数の増減"
|
||||||
drive-files-total: "ドライブのファイル数の累計"
|
drive-files-total: "ドライブのファイル数の累計"
|
||||||
|
network-requests: "リクエスト"
|
||||||
|
network-time: "応答時間"
|
||||||
|
network-usage: "通信量"
|
||||||
desktop/views/components/choose-file-from-drive-window.vue:
|
desktop/views/components/choose-file-from-drive-window.vue:
|
||||||
choose-file: "ファイル選択中"
|
choose-file: "ファイル選択中"
|
||||||
upload: "PCからドライブにファイルをアップロード"
|
upload: "PCからドライブにファイルをアップロード"
|
||||||
|
@ -109,6 +109,11 @@ common:
|
|||||||
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
||||||
verified-user: "公式アカウント"
|
verified-user: "公式アカウント"
|
||||||
disable-animated-mfm: "게시물의 문자 애니메이션을 비활성화 할"
|
disable-animated-mfm: "게시물의 문자 애니메이션을 비활성화 할"
|
||||||
|
always-show-nsfw: "常に閲覧注意のメディアを表示する"
|
||||||
|
always-mark-nsfw: "常にメディアを閲覧注意として投稿"
|
||||||
|
show-full-acct: "ユーザー名のホストを省略しない"
|
||||||
|
enable-animations: "アニメーションを使用"
|
||||||
|
this-setting-is-this-device-only: "このデバイスのみ"
|
||||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "무승부"
|
drawn: "무승부"
|
||||||
@ -253,6 +258,9 @@ common/views/components/connect-failed.troubleshooter.vue:
|
|||||||
success-desc: "正常に接続できるようです。ページを再度読み込みしてください。"
|
success-desc: "正常に接続できるようです。ページを再度読み込みしてください。"
|
||||||
flush: "キャッシュの削除"
|
flush: "キャッシュの削除"
|
||||||
set-version: "バージョン指定"
|
set-version: "バージョン指定"
|
||||||
|
common/views/components/media-banner.vue:
|
||||||
|
sensitive: "閲覧注意"
|
||||||
|
click-to-show: "クリックして表示"
|
||||||
common/views/components/cw-button.vue:
|
common/views/components/cw-button.vue:
|
||||||
hide: "隠す"
|
hide: "隠す"
|
||||||
show: "もっと見る"
|
show: "もっと見る"
|
||||||
@ -461,6 +469,7 @@ desktop/views/components/charts.vue:
|
|||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
|
network: "ネットワーク"
|
||||||
charts:
|
charts:
|
||||||
notes: "投稿の増減 (統合)"
|
notes: "投稿の増減 (統合)"
|
||||||
local-notes: "投稿の増減 (ローカル)"
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
@ -472,6 +481,9 @@ desktop/views/components/charts.vue:
|
|||||||
drive-total: "ドライブ使用量の累計"
|
drive-total: "ドライブ使用量の累計"
|
||||||
drive-files: "ドライブのファイル数の増減"
|
drive-files: "ドライブのファイル数の増減"
|
||||||
drive-files-total: "ドライブのファイル数の累計"
|
drive-files-total: "ドライブのファイル数の累計"
|
||||||
|
network-requests: "リクエスト"
|
||||||
|
network-time: "応答時間"
|
||||||
|
network-usage: "通信量"
|
||||||
desktop/views/components/choose-file-from-drive-window.vue:
|
desktop/views/components/choose-file-from-drive-window.vue:
|
||||||
choose-file: "ファイル選択中"
|
choose-file: "ファイル選択中"
|
||||||
upload: "PCからドライブにファイルをアップロード"
|
upload: "PCからドライブにファイルをアップロード"
|
||||||
|
@ -109,6 +109,11 @@ common:
|
|||||||
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
||||||
verified-user: "公式アカウント"
|
verified-user: "公式アカウント"
|
||||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||||
|
always-show-nsfw: "常に閲覧注意のメディアを表示する"
|
||||||
|
always-mark-nsfw: "常にメディアを閲覧注意として投稿"
|
||||||
|
show-full-acct: "ユーザー名のホストを省略しない"
|
||||||
|
enable-animations: "アニメーションを使用"
|
||||||
|
this-setting-is-this-device-only: "このデバイスのみ"
|
||||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "引き分け"
|
drawn: "引き分け"
|
||||||
@ -253,6 +258,9 @@ common/views/components/connect-failed.troubleshooter.vue:
|
|||||||
success-desc: "Het verbinden lijkt te lukken. Herlaad de pagina."
|
success-desc: "Het verbinden lijkt te lukken. Herlaad de pagina."
|
||||||
flush: "Cache leegmaken"
|
flush: "Cache leegmaken"
|
||||||
set-version: "Versie opgeven"
|
set-version: "Versie opgeven"
|
||||||
|
common/views/components/media-banner.vue:
|
||||||
|
sensitive: "閲覧注意"
|
||||||
|
click-to-show: "クリックして表示"
|
||||||
common/views/components/cw-button.vue:
|
common/views/components/cw-button.vue:
|
||||||
hide: "隠す"
|
hide: "隠す"
|
||||||
show: "もっと見る"
|
show: "もっと見る"
|
||||||
@ -461,6 +469,7 @@ desktop/views/components/charts.vue:
|
|||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
|
network: "ネットワーク"
|
||||||
charts:
|
charts:
|
||||||
notes: "投稿の増減 (統合)"
|
notes: "投稿の増減 (統合)"
|
||||||
local-notes: "投稿の増減 (ローカル)"
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
@ -472,6 +481,9 @@ desktop/views/components/charts.vue:
|
|||||||
drive-total: "ドライブ使用量の累計"
|
drive-total: "ドライブ使用量の累計"
|
||||||
drive-files: "ドライブのファイル数の増減"
|
drive-files: "ドライブのファイル数の増減"
|
||||||
drive-files-total: "ドライブのファイル数の累計"
|
drive-files-total: "ドライブのファイル数の累計"
|
||||||
|
network-requests: "リクエスト"
|
||||||
|
network-time: "応答時間"
|
||||||
|
network-usage: "通信量"
|
||||||
desktop/views/components/choose-file-from-drive-window.vue:
|
desktop/views/components/choose-file-from-drive-window.vue:
|
||||||
choose-file: "Bestanden kiezen"
|
choose-file: "Bestanden kiezen"
|
||||||
upload: "Bestanden uploaden van je computer"
|
upload: "Bestanden uploaden van je computer"
|
||||||
|
@ -109,6 +109,11 @@ common:
|
|||||||
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
||||||
verified-user: "公式アカウント"
|
verified-user: "公式アカウント"
|
||||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||||
|
always-show-nsfw: "常に閲覧注意のメディアを表示する"
|
||||||
|
always-mark-nsfw: "常にメディアを閲覧注意として投稿"
|
||||||
|
show-full-acct: "ユーザー名のホストを省略しない"
|
||||||
|
enable-animations: "アニメーションを使用"
|
||||||
|
this-setting-is-this-device-only: "このデバイスのみ"
|
||||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "引き分け"
|
drawn: "引き分け"
|
||||||
@ -253,6 +258,9 @@ common/views/components/connect-failed.troubleshooter.vue:
|
|||||||
success-desc: "正常に接続できるようです。ページを再度読み込みしてください。"
|
success-desc: "正常に接続できるようです。ページを再度読み込みしてください。"
|
||||||
flush: "キャッシュの削除"
|
flush: "キャッシュの削除"
|
||||||
set-version: "バージョン指定"
|
set-version: "バージョン指定"
|
||||||
|
common/views/components/media-banner.vue:
|
||||||
|
sensitive: "閲覧注意"
|
||||||
|
click-to-show: "クリックして表示"
|
||||||
common/views/components/cw-button.vue:
|
common/views/components/cw-button.vue:
|
||||||
hide: "隠す"
|
hide: "隠す"
|
||||||
show: "もっと見る"
|
show: "もっと見る"
|
||||||
@ -461,6 +469,7 @@ desktop/views/components/charts.vue:
|
|||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
|
network: "ネットワーク"
|
||||||
charts:
|
charts:
|
||||||
notes: "投稿の増減 (統合)"
|
notes: "投稿の増減 (統合)"
|
||||||
local-notes: "投稿の増減 (ローカル)"
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
@ -472,6 +481,9 @@ desktop/views/components/charts.vue:
|
|||||||
drive-total: "ドライブ使用量の累計"
|
drive-total: "ドライブ使用量の累計"
|
||||||
drive-files: "ドライブのファイル数の増減"
|
drive-files: "ドライブのファイル数の増減"
|
||||||
drive-files-total: "ドライブのファイル数の累計"
|
drive-files-total: "ドライブのファイル数の累計"
|
||||||
|
network-requests: "リクエスト"
|
||||||
|
network-time: "応答時間"
|
||||||
|
network-usage: "通信量"
|
||||||
desktop/views/components/choose-file-from-drive-window.vue:
|
desktop/views/components/choose-file-from-drive-window.vue:
|
||||||
choose-file: "ファイル選択中"
|
choose-file: "ファイル選択中"
|
||||||
upload: "PCからドライブにファイルをアップロード"
|
upload: "PCからドライブにファイルをアップロード"
|
||||||
|
@ -109,6 +109,11 @@ common:
|
|||||||
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
||||||
verified-user: "公式アカウント"
|
verified-user: "公式アカウント"
|
||||||
disable-animated-mfm: "Wyłącz animowany tekst we wpisach"
|
disable-animated-mfm: "Wyłącz animowany tekst we wpisach"
|
||||||
|
always-show-nsfw: "常に閲覧注意のメディアを表示する"
|
||||||
|
always-mark-nsfw: "常にメディアを閲覧注意として投稿"
|
||||||
|
show-full-acct: "ユーザー名のホストを省略しない"
|
||||||
|
enable-animations: "アニメーションを使用"
|
||||||
|
this-setting-is-this-device-only: "このデバイスのみ"
|
||||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "Remis"
|
drawn: "Remis"
|
||||||
@ -253,6 +258,9 @@ common/views/components/connect-failed.troubleshooter.vue:
|
|||||||
success-desc: "Wygląda na to, że udało się połączyć. Odśwież stronę."
|
success-desc: "Wygląda na to, że udało się połączyć. Odśwież stronę."
|
||||||
flush: "Wyczyść pamięć podręczną"
|
flush: "Wyczyść pamięć podręczną"
|
||||||
set-version: "Określ wersję"
|
set-version: "Określ wersję"
|
||||||
|
common/views/components/media-banner.vue:
|
||||||
|
sensitive: "閲覧注意"
|
||||||
|
click-to-show: "クリックして表示"
|
||||||
common/views/components/cw-button.vue:
|
common/views/components/cw-button.vue:
|
||||||
hide: "隠す"
|
hide: "隠す"
|
||||||
show: "もっと見る"
|
show: "もっと見る"
|
||||||
@ -461,6 +469,7 @@ desktop/views/components/charts.vue:
|
|||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
|
network: "ネットワーク"
|
||||||
charts:
|
charts:
|
||||||
notes: "投稿の増減 (統合)"
|
notes: "投稿の増減 (統合)"
|
||||||
local-notes: "投稿の増減 (ローカル)"
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
@ -472,6 +481,9 @@ desktop/views/components/charts.vue:
|
|||||||
drive-total: "ドライブ使用量の累計"
|
drive-total: "ドライブ使用量の累計"
|
||||||
drive-files: "ドライブのファイル数の増減"
|
drive-files: "ドライブのファイル数の増減"
|
||||||
drive-files-total: "ドライブのファイル数の累計"
|
drive-files-total: "ドライブのファイル数の累計"
|
||||||
|
network-requests: "リクエスト"
|
||||||
|
network-time: "応答時間"
|
||||||
|
network-usage: "通信量"
|
||||||
desktop/views/components/choose-file-from-drive-window.vue:
|
desktop/views/components/choose-file-from-drive-window.vue:
|
||||||
choose-file: "Wybierz plik"
|
choose-file: "Wybierz plik"
|
||||||
upload: "Wyślij pliki z Twojego komputera"
|
upload: "Wyślij pliki z Twojego komputera"
|
||||||
|
@ -109,6 +109,11 @@ common:
|
|||||||
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
||||||
verified-user: "Conta verificada"
|
verified-user: "Conta verificada"
|
||||||
disable-animated-mfm: "Desativar texto animado nas publicações"
|
disable-animated-mfm: "Desativar texto animado nas publicações"
|
||||||
|
always-show-nsfw: "常に閲覧注意のメディアを表示する"
|
||||||
|
always-mark-nsfw: "常にメディアを閲覧注意として投稿"
|
||||||
|
show-full-acct: "ユーザー名のホストを省略しない"
|
||||||
|
enable-animations: "アニメーションを使用"
|
||||||
|
this-setting-is-this-device-only: "このデバイスのみ"
|
||||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "Empatado"
|
drawn: "Empatado"
|
||||||
@ -253,6 +258,9 @@ common/views/components/connect-failed.troubleshooter.vue:
|
|||||||
success-desc: "正常に接続できるようです。ページを再度読み込みしてください。"
|
success-desc: "正常に接続できるようです。ページを再度読み込みしてください。"
|
||||||
flush: "Limpar o cache"
|
flush: "Limpar o cache"
|
||||||
set-version: "バージョン指定"
|
set-version: "バージョン指定"
|
||||||
|
common/views/components/media-banner.vue:
|
||||||
|
sensitive: "閲覧注意"
|
||||||
|
click-to-show: "クリックして表示"
|
||||||
common/views/components/cw-button.vue:
|
common/views/components/cw-button.vue:
|
||||||
hide: "隠す"
|
hide: "隠す"
|
||||||
show: "もっと見る"
|
show: "もっと見る"
|
||||||
@ -461,6 +469,7 @@ desktop/views/components/charts.vue:
|
|||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
|
network: "ネットワーク"
|
||||||
charts:
|
charts:
|
||||||
notes: "投稿の増減 (統合)"
|
notes: "投稿の増減 (統合)"
|
||||||
local-notes: "投稿の増減 (ローカル)"
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
@ -472,6 +481,9 @@ desktop/views/components/charts.vue:
|
|||||||
drive-total: "ドライブ使用量の累計"
|
drive-total: "ドライブ使用量の累計"
|
||||||
drive-files: "ドライブのファイル数の増減"
|
drive-files: "ドライブのファイル数の増減"
|
||||||
drive-files-total: "ドライブのファイル数の累計"
|
drive-files-total: "ドライブのファイル数の累計"
|
||||||
|
network-requests: "リクエスト"
|
||||||
|
network-time: "応答時間"
|
||||||
|
network-usage: "通信量"
|
||||||
desktop/views/components/choose-file-from-drive-window.vue:
|
desktop/views/components/choose-file-from-drive-window.vue:
|
||||||
choose-file: "ファイル選択中"
|
choose-file: "ファイル選択中"
|
||||||
upload: "PCからドライブにファイルをアップロード"
|
upload: "PCからドライブにファイルをアップロード"
|
||||||
|
@ -109,6 +109,11 @@ common:
|
|||||||
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
||||||
verified-user: "公式アカウント"
|
verified-user: "公式アカウント"
|
||||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||||
|
always-show-nsfw: "常に閲覧注意のメディアを表示する"
|
||||||
|
always-mark-nsfw: "常にメディアを閲覧注意として投稿"
|
||||||
|
show-full-acct: "ユーザー名のホストを省略しない"
|
||||||
|
enable-animations: "アニメーションを使用"
|
||||||
|
this-setting-is-this-device-only: "このデバイスのみ"
|
||||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "引き分け"
|
drawn: "引き分け"
|
||||||
@ -253,6 +258,9 @@ common/views/components/connect-failed.troubleshooter.vue:
|
|||||||
success-desc: "正常に接続できるようです。ページを再度読み込みしてください。"
|
success-desc: "正常に接続できるようです。ページを再度読み込みしてください。"
|
||||||
flush: "キャッシュの削除"
|
flush: "キャッシュの削除"
|
||||||
set-version: "バージョン指定"
|
set-version: "バージョン指定"
|
||||||
|
common/views/components/media-banner.vue:
|
||||||
|
sensitive: "閲覧注意"
|
||||||
|
click-to-show: "クリックして表示"
|
||||||
common/views/components/cw-button.vue:
|
common/views/components/cw-button.vue:
|
||||||
hide: "隠す"
|
hide: "隠す"
|
||||||
show: "もっと見る"
|
show: "もっと見る"
|
||||||
@ -461,6 +469,7 @@ desktop/views/components/charts.vue:
|
|||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
|
network: "ネットワーク"
|
||||||
charts:
|
charts:
|
||||||
notes: "投稿の増減 (統合)"
|
notes: "投稿の増減 (統合)"
|
||||||
local-notes: "投稿の増減 (ローカル)"
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
@ -472,6 +481,9 @@ desktop/views/components/charts.vue:
|
|||||||
drive-total: "ドライブ使用量の累計"
|
drive-total: "ドライブ使用量の累計"
|
||||||
drive-files: "ドライブのファイル数の増減"
|
drive-files: "ドライブのファイル数の増減"
|
||||||
drive-files-total: "ドライブのファイル数の累計"
|
drive-files-total: "ドライブのファイル数の累計"
|
||||||
|
network-requests: "リクエスト"
|
||||||
|
network-time: "応答時間"
|
||||||
|
network-usage: "通信量"
|
||||||
desktop/views/components/choose-file-from-drive-window.vue:
|
desktop/views/components/choose-file-from-drive-window.vue:
|
||||||
choose-file: "ファイル選択中"
|
choose-file: "ファイル選択中"
|
||||||
upload: "PCからドライブにファイルをアップロード"
|
upload: "PCからドライブにファイルをアップロード"
|
||||||
|
@ -109,6 +109,11 @@ common:
|
|||||||
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
||||||
verified-user: "公式アカウント"
|
verified-user: "公式アカウント"
|
||||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||||
|
always-show-nsfw: "常に閲覧注意のメディアを表示する"
|
||||||
|
always-mark-nsfw: "常にメディアを閲覧注意として投稿"
|
||||||
|
show-full-acct: "ユーザー名のホストを省略しない"
|
||||||
|
enable-animations: "アニメーションを使用"
|
||||||
|
this-setting-is-this-device-only: "このデバイスのみ"
|
||||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "引き分け"
|
drawn: "引き分け"
|
||||||
@ -253,6 +258,9 @@ common/views/components/connect-failed.troubleshooter.vue:
|
|||||||
success-desc: "正常に接続できるようです。ページを再度読み込みしてください。"
|
success-desc: "正常に接続できるようです。ページを再度読み込みしてください。"
|
||||||
flush: "キャッシュの削除"
|
flush: "キャッシュの削除"
|
||||||
set-version: "バージョン指定"
|
set-version: "バージョン指定"
|
||||||
|
common/views/components/media-banner.vue:
|
||||||
|
sensitive: "閲覧注意"
|
||||||
|
click-to-show: "クリックして表示"
|
||||||
common/views/components/cw-button.vue:
|
common/views/components/cw-button.vue:
|
||||||
hide: "隠す"
|
hide: "隠す"
|
||||||
show: "もっと見る"
|
show: "もっと見る"
|
||||||
@ -461,6 +469,7 @@ desktop/views/components/charts.vue:
|
|||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
|
network: "ネットワーク"
|
||||||
charts:
|
charts:
|
||||||
notes: "投稿の増減 (統合)"
|
notes: "投稿の増減 (統合)"
|
||||||
local-notes: "投稿の増減 (ローカル)"
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
@ -472,6 +481,9 @@ desktop/views/components/charts.vue:
|
|||||||
drive-total: "ドライブ使用量の累計"
|
drive-total: "ドライブ使用量の累計"
|
||||||
drive-files: "ドライブのファイル数の増減"
|
drive-files: "ドライブのファイル数の増減"
|
||||||
drive-files-total: "ドライブのファイル数の累計"
|
drive-files-total: "ドライブのファイル数の累計"
|
||||||
|
network-requests: "リクエスト"
|
||||||
|
network-time: "応答時間"
|
||||||
|
network-usage: "通信量"
|
||||||
desktop/views/components/choose-file-from-drive-window.vue:
|
desktop/views/components/choose-file-from-drive-window.vue:
|
||||||
choose-file: "ファイル選択中"
|
choose-file: "ファイル選択中"
|
||||||
upload: "PCからドライブにファイルをアップロード"
|
upload: "PCからドライブにファイルをアップロード"
|
||||||
|
11
package.json
11
package.json
@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"name": "misskey",
|
"name": "misskey",
|
||||||
"author": "syuilo <i@syuilo.com>",
|
"author": "syuilo <i@syuilo.com>",
|
||||||
"version": "8.38.0",
|
"version": "8.42.0",
|
||||||
"clientVersion": "1.0.9647",
|
"clientVersion": "1.0.9769",
|
||||||
"codename": "nighthike",
|
"codename": "nighthike",
|
||||||
"main": "./built/index.js",
|
"main": "./built/index.js",
|
||||||
"private": true,
|
"private": true,
|
||||||
@ -101,7 +101,6 @@
|
|||||||
"dompurify": "1.0.5",
|
"dompurify": "1.0.5",
|
||||||
"double-ended-queue": "2.1.0-0",
|
"double-ended-queue": "2.1.0-0",
|
||||||
"elasticsearch": "15.1.1",
|
"elasticsearch": "15.1.1",
|
||||||
"element-ui": "2.4.6",
|
|
||||||
"emojilib": "2.3.0",
|
"emojilib": "2.3.0",
|
||||||
"escape-regexp": "0.0.1",
|
"escape-regexp": "0.0.1",
|
||||||
"eslint": "5.0.1",
|
"eslint": "5.0.1",
|
||||||
@ -132,7 +131,6 @@
|
|||||||
"insert-text-at-cursor": "0.1.1",
|
"insert-text-at-cursor": "0.1.1",
|
||||||
"is-root": "2.0.0",
|
"is-root": "2.0.0",
|
||||||
"is-url": "1.2.4",
|
"is-url": "1.2.4",
|
||||||
"jquery": "3.3.1",
|
|
||||||
"js-yaml": "3.12.0",
|
"js-yaml": "3.12.0",
|
||||||
"jsdom": "11.12.0",
|
"jsdom": "11.12.0",
|
||||||
"koa": "2.5.1",
|
"koa": "2.5.1",
|
||||||
@ -160,8 +158,6 @@
|
|||||||
"ms": "2.1.1",
|
"ms": "2.1.1",
|
||||||
"nan": "2.11.0",
|
"nan": "2.11.0",
|
||||||
"nested-property": "0.0.7",
|
"nested-property": "0.0.7",
|
||||||
"node-sass": "4.9.3",
|
|
||||||
"node-sass-json-importer": "4.0.1",
|
|
||||||
"nprogress": "0.2.0",
|
"nprogress": "0.2.0",
|
||||||
"object-assign-deep": "0.4.0",
|
"object-assign-deep": "0.4.0",
|
||||||
"on-build-webpack": "0.1.0",
|
"on-build-webpack": "0.1.0",
|
||||||
@ -179,6 +175,7 @@
|
|||||||
"redis": "2.8.0",
|
"redis": "2.8.0",
|
||||||
"request": "2.88.0",
|
"request": "2.88.0",
|
||||||
"request-promise-native": "1.0.5",
|
"request-promise-native": "1.0.5",
|
||||||
|
"request-stats": "3.0.0",
|
||||||
"rimraf": "2.6.2",
|
"rimraf": "2.6.2",
|
||||||
"rndstr": "1.0.0",
|
"rndstr": "1.0.0",
|
||||||
"s-age": "1.1.2",
|
"s-age": "1.1.2",
|
||||||
@ -209,7 +206,7 @@
|
|||||||
"v-animate-css": "0.0.2",
|
"v-animate-css": "0.0.2",
|
||||||
"vue": "2.5.17",
|
"vue": "2.5.17",
|
||||||
"vue-chartjs": "3.4.0",
|
"vue-chartjs": "3.4.0",
|
||||||
"vue-cropperjs": "2.2.1",
|
"vue-cropperjs": "2.2.2",
|
||||||
"vue-js-modal": "1.3.26",
|
"vue-js-modal": "1.3.26",
|
||||||
"vue-json-tree-view": "2.1.4",
|
"vue-json-tree-view": "2.1.4",
|
||||||
"vue-loader": "15.4.2",
|
"vue-loader": "15.4.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" :class="{ fade: $store.state.settings.contrastedAcct }" v-if="user.host || detail">@{{ user.host || host }}</span>
|
<span class="host" :class="{ fade: $store.state.settings.contrastedAcct }" v-if="user.host || detail || $store.state.settings.showFullAcct">@{{ user.host || host }}</span>
|
||||||
</span>
|
</span>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@ -50,15 +50,15 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="player" v-if="game.isEnded">
|
<div class="player" v-if="game.isEnded">
|
||||||
<el-button-group>
|
<div>
|
||||||
<el-button type="primary" @click="logPos = 0" :disabled="logPos == 0">%fa:angle-double-left%</el-button>
|
<button @click="logPos = 0" :disabled="logPos == 0">%fa:angle-double-left%</button>
|
||||||
<el-button type="primary" @click="logPos--" :disabled="logPos == 0">%fa:angle-left%</el-button>
|
<button @click="logPos--" :disabled="logPos == 0">%fa:angle-left%</button>
|
||||||
</el-button-group>
|
</div>
|
||||||
<span>{{ logPos }} / {{ logs.length }}</span>
|
<span>{{ logPos }} / {{ logs.length }}</span>
|
||||||
<el-button-group>
|
<div>
|
||||||
<el-button type="primary" @click="logPos++" :disabled="logPos == logs.length">%fa:angle-right%</el-button>
|
<button @click="logPos++" :disabled="logPos == logs.length">%fa:angle-right%</button>
|
||||||
<el-button type="primary" @click="logPos = logs.length" :disabled="logPos == logs.length">%fa:angle-double-right%</el-button>
|
<button @click="logPos = logs.length" :disabled="logPos == logs.length">%fa:angle-double-right%</button>
|
||||||
</el-button-group>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="info">
|
<div class="info">
|
||||||
|
@ -3,7 +3,6 @@
|
|||||||
<h1>%i18n:@title%</h1>
|
<h1>%i18n:@title%</h1>
|
||||||
<p>%i18n:@sub-title%</p>
|
<p>%i18n:@sub-title%</p>
|
||||||
<div class="play">
|
<div class="play">
|
||||||
<!--<el-button round>フリーマッチ(準備中)</el-button>-->
|
|
||||||
<form-button primary round @click="match">%i18n:@invite%</form-button>
|
<form-button primary round @click="match">%i18n:@invite%</form-button>
|
||||||
<details>
|
<details>
|
||||||
<summary>%i18n:@rule%</summary>
|
<summary>%i18n:@rule%</summary>
|
||||||
|
@ -59,11 +59,6 @@
|
|||||||
</header>
|
</header>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<el-alert v-for="message in messages"
|
|
||||||
:title="message.text"
|
|
||||||
:type="message.type"
|
|
||||||
:key="message.id"/>
|
|
||||||
|
|
||||||
<template v-for="item in form">
|
<template v-for="item in form">
|
||||||
<mk-switch v-if="item.type == 'switch'" v-model="item.value" :key="item.id" :text="item.label" @change="onChangeForm(item)">{{ item.desc || '' }}</mk-switch>
|
<mk-switch v-if="item.type == 'switch'" v-model="item.value" :key="item.id" :text="item.label" @change="onChangeForm(item)">{{ item.desc || '' }}</mk-switch>
|
||||||
|
|
||||||
@ -93,7 +88,7 @@
|
|||||||
</header>
|
</header>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<el-input v-model="item.value" @change="onChangeForm(item)"/>
|
<input v-model="item.value" @change="onChangeForm(item)"/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
90
src/client/app/common/views/components/media-banner.vue
Normal file
90
src/client/app/common/views/components/media-banner.vue
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
<template>
|
||||||
|
<div class="mk-media-banner">
|
||||||
|
<div class="sensitive" v-if="media.isSensitive && hide" @click="hide = false">
|
||||||
|
<span class="icon">%fa:exclamation-triangle%</span>
|
||||||
|
<b>%i18n:@sensitive%</b>
|
||||||
|
<span>%i18n:@click-to-show%</span>
|
||||||
|
</div>
|
||||||
|
<div class="audio" v-else-if="media.type.startsWith('audio')">
|
||||||
|
<audio class="audio"
|
||||||
|
:src="media.url"
|
||||||
|
:title="media.name"
|
||||||
|
controls
|
||||||
|
ref="audio"
|
||||||
|
preload="metadata" />
|
||||||
|
</div>
|
||||||
|
<a class="download" v-else
|
||||||
|
:href="media.url"
|
||||||
|
:title="media.name"
|
||||||
|
:download="media.name"
|
||||||
|
>
|
||||||
|
<span class="icon">%fa:download%</span>
|
||||||
|
<b>{{ media.name }}</b>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
props: {
|
||||||
|
media: {
|
||||||
|
type: Object,
|
||||||
|
required: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
hide: true
|
||||||
|
};
|
||||||
|
}
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
root(isDark)
|
||||||
|
width 100%
|
||||||
|
border-radius 4px
|
||||||
|
margin-top 4px
|
||||||
|
overflow hidden
|
||||||
|
|
||||||
|
> .download,
|
||||||
|
> .sensitive
|
||||||
|
display flex
|
||||||
|
align-items center
|
||||||
|
font-size 12px
|
||||||
|
padding 8px 12px
|
||||||
|
white-space nowrap
|
||||||
|
|
||||||
|
> *
|
||||||
|
display block
|
||||||
|
|
||||||
|
> b
|
||||||
|
overflow hidden
|
||||||
|
text-overflow ellipsis
|
||||||
|
|
||||||
|
> *:not(:last-child)
|
||||||
|
margin-right .2em
|
||||||
|
|
||||||
|
> .icon
|
||||||
|
font-size 1.6em
|
||||||
|
|
||||||
|
> .download
|
||||||
|
background isDark ? #21242d : #f7f7f7
|
||||||
|
|
||||||
|
> .sensitive
|
||||||
|
background #111
|
||||||
|
color #fff
|
||||||
|
|
||||||
|
> .audio
|
||||||
|
.audio
|
||||||
|
display block
|
||||||
|
width 100%
|
||||||
|
|
||||||
|
.mk-media-banner[data-darkmode]
|
||||||
|
root(true)
|
||||||
|
|
||||||
|
.mk-media-banner:not([data-darkmode])
|
||||||
|
root(false)
|
||||||
|
</style>
|
@ -1,18 +1,27 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mk-media-list">
|
<div class="mk-media-list">
|
||||||
<div :data-count="mediaList.length" ref="grid">
|
<template v-for="media in mediaList.filter(media => !previewable(media))">
|
||||||
<template v-for="media in mediaList">
|
<x-banner :media="media" :key="media.id"/>
|
||||||
<mk-media-video :video="media" :key="media.id" v-if="media.type.startsWith('video')" :inline-playable="mediaList.length === 1"/>
|
</template>
|
||||||
<mk-media-image :image="media" :key="media.id" v-else :raw="raw"/>
|
<div v-if="mediaList.filter(media => previewable(media)).length > 0" class="gird-container">
|
||||||
</template>
|
<div :data-count="mediaList.filter(media => previewable(media)).length" ref="grid">
|
||||||
|
<template v-for="media in mediaList">
|
||||||
|
<mk-media-video :video="media" :key="media.id" v-if="media.type.startsWith('video')"/>
|
||||||
|
<mk-media-image :image="media" :key="media.id" v-else-if="media.type.startsWith('image')" :raw="raw"/>
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
|
import XBanner from './media-banner.vue';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
|
components: {
|
||||||
|
XBanner
|
||||||
|
},
|
||||||
props: {
|
props: {
|
||||||
mediaList: {
|
mediaList: {
|
||||||
required: true
|
required: true
|
||||||
@ -22,70 +31,80 @@ export default Vue.extend({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
// for Safari bug
|
//#region for Safari bug
|
||||||
this.$refs.grid.style.height = this.$refs.grid.clientHeight ? `${this.$refs.grid.clientHeight}px` : '128px';
|
if (this.$refs.grid) {
|
||||||
|
this.$refs.grid.style.height = this.$refs.grid.clientHeight ? `${this.$refs.grid.clientHeight}px` : '128px';
|
||||||
|
}
|
||||||
|
//#endregion
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
previewable(file) {
|
||||||
|
return file.type.startsWith('video') || file.type.startsWith('image');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="stylus" scoped>
|
<style lang="stylus" scoped>
|
||||||
.mk-media-list
|
.mk-media-list
|
||||||
width 100%
|
> .gird-container
|
||||||
|
width 100%
|
||||||
|
margin-top 4px
|
||||||
|
|
||||||
&:before
|
&:before
|
||||||
content ''
|
content ''
|
||||||
display block
|
display block
|
||||||
padding-top 56.25% // 16:9
|
padding-top 56.25% // 16:9
|
||||||
|
|
||||||
> div
|
> div
|
||||||
position absolute
|
position absolute
|
||||||
top 0
|
top 0
|
||||||
right 0
|
right 0
|
||||||
bottom 0
|
bottom 0
|
||||||
left 0
|
left 0
|
||||||
display grid
|
display grid
|
||||||
grid-gap 4px
|
grid-gap 4px
|
||||||
|
|
||||||
> *
|
> *
|
||||||
overflow hidden
|
overflow hidden
|
||||||
border-radius 4px
|
border-radius 4px
|
||||||
|
|
||||||
&[data-count="1"]
|
&[data-count="1"]
|
||||||
grid-template-rows 1fr
|
grid-template-rows 1fr
|
||||||
|
|
||||||
&[data-count="2"]
|
&[data-count="2"]
|
||||||
grid-template-columns 1fr 1fr
|
grid-template-columns 1fr 1fr
|
||||||
grid-template-rows 1fr
|
grid-template-rows 1fr
|
||||||
|
|
||||||
&[data-count="3"]
|
&[data-count="3"]
|
||||||
grid-template-columns 1fr 0.5fr
|
grid-template-columns 1fr 0.5fr
|
||||||
grid-template-rows 1fr 1fr
|
grid-template-rows 1fr 1fr
|
||||||
|
|
||||||
|
> *:nth-child(1)
|
||||||
|
grid-row 1 / 3
|
||||||
|
|
||||||
|
> *:nth-child(3)
|
||||||
|
grid-column 2 / 3
|
||||||
|
grid-row 2 / 3
|
||||||
|
|
||||||
|
&[data-count="4"]
|
||||||
|
grid-template-columns 1fr 1fr
|
||||||
|
grid-template-rows 1fr 1fr
|
||||||
|
|
||||||
> *:nth-child(1)
|
> *:nth-child(1)
|
||||||
grid-row 1 / 3
|
grid-column 1 / 2
|
||||||
|
grid-row 1 / 2
|
||||||
|
|
||||||
|
> *:nth-child(2)
|
||||||
|
grid-column 2 / 3
|
||||||
|
grid-row 1 / 2
|
||||||
|
|
||||||
> *:nth-child(3)
|
> *:nth-child(3)
|
||||||
|
grid-column 1 / 2
|
||||||
|
grid-row 2 / 3
|
||||||
|
|
||||||
|
> *:nth-child(4)
|
||||||
grid-column 2 / 3
|
grid-column 2 / 3
|
||||||
grid-row 2 / 3
|
grid-row 2 / 3
|
||||||
|
|
||||||
&[data-count="4"]
|
|
||||||
grid-template-columns 1fr 1fr
|
|
||||||
grid-template-rows 1fr 1fr
|
|
||||||
|
|
||||||
> *:nth-child(1)
|
|
||||||
grid-column 1 / 2
|
|
||||||
grid-row 1 / 2
|
|
||||||
|
|
||||||
> *:nth-child(2)
|
|
||||||
grid-column 2 / 3
|
|
||||||
grid-row 1 / 2
|
|
||||||
|
|
||||||
> *:nth-child(3)
|
|
||||||
grid-column 1 / 2
|
|
||||||
grid-row 2 / 3
|
|
||||||
|
|
||||||
> *:nth-child(4)
|
|
||||||
grid-column 2 / 3
|
|
||||||
grid-row 2 / 3
|
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
@ -108,7 +108,7 @@ export default Vue.extend({
|
|||||||
easing: 'easeInBack',
|
easing: 'easeInBack',
|
||||||
complete: () => {
|
complete: () => {
|
||||||
this.$emit('closed');
|
this.$emit('closed');
|
||||||
this.$destroy();
|
this.destroyDom();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -64,7 +64,7 @@ export default Vue.extend({
|
|||||||
(this as any).api('i/pin', {
|
(this as any).api('i/pin', {
|
||||||
noteId: this.note.id
|
noteId: this.note.id
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
this.$destroy();
|
this.destroyDom();
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -73,7 +73,7 @@ export default Vue.extend({
|
|||||||
(this as any).api('notes/delete', {
|
(this as any).api('notes/delete', {
|
||||||
noteId: this.note.id
|
noteId: this.note.id
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
this.$destroy();
|
this.destroyDom();
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -81,13 +81,13 @@ export default Vue.extend({
|
|||||||
(this as any).api('notes/favorites/create', {
|
(this as any).api('notes/favorites/create', {
|
||||||
noteId: this.note.id
|
noteId: this.note.id
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
this.$destroy();
|
this.destroyDom();
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
closed() {
|
closed() {
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
this.$destroy();
|
this.destroyDom();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -95,7 +95,7 @@ export default Vue.extend({
|
|||||||
reaction: reaction
|
reaction: reaction
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
if (this.cb) this.cb();
|
if (this.cb) this.cb();
|
||||||
this.$destroy();
|
this.destroyDom();
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
onMouseover(e) {
|
onMouseover(e) {
|
||||||
@ -120,7 +120,7 @@ export default Vue.extend({
|
|||||||
scale: 0.5,
|
scale: 0.5,
|
||||||
duration: 200,
|
duration: 200,
|
||||||
easing: 'easeInBack',
|
easing: 'easeInBack',
|
||||||
complete: () => this.$destroy()
|
complete: () => this.destroyDom()
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,8 +3,7 @@
|
|||||||
<p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p>
|
<p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p>
|
||||||
<p class="empty" v-else-if="stats.length == 0">%fa:exclamation-circle%%i18n:@empty%</p>
|
<p class="empty" v-else-if="stats.length == 0">%fa:exclamation-circle%%i18n:@empty%</p>
|
||||||
<!-- トランジションを有効にするとなぜかメモリリークする -->
|
<!-- トランジションを有効にするとなぜかメモリリークする -->
|
||||||
<!-- <transition-group v-else tag="div" name="chart"> -->
|
<transition-group v-else tag="div" name="chart">
|
||||||
<div>
|
|
||||||
<div v-for="stat in stats" :key="stat.tag">
|
<div v-for="stat in stats" :key="stat.tag">
|
||||||
<div class="tag">
|
<div class="tag">
|
||||||
<router-link :to="`/tags/${ encodeURIComponent(stat.tag) }`" :title="stat.tag">#{{ stat.tag }}</router-link>
|
<router-link :to="`/tags/${ encodeURIComponent(stat.tag) }`" :title="stat.tag">#{{ stat.tag }}</router-link>
|
||||||
@ -12,8 +11,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<x-chart class="chart" :src="stat.chart"/>
|
<x-chart class="chart" :src="stat.chart"/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</transition-group>
|
||||||
<!-- </transition-group> -->
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@ -101,7 +101,7 @@ export default Vue.extend({
|
|||||||
this.$store.commit('device/setVisibility', visibility);
|
this.$store.commit('device/setVisibility', visibility);
|
||||||
}
|
}
|
||||||
this.$emit('chosen', visibility);
|
this.$emit('chosen', visibility);
|
||||||
this.$destroy();
|
this.destroyDom();
|
||||||
},
|
},
|
||||||
close() {
|
close() {
|
||||||
(this.$refs.backdrop as any).style.pointerEvents = 'none';
|
(this.$refs.backdrop as any).style.pointerEvents = 'none';
|
||||||
@ -119,7 +119,7 @@ export default Vue.extend({
|
|||||||
scale: 0.5,
|
scale: 0.5,
|
||||||
duration: 200,
|
duration: 200,
|
||||||
easing: 'easeInBack',
|
easing: 'easeInBack',
|
||||||
complete: () => this.$destroy()
|
complete: () => this.destroyDom()
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -167,7 +167,7 @@ class Autocomplete {
|
|||||||
private close() {
|
private close() {
|
||||||
if (this.suggestion == null) return;
|
if (this.suggestion == null) return;
|
||||||
|
|
||||||
this.suggestion.$destroy();
|
this.suggestion.destroyDom();
|
||||||
this.suggestion = null;
|
this.suggestion = null;
|
||||||
|
|
||||||
this.textarea.focus();
|
this.textarea.focus();
|
||||||
|
@ -6,7 +6,6 @@ import VueRouter from 'vue-router';
|
|||||||
|
|
||||||
// Style
|
// Style
|
||||||
import './style.styl';
|
import './style.styl';
|
||||||
import '../../element.scss';
|
|
||||||
|
|
||||||
import init from '../init';
|
import init from '../init';
|
||||||
import fuckAdBlock from '../common/scripts/fuck-ad-block';
|
import fuckAdBlock from '../common/scripts/fuck-ad-block';
|
||||||
|
@ -19,6 +19,11 @@
|
|||||||
<option value="drive">%i18n:@charts.drive%</option>
|
<option value="drive">%i18n:@charts.drive%</option>
|
||||||
<option value="drive-total">%i18n:@charts.drive-total%</option>
|
<option value="drive-total">%i18n:@charts.drive-total%</option>
|
||||||
</optgroup>
|
</optgroup>
|
||||||
|
<optgroup label="%i18n:@network%">
|
||||||
|
<option value="network-requests">%i18n:@charts.network-requests%</option>
|
||||||
|
<option value="network-time">%i18n:@charts.network-time%</option>
|
||||||
|
<option value="network-usage">%i18n:@charts.network-usage%</option>
|
||||||
|
</optgroup>
|
||||||
</select>
|
</select>
|
||||||
<div>
|
<div>
|
||||||
<span @click="span = 'day'" :class="{ active: span == 'day' }">%i18n:@per-day%</span> | <span @click="span = 'hour'" :class="{ active: span == 'hour' }">%i18n:@per-hour%</span>
|
<span @click="span = 'day'" :class="{ active: span == 'day' }">%i18n:@per-day%</span> | <span @click="span = 'hour'" :class="{ active: span == 'hour' }">%i18n:@per-hour%</span>
|
||||||
@ -41,7 +46,10 @@ const colors = {
|
|||||||
localPlus: 'rgb(52, 178, 118)',
|
localPlus: 'rgb(52, 178, 118)',
|
||||||
remotePlus: 'rgb(158, 255, 209)',
|
remotePlus: 'rgb(158, 255, 209)',
|
||||||
localMinus: 'rgb(255, 97, 74)',
|
localMinus: 'rgb(255, 97, 74)',
|
||||||
remoteMinus: 'rgb(255, 149, 134)'
|
remoteMinus: 'rgb(255, 149, 134)',
|
||||||
|
|
||||||
|
incoming: 'rgb(52, 178, 118)',
|
||||||
|
outgoing: 'rgb(255, 97, 74)',
|
||||||
};
|
};
|
||||||
|
|
||||||
const rgba = (color: string): string => {
|
const rgba = (color: string): string => {
|
||||||
@ -75,6 +83,9 @@ export default Vue.extend({
|
|||||||
case 'drive-total': return this.driveTotalChart();
|
case 'drive-total': return this.driveTotalChart();
|
||||||
case 'drive-files': return this.driveFilesChart();
|
case 'drive-files': return this.driveFilesChart();
|
||||||
case 'drive-files-total': return this.driveFilesTotalChart();
|
case 'drive-files-total': return this.driveFilesTotalChart();
|
||||||
|
case 'network-requests': return this.networkRequestsChart();
|
||||||
|
case 'network-time': return this.networkTimeChart();
|
||||||
|
case 'network-usage': return this.networkUsageChart();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -544,7 +555,95 @@ export default Vue.extend({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}];
|
}];
|
||||||
}
|
},
|
||||||
|
|
||||||
|
networkRequestsChart(): any {
|
||||||
|
const data = this.stats.slice().reverse().map(x => ({
|
||||||
|
date: new Date(x.date),
|
||||||
|
requests: x.network.requests
|
||||||
|
}));
|
||||||
|
|
||||||
|
return [{
|
||||||
|
datasets: [{
|
||||||
|
label: 'Requests',
|
||||||
|
fill: true,
|
||||||
|
backgroundColor: rgba(colors.localPlus),
|
||||||
|
borderColor: colors.localPlus,
|
||||||
|
borderWidth: 2,
|
||||||
|
pointBackgroundColor: '#fff',
|
||||||
|
lineTension: 0,
|
||||||
|
data: data.map(x => ({ t: x.date, y: x.requests }))
|
||||||
|
}]
|
||||||
|
}];
|
||||||
|
},
|
||||||
|
|
||||||
|
networkTimeChart(): any {
|
||||||
|
const data = this.stats.slice().reverse().map(x => ({
|
||||||
|
date: new Date(x.date),
|
||||||
|
time: x.network.requests != 0 ? (x.network.totalTime / x.network.requests) : 0,
|
||||||
|
}));
|
||||||
|
|
||||||
|
return [{
|
||||||
|
datasets: [{
|
||||||
|
label: 'Avg time (ms)',
|
||||||
|
fill: true,
|
||||||
|
backgroundColor: rgba(colors.localPlus),
|
||||||
|
borderColor: colors.localPlus,
|
||||||
|
borderWidth: 2,
|
||||||
|
pointBackgroundColor: '#fff',
|
||||||
|
lineTension: 0,
|
||||||
|
data: data.map(x => ({ t: x.date, y: x.time }))
|
||||||
|
}]
|
||||||
|
}];
|
||||||
|
},
|
||||||
|
|
||||||
|
networkUsageChart(): any {
|
||||||
|
const data = this.stats.slice().reverse().map(x => ({
|
||||||
|
date: new Date(x.date),
|
||||||
|
incoming: x.network.incomingBytes,
|
||||||
|
outgoing: x.network.outgoingBytes
|
||||||
|
}));
|
||||||
|
|
||||||
|
return [{
|
||||||
|
datasets: [{
|
||||||
|
label: 'Incoming',
|
||||||
|
fill: true,
|
||||||
|
backgroundColor: rgba(colors.incoming),
|
||||||
|
borderColor: colors.incoming,
|
||||||
|
borderWidth: 2,
|
||||||
|
pointBackgroundColor: '#fff',
|
||||||
|
lineTension: 0,
|
||||||
|
data: data.map(x => ({ t: x.date, y: x.incoming }))
|
||||||
|
}, {
|
||||||
|
label: 'Outgoing',
|
||||||
|
fill: true,
|
||||||
|
backgroundColor: rgba(colors.outgoing),
|
||||||
|
borderColor: colors.outgoing,
|
||||||
|
borderWidth: 2,
|
||||||
|
pointBackgroundColor: '#fff',
|
||||||
|
lineTension: 0,
|
||||||
|
data: data.map(x => ({ t: x.date, y: x.outgoing }))
|
||||||
|
}]
|
||||||
|
}, {
|
||||||
|
scales: {
|
||||||
|
yAxes: [{
|
||||||
|
ticks: {
|
||||||
|
callback: value => {
|
||||||
|
return Vue.filter('bytes')(value, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
tooltips: {
|
||||||
|
callbacks: {
|
||||||
|
label: (tooltipItem, data) => {
|
||||||
|
const label = data.datasets[tooltipItem.datasetIndex].label || '';
|
||||||
|
return `${label}: ${Vue.filter('bytes')(tooltipItem.yLabel, 1)}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}];
|
||||||
|
},
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
@ -64,7 +64,7 @@ export default Vue.extend({
|
|||||||
});
|
});
|
||||||
|
|
||||||
this.$emit('closed');
|
this.$emit('closed');
|
||||||
this.$destroy();
|
this.destroyDom();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -78,7 +78,7 @@ export default Vue.extend({
|
|||||||
scale: 0.8,
|
scale: 0.8,
|
||||||
duration: 300,
|
duration: 300,
|
||||||
easing: [ 0.5, -0.5, 1, 0.5 ],
|
easing: [ 0.5, -0.5, 1, 0.5 ],
|
||||||
complete: () => this.$destroy()
|
complete: () => this.destroyDom()
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
onBgClick() {
|
onBgClick() {
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
<p class="empty" v-if="!fetching && users.length == 0">%i18n:@empty%</p>
|
<p class="empty" v-if="!fetching && users.length == 0">%i18n:@empty%</p>
|
||||||
<p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:@fetching%<mk-ellipsis/></p>
|
<p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:@fetching%<mk-ellipsis/></p>
|
||||||
<a class="refresh" @click="refresh">%i18n:@refresh%</a>
|
<a class="refresh" @click="refresh">%i18n:@refresh%</a>
|
||||||
<button class="close" @click="$destroy()" title="%i18n:@close%">%fa:times%</button>
|
<button class="close" @click="destroyDom()" title="%i18n:@close%">%fa:times%</button>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@ -26,7 +26,7 @@ export default Vue.extend({
|
|||||||
opacity: 0,
|
opacity: 0,
|
||||||
duration: 100,
|
duration: 100,
|
||||||
easing: 'linear',
|
easing: 'linear',
|
||||||
complete: () => this.$destroy()
|
complete: () => this.destroyDom()
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -27,12 +27,13 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
raw: {
|
raw: {
|
||||||
default: false
|
default: false
|
||||||
},
|
|
||||||
hide: {
|
|
||||||
type: Boolean,
|
|
||||||
default: true
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
hide: true
|
||||||
|
};
|
||||||
|
},
|
||||||
computed: {
|
computed: {
|
||||||
style(): any {
|
style(): any {
|
||||||
return {
|
return {
|
||||||
@ -89,7 +90,7 @@ export default Vue.extend({
|
|||||||
text-align center
|
text-align center
|
||||||
font-size 12px
|
font-size 12px
|
||||||
|
|
||||||
> b
|
> *
|
||||||
display block
|
display block
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
@ -28,7 +28,7 @@ export default Vue.extend({
|
|||||||
opacity: 0,
|
opacity: 0,
|
||||||
duration: 100,
|
duration: 100,
|
||||||
easing: 'linear',
|
easing: 'linear',
|
||||||
complete: () => this.$destroy()
|
complete: () => this.destroyDom()
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -36,12 +36,13 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
inlinePlayable: {
|
inlinePlayable: {
|
||||||
default: false
|
default: false
|
||||||
},
|
|
||||||
hide: {
|
|
||||||
type: Boolean,
|
|
||||||
default: true
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
hide: true
|
||||||
|
};
|
||||||
|
},
|
||||||
computed: {
|
computed: {
|
||||||
imageStyle(): any {
|
imageStyle(): any {
|
||||||
return {
|
return {
|
||||||
@ -79,7 +80,6 @@ export default Vue.extend({
|
|||||||
justify-content center
|
justify-content center
|
||||||
align-items center
|
align-items center
|
||||||
font-size 3.5em
|
font-size 3.5em
|
||||||
|
|
||||||
cursor zoom-in
|
cursor zoom-in
|
||||||
overflow hidden
|
overflow hidden
|
||||||
background-position center
|
background-position center
|
||||||
@ -101,5 +101,4 @@ export default Vue.extend({
|
|||||||
|
|
||||||
> b
|
> b
|
||||||
display block
|
display block
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- トランジションを有効にするとなぜかメモリリークする -->
|
<!-- トランジションを有効にするとなぜかメモリリークする -->
|
||||||
<transition-group name="mk-notes" class="notes transition" tag="div">
|
<component :is="$store.state.device.animations ? 'transition-group' : 'div'" name="mk-notes" class="notes transition" tag="div">
|
||||||
<template v-for="(note, i) in _notes">
|
<template v-for="(note, i) in _notes">
|
||||||
<x-note :note="note" :key="note.id" @update:note="onNoteUpdated(i, $event)"/>
|
<x-note :note="note" :key="note.id" @update:note="onNoteUpdated(i, $event)"/>
|
||||||
<p class="date" :key="note.id + '_date'" v-if="i != notes.length - 1 && note._date != _notes[i + 1]._date">
|
<p class="date" :key="note.id + '_date'" v-if="i != notes.length - 1 && note._date != _notes[i + 1]._date">
|
||||||
@ -18,7 +18,7 @@
|
|||||||
<span>%fa:angle-down%{{ _notes[i + 1]._datetext }}</span>
|
<span>%fa:angle-down%{{ _notes[i + 1]._datetext }}</span>
|
||||||
</p>
|
</p>
|
||||||
</template>
|
</template>
|
||||||
</transition-group>
|
</component>
|
||||||
|
|
||||||
<footer v-if="more">
|
<footer v-if="more">
|
||||||
<button @click="loadMore" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }">
|
<button @click="loadMore" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }">
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
<div class="mk-notifications">
|
<div class="mk-notifications">
|
||||||
<div class="notifications" v-if="notifications.length != 0">
|
<div class="notifications" v-if="notifications.length != 0">
|
||||||
<!-- トランジションを有効にするとなぜかメモリリークする -->
|
<!-- トランジションを有効にするとなぜかメモリリークする -->
|
||||||
<transition-group name="mk-notifications" class="transition" tag="div">
|
<component :is="$store.state.device.animations ? 'transition-group' : 'div'" name="mk-notifications" class="transition" tag="div">
|
||||||
<template v-for="(notification, i) in _notifications">
|
<template v-for="(notification, i) in _notifications">
|
||||||
<div class="notification" :class="notification.type" :key="notification.id">
|
<div class="notification" :class="notification.type" :key="notification.id">
|
||||||
<mk-time :time="notification.createdAt"/>
|
<mk-time :time="notification.createdAt"/>
|
||||||
@ -96,7 +96,7 @@
|
|||||||
<span>%fa:angle-down%{{ _notifications[i + 1]._datetext }}</span>
|
<span>%fa:angle-down%{{ _notifications[i + 1]._datetext }}</span>
|
||||||
</p>
|
</p>
|
||||||
</template>
|
</template>
|
||||||
</transition-group>
|
</component>
|
||||||
</div>
|
</div>
|
||||||
<button class="more" :class="{ fetching: fetchingMoreNotifications }" v-if="moreNotifications" @click="fetchMoreNotifications" :disabled="fetchingMoreNotifications">
|
<button class="more" :class="{ fetching: fetchingMoreNotifications }" v-if="moreNotifications" @click="fetchMoreNotifications" :disabled="fetchingMoreNotifications">
|
||||||
<template v-if="fetchingMoreNotifications">%fa:spinner .pulse .fw%</template>{{ fetchingMoreNotifications ? '%i18n:common.loading%' : '%i18n:@more%' }}
|
<template v-if="fetchingMoreNotifications">%fa:spinner .pulse .fw%</template>{{ fetchingMoreNotifications ? '%i18n:common.loading%' : '%i18n:@more%' }}
|
||||||
|
@ -49,7 +49,7 @@
|
|||||||
<button :class="{ posting }" class="submit" :disabled="!canPost" @click="post">
|
<button :class="{ posting }" class="submit" :disabled="!canPost" @click="post">
|
||||||
{{ posting ? '%i18n:@posting%' : submitText }}<mk-ellipsis v-if="posting"/>
|
{{ posting ? '%i18n:@posting%' : submitText }}<mk-ellipsis v-if="posting"/>
|
||||||
</button>
|
</button>
|
||||||
<input ref="file" type="file" accept="image/*" multiple="multiple" tabindex="-1" @change="onChangeFile"/>
|
<input ref="file" type="file" multiple="multiple" tabindex="-1" @change="onChangeFile"/>
|
||||||
<div class="dropzone" v-if="draghover"></div>
|
<div class="dropzone" v-if="draghover"></div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="root">
|
<div class="root">
|
||||||
<template v-if="!fetching">
|
<template v-if="!fetching">
|
||||||
<el-progress :text-inside="true" :stroke-width="18" :percentage="Math.floor((usage / capacity) * 100)"/>
|
|
||||||
<p><b>{{ capacity | bytes }}</b>%i18n:max%<b>{{ usage | bytes }}</b>%i18n:in-use%</p>
|
<p><b>{{ capacity | bytes }}</b>%i18n:max%<b>{{ usage | bytes }}</b>%i18n:in-use%</p>
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
</label>
|
</label>
|
||||||
<label class="ui from group">
|
<label class="ui from group">
|
||||||
<p>%i18n:@birthday%</p>
|
<p>%i18n:@birthday%</p>
|
||||||
<el-date-picker v-model="birthday" type="date" value-format="yyyy-MM-dd"/>
|
<input type="date" v-model="birthday"/>
|
||||||
</label>
|
</label>
|
||||||
<button class="ui primary" @click="save">%i18n:@save%</button>
|
<button class="ui primary" @click="save">%i18n:@save%</button>
|
||||||
<section>
|
<section>
|
||||||
@ -30,6 +30,7 @@
|
|||||||
<h2>%i18n:@other%</h2>
|
<h2>%i18n:@other%</h2>
|
||||||
<mk-switch v-model="$store.state.i.isBot" @change="onChangeIsBot" text="%i18n:@is-bot%"/>
|
<mk-switch v-model="$store.state.i.isBot" @change="onChangeIsBot" text="%i18n:@is-bot%"/>
|
||||||
<mk-switch v-model="$store.state.i.isCat" @change="onChangeIsCat" text="%i18n:@is-cat%"/>
|
<mk-switch v-model="$store.state.i.isCat" @change="onChangeIsCat" text="%i18n:@is-cat%"/>
|
||||||
|
<mk-switch v-model="alwaysMarkNsfw" text="%i18n:common.always-mark-nsfw%"/>
|
||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@ -46,6 +47,12 @@ export default Vue.extend({
|
|||||||
birthday: null,
|
birthday: null,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
computed: {
|
||||||
|
alwaysMarkNsfw: {
|
||||||
|
get() { return this.$store.state.i.settings.alwaysMarkNsfw; },
|
||||||
|
set(value) { (this as any).api('i/update', { alwaysMarkNsfw: value }); }
|
||||||
|
},
|
||||||
|
},
|
||||||
created() {
|
created() {
|
||||||
this.name = this.$store.state.i.name || '';
|
this.name = this.$store.state.i.name || '';
|
||||||
this.location = this.$store.state.i.profile.location;
|
this.location = this.$store.state.i.profile.location;
|
||||||
|
@ -60,7 +60,9 @@
|
|||||||
<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="circleIcons" text="%i18n:@circle-icons%"/>
|
<mk-switch v-model="circleIcons" text="%i18n:@circle-icons%"/>
|
||||||
|
<mk-switch v-model="animations" text="%i18n:common.enable-animations%"/>
|
||||||
<mk-switch v-model="contrastedAcct" text="%i18n:@contrasted-acct%"/>
|
<mk-switch v-model="contrastedAcct" text="%i18n:@contrasted-acct%"/>
|
||||||
|
<mk-switch v-model="showFullAcct" text="%i18n:common.show-full-acct%"/>
|
||||||
<mk-switch v-model="gradientWindowHeader" text="%i18n:@gradient-window-header%"/>
|
<mk-switch v-model="gradientWindowHeader" text="%i18n:@gradient-window-header%"/>
|
||||||
<mk-switch v-model="iLikeSushi" text="%i18n:common.i-like-sushi%"/>
|
<mk-switch v-model="iLikeSushi" text="%i18n:common.i-like-sushi%"/>
|
||||||
</div>
|
</div>
|
||||||
@ -86,13 +88,11 @@
|
|||||||
<span>%i18n:@enable-sounds-desc%</span>
|
<span>%i18n:@enable-sounds-desc%</span>
|
||||||
</mk-switch>
|
</mk-switch>
|
||||||
<label>%i18n:@volume%</label>
|
<label>%i18n:@volume%</label>
|
||||||
<el-slider
|
<input type="range"
|
||||||
v-model="soundVolume"
|
v-model="soundVolume"
|
||||||
:show-input="true"
|
|
||||||
:format-tooltip="v => `${v * 100}%`"
|
|
||||||
:disabled="!enableSounds"
|
:disabled="!enableSounds"
|
||||||
:max="1"
|
max="1"
|
||||||
:step="0.1"
|
step="0.1"
|
||||||
/>
|
/>
|
||||||
<button class="ui button" @click="soundTest">%fa:volume-up% %i18n:@test%</button>
|
<button class="ui button" @click="soundTest">%fa:volume-up% %i18n:@test%</button>
|
||||||
</section>
|
</section>
|
||||||
@ -104,14 +104,15 @@
|
|||||||
|
|
||||||
<section class="web" v-show="page == 'web'">
|
<section class="web" v-show="page == 'web'">
|
||||||
<h1>%i18n:@language%</h1>
|
<h1>%i18n:@language%</h1>
|
||||||
<el-select v-model="lang" placeholder="%i18n:@pick-language%">
|
<select v-model="lang" placeholder="%i18n:@pick-language%">
|
||||||
<el-option-group label="%i18n:@recommended%">
|
<optgroup label="%i18n:@recommended%">
|
||||||
<el-option label="%i18n:@auto%" :value="null"/>
|
<option value="">%i18n:@auto%</option>
|
||||||
</el-option-group>
|
</optgroup>
|
||||||
<el-option-group label="%i18n:@specify-language%">
|
|
||||||
<el-option v-for="x in langs" :label="x[1]" :value="x[0]" :key="x[0]"/>
|
<optgroup label="%i18n:@specify-language%">
|
||||||
</el-option-group>
|
<option v-for="x in langs" :value="x[0]" :key="x[0]">{{ x[1] }}</option>
|
||||||
</el-select>
|
</optgroup>
|
||||||
|
</select>
|
||||||
<div class="none ui info">
|
<div class="none ui info">
|
||||||
<p>%fa:info-circle%%i18n:@language-desc%</p>
|
<p>%fa:info-circle%%i18n:@language-desc%</p>
|
||||||
</div>
|
</div>
|
||||||
@ -206,10 +207,6 @@
|
|||||||
<mk-switch v-model="enableExperimentalFeatures" text="%i18n:@experimental%">
|
<mk-switch v-model="enableExperimentalFeatures" text="%i18n:@experimental%">
|
||||||
<span>%i18n:@experimental-desc%</span>
|
<span>%i18n:@experimental-desc%</span>
|
||||||
</mk-switch>
|
</mk-switch>
|
||||||
<details v-if="debug">
|
|
||||||
<summary>%i18n:@tools%</summary>
|
|
||||||
<button class="ui button block" @click="taskmngr">%i18n:@task-manager%</button>
|
|
||||||
</details>
|
|
||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -227,7 +224,6 @@ import XSignins from './settings.signins.vue';
|
|||||||
import XDrive from './settings.drive.vue';
|
import XDrive from './settings.drive.vue';
|
||||||
import { url, langs, version } from '../../../config';
|
import { url, langs, version } from '../../../config';
|
||||||
import checkForUpdate from '../../../common/scripts/check-for-update';
|
import checkForUpdate from '../../../common/scripts/check-for-update';
|
||||||
import MkTaskManager from './taskmanager.vue';
|
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
components: {
|
components: {
|
||||||
@ -251,6 +247,11 @@ export default Vue.extend({
|
|||||||
};
|
};
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
|
animations: {
|
||||||
|
get() { return this.$store.state.device.animations; },
|
||||||
|
set(value) { this.$store.commit('device/set', { key: 'animations', value }); }
|
||||||
|
},
|
||||||
|
|
||||||
apiViaStream: {
|
apiViaStream: {
|
||||||
get() { return this.$store.state.device.apiViaStream; },
|
get() { return this.$store.state.device.apiViaStream; },
|
||||||
set(value) { this.$store.commit('device/set', { key: 'apiViaStream', value }); }
|
set(value) { this.$store.commit('device/set', { key: 'apiViaStream', value }); }
|
||||||
@ -366,6 +367,11 @@ export default Vue.extend({
|
|||||||
set(value) { this.$store.dispatch('settings/set', { key: 'contrastedAcct', value }); }
|
set(value) { this.$store.dispatch('settings/set', { key: 'contrastedAcct', value }); }
|
||||||
},
|
},
|
||||||
|
|
||||||
|
showFullAcct: {
|
||||||
|
get() { return this.$store.state.settings.showFullAcct; },
|
||||||
|
set(value) { this.$store.dispatch('settings/set', { key: 'showFullAcct', value }); }
|
||||||
|
},
|
||||||
|
|
||||||
iLikeSushi: {
|
iLikeSushi: {
|
||||||
get() { return this.$store.state.settings.iLikeSushi; },
|
get() { return this.$store.state.settings.iLikeSushi; },
|
||||||
set(value) { this.$store.dispatch('settings/set', { key: 'iLikeSushi', value }); }
|
set(value) { this.$store.dispatch('settings/set', { key: 'iLikeSushi', value }); }
|
||||||
@ -402,9 +408,6 @@ export default Vue.extend({
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
taskmngr() {
|
|
||||||
(this as any).os.new(MkTaskManager);
|
|
||||||
},
|
|
||||||
customizeHome() {
|
customizeHome() {
|
||||||
this.$router.push('/i/customize-home');
|
this.$router.push('/i/customize-home');
|
||||||
this.$emit('done');
|
this.$emit('done');
|
||||||
|
@ -1,219 +0,0 @@
|
|||||||
<template>
|
|
||||||
<mk-window ref="window" width="750px" height="500px" @closed="$destroy" name="TaskManager">
|
|
||||||
<span slot="header" :class="$style.header">%fa:stethoscope%%i18n:@title%</span>
|
|
||||||
<el-tabs :class="$style.content">
|
|
||||||
<el-tab-pane label="Requests">
|
|
||||||
<el-table
|
|
||||||
:data="os.requests"
|
|
||||||
style="width: 100%"
|
|
||||||
:default-sort="{prop: 'date', order: 'descending'}"
|
|
||||||
>
|
|
||||||
<el-table-column type="expand">
|
|
||||||
<template slot-scope="props">
|
|
||||||
<pre>{{ props.row.data }}</pre>
|
|
||||||
<pre>{{ props.row.res }}</pre>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
|
|
||||||
<el-table-column
|
|
||||||
label="Requested at"
|
|
||||||
prop="date"
|
|
||||||
sortable
|
|
||||||
>
|
|
||||||
<template slot-scope="scope">
|
|
||||||
<b style="margin-right: 8px">{{ scope.row.date.getTime() }}</b>
|
|
||||||
<span>(<mk-time :time="scope.row.date"/>)</span>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
|
|
||||||
<el-table-column
|
|
||||||
label="Name"
|
|
||||||
>
|
|
||||||
<template slot-scope="scope">
|
|
||||||
<b>{{ scope.row.name }}</b>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
|
|
||||||
<el-table-column
|
|
||||||
label="Status"
|
|
||||||
>
|
|
||||||
<template slot-scope="scope">
|
|
||||||
<span>{{ scope.row.status || '(pending)' }}</span>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
</el-table>
|
|
||||||
</el-tab-pane>
|
|
||||||
|
|
||||||
<el-tab-pane label="Streams">
|
|
||||||
<el-table
|
|
||||||
:data="os.connections"
|
|
||||||
style="width: 100%"
|
|
||||||
>
|
|
||||||
<el-table-column
|
|
||||||
label="Uptime"
|
|
||||||
>
|
|
||||||
<template slot-scope="scope">
|
|
||||||
<mk-timer v-if="scope.row.connectedAt" :time="scope.row.connectedAt"/>
|
|
||||||
<span v-else>-</span>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
|
|
||||||
<el-table-column
|
|
||||||
label="Name"
|
|
||||||
>
|
|
||||||
<template slot-scope="scope">
|
|
||||||
<b>{{ scope.row.name == '' ? '[Home]' : scope.row.name }}</b>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
|
|
||||||
<el-table-column
|
|
||||||
label="User"
|
|
||||||
>
|
|
||||||
<template slot-scope="scope">
|
|
||||||
<span>{{ scope.row.user || '(anonymous)' }}</span>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
|
|
||||||
<el-table-column
|
|
||||||
prop="state"
|
|
||||||
label="State"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<el-table-column
|
|
||||||
prop="in"
|
|
||||||
label="In"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<el-table-column
|
|
||||||
prop="out"
|
|
||||||
label="Out"
|
|
||||||
/>
|
|
||||||
</el-table>
|
|
||||||
</el-tab-pane>
|
|
||||||
|
|
||||||
<el-tab-pane label="Streams (Inspect)">
|
|
||||||
<el-tabs type="card" style="height:50%">
|
|
||||||
<el-tab-pane v-for="c in os.connections" :label="c.name == '' ? '[Home]' : c.name" :key="c.id" :name="c.id" ref="connectionsTab">
|
|
||||||
<div style="padding: 12px 0 0 12px">
|
|
||||||
<el-button size="mini" @click="send(c)">Send</el-button>
|
|
||||||
<el-button size="mini" type="warning" @click="c.isSuspended = true" v-if="!c.isSuspended">Suspend</el-button>
|
|
||||||
<el-button size="mini" type="success" @click="c.isSuspended = false" v-else>Resume</el-button>
|
|
||||||
<el-button size="mini" type="danger" @click="c.close">Disconnect</el-button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<el-table
|
|
||||||
:data="c.inout"
|
|
||||||
style="width: 100%"
|
|
||||||
:default-sort="{prop: 'at', order: 'descending'}"
|
|
||||||
>
|
|
||||||
<el-table-column type="expand">
|
|
||||||
<template slot-scope="props">
|
|
||||||
<pre>{{ props.row.data }}</pre>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
|
|
||||||
<el-table-column
|
|
||||||
label="Date"
|
|
||||||
prop="at"
|
|
||||||
sortable
|
|
||||||
>
|
|
||||||
<template slot-scope="scope">
|
|
||||||
<b style="margin-right: 8px">{{ scope.row.at.getTime() }}</b>
|
|
||||||
<span>(<mk-time :time="scope.row.at"/>)</span>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
|
|
||||||
<el-table-column
|
|
||||||
label="Type"
|
|
||||||
>
|
|
||||||
<template slot-scope="scope">
|
|
||||||
<span>{{ getMessageType(scope.row.data) }}</span>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
|
|
||||||
<el-table-column
|
|
||||||
label="Incoming / Outgoing"
|
|
||||||
prop="type"
|
|
||||||
/>
|
|
||||||
</el-table>
|
|
||||||
</el-tab-pane>
|
|
||||||
</el-tabs>
|
|
||||||
</el-tab-pane>
|
|
||||||
|
|
||||||
<el-tab-pane label="Windows">
|
|
||||||
<el-table
|
|
||||||
:data="Array.from(os.windows.windows)"
|
|
||||||
style="width: 100%"
|
|
||||||
>
|
|
||||||
<el-table-column
|
|
||||||
label="Name"
|
|
||||||
>
|
|
||||||
<template slot-scope="scope">
|
|
||||||
<b>{{ scope.row.name || '(unknown)' }}</b>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
|
|
||||||
<el-table-column
|
|
||||||
label="Operations"
|
|
||||||
>
|
|
||||||
<template slot-scope="scope">
|
|
||||||
<el-button size="mini" type="danger" @click="scope.row.close">Close</el-button>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
</el-table>
|
|
||||||
</el-tab-pane>
|
|
||||||
</el-tabs>
|
|
||||||
</mk-window>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script lang="ts">
|
|
||||||
import Vue from 'vue';
|
|
||||||
|
|
||||||
export default Vue.extend({
|
|
||||||
mounted() {
|
|
||||||
(this as any).os.windows.on('added', this.onWindowsChanged);
|
|
||||||
(this as any).os.windows.on('removed', this.onWindowsChanged);
|
|
||||||
},
|
|
||||||
beforeDestroy() {
|
|
||||||
(this as any).os.windows.off('added', this.onWindowsChanged);
|
|
||||||
(this as any).os.windows.off('removed', this.onWindowsChanged);
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
getMessageType(data): string {
|
|
||||||
return data.type ? data.type : '-';
|
|
||||||
},
|
|
||||||
onWindowsChanged() {
|
|
||||||
this.$forceUpdate();
|
|
||||||
},
|
|
||||||
send(c) {
|
|
||||||
(this as any).apis.input({
|
|
||||||
title: 'Send a JSON message',
|
|
||||||
allowEmpty: false
|
|
||||||
}).then(json => {
|
|
||||||
c.send(JSON.parse(json));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="stylus" module>
|
|
||||||
.header
|
|
||||||
> [data-fa]
|
|
||||||
margin-right 4px
|
|
||||||
|
|
||||||
.content
|
|
||||||
height 100%
|
|
||||||
overflow auto
|
|
||||||
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.el-tabs__header {
|
|
||||||
margin-bottom: 0 !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.el-tabs__item {
|
|
||||||
padding: 0 20px !important;
|
|
||||||
}
|
|
||||||
</style>
|
|
@ -27,7 +27,7 @@ export default Vue.extend({
|
|||||||
translateY: -64,
|
translateY: -64,
|
||||||
duration: 500,
|
duration: 500,
|
||||||
easing: 'easeInElastic',
|
easing: 'easeInElastic',
|
||||||
complete: () => this.$destroy()
|
complete: () => this.destroyDom()
|
||||||
});
|
});
|
||||||
}, 6000);
|
}, 6000);
|
||||||
});
|
});
|
||||||
|
@ -75,7 +75,7 @@ export default Vue.extend({
|
|||||||
'margin-top': '-8px',
|
'margin-top': '-8px',
|
||||||
duration: 200,
|
duration: 200,
|
||||||
easing: 'easeOutQuad',
|
easing: 'easeOutQuad',
|
||||||
complete: () => this.$destroy()
|
complete: () => this.destroyDom()
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -106,7 +106,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
mounted() {
|
mounted() {
|
||||||
if (this.preventMount) {
|
if (this.preventMount) {
|
||||||
this.$destroy();
|
this.destroyDom();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -190,7 +190,7 @@ export default Vue.extend({
|
|||||||
});
|
});
|
||||||
|
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
this.$destroy();
|
this.destroyDom();
|
||||||
this.$emit('closed');
|
this.$emit('closed');
|
||||||
}, 300);
|
}, 300);
|
||||||
},
|
},
|
||||||
|
@ -1,8 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="oxynyeqmfvracxnglgulyqfgqxnxmehl">
|
<div class="oxynyeqmfvracxnglgulyqfgqxnxmehl">
|
||||||
<!-- トランジションを有効にするとなぜかメモリリークする -->
|
<!-- トランジションを有効にするとなぜかメモリリークする -->
|
||||||
<!--<transition-group name="mk-notifications" class="transition notifications">-->
|
<component :is="$store.state.device.animations ? 'transition-group' : 'div'" name="mk-notifications" class="transition notifications">
|
||||||
<div class="notifications">
|
|
||||||
<template v-for="(notification, i) in _notifications">
|
<template v-for="(notification, i) in _notifications">
|
||||||
<x-notification class="notification" :notification="notification" :key="notification.id"/>
|
<x-notification class="notification" :notification="notification" :key="notification.id"/>
|
||||||
<p class="date" v-if="i != notifications.length - 1 && notification._date != _notifications[i + 1]._date" :key="notification.id + '-time'">
|
<p class="date" v-if="i != notifications.length - 1 && notification._date != _notifications[i + 1]._date" :key="notification.id + '-time'">
|
||||||
@ -10,8 +9,7 @@
|
|||||||
<span>%fa:angle-down%{{ _notifications[i + 1]._datetext }}</span>
|
<span>%fa:angle-down%{{ _notifications[i + 1]._datetext }}</span>
|
||||||
</p>
|
</p>
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</component>
|
||||||
<!--</transition-group>-->
|
|
||||||
<button class="more" :class="{ fetching: fetchingMoreNotifications }" v-if="moreNotifications" @click="fetchMoreNotifications" :disabled="fetchingMoreNotifications">
|
<button class="more" :class="{ fetching: fetchingMoreNotifications }" v-if="moreNotifications" @click="fetchMoreNotifications" :disabled="fetchingMoreNotifications">
|
||||||
<template v-if="fetchingMoreNotifications">%fa:spinner .pulse .fw%</template>{{ fetchingMoreNotifications ? '%i18n:common.loading%' : '%i18n:@more%' }}
|
<template v-if="fetchingMoreNotifications">%fa:spinner .pulse .fw%</template>{{ fetchingMoreNotifications ? '%i18n:common.loading%' : '%i18n:@more%' }}
|
||||||
</button>
|
</button>
|
||||||
|
@ -7,9 +7,6 @@ import Vuex from 'vuex';
|
|||||||
import VueRouter from 'vue-router';
|
import VueRouter from 'vue-router';
|
||||||
import * as TreeView from 'vue-json-tree-view';
|
import * as TreeView from 'vue-json-tree-view';
|
||||||
import VAnimateCss from 'v-animate-css';
|
import VAnimateCss from 'v-animate-css';
|
||||||
import Element from 'element-ui';
|
|
||||||
import ElementLocaleEn from 'element-ui/lib/locale/lang/en';
|
|
||||||
import ElementLocaleJa from 'element-ui/lib/locale/lang/ja';
|
|
||||||
import VModal from 'vue-js-modal';
|
import VModal from 'vue-js-modal';
|
||||||
|
|
||||||
import App from './app.vue';
|
import App from './app.vue';
|
||||||
@ -17,18 +14,10 @@ import checkForUpdate from './common/scripts/check-for-update';
|
|||||||
import MiOS, { API } from './mios';
|
import MiOS, { API } from './mios';
|
||||||
import { version, codename, lang } from './config';
|
import { version, codename, lang } from './config';
|
||||||
|
|
||||||
let elementLocale;
|
|
||||||
switch (lang) {
|
|
||||||
case 'ja-JP': elementLocale = ElementLocaleJa; break;
|
|
||||||
case 'en-US': elementLocale = ElementLocaleEn; break;
|
|
||||||
default: elementLocale = ElementLocaleEn; break;
|
|
||||||
}
|
|
||||||
|
|
||||||
Vue.use(Vuex);
|
Vue.use(Vuex);
|
||||||
Vue.use(VueRouter);
|
Vue.use(VueRouter);
|
||||||
Vue.use(TreeView);
|
Vue.use(TreeView);
|
||||||
Vue.use(VAnimateCss);
|
Vue.use(VAnimateCss);
|
||||||
Vue.use(Element, { locale: elementLocale });
|
|
||||||
Vue.use(VModal);
|
Vue.use(VModal);
|
||||||
|
|
||||||
// Register global directives
|
// Register global directives
|
||||||
@ -42,9 +31,13 @@ require('./common/views/widgets');
|
|||||||
require('./common/views/filters');
|
require('./common/views/filters');
|
||||||
|
|
||||||
Vue.mixin({
|
Vue.mixin({
|
||||||
destroyed(this: any) {
|
methods: {
|
||||||
if (this.$el.parentNode) {
|
destroyDom() {
|
||||||
this.$el.parentNode.removeChild(this.$el);
|
this.$destroy();
|
||||||
|
|
||||||
|
if (this.$el.parentNode) {
|
||||||
|
this.$el.parentNode.removeChild(this.$el);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -6,7 +6,6 @@ import VueRouter from 'vue-router';
|
|||||||
|
|
||||||
// Style
|
// Style
|
||||||
import './style.styl';
|
import './style.styl';
|
||||||
import '../../element.scss';
|
|
||||||
|
|
||||||
import init from '../init';
|
import init from '../init';
|
||||||
|
|
||||||
|
@ -78,7 +78,7 @@ export default Vue.extend({
|
|||||||
scale: 0.8,
|
scale: 0.8,
|
||||||
duration: 300,
|
duration: 300,
|
||||||
easing: [ 0.5, -0.5, 1, 0.5 ],
|
easing: [ 0.5, -0.5, 1, 0.5 ],
|
||||||
complete: () => this.$destroy()
|
complete: () => this.destroyDom()
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
onBgClick() {
|
onBgClick() {
|
||||||
|
@ -31,15 +31,15 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
onSelected(file) {
|
onSelected(file) {
|
||||||
this.$emit('selected', file);
|
this.$emit('selected', file);
|
||||||
this.$destroy();
|
this.destroyDom();
|
||||||
},
|
},
|
||||||
cancel() {
|
cancel() {
|
||||||
this.$emit('canceled');
|
this.$emit('canceled');
|
||||||
this.$destroy();
|
this.destroyDom();
|
||||||
},
|
},
|
||||||
ok() {
|
ok() {
|
||||||
this.$emit('selected', this.files);
|
this.$emit('selected', this.files);
|
||||||
this.$destroy();
|
this.destroyDom();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -19,11 +19,11 @@ export default Vue.extend({
|
|||||||
methods: {
|
methods: {
|
||||||
cancel() {
|
cancel() {
|
||||||
this.$emit('canceled');
|
this.$emit('canceled');
|
||||||
this.$destroy();
|
this.destroyDom();
|
||||||
},
|
},
|
||||||
ok() {
|
ok() {
|
||||||
this.$emit('selected', (this.$refs.browser as any).folder);
|
this.$emit('selected', (this.$refs.browser as any).folder);
|
||||||
this.$destroy();
|
this.destroyDom();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -47,7 +47,7 @@ export default Vue.extend({
|
|||||||
this.fetch();
|
this.fetch();
|
||||||
},
|
},
|
||||||
close() {
|
close() {
|
||||||
this.$destroy();
|
this.destroyDom();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -19,12 +19,13 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
raw: {
|
raw: {
|
||||||
default: false
|
default: false
|
||||||
},
|
|
||||||
hide: {
|
|
||||||
type: Boolean,
|
|
||||||
default: true
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
hide: true
|
||||||
|
};
|
||||||
|
}
|
||||||
computed: {
|
computed: {
|
||||||
style(): any {
|
style(): any {
|
||||||
let url = `url(${this.image.thumbnailUrl})`;
|
let url = `url(${this.image.thumbnailUrl})`;
|
||||||
@ -65,7 +66,7 @@ export default Vue.extend({
|
|||||||
text-align center
|
text-align center
|
||||||
font-size 12px
|
font-size 12px
|
||||||
|
|
||||||
> b
|
> *
|
||||||
display block
|
display block
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
@ -15,25 +15,28 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue'
|
import Vue from 'vue';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
props: {
|
props: {
|
||||||
video: {
|
video: {
|
||||||
type: Object,
|
type: Object,
|
||||||
required: true
|
required: true
|
||||||
},
|
|
||||||
hide: {
|
|
||||||
type: Boolean,
|
|
||||||
default: true
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
hide: true
|
||||||
|
};
|
||||||
|
},
|
||||||
computed: {
|
computed: {
|
||||||
imageStyle(): any {
|
imageStyle(): any {
|
||||||
return {
|
return {
|
||||||
'background-image': `url(${this.video.url})`
|
'background-image': `url(${this.video.url})`
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
},})
|
}
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="stylus" scoped>
|
<style lang="stylus" scoped>
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- トランジションを有効にするとなぜかメモリリークする -->
|
<!-- トランジションを有効にするとなぜかメモリリークする -->
|
||||||
<transition-group name="mk-notes" class="transition" tag="div">
|
<component :is="$store.state.device.animations ? 'transition-group' : 'div'" name="mk-notes" class="transition" tag="div">
|
||||||
<template v-for="(note, i) in _notes">
|
<template v-for="(note, i) in _notes">
|
||||||
<mk-note :note="note" :key="note.id" @update:note="onNoteUpdated(i, $event)"/>
|
<mk-note :note="note" :key="note.id" @update:note="onNoteUpdated(i, $event)"/>
|
||||||
<p class="date" :key="note.id + '_date'" v-if="i != notes.length - 1 && note._date != _notes[i + 1]._date">
|
<p class="date" :key="note.id + '_date'" v-if="i != notes.length - 1 && note._date != _notes[i + 1]._date">
|
||||||
@ -22,7 +22,7 @@
|
|||||||
<span>%fa:angle-down%{{ _notes[i + 1]._datetext }}</span>
|
<span>%fa:angle-down%{{ _notes[i + 1]._datetext }}</span>
|
||||||
</p>
|
</p>
|
||||||
</template>
|
</template>
|
||||||
</transition-group>
|
</component>
|
||||||
|
|
||||||
<footer v-if="more">
|
<footer v-if="more">
|
||||||
<button @click="loadMore" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }">
|
<button @click="loadMore" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }">
|
||||||
|
@ -1,8 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mk-notifications">
|
<div class="mk-notifications">
|
||||||
<!-- トランジションを有効にするとなぜかメモリリークする -->
|
<!-- トランジションを有効にするとなぜかメモリリークする -->
|
||||||
<!-- <transition-group name="mk-notifications" class="transition notifications"> -->
|
<component :is="$store.state.device.animations ? 'transition-group' : 'div'" name="mk-notifications" class="transition notifications">
|
||||||
<div class="transition notifications">
|
|
||||||
<template v-for="(notification, i) in _notifications">
|
<template v-for="(notification, i) in _notifications">
|
||||||
<mk-notification :notification="notification" :key="notification.id"/>
|
<mk-notification :notification="notification" :key="notification.id"/>
|
||||||
<p class="date" :key="notification.id + '_date'" v-if="i != notifications.length - 1 && notification._date != _notifications[i + 1]._date">
|
<p class="date" :key="notification.id + '_date'" v-if="i != notifications.length - 1 && notification._date != _notifications[i + 1]._date">
|
||||||
@ -10,8 +9,7 @@
|
|||||||
<span>%fa:angle-down%{{ _notifications[i + 1]._datetext }}</span>
|
<span>%fa:angle-down%{{ _notifications[i + 1]._datetext }}</span>
|
||||||
</p>
|
</p>
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</component>
|
||||||
<!-- </transition-group> -->
|
|
||||||
|
|
||||||
<button class="more" v-if="moreNotifications" @click="fetchMoreNotifications" :disabled="fetchingMoreNotifications">
|
<button class="more" v-if="moreNotifications" @click="fetchMoreNotifications" :disabled="fetchingMoreNotifications">
|
||||||
<template v-if="fetchingMoreNotifications">%fa:spinner .pulse .fw%</template>
|
<template v-if="fetchingMoreNotifications">%fa:spinner .pulse .fw%</template>
|
||||||
|
@ -32,7 +32,7 @@ export default Vue.extend({
|
|||||||
[this.pos]: `-${this.$el.offsetHeight}px`,
|
[this.pos]: `-${this.$el.offsetHeight}px`,
|
||||||
duration: 500,
|
duration: 500,
|
||||||
easing: 'easeOutQuad',
|
easing: 'easeOutQuad',
|
||||||
complete: () => this.$destroy()
|
complete: () => this.destroyDom()
|
||||||
});
|
});
|
||||||
}, 6000);
|
}, 6000);
|
||||||
});
|
});
|
||||||
|
@ -79,7 +79,7 @@ export default Vue.extend({
|
|||||||
translateY: 16,
|
translateY: 16,
|
||||||
duration: 300,
|
duration: 300,
|
||||||
easing: 'easeOutQuad',
|
easing: 'easeOutQuad',
|
||||||
complete: () => this.$destroy()
|
complete: () => this.destroyDom()
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -42,7 +42,7 @@
|
|||||||
<span v-if="visibility === 'private'">%fa:lock%</span>
|
<span v-if="visibility === 'private'">%fa:lock%</span>
|
||||||
</button>
|
</button>
|
||||||
</footer>
|
</footer>
|
||||||
<input ref="file" class="file" type="file" accept="image/*" multiple="multiple" @change="onChangeFile"/>
|
<input ref="file" class="file" type="file" multiple="multiple" @change="onChangeFile"/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="hashtags" v-if="recentHashtags.length > 0 && $store.state.settings.suggestRecentHashtags">
|
<div class="hashtags" v-if="recentHashtags.length > 0 && $store.state.settings.suggestRecentHashtags">
|
||||||
@ -59,7 +59,7 @@ import MkVisibilityChooser from '../../../common/views/components/visibility-cho
|
|||||||
import getFace from '../../../common/scripts/get-face';
|
import getFace from '../../../common/scripts/get-face';
|
||||||
import parse from '../../../../../mfm/parse';
|
import parse from '../../../../../mfm/parse';
|
||||||
import { host } from '../../../config';
|
import { host } from '../../../config';
|
||||||
import { erase } from '../../../../../prelude/array';
|
import { erase, unique } from '../../../../../prelude/array';
|
||||||
import { length } from 'stringz';
|
import { length } from 'stringz';
|
||||||
import parseAcct from '../../../../../misc/acct/parse';
|
import parseAcct from '../../../../../misc/acct/parse';
|
||||||
|
|
||||||
|
@ -13,7 +13,9 @@
|
|||||||
<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="circleIcons">%i18n:@circle-icons%</ui-switch>
|
<ui-switch v-model="circleIcons">%i18n:@circle-icons%</ui-switch>
|
||||||
|
<ui-switch v-model="animations">%i18n:common.enable-animations% (%i18n:common.this-setting-is-this-device-only%)</ui-switch>
|
||||||
<ui-switch v-model="contrastedAcct">%i18n:@contrasted-acct%</ui-switch>
|
<ui-switch v-model="contrastedAcct">%i18n:@contrasted-acct%</ui-switch>
|
||||||
|
<ui-switch v-model="showFullAcct">%i18n:common.show-full-acct%</ui-switch>
|
||||||
<ui-switch v-model="iLikeSushi">%i18n:common.i-like-sushi%</ui-switch>
|
<ui-switch v-model="iLikeSushi">%i18n:common.i-like-sushi%</ui-switch>
|
||||||
<ui-switch v-model="disableAnimatedMfm">%i18n:common.disable-animated-mfm%</ui-switch>
|
<ui-switch v-model="disableAnimatedMfm">%i18n:common.disable-animated-mfm%</ui-switch>
|
||||||
<ui-switch v-model="alwaysShowNsfw">%i18n:common.always-show-nsfw% (%i18n:common.this-setting-is-this-device-only%)</ui-switch>
|
<ui-switch v-model="alwaysShowNsfw">%i18n:common.always-show-nsfw% (%i18n:common.this-setting-is-this-device-only%)</ui-switch>
|
||||||
@ -167,6 +169,11 @@ export default Vue.extend({
|
|||||||
set(value) { this.$store.commit('device/set', { key: 'darkmode', value }); }
|
set(value) { this.$store.commit('device/set', { key: 'darkmode', value }); }
|
||||||
},
|
},
|
||||||
|
|
||||||
|
animations: {
|
||||||
|
get() { return this.$store.state.device.animations; },
|
||||||
|
set(value) { this.$store.commit('device/set', { key: 'animations', value }); }
|
||||||
|
},
|
||||||
|
|
||||||
alwaysShowNsfw: {
|
alwaysShowNsfw: {
|
||||||
get() { return this.$store.state.device.alwaysShowNsfw; },
|
get() { return this.$store.state.device.alwaysShowNsfw; },
|
||||||
set(value) { this.$store.commit('device/set', { key: 'alwaysShowNsfw', value }); }
|
set(value) { this.$store.commit('device/set', { key: 'alwaysShowNsfw', value }); }
|
||||||
@ -232,6 +239,11 @@ export default Vue.extend({
|
|||||||
set(value) { this.$store.dispatch('settings/set', { key: 'contrastedAcct', value }); }
|
set(value) { this.$store.dispatch('settings/set', { key: 'contrastedAcct', value }); }
|
||||||
},
|
},
|
||||||
|
|
||||||
|
showFullAcct: {
|
||||||
|
get() { return this.$store.state.settings.showFullAcct; },
|
||||||
|
set(value) { this.$store.dispatch('settings/set', { key: 'showFullAcct', value }); }
|
||||||
|
},
|
||||||
|
|
||||||
iLikeSushi: {
|
iLikeSushi: {
|
||||||
get() { return this.$store.state.settings.iLikeSushi; },
|
get() { return this.$store.state.settings.iLikeSushi; },
|
||||||
set(value) { this.$store.dispatch('settings/set', { key: 'iLikeSushi', value }); }
|
set(value) { this.$store.dispatch('settings/set', { key: 'iLikeSushi', value }); }
|
||||||
|
@ -49,6 +49,7 @@
|
|||||||
|
|
||||||
<div>
|
<div>
|
||||||
<ui-switch v-model="isCat" @change="save(false)">%i18n:@is-cat%</ui-switch>
|
<ui-switch v-model="isCat" @change="save(false)">%i18n:@is-cat%</ui-switch>
|
||||||
|
<ui-switch v-model="alwaysMarkNsfw">%i18n:common.always-mark-nsfw%</ui-switch>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
@ -85,6 +86,13 @@ export default Vue.extend({
|
|||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
alwaysMarkNsfw: {
|
||||||
|
get() { return this.$store.state.i.settings.alwaysMarkNsfw; },
|
||||||
|
set(value) { (this as any).api('i/update', { alwaysMarkNsfw: value }); }
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
created() {
|
created() {
|
||||||
this.name = this.$store.state.i.name || '';
|
this.name = this.$store.state.i.name || '';
|
||||||
this.username = this.$store.state.i.username;
|
this.username = this.$store.state.i.username;
|
||||||
|
@ -17,6 +17,7 @@ const defaultSettings = {
|
|||||||
showClockOnHeader: true,
|
showClockOnHeader: true,
|
||||||
circleIcons: true,
|
circleIcons: true,
|
||||||
contrastedAcct: true,
|
contrastedAcct: true,
|
||||||
|
showFullAcct: false,
|
||||||
gradientWindowHeader: false,
|
gradientWindowHeader: false,
|
||||||
showReplyTarget: true,
|
showReplyTarget: true,
|
||||||
showMyRenotes: true,
|
showMyRenotes: true,
|
||||||
@ -37,6 +38,7 @@ const defaultSettings = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const defaultDeviceSettings = {
|
const defaultDeviceSettings = {
|
||||||
|
animations: true,
|
||||||
apiViaStream: true,
|
apiViaStream: true,
|
||||||
autoPopout: false,
|
autoPopout: false,
|
||||||
darkmode: false,
|
darkmode: false,
|
||||||
|
@ -1,12 +0,0 @@
|
|||||||
/* Element variable definitons */
|
|
||||||
/* SEE: http://element.eleme.io/#/en-US/component/custom-theme */
|
|
||||||
|
|
||||||
@import '../const.json';
|
|
||||||
|
|
||||||
/* theme color */
|
|
||||||
$--color-primary: $themeColor;
|
|
||||||
|
|
||||||
/* icon font path, required */
|
|
||||||
$--font-path: '~element-ui/lib/theme-chalk/fonts';
|
|
||||||
|
|
||||||
@import "~element-ui/packages/theme-chalk/src/index";
|
|
@ -204,4 +204,30 @@ export interface IStats {
|
|||||||
decSize: number;
|
decSize: number;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ネットワークに関する統計
|
||||||
|
*/
|
||||||
|
network: {
|
||||||
|
/**
|
||||||
|
* サーバーへのリクエスト数
|
||||||
|
*/
|
||||||
|
requests: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 応答時間の合計
|
||||||
|
* TIP: (totalTime / requests) でひとつのリクエストに平均でどれくらいの時間がかかったか知れる
|
||||||
|
*/
|
||||||
|
totalTime: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 合計受信データ量
|
||||||
|
*/
|
||||||
|
incomingBytes: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 合計送信データ量
|
||||||
|
*/
|
||||||
|
outgoingBytes: number;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
@ -102,7 +102,10 @@ export interface ILocalUser extends IUserBase {
|
|||||||
twoFactorEnabled: boolean;
|
twoFactorEnabled: boolean;
|
||||||
twoFactorTempSecret?: string;
|
twoFactorTempSecret?: string;
|
||||||
clientSettings: any;
|
clientSettings: any;
|
||||||
settings: any;
|
settings: {
|
||||||
|
autoWatch: boolean;
|
||||||
|
alwaysMarkNsfw?: boolean;
|
||||||
|
};
|
||||||
hasUnreadNotification: boolean;
|
hasUnreadNotification: boolean;
|
||||||
hasUnreadMessagingMessage: boolean;
|
hasUnreadMessagingMessage: boolean;
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,7 @@ import Meta from '../../../../models/meta';
|
|||||||
|
|
||||||
export default () => new Promise(async (res, rej) => {
|
export default () => new Promise(async (res, rej) => {
|
||||||
const meta = await Meta.findOne({});
|
const meta = await Meta.findOne({});
|
||||||
const hidedTags = (meta.hidedTags || []).map(t => t.toLowerCase());
|
const hidedTags = meta ? (meta.hidedTags || []).map(t => t.toLowerCase()) : [];
|
||||||
|
|
||||||
const span = 1000 * 60 * 60 * 24 * 7; // 1週間
|
const span = 1000 * 60 * 60 * 24 * 7; // 1週間
|
||||||
|
|
||||||
|
@ -6,6 +6,15 @@ type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;
|
|||||||
|
|
||||||
function migrateStats(stats: IStats[]) {
|
function migrateStats(stats: IStats[]) {
|
||||||
stats.forEach(stat => {
|
stats.forEach(stat => {
|
||||||
|
if (stat.network == null) {
|
||||||
|
stat.network = {
|
||||||
|
requests: 0,
|
||||||
|
totalTime: 0,
|
||||||
|
incomingBytes: 0,
|
||||||
|
outgoingBytes: 0
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
const isOldData =
|
const isOldData =
|
||||||
stat.users.local.inc == null ||
|
stat.users.local.inc == null ||
|
||||||
stat.users.local.dec == null ||
|
stat.users.local.dec == null ||
|
||||||
@ -180,6 +189,12 @@ export default (params: any) => new Promise(async (res, rej) => {
|
|||||||
decCount: 0,
|
decCount: 0,
|
||||||
decSize: 0
|
decSize: 0
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
network: {
|
||||||
|
requests: 0,
|
||||||
|
totalTime: 0,
|
||||||
|
incomingBytes: 0,
|
||||||
|
outgoingBytes: 0
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
@ -236,6 +251,12 @@ export default (params: any) => new Promise(async (res, rej) => {
|
|||||||
decCount: 0,
|
decCount: 0,
|
||||||
decSize: 0
|
decSize: 0
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
network: {
|
||||||
|
requests: 0,
|
||||||
|
totalTime: 0,
|
||||||
|
incomingBytes: 0,
|
||||||
|
outgoingBytes: 0
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -31,8 +31,8 @@ export const meta = {
|
|||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
|
|
||||||
isSensitive: $.bool.optional.note({
|
isSensitive: $.bool.optional.nullable.note({
|
||||||
default: false,
|
default: null,
|
||||||
desc: {
|
desc: {
|
||||||
'ja-JP': 'このメディアが「閲覧注意」(NSFW)かどうか',
|
'ja-JP': 'このメディアが「閲覧注意」(NSFW)かどうか',
|
||||||
'en-US': 'Whether this media is NSFW'
|
'en-US': 'Whether this media is NSFW'
|
||||||
|
@ -19,7 +19,7 @@ const max = 5;
|
|||||||
*/
|
*/
|
||||||
export default () => new Promise(async (res, rej) => {
|
export default () => new Promise(async (res, rej) => {
|
||||||
const meta = await Meta.findOne({});
|
const meta = await Meta.findOne({});
|
||||||
const hidedTags = (meta.hidedTags || []).map(t => t.toLowerCase());
|
const hidedTags = meta ? (meta.hidedTags || []).map(t => t.toLowerCase()) : [];
|
||||||
|
|
||||||
//#region 1. 直近Aの内に投稿されたハッシュタグ(とユーザーのペア)を集計
|
//#region 1. 直近Aの内に投稿されたハッシュタグ(とユーザーのペア)を集計
|
||||||
const data = await Note.aggregate([{
|
const data = await Note.aggregate([{
|
||||||
|
@ -84,6 +84,12 @@ export const meta = {
|
|||||||
'ja-JP': '投稿の自動ウォッチをするか否か'
|
'ja-JP': '投稿の自動ウォッチをするか否か'
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
|
|
||||||
|
alwaysMarkNsfw: $.bool.optional.note({
|
||||||
|
desc: {
|
||||||
|
'ja-JP': 'アップロードするメディアをデフォルトで「閲覧注意」として設定するか'
|
||||||
|
}
|
||||||
|
}),
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -106,6 +112,7 @@ export default async (params: any, user: ILocalUser, app: IApp) => new Promise(a
|
|||||||
if (typeof ps.isBot == 'boolean') updates.isBot = ps.isBot;
|
if (typeof ps.isBot == 'boolean') updates.isBot = ps.isBot;
|
||||||
if (typeof ps.isCat == 'boolean') updates.isCat = ps.isCat;
|
if (typeof ps.isCat == 'boolean') updates.isCat = ps.isCat;
|
||||||
if (typeof ps.autoWatch == 'boolean') updates['settings.autoWatch'] = ps.autoWatch;
|
if (typeof ps.autoWatch == 'boolean') updates['settings.autoWatch'] = ps.autoWatch;
|
||||||
|
if (typeof ps.alwaysMarkNsfw == 'boolean') updates['settings.alwaysMarkNsfw'] = ps.alwaysMarkNsfw;
|
||||||
|
|
||||||
if (ps.avatarId) {
|
if (ps.avatarId) {
|
||||||
const avatar = await DriveFile.findOne({
|
const avatar = await DriveFile.findOne({
|
||||||
|
@ -11,11 +11,13 @@ import * as Router from 'koa-router';
|
|||||||
import * as mount from 'koa-mount';
|
import * as mount from 'koa-mount';
|
||||||
import * as compress from 'koa-compress';
|
import * as compress from 'koa-compress';
|
||||||
import * as logger from 'koa-logger';
|
import * as logger from 'koa-logger';
|
||||||
|
const requestStats = require('request-stats');
|
||||||
//const slow = require('koa-slow');
|
//const slow = require('koa-slow');
|
||||||
|
|
||||||
import activityPub from './activitypub';
|
import activityPub from './activitypub';
|
||||||
import webFinger from './webfinger';
|
import webFinger from './webfinger';
|
||||||
import config from '../config';
|
import config from '../config';
|
||||||
|
import { updateNetworkStats } from '../services/update-chart';
|
||||||
|
|
||||||
// Init app
|
// Init app
|
||||||
const app = new Koa();
|
const app = new Koa();
|
||||||
@ -81,4 +83,27 @@ export default () => new Promise(resolve => {
|
|||||||
|
|
||||||
// Listen
|
// Listen
|
||||||
server.listen(config.port, resolve);
|
server.listen(config.port, resolve);
|
||||||
|
|
||||||
|
//#region Network stats
|
||||||
|
let queue: any[] = [];
|
||||||
|
|
||||||
|
requestStats(server, (stats: any) => {
|
||||||
|
if (stats.ok) {
|
||||||
|
queue.push(stats);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Bulk write
|
||||||
|
setInterval(() => {
|
||||||
|
if (queue.length == 0) return;
|
||||||
|
|
||||||
|
const requests = queue.length;
|
||||||
|
const time = queue.reduce((a, b) => a + b.time, 0);
|
||||||
|
const incomingBytes = queue.reduce((a, b) => a + b.req.bytes, 0);
|
||||||
|
const outgoingBytes = queue.reduce((a, b) => a + b.res.bytes, 0);
|
||||||
|
queue = [];
|
||||||
|
|
||||||
|
updateNetworkStats(requests, time, incomingBytes, outgoingBytes);
|
||||||
|
}, 5000);
|
||||||
|
//#endregion
|
||||||
});
|
});
|
||||||
|
@ -153,7 +153,7 @@ export default async function(
|
|||||||
isLink: boolean = false,
|
isLink: boolean = false,
|
||||||
url: string = null,
|
url: string = null,
|
||||||
uri: string = null,
|
uri: string = null,
|
||||||
sensitive = false
|
sensitive: boolean = null
|
||||||
): Promise<IDriveFile> {
|
): Promise<IDriveFile> {
|
||||||
// Calc md5 hash
|
// Calc md5 hash
|
||||||
const calcHash = new Promise<string>((res, rej) => {
|
const calcHash = new Promise<string>((res, rej) => {
|
||||||
@ -329,7 +329,13 @@ export default async function(
|
|||||||
properties: properties,
|
properties: properties,
|
||||||
withoutChunks: isLink,
|
withoutChunks: isLink,
|
||||||
isRemote: isLink,
|
isRemote: isLink,
|
||||||
isSensitive: sensitive
|
isSensitive: (sensitive !== null && sensitive !== undefined)
|
||||||
|
? sensitive
|
||||||
|
: isLocalUser(user)
|
||||||
|
? user.settings.alwaysMarkNsfw
|
||||||
|
? true
|
||||||
|
: false
|
||||||
|
: false
|
||||||
} as IMetadata;
|
} as IMetadata;
|
||||||
|
|
||||||
if (url !== null) {
|
if (url !== null) {
|
||||||
|
@ -96,6 +96,12 @@ async function getCurrentStats(span: 'day' | 'hour'): Promise<IStats> {
|
|||||||
decCount: 0,
|
decCount: 0,
|
||||||
decSize: 0
|
decSize: 0
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
network: {
|
||||||
|
requests: 0,
|
||||||
|
totalTime: 0,
|
||||||
|
incomingBytes: 0,
|
||||||
|
outgoingBytes: 0
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -161,6 +167,12 @@ async function getCurrentStats(span: 'day' | 'hour'): Promise<IStats> {
|
|||||||
decCount: 0,
|
decCount: 0,
|
||||||
decSize: 0
|
decSize: 0
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
network: {
|
||||||
|
requests: 0,
|
||||||
|
totalTime: 0,
|
||||||
|
incomingBytes: 0,
|
||||||
|
outgoingBytes: 0
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -243,3 +255,13 @@ export async function updateDriveStats(file: IDriveFile, isAdditional: boolean)
|
|||||||
|
|
||||||
await update(inc);
|
await update(inc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function updateNetworkStats(requests: number, time: number, incomingBytes: number, outgoingBytes: number) {
|
||||||
|
const inc = {} as any;
|
||||||
|
inc['network.requests'] = requests;
|
||||||
|
inc['network.totalTime'] = time;
|
||||||
|
inc['network.incomingBytes'] = incomingBytes;
|
||||||
|
inc['network.outgoingBytes'] = outgoingBytes;
|
||||||
|
|
||||||
|
await update(inc);
|
||||||
|
}
|
||||||
|
@ -7,7 +7,6 @@ import * as webpack from 'webpack';
|
|||||||
import chalk from 'chalk';
|
import chalk from 'chalk';
|
||||||
import rndstr from 'rndstr';
|
import rndstr from 'rndstr';
|
||||||
const { VueLoaderPlugin } = require('vue-loader');
|
const { VueLoaderPlugin } = require('vue-loader');
|
||||||
const jsonImporter = require('node-sass-json-importer');
|
|
||||||
const minifyHtml = require('html-minifier').minify;
|
const minifyHtml = require('html-minifier').minify;
|
||||||
const WebpackOnBuildPlugin = require('on-build-webpack');
|
const WebpackOnBuildPlugin = require('on-build-webpack');
|
||||||
//const HardSourceWebpackPlugin = require('hard-source-webpack-plugin');
|
//const HardSourceWebpackPlugin = require('hard-source-webpack-plugin');
|
||||||
@ -183,22 +182,6 @@ module.exports = {
|
|||||||
loader: 'stylus-loader'
|
loader: 'stylus-loader'
|
||||||
}]
|
}]
|
||||||
}]
|
}]
|
||||||
}, {
|
|
||||||
test: /\.scss$/,
|
|
||||||
exclude: /node_modules/,
|
|
||||||
use: [{
|
|
||||||
loader: 'style-loader'
|
|
||||||
}, {
|
|
||||||
loader: 'css-loader',
|
|
||||||
options: {
|
|
||||||
minimize: true
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
loader: 'sass-loader',
|
|
||||||
options: {
|
|
||||||
importer: jsonImporter(),
|
|
||||||
}
|
|
||||||
}]
|
|
||||||
}, {
|
}, {
|
||||||
test: /\.css$/,
|
test: /\.css$/,
|
||||||
use: [{
|
use: [{
|
||||||
|
Reference in New Issue
Block a user