Compare commits
	
		
			75 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | f1047f1ce5 | ||
|   | 9beddc941a | ||
|   | 3a6a01d2d6 | ||
|   | e0e4bdbdbc | ||
|   | b3daf79b6a | ||
|   | 81aa21915b | ||
|   | 5aadd80243 | ||
|   | 23350b1cbc | ||
|   | daff0977cb | ||
|   | c1e7d56ff8 | ||
|   | 61aef56f83 | ||
|   | 249f591403 | ||
|   | 36599c82d1 | ||
|   | 7615b1ea0a | ||
|   | d8de9f8eba | ||
|   | 8c0e65ce6f | ||
|   | 9aa24c0552 | ||
|   | 47bf06f432 | ||
|   | 99d291c71b | ||
|   | d51cafca74 | ||
|   | 7921f8cd43 | ||
| ![imgbot[bot]](/assets/img/avatar_default.png)  | 1b8467d5e5 | ||
|   | e13b2689b5 | ||
|   | 9c167acbd9 | ||
|   | 1bc531edbd | ||
|   | b4d0db9202 | ||
|   | bd2b681367 | ||
|   | f0edf81cc4 | ||
|   | e81ac05ba6 | ||
|   | 6279ce8f22 | ||
|   | 0fd20cf588 | ||
|   | f2d55e7f60 | ||
|   | 963b0db3d3 | ||
|   | aeca115a37 | ||
|   | 6f97142b59 | ||
|   | b31d1ce61d | ||
|   | b07cd37a16 | ||
|   | 69b74a46b9 | ||
|   | 882d829558 | ||
|   | 532821d503 | ||
|   | 522ce67498 | ||
|   | 0e046faf4a | ||
|   | d9092dc81f | ||
|   | 92a4e90026 | ||
|   | 07dccad5b1 | ||
|   | 146b0d2889 | ||
|   | 388565fb10 | ||
|   | da4ba51a74 | ||
|   | 1edcd136a4 | ||
|   | 9883c751da | ||
|   | f78b28b995 | ||
|   | 54d40420ad | ||
|   | ba1492f977 | ||
|   | efd0368e56 | ||
|   | a766a57af9 | ||
|   | 3bdd8a2d90 | ||
|   | 7ef1205f8b | ||
|   | e8db63e788 | ||
|   | 0bcef2453c | ||
|   | b9f549135c | ||
|   | 87b0017386 | ||
|   | cc8ff556d4 | ||
|   | 021f74da54 | ||
|   | f9389802d7 | ||
|   | 18dd172c97 | ||
|   | 1d5a54ff6f | ||
|   | 03e2c7eec6 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 0902727d1c | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 496895634d | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 9414e9e258 | ||
|   | 357528d139 | ||
|   | c4efbdf4c7 | ||
|   | fb4a921cd9 | ||
|   | 683b242215 | ||
|   | a5660d6c82 | 
| @@ -16,19 +16,8 @@ executors: | ||||
|     working_directory: /tmp/workspace | ||||
|     docker: | ||||
|       - image: docker:latest | ||||
|   alpine: | ||||
|     working_directory: /tmp/workspace | ||||
|     docker: | ||||
|       - image: alpine:latest | ||||
|  | ||||
| jobs: | ||||
|   ok: | ||||
|     executor: alpine | ||||
|     steps: | ||||
|       - run: | ||||
|           name: OK | ||||
|           command: | | ||||
|             echo -e '\033[0;32mOK\033[0;39m' | ||||
|   build: | ||||
|     executor: default | ||||
|     steps: | ||||
| @@ -64,8 +53,6 @@ jobs: | ||||
|           key: yarn-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-package-{{ checksum "package.json" }}-lock-{{ checksum "yarn.lock" }} | ||||
|           paths: | ||||
|             - node_modules | ||||
| #      - store_artifacts: | ||||
| #          path: built | ||||
|       - persist_to_workspace: | ||||
|           root: . | ||||
|           paths: | ||||
| @@ -134,47 +121,73 @@ workflows: | ||||
|   version: 2 | ||||
|   nodejs: | ||||
|     jobs: | ||||
|       - ok: | ||||
|           filters: | ||||
|             branches: | ||||
|               only: | ||||
|                 - l10n_develop | ||||
|                 - imgbot | ||||
|                 - patch-autogen | ||||
|       - hold: | ||||
|           name: manual-build-trigger | ||||
|           type: approval | ||||
|           filters: | ||||
|             branches: | ||||
|               ignore: master | ||||
|       - build: | ||||
|           name: manual-build | ||||
|           requires: | ||||
|             - hold | ||||
|       - test: | ||||
|           executor: with-redis | ||||
|           requires: | ||||
|             - build | ||||
|       - test: | ||||
|           without_redis: true | ||||
|           requires: | ||||
|             - build | ||||
|   docker: | ||||
|     jobs: | ||||
|       - ok: | ||||
|             - manual-build-trigger | ||||
|           filters: | ||||
|             branches: | ||||
|               ignore: master | ||||
|       - build: | ||||
|           name: auto-build | ||||
|           filters: | ||||
|             branches: | ||||
|               only: master | ||||
|       - test: | ||||
|           name: manual-test-with-redis | ||||
|           executor: with-redis | ||||
|           requires: | ||||
|             - manual-build | ||||
|           filters: | ||||
|             branches: | ||||
|               ignore: master | ||||
|       - test: | ||||
|           name: auto-test-without-redis | ||||
|           executor: with-redis | ||||
|           requires: | ||||
|             - auto-build | ||||
|           filters: | ||||
|             branches: | ||||
|               only: master | ||||
|       - test: | ||||
|           name: manual-test-with-redis | ||||
|           without_redis: true | ||||
|           requires: | ||||
|             - manual-build | ||||
|           filters: | ||||
|             branches: | ||||
|               ignore: master | ||||
|       - test: | ||||
|           name: auto-test-without-redis | ||||
|           without_redis: true | ||||
|           requires: | ||||
|             - auto-build | ||||
|           filters: | ||||
|             branches: | ||||
|               only: master | ||||
|   docker: | ||||
|     jobs: | ||||
|       - hold: | ||||
|           name: manual-build-trigger | ||||
|           type: approval | ||||
|           filters: | ||||
|             branches: | ||||
|               ignore: master | ||||
|       - docker: | ||||
|           name: manual-build | ||||
|           requires: | ||||
|             - hold | ||||
|             - manual-build-trigger | ||||
|           filters: | ||||
|             branches: | ||||
|               ignore: master | ||||
|       - docker: | ||||
|           name: auto-build | ||||
|           with_deploy: true | ||||
|           filters: | ||||
|             branches: | ||||
|   | ||||
							
								
								
									
										35
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										35
									
								
								CHANGELOG.md
									
									
									
									
									
								
							| @@ -1,6 +1,41 @@ | ||||
