Compare commits

..

31 Commits

Author SHA1 Message Date
60da17940d 10.88.0 2019-02-21 06:06:12 +09:00
385eeed732 New Crowdin translations (#4332)
* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Catalan)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Italian)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (Portuguese)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (Dutch)

* New translations ja-JP.yml (Norwegian)

* New translations ja-JP.yml (Catalan)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Italian)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (Portuguese)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (Dutch)

* New translations ja-JP.yml (Norwegian)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Catalan)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Italian)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (Portuguese)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (Dutch)

* New translations ja-JP.yml (Norwegian)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (English)
2019-02-21 06:05:35 +09:00
2e908758d8 🎨 2019-02-21 06:04:42 +09:00
a164f8ad95 Fix bug 2019-02-21 05:53:10 +09:00
372138dfea アカウント削除時にサインイン履歴も削除するように 2019-02-21 01:49:00 +09:00
922a657c7e アカウント削除時にメッセージも削除するように 2019-02-21 01:47:10 +09:00
3409a51cca Resolve #2017 2019-02-21 01:30:21 +09:00
7174a55846 🎨 2019-02-21 00:37:58 +09:00
6656a59402 Fix error 2019-02-21 00:32:49 +09:00
7612ead551 Fix #4331 2019-02-21 00:30:53 +09:00
fa78fe665d メディアビュー機能を削除 2019-02-21 00:13:46 +09:00
c89aa7eb95 デッキでメディア投稿のみ表示するオプションが機能していない問題を修正 2019-02-21 00:12:09 +09:00
43f4c5b7cd Fix #1537 2019-02-21 00:04:23 +09:00
2b6c566386 Fix template styling 2019-02-21 00:02:23 +09:00
91ef328b6b 「みつける」でミュートしているユーザーが含まれる問題を修正 2019-02-20 22:34:52 +09:00
5a9d9dc41d Fix indent 2019-02-20 22:33:22 +09:00
a48e503caa Fix indent 2019-02-20 22:33:13 +09:00
fe00cb9ad5 ハイライトでミュートしているユーザーの投稿が含まれる問題を修正 2019-02-20 22:31:21 +09:00
ed0fdaddbd Fix #4333 2019-02-20 22:21:12 +09:00
893795a31d Update some logs 2019-02-20 22:05:34 +09:00
f1047f1ce5 10.87.5 2019-02-20 16:35:36 +09:00
9beddc941a 返信が遷移後も残り続ける問題を修正 2019-02-20 16:35:00 +09:00
3a6a01d2d6 New Crowdin translations (#4328)
* New translations ja-JP.yml (Catalan)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Italian)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (Portuguese)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (Dutch)

* New translations ja-JP.yml (Norwegian)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Chinese Simplified)
2019-02-20 16:27:04 +09:00
e0e4bdbdbc Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2019-02-20 16:14:39 +09:00
b3daf79b6a Update CHANGELOG.md 2019-02-20 16:14:31 +09:00
81aa21915b Fix #4329 (#4330)
* Create xml.ts

* Update well-known.ts

* Update well-known.ts

* Fix typo

* Update well-known.ts

* Update well-known.ts
2019-02-20 16:13:43 +09:00
5aadd80243 Update CHANGELOG.md 2019-02-20 13:41:55 +09:00
23350b1cbc 🎨 2019-02-20 13:41:31 +09:00
daff0977cb Resolve #747 2019-02-20 13:38:48 +09:00
c1e7d56ff8 Fix bug 2019-02-20 10:15:06 +09:00
61aef56f83 🎨 2019-02-20 10:14:11 +09:00
55 changed files with 662 additions and 443 deletions

View File

@ -1,6 +1,23 @@
ChangeLog
=========
10.88.0
----------
* アカウントの削除を試験的に実装
* デッキでメディア投稿のみ表示するオプションが機能していない問題を修正
* デッキでユーザーを表示したときにタイムラインが残存する問題を修正
* モバイルのユーザーページで、ユーザーAのタイムラインから他のユーザーBを選択してユーザーBのタイムラインに移動したとき、ユーザーAのタイムラインが残る問題を修正
* ハイライトでミュートしているユーザーの投稿が含まれる問題を修正
* 「みつける」でミュートしているユーザーが含まれる問題を修正
* デザインの調整
10.87.5
----------
* モバイル版でも連携サービスを表示するように
* webfingerのacceptが反映されない問題を修正
* 返信が遷移後も残り続ける問題を修正
* デザインの調整
10.87.4
----------
* フォローリクエストを許可するときにエラーになる問題を修正

View File

@ -144,6 +144,7 @@ common:
is-remote-post: "この投稿情報はコピーです。"
view-on-remote: "正確な情報を見る"
renoted-by: "{user}がRenote"
no-notes: "投稿がありません"
error:
title: "問題が発生しました"
retry: "やり直す"
@ -537,6 +538,10 @@ common/views/components/profile-editor.vue:
mute-list: "ミュート"
blocking-list: "ブロック"
export-requested: "エクスポートをリクエストしました。これには時間がかかる場合があります。エクスポートが終わると、ドライブにファイルが追加されます。"
enter-password: "パスワードを入力してください"
danger-zone: "危険な設定"
delete-account: "アカウントを削除"
account-deleted: "アカウントが削除されました。データが消えるまで時間がかかる場合があります。"
common/views/components/user-list-editor.vue:
users: "ユーザー"
rename: "リスト名を変更"
@ -785,8 +790,6 @@ desktop/views/components/renote-form.vue:
failure: "Renoteに失敗しました"
desktop/views/components/renote-form-window.vue:
title: "この投稿をRenoteしますか"
desktop/views/components/timeline.core.vue:
empty: "投稿がありません"
desktop/views/pages/user-following-or-followers.vue:
following: "{user}のフォロー"
followers: "{user}のフォロワー"
@ -1353,6 +1356,7 @@ desktop/views/pages/user/user.header.vue:
following: "フォロー"
followers: "フォロワー"
is-bot: "このアカウントはBotです"
no-description: "自己紹介はありません"
years-old: "{age}歳"
year: "年"
month: "月"
@ -1363,7 +1367,6 @@ desktop/views/pages/user/user.timeline.vue:
with-replies: "投稿と返信"
with-media: "メディア"
my-posts: "私の投稿"
empty: "このユーザーはまだ何も投稿していないようです。"
desktop/views/widgets/messaging.vue:
title: "メッセージ"
desktop/views/widgets/notifications.vue:
@ -1461,8 +1464,6 @@ mobile/views/components/sub-note-content.vue:
deleted: "この投稿は削除されました"
media-count: "{}つのメディア"
poll: "アンケート"
mobile/views/components/timeline.vue:
empty: "投稿がありません"
mobile/views/components/ui.header.vue:
welcome-back: "おかえりなさい、"
adjective: "さん"
@ -1479,9 +1480,6 @@ mobile/views/components/ui.nav.vue:
settings: "設定"
admin: "管理"
about: "Misskeyについて"
mobile/views/components/user-timeline.vue:
no-notes: "このユーザーは投稿していないようです。"
no-notes-with-media: "メディア付き投稿はありません。"
mobile/views/pages/favorites.vue:
title: "お気に入り"
mobile/views/pages/user-lists.vue:
@ -1500,8 +1498,6 @@ mobile/views/pages/home.vue:
global: "グローバル"
mentions: "あなた宛て"
messages: "メッセージ"
mobile/views/pages/home.timeline.vue:
empty: "投稿がありません"
mobile/views/pages/tag.vue:
no-posts-found: "ハッシュタグ「{q}」が付けられた投稿は見つかりませんでした。"
mobile/views/pages/welcome.vue:
@ -1594,8 +1590,6 @@ mobile/views/pages/user/home.vue:
frequently-replied-users: "よく話すユーザー"
followers-you-know: "知り合いのフォロワー"
last-used-at: "最終ログイン"
mobile/views/pages/user/home.notes.vue:
no-notes: "投稿はありません"
mobile/views/pages/user/home.photos.vue:
no-photos: "写真はありません"
deck:
@ -1623,7 +1617,6 @@ deck:
description: "サーバーの運営者により、このタイムラインは使用できない状態に設定されています。"
deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー"
edit: "オプション"
deck/deck.user-column.vue:
follows-you: "フォローされています"

View File

@ -144,6 +144,7 @@ common:
is-remote-post: "この投稿情報はコピーです。"
view-on-remote: "正確な情報を見る"
renoted-by: "{user}がRenote"
no-notes: "投稿がありません"
error:
title: "問題が発生しました"
retry: "Erneut versuchen"
@ -537,6 +538,10 @@ common/views/components/profile-editor.vue:
mute-list: "ミュート"
blocking-list: "ブロック"
export-requested: "エクスポートをリクエストしました。これには時間がかかる場合があります。エクスポートが終わると、ドライブにファイルが追加されます。"
enter-password: "パスワードを入力してください"
danger-zone: "危険な設定"
delete-account: "アカウントを削除"
account-deleted: "アカウントが削除されました。データが消えるまで時間がかかる場合があります。"
common/views/components/user-list-editor.vue:
users: "ユーザー"
rename: "リスト名を変更"
@ -785,8 +790,6 @@ desktop/views/components/renote-form.vue:
failure: "Weitersagen fehlgeschlagen"
desktop/views/components/renote-form-window.vue:
title: "Bist du dir sicher, dass du das reposten willst?"
desktop/views/components/timeline.core.vue:
empty: "投稿がありません"
desktop/views/pages/user-following-or-followers.vue:
following: "{user}のフォロー"
followers: "{user}のフォロワー"
@ -1353,6 +1356,7 @@ desktop/views/pages/user/user.header.vue:
following: "フォロー"
followers: "フォロワー"
is-bot: "このアカウントはBotです"
no-description: "自己紹介はありません"
years-old: "{age}歳"
year: "年"
month: "月"
@ -1363,7 +1367,6 @@ desktop/views/pages/user/user.timeline.vue:
with-replies: "投稿と返信"
with-media: "メディア"
my-posts: "私の投稿"
empty: "このユーザーはまだ何も投稿していないようです。"
desktop/views/widgets/messaging.vue:
title: "メッセージ"
desktop/views/widgets/notifications.vue:
@ -1461,8 +1464,6 @@ mobile/views/components/sub-note-content.vue:
deleted: "この投稿は削除されました"
media-count: "{}つのメディア"
poll: "アンケート"
mobile/views/components/timeline.vue:
empty: "投稿がありません"
mobile/views/components/ui.header.vue:
welcome-back: "おかえりなさい、"
adjective: "さん"
@ -1479,9 +1480,6 @@ mobile/views/components/ui.nav.vue:
settings: "設定"
admin: "管理"
about: "Misskeyについて"
mobile/views/components/user-timeline.vue:
no-notes: "このユーザーは投稿していないようです。"
no-notes-with-media: "メディア付き投稿はありません。"
mobile/views/pages/favorites.vue:
title: "Favoriten"
mobile/views/pages/user-lists.vue:
@ -1500,8 +1498,6 @@ mobile/views/pages/home.vue:
global: "グローバル"
mentions: "あなた宛て"
messages: "メッセージ"
mobile/views/pages/home.timeline.vue:
empty: "投稿がありません"
mobile/views/pages/tag.vue:
no-posts-found: "ハッシュタグ「{q}」が付けられた投稿は見つかりませんでした。"
mobile/views/pages/welcome.vue:
@ -1594,8 +1590,6 @@ mobile/views/pages/user/home.vue:
frequently-replied-users: "よく話すユーザー"
followers-you-know: "知り合いのフォロワー"
last-used-at: "最終ログイン"
mobile/views/pages/user/home.notes.vue:
no-notes: "投稿はありません"
mobile/views/pages/user/home.photos.vue:
no-photos: "写真はありません"
deck:
@ -1623,7 +1617,6 @@ deck:
description: "サーバーの運営者により、このタイムラインは使用できない状態に設定されています。"
deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー"
edit: "オプション"
deck/deck.user-column.vue:
follows-you: "フォローされています"

