Compare commits
286 Commits
Author | SHA1 | Date | |
---|---|---|---|
382b1d2250 | |||
629693355a | |||
00a3f8d392 | |||
80b6e8090e | |||
a5f817d896 | |||
51b0244cf2 | |||
01131e2606 | |||
6283b7668e | |||
d058ecc4ea | |||
77a0450b5d | |||
1dd1b9084f | |||
6341807d02 | |||
51a1f30225 | |||
5422482696 | |||
cd7f8b080e | |||
faf29b768f | |||
7576569dc9 | |||
ea3bcbbc37 | |||
d9f0e158a3 | |||
195f676500 | |||
a9a2f4820b | |||
8414db57f0 | |||
609d68933e | |||
a23b8cebbc | |||
89f6b03cd6 | |||
7bc9de03a6 | |||
3c865d6054 | |||
fd770b008e | |||
b0d60ef2c2 | |||
7b9cea06ef | |||
30608d3e22 | |||
8bf4e55338 | |||
6ead1de383 | |||
3b628ec3c4 | |||
0ed704d173 | |||
87b6ef0ec5 | |||
5184a07cf2 | |||
dba04cc59c | |||
f4045fb5b3 | |||
16c36163b4 | |||
1ac033ff18 | |||
ccfd48232a | |||
429bf179dc | |||
8ba3fb13eb | |||
11496d887e | |||
bec48319ec | |||
71a93b2b43 | |||
6ed3f9e414 | |||
dc8f592c1f | |||
f66c31c771 | |||
55e2ae1408 | |||
19c72627fc | |||
2a4c53c3a4 | |||
1f2ebce8ed | |||
fcea9dacb7 | |||
908872f374 | |||
f688ceafb8 | |||
b47b5d6d8b | |||
31ce3aa312 | |||
5b22d92e99 | |||
df148e25da | |||
4b26df5c3a | |||
e765be4205 | |||
f7d2457063 | |||
6032d803aa | |||
0de371db38 | |||
ce3797c4af | |||
56dd8c298b | |||
3533257efe | |||
dc2f08721d | |||
66608a4131 | |||
2fa90131eb | |||
a51ed28db6 | |||
5ec290663b | |||
1374d6e34d | |||
45ade17c58 | |||
c753e26187 | |||
577929eed1 | |||
1fde8a8fb0 | |||
77e53cbf9e | |||
ab83e08bc7 | |||
2fad6e6d5f | |||
a3604a6c95 | |||
44f6fe6f1f | |||
311b4e90ca | |||
f5a937c523 | |||
0632a3ed3f | |||
71bada97df | |||
62509edcbe | |||
f97cdfaa20 | |||
67ec10e86d | |||
481b3f2c58 | |||
7d599a68ea | |||
7ccff732b8 | |||
7587c896d5 | |||
91297f1ab3 | |||
d872a16fe0 | |||
60aa35adf8 | |||
5035b66773 | |||
fa9da8ecab | |||
1f9bca7188 | |||
ffa5bdeb50 | |||
e6bfb7398e | |||
6def0c776f | |||
24bae9eaed | |||
fb5175a283 | |||
6e49437154 | |||
2511ed56ac | |||
c4bfc99cf5 | |||
4efe38440d | |||
4a5f2c3c40 | |||
109738ccb9 | |||
433dbe179d | |||
b21b33831a | |||
020cc471da | |||
43b47c4494 | |||
8751d91794 | |||
374b276f5c | |||
6138a74231 | |||
25438c4d64 | |||
ae6ce19886 | |||
e17a9bfd6f | |||
dc2055f5bc | |||
afeb8058b1 | |||
9299f99ac3 | |||
858fc7ebcc | |||
35089c65d3 | |||
643ca42829 | |||
935dc4fe33 | |||
3a9e74feb1 | |||
92e66fbf0c | |||
a50515f569 | |||
2f8f47acea | |||
dcb296db93 | |||
0bdae9ede7 | |||
11290c2a0f | |||
428b8f8669 | |||
7ced10f84e | |||
8ac54139c9 | |||
32afe77a26 | |||
6db8e33662 | |||
569561f247 | |||
d132d82acf | |||
9ba0db9372 | |||
5d468b542d | |||
32273165c7 | |||
46fdb75bf4 | |||
baf381814b | |||
e90387c14e | |||
876790d499 | |||
8b56edda4b | |||
33352256d6 | |||
e368ef11fa | |||
045f7c3185 | |||
bf40e5a5c5 | |||
cda3635d97 | |||
2eb561f132 | |||
b5f6465d61 | |||
9725076c46 | |||
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 | |||
c87a43bdba | |||
fa6a7186e0 | |||
34a5adf951 | |||
4b3ece439e | |||
10dc97c43f | |||
4257fed500 | |||
299f83684b | |||
ebeaef94e2 | |||
2399ba05cd | |||
8bcfa97349 | |||
dd3e3ddcdd | |||
2555e23b10 | |||
1595683904 | |||
d8dcc4da27 |
@ -78,7 +78,7 @@ gulp.task('build:copy', ['build:copy:views', 'build:copy:lang'], () =>
|
|||||||
]).pipe(gulp.dest('./built/'))
|
]).pipe(gulp.dest('./built/'))
|
||||||
);
|
);
|
||||||
|
|
||||||
gulp.task('test', ['lint', 'mocha']);
|
gulp.task('test', ['mocha']);
|
||||||
|
|
||||||
gulp.task('lint', () =>
|
gulp.task('lint', () =>
|
||||||
gulp.src('./src/**/*.ts')
|
gulp.src('./src/**/*.ts')
|
||||||
|
@ -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: "ユーザー名のホストを省略しない"
|
||||||
|
reduce-motion: "UIの動きを減らす"
|
||||||
|
this-setting-is-this-device-only: "このデバイスのみ"
|
||||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "引き分け"
|
drawn: "引き分け"
|
||||||
@ -150,7 +155,10 @@ common:
|
|||||||
home: "ホーム"
|
home: "ホーム"
|
||||||
local: "ローカル"
|
local: "ローカル"
|
||||||
hybrid: "ソーシャル"
|
hybrid: "ソーシャル"
|
||||||
|
hashtag: "ハッシュタグ"
|
||||||
global: "グローバル"
|
global: "グローバル"
|
||||||
|
mentions: "あなた宛て"
|
||||||
|
direct: "ダイレクト投稿"
|
||||||
notifications: "通知"
|
notifications: "通知"
|
||||||
list: "リスト"
|
list: "リスト"
|
||||||
swap-left: "左に移動"
|
swap-left: "左に移動"
|
||||||
@ -253,6 +261,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 +472,7 @@ desktop/views/components/charts.vue:
|
|||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
|
network: "ネットワーク"
|
||||||
charts:
|
charts:
|
||||||
notes: "投稿の増減 (統合)"
|
notes: "投稿の増減 (統合)"
|
||||||
local-notes: "投稿の増減 (ローカル)"
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
@ -472,6 +484,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からドライブにファイルをアップロード"
|
||||||
@ -795,7 +810,13 @@ desktop/views/components/timeline.vue:
|
|||||||
local: "ローカル"
|
local: "ローカル"
|
||||||
hybrid: "ソーシャル"
|
hybrid: "ソーシャル"
|
||||||
global: "グローバル"
|
global: "グローバル"
|
||||||
|
mentions: "あなた宛て"
|
||||||
|
messages: "メッセージ"
|
||||||
list: "リスト"
|
list: "リスト"
|
||||||
|
hashtag: "ハッシュタグ"
|
||||||
|
add-tag-timeline: "ハッシュタグを追加"
|
||||||
|
add-list: "リストを追加"
|
||||||
|
list-name: "リスト名"
|
||||||
desktop/views/components/ui.header.vue:
|
desktop/views/components/ui.header.vue:
|
||||||
welcome-back: "おかえりなさい、"
|
welcome-back: "おかえりなさい、"
|
||||||
adjective: "さん"
|
adjective: "さん"
|
||||||
@ -1120,6 +1141,8 @@ mobile/views/pages/home.vue:
|
|||||||
local: "ローカル"
|
local: "ローカル"
|
||||||
hybrid: "ソーシャル"
|
hybrid: "ソーシャル"
|
||||||
global: "グローバル"
|
global: "グローバル"
|
||||||
|
mentions: "あなた宛て"
|
||||||
|
messages: "メッセージ"
|
||||||
mobile/views/pages/tag.vue:
|
mobile/views/pages/tag.vue:
|
||||||
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
|
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
|
||||||
mobile/views/pages/welcome.vue:
|
mobile/views/pages/welcome.vue:
|
||||||
|
@ -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: "ユーザー名のホストを省略しない"
|
||||||
|
reduce-motion: "UIの動きを減らす"
|
||||||
|
this-setting-is-this-device-only: "このデバイスのみ"
|
||||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "引き分け"
|
drawn: "引き分け"
|
||||||
@ -150,7 +155,10 @@ common:
|
|||||||
home: "Startseite"
|
home: "Startseite"
|
||||||
local: "Lokal"
|
local: "Lokal"
|
||||||
hybrid: "ソーシャル"
|
hybrid: "ソーシャル"
|
||||||
|
hashtag: "ハッシュタグ"
|
||||||
global: "Global"
|
global: "Global"
|
||||||
|
mentions: "あなた宛て"
|
||||||
|
direct: "ダイレクト投稿"
|
||||||
notifications: "Mitteilungen"
|
notifications: "Mitteilungen"
|
||||||
list: "Listen"
|
list: "Listen"
|
||||||
swap-left: "Nach links"
|
swap-left: "Nach links"
|
||||||
@ -253,6 +261,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 +472,7 @@ desktop/views/components/charts.vue:
|
|||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
|
network: "ネットワーク"
|
||||||
charts:
|
charts:
|
||||||
notes: "投稿の増減 (統合)"
|
notes: "投稿の増減 (統合)"
|
||||||
local-notes: "投稿の増減 (ローカル)"
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
@ -472,6 +484,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"
|
||||||
@ -795,7 +810,13 @@ desktop/views/components/timeline.vue:
|
|||||||
local: "Lokal"
|
local: "Lokal"
|
||||||
hybrid: "ソーシャル"
|
hybrid: "ソーシャル"
|
||||||
global: "Global"
|
global: "Global"
|
||||||
|
mentions: "あなた宛て"
|
||||||
|
messages: "メッセージ"
|
||||||
list: "Listen"
|
list: "Listen"
|
||||||
|
hashtag: "ハッシュタグ"
|
||||||
|
add-tag-timeline: "ハッシュタグを追加"
|
||||||
|
add-list: "リストを追加"
|
||||||
|
list-name: "リスト名"
|
||||||
desktop/views/components/ui.header.vue:
|
desktop/views/components/ui.header.vue:
|
||||||
welcome-back: "おかえりなさい、"
|
welcome-back: "おかえりなさい、"
|
||||||
adjective: "さん"
|
adjective: "さん"
|
||||||
@ -1120,6 +1141,8 @@ mobile/views/pages/home.vue:
|
|||||||
local: "ローカル"
|
local: "ローカル"
|
||||||
hybrid: "ソーシャル"
|
hybrid: "ソーシャル"
|
||||||
global: "グローバル"
|
global: "グローバル"
|
||||||
|
mentions: "あなた宛て"
|
||||||
|
messages: "メッセージ"
|
||||||
mobile/views/pages/tag.vue:
|
mobile/views/pages/tag.vue:
|
||||||
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
|
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
|
||||||
mobile/views/pages/welcome.vue:
|
mobile/views/pages/welcome.vue:
|
||||||
|
@ -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: "Always post with a warning about media attachment"
|
||||||
|
show-full-acct: "Do not omit the hostname from the username"
|
||||||
|
reduce-motion: "Reduce motion in UI"
|
||||||
|
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"
|
||||||
@ -150,7 +155,10 @@ common:
|
|||||||
home: "Home"
|
home: "Home"
|
||||||
local: "Local"
|
local: "Local"
|
||||||
hybrid: "Social"
|
hybrid: "Social"
|
||||||
|
hashtag: "Hashtag"
|
||||||
global: "Global"
|
global: "Global"
|
||||||
|
mentions: "Mentions"
|
||||||
|
direct: "ダイレクト投稿"
|
||||||
notifications: "Notifications"
|
notifications: "Notifications"
|
||||||
list: "Lists"
|
list: "Lists"
|
||||||
swap-left: "Move to the left"
|
swap-left: "Move to the left"
|
||||||
@ -253,6 +261,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 +472,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 +484,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 +793,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"
|
||||||
@ -795,7 +810,13 @@ desktop/views/components/timeline.vue:
|
|||||||
local: "Local"
|
local: "Local"
|
||||||
hybrid: "Social"
|
hybrid: "Social"
|
||||||
global: "Global"
|
global: "Global"
|
||||||
|
mentions: "Mentions"
|
||||||
|
messages: "Messages"
|
||||||
list: "Lists"
|
list: "Lists"
|
||||||
|
hashtag: "Hashtag"
|
||||||
|
add-tag-timeline: "Add hashtag tl"
|
||||||
|
add-list: "Add list"
|
||||||
|
list-name: "List name"
|
||||||
desktop/views/components/ui.header.vue:
|
desktop/views/components/ui.header.vue:
|
||||||
welcome-back: "Welcome back,"
|
welcome-back: "Welcome back,"
|
||||||
adjective: "-san"
|
adjective: "-san"
|
||||||
@ -1120,6 +1141,8 @@ mobile/views/pages/home.vue:
|
|||||||
local: "Local"
|
local: "Local"
|
||||||
hybrid: "Social"
|
hybrid: "Social"
|
||||||
global: "Global"
|
global: "Global"
|
||||||
|
mentions: "Mentions"
|
||||||
|
messages: "Messages"
|
||||||
mobile/views/pages/tag.vue:
|
mobile/views/pages/tag.vue:
|
||||||
no-posts-found: "No posts \"{}\" found."
|
no-posts-found: "No posts \"{}\" found."
|
||||||
mobile/views/pages/welcome.vue:
|
mobile/views/pages/welcome.vue:
|
||||||
@ -1160,7 +1183,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: "ユーザー名のホストを省略しない"
|
||||||
|
reduce-motion: "UIの動きを減らす"
|
||||||
|
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"
|
||||||
@ -150,7 +155,10 @@ common:
|
|||||||
home: "Inicio"
|
home: "Inicio"
|
||||||
local: "Local"
|
local: "Local"
|
||||||
hybrid: "Social"
|
hybrid: "Social"
|
||||||
|
hashtag: "ハッシュタグ"
|
||||||
global: "Global"
|
global: "Global"
|
||||||
|
mentions: "あなた宛て"
|
||||||
|
direct: "ダイレクト投稿"
|
||||||
notifications: "Notificaciones"
|
notifications: "Notificaciones"
|
||||||
list: "Listado"
|
list: "Listado"
|
||||||
swap-left: "Desplazar a la izq."
|
swap-left: "Desplazar a la izq."
|
||||||
@ -253,6 +261,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 +472,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 +484,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"
|
||||||
@ -795,7 +810,13 @@ desktop/views/components/timeline.vue:
|
|||||||
local: "ローカル"
|
local: "ローカル"
|
||||||
hybrid: "ソーシャル"
|
hybrid: "ソーシャル"
|
||||||
global: "グローバル"
|
global: "グローバル"
|
||||||
|
mentions: "あなた宛て"
|
||||||
|
messages: "メッセージ"
|
||||||
list: "リスト"
|
list: "リスト"
|
||||||
|
hashtag: "ハッシュタグ"
|
||||||
|
add-tag-timeline: "ハッシュタグを追加"
|
||||||
|
add-list: "リストを追加"
|
||||||
|
list-name: "リスト名"
|
||||||
desktop/views/components/ui.header.vue:
|
desktop/views/components/ui.header.vue:
|
||||||
welcome-back: "Bienvenido/a de vuelta,"
|
welcome-back: "Bienvenido/a de vuelta,"
|
||||||
adjective: "-san"
|
adjective: "-san"
|
||||||
@ -1120,6 +1141,8 @@ mobile/views/pages/home.vue:
|
|||||||
local: "ローカル"
|
local: "ローカル"
|
||||||
hybrid: "ソーシャル"
|
hybrid: "ソーシャル"
|
||||||
global: "グローバル"
|
global: "グローバル"
|
||||||
|
mentions: "あなた宛て"
|
||||||
|
messages: "メッセージ"
|
||||||
mobile/views/pages/tag.vue:
|
mobile/views/pages/tag.vue:
|
||||||
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
|
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
|
||||||
mobile/views/pages/welcome.vue:
|
mobile/views/pages/welcome.vue:
|
||||||
|
@ -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: "ユーザー名のホストを省略しない"
|
||||||
|
reduce-motion: "Réduire les animations dans l’interface utilisateur"
|
||||||
|
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"
|
||||||
@ -150,7 +155,10 @@ common:
|
|||||||
home: "Accueil"
|
home: "Accueil"
|
||||||
local: "Local"
|
local: "Local"
|
||||||
hybrid: "Social"
|
hybrid: "Social"
|
||||||
|
hashtag: "ハッシュタグ"
|
||||||
global: "Global"
|
global: "Global"
|
||||||
|
mentions: "Mentions"
|
||||||
|
direct: "ダイレクト投稿"
|
||||||
notifications: "Notifications"
|
notifications: "Notifications"
|
||||||
list: "Liste"
|
list: "Liste"
|
||||||
swap-left: "Déplacer à gauche"
|
swap-left: "Déplacer à gauche"
|
||||||
@ -253,9 +261,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: "Contenu sensible"
|
||||||
|
click-to-show: "Cliquer pour afficher"
|
||||||
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 +472,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 +484,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: "Traffic"
|
||||||
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 +680,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"
|
||||||
@ -778,7 +793,7 @@ desktop/views/components/settings.profile.vue:
|
|||||||
birthday: "Date de naissance"
|
birthday: "Date de naissance"
|
||||||
save: "Mettre à jour le profil"
|
save: "Mettre à jour le profil"
|
||||||
locked-account: "Protéger votre compte"
|
locked-account: "Protéger votre compte"
|
||||||
is-locked: "フォローを承認制にする"
|
is-locked: "Demande d’abonnement en attente d’approbation"
|
||||||
other: "Autre"
|
other: "Autre"
|
||||||
is-bot: "Ce compte est un Bot"
|
is-bot: "Ce compte est un Bot"
|
||||||
is-cat: "Ce compte est un Chat"
|
is-cat: "Ce compte est un Chat"
|
||||||
@ -795,7 +810,13 @@ desktop/views/components/timeline.vue:
|
|||||||
local: "Local"
|
local: "Local"
|
||||||
hybrid: "Social"
|
hybrid: "Social"
|
||||||
global: "Global"
|
global: "Global"
|
||||||
|
mentions: "Mentions"
|
||||||
|
messages: "メッセージ"
|
||||||
list: "Listes"
|
list: "Listes"
|
||||||
|
hashtag: "ハッシュタグ"
|
||||||
|
add-tag-timeline: "ハッシュタグを追加"
|
||||||
|
add-list: "リストを追加"
|
||||||
|
list-name: "リスト名"
|
||||||
desktop/views/components/ui.header.vue:
|
desktop/views/components/ui.header.vue:
|
||||||
welcome-back: "Content de vous revoir !"
|
welcome-back: "Content de vous revoir !"
|
||||||
adjective: "さん"
|
adjective: "さん"
|
||||||
@ -1120,6 +1141,8 @@ mobile/views/pages/home.vue:
|
|||||||
local: "Local"
|
local: "Local"
|
||||||
hybrid: "Social"
|
hybrid: "Social"
|
||||||
global: "Global"
|
global: "Global"
|
||||||
|
mentions: "Mentions"
|
||||||
|
messages: "メッセージ"
|
||||||
mobile/views/pages/tag.vue:
|
mobile/views/pages/tag.vue:
|
||||||
no-posts-found: "Pas de message avec un hashtag {} trouvé."
|
no-posts-found: "Pas de message avec un hashtag {} trouvé."
|
||||||
mobile/views/pages/welcome.vue:
|
mobile/views/pages/welcome.vue:
|
||||||
@ -1160,9 +1183,9 @@ mobile/views/pages/settings/settings.profile.vue:
|
|||||||
avatar: "Avatar"
|
avatar: "Avatar"
|
||||||
banner: "Bannière"
|
banner: "Bannière"
|
||||||
is-cat: "Ce compte est un Bot"
|
is-cat: "Ce compte est un Bot"
|
||||||
is-locked: "フォローを承認制にする"
|
is-locked: "Demande d’abonnement en attente d’approbation"
|
||||||
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 +1207,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: "ユーザー名のホストを省略しない"
|
||||||
|
reduce-motion: "UIの動きを減らす"
|
||||||
|
this-setting-is-this-device-only: "このデバイスのみ"
|
||||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "引き分け"
|
drawn: "引き分け"
|
||||||
@ -150,7 +155,10 @@ common:
|
|||||||
home: "ホーム"
|
home: "ホーム"
|
||||||
local: "ローカル"
|
local: "ローカル"
|
||||||
hybrid: "ソーシャル"
|
hybrid: "ソーシャル"
|
||||||
|
hashtag: "ハッシュタグ"
|
||||||
global: "グローバル"
|
global: "グローバル"
|
||||||
|
mentions: "あなた宛て"
|
||||||
|
direct: "ダイレクト投稿"
|
||||||
notifications: "通知"
|
notifications: "通知"
|
||||||
list: "リスト"
|
list: "リスト"
|
||||||
swap-left: "左に移動"
|
swap-left: "左に移動"
|
||||||
@ -253,6 +261,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 +472,7 @@ desktop/views/components/charts.vue:
|
|||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
|
network: "ネットワーク"
|
||||||
charts:
|
charts:
|
||||||
notes: "投稿の増減 (統合)"
|
notes: "投稿の増減 (統合)"
|
||||||
local-notes: "投稿の増減 (ローカル)"
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
@ -472,6 +484,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からドライブにファイルをアップロード"
|
||||||
@ -795,7 +810,13 @@ desktop/views/components/timeline.vue:
|
|||||||
local: "ローカル"
|
local: "ローカル"
|
||||||
hybrid: "ソーシャル"
|
hybrid: "ソーシャル"
|
||||||
global: "グローバル"
|
global: "グローバル"
|
||||||
|
mentions: "あなた宛て"
|
||||||
|
messages: "メッセージ"
|
||||||
list: "リスト"
|
list: "リスト"
|
||||||
|
hashtag: "ハッシュタグ"
|
||||||
|
add-tag-timeline: "ハッシュタグを追加"
|
||||||
|
add-list: "リストを追加"
|
||||||
|
list-name: "リスト名"
|
||||||
desktop/views/components/ui.header.vue:
|
desktop/views/components/ui.header.vue:
|
||||||
welcome-back: "おかえりなさい、"
|
welcome-back: "おかえりなさい、"
|
||||||
adjective: "さん"
|
adjective: "さん"
|
||||||
@ -1120,6 +1141,8 @@ mobile/views/pages/home.vue:
|
|||||||
local: "ローカル"
|
local: "ローカル"
|
||||||
hybrid: "ソーシャル"
|
hybrid: "ソーシャル"
|
||||||
global: "グローバル"
|
global: "グローバル"
|
||||||
|
mentions: "あなた宛て"
|
||||||
|
messages: "メッセージ"
|
||||||
mobile/views/pages/tag.vue:
|
mobile/views/pages/tag.vue:
|
||||||
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
|
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
|
||||||
mobile/views/pages/welcome.vue:
|
mobile/views/pages/welcome.vue:
|
||||||
|
@ -116,6 +116,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: "ユーザー名のホストを省略しない"
|
||||||
|
reduce-motion: "UIの動きを減らす"
|
||||||
|
this-setting-is-this-device-only: "このデバイスのみ"
|
||||||
|
|
||||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||||
|
|
||||||
@ -161,7 +166,10 @@ common:
|
|||||||
home: "ホーム"
|
home: "ホーム"
|
||||||
local: "ローカル"
|
local: "ローカル"
|
||||||
hybrid: "ソーシャル"
|
hybrid: "ソーシャル"
|
||||||
|
hashtag: "ハッシュタグ"
|
||||||
global: "グローバル"
|
global: "グローバル"
|
||||||
|
mentions: "あなた宛て"
|
||||||
|
direct: "ダイレクト投稿"
|
||||||
notifications: "通知"
|
notifications: "通知"
|
||||||
list: "リスト"
|
list: "リスト"
|
||||||
swap-left: "左に移動"
|
swap-left: "左に移動"
|
||||||
@ -273,6 +281,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: "もっと見る"
|
||||||
@ -514,6 +526,7 @@ desktop/views/components/charts.vue:
|
|||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
|
network: "ネットワーク"
|
||||||
charts:
|
charts:
|
||||||
notes: "投稿の増減 (統合)"
|
notes: "投稿の増減 (統合)"
|
||||||
local-notes: "投稿の増減 (ローカル)"
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
@ -525,6 +538,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: "ファイル選択中"
|
||||||
@ -900,7 +916,13 @@ desktop/views/components/timeline.vue:
|
|||||||
local: "ローカル"
|
local: "ローカル"
|
||||||
hybrid: "ソーシャル"
|
hybrid: "ソーシャル"
|
||||||
global: "グローバル"
|
global: "グローバル"
|
||||||
|
mentions: "あなた宛て"
|
||||||
|
messages: "メッセージ"
|
||||||
list: "リスト"
|
list: "リスト"
|
||||||
|
hashtag: "ハッシュタグ"
|
||||||
|
add-tag-timeline: "ハッシュタグを追加"
|
||||||
|
add-list: "リストを追加"
|
||||||
|
list-name: "リスト名"
|
||||||
|
|
||||||
desktop/views/components/ui.header.vue:
|
desktop/views/components/ui.header.vue:
|
||||||
welcome-back: "おかえりなさい、"
|
welcome-back: "おかえりなさい、"
|
||||||
@ -1301,6 +1323,8 @@ mobile/views/pages/home.vue:
|
|||||||
local: "ローカル"
|
local: "ローカル"
|
||||||
hybrid: "ソーシャル"
|
hybrid: "ソーシャル"
|
||||||
global: "グローバル"
|
global: "グローバル"
|
||||||
|
mentions: "あなた宛て"
|
||||||
|
messages: "メッセージ"
|
||||||
|
|
||||||
mobile/views/pages/tag.vue:
|
mobile/views/pages/tag.vue:
|
||||||
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
|
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
|
||||||
|
@ -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: "ユーザー名のホストを省略しない"
|
||||||
|
reduce-motion: "UIの動きを減らす"
|
||||||
|
this-setting-is-this-device-only: "このデバイスのみ"
|
||||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "おあいこ"
|
drawn: "おあいこ"
|
||||||
@ -150,7 +155,10 @@ common:
|
|||||||
home: "うち"
|
home: "うち"
|
||||||
local: "ローカル"
|
local: "ローカル"
|
||||||
hybrid: "ソーシャル"
|
hybrid: "ソーシャル"
|
||||||
|
hashtag: "ハッシュタグ"
|
||||||
global: "グローバル"
|
global: "グローバル"
|
||||||
|
mentions: "あなた宛て"
|
||||||
|
direct: "ダイレクト投稿"
|
||||||
notifications: "通知"
|
notifications: "通知"
|
||||||
list: "リスト"
|
list: "リスト"
|
||||||
swap-left: "左に移動や!"
|
swap-left: "左に移動や!"
|
||||||
@ -253,6 +261,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 +472,7 @@ desktop/views/components/charts.vue:
|
|||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
|
network: "ネットワーク"
|
||||||
charts:
|
charts:
|
||||||
notes: "投稿の増減 (統合)"
|
notes: "投稿の増減 (統合)"
|
||||||
local-notes: "投稿の増減 (ローカル)"
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
@ -472,6 +484,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からドライブにファイルをアップロード"
|
||||||
@ -795,7 +810,13 @@ desktop/views/components/timeline.vue:
|
|||||||
local: "ローカル"
|
local: "ローカル"
|
||||||
hybrid: "ソーシャル"
|
hybrid: "ソーシャル"
|
||||||
global: "グローバル"
|
global: "グローバル"
|
||||||
|
mentions: "あなた宛て"
|
||||||
|
messages: "メッセージ"
|
||||||
list: "リスト"
|
list: "リスト"
|
||||||
|
hashtag: "ハッシュタグ"
|
||||||
|
add-tag-timeline: "ハッシュタグを追加"
|
||||||
|
add-list: "リストを追加"
|
||||||
|
list-name: "リスト名"
|
||||||
desktop/views/components/ui.header.vue:
|
desktop/views/components/ui.header.vue:
|
||||||
welcome-back: "おかえり、"
|
welcome-back: "おかえり、"
|
||||||
adjective: "さん"
|
adjective: "さん"
|
||||||
@ -1120,6 +1141,8 @@ mobile/views/pages/home.vue:
|
|||||||
local: "ローカル"
|
local: "ローカル"
|
||||||
hybrid: "ソーシャル"
|
hybrid: "ソーシャル"
|
||||||
global: "グローバル"
|
global: "グローバル"
|
||||||
|
mentions: "あなた宛て"
|
||||||
|
messages: "メッセージ"
|
||||||
mobile/views/pages/tag.vue:
|
mobile/views/pages/tag.vue:
|
||||||
no-posts-found: "ハッシュタグ「{}」が付けられた投稿はあらへんで。"
|
no-posts-found: "ハッシュタグ「{}」が付けられた投稿はあらへんで。"
|
||||||
mobile/views/pages/welcome.vue:
|
mobile/views/pages/welcome.vue:
|
||||||
|
@ -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: "ユーザー名のホストを省略しない"
|
||||||
|
reduce-motion: "UIの動きを減らす"
|
||||||
|
this-setting-is-this-device-only: "このデバイスのみ"
|
||||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "무승부"
|
drawn: "무승부"
|
||||||
@ -150,7 +155,10 @@ common:
|
|||||||
home: "홈"
|
home: "홈"
|
||||||
local: "로컬"
|
local: "로컬"
|
||||||
hybrid: "소셜"
|
hybrid: "소셜"
|
||||||
|
hashtag: "ハッシュタグ"
|
||||||
global: "글로벌"
|
global: "글로벌"
|
||||||
|
mentions: "あなた宛て"
|
||||||
|
direct: "ダイレクト投稿"
|
||||||
notifications: "통지"
|
notifications: "통지"
|
||||||
list: "목록"
|
list: "목록"
|
||||||
swap-left: "左に移動"
|
swap-left: "左に移動"
|
||||||
@ -253,6 +261,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 +472,7 @@ desktop/views/components/charts.vue:
|
|||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
|
network: "ネットワーク"
|
||||||
charts:
|
charts:
|
||||||
notes: "投稿の増減 (統合)"
|
notes: "投稿の増減 (統合)"
|
||||||
local-notes: "投稿の増減 (ローカル)"
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
@ -472,6 +484,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からドライブにファイルをアップロード"
|
||||||
@ -795,7 +810,13 @@ desktop/views/components/timeline.vue:
|
|||||||
local: "ローカル"
|
local: "ローカル"
|
||||||
hybrid: "ソーシャル"
|
hybrid: "ソーシャル"
|
||||||
global: "グローバル"
|
global: "グローバル"
|
||||||
|
mentions: "あなた宛て"
|
||||||
|
messages: "メッセージ"
|
||||||
list: "リスト"
|
list: "リスト"
|
||||||
|
hashtag: "ハッシュタグ"
|
||||||
|
add-tag-timeline: "ハッシュタグを追加"
|
||||||
|
add-list: "リストを追加"
|
||||||
|
list-name: "リスト名"
|
||||||
desktop/views/components/ui.header.vue:
|
desktop/views/components/ui.header.vue:
|
||||||
welcome-back: "おかえりなさい、"
|
welcome-back: "おかえりなさい、"
|
||||||
adjective: "さん"
|
adjective: "さん"
|
||||||
@ -1120,6 +1141,8 @@ mobile/views/pages/home.vue:
|
|||||||
local: "ローカル"
|
local: "ローカル"
|
||||||
hybrid: "ソーシャル"
|
hybrid: "ソーシャル"
|
||||||
global: "グローバル"
|
global: "グローバル"
|
||||||
|
mentions: "あなた宛て"
|
||||||
|
messages: "メッセージ"
|
||||||
mobile/views/pages/tag.vue:
|
mobile/views/pages/tag.vue:
|
||||||
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
|
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
|
||||||
mobile/views/pages/welcome.vue:
|
mobile/views/pages/welcome.vue:
|
||||||
|
@ -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: "ユーザー名のホストを省略しない"
|
||||||
|
reduce-motion: "UIの動きを減らす"
|
||||||
|
this-setting-is-this-device-only: "このデバイスのみ"
|
||||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "引き分け"
|
drawn: "引き分け"
|
||||||
@ -150,7 +155,10 @@ common:
|
|||||||
home: "ホーム"
|
home: "ホーム"
|
||||||
local: "ローカル"
|
local: "ローカル"
|
||||||
hybrid: "ソーシャル"
|
hybrid: "ソーシャル"
|
||||||
|
hashtag: "ハッシュタグ"
|
||||||
global: "グローバル"
|
global: "グローバル"
|
||||||
|
mentions: "あなた宛て"
|
||||||
|
direct: "ダイレクト投稿"
|
||||||
notifications: "通知"
|
notifications: "通知"
|
||||||
list: "リスト"
|
list: "リスト"
|
||||||
swap-left: "左に移動"
|
swap-left: "左に移動"
|
||||||
@ -253,6 +261,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 +472,7 @@ desktop/views/components/charts.vue:
|
|||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
|
network: "ネットワーク"
|
||||||
charts:
|
charts:
|
||||||
notes: "投稿の増減 (統合)"
|
notes: "投稿の増減 (統合)"
|
||||||
local-notes: "投稿の増減 (ローカル)"
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
@ -472,6 +484,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"
|
||||||
@ -795,7 +810,13 @@ desktop/views/components/timeline.vue:
|
|||||||
local: "Lokaal"
|
local: "Lokaal"
|
||||||
hybrid: "ソーシャル"
|
hybrid: "ソーシャル"
|
||||||
global: "Algemeen"
|
global: "Algemeen"
|
||||||
|
mentions: "あなた宛て"
|
||||||
|
messages: "メッセージ"
|
||||||
list: "Lijsten"
|
list: "Lijsten"
|
||||||
|
hashtag: "ハッシュタグ"
|
||||||
|
add-tag-timeline: "ハッシュタグを追加"
|
||||||
|
add-list: "リストを追加"
|
||||||
|
list-name: "リスト名"
|
||||||
desktop/views/components/ui.header.vue:
|
desktop/views/components/ui.header.vue:
|
||||||
welcome-back: "おかえりなさい、"
|
welcome-back: "おかえりなさい、"
|
||||||
adjective: "さん"
|
adjective: "さん"
|
||||||
@ -1120,6 +1141,8 @@ mobile/views/pages/home.vue:
|
|||||||
local: "ローカル"
|
local: "ローカル"
|
||||||
hybrid: "ソーシャル"
|
hybrid: "ソーシャル"
|
||||||
global: "グローバル"
|
global: "グローバル"
|
||||||
|
mentions: "あなた宛て"
|
||||||
|
messages: "メッセージ"
|
||||||
mobile/views/pages/tag.vue:
|
mobile/views/pages/tag.vue:
|
||||||
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
|
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
|
||||||
mobile/views/pages/welcome.vue:
|
mobile/views/pages/welcome.vue:
|
||||||
|
@ -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: "ユーザー名のホストを省略しない"
|
||||||
|
reduce-motion: "UIの動きを減らす"
|
||||||
|
this-setting-is-this-device-only: "このデバイスのみ"
|
||||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "引き分け"
|
drawn: "引き分け"
|
||||||
@ -150,7 +155,10 @@ common:
|
|||||||
home: "ホーム"
|
home: "ホーム"
|
||||||
local: "ローカル"
|
local: "ローカル"
|
||||||
hybrid: "ソーシャル"
|
hybrid: "ソーシャル"
|
||||||
|
hashtag: "ハッシュタグ"
|
||||||
global: "グローバル"
|
global: "グローバル"
|
||||||
|
mentions: "あなた宛て"
|
||||||
|
direct: "ダイレクト投稿"
|
||||||
notifications: "通知"
|
notifications: "通知"
|
||||||
list: "リスト"
|
list: "リスト"
|
||||||
swap-left: "左に移動"
|
swap-left: "左に移動"
|
||||||
@ -253,6 +261,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 +472,7 @@ desktop/views/components/charts.vue:
|
|||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
|
network: "ネットワーク"
|
||||||
charts:
|
charts:
|
||||||
notes: "投稿の増減 (統合)"
|
notes: "投稿の増減 (統合)"
|
||||||
local-notes: "投稿の増減 (ローカル)"
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
@ -472,6 +484,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からドライブにファイルをアップロード"
|
||||||
@ -795,7 +810,13 @@ desktop/views/components/timeline.vue:
|
|||||||
local: "ローカル"
|
local: "ローカル"
|
||||||
hybrid: "ソーシャル"
|
hybrid: "ソーシャル"
|
||||||
global: "グローバル"
|
global: "グローバル"
|
||||||
|
mentions: "あなた宛て"
|
||||||
|
messages: "メッセージ"
|
||||||
list: "リスト"
|
list: "リスト"
|
||||||
|
hashtag: "ハッシュタグ"
|
||||||
|
add-tag-timeline: "ハッシュタグを追加"
|
||||||
|
add-list: "リストを追加"
|
||||||
|
list-name: "リスト名"
|
||||||
desktop/views/components/ui.header.vue:
|
desktop/views/components/ui.header.vue:
|
||||||
welcome-back: "おかえりなさい、"
|
welcome-back: "おかえりなさい、"
|
||||||
adjective: "さん"
|
adjective: "さん"
|
||||||
@ -1120,6 +1141,8 @@ mobile/views/pages/home.vue:
|
|||||||
local: "ローカル"
|
local: "ローカル"
|
||||||
hybrid: "ソーシャル"
|
hybrid: "ソーシャル"
|
||||||
global: "グローバル"
|
global: "グローバル"
|
||||||
|
mentions: "あなた宛て"
|
||||||
|
messages: "メッセージ"
|
||||||
mobile/views/pages/tag.vue:
|
mobile/views/pages/tag.vue:
|
||||||
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
|
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
|
||||||
mobile/views/pages/welcome.vue:
|
mobile/views/pages/welcome.vue:
|
||||||
|
@ -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: "ユーザー名のホストを省略しない"
|
||||||
|
reduce-motion: "UIの動きを減らす"
|
||||||
|
this-setting-is-this-device-only: "このデバイスのみ"
|
||||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "Remis"
|
drawn: "Remis"
|
||||||
@ -150,7 +155,10 @@ common:
|
|||||||
home: "Strona główna"
|
home: "Strona główna"
|
||||||
local: "Lokalne"
|
local: "Lokalne"
|
||||||
hybrid: "Społeczność"
|
hybrid: "Społeczność"
|
||||||
|
hashtag: "ハッシュタグ"
|
||||||
global: "Globalne"
|
global: "Globalne"
|
||||||
|
mentions: "あなた宛て"
|
||||||
|
direct: "ダイレクト投稿"
|
||||||
notifications: "Powiadomienia"
|
notifications: "Powiadomienia"
|
||||||
list: "Listy"
|
list: "Listy"
|
||||||
swap-left: "Przesuń w lewo"
|
swap-left: "Przesuń w lewo"
|
||||||
@ -253,6 +261,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 +472,7 @@ desktop/views/components/charts.vue:
|
|||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
|
network: "ネットワーク"
|
||||||
charts:
|
charts:
|
||||||
notes: "投稿の増減 (統合)"
|
notes: "投稿の増減 (統合)"
|
||||||
local-notes: "投稿の増減 (ローカル)"
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
@ -472,6 +484,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"
|
||||||
@ -795,7 +810,13 @@ desktop/views/components/timeline.vue:
|
|||||||
local: "Lokalne"
|
local: "Lokalne"
|
||||||
hybrid: "Społeczność"
|
hybrid: "Społeczność"
|
||||||
global: "Globalne"
|
global: "Globalne"
|
||||||
|
mentions: "あなた宛て"
|
||||||
|
messages: "メッセージ"
|
||||||
list: "Listy"
|
list: "Listy"
|
||||||
|
hashtag: "ハッシュタグ"
|
||||||
|
add-tag-timeline: "ハッシュタグを追加"
|
||||||
|
add-list: "リストを追加"
|
||||||
|
list-name: "リスト名"
|
||||||
desktop/views/components/ui.header.vue:
|
desktop/views/components/ui.header.vue:
|
||||||
welcome-back: "Witaj ponownie,"
|
welcome-back: "Witaj ponownie,"
|
||||||
adjective: "さん"
|
adjective: "さん"
|
||||||
@ -1120,6 +1141,8 @@ mobile/views/pages/home.vue:
|
|||||||
local: "Lokalne"
|
local: "Lokalne"
|
||||||
hybrid: "Społeczność"
|
hybrid: "Społeczność"
|
||||||
global: "Globalne"
|
global: "Globalne"
|
||||||
|
mentions: "あなた宛て"
|
||||||
|
messages: "メッセージ"
|
||||||
mobile/views/pages/tag.vue:
|
mobile/views/pages/tag.vue:
|
||||||
no-posts-found: "Nie znaleziono wpisów zawierających „{}”."
|
no-posts-found: "Nie znaleziono wpisów zawierających „{}”."
|
||||||
mobile/views/pages/welcome.vue:
|
mobile/views/pages/welcome.vue:
|
||||||
|
@ -7,12 +7,12 @@ common:
|
|||||||
about-title: "Uma ⭐ do fediverso."
|
about-title: "Uma ⭐ do fediverso."
|
||||||
about: "Obrigado por encontrar Misskey. Uma <b>plataforma descentralizada de microblog</b> nascida na Terra. Já que ela existe no Fediverso (um universo onde várias plataformas de mídia social são organizadas), ela é ligada com outras plataformas.Por que você não tira uma folga do agito e confusão da cidade, e mergulha em uma nova internet?"
|
about: "Obrigado por encontrar Misskey. Uma <b>plataforma descentralizada de microblog</b> nascida na Terra. Já que ela existe no Fediverso (um universo onde várias plataformas de mídia social são organizadas), ela é ligada com outras plataformas.Por que você não tira uma folga do agito e confusão da cidade, e mergulha em uma nova internet?"
|
||||||
intro:
|
intro:
|
||||||
title: "Misskeyって?"
|
title: "O que é Misskey?"
|
||||||
about: "Misskeyはオープンソースの<b>分散型マイクロブログSNS</b>です。リッチで高度にカスタマイズできるUI、投稿へのリアクション、ファイルを一元管理できるドライブなど、先進的な機能を揃えています。また、Fediverseと呼ばれるネットワークに接続できるため、他のSNSともやり取りできます。例えば、あなたが何か投稿すると、その投稿はMisskeyだけでなく他のSNSにも伝わります。ちょうどある惑星から他の惑星に電波を発信している様子をイメージしてください。"
|
about: "Misskey é um <b>serviço de microblog descentralizado</b>. Personalização sofisticada da interface, variedade de reações a posts, armazenamento de arquivos grátis com gerenciamento integrado e outras funções avançadas estão disponíveis. Um sistema em rede chamado \"Fediverso\" permite que nos comuniquemos com usuários em outras redes sociais. Se você postar algo, por exemplo, seu post não será mandado apenas para o Misskey, mas também para o Mastodon. Apenas imagine que o planeta está enviando ondas de rádio para outros planetas para se comunicar."
|
||||||
features: "特徴"
|
features: "Recursos"
|
||||||
rich-contents: "投稿"
|
rich-contents: "Post"
|
||||||
rich-contents-desc: "自分の考え、話題の出来事、皆と共有したいことについて発信してください。必要であれば、様々な構文を使って投稿を装飾したり、好きな画像、動画などのファイルやアンケートを添付することもできます。"
|
rich-contents-desc: "Apenas poste suas ideias, temas do momento e qualquer coisa que você queira compartilhar. Você pode querer decorar suas palavras, anexar suas imagens favoritas, enviar arquivos, inclusive vídeos ou criar uma enquete. Essas são as coisas que você pode fazer em Misskey."
|
||||||
reaction: "リアクション"
|
reaction: "Reações"
|
||||||
reaction-desc: "あなたの気持ちを伝える最も簡単な方法です。Misskeyは、他のユーザーの投稿に様々なリアクションを付けることができます。いちどMisskeyのリアクション機能を体験してしまうと、もう「いいね」の概念しか存在しないSNSには戻れなくなるかもしれません。"
|
reaction-desc: "あなたの気持ちを伝える最も簡単な方法です。Misskeyは、他のユーザーの投稿に様々なリアクションを付けることができます。いちどMisskeyのリアクション機能を体験してしまうと、もう「いいね」の概念しか存在しないSNSには戻れなくなるかもしれません。"
|
||||||
ui: "インターフェース"
|
ui: "インターフェース"
|
||||||
ui-desc: "どのようなUIが使いやすいかは人それぞれです。だから、Misskeyは自由度の高いUIを持っています。レイアウトやデザインを調整したり、カスタマイズ可能な様々なウィジェットを配置したりして、自分だけのホームを作ってください。"
|
ui-desc: "どのようなUIが使いやすいかは人それぞれです。だから、Misskeyは自由度の高いUIを持っています。レイアウトやデザインを調整したり、カスタマイズ可能な様々なウィジェットを配置したりして、自分だけのホームを作ってください。"
|
||||||
@ -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: "ユーザー名のホストを省略しない"
|
||||||
|
reduce-motion: "UIの動きを減らす"
|
||||||
|
this-setting-is-this-device-only: "このデバイスのみ"
|
||||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "Empatado"
|
drawn: "Empatado"
|
||||||
@ -150,7 +155,10 @@ common:
|
|||||||
home: "Início"
|
home: "Início"
|
||||||
local: "Local"
|
local: "Local"
|
||||||
hybrid: "Social"
|
hybrid: "Social"
|
||||||
|
hashtag: "ハッシュタグ"
|
||||||
global: "Global"
|
global: "Global"
|
||||||
|
mentions: "あなた宛て"
|
||||||
|
direct: "ダイレクト投稿"
|
||||||
notifications: "Notificações"
|
notifications: "Notificações"
|
||||||
list: "Listas"
|
list: "Listas"
|
||||||
swap-left: "Mover para a esquerda"
|
swap-left: "Mover para a esquerda"
|
||||||
@ -253,6 +261,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 +472,7 @@ desktop/views/components/charts.vue:
|
|||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
|
network: "ネットワーク"
|
||||||
charts:
|
charts:
|
||||||
notes: "投稿の増減 (統合)"
|
notes: "投稿の増減 (統合)"
|
||||||
local-notes: "投稿の増減 (ローカル)"
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
@ -472,6 +484,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からドライブにファイルをアップロード"
|
||||||
@ -795,7 +810,13 @@ desktop/views/components/timeline.vue:
|
|||||||
local: "ローカル"
|
local: "ローカル"
|
||||||
hybrid: "ソーシャル"
|
hybrid: "ソーシャル"
|
||||||
global: "グローバル"
|
global: "グローバル"
|
||||||
|
mentions: "あなた宛て"
|
||||||
|
messages: "メッセージ"
|
||||||
list: "リスト"
|
list: "リスト"
|
||||||
|
hashtag: "ハッシュタグ"
|
||||||
|
add-tag-timeline: "ハッシュタグを追加"
|
||||||
|
add-list: "リストを追加"
|
||||||
|
list-name: "リスト名"
|
||||||
desktop/views/components/ui.header.vue:
|
desktop/views/components/ui.header.vue:
|
||||||
welcome-back: "おかえりなさい、"
|
welcome-back: "おかえりなさい、"
|
||||||
adjective: "さん"
|
adjective: "さん"
|
||||||
@ -1120,6 +1141,8 @@ mobile/views/pages/home.vue:
|
|||||||
local: "ローカル"
|
local: "ローカル"
|
||||||
hybrid: "ソーシャル"
|
hybrid: "ソーシャル"
|
||||||
global: "グローバル"
|
global: "グローバル"
|
||||||
|
mentions: "あなた宛て"
|
||||||
|
messages: "メッセージ"
|
||||||
mobile/views/pages/tag.vue:
|
mobile/views/pages/tag.vue:
|
||||||
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
|
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
|
||||||
mobile/views/pages/welcome.vue:
|
mobile/views/pages/welcome.vue:
|
||||||
@ -1152,23 +1175,23 @@ mobile/views/pages/games/reversi.vue:
|
|||||||
reversi: "リバーシ"
|
reversi: "リバーシ"
|
||||||
mobile/views/pages/settings/settings.profile.vue:
|
mobile/views/pages/settings/settings.profile.vue:
|
||||||
title: "プロフィール"
|
title: "プロフィール"
|
||||||
name: "名前"
|
name: "Nome"
|
||||||
account: "アカウント"
|
account: "Conta"
|
||||||
location: "場所"
|
location: "Lugar"
|
||||||
description: "自己紹介"
|
description: "Biografia"
|
||||||
birthday: "誕生日"
|
birthday: "Data de nascimento"
|
||||||
avatar: "アイコン"
|
avatar: "Avatar"
|
||||||
banner: "バナー"
|
banner: "Capa"
|
||||||
is-cat: "このアカウントはCatです"
|
is-cat: "Esta conta é gato"
|
||||||
is-locked: "フォローを承認制にする"
|
is-locked: "Pedido para seguir precisa ser aprovado"
|
||||||
advanced: "その他"
|
advanced: "Avançado"
|
||||||
privacy: "プライバシー"
|
privacy: "Provacidade"
|
||||||
save: "保存"
|
save: "Atualizar perfil"
|
||||||
saved: "プロフィールを保存しました"
|
saved: "Perfil atualizado"
|
||||||
uploading: "アップロード中"
|
uploading: "Enviando"
|
||||||
upload-failed: "アップロードに失敗しました"
|
upload-failed: "Falha ao enviar"
|
||||||
mobile/views/pages/search.vue:
|
mobile/views/pages/search.vue:
|
||||||
search: "検索"
|
search: "Pesquisar"
|
||||||
empty: "「{}」に関する投稿は見つかりませんでした。"
|
empty: "「{}」に関する投稿は見つかりませんでした。"
|
||||||
not-found: "「{}」に関する投稿は見つかりませんでした。"
|
not-found: "「{}」に関する投稿は見つかりませんでした。"
|
||||||
mobile/views/pages/selectdrive.vue:
|
mobile/views/pages/selectdrive.vue:
|
||||||
@ -1205,47 +1228,47 @@ mobile/views/pages/settings.vue:
|
|||||||
load-raw-images: "添付された画像を高画質で表示する"
|
load-raw-images: "添付された画像を高画質で表示する"
|
||||||
load-remote-media: "リモートサーバーのメディアを表示する"
|
load-remote-media: "リモートサーバーのメディアを表示する"
|
||||||
twitter: "Twitter連携"
|
twitter: "Twitter連携"
|
||||||
twitter-connect: "Twitterアカウントに接続する"
|
twitter-connect: "Conectar à sua conta no Twitter"
|
||||||
twitter-reconnect: "再接続する"
|
twitter-reconnect: "Reconectar"
|
||||||
twitter-disconnect: "切断する"
|
twitter-disconnect: "Desconectar"
|
||||||
update: "Misskey Update"
|
update: "Atualizar Misskey"
|
||||||
version: "バージョン:"
|
version: "Versão atual;"
|
||||||
latest-version: "最新のバージョン:"
|
latest-version: "Última versão:"
|
||||||
update-checking: "アップデートを確認中"
|
update-checking: "Verificando atualizações"
|
||||||
check-for-updates: "アップデートを確認"
|
check-for-updates: "Verificar atualizações"
|
||||||
no-updates: "利用可能な更新はありません"
|
no-updates: "Sem atualizações"
|
||||||
no-updates-desc: "お使いのMisskeyは最新です。"
|
no-updates-desc: "Seu Misskey está atualizado"
|
||||||
update-available: "新しいバージョンが利用可能です"
|
update-available: "Uma nova versão está disponível"
|
||||||
update-available-desc: "ページを再度読み込みすると更新が適用されます。"
|
update-available-desc: "Atualizações vão ser aplicadas depois de recarregar a página"
|
||||||
settings: "設定"
|
settings: "Configurações"
|
||||||
signout: "サインアウト"
|
signout: "Sair"
|
||||||
sound: "サウンド"
|
sound: "Sons"
|
||||||
enable-sounds: "サウンドを有効にする"
|
enable-sounds: "Ativar sons"
|
||||||
mobile/views/pages/user.vue:
|
mobile/views/pages/user.vue:
|
||||||
follows-you: "フォローされています"
|
follows-you: "Te segue"
|
||||||
following: "フォロー"
|
following: "Seguindo"
|
||||||
followers: "フォロワー"
|
followers: "Seguidores"
|
||||||
notes: "投稿"
|
notes: "Posts"
|
||||||
overview: "概要"
|
overview: "概要"
|
||||||
timeline: "タイムライン"
|
timeline: "Linha do tempo"
|
||||||
media: "メディア"
|
media: "Mídia"
|
||||||
is-suspended: "このユーザーは凍結されています。"
|
is-suspended: "Esta conta foi suspensa"
|
||||||
is-remote: "Este é uma usuário remoto. O perfil que vê aqui pode não estar completo."
|
is-remote: "Este é uma usuário remoto. O perfil que vê aqui pode não estar completo."
|
||||||
view-remote: "Ver o perfil completo."
|
view-remote: "Ver o perfil completo."
|
||||||
mobile/views/pages/user/home.vue:
|
mobile/views/pages/user/home.vue:
|
||||||
recent-notes: "Notas recentes"
|
recent-notes: "Notas recentes"
|
||||||
images: "Imagens"
|
images: "Imagens"
|
||||||
activity: "Atividade"
|
activity: "Atividade"
|
||||||
keywords: "キーワード"
|
keywords: "Palavras chave"
|
||||||
domains: "頻出ドメイン"
|
domains: "Domínios"
|
||||||
frequently-replied-users: "よく会話するユーザー"
|
frequently-replied-users: "Perguntas frequentes"
|
||||||
followers-you-know: "Seguidores que você conhece"
|
followers-you-know: "Seguidores que você conhece"
|
||||||
last-used-at: "Ativo pela última vez:"
|
last-used-at: "Ativo pela última vez:"
|
||||||
mobile/views/pages/user/home.followers-you-know.vue:
|
mobile/views/pages/user/home.followers-you-know.vue:
|
||||||
loading: "Carregando"
|
loading: "Carregando"
|
||||||
no-users: "知り合いのユーザーはいません"
|
no-users: "知り合いのユーザーはいません"
|
||||||
mobile/views/pages/user/home.friends.vue:
|
mobile/views/pages/user/home.friends.vue:
|
||||||
loading: "読み込み中"
|
loading: "Carregando"
|
||||||
no-users: "よく会話するユーザーはいません"
|
no-users: "よく会話するユーザーはいません"
|
||||||
mobile/views/pages/user/home.notes.vue:
|
mobile/views/pages/user/home.notes.vue:
|
||||||
loading: "Carregando"
|
loading: "Carregando"
|
||||||
@ -1255,14 +1278,14 @@ mobile/views/pages/user/home.photos.vue:
|
|||||||
no-photos: "Sem fotos"
|
no-photos: "Sem fotos"
|
||||||
docs:
|
docs:
|
||||||
edit-this-page-on-github: "間違いや改善点を見つけましたか?"
|
edit-this-page-on-github: "間違いや改善点を見つけましたか?"
|
||||||
edit-this-page-on-github-link: "このページをGitHubで編集"
|
edit-this-page-on-github-link: "Edite esta página no GitHub!"
|
||||||
api:
|
api:
|
||||||
entities:
|
entities:
|
||||||
properties: "プロパティ"
|
properties: "Propriedades"
|
||||||
endpoints:
|
endpoints:
|
||||||
params: "パラメータ"
|
params: "Parâmetros"
|
||||||
no-params: "パラメータはありません"
|
no-params: "Sem parâmetros"
|
||||||
res: "レスポンス"
|
res: "Resposta"
|
||||||
require-credential: "このエンドポイントは認証情報が必須です。"
|
require-credential: "このエンドポイントは認証情報が必須です。"
|
||||||
require-permission: "このエンドポイントは{permission}の権限を必要とします。"
|
require-permission: "このエンドポイントは{permission}の権限を必要とします。"
|
||||||
has-limit: "レートリミットがあります。"
|
has-limit: "レートリミットがあります。"
|
||||||
|
@ -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: "ユーザー名のホストを省略しない"
|
||||||
|
reduce-motion: "UIの動きを減らす"
|
||||||
|
this-setting-is-this-device-only: "このデバイスのみ"
|
||||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "引き分け"
|
drawn: "引き分け"
|
||||||
@ -150,7 +155,10 @@ common:
|
|||||||
home: "ホーム"
|
home: "ホーム"
|
||||||
local: "ローカル"
|
local: "ローカル"
|
||||||
hybrid: "ソーシャル"
|
hybrid: "ソーシャル"
|
||||||
|
hashtag: "ハッシュタグ"
|
||||||
global: "グローバル"
|
global: "グローバル"
|
||||||
|
mentions: "あなた宛て"
|
||||||
|
direct: "ダイレクト投稿"
|
||||||
notifications: "通知"
|
notifications: "通知"
|
||||||
list: "リスト"
|
list: "リスト"
|
||||||
swap-left: "左に移動"
|
swap-left: "左に移動"
|
||||||
@ -253,6 +261,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 +472,7 @@ desktop/views/components/charts.vue:
|
|||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
|
network: "ネットワーク"
|
||||||
charts:
|
charts:
|
||||||
notes: "投稿の増減 (統合)"
|
notes: "投稿の増減 (統合)"
|
||||||
local-notes: "投稿の増減 (ローカル)"
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
@ -472,6 +484,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からドライブにファイルをアップロード"
|
||||||
@ -795,7 +810,13 @@ desktop/views/components/timeline.vue:
|
|||||||
local: "ローカル"
|
local: "ローカル"
|
||||||
hybrid: "ソーシャル"
|
hybrid: "ソーシャル"
|
||||||
global: "グローバル"
|
global: "グローバル"
|
||||||
|
mentions: "あなた宛て"
|
||||||
|
messages: "メッセージ"
|
||||||
list: "リスト"
|
list: "リスト"
|
||||||
|
hashtag: "ハッシュタグ"
|
||||||
|
add-tag-timeline: "ハッシュタグを追加"
|
||||||
|
add-list: "リストを追加"
|
||||||
|
list-name: "リスト名"
|
||||||
desktop/views/components/ui.header.vue:
|
desktop/views/components/ui.header.vue:
|
||||||
welcome-back: "おかえりなさい、"
|
welcome-back: "おかえりなさい、"
|
||||||
adjective: "さん"
|
adjective: "さん"
|
||||||
@ -1120,6 +1141,8 @@ mobile/views/pages/home.vue:
|
|||||||
local: "ローカル"
|
local: "ローカル"
|
||||||
hybrid: "ソーシャル"
|
hybrid: "ソーシャル"
|
||||||
global: "グローバル"
|
global: "グローバル"
|
||||||
|
mentions: "あなた宛て"
|
||||||
|
messages: "メッセージ"
|
||||||
mobile/views/pages/tag.vue:
|
mobile/views/pages/tag.vue:
|
||||||
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
|
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
|
||||||
mobile/views/pages/welcome.vue:
|
mobile/views/pages/welcome.vue:
|
||||||
|
@ -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: "ユーザー名のホストを省略しない"
|
||||||
|
reduce-motion: "UIの動きを減らす"
|
||||||
|
this-setting-is-this-device-only: "このデバイスのみ"
|
||||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "引き分け"
|
drawn: "引き分け"
|
||||||
@ -150,7 +155,10 @@ common:
|
|||||||
home: "ホーム"
|
home: "ホーム"
|
||||||
local: "ローカル"
|
local: "ローカル"
|
||||||
hybrid: "ソーシャル"
|
hybrid: "ソーシャル"
|
||||||
|
hashtag: "ハッシュタグ"
|
||||||
global: "グローバル"
|
global: "グローバル"
|
||||||
|
mentions: "あなた宛て"
|
||||||
|
direct: "ダイレクト投稿"
|
||||||
notifications: "通知"
|
notifications: "通知"
|
||||||
list: "リスト"
|
list: "リスト"
|
||||||
swap-left: "左に移動"
|
swap-left: "左に移動"
|
||||||
@ -253,6 +261,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 +472,7 @@ desktop/views/components/charts.vue:
|
|||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
|
network: "ネットワーク"
|
||||||
charts:
|
charts:
|
||||||
notes: "投稿の増減 (統合)"
|
notes: "投稿の増減 (統合)"
|
||||||
local-notes: "投稿の増減 (ローカル)"
|
local-notes: "投稿の増減 (ローカル)"
|
||||||
@ -472,6 +484,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からドライブにファイルをアップロード"
|
||||||
@ -795,7 +810,13 @@ desktop/views/components/timeline.vue:
|
|||||||
local: "ローカル"
|
local: "ローカル"
|
||||||
hybrid: "ソーシャル"
|
hybrid: "ソーシャル"
|
||||||
global: "グローバル"
|
global: "グローバル"
|
||||||
|
mentions: "あなた宛て"
|
||||||
|
messages: "メッセージ"
|
||||||
list: "リスト"
|
list: "リスト"
|
||||||
|
hashtag: "ハッシュタグ"
|
||||||
|
add-tag-timeline: "ハッシュタグを追加"
|
||||||
|
add-list: "リストを追加"
|
||||||
|
list-name: "リスト名"
|
||||||
desktop/views/components/ui.header.vue:
|
desktop/views/components/ui.header.vue:
|
||||||
welcome-back: "おかえりなさい、"
|
welcome-back: "おかえりなさい、"
|
||||||
adjective: "さん"
|
adjective: "さん"
|
||||||
@ -1120,6 +1141,8 @@ mobile/views/pages/home.vue:
|
|||||||
local: "ローカル"
|
local: "ローカル"
|
||||||
hybrid: "ソーシャル"
|
hybrid: "ソーシャル"
|
||||||
global: "グローバル"
|
global: "グローバル"
|
||||||
|
mentions: "あなた宛て"
|
||||||
|
messages: "メッセージ"
|
||||||
mobile/views/pages/tag.vue:
|
mobile/views/pages/tag.vue:
|
||||||
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
|
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
|
||||||
mobile/views/pages/welcome.vue:
|
mobile/views/pages/welcome.vue:
|
||||||
|
33
package.json
33
package.json
@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"name": "misskey",
|
"name": "misskey",
|
||||||
"author": "syuilo <i@syuilo.com>",
|
"author": "syuilo <i@syuilo.com>",
|
||||||
"version": "8.37.0",
|
"version": "8.57.1",
|
||||||
"clientVersion": "1.0.9642",
|
"clientVersion": "1.0.9928",
|
||||||
"codename": "nighthike",
|
"codename": "nighthike",
|
||||||
"main": "./built/index.js",
|
"main": "./built/index.js",
|
||||||
"private": true,
|
"private": true,
|
||||||
@ -20,14 +20,14 @@
|
|||||||
"format": "gulp format"
|
"format": "gulp format"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@fortawesome/fontawesome": "1.1.8",
|
"@fortawesome/fontawesome-svg-core": "1.2.4",
|
||||||
"@fortawesome/fontawesome-free-brands": "5.0.13",
|
"@fortawesome/free-brands-svg-icons": "5.3.1",
|
||||||
"@fortawesome/fontawesome-free-regular": "5.0.13",
|
"@fortawesome/free-regular-svg-icons": "5.3.1",
|
||||||
"@fortawesome/fontawesome-free-solid": "5.0.13",
|
"@fortawesome/free-solid-svg-icons": "5.3.1",
|
||||||
"@koa/cors": "2.2.2",
|
"@koa/cors": "2.2.2",
|
||||||
"@prezzemolo/rap": "0.1.2",
|
"@prezzemolo/rap": "0.1.2",
|
||||||
"@prezzemolo/zip": "0.0.3",
|
"@prezzemolo/zip": "0.0.3",
|
||||||
"@types/bcryptjs": "2.4.1",
|
"@types/bcryptjs": "2.4.2",
|
||||||
"@types/dateformat": "1.0.1",
|
"@types/dateformat": "1.0.1",
|
||||||
"@types/debug": "0.0.30",
|
"@types/debug": "0.0.30",
|
||||||
"@types/deep-equal": "1.0.1",
|
"@types/deep-equal": "1.0.1",
|
||||||
@ -51,7 +51,7 @@
|
|||||||
"@types/koa-logger": "3.1.0",
|
"@types/koa-logger": "3.1.0",
|
||||||
"@types/koa-mount": "3.0.1",
|
"@types/koa-mount": "3.0.1",
|
||||||
"@types/koa-multer": "1.0.0",
|
"@types/koa-multer": "1.0.0",
|
||||||
"@types/koa-router": "7.0.31",
|
"@types/koa-router": "7.0.32",
|
||||||
"@types/koa-send": "4.1.1",
|
"@types/koa-send": "4.1.1",
|
||||||
"@types/koa-views": "2.0.3",
|
"@types/koa-views": "2.0.3",
|
||||||
"@types/koa__cors": "2.2.3",
|
"@types/koa__cors": "2.2.3",
|
||||||
@ -60,7 +60,7 @@
|
|||||||
"@types/mocha": "5.2.3",
|
"@types/mocha": "5.2.3",
|
||||||
"@types/mongodb": "3.1.7",
|
"@types/mongodb": "3.1.7",
|
||||||
"@types/ms": "0.7.30",
|
"@types/ms": "0.7.30",
|
||||||
"@types/node": "10.9.4",
|
"@types/node": "10.10.1",
|
||||||
"@types/portscanner": "2.1.0",
|
"@types/portscanner": "2.1.0",
|
||||||
"@types/pug": "2.0.4",
|
"@types/pug": "2.0.4",
|
||||||
"@types/qrcode": "1.2.0",
|
"@types/qrcode": "1.2.0",
|
||||||
@ -77,7 +77,7 @@
|
|||||||
"@types/systeminformation": "3.23.0",
|
"@types/systeminformation": "3.23.0",
|
||||||
"@types/tmp": "0.0.33",
|
"@types/tmp": "0.0.33",
|
||||||
"@types/uuid": "3.4.4",
|
"@types/uuid": "3.4.4",
|
||||||
"@types/webpack": "4.4.11",
|
"@types/webpack": "4.4.12",
|
||||||
"@types/webpack-stream": "3.2.10",
|
"@types/webpack-stream": "3.2.10",
|
||||||
"@types/websocket": "0.0.40",
|
"@types/websocket": "0.0.40",
|
||||||
"@types/ws": "6.0.1",
|
"@types/ws": "6.0.1",
|
||||||
@ -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",
|
||||||
@ -220,11 +217,11 @@
|
|||||||
"vuewordcloud": "18.7.11",
|
"vuewordcloud": "18.7.11",
|
||||||
"vuex": "3.0.1",
|
"vuex": "3.0.1",
|
||||||
"vuex-persistedstate": "2.5.4",
|
"vuex-persistedstate": "2.5.4",
|
||||||
"web-push": "3.3.2",
|
"web-push": "3.3.3",
|
||||||
"webfinger.js": "2.6.6",
|
"webfinger.js": "2.6.6",
|
||||||
"webpack": "4.18.1",
|
"webpack": "4.19.1",
|
||||||
"webpack-cli": "3.1.0",
|
"webpack-cli": "3.1.0",
|
||||||
"websocket": "1.0.26",
|
"websocket": "1.0.28",
|
||||||
"ws": "6.0.0",
|
"ws": "6.0.0",
|
||||||
"xev": "2.0.1"
|
"xev": "2.0.1"
|
||||||
},
|
},
|
||||||
|
@ -1,3 +1,24 @@
|
|||||||
<template>
|
<template>
|
||||||
<router-view id="app"></router-view>
|
<router-view id="app" v-hotkey.global="keymap"></router-view>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
import { url, lang } from './config';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
computed: {
|
||||||
|
keymap(): any {
|
||||||
|
return {
|
||||||
|
'h|slash': this.help
|
||||||
|
};
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
help() {
|
||||||
|
window.open(`${url}/docs/${lang}/keyboard-shortcut`, '_blank');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
109
src/client/app/common/hotkey.ts
Normal file
109
src/client/app/common/hotkey.ts
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
import keyCode from './keycode';
|
||||||
|
import { concat } from '../../../prelude/array';
|
||||||
|
|
||||||
|
type pattern = {
|
||||||
|
which: string[];
|
||||||
|
ctrl?: boolean;
|
||||||
|
shift?: boolean;
|
||||||
|
alt?: boolean;
|
||||||
|
};
|
||||||
|
|
||||||
|
type action = {
|
||||||
|
patterns: pattern[];
|
||||||
|
|
||||||
|
callback: Function;
|
||||||
|
};
|
||||||
|
|
||||||
|
const getKeyMap = keymap => Object.entries(keymap).map(([patterns, callback]): action => {
|
||||||
|
const result = {
|
||||||
|
patterns: [],
|
||||||
|
callback: callback
|
||||||
|
} as action;
|
||||||
|
|
||||||
|
result.patterns = patterns.split('|').map(part => {
|
||||||
|
const pattern = {
|
||||||
|
which: [],
|
||||||
|
ctrl: false,
|
||||||
|
alt: false,
|
||||||
|
shift: false
|
||||||
|
} as pattern;
|
||||||
|
|
||||||
|
part.trim().split('+').forEach(key => {
|
||||||
|
key = key.trim().toLowerCase();
|
||||||
|
switch (key) {
|
||||||
|
case 'ctrl': pattern.ctrl = true; break;
|
||||||
|
case 'alt': pattern.alt = true; break;
|
||||||
|
case 'shift': pattern.shift = true; break;
|
||||||
|
default: pattern.which = keyCode(key).map(k => k.toLowerCase());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return pattern;
|
||||||
|
});
|
||||||
|
|
||||||
|
return result;
|
||||||
|
});
|
||||||
|
|
||||||
|
const ignoreElemens = ['input', 'textarea'];
|
||||||
|
|
||||||
|
export default {
|
||||||
|
install(Vue) {
|
||||||
|
Vue.directive('hotkey', {
|
||||||
|
bind(el, binding) {
|
||||||
|
el._hotkey_global = binding.modifiers.global === true;
|
||||||
|
|
||||||
|
const actions = getKeyMap(binding.value);
|
||||||
|
|
||||||
|
// flatten
|
||||||
|
const reservedKeys = concat(concat(actions.map(a => a.patterns.map(p => p.which))));
|
||||||
|
|
||||||
|
el.dataset.reservedKeys = reservedKeys.map(key => `'${key}'`).join(' ');
|
||||||
|
|
||||||
|
el._keyHandler = e => {
|
||||||
|
const key = e.code.toLowerCase();
|
||||||
|
|
||||||
|
const targetReservedKeys = document.activeElement ? ((document.activeElement as any).dataset || {}).reservedKeys || '' : '';
|
||||||
|
if (document.activeElement && ignoreElemens.some(el => document.activeElement.matches(el))) return;
|
||||||
|
|
||||||
|
for (const action of actions) {
|
||||||
|
if (el._hotkey_global && targetReservedKeys.includes(`'${key}'`)) break;
|
||||||
|
|
||||||
|
const matched = action.patterns.some(pattern => {
|
||||||
|
const matched = pattern.which.includes(key) &&
|
||||||
|
pattern.ctrl == e.ctrlKey &&
|
||||||
|
pattern.shift == e.shiftKey &&
|
||||||
|
pattern.alt == e.altKey;
|
||||||
|
|
||||||
|
if (matched) {
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
action.callback(e);
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (matched) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
if (el._hotkey_global) {
|
||||||
|
document.addEventListener('keydown', el._keyHandler);
|
||||||
|
} else {
|
||||||
|
el.addEventListener('keydown', el._keyHandler);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
unbind(el) {
|
||||||
|
if (el._hotkey_global) {
|
||||||
|
document.removeEventListener('keydown', el._keyHandler);
|
||||||
|
} else {
|
||||||
|
el.removeEventListener('keydown', el._keyHandler);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
33
src/client/app/common/keycode.ts
Normal file
33
src/client/app/common/keycode.ts
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
export default (input: string): string[] => {
|
||||||
|
if (Object.keys(aliases).some(a => a.toLowerCase() == input.toLowerCase())) {
|
||||||
|
const codes = aliases[input];
|
||||||
|
return Array.isArray(codes) ? codes : [codes];
|
||||||
|
} else {
|
||||||
|
return [input];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export const aliases = {
|
||||||
|
'esc': 'Escape',
|
||||||
|
'enter': ['Enter', 'NumpadEnter'],
|
||||||
|
'up': 'ArrowUp',
|
||||||
|
'down': 'ArrowDown',
|
||||||
|
'left': 'ArrowLeft',
|
||||||
|
'right': 'ArrowRight',
|
||||||
|
'plus': ['NumpadAdd', 'Semicolon'],
|
||||||
|
};
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Programatically add the following
|
||||||
|
*/
|
||||||
|
|
||||||
|
// lower case chars
|
||||||
|
for (let i = 97; i < 123; i++) {
|
||||||
|
const char = String.fromCharCode(i);
|
||||||
|
aliases[char] = `Key${char.toUpperCase()}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
// numbers
|
||||||
|
for (let i = 0; i < 10; i++) {
|
||||||
|
aliases[i] = [`Numpad${i}`, `Digit${i}`];
|
||||||
|
}
|
13
src/client/app/common/scripts/streaming/hashtag.ts
Normal file
13
src/client/app/common/scripts/streaming/hashtag.ts
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
import Stream from './stream';
|
||||||
|
import MiOS from '../../../mios';
|
||||||
|
|
||||||
|
export class HashtagStream extends Stream {
|
||||||
|
constructor(os: MiOS, me, q) {
|
||||||
|
super(os, 'hashtag', me ? {
|
||||||
|
i: me.token,
|
||||||
|
q: JSON.stringify(q)
|
||||||
|
} : {
|
||||||
|
q: JSON.stringify(q)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@ -50,6 +50,30 @@ export class HomeStream extends Stream {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.on('unreadMention', () => {
|
||||||
|
os.store.dispatch('mergeMe', {
|
||||||
|
hasUnreadMentions: true
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
this.on('readAllUnreadMentions', () => {
|
||||||
|
os.store.dispatch('mergeMe', {
|
||||||
|
hasUnreadMentions: false
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
this.on('unreadSpecifiedNote', () => {
|
||||||
|
os.store.dispatch('mergeMe', {
|
||||||
|
hasUnreadSpecifiedNotes: true
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
this.on('readAllUnreadSpecifiedNotes', () => {
|
||||||
|
os.store.dispatch('mergeMe', {
|
||||||
|
hasUnreadSpecifiedNotes: false
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
this.on('clientSettingUpdated', x => {
|
this.on('clientSettingUpdated', x => {
|
||||||
os.store.commit('settings/set', {
|
os.store.commit('settings/set', {
|
||||||
key: x.key,
|
key: x.key,
|
||||||
|
@ -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>
|
||||||
|
@ -2,9 +2,9 @@
|
|||||||
<div class="onchrpzrvnoruiaenfcqvccjfuupzzwv">
|
<div class="onchrpzrvnoruiaenfcqvccjfuupzzwv">
|
||||||
<div class="backdrop" ref="backdrop" @click="close"></div>
|
<div class="backdrop" ref="backdrop" @click="close"></div>
|
||||||
<div class="popover" :class="{ hukidasi }" ref="popover">
|
<div class="popover" :class="{ hukidasi }" ref="popover">
|
||||||
<template v-for="item in items">
|
<template v-for="item, i in items">
|
||||||
<div v-if="item === null"></div>
|
<div v-if="item === null"></div>
|
||||||
<button v-if="item" @click="clicked(item.action)" v-html="item.icon ? item.icon + ' ' + item.text : item.text"></button>
|
<button v-if="item" @click="clicked(item.action)" v-html="item.icon ? item.icon + ' ' + item.text : item.text" :tabindex="i"></button>
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -108,7 +108,7 @@ export default Vue.extend({
|
|||||||
easing: 'easeInBack',
|
easing: 'easeInBack',
|
||||||
complete: () => {
|
complete: () => {
|
||||||
this.$emit('closed');
|
this.$emit('closed');
|
||||||
this.$destroy();
|
this.destroyDom();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -33,12 +33,16 @@ export default Vue.extend({
|
|||||||
text: '%i18n:@pin%',
|
text: '%i18n:@pin%',
|
||||||
action: this.pin
|
action: this.pin
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.note.userId == this.$store.state.i.id || this.$store.state.i.isAdmin) {
|
||||||
items.push({
|
items.push({
|
||||||
icon: '%fa:trash-alt R%',
|
icon: '%fa:trash-alt R%',
|
||||||
text: '%i18n:@delete%',
|
text: '%i18n:@delete%',
|
||||||
action: this.del
|
action: this.del
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.note.uri) {
|
if (this.note.uri) {
|
||||||
items.push({
|
items.push({
|
||||||
icon: '%fa:external-link-square-alt%',
|
icon: '%fa:external-link-square-alt%',
|
||||||
@ -48,6 +52,7 @@ export default Vue.extend({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
return items;
|
return items;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -64,7 +69,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 +78,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 +86,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();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mk-reaction-picker">
|
<div class="mk-reaction-picker" v-hotkey.global="keymap">
|
||||||
<div class="backdrop" ref="backdrop" @click="close"></div>
|
<div class="backdrop" ref="backdrop" @click="close"></div>
|
||||||
<div class="popover" :class="{ compact, big }" ref="popover">
|
<div class="popover" :class="{ compact, big }" ref="popover">
|
||||||
<p v-if="!compact">{{ title }}</p>
|
<p v-if="!compact">{{ title }}</p>
|
||||||
<div>
|
<div ref="buttons" :class="{ showFocus }">
|
||||||
<button @click="react('like')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="1" title="%i18n:common.reactions.like%"><mk-reaction-icon reaction='like'/></button>
|
<button @click="react('like')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="1" title="%i18n:common.reactions.like%"><mk-reaction-icon reaction='like'/></button>
|
||||||
<button @click="react('love')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="2" title="%i18n:common.reactions.love%"><mk-reaction-icon reaction='love'/></button>
|
<button @click="react('love')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="2" title="%i18n:common.reactions.love%"><mk-reaction-icon reaction='love'/></button>
|
||||||
<button @click="react('laugh')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="3" title="%i18n:common.reactions.laugh%"><mk-reaction-icon reaction='laugh'/></button>
|
<button @click="react('laugh')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="3" title="%i18n:common.reactions.laugh%"><mk-reaction-icon reaction='laugh'/></button>
|
||||||
@ -31,30 +31,84 @@ export default Vue.extend({
|
|||||||
type: Object,
|
type: Object,
|
||||||
required: true
|
required: true
|
||||||
},
|
},
|
||||||
|
|
||||||
source: {
|
source: {
|
||||||
required: true
|
required: true
|
||||||
},
|
},
|
||||||
|
|
||||||
compact: {
|
compact: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
required: false,
|
required: false,
|
||||||
default: false
|
default: false
|
||||||
},
|
},
|
||||||
|
|
||||||
cb: {
|
cb: {
|
||||||
required: false
|
required: false
|
||||||
},
|
},
|
||||||
|
|
||||||
big: {
|
big: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
required: false,
|
required: false,
|
||||||
default: false
|
default: false
|
||||||
|
},
|
||||||
|
|
||||||
|
showFocus: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default: false
|
||||||
|
},
|
||||||
|
|
||||||
|
animation: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default: true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
title: placeholder
|
title: placeholder,
|
||||||
|
focus: null
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
keymap(): any {
|
||||||
|
return {
|
||||||
|
'esc': this.close,
|
||||||
|
'enter|space|plus': this.choose,
|
||||||
|
'up|k': this.focusUp,
|
||||||
|
'left|h|shift+tab': this.focusLeft,
|
||||||
|
'right|l|tab': this.focusRight,
|
||||||
|
'down|j': this.focusDown,
|
||||||
|
'1': () => this.react('like'),
|
||||||
|
'2': () => this.react('love'),
|
||||||
|
'3': () => this.react('laugh'),
|
||||||
|
'4': () => this.react('hmm'),
|
||||||
|
'5': () => this.react('surprise'),
|
||||||
|
'6': () => this.react('congrats'),
|
||||||
|
'7': () => this.react('angry'),
|
||||||
|
'8': () => this.react('confused'),
|
||||||
|
'9': () => this.react('rip'),
|
||||||
|
'0': () => this.react('pudding'),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
watch: {
|
||||||
|
focus(i) {
|
||||||
|
this.$refs.buttons.children[i].focus();
|
||||||
|
|
||||||
|
if (this.showFocus) {
|
||||||
|
this.title = this.$refs.buttons.children[i].title;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
mounted() {
|
mounted() {
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
|
this.focus = 0;
|
||||||
|
|
||||||
const popover = this.$refs.popover as any;
|
const popover = this.$refs.popover as any;
|
||||||
|
|
||||||
const rect = this.source.getBoundingClientRect();
|
const rect = this.source.getBoundingClientRect();
|
||||||
@ -76,7 +130,7 @@ export default Vue.extend({
|
|||||||
anime({
|
anime({
|
||||||
targets: this.$refs.backdrop,
|
targets: this.$refs.backdrop,
|
||||||
opacity: 1,
|
opacity: 1,
|
||||||
duration: 100,
|
duration: this.animation ? 100 : 0,
|
||||||
easing: 'linear'
|
easing: 'linear'
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -84,10 +138,11 @@ export default Vue.extend({
|
|||||||
targets: this.$refs.popover,
|
targets: this.$refs.popover,
|
||||||
opacity: 1,
|
opacity: 1,
|
||||||
scale: [0.5, 1],
|
scale: [0.5, 1],
|
||||||
duration: 500
|
duration: this.animation ? 500 : 0
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
react(reaction) {
|
react(reaction) {
|
||||||
(this as any).api('notes/reactions/create', {
|
(this as any).api('notes/reactions/create', {
|
||||||
@ -95,21 +150,25 @@ export default Vue.extend({
|
|||||||
reaction: reaction
|
reaction: reaction
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
if (this.cb) this.cb();
|
if (this.cb) this.cb();
|
||||||
this.$destroy();
|
this.$emit('closed');
|
||||||
|
this.destroyDom();
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
onMouseover(e) {
|
onMouseover(e) {
|
||||||
this.title = e.target.title;
|
this.title = e.target.title;
|
||||||
},
|
},
|
||||||
|
|
||||||
onMouseout(e) {
|
onMouseout(e) {
|
||||||
this.title = placeholder;
|
this.title = placeholder;
|
||||||
},
|
},
|
||||||
|
|
||||||
close() {
|
close() {
|
||||||
(this.$refs.backdrop as any).style.pointerEvents = 'none';
|
(this.$refs.backdrop as any).style.pointerEvents = 'none';
|
||||||
anime({
|
anime({
|
||||||
targets: this.$refs.backdrop,
|
targets: this.$refs.backdrop,
|
||||||
opacity: 0,
|
opacity: 0,
|
||||||
duration: 200,
|
duration: this.animation ? 200 : 0,
|
||||||
easing: 'linear'
|
easing: 'linear'
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -118,10 +177,33 @@ export default Vue.extend({
|
|||||||
targets: this.$refs.popover,
|
targets: this.$refs.popover,
|
||||||
opacity: 0,
|
opacity: 0,
|
||||||
scale: 0.5,
|
scale: 0.5,
|
||||||
duration: 200,
|
duration: this.animation ? 200 : 0,
|
||||||
easing: 'easeInBack',
|
easing: 'easeInBack',
|
||||||
complete: () => this.$destroy()
|
complete: () => {
|
||||||
|
this.$emit('closed');
|
||||||
|
this.destroyDom();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
focusUp() {
|
||||||
|
this.focus = this.focus == 0 ? 9 : this.focus < 5 ? (this.focus + 4) : (this.focus - 5);
|
||||||
|
},
|
||||||
|
|
||||||
|
focusDown() {
|
||||||
|
this.focus = this.focus == 9 ? 0 : this.focus >= 5 ? (this.focus - 4) : (this.focus + 5);
|
||||||
|
},
|
||||||
|
|
||||||
|
focusRight() {
|
||||||
|
this.focus = this.focus == 9 ? 0 : (this.focus + 1);
|
||||||
|
},
|
||||||
|
|
||||||
|
focusLeft() {
|
||||||
|
this.focus = this.focus == 0 ? 9 : (this.focus - 1);
|
||||||
|
},
|
||||||
|
|
||||||
|
choose() {
|
||||||
|
this.$refs.buttons.childNodes[this.focus].click();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -207,6 +289,21 @@ root(isDark)
|
|||||||
width 240px
|
width 240px
|
||||||
text-align center
|
text-align center
|
||||||
|
|
||||||
|
&.showFocus
|
||||||
|
> button:focus
|
||||||
|
z-index 1
|
||||||
|
|
||||||
|
&:after
|
||||||
|
content ""
|
||||||
|
pointer-events none
|
||||||
|
position absolute
|
||||||
|
top 0
|
||||||
|
right 0
|
||||||
|
bottom 0
|
||||||
|
left 0
|
||||||
|
border 2px solid rgba($theme-color, 0.3)
|
||||||
|
border-radius 4px
|
||||||
|
|
||||||
> button
|
> button
|
||||||
padding 0
|
padding 0
|
||||||
width 40px
|
width 40px
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -89,7 +100,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
created() {
|
created() {
|
||||||
(this as any).api('chart', {
|
(this as any).api('chart', {
|
||||||
limit: 32
|
limit: 35
|
||||||
}).then(chart => {
|
}).then(chart => {
|
||||||
this.chart = chart;
|
this.chart = chart;
|
||||||
});
|
});
|
||||||
@ -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>
|
||||||
@ -582,6 +681,6 @@ export default Vue.extend({
|
|||||||
> div
|
> div
|
||||||
> *
|
> *
|
||||||
display block
|
display block
|
||||||
height 320px
|
height 350px
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<mk-window ref="window" is-modal width="800px" height="500px" @closed="$destroy">
|
<mk-window ref="window" is-modal width="800px" height="500px" @closed="destroyDom">
|
||||||
<span slot="header">
|
<span slot="header">
|
||||||
<span v-html="title" :class="$style.title"></span>
|
<span v-html="title" :class="$style.title"></span>
|
||||||
<span :class="$style.count" v-if="multiple && files.length > 0">({{ files.length }}%i18n:@choose-file%)</span>
|
<span :class="$style.count" v-if="multiple && files.length > 0">({{ files.length }}%i18n:@choose-file%)</span>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<mk-window ref="window" is-modal width="800px" height="500px" @closed="$destroy">
|
<mk-window ref="window" is-modal width="800px" height="500px" @closed="destroyDom">
|
||||||
<span slot="header">
|
<span slot="header">
|
||||||
<span v-html="title" :class="$style.title"></span>
|
<span v-html="title" :class="$style.title"></span>
|
||||||
</span>
|
</span>
|
||||||
|
@ -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() {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<mk-window ref="window" @closed="$destroy" width="800px" height="500px" :popout-url="popout">
|
<mk-window ref="window" @closed="destroyDom" width="800px" height="500px" :popout-url="popout">
|
||||||
<template slot="header">
|
<template slot="header">
|
||||||
<p v-if="usage" :class="$style.info"><b>{{ usage.toFixed(1) }}%</b> %i18n:@used%</p>
|
<p v-if="usage" :class="$style.info"><b>{{ usage.toFixed(1) }}%</b> %i18n:@used%</p>
|
||||||
<span :class="$style.title">%fa:cloud%%i18n:@drive%</span>
|
<span :class="$style.title">%fa:cloud%%i18n:@drive%</span>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<mk-window width="400px" height="550px" @closed="$destroy">
|
<mk-window width="400px" height="550px" @closed="destroyDom">
|
||||||
<span slot="header" :class="$style.header">
|
<span slot="header" :class="$style.header">
|
||||||
<img :src="user.avatarUrl" alt=""/>{{ '%i18n:@followers%'.replace('{}', name) }}
|
<img :src="user.avatarUrl" alt=""/>{{ '%i18n:@followers%'.replace('{}', name) }}
|
||||||
</span>
|
</span>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<mk-window width="400px" height="550px" @closed="$destroy">
|
<mk-window width="400px" height="550px" @closed="destroyDom">
|
||||||
<span slot="header" :class="$style.header">
|
<span slot="header" :class="$style.header">
|
||||||
<img :src="user.avatarUrl" alt=""/>{{ '%i18n:@following%'.replace('{}', name) }}
|
<img :src="user.avatarUrl" alt=""/>{{ '%i18n:@following%'.replace('{}', name) }}
|
||||||
</span>
|
</span>
|
||||||
|
@ -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>
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<mk-window ref="window" width="500px" height="560px" :popout-url="popout" @closed="$destroy">
|
<mk-window ref="window" width="500px" height="560px" :popout-url="popout" @closed="destroyDom">
|
||||||
<span slot="header" :class="$style.header">%fa:gamepad%%i18n:@game%</span>
|
<span slot="header" :class="$style.header">%fa:gamepad%%i18n:@game%</span>
|
||||||
<mk-reversi :class="$style.content" @gamed="g => game = g"/>
|
<mk-reversi :class="$style.content" @gamed="g => game = g"/>
|
||||||
</mk-window>
|
</mk-window>
|
||||||
|
@ -38,7 +38,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="main">
|
<div class="main" :class="{ withBg: $store.state.i.wallpaperUrl != null }">
|
||||||
<template v-if="customize">
|
<template v-if="customize">
|
||||||
<x-draggable v-for="place in ['left', 'right']"
|
<x-draggable v-for="place in ['left', 'right']"
|
||||||
:list="widgets[place]"
|
:list="widgets[place]"
|
||||||
@ -237,6 +237,10 @@ export default Vue.extend({
|
|||||||
|
|
||||||
warp(date) {
|
warp(date) {
|
||||||
(this.$refs.tl as any).warp(date);
|
(this.$refs.tl as any).warp(date);
|
||||||
|
},
|
||||||
|
|
||||||
|
focus() {
|
||||||
|
(this.$refs.tl as any).focus();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -336,7 +340,10 @@ root(isDark)
|
|||||||
display flex
|
display flex
|
||||||
justify-content center
|
justify-content center
|
||||||
margin 0 auto
|
margin 0 auto
|
||||||
max-width 1220px
|
max-width 1240px
|
||||||
|
|
||||||
|
&.withBg
|
||||||
|
background rgba(isDark ? #000 : #fff, 0.5)
|
||||||
|
|
||||||
> *
|
> *
|
||||||
.customize-container
|
.customize-container
|
||||||
@ -351,7 +358,7 @@ root(isDark)
|
|||||||
|
|
||||||
> .main
|
> .main
|
||||||
padding 16px
|
padding 16px
|
||||||
width calc(100% - 275px * 2)
|
width calc(100% - 280px * 2)
|
||||||
order 2
|
order 2
|
||||||
|
|
||||||
> .form
|
> .form
|
||||||
@ -367,7 +374,7 @@ root(isDark)
|
|||||||
border-radius 0
|
border-radius 0
|
||||||
|
|
||||||
> *:not(.main)
|
> *:not(.main)
|
||||||
width 275px
|
width 280px
|
||||||
padding 16px 0 16px 0
|
padding 16px 0 16px 0
|
||||||
|
|
||||||
> *:not(:last-child)
|
> *:not(:last-child)
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<mk-window ref="window" is-modal width="500px" @before-close="beforeClose" @closed="$destroy">
|
<mk-window ref="window" is-modal width="500px" @before-close="beforeClose" @closed="destroyDom">
|
||||||
<span slot="header" :class="$style.header">
|
<span slot="header" :class="$style.header">
|
||||||
%fa:i-cursor%{{ title }}
|
%fa:i-cursor%{{ title }}
|
||||||
</span>
|
</span>
|
||||||
|
@ -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()
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="ldwbgwstjsdgcjruamauqdrffetqudry" v-if="image.isSensitive && hide" @click="hide = false">
|
<div class="ldwbgwstjsdgcjruamauqdrffetqudry" v-if="image.isSensitive && hide && !$store.state.device.alwaysShowNsfw" @click="hide = false">
|
||||||
<div>
|
<div>
|
||||||
<b>%fa:exclamation-triangle% %i18n:@sensitive%</b>
|
<b>%fa:exclamation-triangle% %i18n:@sensitive%</b>
|
||||||
<span>%i18n:@click-to-show%</span>
|
<span>%i18n:@click-to-show%</span>
|
||||||
@ -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>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<mk-window ref="window" width="500px" height="560px" :popout-url="popout" @closed="$destroy">
|
<mk-window ref="window" width="500px" height="560px" :popout-url="popout" @closed="destroyDom">
|
||||||
<span slot="header" :class="$style.header">%fa:comments%%i18n:@title% {{ user | userName }}</span>
|
<span slot="header" :class="$style.header">%fa:comments%%i18n:@title% {{ user | userName }}</span>
|
||||||
<mk-messaging-room :user="user" :class="$style.content"/>
|
<mk-messaging-room :user="user" :class="$style.content"/>
|
||||||
</mk-window>
|
</mk-window>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<mk-window ref="window" width="500px" height="560px" @closed="$destroy">
|
<mk-window ref="window" width="500px" height="560px" @closed="destroyDom">
|
||||||
<span slot="header" :class="$style.header">%fa:comments%%i18n:@title%</span>
|
<span slot="header" :class="$style.header">%fa:comments%%i18n:@title%</span>
|
||||||
<mk-messaging :class="$style.content" @navigate="navigate"/>
|
<mk-messaging :class="$style.content" @navigate="navigate"/>
|
||||||
</mk-window>
|
</mk-window>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="note" tabindex="-1" :title="title" @keydown="onKeydown">
|
<div class="note" tabindex="-1" v-hotkey="keymap" :title="title">
|
||||||
<div class="reply-to" v-if="p.reply && (!$store.getters.isSignedIn || $store.state.settings.showReplyTarget)">
|
<div class="reply-to" v-if="p.reply && (!$store.getters.isSignedIn || $store.state.settings.showReplyTarget)">
|
||||||
<x-sub :note="p.reply"/>
|
<x-sub :note="p.reply"/>
|
||||||
</div>
|
</div>
|
||||||
@ -40,18 +40,18 @@
|
|||||||
</div>
|
</div>
|
||||||
<footer>
|
<footer>
|
||||||
<mk-reactions-viewer :note="p" ref="reactionsViewer"/>
|
<mk-reactions-viewer :note="p" ref="reactionsViewer"/>
|
||||||
<button class="replyButton" @click="reply" title="%i18n:@reply%">
|
<button class="replyButton" @click="reply()" title="%i18n:@reply%">
|
||||||
<template v-if="p.reply">%fa:reply-all%</template>
|
<template v-if="p.reply">%fa:reply-all%</template>
|
||||||
<template v-else>%fa:reply%</template>
|
<template v-else>%fa:reply%</template>
|
||||||
<p class="count" v-if="p.repliesCount > 0">{{ p.repliesCount }}</p>
|
<p class="count" v-if="p.repliesCount > 0">{{ p.repliesCount }}</p>
|
||||||
</button>
|
</button>
|
||||||
<button class="renoteButton" @click="renote" title="%i18n:@renote%">
|
<button class="renoteButton" @click="renote()" title="%i18n:@renote%">
|
||||||
%fa:retweet%<p class="count" v-if="p.renoteCount > 0">{{ p.renoteCount }}</p>
|
%fa:retweet%<p class="count" v-if="p.renoteCount > 0">{{ p.renoteCount }}</p>
|
||||||
</button>
|
</button>
|
||||||
<button class="reactionButton" :class="{ reacted: p.myReaction != null }" @click="react" ref="reactButton" title="%i18n:@add-reaction%">
|
<button class="reactionButton" :class="{ reacted: p.myReaction != null }" @click="react()" ref="reactButton" title="%i18n:@add-reaction%">
|
||||||
%fa:plus%<p class="count" v-if="p.reactions_count > 0">{{ p.reactions_count }}</p>
|
%fa:plus%<p class="count" v-if="p.reactions_count > 0">{{ p.reactions_count }}</p>
|
||||||
</button>
|
</button>
|
||||||
<button @click="menu" ref="menuButton">
|
<button @click="menu()" ref="menuButton">
|
||||||
%fa:ellipsis-h%
|
%fa:ellipsis-h%
|
||||||
</button>
|
</button>
|
||||||
<!-- <button title="%i18n:@detail">
|
<!-- <button title="%i18n:@detail">
|
||||||
@ -111,6 +111,30 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
computed: {
|
computed: {
|
||||||
|
keymap(): any {
|
||||||
|
return {
|
||||||
|
'r|left': () => this.reply(true),
|
||||||
|
'e|a|plus': () => this.react(true),
|
||||||
|
'q|right': () => this.renote(true),
|
||||||
|
'ctrl+q|ctrl+right': this.renoteDirectly,
|
||||||
|
'up|k|shift+tab': this.focusBefore,
|
||||||
|
'down|j|tab': this.focusAfter,
|
||||||
|
'esc': this.blur,
|
||||||
|
'm|o': () => this.menu(true),
|
||||||
|
's': this.toggleShowContent,
|
||||||
|
'1': () => this.reactDirectly('like'),
|
||||||
|
'2': () => this.reactDirectly('love'),
|
||||||
|
'3': () => this.reactDirectly('laugh'),
|
||||||
|
'4': () => this.reactDirectly('hmm'),
|
||||||
|
'5': () => this.reactDirectly('surprise'),
|
||||||
|
'6': () => this.reactDirectly('congrats'),
|
||||||
|
'7': () => this.reactDirectly('angry'),
|
||||||
|
'8': () => this.reactDirectly('confused'),
|
||||||
|
'9': () => this.reactDirectly('rip'),
|
||||||
|
'0': () => this.reactDirectly('pudding'),
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
isRenote(): boolean {
|
isRenote(): boolean {
|
||||||
return (this.note.renote &&
|
return (this.note.renote &&
|
||||||
this.note.text == null &&
|
this.note.text == null &&
|
||||||
@ -189,10 +213,14 @@ export default Vue.extend({
|
|||||||
methods: {
|
methods: {
|
||||||
capture(withHandler = false) {
|
capture(withHandler = false) {
|
||||||
if (this.$store.getters.isSignedIn) {
|
if (this.$store.getters.isSignedIn) {
|
||||||
this.connection.send({
|
const data = {
|
||||||
type: 'capture',
|
type: 'capture',
|
||||||
id: this.p.id
|
id: this.p.id
|
||||||
});
|
} as any;
|
||||||
|
if ((this.p.visibleUserIds || []).includes(this.$store.state.i.id) || (this.p.mentions || []).includes(this.$store.state.i.id)) {
|
||||||
|
data.read = true;
|
||||||
|
}
|
||||||
|
this.connection.send(data);
|
||||||
if (withHandler) this.connection.on('note-updated', this.onStreamNoteUpdated);
|
if (withHandler) this.connection.on('note-updated', this.onStreamNoteUpdated);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -220,67 +248,69 @@ export default Vue.extend({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
reply() {
|
reply(viaKeyboard = false) {
|
||||||
(this as any).os.new(MkPostFormWindow, {
|
(this as any).os.new(MkPostFormWindow, {
|
||||||
reply: this.p
|
reply: this.p,
|
||||||
});
|
animation: !viaKeyboard
|
||||||
|
}).$once('closed', this.focus);
|
||||||
},
|
},
|
||||||
|
|
||||||
renote() {
|
renote(viaKeyboard = false) {
|
||||||
(this as any).os.new(MkRenoteFormWindow, {
|
(this as any).os.new(MkRenoteFormWindow, {
|
||||||
note: this.p
|
note: this.p,
|
||||||
|
animation: !viaKeyboard
|
||||||
|
}).$once('closed', this.focus);
|
||||||
|
},
|
||||||
|
|
||||||
|
renoteDirectly() {
|
||||||
|
(this as any).api('notes/create', {
|
||||||
|
renoteId: this.p.id
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
react() {
|
react(viaKeyboard = false) {
|
||||||
|
this.blur();
|
||||||
(this as any).os.new(MkReactionPicker, {
|
(this as any).os.new(MkReactionPicker, {
|
||||||
source: this.$refs.reactButton,
|
source: this.$refs.reactButton,
|
||||||
note: this.p
|
note: this.p,
|
||||||
|
showFocus: viaKeyboard,
|
||||||
|
animation: !viaKeyboard
|
||||||
|
}).$once('closed', this.focus);
|
||||||
|
},
|
||||||
|
|
||||||
|
reactDirectly(reaction) {
|
||||||
|
(this as any).api('notes/reactions/create', {
|
||||||
|
noteId: this.p.id,
|
||||||
|
reaction: reaction
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
menu() {
|
menu(viaKeyboard = false) {
|
||||||
(this as any).os.new(MkNoteMenu, {
|
(this as any).os.new(MkNoteMenu, {
|
||||||
source: this.$refs.menuButton,
|
source: this.$refs.menuButton,
|
||||||
note: this.p
|
note: this.p,
|
||||||
});
|
animation: !viaKeyboard
|
||||||
|
}).$once('closed', this.focus);
|
||||||
},
|
},
|
||||||
|
|
||||||
onKeydown(e) {
|
toggleShowContent() {
|
||||||
let shouldBeCancel = true;
|
this.showContent = !this.showContent;
|
||||||
|
},
|
||||||
|
|
||||||
switch (true) {
|
focus() {
|
||||||
case e.which == 38: // [↑]
|
this.$el.focus();
|
||||||
case e.which == 74: // [j]
|
},
|
||||||
case e.which == 9 && e.shiftKey: // [Shift] + [Tab]
|
|
||||||
focus(this.$el, e => e.previousElementSibling);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case e.which == 40: // [↓]
|
blur() {
|
||||||
case e.which == 75: // [k]
|
this.$el.blur();
|
||||||
case e.which == 9: // [Tab]
|
},
|
||||||
focus(this.$el, e => e.nextElementSibling);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case e.which == 81: // [q]
|
focusBefore() {
|
||||||
case e.which == 69: // [e]
|
focus(this.$el, e => e.previousElementSibling);
|
||||||
this.renote();
|
},
|
||||||
break;
|
|
||||||
|
|
||||||
case e.which == 70: // [f]
|
focusAfter() {
|
||||||
case e.which == 76: // [l]
|
focus(this.$el, e => e.nextElementSibling);
|
||||||
//this.like();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case e.which == 82: // [r]
|
|
||||||
this.reply();
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
shouldBeCancel = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (shouldBeCancel) e.preventDefault();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -10,15 +10,15 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- トランジションを有効にするとなぜかメモリリークする -->
|
<!-- トランジションを有効にするとなぜかメモリリークする -->
|
||||||
<transition-group name="mk-notes" class="notes transition" tag="div">
|
<component :is="!$store.state.device.reduceMotion ? 'transition-group' : 'div'" name="mk-notes" class="notes transition" tag="div" ref="notes">
|
||||||
<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)" ref="note"/>
|
||||||
<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">
|
||||||
<span>%fa:angle-up%{{ note._datetext }}</span>
|
<span>%fa:angle-up%{{ note._datetext }}</span>
|
||||||
<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' }">
|
||||||
@ -89,7 +89,7 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
focus() {
|
focus() {
|
||||||
(this.$el as any).children[0].focus();
|
(this.$refs.notes as any).children[0].focus ? (this.$refs.notes as any).children[0].focus() : (this.$refs.notes as any).$el.children[0].focus();
|
||||||
},
|
},
|
||||||
|
|
||||||
onNoteUpdated(i, note) {
|
onNoteUpdated(i, note) {
|
||||||
|
@ -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.reduceMotion ? '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%' }}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<mk-window class="mk-post-form-window" ref="window" is-modal @closed="$destroy">
|
<mk-window class="mk-post-form-window" ref="window" is-modal @closed="onWindowClosed" :animation="animation">
|
||||||
<span slot="header" class="mk-post-form-window--header">
|
<span slot="header" class="mk-post-form-window--header">
|
||||||
<span class="icon" v-if="geo">%fa:map-marker-alt%</span>
|
<span class="icon" v-if="geo">%fa:map-marker-alt%</span>
|
||||||
<span v-if="!reply">%i18n:@note%</span>
|
<span v-if="!reply">%i18n:@note%</span>
|
||||||
@ -25,7 +25,19 @@
|
|||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
props: ['reply'],
|
props: {
|
||||||
|
reply: {
|
||||||
|
type: Object,
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
|
||||||
|
animation: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
uploadings: [],
|
uploadings: [],
|
||||||
@ -33,11 +45,13 @@ export default Vue.extend({
|
|||||||
geo: null
|
geo: null
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
mounted() {
|
mounted() {
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
(this.$refs.form as any).focus();
|
(this.$refs.form as any).focus();
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
onChangeUploadings(files) {
|
onChangeUploadings(files) {
|
||||||
this.uploadings = files;
|
this.uploadings = files;
|
||||||
@ -53,6 +67,10 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
onPosted() {
|
onPosted() {
|
||||||
(this.$refs.window as any).close();
|
(this.$refs.window as any).close();
|
||||||
|
},
|
||||||
|
onWindowClosed() {
|
||||||
|
this.$emit('closed');
|
||||||
|
this.destroyDom();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -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,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<mk-window ref="window" :is-modal="false" :can-close="false" width="500px" @closed="$destroy">
|
<mk-window ref="window" :is-modal="false" :can-close="false" width="500px" @closed="destroyDom">
|
||||||
<span slot="header">{{ title }}<mk-ellipsis/></span>
|
<span slot="header">{{ title }}<mk-ellipsis/></span>
|
||||||
<div :class="$style.body">
|
<div :class="$style.body">
|
||||||
<p :class="$style.init" v-if="isNaN(value)">%i18n:@waiting%<mk-ellipsis/></p>
|
<p :class="$style.init" v-if="isNaN(value)">%i18n:@waiting%<mk-ellipsis/></p>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<mk-window ref="window" is-modal width="450px" height="500px" @closed="$destroy">
|
<mk-window ref="window" is-modal width="450px" height="500px" @closed="destroyDom">
|
||||||
<span slot="header">%fa:envelope R% %i18n:@title%</span>
|
<span slot="header">%fa:envelope R% %i18n:@title%</span>
|
||||||
|
|
||||||
<div class="slpqaxdoxhvglersgjukmvizkqbmbokc" :data-darkmode="$store.state.device.darkmode">
|
<div class="slpqaxdoxhvglersgjukmvizkqbmbokc" :data-darkmode="$store.state.device.darkmode">
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<mk-window ref="window" is-modal @closed="$destroy">
|
<mk-window ref="window" is-modal @closed="onWindowClosed" :animation="animation">
|
||||||
<span slot="header" :class="$style.header">%fa:retweet%%i18n:@title%</span>
|
<span slot="header" :class="$style.header">%fa:retweet%%i18n:@title%</span>
|
||||||
<mk-renote-form ref="form" :note="note" @posted="onPosted" @canceled="onCanceled"/>
|
<mk-renote-form ref="form" :note="note" @posted="onPosted" @canceled="onCanceled" v-hotkey.global="keymap"/>
|
||||||
</mk-window>
|
</mk-window>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -9,26 +9,48 @@
|
|||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
props: ['note'],
|
props: {
|
||||||
mounted() {
|
note: {
|
||||||
document.addEventListener('keydown', this.onDocumentKeydown);
|
type: Object,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
|
||||||
|
animation: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default: true
|
||||||
|
}
|
||||||
},
|
},
|
||||||
beforeDestroy() {
|
|
||||||
document.removeEventListener('keydown', this.onDocumentKeydown);
|
computed: {
|
||||||
|
keymap(): any {
|
||||||
|
return {
|
||||||
|
'esc': this.close,
|
||||||
|
'enter': this.post,
|
||||||
|
'q': this.quote,
|
||||||
|
};
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
onDocumentKeydown(e) {
|
post() {
|
||||||
if (e.target.tagName != 'INPUT' && e.target.tagName != 'TEXTAREA') {
|
(this.$refs.form as any).ok();
|
||||||
if (e.which == 27) { // Esc
|
},
|
||||||
(this.$refs.window as any).close();
|
quote() {
|
||||||
}
|
(this.$refs.form as any).onQuote();
|
||||||
}
|
},
|
||||||
|
close() {
|
||||||
|
(this.$refs.window as any).close();
|
||||||
},
|
},
|
||||||
onPosted() {
|
onPosted() {
|
||||||
(this.$refs.window as any).close();
|
(this.$refs.window as any).close();
|
||||||
},
|
},
|
||||||
onCanceled() {
|
onCanceled() {
|
||||||
(this.$refs.window as any).close();
|
(this.$refs.window as any).close();
|
||||||
|
},
|
||||||
|
onWindowClosed() {
|
||||||
|
this.$emit('closed');
|
||||||
|
this.destroyDom();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -1,13 +1,19 @@
|
|||||||
<template>
|
<template>
|
||||||
<mk-window ref="window" is-modal width="700px" height="550px" @closed="$destroy">
|
<mk-window ref="window" is-modal width="700px" height="550px" @closed="destroyDom">
|
||||||
<span slot="header" :class="$style.header">%fa:cog%%i18n:@settings%</span>
|
<span slot="header" :class="$style.header">%fa:cog%%i18n:@settings%</span>
|
||||||
<mk-settings @done="close"/>
|
<mk-settings :initial-page="initialPage" @done="close"/>
|
||||||
</mk-window>
|
</mk-window>
|
||||||
</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: {
|
||||||
|
initialPage: {
|
||||||
|
type: String,
|
||||||
|
required: false
|
||||||
|
}
|
||||||
|
},
|
||||||
methods: {
|
methods: {
|
||||||
close() {
|
close() {
|
||||||
(this as any).$refs.window.close();
|
(this as any).$refs.window.close();
|
||||||
|
@ -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;
|
||||||
|
65
src/client/app/desktop/views/components/settings.tags.vue
Normal file
65
src/client/app/desktop/views/components/settings.tags.vue
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
<template>
|
||||||
|
<div class="vfcitkilproprqtbnpoertpsziierwzi">
|
||||||
|
<div v-for="timeline in timelines" class="timeline">
|
||||||
|
<ui-input v-model="timeline.title" @change="save">
|
||||||
|
<span>%i18n:@title%</span>
|
||||||
|
</ui-input>
|
||||||
|
<ui-textarea :value="timeline.query ? timeline.query.map(tags => tags.join(' ')).join('\n') : ''" @input="onQueryChange(timeline, $event)">
|
||||||
|
<span>%i18n:@query%</span>
|
||||||
|
</ui-textarea>
|
||||||
|
<ui-button class="save" @click="save">%i18n:@save%</ui-button>
|
||||||
|
</div>
|
||||||
|
<ui-button class="add" @click="add">%i18n:@add%</ui-button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
import * as uuid from 'uuid';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
timelines: this.$store.state.settings.tagTimelines
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
add() {
|
||||||
|
this.timelines.push({
|
||||||
|
id: uuid(),
|
||||||
|
title: '',
|
||||||
|
query: ''
|
||||||
|
});
|
||||||
|
|
||||||
|
this.save();
|
||||||
|
},
|
||||||
|
|
||||||
|
save() {
|
||||||
|
this.$store.dispatch('settings/set', { key: 'tagTimelines', value: this.timelines });
|
||||||
|
},
|
||||||
|
|
||||||
|
onQueryChange(timeline, value) {
|
||||||
|
timeline.query = value.split('\n').map(tags => tags.split(' '));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
|
||||||
|
root(isDark)
|
||||||
|
> .timeline
|
||||||
|
padding-bottom 16px
|
||||||
|
border-bottom solid 1px rgba(#000, 0.1)
|
||||||
|
|
||||||
|
> .add
|
||||||
|
margin-top 16px
|
||||||
|
|
||||||
|
.vfcitkilproprqtbnpoertpsziierwzi[data-darkmode]
|
||||||
|
root(true)
|
||||||
|
|
||||||
|
.vfcitkilproprqtbnpoertpsziierwzi:not([data-darkmode])
|
||||||
|
root(false)
|
||||||
|
|
||||||
|
</style>
|
@ -5,6 +5,7 @@
|
|||||||
<p :class="{ active: page == 'web' }" @mousedown="page = 'web'">%fa:desktop .fw%Web</p>
|
<p :class="{ active: page == 'web' }" @mousedown="page = 'web'">%fa:desktop .fw%Web</p>
|
||||||
<p :class="{ active: page == 'notification' }" @mousedown="page = 'notification'">%fa:R bell .fw%%i18n:@notification%</p>
|
<p :class="{ active: page == 'notification' }" @mousedown="page = 'notification'">%fa:R bell .fw%%i18n:@notification%</p>
|
||||||
<p :class="{ active: page == 'drive' }" @mousedown="page = 'drive'">%fa:cloud .fw%%i18n:@drive%</p>
|
<p :class="{ active: page == 'drive' }" @mousedown="page = 'drive'">%fa:cloud .fw%%i18n:@drive%</p>
|
||||||
|
<p :class="{ active: page == 'hashtags' }" @mousedown="page = 'hashtags'">%fa:hashtag .fw%%i18n:@tags%</p>
|
||||||
<p :class="{ active: page == 'mute' }" @mousedown="page = 'mute'">%fa:ban .fw%%i18n:@mute%</p>
|
<p :class="{ active: page == 'mute' }" @mousedown="page = 'mute'">%fa:ban .fw%%i18n:@mute%</p>
|
||||||
<p :class="{ active: page == 'apps' }" @mousedown="page = 'apps'">%fa:puzzle-piece .fw%%i18n:@apps%</p>
|
<p :class="{ active: page == 'apps' }" @mousedown="page = 'apps'">%fa:puzzle-piece .fw%%i18n:@apps%</p>
|
||||||
<p :class="{ active: page == 'twitter' }" @mousedown="page = 'twitter'">%fa:B twitter .fw%Twitter</p>
|
<p :class="{ active: page == 'twitter' }" @mousedown="page = 'twitter'">%fa:B twitter .fw%Twitter</p>
|
||||||
@ -20,7 +21,7 @@
|
|||||||
|
|
||||||
<section class="web" v-show="page == 'web'">
|
<section class="web" v-show="page == 'web'">
|
||||||
<h1>%i18n:@behaviour%</h1>
|
<h1>%i18n:@behaviour%</h1>
|
||||||
<mk-switch v-model="$store.state.settings.fetchOnScroll" @change="onChangeFetchOnScroll" text="%i18n:@fetch-on-scroll%">
|
<mk-switch v-model="fetchOnScroll" text="%i18n:@fetch-on-scroll%">
|
||||||
<span>%i18n:@fetch-on-scroll-desc%</span>
|
<span>%i18n:@fetch-on-scroll-desc%</span>
|
||||||
</mk-switch>
|
</mk-switch>
|
||||||
<mk-switch v-model="autoPopout" text="%i18n:@auto-popout%">
|
<mk-switch v-model="autoPopout" text="%i18n:@auto-popout%">
|
||||||
@ -29,7 +30,7 @@
|
|||||||
|
|
||||||
<section>
|
<section>
|
||||||
<header>%i18n:@note-visibility%</header>
|
<header>%i18n:@note-visibility%</header>
|
||||||
<mk-switch v-model="$store.state.settings.rememberNoteVisibility" @change="onChangeRememberNoteVisibility" text="%i18n:@remember-note-visibility%"/>
|
<mk-switch v-model="rememberNoteVisibility" text="%i18n:@remember-note-visibility%"/>
|
||||||
<section>
|
<section>
|
||||||
<header>%i18n:@default-note-visibility%</header>
|
<header>%i18n:@default-note-visibility%</header>
|
||||||
<ui-select v-model="defaultNoteVisibility">
|
<ui-select v-model="defaultNoteVisibility">
|
||||||
@ -59,24 +60,27 @@
|
|||||||
<button class="ui" @click="updateWallpaper">%i18n:@choose-wallpaper%</button>
|
<button class="ui" @click="updateWallpaper">%i18n:@choose-wallpaper%</button>
|
||||||
<button class="ui" @click="deleteWallpaper">%i18n:@delete-wallpaper%</button>
|
<button class="ui" @click="deleteWallpaper">%i18n:@delete-wallpaper%</button>
|
||||||
<mk-switch v-model="darkmode" text="%i18n:@dark-mode%"/>
|
<mk-switch v-model="darkmode" text="%i18n:@dark-mode%"/>
|
||||||
<mk-switch v-model="$store.state.settings.circleIcons" @change="onChangeCircleIcons" text="%i18n:@circle-icons%"/>
|
<mk-switch v-model="circleIcons" text="%i18n:@circle-icons%"/>
|
||||||
<mk-switch v-model="$store.state.settings.contrastedAcct" @change="onChangeContrastedAcct" text="%i18n:@contrasted-acct%"/>
|
<mk-switch v-model="reduceMotion" text="%i18n:common.reduce-motion%"/>
|
||||||
<mk-switch v-model="$store.state.settings.gradientWindowHeader" @change="onChangeGradientWindowHeader" text="%i18n:@gradient-window-header%"/>
|
<mk-switch v-model="contrastedAcct" text="%i18n:@contrasted-acct%"/>
|
||||||
<mk-switch v-model="$store.state.settings.iLikeSushi" @change="onChangeILikeSushi" text="%i18n:common.i-like-sushi%"/>
|
<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>
|
</div>
|
||||||
<mk-switch v-model="$store.state.settings.showPostFormOnTopOfTl" @change="onChangeShowPostFormOnTopOfTl" text="%i18n:@post-form-on-timeline%"/>
|
<mk-switch v-model="showPostFormOnTopOfTl" text="%i18n:@post-form-on-timeline%"/>
|
||||||
<mk-switch v-model="$store.state.settings.suggestRecentHashtags" @change="onChangeSuggestRecentHashtags" text="%i18n:@suggest-recent-hashtags%"/>
|
<mk-switch v-model="suggestRecentHashtags" text="%i18n:@suggest-recent-hashtags%"/>
|
||||||
<mk-switch v-model="$store.state.settings.showClockOnHeader" @change="onChangeShowClockOnHeader" text="%i18n:@show-clock-on-header%"/>
|
<mk-switch v-model="showClockOnHeader" text="%i18n:@show-clock-on-header%"/>
|
||||||
<mk-switch v-model="$store.state.settings.showReplyTarget" @change="onChangeShowReplyTarget" text="%i18n:@show-reply-target%"/>
|
<mk-switch v-model="alwaysShowNsfw" text="%i18n:common.always-show-nsfw%"/>
|
||||||
<mk-switch v-model="$store.state.settings.showMyRenotes" @change="onChangeShowMyRenotes" text="%i18n:@show-my-renotes%"/>
|
<mk-switch v-model="showReplyTarget" text="%i18n:@show-reply-target%"/>
|
||||||
<mk-switch v-model="$store.state.settings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes" text="%i18n:@show-renoted-my-notes%"/>
|
<mk-switch v-model="showMyRenotes" text="%i18n:@show-my-renotes%"/>
|
||||||
<mk-switch v-model="$store.state.settings.showLocalRenotes" @change="onChangeShowLocalRenotes" text="%i18n:@show-local-renotes%"/>
|
<mk-switch v-model="showRenotedMyNotes" text="%i18n:@show-renoted-my-notes%"/>
|
||||||
<mk-switch v-model="$store.state.settings.showMaps" @change="onChangeShowMaps" text="%i18n:@show-maps%">
|
<mk-switch v-model="showLocalRenotes" text="%i18n:@show-local-renotes%"/>
|
||||||
|
<mk-switch v-model="showMaps" text="%i18n:@show-maps%">
|
||||||
<span>%i18n:@show-maps-desc%</span>
|
<span>%i18n:@show-maps-desc%</span>
|
||||||
</mk-switch>
|
</mk-switch>
|
||||||
<mk-switch v-model="$store.state.settings.disableAnimatedMfm" @change="onChangeDisableAnimatedMfm" text="%i18n:common.disable-animated-mfm%"/>
|
<mk-switch v-model="disableAnimatedMfm" text="%i18n:common.disable-animated-mfm%"/>
|
||||||
<mk-switch v-model="$store.state.settings.games.reversi.showBoardLabels" @change="onChangeReversiBoardLabels" text="%i18n:common.show-reversi-board-labels%"/>
|
<mk-switch v-model="games_reversi_showBoardLabels" text="%i18n:common.show-reversi-board-labels%"/>
|
||||||
<mk-switch v-model="$store.state.settings.games.reversi.useContrastStones" @change="onChangeUseContrastReversiStones" text="%i18n:common.use-contrast-reversi-stones%"/>
|
<mk-switch v-model="games_reversi_useContrastStones" text="%i18n:common.use-contrast-reversi-stones%"/>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section class="web" v-show="page == 'web'">
|
<section class="web" v-show="page == 'web'">
|
||||||
@ -85,32 +89,31 @@
|
|||||||
<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>
|
||||||
|
|
||||||
<section class="web" v-show="page == 'web'">
|
<section class="web" v-show="page == 'web'">
|
||||||
<h1>%i18n:@mobile%</h1>
|
<h1>%i18n:@mobile%</h1>
|
||||||
<mk-switch v-model="$store.state.settings.disableViaMobile" @change="onChangeDisableViaMobile" text="%i18n:@disable-via-mobile%"/>
|
<mk-switch v-model="disableViaMobile" text="%i18n:@disable-via-mobile%"/>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<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>
|
||||||
@ -136,6 +139,11 @@
|
|||||||
<x-drive/>
|
<x-drive/>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
<section class="hashtags" v-show="page == 'hashtags'">
|
||||||
|
<h1>%i18n:@tags%</h1>
|
||||||
|
<x-tags/>
|
||||||
|
</section>
|
||||||
|
|
||||||
<section class="mute" v-show="page == 'mute'">
|
<section class="mute" v-show="page == 'mute'">
|
||||||
<h1>%i18n:@mute%</h1>
|
<h1>%i18n:@mute%</h1>
|
||||||
<x-mute/>
|
<x-mute/>
|
||||||
@ -205,10 +213,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>
|
||||||
@ -224,9 +228,9 @@ import XApi from './settings.api.vue';
|
|||||||
import XApps from './settings.apps.vue';
|
import XApps from './settings.apps.vue';
|
||||||
import XSignins from './settings.signins.vue';
|
import XSignins from './settings.signins.vue';
|
||||||
import XDrive from './settings.drive.vue';
|
import XDrive from './settings.drive.vue';
|
||||||
|
import XTags from './settings.tags.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: {
|
||||||
@ -237,11 +241,18 @@ export default Vue.extend({
|
|||||||
XApi,
|
XApi,
|
||||||
XApps,
|
XApps,
|
||||||
XSignins,
|
XSignins,
|
||||||
XDrive
|
XDrive,
|
||||||
|
XTags
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
initialPage: {
|
||||||
|
type: String,
|
||||||
|
required: false
|
||||||
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
page: 'profile',
|
page: this.initialPage || 'profile',
|
||||||
meta: null,
|
meta: null,
|
||||||
version,
|
version,
|
||||||
langs,
|
langs,
|
||||||
@ -250,16 +261,16 @@ export default Vue.extend({
|
|||||||
};
|
};
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
|
reduceMotion: {
|
||||||
|
get() { return this.$store.state.device.reduceMotion; },
|
||||||
|
set(value) { this.$store.commit('device/set', { key: 'reduceMotion', 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 }); }
|
||||||
},
|
},
|
||||||
|
|
||||||
defaultNoteVisibility: {
|
|
||||||
get() { return this.$store.state.settings.defaultNoteVisibility; },
|
|
||||||
set(value) { this.$store.commit('settings/set', { key: 'defaultNoteVisibility', value }); }
|
|
||||||
},
|
|
||||||
|
|
||||||
autoPopout: {
|
autoPopout: {
|
||||||
get() { return this.$store.state.device.autoPopout; },
|
get() { return this.$store.state.device.autoPopout; },
|
||||||
set(value) { this.$store.commit('device/set', { key: 'autoPopout', value }); }
|
set(value) { this.$store.commit('device/set', { key: 'autoPopout', value }); }
|
||||||
@ -298,7 +309,112 @@ export default Vue.extend({
|
|||||||
enableExperimentalFeatures: {
|
enableExperimentalFeatures: {
|
||||||
get() { return this.$store.state.device.enableExperimentalFeatures; },
|
get() { return this.$store.state.device.enableExperimentalFeatures; },
|
||||||
set(value) { this.$store.commit('device/set', { key: 'enableExperimentalFeatures', value }); }
|
set(value) { this.$store.commit('device/set', { key: 'enableExperimentalFeatures', value }); }
|
||||||
}
|
},
|
||||||
|
|
||||||
|
alwaysShowNsfw: {
|
||||||
|
get() { return this.$store.state.device.alwaysShowNsfw; },
|
||||||
|
set(value) { this.$store.commit('device/set', { key: 'alwaysShowNsfw', value }); }
|
||||||
|
},
|
||||||
|
|
||||||
|
fetchOnScroll: {
|
||||||
|
get() { return this.$store.state.settings.fetchOnScroll; },
|
||||||
|
set(value) { this.$store.dispatch('settings/set', { key: 'fetchOnScroll', value }); }
|
||||||
|
},
|
||||||
|
|
||||||
|
rememberNoteVisibility: {
|
||||||
|
get() { return this.$store.state.settings.rememberNoteVisibility; },
|
||||||
|
set(value) { this.$store.dispatch('settings/set', { key: 'rememberNoteVisibility', value }); }
|
||||||
|
},
|
||||||
|
|
||||||
|
defaultNoteVisibility: {
|
||||||
|
get() { return this.$store.state.settings.defaultNoteVisibility; },
|
||||||
|
set(value) { this.$store.dispatch('settings/set', { key: 'defaultNoteVisibility', value }); }
|
||||||
|
},
|
||||||
|
|
||||||
|
showReplyTarget: {
|
||||||
|
get() { return this.$store.state.settings.showReplyTarget; },
|
||||||
|
set(value) { this.$store.dispatch('settings/set', { key: 'showReplyTarget', value }); }
|
||||||
|
},
|
||||||
|
|
||||||
|
showMyRenotes: {
|
||||||
|
get() { return this.$store.state.settings.showMyRenotes; },
|
||||||
|
set(value) { this.$store.dispatch('settings/set', { key: 'showMyRenotes', value }); }
|
||||||
|
},
|
||||||
|
|
||||||
|
showRenotedMyNotes: {
|
||||||
|
get() { return this.$store.state.settings.showRenotedMyNotes; },
|
||||||
|
set(value) { this.$store.dispatch('settings/set', { key: 'showRenotedMyNotes', value }); }
|
||||||
|
},
|
||||||
|
|
||||||
|
showLocalRenotes: {
|
||||||
|
get() { return this.$store.state.settings.showLocalRenotes; },
|
||||||
|
set(value) { this.$store.dispatch('settings/set', { key: 'showLocalRenotes', value }); }
|
||||||
|
},
|
||||||
|
|
||||||
|
showPostFormOnTopOfTl: {
|
||||||
|
get() { return this.$store.state.settings.showPostFormOnTopOfTl; },
|
||||||
|
set(value) { this.$store.dispatch('settings/set', { key: 'showPostFormOnTopOfTl', value }); }
|
||||||
|
},
|
||||||
|
|
||||||
|
suggestRecentHashtags: {
|
||||||
|
get() { return this.$store.state.settings.suggestRecentHashtags; },
|
||||||
|
set(value) { this.$store.dispatch('settings/set', { key: 'suggestRecentHashtags', value }); }
|
||||||
|
},
|
||||||
|
|
||||||
|
showClockOnHeader: {
|
||||||
|
get() { return this.$store.state.settings.showClockOnHeader; },
|
||||||
|
set(value) { this.$store.dispatch('settings/set', { key: 'showClockOnHeader', value }); }
|
||||||
|
},
|
||||||
|
|
||||||
|
showMaps: {
|
||||||
|
get() { return this.$store.state.settings.showMaps; },
|
||||||
|
set(value) { this.$store.dispatch('settings/set', { key: 'showMaps', value }); }
|
||||||
|
},
|
||||||
|
|
||||||
|
circleIcons: {
|
||||||
|
get() { return this.$store.state.settings.circleIcons; },
|
||||||
|
set(value) { this.$store.dispatch('settings/set', { key: 'circleIcons', value }); }
|
||||||
|
},
|
||||||
|
|
||||||
|
contrastedAcct: {
|
||||||
|
get() { return this.$store.state.settings.contrastedAcct; },
|
||||||
|
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 }); }
|
||||||
|
},
|
||||||
|
|
||||||
|
games_reversi_showBoardLabels: {
|
||||||
|
get() { return this.$store.state.settings.games.reversi.showBoardLabels; },
|
||||||
|
set(value) { this.$store.dispatch('settings/set', { key: 'games.reversi.showBoardLabels', value }); }
|
||||||
|
},
|
||||||
|
|
||||||
|
games_reversi_useContrastStones: {
|
||||||
|
get() { return this.$store.state.settings.games.reversi.useContrastStones; },
|
||||||
|
set(value) { this.$store.dispatch('settings/set', { key: 'games.reversi.useContrastStones', value }); }
|
||||||
|
},
|
||||||
|
|
||||||
|
disableAnimatedMfm: {
|
||||||
|
get() { return this.$store.state.settings.disableAnimatedMfm; },
|
||||||
|
set(value) { this.$store.dispatch('settings/set', { key: 'disableAnimatedMfm', value }); }
|
||||||
|
},
|
||||||
|
|
||||||
|
disableViaMobile: {
|
||||||
|
get() { return this.$store.state.settings.disableViaMobile; },
|
||||||
|
set(value) { this.$store.dispatch('settings/set', { key: 'disableViaMobile', value }); }
|
||||||
|
},
|
||||||
|
|
||||||
|
gradientWindowHeader: {
|
||||||
|
get() { return this.$store.state.settings.gradientWindowHeader; },
|
||||||
|
set(value) { this.$store.dispatch('settings/set', { key: 'gradientWindowHeader', value }); }
|
||||||
|
},
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
(this as any).os.getMeta().then(meta => {
|
(this as any).os.getMeta().then(meta => {
|
||||||
@ -306,9 +422,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');
|
||||||
@ -327,125 +440,11 @@ export default Vue.extend({
|
|||||||
wallpaperId: null
|
wallpaperId: null
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
onChangeFetchOnScroll(v) {
|
|
||||||
this.$store.dispatch('settings/set', {
|
|
||||||
key: 'fetchOnScroll',
|
|
||||||
value: v
|
|
||||||
});
|
|
||||||
},
|
|
||||||
onChangeRememberNoteVisibility(v) {
|
|
||||||
this.$store.dispatch('settings/set', {
|
|
||||||
key: 'rememberNoteVisibility',
|
|
||||||
value: v
|
|
||||||
});
|
|
||||||
},
|
|
||||||
onChangeAutoWatch(v) {
|
onChangeAutoWatch(v) {
|
||||||
(this as any).api('i/update', {
|
(this as any).api('i/update', {
|
||||||
autoWatch: v
|
autoWatch: v
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
onChangeDark(v) {
|
|
||||||
this.$store.dispatch('settings/set', {
|
|
||||||
key: 'dark',
|
|
||||||
value: v
|
|
||||||
});
|
|
||||||
},
|
|
||||||
onChangeShowPostFormOnTopOfTl(v) {
|
|
||||||
this.$store.dispatch('settings/set', {
|
|
||||||
key: 'showPostFormOnTopOfTl',
|
|
||||||
value: v
|
|
||||||
});
|
|
||||||
},
|
|
||||||
onChangeSuggestRecentHashtags(v) {
|
|
||||||
this.$store.dispatch('settings/set', {
|
|
||||||
key: 'suggestRecentHashtags',
|
|
||||||
value: v
|
|
||||||
});
|
|
||||||
},
|
|
||||||
onChangeShowClockOnHeader(v) {
|
|
||||||
this.$store.dispatch('settings/set', {
|
|
||||||
key: 'showClockOnHeader',
|
|
||||||
value: v
|
|
||||||
});
|
|
||||||
},
|
|
||||||
onChangeShowReplyTarget(v) {
|
|
||||||
this.$store.dispatch('settings/set', {
|
|
||||||
key: 'showReplyTarget',
|
|
||||||
value: v
|
|
||||||
});
|
|
||||||
},
|
|
||||||
onChangeShowMyRenotes(v) {
|
|
||||||
this.$store.dispatch('settings/set', {
|
|
||||||
key: 'showMyRenotes',
|
|
||||||
value: v
|
|
||||||
});
|
|
||||||
},
|
|
||||||
onChangeShowRenotedMyNotes(v) {
|
|
||||||
this.$store.dispatch('settings/set', {
|
|
||||||
key: 'showRenotedMyNotes',
|
|
||||||
value: v
|
|
||||||
});
|
|
||||||
},
|
|
||||||
onChangeShowLocalRenotes(v) {
|
|
||||||
this.$store.dispatch('settings/set', {
|
|
||||||
key: 'showLocalRenotes',
|
|
||||||
value: v
|
|
||||||
});
|
|
||||||
},
|
|
||||||
onChangeShowMaps(v) {
|
|
||||||
this.$store.dispatch('settings/set', {
|
|
||||||
key: 'showMaps',
|
|
||||||
value: v
|
|
||||||
});
|
|
||||||
},
|
|
||||||
onChangeCircleIcons(v) {
|
|
||||||
this.$store.dispatch('settings/set', {
|
|
||||||
key: 'circleIcons',
|
|
||||||
value: v
|
|
||||||
});
|
|
||||||
},
|
|
||||||
onChangeContrastedAcct(v) {
|
|
||||||
this.$store.dispatch('settings/set', {
|
|
||||||
key: 'contrastedAcct',
|
|
||||||
value: v
|
|
||||||
});
|
|
||||||
},
|
|
||||||
onChangeILikeSushi(v) {
|
|
||||||
this.$store.dispatch('settings/set', {
|
|
||||||
key: 'iLikeSushi',
|
|
||||||
value: v
|
|
||||||
});
|
|
||||||
},
|
|
||||||
onChangeReversiBoardLabels(v) {
|
|
||||||
this.$store.dispatch('settings/set', {
|
|
||||||
key: 'games.reversi.showBoardLabels',
|
|
||||||
value: v
|
|
||||||
});
|
|
||||||
},
|
|
||||||
onChangeUseContrastReversiStones(v) {
|
|
||||||
this.$store.dispatch('settings/set', {
|
|
||||||
key: 'games.reversi.useContrastStones',
|
|
||||||
value: v
|
|
||||||
});
|
|
||||||
},
|
|
||||||
onChangeDisableAnimatedMfm(v) {
|
|
||||||
this.$store.dispatch('settings/set', {
|
|
||||||
key: 'disableAnimatedMfm',
|
|
||||||
value: v
|
|
||||||
});
|
|
||||||
},
|
|
||||||
onChangeGradientWindowHeader(v) {
|
|
||||||
this.$store.dispatch('settings/set', {
|
|
||||||
key: 'gradientWindowHeader',
|
|
||||||
value: v
|
|
||||||
});
|
|
||||||
},
|
|
||||||
onChangeDisableViaMobile(v) {
|
|
||||||
this.$store.dispatch('settings/set', {
|
|
||||||
key: 'disableViaMobile',
|
|
||||||
value: v
|
|
||||||
});
|
|
||||||
},
|
|
||||||
checkForUpdate() {
|
checkForUpdate() {
|
||||||
this.checkingForUpdate = true;
|
this.checkingForUpdate = true;
|
||||||
checkForUpdate((this as any).os, true, true).then(newer => {
|
checkForUpdate((this as any).os, true, true).then(newer => {
|
||||||
|
@ -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>
|
|
@ -15,6 +15,7 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
|
import { HashtagStream } from '../../../common/scripts/streaming/hashtag';
|
||||||
|
|
||||||
const fetchLimit = 10;
|
const fetchLimit = 10;
|
||||||
|
|
||||||
@ -23,6 +24,9 @@ export default Vue.extend({
|
|||||||
src: {
|
src: {
|
||||||
type: String,
|
type: String,
|
||||||
required: true
|
required: true
|
||||||
|
},
|
||||||
|
tagTl: {
|
||||||
|
required: false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -31,9 +35,17 @@ export default Vue.extend({
|
|||||||
fetching: true,
|
fetching: true,
|
||||||
moreFetching: false,
|
moreFetching: false,
|
||||||
existMore: false,
|
existMore: false,
|
||||||
|
streamManager: null,
|
||||||
connection: null,
|
connection: null,
|
||||||
connectionId: null,
|
connectionId: null,
|
||||||
date: null
|
date: null,
|
||||||
|
baseQuery: {
|
||||||
|
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
||||||
|
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
|
||||||
|
includeLocalRenotes: this.$store.state.settings.showLocalRenotes
|
||||||
|
},
|
||||||
|
query: {},
|
||||||
|
endpoint: null
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -42,53 +54,109 @@ export default Vue.extend({
|
|||||||
return this.$store.state.i.followingCount == 0;
|
return this.$store.state.i.followingCount == 0;
|
||||||
},
|
},
|
||||||
|
|
||||||
stream(): any {
|
|
||||||
switch (this.src) {
|
|
||||||
case 'home': return (this as any).os.stream;
|
|
||||||
case 'local': return (this as any).os.streams.localTimelineStream;
|
|
||||||
case 'hybrid': return (this as any).os.streams.hybridTimelineStream;
|
|
||||||
case 'global': return (this as any).os.streams.globalTimelineStream;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
endpoint(): string {
|
|
||||||
switch (this.src) {
|
|
||||||
case 'home': return 'notes/timeline';
|
|
||||||
case 'local': return 'notes/local-timeline';
|
|
||||||
case 'hybrid': return 'notes/hybrid-timeline';
|
|
||||||
case 'global': return 'notes/global-timeline';
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
canFetchMore(): boolean {
|
canFetchMore(): boolean {
|
||||||
return !this.moreFetching && !this.fetching && this.existMore;
|
return !this.moreFetching && !this.fetching && this.existMore;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
mounted() {
|
mounted() {
|
||||||
this.connection = this.stream.getConnection();
|
const prepend = note => {
|
||||||
this.connectionId = this.stream.use();
|
(this.$refs.timeline as any).prepend(note);
|
||||||
|
};
|
||||||
|
|
||||||
this.connection.on('note', this.onNote);
|
if (this.src == 'tag') {
|
||||||
if (this.src == 'home') {
|
this.endpoint = 'notes/search_by_tag';
|
||||||
this.connection.on('follow', this.onChangeFollowing);
|
this.query = {
|
||||||
this.connection.on('unfollow', this.onChangeFollowing);
|
query: this.tagTl.query
|
||||||
|
};
|
||||||
|
this.connection = new HashtagStream((this as any).os, this.$store.state.i, this.tagTl.query);
|
||||||
|
this.connection.on('note', prepend);
|
||||||
|
this.$once('beforeDestroy', () => {
|
||||||
|
this.connection.off('note', prepend);
|
||||||
|
this.connection.close();
|
||||||
|
});
|
||||||
|
} else if (this.src == 'home') {
|
||||||
|
this.endpoint = 'notes/timeline';
|
||||||
|
const onChangeFollowing = () => {
|
||||||
|
this.fetch();
|
||||||
|
};
|
||||||
|
this.streamManager = (this as any).os.stream;
|
||||||
|
this.connection = this.streamManager.getConnection();
|
||||||
|
this.connectionId = this.streamManager.use();
|
||||||
|
this.connection.on('note', prepend);
|
||||||
|
this.connection.on('follow', onChangeFollowing);
|
||||||
|
this.connection.on('unfollow', onChangeFollowing);
|
||||||
|
this.$once('beforeDestroy', () => {
|
||||||
|
this.connection.off('note', prepend);
|
||||||
|
this.connection.off('follow', onChangeFollowing);
|
||||||
|
this.connection.off('unfollow', onChangeFollowing);
|
||||||
|
this.streamManager.dispose(this.connectionId);
|
||||||
|
});
|
||||||
|
} else if (this.src == 'local') {
|
||||||
|
this.endpoint = 'notes/local-timeline';
|
||||||
|
this.streamManager = (this as any).os.streams.localTimelineStream;
|
||||||
|
this.connection = this.streamManager.getConnection();
|
||||||
|
this.connectionId = this.streamManager.use();
|
||||||
|
this.connection.on('note', prepend);
|
||||||
|
this.$once('beforeDestroy', () => {
|
||||||
|
this.connection.off('note', prepend);
|
||||||
|
this.streamManager.dispose(this.connectionId);
|
||||||
|
});
|
||||||
|
} else if (this.src == 'hybrid') {
|
||||||
|
this.endpoint = 'notes/hybrid-timeline';
|
||||||
|
this.streamManager = (this as any).os.streams.hybridTimelineStream;
|
||||||
|
this.connection = this.streamManager.getConnection();
|
||||||
|
this.connectionId = this.streamManager.use();
|
||||||
|
this.connection.on('note', prepend);
|
||||||
|
this.$once('beforeDestroy', () => {
|
||||||
|
this.connection.off('note', prepend);
|
||||||
|
this.streamManager.dispose(this.connectionId);
|
||||||
|
});
|
||||||
|
} else if (this.src == 'global') {
|
||||||
|
this.endpoint = 'notes/global-timeline';
|
||||||
|
this.streamManager = (this as any).os.streams.globalTimelineStream;
|
||||||
|
this.connection = this.streamManager.getConnection();
|
||||||
|
this.connectionId = this.streamManager.use();
|
||||||
|
this.connection.on('note', prepend);
|
||||||
|
this.$once('beforeDestroy', () => {
|
||||||
|
this.connection.off('note', prepend);
|
||||||
|
this.streamManager.dispose(this.connectionId);
|
||||||
|
});
|
||||||
|
} else if (this.src == 'mentions') {
|
||||||
|
this.endpoint = 'notes/mentions';
|
||||||
|
this.streamManager = (this as any).os.stream;
|
||||||
|
this.connection = this.streamManager.getConnection();
|
||||||
|
this.connectionId = this.streamManager.use();
|
||||||
|
this.connection.on('mention', prepend);
|
||||||
|
this.$once('beforeDestroy', () => {
|
||||||
|
this.connection.off('mention', prepend);
|
||||||
|
this.streamManager.dispose(this.connectionId);
|
||||||
|
});
|
||||||
|
} else if (this.src == 'messages') {
|
||||||
|
this.endpoint = 'notes/mentions';
|
||||||
|
this.query = {
|
||||||
|
visibility: 'specified'
|
||||||
|
};
|
||||||
|
const onNote = note => {
|
||||||
|
if (note.visibility == 'specified') {
|
||||||
|
prepend(note);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
this.streamManager = (this as any).os.stream;
|
||||||
|
this.connection = this.streamManager.getConnection();
|
||||||
|
this.connectionId = this.streamManager.use();
|
||||||
|
this.connection.on('mention', onNote);
|
||||||
|
this.$once('beforeDestroy', () => {
|
||||||
|
this.connection.off('mention', onNote);
|
||||||
|
this.streamManager.dispose(this.connectionId);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
document.addEventListener('keydown', this.onKeydown);
|
|
||||||
|
|
||||||
this.fetch();
|
this.fetch();
|
||||||
},
|
},
|
||||||
|
|
||||||
beforeDestroy() {
|
beforeDestroy() {
|
||||||
this.connection.off('note', this.onNote);
|
this.$emit('beforeDestroy');
|
||||||
if (this.src == 'home') {
|
|
||||||
this.connection.off('follow', this.onChangeFollowing);
|
|
||||||
this.connection.off('unfollow', this.onChangeFollowing);
|
|
||||||
}
|
|
||||||
this.stream.dispose(this.connectionId);
|
|
||||||
|
|
||||||
document.removeEventListener('keydown', this.onKeydown);
|
|
||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
@ -96,13 +164,10 @@ export default Vue.extend({
|
|||||||
this.fetching = true;
|
this.fetching = true;
|
||||||
|
|
||||||
(this.$refs.timeline as any).init(() => new Promise((res, rej) => {
|
(this.$refs.timeline as any).init(() => new Promise((res, rej) => {
|
||||||
(this as any).api(this.endpoint, {
|
(this as any).api(this.endpoint, Object.assign({
|
||||||
limit: fetchLimit + 1,
|
limit: fetchLimit + 1,
|
||||||
untilDate: this.date ? this.date.getTime() : undefined,
|
untilDate: this.date ? this.date.getTime() : undefined
|
||||||
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
}, this.baseQuery, this.query)).then(notes => {
|
||||||
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
|
|
||||||
includeLocalRenotes: this.$store.state.settings.showLocalRenotes
|
|
||||||
}).then(notes => {
|
|
||||||
if (notes.length == fetchLimit + 1) {
|
if (notes.length == fetchLimit + 1) {
|
||||||
notes.pop();
|
notes.pop();
|
||||||
this.existMore = true;
|
this.existMore = true;
|
||||||
@ -119,13 +184,10 @@ export default Vue.extend({
|
|||||||
|
|
||||||
this.moreFetching = true;
|
this.moreFetching = true;
|
||||||
|
|
||||||
const promise = (this as any).api(this.endpoint, {
|
const promise = (this as any).api(this.endpoint, Object.assign({
|
||||||
limit: fetchLimit + 1,
|
limit: fetchLimit + 1,
|
||||||
untilId: (this.$refs.timeline as any).tail().id,
|
untilId: (this.$refs.timeline as any).tail().id
|
||||||
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
}, this.baseQuery, this.query));
|
||||||
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
|
|
||||||
includeLocalRenotes: this.$store.state.settings.showLocalRenotes
|
|
||||||
});
|
|
||||||
|
|
||||||
promise.then(notes => {
|
promise.then(notes => {
|
||||||
if (notes.length == fetchLimit + 1) {
|
if (notes.length == fetchLimit + 1) {
|
||||||
@ -140,15 +202,6 @@ export default Vue.extend({
|
|||||||
return promise;
|
return promise;
|
||||||
},
|
},
|
||||||
|
|
||||||
onNote(note) {
|
|
||||||
// Prepend a note
|
|
||||||
(this.$refs.timeline as any).prepend(note);
|
|
||||||
},
|
|
||||||
|
|
||||||
onChangeFollowing() {
|
|
||||||
this.fetch();
|
|
||||||
},
|
|
||||||
|
|
||||||
focus() {
|
focus() {
|
||||||
(this.$refs.timeline as any).focus();
|
(this.$refs.timeline as any).focus();
|
||||||
},
|
},
|
||||||
@ -156,14 +209,6 @@ export default Vue.extend({
|
|||||||
warp(date) {
|
warp(date) {
|
||||||
this.date = date;
|
this.date = date;
|
||||||
this.fetch();
|
this.fetch();
|
||||||
},
|
|
||||||
|
|
||||||
onKeydown(e) {
|
|
||||||
if (e.target.tagName != 'INPUT' && e.target.tagName != 'TEXTAREA') {
|
|
||||||
if (e.which == 84) { // t
|
|
||||||
this.focus();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -5,13 +5,22 @@
|
|||||||
<span :data-active="src == 'local'" @click="src = 'local'" v-if="enableLocalTimeline">%fa:R comments% %i18n:@local%</span>
|
<span :data-active="src == 'local'" @click="src = 'local'" v-if="enableLocalTimeline">%fa:R comments% %i18n:@local%</span>
|
||||||
<span :data-active="src == 'hybrid'" @click="src = 'hybrid'" v-if="enableLocalTimeline">%fa:share-alt% %i18n:@hybrid%</span>
|
<span :data-active="src == 'hybrid'" @click="src = 'hybrid'" v-if="enableLocalTimeline">%fa:share-alt% %i18n:@hybrid%</span>
|
||||||
<span :data-active="src == 'global'" @click="src = 'global'">%fa:globe% %i18n:@global%</span>
|
<span :data-active="src == 'global'" @click="src = 'global'">%fa:globe% %i18n:@global%</span>
|
||||||
|
<span :data-active="src == 'tag'" @click="src = 'tag'" v-if="tagTl">%fa:hashtag% {{ tagTl.title }}</span>
|
||||||
<span :data-active="src == 'list'" @click="src = 'list'" v-if="list">%fa:list% {{ list.title }}</span>
|
<span :data-active="src == 'list'" @click="src = 'list'" v-if="list">%fa:list% {{ list.title }}</span>
|
||||||
<button @click="chooseList" title="%i18n:@list%">%fa:list%</button>
|
<div class="buttons">
|
||||||
|
<button :data-active="src == 'mentions'" @click="src = 'mentions'" title="%i18n:@mentions%">%fa:at%<i class="badge" v-if="$store.state.i.hasUnreadMentions">%fa:circle%</i></button>
|
||||||
|
<button :data-active="src == 'messages'" @click="src = 'messages'" title="%i18n:@messages%">%fa:envelope R%<i class="badge" v-if="$store.state.i.hasUnreadSpecifiedNotes">%fa:circle%</i></button>
|
||||||
|
<button @click="chooseTag" title="%i18n:@hashtag%" ref="tagButton">%fa:hashtag%</button>
|
||||||
|
<button @click="chooseList" title="%i18n:@list%" ref="listButton">%fa:list%</button>
|
||||||
|
</div>
|
||||||
</header>
|
</header>
|
||||||
<x-core v-if="src == 'home'" ref="tl" key="home" src="home"/>
|
<x-core v-if="src == 'home'" ref="tl" key="home" src="home"/>
|
||||||
<x-core v-if="src == 'local'" ref="tl" key="local" src="local"/>
|
<x-core v-if="src == 'local'" ref="tl" key="local" src="local"/>
|
||||||
<x-core v-if="src == 'hybrid'" ref="tl" key="hybrid" src="hybrid"/>
|
<x-core v-if="src == 'hybrid'" ref="tl" key="hybrid" src="hybrid"/>
|
||||||
<x-core v-if="src == 'global'" ref="tl" key="global" src="global"/>
|
<x-core v-if="src == 'global'" ref="tl" key="global" src="global"/>
|
||||||
|
<x-core v-if="src == 'mentions'" ref="tl" key="mentions" src="mentions"/>
|
||||||
|
<x-core v-if="src == 'messages'" ref="tl" key="messages" src="messages"/>
|
||||||
|
<x-core v-if="src == 'tag'" ref="tl" key="tag" src="tag" :tag-tl="tagTl"/>
|
||||||
<mk-user-list-timeline v-if="src == 'list'" ref="tl" :key="list.id" :list="list"/>
|
<mk-user-list-timeline v-if="src == 'list'" ref="tl" :key="list.id" :list="list"/>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@ -19,7 +28,8 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import XCore from './timeline.core.vue';
|
import XCore from './timeline.core.vue';
|
||||||
import MkUserListsWindow from './user-lists-window.vue';
|
import Menu from '../../../common/views/components/menu.vue';
|
||||||
|
import MkSettingsWindow from './settings-window.vue';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
components: {
|
components: {
|
||||||
@ -30,6 +40,7 @@ export default Vue.extend({
|
|||||||
return {
|
return {
|
||||||
src: 'home',
|
src: 'home',
|
||||||
list: null,
|
list: null,
|
||||||
|
tagTl: null,
|
||||||
enableLocalTimeline: false
|
enableLocalTimeline: false
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
@ -39,8 +50,14 @@ export default Vue.extend({
|
|||||||
this.saveSrc();
|
this.saveSrc();
|
||||||
},
|
},
|
||||||
|
|
||||||
list() {
|
list(x) {
|
||||||
this.saveSrc();
|
this.saveSrc();
|
||||||
|
if (x != null) this.tagTl = null;
|
||||||
|
},
|
||||||
|
|
||||||
|
tagTl(x) {
|
||||||
|
this.saveSrc();
|
||||||
|
if (x != null) this.list = null;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -53,6 +70,8 @@ export default Vue.extend({
|
|||||||
this.src = this.$store.state.device.tl.src;
|
this.src = this.$store.state.device.tl.src;
|
||||||
if (this.src == 'list') {
|
if (this.src == 'list') {
|
||||||
this.list = this.$store.state.device.tl.arg;
|
this.list = this.$store.state.device.tl.arg;
|
||||||
|
} else if (this.src == 'tag') {
|
||||||
|
this.tagTl = this.$store.state.device.tl.arg;
|
||||||
}
|
}
|
||||||
} else if (this.$store.state.i.followingCount == 0) {
|
} else if (this.$store.state.i.followingCount == 0) {
|
||||||
this.src = 'hybrid';
|
this.src = 'hybrid';
|
||||||
@ -69,20 +88,86 @@ export default Vue.extend({
|
|||||||
saveSrc() {
|
saveSrc() {
|
||||||
this.$store.commit('device/setTl', {
|
this.$store.commit('device/setTl', {
|
||||||
src: this.src,
|
src: this.src,
|
||||||
arg: this.list
|
arg: this.src == 'list' ? this.list : this.tagTl
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
focus() {
|
||||||
|
(this.$refs.tl as any).focus();
|
||||||
|
},
|
||||||
|
|
||||||
warp(date) {
|
warp(date) {
|
||||||
(this.$refs.tl as any).warp(date);
|
(this.$refs.tl as any).warp(date);
|
||||||
},
|
},
|
||||||
|
|
||||||
chooseList() {
|
async chooseList() {
|
||||||
const w = (this as any).os.new(MkUserListsWindow);
|
const lists = await (this as any).api('users/lists/list');
|
||||||
w.$once('choosen', list => {
|
|
||||||
this.list = list;
|
let menu = [{
|
||||||
this.src = 'list';
|
icon: '%fa:plus%',
|
||||||
w.close();
|
text: '%i18n:@add-list%',
|
||||||
|
action: () => {
|
||||||
|
(this as any).apis.input({
|
||||||
|
title: '%i18n:@list-name%',
|
||||||
|
}).then(async title => {
|
||||||
|
const list = await (this as any).api('users/lists/create', {
|
||||||
|
title
|
||||||
|
});
|
||||||
|
|
||||||
|
this.list = list;
|
||||||
|
this.src = 'list';
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}];
|
||||||
|
|
||||||
|
if (lists.length > 0) {
|
||||||
|
menu.push(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
menu = menu.concat(lists.map(list => ({
|
||||||
|
icon: '%fa:list%',
|
||||||
|
text: list.title,
|
||||||
|
action: () => {
|
||||||
|
this.list = list;
|
||||||
|
this.src = 'list';
|
||||||
|
}
|
||||||
|
})));
|
||||||
|
|
||||||
|
this.os.new(Menu, {
|
||||||
|
source: this.$refs.listButton,
|
||||||
|
compact: false,
|
||||||
|
items: menu
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
chooseTag() {
|
||||||
|
let menu = [{
|
||||||
|
icon: '%fa:plus%',
|
||||||
|
text: '%i18n:@add-tag-timeline%',
|
||||||
|
action: () => {
|
||||||
|
(this as any).os.new(MkSettingsWindow, {
|
||||||
|
initialPage: 'hashtags'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}];
|
||||||
|
|
||||||
|
if (this.$store.state.settings.tagTimelines.length > 0) {
|
||||||
|
menu.push(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
menu = menu.concat(this.$store.state.settings.tagTimelines.map(t => ({
|
||||||
|
icon: '%fa:hashtag%',
|
||||||
|
text: t.title,
|
||||||
|
action: () => {
|
||||||
|
this.tagTl = t;
|
||||||
|
this.src = 'tag';
|
||||||
|
}
|
||||||
|
})));
|
||||||
|
|
||||||
|
this.os.new(Menu, {
|
||||||
|
source: this.$refs.tagButton,
|
||||||
|
compact: false,
|
||||||
|
items: menu
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -104,22 +189,45 @@ root(isDark)
|
|||||||
border-radius 6px 6px 0 0
|
border-radius 6px 6px 0 0
|
||||||
box-shadow 0 1px isDark ? rgba(#000, 0.15) : rgba(#000, 0.08)
|
box-shadow 0 1px isDark ? rgba(#000, 0.15) : rgba(#000, 0.08)
|
||||||
|
|
||||||
> button
|
> .buttons
|
||||||
position absolute
|
position absolute
|
||||||
z-index 2
|
z-index 2
|
||||||
top 0
|
top 0
|
||||||
right 0
|
right 0
|
||||||
padding 0
|
padding-right 8px
|
||||||
width 42px
|
|
||||||
font-size 0.9em
|
|
||||||
line-height 42px
|
|
||||||
color isDark ? #9baec8 : #ccc
|
|
||||||
|
|
||||||
&:hover
|
> button
|
||||||
color isDark ? #b2c1d5 : #aaa
|
padding 0 8px
|
||||||
|
font-size 0.9em
|
||||||
|
line-height 42px
|
||||||
|
color isDark ? #9baec8 : #ccc
|
||||||
|
|
||||||
&:active
|
> .badge
|
||||||
color isDark ? #b2c1d5 : #999
|
position absolute
|
||||||
|
top -4px
|
||||||
|
right 4px
|
||||||
|
font-size 10px
|
||||||
|
color $theme-color
|
||||||
|
|
||||||
|
&:hover
|
||||||
|
color isDark ? #b2c1d5 : #aaa
|
||||||
|
|
||||||
|
&:active
|
||||||
|
color isDark ? #b2c1d5 : #999
|
||||||
|
|
||||||
|
&[data-active]
|
||||||
|
color $theme-color
|
||||||
|
cursor default
|
||||||
|
|
||||||
|
&:before
|
||||||
|
content ""
|
||||||
|
display block
|
||||||
|
position absolute
|
||||||
|
bottom 0
|
||||||
|
left 0
|
||||||
|
width 100%
|
||||||
|
height 2px
|
||||||
|
background $theme-color
|
||||||
|
|
||||||
> span
|
> span
|
||||||
display inline-block
|
display inline-block
|
||||||
|
@ -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);
|
||||||
});
|
});
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="account">
|
<div class="account" v-hotkey.global="keymap">
|
||||||
<button class="header" :data-active="isOpen" @click="toggle">
|
<button class="header" :data-active="isOpen" @click="toggle">
|
||||||
<span class="username">{{ $store.state.i.username }}<template v-if="!isOpen">%fa:angle-down%</template><template v-if="isOpen">%fa:angle-up%</template></span>
|
<span class="username">{{ $store.state.i.username }}<template v-if="!isOpen">%fa:angle-down%</template><template v-if="isOpen">%fa:angle-up%</template></span>
|
||||||
<mk-avatar class="avatar" :user="$store.state.i"/>
|
<mk-avatar class="avatar" :user="$store.state.i"/>
|
||||||
@ -63,6 +63,13 @@ export default Vue.extend({
|
|||||||
isOpen: false
|
isOpen: false
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
computed: {
|
||||||
|
keymap(): any {
|
||||||
|
return {
|
||||||
|
'a|m': this.toggle
|
||||||
|
};
|
||||||
|
}
|
||||||
|
},
|
||||||
beforeDestroy() {
|
beforeDestroy() {
|
||||||
this.close();
|
this.close();
|
||||||
},
|
},
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="notifications">
|
<div class="notifications" v-hotkey.global="keymap">
|
||||||
<button :data-active="isOpen" @click="toggle" title="%i18n:@title%">
|
<button :data-active="isOpen" @click="toggle" title="%i18n:@title%">
|
||||||
%fa:R bell%<template v-if="hasUnreadNotification">%fa:circle%</template>
|
%fa:R bell%<template v-if="hasUnreadNotification">%fa:circle%</template>
|
||||||
</button>
|
</button>
|
||||||
@ -19,11 +19,19 @@ export default Vue.extend({
|
|||||||
isOpen: false
|
isOpen: false
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
computed: {
|
computed: {
|
||||||
hasUnreadNotification(): boolean {
|
hasUnreadNotification(): boolean {
|
||||||
return this.$store.getters.isSignedIn && this.$store.state.i.hasUnreadNotification;
|
return this.$store.getters.isSignedIn && this.$store.state.i.hasUnreadNotification;
|
||||||
|
},
|
||||||
|
|
||||||
|
keymap(): any {
|
||||||
|
return {
|
||||||
|
'shift+n': this.toggle
|
||||||
|
};
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
toggle() {
|
toggle() {
|
||||||
this.isOpen ? this.close() : this.open();
|
this.isOpen ? this.close() : this.open();
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mk-ui" :style="style">
|
<div class="mk-ui" :style="style" v-hotkey.global="keymap">
|
||||||
<x-header class="header" v-show="!zenMode"/>
|
<x-header class="header" v-show="!zenMode"/>
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<slot></slot>
|
<slot></slot>
|
||||||
@ -16,11 +16,13 @@ export default Vue.extend({
|
|||||||
components: {
|
components: {
|
||||||
XHeader
|
XHeader
|
||||||
},
|
},
|
||||||
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
zenMode: false
|
zenMode: false
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
computed: {
|
computed: {
|
||||||
style(): any {
|
style(): any {
|
||||||
if (!this.$store.getters.isSignedIn || this.$store.state.i.wallpaperUrl == null) return {};
|
if (!this.$store.getters.isSignedIn || this.$store.state.i.wallpaperUrl == null) return {};
|
||||||
@ -28,27 +30,24 @@ export default Vue.extend({
|
|||||||
backgroundColor: this.$store.state.i.wallpaperColor && this.$store.state.i.wallpaperColor.length == 3 ? `rgb(${ this.$store.state.i.wallpaperColor.join(',') })` : null,
|
backgroundColor: this.$store.state.i.wallpaperColor && this.$store.state.i.wallpaperColor.length == 3 ? `rgb(${ this.$store.state.i.wallpaperColor.join(',') })` : null,
|
||||||
backgroundImage: `url(${ this.$store.state.i.wallpaperUrl })`
|
backgroundImage: `url(${ this.$store.state.i.wallpaperUrl })`
|
||||||
};
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
keymap(): any {
|
||||||
|
return {
|
||||||
|
'p': this.post,
|
||||||
|
'n': this.post,
|
||||||
|
'z': this.toggleZenMode
|
||||||
|
};
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
|
||||||
document.addEventListener('keydown', this.onKeydown);
|
|
||||||
},
|
|
||||||
beforeDestroy() {
|
|
||||||
document.removeEventListener('keydown', this.onKeydown);
|
|
||||||
},
|
|
||||||
methods: {
|
methods: {
|
||||||
onKeydown(e) {
|
post() {
|
||||||
if (e.target.tagName == 'INPUT' || e.target.tagName == 'TEXTAREA') return;
|
(this as any).apis.post();
|
||||||
|
},
|
||||||
|
|
||||||
if (e.which == 80 || e.which == 78) { // p or n
|
toggleZenMode() {
|
||||||
e.preventDefault();
|
this.zenMode = !this.zenMode;
|
||||||
(this as any).apis.post();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (e.which == 90) { // z
|
|
||||||
e.preventDefault();
|
|
||||||
this.zenMode = !this.zenMode;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<mk-window ref="window" is-modal width="450px" height="500px" @closed="$destroy">
|
<mk-window ref="window" is-modal width="450px" height="500px" @closed="destroyDom">
|
||||||
<span slot="header">%fa:list% %i18n:@title%</span>
|
<span slot="header">%fa:list% %i18n:@title%</span>
|
||||||
|
|
||||||
<div class="xkxvokkjlptzyewouewmceqcxhpgzprp" :data-darkmode="$store.state.device.darkmode">
|
<div class="xkxvokkjlptzyewouewmceqcxhpgzprp" :data-darkmode="$store.state.device.darkmode">
|
||||||
|
@ -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()
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -76,6 +76,11 @@ export default Vue.extend({
|
|||||||
name: {
|
name: {
|
||||||
type: String,
|
type: String,
|
||||||
default: null
|
default: null
|
||||||
|
},
|
||||||
|
animation: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default: true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -106,7 +111,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
mounted() {
|
mounted() {
|
||||||
if (this.preventMount) {
|
if (this.preventMount) {
|
||||||
this.$destroy();
|
this.destroyDom();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -142,7 +147,7 @@ export default Vue.extend({
|
|||||||
anime({
|
anime({
|
||||||
targets: bg,
|
targets: bg,
|
||||||
opacity: 1,
|
opacity: 1,
|
||||||
duration: 100,
|
duration: this.animation ? 100 : 0,
|
||||||
easing: 'linear'
|
easing: 'linear'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -152,7 +157,7 @@ export default Vue.extend({
|
|||||||
targets: main,
|
targets: main,
|
||||||
opacity: 1,
|
opacity: 1,
|
||||||
scale: [1.1, 1],
|
scale: [1.1, 1],
|
||||||
duration: 200,
|
duration: this.animation ? 200 : 0,
|
||||||
easing: 'easeOutQuad'
|
easing: 'easeOutQuad'
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -160,7 +165,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
this.$emit('opened');
|
this.$emit('opened');
|
||||||
}, 300);
|
}, this.animation ? 300 : 0);
|
||||||
},
|
},
|
||||||
|
|
||||||
close() {
|
close() {
|
||||||
@ -174,7 +179,7 @@ export default Vue.extend({
|
|||||||
anime({
|
anime({
|
||||||
targets: bg,
|
targets: bg,
|
||||||
opacity: 0,
|
opacity: 0,
|
||||||
duration: 300,
|
duration: this.animation ? 300 : 0,
|
||||||
easing: 'linear'
|
easing: 'linear'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -185,14 +190,14 @@ export default Vue.extend({
|
|||||||
targets: main,
|
targets: main,
|
||||||
opacity: 0,
|
opacity: 0,
|
||||||
scale: 0.8,
|
scale: 0.8,
|
||||||
duration: 300,
|
duration: this.animation ? 300 : 0,
|
||||||
easing: [0.5, -0.5, 1, 0.5]
|
easing: [0.5, -0.5, 1, 0.5]
|
||||||
});
|
});
|
||||||
|
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
this.$destroy();
|
|
||||||
this.$emit('closed');
|
this.$emit('closed');
|
||||||
}, 300);
|
this.destroyDom();
|
||||||
|
}, this.animation ? 300 : 0);
|
||||||
},
|
},
|
||||||
|
|
||||||
popout() {
|
popout() {
|
||||||
|
@ -14,6 +14,14 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form">
|
<div class="form">
|
||||||
|
<div>
|
||||||
|
<label>
|
||||||
|
<p>%i18n:@banner-url%</p>
|
||||||
|
<input v-model="bannerUrl">
|
||||||
|
</label>
|
||||||
|
<button class="ui" @click="updateMeta">%i18n:@save%</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<label>
|
<label>
|
||||||
<input type="checkbox" v-model="disableRegistration" @change="updateMeta">
|
<input type="checkbox" v-model="disableRegistration" @change="updateMeta">
|
||||||
@ -46,6 +54,7 @@ export default Vue.extend({
|
|||||||
stats: null,
|
stats: null,
|
||||||
disableRegistration: false,
|
disableRegistration: false,
|
||||||
disableLocalTimeline: false,
|
disableLocalTimeline: false,
|
||||||
|
bannerUrl: null,
|
||||||
inviteCode: null,
|
inviteCode: null,
|
||||||
connection: null,
|
connection: null,
|
||||||
connectionId: null
|
connectionId: null
|
||||||
@ -58,6 +67,7 @@ export default Vue.extend({
|
|||||||
(this as any).os.getMeta().then(meta => {
|
(this as any).os.getMeta().then(meta => {
|
||||||
this.disableRegistration = meta.disableRegistration;
|
this.disableRegistration = meta.disableRegistration;
|
||||||
this.disableLocalTimeline = meta.disableLocalTimeline;
|
this.disableLocalTimeline = meta.disableLocalTimeline;
|
||||||
|
this.bannerUrl = meta.bannerUrl;
|
||||||
});
|
});
|
||||||
|
|
||||||
(this as any).api('stats').then(stats => {
|
(this as any).api('stats').then(stats => {
|
||||||
@ -76,7 +86,8 @@ export default Vue.extend({
|
|||||||
updateMeta() {
|
updateMeta() {
|
||||||
(this as any).api('admin/update-meta', {
|
(this as any).api('admin/update-meta', {
|
||||||
disableRegistration: this.disableRegistration,
|
disableRegistration: this.disableRegistration,
|
||||||
disableLocalTimeline: this.disableLocalTimeline
|
disableLocalTimeline: this.disableLocalTimeline,
|
||||||
|
bannerUrl: this.bannerUrl
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -114,6 +125,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
> .form
|
> .form
|
||||||
> div
|
> div
|
||||||
|
padding 16px
|
||||||
border-bottom solid 1px #eee
|
border-bottom solid 1px #eee
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
@ -6,6 +6,9 @@
|
|||||||
<x-tl-column v-else-if="column.type == 'hybrid'" :column="column" :is-stacked="isStacked"/>
|
<x-tl-column v-else-if="column.type == 'hybrid'" :column="column" :is-stacked="isStacked"/>
|
||||||
<x-tl-column v-else-if="column.type == 'global'" :column="column" :is-stacked="isStacked"/>
|
<x-tl-column v-else-if="column.type == 'global'" :column="column" :is-stacked="isStacked"/>
|
||||||
<x-tl-column v-else-if="column.type == 'list'" :column="column" :is-stacked="isStacked"/>
|
<x-tl-column v-else-if="column.type == 'list'" :column="column" :is-stacked="isStacked"/>
|
||||||
|
<x-tl-column v-else-if="column.type == 'hashtag'" :column="column" :is-stacked="isStacked"/>
|
||||||
|
<x-mentions-column v-else-if="column.type == 'mentions'" :column="column" :is-stacked="isStacked"/>
|
||||||
|
<x-direct-column v-else-if="column.type == 'direct'" :column="column" :is-stacked="isStacked"/>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
@ -13,12 +16,16 @@ import Vue from 'vue';
|
|||||||
import XTlColumn from './deck.tl-column.vue';
|
import XTlColumn from './deck.tl-column.vue';
|
||||||
import XNotificationsColumn from './deck.notifications-column.vue';
|
import XNotificationsColumn from './deck.notifications-column.vue';
|
||||||
import XWidgetsColumn from './deck.widgets-column.vue';
|
import XWidgetsColumn from './deck.widgets-column.vue';
|
||||||
|
import XMentionsColumn from './deck.mentions-column.vue';
|
||||||
|
import XDirectColumn from './deck.direct-column.vue';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
components: {
|
components: {
|
||||||
XTlColumn,
|
XTlColumn,
|
||||||
XNotificationsColumn,
|
XNotificationsColumn,
|
||||||
XWidgetsColumn
|
XWidgetsColumn,
|
||||||
|
XMentionsColumn,
|
||||||
|
XDirectColumn
|
||||||
},
|
},
|
||||||
|
|
||||||
props: {
|
props: {
|
||||||
|
@ -0,0 +1,38 @@
|
|||||||
|
<template>
|
||||||
|
<x-column :name="name" :column="column" :is-stacked="isStacked">
|
||||||
|
<span slot="header">%fa:envelope R%{{ name }}</span>
|
||||||
|
|
||||||
|
<x-direct/>
|
||||||
|
</x-column>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
import XColumn from './deck.column.vue';
|
||||||
|
import XDirect from './deck.direct.vue';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
components: {
|
||||||
|
XColumn,
|
||||||
|
XDirect
|
||||||
|
},
|
||||||
|
|
||||||
|
props: {
|
||||||
|
column: {
|
||||||
|
type: Object,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
isStacked: {
|
||||||
|
type: Boolean,
|
||||||
|
required: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
name(): string {
|
||||||
|
if (this.column.name) return this.column.name;
|
||||||
|
return '%i18n:common.deck.direct%';
|
||||||
|
}
|
||||||
|
},
|
||||||
|
});
|
||||||
|
</script>
|
97
src/client/app/desktop/views/pages/deck/deck.direct.vue
Normal file
97
src/client/app/desktop/views/pages/deck/deck.direct.vue
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
<template>
|
||||||
|
<x-notes ref="timeline" :more="existMore ? more : null"/>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
import XNotes from './deck.notes.vue';
|
||||||
|
|
||||||
|
const fetchLimit = 10;
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
components: {
|
||||||
|
XNotes
|
||||||
|
},
|
||||||
|
|
||||||
|
props: {
|
||||||
|
},
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
fetching: true,
|
||||||
|
moreFetching: false,
|
||||||
|
existMore: false,
|
||||||
|
connection: null,
|
||||||
|
connectionId: null
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted() {
|
||||||
|
this.connection = (this as any).os.stream.getConnection();
|
||||||
|
this.connectionId = (this as any).os.stream.use();
|
||||||
|
|
||||||
|
this.connection.on('mention', this.onNote);
|
||||||
|
|
||||||
|
this.fetch();
|
||||||
|
},
|
||||||
|
|
||||||
|
beforeDestroy() {
|
||||||
|
this.connection.off('mention', this.onNote);
|
||||||
|
(this as any).os.stream.dispose(this.connectionId);
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
fetch() {
|
||||||
|
this.fetching = true;
|
||||||
|
|
||||||
|
(this.$refs.timeline as any).init(() => new Promise((res, rej) => {
|
||||||
|
(this as any).api('notes/mentions', {
|
||||||
|
limit: fetchLimit + 1,
|
||||||
|
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
||||||
|
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
|
||||||
|
includeLocalRenotes: this.$store.state.settings.showLocalRenotes,
|
||||||
|
visibility: 'specified'
|
||||||
|
}).then(notes => {
|
||||||
|
if (notes.length == fetchLimit + 1) {
|
||||||
|
notes.pop();
|
||||||
|
this.existMore = true;
|
||||||
|
}
|
||||||
|
res(notes);
|
||||||
|
this.fetching = false;
|
||||||
|
this.$emit('loaded');
|
||||||
|
}, rej);
|
||||||
|
}));
|
||||||
|
},
|
||||||
|
more() {
|
||||||
|
this.moreFetching = true;
|
||||||
|
|
||||||
|
const promise = (this as any).api('notes/mentions', {
|
||||||
|
limit: fetchLimit + 1,
|
||||||
|
untilId: (this.$refs.timeline as any).tail().id,
|
||||||
|
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
||||||
|
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
|
||||||
|
includeLocalRenotes: this.$store.state.settings.showLocalRenotes,
|
||||||
|
visibility: 'specified'
|
||||||
|
});
|
||||||
|
|
||||||
|
promise.then(notes => {
|
||||||
|
if (notes.length == fetchLimit + 1) {
|
||||||
|
notes.pop();
|
||||||
|
} else {
|
||||||
|
this.existMore = false;
|
||||||
|
}
|
||||||
|
notes.forEach(n => (this.$refs.timeline as any).append(n));
|
||||||
|
this.moreFetching = false;
|
||||||
|
});
|
||||||
|
|
||||||
|
return promise;
|
||||||
|
},
|
||||||
|
onNote(note) {
|
||||||
|
// Prepend a note
|
||||||
|
if (note.visibility == 'specified') {
|
||||||
|
(this.$refs.timeline as any).prepend(note);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
117
src/client/app/desktop/views/pages/deck/deck.hashtag-tl.vue
Normal file
117
src/client/app/desktop/views/pages/deck/deck.hashtag-tl.vue
Normal file
@ -0,0 +1,117 @@
|
|||||||
|
<template>
|
||||||
|
<x-notes ref="timeline" :more="existMore ? more : null" :media-view="mediaView"/>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
import XNotes from './deck.notes.vue';
|
||||||
|
import { HashtagStream } from '../../../../common/scripts/streaming/hashtag';
|
||||||
|
|
||||||
|
const fetchLimit = 10;
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
components: {
|
||||||
|
XNotes
|
||||||
|
},
|
||||||
|
|
||||||
|
props: {
|
||||||
|
tagTl: {
|
||||||
|
type: Object,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
mediaOnly: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default: false
|
||||||
|
},
|
||||||
|
mediaView: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
fetching: true,
|
||||||
|
moreFetching: false,
|
||||||
|
existMore: false,
|
||||||
|
connection: null
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
watch: {
|
||||||
|
mediaOnly() {
|
||||||
|
this.fetch();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted() {
|
||||||
|
if (this.connection) this.connection.close();
|
||||||
|
this.connection = new HashtagStream((this as any).os, this.$store.state.i, this.tagTl.query);
|
||||||
|
this.connection.on('note', this.onNote);
|
||||||
|
|
||||||
|
this.fetch();
|
||||||
|
},
|
||||||
|
|
||||||
|
beforeDestroy() {
|
||||||
|
this.connection.close();
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
fetch() {
|
||||||
|
this.fetching = true;
|
||||||
|
|
||||||
|
(this.$refs.timeline as any).init(() => new Promise((res, rej) => {
|
||||||
|
(this as any).api('notes/search_by_tag', {
|
||||||
|
limit: fetchLimit + 1,
|
||||||
|
withFiles: this.mediaOnly,
|
||||||
|
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
||||||
|
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
|
||||||
|
includeLocalRenotes: this.$store.state.settings.showLocalRenotes,
|
||||||
|
query: this.tagTl.query
|
||||||
|
}).then(notes => {
|
||||||
|
if (notes.length == fetchLimit + 1) {
|
||||||
|
notes.pop();
|
||||||
|
this.existMore = true;
|
||||||
|
}
|
||||||
|
res(notes);
|
||||||
|
this.fetching = false;
|
||||||
|
this.$emit('loaded');
|
||||||
|
}, rej);
|
||||||
|
}));
|
||||||
|
},
|
||||||
|
more() {
|
||||||
|
this.moreFetching = true;
|
||||||
|
|
||||||
|
const promise = (this as any).api('notes/search_by_tag', {
|
||||||
|
limit: fetchLimit + 1,
|
||||||
|
untilId: (this.$refs.timeline as any).tail().id,
|
||||||
|
withFiles: this.mediaOnly,
|
||||||
|
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
||||||
|
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
|
||||||
|
includeLocalRenotes: this.$store.state.settings.showLocalRenotes,
|
||||||
|
query: this.tagTl.query
|
||||||
|
});
|
||||||
|
|
||||||
|
promise.then(notes => {
|
||||||
|
if (notes.length == fetchLimit + 1) {
|
||||||
|
notes.pop();
|
||||||
|
} else {
|
||||||
|
this.existMore = false;
|
||||||
|
}
|
||||||
|
notes.forEach(n => (this.$refs.timeline as any).append(n));
|
||||||
|
this.moreFetching = false;
|
||||||
|
});
|
||||||
|
|
||||||
|
return promise;
|
||||||
|
},
|
||||||
|
onNote(note) {
|
||||||
|
if (this.mediaOnly && note.files.length == 0) return;
|
||||||
|
|
||||||
|
// Prepend a note
|
||||||
|
(this.$refs.timeline as any).prepend(note);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
@ -0,0 +1,38 @@
|
|||||||
|
<template>
|
||||||
|
<x-column :name="name" :column="column" :is-stacked="isStacked">
|
||||||
|
<span slot="header">%fa:at%{{ name }}</span>
|
||||||
|
|
||||||
|
<x-mentions/>
|
||||||
|
</x-column>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
import XColumn from './deck.column.vue';
|
||||||
|
import XMentions from './deck.mentions.vue';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
components: {
|
||||||
|
XColumn,
|
||||||
|
XMentions
|
||||||
|
},
|
||||||
|
|
||||||
|
props: {
|
||||||
|
column: {
|
||||||
|
type: Object,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
isStacked: {
|
||||||
|
type: Boolean,
|
||||||
|
required: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
name(): string {
|
||||||
|
if (this.column.name) return this.column.name;
|
||||||
|
return '%i18n:common.deck.mentions%';
|
||||||
|
}
|
||||||
|
},
|
||||||
|
});
|
||||||
|
</script>
|
93
src/client/app/desktop/views/pages/deck/deck.mentions.vue
Normal file
93
src/client/app/desktop/views/pages/deck/deck.mentions.vue
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
<template>
|
||||||
|
<x-notes ref="timeline" :more="existMore ? more : null"/>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
import XNotes from './deck.notes.vue';
|
||||||
|
|
||||||
|
const fetchLimit = 10;
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
components: {
|
||||||
|
XNotes
|
||||||
|
},
|
||||||
|
|
||||||
|
props: {
|
||||||
|
},
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
fetching: true,
|
||||||
|
moreFetching: false,
|
||||||
|
existMore: false,
|
||||||
|
connection: null,
|
||||||
|
connectionId: null
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted() {
|
||||||
|
this.connection = (this as any).os.stream.getConnection();
|
||||||
|
this.connectionId = (this as any).os.stream.use();
|
||||||
|
|
||||||
|
this.connection.on('mention', this.onNote);
|
||||||
|
|
||||||
|
this.fetch();
|
||||||
|
},
|
||||||
|
|
||||||
|
beforeDestroy() {
|
||||||
|
this.connection.off('mention', this.onNote);
|
||||||
|
(this as any).os.stream.dispose(this.connectionId);
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
fetch() {
|
||||||
|
this.fetching = true;
|
||||||
|
|
||||||
|
(this.$refs.timeline as any).init(() => new Promise((res, rej) => {
|
||||||
|
(this as any).api('notes/mentions', {
|
||||||
|
limit: fetchLimit + 1,
|
||||||
|
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
||||||
|
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
|
||||||
|
includeLocalRenotes: this.$store.state.settings.showLocalRenotes
|
||||||
|
}).then(notes => {
|
||||||
|
if (notes.length == fetchLimit + 1) {
|
||||||
|
notes.pop();
|
||||||
|
this.existMore = true;
|
||||||
|
}
|
||||||
|
res(notes);
|
||||||
|
this.fetching = false;
|
||||||
|
this.$emit('loaded');
|
||||||
|
}, rej);
|
||||||
|
}));
|
||||||
|
},
|
||||||
|
more() {
|
||||||
|
this.moreFetching = true;
|
||||||
|
|
||||||
|
const promise = (this as any).api('notes/mentions', {
|
||||||
|
limit: fetchLimit + 1,
|
||||||
|
untilId: (this.$refs.timeline as any).tail().id,
|
||||||
|
includeMyRenotes: this.$store.state.settings.showMyRenotes,
|
||||||
|
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
|
||||||
|
includeLocalRenotes: this.$store.state.settings.showLocalRenotes
|
||||||
|
});
|
||||||
|
|
||||||
|
promise.then(notes => {
|
||||||
|
if (notes.length == fetchLimit + 1) {
|
||||||
|
notes.pop();
|
||||||
|
} else {
|
||||||
|
this.existMore = false;
|
||||||
|
}
|
||||||
|
notes.forEach(n => (this.$refs.timeline as any).append(n));
|
||||||
|
this.moreFetching = false;
|
||||||
|
});
|
||||||
|
|
||||||
|
return promise;
|
||||||
|
},
|
||||||
|
onNote(note) {
|
||||||
|
// Prepend a note
|
||||||
|
(this.$refs.timeline as any).prepend(note);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
@ -147,10 +147,14 @@ export default Vue.extend({
|
|||||||
methods: {
|
methods: {
|
||||||
capture(withHandler = false) {
|
capture(withHandler = false) {
|
||||||
if (this.$store.getters.isSignedIn) {
|
if (this.$store.getters.isSignedIn) {
|
||||||
this.connection.send({
|
const data = {
|
||||||
type: 'capture',
|
type: 'capture',
|
||||||
id: this.p.id
|
id: this.p.id
|
||||||
});
|
} as any;
|
||||||
|
if ((this.p.visibleUserIds || []).includes(this.$store.state.i.id) || (this.p.mentions || []).includes(this.$store.state.i.id)) {
|
||||||
|
data.read = true;
|
||||||
|
}
|
||||||
|
this.connection.send(data);
|
||||||
if (withHandler) this.connection.on('note-updated', this.onStreamNoteUpdated);
|
if (withHandler) this.connection.on('note-updated', this.onStreamNoteUpdated);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -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.reduceMotion ? '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>
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
<template v-if="column.type == 'hybrid'">%fa:share-alt%</template>
|
<template v-if="column.type == 'hybrid'">%fa:share-alt%</template>
|
||||||
<template v-if="column.type == 'global'">%fa:globe%</template>
|
<template v-if="column.type == 'global'">%fa:globe%</template>
|
||||||
<template v-if="column.type == 'list'">%fa:list%</template>
|
<template v-if="column.type == 'list'">%fa:list%</template>
|
||||||
|
<template v-if="column.type == 'hashtag'">%fa:hashtag%</template>
|
||||||
<span>{{ name }}</span>
|
<span>{{ name }}</span>
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
@ -14,6 +15,7 @@
|
|||||||
<mk-switch v-model="column.isMediaView" @change="onChangeSettings" text="%i18n:@is-media-view%"/>
|
<mk-switch v-model="column.isMediaView" @change="onChangeSettings" text="%i18n:@is-media-view%"/>
|
||||||
</div>
|
</div>
|
||||||
<x-list-tl v-if="column.type == 'list'" :list="column.list" :media-only="column.isMediaOnly" :media-view="column.isMediaView"/>
|
<x-list-tl v-if="column.type == 'list'" :list="column.list" :media-only="column.isMediaOnly" :media-view="column.isMediaView"/>
|
||||||
|
<x-hashtag-tl v-if="column.type == 'hashtag'" :tag-tl="$store.state.settings.tagTimelines.find(x => x.id == column.tagTlId)" :media-only="column.isMediaOnly" :media-view="column.isMediaView"/>
|
||||||
<x-tl v-else :src="column.type" :media-only="column.isMediaOnly" :media-view="column.isMediaView"/>
|
<x-tl v-else :src="column.type" :media-only="column.isMediaOnly" :media-view="column.isMediaView"/>
|
||||||
</x-column>
|
</x-column>
|
||||||
</template>
|
</template>
|
||||||
@ -23,12 +25,14 @@ import Vue from 'vue';
|
|||||||
import XColumn from './deck.column.vue';
|
import XColumn from './deck.column.vue';
|
||||||
import XTl from './deck.tl.vue';
|
import XTl from './deck.tl.vue';
|
||||||
import XListTl from './deck.list-tl.vue';
|
import XListTl from './deck.list-tl.vue';
|
||||||
|
import XHashtagTl from './deck.hashtag-tl.vue';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
components: {
|
components: {
|
||||||
XColumn,
|
XColumn,
|
||||||
XTl,
|
XTl,
|
||||||
XListTl
|
XListTl,
|
||||||
|
XHashtagTl
|
||||||
},
|
},
|
||||||
|
|
||||||
props: {
|
props: {
|
||||||
@ -65,6 +69,7 @@ export default Vue.extend({
|
|||||||
case 'hybrid': return '%i18n:common.deck.hybrid%';
|
case 'hybrid': return '%i18n:common.deck.hybrid%';
|
||||||
case 'global': return '%i18n:common.deck.global%';
|
case 'global': return '%i18n:common.deck.global%';
|
||||||
case 'list': return this.column.list.title;
|
case 'list': return this.column.list.title;
|
||||||
|
case 'hashtag': return this.$store.state.settings.tagTimelines.find(x => x.id == this.column.tagTlId).title;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -138,6 +138,24 @@ export default Vue.extend({
|
|||||||
type: 'global'
|
type: 'global'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
}, {
|
||||||
|
icon: '%fa:at%',
|
||||||
|
text: '%i18n:common.deck.mentions%',
|
||||||
|
action: () => {
|
||||||
|
this.$store.dispatch('settings/addDeckColumn', {
|
||||||
|
id: uuid(),
|
||||||
|
type: 'mentions'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
icon: '%fa:envelope R%',
|
||||||
|
text: '%i18n:common.deck.direct%',
|
||||||
|
action: () => {
|
||||||
|
this.$store.dispatch('settings/addDeckColumn', {
|
||||||
|
id: uuid(),
|
||||||
|
type: 'direct'
|
||||||
|
});
|
||||||
|
}
|
||||||
}, {
|
}, {
|
||||||
icon: '%fa:list%',
|
icon: '%fa:list%',
|
||||||
text: '%i18n:common.deck.list%',
|
text: '%i18n:common.deck.list%',
|
||||||
@ -152,6 +170,20 @@ export default Vue.extend({
|
|||||||
w.close();
|
w.close();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
}, {
|
||||||
|
icon: '%fa:hashtag%',
|
||||||
|
text: '%i18n:common.deck.hashtag%',
|
||||||
|
action: () => {
|
||||||
|
(this as any).apis.input({
|
||||||
|
title: '%i18n:@enter-hashtag-tl-title%'
|
||||||
|
}).then(title => {
|
||||||
|
this.$store.dispatch('settings/addDeckColumn', {
|
||||||
|
id: uuid(),
|
||||||
|
type: 'hashtag',
|
||||||
|
tagTlId: this.$store.state.settings.tagTimelines.find(x => x.title == title).id
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
}, {
|
}, {
|
||||||
icon: '%fa:bell R%',
|
icon: '%fa:bell R%',
|
||||||
text: '%i18n:common.deck.notifications%',
|
text: '%i18n:common.deck.notifications%',
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<mk-ui>
|
<mk-ui>
|
||||||
<mk-home :mode="mode" @loaded="loaded"/>
|
<mk-home :mode="mode" @loaded="loaded" ref="home" v-hotkey.global="keymap"/>
|
||||||
</mk-ui>
|
</mk-ui>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -15,6 +15,13 @@ export default Vue.extend({
|
|||||||
default: 'timeline'
|
default: 'timeline'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
computed: {
|
||||||
|
keymap(): any {
|
||||||
|
return {
|
||||||
|
't': this.focus
|
||||||
|
};
|
||||||
|
}
|
||||||
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
document.title = (this as any).os.instanceName;
|
document.title = (this as any).os.instanceName;
|
||||||
|
|
||||||
@ -23,6 +30,9 @@ export default Vue.extend({
|
|||||||
methods: {
|
methods: {
|
||||||
loaded() {
|
loaded() {
|
||||||
Progress.done();
|
Progress.done();
|
||||||
|
},
|
||||||
|
focus() {
|
||||||
|
this.$refs.home.focus();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -43,7 +43,7 @@ export default Vue.extend({
|
|||||||
> .stats
|
> .stats
|
||||||
display flex
|
display flex
|
||||||
justify-content center
|
justify-content center
|
||||||
margin-bottom 16px
|
margin 0 auto 16px auto
|
||||||
padding 32px
|
padding 32px
|
||||||
background #fff
|
background #fff
|
||||||
box-shadow 0 2px 8px rgba(#000, 0.1)
|
box-shadow 0 2px 8px rgba(#000, 0.1)
|
||||||
@ -60,5 +60,6 @@ export default Vue.extend({
|
|||||||
font-size 70%
|
font-size 70%
|
||||||
|
|
||||||
> div
|
> div
|
||||||
max-width 850px
|
max-width 950px
|
||||||
|
margin 0 auto
|
||||||
</style>
|
</style>
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
<main>
|
<main>
|
||||||
<div class="main">
|
<div class="main">
|
||||||
<x-header :user="user"/>
|
<x-header :user="user"/>
|
||||||
<mk-note-detail v-if="user.pinnedNote" :note="user.pinnedNote" :compact="true"/>
|
<mk-note-detail v-for="n in user.pinnedNotes" :key="n.id" :note="n" :compact="true"/>
|
||||||
<x-timeline class="timeline" ref="tl" :user="user"/>
|
<x-timeline class="timeline" ref="tl" :user="user"/>
|
||||||
</div>
|
</div>
|
||||||
<div class="side">
|
<div class="side">
|
||||||
@ -28,7 +28,6 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import parseAcct from '../../../../../../misc/acct/parse';
|
import parseAcct from '../../../../../../misc/acct/parse';
|
||||||
import getUserName from '../../../../../../misc/get-user-name';
|
|
||||||
import Progress from '../../../../common/scripts/loading';
|
import Progress from '../../../../common/scripts/loading';
|
||||||
import XHeader from './user.header.vue';
|
import XHeader from './user.header.vue';
|
||||||
import XTimeline from './user.timeline.vue';
|
import XTimeline from './user.timeline.vue';
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mk-welcome">
|
<div class="mk-welcome">
|
||||||
|
<div class="banner" :style="{ backgroundImage: banner ? `url(${banner})` : null }"></div>
|
||||||
|
|
||||||
<button @click="dark">
|
<button @click="dark">
|
||||||
<template v-if="$store.state.device.darkmode">%fa:moon%</template>
|
<template v-if="$store.state.device.darkmode">%fa:moon%</template>
|
||||||
<template v-else>%fa:R moon%</template>
|
<template v-else>%fa:R moon%</template>
|
||||||
@ -154,6 +156,7 @@ export default Vue.extend({
|
|||||||
return {
|
return {
|
||||||
meta: null,
|
meta: null,
|
||||||
stats: null,
|
stats: null,
|
||||||
|
banner: null,
|
||||||
copyright,
|
copyright,
|
||||||
host,
|
host,
|
||||||
name: 'Misskey',
|
name: 'Misskey',
|
||||||
@ -169,6 +172,7 @@ export default Vue.extend({
|
|||||||
this.name = meta.name;
|
this.name = meta.name;
|
||||||
this.description = meta.description;
|
this.description = meta.description;
|
||||||
this.announcements = meta.broadcasts;
|
this.announcements = meta.broadcasts;
|
||||||
|
this.banner = meta.bannerUrl;
|
||||||
});
|
});
|
||||||
|
|
||||||
(this as any).api('stats').then(stats => {
|
(this as any).api('stats').then(stats => {
|
||||||
@ -308,6 +312,26 @@ root(isDark)
|
|||||||
//background-position center
|
//background-position center
|
||||||
//background-size cover
|
//background-size cover
|
||||||
|
|
||||||
|
> .banner
|
||||||
|
position absolute
|
||||||
|
top 0
|
||||||
|
left 0
|
||||||
|
width 100%
|
||||||
|
height 400px
|
||||||
|
background-position center
|
||||||
|
background-size cover
|
||||||
|
opacity 0.7
|
||||||
|
|
||||||
|
&:after
|
||||||
|
content ""
|
||||||
|
display block
|
||||||
|
position absolute
|
||||||
|
bottom 0
|
||||||
|
left 0
|
||||||
|
width 100%
|
||||||
|
height 100px
|
||||||
|
background linear-gradient(transparent, isDark ? #191b22 : #f7f7f7)
|
||||||
|
|
||||||
> .forkit
|
> .forkit
|
||||||
position absolute
|
position absolute
|
||||||
top 0
|
top 0
|
||||||
|
@ -7,29 +7,20 @@ 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 VueHotkey from './common/hotkey';
|
||||||
|
|
||||||
import App from './app.vue';
|
import App from './app.vue';
|
||||||
import checkForUpdate from './common/scripts/check-for-update';
|
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);
|
||||||
|
Vue.use(VueHotkey);
|
||||||
|
|
||||||
// Register global directives
|
// Register global directives
|
||||||
require('./common/views/directives');
|
require('./common/views/directives');
|
||||||
@ -42,9 +33,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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="qjewsnkgzzxlxtzncydssfbgjibiehcy" v-if="image.isSensitive && hide" @click="hide = false">
|
<div class="qjewsnkgzzxlxtzncydssfbgjibiehcy" v-if="image.isSensitive && hide && !$store.state.device.alwaysShowNsfw" @click="hide = false">
|
||||||
<div>
|
<div>
|
||||||
<b>%fa:exclamation-triangle% %i18n:@sensitive%</b>
|
<b>%fa:exclamation-triangle% %i18n:@sensitive%</b>
|
||||||
<span>%i18n:@click-to-show%</span>
|
<span>%i18n:@click-to-show%</span>
|
||||||
@ -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>
|
||||||
|
@ -160,10 +160,14 @@ export default Vue.extend({
|
|||||||
methods: {
|
methods: {
|
||||||
capture(withHandler = false) {
|
capture(withHandler = false) {
|
||||||
if (this.$store.getters.isSignedIn) {
|
if (this.$store.getters.isSignedIn) {
|
||||||
this.connection.send({
|
const data = {
|
||||||
type: 'capture',
|
type: 'capture',
|
||||||
id: this.p.id
|
id: this.p.id
|
||||||
});
|
} as any;
|
||||||
|
if ((this.p.visibleUserIds || []).includes(this.$store.state.i.id) || (this.p.mentions || []).includes(this.$store.state.i.id)) {
|
||||||
|
data.read = true;
|
||||||
|
}
|
||||||
|
this.connection.send(data);
|
||||||
if (withHandler) this.connection.on('note-updated', this.onStreamNoteUpdated);
|
if (withHandler) this.connection.on('note-updated', this.onStreamNoteUpdated);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user