diff options
| author | syuilo <syuilotan@yahoo.co.jp> | 2018-08-30 22:16:04 +0900 |
|---|---|---|
| committer | syuilo <syuilotan@yahoo.co.jp> | 2018-08-30 22:16:04 +0900 |
| commit | ae36bf301af4c8dffd0543e9cd45f8d4a0dbd18b (patch) | |
| tree | c9b10d65d71bdb97e2bbc263a2767f9f812ceb1e | |
| parent | Merge pull request #2502 from acid-chicken/patch-autogen (diff) | |
| parent | 8.16.0 (diff) | |
| download | sharkey-ae36bf301af4c8dffd0543e9cd45f8d4a0dbd18b.tar.gz sharkey-ae36bf301af4c8dffd0543e9cd45f8d4a0dbd18b.tar.bz2 sharkey-ae36bf301af4c8dffd0543e9cd45f8d4a0dbd18b.zip | |
Merge branch 'develop'
116 files changed, 1019 insertions, 690 deletions
diff --git a/locales/ca-ES.yml b/locales/ca-ES.yml index d54ffb3601..36177d6422 100644 --- a/locales/ca-ES.yml +++ b/locales/ca-ES.yml @@ -411,6 +411,7 @@ desktop: uploading-avatar: "新しいアバターをアップロードしています" avatar-updated: "アバターを更新しました" choose-avatar: "アバターにする画像を選択" + invalid-filetype: "この形式のファイルはサポートされていません" desktop/views/components/activity.chart.vue: total: "Black ... Total" notes: "Blue ... Notes" @@ -649,6 +650,7 @@ desktop/views/components/settings.vue: gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用" post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" + show-clock-on-header: "右上に時計を表示する" show-reply-target: "リプライ先を表示する" show-my-renotes: "自分の行ったRenoteをタイムラインに表示する" show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" @@ -819,8 +821,8 @@ desktop/views/pages/admin/admin.dashboard.vue: dashboard: "ダッシュボード" all-users: "全てのユーザー" original-users: "このインスタンスのユーザー" - all-notes: "全てのノート" - original-notes: "このインスタンスのノート" + all-notes: "全ての投稿" + original-notes: "このインスタンスの投稿" invite: "招待" desktop/views/pages/admin/admin.suspend-user.vue: suspend-user: "ユーザーの凍結" @@ -846,6 +848,11 @@ desktop/views/pages/deck/deck.note.vue: reposted-by: "{}がRenote" private: "この投稿は非公開です" deleted: "この投稿は削除されました" +desktop/views/pages/stats/stats.vue: + all-users: "全てのユーザー" + original-users: "このインスタンスのユーザー" + all-notes: "全ての投稿" + original-notes: "このインスタンスの投稿" desktop/views/pages/welcome.vue: about: "詳しく..." gotit: "わかった" @@ -1170,6 +1177,8 @@ mobile/views/pages/settings.vue: update-available-desc: "ページを再度読み込みすると更新が適用されます。" settings: "設定" signout: "サインアウト" + sound: "サウンド" + enableSounds: "サウンドを有効にする" mobile/views/pages/user.vue: follows-you: "フォローされています" following: "フォロー" diff --git a/locales/de-DE.yml b/locales/de-DE.yml index 0f88dc1617..6a700ab140 100644 --- a/locales/de-DE.yml +++ b/locales/de-DE.yml @@ -411,6 +411,7 @@ desktop: uploading-avatar: "新しいアバターをアップロードしています" avatar-updated: "アバターを更新しました" choose-avatar: "アバターにする画像を選択" + invalid-filetype: "この形式のファイルはサポートされていません" desktop/views/components/activity.chart.vue: total: "Schwarz ... komplett" notes: "Blau ... Hinweise" @@ -649,6 +650,7 @@ desktop/views/components/settings.vue: gradient-window-header: "Übergang in Fensterköpfen" post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" + show-clock-on-header: "右上に時計を表示する" show-reply-target: "Zeige Antworten" show-my-renotes: "Zeige meine Reposts auf der Zeitleiste" show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" @@ -819,8 +821,8 @@ desktop/views/pages/admin/admin.dashboard.vue: dashboard: "ダッシュボード" all-users: "全てのユーザー" original-users: "このインスタンスのユーザー" - all-notes: "全てのノート" - original-notes: "このインスタンスのノート" + all-notes: "全ての投稿" + original-notes: "このインスタンスの投稿" invite: "招待" desktop/views/pages/admin/admin.suspend-user.vue: suspend-user: "ユーザーの凍結" @@ -846,6 +848,11 @@ desktop/views/pages/deck/deck.note.vue: reposted-by: "{}がRenote" private: "この投稿は非公開です" deleted: "この投稿は削除されました" +desktop/views/pages/stats/stats.vue: + all-users: "全てのユーザー" + original-users: "このインスタンスのユーザー" + all-notes: "全ての投稿" + original-notes: "このインスタンスの投稿" desktop/views/pages/welcome.vue: about: "詳しく..." gotit: "わかった" @@ -1170,6 +1177,8 @@ mobile/views/pages/settings.vue: update-available-desc: "ページを再度読み込みすると更新が適用されます。" settings: "設定" signout: "サインアウト" + sound: "サウンド" + enableSounds: "サウンドを有効にする" mobile/views/pages/user.vue: follows-you: "フォローされています" following: "フォロー" diff --git a/locales/en-US.yml b/locales/en-US.yml index bc2dbc86f6..4c0122f38b 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -411,6 +411,7 @@ desktop: uploading-avatar: "Uploading a new avatar" avatar-updated: "Successfully updated the avatar" choose-avatar: "Select an image for the avatar" + invalid-filetype: "This filetype is not acceptable here" desktop/views/components/activity.chart.vue: total: "Black ... Total" notes: "Blue ... Notes" @@ -649,6 +650,7 @@ desktop/views/components/settings.vue: gradient-window-header: "Use gradients on window headers" post-form-on-timeline: "Display post form at the top of the timeline" suggest-recent-hashtags: "Show recent popular hashtags on the post form" + show-clock-on-header: "Show clock on upper-right" show-reply-target: "Display reply target" show-my-renotes: "Show my renotes in the timeline" show-renoted-my-notes: "Show renoted my posts in timelines" @@ -819,7 +821,7 @@ desktop/views/pages/admin/admin.dashboard.vue: dashboard: "Dashboard" all-users: "All Users" original-users: "Users on this instance" - all-notes: "All Posts" + all-notes: "All the posts" original-notes: "Posts on this instance" invite: "Invite" desktop/views/pages/admin/admin.suspend-user.vue: @@ -846,6 +848,11 @@ desktop/views/pages/deck/deck.note.vue: reposted-by: "Reposted by {}" private: "This post is private" deleted: "This post has been deleted" +desktop/views/pages/stats/stats.vue: + all-users: "All Users" + original-users: "Users on this instance" + all-notes: "All the posts" + original-notes: "Posts on this instance" desktop/views/pages/welcome.vue: about: "More details..." gotit: "Got it!" @@ -1066,7 +1073,7 @@ mobile/views/pages/favorites.vue: title: "Favorites" mobile/views/pages/user-lists.vue: title: "Lists" - enter-list-name: "Enter list name" + enter-list-name: "Enter a name of the list to make" mobile/views/pages/drive.vue: drive: "Drive" more: "Load more" @@ -1170,6 +1177,8 @@ mobile/views/pages/settings.vue: update-available-desc: "Updates will be applied after reloading the page" settings: "Settings" signout: "Sign out" + sound: "Sounds" + enableSounds: "Enable sounds" mobile/views/pages/user.vue: follows-you: "Follows you" following: "Following" diff --git a/locales/es-ES.yml b/locales/es-ES.yml index 1dd2ed9d9f..05c5510133 100644 --- a/locales/es-ES.yml +++ b/locales/es-ES.yml @@ -411,6 +411,7 @@ desktop: uploading-avatar: "Cargando un nuevo avatar" avatar-updated: "Avatar actualizado" choose-avatar: "Escoge una imagen de avatar" + invalid-filetype: "この形式のファイルはサポートされていません" desktop/views/components/activity.chart.vue: total: "Negro ... Total" notes: "Azul ... Notas" @@ -649,6 +650,7 @@ desktop/views/components/settings.vue: gradient-window-header: "Usar degradados en las cabeceras de las páginas" post-form-on-timeline: "Mostrar el formulario de las entradas encima de la línea de tiempo" suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" + show-clock-on-header: "右上に時計を表示する" show-reply-target: "リプライ先を表示する" show-my-renotes: "自分の行ったRenoteをタイムラインに表示する" show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" @@ -819,8 +821,8 @@ desktop/views/pages/admin/admin.dashboard.vue: dashboard: "ダッシュボード" all-users: "全てのユーザー" original-users: "このインスタンスのユーザー" - all-notes: "全てのノート" - original-notes: "このインスタンスのノート" + all-notes: "全ての投稿" + original-notes: "このインスタンスの投稿" invite: "招待" desktop/views/pages/admin/admin.suspend-user.vue: suspend-user: "ユーザーの凍結" @@ -846,6 +848,11 @@ desktop/views/pages/deck/deck.note.vue: reposted-by: "{}がRenote" private: "この投稿は非公開です" deleted: "この投稿は削除されました" +desktop/views/pages/stats/stats.vue: + all-users: "全てのユーザー" + original-users: "このインスタンスのユーザー" + all-notes: "全ての投稿" + original-notes: "このインスタンスの投稿" desktop/views/pages/welcome.vue: about: "詳しく..." gotit: "わかった" @@ -1170,6 +1177,8 @@ mobile/views/pages/settings.vue: update-available-desc: "ページを再度読み込みすると更新が適用されます。" settings: "設定" signout: "サインアウト" + sound: "サウンド" + enableSounds: "サウンドを有効にする" mobile/views/pages/user.vue: follows-you: "フォローされています" following: "フォロー" diff --git a/locales/fr-FR.yml b/locales/fr-FR.yml index 21864cb71d..f936c2579b 100644 --- a/locales/fr-FR.yml +++ b/locales/fr-FR.yml @@ -411,6 +411,7 @@ desktop: uploading-avatar: "Téléversement du nouvel avatar" avatar-updated: "L'avatar est mis à jour" choose-avatar: "Choisir un avatar" + invalid-filetype: "この形式のファイルはサポートされていません" desktop/views/components/activity.chart.vue: total: "Noirs ... Total" notes: "Bleu ... Notes" @@ -425,12 +426,12 @@ desktop/views/components/calendar.vue: next: "Mois prochain" go: "Cliquez pour naviguer" desktop/views/components/charts.vue: - title: "チャート" - per-day: "1日ごと" - per-hour: "1時間ごと" - notes: "投稿" - users: "ユーザー" - drive: "ドライブ" + title: "Graphiques" + per-day: "par jour" + per-hour: "par heure" + notes: "Publications" + users: "Utilisateurs" + drive: "Drive" charts: notes: "投稿の増減 (統合)" local-notes: "投稿の増減 (ローカル)" @@ -649,6 +650,7 @@ desktop/views/components/settings.vue: gradient-window-header: "Utiliser les dégradés sur la barre de titre de la fenêtre" post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" suggest-recent-hashtags: "Afficher les hashtags populaires dans le champs de saisie" + show-clock-on-header: "Afficher l'horloge à droite sur le coté supérieur" show-reply-target: "Afficher les réponses" show-my-renotes: "Afficher mes republications dans le fil" show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" @@ -817,8 +819,8 @@ desktop/views/pages/admin/admin.vue: update: "Mises à jour" desktop/views/pages/admin/admin.dashboard.vue: dashboard: "Tableau de bord" - all-users: "Tou·te·s les utilisateur·rice·s" - original-users: "Utilisateur·rice·s sur cette instance" + all-users: "Toutes les utilisateurrices" + original-users: "Utilisateurrices sur cette instance" all-notes: "Toutes les publications" original-notes: "Publication sur cette instance" invite: "Invitation" @@ -837,7 +839,7 @@ desktop/views/pages/admin/admin.verify-user.vue: desktop/views/pages/admin/admin.unverify-user.vue: unverify-user: "ユーザーの公式アカウント解除" unverify: "Ôter la vérification du compte" - unverified: "公式アカウントを解除しました" + unverified: "Ce compte n'est pas vérifié" desktop/views/pages/deck/deck.tl-column.vue: is-media-only: "Les publications médias uniquement" is-media-view: "Vue média" @@ -846,6 +848,11 @@ desktop/views/pages/deck/deck.note.vue: reposted-by: "Reposté par {}" private: "cette publication est privée" deleted: "cette publication a été supprimée" +desktop/views/pages/stats/stats.vue: + all-users: "Toutes les utilisateurrices" + original-users: "Utilisateurrices sur cette instance" + all-notes: "Toutes les publications" + original-notes: "Publication sur cette instance" desktop/views/pages/welcome.vue: about: "à propos" gotit: "J'ai compris !" @@ -1052,7 +1059,7 @@ mobile/views/components/ui.nav.vue: game: "Jeux" darkmode: "Mode nuit" settings: "Réglages" - admin: "管理" + admin: "Admin" about: "À propose de Misskey" mobile/views/components/user-timeline.vue: no-notes: "Cette utilisateur semble n'avoir rien poster pour le moment" @@ -1170,6 +1177,8 @@ mobile/views/pages/settings.vue: update-available-desc: "Les mises à jour seront appliquées une fois la page est rechargée." settings: "Réglages" signout: "Déconnexion" + sound: "Sons" + enableSounds: "Activer le son" mobile/views/pages/user.vue: follows-you: "vous suit" following: "Abonnements" diff --git a/locales/it-IT.yml b/locales/it-IT.yml index d54ffb3601..36177d6422 100644 --- a/locales/it-IT.yml +++ b/locales/it-IT.yml @@ -411,6 +411,7 @@ desktop: uploading-avatar: "新しいアバターをアップロードしています" avatar-updated: "アバターを更新しました" choose-avatar: "アバターにする画像を選択" + invalid-filetype: "この形式のファイルはサポートされていません" desktop/views/components/activity.chart.vue: total: "Black ... Total" notes: "Blue ... Notes" @@ -649,6 +650,7 @@ desktop/views/components/settings.vue: gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用" post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" + show-clock-on-header: "右上に時計を表示する" show-reply-target: "リプライ先を表示する" show-my-renotes: "自分の行ったRenoteをタイムラインに表示する" show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" @@ -819,8 +821,8 @@ desktop/views/pages/admin/admin.dashboard.vue: dashboard: "ダッシュボード" all-users: "全てのユーザー" original-users: "このインスタンスのユーザー" - all-notes: "全てのノート" - original-notes: "このインスタンスのノート" + all-notes: "全ての投稿" + original-notes: "このインスタンスの投稿" invite: "招待" desktop/views/pages/admin/admin.suspend-user.vue: suspend-user: "ユーザーの凍結" @@ -846,6 +848,11 @@ desktop/views/pages/deck/deck.note.vue: reposted-by: "{}がRenote" private: "この投稿は非公開です" deleted: "この投稿は削除されました" +desktop/views/pages/stats/stats.vue: + all-users: "全てのユーザー" + original-users: "このインスタンスのユーザー" + all-notes: "全ての投稿" + original-notes: "このインスタンスの投稿" desktop/views/pages/welcome.vue: about: "詳しく..." gotit: "わかった" @@ -1170,6 +1177,8 @@ mobile/views/pages/settings.vue: update-available-desc: "ページを再度読み込みすると更新が適用されます。" settings: "設定" signout: "サインアウト" + sound: "サウンド" + enableSounds: "サウンドを有効にする" mobile/views/pages/user.vue: follows-you: "フォローされています" following: "フォロー" diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 55f08d1fcf..6ebd167803 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -94,6 +94,8 @@ common: verified-user: "公式アカウント" disable-animated-mfm: "投稿内の動きのあるテキストを無効にする" + do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。' + reversi: drawn: "引き分け" my-turn: "あなたのターンです" @@ -456,6 +458,7 @@ desktop: uploading-avatar: "新しいアバターをアップロードしています" avatar-updated: "アバターを更新しました" choose-avatar: "アバターにする画像を選択" + invalid-filetype: "この形式のファイルはサポートされていません" desktop/views/components/activity.chart.vue: total: "Black ... Total" @@ -1368,6 +1371,8 @@ mobile/views/pages/settings.vue: update-available-desc: "ページを再度読み込みすると更新が適用されます。" settings: "設定" signout: "サインアウト" + sound: "サウンド" + enableSounds: "サウンドを有効にする" mobile/views/pages/user.vue: follows-you: "フォローされています" diff --git a/locales/ja-KS.yml b/locales/ja-KS.yml index 8c1f26d56e..ddb2f3b788 100644 --- a/locales/ja-KS.yml +++ b/locales/ja-KS.yml @@ -207,9 +207,9 @@ common/views/components/games/reversi/reversi.room.vue: ready: "準備完了" cancel-ready: "準備続行" common/views/components/connect-failed.vue: - title: "サーバーに接続できません" - description: "インターネット回線に問題があるか、サーバーがダウンまたはメンテナンスしている可能性があります。しばらくしてから{再度お試し}ください。" - thanks: "いつもMisskeyをご利用いただきありがとうございます。" + title: "サーバーに接続でけへんわ" + description: "インターネット回線に問題が起きとるか、サーバーがダウンまたはメンテナンスしとるっぽいわ。知らんけど。とりあえずあとで{再試行}してや。" + thanks: "いつもMisskeyをつこてくれてほんまありがとな。" troubleshoot: "トラブルシュート" common/views/components/connect-failed.troubleshooter.vue: title: "トラブルシューティング" @@ -219,99 +219,99 @@ common/views/components/connect-failed.troubleshooter.vue: checking-internet: "インターネット接続を確認中" server: "サーバー接続" checking-server: "サーバー接続を確認中" - finding: "問題を調べています" - no-network: "ネットワークに接続されていません" - no-network-desc: "お使いのPCのネットワーク接続が正常か確認してください。" - no-internet: "インターネットに接続されていません" - no-internet-desc: "ネットワークには接続されていますが、インターネットには接続されていないようです。お使いのPCのインターネット接続が正常か確認してください。" - no-server: "Misskeyのサーバーに接続できません" - no-server-desc: "お使いのPCのインターネット接続は正常ですが、Misskeyのサーバーには接続できませんでした。サーバーがダウンまたはメンテナンスしている可能性があるので、しばらくしてから再度御アクセスください。" - success: "Misskeyのサーバーに接続できました" - success-desc: "正常に接続できるようです。ページを再度読み込みしてください。" + finding: "問題を調べとるで" + no-network: "ネットワークに接続されとらんで" + no-network-desc: "つこてるPCのネットワーク接続が正常か確認してや。" + no-internet: "インターネットに接続されとらんで" + no-internet-desc: "ネットワークには接続されとるけど、インターネットには接続されとらんようやわ。つこてるPCのインターネット接続が正常か確認してや。" + no-server: "Misskeyのサーバーに接続でけへんわ" + no-server-desc: "つこてるPCのインターネット接続は正常やけど、Misskeyのサーバーにはつながらんわ。多分サーバーがダウンまたはメンテナンスしとるわ、知らんけど。すまんけどしばらくしてから再度アクセスしてみてや。" + success: "Misskeyのサーバーに接続できたわ" + success-desc: "正常に接続できるようやわ。ページを再度読み込みしてな。" flush: "キャッシュの削除" set-version: "バージョン指定" common/views/components/messaging.vue: search-user: "ユーザーを探す" - you: "あなた" - no-history: "履歴はありません" + you: "あんさん" + no-history: "履歴はあらへんで" common/views/components/messaging-room.vue: - empty: "このユーザーと話したことはありません" + empty: "このユーザーと話したことはあらへんで" more: "もっと読む" - no-history: "これより過去の履歴はありません" + no-history: "これより過去の履歴はあらへんで" resize-form: "ドラッグしてフォームの広さを調整" - new-message: "新しいメッセージがあります" - only-one-file-attached: "メッセージに添付できるのはひとつのファイルのみです" + new-message: "新しいメッセージがあるで" + only-one-file-attached: "メッセージに添付できんのはひとつのファイルのみやで" common/views/components/messaging-room.form.vue: - input-message-here: "ここにメッセージを入力" + input-message-here: "ここにメッセージ書いてや" send: "送信" attach-from-local: "PCからファイルを添付する" attach-from-drive: "ドライブからファイルを添付する" - only-one-file-attached: "メッセージに添付できるのはひとつのファイルのみです" + only-one-file-attached: "メッセージに添付できんのはひとつのファイルのみやで" common/views/components/messaging-room.message.vue: is-read: "既読" - deleted: "このメッセージは削除されました" + deleted: "このメッセージは削除されたわ" common/views/components/nav.vue: about: "Misskeyについて" stats: "統計" status: "ステータス" wiki: "Wiki" - donors: "ドナー" + donors: "支援者" repository: "リポジトリ" develop: "開発者" feedback: "フィードバック" common/views/components/note-menu.vue: favorite: "お気に入り" pin: "ピン留め" - delete: "削除" - delete-confirm: "この投稿を削除しますか?" + delete: "ほかす" + delete-confirm: "この投稿を削除してもええか?" remote: "投稿元で見る" common/views/components/poll.vue: - vote-to: "「{}」に投票する" + vote-to: "「{}」に投票や!" vote-count: "{}票" total-users: "{}人が投票" - vote: "投票する" - show-result: "結果を見る" - voted: "投票済み" + vote: "投票するで" + show-result: "結果を見よか" + voted: "投票済みや" common/views/components/poll-editor.vue: - no-only-one-choice: "アンケートには、選択肢が最低2つ必要です" + no-only-one-choice: "選択肢が最低2つ必要やで" choice-n: "選択肢{}" - remove: "この選択肢を削除" + remove: "この選択肢を消すで" add: "+選択肢を追加" - destroy: "アンケートを破棄" + destroy: "アンケートをほかそ" common/views/components/reaction-picker.vue: choose-reaction: "リアクションを選択" common/views/components/signin.vue: username: "ユーザー名" password: "パスワード" token: "トークン" - signing-in: "やってます..." + signing-in: "サインイン中や..." signin: "サインイン" or: "または" - signin-with-twitter: "Twitterでログイン" - login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。" + signin-with-twitter: "Twitterでサインイン" + login-failed: "なんかログインできんかったわ。ユーザー名とパスワードとかを確認してや。" common/views/components/signup.vue: invitation-code: "招待コード" invitation-info: "招待コードをお持ちでない方は、<a href=\"{}\">管理者</a>までご連絡ください。" username: "ユーザー名" - checking: "確認しています..." - available: "利用できます" - unavailable: "既に利用されています" + checking: "確認中や…" + available: "使えるで" + unavailable: "もう使われとるで" error: "通信エラー" - invalid-format: "a~z、A~Z、0~9、_が使えます" + invalid-format: "a~z、A~Z、0~9、_が使えるで" too-short: "1文字以上でお願いします!" too-long: "20文字以内でお願いします" password: "パスワード" password-placeholder: "8文字以上を推奨します" - weak-password: "弱いパスワード" - normal-password: "まあまあのパスワード" - strong-password: "強いパスワード" - retype: "再入力" - retype-placeholder: "確認のため再入力してください" - password-matched: "確認されました" - password-not-matched: "一致していません" + weak-password: "へぼいパスワード" + normal-password: "ぼちぼちなパスワード" + strong-password: "良さげなパスワード" + retype: "もっかい入力頼むで" + retype-placeholder: "確認のためもっぺん入力してや" + password-matched: "一致しとるで" + password-not-matched: "一致しとらんで" recaptcha: "認証" create: "アカウント作成" - some-error: "何らかの原因によりアカウントの作成に失敗しました。再度お試しください。" + some-error: "何かよう分からんけど、アカウントの作成に失敗してしもたわ。すまんがもっぺん試してくれへんか?" common/views/components/special-message.vue: new-year: "Happy New Year!" christmas: "Merry Christmas!" @@ -320,8 +320,8 @@ common/views/components/stream-indicator.vue: reconnecting: "再接続中" connected: "接続完了" common/views/components/twitter-setting.vue: - description: "お使いのTwitterアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでTwitterアカウント情報が表示されるようになったり、Twitterを用いた便利なサインインを利用できるようになります。" - connected-to: "次のTwitterアカウントに接続されています" + description: "あんさんがつことるTwitterアカウントをMisskeyアカウントに接続しとくと、あんさんのプロフィールにTwitterアカウント情報が表示されるようになったり、Twitterをつこた便利なサインインが使えるようになったりすんで。" + connected-to: "次のTwitterアカウントに接続されとるで" detail: "詳細..." reconnect: "再接続する" connect: "Twitterと接続する" @@ -339,7 +339,7 @@ common/views/components/visibility-chooser.vue: private: "非公開" common/views/widgets/broadcast.vue: fetching: "確認中" - no-broadcasts: "お知らせはありません" + no-broadcasts: "お知らせはあらへんで" have-a-nice-day: "良い一日を!" next: "次" common/views/widgets/calendar.vue: @@ -351,17 +351,17 @@ common/views/widgets/calendar.vue: this-year: "今年:" common/views/widgets/donation.vue: title: "寄付のお願い" - text: "Misskeyの運営にはドメイン、サーバー等のコストが掛かります。Misskeyは広告を掲載したりしないため、収入を皆様からの寄付に頼っています。もしご興味があれば、{}までご連絡ください。ご協力ありがとうございます。" + text: "Misskeyの運営にはドメイン、サーバー等のコストが掛かるんや。Misskeyは広告を掲載したりせんから、収入を皆様からの寄付に頼ってますねん。もし興味があるなら、{}までご連絡よろしゅう頼んます。ご協力おおきに。" common/views/widgets/photo-stream.vue: title: "フォトストリーム" - no-photos: "写真はありません" + no-photos: "写真はあらへんで" common/views/widgets/posts-monitor.vue: title: "投稿チャート" toggle: "表示を切り替え" common/views/widgets/hashtags.vue: title: "ハッシュタグ" count: "{}人が投稿" - empty: "トレンドなし" + empty: "流行は自分で作るんや" common/views/widgets/server.vue: title: "サーバー情報" toggle: "表示を切り替え" @@ -370,30 +370,30 @@ common/views/widgets/memo.vue: memo: "ここに書いて!" save: "保存" common/views/widgets/slideshow.vue: - folder-customize-mode: "フォルダを指定するには、カスタマイズモードを終了してください" + folder-customize-mode: "フォルダを指定するんやったら、一旦カスタマイズモードを終了してや" folder: "クリックしてフォルダを指定してください" no-image: "このフォルダには画像がありません" common/views/widgets/tips.vue: - tips-line1: "<kbd>t</kbd>でタイムラインにフォーカスできます" - tips-line2: "<kbd>p</kbd>または<kbd>n</kbd>で投稿フォームを開きます" - tips-line3: "投稿フォームにはファイルをドラッグ&ドロップできます" - tips-line4: "投稿フォームにクリップボードにある画像データをペーストできます" - tips-line5: "ドライブにファイルをドラッグ&ドロップしてアップロードできます" - tips-line6: "ドライブでファイルをドラッグしてフォルダ移動できます" - tips-line7: "ドライブでフォルダをドラッグしてフォルダ移動できます" - tips-line8: "ホームは設定からカスタマイズできます" - tips-line9: "MisskeyはAGPLv3です" - tips-line10: "タイムマシンウィジェットを利用すると、簡単に過去のタイムラインに遡れます" - tips-line11: "投稿の ... をクリックして、投稿をユーザーページにピン留めできます" - tips-line13: "投稿に添付したファイルは全てドライブに保存されます" - tips-line14: "ホームのカスタマイズ中、ウィジェットを右クリックしてデザインを変更できます" - tips-line17: "「**」でテキストを囲むと**強調表示**されます" - tips-line19: "いくつかのウィンドウはブラウザの外に切り離すことができます" - tips-line20: "カレンダーウィジェットのパーセンテージは、経過の割合を示しています" - tips-line21: "APIを利用してbotの開発なども行えます" + tips-line1: "<kbd>t</kbd>でタイムラインにフォーカスできんで" + tips-line2: "<kbd>p</kbd>または<kbd>n</kbd>で投稿フォームを開くで" + tips-line3: "投稿フォームにはファイルをドラッグ&ドロップできんで" + tips-line4: "投稿フォームにクリップボードにおる画像データをペーストできんで" + tips-line5: "ドライブにファイルをドラッグ&ドロップしてアップロードできんで" + tips-line6: "ドライブやと、ファイルをドラッグしてフォルダ移動できんで" + tips-line7: "ドライブやと、フォルダをドラッグしてフォルダ移動できんで" + tips-line8: "ホームは設定からカスタマイズできんで" + tips-line9: "MisskeyはAGPLv3やで" + tips-line10: "タイムマシンウィジェットを利用すると、簡単に過去のタイムラインに遡れんで" + tips-line11: "投稿の ... をクリックして、ピン留めから投稿をユーザーページにピン留めできんで" + tips-line13: "投稿に添付したファイルは全てドライブに保存されんで" + tips-line14: "ホームのカスタマイズ中、ウィジェットを右クリックしてデザインを変更できんで" + tips-line17: "「**」でテキストを囲ったると**強調表示**されんで" + tips-line19: "いくつかのウィンドウはブラウザの外に切り離すことができんで" + tips-line20: "カレンダーウィジェットのパーセンテージは、経過の割合を示してんねん" + tips-line21: "APIをつこてbotの開発なども行えるで" tips-line23: "まゆかわいいよまゆ" - tips-line24: "Misskeyは2014年にサービスを開始しました" - tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます" + tips-line24: "Misskeyは2014年にサービスを開始したんよ" + tips-line25: "対応ブラウザやったらMisskeyを開いとらんでも通知を受け取れんで" common/views/pages/follow.vue: signed-in-as: "{}としてサインイン中" following: "フォロー中" @@ -403,14 +403,15 @@ common/views/pages/follow.vue: desktop: banner-crop-title: "バナーとして表示する部分を選択" banner: "バナー" - uploading-banner: "新しいバナーをアップロードしています" - banner-updated: "バナーを更新しました" + uploading-banner: "新しいバナーをアップロードしとるで" + banner-updated: "バナーを更新したで" choose-banner: "バナーにする画像を選択" avatar-crop-title: "アバターとして表示する部分を選択" avatar: "アバター" uploading-avatar: "新しいアバターをアップロードしています" avatar-updated: "アバターを更新しました" choose-avatar: "アバターにする画像を選択" + invalid-filetype: "この形式のファイルはサポートされていません" desktop/views/components/activity.chart.vue: total: "Black ... Total" notes: "Blue ... Notes" @@ -420,10 +421,10 @@ desktop/views/components/activity.vue: title: "アクティビティ" toggle: "表示を切り替え" desktop/views/components/calendar.vue: - title: "{1}年 {2}月" + title: "{1}年 {2} 月" prev: "前の月" next: "次の月" - go: "クリックして時間遡行" + go: "クリックしてタイムリープ" desktop/views/components/charts.vue: title: "チャート" per-day: "1日ごと" @@ -464,7 +465,7 @@ desktop/views/components/drive.file.vue: banner: "バナー" nsfw: "閲覧注意" contextmenu: - rename: "名前を変更" + rename: "名前を変えるで" mark-as-sensitive: "閲覧注意に設定" unmark-as-sensitive: "閲覧注意を解除" copy-url: "URLをコピー" @@ -475,26 +476,26 @@ desktop/views/components/drive.file.vue: open-in-app: "アプリで開く" add-app: "アプリを追加" rename-file: "ファイル名の変更" - input-new-file-name: "新しいファイル名を入力してください" - copied: "コピー完了" + input-new-file-name: "新しいファイル名を入力してや" + copied: "コピー完了や" copied-url-to-clipboard: "URLをクリップボードにコピーしました" desktop/views/components/drive.folder.vue: unable-to-process: "操作を完了できません" circular-reference-detected: "移動先のフォルダーは、移動するフォルダーのサブフォルダーです。" - unhandled-error: "不明なエラー" + unhandled-error: "ようわからん" contextmenu: move-to-this-folder: "このフォルダへ移動" show-in-new-window: "新しいウィンドウで表示" - rename: "名前を変更" - rename-folder: "フォルダ名の変更" - input-new-folder-name: "新しいフォルダ名を入力してください" + rename: "名前を変えるで" + rename-folder: "フォルダ名を変えるで" + input-new-folder-name: "新しいフォルダ名を入力してや" desktop/views/components/drive.nav-folder.vue: drive: "ドライブ" desktop/views/components/drive.vue: search: "検索" load-more: "もっと読み込む" empty-draghover: "ドロップですか?いいですよ、ボクはカワイイですからね" - empty-drive: "ドライブには何もありません。" + empty-drive: "ドライブには何もあらへんで。" empty-drive-description: "右クリックして「ファイルをアップロード」を選んだり、ファイルをドラッグ&ドロップすることでもアップロードできます。" empty-folder: "このフォルダーは空です" unable-to-process: "操作を完了できません" @@ -511,11 +512,11 @@ desktop/views/components/drive.vue: upload: "ファイルをアップロード" url-upload: "URLからアップロード" desktop/views/components/media-image.vue: - sensitive: "閲覧注意" - click-to-show: "クリックして表示" + sensitive: "ちょっと見せられへんわ" + click-to-show: "クリックして見せるで" desktop/views/components/media-video.vue: - sensitive: "閲覧注意" - click-to-show: "クリックして表示" + sensitive: "ちょっと見せられへんわ" + click-to-show: "クリックして見せるで" desktop/views/components/follow-button.vue: following: "フォロー中" follow: "フォロー" @@ -536,7 +537,7 @@ desktop/views/components/friends-maker.vue: refresh: "もっと見る" close: "閉じる" desktop/views/components/game-window.vue: - game: "リバーシ" + game: "ゲーム" desktop/views/components/home.vue: done: "完了" add-widget: "ウィジェットを追加:" @@ -575,32 +576,32 @@ desktop/views/components/notifications.vue: empty: "ありません!" desktop/views/components/post-form.vue: add-visible-user: "+ユーザーを追加" - attach-location-information: "位置情報を添付する" + attach-location-information: "いる場所くっつけるで" hide-contents: "内容を隠す" reply-placeholder: "この投稿への返信..." quote-placeholder: "この投稿を引用..." submit: "投稿" reply: "返信" renote: "Renote" - posted: "投稿しました!" - replied: "返信しました!" + posted: "投稿したで!" + replied: "返信したで!" reposted: "Renoteしました!" - note-failed: "投稿に失敗しました" - reply-failed: "返信に失敗しました" + note-failed: "投稿に失敗したで" + reply-failed: "返信に失敗したで" renote-failed: "Renoteに失敗しました" posting: "投稿中" attach-media-from-local: "PCからメディアを添付" attach-media-from-drive: "ドライブからメディアを添付" - attach-cancel: "添付取り消し" + attach-cancel: "くっつけるのやめよか" insert-a-kao: "v('ω')v" create-poll: "アンケートを作成" text-remain: "残り{}文字" - recent-tags: "最近" + recent-tags: "最近のタグ" click-to-tagging: "クリックでタグ付け" visibility: "公開範囲" - geolocation-alert: "お使いの端末は位置情報に対応していません" + geolocation-alert: "あんさんのつことる端末は位置情報に対応しとらんみたいやわ、知らんけど。" error: "エラー" - enter-username: "ユーザー名を入力してください" + enter-username: "ユーザー名を入力してや" annotations: "内容への注釈 (オプション)" desktop/views/components/post-form-window.vue: note: "新規投稿" @@ -639,7 +640,7 @@ desktop/views/components/settings.vue: auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。" advanced: "詳細設定" api-via-stream: "ストリームを経由したAPIリクエスト" - api-via-stream-desc: "この設定をオンにすると、websocket接続を経由してAPIリクエストが行われます(パフォーマンス向上が期待できます)。オフにすると、ネイティブの fetch APIが利用されます。この設定はこのデバイスのみ有効です。" + api-via-stream-desc: "この設定をオンにすると、WebSocket接続を経由してAPIリクエストが行われんで(パフォーマンス向上するかも、知らんけど)。オフにすると、ネイティブの fetch API が利用されるで。この設定はこのデバイスのみ有効やで。" display: "デザインと表示" customize: "ホームをカスタマイズ" choose-wallpaper: "壁紙を選択" @@ -649,6 +650,7 @@ desktop/views/components/settings.vue: gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用" post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" + show-clock-on-header: "右上に時計を表示する" show-reply-target: "リプライ先を表示する" show-my-renotes: "自分の行ったRenoteをタイムラインに表示する" show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" @@ -686,9 +688,9 @@ desktop/views/components/settings.vue: prevent-update: "アップデートを延期する(非推奨)" prevent-update-desc: "この設定をオンにしてもアップデートが反映される場合があります。この設定はこのデバイスのみ有効です。" no-updates: "利用可能な更新はありません" - no-updates-desc: "お使いのMisskeyは最新です。" - update-available: "新しいバージョンが利用可能です" - update-available-desc: "ページを再度読み込みすると更新が適用されます。" + no-updates-desc: "つこてるMisskeyは最新や!" + update-available: "新しいバージョンが利用可能や" + update-available-desc: "ページを再度読み込みすると更新が適用されるで。" advanced-settings: "高度な設定" debug-mode: "デバッグモードを有効にする" debug-mode-desc: "この設定はブラウザに記憶されます。" @@ -707,28 +709,28 @@ desktop/views/components/settings.2fa.vue: unregister: "設定を解除" unregistered: "二段階認証が無効になりました。" enter-password: "パスワードを入力してください" - authenticator: "まず、Google Authenticatorをお使いのデバイスにインストールします:" - howtoinstall: "インストール方法はこちら" - scan: "次に、表示されているQRコードをスキャンします:" - done: "お使いのデバイスに表示されているトークンを入力して完了します:" - submit: "完了" - success: "設定が完了しました!" - failed: "設定に失敗しました。トークンに誤りがないかご確認ください。" - info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。" + authenticator: "まず、Google Authenticatorとかのをつこてるデバイスにインストールしてや:" + howtoinstall: "インストール方法はここやで" + scan: "んで、ここに出とるQRコードをスキャンしてな:" + done: "最後にデバイスに表示されとるトークンを入力してな:" + submit: "送信" + success: "設定が完了したで!" + failed: "なんか設定に失敗したで。トークンを間違えとらんか確認してや。" + info: "次のサインインからは、パスワードに加えてデバイスに出とるトークンを入力してな。" desktop/views/components/settings.api.vue: - intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。" - caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。" - regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。" + intro: "APIを利用するには、上記のトークンを「i」っちゅうキーでパラメータに付加してリクエストしてや。" + caution: "アカウントを不正利用されるかも知れんから、このトークンは第三者に教えたらあかんで(アプリなどにも入力しんといてな)。" + regeneration-of-token: "万が一このトークンが漏れたとかその可能性があったらトークンを再生成できるで。" regenerate-token: "トークンを再生成" - token: "Token:" - enter-password: "パスワードを入力してください" + token: "トークン:" + enter-password: "パスワードを入力してや" desktop/views/components/settings.apps.vue: - no-apps: "連携しているアプリケーションはありません" + no-apps: "連携しているアプリケーションはあらへんで" desktop/views/components/settings.drive.vue: max: "中" in-use: "使用中" desktop/views/components/settings.mute.vue: - no-users: "ミュートしているユーザーはいません" + no-users: "ミュートしているユーザーはおらんで" desktop/views/components/settings.password.vue: reset: "パスワードを変更する" enter-current-password: "現在のパスワードを入力してください" @@ -764,7 +766,7 @@ desktop/views/components/timeline.vue: global: "グローバル" list: "リスト" desktop/views/components/ui.header.vue: - welcome-back: "おかえりなさい、" + welcome-back: "おかえり、" adjective: "さん" desktop/views/components/ui.header.account.vue: profile: "プロフィール" @@ -772,7 +774,7 @@ desktop/views/components/ui.header.account.vue: favorites: "お気に入り" lists: "リスト" follow-requests: "フォロー申請" - customize: "ホームのカスタマイズ" + customize: "ホームをカスタマイズ" admin: "管理" settings: "設定" signout: "サインアウト" @@ -794,7 +796,7 @@ desktop/views/components/received-follow-requests-window.vue: reject: "拒否" desktop/views/components/user-lists-window.vue: title: "リスト" - create-list: "リストを作成" + create-list: "新しいリストを作成" list-name: "リスト名" desktop/views/components/user-preview.vue: notes: "投稿" @@ -819,8 +821,8 @@ desktop/views/pages/admin/admin.dashboard.vue: dashboard: "ダッシュボード" all-users: "全てのユーザー" original-users: "このインスタンスのユーザー" - all-notes: "全てのノート" - original-notes: "このインスタンスのノート" + all-notes: "全ての投稿" + original-notes: "このインスタンスの投稿" invite: "招待" desktop/views/pages/admin/admin.suspend-user.vue: suspend-user: "ユーザーの凍結" @@ -829,11 +831,11 @@ desktop/views/pages/admin/admin.suspend-user.vue: desktop/views/pages/admin/admin.unsuspend-user.vue: unsuspend-user: "ユーザーの凍結の解除" unsuspend: "凍結の解除" - unsuspended: "凍結を解除しました" + unsuspended: "凍結を解除したで" desktop/views/pages/admin/admin.verify-user.vue: verify-user: "ユーザーの公式アカウント設定" verify: "公式アカウントにする" - verified: "公式アカウントにしました" + verified: "公式アカウントにしたで" desktop/views/pages/admin/admin.unverify-user.vue: unverify-user: "ユーザーの公式アカウント解除" unverify: "公式アカウントを解除する" @@ -846,21 +848,26 @@ desktop/views/pages/deck/deck.note.vue: reposted-by: "{}がRenote" private: "この投稿は非公開です" deleted: "この投稿は削除されました" +desktop/views/pages/stats/stats.vue: + all-users: "全てのユーザー" + original-users: "このインスタンスのユーザー" + all-notes: "全ての投稿" + original-notes: "このインスタンスの投稿" desktop/views/pages/welcome.vue: about: "詳しく..." gotit: "わかった" - signin: "ログイン" - signup: "新規登録" - signin-button: "やってる" - signup-button: "やる" + signin: "サインイン" + signup: "サインアップ" + signin-button: "サインイン中…" + signup-button: "サインアップ" timeline: "タイムライン" powered-by-misskey: "Powered by <b>Misskey</b>." desktop/views/pages/drive.vue: - title: "Misskey Drive" + title: "ドライブ" desktop/views/pages/favorites.vue: - more: "さらに読み込む" + more: "もっと読み込んでくで" desktop/views/pages/home-customize.vue: - title: "ホームのカスタマイズ" + title: "ホームをカスタマイズ" desktop/views/pages/note.vue: prev: "前の投稿" next: "次の投稿" @@ -895,19 +902,19 @@ desktop/views/pages/user/user.vue: desktop/views/pages/user/user.home.vue: last-used-at: "最終アクセス" desktop/views/pages/user/user.photos.vue: - title: "フォト" + title: "写真" loading: "読み込み中" - no-photos: "写真はありません" + no-photos: "写真はあらへんで" desktop/views/pages/user/user.profile.vue: - follows-you: "フォローされています" + follows-you: "フォローされとるで" stalk: "ストークする" - stalking: "ストーキングしています" + stalking: "ストーキングしとるで" unstalk: "ストーク解除" mute: "ミュートする" - muted: "ミュートしています" + muted: "ミュートしとるで" unmute: "ミュート解除" push-to-a-list: "リストに追加" - list-pushed: "{user}を{list}に追加しました。" + list-pushed: "{user}を{list}に追加したで。" desktop/views/pages/user/user.header.vue: posts: "投稿" following: "フォロー" @@ -926,7 +933,7 @@ desktop/views/widgets/notifications.vue: desktop/views/widgets/polls.vue: title: "アンケート" refresh: "他を見る" - nothing: "ありません!" + nothing: "あらへん!" desktop/views/widgets/post-form.vue: title: "投稿" note: "投稿" @@ -948,7 +955,7 @@ mobile/views/components/drive.vue: count-separator: "、" file-count: "ファイル" load-more: "もっと読み込む" - nothing-in-drive: "ドライブには何もありません" + nothing-in-drive: "ドライブには何もあらへんで。" folder-is-empty: "このフォルダは空です" prompt: "何をしますか?(数字を入力してください): <1 → ファイルをアップロード | 2 → ファイルをURLでアップロード | 3 → フォルダ作成 | 4 → このフォルダ名を変更 | 5 → このフォルダを移動 | 6 → このフォルダを削除>" deletion-alert: "ごめんなさい!フォルダの削除は未実装です...。" @@ -1025,9 +1032,9 @@ mobile/views/components/post-form.vue: quote-placeholder: "この投稿を引用... (オプション)" reply-placeholder: "この投稿への返信..." cw-placeholder: "内容への注釈 (オプション)" - location-alert: "お使いの端末は位置情報に対応していません" + location-alert: "あんさんのつことる端末は位置情報に対応しとらんみたいやわ、知らんけど。" error: "エラー" - username-prompt: "ユーザー名を入力してください" + username-prompt: "ユーザー名を入力してや" mobile/views/components/sub-note-content.vue: private: "この投稿は非公開です" deleted: "この投稿は削除されました" @@ -1066,7 +1073,7 @@ mobile/views/pages/favorites.vue: title: "お気に入り" mobile/views/pages/user-lists.vue: title: "リスト" - enter-list-name: "リスト名を入力してください" + enter-list-name: "リスト名を入力してや" mobile/views/pages/drive.vue: drive: "ドライブ" more: "もっと見る" @@ -1082,7 +1089,7 @@ mobile/views/pages/home.vue: hybrid: "ソーシャル" global: "グローバル" mobile/views/pages/tag.vue: - no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。" + no-posts-found: "ハッシュタグ「{}」が付けられた投稿はあらへんで。" mobile/views/pages/welcome.vue: signup: "新規登録" mobile/views/pages/widgets.vue: @@ -1149,7 +1156,7 @@ mobile/views/pages/settings.vue: show-local-renotes: "ローカルの投稿のRenoteを表示する" post-style: "投稿の表示スタイル" post-style-standard: "標準" - post-style-smart: "スマート" + post-style-smart: "べっぴんさん" behavior: "動作" fetch-on-scroll: "スクロールで自動読み込み" disable-via-mobile: "「モバイルからの投稿」フラグを付けない" @@ -1170,6 +1177,8 @@ mobile/views/pages/settings.vue: update-available-desc: "ページを再度読み込みすると更新が適用されます。" settings: "設定" signout: "サインアウト" + sound: "サウンド" + enableSounds: "サウンドを有効にする" mobile/views/pages/user.vue: follows-you: "フォローされています" following: "フォロー" diff --git a/locales/ko-KR.yml b/locales/ko-KR.yml index 37e5ab4c6f..a4d91c5ef0 100644 --- a/locales/ko-KR.yml +++ b/locales/ko-KR.yml @@ -411,6 +411,7 @@ desktop: uploading-avatar: "新しいアバターをアップロードしています" avatar-updated: "アバターを更新しました" choose-avatar: "アバターにする画像を選択" + invalid-filetype: "この形式のファイルはサポートされていません" desktop/views/components/activity.chart.vue: total: "Black ... Total" notes: "Blue ... Notes" @@ -649,6 +650,7 @@ desktop/views/components/settings.vue: gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用" post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" + show-clock-on-header: "右上に時計を表示する" show-reply-target: "リプライ先を表示する" show-my-renotes: "自分の行ったRenoteをタイムラインに表示する" show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" @@ -819,8 +821,8 @@ desktop/views/pages/admin/admin.dashboard.vue: dashboard: "ダッシュボード" all-users: "全てのユーザー" original-users: "このインスタンスのユーザー" - all-notes: "全てのノート" - original-notes: "このインスタンスのノート" + all-notes: "全ての投稿" + original-notes: "このインスタンスの投稿" invite: "招待" desktop/views/pages/admin/admin.suspend-user.vue: suspend-user: "ユーザーの凍結" @@ -846,6 +848,11 @@ desktop/views/pages/deck/deck.note.vue: reposted-by: "{}がRenote" private: "この投稿は非公開です" deleted: "この投稿は削除されました" +desktop/views/pages/stats/stats.vue: + all-users: "全てのユーザー" + original-users: "このインスタンスのユーザー" + all-notes: "全ての投稿" + original-notes: "このインスタンスの投稿" desktop/views/pages/welcome.vue: about: "詳しく..." gotit: "わかった" @@ -1170,6 +1177,8 @@ mobile/views/pages/settings.vue: update-available-desc: "ページを再度読み込みすると更新が適用されます。" settings: "設定" signout: "サインアウト" + sound: "サウンド" + enableSounds: "サウンドを有効にする" mobile/views/pages/user.vue: follows-you: "フォローされています" following: "フォロー" diff --git a/locales/pl-PL.yml b/locales/pl-PL.yml index f94034ada4..49257e13e6 100644 --- a/locales/pl-PL.yml +++ b/locales/pl-PL.yml @@ -411,6 +411,7 @@ desktop: uploading-avatar: "Wysyłanie awatara" avatar-updated: "Wysłano awatar" choose-avatar: "Wybierz awatar" + invalid-filetype: "この形式のファイルはサポートされていません" desktop/views/components/activity.chart.vue: total: "Czarny … Łącznie" notes: "Niebieski … Wpisy" @@ -649,6 +650,7 @@ desktop/views/components/settings.vue: gradient-window-header: "Używaj gradientów na pasku tytułu okna" post-form-on-timeline: "Wyświetlaj formularz tworzenia wpisu w górnej części osi czasu" suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" + show-clock-on-header: "右上に時計を表示する" show-reply-target: "Pokazuj cel odpowiedzi" show-my-renotes: "Pokazuj moje udostępnienia na osi czasu" show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" @@ -819,8 +821,8 @@ desktop/views/pages/admin/admin.dashboard.vue: dashboard: "ダッシュボード" all-users: "全てのユーザー" original-users: "このインスタンスのユーザー" - all-notes: "全てのノート" - original-notes: "このインスタンスのノート" + all-notes: "全ての投稿" + original-notes: "このインスタンスの投稿" invite: "招待" desktop/views/pages/admin/admin.suspend-user.vue: suspend-user: "ユーザーの凍結" @@ -846,6 +848,11 @@ desktop/views/pages/deck/deck.note.vue: reposted-by: "Udostępniono przez {}" private: "ten wpis jest prywatny" deleted: "ten wpis został usunięty" +desktop/views/pages/stats/stats.vue: + all-users: "全てのユーザー" + original-users: "このインスタンスのユーザー" + all-notes: "全ての投稿" + original-notes: "このインスタンスの投稿" desktop/views/pages/welcome.vue: about: "O Misskey" gotit: "Rozumiem!" @@ -1170,6 +1177,8 @@ mobile/views/pages/settings.vue: update-available-desc: "Odśwież stronę, aby zastosować aktualizację." settings: "Ustawienia" signout: "Wyloguj" + sound: "サウンド" + enableSounds: "サウンドを有効にする" mobile/views/pages/user.vue: follows-you: "Śledzi Cię" following: "Śledzeni" diff --git a/locales/pt-PT.yml b/locales/pt-PT.yml index b6e9dd960d..8ab51f21d1 100644 --- a/locales/pt-PT.yml +++ b/locales/pt-PT.yml @@ -58,7 +58,7 @@ common: friday: "sexta" saturday: "sábado" reactions: - like: "いいね" + like: "Curtir" love: "Amei" laugh: "Riso" hmm: "Hmm...?" @@ -81,7 +81,7 @@ common: ok: "OK" update-available-title: "Atualização disponível" update-available: "Uma nova versão de Misskey está disponível ({newer}). A versão atual é {current}. Recarregue a página para atualizar." - my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。" + my-token-regenerated: "Seu token foi recriado, portanto você foi deslogado." i-like-sushi: "Eu prefiro sushi a pudim" show-reversi-board-labels: "Mostrar etiquetas de colunas e linhas no Reversi" use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける" @@ -97,7 +97,7 @@ common: black: "Pretas" white: "Brancas" total: "Total" - this-turn: "{}ターン目" + this-turn: "Turno de {}" widgets: analog-clock: "Relógio analógico" profile: "Perfil" @@ -106,16 +106,16 @@ common: activity: "Atividade" rss: "Leitor de RSS" memo: "Nota adesiva" - trends: "トレンド" + trends: "Tendências" photo-stream: "フォトストリーム" - posts-monitor: "投稿チャート" + posts-monitor: "Gráfico de publicações" slideshow: "スライドショー" version: "Versão" broadcast: "ブロードキャスト" notifications: "Notificações" users: "Usuário sugeridos" polls: "Enquetes" - post-form: "投稿フォーム" + post-form: "Formulário de publicação" messaging: "Mensagens" server: "Informações do servidor" donation: "Doações" @@ -135,10 +135,10 @@ common: swap-up: "Mover para cima" swap-down: "Mover para baixo" remove: "Remover" - add-column: "カラムを追加" + add-column: "Adicionar coluna" rename: "Renomear" stack-left: "左に重ねる" - pop-right: "右に出す" + pop-right: "Acoplar à direita" auth/views/form.vue: share-access: "Você <b>permite</b> que <i>{{ app.name }}</i> acesse sua conta?" permission-ask: "Este aplicativo precisa das seguintes permissões:" @@ -151,18 +151,18 @@ auth/views/form.vue: drive-write: "ドライブを操作する。" notification-read: "通知を見る。" notification-write: "通知を操作する。" - cancel: "キャンセル" - accept: "アクセスを許可" + cancel: "Cancelar" + accept: "Permitir acesso" auth/views/index.vue: - loading: "読み込み中" + loading: "Carregando" denied: "アプリケーションの連携をキャンセルしました。" denied-paragraph: "このアプリがあなたのアカウントにアクセスすることはありません。" - already-authorized: "このアプリは既に連携済みです" - allowed: "アプリケーションの連携を許可しました" - callback-url: "アプリケーションに戻っています" - please-go-back: "アプリケーションに戻って、やっていってください。" - error: "セッションが存在しません。" - sign-in: "サインインしてください" + already-authorized: "Este aplicativo já foi autorizado" + allowed: "Aplicativos com acesso autorizado" + callback-url: "Voltando ao aplicativo" + please-go-back: "Por favor, volte ao aplicativo." + error: "A sessão não existe." + sign-in: "Por favor, entre." common/views/components/games/reversi/reversi.vue: matching: waiting-for: "{}を待っています" @@ -176,17 +176,17 @@ common/views/components/games/reversi/reversi.game.vue: common/views/components/games/reversi/reversi.index.vue: title: "Misskey Reversi" sub-title: "他のMisskeyユーザーとリバーシで対戦しよう" - invite: "招待" - rule: "遊び方" + invite: "Convidar" + rule: "Como jogar" rule-desc: "リバーシは、相手と交互に石をボードに置いて、相手の石を挟んで自分の色に変えてゆき、最終的に残った石が多い方が勝ちというボードゲームです。" - mode-invite: "招待" - mode-invite-desc: "指定したユーザーと対戦するモードです。" - invitations: "対局の招待があります!" - my-games: "自分の対局" - all-games: "みんなの対局" - enter-username: "ユーザー名を入力してください" + mode-invite: "Convidar" + mode-invite-desc: "Convidar um usuário para jogar" + invitations: "Você foi convidado!" + my-games: "Meu jogo" + all-games: "Todos os jogos" + enter-username: "Digite o nome de usuário." game-state: - ended: "終了" + ended: "Terminado" playing: "進行中" common/views/components/games/reversi/reversi.room.vue: settings-of-the-game: "ゲームの設定" @@ -228,11 +228,11 @@ common/views/components/connect-failed.troubleshooter.vue: no-server-desc: "お使いのPCのインターネット接続は正常ですが、Misskeyのサーバーには接続できませんでした。サーバーがダウンまたはメンテナンスしている可能性があるので、しばらくしてから再度御アクセスください。" success: "Misskeyのサーバーに接続できました" success-desc: "正常に接続できるようです。ページを再度読み込みしてください。" - flush: "キャッシュの削除" + flush: "Limpar o cache" set-version: "バージョン指定" common/views/components/messaging.vue: search-user: "ユーザーを探す" - you: "あなた" + you: "Você" no-history: "履歴はありません" common/views/components/messaging-room.vue: empty: "このユーザーと話したことはありません" @@ -411,6 +411,7 @@ desktop: uploading-avatar: "新しいアバターをアップロードしています" avatar-updated: "アバターを更新しました" choose-avatar: "アバターにする画像を選択" + invalid-filetype: "この形式のファイルはサポートされていません" desktop/views/components/activity.chart.vue: total: "Black ... Total" notes: "Blue ... Notes" @@ -649,6 +650,7 @@ desktop/views/components/settings.vue: gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用" post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" + show-clock-on-header: "右上に時計を表示する" show-reply-target: "リプライ先を表示する" show-my-renotes: "自分の行ったRenoteをタイムラインに表示する" show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" @@ -819,8 +821,8 @@ desktop/views/pages/admin/admin.dashboard.vue: dashboard: "ダッシュボード" all-users: "Todos os usuários" original-users: "このインスタンスのユーザー" - all-notes: "Todas as notas" - original-notes: "このインスタンスのノート" + all-notes: "全ての投稿" + original-notes: "このインスタンスの投稿" invite: "招待" desktop/views/pages/admin/admin.suspend-user.vue: suspend-user: "ユーザーの凍結" @@ -846,6 +848,11 @@ desktop/views/pages/deck/deck.note.vue: reposted-by: "{}がRenote" private: "この投稿は非公開です" deleted: "この投稿は削除されました" +desktop/views/pages/stats/stats.vue: + all-users: "全てのユーザー" + original-users: "このインスタンスのユーザー" + all-notes: "全ての投稿" + original-notes: "このインスタンスの投稿" desktop/views/pages/welcome.vue: about: "詳しく..." gotit: "わかった" @@ -1170,6 +1177,8 @@ mobile/views/pages/settings.vue: update-available-desc: "ページを再度読み込みすると更新が適用されます。" settings: "設定" signout: "サインアウト" + sound: "サウンド" + enableSounds: "サウンドを有効にする" mobile/views/pages/user.vue: follows-you: "フォローされています" following: "フォロー" diff --git a/locales/ru-RU.yml b/locales/ru-RU.yml index 312f7e2a48..8520ef23c1 100644 --- a/locales/ru-RU.yml +++ b/locales/ru-RU.yml @@ -411,6 +411,7 @@ desktop: uploading-avatar: "新しいアバターをアップロードしています" avatar-updated: "アバターを更新しました" choose-avatar: "アバターにする画像を選択" + invalid-filetype: "この形式のファイルはサポートされていません" desktop/views/components/activity.chart.vue: total: "Black ... Total" notes: "Blue ... Notes" @@ -649,6 +650,7 @@ desktop/views/components/settings.vue: gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用" post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" + show-clock-on-header: "右上に時計を表示する" show-reply-target: "リプライ先を表示する" show-my-renotes: "自分の行ったRenoteをタイムラインに表示する" show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" @@ -819,8 +821,8 @@ desktop/views/pages/admin/admin.dashboard.vue: dashboard: "ダッシュボード" all-users: "全てのユーザー" original-users: "このインスタンスのユーザー" - all-notes: "全てのノート" - original-notes: "このインスタンスのノート" + all-notes: "全ての投稿" + original-notes: "このインスタンスの投稿" invite: "招待" desktop/views/pages/admin/admin.suspend-user.vue: suspend-user: "ユーザーの凍結" @@ -846,6 +848,11 @@ desktop/views/pages/deck/deck.note.vue: reposted-by: "{}がRenote" private: "この投稿は非公開です" deleted: "この投稿は削除されました" +desktop/views/pages/stats/stats.vue: + all-users: "全てのユーザー" + original-users: "このインスタンスのユーザー" + all-notes: "全ての投稿" + original-notes: "このインスタンスの投稿" desktop/views/pages/welcome.vue: about: "詳しく..." gotit: "わかった" @@ -1170,6 +1177,8 @@ mobile/views/pages/settings.vue: update-available-desc: "ページを再度読み込みすると更新が適用されます。" settings: "設定" signout: "サインアウト" + sound: "サウンド" + enableSounds: "サウンドを有効にする" mobile/views/pages/user.vue: follows-you: "フォローされています" following: "フォロー" diff --git a/locales/zh-CN.yml b/locales/zh-CN.yml index c41868624d..c297140adc 100644 --- a/locales/zh-CN.yml +++ b/locales/zh-CN.yml @@ -411,6 +411,7 @@ desktop: uploading-avatar: "新しいアバターをアップロードしています" avatar-updated: "アバターを更新しました" choose-avatar: "アバターにする画像を選択" + invalid-filetype: "この形式のファイルはサポートされていません" desktop/views/components/activity.chart.vue: total: "Black ... Total" notes: "Blue ... Notes" @@ -649,6 +650,7 @@ desktop/views/components/settings.vue: gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用" post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" + show-clock-on-header: "右上に時計を表示する" show-reply-target: "リプライ先を表示する" show-my-renotes: "自分の行ったRenoteをタイムラインに表示する" show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" @@ -819,8 +821,8 @@ desktop/views/pages/admin/admin.dashboard.vue: dashboard: "ダッシュボード" all-users: "全てのユーザー" original-users: "このインスタンスのユーザー" - all-notes: "全てのノート" - original-notes: "このインスタンスのノート" + all-notes: "全ての投稿" + original-notes: "このインスタンスの投稿" invite: "招待" desktop/views/pages/admin/admin.suspend-user.vue: suspend-user: "ユーザーの凍結" @@ -846,6 +848,11 @@ desktop/views/pages/deck/deck.note.vue: reposted-by: "{}がRenote" private: "この投稿は非公開です" deleted: "この投稿は削除されました" +desktop/views/pages/stats/stats.vue: + all-users: "全てのユーザー" + original-users: "このインスタンスのユーザー" + all-notes: "全ての投稿" + original-notes: "このインスタンスの投稿" desktop/views/pages/welcome.vue: about: "詳しく..." gotit: "わかった" @@ -1170,6 +1177,8 @@ mobile/views/pages/settings.vue: update-available-desc: "ページを再度読み込みすると更新が適用されます。" settings: "設定" signout: "サインアウト" + sound: "サウンド" + enableSounds: "サウンドを有効にする" mobile/views/pages/user.vue: follows-you: "フォローされています" following: "フォロー" diff --git a/package.json b/package.json index c84f01fc51..76ed2ac949 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.15.0", - "clientVersion": "1.0.9031", + "version": "8.16.0", + "clientVersion": "1.0.9191", "codename": "nighthike", "main": "./built/index.js", "private": true, @@ -32,7 +32,7 @@ "@types/debug": "0.0.30", "@types/deep-equal": "1.0.1", "@types/double-ended-queue": "2.1.0", - "@types/elasticsearch": "5.0.25", + "@types/elasticsearch": "5.0.26", "@types/file-type": "5.2.1", "@types/gulp": "3.8.36", "@types/gulp-htmlmin": "1.3.32", @@ -60,7 +60,7 @@ "@types/mocha": "5.2.3", "@types/mongodb": "3.1.4", "@types/ms": "0.7.30", - "@types/node": "10.9.2", + "@types/node": "10.9.3", "@types/portscanner": "2.1.0", "@types/pug": "2.0.4", "@types/qrcode": "1.2.0", @@ -76,10 +76,10 @@ "@types/speakeasy": "2.0.2", "@types/systeminformation": "3.23.0", "@types/tmp": "0.0.33", - "@types/uuid": "3.4.3", + "@types/uuid": "3.4.4", "@types/webpack": "4.4.11", "@types/webpack-stream": "3.2.10", - "@types/websocket": "0.0.39", + "@types/websocket": "0.0.40", "@types/ws": "6.0.0", "animejs": "2.2.0", "autosize": "4.0.2", @@ -158,7 +158,7 @@ "mongodb": "3.1.1", "monk": "6.0.6", "ms": "2.1.1", - "nan": "2.10.0", + "nan": "2.11.0", "nested-property": "0.0.7", "node-sass": "4.9.3", "node-sass-json-importer": "3.3.1", @@ -190,11 +190,11 @@ "single-line-log": "1.1.2", "speakeasy": "2.0.0", "stringz": "1.0.0", - "style-loader": "0.22.1", + "style-loader": "0.23.0", "stylus": "0.54.5", "stylus-loader": "3.0.2", - "summaly": "2.1.4", - "systeminformation": "3.43.0", + "summaly": "2.2.0", + "systeminformation": "3.44.2", "syuilo-password-strength": "0.0.1", "textarea-caret": "3.1.0", "tmp": "0.0.33", @@ -210,9 +210,9 @@ "vue": "2.5.17", "vue-chartjs": "3.4.0", "vue-cropperjs": "2.2.1", - "vue-js-modal": "1.3.19", + "vue-js-modal": "1.3.24", "vue-json-tree-view": "2.1.4", - "vue-loader": "15.4.0", + "vue-loader": "15.4.1", "vue-router": "3.0.1", "vue-style-loader": "4.1.2", "vue-template-compiler": "2.5.17", diff --git a/src/client/app/common/views/components/url-preview.vue b/src/client/app/common/views/components/url-preview.vue index 4ddc137ed1..242d9ba5c6 100644 --- a/src/client/app/common/views/components/url-preview.vue +++ b/src/client/app/common/views/components/url-preview.vue @@ -28,18 +28,99 @@ import Vue from 'vue'; import { url as misskeyUrl } from '../../../config'; +// THIS IS THE WHITELIST FOR THE EMBED PLAYER +const whiteList = [ + 'afreecatv.com', + 'aparat.com', + 'applemusic.com', + 'amazon.com', + 'awa.fm', + 'bandcamp.com', + 'bbc.co.uk', + 'beatport.com', + 'bilibili.com', + 'boomstream.com', + 'breakers.tv', + 'cam4.com', + 'cavelis.net', + 'chaturbate.com', + 'cnn.com', + 'cybergame.tv', + 'dailymotion.com', + 'deezer.com', + 'djlive.pl', + 'e-onkyo.com', + 'eventials.com', + 'facebook.com', + 'fc2.com', + 'gameplank.tv', + 'goodgame.ru', + 'google.com', + 'hardtunes.com', + 'instagram.com', + 'johnnylooch.com', + 'kexp.org', + 'lahzenegar.com', + 'liveedu.tv', + 'livetube.cc', + 'livestream.com', + 'meridix.com', + 'mixcloud.com', + 'mixer.com', + 'mobcrush.com', + 'mylive.in.th', + 'myspace.com', + 'netflix.com', + 'newretrowave.com', + 'nhk.or.jp', + 'nicovideo.jp', + 'nico.ms', + 'noisetrade.com', + 'nood.tv', + 'npr.org', + 'openrec.tv', + 'pandora.com', + 'pandora.tv', + 'picarto.tv', + 'pscp.tv', + 'restream.io', + 'reverbnation.com', + 'sermonaudio.com', + 'smashcast.tv', + 'songkick.com', + 'soundcloud.com', + 'spinninrecords.com', + 'spotify.com', + 'stitcher.com', + 'stream.me', + 'switchboard.live', + 'tunein.com', + 'twitcasting.tv', + 'twitch.tv', + 'twitter.com', + 'vaughnlive.tv', + 'veoh.com', + 'vimeo.com', + 'watchpeoplecode.com', + 'web.tv', + 'youtube.com', + 'youtu.be' +]; + export default Vue.extend({ props: { url: { type: String, require: true }, + detail: { type: Boolean, required: false, default: false } }, + data() { return { fetching: true, @@ -57,6 +138,7 @@ export default Vue.extend({ misskeyUrl }; }, + created() { const url = new URL(this.url); @@ -81,97 +163,22 @@ export default Vue.extend({ } return; } + fetch('/url?url=' + encodeURIComponent(this.url)).then(res => { res.json().then(info => { - if (info.url != null) { - this.title = info.title; - this.description = info.description; - this.thumbnail = info.thumbnail; - this.icon = info.icon; - this.sitename = info.sitename; - this.fetching = false; - if ([ // THIS IS THE WHITELIST FOR THE EMBED PLAYER - 'afreecatv.com', - 'aparat.com', - 'applemusic.com', - 'amazon.com', - 'awa.fm', - 'bandcamp.com', - 'bbc.co.uk', - 'beatport.com', - 'bilibili.com', - 'boomstream.com', - 'breakers.tv', - 'cam4.com', - 'cavelis.net', - 'chaturbate.com', - 'cnn.com', - 'cybergame.tv', - 'dailymotion.com', - 'deezer.com', - 'djlive.pl', - 'e-onkyo.com', - 'eventials.com', - 'facebook.com', - 'fc2.com', - 'gameplank.tv', - 'goodgame.ru', - 'google.com', - 'hardtunes.com', - 'instagram.com', - 'johnnylooch.com', - 'kexp.org', - 'lahzenegar.com', - 'liveedu.tv', - 'livetube.cc', - 'livestream.com', - 'meridix.com', - 'mixcloud.com', - 'mixer.com', - 'mobcrush.com', - 'mylive.in.th', - 'myspace.com', - 'netflix.com', - 'newretrowave.com', - 'nhk.or.jp', - 'nicovideo.jp', - 'nico.ms', - 'noisetrade.com', - 'nood.tv', - 'npr.org', - 'openrec.tv', - 'pandora.com', - 'pandora.tv', - 'picarto.tv', - 'pscp.tv', - 'restream.io', - 'reverbnation.com', - 'sermonaudio.com', - 'smashcast.tv', - 'songkick.com', - 'soundcloud.com', - 'spinninrecords.com', - 'spotify.com', - 'stitcher.com', - 'stream.me', - 'switchboard.live', - 'tunein.com', - 'twitcasting.tv', - 'twitch.tv', - 'twitter.com', - 'vaughnlive.tv', - 'veoh.com', - 'vimeo.com', - 'watchpeoplecode.com', - 'web.tv', - 'youtube.com', - 'youtu.be' - ].some(x => x == url.hostname || url.hostname.endsWith(`.${x}`))) - this.player = info.player; - } // info.url - }) // json - }); // fetch - } // created + if (info.url == null) return; + this.title = info.title; + this.description = info.description; + this.thumbnail = info.thumbnail; + this.icon = info.icon; + this.sitename = info.sitename; + this.fetching = false; + if (whiteList.some(x => x == url.hostname || url.hostname.endsWith(`.${x}`))) { + this.player = info.player; + } + }) + }); + } }); </script> diff --git a/src/client/app/common/views/widgets/donation.vue b/src/client/app/common/views/widgets/donation.vue index b1352e803e..544ca1bd9d 100644 --- a/src/client/app/common/views/widgets/donation.vue +++ b/src/client/app/common/views/widgets/donation.vue @@ -2,7 +2,7 @@ <div class="mkw-donation" :data-mobile="platform == 'mobile'"> <article> <h1>%fa:heart%%i18n:@title%</h1> - <p> + <p v-if="meta"> {{ '%i18n:@text%'.substr(0, '%i18n:@text%'.indexOf('{')) }} <a :href="meta.maintainer.url">{{ meta.maintainer.name }}</a> {{ '%i18n:@text%'.substr('%i18n:@text%'.indexOf('}') + 1) }} diff --git a/src/client/app/config.ts b/src/client/app/config.ts index 74b9ea21c8..a326c521db 100644 --- a/src/client/app/config.ts +++ b/src/client/app/config.ts @@ -4,6 +4,7 @@ declare const _THEME_COLOR_: string; declare const _COPYRIGHT_: string; declare const _VERSION_: string; declare const _CODENAME_: string; +declare const _ENV_: string; const address = new URL(location.href); @@ -18,3 +19,4 @@ export const themeColor = _THEME_COLOR_; export const copyright = _COPYRIGHT_; export const version = _VERSION_; export const codename = _CODENAME_; +export const env = _ENV_; diff --git a/src/client/app/desktop/api/update-avatar.ts b/src/client/app/desktop/api/update-avatar.ts index 83820f92bd..e9d92d1eb1 100644 --- a/src/client/app/desktop/api/update-avatar.ts +++ b/src/client/app/desktop/api/update-avatar.ts @@ -3,8 +3,21 @@ import { apiUrl } from '../../config'; import CropWindow from '../views/components/crop-window.vue'; import ProgressDialog from '../views/components/progress-dialog.vue'; -export default (os: OS) => (cb, file = null) => { - const fileSelected = file => { +export default (os: OS) => { + + const cropImage = file => new Promise((resolve, reject) => { + + const regex = RegExp('\.(jpg|jpeg|png|gif|webp|bmp|tiff)$'); + if (!regex.test(file.name) ) { + os.apis.dialog({ + title: '%fa:info-circle% %i18n:desktop.invalid-filetype%', + text: null, + actions: [{ + text: '%i18n:common.got-it%' + }] + }); + reject(); + } const w = os.new(CropWindow, { image: file, @@ -19,27 +32,29 @@ export default (os: OS) => (cb, file = null) => { os.api('drive/folders/find', { name: '%i18n:desktop.avatar%' - }).then(iconFolder => { - if (iconFolder.length === 0) { + }).then(avatarFolder => { + if (avatarFolder.length === 0) { os.api('drive/folders/create', { name: '%i18n:desktop.avatar%' }).then(iconFolder => { - upload(data, iconFolder); + resolve(upload(data, iconFolder)); }); } else { - upload(data, iconFolder[0]); + resolve(upload(data, avatarFolder[0])); } }); }); w.$once('skipped', () => { - set(file); + resolve(file); }); + w.$once('cancelled', reject); + document.body.appendChild(w.$el); - }; + }); - const upload = (data, folder) => { + const upload = (data, folder) => new Promise((resolve, reject) => { const dialog = os.new(ProgressDialog, { title: '%i18n:desktop.uploading-avatar%' }); @@ -52,18 +67,19 @@ export default (os: OS) => (cb, file = null) => { xhr.onload = e => { const file = JSON.parse((e.target as any).response); (dialog as any).close(); - set(file); + resolve(file); }; + xhr.onerror = reject; xhr.upload.onprogress = e => { if (e.lengthComputable) (dialog as any).update(e.loaded, e.total); }; xhr.send(data); - }; + }); - const set = file => { - os.api('i/update', { + const setAvatar = file => { + return os.api('i/update', { avatarId: file.id }).then(i => { os.store.commit('updateIKeyValue', { @@ -83,18 +99,21 @@ export default (os: OS) => (cb, file = null) => { }] }); - if (cb) cb(i); + return i; }); }; - if (file) { - fileSelected(file); - } else { - os.apis.chooseDriveFile({ - multiple: false, - title: '%fa:image% %i18n:desktop.choose-avatar%' - }).then(file => { - fileSelected(file); - }); - } + return (file = null) => { + const selectedFile = file + ? Promise.resolve(file) + : os.apis.chooseDriveFile({ + multiple: false, + title: '%fa:image% %i18n:desktop.choose-avatar%' + }); + + return selectedFile + .then(cropImage) + .then(setAvatar) + .catch(err => err && console.warn(err)); + }; }; diff --git a/src/client/app/desktop/api/update-banner.ts b/src/client/app/desktop/api/update-banner.ts index 33c4e306a2..e8fa35149b 100644 --- a/src/client/app/desktop/api/update-banner.ts +++ b/src/client/app/desktop/api/update-banner.ts @@ -6,6 +6,19 @@ import ProgressDialog from '../views/components/progress-dialog.vue'; export default (os: OS) => { const cropImage = file => new Promise((resolve, reject) => { + + const regex = RegExp('\.(jpg|jpeg|png|gif|webp|bmp|tiff)$'); + if (!regex.test(file.name) ) { + os.apis.dialog({ + title: '%fa:info-circle% %i18n:desktop.invalid-filetype%', + text: null, + actions: [{ + text: '%i18n:common.got-it%' + }] + }); + reject(); + } + const w = os.new(CropWindow, { image: file, title: '%i18n:desktop.banner-crop-title%', diff --git a/src/client/app/desktop/views/components/charts.vue b/src/client/app/desktop/views/components/charts.vue index e400aebbb7..c4e92e429f 100644 --- a/src/client/app/desktop/views/components/charts.vue +++ b/src/client/app/desktop/views/components/charts.vue @@ -88,7 +88,9 @@ export default Vue.extend({ }, created() { - (this as any).api('chart').then(chart => { + (this as any).api('chart', { + limit: 32 + }).then(chart => { this.chart = chart; }); }, @@ -580,6 +582,6 @@ export default Vue.extend({ > div > * display block - height 300px + height 320px </style> diff --git a/src/client/app/desktop/views/components/note-detail.vue b/src/client/app/desktop/views/components/note-detail.vue index 227bcc349d..1ba4a9a447 100644 --- a/src/client/app/desktop/views/components/note-detail.vue +++ b/src/client/app/desktop/views/components/note-detail.vue @@ -47,7 +47,7 @@ </div> <mk-poll v-if="p.poll" :note="p"/> <mk-url-preview v-for="url in urls" :url="url" :key="url" :detail="true"/> - <a class="location" v-if="p.geo" :href="`http://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% %i18n:@location%</a> + <a class="location" v-if="p.geo" :href="`https://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% %i18n:@location%</a> <div class="map" v-if="p.geo" ref="map"></div> <div class="renote" v-if="p.renote"> <mk-note-preview :note="p.renote"/> diff --git a/src/client/app/desktop/views/components/notes.note.vue b/src/client/app/desktop/views/components/notes.note.vue index 87acf7974d..7592ae3905 100644 --- a/src/client/app/desktop/views/components/notes.note.vue +++ b/src/client/app/desktop/views/components/notes.note.vue @@ -32,7 +32,7 @@ <mk-media-list :media-list="p.media"/> </div> <mk-poll v-if="p.poll" :note="p" ref="pollViewer"/> - <a class="location" v-if="p.geo" :href="`http://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% 位置情報</a> + <a class="location" v-if="p.geo" :href="`https://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% 位置情報</a> <div class="map" v-if="p.geo" ref="map"></div> <div class="renote" v-if="p.renote"> <mk-note-preview :note="p.renote"/> diff --git a/src/client/app/desktop/views/components/ui.header.nav.vue b/src/client/app/desktop/views/components/ui.header.nav.vue index f01aade306..6292b764c6 100644 --- a/src/client/app/desktop/views/components/ui.header.nav.vue +++ b/src/client/app/desktop/views/components/ui.header.nav.vue @@ -11,7 +11,7 @@ <li class="deck" :class="{ active: $route.name == 'deck' }" @click="goToTop"> <router-link to="/deck"> %fa:columns% - <p>%i18n:@deck% <small>(beta)</small></p> + <p>%i18n:@deck%</p> </router-link> </li> <li class="messaging"> diff --git a/src/client/app/desktop/views/components/ui.header.vue b/src/client/app/desktop/views/components/ui.header.vue index 6de4eaf744..ac8a6c7765 100644 --- a/src/client/app/desktop/views/components/ui.header.vue +++ b/src/client/app/desktop/views/components/ui.header.vue @@ -1,5 +1,6 @@ <template> <div class="header"> + <p class="warn" v-if="env != 'production'">%i18n:common.do-not-use-in-production%</p> <mk-special-message/> <div class="main" ref="main"> <div class="backdrop"></div> @@ -28,6 +29,7 @@ <script lang="ts"> import Vue from 'vue'; import * as anime from 'animejs'; +import { env } from '../../../config'; import XNav from './ui.header.nav.vue'; import XSearch from './ui.header.search.vue'; @@ -43,7 +45,13 @@ export default Vue.extend({ XAccount, XNotifications, XPost, - XClock, + XClock + }, + + data() { + return { + env: env + }; }, mounted() { @@ -119,6 +127,15 @@ root(isDark) width 100% box-shadow 0 1px 1px rgba(#000, 0.075) + > .warn + display block + margin 0 + padding 4px + text-align center + font-size 12px + background #f00 + color #fff + > .main height 48px diff --git a/src/client/app/desktop/views/pages/deck/deck.note.vue b/src/client/app/desktop/views/pages/deck/deck.note.vue index c7df715a05..e6d062eac9 100644 --- a/src/client/app/desktop/views/pages/deck/deck.note.vue +++ b/src/client/app/desktop/views/pages/deck/deck.note.vue @@ -32,7 +32,7 @@ <mk-media-list :media-list="p.media"/> </div> <mk-poll v-if="p.poll" :note="p" ref="pollViewer"/> - <a class="location" v-if="p.geo" :href="`http://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% %i18n:@location%</a> + <a class="location" v-if="p.geo" :href="`https://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% %i18n:@location%</a> <div class="renote" v-if="p.renote"> <mk-note-preview :note="p.renote" :mini="true"/> </div> diff --git a/src/client/app/desktop/views/pages/stats/stats.vue b/src/client/app/desktop/views/pages/stats/stats.vue index 6fcbf069ee..41005b6398 100644 --- a/src/client/app/desktop/views/pages/stats/stats.vue +++ b/src/client/app/desktop/views/pages/stats/stats.vue @@ -60,5 +60,5 @@ export default Vue.extend({ font-size 70% > div - max-width 800px + max-width 850px </style> diff --git a/src/client/app/desktop/views/pages/user/user.friends.vue b/src/client/app/desktop/views/pages/user/user.friends.vue index 4af0f0bca6..516eea0288 100644 --- a/src/client/app/desktop/views/pages/user/user.friends.vue +++ b/src/client/app/desktop/views/pages/user/user.friends.vue @@ -40,10 +40,12 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> +root(isDark) .friends - background #fff + background isDark ? #282C37 : #fff border solid 1px rgba(#000, 0.075) border-radius 6px + overflow hidden > .title z-index 1 @@ -52,7 +54,8 @@ export default Vue.extend({ line-height 42px font-size 0.9em font-weight bold - color #888 + background isDark ? #313543 : inherit + color isDark ? #e3e5e8 : #888 box-shadow 0 1px rgba(#000, 0.07) > i @@ -70,7 +73,7 @@ export default Vue.extend({ > .user padding 16px - border-bottom solid 1px #eee + border-bottom solid 1px isDark ? #21242f : #eee &:last-child border-bottom none @@ -96,18 +99,24 @@ export default Vue.extend({ margin 0 font-size 16px line-height 24px - color #555 + color isDark ? #ccc : #555 > .username display block margin 0 font-size 15px line-height 16px - color #ccc + color isDark ? #555 : #ccc > .mk-follow-button position absolute top 16px right 16px +.friends[data-darkmode] + root(true) + +.friends:not([data-darkmode]) + root(false) + </style> diff --git a/src/client/app/desktop/views/pages/user/user.photos.vue b/src/client/app/desktop/views/pages/user/user.photos.vue index ce7791a96b..8397e56484 100644 --- a/src/client/app/desktop/views/pages/user/user.photos.vue +++ b/src/client/app/desktop/views/pages/user/user.photos.vue @@ -39,10 +39,12 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> +root(isDark) .photos - background #fff + background isDark ? #282C37 : #fff border solid 1px rgba(#000, 0.075) border-radius 6px + overflow hidden > .title z-index 1 @@ -51,7 +53,8 @@ export default Vue.extend({ line-height 42px font-size 0.9em font-weight bold - color #888 + background: isDark ? #313543 : inherit + color isDark ? #e3e5e8 : #888 box-shadow 0 1px rgba(#000, 0.07) > i @@ -85,4 +88,10 @@ export default Vue.extend({ > i margin-right 4px +.photos[data-darkmode] + root(true) + +.photos:not([data-darkmode]) + root(false) + </style> diff --git a/src/client/app/desktop/views/pages/user/user.vue b/src/client/app/desktop/views/pages/user/user.vue index 300fd68f06..afb5e674d9 100644 --- a/src/client/app/desktop/views/pages/user/user.vue +++ b/src/client/app/desktop/views/pages/user/user.vue @@ -138,7 +138,7 @@ root(isDark) padding 16px font-size 12px color #aaa - background #fff + background isDark ? #21242f : #fff border solid 1px rgba(#000, 0.075) border-radius 6px diff --git a/src/client/app/init.ts b/src/client/app/init.ts index 18f510ea24..cf97957400 100644 --- a/src/client/app/init.ts +++ b/src/client/app/init.ts @@ -19,8 +19,8 @@ import { version, codename, lang } from './config'; let elementLocale; switch (lang) { - case 'ja': elementLocale = ElementLocaleJa; break; - case 'en': elementLocale = ElementLocaleEn; break; + case 'ja-JP': elementLocale = ElementLocaleJa; break; + case 'en-US': elementLocale = ElementLocaleEn; break; default: elementLocale = ElementLocaleEn; break; } diff --git a/src/client/app/mobile/views/components/note-detail.vue b/src/client/app/mobile/views/components/note-detail.vue index 317f08dcfa..f9996f9da6 100644 --- a/src/client/app/mobile/views/components/note-detail.vue +++ b/src/client/app/mobile/views/components/note-detail.vue @@ -45,7 +45,7 @@ </div> <mk-poll v-if="p.poll" :note="p"/> <mk-url-preview v-for="url in urls" :url="url" :key="url" :detail="true"/> - <a class="location" v-if="p.geo" :href="`http://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% %i18n:@location%</a> + <a class="location" v-if="p.geo" :href="`https://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% %i18n:@location%</a> <div class="map" v-if="p.geo" ref="map"></div> <div class="renote" v-if="p.renote"> <mk-note-preview :note="p.renote"/> diff --git a/src/client/app/mobile/views/components/note.vue b/src/client/app/mobile/views/components/note.vue index 8fc8af7f8d..d0cea135f9 100644 --- a/src/client/app/mobile/views/components/note.vue +++ b/src/client/app/mobile/views/components/note.vue @@ -33,7 +33,7 @@ </div> <mk-poll v-if="p.poll" :note="p" ref="pollViewer"/> <mk-url-preview v-for="url in urls" :url="url" :key="url"/> - <a class="location" v-if="p.geo" :href="`http://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% %i18n:@location%</a> + <a class="location" v-if="p.geo" :href="`https://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% %i18n:@location%</a> <div class="map" v-if="p.geo" ref="map"></div> <div class="renote" v-if="p.renote"> <mk-note-preview :note="p.renote"/> diff --git a/src/client/app/mobile/views/components/ui.header.vue b/src/client/app/mobile/views/components/ui.header.vue index a616586c56..c9b3ab51ae 100644 --- a/src/client/app/mobile/views/components/ui.header.vue +++ b/src/client/app/mobile/views/components/ui.header.vue @@ -1,5 +1,6 @@ <template> -<div class="header"> +<div class="header" ref="root"> + <p class="warn" v-if="env != 'production'">%i18n:common.do-not-use-in-production%</p> <mk-special-message/> <div class="main" ref="main"> <div class="backdrop"></div> @@ -20,6 +21,7 @@ <script lang="ts"> import Vue from 'vue'; import * as anime from 'animejs'; +import { env } from '../../../config'; export default Vue.extend({ props: ['func'], @@ -27,7 +29,8 @@ export default Vue.extend({ return { hasGameInvitation: false, connection: null, - connectionId: null + connectionId: null, + env: env }; }, computed: { @@ -39,7 +42,7 @@ export default Vue.extend({ } }, mounted() { - this.$store.commit('setUiHeaderHeight', 48); + this.$store.commit('setUiHeaderHeight', this.$refs.root.offsetHeight); if (this.$store.getters.isSignedIn) { this.connection = (this as any).os.stream.getConnection(); @@ -133,6 +136,15 @@ root(isDark) height 3px background $theme-color + > .warn + display block + margin 0 + padding 4px + text-align center + font-size 12px + background #f00 + color #fff + > .main color rgba(#fff, 0.9) diff --git a/src/client/app/mobile/views/components/ui.vue b/src/client/app/mobile/views/components/ui.vue index 7e2d39f259..d2af15d235 100644 --- a/src/client/app/mobile/views/components/ui.vue +++ b/src/client/app/mobile/views/components/ui.vue @@ -31,7 +31,14 @@ export default Vue.extend({ connectionId: null }; }, + watch: { + '$store.state.uiHeaderHeight'() { + this.$el.style.paddingTop = this.$store.state.uiHeaderHeight + 'px'; + } + }, mounted() { + this.$el.style.paddingTop = this.$store.state.uiHeaderHeight + 'px'; + if (this.$store.getters.isSignedIn) { this.connection = (this as any).os.stream.getConnection(); this.connectionId = (this as any).os.stream.use(); diff --git a/src/client/app/mobile/views/pages/settings.vue b/src/client/app/mobile/views/pages/settings.vue index 6b82be099d..7437eb8b47 100644 --- a/src/client/app/mobile/views/pages/settings.vue +++ b/src/client/app/mobile/views/pages/settings.vue @@ -42,6 +42,12 @@ </ui-card> <ui-card> + <div slot="title">%fa:volume-up% %i18n:@sound%</div> + + <ui-switch v-model="enableSounds">%i18n:@enable-sounds%</ui-switch> + </ui-card> + + <ui-card> <div slot="title">%fa:language% %i18n:@lang%</div> <ui-select v-model="lang" placeholder="%i18n:@auto%"> @@ -142,6 +148,11 @@ export default Vue.extend({ get() { return this.$store.state.device.lang; }, set(value) { this.$store.commit('device/set', { key: 'lang', value }); } }, + + enableSounds: { + get() { return this.$store.state.device.enableSounds; }, + set(value) { this.$store.commit('device/set', { key: 'enableSounds', value }); } + }, }, mounted() { diff --git a/src/client/app/store.ts b/src/client/app/store.ts index 0f3ff4a380..469563495f 100644 --- a/src/client/app/store.ts +++ b/src/client/app/store.ts @@ -13,7 +13,7 @@ const defaultSettings = { showMaps: true, showPostFormOnTopOfTl: false, suggestRecentHashtags: true, - showClockOnHeader: false, + showClockOnHeader: true, circleIcons: true, gradientWindowHeader: false, showReplyTarget: true, diff --git a/src/docs/about.en.md b/src/docs/about.en-US.md index bb1c51927b..bb1c51927b 100644 --- a/src/docs/about.en.md +++ b/src/docs/about.en-US.md diff --git a/src/docs/about.ja.md b/src/docs/about.ja-JP.md index 1b06361f0f..1b06361f0f 100644 --- a/src/docs/about.ja.md +++ b/src/docs/about.ja-JP.md diff --git a/src/docs/api.ja.md b/src/docs/api.ja-JP.md index ecc80cc05e..ecc80cc05e 100644 --- a/src/docs/api.ja.md +++ b/src/docs/api.ja-JP.md diff --git a/src/docs/api/endpoints/view.pug b/src/docs/api/endpoints/view.pug index 76e1183302..be7e84faa1 100644 --- a/src/docs/api/endpoints/view.pug +++ b/src/docs/api/endpoints/view.pug @@ -15,7 +15,7 @@ block main span.path= endpointUrl.path if endpoint.desc - p#desc= endpoint.desc[lang] || endpoint.desc['ja'] + p#desc= endpoint.desc[lang] || endpoint.desc['ja-JP'] if endpoint.requireCredential div.ui.info: p diff --git a/src/docs/api/entities/drive-file.yaml b/src/docs/api/entities/drive-file.yaml index 62dbec363a..0c2195ac08 100644 --- a/src/docs/api/entities/drive-file.yaml +++ b/src/docs/api/entities/drive-file.yaml @@ -1,90 +1,90 @@ name: "DriveFile" desc: - ja: "ドライブのファイル。" - en: "A file of Drive." + ja-JP: "ドライブのファイル。" + en-US: "A file of Drive." props: id: type: "id" optional: false desc: - ja: "ファイルID" - en: "The ID of this file" + ja-JP: "ファイルID" + en-US: "The ID of this file" createdAt: type: "date" optional: false desc: - ja: "アップロード日時" - en: "The upload date of this file" + ja-JP: "アップロード日時" + en-US: "The upload date of this file" userId: type: "id(User)" optional: false desc: - ja: "所有者ID" - en: "The ID of the owner of this file" + ja-JP: "所有者ID" + en-US: "The ID of the owner of this file" user: type: "entity(User)" optional: true desc: - ja: "所有者" - en: "The owner of this file" + ja-JP: "所有者" + en-US: "The owner of this file" name: type: "string" optional: false desc: - ja: "ファイル名" - en: "The name of this file" + ja-JP: "ファイル名" + en-US: "The name of this file" md5: type: "string" optional: false desc: - ja: "ファイルのMD5ハッシュ値" - en: "The md5 hash value of this file" + ja-JP: "ファイルのMD5ハッシュ値" + en-US: "The md5 hash value of this file" type: type: "string" optional: false desc: - ja: "ファイルの種類" - en: "The type of this file" + ja-JP: "ファイルの種類" + en-US: "The type of this file" datasize: type: "number" optional: false desc: - ja: "ファイルサイズ(bytes)" - en: "The size of this file (bytes)" + ja-JP: "ファイルサイズ(bytes)" + en-US: "The size of this file (bytes)" url: type: "string" optional: false desc: - ja: "ファイルのURL" - en: "The URL of this file" + ja-JP: "ファイルのURL" + en-US: "The URL of this file" folderId: type: "id(DriveFolder)" optional: true desc: - ja: "フォルダID" - en: "The ID of the folder of this file" + ja-JP: "フォルダID" + en-US: "The ID of the folder of this file" folder: type: "entity(DriveFolder)" optional: true desc: - ja: "フォルダ" - en: "The folder of this file" + ja-JP: "フォルダ" + en-US: "The folder of this file" isSensitive: type: "boolean" optional: true desc: - ja: "このメディアが「閲覧注意」(NSFW)かどうか" - en: "Whether this media is NSFW" + ja-JP: "このメディアが「閲覧注意」(NSFW)かどうか" + en-US: "Whether this media is NSFW" diff --git a/src/docs/api/entities/drive-folder.yaml b/src/docs/api/entities/drive-folder.yaml index 0fb8308dd4..e3dfd2ca01 100644 --- a/src/docs/api/entities/drive-folder.yaml +++ b/src/docs/api/entities/drive-folder.yaml @@ -1,41 +1,41 @@ name: "DriveFolder" desc: - ja: "ドライブのフォルダを表します。" - en: "A folder of Drive." + ja-JP: "ドライブのフォルダを表します。" + en-US: "A folder of Drive." props: id: type: "id" optional: false desc: - ja: "フォルダID" - en: "The ID of this folder" + ja-JP: "フォルダID" + en-US: "The ID of this folder" createdAt: type: "date" optional: false desc: - ja: "作成日時" - en: "The created date of this folder" + ja-JP: "作成日時" + en-US: "The created date of this folder" userId: type: "id(User)" optional: false desc: - ja: "所有者ID" - en: "The ID of the owner of this folder" + ja-JP: "所有者ID" + en-US: "The ID of the owner of this folder" parentId: type: "entity(DriveFolder)" optional: false desc: - ja: "親フォルダのID (ルートなら null)" - en: "The ID of parent folder" + ja-JP: "親フォルダのID (ルートなら null)" + en-US: "The ID of parent folder" name: type: "string" optional: false desc: - ja: "フォルダ名" - en: "The name of this folder" + ja-JP: "フォルダ名" + en-US: "The name of this folder" diff --git a/src/docs/api/entities/note.yaml b/src/docs/api/entities/note.yaml index 04cb3c9824..cae9a53f82 100644 --- a/src/docs/api/entities/note.yaml +++ b/src/docs/api/entities/note.yaml @@ -1,190 +1,190 @@ name: "Note" desc: - ja: "投稿。" - en: "A note." + ja-JP: "投稿。" + en-US: "A note." props: id: type: "id" optional: false desc: - ja: "投稿ID" - en: "The ID of this note" + ja-JP: "投稿ID" + en-US: "The ID of this note" createdAt: type: "date" optional: false desc: - ja: "投稿日時" - en: "The posted date of this note" + ja-JP: "投稿日時" + en-US: "The posted date of this note" viaMobile: type: "boolean" optional: true desc: - ja: "モバイル端末から投稿したか否か(自己申告であることに留意)" - en: "Whether this note sent via a mobile device" + ja-JP: "モバイル端末から投稿したか否か(自己申告であることに留意)" + en-US: "Whether this note sent via a mobile device" text: type: "string" optional: true desc: - ja: "投稿の本文" - en: "The text of this note" + ja-JP: "投稿の本文" + en-US: "The text of this note" mediaIds: type: "id(DriveFile)[]" optional: true desc: - ja: "添付されているメディアのID (なければレスポンスでは空配列)" - en: "The IDs of the attached media (empty array for response if no media is attached)" + ja-JP: "添付されているメディアのID (なければレスポンスでは空配列)" + en-US: "The IDs of the attached media (empty array for response if no media is attached)" media: type: "entity(DriveFile)[]" optional: true desc: - ja: "添付されているメディア" - en: "The attached media" + ja-JP: "添付されているメディア" + en-US: "The attached media" userId: type: "id(User)" optional: false desc: - ja: "投稿者ID" - en: "The ID of author of this note" + ja-JP: "投稿者ID" + en-US: "The ID of author of this note" user: type: "entity(User)" optional: true desc: - ja: "投稿者" - en: "The author of this note" + ja-JP: "投稿者" + en-US: "The author of this note" myReaction: type: "string" optional: true desc: - ja: "この投稿に対する自分の<a href='/docs/api/reactions'>リアクション</a>" - en: "The your <a href='/docs/api/reactions'>reaction</a> of this note" + ja-JP: "この投稿に対する自分の<a href='/docs/api/reactions'>リアクション</a>" + en-US: "The your <a href='/docs/api/reactions'>reaction</a> of this note" reactionCounts: type: "object" optional: false desc: - ja: "<a href='/docs/api/reactions'>リアクション</a>をキーとし、この投稿に対するそのリアクションの数を値としたオブジェクト" + ja-JP: "<a href='/docs/api/reactions'>リアクション</a>をキーとし、この投稿に対するそのリアクションの数を値としたオブジェクト" replyId: type: "id(Note)" optional: true desc: - ja: "返信した投稿のID" - en: "The ID of the replyed note" + ja-JP: "返信した投稿のID" + en-US: "The ID of the replyed note" reply: type: "entity(Note)" optional: true desc: - ja: "返信した投稿" - en: "The replyed note" + ja-JP: "返信した投稿" + en-US: "The replyed note" renoteId: type: "id(Note)" optional: true desc: - ja: "引用した投稿のID" - en: "The ID of the quoted note" + ja-JP: "引用した投稿のID" + en-US: "The ID of the quoted note" renote: type: "entity(Note)" optional: true desc: - ja: "引用した投稿" - en: "The quoted note" + ja-JP: "引用した投稿" + en-US: "The quoted note" poll: type: "object" optional: true desc: - ja: "投票" - en: "The poll" + ja-JP: "投票" + en-US: "The poll" props: choices: type: "object[]" optional: false desc: - ja: "投票の選択肢" - en: "The choices of this poll" + ja-JP: "投票の選択肢" + en-US: "The choices of this poll" props: id: type: "number" optional: false desc: - ja: "選択肢ID" - en: "The ID of this choice" + ja-JP: "選択肢ID" + en-US: "The ID of this choice" isVoted: type: "boolean" optional: true desc: - ja: "自分がこの選択肢に投票したかどうか" - en: "Whether you voted to this choice" + ja-JP: "自分がこの選択肢に投票したかどうか" + en-US: "Whether you voted to this choice" text: type: "string" optional: false desc: - ja: "選択肢本文" - en: "The text of this choice" + ja-JP: "選択肢本文" + en-US: "The text of this choice" votes: type: "number" optional: false desc: - ja: "この選択肢に投票された数" - en: "The number voted for this choice" + ja-JP: "この選択肢に投票された数" + en-US: "The number voted for this choice" geo: type: "object" optional: true desc: - ja: "位置情報" - en: "Geo location" + ja-JP: "位置情報" + en-US: "Geo location" props: coordinates: type: "number[]" optional: false desc: - ja: "座標。最初に経度:-180〜180で表す。最後に緯度:-90〜90で表す。" + ja-JP: "座標。最初に経度:-180〜180で表す。最後に緯度:-90〜90で表す。" altitude: type: "number" optional: false desc: - ja: "高度。メートル単位で表す。" + ja-JP: "高度。メートル単位で表す。" accuracy: type: "number" optional: false desc: - ja: "緯度、経度の精度。メートル単位で表す。" + ja-JP: "緯度、経度の精度。メートル単位で表す。" altitudeAccuracy: type: "number" optional: false desc: - ja: "高度の精度。メートル単位で表す。" + ja-JP: "高度の精度。メートル単位で表す。" heading: type: "number" optional: false desc: - ja: "方角。0〜360の角度で表す。0が北、90が東、180が南、270が西。" + ja-JP: "方角。0〜360の角度で表す。0が北、90が東、180が南、270が西。" speed: type: "number" optional: false desc: - ja: "速度。メートル / 秒数で表す。" + ja-JP: "速度。メートル / 秒数で表す。" diff --git a/src/docs/api/entities/user.yaml b/src/docs/api/entities/user.yaml index c245974568..c90b55ee88 100644 --- a/src/docs/api/entities/user.yaml +++ b/src/docs/api/entities/user.yaml @@ -1,174 +1,174 @@ name: "User" desc: - ja: "ユーザー。" - en: "A user." + ja-JP: "ユーザー。" + en-US: "A user." props: id: type: "id" optional: false desc: - ja: "ユーザーID" - en: "The ID of this user" + ja-JP: "ユーザーID" + en-US: "The ID of this user" createdAt: type: "date" optional: false desc: - ja: "アカウント作成日時" - en: "The registered date of this user" + ja-JP: "アカウント作成日時" + en-US: "The registered date of this user" username: type: "string" optional: false desc: - ja: "ユーザー名" - en: "The username of this user" + ja-JP: "ユーザー名" + en-US: "The username of this user" description: type: "string" optional: false desc: - ja: "アカウントの説明(自己紹介)" - en: "The description of this user" + ja-JP: "アカウントの説明(自己紹介)" + en-US: "The description of this user" avatarId: type: "id(DriveFile)" optional: true desc: - ja: "アバターのID" - en: "The ID of the avatar of this user" + ja-JP: "アバターのID" + en-US: "The ID of the avatar of this user" avatarUrl: type: "string" optional: false desc: - ja: "アバターのURL" - en: "The URL of the avatar of this user" + ja-JP: "アバターのURL" + en-US: "The URL of the avatar of this user" bannerId: type: "id(DriveFile)" optional: true desc: - ja: "バナーのID" - en: "The ID of the banner of this user" + ja-JP: "バナーのID" + en-US: "The ID of the banner of this user" bannerUrl: type: "string" optional: false desc: - ja: "バナーのURL" - en: "The URL of the banner of this user" + ja-JP: "バナーのURL" + en-US: "The URL of the banner of this user" followersCount: type: "number" optional: false desc: - ja: "フォロワーの数" - en: "The number of the followers for this user" + ja-JP: "フォロワーの数" + en-US: "The number of the followers for this user" followingCount: type: "number" optional: false desc: - ja: "フォローしているユーザーの数" - en: "The number of the following users for this user" + ja-JP: "フォローしているユーザーの数" + en-US: "The number of the following users for this user" isFollowing: type: "boolean" optional: true desc: - ja: "自分がこのユーザーをフォローしているか" + ja-JP: "自分がこのユーザーをフォローしているか" isFollowed: type: "boolean" optional: true desc: - ja: "自分がこのユーザーにフォローされているか" + ja-JP: "自分がこのユーザーにフォローされているか" isMuted: type: "boolean" optional: true desc: - ja: "自分がこのユーザーをミュートしているか" - en: "Whether you muted this user" + ja-JP: "自分がこのユーザーをミュートしているか" + en-US: "Whether you muted this user" notesCount: type: "number" optional: false desc: - ja: "投稿の数" - en: "The number of the notes of this user" + ja-JP: "投稿の数" + en-US: "The number of the notes of this user" pinnedNote: type: "entity(Note)" optional: true desc: - ja: "ピン留めされた投稿" - en: "The pinned note of this user" + ja-JP: "ピン留めされた投稿" + en-US: "The pinned note of this user" pinnedNoteId: type: "id(Note)" optional: true desc: - ja: "ピン留めされた投稿のID" - en: "The ID of the pinned note of this user" + ja-JP: "ピン留めされた投稿のID" + en-US: "The ID of the pinned note of this user" host: type: "string | null" optional: false desc: - ja: "ホスト (例: example.com:3000)" - en: "Host (e.g. example.com:3000)" + ja-JP: "ホスト (例: example.com:3000)" + en-US: "Host (e.g. example.com:3000)" twitter: type: "object" optional: true desc: - ja: "連携されているTwitterアカウント情報" - en: "The info of the connected twitter account of this user" + ja-JP: "連携されているTwitterアカウント情報" + en-US: "The info of the connected twitter account of this user" props: userId: type: "string" optional: false desc: - ja: "ユーザーID" - en: "The user ID" + ja-JP: "ユーザーID" + en-US: "The user ID" screenName: type: "string" optional: false desc: - ja: "ユーザー名" - en: "The screen name of this user" + ja-JP: "ユーザー名" + en-US: "The screen name of this user" isBot: type: "boolean" optional: true desc: - ja: "botか否か(自己申告であることに留意)" - en: "Whether is bot or not" + ja-JP: "botか否か(自己申告であることに留意)" + en-US: "Whether is bot or not" profile: type: "object" optional: false desc: - ja: "プロフィール" - en: "The profile of this user" + ja-JP: "プロフィール" + en-US: "The profile of this user" props: location: type: "string" optional: true desc: - ja: "場所" - en: "The location of this user" + ja-JP: "場所" + en-US: "The location of this user" birthday: type: "string" optional: true desc: - ja: "誕生日 (YYYY-MM-DD)" - en: "The birthday of this user (YYYY-MM-DD)" + ja-JP: "誕生日 (YYYY-MM-DD)" + en-US: "The birthday of this user (YYYY-MM-DD)" diff --git a/src/docs/api/entities/view.pug b/src/docs/api/entities/view.pug index d5c192f438..1f166d053c 100644 --- a/src/docs/api/entities/view.pug +++ b/src/docs/api/entities/view.pug @@ -7,7 +7,7 @@ block meta block main h1= name - p#desc= desc[lang] || desc['ja'] + p#desc= desc[lang] || desc['ja-JP'] section h2= i18n('docs.api.entities.properties') diff --git a/src/docs/api/mixins.pug b/src/docs/api/mixins.pug index 925aab2934..563739d52b 100644 --- a/src/docs/api/mixins.pug +++ b/src/docs/api/mixins.pug @@ -31,4 +31,4 @@ mixin propTable(props) td.name= prop.name td.type +type(prop) - td.desc!= prop.desc ? prop.desc[lang] || prop.desc['ja'] : null + td.desc!= prop.desc ? prop.desc[lang] || prop.desc['ja-JP'] : null diff --git a/src/docs/base.pug b/src/docs/base.pug index aeafaeffff..26f19ddf09 100644 --- a/src/docs/base.pug +++ b/src/docs/base.pug @@ -16,7 +16,7 @@ html(lang= lang) nav ul each doc in docs - li: a(href=`/docs/${lang}/${doc.name}`)= doc.title[lang] || doc.title['ja'] + li: a(href=`/docs/${lang}/${doc.name}`)= doc.title[lang] || doc.title['ja-JP'] section h2 API ul diff --git a/src/docs/follow.ja.md b/src/docs/follow.ja-JP.md index a883435ab4..a883435ab4 100644 --- a/src/docs/follow.ja.md +++ b/src/docs/follow.ja-JP.md diff --git a/src/docs/mute.ja.md b/src/docs/mute.ja-JP.md index 6a9608662a..6a9608662a 100644 --- a/src/docs/mute.ja.md +++ b/src/docs/mute.ja-JP.md diff --git a/src/docs/reversi-bot.ja.md b/src/docs/reversi-bot.ja-JP.md index 98b543ca6c..98b543ca6c 100644 --- a/src/docs/reversi-bot.ja.md +++ b/src/docs/reversi-bot.ja-JP.md diff --git a/src/docs/stream.ja.md b/src/docs/stream.ja-JP.md index c720299932..c720299932 100644 --- a/src/docs/stream.ja.md +++ b/src/docs/stream.ja-JP.md diff --git a/src/docs/timelines.ja.md b/src/docs/timelines.ja-JP.md index 36ba61bd2d..36ba61bd2d 100644 --- a/src/docs/timelines.ja.md +++ b/src/docs/timelines.ja-JP.md diff --git a/src/queue/processors/http/process-inbox.ts b/src/queue/processors/http/process-inbox.ts index c9c2fa72cb..a30efe1a3a 100644 --- a/src/queue/processors/http/process-inbox.ts +++ b/src/queue/processors/http/process-inbox.ts @@ -6,6 +6,8 @@ import parseAcct from '../../../misc/acct/parse'; import User, { IRemoteUser } from '../../../models/user'; import perform from '../../../remote/activitypub/perform'; import { resolvePerson } from '../../../remote/activitypub/models/person'; +import { toUnicode } from 'punycode'; +import { URL } from 'url'; const log = debug('misskey:queue:inbox'); @@ -32,6 +34,15 @@ export default async (job: bq.Job, done: any): Promise<void> => { return; } + // アクティビティ内のホストの検証 + try { + ValidateActivity(activity, host); + } catch (e) { + console.warn(e); + done(); + return; + } + user = await User.findOne({ usernameLower: username, host: host.toLowerCase() }) as IRemoteUser; // アクティビティを送信してきたユーザーがまだMisskeyサーバーに登録されていなかったら登録する @@ -39,6 +50,16 @@ export default async (job: bq.Job, done: any): Promise<void> => { user = await resolvePerson(activity.actor) as IRemoteUser; } } else { + // アクティビティ内のホストの検証 + const host = toUnicode(new URL(signature.keyId).hostname.toLowerCase()); + try { + ValidateActivity(activity, host); + } catch (e) { + console.warn(e); + done(); + return; + } + user = await User.findOne({ host: { $ne: null }, 'publicKey.id': signature.keyId @@ -69,3 +90,37 @@ export default async (job: bq.Job, done: any): Promise<void> => { done(e); } }; + +/** + * Validate host in activity + * @param activity Activity + * @param host Expect host + */ +function ValidateActivity(activity: any, host: string) { + // id (if exists) + if (typeof activity.id === 'string') { + const uriHost = toUnicode(new URL(activity.id).hostname.toLowerCase()); + if (host !== uriHost) throw new Error('activity.id has different host'); + } + + // actor (if exists) + if (typeof activity.actor === 'string') { + const uriHost = toUnicode(new URL(activity.actor).hostname.toLowerCase()); + if (host !== uriHost) throw new Error('activity.actor has different host'); + } + + // For Create activity + if (activity.type === 'Create' && activity.object) { + // object.id (if exists) + if (typeof activity.object.id === 'string') { + const uriHost = toUnicode(new URL(activity.object.id).hostname.toLowerCase()); + if (host !== uriHost) throw new Error('activity.object.id has different host'); + } + + // object.attributedTo (if exists) + if (typeof activity.object.attributedTo === 'string') { + const uriHost = toUnicode(new URL(activity.object.attributedTo).hostname.toLowerCase()); + if (host !== uriHost) throw new Error('activity.object.attributedTo has different host'); + } + } +} diff --git a/src/remote/activitypub/models/person.ts b/src/remote/activitypub/models/person.ts index 4a7b505a9f..3bd4e16763 100644 --- a/src/remote/activitypub/models/person.ts +++ b/src/remote/activitypub/models/person.ts @@ -4,18 +4,25 @@ import * as debug from 'debug'; import config from '../../../config'; import User, { validateUsername, isValidName, IUser, IRemoteUser } from '../../../models/user'; -import webFinger from '../../webfinger'; import Resolver from '../resolver'; import { resolveImage } from './image'; -import { isCollectionOrOrderedCollection, IObject, IPerson } from '../type'; +import { isCollectionOrOrderedCollection, IPerson } from '../type'; import { IDriveFile } from '../../../models/drive-file'; import Meta from '../../../models/meta'; import htmlToMFM from '../../../mfm/html-to-mfm'; import { updateUserStats } from '../../../services/update-chart'; +import { URL } from 'url'; const log = debug('misskey:activitypub'); -function validatePerson(x: any) { +/** + * Validate Person object + * @param x Fetched person object + * @param uri Fetch target URI + */ +function validatePerson(x: any, uri: string) { + const expectHost = toUnicode(new URL(uri).hostname.toLowerCase()); + if (x == null) { return new Error('invalid person: object is null'); } @@ -40,6 +47,24 @@ function validatePerson(x: any) { return new Error('invalid person: invalid name'); } + if (typeof x.id !== 'string') { + return new Error('invalid person: id is not a string'); + } + + const idHost = toUnicode(new URL(x.id).hostname.toLowerCase()); + if (idHost !== expectHost) { + return new Error('invalid person: id has different host'); + } + + if (typeof x.publicKey.id !== 'string') { + return new Error('invalid person: publicKey.id is not a string'); + } + + const publicKeyIdHost = toUnicode(new URL(x.publicKey.id).hostname.toLowerCase()); + if (publicKeyIdHost !== expectHost) { + return new Error('invalid person: publicKey.id has different host'); + } + return null; } @@ -48,8 +73,8 @@ function validatePerson(x: any) { * * Misskeyに対象のPersonが登録されていればそれを返します。 */ -export async function fetchPerson(value: string | IObject, resolver?: Resolver): Promise<IUser> { - const uri = typeof value == 'string' ? value : value.id; +export async function fetchPerson(uri: string, resolver?: Resolver): Promise<IUser> { + if (typeof uri !== 'string') throw 'uri is not string'; // URIがこのサーバーを指しているならデータベースからフェッチ if (uri.startsWith(config.url + '/')) { @@ -71,12 +96,14 @@ export async function fetchPerson(value: string | IObject, resolver?: Resolver): /** * Personを作成します。 */ -export async function createPerson(value: any, resolver?: Resolver): Promise<IUser> { +export async function createPerson(uri: string, resolver?: Resolver): Promise<IUser> { + if (typeof uri !== 'string') throw 'uri is not string'; + if (resolver == null) resolver = new Resolver(); - const object = await resolver.resolve(value) as any; + const object = await resolver.resolve(uri) as any; - const err = validatePerson(object); + const err = validatePerson(object, uri); if (err) { throw err; @@ -86,7 +113,7 @@ export async function createPerson(value: any, resolver?: Resolver): Promise<IUs log(`Creating the Person: ${person.id}`); - const [followersCount = 0, followingCount = 0, notesCount = 0, finger] = await Promise.all([ + const [followersCount = 0, followingCount = 0, notesCount = 0] = await Promise.all([ resolver.resolve(person.followers).then( resolved => isCollectionOrOrderedCollection(resolved) ? resolved.totalItems : undefined, () => undefined @@ -98,11 +125,10 @@ export async function createPerson(value: any, resolver?: Resolver): Promise<IUs resolver.resolve(person.outbox).then( resolved => isCollectionOrOrderedCollection(resolved) ? resolved.totalItems : undefined, () => undefined - ), - webFinger(person.id) + ) ]); - const host = toUnicode(finger.subject.replace(/^.*?@/, '')).toLowerCase(); + const host = toUnicode(new URL(object.id).hostname.toLowerCase()); const isBot = object.type == 'Service'; @@ -192,8 +218,8 @@ export async function createPerson(value: any, resolver?: Resolver): Promise<IUs * * Misskeyに対象のPersonが登録されていなければ無視します。 */ -export async function updatePerson(value: string | IObject, resolver?: Resolver): Promise<void> { - const uri = typeof value == 'string' ? value : value.id; +export async function updatePerson(uri: string, resolver?: Resolver): Promise<void> { + if (typeof uri !== 'string') throw 'uri is not string'; // URIがこのサーバーを指しているならスキップ if (uri.startsWith(config.url + '/')) { @@ -210,9 +236,9 @@ export async function updatePerson(value: string | IObject, resolver?: Resolver) if (resolver == null) resolver = new Resolver(); - const object = await resolver.resolve(value) as any; + const object = await resolver.resolve(uri) as any; - const err = validatePerson(object); + const err = validatePerson(object, uri); if (err) { throw err; @@ -275,8 +301,8 @@ export async function updatePerson(value: string | IObject, resolver?: Resolver) * Misskeyに対象のPersonが登録されていればそれを返し、そうでなければ * リモートサーバーからフェッチしてMisskeyに登録しそれを返します。 */ -export async function resolvePerson(value: string | IObject, verifier?: string): Promise<IUser> { - const uri = typeof value == 'string' ? value : value.id; +export async function resolvePerson(uri: string, verifier?: string): Promise<IUser> { + if (typeof uri !== 'string') throw 'uri is not string'; //#region このサーバーに既に登録されていたらそれを返す const exist = await fetchPerson(uri); @@ -287,5 +313,5 @@ export async function resolvePerson(value: string | IObject, verifier?: string): //#endregion // リモートサーバーからフェッチしてきて登録 - return await createPerson(value); + return await createPerson(uri); } diff --git a/src/remote/activitypub/request.ts b/src/remote/activitypub/request.ts index 6238d3acb1..d739d08e15 100644 --- a/src/remote/activitypub/request.ts +++ b/src/remote/activitypub/request.ts @@ -2,6 +2,7 @@ import { request } from 'https'; const { sign } = require('http-signature'); import { URL } from 'url'; import * as debug from 'debug'; +const crypto = require('crypto'); import config from '../../config'; import { ILocalUser } from '../../models/user'; @@ -13,6 +14,12 @@ export default (user: ILocalUser, url: string, object: any) => new Promise((reso const { protocol, hostname, port, pathname, search } = new URL(url); + const data = JSON.stringify(object); + + const sha256 = crypto.createHash('sha256'); + sha256.update(data); + const hash = sha256.digest('base64'); + const req = request({ protocol, hostname, @@ -20,7 +27,8 @@ export default (user: ILocalUser, url: string, object: any) => new Promise((reso method: 'POST', path: pathname + search, headers: { - 'Content-Type': 'application/activity+json' + 'Content-Type': 'application/activity+json', + 'Digest': `SHA-256=${hash}` } }, res => { log(`${url} --> ${res.statusCode}`); @@ -35,7 +43,8 @@ export default (user: ILocalUser, url: string, object: any) => new Promise((reso sign(req, { authorizationHeaderName: 'Signature', key: user.keypair, - keyId: `${config.url}/users/${user._id}/publickey` + keyId: `${config.url}/users/${user._id}/publickey`, + headers: ['date', 'host', 'digest'] }); // Signature: Signature ... => Signature: ... @@ -43,5 +52,5 @@ export default (user: ILocalUser, url: string, object: any) => new Promise((reso sig = sig.replace(/^Signature /, ''); req.setHeader('Signature', sig); - req.end(JSON.stringify(object)); + req.end(data); }); diff --git a/src/server/api/endpoints/admin/invite.ts b/src/server/api/endpoints/admin/invite.ts index 77608e715c..892b2579f2 100644 --- a/src/server/api/endpoints/admin/invite.ts +++ b/src/server/api/endpoints/admin/invite.ts @@ -3,7 +3,7 @@ import RegistrationTicket from '../../../../models/registration-tickets'; export const meta = { desc: { - ja: '招待コードを発行します。' + 'ja-JP': '招待コードを発行します。' }, requireCredential: true, diff --git a/src/server/api/endpoints/admin/suspend-user.ts b/src/server/api/endpoints/admin/suspend-user.ts index 9b492c6e15..32c2416fb5 100644 --- a/src/server/api/endpoints/admin/suspend-user.ts +++ b/src/server/api/endpoints/admin/suspend-user.ts @@ -5,8 +5,8 @@ import User from '../../../../models/user'; export const meta = { desc: { - ja: '指定したユーザーを凍結します。', - en: 'Suspend a user.' + 'ja-JP': '指定したユーザーを凍結します。', + 'en-US': 'Suspend a user.' }, requireCredential: true, @@ -15,8 +15,8 @@ export const meta = { params: { userId: $.type(ID).note({ desc: { - ja: '対象のユーザーID', - en: 'The user ID which you want to suspend' + 'ja-JP': '対象のユーザーID', + 'en-US': 'The user ID which you want to suspend' } }), } diff --git a/src/server/api/endpoints/admin/unsuspend-user.ts b/src/server/api/endpoints/admin/unsuspend-user.ts index 8409bd1b76..879c23ab14 100644 --- a/src/server/api/endpoints/admin/unsuspend-user.ts +++ b/src/server/api/endpoints/admin/unsuspend-user.ts @@ -5,8 +5,8 @@ import User from '../../../../models/user'; export const meta = { desc: { - ja: '指定したユーザーの凍結を解除します。', - en: 'Unsuspend a user.' + 'ja-JP': '指定したユーザーの凍結を解除します。', + 'en-US': 'Unsuspend a user.' }, requireCredential: true, @@ -15,8 +15,8 @@ export const meta = { params: { userId: $.type(ID).note({ desc: { - ja: '対象のユーザーID', - en: 'The user ID which you want to unsuspend' + 'ja-JP': '対象のユーザーID', + 'en-US': 'The user ID which you want to unsuspend' } }), } diff --git a/src/server/api/endpoints/admin/unverify-user.ts b/src/server/api/endpoints/admin/unverify-user.ts index 34653cd78a..178049fa1d 100644 --- a/src/server/api/endpoints/admin/unverify-user.ts +++ b/src/server/api/endpoints/admin/unverify-user.ts @@ -5,8 +5,8 @@ import User from '../../../../models/user'; export const meta = { desc: { - ja: '指定したユーザーの公式アカウントを解除します。', - en: 'Mark a user as unverified.' + 'ja-JP': '指定したユーザーの公式アカウントを解除します。', + 'en-US': 'Mark a user as unverified.' }, requireCredential: true, @@ -15,8 +15,8 @@ export const meta = { params: { userId: $.type(ID).note({ desc: { - ja: '対象のユーザーID', - en: 'The user ID which you want to unverify' + 'ja-JP': '対象のユーザーID', + 'en-US': 'The user ID which you want to unverify' } }), } diff --git a/src/server/api/endpoints/admin/update-meta.ts b/src/server/api/endpoints/admin/update-meta.ts index bfcab9d6a6..2c7929fabe 100644 --- a/src/server/api/endpoints/admin/update-meta.ts +++ b/src/server/api/endpoints/admin/update-meta.ts @@ -4,7 +4,7 @@ import getParams from '../../get-params'; export const meta = { desc: { - ja: 'インスタンスの設定を更新します。' + 'ja-JP': 'インスタンスの設定を更新します。' }, requireCredential: true, @@ -13,7 +13,7 @@ export const meta = { params: { disableRegistration: $.bool.optional.nullable.note({ desc: { - ja: '招待制か否か' + 'ja-JP': '招待制か否か' } }), } diff --git a/src/server/api/endpoints/admin/verify-user.ts b/src/server/api/endpoints/admin/verify-user.ts index 5b826eb1c3..dd07684ded 100644 --- a/src/server/api/endpoints/admin/verify-user.ts +++ b/src/server/api/endpoints/admin/verify-user.ts @@ -5,8 +5,8 @@ import User from '../../../../models/user'; export const meta = { desc: { - ja: '指定したユーザーを公式アカウントにします。', - en: 'Mark a user as verified.' + 'ja-JP': '指定したユーザーを公式アカウントにします。', + 'en-US': 'Mark a user as verified.' }, requireCredential: true, @@ -15,8 +15,8 @@ export const meta = { params: { userId: $.type(ID).note({ desc: { - ja: '対象のユーザーID', - en: 'The user ID which you want to verify' + 'ja-JP': '対象のユーザーID', + 'en-US': 'The user ID which you want to verify' } }), } diff --git a/src/server/api/endpoints/chart.ts b/src/server/api/endpoints/chart.ts index 406ad39946..7da970131e 100644 --- a/src/server/api/endpoints/chart.ts +++ b/src/server/api/endpoints/chart.ts @@ -1,4 +1,6 @@ +import $ from 'cafy'; import Stats, { IStats } from '../../../models/stats'; +import getParams from '../get-params'; type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>; @@ -44,11 +46,26 @@ function migrateStats(stats: IStats[]) { } export const meta = { + desc: { + 'ja-JP': 'インスタンスの統計を取得します。' + }, + + params: { + limit: $.num.optional.range(1, 100).note({ + default: 30, + desc: { + 'ja-JP': '最大数' + } + }), + } }; export default (params: any) => new Promise(async (res, rej) => { - const daysRange = 30; - const hoursRange = 30; + const [ps, psErr] = getParams(meta, params); + if (psErr) throw psErr; + + const daysRange = ps.limit; + const hoursRange = ps.limit; const now = new Date(); const y = now.getFullYear(); diff --git a/src/server/api/endpoints/drive.ts b/src/server/api/endpoints/drive.ts index 8ad961494f..063cd475d4 100644 --- a/src/server/api/endpoints/drive.ts +++ b/src/server/api/endpoints/drive.ts @@ -4,8 +4,8 @@ import config from '../../../config'; export const meta = { desc: { - ja: 'ドライブの情報を取得します。', - en: 'Get drive information.' + 'ja-JP': 'ドライブの情報を取得します。', + 'en-US': 'Get drive information.' }, requireCredential: true, diff --git a/src/server/api/endpoints/drive/files.ts b/src/server/api/endpoints/drive/files.ts index 063b4adde1..dc6a602e10 100644 --- a/src/server/api/endpoints/drive/files.ts +++ b/src/server/api/endpoints/drive/files.ts @@ -4,8 +4,8 @@ import { ILocalUser } from '../../../../models/user'; export const meta = { desc: { - ja: 'ドライブのファイル一覧を取得します。', - en: 'Get files of drive.' + 'ja-JP': 'ドライブのファイル一覧を取得します。', + 'en-US': 'Get files of drive.' }, requireCredential: true, diff --git a/src/server/api/endpoints/drive/files/create.ts b/src/server/api/endpoints/drive/files/create.ts index 41b7e04b46..dfbd11d0c2 100644 --- a/src/server/api/endpoints/drive/files/create.ts +++ b/src/server/api/endpoints/drive/files/create.ts @@ -8,8 +8,8 @@ import getParams from '../../../get-params'; export const meta = { desc: { - ja: 'ドライブにファイルをアップロードします。', - en: 'Upload a file to drive.' + 'ja-JP': 'ドライブにファイルをアップロードします。', + 'en-US': 'Upload a file to drive.' }, requireCredential: true, @@ -27,15 +27,15 @@ export const meta = { folderId: $.type(ID).optional.nullable.note({ default: null, desc: { - ja: 'フォルダID' + 'ja-JP': 'フォルダID' } }), isSensitive: $.bool.optional.note({ default: false, desc: { - ja: 'このメディアが「閲覧注意」(NSFW)かどうか', - en: 'Whether this media is NSFW' + 'ja-JP': 'このメディアが「閲覧注意」(NSFW)かどうか', + 'en-US': 'Whether this media is NSFW' } }) } diff --git a/src/server/api/endpoints/drive/files/delete.ts b/src/server/api/endpoints/drive/files/delete.ts index 02cd96dd8f..fb7340df38 100644 --- a/src/server/api/endpoints/drive/files/delete.ts +++ b/src/server/api/endpoints/drive/files/delete.ts @@ -6,8 +6,8 @@ import { ILocalUser } from '../../../../../models/user'; export const meta = { desc: { - ja: 'ドライブのファイルを削除します。', - en: 'Delete a file of drive.' + 'ja-JP': 'ドライブのファイルを削除します。', + 'en-US': 'Delete a file of drive.' }, requireCredential: true, diff --git a/src/server/api/endpoints/drive/files/show.ts b/src/server/api/endpoints/drive/files/show.ts index 6a66c7a272..718fb8c2d7 100644 --- a/src/server/api/endpoints/drive/files/show.ts +++ b/src/server/api/endpoints/drive/files/show.ts @@ -4,8 +4,8 @@ import { ILocalUser } from '../../../../../models/user'; export const meta = { desc: { - ja: '指定したドライブのファイルの情報を取得します。', - en: 'Get specified file of drive.' + 'ja-JP': '指定したドライブのファイルの情報を取得します。', + 'en-US': 'Get specified file of drive.' }, requireCredential: true, diff --git a/src/server/api/endpoints/drive/files/update.ts b/src/server/api/endpoints/drive/files/update.ts index 9ae2719aa7..ba9abfec61 100644 --- a/src/server/api/endpoints/drive/files/update.ts +++ b/src/server/api/endpoints/drive/files/update.ts @@ -7,8 +7,8 @@ import getParams from '../../../get-params'; export const meta = { desc: { - ja: '指定したドライブのファイルの情報を更新します。', - en: 'Update specified file of drive.' + 'ja-JP': '指定したドライブのファイルの情報を更新します。', + 'en-US': 'Update specified file of drive.' }, requireCredential: true, @@ -18,30 +18,30 @@ export const meta = { params: { fileId: $.type(ID).note({ desc: { - ja: '対象のファイルID' + 'ja-JP': '対象のファイルID' } }), folderId: $.type(ID).optional.nullable.note({ default: undefined, desc: { - ja: 'フォルダID' + 'ja-JP': 'フォルダID' } }), name: $.str.optional.pipe(validateFileName).note({ default: undefined, desc: { - ja: 'ファイル名', - en: 'Name of the file' + 'ja-JP': 'ファイル名', + 'en-US': 'Name of the file' } }), isSensitive: $.bool.optional.note({ default: undefined, desc: { - ja: 'このメディアが「閲覧注意」(NSFW)かどうか', - en: 'Whether this media is NSFW' + 'ja-JP': 'このメディアが「閲覧注意」(NSFW)かどうか', + 'en-US': 'Whether this media is NSFW' } }) } diff --git a/src/server/api/endpoints/drive/files/upload_from_url.ts b/src/server/api/endpoints/drive/files/upload_from_url.ts index d634cf46db..783646feb3 100644 --- a/src/server/api/endpoints/drive/files/upload_from_url.ts +++ b/src/server/api/endpoints/drive/files/upload_from_url.ts @@ -6,7 +6,7 @@ import { ILocalUser } from '../../../../../models/user'; export const meta = { desc: { - ja: 'ドライブに指定されたURLに存在するファイルをアップロードします。' + 'ja-JP': 'ドライブに指定されたURLに存在するファイルをアップロードします。' }, limit: { diff --git a/src/server/api/endpoints/drive/folders.ts b/src/server/api/endpoints/drive/folders.ts index de398eb720..19c2ef7aca 100644 --- a/src/server/api/endpoints/drive/folders.ts +++ b/src/server/api/endpoints/drive/folders.ts @@ -4,8 +4,8 @@ import { ILocalUser } from '../../../../models/user'; export const meta = { desc: { - ja: 'ドライブのフォルダ一覧を取得します。', - en: 'Get folders of drive.' + 'ja-JP': 'ドライブのフォルダ一覧を取得します。', + 'en-US': 'Get folders of drive.' }, requireCredential: true, diff --git a/src/server/api/endpoints/drive/folders/create.ts b/src/server/api/endpoints/drive/folders/create.ts index 03f9504774..5997dedf0f 100644 --- a/src/server/api/endpoints/drive/folders/create.ts +++ b/src/server/api/endpoints/drive/folders/create.ts @@ -5,8 +5,8 @@ import { ILocalUser } from '../../../../../models/user'; export const meta = { desc: { - ja: 'ドライブのフォルダを作成します。', - en: 'Create a folder of drive.' + 'ja-JP': 'ドライブのフォルダを作成します。', + 'en-US': 'Create a folder of drive.' }, requireCredential: true, diff --git a/src/server/api/endpoints/drive/folders/show.ts b/src/server/api/endpoints/drive/folders/show.ts index 6a6c879a01..bb25bcba3c 100644 --- a/src/server/api/endpoints/drive/folders/show.ts +++ b/src/server/api/endpoints/drive/folders/show.ts @@ -4,7 +4,7 @@ import { ILocalUser } from '../../../../../models/user'; export const meta = { desc: { - ja: '指定したドライブのフォルダの情報を取得します。' + 'ja-JP': '指定したドライブのフォルダの情報を取得します。' }, requireCredential: true, diff --git a/src/server/api/endpoints/drive/folders/update.ts b/src/server/api/endpoints/drive/folders/update.ts index 1b449428a6..259f373bfc 100644 --- a/src/server/api/endpoints/drive/folders/update.ts +++ b/src/server/api/endpoints/drive/folders/update.ts @@ -5,8 +5,8 @@ import { ILocalUser } from '../../../../../models/user'; export const meta = { desc: { - ja: '指定したドライブのフォルダの情報を更新します。', - en: 'Update specified folder of drive.' + 'ja-JP': '指定したドライブのフォルダの情報を更新します。', + 'en-US': 'Update specified folder of drive.' }, requireCredential: true, diff --git a/src/server/api/endpoints/following/create.ts b/src/server/api/endpoints/following/create.ts index ebe319e0cf..c9bea0e3d2 100644 --- a/src/server/api/endpoints/following/create.ts +++ b/src/server/api/endpoints/following/create.ts @@ -6,8 +6,8 @@ import create from '../../../../services/following/create'; export const meta = { desc: { - ja: '指定したユーザーをフォローします。', - en: 'Follow a user.' + 'ja-JP': '指定したユーザーをフォローします。', + 'en-US': 'Follow a user.' }, limit: { diff --git a/src/server/api/endpoints/following/delete.ts b/src/server/api/endpoints/following/delete.ts index 4806fe4e39..f3b4a73ae8 100644 --- a/src/server/api/endpoints/following/delete.ts +++ b/src/server/api/endpoints/following/delete.ts @@ -6,8 +6,8 @@ import deleteFollowing from '../../../../services/following/delete'; export const meta = { desc: { - ja: '指定したユーザーのフォローを解除します。', - en: 'Unfollow a user.' + 'ja-JP': '指定したユーザーのフォローを解除します。', + 'en-US': 'Unfollow a user.' }, limit: { diff --git a/src/server/api/endpoints/following/requests/accept.ts b/src/server/api/endpoints/following/requests/accept.ts index b3bf2dd667..f6a7dcf120 100644 --- a/src/server/api/endpoints/following/requests/accept.ts +++ b/src/server/api/endpoints/following/requests/accept.ts @@ -4,8 +4,8 @@ import User, { ILocalUser } from '../../../../../models/user'; export const meta = { desc: { - ja: '自分に届いた、指定したフォローリクエストを承認します。', - en: 'Accept a follow request.' + 'ja-JP': '自分に届いた、指定したフォローリクエストを承認します。', + 'en-US': 'Accept a follow request.' }, requireCredential: true, diff --git a/src/server/api/endpoints/following/requests/cancel.ts b/src/server/api/endpoints/following/requests/cancel.ts index c46b948d29..3da4f4734f 100644 --- a/src/server/api/endpoints/following/requests/cancel.ts +++ b/src/server/api/endpoints/following/requests/cancel.ts @@ -4,8 +4,8 @@ import User, { pack, ILocalUser } from '../../../../../models/user'; export const meta = { desc: { - ja: '自分が作成した、指定したフォローリクエストをキャンセルします。', - en: 'Cancel a follow request.' + 'ja-JP': '自分が作成した、指定したフォローリクエストをキャンセルします。', + 'en-US': 'Cancel a follow request.' }, requireCredential: true, diff --git a/src/server/api/endpoints/following/requests/list.ts b/src/server/api/endpoints/following/requests/list.ts index b06a158c08..11a387cf16 100644 --- a/src/server/api/endpoints/following/requests/list.ts +++ b/src/server/api/endpoints/following/requests/list.ts @@ -4,8 +4,8 @@ import { ILocalUser } from '../../../../../models/user'; export const meta = { desc: { - ja: '自分に届いたフォローリクエストの一覧を取得します。', - en: 'Get all pending received follow requests.' + 'ja-JP': '自分に届いたフォローリクエストの一覧を取得します。', + 'en-US': 'Get all pending received follow requests.' }, requireCredential: true, diff --git a/src/server/api/endpoints/following/requests/reject.ts b/src/server/api/endpoints/following/requests/reject.ts index a232549bb8..98febe9e9f 100644 --- a/src/server/api/endpoints/following/requests/reject.ts +++ b/src/server/api/endpoints/following/requests/reject.ts @@ -4,8 +4,8 @@ import User, { ILocalUser } from '../../../../../models/user'; export const meta = { desc: { - ja: '自分に届いた、指定したフォローリクエストを拒否します。', - en: 'Reject a follow request.' + 'ja-JP': '自分に届いた、指定したフォローリクエストを拒否します。', + 'en-US': 'Reject a follow request.' }, requireCredential: true, diff --git a/src/server/api/endpoints/following/stalk.ts b/src/server/api/endpoints/following/stalk.ts index 79a3fb976c..d44cea2cc4 100644 --- a/src/server/api/endpoints/following/stalk.ts +++ b/src/server/api/endpoints/following/stalk.ts @@ -4,8 +4,8 @@ import { ILocalUser } from '../../../../models/user'; export const meta = { desc: { - ja: '指定したユーザーをストーキングします。', - en: 'Stalk a user.' + 'ja-JP': '指定したユーザーをストーキングします。', + 'en-US': 'Stalk a user.' }, requireCredential: true, diff --git a/src/server/api/endpoints/following/unstalk.ts b/src/server/api/endpoints/following/unstalk.ts index 71a7a97eeb..8b66f0727e 100644 --- a/src/server/api/endpoints/following/unstalk.ts +++ b/src/server/api/endpoints/following/unstalk.ts @@ -4,8 +4,8 @@ import { ILocalUser } from '../../../../models/user'; export const meta = { desc: { - ja: '指定したユーザーのストーキングをやめます。', - en: 'Unstalk a user.' + 'ja-JP': '指定したユーザーのストーキングをやめます。', + 'en-US': 'Unstalk a user.' }, requireCredential: true, diff --git a/src/server/api/endpoints/games/reversi/games/surrender.ts b/src/server/api/endpoints/games/reversi/games/surrender.ts index 49821650ed..8ca0143674 100644 --- a/src/server/api/endpoints/games/reversi/games/surrender.ts +++ b/src/server/api/endpoints/games/reversi/games/surrender.ts @@ -6,7 +6,7 @@ import { publishReversiGameStream } from '../../../../../../stream'; export const meta = { desc: { - ja: '指定したリバーシの対局で投了します。' + 'ja-JP': '指定したリバーシの対局で投了します。' }, requireCredential: true, @@ -14,7 +14,7 @@ export const meta = { params: { gameId: $.type(ID).note({ desc: { - ja: '投了したい対局' + 'ja-JP': '投了したい対局' } }) } diff --git a/src/server/api/endpoints/hashtags/search.ts b/src/server/api/endpoints/hashtags/search.ts index 262370cacc..f6fb35b2ff 100644 --- a/src/server/api/endpoints/hashtags/search.ts +++ b/src/server/api/endpoints/hashtags/search.ts @@ -5,7 +5,7 @@ const escapeRegexp = require('escape-regexp'); export const meta = { desc: { - ja: 'ハッシュタグを検索します。' + 'ja-JP': 'ハッシュタグを検索します。' }, requireCredential: false, @@ -14,20 +14,20 @@ export const meta = { limit: $.num.optional.range(1, 100).note({ default: 10, desc: { - ja: '最大数' + 'ja-JP': '最大数' } }), query: $.str.note({ desc: { - ja: 'クエリ' + 'ja-JP': 'クエリ' } }), offset: $.num.optional.min(0).note({ default: 0, desc: { - ja: 'オフセット' + 'ja-JP': 'オフセット' } }) } diff --git a/src/server/api/endpoints/i.ts b/src/server/api/endpoints/i.ts index 7f25c07957..1f99ef2d8d 100644 --- a/src/server/api/endpoints/i.ts +++ b/src/server/api/endpoints/i.ts @@ -3,7 +3,7 @@ import { IApp } from '../../../models/app'; export const meta = { desc: { - ja: '自分のアカウント情報を取得します。' + 'ja-JP': '自分のアカウント情報を取得します。' }, requireCredential: true, diff --git a/src/server/api/endpoints/i/favorites.ts b/src/server/api/endpoints/i/favorites.ts index 47c8a87fd9..32c1a55fb0 100644 --- a/src/server/api/endpoints/i/favorites.ts +++ b/src/server/api/endpoints/i/favorites.ts @@ -4,8 +4,8 @@ import { ILocalUser } from '../../../../models/user'; export const meta = { desc: { - ja: 'お気に入りに登録した投稿一覧を取得します。', - en: 'Get favorited notes' + 'ja-JP': 'お気に入りに登録した投稿一覧を取得します。', + 'en-US': 'Get favorited notes' }, requireCredential: true, diff --git a/src/server/api/endpoints/i/update.ts b/src/server/api/endpoints/i/update.ts index 61a6b20c7c..cdb4eb3f56 100644 --- a/src/server/api/endpoints/i/update.ts +++ b/src/server/api/endpoints/i/update.ts @@ -8,8 +8,8 @@ import config from '../../../../config'; export const meta = { desc: { - ja: 'アカウント情報を更新します。', - en: 'Update myself' + 'ja-JP': 'アカウント情報を更新します。', + 'en-US': 'Update myself' }, requireCredential: true, diff --git a/src/server/api/endpoints/messaging/history.ts b/src/server/api/endpoints/messaging/history.ts index 43cceacf95..1dd08cd13c 100644 --- a/src/server/api/endpoints/messaging/history.ts +++ b/src/server/api/endpoints/messaging/history.ts @@ -6,8 +6,8 @@ import { ILocalUser } from '../../../../models/user'; export const meta = { desc: { - ja: 'Messagingの履歴を取得します。', - en: 'Show messaging history.' + 'ja-JP': 'Messagingの履歴を取得します。', + 'en-US': 'Show messaging history.' }, requireCredential: true, diff --git a/src/server/api/endpoints/messaging/messages.ts b/src/server/api/endpoints/messaging/messages.ts index ae26419bc6..dec0638eed 100644 --- a/src/server/api/endpoints/messaging/messages.ts +++ b/src/server/api/endpoints/messaging/messages.ts @@ -6,8 +6,8 @@ import read from '../../common/read-messaging-message'; export const meta = { desc: { - ja: '指定したユーザーとのMessagingのメッセージ一覧を取得します。', - en: 'Get messages of messaging.' + 'ja-JP': '指定したユーザーとのMessagingのメッセージ一覧を取得します。', + 'en-US': 'Get messages of messaging.' }, requireCredential: true, diff --git a/src/server/api/endpoints/messaging/messages/create.ts b/src/server/api/endpoints/messaging/messages/create.ts index d33d9e7e77..a6fabcfa45 100644 --- a/src/server/api/endpoints/messaging/messages/create.ts +++ b/src/server/api/endpoints/messaging/messages/create.ts @@ -12,8 +12,8 @@ import pushSw from '../../../../../push-sw'; export const meta = { desc: { - ja: '指定したユーザーへMessagingのメッセージを送信します。', - en: 'Create a message of messaging.' + 'ja-JP': '指定したユーザーへMessagingのメッセージを送信します。', + 'en-US': 'Create a message of messaging.' }, requireCredential: true, diff --git a/src/server/api/endpoints/messaging/messages/read.ts b/src/server/api/endpoints/messaging/messages/read.ts index f609337523..581b57579b 100644 --- a/src/server/api/endpoints/messaging/messages/read.ts +++ b/src/server/api/endpoints/messaging/messages/read.ts @@ -6,8 +6,8 @@ import getParams from '../../../get-params'; export const meta = { desc: { - ja: '指定した自分宛てのメッセージを既読にします。', - en: 'Mark as read a message of messaging.' + 'ja-JP': '指定した自分宛てのメッセージを既読にします。', + 'en-US': 'Mark as read a message of messaging.' }, requireCredential: true, @@ -17,8 +17,8 @@ export const meta = { params: { messageId: $.type(ID).note({ desc: { - ja: '既読にするメッセージのID', - en: 'The ID of a message that you want to mark as read' + 'ja-JP': '既読にするメッセージのID', + 'en-US': 'The ID of a message that you want to mark as read' } }) } diff --git a/src/server/api/endpoints/mute/create.ts b/src/server/api/endpoints/mute/create.ts index bd70cd62ef..5b2e7a8d71 100644 --- a/src/server/api/endpoints/mute/create.ts +++ b/src/server/api/endpoints/mute/create.ts @@ -4,8 +4,8 @@ import Mute from '../../../../models/mute'; export const meta = { desc: { - ja: 'ユーザーをミュートします。', - en: 'Mute a user' + 'ja-JP': 'ユーザーをミュートします。', + 'en-US': 'Mute a user' }, requireCredential: true, diff --git a/src/server/api/endpoints/mute/delete.ts b/src/server/api/endpoints/mute/delete.ts index 3187c46f83..e8ed75a847 100644 --- a/src/server/api/endpoints/mute/delete.ts +++ b/src/server/api/endpoints/mute/delete.ts @@ -4,8 +4,8 @@ import Mute from '../../../../models/mute'; export const meta = { desc: { - ja: 'ユーザーのミュートを解除します。', - en: 'Unmute a user' + 'ja-JP': 'ユーザーのミュートを解除します。', + 'en-US': 'Unmute a user' }, requireCredential: true, diff --git a/src/server/api/endpoints/mute/list.ts b/src/server/api/endpoints/mute/list.ts index e297605338..387b2396f5 100644 --- a/src/server/api/endpoints/mute/list.ts +++ b/src/server/api/endpoints/mute/list.ts @@ -5,8 +5,8 @@ import { getFriendIds } from '../../common/get-friends'; export const meta = { desc: { - ja: 'ミュートしているユーザー一覧を取得します。', - en: 'Get muted users.' + 'ja-JP': 'ミュートしているユーザー一覧を取得します。', + 'en-US': 'Get muted users.' }, requireCredential: true, diff --git a/src/server/api/endpoints/my/apps.ts b/src/server/api/endpoints/my/apps.ts index 35185db41d..412dff6164 100644 --- a/src/server/api/endpoints/my/apps.ts +++ b/src/server/api/endpoints/my/apps.ts @@ -4,8 +4,8 @@ import { ILocalUser } from '../../../../models/user'; export const meta = { desc: { - ja: '自分のアプリケーション一覧を取得します。', - en: 'Get my apps' + 'ja-JP': '自分のアプリケーション一覧を取得します。', + 'en-US': 'Get my apps' }, requireCredential: true diff --git a/src/server/api/endpoints/notes/create.ts b/src/server/api/endpoints/notes/create.ts index 9cdbec5270..04f5f7562e 100644 --- a/src/server/api/endpoints/notes/create.ts +++ b/src/server/api/endpoints/notes/create.ts @@ -9,7 +9,7 @@ import getParams from '../../get-params'; export const meta = { desc: { - ja: '投稿します。' + 'ja-JP': '投稿します。' }, requireCredential: true, @@ -25,33 +25,33 @@ export const meta = { visibility: $.str.optional.or(['public', 'home', 'followers', 'specified', 'private']).note({ default: 'public', desc: { - ja: '投稿の公開範囲' + 'ja-JP': '投稿の公開範囲' } }), visibleUserIds: $.arr($.type(ID)).optional.unique().min(1).note({ desc: { - ja: '(投稿の公開範囲が specified の場合)投稿を閲覧できるユーザー' + 'ja-JP': '(投稿の公開範囲が specified の場合)投稿を閲覧できるユーザー' } }), text: $.str.optional.nullable.pipe(isValidText).note({ default: null, desc: { - ja: '投稿内容' + 'ja-JP': '投稿内容' } }), cw: $.str.optional.nullable.pipe(isValidCw).note({ desc: { - ja: 'コンテンツの警告。このパラメータを指定すると設定したテキストで投稿のコンテンツを隠す事が出来ます。' + 'ja-JP': 'コンテンツの警告。このパラメータを指定すると設定したテキストで投稿のコンテンツを隠す事が出来ます。' } }), viaMobile: $.bool.optional.note({ default: false, desc: { - ja: 'モバイルデバイスからの投稿か否か。' + 'ja-JP': 'モバイルデバイスからの投稿か否か。' } }), @@ -66,20 +66,20 @@ export const meta = { speed: $.num.nullable }).optional.nullable.strict().note({ desc: { - ja: '位置情報' + 'ja-JP': '位置情報' }, ref: 'geo' }), mediaIds: $.arr($.type(ID)).optional.unique().range(1, 4).note({ desc: { - ja: '添付するメディア' + 'ja-JP': '添付するメディア' } }), renoteId: $.type(ID).optional.note({ desc: { - ja: 'Renote対象' + 'ja-JP': 'Renote対象' } }), @@ -90,7 +90,7 @@ export const meta = { .each(c => c.length > 0 && c.length < 50) }).optional.strict().note({ desc: { - ja: 'アンケート' + 'ja-JP': 'アンケート' }, ref: 'poll' }) @@ -102,7 +102,7 @@ export const meta = { createdNote: { type: 'entity(Note)', desc: { - ja: '作成した投稿' + 'ja-JP': '作成した投稿' } } } diff --git a/src/server/api/endpoints/notes/delete.ts b/src/server/api/endpoints/notes/delete.ts index 22c6101e14..6d9826cf7b 100644 --- a/src/server/api/endpoints/notes/delete.ts +++ b/src/server/api/endpoints/notes/delete.ts @@ -5,8 +5,8 @@ import { ILocalUser } from '../../../../models/user'; export const meta = { desc: { - ja: '指定した投稿を削除します。', - en: 'Delete a note.' + 'ja-JP': '指定した投稿を削除します。', + 'en-US': 'Delete a note.' }, requireCredential: true, diff --git a/src/server/api/endpoints/notes/favorites/create.ts b/src/server/api/endpoints/notes/favorites/create.ts index 87f6cf1f08..daf7780abc 100644 --- a/src/server/api/endpoints/notes/favorites/create.ts +++ b/src/server/api/endpoints/notes/favorites/create.ts @@ -5,8 +5,8 @@ import { ILocalUser } from '../../../../../models/user'; export const meta = { desc: { - ja: '指定した投稿をお気に入りに登録します。', - en: 'Favorite a note.' + 'ja-JP': '指定した投稿をお気に入りに登録します。', + 'en-US': 'Favorite a note.' }, requireCredential: true, diff --git a/src/server/api/endpoints/notes/favorites/delete.ts b/src/server/api/endpoints/notes/favorites/delete.ts index 3906fe99bb..e42b24d324 100644 --- a/src/server/api/endpoints/notes/favorites/delete.ts +++ b/src/server/api/endpoints/notes/favorites/delete.ts @@ -5,8 +5,8 @@ import { ILocalUser } from '../../../../../models/user'; export const meta = { desc: { - ja: '指定した投稿のお気に入りを解除します。', - en: 'Unfavorite a note.' + 'ja-JP': '指定した投稿のお気に入りを解除します。', + 'en-US': 'Unfavorite a note.' }, requireCredential: true, diff --git a/src/server/api/endpoints/notes/hybrid-timeline.ts b/src/server/api/endpoints/notes/hybrid-timeline.ts index 3fce4fb9af..2dbb1190c1 100644 --- a/src/server/api/endpoints/notes/hybrid-timeline.ts +++ b/src/server/api/endpoints/notes/hybrid-timeline.ts @@ -10,65 +10,65 @@ export const meta = { name: 'notes/hybrid-timeline', desc: { - ja: 'ハイブリッドタイムラインを取得します。' + 'ja-JP': 'ハイブリッドタイムラインを取得します。' }, params: { limit: $.num.optional.range(1, 100).note({ default: 10, desc: { - ja: '最大数' + 'ja-JP': '最大数' } }), sinceId: $.type(ID).optional.note({ desc: { - ja: '指定すると、この投稿を基点としてより新しい投稿を取得します' + 'ja-JP': '指定すると、この投稿を基点としてより新しい投稿を取得します' } }), untilId: $.type(ID).optional.note({ desc: { - ja: '指定すると、この投稿を基点としてより古い投稿を取得します' + 'ja-JP': '指定すると、この投稿を基点としてより古い投稿を取得します' } }), sinceDate: $.num.optional.note({ desc: { - ja: '指定した時間を基点としてより新しい投稿を取得します。数値は、1970年1月1日 00:00:00 UTC から指定した日時までの経過時間をミリ秒単位で表します。' + 'ja-JP': '指定した時間を基点としてより新しい投稿を取得します。数値は、1970年1月1日 00:00:00 UTC から指定した日時までの経過時間をミリ秒単位で表します。' } }), untilDate: $.num.optional.note({ desc: { - ja: '指定した時間を基点としてより古い投稿を取得します。数値は、1970年1月1日 00:00:00 UTC から指定した日時までの経過時間をミリ秒単位で表します。' + 'ja-JP': '指定した時間を基点としてより古い投稿を取得します。数値は、1970年1月1日 00:00:00 UTC から指定した日時までの経過時間をミリ秒単位で表します。' } }), includeMyRenotes: $.bool.optional.note({ default: true, desc: { - ja: '自分の行ったRenoteを含めるかどうか' + 'ja-JP': '自分の行ったRenoteを含めるかどうか' } }), includeRenotedMyNotes: $.bool.optional.note({ default: true, desc: { - ja: 'Renoteされた自分の投稿を含めるかどうか' + 'ja-JP': 'Renoteされた自分の投稿を含めるかどうか' } }), includeLocalRenotes: $.bool.optional.note({ default: true, desc: { - ja: 'Renoteされたローカルの投稿を含めるかどうか' + 'ja-JP': 'Renoteされたローカルの投稿を含めるかどうか' } }), mediaOnly: $.bool.optional.note({ desc: { - ja: 'true にすると、メディアが添付された投稿だけ取得します' + 'ja-JP': 'true にすると、メディアが添付された投稿だけ取得します' } }), } diff --git a/src/server/api/endpoints/notes/mentions.ts b/src/server/api/endpoints/notes/mentions.ts index db91230a81..a7fb14d8a9 100644 --- a/src/server/api/endpoints/notes/mentions.ts +++ b/src/server/api/endpoints/notes/mentions.ts @@ -6,8 +6,8 @@ import { ILocalUser } from '../../../../models/user'; export const meta = { desc: { - ja: '自分に言及している投稿の一覧を取得します。', - en: 'Get mentions of myself.' + 'ja-JP': '自分に言及している投稿の一覧を取得します。', + 'en-US': 'Get mentions of myself.' }, requireCredential: true diff --git a/src/server/api/endpoints/notes/polls/recommendation.ts b/src/server/api/endpoints/notes/polls/recommendation.ts index a0469d1870..9af223c010 100644 --- a/src/server/api/endpoints/notes/polls/recommendation.ts +++ b/src/server/api/endpoints/notes/polls/recommendation.ts @@ -5,8 +5,8 @@ import { ILocalUser } from '../../../../../models/user'; export const meta = { desc: { - ja: 'おすすめのアンケート一覧を取得します。', - en: 'Get recommended polls.' + 'ja-JP': 'おすすめのアンケート一覧を取得します。', + 'en-US': 'Get recommended polls.' }, requireCredential: true, diff --git a/src/server/api/endpoints/notes/polls/vote.ts b/src/server/api/endpoints/notes/polls/vote.ts index 568c187f8a..ab80e7f5d0 100644 --- a/src/server/api/endpoints/notes/polls/vote.ts +++ b/src/server/api/endpoints/notes/polls/vote.ts @@ -9,8 +9,8 @@ import { ILocalUser } from '../../../../../models/user'; export const meta = { desc: { - ja: '指定した投稿のアンケートに投票します。', - en: 'Vote poll of a note.' + 'ja-JP': '指定した投稿のアンケートに投票します。', + 'en-US': 'Vote poll of a note.' }, requireCredential: true, diff --git a/src/server/api/endpoints/notes/reactions.ts b/src/server/api/endpoints/notes/reactions.ts index 8921c55916..6e7d60e0f0 100644 --- a/src/server/api/endpoints/notes/reactions.ts +++ b/src/server/api/endpoints/notes/reactions.ts @@ -5,8 +5,8 @@ import { ILocalUser } from '../../../../models/user'; export const meta = { desc: { - ja: '指定した投稿のリアクション一覧を取得します。', - en: 'Show reactions of a note.' + 'ja-JP': '指定した投稿のリアクション一覧を取得します。', + 'en-US': 'Show reactions of a note.' }, requireCredential: true diff --git a/src/server/api/endpoints/notes/reactions/create.ts b/src/server/api/endpoints/notes/reactions/create.ts index 65e24e7c06..0781db16c5 100644 --- a/src/server/api/endpoints/notes/reactions/create.ts +++ b/src/server/api/endpoints/notes/reactions/create.ts @@ -7,8 +7,8 @@ import getParams from '../../../get-params'; export const meta = { desc: { - ja: '指定した投稿にリアクションします。', - en: 'React to a note.' + 'ja-JP': '指定した投稿にリアクションします。', + 'en-US': 'React to a note.' }, requireCredential: true, @@ -18,13 +18,13 @@ export const meta = { params: { noteId: $.type(ID).note({ desc: { - ja: '対象の投稿' + 'ja-JP': '対象の投稿' } }), reaction: $.str.pipe(validateReaction.ok).note({ desc: { - ja: 'リアクションの種類' + 'ja-JP': 'リアクションの種類' } }) } diff --git a/src/server/api/endpoints/notes/reactions/delete.ts b/src/server/api/endpoints/notes/reactions/delete.ts index 62af0407bc..598eb65364 100644 --- a/src/server/api/endpoints/notes/reactions/delete.ts +++ b/src/server/api/endpoints/notes/reactions/delete.ts @@ -5,8 +5,8 @@ import { ILocalUser } from '../../../../../models/user'; export const meta = { desc: { - ja: '指定した投稿へのリアクションを取り消します。', - en: 'Unreact to a note.' + 'ja-JP': '指定した投稿へのリアクションを取り消します。', + 'en-US': 'Unreact to a note.' }, requireCredential: true, diff --git a/src/server/api/endpoints/notes/timeline.ts b/src/server/api/endpoints/notes/timeline.ts index 3e3fa8c4aa..099bf2010b 100644 --- a/src/server/api/endpoints/notes/timeline.ts +++ b/src/server/api/endpoints/notes/timeline.ts @@ -8,8 +8,8 @@ import getParams from '../../get-params'; export const meta = { desc: { - ja: 'タイムラインを取得します。', - en: 'Get timeline of myself.' + 'ja-JP': 'タイムラインを取得します。', + 'en-US': 'Get timeline of myself.' }, requireCredential: true, @@ -18,58 +18,58 @@ export const meta = { limit: $.num.optional.range(1, 100).note({ default: 10, desc: { - ja: '最大数' + 'ja-JP': '最大数' } }), sinceId: $.type(ID).optional.note({ desc: { - ja: '指定すると、この投稿を基点としてより新しい投稿を取得します' + 'ja-JP': '指定すると、この投稿を基点としてより新しい投稿を取得します' } }), untilId: $.type(ID).optional.note({ desc: { - ja: '指定すると、この投稿を基点としてより古い投稿を取得します' + 'ja-JP': '指定すると、この投稿を基点としてより古い投稿を取得します' } }), sinceDate: $.num.optional.note({ desc: { - ja: '指定した時間を基点としてより新しい投稿を取得します。数値は、1970年1月1日 00:00:00 UTC から指定した日時までの経過時間をミリ秒単位で表します。' + 'ja-JP': '指定した時間を基点としてより新しい投稿を取得します。数値は、1970年1月1日 00:00:00 UTC から指定した日時までの経過時間をミリ秒単位で表します。' } }), untilDate: $.num.optional.note({ desc: { - ja: '指定した時間を基点としてより古い投稿を取得します。数値は、1970年1月1日 00:00:00 UTC から指定した日時までの経過時間をミリ秒単位で表します。' + 'ja-JP': '指定した時間を基点としてより古い投稿を取得します。数値は、1970年1月1日 00:00:00 UTC から指定した日時までの経過時間をミリ秒単位で表します。' } }), includeMyRenotes: $.bool.optional.note({ default: true, desc: { - ja: '自分の行ったRenoteを含めるかどうか' + 'ja-JP': '自分の行ったRenoteを含めるかどうか' } }), includeRenotedMyNotes: $.bool.optional.note({ default: true, desc: { - ja: 'Renoteされた自分の投稿を含めるかどうか' + 'ja-JP': 'Renoteされた自分の投稿を含めるかどうか' } }), includeLocalRenotes: $.bool.optional.note({ default: true, desc: { - ja: 'Renoteされたローカルの投稿を含めるかどうか' + 'ja-JP': 'Renoteされたローカルの投稿を含めるかどうか' } }), mediaOnly: $.bool.optional.note({ desc: { - ja: 'true にすると、メディアが添付された投稿だけ取得します' + 'ja-JP': 'true にすると、メディアが添付された投稿だけ取得します' } }), } diff --git a/src/server/api/endpoints/notes/trend.ts b/src/server/api/endpoints/notes/trend.ts index 1cbbfacadc..7a0a098f28 100644 --- a/src/server/api/endpoints/notes/trend.ts +++ b/src/server/api/endpoints/notes/trend.ts @@ -5,8 +5,8 @@ import { ILocalUser } from '../../../../models/user'; export const meta = { desc: { - ja: '人気の投稿の一覧を取得します。', - en: 'Get trend notes.' + 'ja-JP': '人気の投稿の一覧を取得します。', + 'en-US': 'Get trend notes.' }, requireCredential: true diff --git a/src/server/api/endpoints/notes/user-list-timeline.ts b/src/server/api/endpoints/notes/user-list-timeline.ts index dcef548666..a7b43014ed 100644 --- a/src/server/api/endpoints/notes/user-list-timeline.ts +++ b/src/server/api/endpoints/notes/user-list-timeline.ts @@ -8,8 +8,8 @@ import getParams from '../../get-params'; export const meta = { desc: { - ja: '指定したユーザーリストのタイムラインを取得します。', - en: 'Get timeline of a user list.' + 'ja-JP': '指定したユーザーリストのタイムラインを取得します。', + 'en-US': 'Get timeline of a user list.' }, requireCredential: true, @@ -17,65 +17,65 @@ export const meta = { params: { listId: $.type(ID).note({ desc: { - ja: 'リストのID' + 'ja-JP': 'リストのID' } }), limit: $.num.optional.range(1, 100).note({ default: 10, desc: { - ja: '最大数' + 'ja-JP': '最大数' } }), sinceId: $.type(ID).optional.note({ desc: { - ja: '指定すると、この投稿を基点としてより新しい投稿を取得します' + 'ja-JP': '指定すると、この投稿を基点としてより新しい投稿を取得します' } }), untilId: $.type(ID).optional.note({ desc: { - ja: '指定すると、この投稿を基点としてより古い投稿を取得します' + 'ja-JP': '指定すると、この投稿を基点としてより古い投稿を取得します' } }), sinceDate: $.num.optional.note({ desc: { - ja: '指定した時間を基点としてより新しい投稿を取得します。数値は、1970年1月1日 00:00:00 UTC から指定した日時までの経過時間をミリ秒単位で表します。' + 'ja-JP': '指定した時間を基点としてより新しい投稿を取得します。数値は、1970年1月1日 00:00:00 UTC から指定した日時までの経過時間をミリ秒単位で表します。' } }), untilDate: $.num.optional.note({ desc: { - ja: '指定した時間を基点としてより古い投稿を取得します。数値は、1970年1月1日 00:00:00 UTC から指定した日時までの経過時間をミリ秒単位で表します。' + 'ja-JP': '指定した時間を基点としてより古い投稿を取得します。数値は、1970年1月1日 00:00:00 UTC から指定した日時までの経過時間をミリ秒単位で表します。' } }), includeMyRenotes: $.bool.optional.note({ default: true, desc: { - ja: '自分の行ったRenoteを含めるかどうか' + 'ja-JP': '自分の行ったRenoteを含めるかどうか' } }), includeRenotedMyNotes: $.bool.optional.note({ default: true, desc: { - ja: 'Renoteされた自分の投稿を含めるかどうか' + 'ja-JP': 'Renoteされた自分の投稿を含めるかどうか' } }), includeLocalRenotes: $.bool.optional.note({ default: true, desc: { - ja: 'Renoteされたローカルの投稿を含めるかどうか' + 'ja-JP': 'Renoteされたローカルの投稿を含めるかどうか' } }), mediaOnly: $.bool.optional.note({ desc: { - ja: 'true にすると、メディアが添付された投稿だけ取得します' + 'ja-JP': 'true にすると、メディアが添付された投稿だけ取得します' } }), } diff --git a/src/server/api/endpoints/notifications/mark_all_as_read.ts b/src/server/api/endpoints/notifications/mark_all_as_read.ts index a9875ebb01..e2bde777b3 100644 --- a/src/server/api/endpoints/notifications/mark_all_as_read.ts +++ b/src/server/api/endpoints/notifications/mark_all_as_read.ts @@ -4,8 +4,8 @@ import User, { ILocalUser } from '../../../../models/user'; export const meta = { desc: { - ja: '全ての通知を既読にします。', - en: 'Mark all notifications as read.' + 'ja-JP': '全ての通知を既読にします。', + 'en-US': 'Mark all notifications as read.' }, requireCredential: true, diff --git a/src/server/api/endpoints/users/lists/create.ts b/src/server/api/endpoints/users/lists/create.ts index d7dc2a5f70..ac4f957a0d 100644 --- a/src/server/api/endpoints/users/lists/create.ts +++ b/src/server/api/endpoints/users/lists/create.ts @@ -4,8 +4,8 @@ import { ILocalUser } from '../../../../../models/user'; export const meta = { desc: { - ja: 'ユーザーリストを作成します。', - en: 'Create a user list' + 'ja-JP': 'ユーザーリストを作成します。', + 'en-US': 'Create a user list' }, requireCredential: true, diff --git a/src/server/api/endpoints/users/lists/list.ts b/src/server/api/endpoints/users/lists/list.ts index 31fef26bdc..966e1d3ad9 100644 --- a/src/server/api/endpoints/users/lists/list.ts +++ b/src/server/api/endpoints/users/lists/list.ts @@ -3,7 +3,7 @@ import { ILocalUser } from '../../../../../models/user'; export const meta = { desc: { - ja: '自分の作成したユーザーリスト一覧を取得します。' + 'ja-JP': '自分の作成したユーザーリスト一覧を取得します。' }, requireCredential: true, diff --git a/src/server/api/endpoints/users/lists/push.ts b/src/server/api/endpoints/users/lists/push.ts index bd4e201bde..2d68ec7458 100644 --- a/src/server/api/endpoints/users/lists/push.ts +++ b/src/server/api/endpoints/users/lists/push.ts @@ -8,8 +8,8 @@ import { deliver } from '../../../../../queue'; export const meta = { desc: { - ja: '指定したユーザーリストに指定したユーザーを追加します。', - en: 'Add a user to a user list.' + 'ja-JP': '指定したユーザーリストに指定したユーザーを追加します。', + 'en-US': 'Add a user to a user list.' }, requireCredential: true, diff --git a/src/server/api/endpoints/users/lists/show.ts b/src/server/api/endpoints/users/lists/show.ts index 2fd142a609..a2dd00c6e1 100644 --- a/src/server/api/endpoints/users/lists/show.ts +++ b/src/server/api/endpoints/users/lists/show.ts @@ -4,8 +4,8 @@ import { ILocalUser } from '../../../../../models/user'; export const meta = { desc: { - ja: '指定したユーザーリストの情報を取得します。', - en: 'Show a user list.' + 'ja-JP': '指定したユーザーリストの情報を取得します。', + 'en-US': 'Show a user list.' }, requireCredential: true, diff --git a/src/server/api/endpoints/users/recommendation.ts b/src/server/api/endpoints/users/recommendation.ts index 13377e6fff..e0a5cb9e36 100644 --- a/src/server/api/endpoints/users/recommendation.ts +++ b/src/server/api/endpoints/users/recommendation.ts @@ -6,7 +6,7 @@ import Mute from '../../../../models/mute'; export const meta = { desc: { - ja: 'おすすめのユーザー一覧を取得します。' + 'ja-JP': 'おすすめのユーザー一覧を取得します。' }, requireCredential: true, diff --git a/src/server/api/endpoints/users/search.ts b/src/server/api/endpoints/users/search.ts index eda3f95728..307a8f6894 100644 --- a/src/server/api/endpoints/users/search.ts +++ b/src/server/api/endpoints/users/search.ts @@ -5,7 +5,7 @@ import getParams from '../../get-params'; export const meta = { desc: { - ja: 'ユーザーを検索します。' + 'ja-JP': 'ユーザーを検索します。' }, requireCredential: false, @@ -13,28 +13,28 @@ export const meta = { params: { query: $.str.note({ desc: { - ja: 'クエリ' + 'ja-JP': 'クエリ' } }), offset: $.num.optional.min(0).note({ default: 0, desc: { - ja: 'オフセット' + 'ja-JP': 'オフセット' } }), limit: $.num.optional.range(1, 100).note({ default: 10, desc: { - ja: '取得する数' + 'ja-JP': '取得する数' } }), localOnly: $.bool.optional.note({ default: false, desc: { - ja: 'ローカルユーザーのみ検索対象にするか否か' + 'ja-JP': 'ローカルユーザーのみ検索対象にするか否か' } }), }, diff --git a/webpack.config.ts b/webpack.config.ts index 1e295c245d..e520c59a92 100644 --- a/webpack.config.ts +++ b/webpack.config.ts @@ -73,7 +73,8 @@ const consts = { _VERSION_: version, _CODENAME_: codename, _LANG_: '%lang%', - _LANGS_: Object.keys(locales).map(l => [l, locales[l].meta.lang]) + _LANGS_: Object.keys(locales).map(l => [l, locales[l].meta.lang]), + _ENV_: process.env.NODE_ENV }; const _consts: { [ key: string ]: any } = {}; |