1
0
forked from mirror/misskey

Merge branch 'develop'

This commit is contained in:
syuilo 2019-05-14 21:25:24 +09:00
commit 466fe9c368
No known key found for this signature in database
GPG Key ID: BDC4C49D06AB9D69
58 changed files with 780 additions and 206 deletions

View File

@ -4,8 +4,9 @@ executors:
default: default:
working_directory: /tmp/workspace working_directory: /tmp/workspace
docker: docker:
- image: misskey/ci:latest - image: misskey/ci:v11-node11
- image: circleci/redis:latest - image: circleci/redis:latest
- image: circleci/postgres:latest
docker: docker:
working_directory: /tmp/workspace working_directory: /tmp/workspace
docker: docker:

View File

@ -73,12 +73,32 @@ mongodb:
8. master ブランチに戻す 8. master ブランチに戻す
9. enjoy 9. enjoy
11.13.0 (2019/05/14)
--------------------
### 注意
このアップデートを適用した後、プロセスを起動(もしくは再起動)する前に[マイグレーション](#migration)の手順を実行してください
### ✨Improvements
* 利用規約URL、リポジトリURL、フィードバックURLを設定できるように
* 特定のインスタンスのファイルをすべて削除できるように
* _blankで外部リンクされる可能性がある箇所にnoopenerを追加
* ユーザーや外部インスタンスが生成するリンクにnofollowを追加
* リモートのユーザーページやートページにnoindexを追加
* 自分のユーザーメニューにはミュートなどを表示しないように
### 🐛Fixes
* インスタンスブロックを設定できない問題を修正
* ピン留め投稿の表示順がおかしい問題を修正
* 設定の「アップデートを確認」でメッセージが正しく表示されない問題を修正
* FFirefoxで自分のメニューが開けない問題を修正
* Welcomeページのタグクラウドが動かない問題を修正
11.12.0 (2019/05/10) 11.12.0 (2019/05/10)
-------------------- --------------------
### 注意 ### 注意
このアップデートを適用した後、プロセスを起動(もしくは再起動)する前に[マイグレーション](#migration)の手順を実行してください このアップデートを適用した後、プロセスを起動(もしくは再起動)する前に[マイグレーション](#migration)の手順を実行してください
### Improvements ### Improvements
* インスタンス運営者がおすすめアカウントを設定できるように * インスタンス運営者がおすすめアカウントを設定できるように
* MisskeyPagesでNAME環境変数がNULLにならないように * MisskeyPagesでNAME環境変数がNULLにならないように
* MisskeyPagesにNULL環境変数を追加 * MisskeyPagesにNULL環境変数を追加
@ -86,7 +106,7 @@ mongodb:
* MisskeyPagesのテキストのリスト内で変数埋め込みできるように * MisskeyPagesのテキストのリスト内で変数埋め込みできるように
* 自分の指定した投稿のRenoteを全て解除するAPIを追加 * 自分の指定した投稿のRenoteを全て解除するAPIを追加
### Fixes ### 🐛Fixes
* Noteをpull取得した時にhost名がvalidateされていない問題を修正 * Noteをpull取得した時にhost名がvalidateされていない問題を修正
* みつけるで人気のタグが表示されない問題を修正 * みつけるで人気のタグが表示されない問題を修正
@ -95,7 +115,7 @@ mongodb:
11.11.2 (2019/05/07) 11.11.2 (2019/05/07)
-------------------- --------------------
### Fixes ### 🐛Fixes
* IPv4 onlyホストからDualstackホストにAP deliverできない問題を修正 * IPv4 onlyホストからDualstackホストにAP deliverできない問題を修正
* ストリーミングに接続するまでラグがある問題を修正 * ストリーミングに接続するまでラグがある問題を修正
* 2段階認証のコードが0から始まる時正しく入力できない問題を修正 * 2段階認証のコードが0から始まる時正しく入力できない問題を修正
@ -106,24 +126,24 @@ mongodb:
11.11.1 (2019/05/05) 11.11.1 (2019/05/05)
-------------------- --------------------
### Fixes ### 🐛Fixes
* MisskeyPagesのリストから選択関数が使えない問題を修正 * MisskeyPagesのリストから選択関数が使えない問題を修正
11.11.0 (2019/05/05) 11.11.0 (2019/05/05)
-------------------- --------------------
### Improvements ### Improvements
* MisskeyPagesにリストから選択関数を追加 * MisskeyPagesにリストから選択関数を追加
* MisskeyPagesに確率を指定できるテキストランダム選択関数を追加 * MisskeyPagesに確率を指定できるテキストランダム選択関数を追加
* 外部サービス連携ログインリンクにアイコン追加 * 外部サービス連携ログインリンクにアイコン追加
### Fixes ### 🐛Fixes
* MisskeyPagesでifを入れ子にできなくなっていた問題を修正 * MisskeyPagesでifを入れ子にできなくなっていた問題を修正
* MisskeyPagesで数値入力を作成するとテキスト入力になる問題を修正 * MisskeyPagesで数値入力を作成するとテキスト入力になる問題を修正
* 外部サービス連携に関する問題を修正 * 外部サービス連携に関する問題を修正
11.10.1 (2019/05/04) 11.10.1 (2019/05/04)
-------------------- --------------------
### Fixes ### 🐛Fixes
* MisskeyPagesでページブロックを削除できなくなっていた問題を修正 * MisskeyPagesでページブロックを削除できなくなっていた問題を修正
### その他 ### その他
@ -134,13 +154,13 @@ mongodb:
### 注意 ### 注意
このアップデートを適用した後、プロセスを起動(もしくは再起動)する前に[マイグレーション](#migration)の手順を実行してください このアップデートを適用した後、プロセスを起動(もしくは再起動)する前に[マイグレーション](#migration)の手順を実行してください
### Improvements ### Improvements
* MisskeyPagesに割った余りを求める関数を追加 * MisskeyPagesに割った余りを求める関数を追加
* Mastodon v2.8.0 のフォローリストをインポートできるように * Mastodon v2.8.0 のフォローリストをインポートできるように
* エクスポートリクエストに失敗したらエラーを表示するように * エクスポートリクエストに失敗したらエラーを表示するように
* エクスポートファイルでは同一ハッシュチェックをしないように * エクスポートファイルでは同一ハッシュチェックをしないように
### Fixes ### 🐛Fixes
* 2段階認証を設定するとログインできなくなる問題を修正 * 2段階認証を設定するとログインできなくなる問題を修正
* ファイルをアップロードできないことがある問題を修正 * ファイルをアップロードできないことがある問題を修正
* リモートファイルをキャッシュしない設定だとサムネイル時にオリジナル画像が表示されない問題を修正 * リモートファイルをキャッシュしない設定だとサムネイル時にオリジナル画像が表示されない問題を修正
@ -148,13 +168,13 @@ mongodb:
11.9.0 (2019/05/02) 11.9.0 (2019/05/02)
------------------- -------------------
### Improvements ### Improvements
* MisskeyPagesで編集時にページブロックをドラッグで並べ替えられるように * MisskeyPagesで編集時にページブロックをドラッグで並べ替えられるように
* MisskeyPagesにカウンターボタンブロックを追加 * MisskeyPagesにカウンターボタンブロックを追加
11.8.1 (2019/05/02) 11.8.1 (2019/05/02)
------------------- -------------------
### Fixes ### 🐛Fixes
* リモートファイルをキャッシュしないオプション有効時にファイルが作成できない問題を修正 * リモートファイルをキャッシュしないオプション有効時にファイルが作成できない問題を修正
11.8.0-2 (2019/05/01) 11.8.0-2 (2019/05/01)
@ -163,20 +183,20 @@ mongodb:
11.8.0 (2019/05/01) 11.8.0 (2019/05/01)
------------------- -------------------
### Improvements ### Improvements
* MisskeyPagesで関数を作成できるように * MisskeyPagesで関数を作成できるように
* MisskeyPagesでソースを表示できるように * MisskeyPagesでソースを表示できるように
* MisskeyPagesにシードを与えるランダム関数を追加 * MisskeyPagesにシードを与えるランダム関数を追加
* MisskeyPagesに複数行テキストをテキストのリストに変換する関数を追加 * MisskeyPagesに複数行テキストをテキストのリストに変換する関数を追加
### Fixes ### 🐛Fixes
* APIドキュメントが見れなくなっていたのを修正 * APIドキュメントが見れなくなっていたのを修正
* mention (あなた宛て) streaming にミュートが効かない問題を修正 * mention (あなた宛て) streaming にミュートが効かない問題を修正
* デザインの調整 * デザインの調整
11.7.0 (2019/04/30) 11.7.0 (2019/04/30)
------------------- -------------------
### Improvements ### Improvements
* MisskeyPagesに ifブロック を追加 * MisskeyPagesに ifブロック を追加
* MisskeyPagesに テキストエリア を追加 * MisskeyPagesに テキストエリア を追加
* MisskeyPagesに 複数行テキスト入力 を追加 * MisskeyPagesに 複数行テキスト入力 を追加
@ -185,23 +205,23 @@ mongodb:
* MisskeyPagesに 環境変数 URL を追加 * MisskeyPagesに 環境変数 URL を追加
* MisskeyPagesでボタンやスイッチなどのテキストに変数使えるように * MisskeyPagesでボタンやスイッチなどのテキストに変数使えるように
### Fixes ### 🐛Fixes
* OGPのサイト名を修正 * OGPのサイト名を修正
* デザインの調整 * デザインの調整
11.6.0 (2019/04/29) 11.6.0 (2019/04/29)
------------------- -------------------
### Improvements ### Improvements
* AiScriptにいくつかの文字列操作関数を追加 * AiScriptにいくつかの文字列操作関数を追加
* ページ編集画面にページへのリンクを表示するように * ページ編集画面にページへのリンクを表示するように
### Fixes ### 🐛Fixes
* MisskeyPagesで数値入力が文字列として扱われる問題を修正 * MisskeyPagesで数値入力が文字列として扱われる問題を修正
* デザインの調整 * デザインの調整
11.5.1 (2019/04/29) 11.5.1 (2019/04/29)
------------------- -------------------
### Fixes ### 🐛Fixes
* MisskeyPagesで環境変数を別の変数内で使えない問題を修正 * MisskeyPagesで環境変数を別の変数内で使えない問題を修正
* MisskeyPagesで値が0の変数が表示されない問題を修正 * MisskeyPagesで値が0の変数が表示されない問題を修正
@ -227,21 +247,21 @@ mongodb:
ページを気に入ったら「いいね」しよう (coming soon) ページを気に入ったら「いいね」しよう (coming soon)
### Improvements ### Improvements
* APIコンソールでパラメータテンプレートを表示するように * APIコンソールでパラメータテンプレートを表示するように
### Fixes ### 🐛Fixes
* おすすめユーザーに自分自身が含まれる問題を修正 * おすすめユーザーに自分自身が含まれる問題を修正
* ユーザーサジェストで表示名が変わらない問題を修正 * ユーザーサジェストで表示名が変わらない問題を修正
11.4.0 (2019/04/25) 11.4.0 (2019/04/25)
------------------- -------------------
### Improvements ### Improvements
* 検索でローカルの投稿のみに絞れるように * 検索でローカルの投稿のみに絞れるように
* 検索で特定のインスタンスの投稿のみに絞れるように * 検索で特定のインスタンスの投稿のみに絞れるように
* 検索で特定のユーザーの投稿のみに絞れるように * 検索で特定のユーザーの投稿のみに絞れるように
### Fixes ### 🐛Fixes
* 投稿が増殖する問題を修正 * 投稿が増殖する問題を修正
* ストリームで過去の投稿が流れてくる問題を修正 * ストリームで過去の投稿が流れてくる問題を修正
* モバイル版のユーザーページで遷移してもユーザー名が変わらない問題を修正 * モバイル版のユーザーページで遷移してもユーザー名が変わらない問題を修正
@ -249,43 +269,43 @@ mongodb:
11.3.1 (2019/04/24) 11.3.1 (2019/04/24)
------------------- -------------------
### Fixes ### 🐛Fixes
* Webからファイルがアップロードできない問題を修正 * Webからファイルがアップロードできない問題を修正
11.3.0 (2019/04/24) 11.3.0 (2019/04/24)
------------------- -------------------
### Improvements ### Improvements
* お知らせにMFMを使えるように * お知らせにMFMを使えるように
* お知らせに画像を添付できるように * お知らせに画像を添付できるように
### Fixes ### 🐛Fixes
* 投稿のタグ検索APIで大文字小文字が区別されていたのを修正 * 投稿のタグ検索APIで大文字小文字が区別されていたのを修正
* 公開範囲がホームの投稿がグローバルTLに流れる問題を修正 * 公開範囲がホームの投稿がグローバルTLに流れる問題を修正
* モバイルビューの投稿詳細にて acct が長いとアイコンが圧迫面接される問題を修正 * モバイルビューの投稿詳細にて acct が長いとアイコンが圧迫面接される問題を修正
11.2.2 (2019/04/22) 11.2.2 (2019/04/22)
------------------- -------------------
### Fixes ### 🐛Fixes
* 2段階認証を有効にするとログインできない問題を修正 * 2段階認証を有効にするとログインできない問題を修正
* リモートユーザーの修復処理が自動的に実行されない問題を修正 * リモートユーザーの修復処理が自動的に実行されない問題を修正
* リモートユーザー情報が更新されない問題を修正 * リモートユーザー情報が更新されない問題を修正
11.2.1 (2019/04/21) 11.2.1 (2019/04/21)
------------------- -------------------
### Fixes ### 🐛Fixes
* MEIDが25桁になっているのを修正 * MEIDが25桁になっているのを修正
* リモートユーザー情報が更新されない問題を修正 * リモートユーザー情報が更新されない問題を修正
11.2.0 (2019/04/18) 11.2.0 (2019/04/18)
------------------- -------------------
### Improvements ### Improvements
* 検索で日付(日時)を入力するとタイムラインをその時点まで遡るように * 検索で日付(日時)を入力するとタイムラインをその時点まで遡るように
* APIコンソールでエンドポイントをサジェストするように * APIコンソールでエンドポイントをサジェストするように
* モバイル版でドライブのメニューを使いやすく * モバイル版でドライブのメニューを使いやすく
* サイレンス時に確認を表示するように * サイレンス時に確認を表示するように
* ユーザーメニューでブロックなどの操作を行う時に確認するように * ユーザーメニューでブロックなどの操作を行う時に確認するように
### Fixes ### 🐛Fixes
* アプリケーション連携画面でパーミッションが表示されない問題を修正 * アプリケーション連携画面でパーミッションが表示されない問題を修正
* アンケートウィジットでもMFMを使用するように * アンケートウィジットでもMFMを使用するように
* フォローしてないユーザーのホーム投稿がSTLに流れてくる問題を修正 * フォローしてないユーザーのホーム投稿がSTLに流れてくる問題を修正
@ -294,7 +314,7 @@ mongodb:
11.1.6 (2019/04/18) 11.1.6 (2019/04/18)
------------------- -------------------
### Fixes ### 🐛Fixes
* 未認知ユーザーからActivityが飛んできた場合に処理できない問題を修正 * 未認知ユーザーからActivityが飛んできた場合に処理できない問題を修正
* その投稿を見たのにも関わらずメンションインジケーターが点灯し続ける問題を修正 * その投稿を見たのにも関わらずメンションインジケーターが点灯し続ける問題を修正
* ハッシュタグの判定を改善 * ハッシュタグの判定を改善
@ -302,14 +322,14 @@ mongodb:
11.1.5 (2019/04/17) 11.1.5 (2019/04/17)
------------------- -------------------
### Fixes ### 🐛Fixes
* ユーザー名に含まれているカスタム絵文字が表示されないことがある問題を修正 * ユーザー名に含まれているカスタム絵文字が表示されないことがある問題を修正
* 壁紙の設定ができない問題を修正 * 壁紙の設定ができない問題を修正
* デザインの調整 * デザインの調整
11.1.4 (2019/04/17) 11.1.4 (2019/04/17)
------------------- -------------------
### Fixes ### 🐛Fixes
* タイムライン取得時に削除されたファイルを添付している投稿が含まれているとサーバーでエラーになる問題を修正 * タイムライン取得時に削除されたファイルを添付している投稿が含まれているとサーバーでエラーになる問題を修正
* 管理画面のインスタンスメニューで変更前の設定が読み込まれないことがある問題を修正 * 管理画面のインスタンスメニューで変更前の設定が読み込まれないことがある問題を修正
* 猫ではないのに猫のままで表示される問題を修正 * 猫ではないのに猫のままで表示される問題を修正
@ -319,12 +339,12 @@ mongodb:
11.1.3 (2019/04/16) 11.1.3 (2019/04/16)
------------------- -------------------
### Fixes ### 🐛Fixes
* アプリからAPIにリクエストするときにランダムなユーザーがリクエストしたことになる問題を修正 * アプリからAPIにリクエストするときにランダムなユーザーがリクエストしたことになる問題を修正
11.1.2 (2019/04/15) 11.1.2 (2019/04/15)
------------------- -------------------
### Fixes ### 🐛Fixes
* 画像描画の依存関係を変更 * 画像描画の依存関係を変更
* リモートユーザーのファイルを削除するときに古い方からではなく新しい方から削除されるのを修正 * リモートユーザーのファイルを削除するときに古い方からではなく新しい方から削除されるのを修正
* リアクションしてないのにリアクションしたことになる問題を修正 * リアクションしてないのにリアクションしたことになる問題を修正
@ -332,25 +352,25 @@ mongodb:
11.1.1 (2019/04/15) 11.1.1 (2019/04/15)
------------------- -------------------
### Fixes ### 🐛Fixes
* Metaタグの application-name を Misskey で固定するように修正 * Metaタグの application-name を Misskey で固定するように修正
* トークメッセージが既読にならない問題を修正 * トークメッセージが既読にならない問題を修正
* デフォルトでHTLを表示するように * デフォルトでHTLを表示するように
11.1.0 (2019/04/15) 11.1.0 (2019/04/15)
------------------- -------------------
### Improvements ### Improvements
* アイコン未設定時にランダムな画像を表示するように * アイコン未設定時にランダムな画像を表示するように
* 管理者やモデレーターはレートリミット無効に * 管理者やモデレーターはレートリミット無効に
### Fixes ### 🐛Fixes
* メンションの「あなた」インジケーターが表示されない問題を修正 * メンションの「あなた」インジケーターが表示されない問題を修正
* ブロックAPIでエラーが発生する問題を修正 * ブロックAPIでエラーが発生する問題を修正
* プッシュ通知の購読に失敗する問題を修正 * プッシュ通知の購読に失敗する問題を修正
11.0.3 (2019/04/15) 11.0.3 (2019/04/15)
------------------- -------------------
### Fixes ### 🐛Fixes
* ハッシュタグ検索APIが動作しない問題を修正 * ハッシュタグ検索APIが動作しない問題を修正
* モデレーターなのにアカウントメニューに「管理」が表示されない問題を修正 * モデレーターなのにアカウントメニューに「管理」が表示されない問題を修正
* プッシュ通知の購読に失敗する問題を修正 * プッシュ通知の購読に失敗する問題を修正
@ -358,7 +378,7 @@ mongodb:
11.0.2 (2019/04/15) 11.0.2 (2019/04/15)
------------------- -------------------
### Fixes ### 🐛Fixes
* アプリが作成できない問題を修正 * アプリが作成できない問題を修正
* 「ハイライト」が表示されない問題を修正 * 「ハイライト」が表示されない問題を修正
* リモートの投稿に添付されている画像が小さい問題を修正 * リモートの投稿に添付されている画像が小さい問題を修正
@ -367,19 +387,19 @@ mongodb:
11.0.1 (2019/04/15) 11.0.1 (2019/04/15)
------------------- -------------------
### Improvements ### Improvements
* 不要な依存関係を削除 * 不要な依存関係を削除
11.0.0 daybreak (2019/04/14) 11.0.0 daybreak (2019/04/14)
---------------------------- ----------------------------
### Improvements ### Improvements
* **データベースがMongoDBからPostgreSQLに変更されました** * **データベースがMongoDBからPostgreSQLに変更されました**
* **Redisが必須に** * **Redisが必須に**
* アカウントを完全に削除できるように * アカウントを完全に削除できるように
* 投稿フォームで添付ファイルの閲覧注意を確認/設定できるように * 投稿フォームで添付ファイルの閲覧注意を確認/設定できるように
* ミュート/ブロック時にそのユーザーの投稿のウォッチをすべて解除するように * ミュート/ブロック時にそのユーザーの投稿のウォッチをすべて解除するように
### Fixes ### 🐛Fixes
* フォロー申請数が実際より1すくなくなる問題を修正 * フォロー申請数が実際より1すくなくなる問題を修正
* リストからアカウント削除したユーザーを削除できない問題を修正 * リストからアカウント削除したユーザーを削除できない問題を修正
* リストTLでフォローしていないユーザーの非公開投稿が流れる問題を修正 * リストTLでフォローしていないユーザーの非公開投稿が流れる問題を修正

View File

@ -197,3 +197,13 @@ const user = await Users.findOne(userId).then(ensure);
// } // }
// の糖衣構文のような扱いです // の糖衣構文のような扱いです
``` ```
### Migration作成方法
コードの変更をした後、`ormconfig.json`書き方はCONTRIBUTING.mdを参照を用意し、
```
npm i -g ts-node
ts-node ./node_modules/typeorm/cli.js migration:generate -n 変更の名前
```
作成されたスクリプトは不必要な変更を含むため除去してください。

View File

@ -147,6 +147,7 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/16900731/83884b38afc74d4cbe83c30a13b10edd/1.png?token-time=2145916800&token-hash=R5Tog8RWg0rguRoCIoir3lThokrdPvs8Utfikhc0nhY%3D" alt="Atsuko Tominaga" width="100"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/16900731/83884b38afc74d4cbe83c30a13b10edd/1.png?token-time=2145916800&token-hash=R5Tog8RWg0rguRoCIoir3lThokrdPvs8Utfikhc0nhY%3D" alt="Atsuko Tominaga" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/4389829/9f709180ac714651a70f74a82f3ffdb9/3.png?token-time=2145916800&token-hash=FTm3WVom4dJ9NwWMU4OpCL_8Yc13WiwEbKrDPyTZTPs%3D" alt="natalie" width="100"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/4389829/9f709180ac714651a70f74a82f3ffdb9/3.png?token-time=2145916800&token-hash=FTm3WVom4dJ9NwWMU4OpCL_8Yc13WiwEbKrDPyTZTPs%3D" alt="natalie" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13034746/c711c7f58e204ecfbc2fd646bc8a4eee/1.jpe?token-time=2145916800&token-hash=EWxXhVbZYH7KB4IDT3joc8TbIg8zPO40x1r5IDn3R7c%3D" alt="Hiratake" width="100"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13034746/c711c7f58e204ecfbc2fd646bc8a4eee/1.jpe?token-time=2145916800&token-hash=EWxXhVbZYH7KB4IDT3joc8TbIg8zPO40x1r5IDn3R7c%3D" alt="Hiratake" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5923936/2a743cbfbff946c2af3f09026047c0da/2.png?token-time=2145916800&token-hash=h6yphW1qnM0n_NOWaf8qtszMRLXEwIxfk5beu4RxdT0%3D" alt="noellabo" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/2384390/5681180e1efb46a8b28e0e8d4c8b9037/1.jpg?token-time=2145916800&token-hash=SJcMy-Q1BcS940-LFUVOMfR7-5SgrzsEQGhYb3yowFk%3D" alt="CG" width="100"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/2384390/5681180e1efb46a8b28e0e8d4c8b9037/1.jpg?token-time=2145916800&token-hash=SJcMy-Q1BcS940-LFUVOMfR7-5SgrzsEQGhYb3yowFk%3D" alt="CG" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/18072312/98e894d960314fa7bc236a72a39488fe/1.jpe?token-time=2145916800&token-hash=qA8j97lIZNc-74AuZ0p4F3ms6sKPeKjtNt2vEuwpsyo%3D" alt="Hekovic" width="100"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/18072312/98e894d960314fa7bc236a72a39488fe/1.jpe?token-time=2145916800&token-hash=qA8j97lIZNc-74AuZ0p4F3ms6sKPeKjtNt2vEuwpsyo%3D" alt="Hekovic" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/4503830/ccf2cc867ea64de0b524bb2e24b9a1cb/1.jpeg?token-time=2145916800&token-hash=L55UhJ0rcuNAH3w_ryeeGN4hC6taoOixyAhraEi0bzw%3D" alt="dansup" width="100"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/4503830/ccf2cc867ea64de0b524bb2e24b9a1cb/1.jpeg?token-time=2145916800&token-hash=L55UhJ0rcuNAH3w_ryeeGN4hC6taoOixyAhraEi0bzw%3D" alt="dansup" width="100"></td>
@ -157,6 +158,7 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
<td><a href="https://www.patreon.com/user?u=16900731">Atsuko Tominaga</a></td> <td><a href="https://www.patreon.com/user?u=16900731">Atsuko Tominaga</a></td>
<td><a href="https://www.patreon.com/user?u=4389829">natalie</a></td> <td><a href="https://www.patreon.com/user?u=4389829">natalie</a></td>
<td><a href="https://www.patreon.com/hiratake">Hiratake</a></td> <td><a href="https://www.patreon.com/hiratake">Hiratake</a></td>
<td><a href="https://www.patreon.com/noellabo">noellabo</a></td>
<td><a href="https://www.patreon.com/Corset">CG</a></td> <td><a href="https://www.patreon.com/Corset">CG</a></td>
<td><a href="https://www.patreon.com/hekovic">Hekovic</a></td> <td><a href="https://www.patreon.com/hekovic">Hekovic</a></td>
<td><a href="https://www.patreon.com/dansup">dansup</a></td> <td><a href="https://www.patreon.com/dansup">dansup</a></td>
@ -171,7 +173,7 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
<td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td> <td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td>
</tr></table> </tr></table>
**Last updated:** Tue, 07 May 2019 11:55:07 UTC **Last updated:** Mon, 13 May 2019 06:13:06 UTC
<!-- PATREON_END --> <!-- PATREON_END -->
:four_leaf_clover: Copyright :four_leaf_clover: Copyright

View File

@ -249,7 +249,6 @@ common:
update-available-title: "Aktualizace k dispozici" update-available-title: "Aktualizace k dispozici"
update-available: "Je k dispozici nová verze Misskey ({newer},vaše verze je {current}). Pro aplikování nové verze znovunačtěte stránku." update-available: "Je k dispozici nová verze Misskey ({newer},vaše verze je {current}). Pro aplikování nové verze znovunačtěte stránku."
my-token-regenerated: "Váš token byl regenerován, proto budete odhlášen/a." my-token-regenerated: "Váš token byl regenerován, proto budete odhlášen/a."
verified-user: "Ověřené účty"
hide-password: "Skrýt heslo" hide-password: "Skrýt heslo"
show-password: "Zobrazit heslo" show-password: "Zobrazit heslo"
do-not-use-in-production: "Tohle je vývojářský build. Nepoužívejte v produkci." do-not-use-in-production: "Tohle je vývojářský build. Nepoužívejte v produkci."
@ -312,7 +311,6 @@ auth/views/index.vue:
error: "Taková relace neexistuje." error: "Taková relace neexistuje."
sign-in: "Prosím přihlaste se." sign-in: "Prosím přihlaste se."
common/views/pages/explore.vue: common/views/pages/explore.vue:
verified-users: "Ověřené účty"
popular-users: "Populární uživatelé" popular-users: "Populární uživatelé"
recently-updated-users: "Nedávno aktívni uživatelé" recently-updated-users: "Nedávno aktívni uživatelé"
recently-registered-users: "Nedávno registrovaní uživatelé" recently-registered-users: "Nedávno registrovaní uživatelé"
@ -924,7 +922,6 @@ admin/views/instance.vue:
invite: "Pozvat" invite: "Pozvat"
save: "Uložit" save: "Uložit"
saved: "Uloženo" saved: "Uloženo"
user-recommendation-config: "Doporučení uživatelé"
email: "Emailová adresa" email: "Emailová adresa"
smtp-port: "SMTP Port" smtp-port: "SMTP Port"
smtp-auth: "Provést SMTP autentikaci" smtp-auth: "Provést SMTP autentikaci"
@ -976,12 +973,6 @@ admin/views/users.vue:
reset-password: "Resetovat heslo" reset-password: "Resetovat heslo"
reset-password-confirm: "Opravdu chcete resetovat Vaše heslo?" reset-password-confirm: "Opravdu chcete resetovat Vaše heslo?"
password-updated: "Heslo je nyní \"{password}\"" password-updated: "Heslo je nyní \"{password}\""
verify: "Ověřit účet"
verify-confirm: "Chcete aby toto byl ověřený účet?"
verified: "Účet se nyní ověřuje"
unverify: "Zrušit ověření účtu"
unverify-confirm: "Opravdu chcete zrušit designaci \"ověřený účet\"?"
unverified: "Ruší se potvrzení účtu"
update-remote-user: "Aktualizovat informace o vzdáleném účtu" update-remote-user: "Aktualizovat informace o vzdáleném účtu"
users: users:
title: "Uživatel" title: "Uživatel"
@ -989,7 +980,6 @@ admin/views/users.vue:
all: "Všechny" all: "Všechny"
moderator: "Moderátor" moderator: "Moderátor"
adminOrModerator: "Admin/Moderátor" adminOrModerator: "Admin/Moderátor"
verified: "Ověřený účet"
origin: origin:
title: "Původ" title: "Původ"
combined: "Lokální + Vzdálené" combined: "Lokální + Vzdálené"
@ -1054,6 +1044,7 @@ admin/views/federation.vue:
chart-spans: chart-spans:
hour: "za hodinu" hour: "za hodinu"
day: "za den" day: "za den"
blocked-hosts: "Blokován"
desktop/views/pages/welcome.vue: desktop/views/pages/welcome.vue:
about: "O Misskey" about: "O Misskey"
timeline: "Časová osa" timeline: "Časová osa"

View File

@ -153,7 +153,6 @@ common:
update-available-title: "Aktualisierung verfügbar" update-available-title: "Aktualisierung verfügbar"
update-available: "Eine neue Version von Misskey ist verfügbar ({newer}, aktuell ist {current}). Lade die Seite neu um die aktuelle Version zu laden" update-available: "Eine neue Version von Misskey ist verfügbar ({newer}, aktuell ist {current}). Lade die Seite neu um die aktuelle Version zu laden"
my-token-regenerated: "Dein Token wurde generiert. Du wirst jetzt abgemeldet." my-token-regenerated: "Dein Token wurde generiert. Du wirst jetzt abgemeldet."
verified-user: "Verifizierter Benutzer"
do-not-use-in-production: "Dies ist eine Entwicklungsversion. Nicht in einer Produktivumgebung verwenden." do-not-use-in-production: "Dies ist eine Entwicklungsversion. Nicht in einer Produktivumgebung verwenden."
error: error:
retry: "Erneut versuchen" retry: "Erneut versuchen"
@ -199,8 +198,6 @@ auth/views/index.vue:
please-go-back: "Bitte gehe zurück zur Anwendung." please-go-back: "Bitte gehe zurück zur Anwendung."
error: "Sitzung ist nicht vorhanden." error: "Sitzung ist nicht vorhanden."
sign-in: "Bitte melde dich an." sign-in: "Bitte melde dich an."
common/views/pages/explore.vue:
verified-users: "Verifizierter Benutzer"
common/views/components/games/reversi/reversi.vue: common/views/components/games/reversi/reversi.vue:
matching: matching:
waiting-for: "Warten auf {}" waiting-for: "Warten auf {}"
@ -605,8 +602,6 @@ admin/views/drive.vue:
delete: "Löschen" delete: "Löschen"
admin/views/users.vue: admin/views/users.vue:
users: users:
state:
verified: "Verifizierter Benutzer"
origin: origin:
local: "Lokal" local: "Lokal"
admin/views/emoji.vue: admin/views/emoji.vue:

View File

@ -251,7 +251,6 @@ common:
update-available-title: "Update available" update-available-title: "Update available"
update-available: "A new version of Misskey is now available({newer}, the current version is {current}). Reload the page to apply updates." update-available: "A new version of Misskey is now available({newer}, the current version is {current}). Reload the page to apply updates."
my-token-regenerated: "Your token has been regenerated, so you will be signed out." my-token-regenerated: "Your token has been regenerated, so you will be signed out."
verified-user: "Verified account"
hide-password: "Hide Password" hide-password: "Hide Password"
show-password: "Show Password" show-password: "Show Password"
do-not-use-in-production: "This is a development build. Do not use in production." do-not-use-in-production: "This is a development build. Do not use in production."
@ -319,7 +318,7 @@ auth/views/index.vue:
error: "Session does not exist." error: "Session does not exist."
sign-in: "Please sign in." sign-in: "Please sign in."
common/views/pages/explore.vue: common/views/pages/explore.vue:
verified-users: "Official accounts" pinned-users: "Higlighted users"
popular-users: "Popular users" popular-users: "Popular users"
recently-updated-users: "Recently active users" recently-updated-users: "Recently active users"
recently-registered-users: "Users who joined recently" recently-registered-users: "Users who joined recently"
@ -1139,7 +1138,7 @@ admin/views/instance.vue:
invite: "Invite" invite: "Invite"
save: "Save" save: "Save"
saved: "Saved" saved: "Saved"
user-recommendation-config: "Recommended users" pinned-users: "Higlighted user"
email-config: "Email server settings" email-config: "Email server settings"
email-config-info: "Used to confirm email and password reset etc." email-config-info: "Used to confirm email and password reset etc."
enable-email: "Enable email delivery" enable-email: "Enable email delivery"
@ -1223,12 +1222,6 @@ admin/views/users.vue:
silence-confirm: "Silence user?" silence-confirm: "Silence user?"
unmake-silence: "Unsilence" unmake-silence: "Unsilence"
unsilence-confirm: "Are you certain that you want to stop silencing this user?" unsilence-confirm: "Are you certain that you want to stop silencing this user?"
verify: "Verify account"
verify-confirm: "Do you want this to be a verified account?"
verified: "The account is now being verified"
unverify: "Unverify account"
unverify-confirm: "Do you want to remove the 'verified account' designation?"
unverified: "The account is now being unverified"
update-remote-user: "Update information about remote user" update-remote-user: "Update information about remote user"
remote-user-updated: "The information regarding the remote user has been updated." remote-user-updated: "The information regarding the remote user has been updated."
users: users:
@ -1245,7 +1238,6 @@ admin/views/users.vue:
admin: "Administrator" admin: "Administrator"
moderator: "Moderator" moderator: "Moderator"
adminOrModerator: "Admin/Moderator" adminOrModerator: "Admin/Moderator"
verified: "Verified account"
silenced: "Already silenced" silenced: "Already silenced"
suspended: "Suspended" suspended: "Suspended"
origin: origin:
@ -1353,6 +1345,7 @@ admin/views/federation.vue:
chart-spans: chart-spans:
hour: "Hourly" hour: "Hourly"
day: "Daily" day: "Daily"
blocked-hosts: "Blocking"
desktop/views/pages/welcome.vue: desktop/views/pages/welcome.vue:
about: "More details..." about: "More details..."
timeline: "Timeline" timeline: "Timeline"

View File

@ -12,7 +12,9 @@ common:
rich-contents: "Posts" rich-contents: "Posts"
rich-contents-desc: "Escribe sobre tus pensamientos, eventos, todo lo que quieras compartir. Si es necesario, puedes usar varias sintaxis, decorar tus posts y añadir tus imágenes favoritas, archivos de viddeo y encuestas." rich-contents-desc: "Escribe sobre tus pensamientos, eventos, todo lo que quieras compartir. Si es necesario, puedes usar varias sintaxis, decorar tus posts y añadir tus imágenes favoritas, archivos de viddeo y encuestas."
reaction: "Reacciones" reaction: "Reacciones"
reaction-desc: "La forma mas facil de expresar tus emociones. Misskey te permite añadir varios tipos de reacciones a los posts de otros usuarios. La emperiencia emocional en Misskey nunca será igual que en otra red social, donde solo puedes poner \"likes\"."
ui: "Interfaz" ui: "Interfaz"
ui-desc: "No hay ninguna interfaz que le vaya bien a todos. Por eso, Misskey tiene una interfaz altamente personalizable para tus gustos. Puedes hacer tu página principal única editando la interfaz de tu timeline y moviendo varios widgets para conseguir hacer de este lugar uno propio."
drive: "Drive" drive: "Drive"
adblock: adblock:
detected: "Por favor, desactive el bloqueador de publicidad." detected: "Por favor, desactive el bloqueador de publicidad."
@ -55,6 +57,7 @@ common:
month-and-day: "{day} de {month}" month-and-day: "{day} de {month}"
trash: "Papelera" trash: "Papelera"
drive: "Drive" drive: "Drive"
pages: "Páginas"
messaging: "Conversación" messaging: "Conversación"
home: "Inicio" home: "Inicio"
deck: "Deck" deck: "Deck"
@ -70,8 +73,12 @@ common:
"write:blocks": "Editar bloques" "write:blocks": "Editar bloques"
"read:favorites": "Ver favoritos" "read:favorites": "Ver favoritos"
"write:favorites": "Editar favoritos" "write:favorites": "Editar favoritos"
"read:following": "Ver información de seguidor"
"read:messaging": "Ver conversación" "read:messaging": "Ver conversación"
"read:mutes": "Ver silenciados"
"write:notes": "Crear y eliminar articulos"
"read:notifications": "Ver notificaciones" "read:notifications": "Ver notificaciones"
"read:reactions": "Ver reacciones"
"write:votes": "Vota" "write:votes": "Vota"
weekday-short: weekday-short:
sunday: "domingo" sunday: "domingo"
@ -136,8 +143,11 @@ common:
default-note-visibility: "Rango de publicación predeterminado" default-note-visibility: "Rango de publicación predeterminado"
web-search-engine: "Buscador web" web-search-engine: "Buscador web"
web-search-engine-desc: "Ejemplo: https://www.google.com/?#q={{query}}" web-search-engine-desc: "Ejemplo: https://www.google.com/?#q={{query}}"
this-setting-is-this-device-only: "Solo para este dispositivo"
use-os-default-emojis: "Usar los emoticonos estándar del sistema operativo" use-os-default-emojis: "Usar los emoticonos estándar del sistema operativo"
line-width: "Grosor de línea" line-width: "Grosor de línea"
line-width-thin: "Fino"
line-width-normal: "Normal"
line-width-thick: "Grosor" line-width-thick: "Grosor"
font-size: "Tamaño del texto" font-size: "Tamaño del texto"
font-size-x-small: "Muy pequeño" font-size-x-small: "Muy pequeño"
@ -162,13 +172,20 @@ common:
wallpaper: "Fondo de pantalla" wallpaper: "Fondo de pantalla"
choose-wallpaper: "Escoge un fondo de pantalla" choose-wallpaper: "Escoge un fondo de pantalla"
delete-wallpaper: "Quitar fondo de pantalla" delete-wallpaper: "Quitar fondo de pantalla"
post-form-on-timeline: "Mostrar el formulario de las entradas encima de la línea de tiempo"
show-clock-on-header: "Muestra el reloj en la parte superior derecha" show-clock-on-header: "Muestra el reloj en la parte superior derecha"
show-reply-target: "Mostrar destinatario de la mención"
timeline: "Timeline" timeline: "Timeline"
show-my-renotes: "Mostrar mis renotes en la timeline"
show-renoted-my-notes: "Mostrar renotes de mis posts en la timeline"
sound: "Sonido" sound: "Sonido"
enable-sounds: "Habilitar sonido" enable-sounds: "Habilitar sonido"
volume: "Volúmen" volume: "Volúmen"
test: "Prueba" test: "Prueba"
update: "Actualizar Misskey"
version: "Versión" version: "Versión"
latest-version: "Última versión"
update-checking: "Buscando actualizaciones"
no-updates: "No hay actualizaciones disponibles" no-updates: "No hay actualizaciones disponibles"
no-updates-desc: "Tu Misskey está actualizado" no-updates-desc: "Tu Misskey está actualizado"
update-available: "¡Una nueva versión está disponible!" update-available: "¡Una nueva versión está disponible!"
@ -178,18 +195,36 @@ common:
search: "Buscar" search: "Buscar"
delete: "eliminar" delete: "eliminar"
loading: "cargando" loading: "cargando"
ok: "Confirmar"
cancel: "Cancelar"
update-available-title: "Actualización disponible" update-available-title: "Actualización disponible"
update-available: "Hay disponible una nueva versión de Misskey ({newer}, la versión actual es {current}). Refresca la página para aplicar las actualizaciones." update-available: "Hay disponible una nueva versión de Misskey ({newer}, la versión actual es {current}). Refresca la página para aplicar las actualizaciones."
my-token-regenerated: "Tu token se ha regenerado vas a ser desconectado." my-token-regenerated: "Tu token se ha regenerado vas a ser desconectado."
verified-user: "Cuenta verificada" hide-password: "Ocultar contraseña"
show-password: "Mostrar contraseña"
do-not-use-in-production: "Esto está en desarrollo, no usarlo para producción." do-not-use-in-production: "Esto está en desarrollo, no usarlo para producción."
user-suspended: "Este usuario ha sido suspendido"
is-remote-user: "La información sobre este usuario puede no estar completa"
is-remote-post: "Es una publicación remota"
view-on-remote: "Consultar el perfil completo"
renoted-by: "Renotado por {user}"
no-notes: "No hay publicaciones"
turn-on-darkmode: "Cambiar a modo oscuro"
turn-off-darkmode: "Modo claro"
error:
title: "Se ha producido un problema :("
retry: "Inténtalo otra vez"
reversi: reversi:
drawn: "Empatado" drawn: "Empatado"
my-turn: "Mi turno" my-turn: "Mi turno"
opponent-turn: "Turno del oponente" opponent-turn: "Turno del oponente"
turn-of: "Turno de {name}"
past-turn-of: "Turno de {name}"
won: "{name} ha ganado"
black: "Negro" black: "Negro"
white: "Blanco" white: "Blanco"
total: "Total" total: "Total"
this-turn: "Turno {count}"
widgets: widgets:
analog-clock: "Reloj analógico" analog-clock: "Reloj analógico"
profile: "Perfil" profile: "Perfil"
@ -212,8 +247,12 @@ common:
nav: "Navegación" nav: "Navegación"
tips: "Consejos" tips: "Consejos"
hashtags: "Etiquetas" hashtags: "Etiquetas"
queue: "En cola"
dev: "Se ha producido un error creando la aplicación. Intentelo de nuevo."
ai-chan-kawaii: "Ai-chan es muy mona!"
you: "Tú" you: "Tú"
auth/views/form.vue: auth/views/form.vue:
share-access: "¿Deseas permitir a <i>{name}</i> acceder a tu cuenta?"
permission-ask: "La aplicación requiere los siguientes permisos:" permission-ask: "La aplicación requiere los siguientes permisos:"
cancel: "Cancelar" cancel: "Cancelar"
accept: "Garantizar acceso." accept: "Garantizar acceso."
@ -228,7 +267,18 @@ auth/views/index.vue:
error: "Esta sesión no existe." error: "Esta sesión no existe."
sign-in: "Por favor inicia sesión." sign-in: "Por favor inicia sesión."
common/views/pages/explore.vue: common/views/pages/explore.vue:
verified-users: "Cuenta verificada" popular-users: "Usuarios populares"
recently-updated-users: "Usuarios activos recientemente"
recently-registered-users: "Usuarios que se han unido recientemente"
popular-tags: "Etiquetas populares"
federated: "Desde el fediverso"
explore: "Explorar {host}"
users-info: "Actualmente hay {users} registrados aquí"
common/views/components/url-preview.vue:
enable-player: "Activar reproducción"
disable-player: "Cerrar el reproductor"
common/views/components/user-list.vue:
no-users: "No hay usuarios."
common/views/components/games/reversi/reversi.vue: common/views/components/games/reversi/reversi.vue:
matching: matching:
waiting-for: "Esperando por {}" waiting-for: "Esperando por {}"
@ -244,6 +294,7 @@ common/views/components/games/reversi/reversi.index.vue:
sub-title: "¡Juega Reversi con tus amigos!" sub-title: "¡Juega Reversi con tus amigos!"
invite: "Invitar" invite: "Invitar"
rule: "Cómo jugar" rule: "Cómo jugar"
rule-desc: "Reversi es un juego de estrategia para dos jugadores, el cual se juega en un tablero de 8x8. Hay 64 fichas llamadas discos, las cuales son claras de un lado y oscuras del otro. Los jugadores toman turnos colocando fichas en el tablero con su color asignado mirando hacia arriba. Durante una jugada, cualquier disco del color del oponente que esté en fila entre un disco del oponente y otro del mismo color, será volteado para tener el color del jugador que haya hecho la movida. El objetivo del juego es tener la mayoría de los discos de tu color cuando el último cuadro es llenado."
mode-invite: "Invitar" mode-invite: "Invitar"
mode-invite-desc: "Invitar un usuario al juego." mode-invite-desc: "Invitar un usuario al juego."
invitations: "¡Has recibido una invitación!" invitations: "¡Has recibido una invitación!"
@ -300,23 +351,40 @@ common/views/components/media-banner.vue:
click-to-show: "Click para mostrar" click-to-show: "Click para mostrar"
common/views/components/theme.vue: common/views/components/theme.vue:
theme: "Tema" theme: "Tema"
light-theme: "Tema a usar en Light mode"
dark-theme: "Tema a usar en dark mode"
light-themes: "Tema claro" light-themes: "Tema claro"
dark-themes: "Tema oscuro" dark-themes: "Tema oscuro"
install-a-theme: "Instalar tema" install-a-theme: "Instalar tema"
theme-code: "Código del tema" theme-code: "Código del tema"
install: "Instalación" install: "Instalación"
installed: "\"{}\" se ha instalado"
create-a-theme: "Crear tema"
save-created-theme: "Guardar tema"
primary-color: "Color primario" primary-color: "Color primario"
secondary-color: "Color secundario" secondary-color: "Color secundario"
text-color: "Color del texto"
base-theme: "Tema base" base-theme: "Tema base"
base-theme-light: "Claro" base-theme-light: "Claro"
base-theme-dark: "Oscuro" base-theme-dark: "Oscuro"
find-more-theme: "Obtener más temas"
theme-name: "Nombre del tema" theme-name: "Nombre del tema"
preview-created-theme: "Vista previa" preview-created-theme: "Vista previa"
invalid-theme: "No es un tema válido"
already-installed: "Este tema ya está instalado."
saved: "Guardado"
manage-themes: "Gestor de temas"
builtin-themes: "Temas estandar"
my-themes: "Mis temas" my-themes: "Mis temas"
installed-themes: "Temas instalados" installed-themes: "Temas instalados"
select-theme: "Elegir tema"
uninstall: "Desinstalar" uninstall: "Desinstalar"
uninstalled: "\"{}\" ha sido desinstalado"
author: "Autor"
desc: "Descripción"
export: "Exportar" export: "Exportar"
import: "Importar" import: "Importar"
import-by-code: "o pega el código"
common/views/components/cw-button.vue: common/views/components/cw-button.vue:
show: "Mostrar" show: "Mostrar"
chars: "{count} letras" chars: "{count} letras"
@ -430,10 +498,25 @@ common/views/components/stream-indicator.vue:
connected: "Conectado" connected: "Conectado"
common/views/components/notification-settings.vue: common/views/components/notification-settings.vue:
title: "Notificaciones" title: "Notificaciones"
common/views/components/integration-settings.vue:
title: "Integraciones"
connect: "Conectar"
disconnect: "Desconectarse"
connected-to: "Estas conectado a la siguiente cuenta"
common/views/components/github-setting.vue: common/views/components/github-setting.vue:
description: "Una vez conectada tu cuenta de GitHub a Misskey podrás ver la información sobre tu perfil de GitHub y además podrás registrarte mediante tu cuenta de GitHub."
connected-to: "Estas conectado a esta cuenta de GitHub"
detail: "Ver detalles..." detail: "Ver detalles..."
reconnect: "Reconectar"
connect: "Vincular tu cuenta de GitHub"
disconnect: "Desconectarse"
common/views/components/discord-setting.vue: common/views/components/discord-setting.vue:
description: "Una vez conectada tu cuenta de Discord a Misskey podrás ver la información sobre tu perfil de Discord y además podrás registrarte mediante tu cuenta de Discord."
connected-to: "Estas conectado a esta cuenta de Discord"
detail: "Ver detalles..." detail: "Ver detalles..."
reconnect: "Reconectar"
connect: "Vincular tu cuenta de Discord"
disconnect: "Desconectarse"
common/views/components/uploader.vue: common/views/components/uploader.vue:
waiting: "Un momento" waiting: "Un momento"
common/views/components/visibility-chooser.vue: common/views/components/visibility-chooser.vue:
@ -445,27 +528,65 @@ common/views/components/visibility-chooser.vue:
specified: "Directo" specified: "Directo"
specified-desc: "Publica solo para los seguidores que quieras" specified-desc: "Publica solo para los seguidores que quieras"
local-public: "Público (sólo local)" local-public: "Público (sólo local)"
local-public-desc: "No publicar para remoto"
local-home: "Inicio (sólo local)" local-home: "Inicio (sólo local)"
local-followers: "Seguidores (sólo local)" local-followers: "Seguidores (sólo local)"
common/views/components/trends.vue:
count: "{} usuarios mencionados"
empty: "Ninguna tendencia popular ahora"
common/views/components/language-settings.vue:
title: "Mostrar idioma"
pick-language: "Selecciona un idioma"
recommended: "Recomendado"
auto: "Automático"
specify-language: "Especifica el idioma"
info: "Necesitas recargar la página para que los cambios tengan efecto."
common/views/components/profile-editor.vue: common/views/components/profile-editor.vue:
title: "Perfil" title: "Perfil"
name: "Nombre" name: "Nombre"
account: "Cuenta" account: "Cuenta"
location: "Localización"
description: "Acerca de mí"
you-can-include-hashtags: "También puedes incluir hashtags en la descripción de tu perfil."
language: "Idioma"
birthday: "Fecha de nacimiento"
avatar: "Avatar" avatar: "Avatar"
banner: "Banner" banner: "Banner"
is-cat: "Esta cuenta es un gato" is-cat: "Esta cuenta es un gato"
is-bot: "Esta cuenta es un bot" is-bot: "Esta cuenta es un bot"
is-locked: "Las peticiones de seguimiento necesitan aprobación"
careful-bot: "Las peticiones de seguimiento de bots necesitan aprobación"
auto-accept-followed: "Aprobar automaticamente las peticiones de follow de gente a la que sigues"
advanced: "Otros"
privacy: "Privacidad"
save: "Guardar" save: "Guardar"
saved: "Perfil actualizado con exito"
uploading: "Subiendo"
upload-failed: "Error al subir"
email: "Preferencias de correo"
email-address: "Correo electrónico" email-address: "Correo electrónico"
email-verified: "Tu cuenta de correo ha sido verificada."
email-not-verified: "Tu cuenta de correo no está verificada. Por favor comprueba tu bandeja de entrada."
export: "Exportar" export: "Exportar"
import: "Importar" import: "Importar"
export-and-import: "Exportar/Importar"
export-targets: export-targets:
all-notes: "Todas las notas publicadas"
following-list: "Seguidores"
mute-list: "Silenciar" mute-list: "Silenciar"
blocking-list: "Bloquear" blocking-list: "Bloquear"
user-lists: "Listas" user-lists: "Listas"
export-requested: "Has solicitado una exportación. Esto puede tardar un rato. Después de que termine la exportación el archivo se añadirá al drive."
import-requested: "Has empezado una importación. Esto puede tardar un rato."
enter-password: "Escribe una contraseña" enter-password: "Escribe una contraseña"
danger-zone: "Zona de peligro"
delete-account: "Eliminar cuenta"
account-deleted: "Esta cuenta ha sido eliminada. Puede tardar un rato hasta que toda la información desaparazca."
common/views/components/user-list-editor.vue: common/views/components/user-list-editor.vue:
users: "Usuarios" users: "Usuarios"
rename: "Cambiar el nombre de la lista"
delete: "Eliminar lista"
remove-user: "Eliminar de la lista"
common/views/components/user-lists.vue: common/views/components/user-lists.vue:
list-name: "Nombre de lista" list-name: "Nombre de lista"
common/views/widgets/broadcast.vue: common/views/widgets/broadcast.vue:
@ -788,24 +909,46 @@ admin/views/index.vue:
instance: "Instancia" instance: "Instancia"
moderators: "Moderadores" moderators: "Moderadores"
users: "Usuarios" users: "Usuarios"
federation: "Federado"
hashtags: "Hashtags" hashtags: "Hashtags"
queue: "Cola de trabajos"
logs: "Registros"
back-to-misskey: "Volver a Misskey" back-to-misskey: "Volver a Misskey"
admin/views/dashboard.vue: admin/views/dashboard.vue:
dashboard: "Panel de Control" dashboard: "Panel de Control"
accounts: "Cuenta" accounts: "Cuenta"
notes: "Publicaciones"
drive: "Drive" drive: "Drive"
instances: "Instancias" instances: "Instancias"
this-instance: "Esta instancia" this-instance: "Esta instancia"
federated: "Federado"
admin/views/queue.vue:
title: "Cola"
remove-all-jobs: "Limpiar todos los trabajos pendientes"
admin/views/abuse.vue: admin/views/abuse.vue:
title: "Abuso"
target: "Destinatario"
reporter: "Informador"
details: "Detalles" details: "Detalles"
remove-report: "eliminar" remove-report: "eliminar"
admin/views/instance.vue: admin/views/instance.vue:
instance: "Instancia" instance: "Instancia"
instance-name: "Nombre de la instancia" instance-name: "Nombre de la instancia"
instance-description: "Descripción de la instancia"
host: "Host" host: "Host"
banner-url: "URL de la imagen de banner"
error-image-url: "Error en la URL de la imagen"
languages: "Idioma de esta instancia"
languages-desc: "Puedes añadir mas de uno, separado por espacios."
maintainer-config: "Información del administrador"
maintainer-name: "Nombre del administrador"
maintainer-email: "Contactar con el administrador"
drive-config: "Ajustes del Drive"
cache-remote-files: "Mantener en cache los archivos remotos"
recaptcha-secret-key: "clave secreta reCAPTCHA" recaptcha-secret-key: "clave secreta reCAPTCHA"
invite: "Invitar" invite: "Invitar"
save: "Guardar" save: "Guardar"
saved: "Guardado"
email: "Correo electrónico" email: "Correo electrónico"
smtp-host: "Host SMTP" smtp-host: "Host SMTP"
smtp-port: "Puerto SMTP" smtp-port: "Puerto SMTP"
@ -834,7 +977,6 @@ admin/views/users.vue:
state: state:
all: "Todo" all: "Todo"
moderator: "Moderadores" moderator: "Moderadores"
verified: "Cuenta verificada"
origin: origin:
local: "Local" local: "Local"
admin/views/emoji.vue: admin/views/emoji.vue:
@ -846,12 +988,14 @@ admin/views/announcements.vue:
save: "Guardar" save: "Guardar"
remove: "eliminar" remove: "eliminar"
add: "Agregar" add: "Agregar"
saved: "Guardado"
admin/views/federation.vue: admin/views/federation.vue:
instance: "Instancia" instance: "Instancia"
host: "Host" host: "Host"
following: "Siguiendo" following: "Siguiendo"
status: "Estado" status: "Estado"
block: "Bloquear" block: "Bloquear"
instances: "Federado"
states: states:
all: "Todo" all: "Todo"
blocked: "Bloquear" blocked: "Bloquear"
@ -859,6 +1003,7 @@ admin/views/federation.vue:
chart-spans: chart-spans:
hour: "Por hora" hour: "Por hora"
day: "Por día" day: "Por día"
blocked-hosts: "Bloquear"
desktop/views/pages/selectdrive.vue: desktop/views/pages/selectdrive.vue:
cancel: "Cancelar" cancel: "Cancelar"
desktop/views/pages/user-list.users.vue: desktop/views/pages/user-list.users.vue:

View File

@ -72,12 +72,18 @@ common:
permissions: permissions:
"read:account": "Afficher les informations du compte" "read:account": "Afficher les informations du compte"
"write:account": "Mettre à jour les informations de votre compte" "write:account": "Mettre à jour les informations de votre compte"
"read:blocks": "Voir les blocs"
"write:blocks": "Écrire des blocs"
"read:drive": "Parcourir le Drive" "read:drive": "Parcourir le Drive"
"write:drive": "Écrire sur le Drive" "write:drive": "Écrire sur le Drive"
"read:favorites": "Afficher les favoris" "read:favorites": "Afficher les favoris"
"write:favorites": "Écrire des favoris"
"write:messaging": "Utiliser la messagerie"
"write:notes": "Créer ou supprimer des publications" "write:notes": "Créer ou supprimer des publications"
"read:notifications": "Afficher les notifications" "read:notifications": "Afficher les notifications"
"write:notifications": "Gérer vos notifications"
"read:reactions": "Lire les réactions" "read:reactions": "Lire les réactions"
"write:reactions": "Gérer vos réactions"
"write:votes": "Vote" "write:votes": "Vote"
empty-timeline-info: empty-timeline-info:
follow-users-to-make-your-timeline: "Les utilisateurs suivants afficheront leurs publications sur votre fil." follow-users-to-make-your-timeline: "Les utilisateurs suivants afficheront leurs publications sur votre fil."
@ -133,7 +139,7 @@ common:
notification: "Notifications" notification: "Notifications"
apps: "Applications" apps: "Applications"
tags: "Hashtags" tags: "Hashtags"
mute-and-block: "Silencer / Bloquer" mute-and-block: "Silencés / Bloqués"
blocking: "En cours blocage" blocking: "En cours blocage"
security: "Sécurité" security: "Sécurité"
signin: "Historique des connexions" signin: "Historique des connexions"
@ -193,6 +199,7 @@ common:
show-clock-on-header: "Afficher l'horloge sur le coté supérieur droit" show-clock-on-header: "Afficher l'horloge sur le coté supérieur droit"
timeline: "Fil dactualité" timeline: "Fil dactualité"
show-my-renotes: "Afficher mes republications dans le fil" show-my-renotes: "Afficher mes republications dans le fil"
show-renoted-my-notes: "Afficher les partages de mes propres notes sur le fil"
remain-deleted-note: "Continuer à afficher les notes supprimées" remain-deleted-note: "Continuer à afficher les notes supprimées"
sound: "Son" sound: "Son"
enable-sounds: "Activer les sons" enable-sounds: "Activer les sons"
@ -234,7 +241,6 @@ common:
update-available-title: "Mise à jour disponible" update-available-title: "Mise à jour disponible"
update-available: "Une nouvelle version de Misskey est disponible ({newer}, version actuelle: {current}). Veuillez recharger la page pour appliquer la mise à jour." update-available: "Une nouvelle version de Misskey est disponible ({newer}, version actuelle: {current}). Veuillez recharger la page pour appliquer la mise à jour."
my-token-regenerated: "Votre jeton vient dêtre généré, vous allez maintenant être déconnecté." my-token-regenerated: "Votre jeton vient dêtre généré, vous allez maintenant être déconnecté."
verified-user: "Compte vérifié"
hide-password: "Masquer le mot de passe" hide-password: "Masquer le mot de passe"
show-password: "Afficher le mot de passe" show-password: "Afficher le mot de passe"
do-not-use-in-production: "Il sagit dune version de développement. Ne pas utiliser dans un environnement de production." do-not-use-in-production: "Il sagit dune version de développement. Ne pas utiliser dans un environnement de production."
@ -302,7 +308,6 @@ auth/views/index.vue:
error: "La session nexiste pas." error: "La session nexiste pas."
sign-in: "Veuillez vous connecter" sign-in: "Veuillez vous connecter"
common/views/pages/explore.vue: common/views/pages/explore.vue:
verified-users: "Comptes vérifiés"
popular-users: "Utilisateurs populaires" popular-users: "Utilisateurs populaires"
recently-updated-users: "Utilisateurs actifs récemment" recently-updated-users: "Utilisateurs actifs récemment"
recently-registered-users: "Les nouveaux inscrits" recently-registered-users: "Les nouveaux inscrits"
@ -455,6 +460,7 @@ common/views/components/nav.vue:
repository: "Dépôt" repository: "Dépôt"
develop: "Développeurs" develop: "Développeurs"
feedback: "Suggestions" feedback: "Suggestions"
tos: "Conditions d'utilisation"
common/views/components/note-menu.vue: common/views/components/note-menu.vue:
mention: "Mention" mention: "Mention"
detail: "Détails" detail: "Détails"
@ -473,8 +479,12 @@ common/views/components/user-menu.vue:
mention: "Mention" mention: "Mention"
mute: "Silencier" mute: "Silencier"
unmute: "Enlever la sourdine" unmute: "Enlever la sourdine"
mute-confirm: "Rendre muet cet utilisateur ?"
unmute-confirm: "Ne plus masquer cet utilisateur ?"
block: "Bloquer" block: "Bloquer"
unblock: "Débloquer" unblock: "Débloquer"
block-confirm: "Bloquer cet utilisateur ?"
unblock-confirm: "Débloquer cet utilisateur ?"
push-to-list: "Ajouter à une liste" push-to-list: "Ajouter à une liste"
select-list: "Sélectionnez une liste" select-list: "Sélectionnez une liste"
report-abuse: "Signaler un abus" report-abuse: "Signaler un abus"
@ -557,6 +567,7 @@ common/views/components/signup.vue:
password-matched: "OK" password-matched: "OK"
password-not-matched: "Les mots de passe ne correspondent pas." password-not-matched: "Les mots de passe ne correspondent pas."
recaptcha: "Vérifier" recaptcha: "Vérifier"
tos: "Conditions d'utilisation"
create: "Créer un compte" create: "Créer un compte"
some-error: "La création du compte a échoué. Veuillez réessayer." some-error: "La création du compte a échoué. Veuillez réessayer."
common/views/components/special-message.vue: common/views/components/special-message.vue:
@ -1106,7 +1117,6 @@ admin/views/instance.vue:
invite: "Inviter" invite: "Inviter"
save: "Sauvegarder" save: "Sauvegarder"
saved: "Enregistré" saved: "Enregistré"
user-recommendation-config: "Utilisateurs"
email-config: "Paramètres du serveur de messagerie" email-config: "Paramètres du serveur de messagerie"
email-config-info: "Utilisé pour confirmer votre adresse de courrier électronique et la réinitialisation de votre mot de passe." email-config-info: "Utilisé pour confirmer votre adresse de courrier électronique et la réinitialisation de votre mot de passe."
enable-email: "Activation de la distribution du courrier" enable-email: "Activation de la distribution du courrier"
@ -1187,13 +1197,8 @@ admin/views/users.vue:
unsuspend-confirm: "Souhaiteriez-vous ne plus suspendre ce compte ?" unsuspend-confirm: "Souhaiteriez-vous ne plus suspendre ce compte ?"
unsuspended: "La suspension de lutilisateur a été levée avec succès" unsuspended: "La suspension de lutilisateur a été levée avec succès"
make-silence: "Mettre en sourdine" make-silence: "Mettre en sourdine"
silence-confirm: "Mettre l'utilisateur sous silence ?"
unmake-silence: "Enlever la sourdine" unmake-silence: "Enlever la sourdine"
verify: "Vérification du compte"
verify-confirm: "Souhaiteriez-vous rendre votre compte comme étant un compte vérifié ?"
verified: "Le compte a été vérifié"
unverify: "Enlever la vérification du compte"
unverify-confirm: "Désirez-vous considérer ce compte comme étant non-vérifié ?"
unverified: "Ce compte n'est plus vérifié"
update-remote-user: "Mettre à jour les informations de lutilisateur·rice distant·e" update-remote-user: "Mettre à jour les informations de lutilisateur·rice distant·e"
remote-user-updated: "Les informations de lutilisateur·rice distant·e ont étés mis à jour" remote-user-updated: "Les informations de lutilisateur·rice distant·e ont étés mis à jour"
users: users:
@ -1210,7 +1215,6 @@ admin/views/users.vue:
admin: "Admin" admin: "Admin"
moderator: "Modérateur" moderator: "Modérateur"
adminOrModerator: "Administrateur/Modérateur" adminOrModerator: "Administrateur/Modérateur"
verified: "Compte vérifié"
silenced: "Déjà mis en sourdine" silenced: "Déjà mis en sourdine"
suspended: "Suspendu" suspended: "Suspendu"
origin: origin:
@ -1309,6 +1313,7 @@ admin/views/federation.vue:
chart-spans: chart-spans:
hour: "Par heure" hour: "Par heure"
day: "Par jour" day: "Par jour"
blocked-hosts: "En cours blocage"
desktop/views/pages/welcome.vue: desktop/views/pages/welcome.vue:
about: "à propos" about: "à propos"
timeline: "Fil dactualité" timeline: "Fil dactualité"
@ -1589,7 +1594,30 @@ dev/views/new-app.vue:
authority-desc: "Sont accessibles via lAPI, uniquement les fonctionnalités demandées ici." authority-desc: "Sont accessibles via lAPI, uniquement les fonctionnalités demandées ici."
authority-warning: "Vous pouvez le changer même après avoir créé l'application, mais si vous attribuez une nouvelle permission, toutes les clés utilisateur associées seront dès lors invalides." authority-warning: "Vous pouvez le changer même après avoir créé l'application, mais si vous attribuez une nouvelle permission, toutes les clés utilisateur associées seront dès lors invalides."
pages: pages:
page-created: "Page a été créée !"
are-you-sure-delete: "Confirmez-vous la suppression de cette page ?"
page-deleted: "La page a bien été supprimée."
edit-this-page: "Éditer cette page"
view-source: "Afficher la source"
view-page: "Afficher la page"
inspector: "Inspecteur"
content: "Bloc de page"
variables: "Variables"
more-details: "Description"
title: "Titre" title: "Titre"
url: "URL de page"
summary: "Résumé de page"
align-center: "Centrée"
font: "Police de caractères"
fontSerif: "Serif"
fontSansSerif: "Sans Serif"
choose-block: "Ajouter un bloc"
select-type: "Choisir un type"
enter-variable-name: "Veuillez choisir un nom de variable"
the-variable-name-is-already-used: "Cette variable est déjà utilisée"
content-blocks: "Contenu du cadre"
special-blocks: "Spécial"
posted-from-post-form: "Publié !"
blocks: blocks:
text: "Texte" text: "Texte"
textarea: "Zone de texte" textarea: "Zone de texte"
@ -1602,6 +1630,7 @@ pages:
post: "Champs de publication" post: "Champs de publication"
_post: _post:
text: "Contenu" text: "Contenu"
textInput: "Entrée textuelle"
_textInput: _textInput:
name: "Nom de la variable" name: "Nom de la variable"
text: "Titre" text: "Titre"
@ -1610,6 +1639,7 @@ pages:
name: "Nom de la variable" name: "Nom de la variable"
text: "Titre" text: "Titre"
default: "Valeur par défaut" default: "Valeur par défaut"
numberInput: "Entrée numérique"
_numberInput: _numberInput:
name: "Nom de la variable" name: "Nom de la variable"
text: "Titre" text: "Titre"
@ -1717,6 +1747,7 @@ pages:
arg1: "Numérique" arg1: "Numérique"
_splitStrByLine: _splitStrByLine:
arg1: "Texte" arg1: "Texte"
ref: "Variables"
fn: "Fonction" fn: "Fonction"
_fn: _fn:
arg1: "Sortie" arg1: "Sortie"

View File

@ -508,6 +508,7 @@ common/views/components/nav.vue:
repository: "リポジトリ" repository: "リポジトリ"
develop: "開発者" develop: "開発者"
feedback: "フィードバック" feedback: "フィードバック"
tos: "利用規約"
common/views/components/note-menu.vue: common/views/components/note-menu.vue:
mention: "メンション" mention: "メンション"
@ -628,6 +629,8 @@ common/views/components/signup.vue:
password-matched: "確認されました" password-matched: "確認されました"
password-not-matched: "一致していません" password-not-matched: "一致していません"
recaptcha: "認証" recaptcha: "認証"
agree-to: "{0}に同意します。"
tos: "利用規約"
create: "アカウント作成" create: "アカウント作成"
some-error: "何らかの原因によりアカウントの作成に失敗しました。再度お試しください。" some-error: "何らかの原因によりアカウントの作成に失敗しました。再度お試しください。"
@ -1215,10 +1218,15 @@ admin/views/instance.vue:
instance-name: "インスタンス名" instance-name: "インスタンス名"
instance-description: "インスタンスの紹介" instance-description: "インスタンスの紹介"
host: "ホスト" host: "ホスト"
icon-url: "アイコンURL"
logo-url: "ロゴURL"
banner-url: "バナー画像URL" banner-url: "バナー画像URL"
error-image-url: "エラー画像URL" error-image-url: "エラー画像URL"
languages: "インスタンスの対象言語" languages: "インスタンスの対象言語"
languages-desc: "スペースで区切って複数設定できます。" languages-desc: "スペースで区切って複数設定できます。"
tos-url: "利用規約URL"
repository-url: "リポジトリURL"
feedback-url: "フィードバックURL"
maintainer-config: "管理者情報" maintainer-config: "管理者情報"
maintainer-name: "管理者名" maintainer-name: "管理者名"
maintainer-email: "管理者の連絡先" maintainer-email: "管理者の連絡先"
@ -1264,6 +1272,7 @@ admin/views/instance.vue:
save: "保存" save: "保存"
saved: "保存しました" saved: "保存しました"
pinned-users: "ピン留めユーザー" pinned-users: "ピン留めユーザー"
pinned-users-info: "ピン留めしたいユーザーを改行で区切って記述します。"
email-config: "メールサーバーの設定" email-config: "メールサーバーの設定"
email-config-info: "メールアドレス確認やパスワードリセットの際に使われます。" email-config-info: "メールアドレス確認やパスワードリセットの際に使われます。"
enable-email: "メール配信を有効にする" enable-email: "メール配信を有効にする"
@ -1432,6 +1441,7 @@ admin/views/federation.vue:
latest-request-received-at: "直近のリクエスト受信" latest-request-received-at: "直近のリクエスト受信"
remove-all-following: "フォローを全解除" remove-all-following: "フォローを全解除"
remove-all-following-info: "{host}からのフォローをすべて解除します。そのインスタンスがもう存在しなくなった場合などに実行してください。" remove-all-following-info: "{host}からのフォローをすべて解除します。そのインスタンスがもう存在しなくなった場合などに実行してください。"
delete-all-files: "ファイルをすべて削除"
block: "ブロック" block: "ブロック"
marked-as-closed: "閉鎖されているとマーク" marked-as-closed: "閉鎖されているとマーク"
lookup: "照会" lookup: "照会"
@ -1478,6 +1488,8 @@ admin/views/federation.vue:
chart-spans: chart-spans:
hour: "1時間ごと" hour: "1時間ごと"
day: "1日ごと" day: "1日ごと"
blocked-hosts: "ブロック"
blocked-hosts-info: "ブロックしたいホストを改行で区切って記述します。"
desktop/views/pages/welcome.vue: desktop/views/pages/welcome.vue:
about: "詳しく..." about: "詳しく..."

View File

@ -121,7 +121,6 @@ common:
update-available-title: "更新があんで" update-available-title: "更新があんで"
update-available: "Misskeyの新しいバージョンがあんで({newer}。現在{current}をつこてるわ)。ページを再度読み込みしたると更新が適用されるわ。" update-available: "Misskeyの新しいバージョンがあんで({newer}。現在{current}をつこてるわ)。ページを再度読み込みしたると更新が適用されるわ。"
my-token-regenerated: "あんさんのトークンが更新されたらしいわ。すまんがとりあえずサインアウトすんで。" my-token-regenerated: "あんさんのトークンが更新されたらしいわ。すまんがとりあえずサインアウトすんで。"
verified-user: "アメちゃん付きアカウント"
do-not-use-in-production: "開発ビルドや。本番環境で使わんといて!知らんで!" do-not-use-in-production: "開発ビルドや。本番環境で使わんといて!知らんで!"
is-remote-post: "この投稿情報はコピーです。" is-remote-post: "この投稿情報はコピーです。"
view-on-remote: "ちゃんとした情報見せてや!" view-on-remote: "ちゃんとした情報見せてや!"
@ -181,7 +180,6 @@ auth/views/index.vue:
error: "セッションが存在してへん。" error: "セッションが存在してへん。"
sign-in: "サインインしてや" sign-in: "サインインしてや"
common/views/pages/explore.vue: common/views/pages/explore.vue:
verified-users: "アメちゃん付きアカウント"
federated: "連合" federated: "連合"
common/views/components/games/reversi/reversi.vue: common/views/components/games/reversi/reversi.vue:
matching: matching:
@ -899,7 +897,6 @@ admin/views/instance.vue:
invite: "来てや" invite: "来てや"
save: "保存" save: "保存"
saved: "保存したで!" saved: "保存したで!"
user-recommendation-config: "このユーザーええで"
email-config: "メールサーバーの設定" email-config: "メールサーバーの設定"
email-config-info: "メールアドレス確認やパスワードリセットの際に使うで。" email-config-info: "メールアドレス確認やパスワードリセットの際に使うで。"
enable-email: "メール配信を有効にする" enable-email: "メール配信を有効にする"
@ -956,7 +953,6 @@ admin/views/users.vue:
state: state:
all: "すべて" all: "すべて"
moderator: "モデレーター" moderator: "モデレーター"
verified: "アメちゃん付きアカウント"
origin: origin:
local: "ローカル" local: "ローカル"
admin/views/emoji.vue: admin/views/emoji.vue:
@ -995,6 +991,7 @@ admin/views/federation.vue:
chart-spans: chart-spans:
hour: "1時間ごと" hour: "1時間ごと"
day: "1日ごと" day: "1日ごと"
blocked-hosts: "ブロック"
desktop/views/pages/welcome.vue: desktop/views/pages/welcome.vue:
about: "もうちょい……" about: "もうちょい……"
timeline: "タイムライン" timeline: "タイムライン"

View File

@ -251,7 +251,6 @@ common:
update-available-title: "업데이트가 있습니다" update-available-title: "업데이트가 있습니다"
update-available: "Misskey의 새로운 버전이 있습니다 ({newer}. 현재 {current}을 사용 중). 페이지를 다시 로드하면 업데이트가 적용됩니다." update-available: "Misskey의 새로운 버전이 있습니다 ({newer}. 현재 {current}을 사용 중). 페이지를 다시 로드하면 업데이트가 적용됩니다."
my-token-regenerated: "당신의 토큰이 업데이트되었으므로 로그아웃합니다." my-token-regenerated: "당신의 토큰이 업데이트되었으므로 로그아웃합니다."
verified-user: "공식 계정"
hide-password: "비밀번호 숨기기" hide-password: "비밀번호 숨기기"
show-password: "비밀번호 표시" show-password: "비밀번호 표시"
do-not-use-in-production: "이것은 개발 빌드입니다. 프로덕션 환경에서 사용하지 마십시오." do-not-use-in-production: "이것은 개발 빌드입니다. 프로덕션 환경에서 사용하지 마십시오."
@ -294,7 +293,7 @@ common:
notifications: "알림" notifications: "알림"
users: "추천 사용자" users: "추천 사용자"
polls: "투표" polls: "투표"
post-form: "게시 양식" post-form: "글 입력란"
server: "서버 정보" server: "서버 정보"
nav: "내비게이션" nav: "내비게이션"
tips: "팁" tips: "팁"
@ -319,7 +318,7 @@ auth/views/index.vue:
error: "세션이 존재하지 않습니다." error: "세션이 존재하지 않습니다."
sign-in: "로그인 해주시기 바랍니다" sign-in: "로그인 해주시기 바랍니다"
common/views/pages/explore.vue: common/views/pages/explore.vue:
verified-users: "공식 계정" pinned-users: "고정된 사용자"
popular-users: "인기 사용자" popular-users: "인기 사용자"
recently-updated-users: "최근 게시한 사용자" recently-updated-users: "최근 게시한 사용자"
recently-registered-users: "신규 사용자" recently-registered-users: "신규 사용자"
@ -473,6 +472,7 @@ common/views/components/nav.vue:
repository: "저장소" repository: "저장소"
develop: "개발자" develop: "개발자"
feedback: "피드백" feedback: "피드백"
tos: "이용 약관"
common/views/components/note-menu.vue: common/views/components/note-menu.vue:
mention: "멘션" mention: "멘션"
detail: "상세" detail: "상세"
@ -585,6 +585,7 @@ common/views/components/signup.vue:
password-matched: "확인되었습니다" password-matched: "확인되었습니다"
password-not-matched: "일치하지 않습니다" password-not-matched: "일치하지 않습니다"
recaptcha: "자동 가입 방지" recaptcha: "자동 가입 방지"
tos: "이용 약관"
create: "계정 만들기" create: "계정 만들기"
some-error: "알 수 없는 이유로 계정 만들기에 실패했습니다. 다시 한번 시도해 주세요." some-error: "알 수 없는 이유로 계정 만들기에 실패했습니다. 다시 한번 시도해 주세요."
common/views/components/special-message.vue: common/views/components/special-message.vue:
@ -1091,10 +1092,15 @@ admin/views/instance.vue:
instance-name: "인스턴스 이름" instance-name: "인스턴스 이름"
instance-description: "인스턴스의 소개" instance-description: "인스턴스의 소개"
host: "관리자" host: "관리자"
icon-url: "아이콘 URL"
logo-url: "로고 URL"
banner-url: "배너 이미지 URL" banner-url: "배너 이미지 URL"
error-image-url: "오류 이미지 URL" error-image-url: "오류 이미지 URL"
languages: "인스턴스의 대상 언어" languages: "인스턴스의 대상 언어"
languages-desc: "공백으로 구분하여 여러 개 설정할 수 있습니다." languages-desc: "공백으로 구분하여 여러 개 설정할 수 있습니다."
tos-url: "이용약관 URL"
repository-url: "저장소 URL"
feedback-url: "피드백 URL"
maintainer-config: "관리자 정보" maintainer-config: "관리자 정보"
maintainer-name: "관리자 이름" maintainer-name: "관리자 이름"
maintainer-email: "관리자 연락처" maintainer-email: "관리자 연락처"
@ -1139,7 +1145,7 @@ admin/views/instance.vue:
invite: "초대" invite: "초대"
save: "저장" save: "저장"
saved: "저장하였습니다" saved: "저장하였습니다"
user-recommendation-config: "추천 사용자" pinned-users: "고정된 사용자"
email-config: "메일 서버 설정" email-config: "메일 서버 설정"
email-config-info: "메일 주소 확인 혹은 비밀번호 재설정에 사용 됩니다." email-config-info: "메일 주소 확인 혹은 비밀번호 재설정에 사용 됩니다."
enable-email: "메일 발신 활성화" enable-email: "메일 발신 활성화"
@ -1223,12 +1229,6 @@ admin/views/users.vue:
silence-confirm: "침묵으로 설정합니까?" silence-confirm: "침묵으로 설정합니까?"
unmake-silence: "침묵 해제" unmake-silence: "침묵 해제"
unsilence-confirm: "침묵 해제하시겠습니까?" unsilence-confirm: "침묵 해제하시겠습니까?"
verify: "공식 계정으로 설정"
verify-confirm: "공식 계정으로 설정하시겠습니까?"
verified: "공식 계정으로 설정하였습니다"
unverify: "공식 계정 해제"
unverify-confirm: "공식 계정을 해제하시겠습니까?"
unverified: "공식 계정을 해제하였습니다"
update-remote-user: "원격 사용자 정보 갱신" update-remote-user: "원격 사용자 정보 갱신"
remote-user-updated: "원격 사용자 정보를 갱신하였습니다" remote-user-updated: "원격 사용자 정보를 갱신하였습니다"
users: users:
@ -1245,7 +1245,6 @@ admin/views/users.vue:
admin: "관리자" admin: "관리자"
moderator: "모더레이터" moderator: "모더레이터"
adminOrModerator: "관리자+모더레이터" adminOrModerator: "관리자+모더레이터"
verified: "공식 계정"
silenced: "침묵됨" silenced: "침묵됨"
suspended: "정지됨" suspended: "정지됨"
origin: origin:
@ -1353,6 +1352,7 @@ admin/views/federation.vue:
chart-spans: chart-spans:
hour: "1시간마다" hour: "1시간마다"
day: "1일마다" day: "1일마다"
blocked-hosts: "차단"
desktop/views/pages/welcome.vue: desktop/views/pages/welcome.vue:
about: "자세히..." about: "자세히..."
timeline: "타임라인" timeline: "타임라인"
@ -1652,42 +1652,224 @@ pages:
page-created: "페이지를 만들었습니다" page-created: "페이지를 만들었습니다"
page-updated: "페이지를 수정했습니다" page-updated: "페이지를 수정했습니다"
are-you-sure-delete: "이 페이지를 삭제하시겠습니까?" are-you-sure-delete: "이 페이지를 삭제하시겠습니까?"
page-deleted: "페이지가 삭제되었습니다"
edit-this-page: "이 페이지를 편집"
view-source: "소스 보기"
view-page: "페이지 보기"
inspector: "인스펙터"
content: "페이지 블록"
variables: "변수"
more-details: "자세한 설명"
title: "제목" title: "제목"
url: "페이지 URL"
summary: "페이지 요약"
align-center: "가운데 정렬"
font: "글꼴"
fontSerif: "세리프"
fontSansSerif: "산 세리프"
set-eye-catching-image: "아이캐치 이미지를 설정"
remove-eye-catching-image: "아이캐치 이미지를 삭제"
choose-block: "블록 추가"
select-type: "종류 선택"
enter-variable-name: "변수명을 설정해주십시오"
the-variable-name-is-already-used: "그 변수명은 이미 사용중입니다"
content-blocks: "콘텐츠"
input-blocks: "입력"
special-blocks: "특수"
post-from-post-form: "이 내용을 올리기"
posted-from-post-form: "게시하였습니다"
blocks: blocks:
text: "텍스트"
textarea: "텍스트 영역"
section: "섹션"
image: "이미지" image: "이미지"
post: "게시 양식" button: "버튼"
if: "만약"
_if:
variable: "변수"
post: "글 입력란"
_post: _post:
text: "내용" text: "내용"
textInput: "텍스트 입력"
_textInput: _textInput:
name: "변수명"
text: "제목" text: "제목"
default: "기본값"
textareaInput: "여러 줄 텍스트 입력"
_textareaInput: _textareaInput:
name: "변수명"
text: "제목" text: "제목"
default: "기본값"
numberInput: "수치 입력"
_numberInput: _numberInput:
name: "변수명"
text: "제목" text: "제목"
default: "기본값"
switch: "스위치"
_switch: _switch:
name: "변수명"
text: "제목" text: "제목"
default: "기본값"
counter: "카운터"
_counter: _counter:
name: "변수명"
text: "제목" text: "제목"
inc: "증가치"
_button: _button:
text: "제목" text: "제목"
action: "버튼을 눌렀을 때의 동작"
_action: _action:
dialog: "대화상자를 표시"
_dialog: _dialog:
content: "내용" content: "내용"
resetRandom: "난수를 초기화"
script: script:
categories: categories:
flow: "흐름 제어"
logical: "논리 연산"
operation: "계산"
comparison: "비교"
random: "랜덤" random: "랜덤"
value: "값"
fn: "함수"
text: "텍스트 조작"
convert: "변환"
list: "리스트" list: "리스트"
blocks: blocks:
text: "텍스트"
multiLineText: "텍스트 (여러줄)"
textList: "텍스트 목록"
strLen: "텍스트의 길이"
_strLen:
arg1: "텍스트"
strPick: "문자 추출"
_strPick:
arg1: "텍스트"
arg2: "문자 위치"
strReplace: "텍스트 치환"
_strReplace:
arg1: "텍스트"
arg2: "치환 전"
arg3: "치환 후"
strReverse: "텍스트 뒤집기"
_strReverse:
arg1: "텍스트"
join: "텍스트 접합"
_join: _join:
arg1: "리스트" arg1: "리스트"
arg2: "구분자"
add: "+ 더하기"
_add:
arg1: "A"
arg2: "B"
subtract: "- 빼기"
_subtract:
arg1: "A"
arg2: "B"
multiply: "× 곱하기"
_multiply:
arg1: "A"
arg2: "B"
divide: "÷ 나누기"
_divide:
arg1: "A"
arg2: "B"
remind: "÷ 나눈 나머지"
_remind:
arg1: "A"
arg2: "B"
eq: "A와 B가 동일"
_eq:
arg1: "A"
arg2: "B"
notEq: "A와 B가 다름"
_notEq:
arg1: "A"
arg2: "B"
and: "A 그리고 B"
_and:
arg1: "A"
arg2: "B"
or: "A 혹은 B"
_or:
arg1: "A"
arg2: "B"
lt: "< A가 B보다 작음"
_lt:
arg1: "A"
arg2: "B"
gt: "> A가 B보다 큼"
_gt:
arg1: "A"
arg2: "B"
ltEq: "<= A가 B보다 작거나 같음"
_ltEq:
arg1: "A"
arg2: "B"
gtEq: ">= A가 B보다 크거나 같음"
_gtEq:
arg1: "A"
arg2: "B"
if: "분기"
_if:
arg1: "만약"
arg2: "그러면"
arg3: "그렇지 않으면"
not: "부정"
_not:
arg1: "부정"
random: "랜덤" random: "랜덤"
_random:
arg1: "확률"
rannum: "난수"
_rannum:
arg1: "최소"
arg2: "최대"
randomPick: "목록에서 임의로 선택"
_randomPick: _randomPick:
arg1: "리스트" arg1: "리스트"
_dailyRandom:
arg1: "확률"
_dailyRannum:
arg1: "최소"
arg2: "최대"
_dailyRandomPick: _dailyRandomPick:
arg1: "리스트" arg1: "리스트"
_seedRandom:
arg1: "시드"
arg2: "확률"
_seedRannum:
arg1: "시드"
arg2: "최소"
arg3: "최대"
_seedRandomPick: _seedRandomPick:
arg1: "시드"
arg2: "리스트" arg2: "리스트"
_DRPWPM:
arg1: "텍스트 목록"
_pick: _pick:
arg1: "리스트" arg1: "리스트"
number: "수치"
stringToNumber: "텍스트를 수치로"
_stringToNumber:
arg1: "텍스트"
_numberToString:
arg1: "수치"
_splitStrByLine:
arg1: "텍스트"
ref: "변수"
fn: "함수"
_fn:
slots: "슬롯"
arg1: "출력"
thereIsEmptySlot: "슬롯 {slot}이(가) 비었습니다!"
types: types:
string: "텍스트"
number: "수치"
boolean: "플래그"
array: "리스트" array: "리스트"
stringArray: "텍스트 목록"
emptySlot: "빈 슬롯"
enviromentVariables: "환경 변수"
pageVariables: "페이지 요소"
argVariables: "입력 슬롯"

View File

@ -422,8 +422,6 @@ admin/views/dashboard.vue:
notes: "Bericht" notes: "Bericht"
admin/views/abuse.vue: admin/views/abuse.vue:
remove-report: "Verwijderen" remove-report: "Verwijderen"
admin/views/instance.vue:
user-recommendation-config: "Aanbevolen gebruikers"
admin/views/charts.vue: admin/views/charts.vue:
notes: "Bericht" notes: "Bericht"
users: "Gebruiker" users: "Gebruiker"

View File

@ -166,7 +166,6 @@ common:
update-available-title: "Aktualizacja jest dostępna" update-available-title: "Aktualizacja jest dostępna"
update-available: "Nowa wersja Misskey jest dostępna ({newer}, obecna to {current}). Odśwież stronę, aby zastosować aktualizację." update-available: "Nowa wersja Misskey jest dostępna ({newer}, obecna to {current}). Odśwież stronę, aby zastosować aktualizację."
my-token-regenerated: "Twój token został wygenerowany. Zostaniesz wylogowany." my-token-regenerated: "Twój token został wygenerowany. Zostaniesz wylogowany."
verified-user: "Zweryfikowane konto"
hide-password: "Ukryj hasło" hide-password: "Ukryj hasło"
show-password: "Pokaż hasło" show-password: "Pokaż hasło"
view-on-remote: "Dla dopełnienia, zobacz to zdalnie." view-on-remote: "Dla dopełnienia, zobacz to zdalnie."
@ -218,8 +217,6 @@ auth/views/index.vue:
please-go-back: "Wróć do aplikacji." please-go-back: "Wróć do aplikacji."
error: "Sesja nie istnieje." error: "Sesja nie istnieje."
sign-in: "Proszę zalogować się." sign-in: "Proszę zalogować się."
common/views/pages/explore.vue:
verified-users: "Zweryfikowane konto"
common/views/components/games/reversi/reversi.vue: common/views/components/games/reversi/reversi.vue:
matching: matching:
waiting-for: "Oczekiwanie na {}" waiting-for: "Oczekiwanie na {}"
@ -877,7 +874,6 @@ admin/views/instance.vue:
invite: "Zaproś" invite: "Zaproś"
save: "Zapisz" save: "Zapisz"
saved: "Zapisano" saved: "Zapisano"
user-recommendation-config: "Polecani użytkownicy"
email: "Adres e-mail" email: "Adres e-mail"
admin/views/charts.vue: admin/views/charts.vue:
notes: "Wpisy" notes: "Wpisy"
@ -907,7 +903,6 @@ admin/views/users.vue:
state: state:
all: "Wszyscy" all: "Wszyscy"
moderator: "Moderatorzy" moderator: "Moderatorzy"
verified: "Zweryfikowane konto"
origin: origin:
title: "Źródło" title: "Źródło"
local: "Lokalny" local: "Lokalny"
@ -953,6 +948,7 @@ admin/views/federation.vue:
blocked: "Zablokuj" blocked: "Zablokuj"
chart-srcs: chart-srcs:
requests: "Żądania" requests: "Żądania"
blocked-hosts: "Zablokuj"
desktop/views/pages/welcome.vue: desktop/views/pages/welcome.vue:
about: "O Misskey" about: "O Misskey"
timeline: "Oś czasu" timeline: "Oś czasu"

View File

@ -89,7 +89,6 @@ common:
update-available-title: "Atualização disponível" 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." 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: "Seu token foi recriado, portanto você foi deslogado." my-token-regenerated: "Seu token foi recriado, portanto você foi deslogado."
verified-user: "Conta verificada"
reversi: reversi:
drawn: "Empatado" drawn: "Empatado"
my-turn: "Seu turno" my-turn: "Seu turno"
@ -129,8 +128,6 @@ auth/views/index.vue:
please-go-back: "Por favor, volte ao aplicativo." please-go-back: "Por favor, volte ao aplicativo."
error: "A sessão não existe." error: "A sessão não existe."
sign-in: "Por favor, entre." sign-in: "Por favor, entre."
common/views/pages/explore.vue:
verified-users: "Conta verificada"
common/views/components/games/reversi/reversi.index.vue: common/views/components/games/reversi/reversi.index.vue:
invite: "Convidar" invite: "Convidar"
rule: "Como jogar" rule: "Como jogar"
@ -194,10 +191,6 @@ admin/views/instance.vue:
invite: "Convidar" invite: "Convidar"
admin/views/drive.vue: admin/views/drive.vue:
delete: "Apagar" delete: "Apagar"
admin/views/users.vue:
users:
state:
verified: "Conta verificada"
admin/views/emoji.vue: admin/views/emoji.vue:
emojis: emojis:
remove: "Apagar" remove: "Apagar"

View File

@ -251,7 +251,6 @@ common:
update-available-title: "有可用更新" update-available-title: "有可用更新"
update-available: "新的 Misskey 版本现已发布({newer}。目前版本{current}). 刷新页面以应用更新。" update-available: "新的 Misskey 版本现已发布({newer}。目前版本{current}). 刷新页面以应用更新。"
my-token-regenerated: "您的 Token 已被重置, 您将自动登出。" my-token-regenerated: "您的 Token 已被重置, 您将自动登出。"
verified-user: "认证用户"
hide-password: "隐藏密码" hide-password: "隐藏密码"
show-password: "显示密码" show-password: "显示密码"
do-not-use-in-production: "这是一个开发者测试版. 请勿在生产环境中使用." do-not-use-in-production: "这是一个开发者测试版. 请勿在生产环境中使用."
@ -319,7 +318,7 @@ auth/views/index.vue:
error: "会话不存在。" error: "会话不存在。"
sign-in: "请登录。" sign-in: "请登录。"
common/views/pages/explore.vue: common/views/pages/explore.vue:
verified-users: "官方账户" pinned-users: "已置顶用户"
popular-users: "热门用户" popular-users: "热门用户"
recently-updated-users: "活跃用户" recently-updated-users: "活跃用户"
recently-registered-users: "新用户" recently-registered-users: "新用户"
@ -1139,7 +1138,7 @@ admin/views/instance.vue:
invite: "邀请" invite: "邀请"
save: "保存" save: "保存"
saved: "保存完毕" saved: "保存完毕"
user-recommendation-config: "推荐用户" pinned-users: "置顶用户"
email-config: "电子邮件服务器设置" email-config: "电子邮件服务器设置"
email-config-info: "用于确认电子邮件和密码重置等。" email-config-info: "用于确认电子邮件和密码重置等。"
enable-email: "启用电子邮件送递" enable-email: "启用电子邮件送递"
@ -1223,12 +1222,6 @@ admin/views/users.vue:
silence-confirm: "确认屏蔽?" silence-confirm: "确认屏蔽?"
unmake-silence: "解除禁言" unmake-silence: "解除禁言"
unsilence-confirm: "解除屏蔽?" unsilence-confirm: "解除屏蔽?"
verify: "认证用户"
verify-confirm: "是否官方账号?"
verified: "此账户已被认证"
unverify: "解除账户认证"
unverify-confirm: "是否解除官方账号认证?"
unverified: "该帐户未经认证"
update-remote-user: "更新远程用户信息" update-remote-user: "更新远程用户信息"
remote-user-updated: "远程用户信息已更新" remote-user-updated: "远程用户信息已更新"
users: users:
@ -1245,7 +1238,6 @@ admin/views/users.vue:
admin: "管理员" admin: "管理员"
moderator: "版主" moderator: "版主"
adminOrModerator: "管理员+版主" adminOrModerator: "管理员+版主"
verified: "官方认证账户"
silenced: "已禁言" silenced: "已禁言"
suspended: "已冻结" suspended: "已冻结"
origin: origin:
@ -1353,6 +1345,7 @@ admin/views/federation.vue:
chart-spans: chart-spans:
hour: "每小时" hour: "每小时"
day: "每天" day: "每天"
blocked-hosts: "拉黑"
desktop/views/pages/welcome.vue: desktop/views/pages/welcome.vue:
about: "更多信息..." about: "更多信息..."
timeline: "时间线" timeline: "时间线"
@ -1671,6 +1664,8 @@ pages:
font: "字体" font: "字体"
fontSerif: "衬线字体" fontSerif: "衬线字体"
fontSansSerif: "无衬线字体" fontSansSerif: "无衬线字体"
set-eye-catching-image: "设置封面图片"
remove-eye-catching-image: "删除封面图片"
choose-block: "添加块" choose-block: "添加块"
select-type: "类型选择" select-type: "类型选择"
enter-variable-name: "请确定变量名" enter-variable-name: "请确定变量名"
@ -1735,6 +1730,7 @@ pages:
value: "值" value: "值"
fn: "函数" fn: "函数"
text: "文本操作" text: "文本操作"
convert: "转换"
list: "列表" list: "列表"
blocks: blocks:
text: "文本" text: "文本"
@ -1818,6 +1814,9 @@ pages:
arg1: "如果" arg1: "如果"
arg2: "的话" arg2: "的话"
arg3: "否则" arg3: "否则"
not: "否定"
_not:
arg1: "否定"
random: "随机" random: "随机"
_random: _random:
arg1: "概率" arg1: "概率"
@ -1851,6 +1850,7 @@ pages:
_seedRandomPick: _seedRandomPick:
arg1: "种子" arg1: "种子"
arg2: "列表" arg2: "列表"
DRPWPM: "从概率列表中随机选择(每用户每天)"
_DRPWPM: _DRPWPM:
arg1: "文本列表" arg1: "文本列表"
pick: "从列表中选择" pick: "从列表中选择"

View File

@ -0,0 +1,16 @@
import {MigrationInterface, QueryRunner} from "typeorm";
export class AddSomeUrls1557761316509 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<any> {
await queryRunner.query(`ALTER TABLE "meta" ADD "ToSUrl" character varying(512)`);
await queryRunner.query(`ALTER TABLE "meta" ADD "repositoryUrl" character varying(512) NOT NULL DEFAULT 'https://github.com/syuilo/misskey'`);
await queryRunner.query(`ALTER TABLE "meta" ADD "feedbackUrl" character varying(512) DEFAULT 'https://github.com/syuilo/misskey/issues/new'`);
}
public async down(queryRunner: QueryRunner): Promise<any> {
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "feedbackUrl"`);
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "repositoryUrl"`);
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "ToSUrl"`);
}
}

View File

@ -1,7 +1,7 @@
{ {
"name": "misskey", "name": "misskey",
"author": "syuilo <i@syuilo.com>", "author": "syuilo <i@syuilo.com>",
"version": "11.12.0", "version": "11.13.0",
"codename": "daybreak", "codename": "daybreak",
"repository": { "repository": {
"type": "git", "type": "git",
@ -94,13 +94,13 @@
"@types/websocket": "0.0.40", "@types/websocket": "0.0.40",
"@types/ws": "6.0.1", "@types/ws": "6.0.1",
"animejs": "3.0.1", "animejs": "3.0.1",
"apexcharts": "3.6.9", "apexcharts": "3.6.11",
"autobind-decorator": "2.4.0", "autobind-decorator": "2.4.0",
"autosize": "4.0.2", "autosize": "4.0.2",
"autwh": "0.1.0", "autwh": "0.1.0",
"bcryptjs": "2.4.3", "bcryptjs": "2.4.3",
"bootstrap-vue": "2.0.0-rc.13", "bootstrap-vue": "2.0.0-rc.13",
"bull": "3.8.1", "bull": "3.9.1",
"cafy": "15.1.1", "cafy": "15.1.1",
"chai": "4.2.0", "chai": "4.2.0",
"chalk": "2.4.2", "chalk": "2.4.2",
@ -121,7 +121,7 @@
"feed": "2.0.4", "feed": "2.0.4",
"file-type": "10.11.0", "file-type": "10.11.0",
"fuckadblock": "3.2.1", "fuckadblock": "3.2.1",
"gulp": "4.0.1", "gulp": "4.0.2",
"gulp-cssnano": "2.1.3", "gulp-cssnano": "2.1.3",
"gulp-imagemin": "5.0.3", "gulp-imagemin": "5.0.3",
"gulp-mocha": "6.0.0", "gulp-mocha": "6.0.0",
@ -140,7 +140,7 @@
"is-root": "2.1.0", "is-root": "2.1.0",
"is-svg": "4.1.0", "is-svg": "4.1.0",
"js-yaml": "3.13.1", "js-yaml": "3.13.1",
"jsdom": "15.0.0", "jsdom": "15.1.0",
"json5": "2.1.0", "json5": "2.1.0",
"json5-loader": "2.0.0", "json5-loader": "2.0.0",
"katex": "0.10.1", "katex": "0.10.1",
@ -173,7 +173,7 @@
"os-utils": "0.0.14", "os-utils": "0.0.14",
"parse5": "5.1.0", "parse5": "5.1.0",
"parsimmon": "1.12.0", "parsimmon": "1.12.0",
"pg": "7.10.0", "pg": "7.11.0",
"portscanner": "2.2.0", "portscanner": "2.2.0",
"postcss-loader": "3.0.0", "postcss-loader": "3.0.0",
"prismjs": "1.16.0", "prismjs": "1.16.0",
@ -247,11 +247,11 @@
"vue-template-compiler": "2.6.10", "vue-template-compiler": "2.6.10",
"vuedraggable": "2.20.0", "vuedraggable": "2.20.0",
"vuewordcloud": "18.7.11", "vuewordcloud": "18.7.11",
"vuex": "3.1.0", "vuex": "3.1.1",
"vuex-persistedstate": "2.5.4", "vuex-persistedstate": "2.5.4",
"web-push": "3.3.3", "web-push": "3.3.4",
"webpack": "4.30.0", "webpack": "4.31.0",
"webpack-cli": "3.3.1", "webpack-cli": "3.3.2",
"websocket": "1.0.28", "websocket": "1.0.28",
"ws": "7.0.0", "ws": "7.0.0",
"xev": "2.0.1" "xev": "2.0.1"

View File

@ -54,7 +54,6 @@
<span>{{ $t('latest-request-received-at') }}</span> <span>{{ $t('latest-request-received-at') }}</span>
<template #prefix><fa :icon="faInbox"/></template> <template #prefix><fa :icon="faInbox"/></template>
</ui-input> </ui-input>
<ui-switch v-model="instance.isBlocked" @change="updateInstance()">{{ $t('block') }}</ui-switch>
<ui-switch v-model="instance.isMarkedAsClosed" @change="updateInstance()">{{ $t('marked-as-closed') }}</ui-switch> <ui-switch v-model="instance.isMarkedAsClosed" @change="updateInstance()">{{ $t('marked-as-closed') }}</ui-switch>
<details> <details>
<summary>{{ $t('charts') }}</summary> <summary>{{ $t('charts') }}</summary>
@ -79,6 +78,10 @@
</ui-horizon-group> </ui-horizon-group>
<div ref="chart"></div> <div ref="chart"></div>
</details> </details>
<details>
<summary>{{ $t('delete-all-files') }}</summary>
<ui-button @click="deleteAllFiles()" style="margin-top: 16px;"><fa :icon="faTrashAlt"/> {{ $t('delete-all-files') }}</ui-button>
</details>
<details> <details>
<summary>{{ $t('remove-all-following') }}</summary> <summary>{{ $t('remove-all-following') }}</summary>
<ui-button @click="removeAllFollowing()" style="margin-top: 16px;"><fa :icon="faMinusCircle"/> {{ $t('remove-all-following') }}</ui-button> <ui-button @click="removeAllFollowing()" style="margin-top: 16px;"><fa :icon="faMinusCircle"/> {{ $t('remove-all-following') }}</ui-button>
@ -130,7 +133,7 @@
<span>{{ $t('status') }}</span> <span>{{ $t('status') }}</span>
</header> </header>
<div v-for="instance in instances" :style="{ opacity: instance.isNotResponding ? 0.5 : 1 }"> <div v-for="instance in instances" :style="{ opacity: instance.isNotResponding ? 0.5 : 1 }">
<a @click.prevent="showInstance(instance.host)" target="_blank" :href="`https://${instance.host}`" :style="{ textDecoration: instance.isMarkedAsClosed ? 'line-through' : 'none' }">{{ instance.host }}</a> <a @click.prevent="showInstance(instance.host)" rel="nofollow noopener" target="_blank" :href="`https://${instance.host}`" :style="{ textDecoration: instance.isMarkedAsClosed ? 'line-through' : 'none' }">{{ instance.host }}</a>
<span>{{ instance.notesCount | number }}</span> <span>{{ instance.notesCount | number }}</span>
<span>{{ instance.usersCount | number }}</span> <span>{{ instance.usersCount | number }}</span>
<span>{{ instance.followingCount | number }}</span> <span>{{ instance.followingCount | number }}</span>
@ -142,6 +145,16 @@
<ui-info v-if="instances.length == limit">{{ $t('result-is-truncated', { n: limit }) }}</ui-info> <ui-info v-if="instances.length == limit">{{ $t('result-is-truncated', { n: limit }) }}</ui-info>
</section> </section>
</ui-card> </ui-card>
<ui-card>
<template #title><fa :icon="faBan"/> {{ $t('blocked-hosts') }}</template>
<section class="fit-top">
<ui-textarea v-model="blockedHosts">
<template #desc>{{ $t('blocked-hosts-info') }}</template>
</ui-textarea>
<ui-button @click="saveBlockedHosts">{{ $t('save') }}</ui-button>
</section>
</ui-card>
</div> </div>
</template> </template>
@ -149,7 +162,7 @@
import Vue from 'vue'; import Vue from 'vue';
import i18n from '../../i18n'; import i18n from '../../i18n';
import { faPaperPlane } from '@fortawesome/free-regular-svg-icons'; import { faPaperPlane } from '@fortawesome/free-regular-svg-icons';
import { faGlobe, faTerminal, faSearch, faMinusCircle, faServer, faCrosshairs, faEnvelopeOpenText, faUsers, faCaretDown, faCaretUp, faTrafficLight, faInbox } from '@fortawesome/free-solid-svg-icons'; import { faTrashAlt, faBan, faGlobe, faTerminal, faSearch, faMinusCircle, faServer, faCrosshairs, faEnvelopeOpenText, faUsers, faCaretDown, faCaretUp, faTrafficLight, faInbox } from '@fortawesome/free-solid-svg-icons';
import ApexCharts from 'apexcharts'; import ApexCharts from 'apexcharts';
import * as tinycolor from 'tinycolor2'; import * as tinycolor from 'tinycolor2';
@ -176,7 +189,8 @@ export default Vue.extend({
chartSrc: 'requests', chartSrc: 'requests',
chartSpan: 'hour', chartSpan: 'hour',
chartInstance: null, chartInstance: null,
faGlobe, faTerminal, faSearch, faMinusCircle, faServer, faCrosshairs, faEnvelopeOpenText, faUsers, faCaretDown, faCaretUp, faPaperPlane, faTrafficLight, faInbox blockedHosts: '',
faTrashAlt, faBan, faGlobe, faTerminal, faSearch, faMinusCircle, faServer, faCrosshairs, faEnvelopeOpenText, faUsers, faCaretDown, faCaretUp, faPaperPlane, faTrafficLight, faInbox
}; };
}, },
@ -246,6 +260,10 @@ export default Vue.extend({
mounted() { mounted() {
this.fetchInstances(); this.fetchInstances();
this.$root.getMeta().then(meta => {
this.blockedHosts = meta.blockedHosts.join('\n');
});
}, },
beforeDestroy() { beforeDestroy() {
@ -293,6 +311,17 @@ export default Vue.extend({
}); });
}, },
deleteAllFiles() {
this.$root.api('admin/federation/delete-all-files', {
host: this.instance.host
}).then(() => {
this.$root.dialog({
type: 'success',
splash: true
});
});
},
updateInstance() { updateInstance() {
this.$root.api('admin/federation/update-instance', { this.$root.api('admin/federation/update-instance', {
host: this.instance.host, host: this.instance.host,
@ -477,6 +506,22 @@ export default Vue.extend({
}] }]
}; };
}, },
saveBlockedHosts() {
this.$root.api('admin/update-meta', {
blockedHosts: this.blockedHosts.split('\n')
}).then(() => {
this.$root.dialog({
type: 'success',
text: this.$t('saved')
});
}).catch(e => {
this.$root.dialog({
type: 'error',
text: e
});
});
}
} }
}); });
</script> </script>