View File

@ -8,7 +8,7 @@ common:
about: "Thank you for finding Misskey. Misskey is a <b>decentralized microblogging platform</b> born on Earth. Since it exists within the Fediverse (a universe where various social media platforms are organized), it is mutually linked with other social media platforms. Why don't you take a short break from the hustle and bustle of the city, and dive into a new Internet?"
intro:
title: "What is Misskey?"
about: "Misskey is an open-source, <b>decentralized microblogging service</b>. Sophisticated, fully customizable UI, varieties of reactions for posts, free file storage providing an integrated management system and other advanced features are available. In addition, Misskey connects to a network system called the “Fediverse”, that enables us to communicate with users on other SNSs. For example, when you post something, it will be sent not only to Misskey, but also to Mastodon, Osada and Pleroma. Just imagine that the planet is sending a radio transmission to another planet to communicate."
about: "Misskey is an open-source, <b>decentralized microblogging software</b>. It has a sophisticated, fully customizable user interface, a variety of ways for expressing a reaction to posts, free file storage providing an integrated management system, and other advanced features are available. In addition, Misskey connects to a network system called the “Fediverse” enables us to communicate with users on other SNSs. For example, when you post something, it will be sent not only to Misskey users, but also those on Mastodon and Pleroma. Just imagine that the planet is sending a radio transmission to another planet, in order to communicate."
features: "Features"
rich-contents: "Post"
rich-contents-desc: "Just post your idea, hot topics, and anything you want to share. You may want to decorate your words, attach your favorite pictures, send files, including videos, or create a poll - those are some of the things you can do with Misskey!"
@ -144,6 +144,7 @@ common:
is-remote-post: "These post contents are mirrored."
view-on-remote: "For completion, view it remotely."
renoted-by: "Renoted by {user}"
no-notes: "Without any notes"
error:
title: "Something happened :("
retry: "Retry"
@ -537,6 +538,10 @@ common/views/components/profile-editor.vue:
mute-list: "List of muted accounts"
blocking-list: "List of blocked accounts"
export-requested: "You have requested an export. This may take a while. After the export is complete, the resulting file will be added to the drive."
enter-password: "Please enter your password"
danger-zone: "Cautious options"
delete-account: "Remove the account"
account-deleted: "The account has been deleted. It may take some time until all of the data disappears."
common/views/components/user-list-editor.vue:
users: "User"
rename: "Rename list"
@ -785,8 +790,6 @@ desktop/views/components/renote-form.vue:
failure: "Failed to Repost"
desktop/views/components/renote-form-window.vue:
title: "Do you want to Repost it?"
desktop/views/components/timeline.core.vue:
empty: "Without any notes"
desktop/views/pages/user-following-or-followers.vue:
following: "{user}'s following"
followers: "{user}'s follower"
@ -1353,6 +1356,7 @@ desktop/views/pages/user/user.header.vue:
following: "Following"
followers: "Followers"
is-bot: "This account is a Bot"
no-description: "The user has not written their profile introduction"
years-old: "{age} years old"
year: "/"
month: "/"
@ -1363,7 +1367,6 @@ desktop/views/pages/user/user.timeline.vue:
with-replies: "Posts and replies"
with-media: "Media"
my-posts: "My posts"
empty: "This user doesn't seem to have posted anything yet."
desktop/views/widgets/messaging.vue:
title: "Message"
desktop/views/widgets/notifications.vue:
@ -1461,8 +1464,6 @@ mobile/views/components/sub-note-content.vue:
deleted: "This post has been deleted"
media-count: "{} media attached"
poll: "Poll"
mobile/views/components/timeline.vue:
empty: "No notes"
mobile/views/components/ui.header.vue:
welcome-back: "Welcome back, "
adjective: "Sir"
@ -1479,9 +1480,6 @@ mobile/views/components/ui.nav.vue:
settings: "Settings"
admin: "Admin"
about: "About Misskey"
mobile/views/components/user-timeline.vue:
no-notes: "It seems this user hasn't posted anything yet."
no-notes-with-media: "There are no notes with media attachments"
mobile/views/pages/favorites.vue:
title: "Favorites"
mobile/views/pages/user-lists.vue:
@ -1500,8 +1498,6 @@ mobile/views/pages/home.vue:
global: "Global"
mentions: "Mentions"
messages: "Messages"
mobile/views/pages/home.timeline.vue:
empty: "Without any notes"
mobile/views/pages/tag.vue:
no-posts-found: "No posts contains \"{q}\" found."
mobile/views/pages/welcome.vue:
@ -1594,8 +1590,6 @@ mobile/views/pages/user/home.vue:
frequently-replied-users: "Frequent mentions"
followers-you-know: "Followers you know"
last-used-at: "Last active:"
mobile/views/pages/user/home.notes.vue:
no-notes: "No notes"
mobile/views/pages/user/home.photos.vue:
no-photos: "No photos"
deck:
@ -1623,7 +1617,6 @@ deck:
description: "This timeline has been disabled by the server administrator."
deck/deck.tl-column.vue:
is-media-only: "Only media posts"
is-media-view: "Media view"
edit: "Options"
deck/deck.user-column.vue:
follows-you: "Follows you"

View File

@ -144,6 +144,7 @@ common:
is-remote-post: "この投稿情報はコピーです。"
view-on-remote: "正確な情報を見る"
renoted-by: "{user}がRenote"
no-notes: "投稿がありません"
error:
title: "問題が発生しました"
retry: "やり直す"
@ -537,6 +538,10 @@ common/views/components/profile-editor.vue:
mute-list: "ミュート"
blocking-list: "ブロック"
export-requested: "エクスポートをリクエストしました。これには時間がかかる場合があります。エクスポートが終わると、ドライブにファイルが追加されます。"
enter-password: "パスワードを入力してください"
danger-zone: "危険な設定"
delete-account: "アカウントを削除"
account-deleted: "アカウントが削除されました。データが消えるまで時間がかかる場合があります。"
common/views/components/user-list-editor.vue:
users: "Usuarios"
rename: "リスト名を変更"
@ -785,8 +790,6 @@ desktop/views/components/renote-form.vue:
failure: "La publicación ha fallado"
desktop/views/components/renote-form-window.vue:
title: "¿Seguro qué quieres volver a publicarlo?"
desktop/views/components/timeline.core.vue:
empty: "投稿がありません"
desktop/views/pages/user-following-or-followers.vue:
following: "{user} sigue a"
followers: "Seguidores de {user}"
@ -1353,6 +1356,7 @@ desktop/views/pages/user/user.header.vue:
following: "フォロー"
followers: "フォロワー"
is-bot: "このアカウントはBotです"
no-description: "自己紹介はありません"
years-old: "{age}歳"
year: "年"
month: "月"
@ -1363,7 +1367,6 @@ desktop/views/pages/user/user.timeline.vue:
with-replies: "投稿と返信"
with-media: "メディア"
my-posts: "私の投稿"
empty: "このユーザーはまだ何も投稿していないようです。"
desktop/views/widgets/messaging.vue:
title: "メッセージ"
desktop/views/widgets/notifications.vue:
@ -1461,8 +1464,6 @@ mobile/views/components/sub-note-content.vue:
deleted: "この投稿は削除されました"
media-count: "{}つのメディア"
poll: "アンケート"
mobile/views/components/timeline.vue:
empty: "投稿がありません"
mobile/views/components/ui.header.vue:
welcome-back: "おかえりなさい、"
adjective: "さん"
@ -1479,9 +1480,6 @@ mobile/views/components/ui.nav.vue:
settings: "設定"
admin: "管理"
about: "Misskeyについて"
mobile/views/components/user-timeline.vue:
no-notes: "このユーザーは投稿していないようです。"
no-notes-with-media: "メディア付き投稿はありません。"
mobile/views/pages/favorites.vue:
title: "お気に入り"
mobile/views/pages/user-lists.vue:
@ -1500,8 +1498,6 @@ mobile/views/pages/home.vue:
global: "グローバル"
mentions: "あなた宛て"
messages: "メッセージ"
mobile/views/pages/home.timeline.vue:
empty: "投稿がありません"
mobile/views/pages/tag.vue:
no-posts-found: "ハッシュタグ「{q}」が付けられた投稿は見つかりませんでした。"
mobile/views/pages/welcome.vue:
@ -1594,8 +1590,6 @@ mobile/views/pages/user/home.vue:
frequently-replied-users: "よく話すユーザー"
followers-you-know: "知り合いのフォロワー"
last-used-at: "最終ログイン"
mobile/views/pages/user/home.notes.vue:
no-notes: "投稿はありません"
mobile/views/pages/user/home.photos.vue:
no-photos: "写真はありません"
deck:
@ -1623,7 +1617,6 @@ deck:
description: "サーバーの運営者により、このタイムラインは使用できない状態に設定されています。"
deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー"
edit: "オプション"
deck/deck.user-column.vue:
follows-you: "フォローされています"

View File

@ -144,6 +144,7 @@ common:
is-remote-post: "Ceci est une publication distante."
view-on-remote: " Consulter le profil complet"
renoted-by: "Renoté par {user}"
no-notes: "投稿がありません"
error:
title: "Une erreur est survenue"
retry: "Réessayer"
@ -537,6 +538,10 @@ common/views/components/profile-editor.vue:
mute-list: "Liste des comptes mis en sourdine"
blocking-list: "Liste des comptes bloqués"
export-requested: "エクスポートをリクエストしました。これには時間がかかる場合があります。エクスポートが終わると、ドライブにファイルが追加されます。"
enter-password: "パスワードを入力してください"
danger-zone: "危険な設定"
delete-account: "アカウントを削除"
account-deleted: "アカウントが削除されました。データが消えるまで時間がかかる場合があります。"
common/views/components/user-list-editor.vue:
users: "Utilisateur·rice"
rename: "Renommer la liste"
@ -785,8 +790,6 @@ desktop/views/components/renote-form.vue:
failure: "La renote a échoué"
desktop/views/components/renote-form-window.vue:
title: "Êtes vous sûr de vouloir renote cette note?"
desktop/views/components/timeline.core.vue:
empty: "Sans aucune note"
desktop/views/pages/user-following-or-followers.vue:
following: "{user} suit"
followers: "Abonné·e·s de {user}"
@ -1353,6 +1356,7 @@ desktop/views/pages/user/user.header.vue:
following: "Suit"
followers: "Abonné·e·s"
is-bot: "Ce compte est un Bot"
no-description: "自己紹介はありません"
years-old: "{age} ans"
year: "/"
month: "/"
@ -1363,7 +1367,6 @@ desktop/views/pages/user/user.timeline.vue:
with-replies: "Publications et réponses"
with-media: "Média"
my-posts: "Mes Messages"
empty: "Cet·te utilisateur·rice n'a rien posté encore."
desktop/views/widgets/messaging.vue:
title: "Messagerie"
desktop/views/widgets/notifications.vue:
@ -1461,8 +1464,6 @@ mobile/views/components/sub-note-content.vue:
deleted: "cette publication a été supprimée"
media-count: "{} médias attachés"
poll: "Sondage"
mobile/views/components/timeline.vue:
empty: "Pas de notes"
mobile/views/components/ui.header.vue:
welcome-back: "Content de vous revoir ! "
adjective: "M."
@ -1479,9 +1480,6 @@ mobile/views/components/ui.nav.vue:
settings: "Réglages"
admin: "Admin"
about: "À propos de Misskey"
mobile/views/components/user-timeline.vue:
no-notes: "Il semble que cet·te utilisateur·rice na rien publié pour le moment."
no-notes-with-media: "Aucune note comprenant des médias"
mobile/views/pages/favorites.vue:
title: "Favoris"
mobile/views/pages/user-lists.vue:
@ -1500,8 +1498,6 @@ mobile/views/pages/home.vue:
global: "Global"
mentions: "Mentions"
messages: "Messages"
mobile/views/pages/home.timeline.vue:
empty: "Sans aucune note"
mobile/views/pages/tag.vue:
no-posts-found: "Aucune publication ayant pour hashtag « {q} » na été trouvée."
mobile/views/pages/welcome.vue:
@ -1594,8 +1590,6 @@ mobile/views/pages/user/home.vue:
frequently-replied-users: "Mentions fréquentes"
followers-you-know: "Abonné·e·s que vous connaissez"
last-used-at: "Dernière connexion il y a"
mobile/views/pages/user/home.notes.vue:
no-notes: "Pas de notes"
mobile/views/pages/user/home.photos.vue:
no-photos: "Pas de photos"
deck:
@ -1623,7 +1617,6 @@ deck:
description: "Ce fil a été désactivé par l'administrateur du serveur."
deck/deck.tl-column.vue:
is-media-only: "Les publications médias uniquement"
is-media-view: "Vue média"
edit: "Option"
deck/deck.user-column.vue:
follows-you: "Vous suit"