| ChangeLog | ||||
| ========= | ||||
|  | ||||
| 10.87.5 | ||||
| ---------- | ||||
| * モバイル版でも連携サービスを表示するように | ||||
| * webfingerのacceptが反映されない問題を修正 | ||||
| * 返信が遷移後も残り続ける問題を修正 | ||||
| * デザインの調整 | ||||
|  | ||||
| 10.87.4 | ||||
| ---------- | ||||
| * フォローリクエストを許可するときにエラーになる問題を修正 | ||||
| * デザインの調整 | ||||
|  | ||||
| 10.87.3 | ||||
| ---------- | ||||
| * 開発モードでビルドしてもスクリプトが404になる問題を修正 | ||||
| * 拡張子判別だとアイコンやバナー設定で対応していないと表示される問題を修正 | ||||
| * フォローリクエスト数がおかしい場合の応急処置APIを追加 | ||||
| * デザインの調整 | ||||
|  | ||||
| 10.87.2 | ||||
| ---------- | ||||
| * みつけるの人気のタグを第2ソートで連合含めたユーザー数にしたりユーザーのタグ以外は除外するように | ||||
| * デザインの調整 | ||||
|  | ||||
| 10.87.1 | ||||
| ---------- | ||||
| * ハッシュタグ検索で大文字小文字が区別されてしまう問題を修正 | ||||
|  | ||||
| 10.87.0 | ||||
| ---------- | ||||
| * ハッシュタグでユーザー検索できるように | ||||
| * Exploreページに新規ユーザー一覧を追加 | ||||
| * デッキ使用中にホーム扱いで開かれた時にタイムラインボタン等がない問題を修正 | ||||
| * デッキ使用中に / 以外でリロードした際にホームモードになる問題を修正 | ||||
|  | ||||
| 10.86.2 | ||||
| ---------- | ||||
| * 別タブでルートより下を開いたときにはデッキにしないように | ||||
|   | ||||
| @@ -32,6 +32,7 @@ FROM base AS runner | ||||
| RUN apk add --no-cache \ | ||||
|     ffmpeg \ | ||||
|     tini | ||||
| RUN npm i -g web-push | ||||
| ENTRYPOINT ["/sbin/tini", "--"] | ||||
|  | ||||
| COPY --from=builder /misskey/node_modules ./node_modules | ||||
|   | ||||
| @@ -61,6 +61,14 @@ Organize and store your files! Want to post a picture you have already uploaded? | ||||
|  | ||||
| ...and more! Experience Misskey with your own eyes at [misskey.xyz](https://misskey.xyz) or join one of the [other instances](https://joinmisskey.github.io/) that are available. | ||||
|  | ||||
| Screen shots | ||||
| ---------------------------------------------------------------- | ||||
| ### Profile page | ||||
| <img src="/assets/ss/user.jpg" width="500px"/> | ||||
|  | ||||
| ### Explore users | ||||
| <img src="/assets/ss/explore.jpg" width="500px"/> | ||||
|  | ||||
| :new: What's new | ||||
| ---------------------------------------------------------------- | ||||
| Please see the [Release notes](./CHANGELOG.md). | ||||
|   | ||||
							
								
								
									
										
											BIN
										
									
								
								assets/ss/explore.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								assets/ss/explore.jpg
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 238 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/ss/user.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								assets/ss/user.jpg
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 148 KiB | 
| @@ -28,6 +28,8 @@ common: | ||||
|   load-more: "もっと読み込む" | ||||
|   enter-password: "パスワードを入力してください" | ||||
|   2fa: "二段階認証" | ||||
|   customize-home: "ホームをカスタマイズ" | ||||
|   featured-notes: "ハイライト" | ||||
|   got-it: "わかった" | ||||
|   customization-tips: | ||||
|     title: "カスタマイズのヒント" | ||||
| @@ -56,6 +58,14 @@ common: | ||||
|   trash: "ゴミ箱" | ||||
|   drive: "ドライブ" | ||||
|   messaging: "トーク" | ||||
|   deck: "デッキ" | ||||
|   timeline: "タイムライン" | ||||
|   explore: "みつける" | ||||
|   following: "フォロー中" | ||||
|   followers: "フォロワー" | ||||
|   empty-timeline-info: | ||||
|     follow-users-to-make-your-timeline: "ユーザーをフォローすると投稿がタイムラインに表示されます。" | ||||
|     explore: "ユーザーを探索する" | ||||
|   weekday-short: | ||||
|     sunday: "日" | ||||
|     monday: "月" | ||||
| @@ -197,6 +207,17 @@ auth/views/index.vue: | ||||
|   please-go-back: "アプリケーションに戻って、やっていってください。" | ||||
|   error: "セッションが存在しません。" | ||||
|   sign-in: "サインインしてください" | ||||
| common/views/pages/explore.vue: | ||||
|   verified-users: "公式アカウント" | ||||
|   popular-users: "人気のユーザー" | ||||
|   recently-updated-users: "最近投稿したユーザー" | ||||
|   recently-registered-users: "新規ユーザー" | ||||
|   popular-tags: "人気のタグ" | ||||
|   federated: "連合" | ||||
|   explore: "{host}を探索" | ||||
|   users-info: "現在{users}ユーザーが登録されています" | ||||
| common/views/components/user-list.vue: | ||||
|   no-users: "ユーザーがいません" | ||||
| common/views/components/games/reversi/reversi.vue: | ||||
|   matching: | ||||
|     waiting-for: "{}を待っています" | ||||
| @@ -684,12 +705,6 @@ desktop/views/components/following-window.vue: | ||||
|   following: "{} のフォロー" | ||||
| desktop/views/components/following.vue: | ||||
|   empty: "フォロー中のユーザーはいないようです。" | ||||
| desktop/views/components/friends-maker.vue: | ||||
|   title: "気になるユーザーをフォロー:" | ||||
|   empty: "おすすめのユーザーは見つかりませんでした。" | ||||
|   fetching: "読み込んでいます" | ||||
|   refresh: "もっと見る" | ||||
|   close: "閉じる" | ||||
| desktop/views/components/game-window.vue: | ||||
|   game: "リバーシ" | ||||
| desktop/views/components/home.vue: | ||||
| @@ -770,6 +785,8 @@ desktop/views/components/renote-form.vue: | ||||
|   failure: "Renoteに失敗しました" | ||||
| desktop/views/components/renote-form-window.vue: | ||||
|   title: "この投稿をRenoteしますか?" | ||||
| desktop/views/components/timeline.core.vue: | ||||
|   empty: "投稿がありません" | ||||
| desktop/views/pages/user-following-or-followers.vue: | ||||
|   following: "{user}のフォロー" | ||||
|   followers: "{user}のフォロワー" | ||||
| @@ -798,13 +815,9 @@ desktop/views/components/settings.vue: | ||||
|   web-search-engine-desc: "例: https://www.google.com/?#q={{query}}" | ||||
|   auto-popout: "ウィンドウの自動ポップアウト" | ||||
|   auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。" | ||||
|   deck-nav: "デッキ内ナビゲーション" | ||||
|   deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。" | ||||
|   keep-cw: "CW保持" | ||||
|   keep-cw-desc: "投稿にリプライする際、リプライ元の投稿にCWが設定されていたとき、デフォルトで同じCWを設定するようにします。" | ||||
|   deck-default: "デッキをデフォルトのUIにする" | ||||
|   display: "デザインと表示" | ||||
|   customize: "ホームをカスタマイズ" | ||||
|   wallpaper: "壁紙" | ||||
|   choose-wallpaper: "壁紙を選択" | ||||
|   delete-wallpaper: "壁紙を削除" | ||||
| @@ -961,14 +974,11 @@ desktop/views/components/ui.header.account.vue: | ||||
|   favorites: "お気に入り" | ||||
|   lists: "リスト" | ||||
|   follow-requests: "フォロー申請" | ||||
|   customize: "ホームのカスタマイズ" | ||||
|   admin: "管理" | ||||
|   settings: "設定" | ||||
|   signout: "サインアウト" | ||||
|   dark: "闇に飲まれる" | ||||
| desktop/views/components/ui.header.nav.vue: | ||||
|   home: "ホーム" | ||||
|   deck: "デッキ" | ||||
|   game: "ゲーム" | ||||
| desktop/views/components/ui.header.notifications.vue: | ||||
|   title: "通知" | ||||
| @@ -1091,6 +1101,7 @@ admin/views/instance.vue: | ||||
|   smtp-secure-info: "STARTTLS使用時はオフにします。" | ||||
|   smtp-host: "SMTPホスト" | ||||
|   smtp-port: "SMTPポート" | ||||
|   smtp-auth: "SMTP認証を行う" | ||||
|   smtp-user: "SMTPユーザー" | ||||
|   smtp-pass: "SMTPパスワード" | ||||
|   serviceworker-config: "ServiceWorker" | ||||
| @@ -1306,8 +1317,6 @@ desktop/views/pages/welcome.vue: | ||||
|   info: "情報" | ||||
| desktop/views/pages/drive.vue: | ||||
|   title: "Misskey Drive" | ||||
| desktop/views/pages/home-customize.vue: | ||||
|   title: "ホームのカスタマイズ" | ||||
| desktop/views/pages/note.vue: | ||||
|   prev: "前の投稿" | ||||
|   next: "次の投稿" | ||||
| @@ -1339,18 +1348,17 @@ desktop/views/pages/user/user.photos.vue: | ||||
|   title: "フォト" | ||||
|   loading: "読み込み中" | ||||
|   no-photos: "写真はありません" | ||||
| desktop/views/pages/user/user.profile.vue: | ||||
|   follows-you: "フォローされています" | ||||
|   menu: "メニュー" | ||||
| desktop/views/pages/user/user.header.vue: | ||||
|   posts: "投稿" | ||||
|   following: "フォロー" | ||||
|   followers: "フォロワー" | ||||
|   is-bot: "このアカウントはBotです" | ||||
|   no-description: "自己紹介はありません" | ||||
|   years-old: "{age}歳" | ||||
|   year: "年" | ||||
|   month: "月" | ||||
|   day: "日" | ||||
|   follows-you: "フォローされています" | ||||
| desktop/views/pages/user/user.timeline.vue: | ||||
|   default: "投稿" | ||||
|   with-replies: "投稿と返信" | ||||
| @@ -1418,12 +1426,6 @@ common/views/components/follow-button.vue: | ||||
|   request-pending: "フォロー許可待ち" | ||||
|   follow-processing: "フォロー処理中" | ||||
|   follow-request: "フォロー申請" | ||||
| mobile/views/components/friends-maker.vue: | ||||
|   title: "気になるユーザーをフォロー" | ||||
|   empty: "おすすめのユーザーは見つかりませんでした。" | ||||
|   fetching: "読み込んでいます" | ||||
|   refresh: "もっと見る" | ||||
|   close: "閉じる" | ||||
| mobile/views/components/note.vue: | ||||
|   private: "この投稿は非公開です" | ||||
|   deleted: "この投稿は削除されました" | ||||
| @@ -1481,9 +1483,6 @@ mobile/views/components/ui.nav.vue: | ||||
| mobile/views/components/user-timeline.vue: | ||||
|   no-notes: "このユーザーは投稿していないようです。" | ||||
|   no-notes-with-media: "メディア付き投稿はありません。" | ||||
| mobile/views/components/users-list.vue: | ||||
|   all: "すべて" | ||||
|   known: "知り合い" | ||||
| mobile/views/pages/favorites.vue: | ||||
|   title: "お気に入り" | ||||
| mobile/views/pages/user-lists.vue: | ||||
| @@ -1502,6 +1501,8 @@ mobile/views/pages/home.vue: | ||||
|   global: "グローバル" | ||||
|   mentions: "あなた宛て" | ||||
|   messages: "メッセージ" | ||||
| mobile/views/pages/home.timeline.vue: | ||||
|   empty: "投稿がありません" | ||||
| mobile/views/pages/tag.vue: | ||||
|   no-posts-found: "ハッシュタグ「{q}」が付けられた投稿は見つかりませんでした。" | ||||
| mobile/views/pages/welcome.vue: | ||||
| @@ -1594,10 +1595,6 @@ mobile/views/pages/user/home.vue: | ||||
|   frequently-replied-users: "よく話すユーザー" | ||||
|   followers-you-know: "知り合いのフォロワー" | ||||
|   last-used-at: "最終ログイン" | ||||
| mobile/views/pages/user/home.followers-you-know.vue: | ||||
|   no-users: "知り合いのユーザーはいません" | ||||
| mobile/views/pages/user/home.friends.vue: | ||||
|   no-users: "よく話すユーザーはいません" | ||||
| mobile/views/pages/user/home.notes.vue: | ||||
|   no-notes: "投稿はありません" | ||||
| mobile/views/pages/user/home.photos.vue: | ||||
| @@ -1622,6 +1619,9 @@ deck: | ||||
|   rename: "名前を変更" | ||||
|   stack-left: "左に重ねる" | ||||
|   pop-right: "右に出す" | ||||
|   disabled-timeline: | ||||
|     title: "無効化されたタイムライン" | ||||
|     description: "サーバーの運営者により、このタイムラインは使用できない状態に設定されています。" | ||||
| deck/deck.tl-column.vue: | ||||
|   is-media-only: "メディア投稿のみ" | ||||
|   is-media-view: "メディアビュー" | ||||
|   | ||||
| @@ -28,6 +28,8 @@ common: | ||||
|   load-more: "Mehr laden" | ||||
|   enter-password: "Bitte Passwort eingeben" | ||||
|   2fa: "Zwei-Faktor-Authentifizierung" | ||||
|   customize-home: "ホームをカスタマイズ" | ||||
|   featured-notes: "ハイライト" | ||||
|   got-it: "Verstanden!" | ||||
|   customization-tips: | ||||
|     title: "Anpassung-Tipps" | ||||
| @@ -56,6 +58,14 @@ common: | ||||
|   trash: "Papierkorb" | ||||
|   drive: "Drive" | ||||
|   messaging: "Unterhaltungen" | ||||
|   deck: "デッキ" | ||||
|   timeline: "タイムライン" | ||||
|   explore: "みつける" | ||||
|   following: "フォロー中" | ||||
|   followers: "フォロワー" | ||||
|   empty-timeline-info: | ||||
|     follow-users-to-make-your-timeline: "ユーザーをフォローすると投稿がタイムラインに表示されます。" | ||||
|     explore: "ユーザーを探索する" | ||||
|   weekday-short: | ||||
|     sunday: "So" | ||||
|     monday: "Mo" | ||||
| @@ -197,6 +207,17 @@ auth/views/index.vue: | ||||
|   please-go-back: "Bitte gehe zurück zur Anwendung." | ||||
|   error: "Sitzung ist nicht vorhanden." | ||||
|   sign-in: "Bitte melde dich an." | ||||
| common/views/pages/explore.vue: | ||||
|   verified-users: "公式アカウント" | ||||
|   popular-users: "人気のユーザー" | ||||
|   recently-updated-users: "最近投稿したユーザー" | ||||
|   recently-registered-users: "新規ユーザー" | ||||
|   popular-tags: "人気のタグ" | ||||
|   federated: "連合" | ||||
|   explore: "{host}を探索" | ||||
|   users-info: "現在{users}ユーザーが登録されています" | ||||
| common/views/components/user-list.vue: | ||||
|   no-users: "ユーザーがいません" | ||||
| common/views/components/games/reversi/reversi.vue: | ||||
|   matching: | ||||
|     waiting-for: "Warten auf {}" | ||||
| @@ -684,12 +705,6 @@ desktop/views/components/following-window.vue: | ||||
|   following: "{} のフォロー" | ||||
| desktop/views/components/following.vue: | ||||
|   empty: "Du folgst niemanden" | ||||
| desktop/views/components/friends-maker.vue: | ||||
|   title: "Wem folgen?" | ||||
|   empty: "Der ausgewählte Benutzer konnte nicht gefunden werden." | ||||
|   fetching: "Lade…" | ||||
|   refresh: "Mehr" | ||||
|   close: "Schließen" | ||||
| desktop/views/components/game-window.vue: | ||||
|   game: "リバーシ" | ||||
| desktop/views/components/home.vue: | ||||
| @@ -770,6 +785,8 @@ desktop/views/components/renote-form.vue: | ||||
|   failure: "Weitersagen fehlgeschlagen" | ||||
| desktop/views/components/renote-form-window.vue: | ||||
|   title: "Bist du dir sicher, dass du das reposten willst?" | ||||
| desktop/views/components/timeline.core.vue: | ||||
|   empty: "投稿がありません" | ||||
| desktop/views/pages/user-following-or-followers.vue: | ||||
|   following: "{user}のフォロー" | ||||
|   followers: "{user}のフォロワー" | ||||
| @@ -798,13 +815,9 @@ desktop/views/components/settings.vue: | ||||
|   web-search-engine-desc: "例: https://www.google.com/?#q={{query}}" | ||||
|   auto-popout: "Automatische Pop-out Fenster" | ||||
|   auto-popout-desc: "Pop-out ein offenes Fenster wenn möglich. Diese Einstellung wird im Browser gespeichert." | ||||
|   deck-nav: "デッキ内ナビゲーション" | ||||
|   deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。" | ||||
|   keep-cw: "CW保持" | ||||
|   keep-cw-desc: "投稿にリプライする際、リプライ元の投稿にCWが設定されていたとき、デフォルトで同じCWを設定するようにします。" | ||||
|   deck-default: "デッキをデフォルトのUIにする" | ||||
|   display: "Erscheinungsbild und Anzeige" | ||||
|   customize: "Startseite anpassen" | ||||
|   wallpaper: "壁紙" | ||||
|   choose-wallpaper: "壁紙を選択" | ||||
|   delete-wallpaper: "壁紙を削除" | ||||
| @@ -961,14 +974,11 @@ desktop/views/components/ui.header.account.vue: | ||||
|   favorites: "Favoriten" | ||||
|   lists: "Listen" | ||||
|   follow-requests: "フォロー申請" | ||||
|   customize: "ホームのカスタマイズ" | ||||
|   admin: "管理" | ||||
|   settings: "Einstellungen" | ||||
|   signout: "Ausloggen" | ||||
|   dark: "Verdunkeln" | ||||
| desktop/views/components/ui.header.nav.vue: | ||||
|   home: "Home" | ||||
|   deck: "デッキ" | ||||
|   game: "Spielen" | ||||
| desktop/views/components/ui.header.notifications.vue: | ||||
|   title: "Benachrichtigungen" | ||||
| @@ -1091,6 +1101,7 @@ admin/views/instance.vue: | ||||
|   smtp-secure-info: "STARTTLS使用時はオフにします。" | ||||
|   smtp-host: "SMTPホスト" | ||||
|   smtp-port: "SMTPポート" | ||||
|   smtp-auth: "SMTP認証を行う" | ||||
|   smtp-user: "SMTPユーザー" | ||||
|   smtp-pass: "SMTPパスワード" | ||||
|   serviceworker-config: "ServiceWorker" | ||||
| @@ -1306,8 +1317,6 @@ desktop/views/pages/welcome.vue: | ||||
|   info: "情報" | ||||
| desktop/views/pages/drive.vue: | ||||
|   title: "Misskey Drive" | ||||
| desktop/views/pages/home-customize.vue: | ||||
|   title: "ホームのカスタマイズ" | ||||
| desktop/views/pages/note.vue: | ||||
|   prev: "Vorheriger Kommentar" | ||||
|   next: "Nächster Kommentar" | ||||
| @@ -1339,18 +1348,17 @@ desktop/views/pages/user/user.photos.vue: | ||||
|   title: "フォト" | ||||
|   loading: "読み込み中" | ||||
|   no-photos: "写真はありません" | ||||
| desktop/views/pages/user/user.profile.vue: | ||||
|   follows-you: "フォローされています" | ||||
|   menu: "メニュー" | ||||
| desktop/views/pages/user/user.header.vue: | ||||
|   posts: "投稿" | ||||
|   following: "フォロー" | ||||
|   followers: "フォロワー" | ||||
|   is-bot: "このアカウントはBotです" | ||||
|   no-description: "自己紹介はありません" | ||||
|   years-old: "{age}歳" | ||||
|   year: "年" | ||||
|   month: "月" | ||||
|   day: "日" | ||||
|   follows-you: "フォローされています" | ||||
| desktop/views/pages/user/user.timeline.vue: | ||||
|   default: "投稿" | ||||
|   with-replies: "投稿と返信" | ||||
| @@ -1418,12 +1426,6 @@ common/views/components/follow-button.vue: | ||||
|   request-pending: "フォロー許可待ち" | ||||
|   follow-processing: "フォロー処理中" | ||||
|   follow-request: "フォロー申請" | ||||
| mobile/views/components/friends-maker.vue: | ||||
|   title: "気になるユーザーをフォロー" | ||||
|   empty: "おすすめのユーザーは見つかりませんでした。" | ||||
|   fetching: "Lade…" | ||||
|   refresh: "もっと見る" | ||||
|   close: "閉じる" | ||||
| mobile/views/components/note.vue: | ||||
|   private: "この投稿は非公開です" | ||||
|   deleted: "この投稿は削除されました" | ||||
| @@ -1481,9 +1483,6 @@ mobile/views/components/ui.nav.vue: | ||||
| mobile/views/components/user-timeline.vue: | ||||
|   no-notes: "このユーザーは投稿していないようです。" | ||||
|   no-notes-with-media: "メディア付き投稿はありません。" | ||||
| mobile/views/components/users-list.vue: | ||||
|   all: "すべて" | ||||
|   known: "知り合い" | ||||
| mobile/views/pages/favorites.vue: | ||||
|   title: "Favoriten" | ||||
| mobile/views/pages/user-lists.vue: | ||||
| @@ -1502,6 +1501,8 @@ mobile/views/pages/home.vue: | ||||
|   global: "グローバル" | ||||
|   mentions: "あなた宛て" | ||||
|   messages: "メッセージ" | ||||
| mobile/views/pages/home.timeline.vue: | ||||
|   empty: "投稿がありません" | ||||
| mobile/views/pages/tag.vue: | ||||
|   no-posts-found: "ハッシュタグ「{q}」が付けられた投稿は見つかりませんでした。" | ||||
| mobile/views/pages/welcome.vue: | ||||
| @@ -1594,10 +1595,6 @@ mobile/views/pages/user/home.vue: | ||||
|   frequently-replied-users: "よく話すユーザー" | ||||
|   followers-you-know: "知り合いのフォロワー" | ||||
|   last-used-at: "最終ログイン" | ||||
| mobile/views/pages/user/home.followers-you-know.vue: | ||||
|   no-users: "知り合いのユーザーはいません" | ||||
| mobile/views/pages/user/home.friends.vue: | ||||
|   no-users: "よく話すユーザーはいません" | ||||
| mobile/views/pages/user/home.notes.vue: | ||||
|   no-notes: "投稿はありません" | ||||
| mobile/views/pages/user/home.photos.vue: | ||||
| @@ -1622,6 +1619,9 @@ deck: | ||||
|   rename: "名前を変更" | ||||
|   stack-left: "左に重ねる" | ||||
|   pop-right: "右に出す" | ||||
|   disabled-timeline: | ||||
|     title: "無効化されたタイムライン" | ||||
|     description: "サーバーの運営者により、このタイムラインは使用できない状態に設定されています。" | ||||
| deck/deck.tl-column.vue: | ||||
|   is-media-only: "メディア投稿のみ" | ||||
|   is-media-view: "メディアビュー" | ||||
|   | ||||
| @@ -28,6 +28,8 @@ common: | ||||
|   load-more: "Load more" | ||||
|   enter-password: "Please enter the Password" | ||||
|   2fa: "Two-factor authentication" | ||||
|   customize-home: "Customize your home layout" | ||||
|   featured-notes: "Featured notes" | ||||
|   got-it: "Got it!" | ||||
|   customization-tips: | ||||
|     title: "Customization tips" | ||||
| @@ -56,6 +58,14 @@ common: | ||||
|   trash: "Trash" | ||||
|   drive: "Drive" | ||||
|   messaging: "Talk" | ||||
|   deck: "Deck" | ||||
|   timeline: "Timeline" | ||||
|   explore: "Discover" | ||||
|   following: "Following" | ||||
|   followers: "Followers" | ||||
|   empty-timeline-info: | ||||
|     follow-users-to-make-your-timeline: "Following users will show their posts in your timeline." | ||||
|     explore: "Find users" | ||||
|   weekday-short: | ||||
|     sunday: "S" | ||||
|     monday: "M" | ||||
| @@ -197,6 +207,17 @@ auth/views/index.vue: | ||||
|   please-go-back: "Please go back to the application." | ||||
|   error: "Session does not exist." | ||||
|   sign-in: "Please sign in." | ||||
| common/views/pages/explore.vue: | ||||
|   verified-users: "Verified accounts" | ||||
|   popular-users: "Popular users" | ||||
|   recently-updated-users: "Recently active users" | ||||
|   recently-registered-users: "Users who joined recently" | ||||
|   popular-tags: "Popular Tags" | ||||
|   federated: "From the fediverse" | ||||
|   explore: "Explore {host}" | ||||
|   users-info: "Currently, {users} users are registered here" | ||||
| common/views/components/user-list.vue: | ||||
|   no-users: "There are no users." | ||||
| common/views/components/games/reversi/reversi.vue: | ||||
|   matching: | ||||
|     waiting-for: "Waiting for {}" | ||||
| @@ -684,12 +705,6 @@ desktop/views/components/following-window.vue: | ||||
|   following: "Following {}" | ||||
| desktop/views/components/following.vue: | ||||
|   empty: "It seems you don't have any following users…" | ||||
| desktop/views/components/friends-maker.vue: | ||||
|   title: "Recommended users:" | ||||
|   empty: "Couldn't find any recommended users." | ||||
|   fetching: "Loading" | ||||
|   refresh: "More" | ||||
|   close: "Close" | ||||
| desktop/views/components/game-window.vue: | ||||
|   game: "Reversi" | ||||
| desktop/views/components/home.vue: | ||||
| @@ -770,6 +785,8 @@ desktop/views/components/renote-form.vue: | ||||
|   failure: "Failed to Repost" | ||||
| desktop/views/components/renote-form-window.vue: | ||||
|   title: "Do you want to Repost it?" | ||||
| desktop/views/components/timeline.core.vue: | ||||
|   empty: "Without any notes" | ||||
| desktop/views/pages/user-following-or-followers.vue: | ||||
|   following: "{user}'s following" | ||||
|   followers: "{user}'s follower" | ||||
| @@ -798,13 +815,9 @@ desktop/views/components/settings.vue: | ||||
|   web-search-engine-desc: "Example: https://www.google.com/?#q={{query}}" | ||||
|   auto-popout: "Auto pop-out window" | ||||
|   auto-popout-desc: "If it's possible, pop-out display will be used instead of opening a new window. This setting is stored in your browser." | ||||
|   deck-nav: "Transitionless deck navigation" | ||||
|   deck-nav-desc: "You get a temporary column without page transitions during navigation when using the deck." | ||||
|   keep-cw: "Preserve content warning" | ||||
|   keep-cw-desc: "When replying to a post, the same content warning is set by default to the reply, as has been set by the original post." | ||||
|   deck-default: "Use Deck view as the default UI" | ||||
|   display: "Design and display" | ||||
|   customize: "Customize home layout" | ||||
|   wallpaper: "Wallpaper" | ||||
|   choose-wallpaper: "Choose a background" | ||||
|   delete-wallpaper: "Remove background" | ||||
| @@ -961,14 +974,11 @@ desktop/views/components/ui.header.account.vue: | ||||
|   favorites: "Favorites" | ||||
|   lists: "Lists" | ||||
|   follow-requests: "Follow requests" | ||||
|   customize: "Customize home layout" | ||||
|   admin: "Admin" | ||||
|   settings: "Settings" | ||||
|   signout: "Sign out" | ||||
|   dark: "Toggle dark mode" | ||||
| desktop/views/components/ui.header.nav.vue: | ||||
|   home: "Home" | ||||
|   deck: "Deck" | ||||
|   game: "Games" | ||||
| desktop/views/components/ui.header.notifications.vue: | ||||
|   title: "Notifications" | ||||
| @@ -982,7 +992,7 @@ desktop/views/components/received-follow-requests-window.vue: | ||||
|   reject: "Reject" | ||||
| desktop/views/components/user-lists-window.vue: | ||||
|   title: "User lists" | ||||
|   create-list: "Create list" | ||||
|   create-list: "Create a list" | ||||
|   list-name: "List name" | ||||
| desktop/views/components/user-preview.vue: | ||||
|   notes: "Posts" | ||||
| @@ -1091,6 +1101,7 @@ admin/views/instance.vue: | ||||
|   smtp-secure-info: "Turn off STARTTLS when used that." | ||||
|   smtp-host: "SMTP Host" | ||||
|   smtp-port: "SMTP Port" | ||||
|   smtp-auth: "Perform SMTP authentication" | ||||
|   smtp-user: "SMTP User" | ||||
|   smtp-pass: "SMTP Password" | ||||
|   serviceworker-config: "ServiceWorker" | ||||
| @@ -1306,8 +1317,6 @@ desktop/views/pages/welcome.vue: | ||||
|   info: "Information" | ||||
| desktop/views/pages/drive.vue: | ||||
|   title: "Misskey storage" | ||||
| desktop/views/pages/home-customize.vue: | ||||
|   title: "Customize home layout" | ||||
| desktop/views/pages/note.vue: | ||||
|   prev: "Previous post" | ||||
|   next: "Next post" | ||||
| @@ -1339,18 +1348,17 @@ desktop/views/pages/user/user.photos.vue: | ||||
|   title: "Photos" | ||||
|   loading: "Loading" | ||||
|   no-photos: "No photos" | ||||
| desktop/views/pages/user/user.profile.vue: | ||||
|   follows-you: "Follows you" | ||||
|   menu: "Menu" | ||||
| desktop/views/pages/user/user.header.vue: | ||||
|   posts: "Notes" | ||||
|   following: "Following" | ||||
|   followers: "Followers" | ||||
|   is-bot: "This account is a Bot" | ||||
|   no-description: "自己紹介はありません" | ||||
|   years-old: "{age} years old" | ||||
|   year: "/" | ||||
|   month: "/" | ||||
|   day: "-" | ||||
|   follows-you: "Follows you" | ||||
| desktop/views/pages/user/user.timeline.vue: | ||||
|   default: "Posts" | ||||
|   with-replies: "Posts and replies" | ||||
| @@ -1418,12 +1426,6 @@ common/views/components/follow-button.vue: | ||||
|   request-pending: "Pending" | ||||
|   follow-processing: "Processing" | ||||
|   follow-request: "Follow request" | ||||
| mobile/views/components/friends-maker.vue: | ||||
|   title: "Let's follow them" | ||||
|   empty: "Featured user was not found." | ||||
|   fetching: "Loading" | ||||
|   refresh: "See more" | ||||
|   close: "Close" | ||||
| mobile/views/components/note.vue: | ||||
|   private: "This post is private" | ||||
|   deleted: "This post has been deleted" | ||||
| @@ -1481,9 +1483,6 @@ mobile/views/components/ui.nav.vue: | ||||
| mobile/views/components/user-timeline.vue: | ||||
|   no-notes: "It seems this user hasn't posted anything yet." | ||||
|   no-notes-with-media: "There are no notes with media attachments" | ||||
| mobile/views/components/users-list.vue: | ||||
|   all: "All" | ||||
|   known: "In common" | ||||
| mobile/views/pages/favorites.vue: | ||||
|   title: "Favorites" | ||||
| mobile/views/pages/user-lists.vue: | ||||
| @@ -1502,6 +1501,8 @@ mobile/views/pages/home.vue: | ||||
|   global: "Global" | ||||
|   mentions: "Mentions" | ||||
|   messages: "Messages" | ||||
| mobile/views/pages/home.timeline.vue: | ||||
|   empty: "Without any notes" | ||||
| mobile/views/pages/tag.vue: | ||||
|   no-posts-found: "No posts contains \"{q}\" found." | ||||
| mobile/views/pages/welcome.vue: | ||||
| @@ -1543,7 +1544,7 @@ mobile/views/pages/settings.vue: | ||||
|   timeline: "Timeline" | ||||
|   show-reply-target: "Show reply target" | ||||
|   show-my-renotes: "Show my reposts" | ||||
|   show-renoted-my-notes: "Show renoted posts of mine" | ||||
|   show-renoted-my-notes: "Show the renotes of my posts" | ||||
|   show-local-renotes: "Show renoted local posts" | ||||
|   post-style: "Post design" | ||||
|   post-style-standard: "Standard" | ||||
| @@ -1591,13 +1592,9 @@ mobile/views/pages/user/home.vue: | ||||
|   activity: "Activity" | ||||
|   keywords: "Keywords" | ||||
|   domains: "Domains" | ||||
|   frequently-replied-users: "Frequently mentioned users" | ||||
|   frequently-replied-users: "Frequent mentions" | ||||
|   followers-you-know: "Followers you know" | ||||
|   last-used-at: "Last active:" | ||||
| mobile/views/pages/user/home.followers-you-know.vue: | ||||
|   no-users: "No users you know" | ||||
| mobile/views/pages/user/home.friends.vue: | ||||
|   no-users: "There are no users that you know" | ||||
| mobile/views/pages/user/home.notes.vue: | ||||
|   no-notes: "No notes" | ||||
| mobile/views/pages/user/home.photos.vue: | ||||
| @@ -1622,6 +1619,9 @@ deck: | ||||
|   rename: "Rename" | ||||
|   stack-left: "Stack to the left" | ||||
|   pop-right: "Dock on the right" | ||||
|   disabled-timeline: | ||||
|     title: "Timeline has been disabled" | ||||
|     description: "This timeline has been disabled by the server administrator." | ||||
| deck/deck.tl-column.vue: | ||||
|   is-media-only: "Only media posts" | ||||
|   is-media-view: "Media view" | ||||
|   | ||||
| @@ -28,6 +28,8 @@ common: | ||||
|   load-more: "もっと読み込む" | ||||
|   enter-password: "パスワードを入力してください" | ||||
|   2fa: "Autenticación de dos factores" | ||||
|   customize-home: "ホームをカスタマイズ" | ||||
|   featured-notes: "ハイライト" | ||||
|   got-it: "¡Listo!" | ||||
|   customization-tips: | ||||
|     title: "Consejos de personalización" | ||||
| @@ -56,6 +58,14 @@ common: | ||||
|   trash: "Papelera" | ||||
|   drive: "Drive" | ||||
|   messaging: "Conversación" | ||||
|   deck: "デッキ" | ||||
|   timeline: "タイムライン" | ||||
|   explore: "みつける" | ||||
|   following: "フォロー中" | ||||
|   followers: "フォロワー" | ||||
|   empty-timeline-info: | ||||
|     follow-users-to-make-your-timeline: "ユーザーをフォローすると投稿がタイムラインに表示されます。" | ||||
|     explore: "ユーザーを探索する" | ||||
|   weekday-short: | ||||
|     sunday: "domingo" | ||||
|     monday: "lunes" | ||||
| @@ -197,6 +207,17 @@ auth/views/index.vue: | ||||
|   please-go-back: "Por favor, vuelve a la aplicación." | ||||
|   error: "Esta sesión no existe." | ||||
|   sign-in: "Por favor inicia sesión." | ||||
| common/views/pages/explore.vue: | ||||
|   verified-users: "公式アカウント" | ||||
|   popular-users: "人気のユーザー" | ||||
|   recently-updated-users: "最近投稿したユーザー" | ||||
|   recently-registered-users: "新規ユーザー" | ||||
|   popular-tags: "人気のタグ" | ||||
|   federated: "連合" | ||||
|   explore: "{host}を探索" | ||||
|   users-info: "現在{users}ユーザーが登録されています" | ||||
| common/views/components/user-list.vue: | ||||
|   no-users: "ユーザーがいません" | ||||
| common/views/components/games/reversi/reversi.vue: | ||||
|   matching: | ||||
|     waiting-for: "Esperando por {}" | ||||
| @@ -684,12 +705,6 @@ desktop/views/components/following-window.vue: | ||||
|   following: "Siguiendo {}" | ||||
| desktop/views/components/following.vue: | ||||
|   empty: "Parece que aún no sigues a nadie." | ||||
| desktop/views/components/friends-maker.vue: | ||||
|   title: "Usuarios recomendados:" | ||||
|   empty: "No se pudieron encontrar usuarios para recomendar" | ||||
|   fetching: "Cargando" | ||||
|   refresh: "Más" | ||||
|   close: "Cerrar" | ||||
| desktop/views/components/game-window.vue: | ||||
|   game: "Reversi" | ||||
| desktop/views/components/home.vue: | ||||
| @@ -770,6 +785,8 @@ desktop/views/components/renote-form.vue: | ||||
|   failure: "La publicación ha fallado" | ||||
| desktop/views/components/renote-form-window.vue: | ||||
|   title: "¿Seguro qué quieres volver a publicarlo?" | ||||
| desktop/views/components/timeline.core.vue: | ||||
|   empty: "投稿がありません" | ||||
| desktop/views/pages/user-following-or-followers.vue: | ||||
|   following: "{user} sigue a" | ||||
|   followers: "Seguidores de {user}" | ||||
| @@ -798,13 +815,9 @@ desktop/views/components/settings.vue: | ||||
|   web-search-engine-desc: "例: https://www.google.com/?#q={{query}}" | ||||
|   auto-popout: "Ventana emergente automática" | ||||
|   auto-popout-desc: "Muestra una ventana emergente si es posible. Esta configuración depende del navegador." | ||||
|   deck-nav: "デッキ内ナビゲーション" | ||||
|   deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。" | ||||
|   keep-cw: "CW保持" | ||||
|   keep-cw-desc: "投稿にリプライする際、リプライ元の投稿にCWが設定されていたとき、デフォルトで同じCWを設定するようにします。" | ||||
|   deck-default: "デッキをデフォルトのUIにする" | ||||
|   display: "Diseño y pantalla" | ||||
|   customize: "Personaliza la página principal" | ||||
|   wallpaper: "壁紙" | ||||
|   choose-wallpaper: "Elije un fondo" | ||||
|   delete-wallpaper: "Suprimir fondo" | ||||
| @@ -961,14 +974,11 @@ desktop/views/components/ui.header.account.vue: | ||||
|   favorites: "Favoritos" | ||||
|   lists: "Listas" | ||||
|   follow-requests: "Solicitudes de seguimiento" | ||||
|   customize: "Personalizar la página de inicio" | ||||
|   admin: "Admin" | ||||
|   settings: "Configuraciones" | ||||
|   signout: "Desconectarse" | ||||
|   dark: "Sumergirse en la oscuridad" | ||||
| desktop/views/components/ui.header.nav.vue: | ||||
|   home: "Inicio" | ||||
|   deck: "Cubierta" | ||||
|   game: "Juegos" | ||||
| desktop/views/components/ui.header.notifications.vue: | ||||
|   title: "Notificaciones" | ||||
| @@ -1091,6 +1101,7 @@ admin/views/instance.vue: | ||||
|   smtp-secure-info: "STARTTLS使用時はオフにします。" | ||||
|   smtp-host: "Host SMTP" | ||||
|   smtp-port: "Puerto SMTP" | ||||
|   smtp-auth: "SMTP認証を行う" | ||||
|   smtp-user: "Usuario SMTP" | ||||
|   smtp-pass: "Contraseña SMTP" | ||||
|   serviceworker-config: "ServiceWorker" | ||||
| @@ -1306,8 +1317,6 @@ desktop/views/pages/welcome.vue: | ||||
|   info: "情報" | ||||
| desktop/views/pages/drive.vue: | ||||
|   title: "Misskey Drive" | ||||
| desktop/views/pages/home-customize.vue: | ||||
|   title: "ホームのカスタマイズ" | ||||
| desktop/views/pages/note.vue: | ||||
|   prev: "前の投稿" | ||||
|   next: "次の投稿" | ||||
| @@ -1339,18 +1348,17 @@ desktop/views/pages/user/user.photos.vue: | ||||
|   title: "フォト" | ||||
|   loading: "読み込み中" | ||||
|   no-photos: "写真はありません" | ||||
| desktop/views/pages/user/user.profile.vue: | ||||
|   follows-you: "フォローされています" | ||||
|   menu: "メニュー" | ||||
| desktop/views/pages/user/user.header.vue: | ||||
|   posts: "投稿" | ||||
|   following: "フォロー" | ||||
|   followers: "フォロワー" | ||||
|   is-bot: "このアカウントはBotです" | ||||
|   no-description: "自己紹介はありません" | ||||
|   years-old: "{age}歳" | ||||
|   year: "年" | ||||
|   month: "月" | ||||
|   day: "日" | ||||
|   follows-you: "フォローされています" | ||||
| desktop/views/pages/user/user.timeline.vue: | ||||
|   default: "投稿" | ||||
|   with-replies: "投稿と返信" | ||||
| @@ -1418,12 +1426,6 @@ common/views/components/follow-button.vue: | ||||
|   request-pending: "フォロー許可待ち" | ||||
|   follow-processing: "フォロー処理中" | ||||
|   follow-request: "フォロー申請" | ||||
| mobile/views/components/friends-maker.vue: | ||||
|   title: "気になるユーザーをフォロー" | ||||
|   empty: "おすすめのユーザーは見つかりませんでした。" | ||||
|   fetching: "読み込んでいます" | ||||
|   refresh: "もっと見る" | ||||
|   close: "閉じる" | ||||
| mobile/views/components/note.vue: | ||||
|   private: "この投稿は非公開です" | ||||
|   deleted: "この投稿は削除されました" | ||||
| @@ -1481,9 +1483,6 @@ mobile/views/components/ui.nav.vue: | ||||
| mobile/views/components/user-timeline.vue: | ||||
|   no-notes: "このユーザーは投稿していないようです。" | ||||
|   no-notes-with-media: "メディア付き投稿はありません。" | ||||
| mobile/views/components/users-list.vue: | ||||
|   all: "すべて" | ||||
|   known: "知り合い" | ||||
| mobile/views/pages/favorites.vue: | ||||
|   title: "お気に入り" | ||||
| mobile/views/pages/user-lists.vue: | ||||
| @@ -1502,6 +1501,8 @@ mobile/views/pages/home.vue: | ||||
|   global: "グローバル" | ||||
|   mentions: "あなた宛て" | ||||
|   messages: "メッセージ" | ||||
| mobile/views/pages/home.timeline.vue: | ||||
|   empty: "投稿がありません" | ||||
| mobile/views/pages/tag.vue: | ||||
|   no-posts-found: "ハッシュタグ「{q}」が付けられた投稿は見つかりませんでした。" | ||||
| mobile/views/pages/welcome.vue: | ||||
| @@ -1594,10 +1595,6 @@ mobile/views/pages/user/home.vue: | ||||
|   frequently-replied-users: "よく話すユーザー" | ||||
|   followers-you-know: "知り合いのフォロワー" | ||||
|   last-used-at: "最終ログイン" | ||||
| mobile/views/pages/user/home.followers-you-know.vue: | ||||
|   no-users: "知り合いのユーザーはいません" | ||||
| mobile/views/pages/user/home.friends.vue: | ||||
|   no-users: "よく話すユーザーはいません" | ||||
| mobile/views/pages/user/home.notes.vue: | ||||
|   no-notes: "投稿はありません" | ||||
| mobile/views/pages/user/home.photos.vue: | ||||
| @@ -1622,6 +1619,9 @@ deck: | ||||
|   rename: "名前を変更" | ||||
|   stack-left: "左に重ねる" | ||||
|   pop-right: "右に出す" | ||||
|   disabled-timeline: | ||||
|     title: "無効化されたタイムライン" | ||||
|     description: "サーバーの運営者により、このタイムラインは使用できない状態に設定されています。" | ||||
| deck/deck.tl-column.vue: | ||||
|   is-media-only: "メディア投稿のみ" | ||||
|   is-media-view: "メディアビュー" | ||||
|   | ||||
| @@ -28,6 +28,8 @@ common: | ||||
|   load-more: "Charger plus" | ||||
|   enter-password: "Veuillez entrer le mot de passe" | ||||
|   2fa: "Authentification à deux facteurs" | ||||
|   customize-home: "Personnaliser la disposition de votre accueil" | ||||
|   featured-notes: "Les notes mises en avant" | ||||
|   got-it: "J’ai compris !" | ||||
|   customization-tips: | ||||
|     title: "Conseils de personnalisation" | ||||
| @@ -56,6 +58,14 @@ common: | ||||
|   trash: "Corbeille" | ||||
|   drive: "Drive" | ||||
|   messaging: "Conversations" | ||||
|   deck: "Deck" | ||||
|   timeline: "Fil" | ||||
|   explore: "Découvrir" | ||||
|   following: "Suit" | ||||
|   followers: "Abonné·e·s" | ||||
|   empty-timeline-info: | ||||
|     follow-users-to-make-your-timeline: "ユーザーをフォローすると投稿がタイムラインに表示されます。" | ||||
|     explore: "Trouver des utilisateurs" | ||||
|   weekday-short: | ||||
|     sunday: "D" | ||||
|     monday: "L" | ||||
| @@ -113,7 +123,7 @@ common: | ||||
|   use-avatar-reversi-stones: "Utiliser l’avatar comme pion dans Reversi" | ||||
|   verified-user: "Compte vérifié" | ||||
|   disable-animated-mfm: "Désactiver les textes animés dans les publications" | ||||
|   disable-showing-animated-images: "アニメーション画像を再生しない" | ||||
|   disable-showing-animated-images: "Désactiver l'animation dans les images" | ||||
|   suggest-recent-hashtags: "Suggérer les hashtags récemment utilisés dans le champs de saisie" | ||||
|   always-show-nsfw: "Toujours afficher les contenus sensibles" | ||||
|   always-mark-nsfw: "Toujours marquer les notes ayant des attachements comme sensibles" | ||||
| @@ -130,7 +140,7 @@ common: | ||||
|   show-password: "Afficher le mot de passe" | ||||
|   do-not-use-in-production: "Il s’agit d’une version de développement. Ne pas utiliser dans un environnement de production." | ||||
|   user-suspended: "Cet·te utilisateur·trice a été suspendu·e" | ||||
|   is-remote-user: "このユーザー情報は不正確な可能性があります。" | ||||
|   is-remote-user: "Les informations à propos de ce compte peuvent être incomplètes." | ||||
|   is-remote-post: "Ceci est une publication distante." | ||||
|   view-on-remote: " Consulter le profil complet" | ||||
|   renoted-by: "Renoté par {user}" | ||||
| @@ -197,6 +207,17 @@ auth/views/index.vue: | ||||
|   please-go-back: "Veillez retourner à l'application." | ||||
|   error: "La session n’existe pas." | ||||
|   sign-in: "Veuillez vous connecter" | ||||
| common/views/pages/explore.vue: | ||||
|   verified-users: "Comptes vérifiés" | ||||
|   popular-users: "Utilisateurs populaires" | ||||
|   recently-updated-users: "Utilisateurs actifs récemment" | ||||
|   recently-registered-users: "Les nouveaux inscrits" | ||||
|   popular-tags: "Mots-clés populaires" | ||||
|   federated: "Du Fédiverse" | ||||
|   explore: "{host}を探索" | ||||
|   users-info: "現在{users}ユーザーが登録されています" | ||||
| common/views/components/user-list.vue: | ||||
|   no-users: "ユーザーがいません" | ||||
| common/views/components/games/reversi/reversi.vue: | ||||
|   matching: | ||||
|     waiting-for: "En attente de {}" | ||||
| @@ -684,12 +705,6 @@ desktop/views/components/following-window.vue: | ||||
|   following: "Suit {}" | ||||
| desktop/views/components/following.vue: | ||||
|   empty: "Vous ne suivez aucun compte." | ||||
| desktop/views/components/friends-maker.vue: | ||||
|   title: "Utilisateur·rice·s recommandé·e·s :" | ||||
|   empty: "Impossible de trouver des utilisateur·trice·s à recommander." | ||||
|   fetching: "Chargement" | ||||
|   refresh: "Plus" | ||||
|   close: "Fermer" | ||||
| desktop/views/components/game-window.vue: | ||||
|   game: "Reversi" | ||||
| desktop/views/components/home.vue: | ||||
| @@ -724,11 +739,11 @@ desktop/views/components/notes.vue: | ||||
| desktop/views/components/notifications.vue: | ||||
|   empty: "Aucune de notification !" | ||||
| desktop/views/components/post-form.vue: | ||||
|   add-visible-user: "+Ajouter un utilisateur" | ||||
|   add-visible-user: "+Ajouter un·e utilisateur·rice" | ||||
|   attach-location-information: "Attacher des informations de localisation" | ||||
|   hide-contents: "Masquer les contenus" | ||||
|   reply-placeholder: "Répondre à cette note…" | ||||
|   quote-placeholder: "Citer cette note…" | ||||
|   reply-placeholder: "Répondre à cette note …" | ||||
|   quote-placeholder: "Citer cette note …" | ||||
|   submit: "Publier" | ||||
|   reply: "Répondre" | ||||
|   renote: "Republier" | ||||
| @@ -738,7 +753,7 @@ desktop/views/components/post-form.vue: | ||||
|   note-failed: "La note à échoué" | ||||
|   reply-failed: "La réponse a échoué" | ||||
|   renote-failed: "Échec lors de la republication" | ||||
|   posting: "Publication…" | ||||
|   posting: "Publication …" | ||||
|   attach-media-from-local: "Joindre un média depuis votre appareil" | ||||
|   attach-media-from-drive: "Joindre un média depuis votre Drive" | ||||
|   attach-cancel: "Annuler le fichier attaché" | ||||
| @@ -751,8 +766,8 @@ desktop/views/components/post-form.vue: | ||||
|   visibility: "Visibilité" | ||||
|   geolocation-alert: "Votre appareil ne prend pas en charge les services de localisation" | ||||
|   error: "Erreur" | ||||
|   enter-username: "Saisir un nom d'utilisateur…" | ||||
|   annotations: "内容への注釈 (オプション)" | ||||
|   enter-username: "Saisir un nom d'utilisateur …" | ||||
|   annotations: "Commenter le contenu (optionnel)" | ||||
| desktop/views/components/post-form-window.vue: | ||||
|   note: "Nouvelle note" | ||||
|   reply: "Répondre" | ||||
| @@ -770,6 +785,8 @@ desktop/views/components/renote-form.vue: | ||||
|   failure: "La renote a échoué" | ||||
| desktop/views/components/renote-form-window.vue: | ||||
|   title: "Êtes vous sûr de vouloir renote cette note?" | ||||
| desktop/views/components/timeline.core.vue: | ||||
|   empty: "Sans aucune note" | ||||
| desktop/views/pages/user-following-or-followers.vue: | ||||
|   following: "{user} suit" | ||||
|   followers: "Abonné·e·s de {user}" | ||||
| @@ -798,13 +815,9 @@ desktop/views/components/settings.vue: | ||||
|   web-search-engine-desc: "Exemple : https://www.google.com/?#q={{query}}" | ||||
|   auto-popout: "Fenêtre contextuelle automatique" | ||||
|   auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。" | ||||
|   deck-nav: "Deck sans tansitions" | ||||
|   deck-nav-desc: "Vous obtenez une colonne temporaire sans transitions dans la page pendant la navigation, lors de l’utilisation du Deck." | ||||
|   keep-cw: "Maintenir l'avertissement de contenu" | ||||
|   keep-cw-desc: "投稿にリプライする際、リプライ元の投稿にCWが設定されていたとき、デフォルトで同じCWを設定するようにします。" | ||||
|   deck-default: "Utiliser le Deck comme IU par défaut" | ||||
|   display: "Affichage et design" | ||||
|   customize: "Personnaliser l'Accueil" | ||||
|   wallpaper: "Arrière plan" | ||||
|   choose-wallpaper: "Sélectionner un fond d'écran" | ||||
|   delete-wallpaper: "Supprimer le fond d'écran" | ||||
| @@ -961,14 +974,11 @@ desktop/views/components/ui.header.account.vue: | ||||
|   favorites: "Favorites" | ||||
|   lists: "Listes" | ||||
|   follow-requests: "Demandes de suivi" | ||||
|   customize: "Personnaliser l'Accueil" | ||||
|   admin: "Admin" | ||||
|   settings: "Réglages" | ||||
|   signout: "Déconnexion" | ||||
|   dark: "Fall in dark" | ||||
| desktop/views/components/ui.header.nav.vue: | ||||
|   home: "Accueil" | ||||
|   deck: "Deck" | ||||
|   game: "Jeux" | ||||
| desktop/views/components/ui.header.notifications.vue: | ||||
|   title: "Notifications" | ||||
| @@ -1019,7 +1029,7 @@ admin/views/dashboard.vue: | ||||
|   federated: "Fédérées" | ||||
| admin/views/queue.vue: | ||||
|   operation: "Action(s)" | ||||
|   remove-all-jobs: "すべてのジョブをクリア" | ||||
|   remove-all-jobs: "Enlever toutes les tâches en attente" | ||||
| admin/views/abuse.vue: | ||||
|   title: "Abus" | ||||
|   target: "Cible" | ||||
| @@ -1091,6 +1101,7 @@ admin/views/instance.vue: | ||||
|   smtp-secure-info: "Désactiver STARTTLS lorsque celui-ci est utilisé." | ||||
|   smtp-host: "Hôte SMTP" | ||||
|   smtp-port: "Port SMTP" | ||||
|   smtp-auth: "SMTP認証を行う" | ||||
|   smtp-user: "Utilisateur SMTP" | ||||
|   smtp-pass: "Mot de passe SMTP" | ||||
|   serviceworker-config: "ServiceWorker" | ||||
| @@ -1167,7 +1178,7 @@ admin/views/users.vue: | ||||
|   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: "公式アカウントを解除しますか?" | ||||
|   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 l’utilisateur·rice distant·e" | ||||
|   remote-user-updated: "Les informations de l’utilisateur·rice distant·e ont étés mis à jour" | ||||
| @@ -1186,7 +1197,7 @@ admin/views/users.vue: | ||||
|       moderator: "Modérateur" | ||||
|       adminOrModerator: "Administrateur/Modérateur" | ||||
|       verified: "Compte vérifié" | ||||
|       silenced: "サイレンス済み" | ||||
|       silenced: "Déjà mis en sourdine" | ||||
|       suspended: "Suspendu" | ||||
|     origin: | ||||
|       title: "Origine" | ||||
| @@ -1246,9 +1257,9 @@ admin/views/federation.vue: | ||||
|   latest-request-received-at: "Dernière requête reçue" | ||||
|   remove-all-following: "フォローを全解除" | ||||
|   remove-all-following-info: "{host}からのフォローをすべて解除します。そのインスタンスがもう存在しなくなった場合などに実行してください。" | ||||
|   block: "ブロック" | ||||
|   marked-as-closed: "閉鎖されているとマーク" | ||||
|   lookup: "照会" | ||||
|   block: "Bloquer" | ||||
|   marked-as-closed: "Marquées comme fermées" | ||||
|   lookup: "Recherche" | ||||
|   instances: "Instances" | ||||
|   instance-not-registered: "そのインスタンスは登録されていません" | ||||
|   sort: "Trier par" | ||||
| @@ -1262,36 +1273,36 @@ admin/views/federation.vue: | ||||
|     usersAsc: "ユーザーが少ない順" | ||||
|     usersDesc: "ユーザーが多い順" | ||||
|     followingAsc: "Les moins suivies" | ||||
|     followingDesc: "フォローが多い順" | ||||
|     followingDesc: "Ayant le plus d'abonné·e·s" | ||||
|     followersAsc: "Ayant le moins d'abonné·e·s" | ||||
|     followersDesc: "Ayant le plus d'abonné·e·s" | ||||
|     driveUsageAsc: "ドライブ使用量が少ない順" | ||||
|     driveUsageDesc: "ドライブ使用量が多い順" | ||||
|     driveFilesAsc: "ドライブのファイル数が少ない順" | ||||
|     driveFilesDesc: "ドライブのファイル数が多い順" | ||||
|   state: "状態" | ||||
|   state: "État" | ||||
|   states: | ||||
|     all: "すべて" | ||||
|     blocked: "ブロック" | ||||
|     not-responding: "応答なし" | ||||
|     marked-as-closed: "閉鎖とマーク済み" | ||||
|     all: "Tout" | ||||
|     blocked: "Bloquées" | ||||
|     not-responding: "Sans réponse" | ||||
|     marked-as-closed: "Marquée comme fermée" | ||||
|   result-is-truncated: "上位{n}件を表示しています。" | ||||
|   charts: "チャート" | ||||
|   charts: "Graphs" | ||||
|   chart-srcs: | ||||
|     requests: "リクエスト" | ||||
|     users: "ユーザーの増減" | ||||
|     users-total: "ユーザーの積算" | ||||
|     notes: "投稿の増減" | ||||
|     notes-total: "投稿の積算" | ||||
|     ff: "フォロー/フォロワーの増減" | ||||
|     requests: "Requêtes" | ||||
|     users: "Nombre d’utilisateurs·trices : augmentation/diminution" | ||||
|     users-total: "Nombre total des utilisateur·rice·s" | ||||
|     notes: "Augmentation/diminution du nombre des notes" | ||||
|     notes-total: "Nombre total des notes" | ||||
|     ff: "Augmentation des abonné·e·s" | ||||
|     ff-total: "フォロー/フォロワーの積算" | ||||
|     drive-usage: "ドライブ使用量の増減" | ||||
|     drive-usage-total: "ドライブ使用量の積算" | ||||
|     drive-usage: "Augmentation et diminution de la capacité stockage" | ||||
|     drive-usage-total: "Utilisation totale du stockage" | ||||
|     drive-files: "ドライブファイル数の増減" | ||||
|     drive-files-total: "ドライブファイル数の積算" | ||||
|     drive-files-total: "Nombre total des fichiers sur le Drive" | ||||
|   chart-spans: | ||||
|     hour: "1時間ごと" | ||||
|     day: "1日ごと" | ||||
|     hour: "Par heure" | ||||
|     day: "Par jour" | ||||
| desktop/views/pages/welcome.vue: | ||||
|   about: "à propos" | ||||
|   gotit: "J'ai compris !" | ||||
| @@ -1306,8 +1317,6 @@ desktop/views/pages/welcome.vue: | ||||
|   info: "Informations" | ||||
| desktop/views/pages/drive.vue: | ||||
|   title: "Lecteur de Misskey" | ||||
| desktop/views/pages/home-customize.vue: | ||||
|   title: "Personnaliser l'Accueil" | ||||
| desktop/views/pages/note.vue: | ||||
|   prev: "Note précédente" | ||||
|   next: "Note suivante" | ||||
| @@ -1339,24 +1348,23 @@ desktop/views/pages/user/user.photos.vue: | ||||
|   title: "Photos" | ||||
|   loading: "Chargement en cours" | ||||
|   no-photos: "Pas de photos" | ||||
| desktop/views/pages/user/user.profile.vue: | ||||
|   follows-you: "Vous suit" | ||||
|   menu: "Menu" | ||||
| desktop/views/pages/user/user.header.vue: | ||||
|   posts: "Notes" | ||||
|   following: "Suit" | ||||
|   followers: "Abonné·e·s" | ||||
|   is-bot: "Ce compte est un Bot" | ||||
|   no-description: "自己紹介はありません" | ||||
|   years-old: "{age} ans" | ||||
|   year: "/" | ||||
|   month: "/" | ||||
|   day: "-" | ||||
|   follows-you: "Vous suit" | ||||
| desktop/views/pages/user/user.timeline.vue: | ||||
|   default: "Publications" | ||||
|   with-replies: "Publications et réponses" | ||||
|   with-media: "Média" | ||||
|   my-posts: "Mes Messages" | ||||
|   empty: "Cet utilisateur n'a rien posté encore." | ||||
|   empty: "Cet·te utilisateur·rice n'a rien posté encore." | ||||
| desktop/views/widgets/messaging.vue: | ||||
|   title: "Messagerie" | ||||
| desktop/views/widgets/notifications.vue: | ||||
| @@ -1418,12 +1426,6 @@ common/views/components/follow-button.vue: | ||||
|   request-pending: "Demande en attente" | ||||
|   follow-processing: "En cours d’abonnement" | ||||
|   follow-request: "Demande d’abonnement" | ||||
| mobile/views/components/friends-maker.vue: | ||||
|   title: "Abonnez-vous à" | ||||
|   empty: "Impossible de trouver des utilisateurs·trices à recommander." | ||||
|   fetching: "Chargement" | ||||
|   refresh: "Voir plus" | ||||
|   close: "Fermer" | ||||
| mobile/views/components/note.vue: | ||||
|   private: "cette publication est privée" | ||||
|   deleted: "cette publication a été supprimée" | ||||
| @@ -1445,11 +1447,11 @@ mobile/views/components/note-sub.vue: | ||||
| mobile/views/components/notifications.vue: | ||||
|   empty: "Aucune de notification !" | ||||
| mobile/views/components/post-form.vue: | ||||
|   add-visible-user: "Ajouter un utilisateur" | ||||
|   add-visible-user: "Ajouter un·e utilisateur·rice" | ||||
|   submit: "Publier" | ||||
|   reply: "Répondre" | ||||
|   renote: "Republier" | ||||
|   quote-placeholder: "Citer ce billet... (Facultatif)" | ||||
|   quote-placeholder: "Citer ce billet ... (Facultatif)" | ||||
|   reply-placeholder: "Répondre à cette note" | ||||
|   cw-placeholder: "Commenter le contenu (optionnel)" | ||||
|   location-alert: "Votre appareil ne prend pas en charge les services de localisation" | ||||
| @@ -1479,11 +1481,8 @@ mobile/views/components/ui.nav.vue: | ||||
|   admin: "Admin" | ||||
|   about: "À propos de Misskey" | ||||
| mobile/views/components/user-timeline.vue: | ||||
|   no-notes: "Il semble que cet utilisateur n’a rien publié pour le moment." | ||||
|   no-notes: "Il semble que cet·te utilisateur·rice n’a rien publié pour le moment." | ||||
|   no-notes-with-media: "Aucune note comprenant des médias" | ||||
| mobile/views/components/users-list.vue: | ||||
|   all: "Tout" | ||||
|   known: "Vous connaissez" | ||||
| mobile/views/pages/favorites.vue: | ||||
|   title: "Favoris" | ||||
| mobile/views/pages/user-lists.vue: | ||||
| @@ -1502,6 +1501,8 @@ mobile/views/pages/home.vue: | ||||
|   global: "Global" | ||||
|   mentions: "Mentions" | ||||
|   messages: "Messages" | ||||
| mobile/views/pages/home.timeline.vue: | ||||
|   empty: "Sans aucune note" | ||||
| mobile/views/pages/tag.vue: | ||||
|   no-posts-found: "Aucune publication ayant pour hashtag « {q} » n’a été trouvée." | ||||
| mobile/views/pages/welcome.vue: | ||||
| @@ -1520,7 +1521,7 @@ mobile/views/pages/received-follow-requests.vue: | ||||
|   accept: "Accepter" | ||||
|   reject: "Refuser" | ||||
| mobile/views/pages/note.vue: | ||||
|   title: "Post" | ||||
|   title: "Publication" | ||||
|   prev: "Note précédente" | ||||
|   next: "Note suivante" | ||||
| mobile/views/pages/notifications.vue: | ||||
| @@ -1591,13 +1592,9 @@ mobile/views/pages/user/home.vue: | ||||
|   activity: "Activité" | ||||
|   keywords: "Mot clés" | ||||
|   domains: "Domaines" | ||||
|   frequently-replied-users: "Utilisateurs mentionnés souvent" | ||||
|   frequently-replied-users: "Mentions fréquentes" | ||||
|   followers-you-know: "Abonné·e·s que vous connaissez" | ||||
|   last-used-at: "Dernière connexion il y a" | ||||
| mobile/views/pages/user/home.followers-you-know.vue: | ||||
|   no-users: "Aucun utilisateur·rice connu·e" | ||||
| mobile/views/pages/user/home.friends.vue: | ||||
|   no-users: "Aucun utilisateur connu" | ||||
| mobile/views/pages/user/home.notes.vue: | ||||
|   no-notes: "Pas de notes" | ||||
| mobile/views/pages/user/home.photos.vue: | ||||
| @@ -1622,12 +1619,15 @@ deck: | ||||
|   rename: "Renommer" | ||||
|   stack-left: "Vers la gauche" | ||||
|   pop-right: "Vers la droite" | ||||
|   disabled-timeline: | ||||
|     title: "Le fil été désactivé" | ||||
|     description: "Ce fil a été désactivé par l'administrateur du serveur." | ||||
| deck/deck.tl-column.vue: | ||||
|   is-media-only: "Les publications médias uniquement" | ||||
|   is-media-view: "Vue média" | ||||
|   edit: "Option" | ||||
| deck/deck.user-column.vue: | ||||
|   follows-you: "フォローされています" | ||||
|   follows-you: "Vous suit" | ||||
|   posts: "Notes" | ||||
|   following: "Suit" | ||||
|   followers: "Abonnés" | ||||
|   | ||||
| @@ -8,6 +8,19 @@ const yaml = require('js-yaml'); | ||||
| const langs = ['de-DE', 'en-US', 'fr-FR', 'ja-JP', 'ja-KS', 'pl-PL', 'es-ES', 'nl-NL', 'zh-CN', 'ko-KR']; | ||||
|  | ||||
| const loadLocale = lang => yaml.safeLoad(fs.readFileSync(`${__dirname}/${lang}.yml`, 'utf-8')); | ||||
| const locales = langs.map(lang => ({ [lang]: loadLocale(lang) })); | ||||
| const locales = langs | ||||
| 	.map(lang => [lang, loadLocale(lang)]) | ||||
| 	.map(([lang, locale], _, locales) => { | ||||
| 		switch (lang) { | ||||
| 			case 'ja-JP': return [lang, locale]; | ||||
| 			case 'en-US': return [lang, { ...locales['ja-JP'], ...locale }]; | ||||
| 			default: return [lang, { | ||||
| 				...(lang.startsWith('ja-') ? {} : locales['en-US']), | ||||
| 				...locales['ja-JP'], | ||||
| 				...locale | ||||
| 		}]; | ||||
| 		} | ||||
| 	}) | ||||
| 	.map(([lang, locale]) => ({ [lang]: loadLocale(lang) })); | ||||
|  | ||||
| module.exports = locales.reduce((a, b) => ({ ...a, ...b })); | ||||
|   | ||||
| @@ -28,6 +28,8 @@ common: | ||||
|   load-more: "もっと読み込む" | ||||
|   enter-password: "パスワードを入力してください" | ||||
|   2fa: "二段階認証" | ||||
|   customize-home: "ホームをカスタマイズ" | ||||
|   featured-notes: "ハイライト" | ||||
|   got-it: "わかった" | ||||
|   customization-tips: | ||||
|     title: "カスタマイズのヒント" | ||||
| @@ -56,6 +58,14 @@ common: | ||||
|   trash: "ゴミ箱" | ||||
|   drive: "ドライブ" | ||||
|   messaging: "トーク" | ||||
|   deck: "デッキ" | ||||
|   timeline: "タイムライン" | ||||
|   explore: "みつける" | ||||
|   following: "フォロー中" | ||||
|   followers: "フォロワー" | ||||
|   empty-timeline-info: | ||||
|     follow-users-to-make-your-timeline: "ユーザーをフォローすると投稿がタイムラインに表示されます。" | ||||
|     explore: "ユーザーを探索する" | ||||
|   weekday-short: | ||||
|     sunday: "日" | ||||
|     monday: "月" | ||||
| @@ -197,6 +207,17 @@ auth/views/index.vue: | ||||
|   please-go-back: "アプリケーションに戻って、やっていってください。" | ||||
|   error: "セッションが存在しません。" | ||||
|   sign-in: "サインインしてください" | ||||
| common/views/pages/explore.vue: | ||||
|   verified-users: "公式アカウント" | ||||
|   popular-users: "人気のユーザー" | ||||
|   recently-updated-users: "最近投稿したユーザー" | ||||
|   recently-registered-users: "新規ユーザー" | ||||
|   popular-tags: "人気のタグ" | ||||
|   federated: "連合" | ||||
|   explore: "{host}を探索" | ||||
|   users-info: "現在{users}ユーザーが登録されています" | ||||
| common/views/components/user-list.vue: | ||||
|   no-users: "ユーザーがいません" | ||||
| common/views/components/games/reversi/reversi.vue: | ||||
|   matching: | ||||
|     waiting-for: "{}を待っています" | ||||
| @@ -684,12 +705,6 @@ desktop/views/components/following-window.vue: | ||||
|   following: "{} のフォロー" | ||||
| desktop/views/components/following.vue: | ||||
|   empty: "フォロー中のユーザーはいないようです。" | ||||
| desktop/views/components/friends-maker.vue: | ||||
|   title: "気になるユーザーをフォロー:" | ||||
|   empty: "おすすめのユーザーは見つかりませんでした。" | ||||
|   fetching: "読み込んでいます" | ||||
|   refresh: "もっと見る" | ||||
|   close: "閉じる" | ||||
| desktop/views/components/game-window.vue: | ||||
|   game: "リバーシ" | ||||
| desktop/views/components/home.vue: | ||||
| @@ -770,6 +785,8 @@ desktop/views/components/renote-form.vue: | ||||
|   failure: "Renoteに失敗しました" | ||||
| desktop/views/components/renote-form-window.vue: | ||||
|   title: "この投稿をRenoteしますか?" | ||||
| desktop/views/components/timeline.core.vue: | ||||
|   empty: "投稿がありません" | ||||
| desktop/views/pages/user-following-or-followers.vue: | ||||
|   following: "{user}のフォロー" | ||||
|   followers: "{user}のフォロワー" | ||||
| @@ -798,13 +815,9 @@ desktop/views/components/settings.vue: | ||||
|   web-search-engine-desc: "例: https://www.google.com/?#q={{query}}" | ||||
|   auto-popout: "ウィンドウの自動ポップアウト" | ||||
|   auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。" | ||||
|   deck-nav: "デッキ内ナビゲーション" | ||||
|   deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。" | ||||
|   keep-cw: "CW保持" | ||||
|   keep-cw-desc: "投稿にリプライする際、リプライ元の投稿にCWが設定されていたとき、デフォルトで同じCWを設定するようにします。" | ||||
|   deck-default: "デッキをデフォルトのUIにする" | ||||
|   display: "デザインと表示" | ||||
|   customize: "ホームをカスタマイズ" | ||||
|   wallpaper: "壁紙" | ||||
|   choose-wallpaper: "壁紙を選択" | ||||
|   delete-wallpaper: "壁紙を削除" | ||||
| @@ -961,14 +974,11 @@ desktop/views/components/ui.header.account.vue: | ||||
|   favorites: "お気に入り" | ||||
|   lists: "リスト" | ||||
|   follow-requests: "フォロー申請" | ||||
|   customize: "ホームのカスタマイズ" | ||||
|   admin: "管理" | ||||
|   settings: "設定" | ||||
|   signout: "サインアウト" | ||||
|   dark: "闇に飲まれる" | ||||
| desktop/views/components/ui.header.nav.vue: | ||||
|   home: "ホーム" | ||||
|   deck: "デッキ" | ||||
|   game: "ゲーム" | ||||
| desktop/views/components/ui.header.notifications.vue: | ||||
|   title: "通知" | ||||
| @@ -1091,6 +1101,7 @@ admin/views/instance.vue: | ||||
|   smtp-secure-info: "STARTTLS使用時はオフにします。" | ||||
|   smtp-host: "SMTPホスト" | ||||
|   smtp-port: "SMTPポート" | ||||
|   smtp-auth: "SMTP認証を行う" | ||||
|   smtp-user: "SMTPユーザー" | ||||
|   smtp-pass: "SMTPパスワード" | ||||
|   serviceworker-config: "ServiceWorker" | ||||
| @@ -1306,8 +1317,6 @@ desktop/views/pages/welcome.vue: | ||||
|   info: "情報" | ||||
| desktop/views/pages/drive.vue: | ||||
|   title: "Misskey Drive" | ||||
| desktop/views/pages/home-customize.vue: | ||||
|   title: "ホームのカスタマイズ" | ||||
| desktop/views/pages/note.vue: | ||||
|   prev: "前の投稿" | ||||
|   next: "次の投稿" | ||||
| @@ -1339,18 +1348,17 @@ desktop/views/pages/user/user.photos.vue: | ||||
|   title: "フォト" | ||||
|   loading: "読み込み中" | ||||
|   no-photos: "写真はありません" | ||||
| desktop/views/pages/user/user.profile.vue: | ||||
|   follows-you: "フォローされています" | ||||
|   menu: "メニュー" | ||||
| desktop/views/pages/user/user.header.vue: | ||||
|   posts: "投稿" | ||||
|   following: "フォロー" | ||||
|   followers: "フォロワー" | ||||
|   is-bot: "このアカウントはBotです" | ||||
|   no-description: "自己紹介はありません" | ||||
|   years-old: "{age}歳" | ||||
|   year: "年" | ||||
|   month: "月" | ||||
|   day: "日" | ||||
|   follows-you: "フォローされています" | ||||
| desktop/views/pages/user/user.timeline.vue: | ||||
|   default: "投稿" | ||||
|   with-replies: "投稿と返信" | ||||
| @@ -1418,12 +1426,6 @@ common/views/components/follow-button.vue: | ||||
|   request-pending: "フォロー許可待ち" | ||||
|   follow-processing: "フォロー処理中" | ||||
|   follow-request: "フォロー申請" | ||||
| mobile/views/components/friends-maker.vue: | ||||
|   title: "気になるユーザーをフォロー" | ||||
|   empty: "おすすめのユーザーは見つかりませんでした。" | ||||
|   fetching: "読み込んでいます" | ||||
|   refresh: "もっと見る" | ||||
|   close: "閉じる" | ||||
| mobile/views/components/note.vue: | ||||
|   private: "この投稿は非公開です" | ||||
|   deleted: "この投稿は削除されました" | ||||
| @@ -1481,9 +1483,6 @@ mobile/views/components/ui.nav.vue: | ||||
| mobile/views/components/user-timeline.vue: | ||||
|   no-notes: "このユーザーは投稿していないようです。" | ||||
|   no-notes-with-media: "メディア付き投稿はありません。" | ||||
| mobile/views/components/users-list.vue: | ||||
|   all: "すべて" | ||||
|   known: "知り合い" | ||||
| mobile/views/pages/favorites.vue: | ||||
|   title: "お気に入り" | ||||
| mobile/views/pages/user-lists.vue: | ||||
| @@ -1502,6 +1501,8 @@ mobile/views/pages/home.vue: | ||||
|   global: "グローバル" | ||||
|   mentions: "あなた宛て" | ||||
|   messages: "メッセージ" | ||||
| mobile/views/pages/home.timeline.vue: | ||||
|   empty: "投稿がありません" | ||||
| mobile/views/pages/tag.vue: | ||||
|   no-posts-found: "ハッシュタグ「{q}」が付けられた投稿は見つかりませんでした。" | ||||
| mobile/views/pages/welcome.vue: | ||||
| @@ -1594,10 +1595,6 @@ mobile/views/pages/user/home.vue: | ||||
|   frequently-replied-users: "よく話すユーザー" | ||||
|   followers-you-know: "知り合いのフォロワー" | ||||
|   last-used-at: "最終ログイン" | ||||
| mobile/views/pages/user/home.followers-you-know.vue: | ||||
|   no-users: "知り合いのユーザーはいません" | ||||
| mobile/views/pages/user/home.friends.vue: | ||||
|   no-users: "よく話すユーザーはいません" | ||||
| mobile/views/pages/user/home.notes.vue: | ||||
|   no-notes: "投稿はありません" | ||||
| mobile/views/pages/user/home.photos.vue: | ||||
| @@ -1622,6 +1619,9 @@ deck: | ||||
|   rename: "名前を変更" | ||||
|   stack-left: "左に重ねる" | ||||
|   pop-right: "右に出す" | ||||
|   disabled-timeline: | ||||
|     title: "無効化されたタイムライン" | ||||
|     description: "サーバーの運営者により、このタイムラインは使用できない状態に設定されています。" | ||||
| deck/deck.tl-column.vue: | ||||
|   is-media-only: "メディア投稿のみ" | ||||
|   is-media-view: "メディアビュー" | ||||
|   | ||||
| @@ -66,6 +66,10 @@ common: | ||||
|   following: "フォロー中" | ||||
|   followers: "フォロワー" | ||||
|  | ||||
|   empty-timeline-info: | ||||
|     follow-users-to-make-your-timeline: "ユーザーをフォローすると投稿がタイムラインに表示されます。" | ||||
|     explore: "ユーザーを探索する" | ||||
|  | ||||
|   weekday-short: | ||||
|     sunday: "日" | ||||
|     monday: "月" | ||||
| @@ -224,6 +228,14 @@ common/views/pages/explore.vue: | ||||
|   verified-users: "公式アカウント" | ||||
|   popular-users: "人気のユーザー" | ||||
|   recently-updated-users: "最近投稿したユーザー" | ||||
|   recently-registered-users: "新規ユーザー" | ||||
|   popular-tags: "人気のタグ" | ||||
|   federated: "連合" | ||||
|   explore: "{host}を探索" | ||||
|   users-info: "現在{users}ユーザーが登録されています" | ||||
|  | ||||
| common/views/components/user-list.vue: | ||||
|   no-users: "ユーザーがいません" | ||||
|  | ||||
| common/views/components/games/reversi/reversi.vue: | ||||
|   matching: | ||||
| @@ -773,13 +785,6 @@ desktop/views/components/following-window.vue: | ||||
| desktop/views/components/following.vue: | ||||
|   empty: "フォロー中のユーザーはいないようです。" | ||||
|  | ||||
| desktop/views/components/friends-maker.vue: | ||||
|   title: "気になるユーザーをフォロー:" | ||||
|   empty: "おすすめのユーザーは見つかりませんでした。" | ||||
|   fetching: "読み込んでいます" | ||||
|   refresh: "もっと見る" | ||||
|   close: "閉じる" | ||||
|  | ||||
| desktop/views/components/game-window.vue: | ||||
|   game: "リバーシ" | ||||
|  | ||||
| @@ -1229,6 +1234,7 @@ admin/views/instance.vue: | ||||
|   smtp-secure-info: "STARTTLS使用時はオフにします。" | ||||
|   smtp-host: "SMTPホスト" | ||||
|   smtp-port: "SMTPポート" | ||||
|   smtp-auth: "SMTP認証を行う" | ||||
|   smtp-user: "SMTPユーザー" | ||||
|   smtp-pass: "SMTPパスワード" | ||||
|   serviceworker-config: "ServiceWorker" | ||||
| @@ -1500,6 +1506,7 @@ desktop/views/pages/user/user.header.vue: | ||||
|   following: "フォロー" | ||||
|   followers: "フォロワー" | ||||
|   is-bot: "このアカウントはBotです" | ||||
|   no-description: "自己紹介はありません" | ||||
|   years-old: "{age}歳" | ||||
|   year: "年" | ||||
|   month: "月" | ||||
| @@ -1588,13 +1595,6 @@ common/views/components/follow-button.vue: | ||||
|   follow-processing: "フォロー処理中" | ||||
|   follow-request: "フォロー申請" | ||||
|  | ||||
| mobile/views/components/friends-maker.vue: | ||||
|   title: "気になるユーザーをフォロー" | ||||
|   empty: "おすすめのユーザーは見つかりませんでした。" | ||||
|   fetching: "読み込んでいます" | ||||
|   refresh: "もっと見る" | ||||
|   close: "閉じる" | ||||
|  | ||||
| mobile/views/components/note.vue: | ||||
|   private: "この投稿は非公開です" | ||||
|   deleted: "この投稿は削除されました" | ||||
| @@ -1796,12 +1796,6 @@ mobile/views/pages/user/home.vue: | ||||
|   followers-you-know: "知り合いのフォロワー" | ||||
|   last-used-at: "最終ログイン" | ||||
|  | ||||
| mobile/views/pages/user/home.followers-you-know.vue: | ||||
|   no-users: "知り合いのユーザーはいません" | ||||
|  | ||||
| mobile/views/pages/user/home.friends.vue: | ||||
|   no-users: "よく話すユーザーはいません" | ||||
|  | ||||
| mobile/views/pages/user/home.notes.vue: | ||||
|   no-notes: "投稿はありません" | ||||
|  | ||||
|   | ||||
| @@ -28,6 +28,8 @@ common: | ||||
|   load-more: "もっとあらへんのか!" | ||||
|   enter-password: "パスワードを入れてや" | ||||
|   2fa: "二段階認証" | ||||
|   customize-home: "ホームをカスタマイズ" | ||||
|   featured-notes: "ハイライト" | ||||
|   got-it: "ほい" | ||||
|   customization-tips: | ||||
|     title: "カスタマイズのヒント" | ||||
| @@ -56,6 +58,14 @@ common: | ||||
|   trash: "ゴミ箱" | ||||
|   drive: "ドライブ" | ||||
|   messaging: "トーク" | ||||
|   deck: "デッキ" | ||||
|   timeline: "タイムライン" | ||||
|   explore: "みつける" | ||||
|   following: "フォロー中" | ||||
|   followers: "フォロワー" | ||||
|   empty-timeline-info: | ||||
|     follow-users-to-make-your-timeline: "ユーザーをフォローすると投稿がタイムラインに表示されます。" | ||||
|     explore: "ユーザーを探索する" | ||||
|   weekday-short: | ||||
|     sunday: "日" | ||||
|     monday: "月" | ||||
| @@ -197,6 +207,17 @@ auth/views/index.vue: | ||||
|   please-go-back: "アプリケーションに戻って、気張ってってな。" | ||||
|   error: "セッションが存在してへん。" | ||||
|   sign-in: "サインインしてや" | ||||
| common/views/pages/explore.vue: | ||||
|   verified-users: "公式アカウント" | ||||
|   popular-users: "人気のユーザー" | ||||
|   recently-updated-users: "最近投稿したユーザー" | ||||
|   recently-registered-users: "新規ユーザー" | ||||
|   popular-tags: "人気のタグ" | ||||
|   federated: "連合" | ||||
|   explore: "{host}を探索" | ||||
|   users-info: "現在{users}ユーザーが登録されています" | ||||
| common/views/components/user-list.vue: | ||||
|   no-users: "ユーザーがいません" | ||||
| common/views/components/games/reversi/reversi.vue: | ||||
|   matching: | ||||
|     waiting-for: "{}を待っとります" | ||||
| @@ -684,12 +705,6 @@ desktop/views/components/following-window.vue: | ||||
|   following: "{} のフォロー" | ||||
| desktop/views/components/following.vue: | ||||
|   empty: "フォロー中のユーザーはおらんっぽいで、知らんけど。" | ||||
| desktop/views/components/friends-maker.vue: | ||||
|   title: "おもろそうやな:" | ||||
|   empty: "おもろいユーザー居らんかったわ" | ||||
|   fetching: "読み込んどります" | ||||
|   refresh: "もっとあるやろ!" | ||||
|   close: "さいなら" | ||||
| desktop/views/components/game-window.vue: | ||||
|   game: "ゲーム" | ||||
| desktop/views/components/home.vue: | ||||
| @@ -770,6 +785,8 @@ desktop/views/components/renote-form.vue: | ||||
|   failure: "Renoteでけへん" | ||||
| desktop/views/components/renote-form-window.vue: | ||||
|   title: "この投稿をRenoteしてもええか?" | ||||
| desktop/views/components/timeline.core.vue: | ||||
|   empty: "投稿がありません" | ||||
| desktop/views/pages/user-following-or-followers.vue: | ||||
|   following: "{user}のフォロー" | ||||
|   followers: "{user}のフォロワー" | ||||
| @@ -798,13 +815,9 @@ desktop/views/components/settings.vue: | ||||
|   web-search-engine-desc: "例: https://www.google.com/?#q?{{query}}" | ||||
|   auto-popout: "ウィンドウの自動ポップアウト" | ||||
|   auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトすんで。この設定はブラウザに記憶されんで。" | ||||
|   deck-nav: "デッキ内ナビゲーション" | ||||
|   deck-nav-desc: "デッキを使うとるとき、ナビゲーションが発生するときにページ移動せんで、一時的なカラムで受けれるようにするで" | ||||
|   keep-cw: "CW保持" | ||||
|   keep-cw-desc: "投稿にリプライする際、リプライ元の投稿にCWが設定されていたとき、デフォルトで同じCWを設定するようにします。" | ||||
|   deck-default: "デッキをデフォルトのUIにする" | ||||
|   display: "見た感じ" | ||||
|   customize: "ホームをカスタマイズ" | ||||
|   wallpaper: "壁紙" | ||||
|   choose-wallpaper: "壁紙選ぶ" | ||||
|   delete-wallpaper: "壁紙ほかす" | ||||
| @@ -961,14 +974,11 @@ desktop/views/components/ui.header.account.vue: | ||||
|   favorites: "お気に入り" | ||||
|   lists: "リスト" | ||||
|   follow-requests: "フォロー許してくれや!言うてみる" | ||||
|   customize: "ホームをカスタマイズ" | ||||
|   admin: "管理" | ||||
|   settings: "設定" | ||||
|   signout: "さいなら" | ||||
|   dark: "ナイトゲームじゃ!" | ||||
| desktop/views/components/ui.header.nav.vue: | ||||
|   home: "ホーム" | ||||
|   deck: "デッキ" | ||||
|   game: "ゲーム" | ||||
| desktop/views/components/ui.header.notifications.vue: | ||||
|   title: "通知" | ||||
| @@ -1091,6 +1101,7 @@ admin/views/instance.vue: | ||||
|   smtp-secure-info: "STARTTLS使用時はオフにします。" | ||||
|   smtp-host: "SMTPホスト" | ||||
|   smtp-port: "SMTPポート" | ||||
|   smtp-auth: "SMTP認証を行う" | ||||
|   smtp-user: "SMTPユーザー" | ||||
|   smtp-pass: "SMTPパスワード" | ||||
|   serviceworker-config: "ServiceWorker" | ||||
| @@ -1306,8 +1317,6 @@ desktop/views/pages/welcome.vue: | ||||
|   info: "情報" | ||||
| desktop/views/pages/drive.vue: | ||||
|   title: "ドライブ" | ||||
| desktop/views/pages/home-customize.vue: | ||||
|   title: "ホームをカスタマイズ" | ||||
| desktop/views/pages/note.vue: | ||||
|   prev: "前のやつ" | ||||
|   next: "次のやつ" | ||||
| @@ -1339,18 +1348,17 @@ desktop/views/pages/user/user.photos.vue: | ||||
|   title: "写真" | ||||
|   loading: "読み込んどります" | ||||
|   no-photos: "写真はあらへんで" | ||||
| desktop/views/pages/user/user.profile.vue: | ||||
|   follows-you: "フォローされとるで" | ||||
|   menu: "メニュー" | ||||
| desktop/views/pages/user/user.header.vue: | ||||
|   posts: "投稿" | ||||
|   following: "フォロー" | ||||
|   followers: "フォロワー" | ||||
|   is-bot: "このアカウントはBotや" | ||||
|   no-description: "自己紹介はありません" | ||||
|   years-old: "{age}歳" | ||||
|   year: "年" | ||||
|   month: "月" | ||||
|   day: "日" | ||||
|   follows-you: "フォローされています" | ||||
| desktop/views/pages/user/user.timeline.vue: | ||||
|   default: "投稿" | ||||
|   with-replies: "投稿と返信" | ||||
| @@ -1418,12 +1426,6 @@ common/views/components/follow-button.vue: | ||||
|   request-pending: "フォロー許してくれるん待っとる" | ||||
|   follow-processing: "今フォロー処理やっとる‥" | ||||
|   follow-request: "フォローさせてや!言うてみる" | ||||
| mobile/views/components/friends-maker.vue: | ||||
|   title: "おもろそうやな" | ||||
|   empty: "おすすめのユーザーはおらん。" | ||||
|   fetching: "読み込んどります" | ||||
|   refresh: "もっとあるやろ!" | ||||
|   close: "さいなら" | ||||
| mobile/views/components/note.vue: | ||||
|   private: "この投稿は見せられへんわ" | ||||
|   deleted: "この投稿なんか無くなってもうたわ" | ||||
| @@ -1481,9 +1483,6 @@ mobile/views/components/ui.nav.vue: | ||||
| mobile/views/components/user-timeline.vue: | ||||
|   no-notes: "このユーザーは投稿しとらんようや。" | ||||
|   no-notes-with-media: "メディア付き投稿はあらへん。" | ||||
| mobile/views/components/users-list.vue: | ||||
|   all: "すべて" | ||||
|   known: "知っとる" | ||||
| mobile/views/pages/favorites.vue: | ||||
|   title: "お気に入り" | ||||
| mobile/views/pages/user-lists.vue: | ||||
| @@ -1502,6 +1501,8 @@ mobile/views/pages/home.vue: | ||||
|   global: "グローバル" | ||||
|   mentions: "あんた宛て" | ||||
|   messages: "メッセージ" | ||||
| mobile/views/pages/home.timeline.vue: | ||||
|   empty: "投稿がありません" | ||||
| mobile/views/pages/tag.vue: | ||||
|   no-posts-found: "ハッシュタグ「{q}」が付けられた投稿はあらへんかった。" | ||||
| mobile/views/pages/welcome.vue: | ||||
| @@ -1591,13 +1592,9 @@ mobile/views/pages/user/home.vue: | ||||
|   activity: "やっとること" | ||||
|   keywords: "キーワード" | ||||
|   domains: "よく出るドメイン" | ||||
|   frequently-replied-users: "よう話しとるユーザー" | ||||
|   frequently-replied-users: "よく話すユーザー" | ||||
|   followers-you-know: "知っとるフォロワー" | ||||
|   last-used-at: "最後いつ来た?" | ||||
| mobile/views/pages/user/home.followers-you-know.vue: | ||||
|   no-users: "知っとるユーザーは居らん" | ||||
| mobile/views/pages/user/home.friends.vue: | ||||
|   no-users: "よう話すユーザーは居らん" | ||||
| mobile/views/pages/user/home.notes.vue: | ||||
|   no-notes: "投稿はあらへん" | ||||
| mobile/views/pages/user/home.photos.vue: | ||||
| @@ -1622,6 +1619,9 @@ deck: | ||||
|   rename: "名前を変えるで" | ||||
|   stack-left: "左に重ねんで!" | ||||
|   pop-right: "右に出すで!" | ||||
|   disabled-timeline: | ||||
|     title: "無効化されたタイムライン" | ||||
|     description: "サーバーの運営者により、このタイムラインは使用できない状態に設定されています。" | ||||
| deck/deck.tl-column.vue: | ||||
|   is-media-only: "メディア投稿だけや" | ||||
|   is-media-view: "メディアビュー" | ||||
|   | ||||
| @@ -28,6 +28,8 @@ common: | ||||
|   load-more: "더보기" | ||||
|   enter-password: "비밀번호를 입력하여 주십시오" | ||||
|   2fa: "2단계 인증" | ||||
|   customize-home: "홈 커스터마이징" | ||||
|   featured-notes: "하이라이트" | ||||
|   got-it: "알겠습니다" | ||||
|   customization-tips: | ||||
|     title: "커스터마이징 도움말" | ||||
| @@ -56,6 +58,14 @@ common: | ||||
|   trash: "휴지통" | ||||
|   drive: "드라이브" | ||||
|   messaging: "대화" | ||||
|   deck: "덱" | ||||
|   timeline: "타임라인" | ||||
|   explore: "발견" | ||||
|   following: "팔로우 중" | ||||
|   followers: "팔로워" | ||||
|   empty-timeline-info: | ||||
|     follow-users-to-make-your-timeline: "사용자를 팔로우하면 글이 타임라인에 표시됩니다." | ||||
|     explore: "사용자 탐색" | ||||
|   weekday-short: | ||||
|     sunday: "일" | ||||
|     monday: "월" | ||||
| @@ -197,6 +207,17 @@ auth/views/index.vue: | ||||
|   please-go-back: "어플리케이션으로 돌아가여 시도하여 주십시오." | ||||
|   error: "세션이 존재하지 않습니다." | ||||
|   sign-in: "로그인 해주시기 바랍니다" | ||||
| common/views/pages/explore.vue: | ||||
|   verified-users: "공식 계정" | ||||
|   popular-users: "인기 사용자" | ||||
|   recently-updated-users: "최근 게시한 사용자" | ||||
|   recently-registered-users: "신규 사용자" | ||||
|   popular-tags: "인기 태그" | ||||
|   federated: "연합" | ||||
|   explore: "{host}을(를) 탐색" | ||||
|   users-info: "현재 {users} 사용자가 등록되어 있습니다" | ||||
| common/views/components/user-list.vue: | ||||
|   no-users: "사용자가 없습니다" | ||||
| common/views/components/games/reversi/reversi.vue: | ||||
|   matching: | ||||
|     waiting-for: "{}을(를) 기다리고 있습니다" | ||||
| @@ -209,7 +230,7 @@ common/views/components/games/reversi/reversi.game.vue: | ||||
|   can-put-everywhere: "어디에도 둘 수 있는 모드" | ||||
| common/views/components/games/reversi/reversi.index.vue: | ||||
|   title: "Misskey Reversi" | ||||
|   sub-title: "다른 Misskey 유저와 리버시로 대결하자" | ||||
|   sub-title: "다른 Misskey 사용자와 리버시로 대결하자" | ||||
|   invite: "초대" | ||||
|   rule: "게임 방법" | ||||
|   rule-desc: "리버시는 상대와 번갈아가며 돌을 판에 두고, 상대의 돌을 자신의 돌 사이에 두어 자신의 색으로 바꿔나가며, 최종적으로 남아있는 돌이 많은 쪽이 승리하는 보드게임입니다." | ||||
| @@ -684,12 +705,6 @@ desktop/views/components/following-window.vue: | ||||
|   following: "{} 의 팔로우" | ||||
| desktop/views/components/following.vue: | ||||
|   empty: "팔로우중인 사용자가 없는 것 같습니다." | ||||
| desktop/views/components/friends-maker.vue: | ||||
|   title: "마음에 드는 사용자를 팔로우:" | ||||
|   empty: "추천 사용자를 찾을 수 없습니다." | ||||
|   fetching: "불러오는 중입니다" | ||||
|   refresh: "더 보기" | ||||
|   close: "닫기" | ||||
| desktop/views/components/game-window.vue: | ||||
|   game: "리버시" | ||||
| desktop/views/components/home.vue: | ||||
| @@ -770,6 +785,8 @@ desktop/views/components/renote-form.vue: | ||||
|   failure: "리노트에 실패하였습니다" | ||||
| desktop/views/components/renote-form-window.vue: | ||||
|   title: "이 글을 리노트하시겠습니까?" | ||||
| desktop/views/components/timeline.core.vue: | ||||
|   empty: "글이 없습니다" | ||||
| desktop/views/pages/user-following-or-followers.vue: | ||||
|   following: "{user}의 팔로잉" | ||||
|   followers: "{user}의 팔로워" | ||||
| @@ -798,13 +815,9 @@ desktop/views/components/settings.vue: | ||||
|   web-search-engine-desc: "예: https://www.google.com/?#q={{query}}" | ||||
|   auto-popout: "창 자동 팝아웃" | ||||
|   auto-popout-desc: "창이 열릴 때 팝아웃 (브라우저 밖으로 분리) 이 가능한 경우 자동으로 팝아웃합니다. 이 설정은 브라우저에 저장됩니다." | ||||
|   deck-nav: "덱 내 탐색" | ||||
|   deck-nav-desc: "덱을 사용중일 때, 내비게이션이 발생하였을 경우 페이지를 이동하지 않고 일시적으로 임시 칼럼을 생성하도록 합니다." | ||||
|   keep-cw: "CW 유지" | ||||
|   keep-cw-desc: "글에 답글을 달 때, 답글할 글에 CW가 설정되어 있는 경우 기본값으로 동일한 CW를 설정하도록 합니다." | ||||
|   deck-default: "덱을 기본 UI로 설정" | ||||
|   display: "디자인 및 표시" | ||||
|   customize: "홈 커스터마이징" | ||||
|   wallpaper: "배경" | ||||
|   choose-wallpaper: "배경 설정" | ||||
|   delete-wallpaper: "배경 제거" | ||||
| @@ -961,14 +974,11 @@ desktop/views/components/ui.header.account.vue: | ||||
|   favorites: "즐겨찾기" | ||||
|   lists: "리스트" | ||||
|   follow-requests: "팔로우 요청" | ||||
|   customize: "홈 커스터마이징" | ||||
|   admin: "관리" | ||||
|   settings: "설정" | ||||
|   signout: "로그아웃" | ||||
|   dark: "어둠에 삼켜져라" | ||||
| desktop/views/components/ui.header.nav.vue: | ||||
|   home: "홈" | ||||
|   deck: "덱" | ||||
|   game: "게임" | ||||
| desktop/views/components/ui.header.notifications.vue: | ||||
|   title: "알림" | ||||
| @@ -1040,7 +1050,7 @@ admin/views/instance.vue: | ||||
|   maintainer-email: "관리자 연락처" | ||||
|   drive-config: "드라이브 설정" | ||||
|   cache-remote-files: "원격 파일을 캐시" | ||||
|   cache-remote-files-desc: "이 설정을 해지하면 원격 파일을 캐시하지 않고 해당 파일을 직접 링크하게 됩니다. 그에 따라 서버의 저장 공간을 절약할 수 있지만, 프라이버시 설정에서 직접 링크를 무효로 설정한 유저에게는 파일이 보이지 않거나, 썸네일이 생성되지 않기 때문에 통신량이 증가합니다. 일반적으로 이 설정을 ON으로 두는 것을 추천합니다." | ||||
|   cache-remote-files-desc: "이 설정을 해지하면 원격 파일을 캐시하지 않고 해당 파일을 직접 링크하게 됩니다. 그에 따라 서버의 저장 공간을 절약할 수 있지만, 프라이버시 설정에서 직접 링크를 무효로 설정한 사용자에게는 파일이 보이지 않거나, 썸네일이 생성되지 않기 때문에 통신량이 증가합니다. 일반적으로 이 설정을 ON으로 두는 것을 추천합니다." | ||||
|   local-drive-capacity-mb: "로컬 사용자 한 명당 드라이브 용량" | ||||
|   remote-drive-capacity-mb: "원격 사용자 한 명당 드라이브 용량" | ||||
|   mb: "메가바이트 단위" | ||||
| @@ -1091,6 +1101,7 @@ admin/views/instance.vue: | ||||
|   smtp-secure-info: "STARTTLS를 사용 시 ON으로 합니다." | ||||
|   smtp-host: "SMTP 호스트" | ||||
|   smtp-port: "SMTP 포트" | ||||
|   smtp-auth: "SMTP 인증 수행" | ||||
|   smtp-user: "SMTP 사용자" | ||||
|   smtp-pass: "SMTP 비밀번호" | ||||
|   serviceworker-config: "ServiceWorker" | ||||
| @@ -1306,8 +1317,6 @@ desktop/views/pages/welcome.vue: | ||||
|   info: "정보" | ||||
| desktop/views/pages/drive.vue: | ||||
|   title: "Misskey Drive" | ||||
| desktop/views/pages/home-customize.vue: | ||||
|   title: "홈 커스터마이징" | ||||
| desktop/views/pages/note.vue: | ||||
|   prev: "이전 글" | ||||
|   next: "다음 글" | ||||
| @@ -1339,18 +1348,17 @@ desktop/views/pages/user/user.photos.vue: | ||||
|   title: "사진" | ||||
|   loading: "로드 중" | ||||
|   no-photos: "사진이 없습니다" | ||||
| desktop/views/pages/user/user.profile.vue: | ||||
|   follows-you: "당신을 팔로우합니다" | ||||
|   menu: "메뉴" | ||||
| desktop/views/pages/user/user.header.vue: | ||||
|   posts: "글" | ||||
|   following: "팔로잉" | ||||
|   followers: "팔로워" | ||||
|   is-bot: "이 계정은 Bot입니다" | ||||
|   no-description: "자기소개가 없습니다" | ||||
|   years-old: "{age}세" | ||||
|   year: "년" | ||||
|   month: "월" | ||||
|   day: "일" | ||||
|   follows-you: "당신을 팔로우합니다" | ||||
| desktop/views/pages/user/user.timeline.vue: | ||||
|   default: "글" | ||||
|   with-replies: "글과 답글" | ||||
| @@ -1418,12 +1426,6 @@ common/views/components/follow-button.vue: | ||||
|   request-pending: "팔로우 허가 대기중" | ||||
|   follow-processing: "팔로우 처리중" | ||||
|   follow-request: "팔로우 요청" | ||||
| mobile/views/components/friends-maker.vue: | ||||
|   title: "마음에 드는 사용자를 팔로우" | ||||
|   empty: "추천 사용자를 찾을 수 없습니다." | ||||
|   fetching: "불러오는 중입니다" | ||||
|   refresh: "더 보기" | ||||
|   close: "닫기" | ||||
| mobile/views/components/note.vue: | ||||
|   private: "이 글은 비공개입니다" | ||||
|   deleted: "이 글은 삭제되었습니다" | ||||
| @@ -1481,9 +1483,6 @@ mobile/views/components/ui.nav.vue: | ||||
| mobile/views/components/user-timeline.vue: | ||||
|   no-notes: "이 사용자는 작성한 글이 없는 것 같습니다." | ||||
|   no-notes-with-media: "미디어가 첨부된 글이 없습니다." | ||||
| mobile/views/components/users-list.vue: | ||||
|   all: "모두" | ||||
|   known: "아는 사람" | ||||
| mobile/views/pages/favorites.vue: | ||||
|   title: "즐겨찾기" | ||||
| mobile/views/pages/user-lists.vue: | ||||
| @@ -1502,6 +1501,8 @@ mobile/views/pages/home.vue: | ||||
|   global: "글로벌" | ||||
|   mentions: "받은 멘션" | ||||
|   messages: "메시지" | ||||
| mobile/views/pages/home.timeline.vue: | ||||
|   empty: "글이 없습니다" | ||||
| mobile/views/pages/tag.vue: | ||||
|   no-posts-found: "해시태그 \"{q}\"가 붙은 글을 찾을 수 없습니다." | ||||
| mobile/views/pages/welcome.vue: | ||||
| @@ -1591,13 +1592,9 @@ mobile/views/pages/user/home.vue: | ||||
|   activity: "활동" | ||||
|   keywords: "키워드" | ||||
|   domains: "자주 보이는 도메인" | ||||
|   frequently-replied-users: "자주 대화하는 사용자" | ||||
|   frequently-replied-users: "자주 언급되는 사용자" | ||||
|   followers-you-know: "아는 사람의 팔로워" | ||||
|   last-used-at: "마지막 로그인" | ||||
| mobile/views/pages/user/home.followers-you-know.vue: | ||||
|   no-users: "아는 사용자가 없습니다" | ||||
| mobile/views/pages/user/home.friends.vue: | ||||
|   no-users: "자주 대화하는 사용자가 없습니다" | ||||
| mobile/views/pages/user/home.notes.vue: | ||||
|   no-notes: "글이 없습니다" | ||||
| mobile/views/pages/user/home.photos.vue: | ||||
| @@ -1622,6 +1619,9 @@ deck: | ||||
|   rename: "이름 변경" | ||||
|   stack-left: "왼쪽에 쌓기" | ||||
|   pop-right: "오른쪽으로 빼기" | ||||
|   disabled-timeline: | ||||
|     title: "비활성화된 타임라인" | ||||
|     description: "서버 운영자에 의해 이 타임라인이 사용할 수 없도록 설정되어 있습니다." | ||||
| deck/deck.tl-column.vue: | ||||
|   is-media-only: "미디어가 달린 글만" | ||||
|   is-media-view: "미디어 보기" | ||||
|   | ||||
| @@ -28,6 +28,8 @@ common: | ||||
|   load-more: "もっと読み込む" | ||||
|   enter-password: "パスワードを入力してください" | ||||
|   2fa: "二段階認証" | ||||
|   customize-home: "ホームをカスタマイズ" | ||||
|   featured-notes: "ハイライト" | ||||
|   got-it: "わかった" | ||||
|   customization-tips: | ||||
|     title: "カスタマイズのヒント" | ||||
| @@ -56,6 +58,14 @@ common: | ||||
|   trash: "ゴミ箱" | ||||
|   drive: "ドライブ" | ||||
|   messaging: "トーク" | ||||
|   deck: "デッキ" | ||||
|   timeline: "タイムライン" | ||||
|   explore: "みつける" | ||||
|   following: "フォロー中" | ||||
|   followers: "フォロワー" | ||||
|   empty-timeline-info: | ||||
|     follow-users-to-make-your-timeline: "ユーザーをフォローすると投稿がタイムラインに表示されます。" | ||||
|     explore: "ユーザーを探索する" | ||||
|   weekday-short: | ||||
|     sunday: "Z" | ||||
|     monday: "M" | ||||
| @@ -197,6 +207,17 @@ auth/views/index.vue: | ||||
|   please-go-back: "アプリケーションに戻って、やっていってください。" | ||||
|   error: "セッションが存在しません。" | ||||
|   sign-in: "サインインしてください" | ||||
| common/views/pages/explore.vue: | ||||
|   verified-users: "公式アカウント" | ||||
|   popular-users: "人気のユーザー" | ||||
|   recently-updated-users: "最近投稿したユーザー" | ||||
|   recently-registered-users: "新規ユーザー" | ||||
|   popular-tags: "人気のタグ" | ||||
|   federated: "連合" | ||||
|   explore: "{host}を探索" | ||||
|   users-info: "現在{users}ユーザーが登録されています" | ||||
| common/views/components/user-list.vue: | ||||
|   no-users: "ユーザーがいません" | ||||
| common/views/components/games/reversi/reversi.vue: | ||||
|   matching: | ||||
|     waiting-for: "{}を待っています" | ||||
| @@ -684,12 +705,6 @@ desktop/views/components/following-window.vue: | ||||
|   following: "Volgend {}" | ||||
| desktop/views/components/following.vue: | ||||
|   empty: "Je volgt niemand." | ||||
| desktop/views/components/friends-maker.vue: | ||||
|   title: "Aanbevolen gebruikers:" | ||||
|   empty: "Er zijn geen vergelijkbare gebruikers gevonden." | ||||
|   fetching: "Bezig met laden…" | ||||
|   refresh: "Meer" | ||||
|   close: "Sluiten" | ||||
| desktop/views/components/game-window.vue: | ||||
|   game: "Othello" | ||||
| desktop/views/components/home.vue: | ||||
| @@ -770,6 +785,8 @@ desktop/views/components/renote-form.vue: | ||||
|   failure: "Renote mislukt" | ||||
| desktop/views/components/renote-form-window.vue: | ||||
|   title: "Weet je zeker dat je deze notitie wilt renoten?" | ||||
| desktop/views/components/timeline.core.vue: | ||||
|   empty: "投稿がありません" | ||||
| desktop/views/pages/user-following-or-followers.vue: | ||||
|   following: "{user}のフォロー" | ||||
|   followers: "{user}のフォロワー" | ||||
| @@ -798,13 +815,9 @@ desktop/views/components/settings.vue: | ||||
|   web-search-engine-desc: "例: https://www.google.com/?#q={{query}}" | ||||
|   auto-popout: "Venster automatisch uitvouwen" | ||||
|   auto-popout-desc: "Venster uitvouwen, indien mogelijk. Deze instelling wordt opgeslagen in je browser." | ||||
|   deck-nav: "デッキ内ナビゲーション" | ||||
|   deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。" | ||||
|   keep-cw: "CW保持" | ||||
|   keep-cw-desc: "投稿にリプライする際、リプライ元の投稿にCWが設定されていたとき、デフォルトで同じCWを設定するようにします。" | ||||
|   deck-default: "デッキをデフォルトのUIにする" | ||||
|   display: "Ontwerp en weergave" | ||||
|   customize: "Startpagina aanpassen" | ||||
|   wallpaper: "壁紙" | ||||
|   choose-wallpaper: "壁紙を選択" | ||||
|   delete-wallpaper: "壁紙を削除" | ||||
| @@ -961,14 +974,11 @@ desktop/views/components/ui.header.account.vue: | ||||
|   favorites: "Favorieten" | ||||
|   lists: "Lijsten" | ||||
|   follow-requests: "フォロー申請" | ||||
|   customize: "Aanpassen" | ||||
|   admin: "管理" | ||||
|   settings: "Instellingen" | ||||
|   signout: "Uitloggen" | ||||
|   dark: "Donkere modus" | ||||
| desktop/views/components/ui.header.nav.vue: | ||||
|   home: "Startpagina" | ||||
|   deck: "デッキ" | ||||
|   game: "Othello spelen" | ||||
| desktop/views/components/ui.header.notifications.vue: | ||||
|   title: "Meldingen" | ||||
| @@ -1091,6 +1101,7 @@ admin/views/instance.vue: | ||||
|   smtp-secure-info: "STARTTLS使用時はオフにします。" | ||||
|   smtp-host: "SMTPホスト" | ||||
|   smtp-port: "SMTPポート" | ||||
|   smtp-auth: "SMTP認証を行う" | ||||
|   smtp-user: "SMTPユーザー" | ||||
|   smtp-pass: "SMTPパスワード" | ||||
|   serviceworker-config: "ServiceWorker" | ||||
| @@ -1306,8 +1317,6 @@ desktop/views/pages/welcome.vue: | ||||
|   info: "情報" | ||||
| desktop/views/pages/drive.vue: | ||||
|   title: "Misskey Drive" | ||||
| desktop/views/pages/home-customize.vue: | ||||
|   title: "Startpagina aanpassen" | ||||
| desktop/views/pages/note.vue: | ||||
|   prev: "Vorige notitie" | ||||
|   next: "Volgende notitie" | ||||
| @@ -1339,18 +1348,17 @@ desktop/views/pages/user/user.photos.vue: | ||||
|   title: "Foto's" | ||||
|   loading: "Bezig met laden" | ||||
|   no-photos: "Geen foto's" | ||||
| desktop/views/pages/user/user.profile.vue: | ||||
|   follows-you: "Volgt jou" | ||||
|   menu: "メニュー" | ||||
| desktop/views/pages/user/user.header.vue: | ||||
|   posts: "投稿" | ||||
|   following: "フォロー" | ||||
|   followers: "フォロワー" | ||||
|   is-bot: "このアカウントはBotです" | ||||
|   no-description: "自己紹介はありません" | ||||
|   years-old: "{age}歳" | ||||
|   year: "年" | ||||
|   month: "月" | ||||
|   day: "日" | ||||
|   follows-you: "フォローされています" | ||||
| desktop/views/pages/user/user.timeline.vue: | ||||
|   default: "Berichten" | ||||
|   with-replies: "Berichten en antwoorden" | ||||
| @@ -1418,12 +1426,6 @@ common/views/components/follow-button.vue: | ||||
|   request-pending: "フォロー許可待ち" | ||||
|   follow-processing: "フォロー処理中" | ||||
|   follow-request: "フォロー申請" | ||||
| mobile/views/components/friends-maker.vue: | ||||
|   title: "気になるユーザーをフォロー" | ||||
|   empty: "おすすめのユーザーは見つかりませんでした。" | ||||
|   fetching: "読み込んでいます" | ||||
|   refresh: "もっと見る" | ||||
|   close: "閉じる" | ||||
| mobile/views/components/note.vue: | ||||
|   private: "この投稿は非公開です" | ||||
|   deleted: "この投稿は削除されました" | ||||
| @@ -1481,9 +1483,6 @@ mobile/views/components/ui.nav.vue: | ||||
| mobile/views/components/user-timeline.vue: | ||||
|   no-notes: "Het lijkt erop dat deze gebruiker nog niks heeft geplaatst" | ||||
|   no-notes-with-media: "Er zijn geen notities met bijgevoegde media" | ||||
| mobile/views/components/users-list.vue: | ||||
|   all: "Alles" | ||||
|   known: "die je kent" | ||||
| mobile/views/pages/favorites.vue: | ||||
|   title: "お気に入り" | ||||
| mobile/views/pages/user-lists.vue: | ||||
| @@ -1502,6 +1501,8 @@ mobile/views/pages/home.vue: | ||||
|   global: "グローバル" | ||||
|   mentions: "あなた宛て" | ||||
|   messages: "メッセージ" | ||||
| mobile/views/pages/home.timeline.vue: | ||||
|   empty: "投稿がありません" | ||||
| mobile/views/pages/tag.vue: | ||||
|   no-posts-found: "ハッシュタグ「{q}」が付けられた投稿は見つかりませんでした。" | ||||
| mobile/views/pages/welcome.vue: | ||||
| @@ -1591,13 +1592,9 @@ mobile/views/pages/user/home.vue: | ||||
|   activity: "Activiteit" | ||||
|   keywords: "Sleutelwoorden" | ||||
|   domains: "Domeinnamen" | ||||
|   frequently-replied-users: "Frequent gesproken gebruikers" | ||||
|   frequently-replied-users: "よく話すユーザー" | ||||
|   followers-you-know: "Volgers die je kent" | ||||
|   last-used-at: "Laatst actief" | ||||
| mobile/views/pages/user/home.followers-you-know.vue: | ||||
|   no-users: "Geen gebruikers" | ||||
| mobile/views/pages/user/home.friends.vue: | ||||
|   no-users: "Geen gebruikers" | ||||
| mobile/views/pages/user/home.notes.vue: | ||||
|   no-notes: "Geen notities" | ||||
| mobile/views/pages/user/home.photos.vue: | ||||
| @@ -1622,6 +1619,9 @@ deck: | ||||
|   rename: "名前を変更" | ||||
|   stack-left: "左に重ねる" | ||||
|   pop-right: "右に出す" | ||||
|   disabled-timeline: | ||||
|     title: "無効化されたタイムライン" | ||||
|     description: "サーバーの運営者により、このタイムラインは使用できない状態に設定されています。" | ||||
| deck/deck.tl-column.vue: | ||||
|   is-media-only: "メディア投稿のみ" | ||||
|   is-media-view: "メディアビュー" | ||||
|   | ||||
| @@ -28,6 +28,8 @@ common: | ||||
|   load-more: "もっと読み込む" | ||||
|   enter-password: "パスワードを入力してください" | ||||
|   2fa: "二段階認証" | ||||
|   customize-home: "ホームをカスタマイズ" | ||||
|   featured-notes: "ハイライト" | ||||
|   got-it: "Skjønner!" | ||||
|   customization-tips: | ||||
|     title: "カスタマイズのヒント" | ||||
| @@ -56,6 +58,14 @@ common: | ||||
|   trash: "Papirkurv" | ||||
|   drive: "ドライブ" | ||||
|   messaging: "トーク" | ||||
|   deck: "デッキ" | ||||
|   timeline: "タイムライン" | ||||
|   explore: "みつける" | ||||
|   following: "フォロー中" | ||||
|   followers: "フォロワー" | ||||
|   empty-timeline-info: | ||||
|     follow-users-to-make-your-timeline: "ユーザーをフォローすると投稿がタイムラインに表示されます。" | ||||
|     explore: "ユーザーを探索する" | ||||
|   weekday-short: | ||||
|     sunday: "S" | ||||
|     monday: "M" | ||||
| @@ -197,6 +207,17 @@ auth/views/index.vue: | ||||
|   please-go-back: "アプリケーションに戻って、やっていってください。" | ||||
|   error: "セッションが存在しません。" | ||||
|   sign-in: "サインインしてください" | ||||
| common/views/pages/explore.vue: | ||||
|   verified-users: "公式アカウント" | ||||
|   popular-users: "人気のユーザー" | ||||
|   recently-updated-users: "最近投稿したユーザー" | ||||
|   recently-registered-users: "新規ユーザー" | ||||
|   popular-tags: "人気のタグ" | ||||
|   federated: "連合" | ||||
|   explore: "{host}を探索" | ||||
|   users-info: "現在{users}ユーザーが登録されています" | ||||
| common/views/components/user-list.vue: | ||||
|   no-users: "ユーザーがいません" | ||||
| common/views/components/games/reversi/reversi.vue: | ||||
|   matching: | ||||
|     waiting-for: "{}を待っています" | ||||
| @@ -684,12 +705,6 @@ desktop/views/components/following-window.vue: | ||||
|   following: "{} のフォロー" | ||||
| desktop/views/components/following.vue: | ||||
|   empty: "フォロー中のユーザーはいないようです。" | ||||
| desktop/views/components/friends-maker.vue: | ||||
|   title: "気になるユーザーをフォロー:" | ||||
|   empty: "おすすめのユーザーは見つかりませんでした。" | ||||
|   fetching: "読み込んでいます" | ||||
|   refresh: "Mer" | ||||
|   close: "Lukk" | ||||
| desktop/views/components/game-window.vue: | ||||
|   game: "Reversi" | ||||
| desktop/views/components/home.vue: | ||||
| @@ -770,6 +785,8 @@ desktop/views/components/renote-form.vue: | ||||
|   failure: "Renoteに失敗しました" | ||||
| desktop/views/components/renote-form-window.vue: | ||||
|   title: "この投稿をRenoteしますか?" | ||||
| desktop/views/components/timeline.core.vue: | ||||
|   empty: "投稿がありません" | ||||
| desktop/views/pages/user-following-or-followers.vue: | ||||
|   following: "{user}のフォロー" | ||||
|   followers: "{user}のフォロワー" | ||||
| @@ -798,13 +815,9 @@ desktop/views/components/settings.vue: | ||||
|   web-search-engine-desc: "例: https://www.google.com/?#q={{query}}" | ||||
|   auto-popout: "ウィンドウの自動ポップアウト" | ||||
|   auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。" | ||||
|   deck-nav: "デッキ内ナビゲーション" | ||||
|   deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。" | ||||
|   keep-cw: "CW保持" | ||||
|   keep-cw-desc: "投稿にリプライする際、リプライ元の投稿にCWが設定されていたとき、デフォルトで同じCWを設定するようにします。" | ||||
|   deck-default: "デッキをデフォルトのUIにする" | ||||
|   display: "デザインと表示" | ||||
|   customize: "ホームをカスタマイズ" | ||||
|   wallpaper: "壁紙" | ||||
|   choose-wallpaper: "壁紙を選択" | ||||
|   delete-wallpaper: "壁紙を削除" | ||||
| @@ -961,14 +974,11 @@ desktop/views/components/ui.header.account.vue: | ||||
|   favorites: "Favoritter" | ||||
|   lists: "Lister" | ||||
|   follow-requests: "フォロー申請" | ||||
|   customize: "ホームのカスタマイズ" | ||||
|   admin: "Admin" | ||||
|   settings: "Innstillinger" | ||||
|   signout: "サインアウト" | ||||
|   dark: "闇に飲まれる" | ||||
| desktop/views/components/ui.header.nav.vue: | ||||
|   home: "Hjem" | ||||
|   deck: "Kolonner" | ||||
|   game: "Spill" | ||||
| desktop/views/components/ui.header.notifications.vue: | ||||
|   title: "Notifikasjon" | ||||
| @@ -1091,6 +1101,7 @@ admin/views/instance.vue: | ||||
|   smtp-secure-info: "STARTTLS使用時はオフにします。" | ||||
|   smtp-host: "SMTPホスト" | ||||
|   smtp-port: "SMTPポート" | ||||
|   smtp-auth: "SMTP認証を行う" | ||||
|   smtp-user: "SMTPユーザー" | ||||
|   smtp-pass: "SMTPパスワード" | ||||
|   serviceworker-config: "ServiceWorker" | ||||
| @@ -1306,8 +1317,6 @@ desktop/views/pages/welcome.vue: | ||||
|   info: "Informasjon" | ||||
| desktop/views/pages/drive.vue: | ||||
|   title: "Misskey Drive" | ||||
| desktop/views/pages/home-customize.vue: | ||||
|   title: "ホームのカスタマイズ" | ||||
| desktop/views/pages/note.vue: | ||||
|   prev: "Forrige innlegg" | ||||
|   next: "Neste innlegg" | ||||
| @@ -1339,18 +1348,17 @@ desktop/views/pages/user/user.photos.vue: | ||||
|   title: "Bilder" | ||||
|   loading: "Laster inn" | ||||
|   no-photos: "写真はありません" | ||||
| desktop/views/pages/user/user.profile.vue: | ||||
|   follows-you: "フォローされています" | ||||
|   menu: "メニュー" | ||||
| desktop/views/pages/user/user.header.vue: | ||||
|   posts: "Innlegg" | ||||
|   following: "Følger" | ||||
|   followers: "フォロワー" | ||||
|   is-bot: "このアカウントはBotです" | ||||
|   no-description: "自己紹介はありません" | ||||
|   years-old: "{age}歳" | ||||
|   year: "年" | ||||
|   month: "月" | ||||
|   day: "日" | ||||
|   follows-you: "フォローされています" | ||||
| desktop/views/pages/user/user.timeline.vue: | ||||
|   default: "Innlegg" | ||||
|   with-replies: "Innlegg og svar" | ||||
| @@ -1418,12 +1426,6 @@ common/views/components/follow-button.vue: | ||||
|   request-pending: "フォロー許可待ち" | ||||
|   follow-processing: "フォロー処理中" | ||||
|   follow-request: "フォロー申請" | ||||
| mobile/views/components/friends-maker.vue: | ||||
|   title: "気になるユーザーをフォロー" | ||||
|   empty: "おすすめのユーザーは見つかりませんでした。" | ||||
|   fetching: "読み込んでいます" | ||||
|   refresh: "Se mer" | ||||
|   close: "Lukk" | ||||
| mobile/views/components/note.vue: | ||||
|   private: "この投稿は非公開です" | ||||
|   deleted: "この投稿は削除されました" | ||||
| @@ -1481,9 +1483,6 @@ mobile/views/components/ui.nav.vue: | ||||
| mobile/views/components/user-timeline.vue: | ||||
|   no-notes: "このユーザーは投稿していないようです。" | ||||
|   no-notes-with-media: "メディア付き投稿はありません。" | ||||
| mobile/views/components/users-list.vue: | ||||
|   all: "Alle" | ||||
|   known: "Du kjenner" | ||||
| mobile/views/pages/favorites.vue: | ||||
|   title: "Favoritter" | ||||
| mobile/views/pages/user-lists.vue: | ||||
| @@ -1502,6 +1501,8 @@ mobile/views/pages/home.vue: | ||||
|   global: "Globalt" | ||||
|   mentions: "あなた宛て" | ||||
|   messages: "メッセージ" | ||||
| mobile/views/pages/home.timeline.vue: | ||||
|   empty: "投稿がありません" | ||||
| mobile/views/pages/tag.vue: | ||||
|   no-posts-found: "ハッシュタグ「{q}」が付けられた投稿は見つかりませんでした。" | ||||
| mobile/views/pages/welcome.vue: | ||||
| @@ -1594,10 +1595,6 @@ mobile/views/pages/user/home.vue: | ||||
|   frequently-replied-users: "よく話すユーザー" | ||||
|   followers-you-know: "知り合いのフォロワー" | ||||
|   last-used-at: "最終ログイン" | ||||
| mobile/views/pages/user/home.followers-you-know.vue: | ||||
|   no-users: "知り合いのユーザーはいません" | ||||
| mobile/views/pages/user/home.friends.vue: | ||||
|   no-users: "よく話すユーザーはいません" | ||||
| mobile/views/pages/user/home.notes.vue: | ||||
|   no-notes: "投稿はありません" | ||||
| mobile/views/pages/user/home.photos.vue: | ||||
| @@ -1622,6 +1619,9 @@ deck: | ||||
|   rename: "名前を変更" | ||||
|   stack-left: "左に重ねる" | ||||
|   pop-right: "右に出す" | ||||
|   disabled-timeline: | ||||
|     title: "無効化されたタイムライン" | ||||
|     description: "サーバーの運営者により、このタイムラインは使用できない状態に設定されています。" | ||||
| deck/deck.tl-column.vue: | ||||
|   is-media-only: "メディア投稿のみ" | ||||
|   is-media-view: "メディアビュー" | ||||
|   | ||||
| @@ -28,6 +28,8 @@ common: | ||||
|   load-more: "Załaduj więcej" | ||||
|   enter-password: "Wprowadź Hasło" | ||||
|   2fa: "Uwierzytelnienie dwuetapowe" | ||||
|   customize-home: "ホームをカスタマイズ" | ||||
|   featured-notes: "ハイライト" | ||||
|   got-it: "Rozumiem!" | ||||
|   customization-tips: | ||||
|     title: "Wskazówki o dostosowywaniu" | ||||
| @@ -56,6 +58,14 @@ common: | ||||
|   trash: "Kosz" | ||||
|   drive: "Dysk" | ||||
|   messaging: "Rozmowy" | ||||
|   deck: "デッキ" | ||||
|   timeline: "タイムライン" | ||||
|   explore: "みつける" | ||||
|   following: "フォロー中" | ||||
|   followers: "フォロワー" | ||||
|   empty-timeline-info: | ||||
|     follow-users-to-make-your-timeline: "ユーザーをフォローすると投稿がタイムラインに表示されます。" | ||||
|     explore: "ユーザーを探索する" | ||||
|   weekday-short: | ||||
|     sunday: "N" | ||||
|     monday: "Pn" | ||||
| @@ -197,6 +207,17 @@ auth/views/index.vue: | ||||
|   please-go-back: "Wróć do aplikacji." | ||||
|   error: "Sesja nie istnieje." | ||||
|   sign-in: "Proszę zalogować się." | ||||
| common/views/pages/explore.vue: | ||||
|   verified-users: "公式アカウント" | ||||
|   popular-users: "人気のユーザー" | ||||
|   recently-updated-users: "最近投稿したユーザー" | ||||
|   recently-registered-users: "新規ユーザー" | ||||
|   popular-tags: "人気のタグ" | ||||
|   federated: "連合" | ||||
|   explore: "{host}を探索" | ||||
|   users-info: "現在{users}ユーザーが登録されています" | ||||
| common/views/components/user-list.vue: | ||||
|   no-users: "ユーザーがいません" | ||||
| common/views/components/games/reversi/reversi.vue: | ||||
|   matching: | ||||
|     waiting-for: "Oczekiwanie na {}" | ||||
| @@ -684,12 +705,6 @@ desktop/views/components/following-window.vue: | ||||
|   following: "Śledzeni przez {}" | ||||
| desktop/views/components/following.vue: | ||||
|   empty: "Nikt Cię nie śledzi." | ||||
| desktop/views/components/friends-maker.vue: | ||||
|   title: "Zacznij śledzić ludzi takich jak Ty:" | ||||
|   empty: "Nie znaleziono podobnych użytkowników." | ||||
|   fetching: "Ładowanie…" | ||||
|   refresh: "Więcej" | ||||
|   close: "Zamknij" | ||||
| desktop/views/components/game-window.vue: | ||||
|   game: "Reversi" | ||||
| desktop/views/components/home.vue: | ||||
| @@ -770,6 +785,8 @@ desktop/views/components/renote-form.vue: | ||||
|   failure: "Nie udało się udostępnić" | ||||
| desktop/views/components/renote-form-window.vue: | ||||
|   title: "Czy na pewno chcesz udostępnić ten wpis?" | ||||
| desktop/views/components/timeline.core.vue: | ||||
|   empty: "投稿がありません" | ||||
| desktop/views/pages/user-following-or-followers.vue: | ||||
|   following: "{user}のフォロー" | ||||
|   followers: "{user}のフォロワー" | ||||
| @@ -798,13 +815,9 @@ desktop/views/components/settings.vue: | ||||
|   web-search-engine-desc: "Np: https://www.google.com/?#q={{query}}" | ||||
|   auto-popout: "Automatycznie pojawiające się okna" | ||||
|   auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。" | ||||
|   deck-nav: "デッキ内ナビゲーション" | ||||
|   deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。" | ||||
|   keep-cw: "CW保持" | ||||
|   keep-cw-desc: "投稿にリプライする際、リプライ元の投稿にCWが設定されていたとき、デフォルトで同じCWを設定するようにします。" | ||||
|   deck-default: "Użyj Talię jako domyślne UI" | ||||
|   display: "Wygląd i wyświetlanie" | ||||
|   customize: "Dostosuj stronę główną" | ||||
|   wallpaper: "Tapeta" | ||||
|   choose-wallpaper: "Wybierz tło" | ||||
|   delete-wallpaper: "Usuń tło" | ||||
| @@ -961,14 +974,11 @@ desktop/views/components/ui.header.account.vue: | ||||
|   favorites: "Ulubione" | ||||
|   lists: "Listy" | ||||
|   follow-requests: "Prośby o śledzenie" | ||||
|   customize: "Dostosuj stronę główną" | ||||
|   admin: "Admin" | ||||
|   settings: "Ustawienia" | ||||
|   signout: "Wyloguj się" | ||||
|   dark: "Sprowadź ciemność" | ||||
| desktop/views/components/ui.header.nav.vue: | ||||
|   home: "Strona główna" | ||||
|   deck: "Talia" | ||||
|   game: "Gra" | ||||
| desktop/views/components/ui.header.notifications.vue: | ||||
|   title: "Powiadomienia" | ||||
| @@ -1091,6 +1101,7 @@ admin/views/instance.vue: | ||||
|   smtp-secure-info: "STARTTLS使用時はオフにします。" | ||||
|   smtp-host: "SMTPホスト" | ||||
|   smtp-port: "SMTPポート" | ||||
|   smtp-auth: "SMTP認証を行う" | ||||
|   smtp-user: "SMTPユーザー" | ||||
|   smtp-pass: "SMTPパスワード" | ||||
|   serviceworker-config: "ServiceWorker" | ||||
| @@ -1306,8 +1317,6 @@ desktop/views/pages/welcome.vue: | ||||
|   info: "Informacje" | ||||
| desktop/views/pages/drive.vue: | ||||
|   title: "Dysk Misskey" | ||||
| desktop/views/pages/home-customize.vue: | ||||
|   title: "Dostosuj stronę główną" | ||||
| desktop/views/pages/note.vue: | ||||
|   prev: "Poprzedni wpis" | ||||
|   next: "Następny wpis" | ||||
| @@ -1339,18 +1348,17 @@ desktop/views/pages/user/user.photos.vue: | ||||
|   title: "Zdjęcia" | ||||
|   loading: "Ładowanie" | ||||
|   no-photos: "Brak zdjęć" | ||||
| desktop/views/pages/user/user.profile.vue: | ||||
|   follows-you: "Śledzi Cię" | ||||
|   menu: "Menu" | ||||
| desktop/views/pages/user/user.header.vue: | ||||
|   posts: "Wpisy" | ||||
|   following: "Śledzeni" | ||||
|   followers: "Śledzący" | ||||
|   is-bot: "To konto jest botem" | ||||
|   no-description: "自己紹介はありません" | ||||
|   years-old: "{age} lat" | ||||
|   year: "/" | ||||
|   month: "/" | ||||
|   day: "-" | ||||
|   follows-you: "フォローされています" | ||||
| desktop/views/pages/user/user.timeline.vue: | ||||
|   default: "Wpisy" | ||||
|   with-replies: "Wpisy i odpowiedzi" | ||||
| @@ -1418,12 +1426,6 @@ common/views/components/follow-button.vue: | ||||
|   request-pending: "フォロー許可待ち" | ||||
|   follow-processing: "Przetwarzanie" | ||||
|   follow-request: "Poproś o śledzenie" | ||||
| mobile/views/components/friends-maker.vue: | ||||
|   title: "Zacznij śledzić ludzi takich jak Ty" | ||||
|   empty: "Nie znaleziono podobnych użytkowników." | ||||
|   fetching: "Ładowanie…" | ||||
|   refresh: "Więcej" | ||||
|   close: "Zamknij" | ||||
| mobile/views/components/note.vue: | ||||
|   private: "ten wpis jest prywatny" | ||||
|   deleted: "ten wpis został usunięty" | ||||
| @@ -1481,9 +1483,6 @@ mobile/views/components/ui.nav.vue: | ||||
| mobile/views/components/user-timeline.vue: | ||||
|   no-notes: "Wygląda na to, że ten użytkownik nie opublikował jeszcze niczego" | ||||
|   no-notes-with-media: "Brak wpisów z zawartością multimedialną" | ||||
| mobile/views/components/users-list.vue: | ||||
|   all: "Wszyscy" | ||||
|   known: "Znasz" | ||||
| mobile/views/pages/favorites.vue: | ||||
|   title: "Ulubione" | ||||
| mobile/views/pages/user-lists.vue: | ||||
| @@ -1502,6 +1501,8 @@ mobile/views/pages/home.vue: | ||||
|   global: "Globalne" | ||||
|   mentions: "Wspomnienia" | ||||
|   messages: "Wiadomości" | ||||
| mobile/views/pages/home.timeline.vue: | ||||
|   empty: "投稿がありません" | ||||
| mobile/views/pages/tag.vue: | ||||
|   no-posts-found: "ハッシュタグ「{q}」が付けられた投稿は見つかりませんでした。" | ||||
| mobile/views/pages/welcome.vue: | ||||
| @@ -1591,13 +1592,9 @@ mobile/views/pages/user/home.vue: | ||||
|   activity: "Aktywność" | ||||
|   keywords: "Słowa kluczowe" | ||||
|   domains: "Domeny" | ||||
|   frequently-replied-users: "Często aktywni użytkownicy" | ||||
|   frequently-replied-users: "よく話すユーザー" | ||||
|   followers-you-know: "Śledzący których znasz" | ||||
|   last-used-at: "Ostatnio aktywny" | ||||
| mobile/views/pages/user/home.followers-you-know.vue: | ||||
|   no-users: "Brak użytkowników" | ||||
| mobile/views/pages/user/home.friends.vue: | ||||
|   no-users: "Brak użytkowników" | ||||
| mobile/views/pages/user/home.notes.vue: | ||||
|   no-notes: "Brak wpisów" | ||||
| mobile/views/pages/user/home.photos.vue: | ||||
| @@ -1622,6 +1619,9 @@ deck: | ||||
|   rename: "Zmień nazwę" | ||||
|   stack-left: "Przypnij do lewej" | ||||
|   pop-right: "右に出す" | ||||
|   disabled-timeline: | ||||
|     title: "無効化されたタイムライン" | ||||
|     description: "サーバーの運営者により、このタイムラインは使用できない状態に設定されています。" | ||||
| deck/deck.tl-column.vue: | ||||
|   is-media-only: "Tylko wpisy z zawartością multimedialną" | ||||
|   is-media-view: "Widok multimediów" | ||||
|   | ||||
| @@ -28,6 +28,8 @@ common: | ||||
|   load-more: "もっと読み込む" | ||||
|   enter-password: "パスワードを入力してください" | ||||
|   2fa: "二段階認証" | ||||
|   customize-home: "ホームをカスタマイズ" | ||||
|   featured-notes: "ハイライト" | ||||
|   got-it: "Entendi!" | ||||
|   customization-tips: | ||||
|     title: "Dicas de personalização" | ||||
| @@ -56,6 +58,14 @@ common: | ||||
|   trash: "Lixo" | ||||
|   drive: "ドライブ" | ||||
|   messaging: "トーク" | ||||
|   deck: "デッキ" | ||||
|   timeline: "タイムライン" | ||||
|   explore: "みつける" | ||||
|   following: "フォロー中" | ||||
|   followers: "フォロワー" | ||||
|   empty-timeline-info: | ||||
|     follow-users-to-make-your-timeline: "ユーザーをフォローすると投稿がタイムラインに表示されます。" | ||||
|     explore: "ユーザーを探索する" | ||||
|   weekday-short: | ||||
|     sunday: "Dom" | ||||
|     monday: "Seg" | ||||
| @@ -197,6 +207,17 @@ auth/views/index.vue: | ||||
|   please-go-back: "Por favor, volte ao aplicativo." | ||||
|   error: "A sessão não existe." | ||||
|   sign-in: "Por favor, entre." | ||||
| common/views/pages/explore.vue: | ||||
|   verified-users: "公式アカウント" | ||||
|   popular-users: "人気のユーザー" | ||||
|   recently-updated-users: "最近投稿したユーザー" | ||||
|   recently-registered-users: "新規ユーザー" | ||||
|   popular-tags: "人気のタグ" | ||||
|   federated: "連合" | ||||
|   explore: "{host}を探索" | ||||
|   users-info: "現在{users}ユーザーが登録されています" | ||||
| common/views/components/user-list.vue: | ||||
|   no-users: "ユーザーがいません" | ||||
| common/views/components/games/reversi/reversi.vue: | ||||
|   matching: | ||||
|     waiting-for: "{}を待っています" | ||||
| @@ -684,12 +705,6 @@ desktop/views/components/following-window.vue: | ||||
|   following: "{} のフォロー" | ||||
| desktop/views/components/following.vue: | ||||
|   empty: "フォロー中のユーザーはいないようです。" | ||||
| desktop/views/components/friends-maker.vue: | ||||
|   title: "気になるユーザーをフォロー:" | ||||
|   empty: "おすすめのユーザーは見つかりませんでした。" | ||||
|   fetching: "読み込んでいます" | ||||
|   refresh: "もっと見る" | ||||
|   close: "閉じる" | ||||
| desktop/views/components/game-window.vue: | ||||
|   game: "リバーシ" | ||||
| desktop/views/components/home.vue: | ||||
| @@ -770,6 +785,8 @@ desktop/views/components/renote-form.vue: | ||||
|   failure: "Renoteに失敗しました" | ||||
| desktop/views/components/renote-form-window.vue: | ||||
|   title: "この投稿をRenoteしますか?" | ||||
| desktop/views/components/timeline.core.vue: | ||||
|   empty: "投稿がありません" | ||||
| desktop/views/pages/user-following-or-followers.vue: | ||||
|   following: "{user}のフォロー" | ||||
|   followers: "{user}のフォロワー" | ||||
| @@ -798,13 +815,9 @@ desktop/views/components/settings.vue: | ||||
|   web-search-engine-desc: "例: https://www.google.com/?#q={{query}}" | ||||
|   auto-popout: "ウィンドウの自動ポップアウト" | ||||
|   auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。" | ||||
|   deck-nav: "デッキ内ナビゲーション" | ||||
|   deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。" | ||||
|   keep-cw: "CW保持" | ||||
|   keep-cw-desc: "投稿にリプライする際、リプライ元の投稿にCWが設定されていたとき、デフォルトで同じCWを設定するようにします。" | ||||
|   deck-default: "デッキをデフォルトのUIにする" | ||||
|   display: "デザインと表示" | ||||
|   customize: "ホームをカスタマイズ" | ||||
|   wallpaper: "壁紙" | ||||
|   choose-wallpaper: "壁紙を選択" | ||||
|   delete-wallpaper: "壁紙を削除" | ||||
| @@ -961,14 +974,11 @@ desktop/views/components/ui.header.account.vue: | ||||
|   favorites: "お気に入り" | ||||
|   lists: "リスト" | ||||
|   follow-requests: "フォロー申請" | ||||
|   customize: "ホームのカスタマイズ" | ||||
|   admin: "管理" | ||||
|   settings: "設定" | ||||
|   signout: "サインアウト" | ||||
|   dark: "闇に飲まれる" | ||||
| desktop/views/components/ui.header.nav.vue: | ||||
|   home: "ホーム" | ||||
|   deck: "デッキ" | ||||
|   game: "ゲーム" | ||||
| desktop/views/components/ui.header.notifications.vue: | ||||
|   title: "通知" | ||||
| @@ -1091,6 +1101,7 @@ admin/views/instance.vue: | ||||
|   smtp-secure-info: "STARTTLS使用時はオフにします。" | ||||
|   smtp-host: "SMTPホスト" | ||||
|   smtp-port: "SMTPポート" | ||||
|   smtp-auth: "SMTP認証を行う" | ||||
|   smtp-user: "SMTPユーザー" | ||||
|   smtp-pass: "SMTPパスワード" | ||||
|   serviceworker-config: "ServiceWorker" | ||||
| @@ -1306,8 +1317,6 @@ desktop/views/pages/welcome.vue: | ||||
|   info: "情報" | ||||
| desktop/views/pages/drive.vue: | ||||
|   title: "Drive Misskey" | ||||
| desktop/views/pages/home-customize.vue: | ||||
|   title: "Personalizar a página inicial" | ||||
| desktop/views/pages/note.vue: | ||||
|   prev: "Nota anterior" | ||||
|   next: "Próxima nota" | ||||
| @@ -1339,18 +1348,17 @@ desktop/views/pages/user/user.photos.vue: | ||||
|   title: "フォト" | ||||
|   loading: "読み込み中" | ||||
|   no-photos: "写真はありません" | ||||
| desktop/views/pages/user/user.profile.vue: | ||||
|   follows-you: "フォローされています" | ||||
|   menu: "メニュー" | ||||
| desktop/views/pages/user/user.header.vue: | ||||
|   posts: "投稿" | ||||
|   following: "フォロー" | ||||
|   followers: "フォロワー" | ||||
|   is-bot: "このアカウントはBotです" | ||||
|   no-description: "自己紹介はありません" | ||||
|   years-old: "{age}歳" | ||||
|   year: "年" | ||||
|   month: "月" | ||||
|   day: "日" | ||||
|   follows-you: "フォローされています" | ||||
| desktop/views/pages/user/user.timeline.vue: | ||||
|   default: "投稿" | ||||
|   with-replies: "投稿と返信" | ||||
| @@ -1418,12 +1426,6 @@ common/views/components/follow-button.vue: | ||||
|   request-pending: "フォロー許可待ち" | ||||
|   follow-processing: "フォロー処理中" | ||||
|   follow-request: "フォロー申請" | ||||
| mobile/views/components/friends-maker.vue: | ||||
|   title: "気になるユーザーをフォロー" | ||||
|   empty: "おすすめのユーザーは見つかりませんでした。" | ||||
|   fetching: "読み込んでいます" | ||||
|   refresh: "もっと見る" | ||||
|   close: "閉じる" | ||||
| mobile/views/components/note.vue: | ||||
|   private: "この投稿は非公開です" | ||||
|   deleted: "この投稿は削除されました" | ||||
| @@ -1481,9 +1483,6 @@ mobile/views/components/ui.nav.vue: | ||||
| mobile/views/components/user-timeline.vue: | ||||
|   no-notes: "このユーザーは投稿していないようです。" | ||||
|   no-notes-with-media: "メディア付き投稿はありません。" | ||||
| mobile/views/components/users-list.vue: | ||||
|   all: "すべて" | ||||
|   known: "知り合い" | ||||
| mobile/views/pages/favorites.vue: | ||||
|   title: "お気に入り" | ||||
| mobile/views/pages/user-lists.vue: | ||||
| @@ -1502,6 +1501,8 @@ mobile/views/pages/home.vue: | ||||
|   global: "グローバル" | ||||
|   mentions: "あなた宛て" | ||||
|   messages: "メッセージ" | ||||
| mobile/views/pages/home.timeline.vue: | ||||
|   empty: "投稿がありません" | ||||
| mobile/views/pages/tag.vue: | ||||
|   no-posts-found: "ハッシュタグ「{q}」が付けられた投稿は見つかりませんでした。" | ||||
| mobile/views/pages/welcome.vue: | ||||
| @@ -1591,13 +1592,9 @@ mobile/views/pages/user/home.vue: | ||||
|   activity: "Atividade" | ||||
|   keywords: "Palavras chave" | ||||
|   domains: "Domínios" | ||||
|   frequently-replied-users: "Perguntas frequentes" | ||||
|   frequently-replied-users: "よく話すユーザー" | ||||
|   followers-you-know: "Seguidores que você conhece" | ||||
|   last-used-at: "Ativo pela última vez" | ||||
| mobile/views/pages/user/home.followers-you-know.vue: | ||||
|   no-users: "知り合いのユーザーはいません" | ||||
| mobile/views/pages/user/home.friends.vue: | ||||
|   no-users: "よく話すユーザーはいません" | ||||
| mobile/views/pages/user/home.notes.vue: | ||||
|   no-notes: "Nenhuma mensagem" | ||||
| mobile/views/pages/user/home.photos.vue: | ||||
| @@ -1622,6 +1619,9 @@ deck: | ||||
|   rename: "名前を変更" | ||||
|   stack-left: "左に重ねる" | ||||
|   pop-right: "右に出す" | ||||
|   disabled-timeline: | ||||
|     title: "無効化されたタイムライン" | ||||
|     description: "サーバーの運営者により、このタイムラインは使用できない状態に設定されています。" | ||||
| deck/deck.tl-column.vue: | ||||
|   is-media-only: "メディア投稿のみ" | ||||
|   is-media-view: "メディアビュー" | ||||
|   | ||||
| @@ -28,6 +28,8 @@ common: | ||||
|   load-more: "Загрузить больше" | ||||
|   enter-password: "Пожалуйста, введите ваш пароль" | ||||
|   2fa: "二段階認証" | ||||
|   customize-home: "ホームをカスタマイズ" | ||||
|   featured-notes: "ハイライト" | ||||
|   got-it: "わかった" | ||||
|   customization-tips: | ||||
|     title: "Советы по настройке" | ||||
| @@ -56,6 +58,14 @@ common: | ||||
|   trash: "Мусорное ведро" | ||||
|   drive: "Drive" | ||||
|   messaging: "Чат" | ||||
|   deck: "デッキ" | ||||
|   timeline: "タイムライン" | ||||
|   explore: "みつける" | ||||
|   following: "フォロー中" | ||||
|   followers: "フォロワー" | ||||
|   empty-timeline-info: | ||||
|     follow-users-to-make-your-timeline: "ユーザーをフォローすると投稿がタイムラインに表示されます。" | ||||
|     explore: "ユーザーを探索する" | ||||
|   weekday-short: | ||||
|     sunday: "Вс" | ||||
|     monday: "Пн" | ||||
| @@ -197,6 +207,17 @@ auth/views/index.vue: | ||||
|   please-go-back: "アプリケーションに戻って、やっていってください。" | ||||
|   error: "セッションが存在しません。" | ||||
|   sign-in: "サインインしてください" | ||||
| common/views/pages/explore.vue: | ||||
|   verified-users: "公式アカウント" | ||||
|   popular-users: "人気のユーザー" | ||||
|   recently-updated-users: "最近投稿したユーザー" | ||||
|   recently-registered-users: "新規ユーザー" | ||||
|   popular-tags: "人気のタグ" | ||||
|   federated: "連合" | ||||
|   explore: "{host}を探索" | ||||
|   users-info: "現在{users}ユーザーが登録されています" | ||||
| common/views/components/user-list.vue: | ||||
|   no-users: "ユーザーがいません" | ||||
| common/views/components/games/reversi/reversi.vue: | ||||
|   matching: | ||||
|     waiting-for: "{}を待っています" | ||||
| @@ -684,12 +705,6 @@ desktop/views/components/following-window.vue: | ||||
|   following: "{} のフォロー" | ||||
| desktop/views/components/following.vue: | ||||
|   empty: "フォロー中のユーザーはいないようです。" | ||||
| desktop/views/components/friends-maker.vue: | ||||
|   title: "気になるユーザーをフォロー:" | ||||
|   empty: "おすすめのユーザーは見つかりませんでした。" | ||||
|   fetching: "読み込んでいます" | ||||
|   refresh: "もっと見る" | ||||
|   close: "閉じる" | ||||
| desktop/views/components/game-window.vue: | ||||
|   game: "リバーシ" | ||||
| desktop/views/components/home.vue: | ||||
| @@ -770,6 +785,8 @@ desktop/views/components/renote-form.vue: | ||||
|   failure: "Renoteに失敗しました" | ||||
| desktop/views/components/renote-form-window.vue: | ||||
|   title: "この投稿をRenoteしますか?" | ||||
| desktop/views/components/timeline.core.vue: | ||||
|   empty: "投稿がありません" | ||||
| desktop/views/pages/user-following-or-followers.vue: | ||||
|   following: "{user}のフォロー" | ||||
|   followers: "{user}のフォロワー" | ||||
| @@ -798,13 +815,9 @@ desktop/views/components/settings.vue: | ||||
|   web-search-engine-desc: "例: https://www.google.com/?#q={{query}}" | ||||
|   auto-popout: "ウィンドウの自動ポップアウト" | ||||
|   auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。" | ||||
|   deck-nav: "デッキ内ナビゲーション" | ||||
|   deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。" | ||||
|   keep-cw: "CW保持" | ||||
|   keep-cw-desc: "投稿にリプライする際、リプライ元の投稿にCWが設定されていたとき、デフォルトで同じCWを設定するようにします。" | ||||
|   deck-default: "デッキをデフォルトのUIにする" | ||||
|   display: "デザインと表示" | ||||
|   customize: "ホームをカスタマイズ" | ||||
|   wallpaper: "壁紙" | ||||
|   choose-wallpaper: "壁紙を選択" | ||||
|   delete-wallpaper: "壁紙を削除" | ||||
| @@ -961,14 +974,11 @@ desktop/views/components/ui.header.account.vue: | ||||
|   favorites: "お気に入り" | ||||
|   lists: "リスト" | ||||
|   follow-requests: "フォロー申請" | ||||
|   customize: "ホームのカスタマイズ" | ||||
|   admin: "管理" | ||||
|   settings: "設定" | ||||
|   signout: "サインアウト" | ||||
|   dark: "闇に飲まれる" | ||||
| desktop/views/components/ui.header.nav.vue: | ||||
|   home: "ホーム" | ||||
|   deck: "デッキ" | ||||
|   game: "ゲーム" | ||||
| desktop/views/components/ui.header.notifications.vue: | ||||
|   title: "通知" | ||||
| @@ -1091,6 +1101,7 @@ admin/views/instance.vue: | ||||
|   smtp-secure-info: "STARTTLS使用時はオフにします。" | ||||
|   smtp-host: "SMTPホスト" | ||||
|   smtp-port: "SMTPポート" | ||||
|   smtp-auth: "SMTP認証を行う" | ||||
|   smtp-user: "SMTPユーザー" | ||||
|   smtp-pass: "SMTPパスワード" | ||||
|   serviceworker-config: "ServiceWorker" | ||||
| @@ -1306,8 +1317,6 @@ desktop/views/pages/welcome.vue: | ||||
|   info: "情報" | ||||
| desktop/views/pages/drive.vue: | ||||
|   title: "Misskey Drive" | ||||
| desktop/views/pages/home-customize.vue: | ||||
|   title: "ホームのカスタマイズ" | ||||
| desktop/views/pages/note.vue: | ||||
|   prev: "前の投稿" | ||||
|   next: "次の投稿" | ||||
| @@ -1339,18 +1348,17 @@ desktop/views/pages/user/user.photos.vue: | ||||
|   title: "フォト" | ||||
|   loading: "読み込み中" | ||||
|   no-photos: "写真はありません" | ||||
| desktop/views/pages/user/user.profile.vue: | ||||
|   follows-you: "フォローされています" | ||||
|   menu: "メニュー" | ||||
| desktop/views/pages/user/user.header.vue: | ||||
|   posts: "投稿" | ||||
|   following: "フォロー" | ||||
|   followers: "フォロワー" | ||||
|   is-bot: "このアカウントはBotです" | ||||
|   no-description: "自己紹介はありません" | ||||
|   years-old: "{age}歳" | ||||
|   year: "年" | ||||
|   month: "月" | ||||
|   day: "日" | ||||
|   follows-you: "フォローされています" | ||||
| desktop/views/pages/user/user.timeline.vue: | ||||
|   default: "投稿" | ||||
|   with-replies: "投稿と返信" | ||||
| @@ -1418,12 +1426,6 @@ common/views/components/follow-button.vue: | ||||
|   request-pending: "フォロー許可待ち" | ||||
|   follow-processing: "フォロー処理中" | ||||
|   follow-request: "フォロー申請" | ||||
| mobile/views/components/friends-maker.vue: | ||||
|   title: "気になるユーザーをフォロー" | ||||
|   empty: "おすすめのユーザーは見つかりませんでした。" | ||||
|   fetching: "読み込んでいます" | ||||
|   refresh: "もっと見る" | ||||
|   close: "閉じる" | ||||
| mobile/views/components/note.vue: | ||||
|   private: "この投稿は非公開です" | ||||
|   deleted: "この投稿は削除されました" | ||||
| @@ -1481,9 +1483,6 @@ mobile/views/components/ui.nav.vue: | ||||
| mobile/views/components/user-timeline.vue: | ||||
|   no-notes: "このユーザーは投稿していないようです。" | ||||
|   no-notes-with-media: "メディア付き投稿はありません。" | ||||
| mobile/views/components/users-list.vue: | ||||
|   all: "すべて" | ||||
|   known: "知り合い" | ||||
| mobile/views/pages/favorites.vue: | ||||
|   title: "お気に入り" | ||||
| mobile/views/pages/user-lists.vue: | ||||
| @@ -1502,6 +1501,8 @@ mobile/views/pages/home.vue: | ||||
|   global: "グローバル" | ||||
|   mentions: "あなた宛て" | ||||
|   messages: "メッセージ" | ||||
| mobile/views/pages/home.timeline.vue: | ||||
|   empty: "投稿がありません" | ||||
| mobile/views/pages/tag.vue: | ||||
|   no-posts-found: "ハッシュタグ「{q}」が付けられた投稿は見つかりませんでした。" | ||||
| mobile/views/pages/welcome.vue: | ||||
| @@ -1594,10 +1595,6 @@ mobile/views/pages/user/home.vue: | ||||
|   frequently-replied-users: "よく話すユーザー" | ||||
|   followers-you-know: "知り合いのフォロワー" | ||||
|   last-used-at: "最終ログイン" | ||||
| mobile/views/pages/user/home.followers-you-know.vue: | ||||
|   no-users: "知り合いのユーザーはいません" | ||||
| mobile/views/pages/user/home.friends.vue: | ||||
|   no-users: "よく話すユーザーはいません" | ||||
| mobile/views/pages/user/home.notes.vue: | ||||
|   no-notes: "投稿はありません" | ||||
| mobile/views/pages/user/home.photos.vue: | ||||
| @@ -1622,6 +1619,9 @@ deck: | ||||
|   rename: "名前を変更" | ||||
|   stack-left: "左に重ねる" | ||||
|   pop-right: "右に出す" | ||||
|   disabled-timeline: | ||||
|     title: "無効化されたタイムライン" | ||||
|     description: "サーバーの運営者により、このタイムラインは使用できない状態に設定されています。" | ||||
| deck/deck.tl-column.vue: | ||||
|   is-media-only: "メディア投稿のみ" | ||||
|   is-media-view: "メディアビュー" | ||||
|   | ||||
| @@ -28,6 +28,8 @@ common: | ||||
|   load-more: "加载更多" | ||||
|   enter-password: "请输入您的密码" | ||||
|   2fa: "双重身份验证" | ||||
|   customize-home: "自定义主页" | ||||
|   featured-notes: "高亮" | ||||
|   got-it: "没问题" | ||||
|   customization-tips: | ||||
|     title: "自定义提示" | ||||
| @@ -56,6 +58,14 @@ common: | ||||
|   trash: "垃圾箱" | ||||
|   drive: "网盘" | ||||
|   messaging: "聊天" | ||||
|   deck: "Deck" | ||||
|   timeline: "时间线" | ||||
|   explore: "发现" | ||||
|   following: "正在关注" | ||||
|   followers: "关注者" | ||||
|   empty-timeline-info: | ||||
|     follow-users-to-make-your-timeline: "关注其他用户时,帖子将显示在时间线中。" | ||||
|     explore: "查找用户" | ||||
|   weekday-short: | ||||
|     sunday: "日" | ||||
|     monday: "一" | ||||
| @@ -87,7 +97,7 @@ common: | ||||
|     public: "公开" | ||||
|     home: "首页" | ||||
|     home-desc: "仅发送至首页的时间线" | ||||
|     followers: "粉丝" | ||||
|     followers: "关注者" | ||||
|     followers-desc: "仅发送至粉丝" | ||||
|     specified: "指定用户" | ||||
|     specified-desc: "仅发送至指定用户" | ||||
| @@ -104,7 +114,7 @@ common: | ||||
|   search: "搜索" | ||||
|   delete: "删除" | ||||
|   loading: "正在加载中" | ||||
|   ok: "OK" | ||||
|   ok: "确定" | ||||
|   update-available-title: "有可用更新" | ||||
|   update-available: "新的 Misskey 版本现已发布({newer}。目前版本{current}). 刷新页面以应用更新。" | ||||
|   my-token-regenerated: "您的 Token 已被重置, 您将自动登出。" | ||||
| @@ -197,6 +207,17 @@ auth/views/index.vue: | ||||
|   please-go-back: "请返回到应用程序" | ||||
|   error: "会话不存在。" | ||||
|   sign-in: "请登录。" | ||||
| common/views/pages/explore.vue: | ||||
|   verified-users: "官方账户" | ||||
|   popular-users: "热门用户" | ||||
|   recently-updated-users: "活跃用户" | ||||
|   recently-registered-users: "新用户" | ||||
|   popular-tags: "热门标签" | ||||
|   federated: "联合" | ||||
|   explore: "查找{host}" | ||||
|   users-info: "当前有{users}个注册用户" | ||||
| common/views/components/user-list.vue: | ||||
|   no-users: "无用户" | ||||
| common/views/components/games/reversi/reversi.vue: | ||||
|   matching: | ||||
|     waiting-for: "等待 {}" | ||||
| @@ -684,12 +705,6 @@ desktop/views/components/following-window.vue: | ||||
|   following: "正在关注 {}" | ||||
| desktop/views/components/following.vue: | ||||
|   empty: "看起来您没有正在关注的用户..." | ||||
| desktop/views/components/friends-maker.vue: | ||||
|   title: "推荐用户:" | ||||
|   empty: "找不到推荐用户。" | ||||
|   fetching: "正在加载" | ||||
|   refresh: "浏览更多" | ||||
|   close: "关闭" | ||||
| desktop/views/components/game-window.vue: | ||||
|   game: "游戏" | ||||
| desktop/views/components/home.vue: | ||||
| @@ -698,7 +713,7 @@ desktop/views/components/home.vue: | ||||
|   add: "添加" | ||||
| desktop/views/input-dialog.vue: | ||||
|   cancel: "取消" | ||||
|   ok: "完成" | ||||
|   ok: "确定" | ||||
| desktop/views/components/messaging-room-window.vue: | ||||
|   title: "信息:" | ||||
| desktop/views/components/messaging-window.vue: | ||||
| @@ -770,6 +785,8 @@ desktop/views/components/renote-form.vue: | ||||
|   failure: "重新发送失败" | ||||
| desktop/views/components/renote-form-window.vue: | ||||
|   title: "您是否要重新发送?" | ||||
| desktop/views/components/timeline.core.vue: | ||||
|   empty: "没有帖子" | ||||
| desktop/views/pages/user-following-or-followers.vue: | ||||
|   following: "{user}的正在关注" | ||||
|   followers: "{user}的关注者" | ||||
| @@ -798,13 +815,9 @@ desktop/views/components/settings.vue: | ||||
|   web-search-engine-desc: "例如: https://www.google.com/?#q={{query}}" | ||||
|   auto-popout: "自动弹出窗口" | ||||
|   auto-popout-desc: "如果可用,将使用弹出显示而不是打开新窗口。 此设置存储在浏览器中。" | ||||
|   deck-nav: "Deck 内的导航" | ||||
|   deck-nav-desc: "在使用Deck时,您会在导航期间获得一个没有页面过渡的临时列。" | ||||
|   keep-cw: "保留内容警告" | ||||
|   keep-cw-desc: "在回复帖子时,如果原帖设置了内容警告,默认情况下回帖也会设置相同的内容警告。" | ||||
|   deck-default: "将Deck界面设置为默认UI显示界面" | ||||
|   display: "设计与展示" | ||||
|   customize: "自定义首页摆放" | ||||
|   wallpaper: "壁纸" | ||||
|   choose-wallpaper: "选择一个背景壁纸" | ||||
|   delete-wallpaper: "移除背景壁纸" | ||||
| @@ -961,14 +974,11 @@ desktop/views/components/ui.header.account.vue: | ||||
|   favorites: "最爱" | ||||
|   lists: "列表" | ||||
|   follow-requests: "关注申请" | ||||
|   customize: "自定义首页布局" | ||||
|   admin: "管理" | ||||
|   settings: "设置" | ||||
|   signout: "登出" | ||||
|   dark: "切换到黑暗模式 (夜间使用请打开此选项哦~)" | ||||
| desktop/views/components/ui.header.nav.vue: | ||||
|   home: "首页" | ||||
|   deck: "Deck" | ||||
|   game: "游戏" | ||||
| desktop/views/components/ui.header.notifications.vue: | ||||
|   title: "通知" | ||||
| @@ -1091,6 +1101,7 @@ admin/views/instance.vue: | ||||
|   smtp-secure-info: "使用时关闭 STARTTLS。" | ||||
|   smtp-host: "SMTP 服务器地址 (主机名)" | ||||
|   smtp-port: "SMTP 端口" | ||||
|   smtp-auth: "SMTP身份验证" | ||||
|   smtp-user: "SMTP 用户名" | ||||
|   smtp-pass: "SMTP 密码" | ||||
|   serviceworker-config: "ServiceWorker" | ||||
| @@ -1306,8 +1317,6 @@ desktop/views/pages/welcome.vue: | ||||
|   info: "信息" | ||||
| desktop/views/pages/drive.vue: | ||||
|   title: "Misskey 网盘" | ||||
| desktop/views/pages/home-customize.vue: | ||||
|   title: "自定义首页布局" | ||||
| desktop/views/pages/note.vue: | ||||
|   prev: "上一个帖子" | ||||
|   next: "下一个帖子" | ||||
| @@ -1339,18 +1348,17 @@ desktop/views/pages/user/user.photos.vue: | ||||
|   title: "照片" | ||||
|   loading: "正在加载中" | ||||
|   no-photos: "没有图片" | ||||
| desktop/views/pages/user/user.profile.vue: | ||||
|   follows-you: "关注您" | ||||
|   menu: "菜单" | ||||
| desktop/views/pages/user/user.header.vue: | ||||
|   posts: "帖子" | ||||
|   following: "关注中" | ||||
|   followers: "关注者" | ||||
|   is-bot: "这个账户是Bot" | ||||
|   no-description: "没有自我介绍" | ||||
|   years-old: "{age}岁" | ||||
|   year: "年" | ||||
|   month: "月" | ||||
|   day: "日" | ||||
|   follows-you: "关注您" | ||||
| desktop/views/pages/user/user.timeline.vue: | ||||
|   default: "帖子" | ||||
|   with-replies: "帖子与回复" | ||||
| @@ -1418,12 +1426,6 @@ common/views/components/follow-button.vue: | ||||
|   request-pending: "发送关注申请" | ||||
|   follow-processing: "申请处理中" | ||||
|   follow-request: "关注申请" | ||||
| mobile/views/components/friends-maker.vue: | ||||
|   title: "推荐用户:" | ||||
|   empty: "找不到推荐用户。" | ||||
|   fetching: "正在加载..." | ||||
|   refresh: "浏览更多" | ||||
|   close: "关闭" | ||||
| mobile/views/components/note.vue: | ||||
|   private: "私密帖子" | ||||
|   deleted: "帖子已删除" | ||||
| @@ -1481,9 +1483,6 @@ mobile/views/components/ui.nav.vue: | ||||
| mobile/views/components/user-timeline.vue: | ||||
|   no-notes: "看起来该用户还没有发表任何东西哎。" | ||||
|   no-notes-with-media: "媒体附件没有备注" | ||||
| mobile/views/components/users-list.vue: | ||||
|   all: "所有" | ||||
|   known: "共同" | ||||
| mobile/views/pages/favorites.vue: | ||||
|   title: "收藏" | ||||
| mobile/views/pages/user-lists.vue: | ||||
| @@ -1502,6 +1501,8 @@ mobile/views/pages/home.vue: | ||||
|   global: "Global" | ||||
|   mentions: "Mentions" | ||||
|   messages: "信息" | ||||
| mobile/views/pages/home.timeline.vue: | ||||
|   empty: "没有帖子" | ||||
| mobile/views/pages/tag.vue: | ||||
|   no-posts-found: "没有找到带有主题标签“{q}”的帖子" | ||||
| mobile/views/pages/welcome.vue: | ||||
| @@ -1591,13 +1592,9 @@ mobile/views/pages/user/home.vue: | ||||
|   activity: "活动" | ||||
|   keywords: "关键字" | ||||
|   domains: "域名" | ||||
|   frequently-replied-users: "活跃的用户" | ||||
|   frequently-replied-users: "活跃用户" | ||||
|   followers-you-know: "您可能认识的关注者" | ||||
|   last-used-at: "上次登录:" | ||||
| mobile/views/pages/user/home.followers-you-know.vue: | ||||
|   no-users: "没有您认识的用户" | ||||
| mobile/views/pages/user/home.friends.vue: | ||||
|   no-users: "没有您知道的用户" | ||||
| mobile/views/pages/user/home.notes.vue: | ||||
|   no-notes: "没有帖子" | ||||
| mobile/views/pages/user/home.photos.vue: | ||||
| @@ -1622,6 +1619,9 @@ deck: | ||||
|   rename: "重命名" | ||||
|   stack-left: "向左折叠" | ||||
|   pop-right: "带到右边" | ||||
|   disabled-timeline: | ||||
|     title: "禁用时间线" | ||||
|     description: "服务器管理员已禁用时间线。" | ||||
| deck/deck.tl-column.vue: | ||||
|   is-media-only: "只有媒体的帖子" | ||||
|   is-media-view: "媒体视图" | ||||
|   | ||||
| @@ -1,8 +1,7 @@ | ||||
| { | ||||
| 	"name": "misskey", | ||||
| 	"author": "syuilo <i@syuilo.com>", | ||||
| 	"version": "10.86.2", | ||||
| 	"clientVersion": "2.0.14342", | ||||
| 	"version": "10.87.5", | ||||
| 	"codename": "nighthike", | ||||
| 	"repository": { | ||||
| 		"type": "git", | ||||
| @@ -67,7 +66,7 @@ | ||||
| 		"@types/mkdirp": "0.5.2", | ||||
| 		"@types/mocha": "5.2.5", | ||||
| 		"@types/mongodb": "3.1.19", | ||||
| 		"@types/node": "10.12.21", | ||||
| 		"@types/node": "10.12.24", | ||||
| 		"@types/nodemailer": "4.6.5", | ||||
| 		"@types/nprogress": "0.0.29", | ||||
| 		"@types/oauth": "0.9.1", | ||||
| @@ -83,7 +82,7 @@ | ||||
| 		"@types/request-stats": "3.0.0", | ||||
| 		"@types/rimraf": "2.0.2", | ||||
| 		"@types/seedrandom": "2.4.27", | ||||
| 		"@types/sharp": "0.21.1", | ||||
| 		"@types/sharp": "0.21.2", | ||||
| 		"@types/showdown": "1.9.2", | ||||
| 		"@types/speakeasy": "2.0.3", | ||||
| 		"@types/systeminformation": "3.23.1", | ||||
| @@ -110,7 +109,7 @@ | ||||
| 		"commander": "2.19.0", | ||||
| 		"crc-32": "1.2.0", | ||||
| 		"css-loader": "2.1.0", | ||||
| 		"cssnano": "4.1.8", | ||||
| 		"cssnano": "4.1.10", | ||||
| 		"dateformat": "3.0.3", | ||||
| 		"deep-equal": "1.0.1", | ||||
| 		"deepcopy": "0.6.3", | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| <template> | ||||
| <div> | ||||
| 	<ui-card> | ||||
| 		<div slot="title"><fa :icon="faExclamationCircle"/> {{ $t('title') }}</div> | ||||
| 		<template #title><fa :icon="faExclamationCircle"/> {{ $t('title') }}</template> | ||||
| 		<section class="fit-top"> | ||||
| 			<sequential-entrance animation="entranceFromTop" delay="25"> | ||||
| 				<div v-for="report in userReports" :key="report.id" class="haexwsjc"> | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| <template> | ||||
| <div> | ||||
| 	<ui-card> | ||||
| 		<div slot="title"><fa icon="broadcast-tower"/> {{ $t('announcements') }}</div> | ||||
| 		<template #title><fa icon="broadcast-tower"/> {{ $t('announcements') }}</template> | ||||
| 		<section v-for="(announcement, i) in announcements" class="fit-top"> | ||||
| 			<ui-input v-model="announcement.title" @change="save"> | ||||
| 				<span>{{ $t('title') }}</span> | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| <template> | ||||
| <div> | ||||
| 	<ui-card> | ||||
| 		<div slot="title"><fa :icon="faTerminal"/> {{ $t('operation') }}</div> | ||||
| 		<template #title><fa :icon="faTerminal"/> {{ $t('operation') }}</template> | ||||
| 		<section class="fit-top"> | ||||
| 			<ui-input v-model="target" type="text"> | ||||
| 				<span>{{ $t('fileid-or-url') }}</span> | ||||
| @@ -17,18 +17,18 @@ | ||||
| 	</ui-card> | ||||
|  | ||||
| 	<ui-card> | ||||
| 		<div slot="title"><fa :icon="faCloud"/> {{ $t('@.drive') }}</div> | ||||
| 		<template #title><fa :icon="faCloud"/> {{ $t('@.drive') }}</template> | ||||
| 		<section class="fit-top"> | ||||
| 			<ui-horizon-group inputs> | ||||
| 				<ui-select v-model="sort"> | ||||
| 					<span slot="label">{{ $t('sort.title') }}</span> | ||||
| 					<template #label>{{ $t('sort.title') }}</template> | ||||
| 					<option value="-createdAt">{{ $t('sort.createdAtAsc') }}</option> | ||||
| 					<option value="+createdAt">{{ $t('sort.createdAtDesc') }}</option> | ||||
| 					<option value="-size">{{ $t('sort.sizeAsc') }}</option> | ||||
| 					<option value="+size">{{ $t('sort.sizeDesc') }}</option> | ||||
| 				</ui-select> | ||||
| 				<ui-select v-model="origin"> | ||||
| 					<span slot="label">{{ $t('origin.title') }}</span> | ||||
| 					<template #label>{{ $t('origin.title') }}</template> | ||||
| 					<option value="combined">{{ $t('origin.combined') }}</option> | ||||
| 					<option value="local">{{ $t('origin.local') }}</option> | ||||
| 					<option value="remote">{{ $t('origin.remote') }}</option> | ||||
|   | ||||
| @@ -1,20 +1,20 @@ | ||||
| <template> | ||||
| <div> | ||||
| 	<ui-card> | ||||
| 		<div slot="title"><fa icon="plus"/> {{ $t('add-emoji.title') }}</div> | ||||
| 		<template #title><fa icon="plus"/> {{ $t('add-emoji.title') }}</template> | ||||
| 		<section class="fit-top"> | ||||
| 			<ui-horizon-group inputs> | ||||
| 				<ui-input v-model="name"> | ||||
| 					<span>{{ $t('add-emoji.name') }}</span> | ||||
| 					<span slot="desc">{{ $t('add-emoji.name-desc') }}</span> | ||||
| 					<template #desc>{{ $t('add-emoji.name-desc') }}</template> | ||||
| 				</ui-input> | ||||
| 				<ui-input v-model="aliases"> | ||||
| 					<span>{{ $t('add-emoji.aliases') }}</span> | ||||
| 					<span slot="desc">{{ $t('add-emoji.aliases-desc') }}</span> | ||||
| 					<template #desc>{{ $t('add-emoji.aliases-desc') }}</template> | ||||
| 				</ui-input> | ||||
| 			</ui-horizon-group> | ||||
| 			<ui-input v-model="url"> | ||||
| 				<i slot="icon"><fa icon="link"/></i> | ||||
| 				<template #icon><fa icon="link"/></template> | ||||
| 				<span>{{ $t('add-emoji.url') }}</span> | ||||
| 			</ui-input> | ||||
| 			<ui-info>{{ $t('add-emoji.info') }}</ui-info> | ||||
| @@ -23,7 +23,7 @@ | ||||
| 	</ui-card> | ||||
|  | ||||
| 	<ui-card> | ||||
| 		<div slot="title"><fa :icon="faGrin"/> {{ $t('emojis.title') }}</div> | ||||
| 		<template #title><fa :icon="faGrin"/> {{ $t('emojis.title') }}</template> | ||||
| 		<section v-for="emoji in emojis" class="oryfrbft"> | ||||
| 			<div> | ||||
| 				<img :src="emoji.url" :alt="emoji.name" style="width: 64px;"/> | ||||
| @@ -38,7 +38,7 @@ | ||||
| 					</ui-input> | ||||
| 				</ui-horizon-group> | ||||
| 				<ui-input v-model="emoji.url"> | ||||
| 					<i slot="icon"><fa icon="link"/></i> | ||||
| 					<template #icon><fa icon="link"/></template> | ||||
| 					<span>{{ $t('add-emoji.url') }}</span> | ||||
| 				</ui-input> | ||||
| 				<ui-horizon-group class="fit-bottom"> | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| <template> | ||||
| <div> | ||||
| 	<ui-card> | ||||
| 		<div slot="title"><fa :icon="faTerminal"/> {{ $t('federation') }}</div> | ||||
| 		<template #title><fa :icon="faTerminal"/> {{ $t('federation') }}</template> | ||||
| 		<section class="fit-top"> | ||||
| 			<ui-input class="target" v-model="target" type="text" @enter="showInstance()"> | ||||
| 				<span>{{ $t('host') }}</span> | ||||
| @@ -74,11 +74,11 @@ | ||||
| 	</ui-card> | ||||
|  | ||||
| 	<ui-card> | ||||
| 		<div slot="title"><fa :icon="faServer"/> {{ $t('instances') }}</div> | ||||
| 		<template #title><fa :icon="faServer"/> {{ $t('instances') }}</template> | ||||
| 		<section class="fit-top"> | ||||
| 			<ui-horizon-group inputs> | ||||
| 				<ui-select v-model="sort"> | ||||
| 					<span slot="label">{{ $t('sort') }}</span> | ||||
| 					<template #label>{{ $t('sort') }}</template> | ||||
| 					<option value="-caughtAt">{{ $t('sorts.caughtAtAsc') }}</option> | ||||
| 					<option value="+caughtAt">{{ $t('sorts.caughtAtDesc') }}</option> | ||||
| 					<option value="-lastCommunicatedAt">{{ $t('sorts.lastCommunicatedAtAsc') }}</option> | ||||
| @@ -97,7 +97,7 @@ | ||||
| 					<option value="+driveFiles">{{ $t('sorts.driveFilesDesc') }}</option> | ||||
| 				</ui-select> | ||||
| 				<ui-select v-model="state"> | ||||
| 					<span slot="label">{{ $t('state') }}</span> | ||||
| 					<template #label>{{ $t('state') }}</template> | ||||
| 					<option value="all">{{ $t('states.all') }}</option> | ||||
| 					<option value="blocked">{{ $t('states.blocked') }}</option> | ||||
| 					<option value="notResponding">{{ $t('states.not-responding') }}</option> | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| <template> | ||||
| <div> | ||||
| 	<ui-card> | ||||
| 		<div slot="title">{{ $t('hided-tags') }}</div> | ||||
| 		<template #title>{{ $t('hided-tags') }}</template> | ||||
| 		<section> | ||||
| 			<textarea class="jdnqwkzlnxcfftthoybjxrebyolvoucw" v-model="hidedTags"></textarea> | ||||
| 			<ui-button @click="save">{{ $t('save') }}</ui-button> | ||||
|   | ||||
| @@ -1,20 +1,20 @@ | ||||
| <template> | ||||
| <div> | ||||
| 	<ui-card> | ||||
| 		<div slot="title"><fa icon="cog"/> {{ $t('instance') }}</div> | ||||
| 		<template #title><fa icon="cog"/> {{ $t('instance') }}</template> | ||||
| 		<section class="fit-top fit-bottom"> | ||||
| 			<ui-input :value="host" readonly>{{ $t('host') }}</ui-input> | ||||
| 			<ui-input v-model="name">{{ $t('instance-name') }}</ui-input> | ||||
| 			<ui-textarea v-model="description">{{ $t('instance-description') }}</ui-textarea> | ||||
| 			<ui-input v-model="mascotImageUrl"><i slot="icon"><fa icon="link"/></i>{{ $t('logo-url') }}</ui-input> | ||||
| 			<ui-input v-model="bannerUrl"><i slot="icon"><fa icon="link"/></i>{{ $t('banner-url') }}</ui-input> | ||||
| 			<ui-input v-model="errorImageUrl"><i slot="icon"><fa icon="link"/></i>{{ $t('error-image-url') }}</ui-input> | ||||
| 			<ui-input v-model="languages"><i slot="icon"><fa icon="language"/></i>{{ $t('languages') }}<span slot="desc">{{ $t('languages-desc') }}</span></ui-input> | ||||
| 			<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="errorImageUrl"><template #icon><fa icon="link"/></template>{{ $t('error-image-url') }}</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 class="fit-bottom"> | ||||
| 			<header><fa :icon="faHeadset"/> {{ $t('maintainer-config') }}</header> | ||||
| 			<ui-input v-model="maintainerName">{{ $t('maintainer-name') }}</ui-input> | ||||
| 			<ui-input v-model="maintainerEmail" type="email"><i slot="icon"><fa :icon="farEnvelope"/></i>{{ $t('maintainer-email') }}</ui-input> | ||||
| 			<ui-input v-model="maintainerEmail" type="email"><template #icon><fa :icon="farEnvelope"/></template>{{ $t('maintainer-email') }}</ui-input> | ||||
| 		</section> | ||||
| 		<section class="fit-top fit-bottom"> | ||||
| 			<ui-input v-model="maxNoteTextLength">{{ $t('max-note-text-length') }}</ui-input> | ||||
| @@ -27,46 +27,47 @@ | ||||
| 		</section> | ||||
| 		<section class="fit-bottom"> | ||||
| 			<header><fa icon="cloud"/> {{ $t('drive-config') }}</header> | ||||
| 			<ui-switch v-model="cacheRemoteFiles">{{ $t('cache-remote-files') }}<span slot="desc">{{ $t('cache-remote-files-desc') }}</span></ui-switch> | ||||
| 			<ui-input v-model="localDriveCapacityMb" type="number">{{ $t('local-drive-capacity-mb') }}<span slot="suffix">MB</span><span slot="desc">{{ $t('mb') }}</span></ui-input> | ||||
| 			<ui-input v-model="remoteDriveCapacityMb" type="number" :disabled="!cacheRemoteFiles">{{ $t('remote-drive-capacity-mb') }}<span slot="suffix">MB</span><span slot="desc">{{ $t('mb') }}</span></ui-input> | ||||
| 			<ui-switch v-model="cacheRemoteFiles">{{ $t('cache-remote-files') }}<template #desc>{{ $t('cache-remote-files-desc') }}</template></ui-switch> | ||||
| 			<ui-input v-model="localDriveCapacityMb" type="number">{{ $t('local-drive-capacity-mb') }}<template #suffix>MB</template><template #desc>{{ $t('mb') }}</template></ui-input> | ||||
| 			<ui-input v-model="remoteDriveCapacityMb" type="number" :disabled="!cacheRemoteFiles">{{ $t('remote-drive-capacity-mb') }}<template #suffix>MB</template><template #desc>{{ $t('mb') }}</template></ui-input> | ||||
| 		</section> | ||||
| 		<section class="fit-bottom"> | ||||
| 			<header><fa :icon="faShieldAlt"/> {{ $t('recaptcha-config') }}</header> | ||||
| 			<ui-switch v-model="enableRecaptcha">{{ $t('enable-recaptcha') }}</ui-switch> | ||||
| 			<ui-info>{{ $t('recaptcha-info') }}</ui-info> | ||||
| 			<ui-horizon-group inputs> | ||||
| 				<ui-input v-model="recaptchaSiteKey" :disabled="!enableRecaptcha"><i slot="icon"><fa icon="key"/></i>{{ $t('recaptcha-site-key') }}</ui-input> | ||||
| 				<ui-input v-model="recaptchaSecretKey" :disabled="!enableRecaptcha"><i slot="icon"><fa icon="key"/></i>{{ $t('recaptcha-secret-key') }}</ui-input> | ||||
| 				<ui-input v-model="recaptchaSiteKey" :disabled="!enableRecaptcha"><template #icon><fa icon="key"/></template>{{ $t('recaptcha-site-key') }}</ui-input> | ||||
| 				<ui-input v-model="recaptchaSecretKey" :disabled="!enableRecaptcha"><template #icon><fa icon="key"/></template>{{ $t('recaptcha-secret-key') }}</ui-input> | ||||
| 			</ui-horizon-group> | ||||
| 		</section> | ||||
| 		<section> | ||||
| 			<header><fa :icon="faGhost"/> {{ $t('proxy-account-config') }}</header> | ||||
| 			<ui-info>{{ $t('proxy-account-info') }}</ui-info> | ||||
| 			<ui-input v-model="proxyAccount"><span slot="prefix">@</span>{{ $t('proxy-account-username') }}<span slot="desc">{{ $t('proxy-account-username-desc') }}</span></ui-input> | ||||
| 			<ui-input v-model="proxyAccount"><template #prefix>@</template>{{ $t('proxy-account-username') }}<template #desc>{{ $t('proxy-account-username-desc') }}</template></ui-input> | ||||
| 			<ui-info warn>{{ $t('proxy-account-warn') }}</ui-info> | ||||
| 		</section> | ||||
| 		<section> | ||||
| 			<header><fa :icon="farEnvelope"/> {{ $t('email-config') }}</header> | ||||
| 			<ui-switch v-model="enableEmail">{{ $t('enable-email') }}<span slot="desc">{{ $t('email-config-info') }}</span></ui-switch> | ||||
| 			<ui-switch v-model="enableEmail">{{ $t('enable-email') }}<template #desc>{{ $t('email-config-info') }}</template></ui-switch> | ||||
| 			<ui-input v-model="email" type="email" :disabled="!enableEmail">{{ $t('email') }}</ui-input> | ||||
| 			<ui-horizon-group inputs> | ||||
| 				<ui-input v-model="smtpHost" :disabled="!enableEmail">{{ $t('smtp-host') }}</ui-input> | ||||
| 				<ui-input v-model="smtpPort" type="number" :disabled="!enableEmail">{{ $t('smtp-port') }}</ui-input> | ||||
| 			</ui-horizon-group> | ||||
| 			<ui-switch v-model="smtpAuth">{{ $t('smtp-auth') }}</ui-switch> | ||||
| 			<ui-horizon-group inputs> | ||||
| 				<ui-input v-model="smtpUser" :disabled="!enableEmail">{{ $t('smtp-user') }}</ui-input> | ||||
| 				<ui-input v-model="smtpPass" type="password" :withPasswordToggle="true" :disabled="!enableEmail">{{ $t('smtp-pass') }}</ui-input> | ||||
| 				<ui-input v-model="smtpUser" :disabled="!enableEmail || !smtpAuth">{{ $t('smtp-user') }}</ui-input> | ||||
| 				<ui-input v-model="smtpPass" type="password" :withPasswordToggle="true" :disabled="!enableEmail || !smtpAuth">{{ $t('smtp-pass') }}</ui-input> | ||||
| 			</ui-horizon-group> | ||||
| 			<ui-switch v-model="smtpSecure" :disabled="!enableEmail">{{ $t('smtp-secure') }}<span slot="desc">{{ $t('smtp-secure-info') }}</span></ui-switch> | ||||
| 			<ui-switch v-model="smtpSecure" :disabled="!enableEmail">{{ $t('smtp-secure') }}<template #desc>{{ $t('smtp-secure-info') }}</template></ui-switch> | ||||
| 		</section> | ||||
| 		<section> | ||||
| 			<header><fa :icon="faBolt"/> {{ $t('serviceworker-config') }}</header> | ||||
| 			<ui-switch v-model="enableServiceWorker">{{ $t('enable-serviceworker') }}<span slot="desc">{{ $t('serviceworker-info') }}</span></ui-switch> | ||||
| 			<ui-switch v-model="enableServiceWorker">{{ $t('enable-serviceworker') }}<template #desc>{{ $t('serviceworker-info') }}</template></ui-switch> | ||||
| 			<ui-info>{{ $t('vapid-info') }}<br><code>npm i web-push -g<br>web-push generate-vapid-keys</code></ui-info> | ||||
| 			<ui-horizon-group inputs class="fit-bottom"> | ||||
| 				<ui-input v-model="swPublicKey" :disabled="!enableServiceWorker"><i slot="icon"><fa icon="key"/></i>{{ $t('vapid-publickey') }}</ui-input> | ||||
| 				<ui-input v-model="swPrivateKey" :disabled="!enableServiceWorker"><i slot="icon"><fa icon="key"/></i>{{ $t('vapid-privatekey') }}</ui-input> | ||||
| 				<ui-input v-model="swPublicKey" :disabled="!enableServiceWorker"><template #icon><fa icon="key"/></template>{{ $t('vapid-publickey') }}</ui-input> | ||||
| 				<ui-input v-model="swPrivateKey" :disabled="!enableServiceWorker"><template #icon><fa icon="key"/></template>{{ $t('vapid-privatekey') }}</ui-input> | ||||
| 			</ui-horizon-group> | ||||
| 		</section> | ||||
| 		<section> | ||||
| @@ -76,8 +77,8 @@ | ||||
| 		<section> | ||||
| 			<header><fa :icon="faUserPlus"/> {{ $t('user-recommendation-config') }}</header> | ||||
| 			<ui-switch v-model="enableExternalUserRecommendation">{{ $t('enable-external-user-recommendation') }}</ui-switch> | ||||
| 			<ui-input v-model="externalUserRecommendationEngine" :disabled="!enableExternalUserRecommendation">{{ $t('external-user-recommendation-engine') }}<span slot="desc">{{ $t('external-user-recommendation-engine-desc') }}</span></ui-input> | ||||
| 			<ui-input v-model="externalUserRecommendationTimeout" type="number" :disabled="!enableExternalUserRecommendation">{{ $t('external-user-recommendation-timeout') }}<span slot="suffix">ms</span><span slot="desc">{{ $t('external-user-recommendation-timeout-desc') }}</span></ui-input> | ||||
| 			<ui-input v-model="externalUserRecommendationEngine" :disabled="!enableExternalUserRecommendation">{{ $t('external-user-recommendation-engine') }}<template #desc>{{ $t('external-user-recommendation-engine-desc') }}</template></ui-input> | ||||
| 			<ui-input v-model="externalUserRecommendationTimeout" type="number" :disabled="!enableExternalUserRecommendation">{{ $t('external-user-recommendation-timeout') }}<template #suffix>ms</template><template #desc>{{ $t('external-user-recommendation-timeout-desc') }}</template></ui-input> | ||||
| 		</section> | ||||
| 		<section> | ||||
| 			<ui-button @click="updateMeta">{{ $t('save') }}</ui-button> | ||||
| @@ -85,7 +86,7 @@ | ||||
| 	</ui-card> | ||||
|  | ||||
| 	<ui-card> | ||||
| 		<div slot="title">{{ $t('invite') }}</div> | ||||
| 		<template #title>{{ $t('invite') }}</template> | ||||
| 		<section> | ||||
| 			<ui-button @click="invite">{{ $t('invite') }}</ui-button> | ||||
| 			<p v-if="inviteCode">Code: <code>{{ inviteCode }}</code></p> | ||||
| @@ -93,12 +94,12 @@ | ||||
| 	</ui-card> | ||||
|  | ||||
| 	<ui-card> | ||||
| 		<div slot="title"><fa :icon="['fab', 'twitter']"/> {{ $t('twitter-integration-config') }}</div> | ||||
| 		<template #title><fa :icon="['fab', 'twitter']"/> {{ $t('twitter-integration-config') }}</template> | ||||
| 		<section> | ||||
| 			<ui-switch v-model="enableTwitterIntegration">{{ $t('enable-twitter-integration') }}</ui-switch> | ||||
| 			<ui-horizon-group> | ||||
| 				<ui-input v-model="twitterConsumerKey" :disabled="!enableTwitterIntegration"><i slot="icon"><fa icon="key"/></i>{{ $t('twitter-integration-consumer-key') }}</ui-input> | ||||
| 				<ui-input v-model="twitterConsumerSecret" :disabled="!enableTwitterIntegration"><i slot="icon"><fa icon="key"/></i>{{ $t('twitter-integration-consumer-secret') }}</ui-input> | ||||
| 				<ui-input v-model="twitterConsumerKey" :disabled="!enableTwitterIntegration"><template #icon><fa icon="key"/></template>{{ $t('twitter-integration-consumer-key') }}</ui-input> | ||||
| 				<ui-input v-model="twitterConsumerSecret" :disabled="!enableTwitterIntegration"><template #icon><fa icon="key"/></template>{{ $t('twitter-integration-consumer-secret') }}</ui-input> | ||||
| 			</ui-horizon-group> | ||||
| 			<ui-info>{{ $t('twitter-integration-info', { url: `${url}/api/tw/cb` }) }}</ui-info> | ||||
| 			<ui-button @click="updateMeta">{{ $t('save') }}</ui-button> | ||||
| @@ -106,12 +107,12 @@ | ||||
| 	</ui-card> | ||||
|  | ||||
| 	<ui-card> | ||||
| 		<div slot="title"><fa :icon="['fab', 'github']"/> {{ $t('github-integration-config') }}</div> | ||||
| 		<template #title><fa :icon="['fab', 'github']"/> {{ $t('github-integration-config') }}</template> | ||||
| 		<section> | ||||
| 			<ui-switch v-model="enableGithubIntegration">{{ $t('enable-github-integration') }}</ui-switch> | ||||
| 			<ui-horizon-group> | ||||
| 				<ui-input v-model="githubClientId" :disabled="!enableGithubIntegration"><i slot="icon"><fa icon="key"/></i>{{ $t('github-integration-client-id') }}</ui-input> | ||||
| 				<ui-input v-model="githubClientSecret" :disabled="!enableGithubIntegration"><i slot="icon"><fa icon="key"/></i>{{ $t('github-integration-client-secret') }}</ui-input> | ||||
| 				<ui-input v-model="githubClientId" :disabled="!enableGithubIntegration"><template #icon><fa icon="key"/></template>{{ $t('github-integration-client-id') }}</ui-input> | ||||
| 				<ui-input v-model="githubClientSecret" :disabled="!enableGithubIntegration"><template #icon><fa icon="key"/></template>{{ $t('github-integration-client-secret') }}</ui-input> | ||||
| 			</ui-horizon-group> | ||||
| 			<ui-info>{{ $t('github-integration-info', { url: `${url}/api/gh/cb` }) }}</ui-info> | ||||
| 			<ui-button @click="updateMeta">{{ $t('save') }}</ui-button> | ||||
| @@ -119,12 +120,12 @@ | ||||
| 	</ui-card> | ||||
|  | ||||
| 	<ui-card> | ||||
| 		<div slot="title"><fa :icon="['fab', 'discord']"/> {{ $t('discord-integration-config') }}</div> | ||||
| 		<template #title><fa :icon="['fab', 'discord']"/> {{ $t('discord-integration-config') }}</template> | ||||
| 		<section> | ||||
| 			<ui-switch v-model="enableDiscordIntegration">{{ $t('enable-discord-integration') }}</ui-switch> | ||||
| 			<ui-horizon-group> | ||||
| 				<ui-input v-model="discordClientId" :disabled="!enableDiscordIntegration"><i slot="icon"><fa icon="key"/></i>{{ $t('discord-integration-client-id') }}</ui-input> | ||||
| 				<ui-input v-model="discordClientSecret" :disabled="!enableDiscordIntegration"><i slot="icon"><fa icon="key"/></i>{{ $t('discord-integration-client-secret') }}</ui-input> | ||||
| 				<ui-input v-model="discordClientId" :disabled="!enableDiscordIntegration"><template #icon><fa icon="key"/></template>{{ $t('discord-integration-client-id') }}</ui-input> | ||||
| 				<ui-input v-model="discordClientSecret" :disabled="!enableDiscordIntegration"><template #icon><fa icon="key"/></template>{{ $t('discord-integration-client-secret') }}</ui-input> | ||||
| 			</ui-horizon-group> | ||||
| 			<ui-info>{{ $t('discord-integration-info', { url: `${url}/api/dc/cb` }) }}</ui-info> | ||||
| 			<ui-button @click="updateMeta">{{ $t('save') }}</ui-button> | ||||
| @@ -188,6 +189,7 @@ export default Vue.extend({ | ||||
| 			smtpPort: null, | ||||
| 			smtpUser: null, | ||||
| 			smtpPass: null, | ||||
| 			smtpAuth: false, | ||||
| 			enableServiceWorker: false, | ||||
| 			swPublicKey: null, | ||||
| 			swPrivateKey: null, | ||||
| @@ -236,6 +238,7 @@ export default Vue.extend({ | ||||
| 			this.smtpPort = meta.smtpPort; | ||||
| 			this.smtpUser = meta.smtpUser; | ||||
| 			this.smtpPass = meta.smtpPass; | ||||
| 			this.smtpAuth = meta.smtpUser != null && meta.smtpUser !== ''; | ||||
| 			this.enableServiceWorker = meta.enableServiceWorker; | ||||
| 			this.swPublicKey = meta.swPublickey; | ||||
| 			this.swPrivateKey = meta.swPrivateKey; | ||||
| @@ -293,8 +296,8 @@ export default Vue.extend({ | ||||
| 				smtpSecure: this.smtpSecure, | ||||
| 				smtpHost: this.smtpHost, | ||||
| 				smtpPort: parseInt(this.smtpPort, 10), | ||||
| 				smtpUser: this.smtpUser, | ||||
| 				smtpPass: this.smtpPass, | ||||
| 				smtpUser: this.smtpAuth ? this.smtpUser : '', | ||||
| 				smtpPass: this.smtpAuth ? this.smtpPass : '', | ||||
| 				enableServiceWorker: this.enableServiceWorker, | ||||
| 				swPublicKey: this.swPublicKey, | ||||
| 				swPrivateKey: this.swPrivateKey | ||||
|   | ||||
| @@ -1,10 +1,10 @@ | ||||
| <template> | ||||
| <div> | ||||
| 	<ui-card> | ||||
| 		<div slot="title"><fa icon="plus"/> {{ $t('add-moderator.title') }}</div> | ||||
| 		<template #title><fa icon="plus"/> {{ $t('add-moderator.title') }}</template> | ||||
| 		<section class="fit-top"> | ||||
| 			<ui-input v-model="username" type="text"> | ||||
| 				<span slot="prefix">@</span> | ||||
| 				<template #prefix>@</template> | ||||
| 			</ui-input> | ||||
| 			<ui-horizon-group> | ||||
| 				<ui-button @click="add" :disabled="changing">{{ $t('add-moderator.add') }}</ui-button> | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| <template> | ||||
| <div> | ||||
| 	<ui-card> | ||||
| 		<div slot="title">{{ $t('operation') }}</div> | ||||
| 		<template #title>{{ $t('operation') }}</template> | ||||
| 		<section> | ||||
| 			<ui-button @click="removeAllJobs">{{ $t('remove-all-jobs') }}</ui-button> | ||||
| 		</section> | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| <template> | ||||
| <div> | ||||
| 	<ui-card> | ||||
| 		<div slot="title"><fa :icon="faTerminal"/> {{ $t('operation') }}</div> | ||||
| 		<template #title><fa :icon="faTerminal"/> {{ $t('operation') }}</template> | ||||
| 		<section class="fit-top"> | ||||
| 			<ui-input class="target" v-model="target" type="text" @enter="showUser"> | ||||
| 				<span>{{ $t('username-or-userid') }}</span> | ||||
| @@ -32,18 +32,18 @@ | ||||
| 	</ui-card> | ||||
|  | ||||
| 	<ui-card> | ||||
| 		<div slot="title"><fa :icon="faUsers"/> {{ $t('users.title') }}</div> | ||||
| 		<template #title><fa :icon="faUsers"/> {{ $t('users.title') }}</template> | ||||
| 		<section class="fit-top"> | ||||
| 			<ui-horizon-group inputs> | ||||
| 				<ui-select v-model="sort"> | ||||
| 					<span slot="label">{{ $t('users.sort.title') }}</span> | ||||
| 					<template #label>{{ $t('users.sort.title') }}</template> | ||||
| 					<option value="-createdAt">{{ $t('users.sort.createdAtAsc') }}</option> | ||||
| 					<option value="+createdAt">{{ $t('users.sort.createdAtDesc') }}</option> | ||||
| 					<option value="-updatedAt">{{ $t('users.sort.updatedAtAsc') }}</option> | ||||
| 					<option value="+updatedAt">{{ $t('users.sort.updatedAtDesc') }}</option> | ||||
| 				</ui-select> | ||||
| 				<ui-select v-model="state"> | ||||
| 					<span slot="label">{{ $t('users.state.title') }}</span> | ||||
| 					<template #label>{{ $t('users.state.title') }}</template> | ||||
| 					<option value="all">{{ $t('users.state.all') }}</option> | ||||
| 					<option value="admin">{{ $t('users.state.admin') }}</option> | ||||
| 					<option value="moderator">{{ $t('users.state.moderator') }}</option> | ||||
| @@ -52,7 +52,7 @@ | ||||
| 					<option value="suspended">{{ $t('users.state.suspended') }}</option> | ||||
| 				</ui-select> | ||||
| 				<ui-select v-model="origin"> | ||||
| 					<span slot="label">{{ $t('users.origin.title') }}</span> | ||||
| 					<template #label>{{ $t('users.origin.title') }}</template> | ||||
| 					<option value="combined">{{ $t('users.origin.combined') }}</option> | ||||
| 					<option value="local">{{ $t('users.origin.local') }}</option> | ||||
| 					<option value="remote">{{ $t('users.origin.remote') }}</option> | ||||
|   | ||||
| @@ -138,8 +138,8 @@ | ||||
| 		const meta = await res.json(); | ||||
|  | ||||
| 		// Compare versions | ||||
| 		if (meta.clientVersion != ver) { | ||||
| 			localStorage.setItem('v', meta.clientVersion); | ||||
| 		if (meta.version != ver) { | ||||
| 			localStorage.setItem('v', meta.version); | ||||
|  | ||||
| 			alert( | ||||
| 				'Misskeyの新しいバージョンがあります。ページを再度読み込みします。' + | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| import { clientVersion as current } from '../../config'; | ||||
| import { version as current } from '../../config'; | ||||
|  | ||||
| export default async function($root: any, force = false, silent = false) { | ||||
| 	const meta = await $root.getMeta(force); | ||||
| 	const newer = meta.clientVersion; | ||||
| 	const newer = meta.version; | ||||
|  | ||||
| 	if (newer != current) { | ||||
| 		localStorage.setItem('should-refresh', 'true'); | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| <template> | ||||
| <ui-card> | ||||
| 	<div slot="title"><fa icon="key"/> API</div> | ||||
| 	<template #title><fa icon="key"/> API</template> | ||||
|  | ||||
| 	<section class="fit-top"> | ||||
| 		<ui-input :value="$store.state.i.token" readonly> | ||||
| @@ -19,7 +19,7 @@ | ||||
| 		</ui-input> | ||||
| 		<ui-textarea v-model="body"> | ||||
| 			<span>{{ $t('console.parameter') }} (JSON or JSON5)</span> | ||||
| 			<span slot="desc">{{ $t('console.credential-info') }}</span> | ||||
| 			<template #desc>{{ $t('console.credential-info') }}</template> | ||||
| 		</ui-textarea> | ||||
| 		<ui-button @click="send" :disabled="sending"> | ||||
| 			<template v-if="sending">{{ $t('console.sending') }}</template> | ||||
|   | ||||
| @@ -6,7 +6,7 @@ | ||||
| 		<header v-if="title" v-html="title"></header> | ||||
| 		<div class="body" v-if="text" v-html="text"></div> | ||||
| 		<ui-input v-if="input" v-model="inputValue" autofocus :type="input.type || 'text'" :placeholder="input.placeholder" @keydown="onInputKeydown"></ui-input> | ||||
| 		<ui-input v-if="user" v-model="userInputValue" autofocus @keydown="onInputKeydown"><span slot="prefix">@</span></ui-input> | ||||
| 		<ui-input v-if="user" v-model="userInputValue" autofocus @keydown="onInputKeydown"><template #prefix>@</template></ui-input> | ||||
| 		<ui-select v-if="select" v-model="selectedValue"> | ||||
| 			<option v-for="item in select.items" :value="item.value">{{ item.text }}</option> | ||||
| 		</ui-select> | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| <template> | ||||
| <ui-card> | ||||
| 	<div slot="title"><fa icon="cloud"/> {{ $t('@.drive') }}</div> | ||||
| 	<template #title><fa icon="cloud"/> {{ $t('@.drive') }}</template> | ||||
|  | ||||
| 	<section v-if="!fetching" class="juakhbxthdewydyreaphkepoxgxvfogn"> | ||||
| 		<div class="meter"><div :style="meterStyle"></div></div> | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| <template> | ||||
| <button class="wfliddvnhxvyusikowhxozkyxyenqxqr" | ||||
| 	:class="{ wait, block, inline, mini, active: isFollowing || hasPendingFollowRequestFromYou }" | ||||
| 	:class="{ wait, block, inline, mini, transparent, active: isFollowing || hasPendingFollowRequestFromYou }" | ||||
| 	@click="onClick" | ||||
| 	:disabled="wait" | ||||
| 	:inline="inline" | ||||
| @@ -38,7 +38,12 @@ export default Vue.extend({ | ||||
| 			type: Boolean, | ||||
| 			required: false, | ||||
| 			default: false | ||||
| 		} | ||||
| 		}, | ||||
| 		transparent: { | ||||
| 			type: Boolean, | ||||
| 			required: false, | ||||
| 			default: true | ||||
| 		}, | ||||
| 	}, | ||||
|  | ||||
| 	data() { | ||||
| @@ -134,6 +139,9 @@ export default Vue.extend({ | ||||
| 	border solid 1px var(--primary) | ||||
| 	border-radius 36px | ||||
|  | ||||
| 	&:not(.transparent) | ||||
| 		background #fff | ||||
|  | ||||
| 	&.inline | ||||
| 		display inline-block | ||||
|  | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| <template> | ||||
| <ui-card v-if="enableTwitterIntegration || enableDiscordIntegration || enableGithubIntegration"> | ||||
| 	<div slot="title"><fa icon="share-alt"/> {{ $t('title') }}</div> | ||||
| 	<template #title><fa icon="share-alt"/> {{ $t('title') }}</template> | ||||
|  | ||||
| 	<section v-if="enableTwitterIntegration"> | ||||
| 		<header><fa :icon="['fab', 'twitter']"/> Twitter</header> | ||||
|   | ||||
| @@ -0,0 +1,44 @@ | ||||
| <template> | ||||
| <a class="zxrjzpcj" :href="url" :class="service" target="_blank"> | ||||
| 	<fa :icon="icon" size="lg" fixed-width /><span>{{ text }}</span> | ||||
| </a> | ||||
| </template> | ||||
|  | ||||
| <script lang="ts"> | ||||
| import Vue from 'vue'; | ||||
|  | ||||
| export default Vue.extend({ | ||||
| 	props: ['url', 'text', 'icon', 'service'] | ||||
| }); | ||||
| </script> | ||||
|  | ||||
| <style lang="stylus" scoped> | ||||
| .zxrjzpcj | ||||
| 	padding 6px 8px 6px 6px | ||||
| 	border-radius 32px | ||||
|  | ||||
| 	&:hover | ||||
| 		text-decoration none | ||||
|  | ||||
| 	&.twitter | ||||
| 		color #fff | ||||
| 		background #1da1f3 | ||||
|  | ||||
| 		&:hover | ||||
| 			background #0c87cf | ||||
|  | ||||
| 	&.github | ||||
| 		color #fff | ||||
| 		background #171515 | ||||
|  | ||||
| 		&:hover | ||||
| 			background #000 | ||||
|  | ||||
| 	&.discord | ||||
| 		color #fff | ||||
| 		background #7289da | ||||
|  | ||||
| 		&:hover | ||||
| 			background #4968ce | ||||
|  | ||||
| </style> | ||||
							
								
								
									
										26
									
								
								src/client/app/common/views/components/integrations.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								src/client/app/common/views/components/integrations.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| <template> | ||||
| <div class="nbogcrmo" :v-if="user.twitter || user.github || user.discord"> | ||||
| 	<x-integration v-if="user.twitter" service="twitter" :url="`https://twitter.com/${user.twitter.screenName}`" :text="user.twitter.screenName" :icon="['fab', 'twitter']"/> | ||||
| 	<x-integration v-if="user.github" service="github" :url="`https://github.com/${user.github.login}`" :text="user.github.login" :icon="['fab', 'github']"/> | ||||
| 	<x-integration v-if="user.discord" service="discord" :url="`https://discordapp.com/users/${user.discord.id}`" :text="`${user.discord.username}#${user.discord.discriminator}`" :icon="['fab', 'discord']"/> | ||||
| </div> | ||||
| </template> | ||||
|  | ||||
| <script lang="ts"> | ||||
| import Vue from 'vue'; | ||||
| import XIntegration from './integrations.integration.vue'; | ||||
|  | ||||
| export default Vue.extend({ | ||||
| 	components: { | ||||
| 		XIntegration | ||||
| 	}, | ||||
| 	props: ['user'] | ||||
| }); | ||||
| </script> | ||||
|  | ||||
| <style lang="stylus" scoped> | ||||
| .nbogcrmo | ||||
| 	> * | ||||
| 		margin-right 10px | ||||
|  | ||||
| </style> | ||||
| @@ -1,6 +1,6 @@ | ||||
| <template> | ||||
| <ui-card> | ||||
| 	<div slot="title"><fa icon="language"/> {{ $t('title') }}</div> | ||||
| 	<template #title><fa icon="language"/> {{ $t('title') }}</template> | ||||
|  | ||||
| 	<section class="fit-top"> | ||||
| 		<ui-select v-model="lang" :placeholder="$t('pick-language')"> | ||||
|   | ||||
| @@ -40,7 +40,11 @@ export default Vue.component('misskey-flavored-markdown', { | ||||
| 		}, | ||||
| 		customEmojis: { | ||||
| 			required: false, | ||||
| 		} | ||||
| 		}, | ||||
| 		isNote: { | ||||
| 			type: Boolean, | ||||
| 			default: true | ||||
| 		}, | ||||
| 	}, | ||||
|  | ||||
| 	render(createElement) { | ||||
| @@ -204,7 +208,7 @@ export default Vue.component('misskey-flavored-markdown', { | ||||
| 					return [createElement('router-link', { | ||||
| 						key: Math.random(), | ||||
| 						attrs: { | ||||
| 							to: `/tags/${encodeURIComponent(token.node.props.hashtag)}`, | ||||
| 							to: this.isNote ? `/tags/${encodeURIComponent(token.node.props.hashtag)}` : `/explore/tags/${encodeURIComponent(token.node.props.hashtag)}`, | ||||
| 							style: 'color:var(--mfmHashtag);' | ||||
| 						} | ||||
| 					}, `#${token.node.props.hashtag}`)]; | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| <template> | ||||
| <ui-card> | ||||
| 	<div slot="title"><fa icon="ban"/> {{ $t('mute-and-block') }}</div> | ||||
| 	<template #title><fa icon="ban"/> {{ $t('mute-and-block') }}</template> | ||||
|  | ||||
| 	<section> | ||||
| 		<header>{{ $t('mute') }}</header> | ||||
| @@ -25,7 +25,7 @@ | ||||
| 	<section> | ||||
| 		<header>{{ $t('word-mute') }}</header> | ||||
| 		<ui-textarea v-model="mutedWords"> | ||||
| 			{{ $t('muted-words') }}<span slot="desc">{{ $t('muted-words-description') }}</span> | ||||
| 			{{ $t('muted-words') }}<template #desc>{{ $t('muted-words-description') }}</template> | ||||
| 		</ui-textarea> | ||||
| 		<ui-button @click="save">{{ $t('save') }}</ui-button> | ||||
| 	</section> | ||||
|   | ||||
| @@ -1,9 +1,9 @@ | ||||
| <template> | ||||
| <ui-card> | ||||
| 	<div slot="title"><fa :icon="['far', 'bell']"/> {{ $t('title') }}</div> | ||||
| 	<template #title><fa :icon="['far', 'bell']"/> {{ $t('title') }}</template> | ||||
| 	<section> | ||||
| 		<ui-switch v-model="$store.state.i.settings.autoWatch" @change="onChangeAutoWatch"> | ||||
| 			{{ $t('auto-watch') }}<span slot="desc">{{ $t('auto-watch-desc') }}</span> | ||||
| 			{{ $t('auto-watch') }}<template #desc>{{ $t('auto-watch-desc') }}</template> | ||||
| 		</ui-switch> | ||||
| 		<section> | ||||
| 			<ui-button @click="readAllNotifications">{{ $t('mark-as-read-all-notifications') }}</ui-button> | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| <template> | ||||
| <ui-card> | ||||
| 	<div slot="title"><fa icon="user"/> {{ $t('title') }}</div> | ||||
| 	<template #title><fa icon="user"/> {{ $t('title') }}</template> | ||||
|  | ||||
| 	<section class="esokaraujimuwfttfzgocmutcihewscl"> | ||||
| 		<div class="header" :style="bannerStyle"> | ||||
| @@ -14,41 +14,41 @@ | ||||
|  | ||||
| 			<ui-input v-model="username" readonly> | ||||
| 				<span>{{ $t('account') }}</span> | ||||
| 				<span slot="prefix">@</span> | ||||
| 				<span slot="suffix">@{{ host }}</span> | ||||
| 				<template #prefix>@</template> | ||||
| 				<template #suffix>@{{ host }}</template> | ||||
| 			</ui-input> | ||||
|  | ||||
| 			<ui-input v-model="location"> | ||||
| 				<span>{{ $t('location') }}</span> | ||||
| 				<span slot="prefix"><fa icon="map-marker-alt"/></span> | ||||
| 				<template #prefix><fa icon="map-marker-alt"/></template> | ||||
| 			</ui-input> | ||||
|  | ||||
| 			<ui-input v-model="birthday" type="date"> | ||||
| 				<span slot="title">{{ $t('birthday') }}</span> | ||||
| 				<span slot="prefix"><fa icon="birthday-cake"/></span> | ||||
| 				<template #title>{{ $t('birthday') }}</template> | ||||
| 				<template #prefix><fa icon="birthday-cake"/></template> | ||||
| 			</ui-input> | ||||
|  | ||||
| 			<ui-textarea v-model="description" :max="500"> | ||||
| 				<span>{{ $t('description') }}</span> | ||||
| 				<span slot="desc">{{ $t('you-can-include-hashtags') }}</span> | ||||
| 				<template #desc>{{ $t('you-can-include-hashtags') }}</template> | ||||
| 			</ui-textarea> | ||||
|  | ||||
| 			<ui-select v-model="lang"> | ||||
| 				<span slot="label">{{ $t('language') }}</span> | ||||
| 				<span slot="icon"><fa icon="language"/></span> | ||||
| 				<template #label>{{ $t('language') }}</template> | ||||
| 				<template #icon><fa icon="language"/></template> | ||||
| 				<option v-for="lang in unique(Object.values(langmap).map(x => x.nativeName)).map(name => Object.keys(langmap).find(k => langmap[k].nativeName == name))" :value="lang" :key="lang">{{ langmap[lang].nativeName }}</option> | ||||
| 			</ui-select> | ||||
|  | ||||
| 			<ui-input type="file" @change="onAvatarChange"> | ||||
| 				<span>{{ $t('avatar') }}</span> | ||||
| 				<span slot="icon"><fa icon="image"/></span> | ||||
| 				<span slot="desc" v-if="avatarUploading">{{ $t('uploading') }}<mk-ellipsis/></span> | ||||
| 				<template #icon><fa icon="image"/></template> | ||||
| 				<template #desc v-if="avatarUploading">{{ $t('uploading') }}<mk-ellipsis/></template> | ||||
| 			</ui-input> | ||||
|  | ||||
| 			<ui-input type="file" @change="onBannerChange"> | ||||
| 				<span>{{ $t('banner') }}</span> | ||||
| 				<span slot="icon"><fa icon="image"/></span> | ||||
| 				<span slot="desc" v-if="bannerUploading">{{ $t('uploading') }}<mk-ellipsis/></span> | ||||
| 				<template #icon><fa icon="image"/></template> | ||||
| 				<template #desc v-if="bannerUploading">{{ $t('uploading') }}<mk-ellipsis/></template> | ||||
| 			</ui-input> | ||||
|  | ||||
| 			<ui-button @click="save(true)">{{ $t('save') }}</ui-button> | ||||
|   | ||||
| @@ -3,16 +3,16 @@ | ||||
| 	<div class="avatar" :style="{ backgroundImage: user ? `url('${ user.avatarUrl }')` : null }" v-show="withAvatar"></div> | ||||
| 	<ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]+$" spellcheck="false" autofocus required @input="onUsernameChange" styl="fill"> | ||||
| 		<span>{{ $t('username') }}</span> | ||||
| 		<span slot="prefix">@</span> | ||||
| 		<span slot="suffix">@{{ host }}</span> | ||||
| 		<template #prefix>@</template> | ||||
| 		<template #suffix>@{{ host }}</template> | ||||
| 	</ui-input> | ||||
| 	<ui-input v-model="password" type="password" :with-password-toggle="true" required styl="fill"> | ||||
| 		<span>{{ $t('password') }}</span> | ||||
| 		<span slot="prefix"><fa icon="lock"/></span> | ||||
| 		<template #prefix><fa icon="lock"/></template> | ||||
| 	</ui-input> | ||||
| 	<ui-input v-if="user && user.twoFactorEnabled" v-model="token" type="number" required styl="fill"> | ||||
| 		<span>{{ $t('@.2fa') }}</span> | ||||
| 		<span slot="prefix"><fa icon="gavel"/></span> | ||||
| 		<template #prefix><fa icon="gavel"/></template> | ||||
| 	</ui-input> | ||||
| 	<ui-button type="submit" :disabled="signing">{{ signing ? $t('signing-in') : $t('signin') }}</ui-button> | ||||
| 	<p v-if="meta && meta.enableTwitterIntegration" style="margin: 8px 0;"><a :href="`${apiUrl}/signin/twitter`">{{ $t('signin-with-twitter') }}</a></p> | ||||
|   | ||||
| @@ -3,37 +3,37 @@ | ||||
| 	<template v-if="meta"> | ||||
| 		<ui-input v-if="meta.disableRegistration" v-model="invitationCode" type="text" :autocomplete="Math.random()" spellcheck="false" required styl="fill"> | ||||
| 			<span>{{ $t('invitation-code') }}</span> | ||||
| 			<span slot="prefix"><fa icon="id-card-alt"/></span> | ||||
| 			<p slot="desc" v-html="this.$t('invitation-info').replace('{}', 'mailto:' + meta.maintainer.email)"></p> | ||||
| 			<template #prefix><fa icon="id-card-alt"/></template> | ||||
| 			<template #desc v-html="this.$t('invitation-info').replace('{}', 'mailto:' + meta.maintainer.email)"></template> | ||||
| 		</ui-input> | ||||
| 		<ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]{1,20}$" :autocomplete="Math.random()" spellcheck="false" required @input="onChangeUsername" styl="fill"> | ||||
| 			<span>{{ $t('username') }}</span> | ||||
| 			<span slot="prefix">@</span> | ||||
| 			<span slot="suffix">@{{ host }}</span> | ||||
| 			<p slot="desc" v-if="usernameState == 'wait'" style="color:#999"><fa icon="spinner" pulse fixed-width/> {{ $t('checking') }}</p> | ||||
| 			<p slot="desc" v-if="usernameState == 'ok'" style="color:#3CB7B5"><fa icon="check" fixed-width/> {{ $t('available') }}</p> | ||||
| 			<p slot="desc" v-if="usernameState == 'unavailable'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> {{ $t('unavailable') }}</p> | ||||
| 			<p slot="desc" v-if="usernameState == 'error'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> {{ $t('error') }}</p> | ||||
| 			<p slot="desc" v-if="usernameState == 'invalid-format'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> {{ $t('invalid-format') }}</p> | ||||
| 			<p slot="desc" v-if="usernameState == 'min-range'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> {{ $t('too-short') }}</p> | ||||
| 			<p slot="desc" v-if="usernameState == 'max-range'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> {{ $t('too-long') }}</p> | ||||
| 			<template #prefix>@</template> | ||||
| 			<template #suffix>@{{ host }}</template> | ||||
| 			<template #desc v-if="usernameState == 'wait'" style="color:#999"><fa icon="spinner" pulse fixed-width/> {{ $t('checking') }}</template> | ||||
| 			<template #desc v-if="usernameState == 'ok'" style="color:#3CB7B5"><fa icon="check" fixed-width/> {{ $t('available') }}</template> | ||||
| 			<template #desc v-if="usernameState == 'unavailable'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> {{ $t('unavailable') }}</template> | ||||
| 			<template #desc v-if="usernameState == 'error'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> {{ $t('error') }}</template> | ||||
| 			<template #desc v-if="usernameState == 'invalid-format'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> {{ $t('invalid-format') }}</template> | ||||
| 			<template #desc v-if="usernameState == 'min-range'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> {{ $t('too-short') }}</template> | ||||
| 			<template #desc v-if="usernameState == 'max-range'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> {{ $t('too-long') }}</template> | ||||
| 		</ui-input> | ||||
| 		<ui-input v-model="password" type="password" :autocomplete="Math.random()" required @input="onChangePassword" :with-password-meter="true" styl="fill"> | ||||
| 			<span>{{ $t('password') }}</span> | ||||
| 			<span slot="prefix"><fa icon="lock"/></span> | ||||
| 			<div slot="desc"> | ||||
| 			<template #prefix><fa icon="lock"/></template> | ||||
| 			<template #desc> | ||||
| 				<p v-if="passwordStrength == 'low'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> {{ $t('weak-password') }}</p> | ||||
| 				<p v-if="passwordStrength == 'medium'" style="color:#3CB7B5"><fa icon="check" fixed-width/> {{ $t('normal-password') }}</p> | ||||
| 				<p v-if="passwordStrength == 'high'" style="color:#3CB7B5"><fa icon="check" fixed-width/> {{ $t('strong-password') }}</p> | ||||
| 			</div> | ||||
| 			</template> | ||||
| 		</ui-input> | ||||
| 		<ui-input v-model="retypedPassword" type="password" :autocomplete="Math.random()" required @input="onChangePasswordRetype" styl="fill"> | ||||
| 			<span>{{ $t('password') }} ({{ $t('retype') }})</span> | ||||
| 			<span slot="prefix"><fa icon="lock"/></span> | ||||
| 			<div slot="desc"> | ||||
| 			<template #prefix><fa icon="lock"/></template> | ||||
| 			<template #desc> | ||||
| 				<p v-if="passwordRetypeState == 'match'" style="color:#3CB7B5"><fa icon="check" fixed-width/> {{ $t('password-matched') }}</p> | ||||
| 				<p v-if="passwordRetypeState == 'not-match'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> {{ $t('password-not-matched') }}</p> | ||||
| 			</div> | ||||
| 			</template> | ||||
| 		</ui-input> | ||||
| 		<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> | ||||
|   | ||||
| @@ -1,10 +1,10 @@ | ||||
| <template> | ||||
| <ui-card> | ||||
| 	<div slot="title"><fa icon="palette"/> {{ $t('theme') }}</div> | ||||
| 	<template #title><fa icon="palette"/> {{ $t('theme') }}</template> | ||||
| 	<section class="nicnklzforebnpfgasiypmpdaaglujqm fit-top"> | ||||
| 		<label> | ||||
| 			<ui-select v-model="light" :placeholder="$t('light-theme')"> | ||||
| 				<span slot="label"><fa :icon="faSun"/> {{ $t('light-theme') }}</span> | ||||
| 				<template #label><fa :icon="faSun"/> {{ $t('light-theme') }}</template> | ||||
| 				<optgroup :label="$t('light-themes')"> | ||||
| 					<option v-for="x in lightThemes" :value="x.id" :key="x.id">{{ x.name }}</option> | ||||
| 				</optgroup> | ||||
| @@ -16,7 +16,7 @@ | ||||
|  | ||||
| 		<label> | ||||
| 			<ui-select v-model="dark" :placeholder="$t('dark-theme')"> | ||||
| 				<span slot="label"><fa :icon="faMoon"/> {{ $t('dark-theme') }}</span> | ||||
| 				<template #label><fa :icon="faMoon"/> {{ $t('dark-theme') }}</template> | ||||
| 				<optgroup :label="$t('dark-themes')"> | ||||
| 					<option v-for="x in darkThemes" :value="x.id" :key="x.id">{{ x.name }}</option> | ||||
| 				</optgroup> | ||||
|   | ||||
| @@ -359,7 +359,7 @@ root(fill) | ||||
| 				display none | ||||
|  | ||||
| 			> * | ||||
| 				display block | ||||
| 				display inline-block | ||||
| 				min-width 16px | ||||
| 				max-width 150px | ||||
| 				overflow hidden | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| <template> | ||||
| <div class="cudqjmnl"> | ||||
| 	<ui-card> | ||||
| 		<div slot="title"><fa :icon="faList"/> {{ list.title }}</div> | ||||
| 		<template #title><fa :icon="faList"/> {{ list.title }}</template> | ||||
|  | ||||
| 		<section> | ||||
| 			<ui-button @click="rename"><fa :icon="faICursor"/> {{ $t('rename') }}</ui-button> | ||||
| @@ -10,7 +10,7 @@ | ||||
| 	</ui-card> | ||||
|  | ||||
| 	<ui-card> | ||||
| 		<div slot="title"><fa :icon="faUsers"/> {{ $t('users') }}</div> | ||||
| 		<template #title><fa :icon="faUsers"/> {{ $t('users') }}</template> | ||||
|  | ||||
| 		<section> | ||||
| 			<sequential-entrance animation="entranceFromTop" delay="25"> | ||||
|   | ||||
| @@ -1,19 +1,22 @@ | ||||
| <template> | ||||
| <ui-container :body-togglable="true"> | ||||
| 	<template slot="header"><slot></slot></template> | ||||
| 	<template #header><slot></slot></template> | ||||
|  | ||||
| 	<mk-error v-if="!fetching && !inited" @retry="init()"/> | ||||
|  | ||||
| 	<div class="efvhhmdq" v-size="[{ lt: 500, class: 'narrow' }]"> | ||||
| 	<div class="efvhhmdq" :class="{ iconOnly }" v-size="[{ lt: 500, class: 'narrow' }]"> | ||||
| 		<div class="no-users" v-if="inited && us.length == 0"> | ||||
| 			<p>{{ $t('no-users') }}</p> | ||||
| 		</div> | ||||
| 		<div class="user" v-for="user in us"> | ||||
| 			<mk-avatar class="avatar" :user="user"/> | ||||
| 			<div class="body"> | ||||
| 			<div class="body" v-if="!iconOnly"> | ||||
| 				<div class="name"> | ||||
| 					<router-link class="name" :to="user | userPage" v-user-preview="user.id"><mk-user-name :user="user"/></router-link> | ||||
| 					<p class="username">@{{ user | acct }}</p> | ||||
| 				</div> | ||||
| 				<div class="description" v-if="user.description" :title="user.description"> | ||||
| 					<mfm :text="user.description" :author="user" :i="$store.state.i" :custom-emojis="user.emojis" :should-break="false"/> | ||||
| 					<mfm :text="user.description" :is-note="false" :author="user" :i="$store.state.i" :custom-emojis="user.emojis" :should-break="false"/> | ||||
| 				</div> | ||||
| 			</div> | ||||
| 		</div> | ||||
| @@ -26,8 +29,11 @@ | ||||
|  | ||||
| <script lang="ts"> | ||||
| import Vue from 'vue'; | ||||
| import i18n from '../../../i18n'; | ||||
|  | ||||
| export default Vue.extend({ | ||||
| 	i18n: i18n('common/views/components/user-list.vue'), | ||||
|  | ||||
| 	props: { | ||||
| 		makePromise: { | ||||
| 			required: true | ||||
| @@ -92,6 +98,22 @@ export default Vue.extend({ | ||||
| 		> .user > .body > .description | ||||
| 			display none | ||||
|  | ||||
| 	&.iconOnly | ||||
| 		padding 12px | ||||
|  | ||||
| 		> .user | ||||
| 			display inline-block | ||||
| 			padding 0 | ||||
| 			border-bottom none | ||||
|  | ||||
| 			> .avatar | ||||
| 				display inline-block | ||||
| 				margin 4px | ||||
|  | ||||
| 	> .no-users | ||||
| 		text-align center | ||||
| 		color var(--text) | ||||
|  | ||||
| 	> .user | ||||
| 		display flex | ||||
| 		padding 16px | ||||
|   | ||||
| @@ -1,26 +1,63 @@ | ||||
| <template> | ||||
| <div> | ||||
| 	<mk-user-list :make-promise="verifiedUsers"> | ||||
| 		<span><fa :icon="faBookmark"/> {{ $t('verified-users') }}</span> | ||||
| 	<ui-container :show-header="false" v-if="meta && stats"> | ||||
| 		<div class="kpdsmpnk" :style="{ backgroundImage: meta.bannerUrl ? `url(${meta.bannerUrl})` : null }"> | ||||
| 			<div> | ||||
| 				<router-link to="/explore" class="title">{{ $t('explore', { host: meta.name }) }}</router-link> | ||||
| 				<span>{{ $t('users-info', { users: num(stats.originalUsersCount) }) }}</span> | ||||
| 			</div> | ||||
| 		</div> | ||||
| 	</ui-container> | ||||
|  | ||||
| 	<ui-container :body-togglable="true" :expanded="tag == null" ref="tags"> | ||||
| 		<template #header><fa :icon="faHashtag" fixed-width/>{{ $t('popular-tags') }}</template> | ||||
|  | ||||
| 		<div class="vxjfqztj"> | ||||
| 			<router-link v-for="tag in tagsLocal" :to="`/explore/tags/${tag.tag}`" :key="tag.tag" class="local">{{ tag.tag }}</router-link> | ||||
| 			<router-link v-for="tag in tagsRemote" :to="`/explore/tags/${tag.tag}`" :key="tag.tag">{{ tag.tag }}</router-link> | ||||
| 		</div> | ||||
| 	</ui-container> | ||||
|  | ||||
| 	<mk-user-list v-if="tag != null" :make-promise="tagUsers" :key="`${tag}-local`"> | ||||
| 		<fa :icon="faHashtag" fixed-width/>{{ tag }} | ||||
| 	</mk-user-list> | ||||
| 	<mk-user-list :make-promise="popularUsers"> | ||||
| 		<span><fa :icon="faChartLine"/> {{ $t('popular-users') }}</span> | ||||
| 	</mk-user-list> | ||||
| 	<mk-user-list :make-promise="recentlyUpdatedUsers"> | ||||
| 		<span><fa :icon="faCommentAlt"/> {{ $t('recently-updated-users') }}</span> | ||||
| 	<mk-user-list v-if="tag != null" :make-promise="tagRemoteUsers" :key="`${tag}-remote`"> | ||||
| 		<fa :icon="faHashtag" fixed-width/>{{ tag }} ({{ $t('federated') }}) | ||||
| 	</mk-user-list> | ||||
|  | ||||
| 	<template v-if="tag == null"> | ||||
| 		<mk-user-list :make-promise="verifiedUsers"> | ||||
| 			<fa :icon="faBookmark" fixed-width/>{{ $t('verified-users') }} | ||||
| 		</mk-user-list> | ||||
| 		<mk-user-list :make-promise="popularUsers"> | ||||
| 			<fa :icon="faChartLine" fixed-width/>{{ $t('popular-users') }} | ||||
| 		</mk-user-list> | ||||
| 		<mk-user-list :make-promise="recentlyUpdatedUsers"> | ||||
| 			<fa :icon="faCommentAlt" fixed-width/>{{ $t('recently-updated-users') }} | ||||
| 		</mk-user-list> | ||||
| 		<mk-user-list :make-promise="recentlyRegisteredUsers"> | ||||
| 			<fa :icon="faPlus" fixed-width/>{{ $t('recently-registered-users') }} | ||||
| 		</mk-user-list> | ||||
| 	</template> | ||||
| </div> | ||||
| </template> | ||||
|  | ||||
| <script lang="ts"> | ||||
| import Vue from 'vue'; | ||||
| import i18n from '../../../i18n'; | ||||
| import { faChartLine } from '@fortawesome/free-solid-svg-icons'; | ||||
| import { faChartLine, faPlus, faHashtag } from '@fortawesome/free-solid-svg-icons'; | ||||
| import { faBookmark, faCommentAlt } from '@fortawesome/free-regular-svg-icons'; | ||||
|  | ||||
| export default Vue.extend({ | ||||
| 	i18n: i18n('common/views/pages/explore.vue'), | ||||
|  | ||||
| 	props: { | ||||
| 		tag: { | ||||
| 			type: String, | ||||
| 			required: false | ||||
| 		} | ||||
| 	}, | ||||
|  | ||||
| 	data() { | ||||
| 		return { | ||||
| 			verifiedUsers: () => this.$root.api('users', { | ||||
| @@ -40,11 +77,112 @@ export default Vue.extend({ | ||||
| 				sort: '+updatedAt', | ||||
| 				limit: 10 | ||||
| 			}), | ||||
| 			faBookmark, faChartLine, faCommentAlt | ||||
| 			recentlyRegisteredUsers: () => this.$root.api('users', { | ||||
| 				origin: 'local', | ||||
| 				state: 'alive', | ||||
| 				sort: '+createdAt', | ||||
| 				limit: 10 | ||||
| 			}), | ||||
| 			tagsLocal: [], | ||||
| 			tagsRemote: [], | ||||
| 			stats: null, | ||||
| 			meta: null, | ||||
| 			num: Vue.filter('number'), | ||||
| 			faBookmark, faChartLine, faCommentAlt, faPlus, faHashtag | ||||
| 		}; | ||||
| 	}, | ||||
|  | ||||
| 	computed: { | ||||
| 		tagUsers(): () => Promise<any> { | ||||
| 			return () => this.$root.api('hashtags/users', { | ||||
| 				tag: this.tag, | ||||
| 				state: 'alive', | ||||
| 				origin: 'local', | ||||
| 				sort: '+follower', | ||||
| 				limit: 30 | ||||
| 			}); | ||||
| 		}, | ||||
|  | ||||
| 		tagRemoteUsers(): () => Promise<any> { | ||||
| 			return () => this.$root.api('hashtags/users', { | ||||
| 				tag: this.tag, | ||||
| 				state: 'alive', | ||||
| 				origin: 'remote', | ||||
| 				sort: '+follower', | ||||
| 				limit: 30 | ||||
| 			}); | ||||
| 		}, | ||||
| 	}, | ||||
|  | ||||
| 	watch: { | ||||
| 		tag() { | ||||
| 			if (this.$refs.tags) this.$refs.tags.toggleContent(this.tag == null); | ||||
| 		} | ||||
| 	}, | ||||
|  | ||||
| 	created() { | ||||
| 		this.$root.api('hashtags/list', { | ||||
| 			sort: '+attachedLocalUsers', | ||||
| 			attachedToLocalUserOnly: true, | ||||
| 			limit: 30 | ||||
| 		}).then(tags => { | ||||
| 			this.tagsLocal = tags; | ||||
| 		}); | ||||
| 		this.$root.api('hashtags/list', { | ||||
| 			sort: '+attachedRemoteUsers', | ||||
| 			attachedToRemoteUserOnly: true, | ||||
| 			limit: 30 | ||||
| 		}).then(tags => { | ||||
| 			this.tagsRemote = tags; | ||||
| 		}); | ||||
| 		this.$root.api('stats').then(stats => { | ||||
| 			this.stats = stats; | ||||
| 		}); | ||||
| 		this.$root.getMeta().then(meta => { | ||||
| 			this.meta = meta; | ||||
| 		}); | ||||
| 	} | ||||
| }); | ||||
| </script> | ||||
|  | ||||
| <style lang="stylus" scoped> | ||||
| .vxjfqztj | ||||
| 	padding 16px | ||||
|  | ||||
| 	> * | ||||
| 		margin-right 16px | ||||
|  | ||||
| 		&.local | ||||
| 			font-weight bold | ||||
|  | ||||
| .kpdsmpnk | ||||
| 	min-height 100px | ||||
| 	padding 16px | ||||
| 	background-position center | ||||
| 	background-size cover | ||||
|  | ||||
| 	&:before | ||||
| 		content "" | ||||
| 		display block | ||||
| 		position absolute | ||||
| 		top 0 | ||||
| 		left 0 | ||||
| 		width 100% | ||||
| 		height 100% | ||||
| 		background rgba(0, 0, 0, 0.3) | ||||
|  | ||||
| 	> div | ||||
| 		color #fff | ||||
| 		text-shadow 0 0 8px #00 | ||||
|  | ||||
| 		> .title | ||||
| 			display block | ||||
| 			font-size 20px | ||||
| 			font-weight bold | ||||
| 			color inherit | ||||
|  | ||||
| 		> span | ||||
| 			font-size 14px | ||||
| 			opacity 0.8 | ||||
|  | ||||
| </style> | ||||
|   | ||||
| @@ -12,7 +12,7 @@ | ||||
| 			</router-link> | ||||
| 			<span class="username">@{{ user | acct }}</span> | ||||
| 			<div class="description"> | ||||
| 				<mfm v-if="user.description" :text="user.description" :author="user" :i="$store.state.i" :custom-emojis="user.emojis"/> | ||||
| 				<mfm v-if="user.description" :text="user.description" :is-note="false" :author="user" :i="$store.state.i" :custom-emojis="user.emojis"/> | ||||
| 			</div> | ||||
| 		</div> | ||||
| 	</main> | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| <template> | ||||
| <div class="mkw-hashtags"> | ||||
| 	<ui-container :show-header="!props.compact"> | ||||
| 		<template slot="header"><fa icon="hashtag"/>{{ $t('title') }}</template> | ||||
| 		<template #header><fa icon="hashtag"/>{{ $t('title') }}</template> | ||||
|  | ||||
| 		<div class="mkw-hashtags--body" :data-mobile="platform == 'mobile'"> | ||||
| 			<mk-trends/> | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| <template> | ||||
| <div class="mkw-memo"> | ||||
| 	<ui-container :show-header="!props.compact"> | ||||
| 		<template slot="header"><fa :icon="['far', 'sticky-note']"/>{{ $t('title') }}</template> | ||||
| 		<template #header><fa :icon="['far', 'sticky-note']"/>{{ $t('title') }}</template> | ||||
|  | ||||
| 		<div class="mkw-memo--body"> | ||||
| 			<textarea v-model="text" :placeholder="$t('placeholder')" @input="onChange"></textarea> | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| <template> | ||||
| <div class="mkw-photo-stream" :class="$style.root" :data-melt="props.design == 2"> | ||||
| 	<ui-container :show-header="props.design == 0" :naked="props.design == 2"> | ||||
| 		<template slot="header"><fa icon="camera"/>{{ $t('title') }}</template> | ||||
| 		<template #header><fa icon="camera"/>{{ $t('title') }}</template> | ||||
|  | ||||
| 		<p :class="$style.fetching" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p> | ||||
| 		<div :class="$style.stream" v-if="!fetching && images.length > 0"> | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| <template> | ||||
| <div class="mkw-posts-monitor"> | ||||
| 	<ui-container :show-header="props.design == 0" :naked="props.design == 2"> | ||||
| 		<template slot="header"><fa icon="chart-line"/>{{ $t('title') }}</template> | ||||
| 		<button slot="func" @click="toggle" :title="$t('toggle')"><fa icon="sort"/></button> | ||||
| 		<template #header><fa icon="chart-line"/>{{ $t('title') }}</template> | ||||
| 		<template #func><button @click="toggle" :title="$t('toggle')"><fa icon="sort"/></button></template> | ||||
|  | ||||
| 		<div class="qpdmibaztplkylerhdbllwcokyrfxeyj" :class="{ dual: props.view == 0 }"> | ||||
| 			<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`" v-show="props.view != 2"> | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| <template> | ||||
| <div class="mkw-rss"> | ||||
| 	<ui-container :show-header="!props.compact"> | ||||
| 		<template slot="header"><fa icon="rss-square"/>RSS</template> | ||||
| 		<button slot="func" title="設定" @click="setting"><fa icon="cog"/></button> | ||||
| 		<template #header><fa icon="rss-square"/>RSS</template> | ||||
| 		<template #func><button title="設定" @click="setting"><fa icon="cog"/></button></template> | ||||
|  | ||||
| 		<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> | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| <template> | ||||
| <div class="mkw-server"> | ||||
| 	<ui-container :show-header="props.design == 0" :naked="props.design == 2"> | ||||
| 		<template slot="header"><fa icon="server"/>{{ $t('title') }}</template> | ||||
| 		<button slot="func" @click="toggle" :title="$t('toggle')"><fa icon="sort"/></button> | ||||
| 		<template #header><fa icon="server"/>{{ $t('title') }}</template> | ||||
| 		<template #func><button @click="toggle" :title="$t('toggle')"><fa icon="sort"/></button></template> | ||||
|  | ||||
| 		<p :class="$style.fetching" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p> | ||||
| 		<template v-if="!fetching"> | ||||
|   | ||||
| @@ -3,7 +3,7 @@ | ||||
| </template> | ||||
|  | ||||
| <script lang="ts"> | ||||
| import { clientVersion as version, codename } from '../../../config'; | ||||
| import { version, codename } from '../../../config'; | ||||
| import define from '../../../common/define-widget'; | ||||
| export default define({ | ||||
| 	name: 'version' | ||||
|   | ||||
| @@ -1,7 +1,6 @@ | ||||
| declare const _LANGS_: string[]; | ||||
| declare const _COPYRIGHT_: string; | ||||
| declare const _VERSION_: string; | ||||
| declare const _CLIENT_VERSION_: string; | ||||
| declare const _CODENAME_: string; | ||||
| declare const _ENV_: string; | ||||
|  | ||||
| @@ -17,6 +16,5 @@ export const langs = _LANGS_; | ||||
| export const locale = JSON.parse(localStorage.getItem('locale')); | ||||
| export const copyright = _COPYRIGHT_; | ||||
| export const version = _VERSION_; | ||||
| export const clientVersion = _CLIENT_VERSION_; | ||||
| export const codename = _CODENAME_; | ||||
| export const env = _ENV_; | ||||
|   | ||||
| @@ -1,20 +1,10 @@ | ||||
| import { apiUrl, locale } from '../../config'; | ||||
| import CropWindow from '../views/components/crop-window.vue'; | ||||
| import ProgressDialog from '../views/components/progress-dialog.vue'; | ||||
|  | ||||
| export default ($root: any) => { | ||||
|  | ||||
| 	const cropImage = file => new Promise((resolve, reject) => { | ||||
|  | ||||
| 		const regex = RegExp('\.(jpg|jpeg|png|gif|webp|bmp|tiff)$'); | ||||
| 		if (!regex.test(file.name) ) { | ||||
| 			$root.dialog({ | ||||
| 				title: locale['desktop']['invalid-filetype'], | ||||
| 				text: null | ||||
| 			}); | ||||
| 			return reject('invalid-filetype'); | ||||
| 		} | ||||
|  | ||||
| 	const cropImage = file => new Promise(async (resolve, reject) => { | ||||
| 		const CropWindow = await import('../views/components/crop-window.vue').then(x => x.default); | ||||
| 		const w = $root.new(CropWindow, { | ||||
| 			image: file, | ||||
| 			title: locale['desktop']['avatar-crop-title'], | ||||
|   | ||||
| @@ -1,20 +1,10 @@ | ||||
| import { apiUrl, locale } from '../../config'; | ||||
| import CropWindow from '../views/components/crop-window.vue'; | ||||
| import ProgressDialog from '../views/components/progress-dialog.vue'; | ||||
|  | ||||
| export default ($root: any) => { | ||||
|  | ||||
| 	const cropImage = file => new Promise((resolve, reject) => { | ||||
|  | ||||
| 		const regex = RegExp('\.(jpg|jpeg|png|gif|webp|bmp|tiff)$'); | ||||
| 		if (!regex.test(file.name) ) { | ||||
| 			$root.dialog({ | ||||
| 				title: locale['desktop']['invalid-filetype'], | ||||
| 				text: null | ||||
| 			}); | ||||
| 			return reject('invalid-filetype'); | ||||
| 		} | ||||
|  | ||||
| 	const cropImage = file => new Promise(async (resolve, reject) => { | ||||
| 		const CropWindow = await import('../views/components/crop-window.vue').then(x => x.default); | ||||
| 		const w = $root.new(CropWindow, { | ||||
| 			image: file, | ||||
| 			title: locale['desktop']['banner-crop-title'], | ||||
|   | ||||
| @@ -14,7 +14,6 @@ import composeNotification from '../common/scripts/compose-notification'; | ||||
|  | ||||
| import MkHome from './views/home/home.vue'; | ||||
| import MkDeck from './views/deck/deck.vue'; | ||||
| import MkUserFollowingOrFollowers from './views/pages/user-following-or-followers.vue'; | ||||
| import MkSelectDrive from './views/pages/selectdrive.vue'; | ||||
| import MkDrive from './views/pages/drive.vue'; | ||||
| import MkMessagingRoom from './views/pages/messaging-room.vue'; | ||||
| @@ -124,13 +123,19 @@ init(async (launch, os) => { | ||||
| 	require('./views/components'); | ||||
| 	require('./views/widgets'); | ||||
|  | ||||
| 	os.store.commit('device/set', { | ||||
| 		key: 'inDeckMode', | ||||
| 		value: os.store.getters.isSignedIn && os.store.state.device.deckMode | ||||
| 			&& (document.location.pathname === '/' || window.performance.navigation.type === 1) | ||||
| 	}); | ||||
|  | ||||
| 	// Init router | ||||
| 	const router = new VueRouter({ | ||||
| 		mode: 'history', | ||||
| 		routes: [ | ||||
| 			os.store.getters.isSignedIn && os.store.state.device.deckMode && document.location.pathname === '/' | ||||
| 			os.store.state.device.inDeckMode | ||||
| 				? { path: '/', name: 'index', component: MkDeck, children: [ | ||||
| 					{ path: '/@:user', name: 'user', component: () => import('./views/deck/deck.user-column.vue').then(m => m.default), children: [ | ||||
| 					{ path: '/@:user', component: () => import('./views/deck/deck.user-column.vue').then(m => m.default), children: [ | ||||
| 						{ path: '', name: 'user', component: () => import('./views/deck/deck.user-column.home.vue').then(m => m.default) }, | ||||
| 						{ path: 'following', component: () => import('../common/views/pages/following.vue').then(m => m.default) }, | ||||
| 						{ path: 'followers', component: () => import('../common/views/pages/followers.vue').then(m => m.default) }, | ||||
| @@ -138,8 +143,9 @@ init(async (launch, os) => { | ||||
| 					{ path: '/notes/:note', name: 'note', component: () => import('./views/deck/deck.note-column.vue').then(m => m.default) }, | ||||
| 					{ path: '/search', component: () => import('./views/deck/deck.search-column.vue').then(m => m.default) }, | ||||
| 					{ path: '/tags/:tag', name: 'tag', component: () => import('./views/deck/deck.hashtag-column.vue').then(m => m.default) }, | ||||
| 					{ path: '/featured', component: () => import('./views/deck/deck.featured-column.vue').then(m => m.default) }, | ||||
| 					{ path: '/explore', component: () => import('./views/deck/deck.explore-column.vue').then(m => m.default) }, | ||||
| 					{ path: '/featured', name: 'featured', component: () => import('./views/deck/deck.featured-column.vue').then(m => m.default) }, | ||||
| 					{ path: '/explore', name: 'explore', component: () => import('./views/deck/deck.explore-column.vue').then(m => m.default) }, | ||||
| 					{ path: '/explore/tags/:tag', name: 'explore-tag', props: true, component: () => import('./views/deck/deck.explore-column.vue').then(m => m.default) }, | ||||
| 					{ path: '/i/favorites', component: () => import('./views/deck/deck.favorites-column.vue').then(m => m.default) } | ||||
| 				]} | ||||
| 				: { path: '/', component: MkHome, children: [ | ||||
| @@ -154,6 +160,7 @@ init(async (launch, os) => { | ||||
| 					{ path: '/tags/:tag', name: 'tag', component: () => import('./views/home/tag.vue').then(m => m.default) }, | ||||
| 					{ path: '/featured', name: 'featured', component: () => import('./views/home/featured.vue').then(m => m.default) }, | ||||
| 					{ path: '/explore', name: 'explore', component: () => import('../common/views/pages/explore.vue').then(m => m.default) }, | ||||
| 					{ path: '/explore/tags/:tag', name: 'explore-tag', props: true, component: () => import('../common/views/pages/explore.vue').then(m => m.default) }, | ||||
| 					{ path: '/i/favorites', component: () => import('./views/home/favorites.vue').then(m => m.default) }, | ||||
| 				]}, | ||||
| 			{ path: '/i/messaging/:user', component: MkMessagingRoom }, | ||||
|   | ||||
| @@ -11,6 +11,9 @@ html | ||||
| 	height 100% | ||||
| 	background var(--bg) | ||||
|  | ||||
| 	&, div, textarea | ||||
| 		scrollbar-width thin | ||||
|  | ||||
| 	&, * | ||||
| 		scrollbar-color var(--scrollbarHandle) var(--scrollbarTrack) | ||||
|  | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| <template> | ||||
| <div class="mk-activity"> | ||||
| 	<ui-container :show-header="design == 0" :naked="design == 2"> | ||||
| 		<template slot="header"><fa icon="chart-bar"/>{{ $t('title') }}</template> | ||||
| 		<button slot="func" :title="$t('toggle')" @click="toggle"><fa icon="sort"/></button> | ||||
| 		<template #header><fa icon="chart-bar"/>{{ $t('title') }}</template> | ||||
| 		<template #func><button :title="$t('toggle')" @click="toggle"><fa icon="sort"/></button></template> | ||||
|  | ||||
| 		<p :class="$style.fetching" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p> | ||||
| 		<template v-else> | ||||
|   | ||||
| @@ -1,9 +1,11 @@ | ||||
| <template> | ||||
| <mk-window ref="window" is-modal width="800px" height="500px" @closed="destroyDom"> | ||||
| 	<span slot="header" class="jqiaciqv"> | ||||
| 		<span class="title">{{ $t('choose-prompt') }}</span> | ||||
| 		<span class="count" v-if="multiple && files.length > 0">({{ $t('chosen-files', { count: files.length }) }})</span> | ||||
| 	</span> | ||||
| 	<template #header> | ||||
| 		<span class="jqiaciqv"> | ||||
| 			<span class="title">{{ $t('choose-prompt') }}</span> | ||||
| 			<span class="count" v-if="multiple && files.length > 0">({{ $t('chosen-files', { count: files.length }) }})</span> | ||||
| 		</span> | ||||
| 	</template> | ||||
|  | ||||
| 	<div class="rqsvbumu"> | ||||
| 		<x-drive | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| <template> | ||||
| <mk-window ref="window" is-modal width="800px" height="500px" @closed="destroyDom"> | ||||
| 	<span slot="header"> | ||||
| 	<template #header> | ||||
| 		<span>{{ $t('choose-prompt') }}</span> | ||||
| 	</span> | ||||
| 	</template> | ||||
|  | ||||
| 	<div class="hllkpxxu"> | ||||
| 		<x-drive | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| <template> | ||||
| 	<mk-window ref="window" is-modal width="800px" :can-close="false"> | ||||
| 		<span slot="header"><fa icon="crop"/>{{ title }}</span> | ||||
| 		<template #header><fa icon="crop"/>{{ title }}</template> | ||||
| 		<div class="body"> | ||||
| 			<vue-cropper ref="cropper" | ||||
| 				:src="image.url" | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| <template> | ||||
| <mk-window ref="window" @closed="destroyDom" width="800px" height="500px" :popout-url="popout"> | ||||
| 	<template slot="header"> | ||||
| 	<template #header> | ||||
| 		<p v-if="usage" :class="$style.info"><b>{{ usage.toFixed(1) }}%</b> {{ $t('used') }}</p> | ||||
| 		<span :class="$style.title"><fa icon="cloud"/>{{ $t('@.drive') }}</span> | ||||
| 	</template> | ||||
|   | ||||
| @@ -1,166 +0,0 @@ | ||||
| <template> | ||||
| <div class="mk-friends-maker"> | ||||
| 	<p class="title">{{ $t('title') }}</p> | ||||
| 	<div class="users" v-if="!fetching && users.length > 0"> | ||||
| 		<div class="user" v-for="user in users" :key="user.id"> | ||||
| 			<mk-avatar class="avatar" :user="user" target="_blank"/> | ||||
| 			<div class="body"> | ||||
| 				<router-link class="name" :to="user | userPage" v-user-preview="user.id"> | ||||
| 					<mk-user-name :user="user"/> | ||||
| 				</router-link> | ||||
| 				<p class="username">@{{ user | acct }}</p> | ||||
| 			</div> | ||||
| 		</div> | ||||
| 	</div> | ||||
| 	<p class="empty" v-if="!fetching && users.length == 0">{{ $t('empty') }}</p> | ||||
| 	<p class="fetching" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('fetching') }}<mk-ellipsis/></p> | ||||
| 	<a class="refresh" @click="refresh">{{ $t('refresh') }}</a> | ||||
| 	<button class="close" @click="destroyDom()" :title="$t('title')"><fa icon="times"/></button> | ||||
| </div> | ||||
| </template> | ||||
|  | ||||
| <script lang="ts"> | ||||
| import Vue from 'vue'; | ||||
| import i18n from '../../../i18n'; | ||||
|  | ||||
| export default Vue.extend({ | ||||
| 	i18n: i18n('desktop/views/components/friends-maker.vue'), | ||||
| 	data() { | ||||
| 		return { | ||||
| 			users: [], | ||||
| 			fetching: true, | ||||
| 			limit: 6, | ||||
| 			page: 0 | ||||
| 		}; | ||||
| 	}, | ||||
| 	mounted() { | ||||
| 		this.fetch(); | ||||
| 	}, | ||||
| 	methods: { | ||||
| 		fetch() { | ||||
| 			this.fetching = true; | ||||
| 			this.users = []; | ||||
|  | ||||
| 			this.$root.api('users/recommendation', { | ||||
| 				limit: this.limit, | ||||
| 				offset: this.limit * this.page | ||||
| 			}).then(users => { | ||||
| 				this.users = users; | ||||
| 				this.fetching = false; | ||||
| 			}); | ||||
| 		}, | ||||
| 		refresh() { | ||||
| 			if (this.users.length < this.limit) { | ||||
| 				this.page = 0; | ||||
| 			} else { | ||||
| 				this.page++; | ||||
| 			} | ||||
| 			this.fetch(); | ||||
| 		} | ||||
| 	} | ||||
| }); | ||||
| </script> | ||||
|  | ||||
| <style lang="stylus" scoped> | ||||
| .mk-friends-maker | ||||
| 	padding 24px | ||||
|  | ||||
| 	> .title | ||||
| 		margin 0 0 12px 0 | ||||
| 		font-size 1em | ||||
| 		font-weight bold | ||||
| 		color #888 | ||||
|  | ||||
| 	> .users | ||||
| 		&:after | ||||
| 			content "" | ||||
| 			display block | ||||
| 			clear both | ||||
|  | ||||
| 		> .user | ||||
| 			padding 16px | ||||
| 			width 238px | ||||
| 			float left | ||||
|  | ||||
| 			&:after | ||||
| 				content "" | ||||
| 				display block | ||||
| 				clear both | ||||
|  | ||||
| 			> .avatar | ||||
| 				display block | ||||
| 				float left | ||||
| 				margin 0 12px 0 0 | ||||
| 				width 42px | ||||
| 				height 42px | ||||
| 				border-radius 8px | ||||
|  | ||||
| 			> .body | ||||
| 				float left | ||||
| 				width calc(100% - 54px) | ||||
|  | ||||
| 				> .name | ||||
| 					margin 0 | ||||
| 					font-size 16px | ||||
| 					line-height 24px | ||||
| 					color #555 | ||||
|  | ||||
| 				> .username | ||||
| 					margin 0 | ||||
| 					font-size 15px | ||||
| 					line-height 16px | ||||
| 					color #ccc | ||||
|  | ||||
| 			> .mk-follow-button | ||||
| 				position absolute | ||||
| 				top 16px | ||||
| 				right 16px | ||||
|  | ||||
| 	> .empty | ||||
| 		margin 0 | ||||
| 		padding 16px | ||||
| 		text-align center | ||||
| 		color var(--text) | ||||
|  | ||||
| 	> .fetching | ||||
| 		margin 0 | ||||
| 		padding 16px | ||||
| 		text-align center | ||||
| 		color var(--text) | ||||
|  | ||||
| 		> [data-icon] | ||||
| 			margin-right 4px | ||||
|  | ||||
| 	> .refresh | ||||
| 		display block | ||||
| 		margin 0 8px 0 0 | ||||
| 		text-align right | ||||
| 		font-size 0.9em | ||||
| 		color #999 | ||||
|  | ||||
| 	> .close | ||||
| 		cursor pointer | ||||
| 		display block | ||||
| 		position absolute | ||||
| 		top 6px | ||||
| 		right 6px | ||||
| 		z-index 1 | ||||
| 		margin 0 | ||||
| 		padding 0 | ||||
| 		font-size 1.2em | ||||
| 		color #999 | ||||
| 		border none | ||||
| 		outline none | ||||
| 		background transparent | ||||
|  | ||||
| 		&:hover | ||||
| 			color #555 | ||||
|  | ||||
| 		&:active | ||||
| 			color #222 | ||||
|  | ||||
| 		> [data-icon] | ||||
| 			box-sizing initial | ||||
| 			padding 14px | ||||
|  | ||||
| </style> | ||||
| @@ -1,6 +1,6 @@ | ||||
| <template> | ||||
| <mk-window ref="window" width="500px" height="560px" :popout-url="popout" @closed="destroyDom"> | ||||
| 	<span slot="header" :class="$style.header"><fa icon="gamepad"/>{{ $t('game') }}</span> | ||||
| 	<template #header><fa icon="gamepad"/> {{ $t('game') }}</template> | ||||
| 	<x-reversi :class="$style.content" @gamed="g => game = g"/> | ||||
| </mk-window> | ||||
| </template> | ||||
| @@ -31,10 +31,6 @@ export default Vue.extend({ | ||||
| </script> | ||||
|  | ||||
| <style lang="stylus" module> | ||||
| .header | ||||
| 	> [data-icon] | ||||
| 		margin-right 4px | ||||
|  | ||||
| .content | ||||
| 	height 100% | ||||
| 	overflow auto | ||||
|   | ||||
| @@ -15,8 +15,6 @@ import notePreview from './note-preview.vue'; | ||||
| import noteDetail from './note-detail.vue'; | ||||
| import calendar from './calendar.vue'; | ||||
| import activity from './activity.vue'; | ||||
| import friendsMaker from './friends-maker.vue'; | ||||
| import userCard from './user-card.vue'; | ||||
| import userListTimeline from './user-list-timeline.vue'; | ||||
| import uiContainer from './ui-container.vue'; | ||||
|  | ||||
| @@ -35,7 +33,5 @@ Vue.component('mk-note-preview', notePreview); | ||||
| Vue.component('mk-note-detail', noteDetail); | ||||
| Vue.component('mk-calendar', calendar); | ||||
| Vue.component('mk-activity', activity); | ||||
| Vue.component('mk-friends-maker', friendsMaker); | ||||
| Vue.component('mk-user-card', userCard); | ||||
| Vue.component('mk-user-list-timeline', userListTimeline); | ||||
| Vue.component('ui-container', uiContainer); | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| <template> | ||||
| <mk-window ref="window" width="500px" height="560px" :popout-url="popout" @closed="destroyDom"> | ||||
| 	<span slot="header" :class="$style.header"><fa icon="comments"/>{{ $t('title') }} <mk-user-name :user="user"/></span> | ||||
| 	<template #header><fa icon="comments"/> {{ $t('title') }} <mk-user-name :user="user"/></template> | ||||
| 	<x-messaging-room :user="user" :class="$style.content"/> | ||||
| </mk-window> | ||||
| </template> | ||||
| @@ -26,10 +26,6 @@ export default Vue.extend({ | ||||
| </script> | ||||
|  | ||||
| <style lang="stylus" module> | ||||
| .header | ||||
| 	> [data-icon] | ||||
| 		margin-right 4px | ||||
|  | ||||
| .content | ||||
| 	height 100% | ||||
| 	overflow auto | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| <template> | ||||
| <mk-window ref="window" width="500px" height="560px" @closed="destroyDom"> | ||||
| 	<span slot="header" :class="$style.header"><fa icon="comments"/>{{ $t('title') }}</span> | ||||
| 	<template #header :class="$style.header"><fa icon="comments"/>{{ $t('title') }}</template> | ||||
| 	<x-messaging :class="$style.content" @navigate="navigate"/> | ||||
| </mk-window> | ||||
| </template> | ||||
|   | ||||
| @@ -1,10 +1,12 @@ | ||||
| <template> | ||||
| <div class="mk-notes"> | ||||
| 	<slot name="header"></slot> | ||||
|  | ||||
| 	<div class="newer-indicator" :style="{ top: $store.state.uiHeaderHeight + 'px' }" v-show="queue.length > 0"></div> | ||||
|  | ||||
| 	<slot name="empty" v-if="notes.length == 0 && !fetching && requestInitPromise == null"></slot> | ||||
| 	<slot name="empty" v-if="notes.length == 0 && !fetching && inited"></slot> | ||||
|  | ||||
| 	<mk-error v-if="!fetching && requestInitPromise != null" @retry="resolveInitPromise"/> | ||||
| 	<mk-error v-if="!fetching && !inited" @retry="init()"/> | ||||
|  | ||||
| 	<div class="placeholder" v-if="fetching"> | ||||
| 		<template v-for="i in 10"> | ||||
| @@ -23,8 +25,8 @@ | ||||
| 		</template> | ||||
| 	</component> | ||||
|  | ||||
| 	<footer v-if="more"> | ||||
| 		<button @click="loadMore" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }"> | ||||
| 	<footer v-if="cursor != null"> | ||||
| 		<button @click="more" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }"> | ||||
| 			<template v-if="!moreFetching">{{ $t('@.load-more') }}</template> | ||||
| 			<template v-if="moreFetching"><fa icon="spinner" pulse fixed-width/></template> | ||||
| 		</button> | ||||
| @@ -43,24 +45,25 @@ const displayLimit = 30; | ||||
|  | ||||
| export default Vue.extend({ | ||||
| 	i18n: i18n(), | ||||
|  | ||||
| 	components: { | ||||
| 		XNote | ||||
| 	}, | ||||
|  | ||||
| 	props: { | ||||
| 		more: { | ||||
| 			type: Function, | ||||
| 			required: false | ||||
| 		makePromise: { | ||||
| 			required: true | ||||
| 		} | ||||
| 	}, | ||||
|  | ||||
| 	data() { | ||||
| 		return { | ||||
| 			requestInitPromise: null as () => Promise<any[]>, | ||||
| 			notes: [], | ||||
| 			queue: [], | ||||
| 			fetching: true, | ||||
| 			moreFetching: false | ||||
| 			moreFetching: false, | ||||
| 			inited: false, | ||||
| 			cursor: null | ||||
| 		}; | ||||
| 	}, | ||||
|  | ||||
| @@ -76,6 +79,10 @@ export default Vue.extend({ | ||||
| 		} | ||||
| 	}, | ||||
|  | ||||
| 	created() { | ||||
| 		this.init(); | ||||
| 	}, | ||||
|  | ||||
| 	mounted() { | ||||
| 		window.addEventListener('scroll', this.onScroll, { passive: true }); | ||||
| 	}, | ||||
| @@ -97,27 +104,41 @@ export default Vue.extend({ | ||||
| 			Vue.set((this as any).notes, i, note); | ||||
| 		}, | ||||
|  | ||||
| 		init(promiseGenerator: () => Promise<any[]>) { | ||||
| 			this.requestInitPromise = promiseGenerator; | ||||
| 			this.resolveInitPromise(); | ||||
| 		}, | ||||
|  | ||||
| 		resolveInitPromise() { | ||||
| 		reload() { | ||||
| 			this.queue = []; | ||||
| 			this.notes = []; | ||||
| 			this.init(); | ||||
| 		}, | ||||
|  | ||||
| 		init() { | ||||
| 			this.fetching = true; | ||||
|  | ||||
| 			const promise = this.requestInitPromise(); | ||||
|  | ||||
| 			promise.then(notes => { | ||||
| 				this.notes = notes; | ||||
| 				this.requestInitPromise = null; | ||||
| 			this.makePromise().then(x => { | ||||
| 				if (Array.isArray(x)) { | ||||
| 					this.notes = x; | ||||
| 				} else { | ||||
| 					this.notes = x.notes; | ||||
| 					this.cursor = x.cursor; | ||||
| 				} | ||||
| 				this.inited = true; | ||||
| 				this.fetching = false; | ||||
| 				this.$emit('inited'); | ||||
| 			}, e => { | ||||
| 				this.fetching = false; | ||||
| 			}); | ||||
| 		}, | ||||
|  | ||||
| 		more() { | ||||
| 			if (this.cursor == null || this.moreFetching) return; | ||||
| 			this.moreFetching = true; | ||||
| 			this.makePromise(this.cursor).then(x => { | ||||
| 				this.notes = this.notes.concat(x.notes); | ||||
| 				this.cursor = x.cursor; | ||||
| 				this.moreFetching = false; | ||||
| 			}, e => { | ||||
| 				this.moreFetching = false; | ||||
| 			}); | ||||
| 		}, | ||||
|  | ||||
| 		prepend(note, silent = false) { | ||||
| 			// 弾く | ||||
| 			if (shouldMuteNote(this.$store.state.i, this.$store.state.settings, note)) return; | ||||
| @@ -151,10 +172,6 @@ export default Vue.extend({ | ||||
| 			this.notes.push(note); | ||||
| 		}, | ||||
|  | ||||
| 		tail() { | ||||
| 			return this.notes[this.notes.length - 1]; | ||||
| 		}, | ||||
|  | ||||
| 		releaseQueue() { | ||||
| 			for (const n of this.queue) { | ||||
| 				this.prepend(n, true); | ||||
| @@ -162,15 +179,6 @@ export default Vue.extend({ | ||||
| 			this.queue = []; | ||||
| 		}, | ||||
|  | ||||
| 		async loadMore() { | ||||
| 			if (this.more == null) return; | ||||
| 			if (this.moreFetching) return; | ||||
|  | ||||
| 			this.moreFetching = true; | ||||
| 			await this.more(); | ||||
| 			this.moreFetching = false; | ||||
| 		}, | ||||
|  | ||||
| 		onScroll() { | ||||
| 			if (this.isScrollTop()) { | ||||
| 				this.releaseQueue(); | ||||
| @@ -178,7 +186,7 @@ export default Vue.extend({ | ||||
|  | ||||
| 			if (this.$store.state.settings.fetchOnScroll !== false) { | ||||
| 				const current = window.scrollY + window.innerHeight; | ||||
| 				if (current > document.body.offsetHeight - 8) this.loadMore(); | ||||
| 				if (current > document.body.offsetHeight - 8) this.more(); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| @@ -187,6 +195,11 @@ export default Vue.extend({ | ||||
|  | ||||
| <style lang="stylus" scoped> | ||||
| .mk-notes | ||||
| 	background var(--face) | ||||
| 	box-shadow var(--shadow) | ||||
| 	border-radius var(--round) | ||||
| 	overflow hidden | ||||
|  | ||||
| 	.transition | ||||
| 		.mk-notes-enter | ||||
| 		.mk-notes-leave-to | ||||
|   | ||||
| @@ -1,12 +1,14 @@ | ||||
| <template> | ||||
| <mk-window class="mk-post-form-window" ref="window" is-modal @closed="onWindowClosed" :animation="animation"> | ||||
| 	<span slot="header" class="mk-post-form-window--header"> | ||||
| 		<span class="icon" v-if="geo"><fa icon="map-marker-alt"/></span> | ||||
| 		<span v-if="!reply">{{ $t('note') }}</span> | ||||
| 		<span v-if="reply">{{ $t('reply') }}</span> | ||||
| 		<span class="count" v-if="files.length != 0">{{ this.$t('attaches').replace('{}', files.length) }}</span> | ||||
| 		<span class="count" v-if="uploadings.length != 0">{{ this.$t('uploading-media').replace('{}', uploadings.length) }}<mk-ellipsis/></span> | ||||
| 	</span> | ||||
| 	<template #header> | ||||
| 		<span class="mk-post-form-window--header"> | ||||
| 			<span class="icon" v-if="geo"><fa icon="map-marker-alt"/></span> | ||||
| 			<span v-if="!reply">{{ $t('note') }}</span> | ||||
| 			<span v-if="reply">{{ $t('reply') }}</span> | ||||
| 			<span class="count" v-if="files.length != 0">{{ this.$t('attaches').replace('{}', files.length) }}</span> | ||||
| 			<span class="count" v-if="uploadings.length != 0">{{ this.$t('uploading-media').replace('{}', uploadings.length) }}<mk-ellipsis/></span> | ||||
| 		</span> | ||||
| 	</template> | ||||
|  | ||||
| 	<div class="mk-post-form-window--body"> | ||||
| 		<mk-note-preview v-if="reply" class="notePreview" :note="reply"/> | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| <template> | ||||
| <mk-window ref="window" :is-modal="false" :can-close="false" width="500px" @closed="destroyDom"> | ||||
| 	<span slot="header">{{ title }}<mk-ellipsis/></span> | ||||
| 	<template #header>{{ title }}<mk-ellipsis/></template> | ||||
| 	<div :class="$style.body"> | ||||
| 		<p :class="$style.init" v-if="isNaN(value)">{{ $t('waiting') }}<mk-ellipsis/></p> | ||||
| 		<p :class="$style.percentage" v-if="!isNaN(value)">{{ Math.floor((value / max) * 100) }}</p> | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| <template> | ||||
| <mk-window ref="window" is-modal width="450px" height="500px" @closed="destroyDom"> | ||||
| 	<span slot="header"><fa :icon="['far', 'envelope']"/> {{ $t('title') }}</span> | ||||
| 	<template #header><fa :icon="['far', 'envelope']"/> {{ $t('title') }}</template> | ||||
|  | ||||
| 	<div class="slpqaxdoxhvglersgjukmvizkqbmbokc"> | ||||
| 		<div v-for="req in requests"> | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| <template> | ||||
| <mk-window ref="window" is-modal @closed="onWindowClosed" :animation="animation"> | ||||
| 	<span slot="header" :class="$style.header"><fa icon="retweet"/>{{ $t('title') }}</span> | ||||
| 	<template #header :class="$style.header"><fa icon="retweet"/>{{ $t('title') }}</template> | ||||
| 	<mk-renote-form ref="form" :note="note" @posted="onPosted" @canceled="onCanceled" v-hotkey.global="keymap"/> | ||||
| </mk-window> | ||||
| </template> | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| <template> | ||||
| <mk-window ref="window" is-modal width="700px" height="550px" @closed="destroyDom"> | ||||
| 	<span slot="header" :class="$style.header"><fa icon="cog"/>{{ $t('settings') }}</span> | ||||
| 	<template #header :class="$style.header"><fa icon="cog"/>{{ $t('settings') }}</template> | ||||
| 	<x-settings :initial-page="initialPage" @done="close"/> | ||||
| </mk-window> | ||||
| </template> | ||||
|   | ||||
| @@ -22,17 +22,17 @@ | ||||
| 		<x-theme class="theme" v-show="page == 'theme'"/> | ||||
|  | ||||
| 		<ui-card class="web" v-show="page == 'web'"> | ||||
| 			<div slot="title"><fa icon="sliders-h"/> {{ $t('behaviour') }}</div> | ||||
| 			<template #title><fa icon="sliders-h"/> {{ $t('behaviour') }}</template> | ||||
|  | ||||
| 			<section> | ||||
| 				<ui-switch v-model="fetchOnScroll">{{ $t('fetch-on-scroll') }} | ||||
| 					<span slot="desc">{{ $t('fetch-on-scroll-desc') }}</span> | ||||
| 					<template #desc>{{ $t('fetch-on-scroll-desc') }}</template> | ||||
| 				</ui-switch> | ||||
| 				<ui-switch v-model="autoPopout">{{ $t('auto-popout') }} | ||||
| 					<span slot="desc">{{ $t('auto-popout-desc') }}</span> | ||||
| 					<template #desc>{{ $t('auto-popout-desc') }}</template> | ||||
| 				</ui-switch> | ||||
| 				<ui-switch v-model="keepCw">{{ $t('keep-cw') }} | ||||
| 					<span slot="desc">{{ $t('keep-cw-desc') }}</span> | ||||
| 					<template #desc>{{ $t('keep-cw-desc') }}</template> | ||||
| 				</ui-switch> | ||||
| 			</section> | ||||
|  | ||||
| @@ -62,12 +62,12 @@ | ||||
|  | ||||
| 			<section> | ||||
| 				<header>{{ $t('web-search-engine') }}</header> | ||||
| 				<ui-input v-model="webSearchEngine">{{ $t('web-search-engine') }}<span slot="desc">{{ $t('web-search-engine-desc') }}</span></ui-input> | ||||
| 				<ui-input v-model="webSearchEngine">{{ $t('web-search-engine') }}<template #desc>{{ $t('web-search-engine-desc') }}</template></ui-input> | ||||
| 			</section> | ||||
| 		</ui-card> | ||||
|  | ||||
| 		<ui-card class="web" v-show="page == 'web'"> | ||||
| 			<div slot="title"><fa icon="desktop"/> {{ $t('display') }}</div> | ||||
| 			<template #title><fa icon="desktop"/> {{ $t('display') }}</template> | ||||
|  | ||||
| 			<section> | ||||
| 				<ui-switch v-model="showPostFormOnTopOfTl">{{ $t('post-form-on-timeline') }}</ui-switch> | ||||
| @@ -135,11 +135,11 @@ | ||||
| 		</ui-card> | ||||
|  | ||||
| 		<ui-card class="web" v-show="page == 'web'"> | ||||
| 			<div slot="title"><fa icon="volume-up"/> {{ $t('sound') }}</div> | ||||
| 			<template #title><fa icon="volume-up"/> {{ $t('sound') }}</template> | ||||
|  | ||||
| 			<section> | ||||
| 				<ui-switch v-model="enableSounds">{{ $t('enable-sounds') }} | ||||
| 					<span slot="desc">{{ $t('enable-sounds-desc') }}</span> | ||||
| 					<template #desc>{{ $t('enable-sounds-desc') }}</template> | ||||
| 				</ui-switch> | ||||
| 				<label>{{ $t('volume') }}</label> | ||||
| 				<input type="range" | ||||
| @@ -155,7 +155,7 @@ | ||||
| 		<x-language-settings v-show="page == 'web'"/> | ||||
|  | ||||
| 		<ui-card class="web" v-show="page == 'web'"> | ||||
| 			<div slot="title"><fa :icon="['far', 'trash-alt']"/> {{ $t('cache') }}</div> | ||||
| 			<template #title><fa :icon="['far', 'trash-alt']"/> {{ $t('cache') }}</template> | ||||
| 			<section> | ||||
| 				<ui-button @click="clean">{{ $t('clean-cache') }}</ui-button> | ||||
| 				<div class="none ui info warn"> | ||||
| @@ -171,7 +171,7 @@ | ||||
| 		</div> | ||||
|  | ||||
| 		<ui-card class="hashtags" v-show="page == 'hashtags'"> | ||||
| 			<div slot="title"><fa icon="hashtag"/> {{ $t('tags') }}</div> | ||||
| 			<template #title><fa icon="hashtag"/> {{ $t('tags') }}</template> | ||||
| 			<section> | ||||
| 				<x-tags/> | ||||
| 			</section> | ||||
| @@ -182,28 +182,28 @@ | ||||
| 		</div> | ||||
|  | ||||
| 		<ui-card class="apps" v-show="page == 'apps'"> | ||||
| 			<div slot="title"><fa icon="puzzle-piece"/> {{ $t('apps') }}</div> | ||||
| 			<template #title><fa icon="puzzle-piece"/> {{ $t('apps') }}</template> | ||||
| 			<section> | ||||
| 				<x-apps/> | ||||
| 			</section> | ||||
| 		</ui-card> | ||||
|  | ||||
| 		<ui-card class="password" v-show="page == 'security'"> | ||||
| 			<div slot="title"><fa icon="unlock-alt"/> {{ $t('password') }}</div> | ||||
| 			<template #title><fa icon="unlock-alt"/> {{ $t('password') }}</template> | ||||
| 			<section> | ||||
| 				<x-password-settings/> | ||||
| 			</section> | ||||
| 		</ui-card> | ||||
|  | ||||
| 		<ui-card class="2fa" v-show="page == 'security'"> | ||||
| 			<div slot="title"><fa icon="mobile-alt"/> {{ $t('@.2fa') }}</div> | ||||
| 			<template #title><fa icon="mobile-alt"/> {{ $t('@.2fa') }}</template> | ||||
| 			<section> | ||||
| 				<x-2fa/> | ||||
| 			</section> | ||||
| 		</ui-card> | ||||
|  | ||||
| 		<ui-card class="signin" v-show="page == 'security'"> | ||||
| 			<div slot="title"><fa icon="sign-in-alt"/> {{ $t('signin') }}</div> | ||||
| 			<template #title><fa icon="sign-in-alt"/> {{ $t('signin') }}</template> | ||||
| 			<section> | ||||
| 				<x-signins/> | ||||
| 			</section> | ||||
| @@ -214,14 +214,14 @@ | ||||
| 		</div> | ||||
|  | ||||
| 		<ui-card class="other" v-show="page == 'other'"> | ||||
| 			<div slot="title"><fa icon="info-circle"/> {{ $t('about') }}</div> | ||||
| 			<template #title><fa icon="info-circle"/> {{ $t('about') }}</template> | ||||
| 			<section> | ||||
| 				<p v-if="meta">{{ $t('operator') }}: <i><a :href="'mailto:' + meta.maintainer.email" target="_blank">{{ meta.maintainer.name }}</a></i></p> | ||||
| 			</section> | ||||
| 		</ui-card> | ||||
|  | ||||
| 		<ui-card class="other" v-show="page == 'other'"> | ||||
| 			<div slot="title"><fa icon="sync-alt"/> {{ $t('update') }}</div> | ||||
| 			<template #title><fa icon="sync-alt"/> {{ $t('update') }}</template> | ||||
| 			<section> | ||||
| 				<p> | ||||
| 					<span>{{ $t('version') }} <i>{{ version }}</i></span> | ||||
| @@ -237,20 +237,20 @@ | ||||
| 				<details> | ||||
| 					<summary>{{ $t('update-settings') }}</summary> | ||||
| 					<ui-switch v-model="preventUpdate"> | ||||
| 						{{ $t('prevent-update') }}<span slot="desc">{{ $t('prevent-update-desc') }}</span> | ||||
| 						{{ $t('prevent-update') }}<template #desc>{{ $t('prevent-update-desc') }}</template> | ||||
| 					</ui-switch> | ||||
| 				</details> | ||||
| 			</section> | ||||
| 		</ui-card> | ||||
|  | ||||
| 		<ui-card class="other" v-show="page == 'other'"> | ||||
| 			<div slot="title"><fa icon="cogs"/> {{ $t('advanced-settings') }}</div> | ||||
| 			<template #title><fa icon="cogs"/> {{ $t('advanced-settings') }}</template> | ||||
| 			<section> | ||||
| 				<ui-switch v-model="debug"> | ||||
| 					{{ $t('debug-mode') }}<span slot="desc">{{ $t('debug-mode-desc') }}</span> | ||||
| 					{{ $t('debug-mode') }}<template #desc>{{ $t('debug-mode-desc') }}</template> | ||||
| 				</ui-switch> | ||||
| 				<ui-switch v-model="enableExperimentalFeatures"> | ||||
| 					{{ $t('experimental') }}<span slot="desc">{{ $t('experimental-desc') }}</span> | ||||
| 					{{ $t('experimental') }}<template #desc>{{ $t('experimental-desc') }}</template> | ||||
| 				</ui-switch> | ||||
| 			</section> | ||||
| 		</ui-card> | ||||
| @@ -275,7 +275,7 @@ import XApiSettings from '../../../common/views/components/api-settings.vue'; | ||||
| import XLanguageSettings from '../../../common/views/components/language-settings.vue'; | ||||
| import XNotificationSettings from '../../../common/views/components/notification-settings.vue'; | ||||
|  | ||||
| import { url, clientVersion as version } from '../../../config'; | ||||
| import { url, version } from '../../../config'; | ||||
| import checkForUpdate from '../../../common/scripts/check-for-update'; | ||||
|  | ||||
| export default Vue.extend({ | ||||
|   | ||||
| @@ -30,6 +30,10 @@ export default Vue.extend({ | ||||
| 			type: Boolean, | ||||
| 			default: false | ||||
| 		}, | ||||
| 		expanded: { | ||||
| 			type: Boolean, | ||||
| 			default: true | ||||
| 		}, | ||||
| 	}, | ||||
| 	inject: { | ||||
| 		inDeck: { | ||||
| @@ -38,8 +42,13 @@ export default Vue.extend({ | ||||
| 	}, | ||||
| 	data() { | ||||
| 		return { | ||||
| 			showBody: true | ||||
| 			showBody: this.expanded | ||||
| 		}; | ||||
| 	}, | ||||
| 	methods: { | ||||
| 		toggleContent(show: boolean) { | ||||
| 			this.showBody = show; | ||||
| 		} | ||||
| 	} | ||||
| }); | ||||
| </script> | ||||
|   | ||||
| @@ -63,7 +63,7 @@ | ||||
| 				<li @click="toggleDeckMode"> | ||||
| 					<p> | ||||
| 						<span>{{ $t('@.deck') }}</span> | ||||
| 						<template v-if="$store.state.device.deckMode"><i><fa :icon="faHome"/></i></template> | ||||
| 						<template v-if="$store.state.device.inDeckMode"><i><fa :icon="faHome"/></i></template> | ||||
| 						<template v-else><i><fa :icon="faColumns"/></i></template> | ||||
| 					</p> | ||||
| 				</li> | ||||
| @@ -165,8 +165,8 @@ export default Vue.extend({ | ||||
| 			}); | ||||
| 		}, | ||||
| 		toggleDeckMode() { | ||||
| 			this.$store.commit('device/set', { key: 'deckMode', value: !this.$store.state.device.deckMode }); | ||||
| 			location.reload(); | ||||
| 			this.$store.commit('device/set', { key: 'deckMode', value: !this.$store.state.device.inDeckMode }); | ||||
| 			location.replace('/'); | ||||
| 		}, | ||||
| 	} | ||||
| }); | ||||
|   | ||||
| @@ -1,13 +1,13 @@ | ||||
| <template> | ||||
| <div class="nav"> | ||||
| 	<ul> | ||||
| 		<li v-if="!$store.state.device.deckMode" class="timeline" :class="{ active: $route.name == 'index' }" @click="goToTop"> | ||||
| 		<li class="timeline" :class="{ active: $route.name == 'index' }" @click="goToTop"> | ||||
| 			<router-link to="/"><fa icon="home"/><p>{{ $t('@.timeline') }}</p></router-link> | ||||
| 		</li> | ||||
| 		<li class="featured" :class="{ active: $route.name == 'featured' }"> | ||||
| 			<router-link to="/featured"><fa :icon="faNewspaper"/><p>{{ $t('@.featured-notes') }}</p></router-link> | ||||
| 		</li> | ||||
| 		<li class="explore" :class="{ active: $route.name == 'explore' }"> | ||||
| 		<li class="explore" :class="{ active: $route.name == 'explore' || $route.name == 'explore-tag' }"> | ||||
| 			<router-link to="/explore"><fa :icon="faHashtag"/><p>{{ $t('@.explore') }}</p></router-link> | ||||
| 		</li> | ||||
| 		<li class="game"> | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| <template> | ||||
| <div class="header" :style="style"> | ||||
| 	<p class="warn" v-if="env != 'production'">{{ $t('@.do-not-use-in-production') }}</p> | ||||
| 	<p class="warn" v-if="env != 'production'">{{ $t('@.do-not-use-in-production') }} <a href="/assets/flush.html?force">Flush</a></p> | ||||
| 	<div class="main" ref="main"> | ||||
| 		<div class="backdrop"></div> | ||||
| 		<div class="main"> | ||||
|   | ||||
| @@ -6,15 +6,13 @@ | ||||
| 		</div> | ||||
|  | ||||
| 		<div class="nav" v-if="$store.getters.isSignedIn"> | ||||
| 			<template v-if="!$store.state.device.deckMode"> | ||||
| 				<div class="home" :class="{ active: $route.name == 'index' }" @click="goToTop"> | ||||
| 					<router-link to="/"><fa icon="home"/></router-link> | ||||
| 				</div> | ||||
| 			</template> | ||||
| 			<div class="home" :class="{ active: $route.name == 'index' }" @click="goToTop"> | ||||
| 				<router-link to="/"><fa icon="home"/></router-link> | ||||
| 			</div> | ||||
| 			<div class="featured" :class="{ active: $route.name == 'featured' }"> | ||||
| 				<router-link to="/featured"><fa :icon="faNewspaper"/></router-link> | ||||
| 			</div> | ||||
| 			<div class="explore" :class="{ active: $route.name == 'explore' }"> | ||||
| 			<div class="explore" :class="{ active: $route.name == 'explore' || $route.name == 'explore-tag' }"> | ||||
| 				<router-link to="/explore"><fa :icon="faHashtag"/></router-link> | ||||
| 			</div> | ||||
| 			<div class="game"> | ||||
| @@ -50,7 +48,7 @@ | ||||
| 				</router-link> | ||||
| 			</div> | ||||
| 			<div> | ||||
| 				<template v-if="$store.state.device.deckMode"> | ||||
| 				<template v-if="$store.state.device.inDeckMode"> | ||||
| 					<a @click="toggleDeckMode(false)"><fa icon="home"/></a> | ||||
| 				</template> | ||||
| 				<template v-else> | ||||
| @@ -122,7 +120,7 @@ export default Vue.extend({ | ||||
| 	methods: { | ||||
| 		toggleDeckMode(deck) { | ||||
| 			this.$store.commit('device/set', { key: 'deckMode', value: deck }); | ||||
| 			location.reload(); | ||||
| 			location.replace('/'); | ||||
| 		}, | ||||
|  | ||||
| 		onReversiInvited() { | ||||
|   | ||||
| @@ -1,85 +0,0 @@ | ||||
| <template> | ||||
| <div class="zvdbznxvfixtmujpsigoccczftvpiwqh"> | ||||
| 	<div class="banner" :style="bannerStyle"></div> | ||||
| 	<mk-avatar class="avatar" :user="user" :disable-preview="true"/> | ||||
| 	<mk-follow-button v-if="$store.getters.isSignedIn && user.id != $store.state.i.id" :user="user" class="follow" mini/> | ||||
| 	<div class="body"> | ||||
| 		<router-link :to="user | userPage" class="name"> | ||||
| 			<mk-user-name :user="user"/> | ||||
| 		</router-link> | ||||
| 		<span class="username">@{{ user | acct }} <fa v-if="user.isLocked == true" class="locked" icon="lock" fixed-width/></span> | ||||
|  | ||||
| 		<div class="description"> | ||||
| 			<mfm v-if="user.description" :text="user.description" :author="user" :i="$store.state.i" :custom-emojis="user.emojis"/> | ||||
| 		</div> | ||||
| 	</div> | ||||
| </div> | ||||
| </template> | ||||
|  | ||||
| <script lang="ts"> | ||||
| import Vue from 'vue'; | ||||
|  | ||||
| export default Vue.extend({ | ||||
| 	props: ['user'], | ||||
|  | ||||
| 	computed: { | ||||
| 		bannerStyle(): any { | ||||
| 			if (this.user.bannerUrl == null) return {}; | ||||
| 			return { | ||||
| 				backgroundColor: this.user.bannerColor && this.user.bannerColor.length == 3 ? `rgb(${ this.user.bannerColor.join(',') })` : null, | ||||
| 				backgroundImage: `url(${ this.user.bannerUrl })` | ||||
| 			}; | ||||
| 		} | ||||
| 	}, | ||||
| }); | ||||
| </script> | ||||
|  | ||||
| <style lang="stylus" scoped> | ||||
| .zvdbznxvfixtmujpsigoccczftvpiwqh | ||||
| 	$bg = var(--face) | ||||
|  | ||||
| 	height 280px | ||||
| 	overflow hidden | ||||
| 	font-size 13px | ||||
| 	background $bg | ||||
| 	box-shadow 0 2px 4px rgba(0, 0, 0, 0.1) | ||||
| 	color var(--faceText) | ||||
|  | ||||
| 	> .banner | ||||
| 		height 90px | ||||
| 		background-color #f9f4f4 | ||||
| 		background-position center | ||||
| 		background-size cover | ||||
|  | ||||
| 	> .avatar | ||||
| 		display block | ||||
| 		margin -40px 0 0 16px | ||||
| 		width 80px | ||||
| 		height 80px | ||||
| 		border-radius 100% | ||||
| 		border solid 4px $bg | ||||
|  | ||||
| 	> .follow | ||||
| 		position absolute | ||||
| 		top 16px | ||||
| 		right 16px | ||||
|  | ||||
| 	> .body | ||||
| 		padding 0px 24px | ||||
| 		margin-top -40px | ||||
|  | ||||
| 		> .name | ||||
| 			font-size 120% | ||||
| 			font-weight bold | ||||
|  | ||||
| 		> .username | ||||
| 			display block | ||||
| 			opacity 0.7 | ||||
|  | ||||
| 			> .locked | ||||
| 				opacity 0.8 | ||||
|  | ||||
| 		> .description | ||||
| 			margin 8px 0 16px 0 | ||||
|  | ||||
| </style> | ||||
| @@ -1,6 +1,10 @@ | ||||
| <template> | ||||
| <div> | ||||
| 	<mk-notes ref="timeline" :more="existMore ? more : null"/> | ||||
| 	<mk-notes ref="timeline" :make-promise="makePromise" @inited="() => $emit('loaded')"> | ||||
| 		<template #header> | ||||
| 			<slot></slot> | ||||
| 		</template> | ||||
| 	</mk-notes> | ||||
| </div> | ||||
| </template> | ||||
|  | ||||
| @@ -13,10 +17,28 @@ export default Vue.extend({ | ||||
| 	props: ['list'], | ||||
| 	data() { | ||||
| 		return { | ||||
| 			fetching: true, | ||||
| 			moreFetching: false, | ||||
| 			existMore: false, | ||||
| 			connection: null | ||||
| 			connection: null, | ||||
| 			makePromise: cursor => this.$root.api('notes/user-list-timeline', { | ||||
| 				listId: this.list.id, | ||||
| 				limit: fetchLimit + 1, | ||||
| 				untilId: cursor ? cursor : undefined, | ||||
| 				includeMyRenotes: this.$store.state.settings.showMyRenotes, | ||||
| 				includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes, | ||||
| 				includeLocalRenotes: this.$store.state.settings.showLocalRenotes | ||||
| 			}).then(notes => { | ||||
| 				if (notes.length == fetchLimit + 1) { | ||||
| 					notes.pop(); | ||||
| 					return { | ||||
| 						notes: notes, | ||||
| 						cursor: notes[notes.length - 1].id | ||||
| 					}; | ||||
| 				} else { | ||||
| 					return { | ||||
| 						notes: notes, | ||||
| 						cursor: null | ||||
| 					}; | ||||
| 				} | ||||
| 			}) | ||||
| 		}; | ||||
| 	}, | ||||
| 	watch: { | ||||
| @@ -37,63 +59,15 @@ export default Vue.extend({ | ||||
| 			this.connection.on('note', this.onNote); | ||||
| 			this.connection.on('userAdded', this.onUserAdded); | ||||
| 			this.connection.on('userRemoved', this.onUserRemoved); | ||||
|  | ||||
| 			this.fetch(); | ||||
| 		}, | ||||
| 		fetch() { | ||||
| 			this.fetching = true; | ||||
|  | ||||
| 			(this.$refs.timeline as any).init(() => new Promise((res, rej) => { | ||||
| 				this.$root.api('notes/user-list-timeline', { | ||||
| 					listId: this.list.id, | ||||
| 					limit: fetchLimit + 1, | ||||
| 					includeMyRenotes: this.$store.state.settings.showMyRenotes, | ||||
| 					includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes, | ||||
| 					includeLocalRenotes: this.$store.state.settings.showLocalRenotes | ||||
| 				}).then(notes => { | ||||
| 					if (notes.length == fetchLimit + 1) { | ||||
| 						notes.pop(); | ||||
| 						this.existMore = true; | ||||
| 					} | ||||
| 					res(notes); | ||||
| 					this.fetching = false; | ||||
| 					this.$emit('loaded'); | ||||
| 				}, rej); | ||||
| 			})); | ||||
| 		}, | ||||
| 		more() { | ||||
| 			this.moreFetching = true; | ||||
|  | ||||
| 			const promise = this.$root.api('notes/user-list-timeline', { | ||||
| 				listId: this.list.id, | ||||
| 				limit: fetchLimit + 1, | ||||
| 				untilId: (this.$refs.timeline as any).tail().id, | ||||
| 				includeMyRenotes: this.$store.state.settings.showMyRenotes, | ||||
| 				includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes, | ||||
| 				includeLocalRenotes: this.$store.state.settings.showLocalRenotes | ||||
| 			}); | ||||
|  | ||||
| 			promise.then(notes => { | ||||
| 				if (notes.length == fetchLimit + 1) { | ||||
| 					notes.pop(); | ||||
| 				} else { | ||||
| 					this.existMore = false; | ||||
| 				} | ||||
| 				for (const n of notes) (this.$refs.timeline as any).append(n); | ||||
| 				this.moreFetching = false; | ||||
| 			}); | ||||
|  | ||||
| 			return promise; | ||||
| 		}, | ||||
| 		onNote(note) { | ||||
| 			// Prepend a note | ||||
| 			(this.$refs.timeline as any).prepend(note); | ||||
| 		}, | ||||
| 		onUserAdded() { | ||||
| 			this.fetch(); | ||||
| 			(this.$refs.timeline as any).reload(); | ||||
| 		}, | ||||
| 		onUserRemoved() { | ||||
| 			this.fetch(); | ||||
| 			(this.$refs.timeline as any).reload(); | ||||
| 		} | ||||
| 	} | ||||
| }); | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| <template> | ||||
| <mk-window ref="window" width="450px" height="500px" @closed="destroyDom"> | ||||
| 	<span slot="header"><fa icon="list"/> {{ list.title }}</span> | ||||
| 	<template #header><fa icon="list"/> {{ list.title }}</template> | ||||
|  | ||||
| 	<x-editor :list="list"/> | ||||
| </mk-window> | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| <template> | ||||
| <mk-window ref="window" width="450px" height="500px" @closed="destroyDom"> | ||||
| 	<span slot="header"><fa icon="list"/> {{ $t('title') }}</span> | ||||
| 	<template #header><fa icon="list"/> {{ $t('title') }}</template> | ||||
|  | ||||
| 	<div class="xkxvokkjlptzyewouewmceqcxhpgzprp"> | ||||
| 		<button class="ui" @click="add">{{ $t('create-list') }}</button> | ||||
|   | ||||
| @@ -14,7 +14,7 @@ | ||||
| 			<template v-if="active"><fa icon="angle-up"/></template> | ||||
| 			<template v-else><fa icon="angle-down"/></template> | ||||
| 		</button> | ||||
| 		<slot name="header"></slot> | ||||
| 		<span><slot name="header"></slot></span> | ||||
| 		<span class="count" v-if="count > 0">({{ count }})</span> | ||||
| 		<button v-if="!isTemporaryColumn" class="menu" ref="menu" @click.stop="showMenu"><fa icon="caret-down"/></button> | ||||
| 		<button v-else class="close" @click.stop="close"><fa icon="times"/></button> | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| <template> | ||||
| <x-column :name="name" :column="column" :is-stacked="isStacked"> | ||||
| 	<span slot="header"><fa :icon="['far', 'envelope']"/>{{ name }}</span> | ||||
| 	<template #header><fa :icon="['far', 'envelope']"/>{{ name }}</template> | ||||
|  | ||||
| 	<x-direct/> | ||||
| </x-column> | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| <template> | ||||
| <x-notes ref="timeline" :more="existMore ? more : null"/> | ||||
| <x-notes ref="timeline" :make-promise="makePromise" @inited="() => $emit('loaded')"/> | ||||
| </template> | ||||
|  | ||||
| <script lang="ts"> | ||||
| @@ -13,23 +13,36 @@ export default Vue.extend({ | ||||
| 		XNotes | ||||
| 	}, | ||||
|  | ||||
| 	props: { | ||||
| 	}, | ||||
|  | ||||
| 	data() { | ||||
| 		return { | ||||
| 			fetching: true, | ||||
| 			moreFetching: false, | ||||
| 			existMore: false, | ||||
| 			connection: null | ||||
| 			connection: null, | ||||
| 			makePromise: cursor => this.$root.api('notes/mentions', { | ||||
| 				limit: fetchLimit + 1, | ||||
| 				untilId: cursor ? cursor : undefined, | ||||
| 				includeMyRenotes: this.$store.state.settings.showMyRenotes, | ||||
| 				includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes, | ||||
| 				includeLocalRenotes: this.$store.state.settings.showLocalRenotes, | ||||
| 				visibility: 'specified' | ||||
| 			}).then(notes => { | ||||
| 				if (notes.length == fetchLimit + 1) { | ||||
| 					notes.pop(); | ||||
| 					return { | ||||
| 						notes: notes, | ||||
| 						cursor: notes[notes.length - 1].id | ||||
| 					}; | ||||
| 				} else { | ||||
| 					return { | ||||
| 						notes: notes, | ||||
| 						cursor: null | ||||
| 					}; | ||||
| 				} | ||||
| 			}) | ||||
| 		}; | ||||
| 	}, | ||||
|  | ||||
| 	mounted() { | ||||
| 		this.connection = this.$root.stream.useSharedConnection('main'); | ||||
| 		this.connection.on('mention', this.onNote); | ||||
|  | ||||
| 		this.fetch(); | ||||
| 	}, | ||||
|  | ||||
| 	beforeDestroy() { | ||||
| @@ -37,55 +50,6 @@ export default Vue.extend({ | ||||
| 	}, | ||||
|  | ||||
| 	methods: { | ||||
| 		fetch() { | ||||
| 			this.fetching = true; | ||||
|  | ||||
| 			(this.$refs.timeline as any).init(() => new Promise((res, rej) => { | ||||
| 				this.$root.api('notes/mentions', { | ||||
| 					limit: fetchLimit + 1, | ||||
| 					includeMyRenotes: this.$store.state.settings.showMyRenotes, | ||||
| 					includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes, | ||||
| 					includeLocalRenotes: this.$store.state.settings.showLocalRenotes, | ||||
| 					visibility: 'specified' | ||||
| 				}).then(notes => { | ||||
| 					if (notes.length == fetchLimit + 1) { | ||||
| 						notes.pop(); | ||||
| 						this.existMore = true; | ||||
| 					} | ||||
| 					res(notes); | ||||
| 					this.fetching = false; | ||||
| 					this.$emit('loaded'); | ||||
| 				}, rej); | ||||
| 			})); | ||||
| 		}, | ||||
|  | ||||
| 		more() { | ||||
| 			this.moreFetching = true; | ||||
|  | ||||
| 			const promise = this.$root.api('notes/mentions', { | ||||
| 				limit: fetchLimit + 1, | ||||
| 				untilId: (this.$refs.timeline as any).tail().id, | ||||
| 				includeMyRenotes: this.$store.state.settings.showMyRenotes, | ||||
| 				includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes, | ||||
| 				includeLocalRenotes: this.$store.state.settings.showLocalRenotes, | ||||
| 				visibility: 'specified' | ||||
| 			}); | ||||
|  | ||||
| 			promise.then(notes => { | ||||
| 				if (notes.length == fetchLimit + 1) { | ||||
| 					notes.pop(); | ||||
| 				} else { | ||||
| 					this.existMore = false; | ||||
| 				} | ||||
| 				for (const n of notes) { | ||||
| 					(this.$refs.timeline as any).append(n); | ||||
| 				} | ||||
| 				this.moreFetching = false; | ||||
| 			}); | ||||
|  | ||||
| 			return promise; | ||||
| 		}, | ||||
|  | ||||
| 		onNote(note) { | ||||
| 			// Prepend a note | ||||
| 			if (note.visibility == 'specified') { | ||||
|   | ||||
| @@ -1,11 +1,11 @@ | ||||
| <template> | ||||
| <x-column> | ||||
| 	<span slot="header"> | ||||
| 	<template #header> | ||||
| 		<fa :icon="faHashtag"/>{{ $t('@.explore') }} | ||||
| 	</span> | ||||
| 	</template> | ||||
|  | ||||
| 	<div> | ||||
| 		<x-explore/> | ||||
| 		<x-explore v-bind="$attrs"/> | ||||
| 	</div> | ||||
| </x-column> | ||||
| </template> | ||||
|   | ||||
| @@ -1,11 +1,11 @@ | ||||
| <template> | ||||
| <x-column> | ||||
| 	<span slot="header"> | ||||
| 	<template #header> | ||||
| 		<fa :icon="['fa', 'star']"/>{{ $t('favorites') }} | ||||
| 	</span> | ||||
| 	</template> | ||||
|  | ||||
| 	<div> | ||||
| 		<x-notes ref="timeline" :more="existMore ? more : null"/> | ||||
| 		<x-notes ref="timeline" :make-promise="makePromise" @inited="() => $emit('loaded')"/> | ||||
| 	</div> | ||||
| </x-column> | ||||
| </template> | ||||
| @@ -28,58 +28,28 @@ export default Vue.extend({ | ||||
|  | ||||
| 	data() { | ||||
| 		return { | ||||
| 			fetching: true, | ||||
| 			moreFetching: false, | ||||
| 			existMore: false, | ||||
| 			makePromise: cursor => this.$root.api('i/favorites', { | ||||
| 				limit: fetchLimit + 1, | ||||
| 				untilId: cursor ? cursor : undefined, | ||||
| 			}).then(notes => { | ||||
| 				notes = notes.map(x => x.note); | ||||
| 				if (notes.length == fetchLimit + 1) { | ||||
| 					notes.pop(); | ||||
| 					return { | ||||
| 						notes: notes, | ||||
| 						cursor: notes[notes.length - 1].id | ||||
| 					}; | ||||
| 				} else { | ||||
| 					return { | ||||
| 						notes: notes, | ||||
| 						cursor: null | ||||
| 					}; | ||||
| 				} | ||||
| 			}) | ||||
| 		}; | ||||
| 	}, | ||||
|  | ||||
| 	mounted() { | ||||
| 		this.fetch(); | ||||
| 	}, | ||||
|  | ||||
| 	methods: { | ||||
| 		fetch() { | ||||
| 			this.fetching = true; | ||||
|  | ||||
| 			(this.$refs.timeline as any).init(() => new Promise((res, rej) => { | ||||
| 				this.$root.api('i/favorites', { | ||||
| 					limit: fetchLimit + 1, | ||||
| 				}).then(notes => { | ||||
| 					if (notes.length == fetchLimit + 1) { | ||||
| 						notes.pop(); | ||||
| 						this.existMore = true; | ||||
| 					} | ||||
| 					res(notes.map(x => x.note)); | ||||
| 					this.fetching = false; | ||||
| 					this.$emit('loaded'); | ||||
| 				}, rej); | ||||
| 			})); | ||||
| 		}, | ||||
|  | ||||
| 		more() { | ||||
| 			this.moreFetching = true; | ||||
|  | ||||
| 			const promise = this.$root.api('i/favorites', { | ||||
| 				limit: fetchLimit + 1, | ||||
| 				untilId: (this.$refs.timeline as any).tail().id, | ||||
| 			}); | ||||
|  | ||||
| 			promise.then(notes => { | ||||
| 				if (notes.length == fetchLimit + 1) { | ||||
| 					notes.pop(); | ||||
| 				} else { | ||||
| 					this.existMore = false; | ||||
| 				} | ||||
| 				for (const n of notes) { | ||||
| 					(this.$refs.timeline as any).append(n); | ||||
| 				} | ||||
| 				this.moreFetching = false; | ||||
| 			}); | ||||
|  | ||||
| 			return promise; | ||||
| 		}, | ||||
|  | ||||
| 		focus() { | ||||
| 			this.$refs.timeline.focus(); | ||||
| 		} | ||||
|   | ||||
| @@ -1,11 +1,11 @@ | ||||
| <template> | ||||
| <x-column> | ||||
| 	<span slot="header"> | ||||
| 	<template #header> | ||||
| 		<fa :icon="faNewspaper"/>{{ $t('@.featured-notes') }} | ||||
| 	</span> | ||||
| 	</template> | ||||
|  | ||||
| 	<div> | ||||
| 		<x-notes ref="timeline" :more="null"/> | ||||
| 		<x-notes ref="timeline" :make-promise="makePromise" @inited="() => $emit('loaded')"/> | ||||
| 	</div> | ||||
| </x-column> | ||||
| </template> | ||||
| @@ -27,31 +27,17 @@ export default Vue.extend({ | ||||
|  | ||||
| 	data() { | ||||
| 		return { | ||||
| 			fetching: true, | ||||
| 			faNewspaper | ||||
| 			faNewspaper, | ||||
| 			makePromise: cursor => this.$root.api('notes/featured', { | ||||
| 				limit: 20, | ||||
| 			}).then(notes => { | ||||
| 				notes.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()); | ||||
| 				return notes; | ||||
| 			}) | ||||
| 		}; | ||||
| 	}, | ||||
|  | ||||
| 	mounted() { | ||||
| 		this.fetch(); | ||||
| 	}, | ||||
|  | ||||
| 	methods: { | ||||
| 		fetch() { | ||||
| 			this.fetching = true; | ||||
|  | ||||
| 			(this.$refs.timeline as any).init(() => new Promise((res, rej) => { | ||||
| 				this.$root.api('notes/featured', { | ||||
| 					limit: 20, | ||||
| 				}).then(notes => { | ||||
| 					notes.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()); | ||||
| 					res(notes); | ||||
| 					this.fetching = false; | ||||
| 					this.$emit('loaded'); | ||||
| 				}, rej); | ||||
| 			})); | ||||
| 		}, | ||||
|  | ||||
| 		focus() { | ||||
| 			this.$refs.timeline.focus(); | ||||
| 		} | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| <template> | ||||
| <x-column> | ||||
| 	<span slot="header"> | ||||
| 	<template #header> | ||||
| 		<fa icon="hashtag"/><span>{{ tag }}</span> | ||||
| 	</span> | ||||
| 	</template> | ||||
|  | ||||
| 	<div class="xroyrflcmhhtmlwmyiwpfqiirqokfueb"> | ||||
| 		<div ref="chart" class="chart"></div> | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user