Compare commits
64 Commits
Author | SHA1 | Date | |
---|---|---|---|
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 |
@ -109,6 +109,10 @@ common:
|
||||
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
||||
verified-user: "公式アカウント"
|
||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||
always-show-nsfw: "常に閲覧注意のメディアを表示する"
|
||||
always-mark-nsfw: "常にメディアを閲覧注意として投稿"
|
||||
show-full-acct: "ユーザー名のホストを省略しない"
|
||||
this-setting-is-this-device-only: "このデバイスのみ"
|
||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||
reversi:
|
||||
drawn: "引き分け"
|
||||
@ -461,6 +465,7 @@ desktop/views/components/charts.vue:
|
||||
notes: "投稿"
|
||||
users: "ユーザー"
|
||||
drive: "ドライブ"
|
||||
network: "ネットワーク"
|
||||
charts:
|
||||
notes: "投稿の増減 (統合)"
|
||||
local-notes: "投稿の増減 (ローカル)"
|
||||
@ -472,6 +477,9 @@ desktop/views/components/charts.vue:
|
||||
drive-total: "ドライブ使用量の累計"
|
||||
drive-files: "ドライブのファイル数の増減"
|
||||
drive-files-total: "ドライブのファイル数の累計"
|
||||
network-requests: "リクエスト"
|
||||
network-time: "応答時間"
|
||||
network-usage: "通信量"
|
||||
desktop/views/components/choose-file-from-drive-window.vue:
|
||||
choose-file: "ファイル選択中"
|
||||
upload: "PCからドライブにファイルをアップロード"
|
||||
|
@ -109,6 +109,10 @@ common:
|
||||
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
||||
verified-user: "公式アカウント"
|
||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||
always-show-nsfw: "常に閲覧注意のメディアを表示する"
|
||||
always-mark-nsfw: "常にメディアを閲覧注意として投稿"
|
||||
show-full-acct: "ユーザー名のホストを省略しない"
|
||||
this-setting-is-this-device-only: "このデバイスのみ"
|
||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||
reversi:
|
||||
drawn: "引き分け"
|
||||
@ -461,6 +465,7 @@ desktop/views/components/charts.vue:
|
||||
notes: "投稿"
|
||||
users: "ユーザー"
|
||||
drive: "ドライブ"
|
||||
network: "ネットワーク"
|
||||
charts:
|
||||
notes: "投稿の増減 (統合)"
|
||||
local-notes: "投稿の増減 (ローカル)"
|
||||
@ -472,6 +477,9 @@ desktop/views/components/charts.vue:
|
||||
drive-total: "ドライブ使用量の累計"
|
||||
drive-files: "ドライブのファイル数の増減"
|
||||
drive-files-total: "ドライブのファイル数の累計"
|
||||
network-requests: "リクエスト"
|
||||
network-time: "応答時間"
|
||||
network-usage: "通信量"
|
||||
desktop/views/components/choose-file-from-drive-window.vue:
|
||||
choose-file: "Datei auswählen"
|
||||
upload: "Dateien von deinem PC hochladen"
|
||||
|
@ -109,6 +109,10 @@ common:
|
||||
use-contrast-reversi-stones: "Make the stone color clear in reversi"
|
||||
verified-user: "Verified account"
|
||||
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"
|
||||
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.'
|
||||
reversi:
|
||||
drawn: "Draw"
|
||||
@ -461,6 +465,7 @@ desktop/views/components/charts.vue:
|
||||
notes: "Posts"
|
||||
users: "Users"
|
||||
drive: "Drive"
|
||||
network: "ネットワーク"
|
||||
charts:
|
||||
notes: "The number of posts: increase/decrease (Combined)"
|
||||
local-notes: "The number of posts: increase/decrease (Local)"
|
||||
@ -472,6 +477,9 @@ desktop/views/components/charts.vue:
|
||||
drive-total: "Capacity used as the storage: cumulative total"
|
||||
drive-files: "The number of files on the storage: increase/decrease"
|
||||
drive-files-total: "The number of files on the storage: cumulative total"
|
||||
network-requests: "リクエスト"
|
||||
network-time: "応答時間"
|
||||
network-usage: "通信量"
|
||||
desktop/views/components/choose-file-from-drive-window.vue:
|
||||
choose-file: "Choose files"
|
||||
upload: "Upload files from your device"
|
||||
@ -778,7 +786,7 @@ desktop/views/components/settings.profile.vue:
|
||||
birthday: "Birthday"
|
||||
save: "Update profile"
|
||||
locked-account: "Protect your account"
|
||||
is-locked: "フォローを承認制にする"
|
||||
is-locked: "Follow request needs approval"
|
||||
other: "Other"
|
||||
is-bot: "This account is a Bot"
|
||||
is-cat: "This account is a Cat"
|
||||
@ -1160,7 +1168,7 @@ mobile/views/pages/settings/settings.profile.vue:
|
||||
avatar: "Avatar"
|
||||
banner: "Banner"
|
||||
is-cat: "This account is a Cat"
|
||||
is-locked: "フォローを承認制にする"
|
||||
is-locked: "Follow request needs approval"
|
||||
advanced: "Advanced"
|
||||
privacy: "Privacy"
|
||||
save: "Update profile"
|
||||
|
@ -109,6 +109,10 @@ common:
|
||||
use-contrast-reversi-stones: "Hacer el color de la piedra claro en Reversi"
|
||||
verified-user: "Cuenta verificada"
|
||||
disable-animated-mfm: "Desactivar texto animado en una publicación"
|
||||
always-show-nsfw: "常に閲覧注意のメディアを表示する"
|
||||
always-mark-nsfw: "常にメディアを閲覧注意として投稿"
|
||||
show-full-acct: "ユーザー名のホストを省略しない"
|
||||
this-setting-is-this-device-only: "このデバイスのみ"
|
||||
do-not-use-in-production: 'Esto está en desarrollo, no usarlo para producción.'
|
||||
reversi:
|
||||
drawn: "Empatado"
|
||||
@ -461,6 +465,7 @@ desktop/views/components/charts.vue:
|
||||
notes: "Publicaciones"
|
||||
users: "Usuarios"
|
||||
drive: "Unidad"
|
||||
network: "ネットワーク"
|
||||
charts:
|
||||
notes: "Número de publicaciones: aumentar/disminuir (Combinado)"
|
||||
local-notes: "Número de publicaciones: aumentar/disminuir (Local)"
|
||||
@ -472,6 +477,9 @@ desktop/views/components/charts.vue:
|
||||
drive-total: "Capacidad de almacenamiento usada: Acumulativa total"
|
||||
drive-files: "Número de archivos almacenados: aumentar/disminuir"
|
||||
drive-files-total: "Número de archivos almacenados: Acumulativo total"
|
||||
network-requests: "リクエスト"
|
||||
network-time: "応答時間"
|
||||
network-usage: "通信量"
|
||||
desktop/views/components/choose-file-from-drive-window.vue:
|
||||
choose-file: "Escoger archivos"
|
||||
upload: "Cargar archivos de tu dispositivo"
|
||||
|
@ -109,6 +109,10 @@ common:
|
||||
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
||||
verified-user: "Compte vérifié"
|
||||
disable-animated-mfm: "Désactiver les textes animés dans les publications"
|
||||
always-show-nsfw: "常に閲覧注意のメディアを表示する"
|
||||
always-mark-nsfw: "常にメディアを閲覧注意として投稿"
|
||||
show-full-acct: "ユーザー名のホストを省略しない"
|
||||
this-setting-is-this-device-only: "このデバイスのみ"
|
||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||
reversi:
|
||||
drawn: "Partie nulle"
|
||||
@ -461,6 +465,7 @@ desktop/views/components/charts.vue:
|
||||
notes: "Publications"
|
||||
users: "Utilisateurs"
|
||||
drive: "Drive"
|
||||
network: "ネットワーク"
|
||||
charts:
|
||||
notes: "投稿の増減 (統合)"
|
||||
local-notes: "投稿の増減 (ローカル)"
|
||||
@ -472,6 +477,9 @@ desktop/views/components/charts.vue:
|
||||
drive-total: "ドライブ使用量の累計"
|
||||
drive-files: "ドライブのファイル数の増減"
|
||||
drive-files-total: "ドライブのファイル数の累計"
|
||||
network-requests: "リクエスト"
|
||||
network-time: "応答時間"
|
||||
network-usage: "通信量"
|
||||
desktop/views/components/choose-file-from-drive-window.vue:
|
||||
choose-file: "Sélection de fichiers"
|
||||
upload: "Téléverser des fichiers à partir de votre ordinateur"
|
||||
|
@ -109,6 +109,10 @@ common:
|
||||
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
||||
verified-user: "公式アカウント"
|
||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||
always-show-nsfw: "常に閲覧注意のメディアを表示する"
|
||||
always-mark-nsfw: "常にメディアを閲覧注意として投稿"
|
||||
show-full-acct: "ユーザー名のホストを省略しない"
|
||||
this-setting-is-this-device-only: "このデバイスのみ"
|
||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||
reversi:
|
||||
drawn: "引き分け"
|
||||
@ -461,6 +465,7 @@ desktop/views/components/charts.vue:
|
||||
notes: "投稿"
|
||||
users: "ユーザー"
|
||||
drive: "ドライブ"
|
||||
network: "ネットワーク"
|
||||
charts:
|
||||
notes: "投稿の増減 (統合)"
|
||||
local-notes: "投稿の増減 (ローカル)"
|
||||
@ -472,6 +477,9 @@ desktop/views/components/charts.vue:
|
||||
drive-total: "ドライブ使用量の累計"
|
||||
drive-files: "ドライブのファイル数の増減"
|
||||
drive-files-total: "ドライブのファイル数の累計"
|
||||
network-requests: "リクエスト"
|
||||
network-time: "応答時間"
|
||||
network-usage: "通信量"
|
||||
desktop/views/components/choose-file-from-drive-window.vue:
|
||||
choose-file: "ファイル選択中"
|
||||
upload: "PCからドライブにファイルをアップロード"
|
||||
|
@ -117,6 +117,8 @@ common:
|
||||
verified-user: "公式アカウント"
|
||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||
always-show-nsfw: "常に閲覧注意のメディアを表示する"
|
||||
always-mark-nsfw: "常にメディアを閲覧注意として投稿"
|
||||
show-full-acct: "ユーザー名のホストを省略しない"
|
||||
this-setting-is-this-device-only: "このデバイスのみ"
|
||||
|
||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||
@ -516,6 +518,7 @@ desktop/views/components/charts.vue:
|
||||
notes: "投稿"
|
||||
users: "ユーザー"
|
||||
drive: "ドライブ"
|
||||
network: "ネットワーク"
|
||||
charts:
|
||||
notes: "投稿の増減 (統合)"
|
||||
local-notes: "投稿の増減 (ローカル)"
|
||||
@ -527,6 +530,9 @@ desktop/views/components/charts.vue:
|
||||
drive-total: "ドライブ使用量の累計"
|
||||
drive-files: "ドライブのファイル数の増減"
|
||||
drive-files-total: "ドライブのファイル数の累計"
|
||||
network-requests: "リクエスト"
|
||||
network-time: "応答時間"
|
||||
network-usage: "通信量"
|
||||
|
||||
desktop/views/components/choose-file-from-drive-window.vue:
|
||||
choose-file: "ファイル選択中"
|
||||
|
@ -109,6 +109,10 @@ common:
|
||||
use-contrast-reversi-stones: "リバーシのアイコンにコントラストをつけんで!"
|
||||
verified-user: "アメちゃん付きアカウント"
|
||||
disable-animated-mfm: "投稿内のちょろちょろ動いてんのを止める"
|
||||
always-show-nsfw: "常に閲覧注意のメディアを表示する"
|
||||
always-mark-nsfw: "常にメディアを閲覧注意として投稿"
|
||||
show-full-acct: "ユーザー名のホストを省略しない"
|
||||
this-setting-is-this-device-only: "このデバイスのみ"
|
||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||
reversi:
|
||||
drawn: "おあいこ"
|
||||
@ -461,6 +465,7 @@ desktop/views/components/charts.vue:
|
||||
notes: "投稿"
|
||||
users: "ユーザー"
|
||||
drive: "ドライブ"
|
||||
network: "ネットワーク"
|
||||
charts:
|
||||
notes: "投稿の増減 (統合)"
|
||||
local-notes: "投稿の増減 (ローカル)"
|
||||
@ -472,6 +477,9 @@ desktop/views/components/charts.vue:
|
||||
drive-total: "ドライブ使用量の累計"
|
||||
drive-files: "ドライブのファイル数の増減"
|
||||
drive-files-total: "ドライブのファイル数の累計"
|
||||
network-requests: "リクエスト"
|
||||
network-time: "応答時間"
|
||||
network-usage: "通信量"
|
||||
desktop/views/components/choose-file-from-drive-window.vue:
|
||||
choose-file: "ファイル選択中"
|
||||
upload: "PCからドライブにファイルをアップロード"
|
||||
|
@ -109,6 +109,10 @@ common:
|
||||
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
||||
verified-user: "公式アカウント"
|
||||
disable-animated-mfm: "게시물의 문자 애니메이션을 비활성화 할"
|
||||
always-show-nsfw: "常に閲覧注意のメディアを表示する"
|
||||
always-mark-nsfw: "常にメディアを閲覧注意として投稿"
|
||||
show-full-acct: "ユーザー名のホストを省略しない"
|
||||
this-setting-is-this-device-only: "このデバイスのみ"
|
||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||
reversi:
|
||||
drawn: "무승부"
|
||||
@ -461,6 +465,7 @@ desktop/views/components/charts.vue:
|
||||
notes: "投稿"
|
||||
users: "ユーザー"
|
||||
drive: "ドライブ"
|
||||
network: "ネットワーク"
|
||||
charts:
|
||||
notes: "投稿の増減 (統合)"
|
||||
local-notes: "投稿の増減 (ローカル)"
|
||||
@ -472,6 +477,9 @@ desktop/views/components/charts.vue:
|
||||
drive-total: "ドライブ使用量の累計"
|
||||
drive-files: "ドライブのファイル数の増減"
|
||||
drive-files-total: "ドライブのファイル数の累計"
|
||||
network-requests: "リクエスト"
|
||||
network-time: "応答時間"
|
||||
network-usage: "通信量"
|
||||
desktop/views/components/choose-file-from-drive-window.vue:
|
||||
choose-file: "ファイル選択中"
|
||||
upload: "PCからドライブにファイルをアップロード"
|
||||
|
@ -109,6 +109,10 @@ common:
|
||||
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
||||
verified-user: "公式アカウント"
|
||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||
always-show-nsfw: "常に閲覧注意のメディアを表示する"
|
||||
always-mark-nsfw: "常にメディアを閲覧注意として投稿"
|
||||
show-full-acct: "ユーザー名のホストを省略しない"
|
||||
this-setting-is-this-device-only: "このデバイスのみ"
|
||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||
reversi:
|
||||
drawn: "引き分け"
|
||||
@ -461,6 +465,7 @@ desktop/views/components/charts.vue:
|
||||
notes: "投稿"
|
||||
users: "ユーザー"
|
||||
drive: "ドライブ"
|
||||
network: "ネットワーク"
|
||||
charts:
|
||||
notes: "投稿の増減 (統合)"
|
||||
local-notes: "投稿の増減 (ローカル)"
|
||||
@ -472,6 +477,9 @@ desktop/views/components/charts.vue:
|
||||
drive-total: "ドライブ使用量の累計"
|
||||
drive-files: "ドライブのファイル数の増減"
|
||||
drive-files-total: "ドライブのファイル数の累計"
|
||||
network-requests: "リクエスト"
|
||||
network-time: "応答時間"
|
||||
network-usage: "通信量"
|
||||
desktop/views/components/choose-file-from-drive-window.vue:
|
||||
choose-file: "Bestanden kiezen"
|
||||
upload: "Bestanden uploaden van je computer"
|
||||
|
@ -109,6 +109,10 @@ common:
|
||||
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
||||
verified-user: "公式アカウント"
|
||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||
always-show-nsfw: "常に閲覧注意のメディアを表示する"
|
||||
always-mark-nsfw: "常にメディアを閲覧注意として投稿"
|
||||
show-full-acct: "ユーザー名のホストを省略しない"
|
||||
this-setting-is-this-device-only: "このデバイスのみ"
|
||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||
reversi:
|
||||
drawn: "引き分け"
|
||||
@ -461,6 +465,7 @@ desktop/views/components/charts.vue:
|
||||
notes: "投稿"
|
||||
users: "ユーザー"
|
||||
drive: "ドライブ"
|
||||
network: "ネットワーク"
|
||||
charts:
|
||||
notes: "投稿の増減 (統合)"
|
||||
local-notes: "投稿の増減 (ローカル)"
|
||||
@ -472,6 +477,9 @@ desktop/views/components/charts.vue:
|
||||
drive-total: "ドライブ使用量の累計"
|
||||
drive-files: "ドライブのファイル数の増減"
|
||||
drive-files-total: "ドライブのファイル数の累計"
|
||||
network-requests: "リクエスト"
|
||||
network-time: "応答時間"
|
||||
network-usage: "通信量"
|
||||
desktop/views/components/choose-file-from-drive-window.vue:
|
||||
choose-file: "ファイル選択中"
|
||||
upload: "PCからドライブにファイルをアップロード"
|
||||
|
@ -109,6 +109,10 @@ common:
|
||||
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
||||
verified-user: "公式アカウント"
|
||||
disable-animated-mfm: "Wyłącz animowany tekst we wpisach"
|
||||
always-show-nsfw: "常に閲覧注意のメディアを表示する"
|
||||
always-mark-nsfw: "常にメディアを閲覧注意として投稿"
|
||||
show-full-acct: "ユーザー名のホストを省略しない"
|
||||
this-setting-is-this-device-only: "このデバイスのみ"
|
||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||
reversi:
|
||||
drawn: "Remis"
|
||||
@ -461,6 +465,7 @@ desktop/views/components/charts.vue:
|
||||
notes: "投稿"
|
||||
users: "ユーザー"
|
||||
drive: "ドライブ"
|
||||
network: "ネットワーク"
|
||||
charts:
|
||||
notes: "投稿の増減 (統合)"
|
||||
local-notes: "投稿の増減 (ローカル)"
|
||||
@ -472,6 +477,9 @@ desktop/views/components/charts.vue:
|
||||
drive-total: "ドライブ使用量の累計"
|
||||
drive-files: "ドライブのファイル数の増減"
|
||||
drive-files-total: "ドライブのファイル数の累計"
|
||||
network-requests: "リクエスト"
|
||||
network-time: "応答時間"
|
||||
network-usage: "通信量"
|
||||
desktop/views/components/choose-file-from-drive-window.vue:
|
||||
choose-file: "Wybierz plik"
|
||||
upload: "Wyślij pliki z Twojego komputera"
|
||||
|
@ -109,6 +109,10 @@ common:
|
||||
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
||||
verified-user: "Conta verificada"
|
||||
disable-animated-mfm: "Desativar texto animado nas publicações"
|
||||
always-show-nsfw: "常に閲覧注意のメディアを表示する"
|
||||
always-mark-nsfw: "常にメディアを閲覧注意として投稿"
|
||||
show-full-acct: "ユーザー名のホストを省略しない"
|
||||
this-setting-is-this-device-only: "このデバイスのみ"
|
||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||
reversi:
|
||||
drawn: "Empatado"
|
||||
@ -461,6 +465,7 @@ desktop/views/components/charts.vue:
|
||||
notes: "投稿"
|
||||
users: "ユーザー"
|
||||
drive: "ドライブ"
|
||||
network: "ネットワーク"
|
||||
charts:
|
||||
notes: "投稿の増減 (統合)"
|
||||
local-notes: "投稿の増減 (ローカル)"
|
||||
@ -472,6 +477,9 @@ desktop/views/components/charts.vue:
|
||||
drive-total: "ドライブ使用量の累計"
|
||||
drive-files: "ドライブのファイル数の増減"
|
||||
drive-files-total: "ドライブのファイル数の累計"
|
||||
network-requests: "リクエスト"
|
||||
network-time: "応答時間"
|
||||
network-usage: "通信量"
|
||||
desktop/views/components/choose-file-from-drive-window.vue:
|
||||
choose-file: "ファイル選択中"
|
||||
upload: "PCからドライブにファイルをアップロード"
|
||||
|
@ -109,6 +109,10 @@ common:
|
||||
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
||||
verified-user: "公式アカウント"
|
||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||
always-show-nsfw: "常に閲覧注意のメディアを表示する"
|
||||
always-mark-nsfw: "常にメディアを閲覧注意として投稿"
|
||||
show-full-acct: "ユーザー名のホストを省略しない"
|
||||
this-setting-is-this-device-only: "このデバイスのみ"
|
||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||
reversi:
|
||||
drawn: "引き分け"
|
||||
@ -461,6 +465,7 @@ desktop/views/components/charts.vue:
|
||||
notes: "投稿"
|
||||
users: "ユーザー"
|
||||
drive: "ドライブ"
|
||||
network: "ネットワーク"
|
||||
charts:
|
||||
notes: "投稿の増減 (統合)"
|
||||
local-notes: "投稿の増減 (ローカル)"
|
||||
@ -472,6 +477,9 @@ desktop/views/components/charts.vue:
|
||||
drive-total: "ドライブ使用量の累計"
|
||||
drive-files: "ドライブのファイル数の増減"
|
||||
drive-files-total: "ドライブのファイル数の累計"
|
||||
network-requests: "リクエスト"
|
||||
network-time: "応答時間"
|
||||
network-usage: "通信量"
|
||||
desktop/views/components/choose-file-from-drive-window.vue:
|
||||
choose-file: "ファイル選択中"
|
||||
upload: "PCからドライブにファイルをアップロード"
|
||||
|
@ -109,6 +109,10 @@ common:
|
||||
use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける"
|
||||
verified-user: "公式アカウント"
|
||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||
always-show-nsfw: "常に閲覧注意のメディアを表示する"
|
||||
always-mark-nsfw: "常にメディアを閲覧注意として投稿"
|
||||
show-full-acct: "ユーザー名のホストを省略しない"
|
||||
this-setting-is-this-device-only: "このデバイスのみ"
|
||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||
reversi:
|
||||
drawn: "引き分け"
|
||||
@ -461,6 +465,7 @@ desktop/views/components/charts.vue:
|
||||
notes: "投稿"
|
||||
users: "ユーザー"
|
||||
drive: "ドライブ"
|
||||
network: "ネットワーク"
|
||||
charts:
|
||||
notes: "投稿の増減 (統合)"
|
||||
local-notes: "投稿の増減 (ローカル)"
|
||||
@ -472,6 +477,9 @@ desktop/views/components/charts.vue:
|
||||
drive-total: "ドライブ使用量の累計"
|
||||
drive-files: "ドライブのファイル数の増減"
|
||||
drive-files-total: "ドライブのファイル数の累計"
|
||||
network-requests: "リクエスト"
|
||||
network-time: "応答時間"
|
||||
network-usage: "通信量"
|
||||
desktop/views/components/choose-file-from-drive-window.vue:
|
||||
choose-file: "ファイル選択中"
|
||||
upload: "PCからドライブにファイルをアップロード"
|
||||
|
@ -1,8 +1,8 @@
|
||||
{
|
||||
"name": "misskey",
|
||||
"author": "syuilo <i@syuilo.com>",
|
||||
"version": "8.38.0",
|
||||
"clientVersion": "1.0.9647",
|
||||
"version": "8.40.0",
|
||||
"clientVersion": "1.0.9711",
|
||||
"codename": "nighthike",
|
||||
"main": "./built/index.js",
|
||||
"private": true,
|
||||
@ -179,6 +179,7 @@
|
||||
"redis": "2.8.0",
|
||||
"request": "2.88.0",
|
||||
"request-promise-native": "1.0.5",
|
||||
"request-stats": "3.0.0",
|
||||
"rimraf": "2.6.2",
|
||||
"rndstr": "1.0.0",
|
||||
"s-age": "1.1.2",
|
||||
|
@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<span class="mk-acct">
|
||||
<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>
|
||||
</template>
|
||||
|
||||
|
@ -19,6 +19,11 @@
|
||||
<option value="drive">%i18n:@charts.drive%</option>
|
||||
<option value="drive-total">%i18n:@charts.drive-total%</option>
|
||||
</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>
|
||||
<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>
|
||||
@ -41,7 +46,10 @@ const colors = {
|
||||
localPlus: 'rgb(52, 178, 118)',
|
||||
remotePlus: 'rgb(158, 255, 209)',
|
||||
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 => {
|
||||
@ -75,6 +83,9 @@ export default Vue.extend({
|
||||
case 'drive-total': return this.driveTotalChart();
|
||||
case 'drive-files': return this.driveFilesChart();
|
||||
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>
|
||||
|
@ -30,6 +30,7 @@
|
||||
<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.isCat" @change="onChangeIsCat" text="%i18n:@is-cat%"/>
|
||||
<mk-switch v-model="alwaysMarkNsfw" text="%i18n:common.always-mark-nsfw%"/>
|
||||
</section>
|
||||
</div>
|
||||
</template>
|
||||
@ -46,6 +47,12 @@ export default Vue.extend({
|
||||
birthday: null,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
alwaysMarkNsfw: {
|
||||
get() { return this.$store.state.i.settings.alwaysMarkNsfw; },
|
||||
set(value) { (this as any).api('i/update', { alwaysMarkNsfw: value }); }
|
||||
},
|
||||
},
|
||||
created() {
|
||||
this.name = this.$store.state.i.name || '';
|
||||
this.location = this.$store.state.i.profile.location;
|
||||
|
@ -61,6 +61,7 @@
|
||||
<mk-switch v-model="darkmode" text="%i18n:@dark-mode%"/>
|
||||
<mk-switch v-model="circleIcons" text="%i18n:@circle-icons%"/>
|
||||
<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="iLikeSushi" text="%i18n:common.i-like-sushi%"/>
|
||||
</div>
|
||||
@ -366,6 +367,11 @@ export default Vue.extend({
|
||||
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: {
|
||||
get() { return this.$store.state.settings.iLikeSushi; },
|
||||
set(value) { this.$store.dispatch('settings/set', { key: 'iLikeSushi', value }); }
|
||||
|
@ -14,6 +14,7 @@
|
||||
<ui-switch v-model="darkmode">%i18n:@dark-mode%</ui-switch>
|
||||
<ui-switch v-model="circleIcons">%i18n:@circle-icons%</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="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>
|
||||
@ -232,6 +233,11 @@ export default Vue.extend({
|
||||
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: {
|
||||
get() { return this.$store.state.settings.iLikeSushi; },
|
||||
set(value) { this.$store.dispatch('settings/set', { key: 'iLikeSushi', value }); }
|
||||
|
@ -49,6 +49,7 @@
|
||||
|
||||
<div>
|
||||
<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>
|
||||
</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() {
|
||||
this.name = this.$store.state.i.name || '';
|
||||
this.username = this.$store.state.i.username;
|
||||
|
@ -17,6 +17,7 @@ const defaultSettings = {
|
||||
showClockOnHeader: true,
|
||||
circleIcons: true,
|
||||
contrastedAcct: true,
|
||||
showFullAcct: false,
|
||||
gradientWindowHeader: false,
|
||||
showReplyTarget: true,
|
||||
showMyRenotes: true,
|
||||
|
@ -204,4 +204,30 @@ export interface IStats {
|
||||
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;
|
||||
twoFactorTempSecret?: string;
|
||||
clientSettings: any;
|
||||
settings: any;
|
||||
settings: {
|
||||
autoWatch: boolean;
|
||||
alwaysMarkNsfw?: boolean;
|
||||
};
|
||||
hasUnreadNotification: boolean;
|
||||
hasUnreadMessagingMessage: boolean;
|
||||
}
|
||||
|
@ -3,7 +3,7 @@ import Meta from '../../../../models/meta';
|
||||
|
||||
export default () => new Promise(async (res, rej) => {
|
||||
const meta = await Meta.findOne({});
|
||||
const hidedTags = (meta.hidedTags || []).map(t => t.toLowerCase());
|
||||
const hidedTags = meta ? (meta.hidedTags || []).map(t => t.toLowerCase()) : [];
|
||||
|
||||
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[]) {
|
||||
stats.forEach(stat => {
|
||||
if (stat.network == null) {
|
||||
stat.network = {
|
||||
requests: 0,
|
||||
totalTime: 0,
|
||||
incomingBytes: 0,
|
||||
outgoingBytes: 0
|
||||
};
|
||||
}
|
||||
|
||||
const isOldData =
|
||||
stat.users.local.inc == null ||
|
||||
stat.users.local.dec == null ||
|
||||
@ -180,6 +189,12 @@ export default (params: any) => new Promise(async (res, rej) => {
|
||||
decCount: 0,
|
||||
decSize: 0
|
||||
}
|
||||
},
|
||||
network: {
|
||||
requests: 0,
|
||||
totalTime: 0,
|
||||
incomingBytes: 0,
|
||||
outgoingBytes: 0
|
||||
}
|
||||
});
|
||||
} else {
|
||||
@ -236,6 +251,12 @@ export default (params: any) => new Promise(async (res, rej) => {
|
||||
decCount: 0,
|
||||
decSize: 0
|
||||
}
|
||||
},
|
||||
network: {
|
||||
requests: 0,
|
||||
totalTime: 0,
|
||||
incomingBytes: 0,
|
||||
outgoingBytes: 0
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -31,8 +31,8 @@ export const meta = {
|
||||
}
|
||||
}),
|
||||
|
||||
isSensitive: $.bool.optional.note({
|
||||
default: false,
|
||||
isSensitive: $.bool.optional.nullable.note({
|
||||
default: null,
|
||||
desc: {
|
||||
'ja-JP': 'このメディアが「閲覧注意」(NSFW)かどうか',
|
||||
'en-US': 'Whether this media is NSFW'
|
||||
|
@ -19,7 +19,7 @@ const max = 5;
|
||||
*/
|
||||
export default () => new Promise(async (res, rej) => {
|
||||
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の内に投稿されたハッシュタグ(とユーザーのペア)を集計
|
||||
const data = await Note.aggregate([{
|
||||
|
@ -84,6 +84,12 @@ export const meta = {
|
||||
'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.isCat == 'boolean') updates.isCat = ps.isCat;
|
||||
if (typeof ps.autoWatch == 'boolean') updates['settings.autoWatch'] = ps.autoWatch;
|
||||
if (typeof ps.alwaysMarkNsfw == 'boolean') updates['settings.alwaysMarkNsfw'] = ps.alwaysMarkNsfw;
|
||||
|
||||
if (ps.avatarId) {
|
||||
const avatar = await DriveFile.findOne({
|
||||
|
@ -11,11 +11,13 @@ import * as Router from 'koa-router';
|
||||
import * as mount from 'koa-mount';
|
||||
import * as compress from 'koa-compress';
|
||||
import * as logger from 'koa-logger';
|
||||
const requestStats = require('request-stats');
|
||||
//const slow = require('koa-slow');
|
||||
|
||||
import activityPub from './activitypub';
|
||||
import webFinger from './webfinger';
|
||||
import config from '../config';
|
||||
import { updateNetworkStats } from '../services/update-chart';
|
||||
|
||||
// Init app
|
||||
const app = new Koa();
|
||||
@ -81,4 +83,27 @@ export default () => new Promise(resolve => {
|
||||
|
||||
// Listen
|
||||
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,
|
||||
url: string = null,
|
||||
uri: string = null,
|
||||
sensitive = false
|
||||
sensitive: boolean = null
|
||||
): Promise<IDriveFile> {
|
||||
// Calc md5 hash
|
||||
const calcHash = new Promise<string>((res, rej) => {
|
||||
@ -329,7 +329,13 @@ export default async function(
|
||||
properties: properties,
|
||||
withoutChunks: isLink,
|
||||
isRemote: isLink,
|
||||
isSensitive: sensitive
|
||||
isSensitive: (sensitive !== null && sensitive !== undefined)
|
||||
? sensitive
|
||||
: isLocalUser(user)
|
||||
? user.settings.alwaysMarkNsfw
|
||||
? true
|
||||
: false
|
||||
: false
|
||||
} as IMetadata;
|
||||
|
||||
if (url !== null) {
|
||||
|
@ -96,6 +96,12 @@ async function getCurrentStats(span: 'day' | 'hour'): Promise<IStats> {
|
||||
decCount: 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,
|
||||
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);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
Reference in New Issue
Block a user