View File

@ -10,6 +10,9 @@
<ui-input v-model="mascotImageUrl"><template #icon><fa icon="link"/></template>{{ $t('logo-url') }}</ui-input> <ui-input v-model="mascotImageUrl"><template #icon><fa icon="link"/></template>{{ $t('logo-url') }}</ui-input>
<ui-input v-model="bannerUrl"><template #icon><fa icon="link"/></template>{{ $t('banner-url') }}</ui-input> <ui-input v-model="bannerUrl"><template #icon><fa icon="link"/></template>{{ $t('banner-url') }}</ui-input>
<ui-input v-model="errorImageUrl"><template #icon><fa icon="link"/></template>{{ $t('error-image-url') }}</ui-input> <ui-input v-model="errorImageUrl"><template #icon><fa icon="link"/></template>{{ $t('error-image-url') }}</ui-input>
<ui-input v-model="ToSUrl"><template #icon><fa icon="link"/></template>{{ $t('tos-url') }}</ui-input>
<ui-input v-model="repositoryUrl"><template #icon><fa icon="link"/></template>{{ $t('repository-url') }}</ui-input>
<ui-input v-model="feedbackUrl"><template #icon><fa icon="link"/></template>{{ $t('feedback-url') }}</ui-input>
<ui-input v-model="languages"><template #icon><fa icon="language"/></template>{{ $t('languages') }}<template #desc>{{ $t('languages-desc') }}</template></ui-input> <ui-input v-model="languages"><template #icon><fa icon="language"/></template>{{ $t('languages') }}<template #desc>{{ $t('languages-desc') }}</template></ui-input>
</section> </section>
<section class="fit-bottom"> <section class="fit-bottom">
@ -83,9 +86,11 @@
</ui-card> </ui-card>
<ui-card> <ui-card>
<template #title>{{ $t('pinned-users') }}</template> <template #title><fa :icon="faThumbtack"/> {{ $t('pinned-users') }}</template>
<section> <section class="fit-top">
<ui-textarea v-model="pinnedUsers"></ui-textarea> <ui-textarea v-model="pinnedUsers">
<template #desc>{{ $t('pinned-users-info') }}</template>
</ui-textarea>
<ui-button @click="updateMeta">{{ $t('save') }}</ui-button> <ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
</section> </section>
</ui-card> </ui-card>
@ -144,7 +149,7 @@ import Vue from 'vue';
import i18n from '../../i18n'; import i18n from '../../i18n';
import { url, host } from '../../config'; import { url, host } from '../../config';
import { toUnicode } from 'punycode'; import { toUnicode } from 'punycode';
import { faHeadset, faShieldAlt, faGhost, faUserPlus, faBolt } from '@fortawesome/free-solid-svg-icons'; import { faHeadset, faShieldAlt, faGhost, faUserPlus, faBolt, faThumbtack } from '@fortawesome/free-solid-svg-icons';
import { faEnvelope as farEnvelope } from '@fortawesome/free-regular-svg-icons'; import { faEnvelope as farEnvelope } from '@fortawesome/free-regular-svg-icons';
export default Vue.extend({ export default Vue.extend({
@ -156,6 +161,9 @@ export default Vue.extend({
host: toUnicode(host), host: toUnicode(host),
maintainerName: null, maintainerName: null,
maintainerEmail: null, maintainerEmail: null,
ToSUrl: null,
repositoryUrl: "https://github.com/syuilo/misskey",
feedbackUrl: null,
disableRegistration: false, disableRegistration: false,
disableLocalTimeline: false, disableLocalTimeline: false,
disableGlobalTimeline: false, disableGlobalTimeline: false,
@ -198,8 +206,8 @@ export default Vue.extend({
enableServiceWorker: false, enableServiceWorker: false,
swPublicKey: null, swPublicKey: null,
swPrivateKey: null, swPrivateKey: null,
pinnedUsers: [], pinnedUsers: '',
faHeadset, faShieldAlt, faGhost, faUserPlus, farEnvelope, faBolt faHeadset, faShieldAlt, faGhost, faUserPlus, farEnvelope, faBolt, faThumbtack
}; };
}, },
@ -207,6 +215,9 @@ export default Vue.extend({
this.$root.getMeta(true).then(meta => { this.$root.getMeta(true).then(meta => {
this.maintainerName = meta.maintainerName; this.maintainerName = meta.maintainerName;
this.maintainerEmail = meta.maintainerEmail; this.maintainerEmail = meta.maintainerEmail;
this.ToSUrl = meta.ToSUrl;
this.repositoryUrl = meta.repositoryUrl;
this.feedbackUrl = meta.feedbackUrl;
this.disableRegistration = meta.disableRegistration; this.disableRegistration = meta.disableRegistration;
this.disableLocalTimeline = meta.disableLocalTimeline; this.disableLocalTimeline = meta.disableLocalTimeline;
this.disableGlobalTimeline = meta.disableGlobalTimeline; this.disableGlobalTimeline = meta.disableGlobalTimeline;
@ -268,6 +279,9 @@ export default Vue.extend({
this.$root.api('admin/update-meta', { this.$root.api('admin/update-meta', {
maintainerName: this.maintainerName, maintainerName: this.maintainerName,
maintainerEmail: this.maintainerEmail, maintainerEmail: this.maintainerEmail,
ToSUrl: this.ToSUrl,
repositoryUrl: this.repositoryUrl,
feedbackUrl: this.feedbackUrl,
disableRegistration: this.disableRegistration, disableRegistration: this.disableRegistration,
disableLocalTimeline: this.disableLocalTimeline, disableLocalTimeline: this.disableLocalTimeline,
disableGlobalTimeline: this.disableGlobalTimeline, disableGlobalTimeline: this.disableGlobalTimeline,

View File

@ -1,5 +1,5 @@
<template> <template>
<a class="a" :href="repositoryUrl" target="_blank" title="View source on GitHub"> <a class="a" :href="repositoryUrl" rel="noopener" target="_blank" title="View source on GitHub">
<svg width="80" height="80" viewBox="0 0 250 250" aria-hidden="aria-hidden"> <svg width="80" height="80" viewBox="0 0 250 250" aria-hidden="aria-hidden">
<path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path> <path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path>
<path class="octo-arm" d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor"></path> <path class="octo-arm" d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor"></path>

View File

@ -1,5 +1,5 @@
<template> <template>
<a class="zxrjzpcj" :href="url" :class="service" target="_blank"> <a class="zxrjzpcj" :href="url" :class="service" rel="noopener" target="_blank">
<fa :icon="icon" size="lg" fixed-width /><span>{{ text }}</span> <fa :icon="icon" size="lg" fixed-width /><span>{{ text }}</span>
</a> </a>
</template> </template>

View File

@ -9,7 +9,7 @@
<div class="content" v-if="!message.isDeleted"> <div class="content" v-if="!message.isDeleted">
<mfm class="text" v-if="message.text" ref="text" :text="message.text" :i="$store.state.i"/> <mfm class="text" v-if="message.text" ref="text" :text="message.text" :i="$store.state.i"/>
<div class="file" v-if="message.file"> <div class="file" v-if="message.file">
<a :href="message.file.url" target="_blank" :title="message.file.name"> <a :href="message.file.url" rel="noopener" target="_blank" :title="message.file.name">
<img v-if="message.file.type.split('/')[0] == 'image'" :src="message.file.url" :alt="message.file.name" <img v-if="message.file.type.split('/')[0] == 'image'" :src="message.file.url" :alt="message.file.name"
:style="{ backgroundColor: message.file.properties.avgColor || 'transparent' }"/> :style="{ backgroundColor: message.file.properties.avgColor || 'transparent' }"/>
<p v-else>{{ message.file.name }}</p> <p v-else>{{ message.file.name }}</p>

View File

@ -174,6 +174,7 @@ export default Vue.component('misskey-flavored-markdown', {
key: Math.random(), key: Math.random(),
props: { props: {
url: token.node.props.url, url: token.node.props.url,
rel: 'nofollow noopener',
target: '_blank' target: '_blank'
}, },
attrs: { attrs: {
@ -187,6 +188,7 @@ export default Vue.component('misskey-flavored-markdown', {
attrs: { attrs: {
class: 'link', class: 'link',
href: token.node.props.url, href: token.node.props.url,
rel: 'nofollow noopener',
target: '_blank', target: '_blank',
title: token.node.props.url, title: token.node.props.url,
style: 'color:var(--mfmLink);' style: 'color:var(--mfmLink);'

View File

@ -1,12 +1,16 @@
<template> <template>
<span class="mk-nav"> <span class="mk-nav">
<a :href="aboutUrl">{{ $t('about') }}</a> <a :href="aboutUrl">{{ $t('about') }}</a>
<template v-if="ToSUrl !== null">
<i></i> <i></i>
<a :href="repositoryUrl">{{ $t('repository') }}</a> <a :href="ToSUrl" target="_blank">{{ $t('tos') }}</a>
</template>
<i></i> <i></i>
<a :href="feedbackUrl" target="_blank">{{ $t('feedback') }}</a> <a :href="repositoryUrl" rel="noopener" target="_blank">{{ $t('repository') }}</a>
<i></i> <i></i>
<a href="/dev">{{ $t('develop') }}</a> <a :href="feedbackUrl" rel="noopener" target="_blank">{{ $t('feedback') }}</a>
<i></i>
<a href="/dev" target="_blank">{{ $t('develop') }}</a>
</span> </span>
</template> </template>
@ -21,8 +25,17 @@ export default Vue.extend({
return { return {
aboutUrl: `/docs/${lang}/about`, aboutUrl: `/docs/${lang}/about`,
repositoryUrl: 'https://github.com/syuilo/misskey', repositoryUrl: 'https://github.com/syuilo/misskey',
feedbackUrl: 'https://github.com/syuilo/misskey/issues/new' feedbackUrl: 'https://github.com/syuilo/misskey/issues/new',
ToSUrl: null
} }
},
mounted() {
this.$root.getMeta(true).then(meta => {
this.repositoryUrl = meta.repositoryUrl;
this.feedbackUrl = meta.feedbackUrl;
this.ToSUrl = meta.ToSUrl;
})
} }
}); });
</script> </script>

View File

@ -9,7 +9,7 @@
</template> </template>
<div v-if="data && !$store.state.i.twoFactorEnabled"> <div v-if="data && !$store.state.i.twoFactorEnabled">
<ol> <ol>
<li>{{ $t('authenticator') }}<a href="https://support.google.com/accounts/answer/1066447" target="_blank">{{ $t('howtoinstall') }}</a></li> <li>{{ $t('authenticator') }}<a href="https://support.google.com/accounts/answer/1066447" rel="noopener" target="_blank">{{ $t('howtoinstall') }}</a></li>
<li>{{ $t('scan') }}<br><img :src="data.qr"></li> <li>{{ $t('scan') }}<br><img :src="data.qr"></li>
<li>{{ $t('done') }}<br> <li>{{ $t('done') }}<br>
<ui-input v-model="token">{{ $t('token') }}</ui-input> <ui-input v-model="token">{{ $t('token') }}</ui-input>

View File

@ -4,21 +4,21 @@
<section v-if="enableTwitterIntegration"> <section v-if="enableTwitterIntegration">
<header><fa :icon="['fab', 'twitter']"/> Twitter</header> <header><fa :icon="['fab', 'twitter']"/> Twitter</header>
<p v-if="$store.state.i.twitter">{{ $t('connected-to') }}: <a :href="`https://twitter.com/${$store.state.i.twitter.screenName}`" target="_blank">@{{ $store.state.i.twitter.screenName }}</a></p> <p v-if="$store.state.i.twitter">{{ $t('connected-to') }}: <a :href="`https://twitter.com/${$store.state.i.twitter.screenName}`" rel="nofollow noopener" target="_blank">@{{ $store.state.i.twitter.screenName }}</a></p>
<ui-button v-if="$store.state.i.twitter" @click="disconnectTwitter">{{ $t('disconnect') }}</ui-button> <ui-button v-if="$store.state.i.twitter" @click="disconnectTwitter">{{ $t('disconnect') }}</ui-button>
<ui-button v-else @click="connectTwitter">{{ $t('connect') }}</ui-button> <ui-button v-else @click="connectTwitter">{{ $t('connect') }}</ui-button>
</section> </section>
<section v-if="enableDiscordIntegration"> <section v-if="enableDiscordIntegration">
<header><fa :icon="['fab', 'discord']"/> Discord</header> <header><fa :icon="['fab', 'discord']"/> Discord</header>
<p v-if="$store.state.i.discord">{{ $t('connected-to') }}: <a :href="`https://discordapp.com/users/${$store.state.i.discord.id}`" target="_blank">@{{ $store.state.i.discord.username }}#{{ $store.state.i.discord.discriminator }}</a></p> <p v-if="$store.state.i.discord">{{ $t('connected-to') }}: <a :href="`https://discordapp.com/users/${$store.state.i.discord.id}`" rel="nofollow noopener" target="_blank">@{{ $store.state.i.discord.username }}#{{ $store.state.i.discord.discriminator }}</a></p>
<ui-button v-if="$store.state.i.discord" @click="disconnectDiscord">{{ $t('disconnect') }}</ui-button> <ui-button v-if="$store.state.i.discord" @click="disconnectDiscord">{{ $t('disconnect') }}</ui-button>
<ui-button v-else @click="connectDiscord">{{ $t('connect') }}</ui-button> <ui-button v-else @click="connectDiscord">{{ $t('connect') }}</ui-button>
</section> </section>
<section v-if="enableGithubIntegration"> <section v-if="enableGithubIntegration">
<header><fa :icon="['fab', 'github']"/> GitHub</header> <header><fa :icon="['fab', 'github']"/> GitHub</header>
<p v-if="$store.state.i.github">{{ $t('connected-to') }}: <a :href="`https://github.com/${$store.state.i.github.login}`" target="_blank">@{{ $store.state.i.github.login }}</a></p> <p v-if="$store.state.i.github">{{ $t('connected-to') }}: <a :href="`https://github.com/${$store.state.i.github.login}`" rel="nofollow noopener" target="_blank">@{{ $store.state.i.github.login }}</a></p>
<ui-button v-if="$store.state.i.github" @click="disconnectGithub">{{ $t('disconnect') }}</ui-button> <ui-button v-if="$store.state.i.github" @click="disconnectGithub">{{ $t('disconnect') }}</ui-button>
<ui-button v-else @click="connectGithub">{{ $t('connect') }}</ui-button> <ui-button v-else @click="connectGithub">{{ $t('connect') }}</ui-button>
</section> </section>

View File

@ -543,8 +543,8 @@ export default Vue.extend({
}); });
} else { } else {
this.$root.dialog({ this.$root.dialog({
title: this.$t('update-available'), title: this.$t('@._settings.update-available'),
text: this.$t('update-available-desc') text: this.$t('@._settings.update-available-desc')
}); });
} }
}); });

View File

@ -45,7 +45,7 @@
</ui-select> </ui-select>
</label> </label>
<a href="https://assets.msky.cafe/theme/list" target="_blank">{{ $t('find-more-theme') }}</a> <a href="https://assets.msky.cafe/theme/list" rel="noopener" target="_blank">{{ $t('find-more-theme') }}</a>
<details class="creator"> <details class="creator">
<summary><fa icon="palette"/> {{ $t('create-a-theme') }}</summary> <summary><fa icon="palette"/> {{ $t('create-a-theme') }}</summary>

View File

@ -37,8 +37,13 @@
<p v-if="passwordRetypeState == 'not-match'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> {{ $t('password-not-matched') }}</p> <p v-if="passwordRetypeState == 'not-match'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> {{ $t('password-not-matched') }}</p>
</template> </template>
</ui-input> </ui-input>
<ui-switch v-model="ToSAgreement" v-if="meta.ToSUrl">
<i18n path="agree-to">
<a :href="meta.ToSUrl" target="_blank">{{ $t('tos') }}</a>
</i18n>
</ui-switch>
<div v-if="meta.enableRecaptcha" class="g-recaptcha" :data-sitekey="meta.recaptchaSiteKey" style="margin: 16px 0;"></div> <div v-if="meta.enableRecaptcha" class="g-recaptcha" :data-sitekey="meta.recaptchaSiteKey" style="margin: 16px 0;"></div>
<ui-button type="submit">{{ $t('create') }}</ui-button> <ui-button type="submit" :disabled="!(meta.ToSUrl ? ToSAgreement : true)">{{ $t('create') }}</ui-button>
</template> </template>
</form> </form>
</template> </template>
@ -64,7 +69,8 @@ export default Vue.extend({
usernameState: null, usernameState: null,
passwordStrength: '', passwordStrength: '',
passwordRetypeState: null, passwordRetypeState: null,
meta: null meta: {},
ToSAgreement: false
} }
}, },

View File

@ -4,7 +4,7 @@
<p class="empty" v-else-if="tags.length == 0"><fa icon="exclamation-circle"/>{{ $t('empty') }}</p> <p class="empty" v-else-if="tags.length == 0"><fa icon="exclamation-circle"/>{{ $t('empty') }}</p>
<div v-else> <div v-else>
<vue-word-cloud <vue-word-cloud
:words="tags.slice(0, 20).map(x => [x.name, x.count])" :words="tags.slice(0, 20).map(x => [x.tag, x.count])"
:color="color" :color="color"
:spacing="1"> :spacing="1">
<template slot-scope="{word, text, weight}"> <template slot-scope="{word, text, weight}">
@ -43,7 +43,7 @@ export default Vue.extend({
}, },
methods: { methods: {
fetch() { fetch() {
this.$root.api('aggregation/hashtags').then(tags => { this.$root.api('hashtags/trend').then(tags => {
this.tags = tags; this.tags = tags;
this.fetching = false; this.fetching = false;
}); });

View File

@ -9,7 +9,7 @@
</blockquote> </blockquote>
</div> </div>
<div v-else class="mk-url-preview"> <div v-else class="mk-url-preview">
<a :class="{ mini: narrow, compact }" :href="url" target="_blank" :title="url" v-if="!fetching"> <a :class="{ mini: narrow, compact }" :href="url" rel="nofollow noopener" target="_blank" :title="url" v-if="!fetching">
<div class="thumbnail" v-if="thumbnail" :style="`background-image: url('${thumbnail}')`"> <div class="thumbnail" v-if="thumbnail" :style="`background-image: url('${thumbnail}')`">
<button v-if="!playerEnabled && player.url" @click.prevent="playerEnabled = true" :title="$t('enable-player')"><fa :icon="['far', 'play-circle']"/></button> <button v-if="!playerEnabled && player.url" @click.prevent="playerEnabled = true" :title="$t('enable-player')"><fa :icon="['far', 'play-circle']"/></button>
</div> </div>

View File

@ -1,5 +1,5 @@
<template> <template>
<a class="mk-url" :href="url" :target="target"> <a class="mk-url" :href="url" :rel="rel" :target="target">
<span class="schema">{{ schema }}//</span> <span class="schema">{{ schema }}//</span>
<span class="hostname">{{ hostname }}</span> <span class="hostname">{{ hostname }}</span>
<span class="port" v-if="port != ''">:{{ port }}</span> <span class="port" v-if="port != ''">:{{ port }}</span>
@ -15,7 +15,7 @@ import Vue from 'vue';
import { toUnicode as decodePunycode } from 'punycode'; import { toUnicode as decodePunycode } from 'punycode';
export default Vue.extend({ export default Vue.extend({
props: ['url', 'target'], props: ['url', 'rel', 'target'],
data() { data() {
return { return {
schema: null, schema: null,

View File

@ -7,7 +7,6 @@
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import i18n from '../../../i18n'; import i18n from '../../../i18n';
import copyToClipboard from '../../../common/scripts/copy-to-clipboard';
import { faExclamationCircle, faMicrophoneSlash } from '@fortawesome/free-solid-svg-icons'; import { faExclamationCircle, faMicrophoneSlash } from '@fortawesome/free-solid-svg-icons';
import { faSnowflake } from '@fortawesome/free-regular-svg-icons'; import { faSnowflake } from '@fortawesome/free-regular-svg-icons';
@ -27,7 +26,10 @@ export default Vue.extend({
icon: ['fas', 'list'], icon: ['fas', 'list'],
text: this.$t('push-to-list'), text: this.$t('push-to-list'),
action: this.pushList action: this.pushList
}, null, { }] as any;
if (this.$store.getters.isSignedIn && this.$store.state.i.id != this.user.id) {
menu = menu.concat([null, {
icon: this.user.isMuted ? ['fas', 'eye'] : ['far', 'eye-slash'], icon: this.user.isMuted ? ['fas', 'eye'] : ['far', 'eye-slash'],
text: this.user.isMuted ? this.$t('unmute') : this.$t('mute'), text: this.user.isMuted ? this.$t('unmute') : this.$t('mute'),
action: this.toggleMute action: this.toggleMute
@ -39,7 +41,8 @@ export default Vue.extend({
icon: faExclamationCircle, icon: faExclamationCircle,
text: this.$t('report-abuse'), text: this.$t('report-abuse'),
action: this.reportAbuse action: this.reportAbuse
}]; }]);
}
if (this.$store.getters.isSignedIn && (this.$store.state.i.isAdmin || this.$store.state.i.isModerator)) { if (this.$store.getters.isSignedIn && (this.$store.state.i.isAdmin || this.$store.state.i.isModerator)) {
menu = menu.concat([null, { menu = menu.concat([null, {

View File

@ -8,7 +8,7 @@
<div class="is-remote" v-if="note.user.host != null"> <div class="is-remote" v-if="note.user.host != null">
<details> <details>
<summary><fa icon="exclamation-triangle"/> {{ $t('@.is-remote-post') }}</summary> <summary><fa icon="exclamation-triangle"/> {{ $t('@.is-remote-post') }}</summary>
<a :href="note.url || note.uri" target="_blank">{{ $t('@.view-on-remote') }}</a> <a :href="note.url || note.uri" rel="nofollow noopener" target="_blank">{{ $t('@.view-on-remote') }}</a>
</details> </details>
</div> </div>
<mk-note :note="note" :detail="true" :key="note.id"/> <mk-note :note="note" :detail="true" :key="note.id"/>

View File

@ -8,7 +8,7 @@
<div class="is-remote" v-if="user.host != null"> <div class="is-remote" v-if="user.host != null">
<details> <details>
<summary><fa icon="exclamation-triangle"/> {{ $t('@.is-remote-user') }}</summary> <summary><fa icon="exclamation-triangle"/> {{ $t('@.is-remote-user') }}</summary>
<a :href="user.url" target="_blank">{{ $t('@.view-on-remote') }}</a> <a :href="user.url" rel="nofollow noopener" target="_blank">{{ $t('@.view-on-remote') }}</a>
</details> </details>
</div> </div>
<header :style="bannerStyle"> <header :style="bannerStyle">

View File

@ -7,7 +7,7 @@
<div class="mkw-rss--body" :data-mobile="platform == 'mobile'"> <div class="mkw-rss--body" :data-mobile="platform == 'mobile'">
<p class="fetching" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p> <p class="fetching" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
<div class="feed" v-else> <div class="feed" v-else>
<a v-for="item in items" :href="item.link" target="_blank" :title="item.title">{{ item.title }}</a> <a v-for="item in items" :href="item.link" rel="nofollow noopener" target="_blank" :title="item.title">{{ item.title }}</a>
</div> </div>
</div> </div>
</ui-container> </ui-container>

View File

@ -54,7 +54,7 @@
</div> </div>
<mk-poll v-if="appearNote.poll" :note="appearNote"/> <mk-poll v-if="appearNote.poll" :note="appearNote"/>
<mk-url-preview v-for="url in urls" :url="url" :key="url" :detail="true"/> <mk-url-preview v-for="url in urls" :url="url" :key="url" :detail="true"/>
<a class="location" v-if="appearNote.geo" :href="`https://maps.google.com/maps?q=${appearNote.geo.coordinates[1]},${appearNote.geo.coordinates[0]}`" target="_blank"><fa icon="map-marker-alt"/> {{ $t('location') }}</a> <a class="location" v-if="appearNote.geo" :href="`https://maps.google.com/maps?q=${appearNote.geo.coordinates[1]},${appearNote.geo.coordinates[0]}`" rel="noopener" target="_blank"><fa icon="map-marker-alt"/> {{ $t('location') }}</a>
<div class="map" v-if="appearNote.geo" ref="map"></div> <div class="map" v-if="appearNote.geo" ref="map"></div>
<div class="renote" v-if="appearNote.renote"> <div class="renote" v-if="appearNote.renote">
<mk-note-preview :note="appearNote.renote"/> <mk-note-preview :note="appearNote.renote"/>

View File

@ -32,7 +32,7 @@
<mk-media-list :media-list="appearNote.files"/> <mk-media-list :media-list="appearNote.files"/>
</div> </div>
<mk-poll v-if="appearNote.poll" :note="appearNote" ref="pollViewer"/> <mk-poll v-if="appearNote.poll" :note="appearNote" ref="pollViewer"/>
<a class="location" v-if="appearNote.geo" :href="`https://maps.google.com/maps?q=${appearNote.geo.coordinates[1]},${appearNote.geo.coordinates[0]}`" target="_blank"><fa icon="map-marker-alt"/> 位置情報</a> <a class="location" v-if="appearNote.geo" :href="`https://maps.google.com/maps?q=${appearNote.geo.coordinates[1]},${appearNote.geo.coordinates[0]}`" rel="noopener" target="_blank"><fa icon="map-marker-alt"/> 位置情報</a>
<div class="renote" v-if="appearNote.renote"><mk-note-preview :note="appearNote.renote"/></div> <div class="renote" v-if="appearNote.renote"><mk-note-preview :note="appearNote.renote"/></div>
<mk-url-preview v-for="url in urls" :url="url" :key="url" :compact="compact"/> <mk-url-preview v-for="url in urls" :url="url" :key="url" :compact="compact"/>
</div> </div>

View File

@ -4,7 +4,7 @@
<fa icon="exclamation-triangle"/> {{ $t('@.user-suspended') }} <fa icon="exclamation-triangle"/> {{ $t('@.user-suspended') }}
</div> </div>
<div class="is-remote" v-if="user.host != null" :class="{ shadow: $store.state.device.useShadow, round: $store.state.device.roundedCorners }"> <div class="is-remote" v-if="user.host != null" :class="{ shadow: $store.state.device.useShadow, round: $store.state.device.roundedCorners }">
<fa icon="exclamation-triangle"/> {{ $t('@.is-remote-user') }}<a :href="user.url" target="_blank">{{ $t('@.view-on-remote') }}</a> <fa icon="exclamation-triangle"/> {{ $t('@.is-remote-user') }}<a :href="user.url" rel="nofollow noopener" target="_blank">{{ $t('@.view-on-remote') }}</a>
</div> </div>
<div class="main"> <div class="main">
<x-header class="header" :user="user"/> <x-header class="header" :user="user"/>

View File

@ -1,7 +1,7 @@
<template> <template>
<div class="header" :class="{ shadow: $store.state.device.useShadow, round: $store.state.device.roundedCorners }"> <div class="header" :class="{ shadow: $store.state.device.useShadow, round: $store.state.device.roundedCorners }">
<div class="banner-container" :style="style"> <div class="banner-container" :style="style">
<div class="banner" ref="banner" :style="style" @click="onBannerClick"></div> <div class="banner" ref="banner" :style="style"></div>
<div class="fade"></div> <div class="fade"></div>
<div class="title"> <div class="title">
<p class="name"> <p class="name">
@ -105,14 +105,6 @@ export default Vue.extend({
if (blur <= 10) banner.style.filter = `blur(${blur}px)`; if (blur <= 10) banner.style.filter = `blur(${blur}px)`;
}, },
onBannerClick() {
if (!this.$store.getters.isSignedIn || this.$store.state.i.id != this.user.id) return;
this.$updateBanner().then(i => {
this.user.bannerUrl = i.bannerUrl;
});
},
menu() { menu() {
this.$root.new(XUserMenu, { this.$root.new(XUserMenu, {
source: this.$refs.menu, source: this.$refs.menu,
@ -171,9 +163,6 @@ export default Vue.extend({
> .menu > .menu
height 100% height 100%
display block
position absolute
left -42px
padding 0 14px padding 0 14px
color #fff color #fff
text-shadow 0 0 8px #000 text-shadow 0 0 8px #000

View File

@ -7,6 +7,7 @@
</div> </div>
<a class="kkjnbbplepmiyuadieoenjgutgcmtsvu" v-else <a class="kkjnbbplepmiyuadieoenjgutgcmtsvu" v-else
:href="video.url" :href="video.url"
rel="nofollow noopener"
target="_blank" target="_blank"
:style="imageStyle" :style="imageStyle"
:title="video.name" :title="video.name"

View File

@ -40,7 +40,7 @@
</div> </div>
<mk-poll v-if="appearNote.poll" :note="appearNote"/> <mk-poll v-if="appearNote.poll" :note="appearNote"/>
<mk-url-preview v-for="url in urls" :url="url" :key="url" :detail="true"/> <mk-url-preview v-for="url in urls" :url="url" :key="url" :detail="true"/>
<a class="location" v-if="appearNote.geo" :href="`https://maps.google.com/maps?q=${appearNote.geo.coordinates[1]},${appearNote.geo.coordinates[0]}`" target="_blank"><fa icon="map-marker-alt"/> {{ $t('location') }}</a> <a class="location" v-if="appearNote.geo" :href="`https://maps.google.com/maps?q=${appearNote.geo.coordinates[1]},${appearNote.geo.coordinates[0]}`" rel="noopener" target="_blank"><fa icon="map-marker-alt"/> {{ $t('location') }}</a>
<div class="map" v-if="appearNote.geo" ref="map"></div> <div class="map" v-if="appearNote.geo" ref="map"></div>
<div class="renote" v-if="appearNote.renote"> <div class="renote" v-if="appearNote.renote">
<mk-note-preview :note="appearNote.renote"/> <mk-note-preview :note="appearNote.renote"/>

View File

@ -32,7 +32,7 @@
</div> </div>
<mk-poll v-if="appearNote.poll" :note="appearNote" ref="pollViewer"/> <mk-poll v-if="appearNote.poll" :note="appearNote" ref="pollViewer"/>
<mk-url-preview v-for="url in urls" :url="url" :key="url" :compact="true"/> <mk-url-preview v-for="url in urls" :url="url" :key="url" :compact="true"/>
<a class="location" v-if="appearNote.geo" :href="`https://maps.google.com/maps?q=${appearNote.geo.coordinates[1]},${appearNote.geo.coordinates[0]}`" target="_blank"><fa icon="map-marker-alt"/> {{ $t('location') }}</a> <a class="location" v-if="appearNote.geo" :href="`https://maps.google.com/maps?q=${appearNote.geo.coordinates[1]},${appearNote.geo.coordinates[0]}`" rel="noopener" target="_blank"><fa icon="map-marker-alt"/> {{ $t('location') }}</a>
<div class="renote" v-if="appearNote.renote"><mk-note-preview :note="appearNote.renote"/></div> <div class="renote" v-if="appearNote.renote"><mk-note-preview :note="appearNote.renote"/></div>
</div> </div>
<span class="app" v-if="appearNote.app && $store.state.settings.showVia">via <b>{{ appearNote.app.name }}</b></span> <span class="app" v-if="appearNote.app && $store.state.settings.showVia">via <b>{{ appearNote.app.name }}</b></span>

View File

@ -5,7 +5,7 @@
</template> </template>
<div class="wwtwuxyh" v-if="!fetching"> <div class="wwtwuxyh" v-if="!fetching">
<div class="is-suspended" v-if="user.isSuspended"><p><fa icon="exclamation-triangle"/> {{ $t('@.user-suspended') }}</p></div> <div class="is-suspended" v-if="user.isSuspended"><p><fa icon="exclamation-triangle"/> {{ $t('@.user-suspended') }}</p></div>
<div class="is-remote" v-if="user.host != null"><p><fa icon="exclamation-triangle"/> {{ $t('@.is-remote-user') }}<a :href="user.url" target="_blank">{{ $t('@.view-on-remote') }}</a></p></div> <div class="is-remote" v-if="user.host != null"><p><fa icon="exclamation-triangle"/> {{ $t('@.is-remote-user') }}<a :href="user.url" rel="nofollow noopener" target="_blank">{{ $t('@.view-on-remote') }}</a></p></div>
<header> <header>
<div class="banner" :style="style"></div> <div class="banner" :style="style"></div>
<div class="body"> <div class="body">

View File

@ -6,4 +6,4 @@ block main
block footer block footer
p p
= i18n('docs.edit-this-page-on-github') = i18n('docs.edit-this-page-on-github')
a(href=src target="_blank")= i18n('docs.edit-this-page-on-github-link') a(href=src rel="noopener" target="_blank")= i18n('docs.edit-this-page-on-github-link')

View File

@ -35,7 +35,7 @@ export class Log {
public machine: string; public machine: string;
@Column('varchar', { @Column('varchar', {
length: 1024 length: 2048
}) })
public message: string; public message: string;

View File

@ -268,4 +268,24 @@ export class Meta {
nullable: true nullable: true
}) })
public discordClientSecret: string | null; public discordClientSecret: string | null;
@Column('varchar', {
length: 512,
nullable: true
})
public ToSUrl: string | null;
@Column('varchar', {
length: 512,
default: 'https://github.com/syuilo/misskey',
nullable: false
})
public repositoryUrl: string;
@Column('varchar', {
length: 512,
default: 'https://github.com/syuilo/misskey/issues/new',
nullable: true
})
public feedbackUrl: string | null;
} }

View File

@ -43,8 +43,8 @@ export class Note {
@JoinColumn() @JoinColumn()
public renote: Note | null; public renote: Note | null;
@Column({ @Column('varchar', {
type: 'text', nullable: true length: 8192, nullable: true
}) })
public text: string | null; public text: string | null;

View File

@ -72,7 +72,10 @@ export class UserRepository extends Repository<User> {
const meId = me ? typeof me === 'string' ? me : me.id : null; const meId = me ? typeof me === 'string' ? me : me.id : null;
const relation = meId && (meId !== user.id) && opts.detail ? await this.getRelation(meId, user.id) : null; const relation = meId && (meId !== user.id) && opts.detail ? await this.getRelation(meId, user.id) : null;
const pins = opts.detail ? await UserNotePinings.find({ userId: user.id }) : []; const pins = opts.detail ? await UserNotePinings.find({
where: { userId: user.id },
order: { id: 'DESC' }
}) : [];
const profile = opts.detail ? await UserProfiles.findOne(user.id).then(ensure) : null; const profile = opts.detail ? await UserProfiles.findOne(user.id).then(ensure) : null;
const falsy = opts.detail ? false : undefined; const falsy = opts.detail ? false : undefined;

View File

@ -474,9 +474,15 @@ export async function updateFeatured(userId: User['id']) {
.slice(0, 5) .slice(0, 5)
.map(item => limit(() => resolveNote(item, resolver)))); .map(item => limit(() => resolveNote(item, resolver))));
// delete
await UserNotePinings.delete({ userId: user.id });
// とりあえずidを別の時間で生成して順番を維持
let td = 0;
for (const note of featuredNotes.filter(note => note != null)) { for (const note of featuredNotes.filter(note => note != null)) {
td -= 1000;
UserNotePinings.save({ UserNotePinings.save({
id: genId(), id: genId(new Date(Date.now() + td)),
createdAt: new Date(), createdAt: new Date(),
userId: user.id, userId: user.id,
noteId: note!.id noteId: note!.id

View File

@ -21,7 +21,10 @@ export default async (ctx: Router.IRouterContext) => {
return; return;
} }
const pinings = await UserNotePinings.find({ userId: user.id }); const pinings = await UserNotePinings.find({
where: { userId: user.id },
order: { id: 'DESC' }
});
const pinnedNotes = await Promise.all(pinings.map(pining => const pinnedNotes = await Promise.all(pinings.map(pining =>
Notes.findOne(pining.noteId).then(ensure))); Notes.findOne(pining.noteId).then(ensure)));

View File

@ -0,0 +1,27 @@
import $ from 'cafy';
import define from '../../../define';
import del from '../../../../../services/drive/delete-file';
import { DriveFiles } from '../../../../../models';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireModerator: true,
params: {
host: {
validator: $.str
}
}
};
export default define(meta, async (ps, me) => {
const files = await DriveFiles.find({
userHost: ps.host
});
for (const file of files) {
del(file);
}
});

View File

@ -70,6 +70,13 @@ export const meta = {
} }
}, },
blockedHosts: {
validator: $.optional.nullable.arr($.str),
desc: {
'ja-JP': 'ブロックするホスト'
}
},
mascotImageUrl: { mascotImageUrl: {
validator: $.optional.nullable.str, validator: $.optional.nullable.str,
desc: { desc: {
@ -330,6 +337,27 @@ export const meta = {
'ja-JP': 'ServiceWorkerのVAPIDキーペアの秘密鍵' 'ja-JP': 'ServiceWorkerのVAPIDキーペアの秘密鍵'
} }
}, },
ToSUrl: {
validator: $.optional.nullable.str,
desc: {
'ja-JP': '利用規約のURL'
}
},
repositoryUrl: {
validator: $.optional.str,
desc: {
'ja-JP': 'リポジトリのURL'
}
},
feedbackUrl: {
validator: $.optional.str,
desc: {
'ja-JP': 'フィードバックのURL'
}
}
} }
}; };
@ -368,6 +396,10 @@ export default define(meta, async (ps) => {
set.hiddenTags = ps.hiddenTags; set.hiddenTags = ps.hiddenTags;
} }
if (Array.isArray(ps.blockedHosts)) {
set.blockedHosts = ps.blockedHosts;
}
if (ps.mascotImageUrl !== undefined) { if (ps.mascotImageUrl !== undefined) {
set.mascotImageUrl = ps.mascotImageUrl; set.mascotImageUrl = ps.mascotImageUrl;
} }
@ -516,6 +548,18 @@ export default define(meta, async (ps) => {
set.swPrivateKey = ps.swPrivateKey; set.swPrivateKey = ps.swPrivateKey;
} }
if (ps.ToSUrl !== undefined) {
set.ToSUrl = ps.ToSUrl;
}
if (ps.repositoryUrl !== undefined) {
set.repositoryUrl = ps.repositoryUrl;
}
if (ps.feedbackUrl !== undefined) {
set.feedbackUrl = ps.feedbackUrl;
}
await getConnection().transaction(async transactionalEntityManager => { await getConnection().transaction(async transactionalEntityManager => {
const meta = await transactionalEntityManager.findOne(Meta, { const meta = await transactionalEntityManager.findOne(Meta, {
order: { order: {

View File

@ -106,6 +106,9 @@ export default define(meta, async (ps, me) => {
uri: config.url, uri: config.url,
description: instance.description, description: instance.description,
langs: instance.langs, langs: instance.langs,
ToSUrl: instance.ToSUrl,
repositoryUrl: instance.repositoryUrl,
feedbackUrl: instance.feedbackUrl,
secure: config.https != null, secure: config.https != null,
machine: os.hostname(), machine: os.hostname(),
@ -162,6 +165,7 @@ export default define(meta, async (ps, me) => {
response.useStarForReactionFallback = instance.useStarForReactionFallback; response.useStarForReactionFallback = instance.useStarForReactionFallback;
response.pinnedUsers = instance.pinnedUsers; response.pinnedUsers = instance.pinnedUsers;
response.hiddenTags = instance.hiddenTags; response.hiddenTags = instance.hiddenTags;
response.blockedHosts = instance.blockedHosts;
response.recaptchaSecretKey = instance.recaptchaSecretKey; response.recaptchaSecretKey = instance.recaptchaSecretKey;
response.proxyAccount = instance.proxyAccount; response.proxyAccount = instance.proxyAccount;
response.twitterConsumerKey = instance.twitterConsumerKey; response.twitterConsumerKey = instance.twitterConsumerKey;

View File

@ -26,6 +26,9 @@ const nodeinfo2 = async () => {
maintainerName, maintainerName,
maintainerEmail, maintainerEmail,
langs, langs,
ToSUrl,
repositoryUrl,
feedbackUrl,
announcements, announcements,
disableRegistration, disableRegistration,
disableLocalTimeline, disableLocalTimeline,
@ -77,6 +80,9 @@ const nodeinfo2 = async () => {
email: maintainerEmail email: maintainerEmail
}, },
langs, langs,
ToSUrl,
repositoryUrl,
feedbackUrl,
announcements, announcements,
disableRegistration, disableRegistration,
disableLocalTimeline, disableLocalTimeline,

View File

@ -26,6 +26,9 @@ block meta
meta(name='twitter:card' content='summary') meta(name='twitter:card' content='summary')
// todo // todo
if user.host
meta(name='robots' content='noindex')
if user.twitter if user.twitter
meta(name='twitter:creator' content=`@${user.twitter.screenName}`) meta(name='twitter:creator' content=`@${user.twitter.screenName}`)

View File

@ -24,6 +24,9 @@ block meta
meta(name='twitter:card' content='summary') meta(name='twitter:card' content='summary')
if user.host
meta(name='robots' content='noindex')
if profile.twitter if profile.twitter
meta(name='twitter:creator' content=`@${profile.twitter.screenName}`) meta(name='twitter:creator' content=`@${profile.twitter.screenName}`)