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

View File

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

View File

@ -144,6 +144,7 @@ common:
is-remote-post: "この投稿情報はコピーです。" is-remote-post: "この投稿情報はコピーです。"
view-on-remote: "正確な情報を見る" view-on-remote: "正確な情報を見る"
renoted-by: "{user}がRenote" renoted-by: "{user}がRenote"
no-notes: "投稿がありません"
error: error:
title: "問題が発生しました" title: "問題が発生しました"
retry: "Erneut versuchen" retry: "Erneut versuchen"
@ -537,6 +538,10 @@ common/views/components/profile-editor.vue:
mute-list: "ミュート" mute-list: "ミュート"
blocking-list: "ブロック" blocking-list: "ブロック"
export-requested: "エクスポートをリクエストしました。これには時間がかかる場合があります。エクスポートが終わると、ドライブにファイルが追加されます。" export-requested: "エクスポートをリクエストしました。これには時間がかかる場合があります。エクスポートが終わると、ドライブにファイルが追加されます。"
enter-password: "パスワードを入力してください"
danger-zone: "危険な設定"
delete-account: "アカウントを削除"
account-deleted: "アカウントが削除されました。データが消えるまで時間がかかる場合があります。"
common/views/components/user-list-editor.vue: common/views/components/user-list-editor.vue:
users: "ユーザー" users: "ユーザー"
rename: "リスト名を変更" rename: "リスト名を変更"
@ -785,8 +790,6 @@ desktop/views/components/renote-form.vue:
failure: "Weitersagen fehlgeschlagen" failure: "Weitersagen fehlgeschlagen"
desktop/views/components/renote-form-window.vue: desktop/views/components/renote-form-window.vue:
title: "Bist du dir sicher, dass du das reposten willst?" 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: desktop/views/pages/user-following-or-followers.vue:
following: "{user}のフォロー" following: "{user}のフォロー"
followers: "{user}のフォロワー" followers: "{user}のフォロワー"
@ -1353,6 +1356,7 @@ desktop/views/pages/user/user.header.vue:
following: "フォロー" following: "フォロー"
followers: "フォロワー" followers: "フォロワー"
is-bot: "このアカウントはBotです" is-bot: "このアカウントはBotです"
no-description: "自己紹介はありません"
years-old: "{age}歳" years-old: "{age}歳"
year: "年" year: "年"
month: "月" month: "月"
@ -1363,7 +1367,6 @@ desktop/views/pages/user/user.timeline.vue:
with-replies: "投稿と返信" with-replies: "投稿と返信"
with-media: "メディア" with-media: "メディア"
my-posts: "私の投稿" my-posts: "私の投稿"
empty: "このユーザーはまだ何も投稿していないようです。"
desktop/views/widgets/messaging.vue: desktop/views/widgets/messaging.vue:
title: "メッセージ" title: "メッセージ"
desktop/views/widgets/notifications.vue: desktop/views/widgets/notifications.vue:
@ -1461,8 +1464,6 @@ mobile/views/components/sub-note-content.vue:
deleted: "この投稿は削除されました" deleted: "この投稿は削除されました"
media-count: "{}つのメディア" media-count: "{}つのメディア"
poll: "アンケート" poll: "アンケート"
mobile/views/components/timeline.vue:
empty: "投稿がありません"
mobile/views/components/ui.header.vue: mobile/views/components/ui.header.vue:
welcome-back: "おかえりなさい、" welcome-back: "おかえりなさい、"
adjective: "さん" adjective: "さん"
@ -1479,9 +1480,6 @@ mobile/views/components/ui.nav.vue:
settings: "設定" settings: "設定"
admin: "管理" admin: "管理"
about: "Misskeyについて" about: "Misskeyについて"
mobile/views/components/user-timeline.vue:
no-notes: "このユーザーは投稿していないようです。"
no-notes-with-media: "メディア付き投稿はありません。"
mobile/views/pages/favorites.vue: mobile/views/pages/favorites.vue:
title: "Favoriten" title: "Favoriten"
mobile/views/pages/user-lists.vue: 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: "投稿がありません"
mobile/views/pages/tag.vue: mobile/views/pages/tag.vue:
no-posts-found: "ハッシュタグ「{q}」が付けられた投稿は見つかりませんでした。" no-posts-found: "ハッシュタグ「{q}」が付けられた投稿は見つかりませんでした。"
mobile/views/pages/welcome.vue: mobile/views/pages/welcome.vue:
@ -1594,8 +1590,6 @@ mobile/views/pages/user/home.vue:
frequently-replied-users: "よく話すユーザー" frequently-replied-users: "よく話すユーザー"
followers-you-know: "知り合いのフォロワー" followers-you-know: "知り合いのフォロワー"
last-used-at: "最終ログイン" last-used-at: "最終ログイン"
mobile/views/pages/user/home.notes.vue:
no-notes: "投稿はありません"
mobile/views/pages/user/home.photos.vue: mobile/views/pages/user/home.photos.vue:
no-photos: "写真はありません" no-photos: "写真はありません"
deck: deck:
@ -1623,7 +1617,6 @@ deck:
description: "サーバーの運営者により、このタイムラインは使用できない状態に設定されています。" description: "サーバーの運営者により、このタイムラインは使用できない状態に設定されています。"
deck/deck.tl-column.vue: deck/deck.tl-column.vue:
is-media-only: "メディア投稿のみ" is-media-only: "メディア投稿のみ"
is-media-view: "メディアビュー"
edit: "オプション" edit: "オプション"
deck/deck.user-column.vue: deck/deck.user-column.vue:
follows-you: "フォローされています" 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?" 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: intro:
title: "What is Misskey?" 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" features: "Features"
rich-contents: "Post" 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!" 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." is-remote-post: "These post contents are mirrored."
view-on-remote: "For completion, view it remotely." view-on-remote: "For completion, view it remotely."
renoted-by: "Renoted by {user}" renoted-by: "Renoted by {user}"
no-notes: "Without any notes"
error: error:
title: "Something happened :(" title: "Something happened :("
retry: "Retry" retry: "Retry"
@ -537,6 +538,10 @@ common/views/components/profile-editor.vue:
mute-list: "List of muted accounts" mute-list: "List of muted accounts"
blocking-list: "List of blocked 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." 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: common/views/components/user-list-editor.vue:
users: "User" users: "User"
rename: "Rename list" rename: "Rename list"
@ -785,8 +790,6 @@ desktop/views/components/renote-form.vue:
failure: "Failed to Repost" failure: "Failed to Repost"
desktop/views/components/renote-form-window.vue: desktop/views/components/renote-form-window.vue:
title: "Do you want to Repost it?" 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: desktop/views/pages/user-following-or-followers.vue:
following: "{user}'s following" following: "{user}'s following"
followers: "{user}'s follower" followers: "{user}'s follower"
@ -1353,6 +1356,7 @@ desktop/views/pages/user/user.header.vue:
following: "Following" following: "Following"
followers: "Followers" followers: "Followers"
is-bot: "This account is a Bot" is-bot: "This account is a Bot"
no-description: "The user has not written their profile introduction"
years-old: "{age} years old" years-old: "{age} years old"
year: "/" year: "/"
month: "/" month: "/"
@ -1363,7 +1367,6 @@ desktop/views/pages/user/user.timeline.vue:
with-replies: "Posts and replies" with-replies: "Posts and replies"
with-media: "Media" with-media: "Media"
my-posts: "My posts" my-posts: "My posts"
empty: "This user doesn't seem to have posted anything yet."
desktop/views/widgets/messaging.vue: desktop/views/widgets/messaging.vue:
title: "Message" title: "Message"
desktop/views/widgets/notifications.vue: desktop/views/widgets/notifications.vue:
@ -1461,8 +1464,6 @@ mobile/views/components/sub-note-content.vue:
deleted: "This post has been deleted" deleted: "This post has been deleted"
media-count: "{} media attached" media-count: "{} media attached"
poll: "Poll" poll: "Poll"
mobile/views/components/timeline.vue:
empty: "No notes"
mobile/views/components/ui.header.vue: mobile/views/components/ui.header.vue:
welcome-back: "Welcome back, " welcome-back: "Welcome back, "
adjective: "Sir" adjective: "Sir"
@ -1479,9 +1480,6 @@ mobile/views/components/ui.nav.vue:
settings: "Settings" settings: "Settings"
admin: "Admin" admin: "Admin"
about: "About Misskey" 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: mobile/views/pages/favorites.vue:
title: "Favorites" title: "Favorites"
mobile/views/pages/user-lists.vue: mobile/views/pages/user-lists.vue:
@ -1500,8 +1498,6 @@ mobile/views/pages/home.vue:
global: "Global" global: "Global"
mentions: "Mentions" mentions: "Mentions"
messages: "Messages" messages: "Messages"
mobile/views/pages/home.timeline.vue:
empty: "Without any notes"
mobile/views/pages/tag.vue: mobile/views/pages/tag.vue:
no-posts-found: "No posts contains \"{q}\" found." no-posts-found: "No posts contains \"{q}\" found."
mobile/views/pages/welcome.vue: mobile/views/pages/welcome.vue:
@ -1594,8 +1590,6 @@ mobile/views/pages/user/home.vue:
frequently-replied-users: "Frequent mentions" frequently-replied-users: "Frequent mentions"
followers-you-know: "Followers you know" followers-you-know: "Followers you know"
last-used-at: "Last active:" last-used-at: "Last active:"
mobile/views/pages/user/home.notes.vue:
no-notes: "No notes"
mobile/views/pages/user/home.photos.vue: mobile/views/pages/user/home.photos.vue:
no-photos: "No photos" no-photos: "No photos"
deck: deck:
@ -1623,7 +1617,6 @@ deck:
description: "This timeline has been disabled by the server administrator." description: "This timeline has been disabled by the server administrator."
deck/deck.tl-column.vue: deck/deck.tl-column.vue:
is-media-only: "Only media posts" is-media-only: "Only media posts"
is-media-view: "Media view"
edit: "Options" edit: "Options"
deck/deck.user-column.vue: deck/deck.user-column.vue:
follows-you: "Follows you" follows-you: "Follows you"

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -128,15 +128,16 @@ export default Vue.extend({
}, },
close() { close() {
this.$el.style.pointerEvents = 'none';
(this.$refs.bg as any).style.pointerEvents = 'none'; (this.$refs.bg as any).style.pointerEvents = 'none';
(this.$refs.main as any).style.pointerEvents = 'none';
anime({ anime({
targets: this.$refs.bg, targets: this.$refs.bg,
opacity: 0, opacity: 0,
duration: 300, duration: 300,
easing: 'linear' easing: 'linear'
}); });
(this.$refs.main as any).style.pointerEvents = 'none';
anime({ anime({
targets: this.$refs.main, targets: this.$refs.main,
opacity: 0, 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> <ui-button @click="doExport()"><fa :icon="faDownload"/> {{ $t('export') }}</ui-button>
</div> </div>
</section> </section>
<section>
<details>
<summary>{{ $t('danger-zone') }}</summary>
<ui-button @click="deleteAccount()">{{ $t('delete-account') }}</ui-button>
</details>
</section>
</ui-card> </ui-card>
</template> </template>
@ -283,6 +290,25 @@ export default Vue.extend({
type: 'info', type: 'info',
text: this.$t('export-requested') 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> </div>
</ui-container> </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> <template #header><fa :icon="faHashtag" fixed-width/>{{ $t('popular-tags') }}</template>
<div class="vxjfqztj"> <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> <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()"/> <mk-error v-if="!fetching && !inited" @retry="init()"/>
@ -209,6 +209,11 @@ export default Vue.extend({
> * > *
transition transform .3s ease, opacity .3s ease transition transform .3s ease, opacity .3s ease
> .empty
padding 16px
text-align center
color var(--text)
> .placeholder > .placeholder
padding 32px padding 32px
opacity 0.3 opacity 0.3

View File

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

View File

@ -1,5 +1,5 @@
<template> <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> </template>
<script lang="ts"> <script lang="ts">
@ -22,11 +22,6 @@ export default Vue.extend({
type: Boolean, type: Boolean,
required: false, required: false,
default: false default: false
},
mediaView: {
type: Boolean,
required: false,
default: false
} }
}, },

View File

@ -1,5 +1,5 @@
<template> <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> </template>
<script lang="ts"> <script lang="ts">
@ -22,11 +22,6 @@ export default Vue.extend({
type: Boolean, type: Boolean,
required: false, required: false,
default: false default: false
},
mediaView: {
type: Boolean,
required: false,
default: false
} }
}, },

View File

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

View File

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

View File

@ -6,7 +6,7 @@
</p> </p>
<p class="desc">{{ $t('disabled-timeline.description') }}</p> <p class="desc">{{ $t('disabled-timeline.description') }}</p>
</div> </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> </template>
<script lang="ts"> <script lang="ts">
@ -34,11 +34,6 @@ export default Vue.extend({
type: Boolean, type: Boolean,
required: false, required: false,
default: false default: false
},
mediaView: {
type: Boolean,
required: false,
default: false
} }
}, },
@ -73,16 +68,18 @@ export default Vue.extend({
watch: { watch: {
mediaOnly() { mediaOnly() {
this.fetch(); (this.$refs.timeline as any).reload();
} }
}, },
created() { created() {
this.makePromise = cursor => this.$root.api(this.endpoint, { this.makePromise = cursor => this.$root.api(this.endpoint, {
limit: fetchLimit + 1, limit: fetchLimit + 1,
untilDate: cursor ? undefined : (this.date ? this.date.getTime() : undefined),
untilId: cursor ? cursor : 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 => { }).then(notes => {
if (notes.length == fetchLimit + 1) { if (notes.length == fetchLimit + 1) {
notes.pop(); notes.pop();

View File

@ -61,7 +61,24 @@ export default Vue.extend({
return { return {
withFiles: false, withFiles: false,
images: [], 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, userId: this.user.id,
limit: fetchLimit + 1, limit: fetchLimit + 1,
untilId: cursor ? cursor : undefined, untilId: cursor ? cursor : undefined,
@ -82,15 +99,9 @@ export default Vue.extend({
cursor: null cursor: null
}; };
} }
}) });
};
}, },
created() {
this.fetch();
},
methods: {
fetch() { fetch() {
const image = [ const image = [
'image/jpeg', 'image/jpeg',

View File

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

View File

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

View File

@ -1,6 +1,5 @@
<template> <template>
<div class="lnctpgve"> <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-note-detail v-for="n in user.pinnedNotes" :key="n.id" :note="n" :compact="true"/>
<!--<mk-calendar @chosen="warp" :start="new Date(user.createdAt)"/>--> <!--<mk-calendar @chosen="warp" :start="new Date(user.createdAt)"/>-->
<div class="activity"> <div class="activity">
@ -17,11 +16,8 @@
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import i18n from '../../../../i18n'; import i18n from '../../../../i18n';
import parseAcct from '../../../../../../misc/acct/parse';
import Progress from '../../../../common/scripts/loading';
import XTimeline from './user.timeline.vue'; import XTimeline from './user.timeline.vue';
import XPhotos from './user.photos.vue'; import XPhotos from './user.photos.vue';
import XIntegrations from './user.integrations.vue';
import XActivity from '../../../../common/views/components/activity.vue'; import XActivity from '../../../../common/views/components/activity.vue';
export default Vue.extend({ export default Vue.extend({
@ -29,7 +25,6 @@ export default Vue.extend({
components: { components: {
XTimeline, XTimeline,
XPhotos, XPhotos,
XIntegrations,
XActivity XActivity
}, },
props: { 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> <span :data-active="mode == 'my-posts'" @click="mode = 'my-posts'"><fa icon="user"/> {{ $t('my-posts') }}</span>
</header> </header>
</template> </template>
<template #empty><fa :icon="['far', 'comments']"/>{{ $t('empty') }}</template>
</mk-notes> </mk-notes>
</div> </div>
</template> </template>

View File

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

View File

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

View File

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

View File

@ -1,11 +1,6 @@
<template> <template>
<div class="mk-user-timeline"> <div class="mk-user-timeline">
<mk-notes ref="timeline" :make-promise="makePromise" @inited="() => $emit('loaded')"> <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>
</div> </div>
</template> </template>

View File

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

View File

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

View File

@ -1,15 +1,13 @@
import * as os from 'os'; import * as os from 'os';
import * as sysUtils from 'systeminformation'; import * as sysUtils from 'systeminformation';
import Logger from "./logger"; import Logger from './logger';
export async function showMachineInfo(parentLogger: Logger) { export async function showMachineInfo(parentLogger: Logger) {
const logger = parentLogger.createSubLogger('machine'); const logger = parentLogger.createSubLogger('machine');
logger.debug(`Hostname: ${os.hostname()}`); logger.debug(`Hostname: ${os.hostname()}`);
logger.debug(`Platform: ${process.platform}`); logger.debug(`Platform: ${process.platform} Arch: ${process.arch}`);
logger.debug(`Architecture: ${process.arch}`);
logger.debug(`CPU: ${os.cpus().length} core`);
const mem = await sysUtils.mem(); const mem = await sysUtils.mem();
const totalmem = (mem.total / 1024 / 1024 / 1024).toFixed(1); const totalmem = (mem.total / 1024 / 1024 / 1024).toFixed(1);
const availmem = (mem.available / 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[]; emojis?: string[];
tags?: 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) { export function createExportNotesJob(user: ILocalUser) {
const data = { const data = {
type: 'exportNotes', 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 deliver from './http/deliver';
import processInbox from './http/process-inbox'; import processInbox from './http/process-inbox';
import { deleteNotes } from './delete-notes';
import { deleteDriveFiles } from './delete-drive-files';
import { exportNotes } from './export-notes'; import { exportNotes } from './export-notes';
import { exportFollowing } from './export-following'; import { exportFollowing } from './export-following';
import { exportMute } from './export-mute'; import { exportMute } from './export-mute';
@ -9,6 +11,8 @@ import { queueLogger } from '../logger';
const handlers: any = { const handlers: any = {
deliver, deliver,
processInbox, processInbox,
deleteNotes,
deleteDriveFiles,
exportNotes, exportNotes,
exportFollowing, exportFollowing,
exportMute, 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 Note from '../../../../models/note';
import { packMany } from '../../../../models/note'; import { packMany } from '../../../../models/note';
import define from '../../define'; import define from '../../define';
import { getHideUserIds } from '../../common/get-hide-users';
export const meta = { export const meta = {
desc: { desc: {
@ -25,6 +26,8 @@ export const meta = {
export default define(meta, (ps, user) => new Promise(async (res, rej) => { export default define(meta, (ps, user) => new Promise(async (res, rej) => {
const day = 1000 * 60 * 60 * 24 * 2; const day = 1000 * 60 * 60 * 24 * 2;
const hideUserIds = await getHideUserIds(user);
const notes = await Note const notes = await Note
.find({ .find({
createdAt: { createdAt: {
@ -32,7 +35,8 @@ export default define(meta, (ps, user) => new Promise(async (res, rej) => {
}, },
deletedAt: null, deletedAt: null,
visibility: { $in: ['public', 'home'] }, visibility: { $in: ['public', 'home'] },
'_user.host': null '_user.host': null,
...(hideUserIds && hideUserIds.length > 0 ? { userId: { $nin: hideUserIds } } : {})
}, { }, {
limit: ps.limit, limit: ps.limit,
sort: { sort: {

View File

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

View File

@ -2,6 +2,7 @@ import $ from 'cafy';
import User, { pack } from '../../../models/user'; import User, { pack } from '../../../models/user';
import define from '../define'; import define from '../define';
import { fallback } from '../../../prelude/symbol'; import { fallback } from '../../../prelude/symbol';
import { getHideUserIds } from '../common/get-hide-users';
const nonnull = { $ne: null as any }; const nonnull = { $ne: null as any };
@ -86,12 +87,15 @@ const sort: any = { // < https://github.com/Microsoft/TypeScript/issues/1863
}; };
export default define(meta, (ps, me) => new Promise(async (res, rej) => { export default define(meta, (ps, me) => new Promise(async (res, rej) => {
const hideUserIds = await getHideUserIds(me);
const users = await User const users = await User
.find({ .find({
$and: [ $and: [
state[ps.state] || state[fallback], state[ps.state] || state[fallback],
origin[ps.origin] || origin[fallback] origin[ps.origin] || origin[fallback]
] ],
...(hideUserIds && hideUserIds.length > 0 ? { _id: { $nin: hideUserIds } } : {})
}, { }, {
limit: ps.limit, limit: ps.limit,
sort: sort[ps.sort] || sort[fallback], sort: sort[ps.sort] || sort[fallback],

View File

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

View File

@ -21,7 +21,7 @@ import instanceChart from '../../services/chart/instance';
* @param user 投稿者 * @param user 投稿者
* @param note 投稿 * @param note 投稿
*/ */
export default async function(user: IUser, note: INote) { export default async function(user: IUser, note: INote, quiet = false) {
const deletedAt = new Date(); const deletedAt = new Date();
await Note.update({ await Note.update({
@ -52,10 +52,6 @@ export default async function(user: IUser, note: INote) {
}); });
} }
publishNoteStream(note._id, 'deleted', {
deletedAt: deletedAt
});
// この投稿が関わる未読通知を削除 // この投稿が関わる未読通知を削除
NoteUnread.find({ NoteUnread.find({
noteId: note._id noteId: note._id
@ -76,6 +72,11 @@ export default async function(user: IUser, note: INote) {
} }
} }
if (!quiet) {
publishNoteStream(note._id, 'deleted', {
deletedAt: deletedAt
});
//#region ローカルの投稿なら削除アクティビティを配送 //#region ローカルの投稿なら削除アクティビティを配送
if (isLocalUser(user)) { if (isLocalUser(user)) {
const content = renderActivity(renderDelete(renderTombstone(`${config.url}/notes/${note._id}`), user)); const content = renderActivity(renderDelete(renderTombstone(`${config.url}/notes/${note._id}`), user));
@ -107,3 +108,4 @@ export default async function(user: IUser, note: INote) {
}); });
} }
} }
}