diff --git a/CHANGELOG.md b/CHANGELOG.md index e15c6d646..d5fa7adfd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,14 @@ --> +## 12.x.x (unreleased) + +### Improvements +- クライアント: ノートプレビューの精度を改善 + +### Bugfixes +- クライアント: 一部のコンポーネントが裏に隠れるのを修正 + ## 12.100.2 (2021/12/18) ### Bugfixes diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index fe3df853b..633995c94 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -87,7 +87,7 @@ Configuration files are located in [`/.github/workflows`](/.github/workflows). ## Vue Misskey uses Vue(v3) as its front-end framework. -**When creating a new component, please use the Composition API instead of the Options API.** +**When creating a new component, please use the Composition API (and [setup sugar](https://v3.vuejs.org/api/sfc-script-setup.html)) instead of the Options API.** Some of the existing components are implemented in the Options API, but it is an old implementation. Refactors that migrate those components to the Composition API are also welcome. ## Adding MisskeyRoom items diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 72c20819e..62aade568 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -448,6 +448,7 @@ uiLanguage: "UIの表示言語" groupInvited: "グループに招待されました" aboutX: "{x}について" useOsNativeEmojis: "OSネイティブの絵文字を使用" +disableDrawer: "メニューをドロワーで表示しない" youHaveNoGroups: "グループがありません" joinOrCreateGroup: "既存のグループに招待してもらうか、新しくグループを作成してください。" noHistory: "履歴はありません" @@ -613,7 +614,6 @@ regenerateLoginToken: "ログイントークンを再生成" regenerateLoginTokenDescription: "ログインに使用される内部トークンを再生成します。通常この操作を行う必要はありません。再生成すると、全てのデバイスでログアウトされます。" setMultipleBySeparatingWithSpace: "スペースで区切って複数設定できます。" fileIdOrUrl: "ファイルIDまたはURL" -chatOpenBehavior: "チャットを開くときの動作" behavior: "動作" sample: "サンプル" abuseReports: "通報" @@ -818,6 +818,7 @@ leaveGroup: "グループから抜ける" leaveGroupConfirm: "「{name}」から抜けますか?" useDrawerReactionPickerForMobile: "モバイルデバイスのときドロワーで表示" welcomeBackWithName: "おかえりなさい、{name}さん" +clickToFinishEmailVerification: "[{ok}]を押して、メールアドレスの確認を完了してください。" _emailUnavailable: used: "既に使用されています" diff --git a/locales/ja-NYA.yml b/locales/ja-NYA.yml new file mode 100644 index 000000000..2446f7d23 --- /dev/null +++ b/locales/ja-NYA.yml @@ -0,0 +1,1779 @@ +_lang_: "日本語(にゃ)" + +headlineMisskey: "ノートでつながるネットワークにゃ!" +introMisskey: "ようこそ!Misskeyは、オープンソースの分散型マイクロブログサービスにゃにゃ。\n「ノート」を作成して、いま起こっていることを共有したり、あなたについて皆に発信しようにゃ📡\n「リアクション」機能で、皆のノートに素早く反応を追加するにゃこともできるにゃ👍\n新しい世界を探検しようにゃ!🚀" +monthAndDay: "{month}月 {day}日" +search: "検索" +notifications: "通知" +username: "ユーザー名" +password: "パスワード" +forgotPassword: "パスワードを忘れた" +fetchingAsApObject: "連合に照会中にゃ" +ok: "OK" +gotIt: "わかった" +cancel: "キャンセル! +enterUsername: "ユーザー名を入力" +renotedBy: "{user}がRenote" +noNotes: "ノートはないにゃ" +noNotifications: "通知はないにゃ" +instance: "インスタンス" +settings: "設定" +basicSettings: "基本設定" +otherSettings: "その他の設定" +openInWindow: "ウィンドウで開く" +profile: "プロフィール" +timeline: "タイムライン" +noAccountDescription: "自己紹介はないにゃ" +login: "ログイン" +loggingIn: "ログイン中" +logout: "ログアウト" +signup: "新規登録" +uploading: "アップロード中" +save: "保存" +users: "ユーザー" +addUser: "ユーザーを追加" +favorite: "お気に入り" +favorites: "お気に入り" +unfavorite: "お気に入り解除" +favorited: "お気に入りに登録したにゃ。" +alreadyFavorited: "既にお気に入りに登録されているにゃ。" +cantFavorite: "お気に入りに登録できなかったにゃ。" +pin: "ピン留め" +unpin: "ピン留め解除" +copyContent: "内容をコピー" +copyLink: "リンクをコピー" +delete: "削除" +deleteAndEdit: "削除して編集" +deleteAndEditConfirm: "このノートを削除してもう一度編集するにゃ?このノートへのリアクション、Renote、返信も全て削除されるにゃ。" +addToList: "リストに追加" +sendMessage: "メッセージを送信" +copyUsername: "ユーザー名をコピー" +searchUser: "ユーザーを検索" +reply: "返信" +loadMore: "もっと見る" +showMore: "もっと見る" +youGotNewFollower: "フォローされたにゃ" +receiveFollowRequest: "フォローリクエストされたにゃ" +followRequestAccepted: "フォローが承認されたにゃ" +mention: "メンション" +mentions: "あなた宛て" +directNotes: "ダイレクト投稿" +importAndExport: "インポートとエクスポート" +import: "インポート" +export: "エクスポート" +files: "ファイル" +download: "ダウンロード" +driveFileDeleteConfirm: "ファイル「{name}」を削除するにゃ?このファイルを添付したノートも消えるにゃ。" +unfollowConfirm: "{name}のフォローを解除するにゃ?" +exportRequested: "エクスポートをリクエストしたにゃ。これには時間がかかる場合があるにゃ。エクスポートが終わると、「ドライブ」に追加されるにゃ。" +importRequested: "インポートをリクエストしたにゃ。これには時間がかかる場合があるにゃ。" +lists: "リスト" +noLists: "リストはないにゃ" +note: "ノート" +notes: "ノート" +following: "フォロー" +followers: "フォロワー" +followsYou: "フォローされてるにゃ。" +createList: "リスト作成" +manageLists: "リストの管理" +error: "エラー" +somethingHappened: "問題が発生したにゃ" +retry: "再試行" +pageLoadError: "ページの読み込みに失敗したにゃ。" +pageLoadErrorDescription: "これは通常、ネットワークまたはブラウザキャッシュが原因にゃにゃ。キャッシュをクリアするにゃか、しばらく待ってから再度試してにゃ。" +serverIsDead: "サーバーの応答がないにゃ。しばらく待ってから再度試してにゃ。" +youShouldUpgradeClient: "このページを表示するにゃためには、リロードして新しいバージョンのクライアントをご利用くださいにゃ。" +enterListName: "リスト名を入力" +privacy: "プライバシー" +makeFollowManuallyApprove: "フォローを承認制にするにゃ" +defaultNoteVisibility: "デフォルトの公開範囲" +follow: "フォロー" +followRequest: "フォロー申請" +followRequests: "フォロー申請" +unfollow: "フォロー解除" +followRequestPending: "フォロー許可待ち" +enterEmoji: "絵文字を入力" +renote: "Renote" +unrenote: "Renote解除" +renoted: "Renoteしたにゃ。" +cantRenote: "この投稿はRenoteできないにゃ。" +cantReRenote: "RenoteをRenoteするにゃことはできないにゃ。" +quote: "引用" +pinnedNote: "ピン留めされたノート" +pinned: "ピン留め" +you: "あなた" +clickToShow: "クリックして表示" +sensitive: "閲覧注意" +add: "追加" +reaction: "リアクション" +reactionSettingDescription: "リアクションピッカーに表示するにゃリアクションを設定するにゃ。" +reactionSettingDescription2: "ドラッグして並び替え、クリックして削除、+を押して追加するにゃ。" +rememberNoteVisibility: "公開範囲を記憶するにゃ" +attachCancel: "添付取り消し" +markAsSensitive: "閲覧注意にするにゃ" +unmarkAsSensitive: "閲覧注意を解除するにゃ" +enterFileName: "ファイル名を入力" +mute: "ミュート" +unmute: "ミュート解除" +block: "ブロック" +unblock: "ブロック解除" +suspend: "凍結" +unsuspend: "解凍" +blockConfirm: "ブロックするにゃ?" +unblockConfirm: "ブロック解除するにゃ?" +suspendConfirm: "凍結するにゃ?" +unsuspendConfirm: "解凍するにゃ?" +selectList: "リストを選択" +selectAntenna: "アンテナを選択" +selectWidget: "ウィジェットを選択" +editWidgets: "ウィジェットを編集" +editWidgetsExit: "編集を終了" +customEmojis: "カスタム絵文字" +emoji: "絵文字" +emojis: "絵文字" +emojiName: "絵文字名" +emojiUrl: "絵文字画像URL" +addEmoji: "絵文字を追加" +settingGuide: "おすすめ設定" +cacheRemoteFiles: "リモートのファイルをキャッシュするにゃ" +cacheRemoteFilesDescription: "この設定を無効にするにゃと、リモートファイルをキャッシュせず直リンクするにゃようになるにゃ。サーバーのストレージを節約できますが、サムネイルが生成されないので通信量が増加するにゃ。" +flagAsBot: "Botとして設定" +flagAsBotDescription: "このアカウントがプログラムによって運用される場合は、このフラグをオンにするにゃ。オンにするにゃと、反応の連鎖を防ぐためのフラグとして他の開発者に役立ったり、Misskeyのシステム上での扱いがBotに合ったものになるにゃ。" +flagAsCat: "Catとして設定" +flagAsCatDescription: "このアカウントが猫であることを示す場合は、このフラグをオンにするにゃ。" +autoAcceptFollowed: "フォロー中ユーザーからのフォロリクを自動承認" +addAccount: "アカウントを追加" +loginFailed: "ログインに失敗したにゃ" +showOnRemote: "リモートで表示" +general: "全般" +wallpaper: "壁紙" +setWallpaper: "壁紙を設定" +removeWallpaper: "壁紙を削除" +searchWith: "検索: {q}" +youHaveNoLists: "リストがないにゃ" +followConfirm: "{name}をフォローするにゃ?" +proxyAccount: "プロキシアカウント" +proxyAccountDescription: "プロキシアカウントは、特定の条件下でユーザーのリモートフォローを代行するにゃアカウントにゃ。例えば、ユーザーがリモートユーザーをリストに入れたとき、リストに入れられたユーザーを誰もフォローしていないとアクティビティがインスタンスに配達されないため、代わりにプロキシアカウントがフォローするにゃようにするにゃ。" +host: "ホスト" +selectUser: "ユーザーを選択" +recipient: "宛先" +annotation: "注釈" +federation: "連合" +instances: "インスタンス" +registeredAt: "初観測" +latestRequestSentAt: "直近のリクエスト送信" +latestRequestReceivedAt: "直近のリクエスト受信" +latestStatus: "直近のステータス" +storageUsage: "ストレージ使用量" +charts: "チャート" +perHour: "1時間ごと" +perDay: "1日ごと" +stopActivityDelivery: "アクティビティの配送を停止" +blockThisInstance: "このインスタンスをブロック" +operations: "操作" +software: "ソフトウェア" +version: "バージョン" +metadata: "メタデータ" +withNFiles: "{n}つのファイル" +monitor: "モニター" +jobQueue: "ジョブキュー" +cpuAndMemory: "CPUとメモリ" +network: "ネットワーク" +disk: "ディスク" +instanceInfo: "インスタンス情報" +statistics: "統計" +clearQueue: "キューをクリア" +clearQueueConfirmTitle: "キューをクリアするにゃ?" +clearQueueConfirmText: "未配達の投稿は配送されなくなるにゃ。通常この操作を行う必要はないにゃ。" +clearCachedFiles: "キャッシュをクリア" +clearCachedFilesConfirm: "キャッシュされたリモートファイルをすべて削除するにゃ?" +blockedInstances: "ブロックしたインスタンス" +blockedInstancesDescription: "ブロックしたいインスタンスのホストを改行で区切って設定するにゃ。ブロックされたインスタンスは、このインスタンスとやり取りできなくなるにゃ。" +muteAndBlock: "ミュートとブロック" +mutedUsers: "ミュートしたユーザー" +blockedUsers: "ブロックしたユーザー" +noUsers: "ユーザーはいないにゃ" +editProfile: "プロフィールを編集" +noteDeleteConfirm: "このノートを削除するにゃ?" +pinLimitExceeded: "これ以上ピン留めできないにゃ" +intro: "Misskeyのインストールが完了したにゃ!管理者アカウントを作成しましょうにゃ。" +done: "完了" +processing: "処理中" +preview: "プレビュー" +default: "デフォルト" +noCustomEmojis: "絵文字はないにゃ" +noJobs: "ジョブはないにゃ" +federating: "連合中" +blocked: "ブロック中" +suspended: "配信停止" +all: "全て" +subscribing: "購読中" +publishing: "配信中" +notResponding: "応答なし" +instanceFollowing: "インスタンスのフォロー" +instanceFollowers: "インスタンスのフォロワー" +instanceUsers: "インスタンスのユーザー" +changePassword: "パスワードを変更" +security: "セキュリティ" +retypedNotMatch: "入力が一致しないにゃ。" +currentPassword: "現在のパスワード" +newPassword: "新しいパスワード" +newPasswordRetype: "新しいパスワード(再入力)" +attachFile: "ファイルを添付" +more: "もっと!" +featured: "ハイライト" +usernameOrUserId: "ユーザー名かユーザーID" +noSuchUser: "ユーザーが見つからないにゃ" +lookup: "照会" +announcements: "お知らせ" +imageUrl: "画像URL" +remove: "削除" +removed: "削除したにゃ" +removeAreYouSure: "「{x}」を削除するにゃ?" +deleteAreYouSure: "「{x}」を削除するにゃ?" +resetAreYouSure: "リセットするにゃ?" +saved: "保存したにゃ" +messaging: "チャット" +upload: "アップロード" +fromDrive: "ドライブから" +fromUrl: "URLから" +uploadFromUrl: "URLアップロード" +uploadFromUrlDescription: "アップロードしたいファイルのURL" +uploadFromUrlRequested: "アップロードをリクエストしたにゃ" +uploadFromUrlMayTakeTime: "アップロードが完了するにゃまで時間がかかる場合があるにゃ。" +explore: "みつける" +games: "Misskey Games" +messageRead: "既読" +noMoreHistory: "これより過去の履歴はないにゃ" +startMessaging: "チャットを開始" +nUsersRead: "{n}人が読んだにゃ" +agreeTo: "{0}に同意" +tos: "利用規約" +start: "始める" +home: "ホーム" +remoteUserCaution: "リモートユーザーのため、情報が不完全にゃ。" +activity: "アクティビティ" +images: "画像" +birthday: "誕生日" +yearsOld: "{age}歳" +registeredDate: "登録日" +location: "場所" +theme: "テーマ" +themeForLightMode: "ライトモードで使うテーマ" +themeForDarkMode: "ダークモードで使うテーマ" +light: "ライト" +dark: "ダーク" +lightThemes: "明るいテーマ" +darkThemes: "暗いテーマ" +syncDeviceDarkMode: "デバイスのダークモードと同期するにゃ" +drive: "ドライブ" +fileName: "ファイル名" +selectFile: "ファイルを選択" +selectFiles: "ファイルを選択" +selectFolder: "フォルダーを選択" +selectFolders: "フォルダーを選択" +renameFile: "ファイル名を変更" +folderName: "フォルダー名" +createFolder: "フォルダーを作成" +renameFolder: "フォルダー名を変更" +deleteFolder: "フォルダーを削除" +addFile: "ファイルを追加" +emptyDrive: "ドライブは空にゃ" +emptyFolder: "フォルダーは空にゃ" +unableToDelete: "削除できません" +inputNewFileName: "新しいファイル名を入力してくださいにゃ" +inputNewDescription: "新しいキャプションを入力してくださいにゃ" +inputNewFolderName: "新しいフォルダ名を入力してくださいにゃ" +circularReferenceFolder: "移動先のフォルダーは、移動するにゃフォルダーのサブフォルダーにゃ。" +hasChildFilesOrFolders: "このフォルダは空でないため、削除できないにゃ。" +copyUrl: "URLをコピー" +rename: "名前を変更" +avatar: "アイコン" +banner: "バナー" +nsfw: "閲覧注意" +whenServerDisconnected: "サーバーとの接続が失われたとき" +disconnectedFromServer: "サーバーから切断されたにゃ" +reload: "リロード" +doNothing: "なにもしない" +reloadConfirm: "リロードするにゃ?" +watch: "ウォッチ" +unwatch: "ウォッチ解除" +accept: "許可" +reject: "拒否" +normal: "正常" +instanceName: "インスタンス名" +instanceDescription: "インスタンスの紹介" +maintainerName: "管理者の名前" +maintainerEmail: "管理者のメールアドレス" +tosUrl: "利用規約URL" +thisYear: "今年" +thisMonth: "今月" +today: "今日" +dayX: "{day}日" +monthX: "{month}月" +yearX: "{year}年" +pages: "ページ" +integration: "連携" +connectService: "接続するにゃ" +disconnectService: "切断するにゃ" +enableLocalTimeline: "ローカルタイムラインを有効にするにゃ" +enableGlobalTimeline: "グローバルタイムラインを有効にするにゃ" +disablingTimelinesInfo: "これらのタイムラインを無効化しても、利便性のため管理者およびモデレーターは引き続き利用するにゃことができるにゃ。" +registration: "登録" +enableRegistration: "誰でも新規登録できるようにするにゃ" +invite: "招待" +proxyRemoteFiles: "リモートのファイルをプロキシするにゃ" +proxyRemoteFilesDescription: "この設定を有効にするにゃと、未保存または保存容量超過で削除されたリモートファイルをローカルでプロキシし、サムネイルも生成するにゃようになるにゃ。サーバーのストレージには影響しないにゃ、" +driveCapacityPerLocalAccount: "ローカルユーザーひとりあたりのドライブ容量" +driveCapacityPerRemoteAccount: "リモートユーザーひとりあたりのドライブ容量" +inMb: "メガバイト単位" +iconUrl: "アイコン画像のURL (faviconなど)" +bannerUrl: "バナー画像のURL" +backgroundImageUrl: "背景画像のURL" +basicInfo: "基本情報" +pinnedUsers: "ピン留めユーザー" +pinnedUsersDescription: "「みつける」ページなどにピン留めしたいユーザーを改行で区切って記述するにゃ。" +pinnedPages: "ピン留めページ" +pinnedPagesDescription: "インスタンスのトップページにピン留めしたいページのパスを改行で区切って記述するにゃ。" +pinnedClipId: "ピン留めするにゃクリップのID" +pinnedNotes: "ピン留めされたノート" +hcaptcha: "hCaptcha" +enableHcaptcha: "hCaptchaを有効にするにゃ" +hcaptchaSiteKey: "サイトキー" +hcaptchaSecretKey: "シークレットキー" +recaptcha: "reCAPTCHA" +enableRecaptcha: "reCAPTCHAを有効にするにゃ" +recaptchaSiteKey: "サイトキー" +recaptchaSecretKey: "シークレットキー" +avoidMultiCaptchaConfirm: "複数のCaptchaを使用するにゃと干渉を起こす可能性があるにゃ。他のCaptchaを無効にするにゃ?キャンセルして複数のCaptchaを有効化したままにするにゃことも可能にゃ。" +antennas: "アンテナ" +manageAntennas: "アンテナの管理" +name: "名前" +antennaSource: "受信ソース" +antennaKeywords: "受信キーワード" +antennaExcludeKeywords: "除外キーワード" +antennaKeywordsDescription: "スペースで区切るとAND指定になり、改行で区切るとOR指定になるにゃ" +notifyAntenna: "新しいノートを通知するにゃ" +withFileAntenna: "ファイルが添付されたノートのみ" +enableServiceworker: "ServiceWorkerを有効にするにゃ" +antennaUsersDescription: "ユーザー名を改行で区切って指定します" +caseSensitive: "大文字小文字を区別するにゃ" +withReplies: "返信を含む" +connectedTo: "次のアカウントに接続されているにゃ" +notesAndReplies: "投稿と返信" +withFiles: "ファイル付き" +silence: "サイレンス" +silenceConfirm: "サイレンスするにゃ?" +unsilence: "サイレンス解除" +unsilenceConfirm: "サイレンス解除するにゃ?" +popularUsers: "人気のユーザー" +recentlyUpdatedUsers: "最近投稿したユーザー" +recentlyRegisteredUsers: "最近登録したユーザー" +recentlyDiscoveredUsers: "最近発見されたユーザー" +exploreUsersCount: "{count}のユーザーがいるにゃ" +exploreFediverse: "Fediverseを探索" +popularTags: "人気のタグ" +userList: "リスト" +about: "情報" +aboutMisskey: "Misskeyについて" +administrator: "管理者" +token: "トークン" +twoStepAuthentication: "二段階認証" +moderator: "モデレーター" +nUsersMentioned: "{n}人が投稿" +securityKey: "セキュリティキー" +securityKeyName: "キーの名前" +registerSecurityKey: "セキュリティキーを登録するにゃ" +lastUsed: "最後の使用" +unregister: "登録を解除" +passwordLessLogin: "パスワード無しログイン" +resetPassword: "パスワードをリセット" +newPasswordIs: "新しいパスワードは「{password}」にゃ" +reduceUiAnimation: "UIのアニメーションを減らす" +share: "共有" +notFound: "見つかりません" +notFoundDescription: "指定されたURLに該当するにゃページはないにゃでした。" +uploadFolder: "既定アップロード先" +cacheClear: "キャッシュを削除" +markAsReadAllNotifications: "すべての通知を既読にするにゃ" +markAsReadAllUnreadNotes: "すべての投稿を既読にするにゃ" +markAsReadAllTalkMessages: "すべてのチャットを既読にするにゃ" +help: "ヘルプ" +inputMessageHere: "ここにメッセージを入力" +close: "閉じる" +group: "グループ" +groups: "グループ" +createGroup: "グループを作成" +ownedGroups: "所有グループ" +joinedGroups: "参加しているグループ" +invites: "招待" +groupName: "グループ名" +members: "メンバー" +transfer: "譲渡" +messagingWithUser: "ユーザーとチャット" +messagingWithGroup: "グループでチャット" +title: "タイトル" +text: "テキスト" +enable: "有効にするにゃ" +next: "次" +retype: "再入力" +noteOf: "{user}のノート" +inviteToGroup: "グループに招待" +maxNoteTextLength: "ノートの文字数制限" +quoteAttached: "引用付き" +quoteQuestion: "引用として添付するにゃ?" +noMessagesYet: "まだチャットはないにゃ" +newMessageExists: "新しいメッセージがあります" +onlyOneFileCanBeAttached: "メッセージに添付できるファイルはひとつにゃ" +signinRequired: "ログインしてくださいにゃ" +invitations: "招待" +invitationCode: "招待コード" +checking: "確認しているにゃ" +available: "利用できます" +unavailable: "利用できません" +usernameInvalidFormat: "a~z、A~Z、0~9、_が使えます" +tooShort: "短すぎます" +tooLong: "長すぎます" +weakPassword: "弱いパスワード" +normalPassword: "普通のパスワード" +strongPassword: "強いパスワード" +passwordMatched: "一致しました" +passwordNotMatched: "一致してないにゃ" +signinWith: "{x}でログイン" +signinFailed: "ログインできなかったにゃ。ユーザー名とパスワードを確認してくださいにゃ。" +tapSecurityKey: "セキュリティキーにタッチ" +or: "もしくは" +language: "言語" +uiLanguage: "UIの表示言語" +groupInvited: "グループに招待されたにゃ" +aboutX: "{x}について" +useOsNativeEmojis: "OSネイティブの絵文字を使用" +youHaveNoGroups: "グループがないにゃ" +joinOrCreateGroup: "既存のグループに招待してもらうか、新しくグループを作成してくださいにゃ。" +noHistory: "履歴はないにゃ" +signinHistory: "ログイン履歴" +disableAnimatedMfm: "動きのあるMFMを無効にするにゃ" +doing: "やっているにゃ" +category: "カテゴリ" +tags: "タグ" +docSource: "このドキュメントのソース" +createAccount: "アカウントを作成" +existingAccount: "既存のアカウント" +regenerate: "再生成" +fontSize: "フォントサイズ" +noFollowRequests: "フォロー申請はないにゃ" +openImageInNewTab: "画像を新しいタブで開く" +dashboard: "ダッシュボード" +local: "ローカル" +remote: "リモート" +total: "合計" +weekOverWeekChanges: "前週比" +dayOverDayChanges: "前日比" +appearance: "アピアランス" +clientSettings: "クライアント設定" +accountSettings: "アカウント設定" +promotion: "プロモーション" +promote: "プロモート" +numberOfDays: "日数" +hideThisNote: "このノートを非表示" +showFeaturedNotesInTimeline: "タイムラインにおすすめのノートを表示するにゃ" +objectStorage: "オブジェクトストレージ" +useObjectStorage: "オブジェクトストレージを使用" +objectStorageBaseUrl: "Base URL" +objectStorageBaseUrlDesc: "参照に使用するにゃURL。CDNやProxyを使用している場合はそのURL、S3: 'https://.s3.amazonaws.com'、GCS等: 'https://storage.googleapis.com/'。" +objectStorageBucket: "Bucket" +objectStorageBucketDesc: "使用サービスのbucket名を指定してくださいにゃ。" +objectStoragePrefix: "Prefix" +objectStoragePrefixDesc: "このprefixのディレクトリ下に格納されます。" +objectStorageEndpoint: "Endpoint" +objectStorageEndpointDesc: "S3の場合は空、それ以外の場合は各サービスのendpointを指定してくださいにゃ。''または':'のように指定するにゃ。" +objectStorageRegion: "Region" +objectStorageRegionDesc: "'xx-east-1'のようなregionを指定してくださいにゃ。使用サービスにregionの概念がない場合は、空または'us-east-1'にしてくださいにゃ。" +objectStorageUseSSL: "SSLを使用するにゃ" +objectStorageUseSSLDesc: "API接続にhttpsを使用しない場合はオフにしてくださいにゃ" +objectStorageUseProxy: "Proxyを利用するにゃ" +objectStorageUseProxyDesc: "API接続にproxyを利用しない場合はオフにしてくださいにゃ" +objectStorageSetPublicRead: "アップロード時に'public-read'を設定するにゃ" +serverLogs: "サーバーログ" +deleteAll: "全て削除" +showFixedPostForm: "タイムライン上部に投稿フォームを表示するにゃ" +newNoteRecived: "新しいノートがあります" +sounds: "サウンド" +listen: "聴く" +none: "なし" +showInPage: "ページで表示" +popout: "ポップアウト" +volume: "音量" +masterVolume: "マスター音量" +details: "詳細" +chooseEmoji: "絵文字を選択" +unableToProcess: "操作を完了できません" +recentUsed: "最近使用" +install: "インストール" +uninstall: "アンインストール" +installedApps: "インストールされたアプリ" +nothing: "ないにゃ" +installedDate: "インストール日時" +lastUsedDate: "最終使用日時" +state: "状態" +sort: "ソート" +ascendingOrder: "昇順" +descendingOrder: "降順" +scratchpad: "スクラッチパッド" +scratchpadDescription: "スクラッチパッドは、AiScriptの実験環境を提供するにゃ。Misskeyと対話するにゃコードの記述、実行、結果の確認ができるにゃ。" +output: "出力" +script: "スクリプト" +disablePagesScript: "Pagesのスクリプトを無効にするにゃ" +updateRemoteUser: "リモートユーザー情報の更新" +deleteAllFiles: "すべてのファイルを削除" +deleteAllFilesConfirm: "すべてのファイルを削除するにゃ?" +removeAllFollowing: "フォローを全解除" +removeAllFollowingDescription: "{host}からのフォローをすべて解除するにゃ。そのインスタンスがもう存在しなくなった場合などに実行してくださいにゃ。" +userSuspended: "このユーザーは凍結されているにゃ。" +userSilenced: "このユーザーはサイレンスされているにゃ。" +yourAccountSuspendedTitle: "アカウントが凍結されているにゃ" +yourAccountSuspendedDescription: "このアカウントは、サーバーの利用規約に違反したなどの理由により、凍結されているにゃ。詳細については管理者までお問い合わせください。新しいアカウントを作らないでください。" +menu: "メニュー" +divider: "分割線" +addItem: "項目を追加" +rooms: "ルーム" +relays: "リレー" +addRelay: "リレーの追加" +inboxUrl: "inboxのURL" +addedRelays: "追加済みのリレー" +serviceworkerInfo: "プッシュ通知を行うには有効するにゃ必要があるにゃ。" +deletedNote: "削除された投稿" +invisibleNote: "非公開の投稿" +enableInfiniteScroll: "自動でもっと見る" +visibility: "公開範囲" +poll: "アンケート" +useCw: "内容を隠す" +enablePlayer: "プレイヤーを開く" +disablePlayer: "プレイヤーを閉じる" +expandTweet: "ツイートを展開するにゃ" +themeEditor: "テーマエディター" +description: "説明" +describeFile: "キャプションを付ける" +enterFileDescription: "キャプションを入力" +author: "作者" +leaveConfirm: "未保存の変更があるにゃ。破棄するにゃ?" +manage: "管理" +plugins: "プラグイン" +deck: "デッキ" +undeck: "デッキ解除" +useBlurEffectForModal: "モーダルにぼかし効果を使用" +useFullReactionPicker: "フル機能リアクションピッカーを使用" +width: "幅" +height: "高さ" +large: "大" +medium: "中" +small: "小" +generateAccessToken: "アクセストークンの発行" +permission: "権限" +enableAll: "全て有効にするにゃ" +disableAll: "全て無効にするにゃ" +tokenRequested: "アカウントへのアクセス許可" +pluginTokenRequestedDescription: "このプラグインはここで設定した権限を行使できるようになるにゃ。" +notificationType: "通知の種類" +edit: "編集" +useStarForReactionFallback: "リアクション絵文字が不明な場合、代わりに★を使う" +emailServer: "メールサーバー" +enableEmail: "メール配信機能を有効化するにゃ" +emailConfigInfo: "メールアドレスの確認やパスワードリセットの際に使いるにゃ" +email: "メール" +emailAddress: "メールアドレス" +smtpConfig: "SMTP サーバーの設定" +smtpHost: "ホスト" +smtpPort: "ポート" +smtpUser: "ユーザー名" +smtpPass: "パスワード" +emptyToDisableSmtpAuth: "ユーザー名とパスワードを空欄にするにゃことで、SMTP認証を無効化出来ます" +smtpSecure: "SMTP 接続に暗黙的なSSL/TLSを使用するにゃ" +smtpSecureInfo: "STARTTLS使用時はオフにするにゃ。" +testEmail: "配信テスト" +wordMute: "ワードミュート" +instanceMute: "インスタンスミュート" +userSaysSomething: "{name}が何かを言いました" +makeActive: "アクティブにするにゃ" +display: "表示" +copy: "コピー" +metrics: "メトリクス" +overview: "概要" +logs: "ログ" +delayed: "遅延" +database: "データベース" +channel: "チャンネル" +create: "作成" +notificationSetting: "通知設定" +notificationSettingDesc: "表示するにゃ通知の種別を選択してくださいにゃ。" +useGlobalSetting: "グローバル設定を使う" +useGlobalSettingDesc: "オンにするにゃと、アカウントの通知設定が使用されます。オフにするにゃと、個別に設定できるようになるにゃ。" +other: "その他" +regenerateLoginToken: "ログイントークンを再生成" +regenerateLoginTokenDescription: "ログインに使用される内部トークンを再生成するにゃ。通常この操作を行う必要はないにゃ。再生成するにゃと、全てのデバイスでログアウトされます。" +setMultipleBySeparatingWithSpace: "スペースで区切って複数設定できるにゃ。" +fileIdOrUrl: "ファイルIDまたはURL" +chatOpenBehavior: "チャットを開くときの動作" +behavior: "動作" +sample: "サンプル" +abuseReports: "通報" +reportAbuse: "通報" +reportAbuseOf: "{name}を通報するにゃ" +fillAbuseReportDescription: "通報理由の詳細を記入してくださいにゃ。対象のノートがある場合はそのURLも記入してくださいにゃ。" +abuseReported: "内容が送信されたにゃ。ご報告ありがとうございました。" +reporteeOrigin: "通報先" +reporterOrigin: "通報元" +send: "送信" +abuseMarkAsResolved: "対応済みにするにゃ" +openInNewTab: "新しいタブで開く" +openInSideView: "サイドビューで開く" +defaultNavigationBehaviour: "デフォルトのナビゲーション" +editTheseSettingsMayBreakAccount: "これらの設定を編集するにゃとアカウントが破損するにゃ可能性があるにゃ。" +instanceTicker: "ノートのインスタンス情報" +waitingFor: "{x}を待っているにゃ" +random: "ランダム" +system: "システム" +switchUi: "UI切り替え" +desktop: "デスクトップ" +clip: "クリップ" +createNew: "新規作成" +optional: "任意" +createNewClip: "新しいクリップを作成" +public: "パブリック" +i18nInfo: "Misskeyは有志によって様々な言語に翻訳されているにゃ。{link}で翻訳に協力できるにゃ。" +manageAccessTokens: "アクセストークンの管理" +accountInfo: "アカウント情報" +notesCount: "ノートの数" +repliesCount: "返信した数" +renotesCount: "Renoteした数" +repliedCount: "返信された数" +renotedCount: "Renoteされた数" +followingCount: "フォロー数" +followersCount: "フォロワー数" +sentReactionsCount: "リアクションした数" +receivedReactionsCount: "リアクションされた数" +pollVotesCount: "アンケートに投票した数" +pollVotedCount: "アンケートに投票された数" +yes: "はい" +no: "いいえ" +driveFilesCount: "ドライブのファイル数" +driveUsage: "ドライブ使用量" +noCrawle: "クローラーによるインデックスを拒否" +noCrawleDescription: "検索エンジンにあなたのユーザーページ、ノート、Pagesなどのコンテンツを登録(インデックス)しないよう要請するにゃ。" +lockedAccountInfo: "フォローを承認制にしても、ノートの公開範囲を「フォロワー」にしない限り、誰でもあなたのノートを見ることができるにゃ。" +alwaysMarkSensitive: "デフォルトでメディアを閲覧注意にするにゃ" +loadRawImages: "添付画像のサムネイルをオリジナル画質にするにゃ" +disableShowingAnimatedImages: "アニメーション画像を再生しない" +verificationEmailSent: "確認のメールを送信したにゃ。メールに記載されたリンクにアクセスして、設定を完了してくださいにゃ。" +notSet: "未設定" +emailVerified: "メールアドレスが確認されたにゃ" +noteFavoritesCount: "お気に入りノートの数" +pageLikesCount: "Pageにいいねした数" +pageLikedCount: "Pageにいいねされた数" +reversiCount: "リバーシの対局数" +contact: "連絡先" +useSystemFont: "システムのデフォルトのフォントを使う" +clips: "クリップ" +experimentalFeatures: "実験的機能" +developer: "開発者" +makeExplorable: "アカウントを見つけやすくするにゃ" +makeExplorableDescription: "オフにするにゃと、「みつける」にアカウントが載らなくなるにゃ。" +showGapBetweenNotesInTimeline: "タイムラインのノートを離して表示" +duplicate: "複製" +left: "左" +center: "中央" +wide: "広い" +narrow: "狭い" +reloadToApplySetting: "設定はページリロード後に反映されます。今すぐリロードするにゃ?" +showTitlebar: "タイトルバーを表示するにゃ" +clearCache: "キャッシュをクリア" +onlineUsersCount: "{n}人がオンライン" +nUsers: "{n}ユーザー" +nNotes: "{n}ノート" +sendErrorReports: "エラーリポートを送信" +sendErrorReportsDescription: "オンにするにゃと、問題が発生したときにエラーの詳細情報がMisskeyに共有され、ソフトウェアの品質向上に役立てることができるにゃ。エラー情報には、OSのバージョン、ブラウザの種類、行動履歴などが含まれます。" +myTheme: "マイテーマ" +backgroundColor: "背景" +accentColor: "アクセント" +textColor: "文字" +saveAs: "名前を付けて保存" +advanced: "高度" +value: "値" +createdAt: "作成日時" +updatedAt: "更新日時" +saveConfirm: "保存するにゃ?" +deleteConfirm: "削除するにゃ?" +invalidValue: "有効な値ではないにゃ。" +registry: "レジストリ" +closeAccount: "アカウントを閉鎖するにゃ" +currentVersion: "現在のバージョン" +latestVersion: "最新のバージョン" +youAreRunningUpToDateClient: "お使いのクライアントは最新にゃ。" +newVersionOfClientAvailable: "新しいバージョンのクライアントが利用可能にゃ。" +usageAmount: "使用量" +capacity: "容量" +inUse: "使用中" +editCode: "コードを編集" +apply: "適用" +receiveAnnouncementFromInstance: "インスタンスからのお知らせを受け取る" +emailNotification: "メール通知" +publish: "公開" +inChannelSearch: "チャンネル内検索" +useReactionPickerForContextMenu: "右クリックでリアクションピッカーを開く" +typingUsers: "{users}が入力中" +jumpToSpecifiedDate: "特定の日付にジャンプ" +showingPastTimeline: "過去のタイムラインを表示しているにゃ" +clear: "クリア" +markAllAsRead: "全て既読にするにゃ" +goBack: "戻る" +unlikeConfirm: "いいね解除するにゃ?" +fullView: "フルビュー" +quitFullView: "フルビュー解除" +addDescription: "説明を追加" +userPagePinTip: "個々のノートのメニューから「ピン留め」を選択するにゃことで、ここにノートを表示しておくことができるにゃ。" +notSpecifiedMentionWarning: "宛先に含まれていないメンションがあります" +info: "情報" +userInfo: "ユーザー情報" +unknown: "不明" +onlineStatus: "オンライン状態" +hideOnlineStatus: "オンライン状態を隠す" +hideOnlineStatusDescription: "オンライン状態を隠すと、検索などの一部機能において利便性が低下するにゃことがあるにゃ。" +online: "オンライン" +active: "アクティブ" +offline: "オフライン" +notRecommended: "非推奨" +botProtection: "Bot防御" +instanceBlocking: "インスタンスブロック" +selectAccount: "アカウントを選択" +enabled: "有効" +disabled: "無効" +quickAction: "クイックアクション" +user: "ユーザー" +administration: "管理" +accounts: "アカウント" +switch: "切り替え" +noMaintainerInformationWarning: "管理者情報が設定されていません。" +noBotProtectionWarning: "Bot防御が設定されていません。" +configure: "設定するにゃ" +postToGallery: "ギャラリーへ投稿" +gallery: "ギャラリー" +recentPosts: "最近の投稿" +popularPosts: "人気の投稿" +shareWithNote: "ノートで共有" +ads: "広告" +expiration: "期限" +memo: "メモ" +priority: "優先度" +high: "高" +middle: "中" +low: "低" +emailNotConfiguredWarning: "メールアドレスの設定がされていません。" +ratio: "比率" +previewNoteText: "本文をプレビュー" +customCss: "カスタムCSS" +customCssWarn: "この設定は必ず知識のある方が行ってください。不適切な設定を行うとクライアントが正常に使用できなくなる恐れがあるにゃ。" +global: "グローバル" +squareAvatars: "アイコンを四角形で表示" +sent: "送信" +received: "受信" +searchResult: "検索結果" +hashtags: "ハッシュタグ" +troubleshooting: "トラブルシューティング" +useBlurEffect: "UIにぼかし効果を使用" +learnMore: "詳しく" +misskeyUpdated: "Misskeyが更新されたにゃ!" +whatIsNew: "更新情報を見る" +translate: "翻訳" +translatedFrom: "{x}から翻訳" +accountDeletionInProgress: "アカウントの削除が進行中にゃ" +usernameInfo: "サーバー上であなたのアカウントを一意に識別するにゃための名前。アルファベット(a~z, A~Z)、数字(0~9)、およびアンダーバー(_)が使用できるにゃ。ユーザー名は後から変更するにゃことは出来ません。" +aiChanMode: "藍モード" +keepCw: "CWを維持するにゃ" +pubSub: "Pub/Subのアカウント" +lastCommunication: "直近の通信" +resolved: "解決済み" +unresolved: "未解決" +breakFollow: "フォロワーを解除" +itsOn: "オンになっているにゃ" +itsOff: "オフになっているにゃ" +emailRequiredForSignup: "アカウント登録にメールアドレスを必須にするにゃ" +unread: "未読" +filter: "フィルタ" +controlPanel: "コントロールパネル" +manageAccounts: "アカウントを管理" +makeReactionsPublic: "リアクション一覧を公開するにゃ" +makeReactionsPublicDescription: "あなたがしたリアクション一覧を誰でも見れるようにするにゃ。" +classic: "クラシック" +muteThread: "スレッドをミュート" +unmuteThread: "スレッドのミュートを解除" +ffVisibility: "つながりの公開範囲" +ffVisibilityDescription: "自分のフォロー/フォロワー情報の公開範囲を設定できるにゃ。" +continueThread: "さらにスレッドを見る" +deleteAccountConfirm: "アカウントが削除されます。よろしいにゃか?" +incorrectPassword: "パスワードが間違っているにゃ。" +voteConfirm: "「{choice}」に投票するにゃ?" +hide: "隠す" + +_emailUnavailable: + used: "既に使用されているにゃ" + format: "形式が正しくないにゃ" + disposable: "恒久的に使用可能なアドレスではないにゃ" + mx: "正しいメールサーバーではないにゃ" + smtp: "メールサーバーが応答しません" + +_ffVisibility: + public: "公開" + followers: "フォロワーだけに公開" + private: "非公開" + +_signup: + almostThere: "ほとんど完了にゃ" + emailAddressInfo: "あなたが使っているメールアドレスを入力してくださいにゃ。メールアドレスが公開されることはないにゃ。" + emailSent: "入力されたメールアドレス({email})宛に確認のメールが送信されたにゃ。メールに記載されたリンクにアクセスするにゃと、アカウントの作成が完了するにゃ。" + +_accountDelete: + accountDelete: "アカウントの削除" + mayTakeTime: "アカウントの削除は負荷のかかる処理であるため、作成したコンテンツの数やアップロードしたファイルの数が多いと完了までに時間がかかることがあるにゃ。" + sendEmail: "アカウントの削除が完了するにゃ際は、登録してあったメールアドレス宛に通知を送信するにゃ。" + requestAccountDelete: "アカウント削除をリクエスト" + started: "削除処理が開始されたにゃ。" + inProgress: "削除が進行中" + +_ad: + back: "戻る" + reduceFrequencyOfThisAd: "この広告の表示頻度を下げる" + +_forgotPassword: + enterEmail: "アカウントに登録したメールアドレスを入力してくださいにゃ。そのアドレス宛てに、パスワードリセット用のリンクが送信されます。" + ifNoEmail: "メールアドレスを登録していない場合は、管理者までお問い合わせください。" + contactAdmin: "このインスタンスではメールがサポートされていないため、パスワードリセットを行う場合は管理者までお問い合わせください。" + +_gallery: + my: "自分の投稿" + liked: "いいねした投稿" + like: "いいね!" + unlike: "いいね解除" + +_email: + _follow: + title: "フォローされたにゃ" + _receiveFollowRequest: + title: "フォローリクエストを受け取りました" + +_plugin: + install: "プラグインのインストール" + installWarn: "信頼できないプラグインはインストールしないでください。" + manage: "プラグインの管理" + +_registry: + scope: "スコープ" + key: "キー" + keys: "キー" + domain: "ドメイン" + createKey: "キーを作成" + +_aboutMisskey: + about: "Misskeyはsyuiloによって2014年から開発されている、オープンソースのソフトウェアにゃ。" + contributors: "主なコントリビューター" + allContributors: "全てのコントリビューター" + source: "ソースコード" + translation: "Misskeyを翻訳" + donate: "Misskeyに寄付" + morePatrons: "他にも多くの方が支援してくれているにゃ。ありがとうございるにゃ🥰" + patrons: "支援者" + +_nsfw: + respect: "閲覧注意のメディアは隠す" + ignore: "閲覧注意のメディアを隠さない" + force: "常にメディアを隠す" + +_mfm: + cheatSheet: "MFMチートシート" + intro: "MFMは、Misskey内の様々な場所で使用できる専用のマークアップ言語にゃ。ここでは、MFMで使用可能な構文一覧が確認できるにゃ。" + dummy: "MisskeyでFediverseの世界が広がります" + mention: "メンション" + mentionDescription: "アットマーク + ユーザー名で、特定のユーザーを示すことができるにゃ。" + hashtag: "ハッシュタグ" + hashtagDescription: "ナンバーサイン + タグで、ハッシュタグを示すことができるにゃ。" + url: "URL" + urlDescription: "URLを示すことができるにゃ。" + link: "リンク" + linkDescription: "文章の特定の範囲を、URLに紐づけることができるにゃ。" + bold: "太字" + boldDescription: "文字を太く表示して強調するにゃことができるにゃ。" + small: "目立たなく" + smallDescription: "内容を小さく・薄く表示させることができるにゃ。" + center: "中央寄せ" + centerDescription: "内容を中央寄せで表示させることができるにゃ。" + inlineCode: "コード(インライン)" + inlineCodeDescription: "プログラムなどのコードをインラインでシンタックスハイライトするにゃ。" + blockCode: "コード(ブロック)" + blockCodeDescription: "複数行のプログラムなどのコードをブロックでシンタックスハイライトするにゃ。" + inlineMath: "数式(インライン)" + inlineMathDescription: "数式(KaTeX)をインラインで表示するにゃ。" + blockMath: "数式(ブロック)" + blockMathDescription: "複数行の数式(KaTeX)をブロックで表示するにゃ。" + quote: "引用" + quoteDescription: "内容が引用であることを示すことができるにゃ。" + emoji: "カスタム絵文字" + emojiDescription: "コロンでカスタム絵文字名を囲むと、カスタム絵文字を表示させることができるにゃ。" + search: "検索" + searchDescription: "入力済み検索ボックスを表示させることができるにゃ。" + flip: "反転" + flipDescription: "内容を上下または左右に反転させます。" + jelly: "アニメーション(びよんびよん)" + jellyDescription: "びよんびよんするにゃアニメーションを与えます。" + tada: "アニメーション(じゃーん)" + tadaDescription: "ジャーン!という感じのアニメーションを与えます。" + jump: "アニメーション(ジャンプ)" + jumpDescription: "飛び跳ねるようなアニメーションを与えます。" + bounce: "アニメーション(バウンド)" + bounceDescription: "ぽよんぽよん弾むようなアニメーションを与えます。" + shake: "アニメーション(ぶるぶる)" + shakeDescription: "ぶるぶる震えるアニメーションを与えます。" + twitch: "アニメーション(ブレ)" + twitchDescription: "激しくブレるアニメーションを与えます。" + spin: "アニメーション(回転)" + spinDescription: "回転するにゃアニメーションを与えます。" + x2: "大きく" + x2Description: "内容を大きく表示するにゃ。" + x3: "とても大きく" + x3Description: "内容をとても大きく表示するにゃ。" + x4: "究極に大きく" + x4Description: "内容を究極に大きく表示するにゃ。" + blur: "ぼかし" + blurDescription: "内容をぼかすことができるにゃ。ポインターを上に乗せるとはっきり見えるようになるにゃ。" + font: "フォント" + fontDescription: "内容のフォントを指定するにゃことができるにゃ。" + rainbow: "レインボー" + rainbowDescription: "内容をレインボーにするにゃ。" + sparkle: "キラキラ" + sparkleDescription: "キラキラしたパーティクルのエフェクトを追加するにゃ。" + rotate: "回転" + rotateDescription: "指定した角度で回転させます。" + +_reversi: + reversi: "リバーシ" + gameSettings: "対局の設定" + chooseBoard: "ボードを選択" + blackOrWhite: "先行/後攻" + blackIs: "{name}が黒(先行)" + rules: "ルール" + botSettings: "Botのオプション" + thisGameIsStartedSoon: "対局は数秒後に開始されます" + waitingForOther: "相手の準備が完了するにゃのを待っているにゃ" + waitingForMe: "あなたの準備が完了するにゃのを待っているにゃ" + waitingBoth: "準備してくださいにゃ" + ready: "準備完了" + cancelReady: "準備を再開" + opponentTurn: "相手のターンにゃ" + myTurn: "あなたのターンにゃ" + turnOf: "{name}のターンにゃ" + pastTurnOf: "{name}のターン" + surrender: "投了" + surrendered: "投了により" + drawn: "引き分け" + won: "{name}の勝ち" + black: "黒" + white: "白" + total: "合計" + turnCount: "{count}ターン目" + myGames: "自分の対局" + allGames: "みんなの対局" + ended: "終了" + playing: "対局中" + isLlotheo: "石の少ない方が勝ち(ロセオ)" + loopedMap: "ループマップ" + canPutEverywhere: "どこでも置けるモード" + +_instanceTicker: + none: "表示しない" + remote: "リモートユーザーに表示" + always: "常に表示" + +_serverDisconnectedBehavior: + reload: "自動でリロード" + dialog: "ダイアログで警告" + quiet: "控えめに警告" + +_channel: + create: "チャンネルを作成" + edit: "チャンネルを編集" + setBanner: "バナーを設定" + removeBanner: "バナーを削除" + featured: "トレンド" + owned: "管理中" + following: "フォロー中" + usersCount: "{n}人が参加中" + notesCount: "{n}投稿があります" + +_menuDisplay: + sideFull: "横" + sideIcon: "横(アイコン)" + top: "上部" + hide: "隠す" + +_wordMute: + muteWords: "ミュートするにゃワード" + muteWordsDescription: "スペースで区切るとAND指定になり、改行で区切るとOR指定になるにゃ。" + muteWordsDescription2: "キーワードをスラッシュで囲むと正規表現になるにゃ。" + softDescription: "指定した条件のノートをタイムラインから隠するにゃ。" + hardDescription: "指定した条件のノートをタイムラインに追加しないようにするにゃ。追加されなかったノートは、条件を変更しても除外されたままになるにゃ。" + soft: "ソフト" + hard: "ハード" + mutedNotes: "ミュートされたノート" + +_instanceMute: + instanceMuteDescription: "ミュートしたインスタンスのユーザーへの返信を含めて、設定したインスタンスの全てのノートとRenoteをミュートするにゃ。" + instanceMuteDescription2: "改行で区切って設定します" + title: "設定したインスタンスのノートを隠するにゃ。" + heading: "ミュートするにゃインスタンス" + +_theme: + explore: "テーマを探す" + install: "テーマのインストール" + manage: "テーマの管理" + code: "テーマコード" + description: "説明" + installed: "{name}をインストールしました" + installedThemes: "インストールされたテーマ" + builtinThemes: "標準のテーマ" + alreadyInstalled: "そのテーマは既にインストールされているにゃ" + invalid: "テーマの形式が間違っているにゃ" + make: "テーマを作る" + base: "ベース" + addConstant: "定数を追加" + constant: "定数" + defaultValue: "デフォルト値" + color: "色" + refProp: "プロパティを参照" + refConst: "定数を参照" + key: "キー" + func: "関数" + funcKind: "関数の種類" + argument: "引数" + basedProp: "元にするにゃプロパティの名前" + alpha: "不透明度" + darken: "暗さ" + lighten: "明るさ" + inputConstantName: "定数名を入力してくださいにゃ" + importInfo: "ここにテーマコードを貼り付けて、エディターにインポートできます" + deleteConstantConfirm: "定数 {const} を削除しても良いにゃか?" + + keys: + accent: "アクセント" + bg: "背景" + fg: "文字" + focus: "フォーカス" + indicator: "インジケーター" + panel: "パネル" + shadow: "影" + header: "ヘッダー" + navBg: "サイドバーの背景" + navFg: "サイドバーの文字" + navHoverFg: "サイドバー文字(ホバー)" + navActive: "サイドバー文字(アクティブ)" + navIndicator: "サイドバーのインジケーター" + link: "リンク" + hashtag: "ハッシュタグ" + mention: "メンション" + mentionMe: "あなた宛てメンション" + renote: "Renote" + modalBg: "モーダルの背景" + divider: "分割線" + scrollbarHandle: "スクロールバーの取っ手" + scrollbarHandleHover: "スクロールバーの取っ手(ホバー)" + dateLabelFg: "日付ラベルの文字" + infoBg: "情報の背景" + infoFg: "情報の文字" + infoWarnBg: "警告の背景" + infoWarnFg: "警告の文字" + cwBg: "CW ボタンの背景" + cwFg: "CW ボタンの文字" + cwHoverBg: "CW ボタンの背景 (ホバー)" + toastBg: "通知トーストの背景" + toastFg: "通知トーストの文字" + buttonBg: "ボタンの背景" + buttonHoverBg: "ボタンの背景 (ホバー)" + inputBorder: "入力ボックスの縁取り" + listItemHoverBg: "リスト項目の背景 (ホバー)" + driveFolderBg: "ドライブフォルダーの背景" + wallpaperOverlay: "壁紙のオーバーレイ" + badge: "バッジ" + messageBg: "チャットの背景" + accentDarken: "アクセント (暗め)" + accentLighten: "アクセント (明るめ)" + fgHighlighted: "強調された文字" + +_sfx: + note: "ノート" + noteMy: "ノート(自分)" + notification: "通知" + chat: "チャット" + chatBg: "チャット(バックグラウンド)" + antenna: "アンテナ受信" + channel: "チャンネル通知" + reversiPutBlack: "リバーシ: 黒が打ったとき" + reversiPutWhite: "リバーシ: 白が打ったとき" + +_ago: + unknown: "謎" + future: "未来" + justNow: "たった今" + secondsAgo: "{n}秒前" + minutesAgo: "{n}分前" + hoursAgo: "{n}時間前" + daysAgo: "{n}日前" + weeksAgo: "{n}週間前" + monthsAgo: "{n}ヶ月前" + yearsAgo: "{n}年前" + +_time: + second: "秒" + minute: "分" + hour: "時間" + day: "日" + +_tutorial: + title: "Misskeyの使い方" + step1_1: "ようこそ。" + step1_2: "この画面は「タイムライン」と呼ばれ、あなたや、あなたが「フォロー」するにゃ人の「ノート」が時系列で表示されます。" + step1_3: "あなたはまだ何もノートを投稿しておらず、誰もフォローしていないので、タイムラインには何も表示されていないはずにゃ。" + step2_1: "ノートを作成したり誰かをフォローしたりするにゃ前に、まずあなたのプロフィールを完成させましょう。" + step2_2: "あなたがどんな人かわかると、多くの人にノートを見てもらえたり、フォローしてもらいやすくなるにゃ。" + step3_1: "プロフィール設定はうまくできましたか?" + step3_2: "では試しに、何かノートを投稿してみてください。画面上にある鉛筆マークのボタンを押すとフォームが開きます。" + step3_3: "内容を書いたら、フォーム右上のボタンを押すと投稿できるにゃ。" + step3_4: "内容が思いつかない?「Misskey始めました」というのはいかがでしょう。" + step4_1: "投稿できましたか?" + step4_2: "あなたのノートがタイムラインに表示されていれば成功にゃ。" + step5_1: "次は、他の人をフォローしてタイムラインを賑やかにしたいところにゃ。" + step5_2: "{featured}で人気のノートが見れるので、その中から気になった人を選んでフォローしたり、{explore}で人気のユーザーを探すこともできるにゃ。" + step5_3: "ユーザーをフォローするにゃには、ユーザーのアイコンをクリックしてユーザーページを表示し、「フォロー」ボタンを押するにゃ。" + step5_4: "ユーザーによっては、フォローが承認されるまで時間がかかる場合があるにゃ。" + step6_1: "タイムラインに他のユーザーのノートが表示されていれば成功にゃ。" + step6_2: "他の人のノートには、「リアクション」を付けることができ、簡単にあなたの反応を伝えられます。" + step6_3: "リアクションを付けるには、ノートの「+」マークをクリックして、好きなリアクションを選択するにゃ。" + step7_1: "これで、Misskeyの基本的な使い方の説明は終わりました。お疲れ様でした。" + step7_2: "もっとMisskeyについて知りたいときは、{help}を見てみてください。" + step7_3: "では、Misskeyをお楽しみください🚀" + +_2fa: + alreadyRegistered: "既に設定は完了しているにゃ。" + registerDevice: "デバイスを登録" + registerKey: "キーを登録" + step1: "まず、{a}や{b}などの認証アプリをお使いのデバイスにインストールするにゃ。" + step2: "次に、表示されているQRコードをアプリでスキャンするにゃ。" + step3: "アプリに表示されているトークンを入力して完了にゃ。" + step4: "これからログインするにゃときも、同じようにトークンを入力するにゃ。" + securityKeyInfo: "FIDO2をサポートするにゃハードウェアセキュリティキーもしくは端末の指紋認証やPINを使用してログインするにゃように設定できるにゃ。" + +_permissions: + "read:account": "アカウントの情報を見る" + "write:account": "アカウントの情報を変更するにゃ" + "read:blocks": "ブロックを見る" + "write:blocks": "ブロックを操作するにゃ" + "read:drive": "ドライブを見る" + "write:drive": "ドライブを操作するにゃ" + "read:favorites": "お気に入りを見る" + "write:favorites": "お気に入りを操作するにゃ" + "read:following": "フォローの情報を見る" + "write:following": "フォロー・フォロー解除するにゃ" + "read:messaging": "チャットを見る" + "write:messaging": "チャットを操作するにゃ" + "read:mutes": "ミュートを見る" + "write:mutes": "ミュートを操作するにゃ" + "write:notes": "ノートを作成・削除するにゃ" + "read:notifications": "通知を見る" + "write:notifications": "通知を操作するにゃ" + "read:reactions": "リアクションを見る" + "write:reactions": "リアクションを操作するにゃ" + "write:votes": "投票するにゃ" + "read:pages": "ページを見る" + "write:pages": "ページを操作するにゃ" + "read:page-likes": "ページのいいねを見る" + "write:page-likes": "ページのいいねを操作するにゃ" + "read:user-groups": "ユーザーグループを見る" + "write:user-groups": "ユーザーグループを操作するにゃ" + "read:channels": "チャンネルを見る" + "write:channels": "チャンネルを操作するにゃ" + "read:gallery": "ギャラリーを見る" + "write:gallery": "ギャラリーを操作するにゃ" + "read:gallery-likes": "ギャラリーのいいねを見る" + "write:gallery-likes": "ギャラリーのいいねを操作するにゃ" + +_auth: + shareAccess: "「{name}」がアカウントにアクセスするにゃことを許可するにゃ?" + shareAccessAsk: "アカウントへのアクセスを許可するにゃ?" + permissionAsk: "このアプリは次の権限を要求しているにゃ" + pleaseGoBack: "アプリケーションに戻ってやっていってください" + callback: "アプリケーションに戻っているにゃ" + denied: "アクセスを拒否しました" + +_antennaSources: + all: "全てのノート" + homeTimeline: "フォローしているユーザーのノート" + users: "指定した一人または複数のユーザーのノート" + userList: "指定したリストのユーザーのノート" + userGroup: "指定したグループのユーザーのノート" + +_weekday: + sunday: "日曜日" + monday: "月曜日" + tuesday: "火曜日" + wednesday: "水曜日" + thursday: "木曜日" + friday: "金曜日" + saturday: "土曜日" + +_widgets: + memo: "付箋" + notifications: "通知" + timeline: "タイムライン" + calendar: "カレンダー" + trends: "トレンド" + clock: "時計" + rss: "RSSリーダー" + activity: "アクティビティ" + photos: "フォト" + digitalClock: "デジタル時計" + federation: "連合" + postForm: "投稿フォーム" + slideshow: "スライドショー" + button: "ボタン" + onlineUsers: "オンラインユーザー" + jobQueue: "ジョブキュー" + serverMetric: "サーバーメトリクス" + aiscript: "AiScriptコンソール" + aichan: "藍" + +_cw: + hide: "隠す" + show: "もっと見る" + chars: "{count}文字" + files: "{count}ファイル" + +_poll: + noOnlyOneChoice: "選択肢は最低2つ必要にゃ" + choiceN: "選択肢{n}" + noMore: "これ以上追加できません" + canMultipleVote: "複数回答可" + expiration: "期限" + infinite: "無期限" + at: "日時指定" + after: "経過指定" + deadlineDate: "期日" + deadlineTime: "時間" + duration: "期間" + votesCount: "{n}票" + totalVotes: "計{n}票" + vote: "投票するにゃ" + showResult: "結果を見る" + voted: "投票済み" + closed: "終了済み" + remainingDays: "終了まであと{d}日{h}時間" + remainingHours: "終了まであと{h}時間{m}分" + remainingMinutes: "終了まであと{m}分{s}秒" + remainingSeconds: "終了まであと{s}秒" + +_visibility: + public: "パブリック" + publicDescription: "全てのユーザーに公開" + home: "ホーム" + homeDescription: "ホームタイムラインのみに公開" + followers: "フォロワー" + followersDescription: "自分のフォロワーのみに公開" + specified: "ダイレクト" + specifiedDescription: "指定したユーザーのみに公開" + localOnly: "ローカルのみ" + localOnlyDescription: "リモートユーザーには非公開" + +_postForm: + replyPlaceholder: "このノートに返信..." + quotePlaceholder: "このノートを引用..." + channelPlaceholder: "チャンネルに投稿..." + _placeholders: + a: "いまどうしてる?" + b: "何かありましたか?" + c: "何をお考えにゃか?" + d: "言いたいことは?" + e: "ここに書いてください" + f: "あなたが書くのを待っているにゃ..." + +_profile: + name: "名前" + username: "ユーザー名" + description: "自己紹介" + youCanIncludeHashtags: "ハッシュタグを含めることができるにゃ。" + metadata: "追加情報" + metadataEdit: "追加情報を編集" + metadataDescription: "プロフィールに表として4つまでの追加情報を表示するにゃことができるにゃ。" + metadataLabel: "ラベル" + metadataContent: "内容" + changeAvatar: "アバター画像を変更" + changeBanner: "バナー画像を変更" + +_exportOrImport: + allNotes: "全てのノート" + followingList: "フォロー" + muteList: "ミュート" + blockingList: "ブロック" + userLists: "リスト" + excludeMutingUsers: "ミュートしているユーザーを除外" + excludeInactiveUsers: "使われていないアカウントを除外" + +_charts: + federationInstancesIncDec: "連合の増減" + federationInstancesTotal: "連合の合計" + usersIncDec: "ユーザーの増減" + usersTotal: "ユーザーの合計" + activeUsers: "アクティブユーザー数" + notesIncDec: "ノートの増減" + localNotesIncDec: "ローカルのノートの増減" + remoteNotesIncDec: "リモートのノートの増減" + notesTotal: "ノートの合計" + filesIncDec: "ファイルの増減" + filesTotal: "ファイルの合計" + storageUsageIncDec: "ストレージ使用量の増減" + storageUsageTotal: "ストレージ使用量の合計" + +_instanceCharts: + requests: "リクエスト" + users: "ユーザーの増減" + usersTotal: "ユーザーの累積" + notes: "ノートの増減" + notesTotal: "ノートの累積" + ff: "フォロー/フォロワーの増減" + ffTotal: "フォロー/フォロワーの累積" + cacheSize: "キャッシュサイズの増減" + cacheSizeTotal: "キャッシュサイズの累積" + files: "ファイル数の増減" + filesTotal: "ファイル数の累積" + +_timelines: + home: "ホーム" + local: "ローカル" + social: "ソーシャル" + global: "グローバル" + +_rooms: + roomOf: "{user}のルーム" + addFurniture: "家具を置く" + translate: "移動" + rotate: "回転" + exit: "戻る" + remove: "しまう" + clear: "片付け" + clearConfirm: "全ての家具をしまいるにゃか?" + leaveConfirm: "未保存の変更があります、移動するにゃ?" + chooseImage: "画像を選択" + roomType: "部屋のタイプ" + carpetColor: "床の色" + _roomType: + default: "デフォルト" + washitsu: "和室" + _furnitures: + milk: "牛乳パック" + bed: "ベッド" + low-table: "ローテーブル" + desk: "デスク" + chair: "チェア" + chair2: "チェア2" + fan: "換気扇" + pc: "パソコン" + plant: "観葉植物" + plant2: "観葉植物2" + eraser: "消しゴム" + pencil: "鉛筆" + pudding: "プリン" + cardboard-box: "段ボール箱" + cardboard-box2: "段ボール箱2" + cardboard-box3: "段ボール箱3" + book: "本" + book2: "本2" + piano: "ピアノ" + facial-tissue: "ティッシュボックス" + server: "サーバー" + moon: "月" + corkboard: "コルクボード" + mousepad: "マウスパッド" + monitor: "モニター" + keyboard: "キーボード" + carpet-stripe: "カーペット(縞)" + mat: "マット" + color-box: "カラーボックス" + wall-clock: "壁掛け時計" + photoframe: "額縁" + cube: "キューブ" + tv: "テレビ" + pinguin: "ピンギン" + rubik-cube: "ルービックキューブ" + poster-h: "ポスター(横長)" + poster-v: "ポスター(縦長)" + sofa: "ソファ" + spiral: "螺旋階段" + bin: "ゴミ箱" + cup-noodle: "カップ麺" + holo-display: "ホログラフィックディスプレイ" + energy-drink: "エナジードリンク" + doll-ai: "藍ちゃん人形" + banknote: "札束" + +_pages: + newPage: "ページの作成" + editPage: "ページの編集" + readPage: "ソースを表示中" + created: "ページを作成しました" + updated: "ページを更新しました" + deleted: "ページを削除しました" + pageSetting: "ページ設定" + nameAlreadyExists: "指定されたページURLは既に存在しているにゃ" + invalidNameTitle: "不正なページURLにゃ" + invalidNameText: "空白でないか確認してくださいにゃ" + editThisPage: "このページを編集" + viewSource: "ソースを表示" + viewPage: "ページを見る" + like: "いいね" + unlike: "いいね解除" + my: "自分のページ" + liked: "いいねしたページ" + featured: "人気" + inspector: "インスペクター" + contents: "コンテンツ" + content: "ページブロック" + variables: "変数" + title: "タイトル" + url: "ページURL" + summary: "ページの要約" + alignCenter: "中央寄せ" + hideTitleWhenPinned: "ピン留めされているときにタイトルを非表示" + font: "フォント" + fontSerif: "セリフ" + fontSansSerif: "サンセリフ" + eyeCatchingImageSet: "アイキャッチ画像を設定" + eyeCatchingImageRemove: "アイキャッチ画像を削除" + chooseBlock: "ブロックを追加" + selectType: "種類を選択" + enterVariableName: "変数名を決めてください" + variableNameIsAlreadyUsed: "その変数名は既に使われているにゃ" + contentBlocks: "コンテンツ" + inputBlocks: "入力" + specialBlocks: "特殊" + blocks: + text: "テキスト" + textarea: "テキストエリア" + section: "セクション" + image: "画像" + button: "ボタン" + + if: "もし" + _if: + variable: "変数" + + post: "投稿フォーム" + _post: + text: "内容" + attachCanvasImage: "キャンバスの画像を添付するにゃ" + canvasId: "キャンバスID" + + textInput: "テキスト入力" + _textInput: + name: "変数名" + text: "タイトル" + default: "デフォルト値" + + textareaInput: "複数行テキスト入力" + _textareaInput: + name: "変数名" + text: "タイトル" + default: "デフォルト値" + + numberInput: "数値入力" + _numberInput: + name: "変数名" + text: "タイトル" + default: "デフォルト値" + + canvas: "キャンバス" + _canvas: + id: "キャンバスID" + width: "幅" + height: "高さ" + + note: "ノート埋め込み" + _note: + id: "ノートID" + idDescription: "ノートURLをペーストして設定するにゃこともできるにゃ。" + detailed: "詳細な表示" + + switch: "スイッチ" + _switch: + name: "変数名" + text: "タイトル" + default: "デフォルト値" + + counter: "カウンター" + _counter: + name: "変数名" + text: "タイトル" + inc: "増加値" + + _button: + text: "タイトル" + colored: "色付き" + action: "ボタンを押したときの動作" + _action: + dialog: "ダイアログを表示するにゃ" + _dialog: + content: "内容" + resetRandom: "乱数をリセット" + pushEvent: "イベントを送信させる" + _pushEvent: + event: "イベント名" + message: "押したときに表示するにゃメッセージ" + variable: "送信するにゃ変数" + no-variable: "なし" + callAiScript: "AiScript呼び出し" + _callAiScript: + functionName: "関数名" + + radioButton: "選択肢" + _radioButton: + name: "変数名" + title: "タイトル" + values: "改行で区切った選択肢" + default: "デフォルト値" + + script: + categories: + flow: "制御" + logical: "論理演算" + operation: "計算" + comparison: "比較" + random: "ランダム" + value: "値" + fn: "関数" + text: "テキスト操作" + convert: "変換" + list: "リスト" + blocks: + text: "テキスト" + multiLineText: "テキスト(複数行)" + textList: "テキストのリスト" + _textList: + info: "ひとつひとつを改行で区切ってください" + strLen: "テキストの長さ" + _strLen: + arg1: "テキスト" + strPick: "文字取り出し" + _strPick: + arg1: "テキスト" + arg2: "文字の位置" + strReplace: "テキスト置き換え" + _strReplace: + arg1: "テキスト" + arg2: "置き換え前" + arg3: "置き換え後" + strReverse: "テキストを反転" + _strReverse: + arg1: "テキスト" + join: "テキストを連結" + _join: + arg1: "リスト" + arg2: "区切り" + add: "足す" + _add: + arg1: "A" + arg2: "B" + subtract: "引く" + _subtract: + arg1: "A" + arg2: "B" + multiply: "掛ける" + _multiply: + arg1: "A" + arg2: "B" + divide: "割る" + _divide: + arg1: "A" + arg2: "B" + mod: "割った余り" + _mod: + arg1: "A" + arg2: "B" + round: "小数を丸める" + _round: + arg1: "数値" + eq: "AとBが同じ" + _eq: + arg1: "A" + arg2: "B" + notEq: "AとBが異なる" + _notEq: + arg1: "A" + arg2: "B" + and: "AかつB" + _and: + arg1: "A" + arg2: "B" + or: "AまたはB" + _or: + arg1: "A" + arg2: "B" + lt: "< AがBより小さい" + _lt: + arg1: "A" + arg2: "B" + gt: "> AがBより大きい" + _gt: + arg1: "A" + arg2: "B" + ltEq: "<= AがBと同じか小さい" + _ltEq: + arg1: "A" + arg2: "B" + gtEq: ">= AがBと同じか大きい" + _gtEq: + arg1: "A" + arg2: "B" + if: "分岐" + _if: + arg1: "もし" + arg2: "なら" + arg3: "そうでなければ" + not: "否定" + _not: + arg1: "否定" + random: "ランダム" + _random: + arg1: "確率" + rannum: "乱数" + _rannum: + arg1: "最小" + arg2: "最大" + randomPick: "リストからランダムに選択" + _randomPick: + arg1: "リスト" + dailyRandom: "ランダム (ユーザーごとに日替わり)" + _dailyRandom: + arg1: "確率" + dailyRannum: "乱数 (ユーザーごとに日替わり)" + _dailyRannum: + arg1: "最小" + arg2: "最大" + dailyRandomPick: "リストからランダムに選択 (ユーザーごとに日替わり)" + _dailyRandomPick: + arg1: "リスト" + seedRandom: "ランダム (シード)" + _seedRandom: + arg1: "シード" + arg2: "確率" + seedRannum: "乱数 (シード)" + _seedRannum: + arg1: "シード" + arg2: "最小" + arg3: "最大" + seedRandomPick: "リストからランダムに選択 (シード)" + _seedRandomPick: + arg1: "シード" + arg2: "リスト" + DRPWPM: "確率付きリストからランダムに選択 (ユーザーごとに日替わり)" + _DRPWPM: + arg1: "テキストのリスト" + pick: "リストから選択" + _pick: + arg1: "リスト" + arg2: "位置" + listLen: "リストの長さを取得" + _listLen: + arg1: "リスト" + number: "数値" + stringToNumber: "テキストを数値に" + _stringToNumber: + arg1: "テキスト" + numberToString: "数値をテキストに" + _numberToString: + arg1: "数値" + splitStrByLine: "テキストを行で分割" + _splitStrByLine: + arg1: "テキスト" + ref: "変数" + aiScriptVar: "AiScript変数" + fn: "関数" + _fn: + slots: "スロット" + slots-info: "スロットひとつひとつを改行で区切ってください" + arg1: "出力" + for: "繰り返し" + _for: + arg1: "回数" + arg2: "処理" + typeError: "スロット{slot}は\"{expect}\"を受け付けますが、\"{actual}\"が入れられているにゃ!" + thereIsEmptySlot: "スロット{slot}が空にゃ!" + types: + string: "テキスト" + number: "数値" + boolean: "フラグ" + array: "リスト" + stringArray: "テキストのリスト" + emptySlot: "空のスロット" + enviromentVariables: "環境変数" + pageVariables: "ページ要素" + argVariables: "入力スロット" + +_relayStatus: + requesting: "承認待ち" + accepted: "承認済み" + rejected: "拒否済み" + +_notification: + fileUploaded: "ファイルがアップロードされたにゃ" + youGotMention: "{name}からのメンション" + youGotReply: "{name}からのリプライ" + youGotQuote: "{name}による引用" + youRenoted: "{name}がRenoteしました" + youGotPoll: "{name}が投票しました" + youGotMessagingMessageFromUser: "{name}からのチャットがあります" + youGotMessagingMessageFromGroup: "{name}のチャットがあります" + youWereFollowed: "フォローされたにゃ" + youReceivedFollowRequest: "フォローリクエストが来ました" + yourFollowRequestAccepted: "フォローリクエストが承認されたにゃ" + youWereInvitedToGroup: "グループに招待されたにゃ" + + _types: + all: "すべて" + follow: "フォロー" + mention: "メンション" + reply: "リプライ" + renote: "Renote" + quote: "引用" + reaction: "リアクション" + pollVote: "アンケートに投票された" + receiveFollowRequest: "フォロー申請を受け取った" + followRequestAccepted: "フォローが受理された" + groupInvited: "グループに招待された" + app: "連携アプリからの通知" + +_deck: + alwaysShowMainColumn: "常にメインカラムを表示" + columnAlign: "カラムの寄せ" + columnMargin: "カラム間のマージン" + columnHeaderHeight: "カラムのヘッダー幅" + addColumn: "カラムを追加" + swapLeft: "左に移動" + swapRight: "右に移動" + swapUp: "上に移動" + swapDown: "下に移動" + stackLeft: "左に重ねる" + popRight: "右に出す" + profile: "プロファイル" + + _columns: + main: "メイン" + widgets: "ウィジェット" + notifications: "通知" + tl: "タイムライン" + antenna: "アンテナ" + list: "リスト" + mentions: "あなた宛て" + direct: "ダイレクト" diff --git a/package.json b/package.json index 58df68ca2..463f753e8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "misskey", - "version": "12.100.2", + "version": "12.100.2-simkey", "codename": "indigo", "repository": { "type": "git", diff --git a/packages/backend/src/const.ts b/packages/backend/src/const.ts index 43f59f1e4..b00bd8165 100644 --- a/packages/backend/src/const.ts +++ b/packages/backend/src/const.ts @@ -1,2 +1,47 @@ export const USER_ONLINE_THRESHOLD = 1000 * 60 * 10; // 10min export const USER_ACTIVE_THRESHOLD = 1000 * 60 * 60 * 24 * 3; // 3days + +// ブラウザで直接表示することを許可するファイルの種類のリスト +// ここに含まれないものは application/octet-stream としてレスポンスされる +// SVGはXSSを生むので許可しない +export const FILE_TYPE_BROWSERSAFE = [ + // Images + 'image/png', + 'image/gif', + 'image/jpeg', + 'image/webp', + 'image/apng', + 'image/bmp', + 'image/tiff', + 'image/x-icon', + + // OggS + 'audio/opus', + 'video/ogg', + 'audio/ogg', + 'application/ogg', + + // ISO/IEC base media file format + 'video/quicktime', + 'video/mp4', + 'audio/mp4', + 'video/x-m4v', + 'audio/x-m4a', + 'video/3gpp', + 'video/3gpp2', + + 'video/mpeg', + 'audio/mpeg', + + 'video/webm', + 'audio/webm', + + 'audio/aac', + 'audio/x-flac', + 'audio/vnd.wave', +]; +/* +https://github.com/sindresorhus/file-type/blob/main/supported.js +https://github.com/sindresorhus/file-type/blob/main/core.js +https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Containers +*/ diff --git a/packages/backend/src/misc/get-file-info.ts b/packages/backend/src/misc/get-file-info.ts index f36aa8f96..361cdd295 100644 --- a/packages/backend/src/misc/get-file-info.ts +++ b/packages/backend/src/misc/get-file-info.ts @@ -99,7 +99,10 @@ export async function getFileInfo(path: string): Promise { /** * Detect MIME Type and extension */ -export async function detectType(path: string) { +export async function detectType(path: string): Promise<{ + mime: string; + ext: string | null; +}> { // Check 0 byte const fileSize = await getFileSize(path); if (fileSize === 0) { diff --git a/packages/backend/src/server/file/send-drive-file.ts b/packages/backend/src/server/file/send-drive-file.ts index 8bb5655b4..7bfc36e25 100644 --- a/packages/backend/src/server/file/send-drive-file.ts +++ b/packages/backend/src/server/file/send-drive-file.ts @@ -14,6 +14,7 @@ import { detectType } from '@/misc/get-file-info'; import { convertToJpeg, convertToPngOrJpeg } from '@/services/drive/image-processor'; import { GenerateVideoThumbnail } from '@/services/drive/generate-video-thumbnail'; import { StatusError } from '@/misc/fetch'; +import { FILE_TYPE_BROWSERSAFE } from '@/const'; //const _filename = fileURLToPath(import.meta.url); const _filename = __filename; @@ -27,6 +28,7 @@ const commonReadableHandlerGenerator = (ctx: Koa.Context) => (e: Error): void => ctx.set('Cache-Control', 'max-age=300'); }; +// eslint-disable-next-line import/no-default-export export default async function(ctx: Koa.Context) { const key = ctx.params.key; @@ -81,7 +83,7 @@ export default async function(ctx: Koa.Context) { const image = await convertFile(); ctx.body = image.data; - ctx.set('Content-Type', image.type); + ctx.set('Content-Type', FILE_TYPE_BROWSERSAFE.includes(image.type) ? image.type : 'application/octet-stream'); ctx.set('Cache-Control', 'max-age=31536000, immutable'); } catch (e) { serverLogger.error(`${e}`); @@ -112,14 +114,14 @@ export default async function(ctx: Koa.Context) { }).toString(); ctx.body = InternalStorage.read(key); - ctx.set('Content-Type', mime); + ctx.set('Content-Type', FILE_TYPE_BROWSERSAFE.includes(mime) ? mime : 'application/octet-stream'); ctx.set('Cache-Control', 'max-age=31536000, immutable'); ctx.set('Content-Disposition', contentDisposition('inline', filename)); } else { const readable = InternalStorage.read(file.accessKey!); readable.on('error', commonReadableHandlerGenerator(ctx)); ctx.body = readable; - ctx.set('Content-Type', file.type); + ctx.set('Content-Type', FILE_TYPE_BROWSERSAFE.includes(file.type) ? file.type : 'application/octet-stream'); ctx.set('Cache-Control', 'max-age=31536000, immutable'); ctx.set('Content-Disposition', contentDisposition('inline', file.name)); } diff --git a/packages/backend/src/server/proxy/proxy-media.ts b/packages/backend/src/server/proxy/proxy-media.ts index 9e13c0877..b116b4b96 100644 --- a/packages/backend/src/server/proxy/proxy-media.ts +++ b/packages/backend/src/server/proxy/proxy-media.ts @@ -6,6 +6,7 @@ import { createTemp } from '@/misc/create-temp'; import { downloadUrl } from '@/misc/download-url'; import { detectType } from '@/misc/get-file-info'; import { StatusError } from '@/misc/fetch'; +import { FILE_TYPE_BROWSERSAFE } from '@/const'; export async function proxyMedia(ctx: Koa.Context) { const url = 'url' in ctx.query ? ctx.query.url : 'https://' + ctx.params.url; @@ -18,7 +19,7 @@ export async function proxyMedia(ctx: Koa.Context) { const { mime, ext } = await detectType(path); - if (!mime.startsWith('image/')) throw 403; + if (!FILE_TYPE_BROWSERSAFE.includes(mime)) throw 403; let image: IImage; diff --git a/packages/backend/src/server/web/views/note.pug b/packages/backend/src/server/web/views/note.pug index 703093697..fce91bdab 100644 --- a/packages/backend/src/server/web/views/note.pug +++ b/packages/backend/src/server/web/views/note.pug @@ -4,6 +4,7 @@ block vars - const user = note.user; - const title = user.name ? `${user.name} (@${user.username})` : `@${user.username}`; - const url = `${config.url}/notes/${note.id}`; + - const isRenote = note.renote && note.text == null && note.fileIds.length == 0 && note.poll == null; block title = `${title} | ${instanceName}` @@ -19,7 +20,7 @@ block og meta(property='og:image' content= user.avatarUrl) block meta - if user.host || profile.noCrawle + if user.host || isRenote || profile.noCrawle meta(name='robots' content='noindex') meta(name='misskey:user-username' content=user.username) diff --git a/packages/backend/src/services/drive/add-file.ts b/packages/backend/src/services/drive/add-file.ts index ee4d51a96..a59c9501b 100644 --- a/packages/backend/src/services/drive/add-file.ts +++ b/packages/backend/src/services/drive/add-file.ts @@ -20,6 +20,7 @@ import { isDuplicateKeyValueError } from '@/misc/is-duplicate-key-value-error'; import * as S3 from 'aws-sdk/clients/s3'; import { getS3 } from './s3'; import * as sharp from 'sharp'; +import { FILE_TYPE_BROWSERSAFE } from '@/const'; const logger = driveLogger.createSubLogger('register', 'yellow'); @@ -241,6 +242,7 @@ export async function generateAlts(path: string, type: string, generateWeb: bool */ async function upload(key: string, stream: fs.ReadStream | Buffer, type: string, filename?: string) { if (type === 'image/apng') type = 'image/png'; + if (!FILE_TYPE_BROWSERSAFE.includes(type)) type = 'application/octet-stream'; const meta = await fetchMeta(); diff --git a/packages/backend/src/services/push-notification.ts b/packages/backend/src/services/push-notification.ts index 616bc7441..2133768a9 100644 --- a/packages/backend/src/services/push-notification.ts +++ b/packages/backend/src/services/push-notification.ts @@ -3,10 +3,33 @@ import config from '@/config/index'; import { SwSubscriptions } from '@/models/index'; import { fetchMeta } from '@/misc/fetch-meta'; import { Packed } from '@/misc/schema'; +import { getNoteSummary } from '@/misc/get-note-summary'; type notificationType = 'notification' | 'unreadMessagingMessage'; type notificationBody = Packed<'Notification'> | Packed<'MessagingMessage'>; +// プッシュメッセージサーバーには文字数制限があるため、内容を削減します +function truncateNotification(notification: Packed<'Notification'>): any { + if (notification.note) { + return { + ...notification, + note: { + ...notification.note, + // textをgetNoteSummaryしたものに置き換える + text: getNoteSummary(notification.type === 'renote' ? notification.note.renote as Packed<'Note'> : notification.note), + ...{ + cw: undefined, + reply: undefined, + renote: undefined, + user: undefined as any, // 通知を受け取ったユーザーである場合が多いのでこれも捨てる + } + } + }; + } + + return notification; +} + export default async function(userId: string, type: notificationType, body: notificationBody) { const meta = await fetchMeta(); @@ -32,7 +55,9 @@ export default async function(userId: string, type: notificationType, body: noti }; push.sendNotification(pushSubscription, JSON.stringify({ - type, body, + type, + body: type === 'notification' ? truncateNotification(body as Packed<'Notification'>) : body, + userId, }), { proxy: config.proxy, }).catch((err: any) => { diff --git a/packages/client/src/components/emoji-picker.vue b/packages/client/src/components/emoji-picker.vue index ff450246f..a8eed1ca2 100644 --- a/packages/client/src/components/emoji-picker.vue +++ b/packages/client/src/components/emoji-picker.vue @@ -77,7 +77,7 @@ import { defineComponent, markRaw } from 'vue'; import { emojilist } from '@/scripts/emojilist'; import { getStaticImageUrl } from '@/scripts/get-static-image-url'; -import Particle from '@/components/particle.vue'; +import Ripple from '@/components/ripple.vue'; import * as os from '@/os'; import { isTouchUsing } from '@/scripts/touch'; import { isMobile } from '@/scripts/is-mobile'; @@ -296,9 +296,9 @@ export default defineComponent({ if (ev) { const el = ev.currentTarget || ev.target; const rect = el.getBoundingClientRect(); - const x = rect.left + (el.clientWidth / 2); - const y = rect.top + (el.clientHeight / 2); - os.popup(Particle, { x, y }, {}, 'end'); + const x = rect.left + (el.offsetWidth / 2); + const y = rect.top + (el.offsetHeight / 2); + os.popup(Ripple, { x, y }, {}, 'end'); } const key = this.getKey(emoji); diff --git a/packages/client/src/components/form/input.vue b/packages/client/src/components/form/input.vue index c990b693f..3533f4f27 100644 --- a/packages/client/src/components/form/input.vue +++ b/packages/client/src/components/form/input.vue @@ -5,7 +5,7 @@
input { - border-color: var(--accent); + border-color: var(--accent) !important; //box-shadow: 0 0 0 4px var(--focus); } } diff --git a/packages/client/src/components/form/select.vue b/packages/client/src/components/form/select.vue index 9ecff1aa6..afc53ca9c 100644 --- a/packages/client/src/components/form/select.vue +++ b/packages/client/src/components/form/select.vue @@ -3,7 +3,9 @@
- - - + + - +

@@ -55,16 +64,7 @@ export default defineComponent({ .ziffeoms { position: relative; display: flex; - cursor: pointer; - transition: all 0.3s; - - &:first-child { - margin-top: 0; - } - - &:last-child { - margin-bottom: 0; - } + transition: all 0.2s ease; > * { user-select: none; @@ -80,27 +80,32 @@ export default defineComponent({ > .button { position: relative; - display: inline-block; + display: inline-flex; flex-shrink: 0; margin: 0; - width: 36px; - height: 26px; - background: var(--switchBg); + box-sizing: border-box; + width: 23px; + height: 23px; outline: none; - border-radius: 999px; + background: var(--panel); + border: solid 1px var(--panel); + border-radius: 4px; + cursor: pointer; transition: inherit; - > .handle { - position: absolute; - top: 0; - bottom: 0; - left: 5px; - margin: auto 0; - border-radius: 100%; - transition: background-color 0.3s, transform 0.3s; - width: 16px; - height: 16px; - background-color: #fff; + > .check { + margin: auto; + opacity: 0; + color: var(--fgOnAccent); + font-size: 13px; + transform: scale(0.5); + transition: all 0.2s ease; + } + } + + &:hover { + > .button { + border-color: var(--inputBorderHover) !important; } } @@ -108,13 +113,13 @@ export default defineComponent({ margin-left: 16px; margin-top: 2px; display: block; - cursor: pointer; transition: inherit; color: var(--fg); > span { display: block; line-height: 20px; + cursor: pointer; transition: inherit; } @@ -129,12 +134,6 @@ export default defineComponent({ } } - &:hover { - > .button { - background-color: var(--accentedBg); - } - } - &.disabled { opacity: 0.6; cursor: not-allowed; @@ -142,11 +141,12 @@ export default defineComponent({ &.checked { > .button { - background-color: var(--accent); - border-color: var(--accent); + background-color: var(--accent) !important; + border-color: var(--accent) !important; - > .handle { - transform: translateX(10px); + > .check { + opacity: 1; + transform: scale(1); } } } diff --git a/packages/client/src/components/form/textarea.vue b/packages/client/src/components/form/textarea.vue index 98fd0da94..c9ba9b97a 100644 --- a/packages/client/src/components/form/textarea.vue +++ b/packages/client/src/components/form/textarea.vue @@ -4,7 +4,7 @@