View File

@ -144,6 +144,7 @@ common:
is-remote-post: "この投稿情報はコピーです。"
view-on-remote: "正確な情報を見る"
renoted-by: "{user}がRenote"
no-notes: "投稿がありません"
error:
title: "問題が発生しました"
retry: "やり直す"
@ -537,6 +538,10 @@ common/views/components/profile-editor.vue:
mute-list: "ミュート"
blocking-list: "ブロック"
export-requested: "エクスポートをリクエストしました。これには時間がかかる場合があります。エクスポートが終わると、ドライブにファイルが追加されます。"
enter-password: "パスワードを入力してください"
danger-zone: "危険な設定"
delete-account: "アカウントを削除"
account-deleted: "アカウントが削除されました。データが消えるまで時間がかかる場合があります。"
common/views/components/user-list-editor.vue:
users: "ユーザー"
rename: "リスト名を変更"
@ -785,8 +790,6 @@ desktop/views/components/renote-form.vue:
failure: "Renoteに失敗しました"
desktop/views/components/renote-form-window.vue:
title: "この投稿をRenoteしますか"
desktop/views/components/timeline.core.vue:
empty: "投稿がありません"
desktop/views/pages/user-following-or-followers.vue:
following: "{user}のフォロー"
followers: "{user}のフォロワー"
@ -1353,6 +1356,7 @@ desktop/views/pages/user/user.header.vue:
following: "フォロー"
followers: "フォロワー"
is-bot: "このアカウントはBotです"
no-description: "自己紹介はありません"
years-old: "{age}歳"
year: "年"
month: "月"
@ -1363,7 +1367,6 @@ desktop/views/pages/user/user.timeline.vue:
with-replies: "投稿と返信"
with-media: "メディア"
my-posts: "私の投稿"
empty: "このユーザーはまだ何も投稿していないようです。"
desktop/views/widgets/messaging.vue:
title: "メッセージ"
desktop/views/widgets/notifications.vue:
@ -1461,8 +1464,6 @@ mobile/views/components/sub-note-content.vue:
deleted: "この投稿は削除されました"
media-count: "{}つのメディア"
poll: "アンケート"
mobile/views/components/timeline.vue:
empty: "投稿がありません"
mobile/views/components/ui.header.vue:
welcome-back: "おかえりなさい、"
adjective: "さん"
@ -1479,9 +1480,6 @@ mobile/views/components/ui.nav.vue:
settings: "設定"
admin: "管理"
about: "Misskeyについて"
mobile/views/components/user-timeline.vue:
no-notes: "このユーザーは投稿していないようです。"
no-notes-with-media: "メディア付き投稿はありません。"
mobile/views/pages/favorites.vue:
title: "お気に入り"
mobile/views/pages/user-lists.vue:
@ -1500,8 +1498,6 @@ mobile/views/pages/home.vue:
global: "グローバル"
mentions: "あなた宛て"
messages: "メッセージ"
mobile/views/pages/home.timeline.vue:
empty: "投稿がありません"
mobile/views/pages/tag.vue:
no-posts-found: "ハッシュタグ「{q}」が付けられた投稿は見つかりませんでした。"
mobile/views/pages/welcome.vue:
@ -1594,8 +1590,6 @@ mobile/views/pages/user/home.vue:
frequently-replied-users: "よく話すユーザー"
followers-you-know: "知り合いのフォロワー"
last-used-at: "最終ログイン"
mobile/views/pages/user/home.notes.vue:
no-notes: "投稿はありません"
mobile/views/pages/user/home.photos.vue:
no-photos: "写真はありません"
deck:
@ -1623,7 +1617,6 @@ deck:
description: "サーバーの運営者により、このタイムラインは使用できない状態に設定されています。"
deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー"
edit: "オプション"
deck/deck.user-column.vue:
follows-you: "フォローされています"

View File

@ -154,6 +154,7 @@ common:
is-remote-post: "この投稿情報はコピーです。"
view-on-remote: "正確な情報を見る"
renoted-by: "{user}がRenote"
no-notes: "投稿がありません"
error:
title: "問題が発生しました"
@ -588,6 +589,10 @@ common/views/components/profile-editor.vue:
mute-list: "ミュート"
blocking-list: "ブロック"
export-requested: "エクスポートをリクエストしました。これには時間がかかる場合があります。エクスポートが終わると、ドライブにファイルが追加されます。"
enter-password: "パスワードを入力してください"
danger-zone: "危険な設定"
delete-account: "アカウントを削除"
account-deleted: "アカウントが削除されました。データが消えるまで時間がかかる場合があります。"
common/views/components/user-list-editor.vue:
users: "ユーザー"
@ -879,9 +884,6 @@ desktop/views/components/renote-form.vue:
desktop/views/components/renote-form-window.vue:
title: "この投稿をRenoteしますか"
desktop/views/components/timeline.core.vue:
empty: "投稿がありません"
desktop/views/pages/user-following-or-followers.vue:
following: "{user}のフォロー"
followers: "{user}のフォロワー"
@ -1518,7 +1520,6 @@ desktop/views/pages/user/user.timeline.vue:
with-replies: "投稿と返信"
with-media: "メディア"
my-posts: "私の投稿"
empty: "このユーザーはまだ何も投稿していないようです。"
desktop/views/widgets/messaging.vue:
title: "メッセージ"
@ -1638,9 +1639,6 @@ mobile/views/components/sub-note-content.vue:
media-count: "{}つのメディア"
poll: "アンケート"
mobile/views/components/timeline.vue:
empty: "投稿がありません"
mobile/views/components/ui.header.vue:
welcome-back: "おかえりなさい、"
adjective: "さん"
@ -1659,10 +1657,6 @@ mobile/views/components/ui.nav.vue:
admin: "管理"
about: "Misskeyについて"
mobile/views/components/user-timeline.vue:
no-notes: "このユーザーは投稿していないようです。"
no-notes-with-media: "メディア付き投稿はありません。"
mobile/views/pages/favorites.vue:
title: "お気に入り"
@ -1687,9 +1681,6 @@ mobile/views/pages/home.vue:
mentions: "あなた宛て"
messages: "メッセージ"
mobile/views/pages/home.timeline.vue:
empty: "投稿がありません"
mobile/views/pages/tag.vue:
no-posts-found: "ハッシュタグ「{q}」が付けられた投稿は見つかりませんでした。"
@ -1796,9 +1787,6 @@ mobile/views/pages/user/home.vue:
followers-you-know: "知り合いのフォロワー"
last-used-at: "最終ログイン"
mobile/views/pages/user/home.notes.vue:
no-notes: "投稿はありません"
mobile/views/pages/user/home.photos.vue:
no-photos: "写真はありません"
@ -1828,7 +1816,6 @@ deck:
deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー"
edit: "オプション"
deck/deck.user-column.vue:

View File

@ -144,6 +144,7 @@ common:
is-remote-post: "この投稿情報はコピーです。"
view-on-remote: "ちゃんとした情報見せてや!"
renoted-by: "{user}がRenote"
no-notes: "投稿がありません"
error:
title: "問題が起こったわ"
retry: "もっぺん"
@ -537,6 +538,10 @@ common/views/components/profile-editor.vue:
mute-list: "ミュート"
blocking-list: "ブロック"
export-requested: "エクスポートをリクエストしました。これには時間がかかる場合があります。エクスポートが終わると、ドライブにファイルが追加されます。"
enter-password: "パスワードを入力してください"
danger-zone: "危険な設定"
delete-account: "アカウントを削除"
account-deleted: "アカウントが削除されました。データが消えるまで時間がかかる場合があります。"
common/views/components/user-list-editor.vue:
users: "ユーザー"
rename: "リスト名を変更"
@ -785,8 +790,6 @@ desktop/views/components/renote-form.vue:
failure: "Renoteでけへん"
desktop/views/components/renote-form-window.vue:
title: "この投稿をRenoteしてもええか"
desktop/views/components/timeline.core.vue:
empty: "投稿がありません"
desktop/views/pages/user-following-or-followers.vue:
following: "{user}のフォロー"
followers: "{user}のフォロワー"
@ -1353,6 +1356,7 @@ desktop/views/pages/user/user.header.vue:
following: "フォロー"
followers: "フォロワー"
is-bot: "このアカウントはBotや"
no-description: "自己紹介はありません"
years-old: "{age}歳"
year: "年"
month: "月"
@ -1363,7 +1367,6 @@ desktop/views/pages/user/user.timeline.vue:
with-replies: "投稿と返信"
with-media: "メディア"
my-posts: "私の投稿"
empty: "このユーザーはまだ何も投稿しとらんようや。"
desktop/views/widgets/messaging.vue:
title: "メッセージ"
desktop/views/widgets/notifications.vue:
@ -1461,8 +1464,6 @@ mobile/views/components/sub-note-content.vue:
deleted: "この投稿なんか無くなってもうたわ"
media-count: "{}つのメディア"
poll: "アンケート"
mobile/views/components/timeline.vue:
empty: "投稿はあらへん"
mobile/views/components/ui.header.vue:
welcome-back: "おかえり、"
adjective: "はん"
@ -1479,9 +1480,6 @@ mobile/views/components/ui.nav.vue:
settings: "設定"
admin: "管理"
about: "Misskeyってなんや"
mobile/views/components/user-timeline.vue:
no-notes: "このユーザーは投稿しとらんようや。"
no-notes-with-media: "メディア付き投稿はあらへん。"
mobile/views/pages/favorites.vue:
title: "お気に入り"
mobile/views/pages/user-lists.vue:
@ -1500,8 +1498,6 @@ mobile/views/pages/home.vue:
global: "グローバル"
mentions: "あんた宛て"
messages: "メッセージ"
mobile/views/pages/home.timeline.vue:
empty: "投稿がありません"
mobile/views/pages/tag.vue:
no-posts-found: "ハッシュタグ「{q}」が付けられた投稿はあらへんかった。"
mobile/views/pages/welcome.vue:
@ -1594,8 +1590,6 @@ mobile/views/pages/user/home.vue:
frequently-replied-users: "よく話すユーザー"
followers-you-know: "知っとるフォロワー"
last-used-at: "最後いつ来た?"
mobile/views/pages/user/home.notes.vue:
no-notes: "投稿はあらへん"
mobile/views/pages/user/home.photos.vue:
no-photos: "写真はあらへんで"
deck:
@ -1623,7 +1617,6 @@ deck:
description: "サーバーの運営者により、このタイムラインは使用できない状態に設定されています。"
deck/deck.tl-column.vue:
is-media-only: "メディア投稿だけや"
is-media-view: "メディアビュー"
edit: "オプション"
deck/deck.user-column.vue:
follows-you: "フォローされています"

View File

