Compare commits
105 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
8b43d75eaf | ||
![]() |
89b37bd73d | ||
![]() |
69f246ce7f | ||
![]() |
6a97f0b7f6 | ||
![]() |
d885b872f3 | ||
![]() |
125849673a | ||
![]() |
30c53e9ee0 | ||
![]() |
981fb9e8f3 | ||
![]() |
9fac22d880 | ||
![]() |
b8f034064a | ||
![]() |
6068227434 | ||
![]() |
69cda49c88 | ||
![]() |
039d821d20 | ||
![]() |
44d93bc408 | ||
![]() |
cfa76ac6f9 | ||
![]() |
0ec2d16522 | ||
![]() |
6bcac1fe14 | ||
![]() |
bc9427d000 | ||
![]() |
07c043361e | ||
![]() |
e676a9a501 | ||
![]() |
09e654c6d2 | ||
![]() |
549cb1ba87 | ||
![]() |
c633827e5e | ||
![]() |
08142ead67 | ||
![]() |
638d81b66e | ||
![]() |
4c83c2f64d | ||
![]() |
bf56f90fdc | ||
![]() |
d8412aad7a | ||
![]() |
c136741710 | ||
![]() |
4fe8454da0 | ||
![]() |
3f2161dadd | ||
![]() |
3db516aa1a | ||
![]() |
367bbbe605 | ||
![]() |
5b70ff561c | ||
![]() |
4486527e5d | ||
![]() |
147e23d332 | ||
![]() |
ee20e6950e | ||
![]() |
1d217154ef | ||
![]() |
27d304a1ab | ||
![]() |
1d1a373ca8 | ||
![]() |
bca3c6f8bf | ||
![]() |
d83d661535 | ||
![]() |
e16906afc3 | ||
![]() |
a6dc0f3684 | ||
![]() |
6120474548 | ||
![]() |
121dd86299 | ||
![]() |
5251d9f668 | ||
![]() |
7ae3f569de | ||
![]() |
142ebead59 | ||
![]() |
e196086c64 | ||
![]() |
8c6ed98505 | ||
![]() |
98a2953c9c | ||
![]() |
61d224695b | ||
![]() |
6967def6c8 | ||
![]() |
393c6aa79a | ||
![]() |
fc05540404 | ||
![]() |
1c589c7c18 | ||
![]() |
284df27435 | ||
![]() |
68c0600a5c | ||
![]() |
b8163bd0e1 | ||
![]() |
8c25b9dfad | ||
![]() |
bf34f67583 | ||
![]() |
0c63f410d6 | ||
![]() |
069077ace4 | ||
![]() |
5be947ea4d | ||
![]() |
b41ffa75b7 | ||
![]() |
cd80e02ebf | ||
![]() |
dffcefb81f | ||
![]() |
48df08d4dc | ||
![]() |
4de9a08e55 | ||
![]() |
3f46b5259b | ||
![]() |
2faa8ea97c | ||
![]() |
514690cf18 | ||
![]() |
f4f78c1898 | ||
![]() |
2d24befb15 | ||
![]() |
184d88838c | ||
![]() |
4490503d59 | ||
![]() |
99750435ae | ||
![]() |
fae920e578 | ||
![]() |
0243b6d13b | ||
![]() |
12bc725d68 | ||
![]() |
b1a7b781ec | ||
![]() |
7e1cad3e12 | ||
![]() |
fd3f4c37a0 | ||
![]() |
3acd2e0f0c | ||
![]() |
b1b5a795c8 | ||
![]() |
197e2c8377 | ||
![]() |
fb8b0c291d | ||
![]() |
706d47ec32 | ||
![]() |
4eab2b3654 | ||
![]() |
0a78f560e0 | ||
![]() |
f6f79fb388 | ||
![]() |
34235d4d44 | ||
![]() |
21842ec190 | ||
![]() |
026e1cc7e7 | ||
![]() |
c65f4eebaf | ||
![]() |
17baf8770a | ||
![]() |
01f60edb17 | ||
![]() |
15b11e59f4 | ||
![]() |
a2db4db963 | ||
![]() |
e87b9cc019 | ||
![]() |
54cb94db1d | ||
![]() |
1de8e1eeb1 | ||
![]() |
1d8fb65959 | ||
![]() |
28482627f7 |
3
.autogen/check_pr.jq
Normal file
3
.autogen/check_pr.jq
Normal file
@@ -0,0 +1,3 @@
|
||||
.[]
|
||||
.head
|
||||
.label
|
2
.autogen/next_url.jq
Normal file
2
.autogen/next_url.jq
Normal file
@@ -0,0 +1,2 @@
|
||||
.links
|
||||
.next
|
39
.autogen/patreon.jq
Normal file
39
.autogen/patreon.jq
Normal file
@@ -0,0 +1,39 @@
|
||||
(
|
||||
.data |
|
||||
map(
|
||||
select(
|
||||
.relationships
|
||||
.currently_entitled_tiers
|
||||
.data[]
|
||||
)
|
||||
) |
|
||||
map(
|
||||
.relationships
|
||||
.user
|
||||
.data
|
||||
.id
|
||||
)
|
||||
) as $data |
|
||||
.included |
|
||||
map(
|
||||
select(
|
||||
.id as $id |
|
||||
$data |
|
||||
contains(
|
||||
[
|
||||
$id
|
||||
]
|
||||
)
|
||||
)
|
||||
) |
|
||||
map(
|
||||
.attributes |
|
||||
[
|
||||
.full_name,
|
||||
.thumb_url,
|
||||
.url
|
||||
] |
|
||||
@tsv
|
||||
) |
|
||||
.[] |
|
||||
@text
|
@@ -5,7 +5,7 @@
|
||||
# __MISSKEY_HEAD=acid-chicken:patch-autogen
|
||||
# __MISSKEY_REPO=syuilo/misskey
|
||||
# __MISSKEY_BRANCH=develop
|
||||
test "$(curl -LSs -w '\n' -- "https://api.github.com/repos/$REPO/pulls?access_token=$__MISSKEY_GITHUB_TOKEN" | jq -r '.[].head.label' | grep $__MISSKEY_HEAD)" && exit 1
|
||||
test "$(curl -LSs -w '\n' -- "https://api.github.com/repos/$REPO/pulls?access_token=$__MISSKEY_GITHUB_TOKEN" | jq -r -f check_pr.jq | grep $__MISSKEY_HEAD)" && exit 1
|
||||
cd "$(dirname $0)/.." && \
|
||||
touch null.cache && \
|
||||
rm *.cache && \
|
||||
@@ -30,7 +30,7 @@ while :
|
||||
touch patreon.cache && \
|
||||
rm patreon.cache && \
|
||||
cat patreon.raw.cache | \
|
||||
jq -r '(.data|map(select(.relationships.currently_entitled_tiers.data[]))|map(.relationships.user.data.id))as$data|.included|map(select(.id as$id|$data|contains([$id])))|map(.attributes|[.full_name,.thumb_url,.url]|@tsv)|.[]|@text' >> patreon.cache && \
|
||||
jq -r -f patreon.jq >> patreon.cache && \
|
||||
echo '<table><tr>' >> patreon.md.cache && \
|
||||
cat patreon.cache | \
|
||||
awk -F'\t' '{print $2,$1}' | \
|
||||
@@ -43,7 +43,7 @@ while :
|
||||
xargs -I% echo '<td><a href="%</a></td>' >> patreon.md.cache && \
|
||||
echo '</tr></table>' >> patreon.md.cache || \
|
||||
exit 1
|
||||
new_url="$(cat patreon.raw.cache | jq -r '.links.next')"
|
||||
new_url="$(cat patreon.raw.cache | jq -r -f next_url.jq)"
|
||||
test "$new_url" = 'null' && \
|
||||
break || \
|
||||
URL="$url"
|
@@ -1,9 +1,10 @@
|
||||
ChangeLog
|
||||
=========
|
||||
|
||||
破壊的変更のみ記載。
|
||||
|
||||
This document describes breaking changes only.
|
||||
10.62.2
|
||||
-------
|
||||
* バグ修正
|
||||
* ユーザビリティの向上
|
||||
|
||||
10.0.0
|
||||
------
|
||||
|
@@ -523,6 +523,8 @@ common/views/widgets/tips.vue:
|
||||
tips-line23: "まゆかわいいよまゆ"
|
||||
tips-line24: "Misskeyは2014年にサービスを開始しました"
|
||||
tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
|
||||
common/views/pages/404.vue:
|
||||
page-not-found: "ページが見つかりませんでした"
|
||||
common/views/pages/follow.vue:
|
||||
signed-in-as: "{}としてサインイン中"
|
||||
following: "フォロー中"
|
||||
@@ -881,6 +883,11 @@ desktop/views/components/sub-note-content.vue:
|
||||
deleted: "この投稿は削除されました"
|
||||
media-count: "{}つのメディア"
|
||||
poll: "アンケート"
|
||||
desktop/views/components/settings.tags.vue:
|
||||
title: "タグ"
|
||||
query: "クエリ (省略可)"
|
||||
add: "追加"
|
||||
save: "保存"
|
||||
desktop/views/components/taskmanager.vue:
|
||||
title: "タスクマネージャ"
|
||||
desktop/views/components/timeline.vue:
|
||||
@@ -963,6 +970,7 @@ admin/views/instance.vue:
|
||||
instance-description: "インスタンスの紹介"
|
||||
host: "ホスト"
|
||||
banner-url: "バナー画像URL"
|
||||
error-image-url: "エラー画像URL"
|
||||
languages: "インスタンスの対象言語"
|
||||
languages-desc: "スペースで区切って複数設定できます。"
|
||||
maintainer-config: "管理者情報"
|
||||
|
@@ -523,6 +523,8 @@ common/views/widgets/tips.vue:
|
||||
tips-line23: "まゆかわいいよまゆ"
|
||||
tips-line24: "Misskeyは2014年にサービスを開始しました"
|
||||
tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
|
||||
common/views/pages/404.vue:
|
||||
page-not-found: "ページが見つかりませんでした"
|
||||
common/views/pages/follow.vue:
|
||||
signed-in-as: "{}としてサインイン中"
|
||||
following: "フォロー中"
|
||||
@@ -881,6 +883,11 @@ desktop/views/components/sub-note-content.vue:
|
||||
deleted: "この投稿は削除されました"
|
||||
media-count: "{}つのメディア"
|
||||
poll: "アンケート"
|
||||
desktop/views/components/settings.tags.vue:
|
||||
title: "タグ"
|
||||
query: "クエリ (省略可)"
|
||||
add: "追加"
|
||||
save: "保存"
|
||||
desktop/views/components/taskmanager.vue:
|
||||
title: "Taskmanager"
|
||||
desktop/views/components/timeline.vue:
|
||||
@@ -963,6 +970,7 @@ admin/views/instance.vue:
|
||||
instance-description: "インスタンスの紹介"
|
||||
host: "ホスト"
|
||||
banner-url: "バナー画像URL"
|
||||
error-image-url: "エラー画像URL"
|
||||
languages: "インスタンスの対象言語"
|
||||
languages-desc: "スペースで区切って複数設定できます。"
|
||||
maintainer-config: "管理者情報"
|
||||
|
@@ -523,6 +523,8 @@ common/views/widgets/tips.vue:
|
||||
tips-line23: "Mayu is so cute with its eyebrows."
|
||||
tips-line24: "Misskey has been running since 2014."
|
||||
tips-line25: "In a browser compatible with notification features, you can receive notifications in case Misskey is not open"
|
||||
common/views/pages/404.vue:
|
||||
page-not-found: "Page not found"
|
||||
common/views/pages/follow.vue:
|
||||
signed-in-as: "Signed in as {}"
|
||||
following: "Following"
|
||||
@@ -881,6 +883,11 @@ desktop/views/components/sub-note-content.vue:
|
||||
deleted: "This post has been deleted"
|
||||
media-count: "{} media attached"
|
||||
poll: "Poll"
|
||||
desktop/views/components/settings.tags.vue:
|
||||
title: "Tags"
|
||||
query: "Query (optional)"
|
||||
add: "Add"
|
||||
save: "Save"
|
||||
desktop/views/components/taskmanager.vue:
|
||||
title: "Task Manager"
|
||||
desktop/views/components/timeline.vue:
|
||||
@@ -963,6 +970,7 @@ admin/views/instance.vue:
|
||||
instance-description: "Instance description"
|
||||
host: "Host"
|
||||
banner-url: "Banner image URL"
|
||||
error-image-url: "Error image URL"
|
||||
languages: "Language of this instance"
|
||||
languages-desc: "You can add more than one, separated by spaces."
|
||||
maintainer-config: "Administrator information"
|
||||
|
@@ -523,6 +523,8 @@ common/views/widgets/tips.vue:
|
||||
tips-line23: "Mayu is tan bonito con sus cejas."
|
||||
tips-line24: "Misskey inició en 2014."
|
||||
tips-line25: "Puedes recibir notificaciones incluso si Misskey no está abierto en un navegador compatible."
|
||||
common/views/pages/404.vue:
|
||||
page-not-found: "ページが見つかりませんでした"
|
||||
common/views/pages/follow.vue:
|
||||
signed-in-as: "Autenticado como {}"
|
||||
following: "Siguiendo"
|
||||
@@ -881,6 +883,11 @@ desktop/views/components/sub-note-content.vue:
|
||||
deleted: "この投稿は削除されました"
|
||||
media-count: "{}つのメディア"
|
||||
poll: "アンケート"
|
||||
desktop/views/components/settings.tags.vue:
|
||||
title: "タグ"
|
||||
query: "クエリ (省略可)"
|
||||
add: "追加"
|
||||
save: "保存"
|
||||
desktop/views/components/taskmanager.vue:
|
||||
title: "タスクマネージャ"
|
||||
desktop/views/components/timeline.vue:
|
||||
@@ -963,6 +970,7 @@ admin/views/instance.vue:
|
||||
instance-description: "インスタンスの紹介"
|
||||
host: "ホスト"
|
||||
banner-url: "バナー画像URL"
|
||||
error-image-url: "エラー画像URL"
|
||||
languages: "インスタンスの対象言語"
|
||||
languages-desc: "スペースで区切って複数設定できます。"
|
||||
maintainer-config: "管理者情報"
|
||||
|
@@ -297,8 +297,8 @@ common/views/components/theme.vue:
|
||||
common/views/components/cw-button.vue:
|
||||
hide: "Masquer"
|
||||
show: "Voir plus"
|
||||
chars: "{count}文字"
|
||||
files: "{count}ファイル"
|
||||
chars: "{count} caractères"
|
||||
files: "{count} fichiers"
|
||||
common/views/components/messaging.vue:
|
||||
search-user: "Trouver un·e utilisateur·trice"
|
||||
you: "Vous"
|
||||
@@ -523,6 +523,8 @@ common/views/widgets/tips.vue:
|
||||
tips-line23: "Mayu est mignonne avec ses sourcils."
|
||||
tips-line24: "Misskey est fonctionnel depuis 2014"
|
||||
tips-line25: "Vous pouvez recevoir les notifications de Misskey dans un navigateur web compatible"
|
||||
common/views/pages/404.vue:
|
||||
page-not-found: "ページが見つかりませんでした"
|
||||
common/views/pages/follow.vue:
|
||||
signed-in-as: "Connecté·e en tant que {}"
|
||||
following: "Suit"
|
||||
@@ -881,6 +883,11 @@ desktop/views/components/sub-note-content.vue:
|
||||
deleted: "cette publication a été supprimée"
|
||||
media-count: "{} médias attachés"
|
||||
poll: "Sondage"
|
||||
desktop/views/components/settings.tags.vue:
|
||||
title: "Étiquettes"
|
||||
query: "Requête (optionnelle)"
|
||||
add: "Ajouter"
|
||||
save: "Enregistrer"
|
||||
desktop/views/components/taskmanager.vue:
|
||||
title: "Gestionnaire de tâches"
|
||||
desktop/views/components/timeline.vue:
|
||||
@@ -963,6 +970,7 @@ admin/views/instance.vue:
|
||||
instance-description: "Description de l’instance"
|
||||
host: "Hôte"
|
||||
banner-url: "Url de l’image de la bannière"
|
||||
error-image-url: "エラー画像URL"
|
||||
languages: "Langue de l’instance"
|
||||
languages-desc: "Vous pouvez en définir plus d’une, séparées par des espaces."
|
||||
maintainer-config: "Informations de l’administrateur"
|
||||
|
@@ -523,6 +523,8 @@ common/views/widgets/tips.vue:
|
||||
tips-line23: "まゆかわいいよまゆ"
|
||||
tips-line24: "Misskeyは2014年にサービスを開始しました"
|
||||
tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
|
||||
common/views/pages/404.vue:
|
||||
page-not-found: "ページが見つかりませんでした"
|
||||
common/views/pages/follow.vue:
|
||||
signed-in-as: "{}としてサインイン中"
|
||||
following: "フォロー中"
|
||||
@@ -881,6 +883,11 @@ desktop/views/components/sub-note-content.vue:
|
||||
deleted: "この投稿は削除されました"
|
||||
media-count: "{}つのメディア"
|
||||
poll: "アンケート"
|
||||
desktop/views/components/settings.tags.vue:
|
||||
title: "タグ"
|
||||
query: "クエリ (省略可)"
|
||||
add: "追加"
|
||||
save: "保存"
|
||||
desktop/views/components/taskmanager.vue:
|
||||
title: "タスクマネージャ"
|
||||
desktop/views/components/timeline.vue:
|
||||
@@ -963,6 +970,7 @@ admin/views/instance.vue:
|
||||
instance-description: "インスタンスの紹介"
|
||||
host: "ホスト"
|
||||
banner-url: "バナー画像URL"
|
||||
error-image-url: "エラー画像URL"
|
||||
languages: "インスタンスの対象言語"
|
||||
languages-desc: "スペースで区切って複数設定できます。"
|
||||
maintainer-config: "管理者情報"
|
||||
|
@@ -580,6 +580,9 @@ common/views/widgets/tips.vue:
|
||||
tips-line24: "Misskeyは2014年にサービスを開始しました"
|
||||
tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
|
||||
|
||||
common/views/pages/404.vue:
|
||||
page-not-found: "ページが見つかりませんでした"
|
||||
|
||||
common/views/pages/follow.vue:
|
||||
signed-in-as: "{}としてサインイン中"
|
||||
following: "フォロー中"
|
||||
@@ -990,6 +993,12 @@ desktop/views/components/sub-note-content.vue:
|
||||
media-count: "{}つのメディア"
|
||||
poll: "アンケート"
|
||||
|
||||
desktop/views/components/settings.tags.vue:
|
||||
title: "タグ"
|
||||
query: "クエリ (省略可)"
|
||||
add: "追加"
|
||||
save: "保存"
|
||||
|
||||
desktop/views/components/taskmanager.vue:
|
||||
title: "タスクマネージャ"
|
||||
|
||||
@@ -1088,6 +1097,7 @@ admin/views/instance.vue:
|
||||
instance-description: "インスタンスの紹介"
|
||||
host: "ホスト"
|
||||
banner-url: "バナー画像URL"
|
||||
error-image-url: "エラー画像URL"
|
||||
languages: "インスタンスの対象言語"
|
||||
languages-desc: "スペースで区切って複数設定できます。"
|
||||
maintainer-config: "管理者情報"
|
||||
|
@@ -523,6 +523,8 @@ common/views/widgets/tips.vue:
|
||||
tips-line23: "ウチのタコちゃんかわええやろ…今の突っ込むところや!"
|
||||
tips-line24: "Misskeyは2014年にサービスを開始したんよ"
|
||||
tips-line25: "対応ブラウザやったらMisskeyを開いとらんでも通知を受け取れんで"
|
||||
common/views/pages/404.vue:
|
||||
page-not-found: "ページが見つかりませんでした"
|
||||
common/views/pages/follow.vue:
|
||||
signed-in-as: "{}としてサインイン中"
|
||||
following: "フォローしとる"
|
||||
@@ -881,6 +883,11 @@ desktop/views/components/sub-note-content.vue:
|
||||
deleted: "この投稿なんか無くなってもうたわ"
|
||||
media-count: "{}つのメディア"
|
||||
poll: "アンケート"
|
||||
desktop/views/components/settings.tags.vue:
|
||||
title: "タグ"
|
||||
query: "クエリ (省略可)"
|
||||
add: "追加"
|
||||
save: "保存"
|
||||
desktop/views/components/taskmanager.vue:
|
||||
title: "タスクマネージャ"
|
||||
desktop/views/components/timeline.vue:
|
||||
@@ -963,6 +970,7 @@ admin/views/instance.vue:
|
||||
instance-description: "インスタンスの紹介"
|
||||
host: "ホスト"
|
||||
banner-url: "バナー画像URL"
|
||||
error-image-url: "エラー画像URL"
|
||||
languages: "インスタンスの対象言語"
|
||||
languages-desc: "スペースで区切って複数設定できるで。"
|
||||
maintainer-config: "管理者情報"
|
||||
|
@@ -297,8 +297,8 @@ common/views/components/theme.vue:
|
||||
common/views/components/cw-button.vue:
|
||||
hide: "숨기기"
|
||||
show: "더 보기"
|
||||
chars: "{count}文字"
|
||||
files: "{count}ファイル"
|
||||
chars: "{count}문자"
|
||||
files: "{count}파일"
|
||||
common/views/components/messaging.vue:
|
||||
search-user: "사용자 찾기"
|
||||
you: "당신"
|
||||
@@ -523,6 +523,8 @@ common/views/widgets/tips.vue:
|
||||
tips-line23: "마유 귀여워요 마유"
|
||||
tips-line24: "Misskey는 2014년에 서비스를 시작했습니다"
|
||||
tips-line25: "대응하는 브라우저인 경우 Misskey를 열어놓지 않아도 알림을 받을 수 있습니다"
|
||||
common/views/pages/404.vue:
|
||||
page-not-found: "ページが見つかりませんでした"
|
||||
common/views/pages/follow.vue:
|
||||
signed-in-as: "{}으로 로그인"
|
||||
following: "팔로우 중"
|
||||
@@ -875,12 +877,17 @@ common/views/components/password-settings.vue:
|
||||
enter-new-password-again: "다시 한 번 새 비밀번호를 입력하여 주십시오"
|
||||
not-match: "새 비밀번호가 일치하지 않습니다"
|
||||
changed: "비밀번호를 변경하였습니다"
|
||||
failed: "パスワード変更に失敗しました"
|
||||
failed: "비밀번호 변경을 실패하였습니다."
|
||||
desktop/views/components/sub-note-content.vue:
|
||||
private: "이 글은 비공개입니다"
|
||||
deleted: "이 글은 삭제되었습니다"
|
||||
media-count: "{}개의 미디어"
|
||||
poll: "투표"
|
||||
desktop/views/components/settings.tags.vue:
|
||||
title: "태그"
|
||||
query: "쿼리 (생략 가능)"
|
||||
add: "추가"
|
||||
save: "저장"
|
||||
desktop/views/components/taskmanager.vue:
|
||||
title: "작업 관리자"
|
||||
desktop/views/components/timeline.vue:
|
||||
@@ -963,6 +970,7 @@ admin/views/instance.vue:
|
||||
instance-description: "인스턴스의 소개"
|
||||
host: "관리자"
|
||||
banner-url: "배너 이미지 URL"
|
||||
error-image-url: "エラー画像URL"
|
||||
languages: "인스턴스의 대상 언어"
|
||||
languages-desc: "공백으로 구분하여 여러 개 설정할 수 있습니다."
|
||||
maintainer-config: "관리자 정보"
|
||||
|
@@ -523,6 +523,8 @@ common/views/widgets/tips.vue:
|
||||
tips-line23: "まゆかわいいよまゆ"
|
||||
tips-line24: "Misskeyは2014年にサービスを開始しました"
|
||||
tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
|
||||
common/views/pages/404.vue:
|
||||
page-not-found: "ページが見つかりませんでした"
|
||||
common/views/pages/follow.vue:
|
||||
signed-in-as: "{}としてサインイン中"
|
||||
following: "フォロー中"
|
||||
@@ -881,6 +883,11 @@ desktop/views/components/sub-note-content.vue:
|
||||
deleted: "この投稿は削除されました"
|
||||
media-count: "{}つのメディア"
|
||||
poll: "Peilingen"
|
||||
desktop/views/components/settings.tags.vue:
|
||||
title: "タグ"
|
||||
query: "クエリ (省略可)"
|
||||
add: "追加"
|
||||
save: "保存"
|
||||
desktop/views/components/taskmanager.vue:
|
||||
title: "Taakbeheer"
|
||||
desktop/views/components/timeline.vue:
|
||||
@@ -963,6 +970,7 @@ admin/views/instance.vue:
|
||||
instance-description: "インスタンスの紹介"
|
||||
host: "ホスト"
|
||||
banner-url: "バナー画像URL"
|
||||
error-image-url: "エラー画像URL"
|
||||
languages: "インスタンスの対象言語"
|
||||
languages-desc: "スペースで区切って複数設定できます。"
|
||||
maintainer-config: "管理者情報"
|
||||
|
@@ -523,6 +523,8 @@ common/views/widgets/tips.vue:
|
||||
tips-line23: "まゆかわいいよまゆ"
|
||||
tips-line24: "Misskeyは2014年にサービスを開始しました"
|
||||
tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
|
||||
common/views/pages/404.vue:
|
||||
page-not-found: "ページが見つかりませんでした"
|
||||
common/views/pages/follow.vue:
|
||||
signed-in-as: "{}としてサインイン中"
|
||||
following: "フォロー中"
|
||||
@@ -881,6 +883,11 @@ desktop/views/components/sub-note-content.vue:
|
||||
deleted: "この投稿は削除されました"
|
||||
media-count: "{}つのメディア"
|
||||
poll: "アンケート"
|
||||
desktop/views/components/settings.tags.vue:
|
||||
title: "タグ"
|
||||
query: "クエリ (省略可)"
|
||||
add: "追加"
|
||||
save: "保存"
|
||||
desktop/views/components/taskmanager.vue:
|
||||
title: "タスクマネージャ"
|
||||
desktop/views/components/timeline.vue:
|
||||
@@ -963,6 +970,7 @@ admin/views/instance.vue:
|
||||
instance-description: "インスタンスの紹介"
|
||||
host: "ホスト"
|
||||
banner-url: "バナー画像URL"
|
||||
error-image-url: "エラー画像URL"
|
||||
languages: "インスタンスの対象言語"
|
||||
languages-desc: "スペースで区切って複数設定できます。"
|
||||
maintainer-config: "管理者情報"
|
||||
|
@@ -10,14 +10,14 @@ common:
|
||||
title: "Czym jest Misskey?"
|
||||
about: "Misskeyはオープンソースの<b>分散型マイクロブログSNS</b>です。リッチで高度にカスタマイズできるUI、投稿へのリアクション、ファイルを一元管理できるドライブなど、先進的な機能を揃えています。また、Fediverseと呼ばれるネットワークに接続できるため、他のSNSともやり取りできます。例えば、あなたが何か投稿すると、その投稿はMisskeyだけでなく他のSNSにも伝わります。ちょうどある惑星から他の惑星に電波を発信している様子をイメージしてください。"
|
||||
features: "特徴"
|
||||
rich-contents: "投稿"
|
||||
rich-contents-desc: "自分の考え、話題の出来事、皆と共有したいことについて発信してください。必要であれば、様々な構文を使って投稿を装飾したり、好きな画像、動画などのファイルやアンケートを添付することもできます。"
|
||||
rich-contents: "Wpis"
|
||||
rich-contents-desc: "Po prostu opublikuj swój pomysł, gorące tematy i wszystko, co chcesz udostępnić. Możesz ozdobić swoje słowa, dołączyć swoje ulubione zdjęcia, wysłać pliki, w tym filmy i utworzyć ankietę - to są rzeczy, które możesz zrobić w Misskey!"
|
||||
reaction: "Reakcje"
|
||||
reaction-desc: "あなたの気持ちを伝える最も簡単な方法です。Misskeyは、他のユーザーの投稿に様々なリアクションを付けることができます。いちどMisskeyのリアクション機能を体験してしまうと、もう「いいね」の概念しか存在しないSNSには戻れなくなるかもしれません。"
|
||||
ui: "Interfejs"
|
||||
ui-desc: "どのようなUIが使いやすいかは人それぞれです。だから、Misskeyは自由度の高いUIを持っています。レイアウトやデザインを調整したり、カスタマイズ可能な様々なウィジェットを配置したりして、自分だけのホームを作ってください。"
|
||||
drive: "Dysk"
|
||||
drive-desc: "以前投稿したことのある画像をまた投稿したくなったことはありませんか?もしくは、アップロードしたファイルをフォルダ分けして整理したくなったことはありませんか?Misskeyの根幹に組み込まれたドライブ機能によってそれらが解決します。ファイルの共有も簡単です。"
|
||||
drive-desc: "Chcesz opublikować zdjęcie, które już przesłałeś? Chcesz uporządkować, nazwać i utworzyć folder dla przesłanych plików? Dysk Misskey to najlepsze rozwiązanie dla Ciebie. Bardzo łatwo udostępniać swoje pliki online."
|
||||
outro: "他にもMisskeyにしかない機能はまだまだあるので、ぜひあなた自身の目で確かめてください。Misskeyは分散型SNSなので、このインスタンスが気に入らなければ他のインスタンスを試すこともできます。それでは、GLHF!"
|
||||
adblock:
|
||||
detected: "Spróbuj wyłączyć blokadę reklam."
|
||||
@@ -72,7 +72,7 @@ common:
|
||||
friday: "Piątek"
|
||||
saturday: "Sobota"
|
||||
reactions:
|
||||
like: "いいね"
|
||||
like: "Lubię"
|
||||
love: "Kocham"
|
||||
laugh: "Śmieszne"
|
||||
hmm: "Hmm…?"
|
||||
@@ -116,27 +116,27 @@ common:
|
||||
disable-animated-mfm: "Wyłącz animowany tekst we wpisach"
|
||||
suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する"
|
||||
always-show-nsfw: "常に閲覧注意のメディアを表示する"
|
||||
always-mark-nsfw: "Zawsze oznaczaj posty z multimediom jako NSFW"
|
||||
always-mark-nsfw: "Zawsze oznaczaj posty z multimediami jako NSFW"
|
||||
show-full-acct: "ユーザー名のホストを省略しない"
|
||||
show-via: "viaを表示する"
|
||||
reduce-motion: "UIの動きを減らす"
|
||||
this-setting-is-this-device-only: "このデバイスのみ"
|
||||
use-os-default-emojis: "OS標準の絵文字を使用"
|
||||
use-os-default-emojis: "Użyj domyślnych Emoji systemowych"
|
||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||
is-remote-user: "Informacje o użytkowniku są kopiowane."
|
||||
is-remote-post: "この投稿情報はコピーです。"
|
||||
view-on-remote: "正確な情報を見る"
|
||||
renoted-by: "{user}がRenote"
|
||||
renoted-by: "{user} udostępnił(a)"
|
||||
error:
|
||||
title: '問題が発生しました'
|
||||
retry: 'やり直す'
|
||||
title: 'Coś poszło nie tak'
|
||||
retry: 'Ponów próbę'
|
||||
reversi:
|
||||
drawn: "Remis"
|
||||
my-turn: "Twoja kolej"
|
||||
opponent-turn: "Kolej na przeciwnika"
|
||||
turn-of: "{name}のターンです"
|
||||
past-turn-of: "{name}のターン"
|
||||
won: "{name}の勝ち"
|
||||
won: "{name} wygrał(a)"
|
||||
black: "Czarny"
|
||||
white: "Biały"
|
||||
total: "Łącznie"
|
||||
@@ -262,42 +262,42 @@ common/views/components/media-banner.vue:
|
||||
common/views/components/theme.vue:
|
||||
light-theme: "非ダークモード時に使用するテーマ"
|
||||
dark-theme: "ダークモード時に使用するテーマ"
|
||||
light-themes: "明るいテーマ"
|
||||
dark-themes: "暗いテーマ"
|
||||
light-themes: "Jasny Motyw"
|
||||
dark-themes: "Ciemny motyw"
|
||||
install-a-theme: "Zainstaluj motyw"
|
||||
theme-code: "テーマコード"
|
||||
install: "インストール"
|
||||
installed: "「{}」をインストールしました"
|
||||
theme-code: "Kod motywu"
|
||||
install: "Zainstaluj"
|
||||
installed: "\"{}\" został zainstalowany"
|
||||
create-a-theme: "Stwórz motyw"
|
||||
save-created-theme: "テーマを保存"
|
||||
save-created-theme: "Zapisz motyw"
|
||||
primary-color: "Kolor podstawowy"
|
||||
secondary-color: "Kolor dodatkowy"
|
||||
text-color: "Kolor tekstu"
|
||||
base-theme: "Podstawowy motyw"
|
||||
base-theme-light: "Light"
|
||||
base-theme-dark: "Dark"
|
||||
theme-name: "テーマ名"
|
||||
preview-created-theme: "プレビュー"
|
||||
base-theme-light: "Jasny"
|
||||
base-theme-dark: "Ciemny"
|
||||
theme-name: "Nazwa motywu"
|
||||
preview-created-theme: "Pokaż podgląd"
|
||||
invalid-theme: "テーマが正しくありません。"
|
||||
already-installed: "既にそのテーマはインストールされています。"
|
||||
already-installed: "Ten motyw jest już zainstalowany"
|
||||
saved: "Zapisano"
|
||||
manage-themes: "Zarządzanie motywami"
|
||||
builtin-themes: "標準テーマ"
|
||||
my-themes: "マイテーマ"
|
||||
installed-themes: "インストールされたテーマ"
|
||||
builtin-themes: "Standardowe motywy"
|
||||
my-themes: "Moje motywy"
|
||||
installed-themes: "Zainstalowane motywy"
|
||||
select-theme: "テーマを選択してください"
|
||||
uninstall: "アンインストール"
|
||||
uninstalled: "「{}」をアンインストールしました"
|
||||
author: "作者"
|
||||
desc: "説明"
|
||||
uninstall: "Odinstaluj"
|
||||
uninstalled: "\"{}\" został odinstalowany"
|
||||
author: "Author"
|
||||
desc: "Opis"
|
||||
export: "エクスポート"
|
||||
import: "インポート"
|
||||
import: "Importuj"
|
||||
import-by-code: "lub wklej kod"
|
||||
theme-name-required: "テーマ名は必須です。"
|
||||
theme-name-required: "Nazwa motywu jest obowiązkowa."
|
||||
common/views/components/cw-button.vue:
|
||||
hide: "Ukryj"
|
||||
show: "Pokaż więcej"
|
||||
chars: "{count}文字"
|
||||
chars: "{count} znaków"
|
||||
files: "{count}ファイル"
|
||||
common/views/components/messaging.vue:
|
||||
search-user: "Znajdź użytkownika"
|
||||
@@ -328,12 +328,12 @@ common/views/components/nav.vue:
|
||||
develop: "Autorzy"
|
||||
feedback: "Podziel się opinią"
|
||||
common/views/components/note-menu.vue:
|
||||
detail: "詳細"
|
||||
copy-link: "リンクをコピー"
|
||||
detail: "Szczegóły"
|
||||
copy-link: "Skopiuj adres"
|
||||
favorite: "Dodaj do ulubionych"
|
||||
unfavorite: "お気に入り解除"
|
||||
unfavorite: "Usuń z ulubionych"
|
||||
pin: "Przypnij do profilu"
|
||||
unpin: "ピン留め解除"
|
||||
unpin: "Odepnij"
|
||||
delete: "Usuń"
|
||||
delete-confirm: "Czy na pewno chcesz usunąć ten wpis?"
|
||||
remote: "Pokaż oryginał"
|
||||
@@ -353,15 +353,15 @@ common/views/components/poll-editor.vue:
|
||||
common/views/components/reaction-picker.vue:
|
||||
choose-reaction: "Wybierz reakcję"
|
||||
common/views/components/emoji-picker.vue:
|
||||
custom-emoji: "カスタム絵文字"
|
||||
custom-emoji: "Niestandardowe Emoji"
|
||||
people: "Ludzie"
|
||||
animals-and-nature: "動物&自然"
|
||||
food-and-drink: "食べ物&飲み物"
|
||||
activity: "アクティビティ"
|
||||
travel-and-places: "場所"
|
||||
objects: "物"
|
||||
symbols: "記号"
|
||||
flags: "旗"
|
||||
animals-and-nature: "Zwierzęta i Natura"
|
||||
food-and-drink: "Żywność i napoje"
|
||||
activity: "Aktywność"
|
||||
travel-and-places: "Podróże i Miejsca"
|
||||
objects: "Rzeczy"
|
||||
symbols: "Symbole"
|
||||
flags: "Flagi"
|
||||
common/views/components/signin.vue:
|
||||
username: "Nazwa użytkownika"
|
||||
password: "Hasło"
|
||||
@@ -405,21 +405,21 @@ common/views/components/stream-indicator.vue:
|
||||
connected: "Połączono"
|
||||
common/views/components/integration-settings.vue:
|
||||
title: "サービス連携"
|
||||
connect: "接続する"
|
||||
connect: "Połącz"
|
||||
disconnect: "切断する"
|
||||
connected-to: "次のアカウントに接続されています"
|
||||
common/views/components/github-setting.vue:
|
||||
description: "お使いのGitHubアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでGitHubアカウント情報が表示されるようになったり、GitHubを用いた便利なサインインを利用できるようになります。"
|
||||
connected-to: "次のGitHubアカウントに接続されています"
|
||||
detail: "詳細..."
|
||||
reconnect: "再接続する"
|
||||
detail: "Więcej..."
|
||||
reconnect: "Połącz ponownie"
|
||||
connect: "GitHubと接続する"
|
||||
disconnect: "切断する"
|
||||
common/views/components/discord-setting.vue:
|
||||
description: "お使いのDiscordアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでDiscordアカウント情報が表示されるようになったり、Discordを用いた便利なサインインを利用できるようになります。"
|
||||
connected-to: "次のDiscordアカウントに接続されています"
|
||||
detail: "詳細..."
|
||||
reconnect: "再接続する"
|
||||
detail: "Szczegóły…"
|
||||
reconnect: "Połącz ponownie"
|
||||
connect: "Discordと接続する"
|
||||
disconnect: "切断する"
|
||||
common/views/components/uploader.vue:
|
||||
@@ -436,15 +436,15 @@ common/views/components/visibility-chooser.vue:
|
||||
local-public: "公開 (ローカルのみ)"
|
||||
local-public-desc: "リモートへは公開しない"
|
||||
local-home: "ホーム (ローカルのみ)"
|
||||
local-followers: "フォロワー (ローカルのみ)"
|
||||
local-followers: "Dla śledzących (tylko lokalnie)"
|
||||
common/views/components/trends.vue:
|
||||
count: "{}人が投稿"
|
||||
empty: "トレンドなし"
|
||||
common/views/components/language-settings.vue:
|
||||
title: "Język"
|
||||
pick-language: "言語を選択"
|
||||
recommended: "推奨"
|
||||
auto: "自動"
|
||||
pick-language: "Wybierz język"
|
||||
recommended: "Zalecane"
|
||||
auto: "Automatyczny"
|
||||
specify-language: "言語を指定"
|
||||
info: "Musisz odświeżyć stronę, aby zmiany zostały uwzględnione."
|
||||
common/views/components/profile-editor.vue:
|
||||
@@ -453,13 +453,13 @@ common/views/components/profile-editor.vue:
|
||||
account: "Konto"
|
||||
location: "Lokalizacja"
|
||||
description: "O mnie"
|
||||
language: "言語"
|
||||
birthday: "誕生日"
|
||||
language: "Język"
|
||||
birthday: "Data urodzenia"
|
||||
avatar: "Awatar"
|
||||
banner: "バナー"
|
||||
banner: "Baner"
|
||||
is-cat: "To konto jest prowadzone przez kota"
|
||||
is-bot: "To konto jest prowadzone przez bota"
|
||||
is-locked: "フォローを承認制にする"
|
||||
is-locked: "Żądanania śledzenia wymagają zatwierdzenia"
|
||||
careful-bot: "Botからのフォローだけ承認制にする"
|
||||
advanced: "Inne"
|
||||
privacy: "Prywatność"
|
||||
@@ -468,7 +468,7 @@ common/views/components/profile-editor.vue:
|
||||
uploading: "アップロード中"
|
||||
upload-failed: "アップロードに失敗しました"
|
||||
email: "メール設定"
|
||||
email-address: "メールアドレス"
|
||||
email-address: "Adres e-mail"
|
||||
email-verified: "メールアドレスが確認されました"
|
||||
email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
|
||||
common/views/widgets/broadcast.vue:
|
||||
@@ -523,6 +523,8 @@ common/views/widgets/tips.vue:
|
||||
tips-line23: "まゆかわいいよまゆ"
|
||||
tips-line24: "Misskey zaczął działać w 2014."
|
||||
tips-line25: "Możesz otrzymywać powiadomienia nawet jeżeli Misskey nie jest otwarty w obsługiwanej przeglądarce."
|
||||
common/views/pages/404.vue:
|
||||
page-not-found: "ページが見つかりませんでした"
|
||||
common/views/pages/follow.vue:
|
||||
signed-in-as: "Zalogowany jako {}"
|
||||
following: "Śledzisz"
|
||||
@@ -556,7 +558,7 @@ desktop/views/components/calendar.vue:
|
||||
next: "Następny miesiąc"
|
||||
go: "Naciśnij, aby przejść"
|
||||
desktop/views/components/choose-file-from-drive-window.vue:
|
||||
chosen-files: "{count}ファイル選択中"
|
||||
chosen-files: "Wybrano {count} Plik(ów)"
|
||||
upload: "Wyślij pliki z Twojego komputera"
|
||||
cancel: "Anuluj"
|
||||
ok: "OK"
|
||||
@@ -656,13 +658,13 @@ desktop/views/components/note-detail.vue:
|
||||
private: "ten wpis jest prywatny"
|
||||
deleted: "ten wpis został usunięty"
|
||||
location: "Informacje o lokalizacji"
|
||||
renote: "Udostępnienie"
|
||||
renote: "Udostępnij"
|
||||
add-reaction: "Dodaj reakcję"
|
||||
desktop/views/components/note.vue:
|
||||
reply: "返信"
|
||||
reply: "Odpowiedz"
|
||||
renote: "Renote"
|
||||
add-reaction: "リアクション"
|
||||
detail: "詳細"
|
||||
add-reaction: "Dodaj reakcję"
|
||||
detail: "Szczegóły"
|
||||
private: "この投稿は非公開です"
|
||||
deleted: "この投稿は削除されました"
|
||||
desktop/views/components/notes.vue:
|
||||
@@ -740,10 +742,10 @@ desktop/views/components/settings.vue:
|
||||
fetch-on-scroll: "Automatycznie ładuj po przeciągnięciu w dół"
|
||||
fetch-on-scroll-desc: "Po przewinięciu na dół strony automatycznie zostaną załadowane nowe treści."
|
||||
note-visibility: "Widoczność wpisów"
|
||||
default-note-visibility: "デフォルトの公開範囲"
|
||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||
web-search-engine: "ウェブ検索エンジン"
|
||||
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
|
||||
default-note-visibility: "Domyślna widoczność"
|
||||
remember-note-visibility: "Zapamiętaj widoczność wpisów"
|
||||
web-search-engine: "Wyszukiwarka internetowa"
|
||||
web-search-engine-desc: "Np: https://www.google.com/?#q={{query}}"
|
||||
auto-popout: "Automatycznie pojawiające się okna"
|
||||
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
||||
advanced: "Ustawienia zaawansowane"
|
||||
@@ -754,18 +756,18 @@ desktop/views/components/settings.vue:
|
||||
deck-default: "デッキをデフォルトのUIにする"
|
||||
display: "Wygląd i wyświetlanie"
|
||||
customize: "Dostosuj stronę główną"
|
||||
wallpaper: "壁紙"
|
||||
wallpaper: "Tapeta"
|
||||
choose-wallpaper: "Wybierz tło"
|
||||
delete-wallpaper: "Usuń tło"
|
||||
dark-mode: "Tryb ciemny"
|
||||
use-shadow: "UIに影を使用"
|
||||
rounded-corners: "UIの角を丸める"
|
||||
rounded-corners: "Zaokrąglaj rogi w UI"
|
||||
circle-icons: "Używaj okrągłych ikon"
|
||||
contrasted-acct: "ユーザー名にコントラストを付ける"
|
||||
post-form-on-timeline: "Wyświetlaj formularz tworzenia wpisu w górnej części osi czasu"
|
||||
show-clock-on-header: "右上に時計を表示する"
|
||||
show-reply-target: "Pokazuj cel odpowiedzi"
|
||||
timeline: "タイムライン"
|
||||
timeline: "Oś czasu"
|
||||
show-my-renotes: "Pokazuj moje udostępnienia na osi czasu"
|
||||
show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する"
|
||||
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
|
||||
@@ -774,13 +776,13 @@ desktop/views/components/settings.vue:
|
||||
deck-column-align: "デッキのカラムの配置"
|
||||
deck-column-align-center: "中央"
|
||||
deck-column-align-left: "左"
|
||||
deck-column-align-flexible: "フレキシブル"
|
||||
deck-column-width: "デッキのカラムの幅"
|
||||
deck-column-width-narrow: "狭"
|
||||
deck-column-align-flexible: "Elastyczne"
|
||||
deck-column-width: "Szerokość kolumn w talii"
|
||||
deck-column-width-narrow: "wąskie"
|
||||
deck-column-width-narrower: "やや狭"
|
||||
deck-column-width-normal: "普通"
|
||||
deck-column-width-normal: "Normalny"
|
||||
deck-column-width-wider: "やや広"
|
||||
deck-column-width-wide: "広"
|
||||
deck-column-width-wide: "szeroki"
|
||||
sound: "Dźwięk"
|
||||
enable-sounds: "Włącz dźwięk"
|
||||
enable-sounds-desc: "Odtwarzaj dźwięk przy wstawianiu wpisów, wysyłaniu lub otrzymywaniu wiadomości. Opcja ta jest zapamiętywana przez przeglądarkę."
|
||||
@@ -840,36 +842,36 @@ desktop/views/components/settings.2fa.vue:
|
||||
common/views/components/api-settings.vue:
|
||||
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
|
||||
caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
|
||||
regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
|
||||
regenerate-token: "トークンを再生成"
|
||||
regeneration-of-token: "W przypadku wycieku tokenu, możesz wygenerować nowy."
|
||||
regenerate-token: "Wygeneruj nowy token"
|
||||
token: "Token:"
|
||||
enter-password: "パスワードを入力してください"
|
||||
enter-password: "Wprowadź hasło"
|
||||
console:
|
||||
title: 'Konsola API'
|
||||
endpoint: 'エンドポイント'
|
||||
parameter: 'パラメータ'
|
||||
parameter: 'Parametry'
|
||||
credential-info: "「i」パラメータは自動で付与されます。"
|
||||
send: '送信'
|
||||
send: 'Wyślij'
|
||||
sending: '応答待ち'
|
||||
response: '結果'
|
||||
desktop/views/components/settings.apps.vue:
|
||||
no-apps: "Brak zautoryzowanych aplikacji"
|
||||
common/views/components/drive-settings.vue:
|
||||
max: "容量"
|
||||
in-use: "使用中"
|
||||
max: "Max"
|
||||
in-use: "użyto"
|
||||
stats: "Statystyki"
|
||||
common/views/components/mute-and-block.vue:
|
||||
mute-and-block: "Wyczisz / Zablokuj"
|
||||
mute: "ミュート"
|
||||
mute-and-block: "Wycisz / Zablokuj"
|
||||
mute: "Wycisz"
|
||||
block: "ブロック"
|
||||
no-muted-users: "Brak wyciszonych użytkowników"
|
||||
no-blocked-users: "Brak zablokowanych użytkowników"
|
||||
word-mute: "ワードミュート"
|
||||
word-mute: "Wyciszenie słowa"
|
||||
muted-words: "ミュートされたキーワード"
|
||||
muted-words-description: "スペースで区切るとAND指定になり、改行で区切るとOR指定になります"
|
||||
save: "Zapisz"
|
||||
common/views/components/password-settings.vue:
|
||||
reset: "パスワードを変更する"
|
||||
reset: "Zmień hasło"
|
||||
enter-current-password: "現在のパスワードを入力してください"
|
||||
enter-new-password: "新しいパスワードを入力してください"
|
||||
enter-new-password-again: "もう一度新しいパスワードを入力してください"
|
||||
@@ -881,6 +883,11 @@ desktop/views/components/sub-note-content.vue:
|
||||
deleted: "ten wpis został usunięty"
|
||||
media-count: "{}zawartości multimedialnej"
|
||||
poll: "Ankieta"
|
||||
desktop/views/components/settings.tags.vue:
|
||||
title: "タグ"
|
||||
query: "クエリ (省略可)"
|
||||
add: "Dodaj"
|
||||
save: "Zapisz"
|
||||
desktop/views/components/taskmanager.vue:
|
||||
title: "Menedżer zadań"
|
||||
desktop/views/components/timeline.vue:
|
||||
@@ -904,7 +911,7 @@ desktop/views/components/ui.header.account.vue:
|
||||
lists: "Listy"
|
||||
follow-requests: "Prośby o śledzenie"
|
||||
customize: "Dostosuj stronę główną"
|
||||
admin: "管理"
|
||||
admin: "Admin"
|
||||
settings: "Ustawienia"
|
||||
signout: "Wyloguj się"
|
||||
dark: "Sprowadź ciemność"
|
||||
@@ -940,10 +947,10 @@ desktop/views/components/window.vue:
|
||||
popout: "Pop-out"
|
||||
close: "Zamknij"
|
||||
admin/views/index.vue:
|
||||
dashboard: "ダッシュボード"
|
||||
instance: "インスタンス"
|
||||
emoji: "カスタム絵文字"
|
||||
moderators: "モデレーター"
|
||||
dashboard: "Kokpit"
|
||||
instance: "Instancja"
|
||||
emoji: "Emoji"
|
||||
moderators: "Moderatorzy"
|
||||
users: "ユーザー"
|
||||
federation: "連合"
|
||||
announcements: "Ogłoszenia"
|
||||
@@ -952,7 +959,7 @@ admin/views/index.vue:
|
||||
admin/views/dashboard.vue:
|
||||
dashboard: "ダッシュボード"
|
||||
accounts: "Konta"
|
||||
notes: "投稿"
|
||||
notes: "Wpisy"
|
||||
drive: "ドライブ"
|
||||
instances: "インスタンス"
|
||||
this-instance: "このインスタンス"
|
||||
@@ -963,6 +970,7 @@ admin/views/instance.vue:
|
||||
instance-description: "インスタンスの紹介"
|
||||
host: "ホスト"
|
||||
banner-url: "バナー画像URL"
|
||||
error-image-url: "エラー画像URL"
|
||||
languages: "インスタンスの対象言語"
|
||||
languages-desc: "スペースで区切って複数設定できます。"
|
||||
maintainer-config: "管理者情報"
|
||||
@@ -1002,13 +1010,13 @@ admin/views/instance.vue:
|
||||
max-note-text-length: "投稿の最大文字数"
|
||||
disable-registration: "ユーザー登録の受付を停止する"
|
||||
disable-local-timeline: "ローカルタイムラインを無効にする"
|
||||
invite: "招待"
|
||||
invite: "Zaproś"
|
||||
save: "Zapisz"
|
||||
saved: "Zapisano"
|
||||
user-recommendation-config: "おすすめユーザー"
|
||||
user-recommendation-config: "Polecani użytkownicy"
|
||||
enable-external-user-recommendation: "外部ユーザーレコメンデーションを有効にする"
|
||||
external-user-recommendation-engine: "エンジン"
|
||||
external-user-recommendation-engine-desc: "例: https://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}}"
|
||||
external-user-recommendation-engine: "Silnik"
|
||||
external-user-recommendation-engine-desc: "Np: https://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}}"
|
||||
external-user-recommendation-timeout: "タイムアウト"
|
||||
external-user-recommendation-timeout-desc: "ミリ秒単位 (例: 300000)"
|
||||
email-config: "メールサーバーの設定"
|
||||
@@ -1026,10 +1034,10 @@ admin/views/charts.vue:
|
||||
per-day: "1日ごと"
|
||||
per-hour: "1時間ごと"
|
||||
federation: "フェデレーション"
|
||||
notes: "投稿"
|
||||
users: "ユーザー"
|
||||
drive: "ドライブ"
|
||||
network: "ネットワーク"
|
||||
notes: "Wpisy"
|
||||
users: "Użytkownicy"
|
||||
drive: "Dysk"
|
||||
network: "Sieć"
|
||||
charts:
|
||||
federation-instances: "インスタンスの増減"
|
||||
federation-instances-total: "インスタンスの積算"
|
||||
@@ -1043,8 +1051,8 @@ admin/views/charts.vue:
|
||||
drive-total: "ドライブ使用量の積算"
|
||||
drive-files: "ドライブのファイル数の増減"
|
||||
drive-files-total: "ドライブのファイル数の積算"
|
||||
network-requests: "リクエスト"
|
||||
network-time: "応答時間"
|
||||
network-requests: "Żądania"
|
||||
network-time: "Czas reakcji"
|
||||
network-usage: "通信量"
|
||||
admin/views/users.vue:
|
||||
operation: "操作"
|
||||
@@ -1062,55 +1070,55 @@ admin/views/users.vue:
|
||||
unverify: "公式アカウントを解除する"
|
||||
unverified: "公式アカウントを解除しました"
|
||||
users:
|
||||
title: "ユーザー"
|
||||
title: "Użytkownicy"
|
||||
sort:
|
||||
title: "ソート"
|
||||
title: "Sortuj"
|
||||
createdAtAsc: "登録日時が古い順"
|
||||
createdAtDesc: "登録日時が新しい順"
|
||||
updatedAtAsc: "更新日時が古い順"
|
||||
updatedAtDesc: "更新日時が新しい順"
|
||||
origin:
|
||||
title: "オリジン"
|
||||
title: "Źródło"
|
||||
combined: "ローカル+リモート"
|
||||
local: "ローカル"
|
||||
remote: "リモート"
|
||||
createdAt: "登録日時"
|
||||
local: "Lokalny"
|
||||
remote: "Zdalny"
|
||||
createdAt: "Utworzono"
|
||||
updatedAt: "更新日時"
|
||||
admin/views/moderators.vue:
|
||||
add-moderator:
|
||||
title: "モデレーターの登録"
|
||||
add: "登録"
|
||||
add: "Zarejestruj się"
|
||||
added: "モデレーターを登録しました"
|
||||
admin/views/emoji.vue:
|
||||
add-emoji:
|
||||
title: "絵文字の登録"
|
||||
name: "絵文字名"
|
||||
name: "Nazwa Emoji"
|
||||
name-desc: "a~z 0~9 _ の文字が使えます。"
|
||||
aliases: "エイリアス"
|
||||
aliases: "Aliasy"
|
||||
aliases-desc: "スペースで区切って複数設定できます。"
|
||||
url: "絵文字画像URL"
|
||||
add: "追加"
|
||||
add: "Dodaj"
|
||||
info: "50KB以下のPNG画像をおすすめします。"
|
||||
added: "絵文字を登録しました"
|
||||
emojis:
|
||||
title: "絵文字一覧"
|
||||
update: "更新"
|
||||
remove: "削除"
|
||||
updated: "更新しました"
|
||||
update: "Aktualizuj"
|
||||
remove: "Usuń"
|
||||
updated: "Zaktualizowano"
|
||||
remove-emoji:
|
||||
are-you-sure: "「$1」を削除しますか?"
|
||||
removed: "削除しました"
|
||||
are-you-sure: "Usunąć \"$1\"?"
|
||||
removed: "Usunięto"
|
||||
admin/views/announcements.vue:
|
||||
announcements: "Ogłoszenia"
|
||||
save: "Zapisz"
|
||||
remove: "削除"
|
||||
add: "追加"
|
||||
title: "タイトル"
|
||||
remove: "Usuń"
|
||||
add: "Dodaj"
|
||||
title: "Tytuł"
|
||||
text: "内容"
|
||||
saved: "Zapisano"
|
||||
_remove:
|
||||
are-you-sure: "「$1」を削除しますか?"
|
||||
removed: "削除しました"
|
||||
are-you-sure: "Usunąć \"$1\"?"
|
||||
removed: "Usunięto"
|
||||
admin/views/hashtags.vue:
|
||||
hided-tags: "Hidden Tags"
|
||||
desktop/views/pages/welcome.vue:
|
||||
@@ -1179,9 +1187,9 @@ desktop/views/pages/user/user.header.vue:
|
||||
followers: "Śledzący"
|
||||
is-bot: "To konto jest botem"
|
||||
years-old: "{age} lat"
|
||||
year: "年"
|
||||
month: "月"
|
||||
day: "日"
|
||||
year: "/"
|
||||
month: "/"
|
||||
day: "-"
|
||||
desktop/views/pages/user/user.timeline.vue:
|
||||
default: "Wpisy"
|
||||
with-replies: "Wpisy i odpowiedzi"
|
||||
@@ -1309,7 +1317,7 @@ mobile/views/components/ui.nav.vue:
|
||||
game: "Gry"
|
||||
darkmode: "Tryb ciemny"
|
||||
settings: "Ustawienia"
|
||||
admin: "管理"
|
||||
admin: "Admin"
|
||||
about: "O Misskey"
|
||||
mobile/views/components/user-timeline.vue:
|
||||
no-notes: "Wygląda na to, że ten użytkownik nie opublikował jeszcze niczego"
|
||||
@@ -1382,16 +1390,16 @@ mobile/views/pages/settings.vue:
|
||||
post-style-standard: "Standardowy"
|
||||
post-style-smart: "Inteligentny"
|
||||
notification-position: "通知の表示"
|
||||
notification-position-bottom: "下"
|
||||
notification-position-top: "上"
|
||||
notification-position-bottom: "Dół"
|
||||
notification-position-top: "Góra"
|
||||
theme: "Motyw"
|
||||
behavior: "Zachowanie"
|
||||
fetch-on-scroll: "Automatycznie ładuj po przeciągnięciu w dół"
|
||||
note-visibility: "Widoczność wpisów"
|
||||
default-note-visibility: "デフォルトの公開範囲"
|
||||
remember-note-visibility: "投稿の公開範囲を記憶する"
|
||||
web-search-engine: "ウェブ検索エンジン"
|
||||
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
|
||||
default-note-visibility: "Domyślna widoczność"
|
||||
remember-note-visibility: "Zapamiętaj widoczność wpisów"
|
||||
web-search-engine: "Wyszukiwarka internetowa"
|
||||
web-search-engine-desc: "Np: https://www.google.com/?#q={{query}}"
|
||||
disable-via-mobile: "Nie oznaczaj wpisów jako „wysłane z telefonu”"
|
||||
load-raw-images: "Wyświetlaj załączone zdjęcia w wysokiej jakości"
|
||||
load-remote-media: "Wyświetlaj zawartość multimedialną ze zdalnych serwerów"
|
||||
@@ -1419,12 +1427,12 @@ mobile/views/pages/user.vue:
|
||||
timeline: "Oś czasu"
|
||||
media: "Multimedia"
|
||||
is-suspended: "To konto zostało zablokowane"
|
||||
mute: "ミュート"
|
||||
mute: "Wycisz"
|
||||
unmute: "ミュート解除"
|
||||
block: "ブロック"
|
||||
unblock: "ブロック解除"
|
||||
block: "Zablokuj"
|
||||
unblock: "Odblokuj"
|
||||
years-old: "{age} lat"
|
||||
push-to-list: "リストに追加"
|
||||
push-to-list: "Dodaj do listy"
|
||||
select-list: "Wybierz listę"
|
||||
list-pushed: "{user}を{list}に追加しました"
|
||||
mobile/views/pages/user/home.vue:
|
||||
@@ -1445,38 +1453,38 @@ mobile/views/pages/user/home.notes.vue:
|
||||
mobile/views/pages/user/home.photos.vue:
|
||||
no-photos: "Brak zdjęć"
|
||||
deck:
|
||||
widgets: "ウィジェット"
|
||||
home: "ホーム"
|
||||
local: "ローカル"
|
||||
hybrid: "ソーシャル"
|
||||
widgets: "Widżety"
|
||||
home: "Strona główna"
|
||||
local: "Lokalne"
|
||||
hybrid: "Społeczność"
|
||||
hashtag: "Hashtag"
|
||||
global: "グローバル"
|
||||
global: "Globalne"
|
||||
mentions: "Wspomnienia"
|
||||
direct: "ダイレクト投稿"
|
||||
notifications: "通知"
|
||||
list: "リスト"
|
||||
swap-left: "左に移動"
|
||||
swap-right: "右に移動"
|
||||
direct: "Bezpośrednie wpisy"
|
||||
notifications: "Powiadomienia"
|
||||
list: "Listy"
|
||||
swap-left: "Przesuń w lewo"
|
||||
swap-right: "Przesuń w prawo"
|
||||
swap-up: "上に移動"
|
||||
swap-down: "下に移動"
|
||||
remove: "カラムを削除"
|
||||
add-column: "カラムを追加"
|
||||
remove: "Usuń"
|
||||
add-column: "Dodaj kolumnę"
|
||||
rename: "Zmień nazwę"
|
||||
stack-left: "左に重ねる"
|
||||
stack-left: "Przypnij do lewej"
|
||||
pop-right: "右に出す"
|
||||
deck/deck.tl-column.vue:
|
||||
is-media-only: "メディア投稿のみ"
|
||||
is-media-view: "メディアビュー"
|
||||
edit: "オプション"
|
||||
is-media-only: "Tylko wpisy z zawartością multimedialną"
|
||||
is-media-view: "Widok multimediów"
|
||||
edit: "Opcje"
|
||||
deck/deck.user-column.vue:
|
||||
posts: "投稿"
|
||||
following: "フォロー"
|
||||
followers: "フォロワー"
|
||||
images: "画像"
|
||||
activity: "アクティビティ"
|
||||
timeline: "タイムライン"
|
||||
pinned-notes: "ピン留めされた投稿"
|
||||
push-to-a-list: "リストに追加"
|
||||
posts: "Wpisy"
|
||||
following: "Śledzeni"
|
||||
followers: "Śledzący"
|
||||
images: "Zdjęcia"
|
||||
activity: "Aktywność"
|
||||
timeline: "Oś czasu"
|
||||
pinned-notes: "Przypięte posty"
|
||||
push-to-a-list: "Dodaj do listy"
|
||||
docs:
|
||||
edit-this-page-on-github: "Znalazłeś błąd lub chcesz pomóc w tworzeniu dokumentacji?"
|
||||
edit-this-page-on-github-link: "Edytuj stronę na GitHubie!"
|
||||
@@ -1502,12 +1510,12 @@ docs:
|
||||
dev/views/index.vue:
|
||||
manage-apps: "Zarządzaj aplikacjami"
|
||||
dev/views/apps.vue:
|
||||
manage-apps: "アプリを管理"
|
||||
manage-apps: "Zarządzaj aplikacjami"
|
||||
create-app: "アプリ作成"
|
||||
app-missing: "アプリなし"
|
||||
app-missing: "Brak aplikacji"
|
||||
dev/views/new-app.vue:
|
||||
create-app: "アプリケーションの作成"
|
||||
app-name: "アプリケーション名"
|
||||
app-name: "Nazwa Aplikacji"
|
||||
app-name-desc: "あなたのアプリの名称。"
|
||||
app-name-ex: "ex) Misskey for iOS"
|
||||
app-overview: "アプリの概要"
|
||||
@@ -1515,7 +1523,7 @@ dev/views/new-app.vue:
|
||||
app-desc-ex: "ex) Misskey iOSクライアント。"
|
||||
callback-url: "コールバックURL (オプション)"
|
||||
callback-url-desc: "ユーザーが認証フォームで認証した際にリダイレクトするURLを設定できます。"
|
||||
authority: "権限"
|
||||
authority: "Uprawnienia"
|
||||
authority-desc: "ここで要求した機能だけがAPIからアクセスできます。"
|
||||
authority-warning: "アプリ作成後も変更できますが、新たな権限を付与する場合、その時点で関連付けられているユーザーキーはすべて無効になります。"
|
||||
account-read: "アカウントの情報を見る。"
|
||||
|
@@ -523,6 +523,8 @@ common/views/widgets/tips.vue:
|
||||
tips-line23: "まゆかわいいよまゆ"
|
||||
tips-line24: "Misskeyは2014年にサービスを開始しました"
|
||||
tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
|
||||
common/views/pages/404.vue:
|
||||
page-not-found: "ページが見つかりませんでした"
|
||||
common/views/pages/follow.vue:
|
||||
signed-in-as: "{}としてサインイン中"
|
||||
following: "フォロー中"
|
||||
@@ -881,6 +883,11 @@ desktop/views/components/sub-note-content.vue:
|
||||
deleted: "この投稿は削除されました"
|
||||
media-count: "{}つのメディア"
|
||||
poll: "アンケート"
|
||||
desktop/views/components/settings.tags.vue:
|
||||
title: "タグ"
|
||||
query: "クエリ (省略可)"
|
||||
add: "追加"
|
||||
save: "保存"
|
||||
desktop/views/components/taskmanager.vue:
|
||||
title: "タスクマネージャ"
|
||||
desktop/views/components/timeline.vue:
|
||||
@@ -963,6 +970,7 @@ admin/views/instance.vue:
|
||||
instance-description: "インスタンスの紹介"
|
||||
host: "ホスト"
|
||||
banner-url: "バナー画像URL"
|
||||
error-image-url: "エラー画像URL"
|
||||
languages: "インスタンスの対象言語"
|
||||
languages-desc: "スペースで区切って複数設定できます。"
|
||||
maintainer-config: "管理者情報"
|
||||
|
@@ -523,6 +523,8 @@ common/views/widgets/tips.vue:
|
||||
tips-line23: "まゆかわいいよまゆ"
|
||||
tips-line24: "Misskeyは2014年にサービスを開始しました"
|
||||
tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
|
||||
common/views/pages/404.vue:
|
||||
page-not-found: "ページが見つかりませんでした"
|
||||
common/views/pages/follow.vue:
|
||||
signed-in-as: "{}としてサインイン中"
|
||||
following: "フォロー中"
|
||||
@@ -881,6 +883,11 @@ desktop/views/components/sub-note-content.vue:
|
||||
deleted: "この投稿は削除されました"
|
||||
media-count: "{}つのメディア"
|
||||
poll: "アンケート"
|
||||
desktop/views/components/settings.tags.vue:
|
||||
title: "タグ"
|
||||
query: "クエリ (省略可)"
|
||||
add: "追加"
|
||||
save: "保存"
|
||||
desktop/views/components/taskmanager.vue:
|
||||
title: "タスクマネージャ"
|
||||
desktop/views/components/timeline.vue:
|
||||
@@ -963,6 +970,7 @@ admin/views/instance.vue:
|
||||
instance-description: "インスタンスの紹介"
|
||||
host: "ホスト"
|
||||
banner-url: "バナー画像URL"
|
||||
error-image-url: "エラー画像URL"
|
||||
languages: "インスタンスの対象言語"
|
||||
languages-desc: "スペースで区切って複数設定できます。"
|
||||
maintainer-config: "管理者情報"
|
||||
|
@@ -523,6 +523,8 @@ common/views/widgets/tips.vue:
|
||||
tips-line23: "Mayu的眉毛非常可爱。"
|
||||
tips-line24: "Misskey自2014年开始运营。"
|
||||
tips-line25: "在与通知功能兼容的浏览器中,您可以在Misskey未打开的情况下接收通知"
|
||||
common/views/pages/404.vue:
|
||||
page-not-found: "ページが見つかりませんでした"
|
||||
common/views/pages/follow.vue:
|
||||
signed-in-as: "用 {}登录"
|
||||
following: "正在关注"
|
||||
@@ -881,6 +883,11 @@ desktop/views/components/sub-note-content.vue:
|
||||
deleted: "帖子已删除"
|
||||
media-count: "附加{}媒体"
|
||||
poll: "投票"
|
||||
desktop/views/components/settings.tags.vue:
|
||||
title: "タグ"
|
||||
query: "クエリ (省略可)"
|
||||
add: "追加"
|
||||
save: "保存"
|
||||
desktop/views/components/taskmanager.vue:
|
||||
title: "任务管理器"
|
||||
desktop/views/components/timeline.vue:
|
||||
@@ -963,6 +970,7 @@ admin/views/instance.vue:
|
||||
instance-description: "实例介绍"
|
||||
host: "主机名"
|
||||
banner-url: "背景图片地址"
|
||||
error-image-url: "エラー画像URL"
|
||||
languages: "实例语言"
|
||||
languages-desc: "您可以添加多个,以空格分隔。"
|
||||
maintainer-config: "管理员信息"
|
||||
|
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"name": "misskey",
|
||||
"author": "syuilo <i@syuilo.com>",
|
||||
"version": "10.62.1",
|
||||
"clientVersion": "2.0.12580",
|
||||
"version": "10.63.0",
|
||||
"clientVersion": "2.0.12685",
|
||||
"codename": "nighthike",
|
||||
"main": "./built/index.js",
|
||||
"private": true,
|
||||
@@ -213,7 +213,7 @@
|
||||
"ts-loader": "5.3.1",
|
||||
"ts-node": "7.0.1",
|
||||
"tslint": "5.10.0",
|
||||
"typescript": "3.1.6",
|
||||
"typescript": "3.2.2",
|
||||
"typescript-eslint-parser": "21.0.2",
|
||||
"uglify-es": "3.3.9",
|
||||
"url-loader": "1.1.2",
|
||||
|
@@ -61,11 +61,12 @@ export default abstract class Chart<T> {
|
||||
|
||||
constructor(name: string, grouped = false) {
|
||||
this.collection = db.get<Log<T>>(`chart.${name}`);
|
||||
if (grouped) {
|
||||
this.collection.createIndex({ span: -1, date: -1, group: -1 }, { unique: true });
|
||||
} else {
|
||||
this.collection.createIndex({ span: -1, date: -1 }, { unique: true });
|
||||
}
|
||||
const keys = {
|
||||
span: -1,
|
||||
date: -1
|
||||
} as any;
|
||||
if (grouped) keys.group = -1;
|
||||
this.collection.createIndex(keys, { unique: true });
|
||||
}
|
||||
|
||||
@autobind
|
||||
@@ -73,14 +74,14 @@ export default abstract class Chart<T> {
|
||||
const query: Obj = {};
|
||||
|
||||
const dive = (x: Obj, path: string) => {
|
||||
Object.entries(x).forEach(([k, v]) => {
|
||||
for (const [k, v] of Object.entries(x)) {
|
||||
const p = path ? `${path}.${k}` : k;
|
||||
if (typeof v === 'number') {
|
||||
query[p] = v;
|
||||
} else {
|
||||
dive(v, p);
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
dive(x, path);
|
||||
@@ -333,14 +334,14 @@ export default abstract class Chart<T> {
|
||||
* にする
|
||||
*/
|
||||
const dive = (x: Obj, path?: string) => {
|
||||
Object.entries(x).forEach(([k, v]) => {
|
||||
for (const [k, v] of Object.entries(x)) {
|
||||
const p = path ? `${path}.${k}` : k;
|
||||
if (typeof v == 'object') {
|
||||
dive(v, p);
|
||||
} else {
|
||||
nestedProperty.set(res, p, chart.map(s => nestedProperty.get(s, p)));
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
dive(chart[0]);
|
||||
|
@@ -9,6 +9,7 @@ import './style.styl';
|
||||
|
||||
import init from '../init';
|
||||
import Index from './views/index.vue';
|
||||
import NotFound from '../common/views/pages/404.vue';
|
||||
|
||||
init(launch => {
|
||||
document.title = 'Admin';
|
||||
@@ -19,6 +20,7 @@ init(launch => {
|
||||
base: '/admin/',
|
||||
routes: [
|
||||
{ path: '/', component: Index },
|
||||
{ path: '*', component: NotFound }
|
||||
]
|
||||
});
|
||||
|
||||
|
@@ -56,7 +56,9 @@ export default Vue.extend({
|
||||
},
|
||||
|
||||
onLogs(logs) {
|
||||
logs.reverse().forEach(log => this.onLog(log));
|
||||
for (const log of logs.reverse()) {
|
||||
this.onLog(log)
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@@ -132,7 +132,9 @@ export default Vue.extend({
|
||||
},
|
||||
|
||||
onStatsLog(statsLog) {
|
||||
statsLog.reverse().forEach(stats => this.onStats(stats));
|
||||
for (const stats of statsLog.reverse()) {
|
||||
this.onStats(stats);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@@ -127,12 +127,12 @@ export default Vue.extend({
|
||||
this.$root.api('instances', {
|
||||
sort: '+notes'
|
||||
}).then(instances => {
|
||||
instances.forEach(i => {
|
||||
for (const i of instances) {
|
||||
i.bg = randomColor({
|
||||
seed: i.host,
|
||||
luminosity: 'dark'
|
||||
});
|
||||
});
|
||||
}
|
||||
this.instances = instances;
|
||||
});
|
||||
},
|
||||
|
@@ -91,7 +91,9 @@ export default Vue.extend({
|
||||
fetchEmojis() {
|
||||
this.$root.api('admin/emoji/list').then(emojis => {
|
||||
emojis.reverse();
|
||||
emojis.forEach(e => e.aliases = (e.aliases || []).join(' '));
|
||||
for (const e of emojis) {
|
||||
e.aliases = (e.aliases || []).join(' ');
|
||||
}
|
||||
this.emojis = emojis;
|
||||
});
|
||||
},
|
||||
|
@@ -7,6 +7,7 @@
|
||||
<ui-input v-model="name">{{ $t('instance-name') }}</ui-input>
|
||||
<ui-textarea v-model="description">{{ $t('instance-description') }}</ui-textarea>
|
||||
<ui-input v-model="bannerUrl"><i slot="icon"><fa icon="link"/></i>{{ $t('banner-url') }}</ui-input>
|
||||
<ui-input v-model="errorImageUrl"><i slot="icon"><fa icon="link"/></i>{{ $t('error-image-url') }}</ui-input>
|
||||
<ui-input v-model="languages"><i slot="icon"><fa icon="language"/></i>{{ $t('languages') }}<span slot="desc">{{ $t('languages-desc') }}</span></ui-input>
|
||||
</section>
|
||||
<section class="fit-bottom">
|
||||
@@ -132,6 +133,7 @@ export default Vue.extend({
|
||||
disableRegistration: false,
|
||||
disableLocalTimeline: false,
|
||||
bannerUrl: null,
|
||||
errorImageUrl: null,
|
||||
name: null,
|
||||
description: null,
|
||||
languages: null,
|
||||
@@ -172,7 +174,10 @@ export default Vue.extend({
|
||||
this.$root.getMeta().then(meta => {
|
||||
this.maintainerName = meta.maintainer.name;
|
||||
this.maintainerEmail = meta.maintainer.email;
|
||||
this.disableRegistration = meta.disableRegistration;
|
||||
this.disableLocalTimeline = meta.disableLocalTimeline;
|
||||
this.bannerUrl = meta.bannerUrl;
|
||||
this.errorImageUrl = meta.errorImageUrl;
|
||||
this.name = meta.name;
|
||||
this.description = meta.description;
|
||||
this.languages = meta.langs.join(' ');
|
||||
@@ -226,6 +231,7 @@ export default Vue.extend({
|
||||
disableRegistration: this.disableRegistration,
|
||||
disableLocalTimeline: this.disableLocalTimeline,
|
||||
bannerUrl: this.bannerUrl,
|
||||
errorImageUrl: this.errorImageUrl,
|
||||
name: this.name,
|
||||
description: this.description,
|
||||
langs: this.languages.split(' '),
|
||||
|
@@ -9,6 +9,7 @@ import './style.styl';
|
||||
|
||||
import init from '../init';
|
||||
import Index from './views/index.vue';
|
||||
import NotFound from '../common/views/pages/404.vue';
|
||||
|
||||
/**
|
||||
* init
|
||||
@@ -20,6 +21,7 @@ init(launch => {
|
||||
base: '/auth/',
|
||||
routes: [
|
||||
{ path: '/:token', component: Index },
|
||||
{ path: '*', component: NotFound }
|
||||
]
|
||||
});
|
||||
|
||||
|
@@ -17,9 +17,9 @@
|
||||
//#region Apply theme
|
||||
const theme = localStorage.getItem('theme');
|
||||
if (theme) {
|
||||
Object.entries(JSON.parse(theme)).forEach(([k, v]) => {
|
||||
for (const [k, v] of Object.entries(JSON.parse(theme))) {
|
||||
document.documentElement.style.setProperty(`--${k}`, v.toString());
|
||||
});
|
||||
}
|
||||
}
|
||||
//#endregion
|
||||
|
||||
@@ -160,7 +160,7 @@
|
||||
navigator.serviceWorker.controller.postMessage('clear');
|
||||
|
||||
navigator.serviceWorker.getRegistrations().then(registrations => {
|
||||
registrations.forEach(registration => registration.unregister());
|
||||
for (const registration of registrations) registration.unregister();
|
||||
});
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
|
@@ -1,6 +1,6 @@
|
||||
import Vue from 'vue';
|
||||
|
||||
export default function<T extends object>(data: {
|
||||
export default function <T extends object>(data: {
|
||||
name: string;
|
||||
props?: () => T;
|
||||
}) {
|
||||
@@ -53,11 +53,10 @@ export default function<T extends object>(data: {
|
||||
mergeProps() {
|
||||
if (data.props) {
|
||||
const defaultProps = data.props();
|
||||
Object.keys(defaultProps).forEach(prop => {
|
||||
if (!this.props.hasOwnProperty(prop)) {
|
||||
Vue.set(this.props, prop, defaultProps[prop]);
|
||||
}
|
||||
});
|
||||
for (const prop of Object.keys(defaultProps)) {
|
||||
if (this.props.hasOwnProperty(prop)) continue;
|
||||
Vue.set(this.props, prop, defaultProps[prop]);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
|
@@ -28,15 +28,15 @@ const getKeyMap = keymap => Object.entries(keymap).map(([patterns, callback]): a
|
||||
shift: false
|
||||
} as pattern;
|
||||
|
||||
part.trim().split('+').forEach(key => {
|
||||
key = key.trim().toLowerCase();
|
||||
const keys = part.trim().split('+').map(x => x.trim().toLowerCase());
|
||||
for (const key of keys) {
|
||||
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;
|
||||
});
|
||||
@@ -77,11 +77,7 @@ export default {
|
||||
const matched = match(e, action.patterns);
|
||||
|
||||
if (matched) {
|
||||
if (el._hotkey_global) {
|
||||
if (match(e, targetReservedKeys)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (el._hotkey_global && match(e, targetReservedKeys)) return;
|
||||
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
|
@@ -14,9 +14,10 @@ export default async function($root: any, force = false, silent = false) {
|
||||
navigator.serviceWorker.controller.postMessage('clear');
|
||||
}
|
||||
|
||||
navigator.serviceWorker.getRegistrations().then(registrations => {
|
||||
registrations.forEach(registration => registration.unregister());
|
||||
});
|
||||
const registrations = await navigator.serviceWorker.getRegistrations();
|
||||
for (const registration of registrations) {
|
||||
registration.unregister();
|
||||
}
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
}
|
||||
|
@@ -2,27 +2,8 @@ export default function(me, settings, note) {
|
||||
const isMyNote = note.userId == me.id;
|
||||
const isPureRenote = note.renoteId != null && note.text == null && note.fileIds.length == 0 && note.poll == null;
|
||||
|
||||
if (settings.showMyRenotes === false) {
|
||||
if (isMyNote && isPureRenote) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (settings.showRenotedMyNotes === false) {
|
||||
if (isPureRenote && (note.renote.userId == me.id)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (settings.showLocalRenotes === false) {
|
||||
if (isPureRenote && (note.renote.user.host == null)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!isMyNote && note.text && settings.mutedWords.some(q => q.length > 0 && !q.some(word => !note.text.includes(word)))) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
return settings.showMyRenotes === false && isMyNote && isPureRenote ||
|
||||
settings.showRenotedMyNotes === false && isPureRenote && note.renote.userId == me.id ||
|
||||
settings.showLocalRenotes === false && isPureRenote && note.renote.user.host == null ||
|
||||
!isMyNote && note.text && settings.mutedWords.some(q => q.length > 0 && !q.some(word => !note.text.includes(word)));
|
||||
}
|
||||
|
@@ -75,12 +75,10 @@ export default class Stream extends EventEmitter {
|
||||
|
||||
// チャンネル再接続
|
||||
if (isReconnect) {
|
||||
this.sharedConnectionPools.forEach(p => {
|
||||
for (const p of this.sharedConnectionPools)
|
||||
p.connect();
|
||||
});
|
||||
this.nonSharedConnections.forEach(c => {
|
||||
for (const c of this.nonSharedConnections)
|
||||
c.connect();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -113,9 +111,9 @@ export default class Stream extends EventEmitter {
|
||||
connections = [this.nonSharedConnections.find(c => c.id === id)];
|
||||
}
|
||||
|
||||
connections.filter(c => c != null).forEach(c => {
|
||||
for (const c of connections.filter(c => c != null)) {
|
||||
c.emit(body.type, body.body);
|
||||
});
|
||||
}
|
||||
} else {
|
||||
this.emit(type, body);
|
||||
}
|
||||
|
@@ -57,18 +57,18 @@ const emjdb: EmojiDef[] = lib.map((x: any) => ({
|
||||
url: `https://twemoji.maxcdn.com/2/svg/${char2file(x[1].char)}.svg`
|
||||
}));
|
||||
|
||||
lib.forEach((x: any) => {
|
||||
for (const x of lib as any) {
|
||||
if (x[1].keywords) {
|
||||
x[1].keywords.forEach(k => {
|
||||
for (const k of x[1].keywords) {
|
||||
emjdb.push({
|
||||
emoji: x[1].char,
|
||||
name: k,
|
||||
aliasOf: x[0],
|
||||
url: `https://twemoji.maxcdn.com/2/svg/${char2file(x[1].char)}.svg`
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
emjdb.sort((a, b) => a.name.length - b.name.length);
|
||||
|
||||
@@ -120,7 +120,7 @@ export default Vue.extend({
|
||||
const customEmojis = (this.$root.getMetaSync() || { emojis: [] }).emojis || [];
|
||||
const emojiDefinitions: EmojiDef[] = [];
|
||||
|
||||
customEmojis.forEach(x => {
|
||||
for (const x of customEmojis) {
|
||||
emojiDefinitions.push({
|
||||
name: x.name,
|
||||
emoji: `:${x.name}:`,
|
||||
@@ -129,7 +129,7 @@ export default Vue.extend({
|
||||
});
|
||||
|
||||
if (x.aliases) {
|
||||
x.aliases.forEach(alias => {
|
||||
for (const alias of x.aliases) {
|
||||
emojiDefinitions.push({
|
||||
name: alias,
|
||||
aliasOf: x.name,
|
||||
@@ -137,9 +137,9 @@ export default Vue.extend({
|
||||
url: x.url,
|
||||
isCustomEmoji: true
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
emojiDefinitions.sort((a, b) => a.name.length - b.name.length);
|
||||
|
||||
@@ -148,9 +148,9 @@ export default Vue.extend({
|
||||
|
||||
this.textarea.addEventListener('keydown', this.onKeydown);
|
||||
|
||||
Array.from(document.querySelectorAll('body *')).forEach(el => {
|
||||
for (const el of Array.from(document.querySelectorAll('body *'))) {
|
||||
el.addEventListener('mousedown', this.onMousedown);
|
||||
});
|
||||
}
|
||||
|
||||
this.$nextTick(() => {
|
||||
this.exec();
|
||||
@@ -166,18 +166,18 @@ export default Vue.extend({
|
||||
beforeDestroy() {
|
||||
this.textarea.removeEventListener('keydown', this.onKeydown);
|
||||
|
||||
Array.from(document.querySelectorAll('body *')).forEach(el => {
|
||||
for (const el of Array.from(document.querySelectorAll('body *'))) {
|
||||
el.removeEventListener('mousedown', this.onMousedown);
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
methods: {
|
||||
exec() {
|
||||
this.select = -1;
|
||||
if (this.$refs.suggests) {
|
||||
Array.from(this.items).forEach(el => {
|
||||
for (const el of Array.from(this.items)) {
|
||||
el.removeAttribute('data-selected');
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if (this.type == 'user') {
|
||||
@@ -316,9 +316,9 @@ export default Vue.extend({
|
||||
},
|
||||
|
||||
applySelect() {
|
||||
Array.from(this.items).forEach(el => {
|
||||
for (const el of Array.from(this.items)) {
|
||||
el.removeAttribute('data-selected');
|
||||
});
|
||||
}
|
||||
|
||||
this.items[this.select].setAttribute('data-selected', 'true');
|
||||
(this.items[this.select] as any).focus();
|
||||
|
@@ -114,11 +114,11 @@ export default Vue.extend({
|
||||
},
|
||||
|
||||
onScroll(e) {
|
||||
const section = this.categories.forEach(x => {
|
||||
for (const x of this.categories) {
|
||||
const top = e.target.scrollTop;
|
||||
const el = this.$refs[x.ref][0];
|
||||
x.isActive = el.offsetTop <= top && el.offsetTop + el.offsetHeight > top;
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
chosen(emoji) {
|
||||
|
@@ -185,9 +185,9 @@ export default Vue.extend({
|
||||
loopedBoard: this.game.settings.loopedBoard
|
||||
});
|
||||
|
||||
this.game.logs.forEach(log => {
|
||||
for (const log of this.game.logs) {
|
||||
this.o.put(log.color, log.pos);
|
||||
});
|
||||
}
|
||||
|
||||
this.logs = this.game.logs;
|
||||
this.logPos = this.logs.length;
|
||||
@@ -287,9 +287,9 @@ export default Vue.extend({
|
||||
loopedBoard: this.game.settings.loopedBoard
|
||||
});
|
||||
|
||||
this.game.logs.forEach(log => {
|
||||
for (const log of this.game.logs) {
|
||||
this.o.put(log.color, log.pos, true);
|
||||
});
|
||||
}
|
||||
|
||||
this.logs = this.game.logs;
|
||||
this.logPos = this.logs.length;
|
||||
|
@@ -43,10 +43,17 @@ export default Vue.extend({
|
||||
},
|
||||
|
||||
mounted() {
|
||||
document.cookie = `i=${this.$store.state.i.token}`;
|
||||
this.$watch('$store.state.i', () => {
|
||||
if (this.$store.state.i.twitter) {
|
||||
if (this.twitterForm) this.twitterForm.close();
|
||||
}
|
||||
if (this.$store.state.i.discord) {
|
||||
if (this.discordForm) this.discordForm.close();
|
||||
}
|
||||
if (this.$store.state.i.github) {
|
||||
if (this.githubForm) this.githubForm.close();
|
||||
}
|
||||
}, {
|
||||
deep: true
|
||||
});
|
||||
|
@@ -10,7 +10,8 @@
|
||||
<misskey-flavored-markdown class="text" v-if="message.text" ref="text" :text="message.text" :i="$store.state.i"/>
|
||||
<div class="file" v-if="message.file">
|
||||
<a :href="message.file.url" target="_blank" :title="message.file.name">
|
||||
<img v-if="message.file.type.split('/')[0] == 'image'" :src="message.file.url" :alt="message.file.name"/>
|
||||
<img v-if="message.file.type.split('/')[0] == 'image'" :src="message.file.url" :alt="message.file.name"
|
||||
:style="{ backgroundColor: message.file.properties.avgColor && message.file.properties.avgColor.length == 3 ? `rgb(${message.file.properties.avgColor.join(',')})` : 'transparent' }"/>
|
||||
<p v-else>{{ message.file.name }}</p>
|
||||
</a>
|
||||
</div>
|
||||
@@ -150,7 +151,6 @@ export default Vue.extend({
|
||||
> a
|
||||
display block
|
||||
max-width 100%
|
||||
max-height 512px
|
||||
border-radius 16px
|
||||
overflow hidden
|
||||
text-decoration none
|
||||
@@ -165,7 +165,8 @@ export default Vue.extend({
|
||||
display block
|
||||
margin 0
|
||||
width 100%
|
||||
height 100%
|
||||
max-height 512px
|
||||
object-fit contain
|
||||
|
||||
> p
|
||||
padding 30px
|
||||
|
@@ -196,12 +196,12 @@ export default Vue.extend({
|
||||
|
||||
onRead(ids) {
|
||||
if (!Array.isArray(ids)) ids = [ids];
|
||||
ids.forEach(id => {
|
||||
for (const id of ids) {
|
||||
if (this.messages.some(x => x.id == id)) {
|
||||
const exist = this.messages.map(x => x.id).indexOf(id);
|
||||
this.messages[exist].isRead = true;
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
isBottom() {
|
||||
@@ -248,13 +248,13 @@ export default Vue.extend({
|
||||
|
||||
onVisibilitychange() {
|
||||
if (document.hidden) return;
|
||||
this.messages.forEach(message => {
|
||||
for (const message of this.messages) {
|
||||
if (message.userId !== this.$store.state.i.id && !message.isRead) {
|
||||
this.connection.send('read', {
|
||||
id: message.id
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@@ -103,10 +103,10 @@ export default Vue.extend({
|
||||
this.messages.unshift(message);
|
||||
},
|
||||
onRead(ids) {
|
||||
ids.forEach(id => {
|
||||
for (const id of ids) {
|
||||
const found = this.messages.find(m => m.id == id);
|
||||
if (found) found.isRead = true;
|
||||
});
|
||||
}
|
||||
},
|
||||
search() {
|
||||
if (this.q == '') {
|
||||
|
@@ -3,36 +3,21 @@ import { length } from 'stringz';
|
||||
import { Node } from '../../../../../mfm/parser';
|
||||
import parse from '../../../../../mfm/parse';
|
||||
import MkUrl from './url.vue';
|
||||
import { concat } from '../../../../../prelude/array';
|
||||
import { concat, sum } from '../../../../../prelude/array';
|
||||
import MkFormula from './formula.vue';
|
||||
import MkGoogle from './google.vue';
|
||||
import { toUnicode } from 'punycode';
|
||||
import syntaxHighlight from '../../../../../mfm/syntax-highlight';
|
||||
|
||||
function getTextCount(tokens: Node[]): number {
|
||||
let count = 0;
|
||||
const extract = (tokens: Node[]) => {
|
||||
tokens.filter(x => x.name === 'text').forEach(x => {
|
||||
count += length(x.props.text);
|
||||
});
|
||||
tokens.filter(x => x.children).forEach(x => {
|
||||
extract(x.children);
|
||||
});
|
||||
};
|
||||
extract(tokens);
|
||||
return count;
|
||||
const rootCount = sum(tokens.filter(x => x.name === 'text').map(x => length(x.props.text)));
|
||||
const childrenCount = sum(tokens.filter(x => x.children).map(x => getTextCount(x.children)));
|
||||
return rootCount + childrenCount;
|
||||
}
|
||||
|
||||
function getChildrenCount(tokens: Node[]): number {
|
||||
let count = 0;
|
||||
const extract = (tokens: Node[]) => {
|
||||
tokens.filter(x => x.children).forEach(x => {
|
||||
count++;
|
||||
extract(x.children);
|
||||
});
|
||||
};
|
||||
extract(tokens);
|
||||
return count;
|
||||
const countTree = tokens.filter(x => x.children).map(x => getChildrenCount(x.children));
|
||||
return countTree.length + sum(countTree);
|
||||
}
|
||||
|
||||
export default Vue.component('misskey-flavored-markdown', {
|
||||
@@ -69,14 +54,9 @@ export default Vue.component('misskey-flavored-markdown', {
|
||||
render(createElement) {
|
||||
if (this.text == null || this.text == '') return;
|
||||
|
||||
let ast: Node[];
|
||||
|
||||
if (this.ast == null) {
|
||||
// Parse text to ast
|
||||
ast = parse(this.text, this.plainText);
|
||||
} else {
|
||||
ast = this.ast as Node[];
|
||||
}
|
||||
const ast = this.ast == null ?
|
||||
parse(this.text, this.plainText) : // Parse text to ast
|
||||
this.ast as Node[];
|
||||
|
||||
let bigCount = 0;
|
||||
let motionCount = 0;
|
||||
|
@@ -55,12 +55,12 @@ export default Vue.extend({
|
||||
noteId: this.note.id,
|
||||
choice: id
|
||||
}).then(() => {
|
||||
this.poll.choices.forEach(c => {
|
||||
for (const c of this.poll.choices) {
|
||||
if (c.id == id) {
|
||||
c.votes++;
|
||||
Vue.set(c, 'isVoted', true);
|
||||
}
|
||||
});
|
||||
}
|
||||
this.showResult = true;
|
||||
});
|
||||
}
|
||||
|
@@ -1,5 +1,5 @@
|
||||
<template>
|
||||
<div class="ui-textarea" :class="{ focused, filled, tall }">
|
||||
<div class="ui-textarea" :class="{ focused, filled, tall, pre }">
|
||||
<div class="input">
|
||||
<span class="label" ref="label"><slot></slot></span>
|
||||
<textarea ref="input"
|
||||
@@ -46,6 +46,11 @@ export default Vue.extend({
|
||||
required: false,
|
||||
default: false
|
||||
},
|
||||
pre: {
|
||||
type: Boolean,
|
||||
required: false,
|
||||
default: false
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
@@ -175,6 +180,11 @@ root(fill)
|
||||
> textarea
|
||||
min-height 200px
|
||||
|
||||
&.pre
|
||||
> .input
|
||||
> textarea
|
||||
white-space pre
|
||||
|
||||
.ui-textarea.fill
|
||||
root(true)
|
||||
|
||||
|
@@ -1,6 +1,3 @@
|
||||
import Vue from 'vue';
|
||||
|
||||
Vue.filter('number', (n) => {
|
||||
if (n == null) return 'N/A';
|
||||
return n.toLocaleString();
|
||||
});
|
||||
Vue.filter('number', n => n == null ? 'N/A' : n.toLocaleString());
|
||||
|
65
src/client/app/common/views/pages/404.vue
Normal file
65
src/client/app/common/views/pages/404.vue
Normal file
@@ -0,0 +1,65 @@
|
||||
<template>
|
||||
<figure class="megtcxgu">
|
||||
<img :src="src" alt="">
|
||||
<figcaption>
|
||||
<h1><span>Not found</span></h1>
|
||||
<p><span>{{ $t('page-not-found') }}</span></p>
|
||||
</figcaption>
|
||||
</figure>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue'
|
||||
import i18n from '../../../i18n';
|
||||
|
||||
export default Vue.extend({
|
||||
i18n: i18n('common/views/pages/404.vue'),
|
||||
data() {
|
||||
return {
|
||||
src: ''
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.$root.getMeta().then(meta => {
|
||||
if (meta.errorImageUrl)
|
||||
this.src = meta.errorImageUrl;
|
||||
});
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
.megtcxgu
|
||||
align-items center
|
||||
bottom 0
|
||||
display flex
|
||||
justify-content center
|
||||
left 0
|
||||
margin auto
|
||||
position fixed
|
||||
right 0
|
||||
top 0
|
||||
|
||||
> img
|
||||
width 500px
|
||||
|
||||
> figcaption
|
||||
margin 8px
|
||||
|
||||
h1,
|
||||
p
|
||||
color var(--text)
|
||||
display flex
|
||||
flex-flow column
|
||||
|
||||
*
|
||||
position relative
|
||||
width 100%
|
||||
|
||||
@media (max-width: 767px)
|
||||
flex-flow column
|
||||
|
||||
> figcaption
|
||||
text-align center
|
||||
|
||||
</style>
|
@@ -164,7 +164,7 @@ export default define({
|
||||
this.draw();
|
||||
},
|
||||
onStatsLog(statsLog) {
|
||||
statsLog.forEach(stats => this.onStats(stats));
|
||||
for (const stats of statsLog) this.onStats(stats);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@@ -121,7 +121,7 @@ export default Vue.extend({
|
||||
this.memP = (stats.mem.used / stats.mem.total * 100).toFixed(0);
|
||||
},
|
||||
onStatsLog(statsLog) {
|
||||
statsLog.reverse().forEach(stats => this.onStats(stats));
|
||||
for (const stats of statsLog.reverse()) this.onStats(stats);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@@ -28,6 +28,7 @@ import MkTag from './views/pages/tag.vue';
|
||||
import MkReversi from './views/pages/games/reversi.vue';
|
||||
import MkShare from './views/pages/share.vue';
|
||||
import MkFollow from '../common/views/pages/follow.vue';
|
||||
import MkNotFound from '../common/views/pages/404.vue';
|
||||
|
||||
import Ctx from './views/components/context-menu.vue';
|
||||
import PostFormWindow from './views/components/post-form-window.vue';
|
||||
@@ -148,7 +149,8 @@ init(async (launch) => {
|
||||
{ path: '/@:user/following', name: 'userFollowing', component: MkUserFollowingOrFollowers },
|
||||
{ path: '/@:user/followers', name: 'userFollowers', component: MkUserFollowingOrFollowers },
|
||||
{ path: '/notes/:note', name: 'note', component: MkNote },
|
||||
{ path: '/authorize-follow', component: MkFollow }
|
||||
{ path: '/authorize-follow', component: MkFollow },
|
||||
{ path: '*', component: MkNotFound }
|
||||
]
|
||||
});
|
||||
|
||||
|
@@ -29,7 +29,9 @@ import Vue from 'vue';
|
||||
export default Vue.extend({
|
||||
props: ['data'],
|
||||
created() {
|
||||
this.data.forEach(d => d.total = d.notes + d.replies + d.renotes);
|
||||
for (const d of this.data) {
|
||||
d.total = d.notes + d.replies + d.renotes;
|
||||
}
|
||||
const peak = Math.max.apply(null, this.data.map(d => d.total));
|
||||
|
||||
const now = new Date();
|
||||
|
@@ -57,7 +57,10 @@ export default Vue.extend({
|
||||
};
|
||||
},
|
||||
created() {
|
||||
this.data.forEach(d => d.total = d.notes + d.replies + d.renotes);
|
||||
for (const d of this.data) {
|
||||
d.total = d.notes + d.replies + d.renotes;
|
||||
}
|
||||
|
||||
this.render();
|
||||
},
|
||||
methods: {
|
||||
|
@@ -34,9 +34,9 @@ export default Vue.extend({
|
||||
this.$el.style.left = x + 'px';
|
||||
this.$el.style.top = y + 'px';
|
||||
|
||||
Array.from(document.querySelectorAll('body *')).forEach(el => {
|
||||
for (const el of Array.from(document.querySelectorAll('body *'))) {
|
||||
el.addEventListener('mousedown', this.onMousedown);
|
||||
});
|
||||
}
|
||||
|
||||
this.$el.style.display = 'block';
|
||||
|
||||
@@ -59,9 +59,9 @@ export default Vue.extend({
|
||||
this.close();
|
||||
},
|
||||
close() {
|
||||
Array.from(document.querySelectorAll('body *')).forEach(el => {
|
||||
for (const el of Array.from(document.querySelectorAll('body *'))) {
|
||||
el.removeEventListener('mousedown', this.onMousedown);
|
||||
});
|
||||
}
|
||||
|
||||
this.$emit('closed');
|
||||
this.destroyDom();
|
||||
|
@@ -120,9 +120,9 @@ export default Vue.extend({
|
||||
|
||||
// ファイルだったら
|
||||
if (e.dataTransfer.files.length > 0) {
|
||||
Array.from(e.dataTransfer.files).forEach(file => {
|
||||
for (const file of Array.from(e.dataTransfer.files)) {
|
||||
this.browser.upload(file, this.folder);
|
||||
});
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
@@ -68,9 +68,9 @@ export default Vue.extend({
|
||||
|
||||
// ファイルだったら
|
||||
if (e.dataTransfer.files.length > 0) {
|
||||
Array.from(e.dataTransfer.files).forEach(file => {
|
||||
for (const file of Array.from(e.dataTransfer.files)) {
|
||||
this.browser.upload(file, this.folder);
|
||||
});
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
@@ -277,9 +277,9 @@ export default Vue.extend({
|
||||
|
||||
// ドロップされてきたものがファイルだったら
|
||||
if (e.dataTransfer.files.length > 0) {
|
||||
Array.from(e.dataTransfer.files).forEach(file => {
|
||||
for (const file of Array.from(e.dataTransfer.files)) {
|
||||
this.upload(file, this.folder);
|
||||
});
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -368,9 +368,9 @@ export default Vue.extend({
|
||||
},
|
||||
|
||||
onChangeFileInput() {
|
||||
Array.from((this.$refs.fileInput as any).files).forEach(file => {
|
||||
for (const file of Array.from((this.$refs.fileInput as any).files)) {
|
||||
this.upload(file, this.folder);
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
upload(file, folder) {
|
||||
@@ -549,8 +549,8 @@ export default Vue.extend({
|
||||
let flag = false;
|
||||
const complete = () => {
|
||||
if (flag) {
|
||||
fetchedFolders.forEach(this.appendFolder);
|
||||
fetchedFiles.forEach(this.appendFile);
|
||||
for (const x of fetchedFolders) this.appendFolder(x);
|
||||
for (const x of fetchedFiles) this.appendFile(x);
|
||||
this.fetching = false;
|
||||
} else {
|
||||
flag = true;
|
||||
@@ -575,7 +575,7 @@ export default Vue.extend({
|
||||
} else {
|
||||
this.moreFiles = false;
|
||||
}
|
||||
files.forEach(this.appendFile);
|
||||
for (const x of files) this.appendFile(x);
|
||||
this.fetching = false;
|
||||
});
|
||||
}
|
||||
|
@@ -43,9 +43,9 @@ export default Vue.extend({
|
||||
this.$el.style.left = x + 'px';
|
||||
this.$el.style.top = y + 'px';
|
||||
|
||||
Array.from(document.querySelectorAll('body *')).forEach(el => {
|
||||
for (const el of Array.from(document.querySelectorAll('body *'))) {
|
||||
el.addEventListener('mousedown', this.onMousedown);
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
@@ -62,9 +62,9 @@ export default Vue.extend({
|
||||
},
|
||||
|
||||
close() {
|
||||
Array.from(document.querySelectorAll('body *')).forEach(el => {
|
||||
for (const el of Array.from(document.querySelectorAll('body *'))) {
|
||||
el.removeEventListener('mousedown', this.onMousedown);
|
||||
});
|
||||
}
|
||||
|
||||
this.$emit('closed');
|
||||
this.destroyDom();
|
||||
|
@@ -102,23 +102,23 @@ const defaultDesktopHomeWidgets = {
|
||||
//#region Construct home data
|
||||
const _defaultDesktopHomeWidgets = [];
|
||||
|
||||
defaultDesktopHomeWidgets.left.forEach(widget => {
|
||||
for (const widget of defaultDesktopHomeWidgets.left) {
|
||||
_defaultDesktopHomeWidgets.push({
|
||||
name: widget,
|
||||
id: uuid(),
|
||||
place: 'left',
|
||||
data: {}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
defaultDesktopHomeWidgets.right.forEach(widget => {
|
||||
for (const widget of defaultDesktopHomeWidgets.right) {
|
||||
_defaultDesktopHomeWidgets.push({
|
||||
name: widget,
|
||||
id: uuid(),
|
||||
place: 'right',
|
||||
data: {}
|
||||
});
|
||||
});
|
||||
}
|
||||
//#endregion
|
||||
|
||||
export default Vue.extend({
|
||||
@@ -220,8 +220,8 @@ export default Vue.extend({
|
||||
const left = this.widgets.left;
|
||||
const right = this.widgets.right;
|
||||
this.$store.commit('settings/setHome', left.concat(right));
|
||||
left.forEach(w => w.place = 'left');
|
||||
right.forEach(w => w.place = 'right');
|
||||
for (const w of left) w.place = 'left';
|
||||
for (const w of right) w.place = 'right';
|
||||
this.$root.api('i/update_home', {
|
||||
home: this.home
|
||||
});
|
||||
|
@@ -156,7 +156,9 @@ export default Vue.extend({
|
||||
},
|
||||
|
||||
releaseQueue() {
|
||||
this.queue.forEach(n => this.prepend(n, true));
|
||||
for (const n of this.queue) {
|
||||
this.prepend(n, true);
|
||||
}
|
||||
this.queue = [];
|
||||
},
|
||||
|
||||
|
@@ -279,9 +279,7 @@ export default Vue.extend({
|
||||
.note-preview
|
||||
color var(--noteText)
|
||||
display inline-block
|
||||
overflow hidden
|
||||
max-height 48px
|
||||
word-break break-all
|
||||
word-break break-word
|
||||
|
||||
.note-ref
|
||||
color var(--noteText)
|
||||
|
@@ -184,7 +184,8 @@ export default Vue.extend({
|
||||
if (this.reply && this.reply.text != null) {
|
||||
const ast = parse(this.reply.text);
|
||||
|
||||
ast.filter(t => t.type == 'mention').forEach(x => {
|
||||
// TODO: 新しいMFMパーサに対応
|
||||
for (const x of ast.filter(t => t.type == 'mention')) {
|
||||
const mention = x.host ? `@${x.username}@${toASCII(x.host)}` : `@${x.username}`;
|
||||
|
||||
// 自分は除外
|
||||
@@ -195,7 +196,7 @@ export default Vue.extend({
|
||||
if (this.text.indexOf(`${mention} `) != -1) return;
|
||||
|
||||
this.text += `${mention} `;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// デフォルト公開範囲
|
||||
@@ -261,7 +262,7 @@ export default Vue.extend({
|
||||
this.$chooseDriveFile({
|
||||
multiple: true
|
||||
}).then(files => {
|
||||
files.forEach(this.attachMedia);
|
||||
for (const x of files) this.attachMedia(x);
|
||||
});
|
||||
},
|
||||
|
||||
@@ -276,7 +277,7 @@ export default Vue.extend({
|
||||
},
|
||||
|
||||
onChangeFile() {
|
||||
Array.from((this.$refs.file as any).files).forEach(this.upload);
|
||||
for (const x of Array.from((this.$refs.file as any).files)) this.upload(x);
|
||||
},
|
||||
|
||||
onPollUpdate() {
|
||||
@@ -304,11 +305,11 @@ export default Vue.extend({
|
||||
},
|
||||
|
||||
onPaste(e) {
|
||||
Array.from(e.clipboardData.items).forEach((item: any) => {
|
||||
for (const item of Array.from(e.clipboardData.items)) {
|
||||
if (item.kind == 'file') {
|
||||
this.upload(item.getAsFile());
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
onDragover(e) {
|
||||
@@ -335,7 +336,7 @@ export default Vue.extend({
|
||||
// ファイルだったら
|
||||
if (e.dataTransfer.files.length > 0) {
|
||||
e.preventDefault();
|
||||
Array.from(e.dataTransfer.files).forEach(this.upload);
|
||||
for (const x of Array.from(e.dataTransfer.files)) this.upload(x);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@@ -1,15 +1,15 @@
|
||||
<template>
|
||||
<div class="vfcitkilproprqtbnpoertpsziierwzi">
|
||||
<div v-for="timeline in timelines" class="timeline">
|
||||
<div v-for="timeline in timelines" class="timeline" :key="timeline.id">
|
||||
<ui-input v-model="timeline.title" @change="save">
|
||||
<span>{{ $t('title') }}</span>
|
||||
</ui-input>
|
||||
<ui-textarea :value="timeline.query ? timeline.query.map(tags => tags.join(' ')).join('\n') : ''" @input="onQueryChange(timeline, $event)">
|
||||
<ui-textarea :value="timeline.query ? timeline.query.map(tags => tags.join(' ')).join('\n') : ''" :pre="true" @input="onQueryChange(timeline, $event)">
|
||||
<span>{{ $t('query') }}</span>
|
||||
</ui-textarea>
|
||||
<ui-button class="save" @click="save">{{ $t('save') }}</ui-button>
|
||||
</div>
|
||||
<ui-button class="add" @click="add">{{ $t('add') }}</ui-button>
|
||||
<ui-button class="save" @click="save">{{ $t('save') }}</ui-button>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -33,12 +33,19 @@ export default Vue.extend({
|
||||
title: '',
|
||||
query: ''
|
||||
});
|
||||
|
||||
this.save();
|
||||
},
|
||||
|
||||
save() {
|
||||
this.$store.dispatch('settings/set', { key: 'tagTimelines', value: this.timelines });
|
||||
const timelines = this.timelines
|
||||
.filter(timeline => timeline.title)
|
||||
.map(timeline => {
|
||||
if (!(timeline.query && timeline.query[0] && timeline.query[0][0])) {
|
||||
timeline.query = timeline.title.split('\n').map(tags => tags.split(' '));
|
||||
}
|
||||
return timeline;
|
||||
});
|
||||
|
||||
this.$store.dispatch('settings/set', { key: 'tagTimelines', value: timelines });
|
||||
},
|
||||
|
||||
onQueryChange(timeline, value) {
|
||||
|
@@ -149,7 +149,9 @@ export default Vue.extend({
|
||||
} else {
|
||||
this.existMore = false;
|
||||
}
|
||||
notes.forEach(n => (this.$refs.timeline as any).append(n));
|
||||
for (const n of notes) {
|
||||
(this.$refs.timeline as any).append(n);
|
||||
}
|
||||
this.moreFetching = false;
|
||||
});
|
||||
|
||||
|
@@ -120,15 +120,15 @@ export default Vue.extend({
|
||||
},
|
||||
open() {
|
||||
this.isOpen = true;
|
||||
Array.from(document.querySelectorAll('body *')).forEach(el => {
|
||||
for (const el of Array.from(document.querySelectorAll('body *'))) {
|
||||
el.addEventListener('mousedown', this.onMousedown);
|
||||
});
|
||||
}
|
||||
},
|
||||
close() {
|
||||
this.isOpen = false;
|
||||
Array.from(document.querySelectorAll('body *')).forEach(el => {
|
||||
for (const el of Array.from(document.querySelectorAll('body *'))) {
|
||||
el.removeEventListener('mousedown', this.onMousedown);
|
||||
});
|
||||
}
|
||||
},
|
||||
onMousedown(e) {
|
||||
e.preventDefault();
|
||||
|
@@ -61,7 +61,7 @@ export default Vue.extend({
|
||||
this.connection = this.$root.stream.useSharedConnection('main');
|
||||
|
||||
this.connection.on('reversiInvited', this.onReversiInvited);
|
||||
this.connection.on('reversi_no_invites', this.onReversiNoInvites);
|
||||
this.connection.on('reversiNoInvites', this.onReversiNoInvites);
|
||||
}
|
||||
},
|
||||
beforeDestroy() {
|
||||
|
@@ -42,16 +42,16 @@ export default Vue.extend({
|
||||
|
||||
open() {
|
||||
this.isOpen = true;
|
||||
Array.from(document.querySelectorAll('body *')).forEach(el => {
|
||||
for (const el of Array.from(document.querySelectorAll('body *'))) {
|
||||
el.addEventListener('mousedown', this.onMousedown);
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
close() {
|
||||
this.isOpen = false;
|
||||
Array.from(document.querySelectorAll('body *')).forEach(el => {
|
||||
for (const el of Array.from(document.querySelectorAll('body *'))) {
|
||||
el.removeEventListener('mousedown', this.onMousedown);
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
onMousedown(e) {
|
||||
|
@@ -111,7 +111,7 @@ export default Vue.extend({
|
||||
this.connection = this.$root.stream.useSharedConnection('main');
|
||||
|
||||
this.connection.on('reversiInvited', this.onReversiInvited);
|
||||
this.connection.on('reversi_no_invites', this.onReversiNoInvites);
|
||||
this.connection.on('reversiNoInvites', this.onReversiNoInvites);
|
||||
}
|
||||
},
|
||||
|
||||
@@ -171,16 +171,16 @@ export default Vue.extend({
|
||||
|
||||
openNotifications() {
|
||||
this.showNotifications = true;
|
||||
Array.from(document.querySelectorAll('body *')).forEach(el => {
|
||||
for (const el of Array.from(document.querySelectorAll('body *'))) {
|
||||
el.addEventListener('mousedown', this.onMousedown);
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
closeNotifications() {
|
||||
this.showNotifications = false;
|
||||
Array.from(document.querySelectorAll('body *')).forEach(el => {
|
||||
for (const el of Array.from(document.querySelectorAll('body *'))) {
|
||||
el.removeEventListener('mousedown', this.onMousedown);
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
onMousedown(e) {
|
||||
|
@@ -79,7 +79,7 @@ export default Vue.extend({
|
||||
} else {
|
||||
this.existMore = false;
|
||||
}
|
||||
notes.forEach(n => (this.$refs.timeline as any).append(n));
|
||||
for (const n of notes) (this.$refs.timeline as any).append(n);
|
||||
this.moreFetching = false;
|
||||
});
|
||||
|
||||
|
@@ -234,12 +234,12 @@ export default Vue.extend({
|
||||
top() {
|
||||
let z = 0;
|
||||
|
||||
this.$root.os.windows.getAll().forEach(w => {
|
||||
if (w == this) return;
|
||||
const ws = Array.from(this.$root.os.windows.getAll()).filter(w => w != this);
|
||||
for (const w of ws) {
|
||||
const m = w.$refs.main;
|
||||
const mz = Number(document.defaultView.getComputedStyle(m, null).zIndex);
|
||||
if (mz > z) z = mz;
|
||||
});
|
||||
}
|
||||
|
||||
if (z > 0) {
|
||||
(this.$refs.main as any).style.zIndex = z + 1;
|
||||
|
@@ -224,7 +224,9 @@ export default Vue.extend({
|
||||
|
||||
if (this.menu) {
|
||||
items.unshift(null);
|
||||
this.menu.reverse().forEach(i => items.unshift(i));
|
||||
for (const i of this.menu.reverse()) {
|
||||
items.unshift(i);
|
||||
}
|
||||
}
|
||||
|
||||
return items;
|
||||
|
@@ -77,7 +77,9 @@ export default Vue.extend({
|
||||
} else {
|
||||
this.existMore = false;
|
||||
}
|
||||
notes.forEach(n => (this.$refs.timeline as any).append(n));
|
||||
for (const n of notes) {
|
||||
(this.$refs.timeline as any).append(n);
|
||||
}
|
||||
this.moreFetching = false;
|
||||
});
|
||||
|
||||
|
@@ -102,7 +102,9 @@ export default Vue.extend({
|
||||
} else {
|
||||
this.existMore = false;
|
||||
}
|
||||
notes.forEach(n => (this.$refs.timeline as any).append(n));
|
||||
for (const n of notes) {
|
||||
(this.$refs.timeline as any).append(n);
|
||||
}
|
||||
this.moreFetching = false;
|
||||
});
|
||||
|
||||
|
@@ -104,7 +104,9 @@ export default Vue.extend({
|
||||
} else {
|
||||
this.existMore = false;
|
||||
}
|
||||
notes.forEach(n => (this.$refs.timeline as any).append(n));
|
||||
for (const n of notes) {
|
||||
(this.$refs.timeline as any).append(n);
|
||||
}
|
||||
this.moreFetching = false;
|
||||
});
|
||||
|
||||
|
@@ -75,7 +75,9 @@ export default Vue.extend({
|
||||
} else {
|
||||
this.existMore = false;
|
||||
}
|
||||
notes.forEach(n => (this.$refs.timeline as any).append(n));
|
||||
for (const n of notes) {
|
||||
(this.$refs.timeline as any).append(n);
|
||||
}
|
||||
this.moreFetching = false;
|
||||
});
|
||||
|
||||
|
@@ -164,7 +164,9 @@ export default Vue.extend({
|
||||
},
|
||||
|
||||
releaseQueue() {
|
||||
this.queue.forEach(n => this.prepend(n, true));
|
||||
for (const n of this.queue) {
|
||||
this.prepend(n, true);
|
||||
}
|
||||
this.queue = [];
|
||||
},
|
||||
|
||||
|
@@ -142,7 +142,9 @@ export default Vue.extend({
|
||||
},
|
||||
|
||||
releaseQueue() {
|
||||
this.queue.forEach(n => this.prepend(n));
|
||||
for (const n of this.queue) {
|
||||
this.prepend(n);
|
||||
}
|
||||
this.queue = [];
|
||||
},
|
||||
|
||||
|
@@ -123,7 +123,9 @@ export default Vue.extend({
|
||||
} else {
|
||||
this.existMore = false;
|
||||
}
|
||||
notes.forEach(n => (this.$refs.timeline as any).append(n));
|
||||
for (const n of notes) {
|
||||
(this.$refs.timeline as any).append(n);
|
||||
}
|
||||
this.moreFetching = false;
|
||||
});
|
||||
|
||||
|
@@ -26,6 +26,14 @@
|
||||
<div class="description">
|
||||
<misskey-flavored-markdown v-if="user.description" :text="user.description" :author="user" :i="$store.state.i" :custom-emojis="user.emojis"/>
|
||||
</div>
|
||||
<div class="fields" v-if="user.fields">
|
||||
<dl class="field" v-for="(field, i) in user.fields" :key="i">
|
||||
<dt class="name">{{ field.name }}</dt>
|
||||
<dd class="value">
|
||||
<misskey-flavored-markdown :text="field.value" :author="user" :i="$store.state.i" :custom-emojis="user.emojis"/>
|
||||
</dd>
|
||||
</dl>
|
||||
</div>
|
||||
<div class="counts">
|
||||
<div>
|
||||
<b>{{ user.notesCount | number }}</b>
|
||||
@@ -159,11 +167,11 @@ export default Vue.extend({
|
||||
limit: 9,
|
||||
untilDate: new Date().getTime() + 1000 * 86400 * 365
|
||||
}).then(notes => {
|
||||
notes.forEach(note => {
|
||||
note.files.forEach(file => {
|
||||
for (const note of notes) {
|
||||
for (const file of note.files) {
|
||||
file._note = note;
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
const files = concat(notes.map((n: any): any[] => n.files));
|
||||
this.images = files.filter(f => image.includes(f.type)).slice(0, 9);
|
||||
});
|
||||
@@ -290,7 +298,7 @@ export default Vue.extend({
|
||||
} else {
|
||||
this.existMore = false;
|
||||
}
|
||||
notes.forEach(n => (this.$refs.timeline as any).append(n));
|
||||
for (const n of notes) (this.$refs.timeline as any).append(n);
|
||||
this.moreFetching = false;
|
||||
});
|
||||
|
||||
@@ -416,6 +424,31 @@ export default Vue.extend({
|
||||
border-right solid 16px transparent
|
||||
border-bottom solid 16px var(--face)
|
||||
|
||||
> .fields
|
||||
margin-top 8px
|
||||
|
||||
> .field
|
||||
display flex
|
||||
padding 0
|
||||
margin 0
|
||||
|
||||
> .name
|
||||
padding 4px
|
||||
margin 4px
|
||||
width 30%
|
||||
overflow hidden
|
||||
white-space nowrap
|
||||
text-overflow ellipsis
|
||||
font-weight bold
|
||||
|
||||
> .value
|
||||
padding 4px
|
||||
margin 4px
|
||||
width 70%
|
||||
overflow hidden
|
||||
white-space nowrap
|
||||
text-overflow ellipsis
|
||||
|
||||
> .counts
|
||||
display grid
|
||||
grid-template-columns 1fr 1fr 1fr
|
||||
|
@@ -94,7 +94,9 @@ export default Vue.extend({
|
||||
} else {
|
||||
this.existMore = false;
|
||||
}
|
||||
notes.forEach(n => (this.$refs.timeline as any).append(n));
|
||||
for (const n of notes) {
|
||||
(this.$refs.timeline as any).append(n);
|
||||
}
|
||||
this.moreFetching = false;
|
||||
});
|
||||
|
||||
|
@@ -83,7 +83,9 @@ export default Vue.extend({
|
||||
} else {
|
||||
this.existMore = false;
|
||||
}
|
||||
notes.forEach(n => (this.$refs.timeline as any).append(n));
|
||||
for (const n of notes) {
|
||||
(this.$refs.timeline as any).append(n);
|
||||
}
|
||||
this.moreFetching = false;
|
||||
});
|
||||
|
||||
|
@@ -1,28 +0,0 @@
|
||||
<template>
|
||||
<a class="lkafjvabenanajk17kwqpsatoushincb" :href="`https://discordapp.com/users/${user.discord.id}`" target="_blank">
|
||||
<div>
|
||||
<span><fa :icon="['fab', 'discord']"/>@{{ user.discord.username }}#{{ user.discord.discriminator }}</span>
|
||||
</div>
|
||||
</a>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
|
||||
export default Vue.extend({
|
||||
props: ['user']
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
.lkafjvabenanajk17kwqpsatoushincb
|
||||
margin-left 8px
|
||||
color #fff
|
||||
|
||||
div
|
||||
padding 32px
|
||||
background #7289da
|
||||
border-radius 6px
|
||||
color #fff
|
||||
|
||||
</style>
|
@@ -1,28 +0,0 @@
|
||||
<template>
|
||||
<a class="aqooishiizumijmihokohinatamihoaz" :href="`https://github.com/${user.github.login}`" target="_blank">
|
||||
<div>
|
||||
<span><fa :icon="['fab', 'github']"/>@{{ user.github.login }}</span>
|
||||
</div>
|
||||
</a>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
|
||||
export default Vue.extend({
|
||||
props: ['user']
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
.aqooishiizumijmihokohinatamihoaz
|
||||
margin-left 8px
|
||||
color #fff
|
||||
|
||||
div
|
||||
padding 32px
|
||||
background #171515
|
||||
border-radius 6px
|
||||
color #fff
|
||||
|
||||
</style>
|
@@ -18,6 +18,14 @@
|
||||
<div class="description">
|
||||
<misskey-flavored-markdown v-if="user.description" :text="user.description" :author="user" :i="$store.state.i" :custom-emojis="user.emojis"/>
|
||||
</div>
|
||||
<div class="fields" v-if="user.fields">
|
||||
<dl class="field" v-for="(field, i) in user.fields" :key="i">
|
||||
<dt class="name">{{ field.name }}</dt>
|
||||
<dd class="value">
|
||||
<misskey-flavored-markdown :text="field.value" :author="user" :i="$store.state.i" :custom-emojis="user.emojis"/>
|
||||
</dd>
|
||||
</dl>
|
||||
</div>
|
||||
<div class="info">
|
||||
<span class="location" v-if="user.host === null && user.profile.location"><fa icon="map-marker"/> {{ user.profile.location }}</span>
|
||||
<span class="birthday" v-if="user.host === null && user.profile.birthday"><fa icon="birthday-cake"/> {{ user.profile.birthday.replace('-', $t('year')).replace('-', $t('month')) + $t('day') }} ({{ $t('years-old', { age }) }})</span>
|
||||
@@ -174,6 +182,33 @@ export default Vue.extend({
|
||||
padding 16px 16px 16px 154px
|
||||
color var(--text)
|
||||
|
||||
> .fields
|
||||
margin-top 16px
|
||||
|
||||
> .field
|
||||
display flex
|
||||
padding 0
|
||||
margin 0
|
||||
|
||||
> .name
|
||||
border-right solid 1px var(--faceDivider)
|
||||
padding 4px
|
||||
margin 4px
|
||||
width 30%
|
||||
overflow hidden
|
||||
white-space nowrap
|
||||
text-overflow ellipsis
|
||||
font-weight bold
|
||||
text-align center
|
||||
|
||||
> .value
|
||||
padding 4px
|
||||
margin 4px
|
||||
width 70%
|
||||
overflow hidden
|
||||
white-space nowrap
|
||||
text-overflow ellipsis
|
||||
|
||||
> .info
|
||||
margin-top 16px
|
||||
padding-top 16px
|
||||
|
@@ -0,0 +1,14 @@
|
||||
<template>
|
||||
<a :href="url" :class="service" target="_blank">
|
||||
<fa :icon="icon" size="lg" fixed-width />
|
||||
<div>{{ text }}</div>
|
||||
</a>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
|
||||
export default Vue.extend({
|
||||
props: ['url', 'text', 'icon', 'service']
|
||||
});
|
||||
</script>
|
@@ -0,0 +1,63 @@
|
||||
<template>
|
||||
<div class="usertwitxxxgithxxdiscxxxintegrat" :v-if="user.twitter || user.github || user.discord">
|
||||
<x-integration v-if="user.twitter" service="twitter" :url="`https://twitter.com/${user.twitter.screenName}`" :text="user.twitter.screenName" :icon="['fab', 'twitter']"/>
|
||||
<x-integration v-if="user.github" service="github" :url="`https://github.com/${user.github.login}`" :text="user.github.login" :icon="['fab', 'github']"/>
|
||||
<x-integration v-if="user.discord" service="discord" :url="`https://discordapp.com/users/${user.discord.id}`" :text="`${user.discord.username}#${user.discord.discriminator}`" :icon="['fab', 'discord']"/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import XIntegration from './user.integrations.integration.vue';
|
||||
|
||||
export default Vue.extend({
|
||||
components: {
|
||||
XIntegration
|
||||
},
|
||||
props: ['user']
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
.usertwitxxxgithxxdiscxxxintegrat
|
||||
> a
|
||||
display flex
|
||||
align-items center
|
||||
padding 32px 38px
|
||||
box-shadow var(--shadow)
|
||||
border-radius var(--round)
|
||||
|
||||
&:not(:last-child)
|
||||
margin-bottom 16px
|
||||
|
||||
&:hover
|
||||
text-decoration none
|
||||
|
||||
> div
|
||||
padding-left .2em
|
||||
line-height 1.3em
|
||||
flex 1 0
|
||||
word-wrap anywhere
|
||||
|
||||
&.twitter
|
||||
color #fff
|
||||
background #1da1f3
|
||||
|
||||
&:hover
|
||||
background #0c87cf
|
||||
|
||||
&.github
|
||||
color #fff
|
||||
background #171515
|
||||
|
||||
&:hover
|
||||
background #000
|
||||
|
||||
&.discord
|
||||
color #fff
|
||||
background #7289da
|
||||
|
||||
&:hover
|
||||
background #4968ce
|
||||
|
||||
</style>
|
@@ -30,11 +30,11 @@ export default Vue.extend({
|
||||
limit: 9,
|
||||
untilDate: new Date().getTime() + 1000 * 86400 * 365
|
||||
}).then(notes => {
|
||||
notes.forEach(note => {
|
||||
note.files.forEach(file => {
|
||||
for (const note of notes) {
|
||||
for (const file of note.files) {
|
||||
if (this.images.length < 9) this.images.push(file);
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
this.fetching = false;
|
||||
});
|
||||
}
|
||||
|
@@ -95,7 +95,9 @@ export default Vue.extend({
|
||||
} else {
|
||||
this.existMore = false;
|
||||
}
|
||||
notes.forEach(n => (this.$refs.timeline as any).append(n));
|
||||
for (const n of notes) {
|
||||
(this.$refs.timeline as any).append(n);
|
||||
}
|
||||
this.moreFetching = false;
|
||||
});
|
||||
|
||||
|
@@ -1,28 +0,0 @@
|
||||
<template>
|
||||
<a class="adsvaidqfznoartcbplullnejvxjphcn" :href="`https://twitter.com/${user.twitter.screenName}`" target="_blank">
|
||||
<div>
|
||||
<span><fa :icon="['fab', 'twitter']"/>@{{ user.twitter.screenName }}</span>
|
||||
</div>
|
||||
</a>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
|
||||
export default Vue.extend({
|
||||
props: ['user']
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
.adsvaidqfznoartcbplullnejvxjphcn
|
||||
margin-left 8px
|
||||
color #fff
|
||||
|
||||
div
|
||||
padding 32px
|
||||
background #1a94f2
|
||||
border-radius 6px
|
||||
color #fff
|
||||
|
||||
</style>
|
@@ -12,9 +12,7 @@
|
||||
<div class="side">
|
||||
<div class="instance" v-if="!$store.getters.isSignedIn"><mk-instance/></div>
|
||||
<x-profile :user="user"/>
|
||||
<x-twitter :user="user" v-if="!user.host && user.twitter"/>
|
||||
<x-github :user="user" v-if="!user.host && user.github"/>
|
||||
<x-discord :user="user" v-if="!user.host && user.discord"/>
|
||||
<x-integrations :user="user" v-if="!user.host"/>
|
||||
<mk-calendar @chosen="warp" :start="new Date(user.createdAt)"/>
|
||||
<mk-activity :user="user"/>
|
||||
<x-photos :user="user"/>
|
||||
@@ -38,9 +36,7 @@ import XProfile from './user.profile.vue';
|
||||
import XPhotos from './user.photos.vue';
|
||||
import XFollowersYouKnow from './user.followers-you-know.vue';
|
||||
import XFriends from './user.friends.vue';
|
||||
import XTwitter from './user.twitter.vue';
|
||||
import XGithub from './user.github.vue'; // ?MEM: Don't fix the intentional typo. (XGitHub -> `<x-git-hub>`)
|
||||
import XDiscord from './user.discord.vue';
|
||||
import XIntegrations from './user.integrations.vue';
|
||||
|
||||
export default Vue.extend({
|
||||
i18n: i18n(),
|
||||
@@ -51,9 +47,7 @@ export default Vue.extend({
|
||||
XPhotos,
|
||||
XFollowersYouKnow,
|
||||
XFriends,
|
||||
XTwitter,
|
||||
XGithub, // ?MEM: Don't fix the intentional typo. (see L41)
|
||||
XDiscord
|
||||
XIntegrations
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
@@ -87,7 +81,8 @@ export default Vue.extend({
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
.xygkxeaeontfaokvqmiblezmhvhostak
|
||||
width 980px
|
||||
max-width 980px
|
||||
min-width 720px
|
||||
padding 16px
|
||||
margin 0 auto
|
||||
|
||||
|
@@ -99,7 +99,7 @@ export default define({
|
||||
this.$chooseDriveFile({
|
||||
multiple: true
|
||||
}).then(files => {
|
||||
files.forEach(this.attachMedia);
|
||||
for (const x of files) this.attachMedia(x);
|
||||
});
|
||||
},
|
||||
|
||||
@@ -118,15 +118,15 @@ export default define({
|
||||
},
|
||||
|
||||
onPaste(e) {
|
||||
Array.from(e.clipboardData.items).forEach((item: any) => {
|
||||
for (const item of Array.from(e.clipboardData.items)) {
|
||||
if (item.kind == 'file') {
|
||||
this.upload(item.getAsFile());
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
onChangeFile() {
|
||||
Array.from((this.$refs.file as any).files).forEach(this.upload);
|
||||
for (const x of Array.from((this.$refs.file as any).files)) this.upload(x);
|
||||
},
|
||||
|
||||
upload(file) {
|
||||
@@ -146,7 +146,7 @@ export default define({
|
||||
// ファイルだったら
|
||||
if (e.dataTransfer.files.length > 0) {
|
||||
e.preventDefault();
|
||||
Array.from(e.dataTransfer.files).forEach(this.upload);
|
||||
for (const x of Array.from(e.dataTransfer.files)) this.upload(x);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@@ -8,11 +8,11 @@
|
||||
<div class="banner"
|
||||
:style="$store.state.i.bannerUrl ? `background-image: url(${$store.state.i.bannerUrl})` : ''"
|
||||
:title="$t('update-banner')"
|
||||
@click="() => os.apis.updateBanner()"
|
||||
@click="updateBanner()"
|
||||
></div>
|
||||
<mk-avatar class="avatar" :user="$store.state.i"
|
||||
:disable-link="true"
|
||||
@click="() => os.apis.updateAvatar()"
|
||||
@click="updateAvatar()"
|
||||
:title="$t('update-avatar')"
|
||||
/>
|
||||
<router-link class="name" :to="$store.state.i | userPage"><mk-user-name :user="$store.state.i"/></router-link>
|
||||
@@ -25,6 +25,8 @@
|
||||
<script lang="ts">
|
||||
import define from '../../../common/define-widget';
|
||||
import i18n from '../../../i18n';
|
||||
import updateAvatar from '../../api/update-avatar';
|
||||
import updateBanner from '../../api/update-banner';
|
||||
|
||||
export default define({
|
||||
name: 'profile',
|
||||
@@ -41,6 +43,12 @@ export default define({
|
||||
this.props.design++;
|
||||
}
|
||||
this.save();
|
||||
},
|
||||
updateAvatar() {
|
||||
updateAvatar(this.$root)();
|
||||
},
|
||||
updateBanner() {
|
||||
updateBanner(this.$root)();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@@ -18,6 +18,7 @@ import Apps from './views/apps.vue';
|
||||
import AppNew from './views/new-app.vue';
|
||||
import App from './views/app.vue';
|
||||
import ui from './views/ui.vue';
|
||||
import NotFound from '../common/views/pages/404.vue';
|
||||
|
||||
Vue.use(BootstrapVue);
|
||||
|
||||
@@ -36,6 +37,7 @@ init(launch => {
|
||||
{ path: '/apps', component: Apps },
|
||||
{ path: '/app/new', component: AppNew },
|
||||
{ path: '/app/:id', component: App },
|
||||
{ path: '*', component: NotFound }
|
||||
]
|
||||
});
|
||||
|
||||
|
@@ -385,9 +385,11 @@ export default (callback: (launch: (router: VueRouter) => [Vue, MiOS]) => void,
|
||||
const shadow = '0 3px 8px rgba(0, 0, 0, 0.2)';
|
||||
const shadowRight = '4px 0 4px rgba(0, 0, 0, 0.1)';
|
||||
const shadowLeft = '-4px 0 4px rgba(0, 0, 0, 0.1)';
|
||||
if (os.store.state.settings.useShadow) document.documentElement.style.setProperty('--shadow', shadow);
|
||||
if (os.store.state.settings.useShadow) document.documentElement.style.setProperty('--shadowRight', shadowRight);
|
||||
if (os.store.state.settings.useShadow) document.documentElement.style.setProperty('--shadowLeft', shadowLeft);
|
||||
if (os.store.state.settings.useShadow) {
|
||||
document.documentElement.style.setProperty('--shadow', shadow);
|
||||
document.documentElement.style.setProperty('--shadowRight', shadowRight);
|
||||
document.documentElement.style.setProperty('--shadowLeft', shadowLeft);
|
||||
}
|
||||
os.store.watch(s => {
|
||||
return s.settings.useShadow;
|
||||
}, v => {
|
||||
@@ -409,15 +411,7 @@ export default (callback: (launch: (router: VueRouter) => [Vue, MiOS]) => void,
|
||||
|
||||
// Navigation hook
|
||||
router.beforeEach((to, from, next) => {
|
||||
if (os.store.state.navHook) {
|
||||
if (os.store.state.navHook(to)) {
|
||||
next(false);
|
||||
} else {
|
||||
next();
|
||||
}
|
||||
} else {
|
||||
next();
|
||||
}
|
||||
next(os.store.state.navHook && os.store.state.navHook(to) ? false : undefined);
|
||||
});
|
||||
|
||||
document.addEventListener('visibilitychange', () => {
|
||||
|
@@ -31,6 +31,7 @@ import MkReversi from './views/pages/games/reversi.vue';
|
||||
import MkTag from './views/pages/tag.vue';
|
||||
import MkShare from './views/pages/share.vue';
|
||||
import MkFollow from '../common/views/pages/follow.vue';
|
||||
import MkNotFound from '../common/views/pages/404.vue';
|
||||
|
||||
import PostForm from './views/components/post-form-dialog.vue';
|
||||
import FileChooser from './views/components/drive-file-chooser.vue';
|
||||
@@ -138,7 +139,8 @@ init((launch) => {
|
||||
{ path: '/@:user/followers', component: MkFollowers },
|
||||
{ path: '/@:user/following', component: MkFollowing },
|
||||
{ path: '/notes/:note', component: MkNote },
|
||||
{ path: '/authorize-follow', component: MkFollow }
|
||||
{ path: '/authorize-follow', component: MkFollow },
|
||||
{ path: '*', component: MkNotFound }
|
||||
]
|
||||
});
|
||||
|
||||
|
@@ -297,8 +297,8 @@ export default Vue.extend({
|
||||
let flag = false;
|
||||
const complete = () => {
|
||||
if (flag) {
|
||||
fetchedFolders.forEach(this.appendFolder);
|
||||
fetchedFiles.forEach(this.appendFile);
|
||||
for (const x of fetchedFolders) this.appendFolder(x);
|
||||
for (const x of fetchedFiles) this.appendFile(x);
|
||||
this.fetching = false;
|
||||
|
||||
// 一連の読み込みが完了したイベントを発行
|
||||
@@ -336,7 +336,7 @@ export default Vue.extend({
|
||||
} else {
|
||||
this.moreFiles = false;
|
||||
}
|
||||
files.forEach(this.appendFile);
|
||||
for (const x of files) this.appendFile(x);
|
||||
this.fetching = false;
|
||||
this.fetchingMoreFiles = false;
|
||||
});
|
||||
@@ -460,8 +460,9 @@ export default Vue.extend({
|
||||
},
|
||||
|
||||
onChangeLocalFile() {
|
||||
Array.from((this.$refs.file as any).files)
|
||||
.forEach(f => (this.$refs.uploader as any).upload(f, this.folder));
|
||||
for (const f of Array.from((this.$refs.file as any).files)) {
|
||||
(this.$refs.uploader as any).upload(f, this.folder);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@@ -149,7 +149,9 @@ export default Vue.extend({
|
||||
},
|
||||
|
||||
releaseQueue() {
|
||||
this.queue.forEach(n => this.prepend(n, true));
|
||||
for (const n of this.queue) {
|
||||
this.prepend(n, true);
|
||||
}
|
||||
this.queue = [];
|
||||
},
|
||||
|
||||
|
@@ -174,7 +174,7 @@ export default Vue.extend({
|
||||
if (this.reply && this.reply.text != null) {
|
||||
const ast = parse(this.reply.text);
|
||||
|
||||
ast.filter(t => t.type == 'mention').forEach(x => {
|
||||
for (const x of ast.filter(t => t.type == 'mention')) {
|
||||
const mention = x.host ? `@${x.username}@${toASCII(x.host)}` : `@${x.username}`;
|
||||
|
||||
// 自分は除外
|
||||
@@ -185,7 +185,7 @@ export default Vue.extend({
|
||||
if (this.text.indexOf(`${mention} `) != -1) return;
|
||||
|
||||
this.text += `${mention} `;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// デフォルト公開範囲
|
||||
@@ -241,7 +241,7 @@ export default Vue.extend({
|
||||
this.$chooseDriveFile({
|
||||
multiple: true
|
||||
}).then(files => {
|
||||
files.forEach(this.attachMedia);
|
||||
for (const x of files) this.attachMedia(x);
|
||||
});
|
||||
},
|
||||
|
||||
@@ -256,7 +256,7 @@ export default Vue.extend({
|
||||
},
|
||||
|
||||
onChangeFile() {
|
||||
Array.from((this.$refs.file as any).files).forEach(this.upload);
|
||||
for (const x of Array.from((this.$refs.file as any).files)) this.upload(x);
|
||||
},
|
||||
|
||||
onPollUpdate() {
|
||||
|
@@ -45,13 +45,15 @@ export default Vue.extend({
|
||||
},
|
||||
|
||||
mounted() {
|
||||
this.$store.commit('setUiHeaderHeight', this.$refs.root.offsetHeight);
|
||||
this.$nextTick(() => {
|
||||
this.$store.commit('setUiHeaderHeight', this.$refs.root.offsetHeight);
|
||||
});
|
||||
|
||||
if (this.$store.getters.isSignedIn) {
|
||||
this.connection = this.$root.stream.useSharedConnection('main');
|
||||
|
||||
this.connection.on('reversiInvited', this.onReversiInvited);
|
||||
this.connection.on('reversi_no_invites', this.onReversiNoInvites);
|
||||
this.connection.on('reversiNoInvites', this.onReversiNoInvites);
|
||||
}
|
||||
},
|
||||
|
||||
|
@@ -83,7 +83,7 @@ export default Vue.extend({
|
||||
this.connection = this.$root.stream.useSharedConnection('main');
|
||||
|
||||
this.connection.on('reversiInvited', this.onReversiInvited);
|
||||
this.connection.on('reversi_no_invites', this.onReversiNoInvites);
|
||||
this.connection.on('reversiNoInvites', this.onReversiNoInvites);
|
||||
}
|
||||
},
|
||||
|
||||
|
@@ -94,7 +94,9 @@ export default Vue.extend({
|
||||
} else {
|
||||
this.existMore = false;
|
||||
}
|
||||
notes.forEach(n => (this.$refs.timeline as any).append(n));
|
||||
for (const n of notes) {
|
||||
(this.$refs.timeline as any).append(n);
|
||||
}
|
||||
this.moreFetching = false;
|
||||
});
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user