From c3d07c8f1ef96c1f0f552488fdfbc013e886a692 Mon Sep 17 00:00:00 2001 From: sim1222 Date: Tue, 15 Oct 2024 02:43:15 +0900 Subject: [PATCH] explotion --- .gitignore | 4 +- packages/client/index.html | 84 ++ packages/client/package.json | 2 + packages/client/src/boot.js | 335 ++++++ packages/client/src/config.ts | 1886 +++++++++++++++++++++++++++++++- packages/client/src/init.ts | 333 +++--- packages/client/src/style.css | 70 ++ packages/client/vite.config.ts | 97 +- packages/client/yarn.lock | 221 +++- 9 files changed, 2839 insertions(+), 193 deletions(-) create mode 100644 packages/client/index.html create mode 100644 packages/client/src/boot.js create mode 100644 packages/client/src/style.css diff --git a/.gitignore b/.gitignore index b3659fcb6..3a264ca4a 100644 --- a/.gitignore +++ b/.gitignore @@ -46,4 +46,6 @@ ormconfig.json *.blend4 *.blend5 -start.sh \ No newline at end of file +start.sh + +/packages/client/dist diff --git a/packages/client/index.html b/packages/client/index.html new file mode 100644 index 000000000..7a6bfc320 --- /dev/null +++ b/packages/client/index.html @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + ✚🌎✚ A interplanetary communication platform ✚🚀✚ + + + + + + + + +
+ +
+ + + + + + + + + + +
+
+ + + diff --git a/packages/client/package.json b/packages/client/package.json index 076b5a282..f0c7ea759 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -3,6 +3,7 @@ "scripts": { "watch": "vite build --watch --mode development", "build": "vite build", + "preview": "vite preview", "lint": "eslint --quiet \"src/**/*.{ts,vue}\"", "typecheck:vue": "vue-tsc --noEmit", "typecheck:tsc": "tsc -p . --noEmit" @@ -64,6 +65,7 @@ "uuid": "10.0.0", "vanilla-tilt": "1.8.1", "vite": "5.4.8", + "vite-plugin-pug": "0.4.1", "vue": "3.5.12", "vue-prism-editor": "2.0.0-alpha.2", "vuedraggable": "4.0.1" diff --git a/packages/client/src/boot.js b/packages/client/src/boot.js new file mode 100644 index 000000000..672a39e92 --- /dev/null +++ b/packages/client/src/boot.js @@ -0,0 +1,335 @@ +/** + * BOOT LOADER + * サヌバヌからレスポンスされるHTMLに埋め蟌たれるスクリプトで、以䞋の圹割を持ちたす。 + * - 翻蚳ファむルをフェッチする。 + * - バヌゞョンに基づいお適切なメむンスクリプトを読み蟌む。 + * - キャッシュされたコンパむル枈みテヌマを適甚する。 + * - クラむアントの蚭定倀に基づいお察応するHTMLクラス等を蚭定する。 + * テヌマをこの段階で蚭定するのは、メむンスクリプトが読み蟌たれる間もテヌマを適甚したいためです。 + * 泚: webpackは介さないため、このファむルではrequireやimportは䜿えたせん。 + */ + +"use strict"; + +// ブロックの䞭に入れないず、定矩した倉数がブラりザのグロヌバルスコヌプに登録されおしたい邪魔なので +(async () => { + window.onerror = (e) => { + console.error(e); + renderError("SOMETHING_HAPPENED", e); + }; + window.onunhandledrejection = (e) => { + console.error(e); + renderError("SOMETHING_HAPPENED_IN_PROMISE", e); + }; + + const v = localStorage.getItem("v") || VERSION; + + //#region Detect language & fetch translations + const localeVersion = localStorage.getItem("localeVersion"); + const localeOutdated = localeVersion == null || localeVersion !== v; + + if (!localStorage.hasOwnProperty("locale") || localeOutdated) { + const supportedLangs = ["ja-NY", "ja-JP", "en-US"]; + let lang = localStorage.getItem("lang"); + if (lang == null || !supportedLangs.includes(lang)) { + if (supportedLangs.includes(navigator.language)) { + lang = navigator.language; + if (lang === "ja-JP") { + lang = "ja-NY"; + } + } else { + lang = supportedLangs.find( + (x) => x.split("-")[0] === navigator.language, + ); + + // Fallback + if (lang == null) lang = "en-US"; + } + } + + const res = await fetch(`/assets/locales/${lang}.${v}.json`); + const fallback = await fetch(`/assets/locales/ja-JP.${v}.json`); + + if (res.status === 200 && fallback.status === 200) { + const merged = { ...(await fallback.json()), ...(await res.json()) }; + localStorage.setItem("lang", lang); + localStorage.setItem("locale", JSON.stringify(merged)); + localStorage.setItem("localeVersion", v); + } else { + await checkUpdate(); + renderError("LOCALE_FETCH"); + return; + } + } + //#endregion + + //#region Script + function importAppScript() { + import(`/assets/${CLIENT_ENTRY}`).catch(async (e) => { + await checkUpdate(); + console.error(e); + renderError("APP_IMPORT", e); + }); + } + + // タむミングによっおは、この時点でDOMの構築が枈んでいる堎合ずそうでない堎合ずがある + if (document.readyState !== "loading") { + importAppScript(); + } else { + window.addEventListener("DOMContentLoaded", () => { + importAppScript(); + }); + } + //#endregion + + //#region Theme + const theme = localStorage.getItem("theme"); + if (theme) { + for (const [k, v] of Object.entries(JSON.parse(theme))) { + document.documentElement.style.setProperty(`--${k}`, v.toString()); + + // HTMLの theme-color 適甚 + if (k === "htmlThemeColor") { + for (const tag of document.head.children) { + if ( + tag.tagName === "META" && + tag.getAttribute("name") === "theme-color" + ) { + tag.setAttribute("content", v); + break; + } + } + } + } + } + const colorSchema = localStorage.getItem("colorSchema"); + if (colorSchema) { + document.documentElement.style.setProperty("color-schema", colorSchema); + } + //#endregion + + const fontSize = localStorage.getItem("fontSize"); + if (fontSize) { + document.documentElement.classList.add("f-" + fontSize); + } + + const useSystemFont = localStorage.getItem("useSystemFont"); + if (useSystemFont) { + document.documentElement.classList.add("useSystemFont"); + } + + const wallpaper = localStorage.getItem("wallpaper"); + if (wallpaper) { + document.documentElement.style.backgroundImage = `url(${wallpaper})`; + } + + const customCss = localStorage.getItem("customCss"); + if (customCss && customCss.length > 0) { + const style = document.createElement("style"); + style.innerHTML = customCss; + document.head.appendChild(style); + } + + async function addStyle(styleText) { + let css = document.createElement("style"); + css.appendChild(document.createTextNode(styleText)); + document.head.appendChild(css); + } + + function renderError(code, details) { + let errorsElement = document.getElementById("errors"); + + if (!errorsElement) { + document.body.innerHTML = ` + + + + + +

An error has occurred!

+ +

Don't worry, it's (probably) not your fault.

+

If the problem persists after refreshing, please contact your instance's administrator.
You may also try the following options:

+

Update your os and browser.

+

Disable an adblocker.

+ + + +
+ + + +
+ + + +
+
+ `; + errorsElement = document.getElementById("errors"); + } + const detailsElement = document.createElement("details"); + detailsElement.innerHTML = ` +
+ + ERROR CODE: ${code} + + ${JSON.stringify(details)}`; + errorsElement.appendChild(detailsElement); + addStyle(` + * { + font-family: BIZ UDGothic, Roboto, HelveticaNeue, Arial, sans-serif; + } + + #misskey_app, + #splash { + display: none !important; + } + + body, + html { + background-color: #222; + color: #dfddcc; + justify-content: center; + margin: auto; + padding: 10px; + text-align: center; + } + + button { + border-radius: 999px; + padding: 0px 12px 0px 12px; + border: none; + cursor: pointer; + margin-bottom: 12px; + } + + .button-big { + background: linear-gradient(90deg, rgb(134, 179, 0), rgb(74, 179, 0)); + line-height: 50px; + } + + .button-big:hover { + background: rgb(153, 204, 0); + } + + .button-small { + background: #444; + line-height: 40px; + } + + .button-small:hover { + background: #555; + } + + .button-label-big { + color: #222; + font-weight: bold; + font-size: 20px; + padding: 12px; + } + + .button-label-small { + color: rgb(153, 204, 0); + font-size: 16px; + padding: 12px; + } + + a { + color: rgb(134, 179, 0); + text-decoration: none; + } + + p, + li { + font-size: 16px; + } + + .dont-worry, + #msg { + font-size: 18px; + } + + .icon-warning { + color: #dec340; + height: 4rem; + padding-top: 2rem; + } + + h1 { + font-size: 32px; + } + + code { + font-family: Fira, FiraCode, monospace; + } + + details { + background: #333; + margin-bottom: 2rem; + padding: 0.5rem 1rem; + width: 40rem; + border-radius: 10px; + justify-content: center; + margin: auto; + } + + summary { + cursor: pointer; + } + + summary > * { + display: inline; + } + + @media screen and (max-width: 500px) { + details { + width: 50%; + } + `); + } + + // eslint-disable-next-line no-inner-declarations + async function checkUpdate() { + try { + const res = await fetch("/api/meta", { + method: "POST", + cache: "no-cache", + }); + + const meta = await res.json(); + + if (meta.version != v) { + localStorage.setItem("v", meta.version); + refresh(); + } + } catch (e) { + console.error(e); + renderError("UPDATE_CHECK", e); + throw e; + } + } + + // eslint-disable-next-line no-inner-declarations + function refresh() { + // Clear cache (service worker) + try { + navigator.serviceWorker.controller.postMessage("clear"); + navigator.serviceWorker.getRegistrations().then((registrations) => { + registrations.forEach((registration) => registration.unregister()); + }); + } catch (e) { + console.error(e); + } + + location.reload(); + } +})(); diff --git a/packages/client/src/config.ts b/packages/client/src/config.ts index f2022b0f0..fd8d6b5cc 100644 --- a/packages/client/src/config.ts +++ b/packages/client/src/config.ts @@ -1,15 +1,1885 @@ const address = new URL(location.href); -const siteName = (document.querySelector('meta[property="og:site_name"]') as HTMLMetaElement)?.content; +const siteName = ( + document.querySelector('meta[property="og:site_name"]') as HTMLMetaElement +)?.content; export const host = address.host; export const hostname = address.hostname; export const url = address.origin; -export const apiUrl = url + '/api'; -export const wsUrl = url.replace('http://', 'ws://').replace('https://', 'wss://') + '/streaming'; -export const lang = localStorage.getItem('lang'); +export const apiUrl = "https://simkey.net/api"; +export const wsUrl = + "https://simkey.net" + .replace("http://", "ws://") + .replace("https://", "wss://") + "/streaming"; +export const lang = localStorage.getItem("lang"); export const langs = _LANGS_; -export const locale = JSON.parse(localStorage.getItem('locale')); +export const locale = { + _lang_: "日本語", + headlineMisskey: "ノヌトで぀ながるネットワヌク", + introMisskey: + "ようこそMisskeyは、オヌプン゜ヌスの分散型マむクロブログサヌビスです。\n「ノヌト」を䜜成しお、いた起こっおいるこずを共有したり、あなたに぀いお皆に発信しよう📡\n「リアクション」機胜で、皆のノヌトに玠早く反応を远加するこずもできたす👍\n新しい䞖界を探怜しよう🚀", + poweredByMisskeyDescription: + "{name}は、オヌプン゜ヌスのプラットフォヌムMisskeyを䜿ったサヌビス(Misskeyむンスタンスず呌ばれたす)のひず぀です。", + 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: "もっず芋る", + showLess: "閉じる", + 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: "リアクション", + reactWithRenote: "぀いでにRenoteする", + reactionSetting: "ピッカヌに衚瀺するリアクション", + 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: + "このアカりントが猫であるこずを瀺す堎合は、このフラグをオンにしたす。", + flagShowTimelineReplies: "タむムラむンにノヌトぞの返信を衚瀺する", + flagShowTimelineRepliesDescription: + "オンにするず、タむムラむンにナヌザヌのノヌト以倖にもそのナヌザヌの他のノヌトぞの返信を衚瀺したす。", + 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: "デフォルト", + defaultValueIs: "デフォルト: {value}", + noCustomEmojis: "絵文字はありたせん", + noJobs: "ゞョブはありたせん", + federating: "連合䞭", + blocked: "ブロック䞭", + suspended: "配信停止", + all: "党お", + subscribing: "賌読䞭", + publishing: "配信䞭", + notResponding: "応答なし", + instanceFollowing: "むンスタンスのフォロヌ", + instanceFollowers: "むンスタンスのフォロワヌ", + instanceUsers: "むンスタンスのナヌザヌ", + changePassword: "パスワヌドを倉曎", + security: "セキュリティ", + retypedNotMatch: "入力が䞀臎したせん。", + currentPassword: "珟圚のパスワヌド", + newPassword: "新しいパスワヌド", + newPasswordRetype: "新しいパスワヌド(再入力)", + attachFile: "ファむルを添付", + attachVideoFile: "MOVファむルを添付", + more: "もっず", + featured: "ハむラむト", + usernameOrUserId: "ナヌザヌ名かナヌザヌID", + noSuchUser: "ナヌザヌが芋぀かりたせん", + lookup: "照䌚", + announcements: "お知らせ", + imageUrl: "画像URL", + remove: "削陀", + removed: "削陀したした", + removeAreYouSure: "「{x}」を削陀したすか", + deleteAreYouSure: "「{x}」を削陀したすか", + resetAreYouSure: "リセットしたすか", + saved: "保存したした", + messaging: "チャット", + upload: "アップロヌド", + keepOriginalUploading: "オリゞナル画像を保持", + keepOriginalUploadingDescription: + "画像をアップロヌドする時にオリゞナル版を保持したす。オフにするずアップロヌド時にブラりザでWeb公開甚画像を生成したす。", + fromDrive: "ドラむブから", + fromUrl: "URLから", + uploadFromUrl: "URLアップロヌド", + uploadFromUrlDescription: "アップロヌドしたいファむルのURL", + uploadFromUrlRequested: "アップロヌドをリク゚ストしたした", + uploadFromUrlMayTakeTime: + "アップロヌドが完了するたで時間がかかる堎合がありたす。", + explore: "み぀ける", + 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: "招埅", + 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: "ブラりザぞのプッシュ通知を有効にする", + 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: "モデレヌタヌ", + moderation: "モデレヌション", + 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: "グルヌプに招埅", + 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ネむティブの絵文字を䜿甚", + disableDrawer: "メニュヌをドロワヌで衚瀺しない", + 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: "項目を远加", + relays: "リレヌ", + addRelay: "リレヌの远加", + inboxUrl: "inboxのURL", + addedRelays: "远加枈みのリレヌ", + serviceworkerInfo: "プッシュ通知を行うには有効にする必芁がありたす。", + deletedNote: "削陀された投皿", + invisibleNote: "非公開の投皿", + enableInfiniteScroll: "自動でもっず芋る", + visibility: "公開範囲", + poll: "アンケヌト", + useCw: "内容を隠す", + enablePlayer: "プレむダヌを開く", + disablePlayer: "プレむダヌを閉じる", + expandTweet: "ツむヌトを展開する", + themeEditor: "テヌマ゚ディタヌ", + description: "説明", + describeFile: "キャプションを付ける", + enterFileDescription: "キャプションを入力", + author: "䜜者", + leaveConfirm: "未保存の倉曎がありたす。砎棄したすか", + manage: "管理", + plugins: "プラグむン", + preferencesBackups: "蚭定のバックアップ", + 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: "ワヌドミュヌト", + regexpError: "正芏衚珟゚ラヌ", + regexpErrorDescription: + "{tab}ワヌドミュヌトの{line}行目の正芏衚珟に゚ラヌが発生したした:", + instanceMute: "むンスタンスミュヌト", + userSaysSomething: "{name}が䜕かを蚀いたした", + makeActive: "アクティブにする", + display: "衚瀺", + copy: "コピヌ", + metrics: "メトリクス", + overview: "抂芁", + logs: "ログ", + delayed: "遅延", + database: "デヌタベヌス", + channel: "チャンネル", + create: "䜜成", + notificationSetting: "通知蚭定", + notificationSettingDesc: "衚瀺する通知の皮別を遞択しおください。", + useGlobalSetting: "グロヌバル蚭定を䜿う", + useGlobalSettingDesc: + "オンにするず、アカりントの通知蚭定が䜿甚されたす。オフにするず、個別に蚭定できるようになりたす。", + other: "その他", + regenerateLoginToken: "ログむントヌクンを再生成", + regenerateLoginTokenDescription: + "ログむンに䜿甚される内郚トヌクンを再生成したす。通垞この操䜜を行う必芁はありたせん。再生成するず、党おのデバむスでログアりトされたす。", + setMultipleBySeparatingWithSpace: "スペヌスで区切っお耇数蚭定できたす。", + fileIdOrUrl: "ファむルIDたたはURL", + behavior: "動䜜", + sample: "サンプル", + abuseReports: "通報", + reportAbuse: "通報", + reportAbuseOf: "{name}を通報する", + fillAbuseReportDescription: + "通報理由の詳现を蚘入しおください。察象のノヌトがある堎合はそのURLも蚘入しおください。", + abuseReported: "内容が送信されたした。ご報告ありがずうございたした。", + reporter: "通報者", + reporteeOrigin: "通報先", + reporterOrigin: "通報元", + forwardReport: "リモヌトむンスタンスに通報を転送する", + forwardReportIsAnonymous: + "リモヌトむンスタンスからはあなたの情報は芋れず、匿名のシステムアカりントずしお衚瀺されたす。", + send: "送信", + abuseMarkAsResolved: "察応枈みにする", + openInNewTab: "新しいタブで開く", + openInSideView: "サむドビュヌで開く", + defaultNavigationBehaviour: "デフォルトのナビゲヌション", + editTheseSettingsMayBreakAccount: + "これらの蚭定を線集するずアカりントが砎損する可胜性がありたす。", + instanceTicker: "ノヌトのむンスタンス情報", + waitingFor: "{x}を埅っおいたす", + random: "ランダム", + system: "システム", + switchUi: "UI切り替え", + desktop: "デスクトップ", + clip: "クリップ", + createNew: "新芏䜜成", + optional: "任意", + createNewClip: "新しいクリップを䜜成", + unclip: "クリップ解陀", + confirmToUnclipAlreadyClippedNote: + "このノヌトはすでにクリップ「{name}」に含たれおいたす。ノヌトをこのクリップから陀倖したすか", + 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にいいねされた数", + contact: "連絡先", + useSystemFont: "システムのデフォルトのフォントを䜿う", + clips: "クリップ", + experimentalFeatures: "実隓的機胜", + developer: "開発者", + makeExplorable: "アカりントを芋぀けやすくする", + makeExplorableDescription: + "オフにするず、「み぀ける」にアカりントが茉らなくなりたす。", + showGapBetweenNotesInTimeline: "タむムラむンのノヌトを離しお衚瀺", + duplicate: "耇補", + left: "å·Š", + center: "䞭倮", + wide: "広い", + narrow: "狭い", + reloadToApplySetting: + "蚭定はペヌゞリロヌド埌に反映されたす。今すぐリロヌドしたすか", + needReloadToApply: "反映には再起動が必芁です。", + 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: "アカりントを遞択", + switchAccount: "アカりントを切り替え", + 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: "隠す", + leaveGroup: "グルヌプから抜ける", + leaveGroupConfirm: "「{name}」から抜けたすか", + useDrawerReactionPickerForMobile: "モバむルデバむスのずきドロワヌで衚瀺", + welcomeBackWithName: "おかえりなさい、{name}さん", + clickToFinishEmailVerification: + "[{ok}]を抌しお、メヌルアドレスの確認を完了しおください。", + overridedDeviceKind: "デバむスタむプ", + smartphone: "スマヌトフォン", + tablet: "タブレット", + auto: "自動", + themeColor: "テヌマカラヌ", + size: "サむズ", + numberOfColumn: "列の数", + searchByGoogle: "怜玢", + instanceDefaultLightTheme: "むンスタンスデフォルトのラむトテヌマ", + instanceDefaultDarkTheme: "むンスタンスデフォルトのダヌクテヌマ", + instanceDefaultThemeDescription: + "オブゞェクト圢匏のテヌマコヌドを蚘入したす。", + mutePeriod: "ミュヌトする期限", + indefinitely: "無期限", + tenMinutes: "10分", + oneHour: "1時間", + oneDay: "1日", + oneWeek: "1週間", + reflectMayTakeTime: "反映されるたで時間がかかる堎合がありたす。", + failedToFetchAccountInformation: "アカりント情報の取埗に倱敗したした", + rateLimitExceeded: "レヌト制限を超えたした", + cropImage: "画像のクロップ", + cropImageAsk: "画像をクロップしたすか", + file: "ファむル", + recentNHours: "盎近{n}時間", + recentNDays: "盎近{n}日", + noEmailServerWarning: "メヌルサヌバヌの蚭定がされおいたせん。", + thereIsUnresolvedAbuseReportWarning: "未察応の通報がありたす。", + recommended: "掚奚", + check: "チェック", + driveCapOverrideLabel: "このナヌザヌのドラむブ容量䞊限を倉曎", + driveCapOverrideCaption: "0以䞋を指定するず解陀されたす。", + requireAdminForView: + "閲芧するには管理者アカりントでログむンしおいる必芁がありたす。", + isSystemAccount: "システムにより自動で䜜成・管理されおいるアカりントです。", + typeToConfirm: "この操䜜を行うには {x} ず入力しおください", + deleteAccount: "アカりント削陀", + document: "ドキュメント", + numberOfPageCache: "ペヌゞキャッシュ数", + numberOfPageCacheDescription: + "倚くするず利䟿性が向䞊したすが、負荷ずメモリ䜿甚量が増えたす。", + logoutConfirm: "ログアりトしたすか", + lastActiveDate: "最終利甚日時", + statusbar: "ステヌタスバヌ", + pleaseSelect: "遞択しおください", + reverse: "反転", + colored: "色付き", + refreshInterval: "曎新間隔", + label: "ラベル", + type: "タむプ", + speed: "速床", + slow: "遅い", + fast: "速い", + sensitiveMediaDetection: "センシティブなメディアの怜出", + localOnly: "ロヌカルのみ", + remoteOnly: "リモヌトのみ", + failedToUpload: "アップロヌド倱敗", + cannotUploadBecauseInappropriate: + "䞍適切な内容を含む可胜性があるず刀定されたためアップロヌドできたせん。", + cannotUploadBecauseNoFreeSpace: + "ドラむブの空き容量が無いためアップロヌドできたせん。", + beta: "ベヌタ", + enableAutoSensitive: "自動NSFW刀定", + enableAutoSensitiveDescription: + "利甚可胜な堎合は、機械孊習を利甚しお自動でメディアにNSFWフラグを蚭定したす。この機胜をオフにしおも、むンスタンスによっおは自動で蚭定されるこずがありたす。", + activeEmailValidationDescription: + "ナヌザヌのメヌルアドレスのバリデヌションを、捚おアドかどうかや実際に通信可胜かどうかなどを刀定しより積極的に行いたす。オフにするず単に文字列ずしお正しいかどうかのみチェックされたす。", + navbar: "ナビゲヌションバヌ", + shuffle: "シャッフル", + account: "アカりント", + move: "移動", + deckOld: "旧デッキ", + pakuruConfirm: "パクりたすか", + pakuru: "パクる", + duplicateEmoji: "同じ名前の絵文字が存圚したす。むンポヌトしたすか", + _sensitiveMediaDetection: { + description: + "機械孊習を䜿っお自動でセンシティブなメディアを怜出し、モデレヌションに圹立おるこずができたす。サヌバヌの負荷が少し増えたす。", + sensitivity: "怜出感床", + sensitivityDescription: + "感床を䜎くするず、誀怜知(停陜性)が枛りたす。感床を高くするず、怜知挏れ(停陰性)が枛りたす。", + setSensitiveFlagAutomatically: "NSFWフラグを蚭定する", + setSensitiveFlagAutomaticallyDescription: + "この蚭定をオフにしおも内郚的に刀定結果は保持されたす。", + analyzeVideos: "動画の解析を有効化", + analyzeVideosDescription: + "静止画に加えお動画も解析するようにしたす。サヌバヌの負荷が少し増えたす。", + }, + _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: "プラグむンの管理", + }, + _preferencesBackups: { + list: "䜜成したバックアップ", + saveNew: "新芏保存", + loadFile: "ファむルを読み蟌み", + apply: "このデバむスに適甚", + save: "䞊曞き保存", + inputName: "バックアップ名を入力", + cannotSave: "保存できたせん", + nameAlreadyExists: + "バックアップ名「{name}」は既に存圚したす。違う名前を指定しおください。", + applyConfirm: + "バックアップ「{name}」を珟圚のデバむスに適甚したすか珟圚のデバむス蚭定は倱われたす。", + saveConfirm: "{name}に䞊曞き保存したすか", + deleteConfirm: "{name}を削陀したすか", + renameConfirm: "「{old}」を「{new}」に倉曎したすか", + noBackups: + "バックアップはありたせん。「新芏保存」で珟圚のクラむアント蚭定をサヌバヌに保存できたす。", + createdAt: "䜜成日時: {date} {time}", + updatedAt: "曎新日時: {date} {time}", + cannotLoad: "読み蟌みできたせん", + invalidFile: "ファむル圢匏が違いたす。", + }, + _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: "指定した角床で回転させたす。", + plain: "プレヌン", + plainDescription: "内偎の構文を党お無効にしたす。", + }, + _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: "チャンネル通知", + }, + _ago: { + 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をお楜しみください🚀", + step8_1: "さいごに", + step8_2: "このむンスタンスではガラス颚デザむンを暙準で採甚しおいたす。", + step8_3: "端末によっおはパフォヌマンスが䜎䞋する堎合がありたす。", + step8_4: + "その堎合は蚭定よりブラヌを䜿甚しないように蚭定テヌマをNoGlassにしおください。", + }, + _2fa: { + alreadyRegistered: "既に蚭定は完了しおいたす。", + registerDevice: "デバむスを登録", + registerKey: "キヌを登録", + step1: + "たず、{a}や{b}などの認蚌アプリをお䜿いのデバむスにむンストヌルしたす。", + step2: "次に、衚瀺されおいるQRコヌドをアプリでスキャンしたす。", + step2Url: "デスクトップアプリでは次のURLを入力したす:", + 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リヌダヌ", + rssTicker: "RSSティッカヌ", + activity: "アクティビティ", + photos: "フォト", + digitalClock: "デゞタル時蚈", + unixClock: "UNIX時蚈", + federation: "連合", + instanceCloud: "むンスタンスクラりド", + 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: + "プロフィヌルに衚ずしお远加情報を衚瀺するこずができたす。", + metadataLabel: "ラベル", + metadataContent: "内容", + changeAvatar: "アバタヌ画像を倉曎", + changeBanner: "バナヌ画像を倉曎", + }, + _exportOrImport: { + allNotes: "党おのノヌト", + followingList: "フォロヌ", + muteList: "ミュヌト", + blockingList: "ブロック", + userLists: "リスト", + excludeMutingUsers: "ミュヌトしおいるナヌザヌを陀倖", + excludeInactiveUsers: "䜿われおいないアカりントを陀倖", + }, + _charts: { + federation: "連合", + apRequest: "リク゚スト", + 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: "グロヌバル", + }, + _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: "{userName}があなたをグルヌプに招埅したした", + pollEnded: "アンケヌトの結果が出たした", + emptyPushNotificationMessage: "プッシュ通知の曎新をしたした", + _types: { + all: "すべお", + follow: "フォロヌ", + mention: "メンション", + reply: "リプラむ", + renote: "Renote", + quote: "匕甚", + reaction: "リアクション", + pollVote: "アンケヌトに投祚された", + pollEnded: "アンケヌトが終了", + receiveFollowRequest: "フォロヌ申請を受け取った", + followRequestAccepted: "フォロヌが受理された", + groupInvited: "グルヌプに招埅された", + app: "連携アプリからの通知", + }, + _actions: { followBack: "フォロヌバック", reply: "返信", renote: "Renote" }, + }, + _deck: { + alwaysShowMainColumn: "垞にメむンカラムを衚瀺", + columnAlign: "カラムの寄せ", + addColumn: "カラムを远加", + configureColumn: "カラムの蚭定", + swapLeft: "巊に移動", + swapRight: "右に移動", + swapUp: "䞊に移動", + swapDown: "䞋に移動", + stackLeft: "巊に重ねる", + popRight: "右に出す", + profile: "プロファむル", + newProfile: "新芏プロファむル", + deleteProfile: "プロファむルを削陀", + introduction: + "カラムを組み合わせお自分だけのむンタヌフェむスを䜜りたしょう", + introduction2: "画面の右にある + を抌しお、い぀でもカラムを远加できたす。", + widgetsIntroduction: + "カラムのメニュヌから、「りィゞェットの線集」を遞択しおりィゞェットを远加しおください", + _columns: { + main: "メむン", + widgets: "りィゞェット", + notifications: "通知", + tl: "タむムラむン", + antenna: "アンテナ", + list: "リスト", + mentions: "あなた宛お", + direct: "ダむレクト", + }, + }, + _simkey: { + reactionList: "リアクション䞀芧", + emojiGen: "絵文字を生成", + emojiAlign: "文字揃え", + emojiSizeSetting: "サむズ調敎", + emojiSizeFixed: "文字サむズを固定する", + emojiStretch: "自動で䌞瞮しない", + emojiGenerate: "生成", + emojiColor: "カラヌコヌド", + colorPicker: "カラヌピッカヌ", + emojiApproval: "絵文字を登録", + emojiNormal: "もじもじ", + emojiIfilter: "芋せおほしい", + deckOld: "旧デッキ", + pakuruConfirm: "パクりたすか", + pakuru: "パクる", + duplicateEmoji: "同じ名前の絵文字が存圚したす。むンポヌトしたすか", + experimentalFeatures: "詊隓機胜", + ownRisk: "自己責任で䜿甚しおください", + localMediaProxy: "ロヌカルメディアプロキシ", + localMediaProxyInfo: "クラむアント偎でメディアプロキシを指定したす", + confirmReset: "リセットしおもよろしいですか", + }, + _version_: "12.120.0-simkey-2023-12-03", +}; export const version = _VERSION_; -export const instanceName = siteName === 'Misskey' ? host : siteName; -export const ui = localStorage.getItem('ui'); -export const debug = localStorage.getItem('debug') === 'true'; +export const instanceName = siteName === "Misskey" ? host : siteName; +export const ui = localStorage.getItem("ui"); +export const debug = localStorage.getItem("debug") === "true"; diff --git a/packages/client/src/init.ts b/packages/client/src/init.ts index 8758868b2..793fdc83b 100644 --- a/packages/client/src/init.ts +++ b/packages/client/src/init.ts @@ -1,56 +1,64 @@ /** * Client entry point */ +import "@/style.css"; -import '@/style.scss'; +import "@/style.scss"; //#region account indexedDB migration -import { set } from '@/scripts/idb-proxy'; +import { set } from "@/scripts/idb-proxy"; -if (localStorage.getItem('accounts') != null) { - set('accounts', JSON.parse(localStorage.getItem('accounts'))); - localStorage.removeItem('accounts'); +if (localStorage.getItem("accounts") != null) { + set("accounts", JSON.parse(localStorage.getItem("accounts"))); + localStorage.removeItem("accounts"); } //#endregion -import { computed, createApp, watch, markRaw, version as vueVersion, defineAsyncComponent } from 'vue'; -import { compareVersions } from 'compare-versions'; -import JSON5 from 'json5'; +import { + computed, + createApp, + watch, + markRaw, + version as vueVersion, + defineAsyncComponent, +} from "vue"; +import { compareVersions } from "compare-versions"; +import JSON5 from "json5"; -import widgets from '@/widgets'; -import directives from '@/directives'; -import components from '@/components'; -import { version, ui, lang, host } from '@/config'; -import { applyTheme } from '@/scripts/theme'; -import { isDeviceDarkmode } from '@/scripts/is-device-darkmode'; -import { i18n } from '@/i18n'; -import { confirm, alert, post, popup, toast } from '@/os'; -import { stream } from '@/stream'; -import * as sound from '@/scripts/sound'; -import { $i, refreshAccount, login, updateAccount, signout } from '@/account'; -import { defaultStore, ColdDeviceStorage } from '@/store'; -import { fetchInstance, instance } from '@/instance'; -import { makeHotkey } from '@/scripts/hotkey'; -import { search } from '@/scripts/search'; -import { deviceKind } from '@/scripts/device-kind'; -import { initializeSw } from '@/scripts/initialize-sw'; -import { reloadChannel } from '@/scripts/unison-reload'; -import { reactionPicker } from '@/scripts/reaction-picker'; -import { getUrlWithoutLoginId } from '@/scripts/login-id'; -import { getAccountFromId } from '@/scripts/get-account-from-id'; +import widgets from "@/widgets"; +import directives from "@/directives"; +import components from "@/components"; +import { version, ui, lang, host } from "@/config"; +import { applyTheme } from "@/scripts/theme"; +import { isDeviceDarkmode } from "@/scripts/is-device-darkmode"; +import { i18n } from "@/i18n"; +import { confirm, alert, post, popup, toast } from "@/os"; +import { stream } from "@/stream"; +import * as sound from "@/scripts/sound"; +import { $i, refreshAccount, login, updateAccount, signout } from "@/account"; +import { defaultStore, ColdDeviceStorage } from "@/store"; +import { fetchInstance, instance } from "@/instance"; +import { makeHotkey } from "@/scripts/hotkey"; +import { search } from "@/scripts/search"; +import { deviceKind } from "@/scripts/device-kind"; +import { initializeSw } from "@/scripts/initialize-sw"; +import { reloadChannel } from "@/scripts/unison-reload"; +import { reactionPicker } from "@/scripts/reaction-picker"; +import { getUrlWithoutLoginId } from "@/scripts/login-id"; +import { getAccountFromId } from "@/scripts/get-account-from-id"; (async () => { console.info(`Misskey v${version}`); if (_DEV_) { - console.warn('Development mode!!!'); + console.warn("Development mode!!!"); console.info(`vue ${vueVersion}`); (window as any).$i = $i; (window as any).$store = defaultStore; - window.addEventListener('error', event => { + window.addEventListener("error", (event) => { console.error(event); /* alert({ @@ -61,7 +69,7 @@ import { getAccountFromId } from '@/scripts/get-account-from-id'; */ }); - window.addEventListener('unhandledrejection', event => { + window.addEventListener("unhandledrejection", (event) => { console.error(event); /* alert({ @@ -74,10 +82,10 @@ import { getAccountFromId } from '@/scripts/get-account-from-id'; } // タッチデバむスでCSSの:hoverを機胜させる - document.addEventListener('touchend', () => {}, { passive: true }); + document.addEventListener("touchend", () => { }, { passive: true }); // 䞀斉リロヌド - reloadChannel.addEventListener('message', path => { + reloadChannel.addEventListener("message", (path) => { if (path !== null) location.href = path; else location.reload(); }); @@ -85,28 +93,30 @@ import { getAccountFromId } from '@/scripts/get-account-from-id'; //#region SEE: https://css-tricks.com/the-trick-to-viewport-units-on-mobile/ // TODO: い぀の日にか消したい const vh = window.innerHeight * 0.01; - document.documentElement.style.setProperty('--vh', `${vh}px`); - window.addEventListener('resize', () => { + document.documentElement.style.setProperty("--vh", `${vh}px`); + window.addEventListener("resize", () => { const vh = window.innerHeight * 0.01; - document.documentElement.style.setProperty('--vh', `${vh}px`); + document.documentElement.style.setProperty("--vh", `${vh}px`); }); //#endregion // If mobile, insert the viewport meta tag - if (['smartphone', 'tablet'].includes(deviceKind)) { - const viewport = document.getElementsByName('viewport').item(0); - viewport.setAttribute('content', - `${viewport.getAttribute('content')}, minimum-scale=1, maximum-scale=1, user-scalable=no, viewport-fit=cover`); + if (["smartphone", "tablet"].includes(deviceKind)) { + const viewport = document.getElementsByName("viewport").item(0); + viewport.setAttribute( + "content", + `${viewport.getAttribute("content")}, minimum-scale=1, maximum-scale=1, user-scalable=no, viewport-fit=cover`, + ); } //#region Set lang attr const html = document.documentElement; - html.setAttribute('lang', lang); + html.setAttribute("lang", lang); //#endregion //#region loginId const params = new URLSearchParams(location.search); - const loginId = params.get('loginId'); + const loginId = params.get("loginId"); if (loginId) { const target = getUrlWithoutLoginId(location.href); @@ -118,7 +128,7 @@ import { getAccountFromId } from '@/scripts/get-account-from-id'; } } - history.replaceState({ misskey: 'loginId' }, '', target); + history.replaceState({ misskey: "loginId" }, "", target); } //#endregion @@ -126,25 +136,25 @@ import { getAccountFromId } from '@/scripts/get-account-from-id'; //#region Fetch user if ($i && $i.token) { if (_DEV_) { - console.log('account cache found. refreshing...'); + console.log("account cache found. refreshing..."); } refreshAccount(); } else { if (_DEV_) { - console.log('no account cache found.'); + console.log("no account cache found."); } // 連携ログむンの堎合甚にCookieを参照する const i = (document.cookie.match(/igi=(\w+)/) || [null, null])[1]; - if (i != null && i !== 'null') { + if (i != null && i !== "null") { if (_DEV_) { - console.log('signing...'); + console.log("signing..."); } try { - document.body.innerHTML = '
Please wait...
'; + document.body.innerHTML = "
Please wait...
"; await login(i); } catch (err) { // Render the error screen @@ -153,7 +163,7 @@ import { getAccountFromId } from '@/scripts/get-account-from-id'; } } else { if (_DEV_) { - console.log('not signed in'); + console.log("not signed in"); } } } @@ -162,19 +172,24 @@ import { getAccountFromId } from '@/scripts/get-account-from-id'; const fetchInstanceMetaPromise = fetchInstance(); fetchInstanceMetaPromise.then(() => { - localStorage.setItem('v', instance.version); + localStorage.setItem("v", instance.version); // Init service worker initializeSw(); }); const app = createApp( - window.location.search === '?zen' ? defineAsyncComponent(() => import('@/ui/zen.vue')) : - !$i ? defineAsyncComponent(() => import('@/ui/visitor.vue')) : - ui === 'deck' ? defineAsyncComponent(() => import('@/ui/deck.vue')) : - ui === 'deckold' ? defineAsyncComponent(() => import('@/ui/deckold.vue')) : - ui === 'classic' ? defineAsyncComponent(() => import('@/ui/classic.vue')) : - defineAsyncComponent(() => import('@/ui/universal.vue')), + window.location.search === "?zen" + ? defineAsyncComponent(() => import("@/ui/zen.vue")) + : !$i + ? defineAsyncComponent(() => import("@/ui/visitor.vue")) + : ui === "deck" + ? defineAsyncComponent(() => import("@/ui/deck.vue")) + : ui === "deckold" + ? defineAsyncComponent(() => import("@/ui/deckold.vue")) + : ui === "classic" + ? defineAsyncComponent(() => import("@/ui/classic.vue")) + : defineAsyncComponent(() => import("@/ui/universal.vue")), ); if (_DEV_) { @@ -193,25 +208,26 @@ import { getAccountFromId } from '@/scripts/get-account-from-id'; directives(app); components(app); - const splash = document.getElementById('splash'); + const splash = document.getElementById("splash"); // 念のためnullチェック(HTMLが叀い堎合があるため(そのうち消す)) - if (splash) splash.addEventListener('transitionend', () => { - splash.remove(); - }); + if (splash) + splash.addEventListener("transitionend", () => { + splash.remove(); + }); // https://github.com/misskey-dev/misskey/pull/8575#issuecomment-1114239210 // なぜかinit.tsの内容が2回実行されるこずがあるため、mountするdivを1぀に制限する const rootEl = (() => { - const MISSKEY_MOUNT_DIV_ID = 'misskey_app'; + const MISSKEY_MOUNT_DIV_ID = "misskey_app"; const currentEl = document.getElementById(MISSKEY_MOUNT_DIV_ID); if (currentEl) { - console.warn('multiple import detected'); + console.warn("multiple import detected"); return currentEl; } - const rootEl = document.createElement('div'); + const rootEl = document.createElement("div"); rootEl.id = MISSKEY_MOUNT_DIV_ID; document.body.appendChild(rootEl); return rootEl; @@ -226,36 +242,49 @@ import { getAccountFromId } from '@/scripts/get-account-from-id'; reactionPicker.init(); if (splash) { - splash.style.opacity = '0'; - splash.style.pointerEvents = 'none'; + splash.style.opacity = "0"; + splash.style.pointerEvents = "none"; } // クラむアントが曎新されたか - const lastVersion = localStorage.getItem('lastVersion'); + const lastVersion = localStorage.getItem("lastVersion"); if (lastVersion !== version) { - localStorage.setItem('lastVersion', version); + localStorage.setItem("lastVersion", version); // テヌマリビルドするため - localStorage.removeItem('theme'); + localStorage.removeItem("theme"); - try { // 倉なバヌゞョン文字列来るずcompareVersionsで゚ラヌになるため + try { + // 倉なバヌゞョン文字列来るずcompareVersionsで゚ラヌになるため if (lastVersion != null && compareVersions(version, lastVersion) === 1) { // ログむンしおる堎合だけ if ($i) { - popup(defineAsyncComponent(() => import('@/components/MkUpdated.vue')), {}, {}, 'closed'); + popup( + defineAsyncComponent(() => import("@/components/MkUpdated.vue")), + {}, + {}, + "closed", + ); } } - } catch (err) { - } + } catch (err) { } } // NOTE: この凊理は必ず↑のクラむアント曎新時凊理より埌に来るこず(テヌマ再構築のため) - watch(defaultStore.reactiveState.darkMode, (darkMode) => { - applyTheme(darkMode ? ColdDeviceStorage.get('darkTheme') : ColdDeviceStorage.get('lightTheme')); - }, { immediate: localStorage.theme == null }); + watch( + defaultStore.reactiveState.darkMode, + (darkMode) => { + applyTheme( + darkMode + ? ColdDeviceStorage.get("darkTheme") + : ColdDeviceStorage.get("lightTheme"), + ); + }, + { immediate: localStorage.theme == null }, + ); - const darkTheme = computed(ColdDeviceStorage.makeGetterSetter('darkTheme')); - const lightTheme = computed(ColdDeviceStorage.makeGetterSetter('lightTheme')); + const darkTheme = computed(ColdDeviceStorage.makeGetterSetter("darkTheme")); + const lightTheme = computed(ColdDeviceStorage.makeGetterSetter("lightTheme")); watch(darkTheme, (theme) => { if (defaultStore.state.darkMode) { @@ -270,46 +299,65 @@ import { getAccountFromId } from '@/scripts/get-account-from-id'; }); //#region Sync dark mode - if (ColdDeviceStorage.get('syncDeviceDarkMode')) { - defaultStore.set('darkMode', isDeviceDarkmode()); + if (ColdDeviceStorage.get("syncDeviceDarkMode")) { + defaultStore.set("darkMode", isDeviceDarkmode()); } - window.matchMedia('(prefers-color-scheme: dark)').addListener(mql => { - if (ColdDeviceStorage.get('syncDeviceDarkMode')) { - defaultStore.set('darkMode', mql.matches); + window.matchMedia("(prefers-color-scheme: dark)").addListener((mql) => { + if (ColdDeviceStorage.get("syncDeviceDarkMode")) { + defaultStore.set("darkMode", mql.matches); } }); //#endregion fetchInstanceMetaPromise.then(() => { if (defaultStore.state.themeInitial) { - if (instance.defaultLightTheme != null) ColdDeviceStorage.set('lightTheme', JSON5.parse(instance.defaultLightTheme)); - if (instance.defaultDarkTheme != null) ColdDeviceStorage.set('darkTheme', JSON5.parse(instance.defaultDarkTheme)); - defaultStore.set('themeInitial', false); + if (instance.defaultLightTheme != null) + ColdDeviceStorage.set( + "lightTheme", + JSON5.parse(instance.defaultLightTheme), + ); + if (instance.defaultDarkTheme != null) + ColdDeviceStorage.set( + "darkTheme", + JSON5.parse(instance.defaultDarkTheme), + ); + defaultStore.set("themeInitial", false); } }); - watch(defaultStore.reactiveState.useBlurEffectForModal, v => { - document.documentElement.style.setProperty('--modalBgFilter', v ? 'blur(4px)' : 'none'); - }, { immediate: true }); + watch( + defaultStore.reactiveState.useBlurEffectForModal, + (v) => { + document.documentElement.style.setProperty( + "--modalBgFilter", + v ? "blur(4px)" : "none", + ); + }, + { immediate: true }, + ); - watch(defaultStore.reactiveState.useBlurEffect, v => { - if (v) { - document.documentElement.style.removeProperty('--blur'); - } else { - document.documentElement.style.setProperty('--blur', 'none'); - } - }, { immediate: true }); + watch( + defaultStore.reactiveState.useBlurEffect, + (v) => { + if (v) { + document.documentElement.style.removeProperty("--blur"); + } else { + document.documentElement.style.setProperty("--blur", "none"); + } + }, + { immediate: true }, + ); let reloadDialogShowing = false; - stream.on('_disconnected_', async () => { - if (defaultStore.state.serverDisconnectedBehavior === 'reload') { + stream.on("_disconnected_", async () => { + if (defaultStore.state.serverDisconnectedBehavior === "reload") { location.reload(); - } else if (defaultStore.state.serverDisconnectedBehavior === 'dialog') { + } else if (defaultStore.state.serverDisconnectedBehavior === "dialog") { if (reloadDialogShowing) return; reloadDialogShowing = true; const { canceled } = await confirm({ - type: 'warning', + type: "warning", title: i18n.ts.disconnectedFromServer, text: i18n.ts.reloadConfirm, }); @@ -320,127 +368,134 @@ import { getAccountFromId } from '@/scripts/get-account-from-id'; } }); - stream.on('emojiAdded', emojiData => { + stream.on("emojiAdded", (emojiData) => { // TODO //store.commit('instance/set', ); }); - for (const plugin of ColdDeviceStorage.get('plugins').filter(p => p.active)) { - import('./plugin').then(({ install }) => { + for (const plugin of ColdDeviceStorage.get("plugins").filter( + (p) => p.active, + )) { + import("./plugin").then(({ install }) => { install(plugin); }); } const hotkeys = { - 'd': (): void => { - defaultStore.set('darkMode', !defaultStore.state.darkMode); + d: (): void => { + defaultStore.set("darkMode", !defaultStore.state.darkMode); }, - 's': search, + s: search, }; if (!$i) { - localStorage.setItem('wallpaper', 'https://simkey.net/files/c2f30819-64f7-42df-91b6-0e7fb122a413'); -} + localStorage.setItem( + "wallpaper", + "https://simkey.net/files/c2f30819-64f7-42df-91b6-0e7fb122a413", + ); + } -if ($i) { - // only add post shortcuts if logged in - hotkeys['p|n'] = post; + if ($i) { + // only add post shortcuts if logged in + hotkeys["p|n"] = post; if ($i.isDeleted) { alert({ - type: 'warning', + type: "warning", text: i18n.ts.accountDeletionInProgress, }); } - const lastUsed = localStorage.getItem('lastUsed'); + const lastUsed = localStorage.getItem("lastUsed"); if (lastUsed) { const lastUsedDate = parseInt(lastUsed, 10); // 二時間以䞊前なら if (Date.now() - lastUsedDate > 1000 * 60 * 60 * 2) { - toast(i18n.t('welcomeBackWithName', { - name: $i.name || $i.username, - })); + toast( + i18n.t("welcomeBackWithName", { + name: $i.name || $i.username, + }), + ); } } - localStorage.setItem('lastUsed', Date.now().toString()); + localStorage.setItem("lastUsed", Date.now().toString()); - if ('Notification' in window) { + if ("Notification" in window) { // 蚱可を埗おいなかったらリク゚スト - if (Notification.permission === 'default') { + if (Notification.permission === "default") { Notification.requestPermission(); } } - const main = markRaw(stream.useChannel('main', null, 'System')); + const main = markRaw(stream.useChannel("main", null, "System")); // 自分の情報が曎新されたずき - main.on('meUpdated', i => { + main.on("meUpdated", (i) => { updateAccount(i); }); - main.on('readAllNotifications', () => { + main.on("readAllNotifications", () => { updateAccount({ hasUnreadNotification: false }); }); - main.on('unreadNotification', () => { + main.on("unreadNotification", () => { updateAccount({ hasUnreadNotification: true }); }); - main.on('unreadMention', () => { + main.on("unreadMention", () => { updateAccount({ hasUnreadMentions: true }); }); - main.on('readAllUnreadMentions', () => { + main.on("readAllUnreadMentions", () => { updateAccount({ hasUnreadMentions: false }); }); - main.on('unreadSpecifiedNote', () => { + main.on("unreadSpecifiedNote", () => { updateAccount({ hasUnreadSpecifiedNotes: true }); }); - main.on('readAllUnreadSpecifiedNotes', () => { + main.on("readAllUnreadSpecifiedNotes", () => { updateAccount({ hasUnreadSpecifiedNotes: false }); }); - main.on('readAllMessagingMessages', () => { + main.on("readAllMessagingMessages", () => { updateAccount({ hasUnreadMessagingMessage: false }); }); - main.on('unreadMessagingMessage', () => { + main.on("unreadMessagingMessage", () => { updateAccount({ hasUnreadMessagingMessage: true }); - sound.play('chatBg'); + sound.play("chatBg"); }); - main.on('readAllAntennas', () => { + main.on("readAllAntennas", () => { updateAccount({ hasUnreadAntenna: false }); }); - main.on('unreadAntenna', () => { + main.on("unreadAntenna", () => { updateAccount({ hasUnreadAntenna: true }); - sound.play('antenna'); + sound.play("antenna"); }); - main.on('readAllAnnouncements', () => { + main.on("readAllAnnouncements", () => { updateAccount({ hasUnreadAnnouncement: false }); }); - main.on('readAllChannels', () => { + main.on("readAllChannels", () => { updateAccount({ hasUnreadChannel: false }); }); - main.on('unreadChannel', () => { + main.on("unreadChannel", () => { updateAccount({ hasUnreadChannel: true }); - sound.play('channel'); + sound.play("channel"); }); // トヌクンが再生成されたずき // このたたではMisskeyが利甚できないので匷制的にサむンアりトさせる - main.on('myTokenRegenerated', () => { + main.on("myTokenRegenerated", () => { signout(); }); } // shortcut - document.addEventListener('keydown', makeHotkey(hotkeys)); + document.addEventListener("keydown", makeHotkey(hotkeys)); })(); diff --git a/packages/client/src/style.css b/packages/client/src/style.css new file mode 100644 index 000000000..d59f00fe1 --- /dev/null +++ b/packages/client/src/style.css @@ -0,0 +1,70 @@ +html { + background-color: var(--bg); + color: var(--fg); +} + +#splash { + position: fixed; + z-index: 10000; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + cursor: wait; + background-color: var(--bg); + opacity: 1; + transition: opacity 0.5s ease; +} + +#splashIcon { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + margin: auto; + width: 64px; + height: 64px; + pointer-events: none; +} + +#splashSpinner { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + margin: auto; + display: inline-block; + width: 28px; + height: 28px; + transform: translateY(70px); + color: var(--accent); +} +#splashSpinner > .spinner { + position: absolute; + top: 0; + left: 0; + width: 28px; + height: 28px; + fill-rule: evenodd; + clip-rule: evenodd; + stroke-linecap: round; + stroke-linejoin: round; + stroke-miterlimit: 1.5; +} +#splashSpinner > .spinner.bg { + opacity: 0.275; +} +#splashSpinner > .spinner.fg { + animation: splashSpinner 0.5s linear infinite; +} + +@keyframes splashSpinner { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} diff --git a/packages/client/vite.config.ts b/packages/client/vite.config.ts index 4c3adcf42..410af3d9c 100644 --- a/packages/client/vite.config.ts +++ b/packages/client/vite.config.ts @@ -1,43 +1,59 @@ -import * as fs from 'fs'; -import pluginVue from '@vitejs/plugin-vue'; -import { defineConfig } from 'vite'; +import * as fs from "fs"; +import pluginVue from "@vitejs/plugin-vue"; +import { defineConfig } from "vite"; -import locales from '../../locales'; -import meta from '../../package.json'; -import pluginJson5 from './vite.json5'; +import locales from "../../locales"; +import meta from "../../package.json"; +import pluginJson5 from "./vite.json5"; -const extensions = ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.json', '.json5', '.svg', '.sass', '.scss', '.css', '.vue']; +const extensions = [ + ".ts", + ".tsx", + ".js", + ".jsx", + ".mjs", + ".json", + ".json5", + ".svg", + ".sass", + ".scss", + ".css", + ".vue", +]; export default defineConfig(({ command, mode }) => { - fs.mkdirSync(__dirname + '/../../built', { recursive: true }); - fs.writeFileSync(__dirname + '/../../built/meta.json', JSON.stringify({ version: meta.version }), 'utf-8'); + fs.mkdirSync(__dirname + "/../../built", { recursive: true }); + fs.writeFileSync( + __dirname + "/../../built/meta.json", + JSON.stringify({ version: meta.version }), + "utf-8", + ); return { - base: '/assets/', + // base: '/assets/', - plugins: [ - pluginVue(), - pluginJson5(), - ], + plugins: [pluginVue(), pluginJson5()], resolve: { extensions, alias: { - '@/': __dirname + '/src/', - '/client-assets/': __dirname + '/assets/', - '/static-assets/': __dirname + '/../backend/assets/', + "@/": __dirname + "/src/", + "/client-assets/": __dirname + "/assets/", + "/static-assets/": __dirname + "/../backend/assets/", }, }, define: { _VERSION_: JSON.stringify(meta.version), - _LANGS_: JSON.stringify(Object.entries(locales).map(([k, v]) => [k, v._lang_])), + _LANGS_: JSON.stringify( + Object.entries(locales).map(([k, v]) => [k, v._lang_]), + ), _ENV_: JSON.stringify(process.env.NODE_ENV), - _DEV_: process.env.NODE_ENV !== 'production', - _PERF_PREFIX_: JSON.stringify('Misskey:'), - _DATA_TRANSFER_DRIVE_FILE_: JSON.stringify('mk_drive_file'), - _DATA_TRANSFER_DRIVE_FOLDER_: JSON.stringify('mk_drive_folder'), - _DATA_TRANSFER_DECK_COLUMN_: JSON.stringify('mk_deck_column'), + _DEV_: process.env.NODE_ENV !== "production", + _PERF_PREFIX_: JSON.stringify("Misskey:"), + _DATA_TRANSFER_DRIVE_FILE_: JSON.stringify("mk_drive_file"), + _DATA_TRANSFER_DRIVE_FOLDER_: JSON.stringify("mk_drive_folder"), + _DATA_TRANSFER_DECK_COLUMN_: JSON.stringify("mk_deck_column"), __VUE_OPTIONS_API__: true, __VUE_PROD_DEVTOOLS__: false, }, @@ -45,34 +61,35 @@ export default defineConfig(({ command, mode }) => { css: { preprocessorOptions: { scss: { - api: "modern-compiler" - } - } + api: "modern-compiler", + }, + }, }, build: { target: [ - 'chrome100', - 'firefox100', - 'safari15', - 'es2017', // TODO: そのうち消す + "chrome100", + "firefox100", + "safari15", + "es2017", // TODO: そのうち消す ], - manifest: 'manifest.json', + manifest: "manifest.json", rollupOptions: { input: { - app: './src/init.ts', - }, - output: { - manualChunks: { - vue: ['vue'], - }, + app: "./index.html", + // app: "./src/init.ts", }, + // output: { + // manualChunks: { + // vue: ["vue"], + // }, + // }, }, cssCodeSplit: true, - outDir: __dirname + '/../../built/_client_dist_', - assetsDir: '.', + // outDir: __dirname + '/../../built/_client_dist_', + assetsDir: "assets", emptyOutDir: false, - sourcemap: process.env.NODE_ENV !== 'production', + sourcemap: process.env.NODE_ENV !== "production", reportCompressedSize: false, }, }; diff --git a/packages/client/yarn.lock b/packages/client/yarn.lock index 07d36e3e8..97931bbab 100644 --- a/packages/client/yarn.lock +++ b/packages/client/yarn.lock @@ -12,7 +12,7 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz#77b7f60c40b15c97df735b38a66ba1d7c3e93da5" integrity sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg== -"@babel/parser@^7.25.3": +"@babel/parser@^7.25.3", "@babel/parser@^7.6.0", "@babel/parser@^7.9.6": version "7.25.8" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.8.tgz#f6aaf38e80c36129460c1657c0762db584c9d5e2" integrity sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ== @@ -26,7 +26,7 @@ dependencies: regenerator-runtime "^0.14.0" -"@babel/types@^7.25.8": +"@babel/types@^7.25.8", "@babel/types@^7.6.1", "@babel/types@^7.9.6": version "7.25.8" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.8.tgz#5cf6037258e8a9bcad533f4979025140cb9993e1" integrity sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg== @@ -1028,6 +1028,11 @@ acorn-jsx@^5.3.2: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== +acorn@^7.1.1: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + acorn@^8.12.0, acorn@^8.9.0: version "8.12.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" @@ -1169,6 +1174,11 @@ arraybuffer.prototype.slice@^1.0.3: is-array-buffer "^3.0.4" is-shared-array-buffer "^1.0.2" +asap@~2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== + asn1@~0.2.3: version "0.2.6" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" @@ -1176,6 +1186,11 @@ asn1@~0.2.3: dependencies: safer-buffer "~2.1.0" +assert-never@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/assert-never/-/assert-never-1.3.0.tgz#c53cf3ad8fcdb67f400a941dea66dac7fe82dd2e" + integrity sha512-9Z3vxQ+berkL/JJo0dK+EY3Lp0s3NtSnP3VCLsh5HDcZPrh0M+KQRK5sWhUeyPPH+/RCxZqOxLMR+YC6vlviEQ== + assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" @@ -1247,6 +1262,13 @@ axios@^1.7.7: form-data "^4.0.0" proxy-from-env "^1.1.0" +babel-walk@3.0.0-canary-5: + version "3.0.0-canary-5" + resolved "https://registry.yarnpkg.com/babel-walk/-/babel-walk-3.0.0-canary-5.tgz#f66ecd7298357aee44955f235a6ef54219104b11" + integrity sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw== + dependencies: + "@babel/types" "^7.9.6" + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -1385,6 +1407,13 @@ char-regex@^1.0.2: resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== +character-parser@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/character-parser/-/character-parser-2.2.0.tgz#c7ce28f36d4bcd9744e5ffc2c5fcde1c73261fc0" + integrity sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw== + dependencies: + is-regex "^1.0.3" + chart.js@4.4.4: version "4.4.4" resolved "https://registry.yarnpkg.com/chart.js/-/chart.js-4.4.4.tgz#b682d2e7249f7a0cbb1b1d31c840266ae9db64b7" @@ -1529,6 +1558,14 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== +constantinople@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/constantinople/-/constantinople-4.0.1.tgz#0def113fa0e4dc8de83331a5cf79c8b325213151" + integrity sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw== + dependencies: + "@babel/parser" "^7.6.0" + "@babel/types" "^7.6.1" + core-util-is@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -1731,6 +1768,11 @@ doctrine@^2.1.0: dependencies: esutils "^2.0.2" +doctypes@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/doctypes/-/doctypes-1.1.0.tgz#ea80b106a87538774e8a3a4a5afe293de489e0a9" + integrity sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ== + duplexer@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" @@ -2632,6 +2674,14 @@ is-date-object@^1.0.1: dependencies: has-tostringtag "^1.0.0" +is-expression@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-expression/-/is-expression-4.0.0.tgz#c33155962abf21d0afd2552514d67d2ec16fd2ab" + integrity sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A== + dependencies: + acorn "^7.1.1" + object-assign "^4.1.1" + is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -2679,7 +2729,12 @@ is-path-inside@^3.0.2: resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== -is-regex@^1.1.4: +is-promise@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" + integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== + +is-regex@^1.0.3, is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== @@ -2763,6 +2818,11 @@ joi@^17.13.3: "@sideway/formula" "^3.0.1" "@sideway/pinpoint" "^2.0.0" +js-stringify@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/js-stringify/-/js-stringify-1.0.2.tgz#1736fddfd9724f28a3682adc6230ae7e4e9679db" + integrity sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g== + js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" @@ -2847,6 +2907,14 @@ jsprim@^2.0.2: json-schema "0.4.0" verror "1.10.0" +jstransformer@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/jstransformer/-/jstransformer-1.0.0.tgz#ed8bf0921e2f3f1ed4d5c1a44f68709ed24722c3" + integrity sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A== + dependencies: + is-promise "^2.0.0" + promise "^7.0.1" + katex@0.16.11: version "0.16.11" resolved "https://registry.yarnpkg.com/katex/-/katex-0.16.11.tgz#4bc84d5584f996abece5f01c6ad11304276a33f5" @@ -3070,6 +3138,11 @@ nth-check@^2.1.1: dependencies: boolbase "^1.0.0" +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + object-inspect@^1.13.1: version "1.13.2" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" @@ -3249,7 +3322,7 @@ photoswipe@5.4.4: resolved "https://registry.yarnpkg.com/photoswipe/-/photoswipe-5.4.4.tgz#e045dc036453493188d5c8665b0e8f1000ac4d6e" integrity sha512-WNFHoKrkZNnvFFhbHL93WDkW3ifwVOXSW3w1UuZZelSmgXpIGiZSNlZJq37rR8YejqME2rHs9EhH9ZvlvFH2NA== -picocolors@^1.1.0: +picocolors@^1.1.0, picocolors@~1: version "1.1.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59" integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw== @@ -3318,6 +3391,13 @@ process@^0.11.10: resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== +promise@^7.0.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== + dependencies: + asap "~2.0.3" + proxy-from-env@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" @@ -3340,6 +3420,109 @@ psl@^1.1.33: resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== +pug-attrs@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pug-attrs/-/pug-attrs-3.0.0.tgz#b10451e0348165e31fad1cc23ebddd9dc7347c41" + integrity sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA== + dependencies: + constantinople "^4.0.1" + js-stringify "^1.0.2" + pug-runtime "^3.0.0" + +pug-code-gen@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/pug-code-gen/-/pug-code-gen-3.0.3.tgz#58133178cb423fe1716aece1c1da392a75251520" + integrity sha512-cYQg0JW0w32Ux+XTeZnBEeuWrAY7/HNE6TWnhiHGnnRYlCgyAUPoyh9KzCMa9WhcJlJ1AtQqpEYHc+vbCzA+Aw== + dependencies: + constantinople "^4.0.1" + doctypes "^1.1.0" + js-stringify "^1.0.2" + pug-attrs "^3.0.0" + pug-error "^2.1.0" + pug-runtime "^3.0.1" + void-elements "^3.1.0" + with "^7.0.0" + +pug-error@^2.0.0, pug-error@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/pug-error/-/pug-error-2.1.0.tgz#17ea37b587b6443d4b8f148374ec27b54b406e55" + integrity sha512-lv7sU9e5Jk8IeUheHata6/UThZ7RK2jnaaNztxfPYUY+VxZyk/ePVaNZ/vwmH8WqGvDz3LrNYt/+gA55NDg6Pg== + +pug-filters@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pug-filters/-/pug-filters-4.0.0.tgz#d3e49af5ba8472e9b7a66d980e707ce9d2cc9b5e" + integrity sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A== + dependencies: + constantinople "^4.0.1" + jstransformer "1.0.0" + pug-error "^2.0.0" + pug-walk "^2.0.0" + resolve "^1.15.1" + +pug-lexer@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/pug-lexer/-/pug-lexer-5.0.1.tgz#ae44628c5bef9b190b665683b288ca9024b8b0d5" + integrity sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w== + dependencies: + character-parser "^2.2.0" + is-expression "^4.0.0" + pug-error "^2.0.0" + +pug-linker@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pug-linker/-/pug-linker-4.0.0.tgz#12cbc0594fc5a3e06b9fc59e6f93c146962a7708" + integrity sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw== + dependencies: + pug-error "^2.0.0" + pug-walk "^2.0.0" + +pug-load@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pug-load/-/pug-load-3.0.0.tgz#9fd9cda52202b08adb11d25681fb9f34bd41b662" + integrity sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ== + dependencies: + object-assign "^4.1.1" + pug-walk "^2.0.0" + +pug-parser@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/pug-parser/-/pug-parser-6.0.0.tgz#a8fdc035863a95b2c1dc5ebf4ecf80b4e76a1260" + integrity sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw== + dependencies: + pug-error "^2.0.0" + token-stream "1.0.0" + +pug-runtime@^3.0.0, pug-runtime@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/pug-runtime/-/pug-runtime-3.0.1.tgz#f636976204723f35a8c5f6fad6acda2a191b83d7" + integrity sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg== + +pug-strip-comments@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz#f94b07fd6b495523330f490a7f554b4ff876303e" + integrity sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ== + dependencies: + pug-error "^2.0.0" + +pug-walk@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pug-walk/-/pug-walk-2.0.0.tgz#417aabc29232bb4499b5b5069a2b2d2a24d5f5fe" + integrity sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ== + +pug@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/pug/-/pug-3.0.3.tgz#e18324a314cd022883b1e0372b8af3a1a99f7597" + integrity sha512-uBi6kmc9f3SZ3PXxqcHiUZLmIXgfgWooKWXcwSGwQd2Zi5Rb0bT14+8CJjJgI8AB+nndLaNgHGrcc6bPIB665g== + dependencies: + pug-code-gen "^3.0.3" + pug-filters "^4.0.0" + pug-lexer "^5.0.1" + pug-linker "^4.0.0" + pug-load "^3.0.0" + pug-parser "^6.0.0" + pug-runtime "^3.0.1" + pug-strip-comments "^2.0.0" + pump@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8" @@ -3434,7 +3617,7 @@ resolve-from@^4.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve@^1.22.4: +resolve@^1.15.1, resolve@^1.22.4: version "1.22.8" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== @@ -3849,6 +4032,11 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +token-stream@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/token-stream/-/token-stream-1.0.0.tgz#cc200eab2613f4166d27ff9afc7ca56d49df6eb4" + integrity sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg== + tough-cookie@^4.1.3: version "4.1.4" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36" @@ -4072,6 +4260,14 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" +vite-plugin-pug@0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/vite-plugin-pug/-/vite-plugin-pug-0.4.1.tgz#81052780039c25995e5e54921c1feccaea9f2215" + integrity sha512-2M4qNpIgUV+zA63w566jyp3LpaIuSBMfghOzue7PYnFTms48Ux78Bp/ccRSaGRbFW9BkTxdqgi5h7xvBN7YruQ== + dependencies: + picocolors "~1" + pug "^3.0.3" + vite@5.4.8: version "5.4.8" resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.8.tgz#af548ce1c211b2785478d3ba3e8da51e39a287e8" @@ -4083,6 +4279,11 @@ vite@5.4.8: optionalDependencies: fsevents "~2.3.3" +void-elements@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09" + integrity sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w== + vscode-uri@^3.0.8: version "3.0.8" resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.0.8.tgz#1770938d3e72588659a172d0fd4642780083ff9f" @@ -4173,6 +4374,16 @@ which@^2.0.1: dependencies: isexe "^2.0.0" +with@^7.0.0: + version "7.0.2" + resolved "https://registry.yarnpkg.com/with/-/with-7.0.2.tgz#ccee3ad542d25538a7a7a80aad212b9828495bac" + integrity sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w== + dependencies: + "@babel/parser" "^7.9.6" + "@babel/types" "^7.9.6" + assert-never "^1.2.1" + babel-walk "3.0.0-canary-5" + word-wrap@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34"