@ -144,6 +144,7 @@ common:
is-remote-post: "이 글 정보는 복사본입니다."
view-on-remote: "정확한 정보 보기"
renoted-by: "{user}이(가) 리노트"
no-notes: "投稿がありません"
error:
title: "오류가 발생했습니다"
retry: "다시 시도"
@ -214,7 +215,7 @@ common/views/pages/explore.vue:
recently-registered-users: "신규 사용자"
popular-tags: "인기 태그"
federated: "연합"
explore: "{host} 탐색"
explore: "{host}을(를) 탐색"
users-info: "현재 {users} 사용자가 등록되어 있습니다"
common/views/components/user-list.vue:
no-users: "사용자가 없습니다"
@ -537,6 +538,10 @@ common/views/components/profile-editor.vue:
mute-list: "뮤트"
blocking-list: "차단"
export-requested: "내보내기를 요청하였습니다. 이 작업은 시간이 걸릴 수 있습니다. 내보내기가 완료되면 드라이브에 파일이 추가됩니다."
enter-password: "パスワードを入力してください"
danger-zone: "危険な設定"
delete-account: "アカウントを削除"
account-deleted: "アカウントが削除されました。データが消えるまで時間がかかる場合があります。"
common/views/components/user-list-editor.vue:
users: "사용자"
rename: "리스트 이름 바꾸기"
@ -785,8 +790,6 @@ desktop/views/components/renote-form.vue:
failure: "리노트에 실패하였습니다"
desktop/views/components/renote-form-window.vue:
title: "이 글을 리노트하시겠습니까?"
desktop/views/components/timeline.core.vue:
empty: "글이 없습니다"
desktop/views/pages/user-following-or-followers.vue:
following: "{user}의 팔로잉"
followers: "{user}의 팔로워"
@ -1353,6 +1356,7 @@ desktop/views/pages/user/user.header.vue:
following: "팔로잉"
followers: "팔로워"
is-bot: "이 계정은 Bot입니다"
no-description: "자기소개가 없습니다"
years-old: "{age}세"
year: "년"
month: "월"
@ -1363,7 +1367,6 @@ desktop/views/pages/user/user.timeline.vue:
with-replies: "글과 답글"
with-media: "미디어"
my-posts: "내 글"
empty: "이 사용자는 아직 아무것도 게시하지 않은 것 같습니다."
desktop/views/widgets/messaging.vue:
title: "메시지"
desktop/views/widgets/notifications.vue:
@ -1461,8 +1464,6 @@ mobile/views/components/sub-note-content.vue:
deleted: "이 글은 삭제되었습니다"
media-count: "{}개의 미디어"
poll: "투표"
mobile/views/components/timeline.vue:
empty: "글이 없습니다"
mobile/views/components/ui.header.vue:
welcome-back: "돌아오신 걸 환영합니다."
adjective: "님"
@ -1479,9 +1480,6 @@ mobile/views/components/ui.nav.vue:
settings: "설정"
admin: "관리"
about: "Misskey에 대하여"
mobile/views/components/user-timeline.vue:
no-notes: "이 사용자는 작성한 글이 없는 것 같습니다."
no-notes-with-media: "미디어가 첨부된 글이 없습니다."
mobile/views/pages/favorites.vue:
title: "즐겨찾기"
mobile/views/pages/user-lists.vue:
@ -1500,8 +1498,6 @@ mobile/views/pages/home.vue:
global: "글로벌"
mentions: "받은 멘션"
messages: "메시지"
mobile/views/pages/home.timeline.vue:
empty: "글이 없습니다"
mobile/views/pages/tag.vue:
no-posts-found: "해시태그 \"{q}\"가 붙은 글을 찾을 수 없습니다."
mobile/views/pages/welcome.vue:
@ -1594,8 +1590,6 @@ mobile/views/pages/user/home.vue:
frequently-replied-users: "자주 언급되는 사용자"
followers-you-know: "아는 사람의 팔로워"
last-used-at: "마지막 로그인"
mobile/views/pages/user/home.notes.vue:
no-notes: "글이 없습니다"
mobile/views/pages/user/home.photos.vue:
no-photos: "사진이 없습니다"
deck:
@ -1623,7 +1617,6 @@ deck:
description: "서버 운영자에 의해 이 타임라인이 사용할 수 없도록 설정되어 있습니다."
deck/deck.tl-column.vue:
is-media-only: "미디어가 달린 글만"
is-media-view: "미디어 보기"
edit: "옵션"
deck/deck.user-column.vue:
follows-you: "당신을 팔로우합니다"

View File

@ -144,6 +144,7 @@ common:
is-remote-post: "この投稿情報はコピーです。"
view-on-remote: "正確な情報を見る"
renoted-by: "{user}がRenote"
no-notes: "投稿がありません"
error:
title: "問題が発生しました"
retry: "やり直す"
@ -537,6 +538,10 @@ common/views/components/profile-editor.vue:
mute-list: "ミュート"
blocking-list: "ブロック"
export-requested: "エクスポートをリクエストしました。これには時間がかかる場合があります。エクスポートが終わると、ドライブにファイルが追加されます。"
enter-password: "パスワードを入力してください"
danger-zone: "危険な設定"
delete-account: "アカウントを削除"
account-deleted: "アカウントが削除されました。データが消えるまで時間がかかる場合があります。"
common/views/components/user-list-editor.vue:
users: "ユーザー"
rename: "リスト名を変更"
@ -785,8 +790,6 @@ desktop/views/components/renote-form.vue:
failure: "Renote mislukt"
desktop/views/components/renote-form-window.vue:
title: "Weet je zeker dat je deze notitie wilt renoten?"
desktop/views/components/timeline.core.vue:
empty: "投稿がありません"
desktop/views/pages/user-following-or-followers.vue:
following: "{user}のフォロー"
followers: "{user}のフォロワー"
@ -1353,6 +1356,7 @@ desktop/views/pages/user/user.header.vue:
following: "フォロー"
followers: "フォロワー"
is-bot: "このアカウントはBotです"
no-description: "自己紹介はありません"
years-old: "{age}歳"
year: "年"
month: "月"
@ -1363,7 +1367,6 @@ desktop/views/pages/user/user.timeline.vue:
with-replies: "Berichten en antwoorden"
with-media: "Media"
my-posts: "私の投稿"
empty: "Deze gebruiker heeft nog niks geplaatst."
desktop/views/widgets/messaging.vue:
title: "Gesprekken"
desktop/views/widgets/notifications.vue:
@ -1461,8 +1464,6 @@ mobile/views/components/sub-note-content.vue:
deleted: "この投稿は削除されました"
media-count: "{} media"
poll: "Peiling"
mobile/views/components/timeline.vue:
empty: "Geen notities"
mobile/views/components/ui.header.vue:
welcome-back: "おかえりなさい、"
adjective: "さん"
@ -1479,9 +1480,6 @@ mobile/views/components/ui.nav.vue:
settings: "Instellingen"
admin: "管理"
about: "Over Misskey"
mobile/views/components/user-timeline.vue:
no-notes: "Het lijkt erop dat deze gebruiker nog niks heeft geplaatst"
no-notes-with-media: "Er zijn geen notities met bijgevoegde media"
mobile/views/pages/favorites.vue:
title: "お気に入り"
mobile/views/pages/user-lists.vue:
@ -1500,8 +1498,6 @@ mobile/views/pages/home.vue:
global: "グローバル"
mentions: "あなた宛て"
messages: "メッセージ"
mobile/views/pages/home.timeline.vue:
empty: "投稿がありません"
mobile/views/pages/tag.vue:
no-posts-found: "ハッシュタグ「{q}」が付けられた投稿は見つかりませんでした。"
mobile/views/pages/welcome.vue:
@ -1594,8 +1590,6 @@ mobile/views/pages/user/home.vue:
frequently-replied-users: "よく話すユーザー"
followers-you-know: "Volgers die je kent"
last-used-at: "Laatst actief"
mobile/views/pages/user/home.notes.vue:
no-notes: "Geen notities"
mobile/views/pages/user/home.photos.vue:
no-photos: "Geen foto's"
deck:
@ -1623,7 +1617,6 @@ deck:
description: "サーバーの運営者により、このタイムラインは使用できない状態に設定されています。"
deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー"
edit: "オプション"
deck/deck.user-column.vue:
follows-you: "フォローされています"

View File

@ -144,6 +144,7 @@ common:
is-remote-post: "この投稿情報はコピーです。"
view-on-remote: "正確な情報を見る"
renoted-by: "{user}がRenote"
no-notes: "投稿がありません"
error:
title: "問題が発生しました"
retry: "やり直す"
@ -537,6 +538,10 @@ common/views/components/profile-editor.vue:
mute-list: "ミュート"
blocking-list: "ブロック"
export-requested: "エクスポートをリクエストしました。これには時間がかかる場合があります。エクスポートが終わると、ドライブにファイルが追加されます。"
enter-password: "パスワードを入力してください"
danger-zone: "危険な設定"
delete-account: "アカウントを削除"
account-deleted: "アカウントが削除されました。データが消えるまで時間がかかる場合があります。"
common/views/components/user-list-editor.vue:
users: "ユーザー"
rename: "リスト名を変更"
@ -785,8 +790,6 @@ desktop/views/components/renote-form.vue:
failure: "Renoteに失敗しました"
desktop/views/components/renote-form-window.vue:
title: "この投稿をRenoteしますか"
desktop/views/components/timeline.core.vue:
empty: "投稿がありません"
desktop/views/pages/user-following-or-followers.vue:
following: "{user}のフォロー"
followers: "{user}のフォロワー"
@ -1353,6 +1356,7 @@ desktop/views/pages/user/user.header.vue:
following: "Følger"
followers: "フォロワー"
is-bot: "このアカウントはBotです"
no-description: "自己紹介はありません"
years-old: "{age}歳"
year: "年"
month: "月"
@ -1363,7 +1367,6 @@ desktop/views/pages/user/user.timeline.vue:
with-replies: "Innlegg og svar"
with-media: "Media"
my-posts: "私の投稿"
empty: "このユーザーはまだ何も投稿していないようです。"
desktop/views/widgets/messaging.vue:
title: "Melding"
desktop/views/widgets/notifications.vue:
@ -1461,8 +1464,6 @@ mobile/views/components/sub-note-content.vue:
deleted: "この投稿は削除されました"
media-count: "{}つのメディア"
poll: "アンケート"
mobile/views/components/timeline.vue:
empty: "投稿がありません"
mobile/views/components/ui.header.vue:
welcome-back: "おかえりなさい、"
adjective: "Mr."
@ -1479,9 +1480,6 @@ mobile/views/components/ui.nav.vue:
settings: "Innstillinger"
admin: "Admin"
about: "Misskeyについて"
mobile/views/components/user-timeline.vue:
no-notes: "このユーザーは投稿していないようです。"
no-notes-with-media: "メディア付き投稿はありません。"
mobile/views/pages/favorites.vue:
title: "Favoritter"
mobile/views/pages/user-lists.vue:
@ -1500,8 +1498,6 @@ mobile/views/pages/home.vue:
global: "Globalt"
mentions: "あなた宛て"
messages: "メッセージ"
mobile/views/pages/home.timeline.vue:
empty: "投稿がありません"
mobile/views/pages/tag.vue:
no-posts-found: "ハッシュタグ「{q}」が付けられた投稿は見つかりませんでした。"
mobile/views/pages/welcome.vue:
@ -1594,8 +1590,6 @@ mobile/views/pages/user/home.vue:
frequently-replied-users: "よく話すユーザー"
followers-you-know: "知り合いのフォロワー"
last-used-at: "最終ログイン"
mobile/views/pages/user/home.notes.vue:
no-notes: "投稿はありません"
mobile/views/pages/user/home.photos.vue:
no-photos: "写真はありません"
deck:
@ -1623,7 +1617,6 @@ deck:
description: "サーバーの運営者により、このタイムラインは使用できない状態に設定されています。"
deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー"
edit: "オプション"
deck/deck.user-column.vue:
follows-you: "フォローされています"

View File

@ -144,6 +144,7 @@ common:
is-remote-post: "この投稿情報はコピーです。"
view-on-remote: "Dla dopełnienia, zobacz to zdalnie."
renoted-by: "{user} udostępnił(a)"
no-notes: "投稿がありません"
error:
title: "Coś poszło nie tak"
retry: "Ponów próbę"
@ -537,6 +538,10 @@ common/views/components/profile-editor.vue:
mute-list: "ミュート"
blocking-list: "ブロック"
export-requested: "エクスポートをリクエストしました。これには時間がかかる場合があります。エクスポートが終わると、ドライブにファイルが追加されます。"
enter-password: "パスワードを入力してください"
danger-zone: "危険な設定"
delete-account: "アカウントを削除"
account-deleted: "アカウントが削除されました。データが消えるまで時間がかかる場合があります。"
common/views/components/user-list-editor.vue:
users: "Użytkownicy"
rename: "Zmień nazwę listy"
@ -785,8 +790,6 @@ desktop/views/components/renote-form.vue:
failure: "Nie udało się udostępnić"
desktop/views/components/renote-form-window.vue:
title: "Czy na pewno chcesz udostępnić ten wpis?"
desktop/views/components/timeline.core.vue:
empty: "投稿がありません"
desktop/views/pages/user-following-or-followers.vue:
following: "{user}のフォロー"
followers: "{user}のフォロワー"
@ -1353,6 +1356,7 @@ desktop/views/pages/user/user.header.vue:
following: "Śledzeni"
followers: "Śledzący"
is-bot: "To konto jest botem"
no-description: "自己紹介はありません"
years-old: "{age} lat"
year: "/"
month: "/"
@ -1363,7 +1367,6 @@ desktop/views/pages/user/user.timeline.vue:
with-replies: "Wpisy i odpowiedzi"
with-media: "Multimedia"
my-posts: "Moje wpisy"
empty: "Ten użytkownik nie umieścił jeszcze niczego."
desktop/views/widgets/messaging.vue:
title: "Wiadomości"
desktop/views/widgets/notifications.vue:
@ -1461,8 +1464,6 @@ mobile/views/components/sub-note-content.vue:
deleted: "ten wpis został usunięty"
media-count: "{}zawartości multimedialnej"
poll: "Ankieta"
mobile/views/components/timeline.vue:
empty: "Brak wpisów"
mobile/views/components/ui.header.vue:
welcome-back: "Witaj ponownie, "
adjective: "さん"
@ -1479,9 +1480,6 @@ mobile/views/components/ui.nav.vue:
settings: "Ustawienia"
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"
no-notes-with-media: "Brak wpisów z zawartością multimedialną"
mobile/views/pages/favorites.vue:
title: "Ulubione"
mobile/views/pages/user-lists.vue:
@ -1500,8 +1498,6 @@ mobile/views/pages/home.vue:
global: "Globalne"
mentions: "Wspomnienia"
messages: "Wiadomości"
mobile/views/pages/home.timeline.vue:
empty: "投稿がありません"
mobile/views/pages/tag.vue:
no-posts-found: "ハッシュタグ「{q}」が付けられた投稿は見つかりませんでした。"
mobile/views/pages/welcome.vue:
@ -1594,8 +1590,6 @@ mobile/views/pages/user/home.vue:
frequently-replied-users: "よく話すユーザー"
followers-you-know: "Śledzący których znasz"
last-used-at: "Ostatnio aktywny"
mobile/views/pages/user/home.notes.vue:
no-notes: "Brak wpisów"
mobile/views/pages/user/home.photos.vue:
no-photos: "Brak zdjęć"
deck:
@ -1623,7 +1617,6 @@ deck:
description: "サーバーの運営者により、このタイムラインは使用できない状態に設定されています。"
deck/deck.tl-column.vue:
is-media-only: "Tylko wpisy z zawartością multimedialną"
is-media-view: "Widok multimediów"
edit: "Opcje"
deck/deck.user-column.vue:
follows-you: "フォローされています"

View File

@ -144,6 +144,7 @@ common:
is-remote-post: "この投稿情報はコピーです。"
view-on-remote: "正確な情報を見る"
renoted-by: "{user}がRenote"
no-notes: "投稿がありません"
error:
title: "問題が発生しました"
retry: "やり直す"
@ -537,6 +538,10 @@ common/views/components/profile-editor.vue:
mute-list: "ミュート"
blocking-list: "ブロック"
export-requested: "エクスポートをリクエストしました。これには時間がかかる場合があります。エクスポートが終わると、ドライブにファイルが追加されます。"
enter-password: "パスワードを入力してください"
danger-zone: "危険な設定"
delete-account: "アカウントを削除"
account-deleted: "アカウントが削除されました。データが消えるまで時間がかかる場合があります。"
common/views/components/user-list-editor.vue:
users: "ユーザー"
rename: "リスト名を変更"
@ -785,8 +790,6 @@ desktop/views/components/renote-form.vue:
failure: "Renoteに失敗しました"
desktop/views/components/renote-form-window.vue:
title: "この投稿をRenoteしますか"
desktop/views/components/timeline.core.vue:
empty: "投稿がありません"
desktop/views/pages/user-following-or-followers.vue:
following: "{user}のフォロー"
followers: "{user}のフォロワー"
@ -1353,6 +1356,7 @@ desktop/views/pages/user/user.header.vue:
following: "フォロー"
followers: "フォロワー"
is-bot: "このアカウントはBotです"
no-description: "自己紹介はありません"
years-old: "{age}歳"
year: "年"
month: "月"
@ -1363,7 +1367,6 @@ desktop/views/pages/user/user.timeline.vue:
with-replies: "投稿と返信"
with-media: "メディア"
my-posts: "私の投稿"
empty: "このユーザーはまだ何も投稿していないようです。"
desktop/views/widgets/messaging.vue:
title: "メッセージ"
desktop/views/widgets/notifications.vue:
@ -1461,8 +1464,6 @@ mobile/views/components/sub-note-content.vue:
deleted: "この投稿は削除されました"
media-count: "{}つのメディア"
poll: "アンケート"
mobile/views/components/timeline.vue:
empty: "投稿がありません"
mobile/views/components/ui.header.vue:
welcome-back: "おかえりなさい、"
adjective: "さん"
@ -1479,9 +1480,6 @@ mobile/views/components/ui.nav.vue:
settings: "設定"
admin: "管理"
about: "Misskeyについて"
mobile/views/components/user-timeline.vue:
no-notes: "このユーザーは投稿していないようです。"
no-notes-with-media: "メディア付き投稿はありません。"
mobile/views/pages/favorites.vue:
title: "お気に入り"
mobile/views/pages/user-lists.vue:
@ -1500,8 +1498,6 @@ mobile/views/pages/home.vue:
global: "グローバル"
mentions: "あなた宛て"
messages: "メッセージ"
mobile/views/pages/home.timeline.vue:
empty: "投稿がありません"
mobile/views/pages/tag.vue:
no-posts-found: "ハッシュタグ「{q}」が付けられた投稿は見つかりませんでした。"
mobile/views/pages/welcome.vue:
@ -1594,8 +1590,6 @@ mobile/views/pages/user/home.vue:
frequently-replied-users: "よく話すユーザー"
followers-you-know: "Seguidores que você conhece"
last-used-at: "Ativo pela última vez"
mobile/views/pages/user/home.notes.vue:
no-notes: "Nenhuma mensagem"
mobile/views/pages/user/home.photos.vue:
no-photos: "Sem fotos"
deck:
@ -1623,7 +1617,6 @@ deck:
description: "サーバーの運営者により、このタイムラインは使用できない状態に設定されています。"
deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー"
edit: "オプション"
deck/deck.user-column.vue:
follows-you: "フォローされています"

View File

@ -144,6 +144,7 @@ common:
is-remote-post: "この投稿情報はコピーです。"
view-on-remote: "正確な情報を見る"
renoted-by: "{user}がRenote"
no-notes: "投稿がありません"
error:
title: "Что-то пошло не так :("
retry: "Повторить"
@ -537,6 +538,10 @@ common/views/components/profile-editor.vue:
mute-list: "ミュート"
blocking-list: "ブロック"
export-requested: "エクスポートをリクエストしました。これには時間がかかる場合があります。エクスポートが終わると、ドライブにファイルが追加されます。"
enter-password: "パスワードを入力してください"
danger-zone: "危険な設定"
delete-account: "アカウントを削除"
account-deleted: "アカウントが削除されました。データが消えるまで時間がかかる場合があります。"
common/views/components/user-list-editor.vue:
users: "ユーザー"
rename: "リスト名を変更"
@ -785,8 +790,6 @@ desktop/views/components/renote-form.vue:
failure: "Renoteに失敗しました"
desktop/views/components/renote-form-window.vue:
title: "この投稿をRenoteしますか"
desktop/views/components/timeline.core.vue:
empty: "投稿がありません"
desktop/views/pages/user-following-or-followers.vue:
following: "{user}のフォロー"
followers: "{user}のフォロワー"
@ -1353,6 +1356,7 @@ desktop/views/pages/user/user.header.vue:
following: "フォロー"
followers: "フォロワー"
is-bot: "このアカウントはBotです"
no-description: "自己紹介はありません"
years-old: "{age}歳"
year: "年"
month: "月"
@ -1363,7 +1367,6 @@ desktop/views/pages/user/user.timeline.vue:
with-replies: "投稿と返信"
with-media: "メディア"
my-posts: "私の投稿"
empty: "このユーザーはまだ何も投稿していないようです。"
desktop/views/widgets/messaging.vue:
title: "メッセージ"
desktop/views/widgets/notifications.vue:
@ -1461,8 +1464,6 @@ mobile/views/components/sub-note-content.vue:
deleted: "この投稿は削除されました"
media-count: "{}つのメディア"
poll: "アンケート"
mobile/views/components/timeline.vue:
empty: "投稿がありません"
mobile/views/components/ui.header.vue:
welcome-back: "おかえりなさい、"
adjective: "さん"
@ -1479,9 +1480,6 @@ mobile/views/components/ui.nav.vue:
settings: "設定"
admin: "管理"
about: "Misskeyについて"
mobile/views/components/user-timeline.vue:
no-notes: "このユーザーは投稿していないようです。"
no-notes-with-media: "メディア付き投稿はありません。"
mobile/views/pages/favorites.vue:
title: "お気に入り"
mobile/views/pages/user-lists.vue:
@ -1500,8 +1498,6 @@ mobile/views/pages/home.vue:
global: "グローバル"
mentions: "あなた宛て"
messages: "メッセージ"
mobile/views/pages/home.timeline.vue:
empty: "投稿がありません"
mobile/views/pages/tag.vue:
no-posts-found: "ハッシュタグ「{q}」が付けられた投稿は見つかりませんでした。"
mobile/views/pages/welcome.vue:
@ -1594,8 +1590,6 @@ mobile/views/pages/user/home.vue:
frequently-replied-users: "よく話すユーザー"
followers-you-know: "知り合いのフォロワー"
last-used-at: "最終ログイン"
mobile/views/pages/user/home.notes.vue:
no-notes: "投稿はありません"
mobile/views/pages/user/home.photos.vue:
no-photos: "写真はありません"
deck:
@ -1623,7 +1617,6 @@ deck:
description: "サーバーの運営者により、このタイムラインは使用できない状態に設定されています。"
deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー"
edit: "オプション"
deck/deck.user-column.vue:
follows-you: "フォローされています"

View File

@ -144,6 +144,7 @@ common:
is-remote-post: "该投稿已被复制."
view-on-remote: "查看准确的信息"
renoted-by: "由 {user} Renote"
no-notes: "没有帖子"
error:
title: "出现问题"
retry: "重试"
@ -537,6 +538,10 @@ common/views/components/profile-editor.vue:
mute-list: "屏蔽列表"
blocking-list: "黑名单"
export-requested: "导出请求已提交。可能需要花一些时间。导出的文件将保存到网盘中。"
enter-password: "パスワードを入力してください"
danger-zone: "危険な設定"
delete-account: "アカウントを削除"
account-deleted: "アカウントが削除されました。データが消えるまで時間がかかる場合があります。"
common/views/components/user-list-editor.vue:
users: "用户"
rename: "重命名列表"
@ -785,8 +790,6 @@ desktop/views/components/renote-form.vue:
failure: "重新发送失败"
desktop/views/components/renote-form-window.vue:
title: "您是否要重新发送?"
desktop/views/components/timeline.core.vue:
empty: "没有帖子"
desktop/views/pages/user-following-or-followers.vue:
following: "{user}的正在关注"
followers: "{user}的关注者"
@ -1353,6 +1356,7 @@ desktop/views/pages/user/user.header.vue:
following: "关注中"
followers: "关注者"
is-bot: "这个账户是Bot"
no-description: "没有自我介绍"
years-old: "{age}岁"
year: "年"
month: "月"
@ -1363,7 +1367,6 @@ desktop/views/pages/user/user.timeline.vue:
with-replies: "帖子与回复"
with-media: "媒体"
my-posts: "我的帖子"
empty: "看起来这个用户还没有发布什么呢。"
desktop/views/widgets/messaging.vue:
title: "信息"
desktop/views/widgets/notifications.vue:
@ -1461,8 +1464,6 @@ mobile/views/components/sub-note-content.vue:
deleted: "帖子已删除"
media-count: "附加{}媒体"
poll: "投票"
mobile/views/components/timeline.vue:
empty: "无帖子"
mobile/views/components/ui.header.vue:
welcome-back: "欢迎回来!"
adjective: "先生"
@ -1479,9 +1480,6 @@ mobile/views/components/ui.nav.vue:
settings: "设置"
admin: "管理"
about: "关于 Misskey"
mobile/views/components/user-timeline.vue:
no-notes: "看起来该用户还没有发表任何东西哎。"
no-notes-with-media: "媒体附件没有备注"
mobile/views/pages/favorites.vue:
title: "收藏"
mobile/views/pages/user-lists.vue:
@ -1500,8 +1498,6 @@ mobile/views/pages/home.vue:
global: "Global"
mentions: "Mentions"
messages: "信息"
mobile/views/pages/home.timeline.vue:
empty: "没有帖子"
mobile/views/pages/tag.vue:
no-posts-found: "没有找到带有主题标签“{q}”的帖子"
mobile/views/pages/welcome.vue:
@ -1594,8 +1590,6 @@ mobile/views/pages/user/home.vue:
frequently-replied-users: "活跃用户"
followers-you-know: "您可能认识的关注者"
last-used-at: "上次登录:"
mobile/views/pages/user/home.notes.vue:
no-notes: "没有帖子"
mobile/views/pages/user/home.photos.vue:
no-photos: "没有图片"
deck:
@ -1623,7 +1617,6 @@ deck:
description: "服务器管理员已禁用时间线。"
deck/deck.tl-column.vue:
is-media-only: "只有媒体的帖子"
is-media-view: "媒体视图"
edit: "选项"
deck/deck.user-column.vue:
follows-you: "关注您"

View File

@ -1,7 +1,7 @@
{
"name": "misskey",
"author": "syuilo <i@syuilo.com>",
"version": "10.87.4",
"version": "10.88.0",
"codename": "nighthike",
"repository": {
"type": "git",

View File

@ -128,15 +128,16 @@ export default Vue.extend({
},
close() {
this.$el.style.pointerEvents = 'none';
(this.$refs.bg as any).style.pointerEvents = 'none';
(this.$refs.main as any).style.pointerEvents = 'none';
anime({
targets: this.$refs.bg,
opacity: 0,
duration: 300,
easing: 'linear'
});
(this.$refs.main as any).style.pointerEvents = 'none';
anime({
targets: this.$refs.main,
opacity: 0,

View File

@ -0,0 +1,48 @@
<template>
<a class="zxrjzpcj" :href="url" :class="service" target="_blank">
<fa :icon="icon" size="lg" fixed-width /><span>{{ text }}</span>
</a>
</template>
<script lang="ts">
import Vue from 'vue';
export default Vue.extend({
props: ['url', 'text', 'icon', 'service']
});
</script>
<style lang="stylus" scoped>
.zxrjzpcj
display inline-block
padding 6px 8px 6px 6px
margin-top 4px
margin-bottom 4px
border-radius 32px
white-space nowrap
&:hover
text-decoration none
&.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>

View File

@ -0,0 +1,26 @@
<template>
<div class="nbogcrmo" :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 './integrations.integration.vue';
export default Vue.extend({
components: {
XIntegration
},
props: ['user']
});
</script>
<style lang="stylus" scoped>
.nbogcrmo
> *
margin-right 10px
</style>

View File

@ -101,6 +101,13 @@
<ui-button @click="doExport()"><fa :icon="faDownload"/> {{ $t('export') }}</ui-button>
</div>
</section>
<section>
<details>
<summary>{{ $t('danger-zone') }}</summary>
<ui-button @click="deleteAccount()">{{ $t('delete-account') }}</ui-button>
</details>
</section>
</ui-card>
</template>
@ -283,6 +290,25 @@ export default Vue.extend({
type: 'info',
text: this.$t('export-requested')
});
},
async deleteAccount() {
const { canceled: canceled, result: password } = await this.$root.dialog({
title: this.$t('enter-password'),
input: {
type: 'password'
}
});
if (canceled) return;
this.$root.api('i/delete-account', {
password
}).then(() => {
this.$root.dialog({
type: 'success',
text: this.$t('account-deleted')
});
});
}
}
});

View File

@ -9,7 +9,7 @@
</div>
</ui-container>
<ui-container :body-togglable="true" ref="tags">
<ui-container :body-togglable="true" :expanded="tag == null" ref="tags">
<template #header><fa :icon="faHashtag" fixed-width/>{{ $t('popular-tags') }}</template>
<div class="vxjfqztj">

View File

@ -4,7 +4,7 @@
<div class="newer-indicator" :style="{ top: $store.state.uiHeaderHeight + 'px' }" v-show="queue.length > 0"></div>
<slot name="empty" v-if="notes.length == 0 && !fetching && inited"></slot>
<div class="empty" v-if="notes.length == 0 && !fetching && inited">{{ $t('@.no-notes') }}</div>
<mk-error v-if="!fetching && !inited" @retry="init()"/>
@ -209,6 +209,11 @@ export default Vue.extend({
> *
transition transform .3s ease, opacity .3s ease
> .empty
padding 16px
text-align center
color var(--text)
> .placeholder
padding 32px
opacity 0.3

View File

@ -30,6 +30,10 @@ export default Vue.extend({
type: Boolean,
default: false
},
expanded: {
type: Boolean,
default: true
},
},
inject: {
inDeck: {
@ -38,7 +42,7 @@ export default Vue.extend({
},
data() {
return {
showBody: true
showBody: this.expanded
};
},
methods: {

View File

@ -1,5 +1,5 @@
<template>
<x-notes ref="timeline" :make-promise="makePromise" :media-view="mediaView" @inited="() => $emit('loaded')"/>
<x-notes ref="timeline" :make-promise="makePromise" @inited="() => $emit('loaded')"/>
</template>
<script lang="ts">
@ -22,11 +22,6 @@ export default Vue.extend({
type: Boolean,
required: false,
default: false
},
mediaView: {
type: Boolean,
required: false,
default: false
}
},

View File

@ -1,5 +1,5 @@
<template>
<x-notes ref="timeline" :make-promise="makePromise" :media-view="mediaView" @inited="() => $emit('loaded')"/>
<x-notes ref="timeline" :make-promise="makePromise" @inited="() => $emit('loaded')"/>
</template>
<script lang="ts">
@ -22,11 +22,6 @@ export default Vue.extend({
type: Boolean,
required: false,
default: false
},
mediaView: {
type: Boolean,
required: false,
default: false
}
},

View File

@ -1,6 +1,6 @@
<template>
<div class="eamppglmnmimdhrlzhplwpvyeaqmmhxu">
<slot name="empty" v-if="notes.length == 0 && !fetching && inited"></slot>
<div class="empty" v-if="notes.length == 0 && !fetching && inited">{{ $t('@.no-notes') }}</div>
<mk-error v-if="!fetching && !inited" @retry="init()"/>
@ -17,7 +17,6 @@
:note="note"
:key="note.id"
@update:note="onNoteUpdated(i, $event)"
:media-view="mediaView"
:compact="true"
:mini="true"/>
<p class="date" :key="note.id + '_date'" v-if="i != notes.length - 1 && note._date != _notes[i + 1]._date">
@ -56,11 +55,6 @@ export default Vue.extend({
props: {
makePromise: {
required: true
},
mediaView: {
type: Boolean,
required: false,
default: false
}
},
@ -91,6 +85,9 @@ export default Vue.extend({
watch: {
queue(q) {
this.count(q.length);
},
makePromise() {
this.init();
}
},
@ -115,12 +112,12 @@ export default Vue.extend({
},
reload() {
this.queue = [];
this.notes = [];
this.init();
},
init() {
this.queue = [];
this.notes = [];
this.fetching = true;
this.makePromise().then(x => {
if (Array.isArray(x)) {
@ -204,6 +201,11 @@ export default Vue.extend({
> *
transition transform .3s ease, opacity .3s ease
> .empty
padding 16px
text-align center
color var(--text)
> .placeholder
padding 16px
opacity 0.3

View File

@ -12,25 +12,21 @@
<div class="editor" style="padding:12px" v-if="edit">
<ui-switch v-model="column.isMediaOnly" @change="onChangeSettings">{{ $t('is-media-only') }}</ui-switch>
<ui-switch v-model="column.isMediaView" @change="onChangeSettings">{{ $t('is-media-view') }}</ui-switch>
</div>
<x-list-tl v-if="column.type == 'list'"
:list="column.list"
:media-only="column.isMediaOnly"
:media-view="column.isMediaView"
ref="tl"
/>
<x-hashtag-tl v-else-if="column.type == 'hashtag'"
:tag-tl="$store.state.settings.tagTimelines.find(x => x.id == column.tagTlId)"
:media-only="column.isMediaOnly"
:media-view="column.isMediaView"
ref="tl"
/>
<x-tl v-else
:src="column.type"
:media-only="column.isMediaOnly"
:media-view="column.isMediaView"
ref="tl"
/>
</x-column>

View File

@ -6,7 +6,7 @@
</p>
<p class="desc">{{ $t('disabled-timeline.description') }}</p>
</div>
<x-notes v-else ref="timeline" :make-promise="makePromise" :media-view="mediaView" @inited="() => $emit('loaded')"/>
<x-notes v-else ref="timeline" :make-promise="makePromise" @inited="() => $emit('loaded')"/>
</template>
<script lang="ts">
@ -34,11 +34,6 @@ export default Vue.extend({
type: Boolean,
required: false,
default: false
},
mediaView: {
type: Boolean,
required: false,
default: false
}
},
@ -73,16 +68,18 @@ export default Vue.extend({
watch: {
mediaOnly() {
this.fetch();
(this.$refs.timeline as any).reload();
}
},
created() {
this.makePromise = cursor => this.$root.api(this.endpoint, {
limit: fetchLimit + 1,
untilDate: cursor ? undefined : (this.date ? this.date.getTime() : undefined),
untilId: cursor ? cursor : undefined,
...this.baseQuery, ...this.query
withFiles: this.mediaOnly,
includeMyRenotes: this.$store.state.settings.showMyRenotes,
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
includeLocalRenotes: this.$store.state.settings.showLocalRenotes
}).then(notes => {
if (notes.length == fetchLimit + 1) {
notes.pop();

View File

@ -61,7 +61,24 @@ export default Vue.extend({
return {
withFiles: false,
images: [],
makePromise: cursor => this.$root.api('users/notes', {
makePromise: null
};
},
watch: {
user() {
this.genPromiseMaker();
}
},
created() {
this.fetch();
this.genPromiseMaker();
},
methods: {
genPromiseMaker() {
this.makePromise = cursor => this.$root.api('users/notes', {
userId: this.user.id,
limit: fetchLimit + 1,
untilId: cursor ? cursor : undefined,
@ -82,15 +99,9 @@ export default Vue.extend({
cursor: null
};
}
})
};
},
});
},
created() {
this.fetch();
},
methods: {
fetch() {
const image = [
'image/jpeg',

View File

@ -8,9 +8,6 @@
<router-link to="/explore">{{ $t('@.empty-timeline-info.explore') }}</router-link>
</div>
</template>
<template #empty>
<fa :icon="['far', 'comments']"/>{{ $t('empty') }}
</template>
</mk-notes>
</div>
</template>

View File

@ -23,6 +23,7 @@
<div class="description">
<mfm v-if="user.description" :text="user.description" :is-note="false" :author="user" :i="$store.state.i" :custom-emojis="user.emojis"/>
<p v-else class="empty">{{ $t('no-description') }}</p>
<x-integrations :user="user" style="margin-top:16px;"/>
</div>
<div class="fields" v-if="user.fields">
<dl class="field" v-for="(field, i) in user.fields" :key="i">
@ -52,9 +53,13 @@ import Vue from 'vue';
import i18n from '../../../../i18n';
import * as age from 's-age';
import XUserMenu from '../../../../common/views/components/user-menu.vue';
import XIntegrations from '../../../../common/views/components/integrations.vue';
export default Vue.extend({
i18n: i18n('desktop/views/pages/user/user.header.vue'),
components: {
XIntegrations
},
props: ['user'],
computed: {
style(): any {
@ -215,6 +220,8 @@ export default Vue.extend({
color var(--text)
> .description
font-size 15px
> .empty
margin 0
opacity 0.5
@ -251,6 +258,7 @@ export default Vue.extend({
margin-top 16px
padding-top 16px
border-top solid 1px var(--faceDivider)
font-size 15px
&:empty
display none

View File

@ -1,6 +1,5 @@
<template>
<div class="lnctpgve">
<x-integrations :user="user" v-if="user.twitter || user.github || user.discord"/>
<mk-note-detail v-for="n in user.pinnedNotes" :key="n.id" :note="n" :compact="true"/>
<!--<mk-calendar @chosen="warp" :start="new Date(user.createdAt)"/>-->
<div class="activity">
@ -17,11 +16,8 @@
<script lang="ts">
import Vue from 'vue';
import i18n from '../../../../i18n';
import parseAcct from '../../../../../../misc/acct/parse';
import Progress from '../../../../common/scripts/loading';
import XTimeline from './user.timeline.vue';
import XPhotos from './user.photos.vue';
import XIntegrations from './user.integrations.vue';
import XActivity from '../../../../common/views/components/activity.vue';
export default Vue.extend({
@ -29,7 +25,6 @@ export default Vue.extend({
components: {
XTimeline,
XPhotos,
XIntegrations,
XActivity
},
props: {

View File

@ -1,14 +0,0 @@
<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>

View File

@ -1,66 +0,0 @@
<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
display flex
> a
display flex
flex 1
align-items center
padding 16px
box-shadow var(--shadow)
border-radius var(--round)
&:not(:last-child)
margin-right 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>

View File

@ -9,7 +9,6 @@
<span :data-active="mode == 'my-posts'" @click="mode = 'my-posts'"><fa icon="user"/> {{ $t('my-posts') }}</span>
</header>
</template>
<template #empty><fa :icon="['far', 'comments']"/>{{ $t('empty') }}</template>
</mk-notes>
</div>
</template>

View File

@ -122,19 +122,23 @@ export default Vue.extend({
};
},
mounted() {
// Get replies
if (!this.compact) {
watch: {
note() {
this.fetchReplies();
}
},
methods: {
fetchReplies() {
if (this.compact) return;
this.$root.api('notes/replies', {
noteId: this.appearNote.id,
limit: 8
}).then(replies => {
this.replies = replies;
});
}
},
},
methods: {
fetchConversation() {
this.conversationFetching = true;

View File

@ -1,6 +1,6 @@
<template>
<div class="ivaojijs">
<slot name="empty" v-if="notes.length == 0 && !fetching && inited"></slot>
<div class="empty" v-if="notes.length == 0 && !fetching && inited">{{ $t('@.no-notes') }}</div>
<mk-error v-if="!fetching && !inited" @retry="init()"/>
@ -197,6 +197,11 @@ export default Vue.extend({
@media (min-width 500px)
box-shadow 0 8px 32px rgba(#000, 0.1)
> .empty
padding 16px
text-align center
color var(--text)
.transition
.mk-notes-enter
.mk-notes-leave-to

View File

@ -30,10 +30,14 @@ export default Vue.extend({
type: Boolean,
default: false
},
expanded: {
type: Boolean,
default: true
},
},
data() {
return {
showBody: true
showBody: this.expanded
};
},
methods: {

View File

@ -1,11 +1,6 @@
<template>
<div class="mk-user-timeline">
<mk-notes ref="timeline" :make-promise="makePromise" @inited="() => $emit('loaded')">
<template #empty>
<fa :icon="['far', 'comments']"/>
{{ withMedia ? this.$t('no-notes-with-media') : this.$t('no-notes') }}
</template>
</mk-notes>
<mk-notes ref="timeline" :make-promise="makePromise" @inited="() => $emit('loaded')"/>
</div>
</template>

View File

@ -7,11 +7,7 @@
</div>
</ui-container>
<mk-notes ref="timeline" :make-promise="makePromise" @inited="() => $emit('loaded')">
<template #empty>
<fa :icon="['far', 'comments']"/>{{ $t('empty') }}
</template>
</mk-notes>
<mk-notes ref="timeline" :make-promise="makePromise" @inited="() => $emit('loaded')"/>
</div>
</template>

View File

@ -1,7 +1,7 @@
<template>
<mk-ui>
<template #header v-if="!fetching"><img :src="avator" alt="">
<mk-user-name :user="user"/>
<template #header v-if="!fetching">
<img :src="avator" alt=""><mk-user-name :user="user"/>
</template>
<div class="wwtwuxyh" v-if="!fetching">
<div class="is-suspended" v-if="user.isSuspended"><p><fa icon="exclamation-triangle"/> {{ $t('@.user-suspended') }}</p></div>
@ -23,6 +23,7 @@
</div>
<div class="description">
<mfm v-if="user.description" :text="user.description" :is-note="false" :author="user" :i="$store.state.i" :custom-emojis="user.emojis"/>
<x-integrations :user="user" style="margin:20px 0;"/>
</div>
<div class="fields" v-if="user.fields">
<dl class="field" v-for="(field, i) in user.fields" :key="i">
@ -67,9 +68,9 @@
</nav>
<main>
<template v-if="$route.name == 'user'">
<x-home v-if="page == 'home'" :user="user"/>
<mk-user-timeline v-if="page == 'notes'" :user="user" key="tl"/>
<mk-user-timeline v-if="page == 'media'" :user="user" :with-media="true" key="media"/>
<x-home v-if="page == 'home'" :user="user" :key="user.id"/>
<mk-user-timeline v-if="page == 'notes'" :user="user" :key="`tl:${user.id}`"/>
<mk-user-timeline v-if="page == 'media'" :user="user" :with-media="true" :key="`media:${user.id}`"/>
</template>
<router-view :user="user"></router-view>
</main>
@ -86,11 +87,13 @@ import Progress from '../../../../common/scripts/loading';
import XUserMenu from '../../../../common/views/components/user-menu.vue';
import XHome from './home.vue';
import { getStaticImageUrl } from '../../../../common/scripts/get-static-image-url';
import XIntegrations from '../../../../common/views/components/integrations.vue';
export default Vue.extend({
i18n: i18n('mobile/views/pages/user.vue'),
components: {
XHome
XHome,
XIntegrations
},
data() {
return {
@ -245,6 +248,9 @@ export default Vue.extend({
margin 8px 0
color var(--mobileUserPageDescription)
@media (max-width 450px)
font-size 15px
> .fields
margin 8px 0
@ -276,6 +282,9 @@ export default Vue.extend({
> .info
margin 8px 0
@media (max-width 450px)
font-size 15px
> p
display inline
margin 0 16px 0 0

View File

@ -1,15 +1,13 @@
import * as os from 'os';
import * as sysUtils from 'systeminformation';
import Logger from "./logger";
import Logger from './logger';
export async function showMachineInfo(parentLogger: Logger) {
const logger = parentLogger.createSubLogger('machine');
logger.debug(`Hostname: ${os.hostname()}`);
logger.debug(`Platform: ${process.platform}`);
logger.debug(`Architecture: ${process.arch}`);
logger.debug(`CPU: ${os.cpus().length} core`);
logger.debug(`Platform: ${process.platform} Arch: ${process.arch}`);
const mem = await sysUtils.mem();
const totalmem = (mem.total / 1024 / 1024 / 1024).toFixed(1);
const availmem = (mem.available / 1024 / 1024 / 1024).toFixed(1);
logger.debug(`MEM: ${totalmem}GB (available: ${availmem}GB)`);
logger.debug(`CPU: ${os.cpus().length} core MEM: ${totalmem}GB (available: ${availmem}GB)`);
}

View File

@ -55,6 +55,8 @@ type IUserBase = {
emojis?: string[];
tags?: string[];
isDeleted: boolean;
/**
* 凍結されているか否か
*/

41
src/prelude/xml.ts Normal file
View File

@ -0,0 +1,41 @@
const map: Record<string, string> = {
'&': '&amp;',
'<': '&lt;',
'>': '&gt;',
'"': '&quot;',
'\'': '&apos;'
};
const beginingOfCDATA = '<![CDATA[';
const endOfCDATA = ']]>';
export function escapeValue(x: string): string {
let insideOfCDATA = false;
let builder = '';
for (
let i = 0;
i < x.length;
) {
if (insideOfCDATA) {
if (x.slice(i, i + beginingOfCDATA.length) === beginingOfCDATA) {
insideOfCDATA = true;
i += beginingOfCDATA.length;
} else {
builder += x[i++];
}
} else {
if (x.slice(i, i + endOfCDATA.length) === endOfCDATA) {
insideOfCDATA = false;
i += endOfCDATA.length;
} else {
const b = x[i++];
builder += map[b] || b;
}
}
}
return builder;
}
export function escapeAttribute(x: string): string {
return Object.entries(map).reduce((a, [k, v]) => a.replace(k, v), x);
}

View File

@ -70,6 +70,32 @@ export function processInbox(activity: any, signature: httpSignature.IParsedSign
}
}
export function createDeleteNotesJob(user: ILocalUser) {
const data = {
type: 'deleteNotes',
user: user
};
if (queueAvailable && enableQueueProcessing) {
return queue.createJob(data).save();
} else {
return handler({ data }, () => {});
}
}
export function createDeleteDriveFilesJob(user: ILocalUser) {
const data = {
type: 'deleteDriveFiles',
user: user
};
if (queueAvailable && enableQueueProcessing) {
return queue.createJob(data).save();
} else {
return handler({ data }, () => {});
}
}
export function createExportNotesJob(user: ILocalUser) {
const data = {
type: 'exportNotes',

View File

@ -0,0 +1,55 @@
import * as bq from 'bee-queue';
import * as mongo from 'mongodb';
import { queueLogger } from '../logger';
import User from '../../models/user';
import DriveFile from '../../models/drive-file';
import deleteFile from '../../services/drive/delete-file';
const logger = queueLogger.createSubLogger('delete-drive-files');
export async function deleteDriveFiles(job: bq.Job, done: any): Promise<void> {
logger.info(`Deleting drive files of ${job.data.user._id} ...`);
const user = await User.findOne({
_id: new mongo.ObjectID(job.data.user._id.toString())
});
let deletedCount = 0;
let ended = false;
let cursor: any = null;
while (!ended) {
const files = await DriveFile.find({
userId: user._id,
...(cursor ? { _id: { $gt: cursor } } : {})
}, {
limit: 100,
sort: {
_id: 1
}
});
if (files.length === 0) {
ended = true;
if (job.reportProgress) job.reportProgress(100);
break;
}
cursor = files[files.length - 1]._id;
for (const file of files) {
await deleteFile(file);
deletedCount++;
}
const total = await DriveFile.count({
userId: user._id,
});
if (job.reportProgress) job.reportProgress(deletedCount / total);
}
logger.succ(`All drive files (${deletedCount}) of ${user._id} has been deleted.`);
done();
}

View File

@ -0,0 +1,55 @@
import * as bq from 'bee-queue';
import * as mongo from 'mongodb';
import { queueLogger } from '../logger';
import Note from '../../models/note';
import deleteNote from '../../services/note/delete';
import User from '../../models/user';
const logger = queueLogger.createSubLogger('delete-notes');
export async function deleteNotes(job: bq.Job, done: any): Promise<void> {
logger.info(`Deleting notes of ${job.data.user._id} ...`);
const user = await User.findOne({
_id: new mongo.ObjectID(job.data.user._id.toString())
});
let deletedCount = 0;
let ended = false;
let cursor: any = null;
while (!ended) {
const notes = await Note.find({
userId: user._id,
...(cursor ? { _id: { $gt: cursor } } : {})
}, {
limit: 100,
sort: {
_id: 1
}
});
if (notes.length === 0) {
ended = true;
if (job.reportProgress) job.reportProgress(100);
break;
}
cursor = notes[notes.length - 1]._id;
for (const note of notes) {
await deleteNote(user, note, true);
deletedCount++;
}
const total = await Note.count({
userId: user._id,
});
if (job.reportProgress) job.reportProgress(deletedCount / total);
}
logger.succ(`All notes (${deletedCount}) of ${user._id} has been deleted.`);
done();
}

View File

@ -1,5 +1,7 @@
import deliver from './http/deliver';
import processInbox from './http/process-inbox';
import { deleteNotes } from './delete-notes';
import { deleteDriveFiles } from './delete-drive-files';
import { exportNotes } from './export-notes';
import { exportFollowing } from './export-following';
import { exportMute } from './export-mute';
@ -9,6 +11,8 @@ import { queueLogger } from '../logger';
const handlers: any = {
deliver,
processInbox,
deleteNotes,
deleteDriveFiles,
exportNotes,
exportFollowing,
exportMute,

View File

@ -0,0 +1,53 @@
import $ from 'cafy';
import * as bcrypt from 'bcryptjs';
import User from '../../../../models/user';
import define from '../../define';
import { createDeleteNotesJob, createDeleteDriveFilesJob } from '../../../../queue';
import Message from '../../../../models/messaging-message';
import Signin from '../../../../models/signin';
export const meta = {
requireCredential: true,
secure: true,
params: {
password: {
validator: $.str
},
}
};
export default define(meta, (ps, user) => new Promise(async (res, rej) => {
// Compare password
const same = await bcrypt.compare(ps.password, user.password);
if (!same) {
return rej('incorrect password');
}
await User.update({ _id: user._id }, {
$set: {
isDeleted: true,
token: null,
name: null,
description: null,
pinnedNoteIds: [],
password: null,
email: null,
twitter: null,
github: null,
discord: null,
profile: {},
fields: [],
clientSettings: {},
}
});
Message.remove({ userId: user._id });
Signin.remove({ userId: user._id });
createDeleteNotesJob(user);
createDeleteDriveFilesJob(user);
res();
}));

View File

@ -2,6 +2,7 @@ import $ from 'cafy';
import Note from '../../../../models/note';
import { packMany } from '../../../../models/note';
import define from '../../define';
import { getHideUserIds } from '../../common/get-hide-users';
export const meta = {
desc: {
@ -25,6 +26,8 @@ export const meta = {
export default define(meta, (ps, user) => new Promise(async (res, rej) => {
const day = 1000 * 60 * 60 * 24 * 2;
const hideUserIds = await getHideUserIds(user);
const notes = await Note
.find({
createdAt: {
@ -32,7 +35,8 @@ export default define(meta, (ps, user) => new Promise(async (res, rej) => {
},
deletedAt: null,
visibility: { $in: ['public', 'home'] },
'_user.host': null
'_user.host': null,
...(hideUserIds && hideUserIds.length > 0 ? { userId: { $nin: hideUserIds } } : {})
}, {
limit: ps.limit,
sort: {

View File

@ -119,6 +119,11 @@ export default define(meta, (ps, user) => new Promise(async (res, rej) => {
getHideUserIds(user)
]);
if (list == null) {
rej('list not found');
return;
}
if (list.userIds.length == 0) {
res([]);
return;

View File

@ -2,6 +2,7 @@ import $ from 'cafy';
import User, { pack } from '../../../models/user';
import define from '../define';
import { fallback } from '../../../prelude/symbol';
import { getHideUserIds } from '../common/get-hide-users';
const nonnull = { $ne: null as any };
@ -54,25 +55,25 @@ export const meta = {
};
const state: any = { // < https://github.com/Microsoft/TypeScript/issues/1863
'admin': { isAdmin: true },
'moderator': { isModerator: true },
'adminOrModerator': {
$or: [
{ isAdmin: true },
{ isModerator: true }
]
},
'verified': { isVerified: true },
'alive': {
updatedAt: { $gt: new Date(Date.now() - 1000 * 60 * 60 * 24 * 5) }
},
[fallback]: {}
'admin': { isAdmin: true },
'moderator': { isModerator: true },
'adminOrModerator': {
$or: [
{ isAdmin: true },
{ isModerator: true }
]
},
'verified': { isVerified: true },
'alive': {
updatedAt: { $gt: new Date(Date.now() - 1000 * 60 * 60 * 24 * 5) }
},
[fallback]: {}
};
const origin: any = { // < https://github.com/Microsoft/TypeScript/issues/1863
'local': { host: null },
'remote': { host: nonnull },
[fallback]: {}
'local': { host: null },
'remote': { host: nonnull },
[fallback]: {}
};
const sort: any = { // < https://github.com/Microsoft/TypeScript/issues/1863
@ -86,13 +87,16 @@ const sort: any = { // < https://github.com/Microsoft/TypeScript/issues/1863
};
export default define(meta, (ps, me) => new Promise(async (res, rej) => {
const hideUserIds = await getHideUserIds(me);
const users = await User
.find({
$and: [
state[ps.state] || state[fallback],
origin[ps.origin] || origin[fallback]
]
}, {
$and: [
state[ps.state] || state[fallback],
origin[ps.origin] || origin[fallback]
],
...(hideUserIds && hideUserIds.length > 0 ? { _id: { $nin: hideUserIds } } : {})
}, {
limit: ps.limit,
sort: sort[ps.sort] || sort[fallback],
skip: ps.offset

View File

@ -6,27 +6,37 @@ import parseAcct from '../misc/acct/parse';
import User from '../models/user';
import Acct from '../misc/acct/type';
import { links } from './nodeinfo';
import { escapeAttribute, escapeValue } from '../prelude/xml';
// Init router
const router = new Router();
const XRD = (...x: { element: string, value?: string, attributes?: Record<string, string> }[]) =>
`<?xml version="1.0" encoding="UTF-8"?><XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0">${x.map(({ element, value, attributes }) =>
`<${
Object.entries(typeof attributes === 'object' && attributes || {}).reduce((a, [k, v]) => `${a} ${k}="${escapeAttribute(v)}"`, element)
}${
typeof value === 'string' ? `>${escapeValue(value)}</${element}` : '/'
}>`).reduce((a, c) => a + c, '')}</XRD>`;
const webFingerPath = '/.well-known/webfinger';
const jrd = 'application/jrd+json';
const xrd = 'application/xrd+xml';
router.get('/.well-known/host-meta', async ctx => {
ctx.set('Content-Type', 'application/xrd+xml');
ctx.body = `<?xml version="1.0" encoding="UTF-8"?>
<XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0">
<Link rel="lrdd" type="application/xrd+xml" template="${config.url}${webFingerPath}?resource={uri}"/>
</XRD>
`;
ctx.set('Content-Type', xrd);
ctx.body = XRD({ element: 'Link', attributes: {
type: xrd,
template: `${config.url}${webFingerPath}?resource={uri}`
}});
});
router.get('/.well-known/host-meta.json', async ctx => {
ctx.set('Content-Type', 'application/jrd+json');
ctx.set('Content-Type', jrd);
ctx.body = {
links: [{
rel: 'lrdd',
type: 'application/xrd+xml',
type: jrd,
template: `${config.url}${webFingerPath}?resource={uri}`
}]
};
@ -75,22 +85,38 @@ router.get(webFingerPath, async ctx => {
return;
}
ctx.body = {
subject: `acct:${user.username}@${config.host}`,
links: [{
rel: 'self',
type: 'application/activity+json',
href: `${config.url}/users/${user._id}`
}, {
rel: 'http://webfinger.net/rel/profile-page',
type: 'text/html',
href: `${config.url}/@${user.username}`
}, {
rel: 'http://ostatus.org/schema/1.0/subscribe',
template: `${config.url}/authorize-follow?acct={uri}`
}]
const subject = `acct:${user.username}@${config.host}`;
const self = {
rel: 'self',
type: 'application/activity+json',
href: `${config.url}/users/${user._id}`
};
const profilePage = {
rel: 'http://webfinger.net/rel/profile-page',
type: 'text/html',
href: `${config.url}/@${user.username}`
};
const subscribe = {
rel: 'http://ostatus.org/schema/1.0/subscribe',
template: `${config.url}/authorize-follow?acct={uri}`
};
if (ctx.accepts(jrd, xrd) === xrd) {
ctx.body = XRD(
{ element: 'Subject', value: subject },
{ element: 'Link', attributes: self },
{ element: 'Link', attributes: profilePage },
{ element: 'Link', attributes: subscribe });
ctx.type = xrd;
} else {
ctx.body = {
subject,
links: [self, profilePage, subscribe]
};
ctx.type = jrd;
}
ctx.vary('Accept');
ctx.set('Cache-Control', 'public, max-age=180');
});

View File

@ -21,7 +21,7 @@ import instanceChart from '../../services/chart/instance';
* @param user 投稿者
* @param note 投稿
*/
export default async function(user: IUser, note: INote) {
export default async function(user: IUser, note: INote, quiet = false) {
const deletedAt = new Date();
await Note.update({
@ -52,10 +52,6 @@ export default async function(user: IUser, note: INote) {
});
}
publishNoteStream(note._id, 'deleted', {
deletedAt: deletedAt
});
// この投稿が関わる未読通知を削除
NoteUnread.find({
noteId: note._id
@ -76,34 +72,40 @@ export default async function(user: IUser, note: INote) {
}
}
//#region ローカルの投稿なら削除アクティビティを配送
if (isLocalUser(user)) {
const content = renderActivity(renderDelete(renderTombstone(`${config.url}/notes/${note._id}`), user));
const followings = await Following.find({
followeeId: user._id,
'_follower.host': { $ne: null }
if (!quiet) {
publishNoteStream(note._id, 'deleted', {
deletedAt: deletedAt
});
for (const following of followings) {
deliver(user, content, following._follower.inbox);
}
}
//#endregion
//#region ローカルの投稿なら削除アクティビティを配送
if (isLocalUser(user)) {
const content = renderActivity(renderDelete(renderTombstone(`${config.url}/notes/${note._id}`), user));
// 統計を更新
notesChart.update(note, false);
perUserNotesChart.update(user, note, false);
if (isRemoteUser(user)) {
registerOrFetchInstanceDoc(user.host).then(i => {
Instance.update({ _id: i._id }, {
$inc: {
notesCount: -1
}
const followings = await Following.find({
followeeId: user._id,
'_follower.host': { $ne: null }
});
instanceChart.updateNote(i.host, false);
});
for (const following of followings) {
deliver(user, content, following._follower.inbox);
}
}
//#endregion
// 統計を更新
notesChart.update(note, false);
perUserNotesChart.update(user, note, false);
if (isRemoteUser(user)) {
registerOrFetchInstanceDoc(user.host).then(i => {
Instance.update({ _id: i._id }, {
$inc: {
notesCount: -1
}
});
instanceChart.updateNote(i.host, false);
});
}
}
}