diff --git a/frontend/src/i18n/index.ts b/frontend/src/i18n/index.ts index dd30029e5..a48ad8d43 100644 --- a/frontend/src/i18n/index.ts +++ b/frontend/src/i18n/index.ts @@ -5,10 +5,12 @@ import LanguageDetector from 'i18next-browser-languagedetector'; // Import translations directly for bundling import en from './locales/en'; import de from './locales/de'; +import ja from './locales/ja'; const resources = { en: { translation: en }, de: { translation: de }, + ja: { translation: ja }, }; i18n @@ -17,7 +19,7 @@ i18n .init({ resources, fallbackLng: 'en', - supportedLngs: ['en', 'de'], + supportedLngs: ['en', 'de', 'ja'], detection: { // Order of detection methods @@ -43,4 +45,5 @@ export default i18n; export const availableLanguages = [ { code: 'en', name: 'English', nativeName: 'English' }, { code: 'de', name: 'German', nativeName: 'Deutsch' }, + { code: 'ja', name: 'Japanese', nativeName: '日本語' }, ]; diff --git a/frontend/src/i18n/locales/ja.ts b/frontend/src/i18n/locales/ja.ts new file mode 100644 index 000000000..589432874 --- /dev/null +++ b/frontend/src/i18n/locales/ja.ts @@ -0,0 +1,3040 @@ +export default { + // Navigation + nav: { + printers: 'プリンター', + archives: 'アーカイブ', + queue: 'キュー', + stats: '統計', + profiles: 'プロファイル', + maintenance: 'メンテナンス', + projects: 'プロジェクト', + files: 'ファイル管理', + settings: '設定', + system: 'システム', + collapseSidebar: 'サイドバーを閉じる', + expandSidebar: 'サイドバーを開く', + update: 'アップデート', + updateAvailable: 'アップデートあり: v{{version}}', + viewOnGithub: 'GitHubで表示', + keyboardShortcuts: 'キーボードショートカット (?)', + switchToLight: 'ライトモードに切替', + switchToDark: 'ダークモードに切替', + }, + + // Common + common: { + save: '保存', + cancel: 'キャンセル', + delete: '削除', + edit: '編集', + add: '追加', + close: '閉じる', + confirm: '確認', + loading: '読み込み中...', + error: 'エラー', + success: '成功', + warning: '警告', + enabled: '有効', + disabled: '無効', + yes: 'はい', + no: 'いいえ', + on: 'オン', + off: 'オフ', + all: 'すべて', + none: 'なし', + search: '検索', + filter: 'フィルター', + sort: '並べ替え', + refresh: '更新', + download: 'ダウンロード', + upload: 'アップロード', + actions: '操作', + status: 'ステータス', + name: '名前', + description: '説明', + date: '日付', + time: '時間', + hours: '時間', + minutes: '分', + seconds: '秒', + noPrinters: 'プリンターが登録されていません', + noData: 'データがありません', + required: '必須', + optional: 'オプション', + unknown: '不明', + done: '完了', + saving: '保存中...', + saveChanges: '変更を保存', + today: '今日', + turnOn: 'オンにする', + turnOff: 'オフにする', + deletePhoto: '写真を削除', + deletePhotoConfirm: 'この写真を削除しますか?元に戻せません。', + create: '作成', + print: '印刷', + clear: 'クリア', + project: 'プロジェクト', + archive: 'アーカイブ', + unknownError: '不明なエラー', + show: '表示', + hide: '非表示', + back: '戻る', + export: 'エクスポート', + import: 'インポート', + retry: 'リトライ', + printer: 'プリンター', + model: 'モデル', + ok: 'OK', + }, + + // Printers page + printers: { + title: 'プリンター', + addPrinter: 'プリンターを追加', + editPrinter: 'プリンターを編集', + deletePrinter: 'プリンターを削除', + printerName: 'プリンター名', + serialNumber: 'シリアル番号', + ipAddress: 'IPアドレス', + accessCode: 'アクセスコード', + model: 'モデル', + nozzleCount: 'ノズル数', + autoArchive: '自動アーカイブ', + connected: '接続中', + offline: 'オフライン', + unknownModel: '不明なモデル', + statusLabel: 'ステータス', + status: { + printing: '印刷中', + paused: '一時停止', + finished: '完了', + failed: '失敗', + idle: '待機中', + }, + lastPrint: '最後', + readyToPrint: '印刷可能', + estimatedCompletion: '完了予定時刻', + filaments: 'フィラメント', + controls: 'コントロール', + external: '外部', + externalSpool: '外部スプール', + files: 'ファイル', + browseFiles: 'プリンターのファイルを参照', + update: 'アップデート', + loading: 'プリンターを読み込み中...', + hideOffline: 'オフラインを非表示', + ungrouped: '未グループ', + hmsErrors: 'クリックしてHMSエラーを表示', + slotOptions: 'スロットオプション', + rereadRfid: 'RFIDを再読み取り', + clickToView: 'クリックして表示', + maintenanceUpToDate: 'すべてのメンテナンスが最新です', + maintenanceDue: '{{count}}件のメンテナンス期限', + maintenanceDueSoon: '{{count}}件のメンテナンスがまもなく期限', + printsInQueue: 'キューに{{count}}件の印刷', + firmwareUpdateAvailable: 'ファームウェアアップデートあり: {{current}} \u2192 {{latest}}', + statusSummary: { + printing: '印刷中', + idle: '待機中', + offline: 'オフライン', + }, + sort: { + name: '名前', + status: 'ステータス', + model: 'モデル', + location: 'ロケーション', + ascending: '昇順で並べ替え', + descending: '降順で並べ替え', + }, + cardSize: { + small: '小', + medium: '中', + large: '大', + extraLarge: '特大', + cards: 'カード', + }, + temps: { + nozzle: 'ノズル', + bed: 'ベッド', + chamber: 'チャンバー', + left: '左', + right: '右', + activeNozzle: 'アクティブ: {{side}}ノズル', + }, + fans: { + partCooling: 'パーツ冷却ファン', + auxiliary: '補助ファン', + chamber: 'チャンバーファン', + }, + printControl: { + stop: '停止', + pause: '一時停止', + resume: '再開', + stopPrint: '印刷を停止', + pausePrint: '印刷を一時停止', + resumePrint: '印刷を再開', + }, + power: { + on: 'オン', + off: 'オフ', + powerOn: '電源オン', + autoOff: '自動オフ', + autoOffDone: '自動オフ完了', + autoOffTooltip: '印刷後に自動電源オフ', + autoOffExecutedTooltip: '自動オフが実行されました - リセットするにはプリンターの電源を入れてください', + offlineWithPlugs: 'スマートプラグ付きオフラインプリンター', + noPlugs: 'スマートプラグ付きプリンターなし', + }, + chamberLight: { + turnOn: 'チャンバーライトをオン', + turnOff: 'チャンバーライトをオフ', + }, + camera: { + openOverlay: 'カメラオーバーレイを開く', + openWindow: 'カメラを新しいウィンドウで開く', + }, + menu: { + reconnect: '再接続', + mqttDebug: 'MQTTデバッグ', + }, + confirm: { + deleteTitle: 'プリンターを削除', + deleteMessage: '「{{name}}」を削除しますか?すべての接続設定が削除されます。', + deleteArchives: '印刷アーカイブを削除', + deleteArchivesYes: 'このプリンターのすべての印刷履歴が完全に削除されます。', + deleteArchivesNo: '印刷履歴は保持されますが、このプリンターとの関連付けは解除されます。', + powerOnTitle: 'プリンターの電源をオン', + powerOnMessage: '「{{name}}」の電源をオンにしますか?', + powerOn: '電源オン', + powerOffTitle: 'プリンターの電源をオフ', + powerOffMessage: '「{{name}}」の電源をオフにしますか?', + powerOffWarning: '警告: 「{{name}}」は現在印刷中です!電源をオフにしますか?印刷が中断され、プリンターが損傷する可能性があります。', + powerOff: '電源オフ', + stopTitle: '印刷を停止', + stopMessage: '「{{name}}」の現在の印刷を停止しますか?印刷ジョブがキャンセルされます。', + stopButton: '印刷を停止', + pauseTitle: '印刷を一時停止', + pauseMessage: '「{{name}}」の現在の印刷を一時停止しますか?', + pauseButton: '印刷を一時停止', + resumeTitle: '印刷を再開', + resumeMessage: '「{{name}}」の印刷を再開しますか?', + resumeButton: '印刷を再開', + }, + skipObjects: { + title: 'オブジェクトスキップ', + onlyWhilePrinting: 'オブジェクトスキップ(印刷中のみ)', + requires2Objects: 'オブジェクトスキップ(2つ以上のオブジェクトが必要)', + noObjects: 'オブジェクトが見つかりません', + objectsLoadedOnStart: 'オブジェクトは印刷開始時に読み込まれます', + matchIds: 'プリンターのディスプレイとIDを照合してください', + printerScreenShows: 'プリンター画面にビルドプレート上のオブジェクトIDが表示されます', + skippedCount: '{{skipped}}/{{total}}スキップ済み', + waitForLayer: 'オブジェクトをスキップするにはレイヤー2以降をお待ちください(現在レイヤー{{layer}})', + activeCount: '{{count}}個アクティブ', + willBeSkipped: 'スキップされます', + waitForLayer2: 'レイヤー2以降をお待ちください', + skipThisObject: 'このオブジェクトをスキップ', + skip: 'スキップ', + skipped: 'スキップ済み', + }, + form: { + name: '名前', + namePlaceholder: 'マイプリンター', + ipAddress: 'IPアドレス', + serialNumber: 'シリアル番号', + serialCannotChange: 'シリアル番号は変更できません', + accessCode: 'アクセスコード', + accessCodePlaceholder: 'プリンター設定から取得', + accessCodeKeepCurrent: '現在のコードを維持する場合は空のまま', + modelOptional: 'モデル(任意)', + model: 'モデル', + selectModel: 'モデルを選択...', + locationGroup: 'ロケーション / グループ', + locationPlaceholder: '例: 工房、オフィス、地下室', + locationHint: 'プリンターのグループ化とキュージョブのフィルタリングに使用', + autoArchive: '完了した印刷を自動アーカイブ', + }, + discovery: { + subnetToScan: 'スキャンするサブネット', + dockerSubnetHint: 'Dockerが検出されました。CIDR表記でプリンターのサブネットを入力してください。docker-compose.ymlにnetwork_mode: hostが必要です。', + scanning: 'スキャン中...', + scanningProgress: 'スキャン中... {{scanned}}/{{total}}', + scanSubnet: 'サブネットをスキャンしてプリンターを検出', + discoverNetwork: 'ネットワーク上のプリンターを検出', + serialRequired: 'シリアル番号が必要です', + scanningSubnet: 'サブネットでBambuプリンターをスキャン中...', + scanningNetwork: 'ネットワークをスキャン中...', + noPrintersSubnet: '指定されたサブネットにプリンターが見つかりません。', + noPrintersNetwork: 'ネットワーク上にプリンターが見つかりません。', + allConfigured: '検出されたすべてのプリンターは既に設定済みです。', + }, + firmware: { + title: 'ファームウェアアップデート', + current: '現在', + latest: '最新', + releaseNotes: 'リリースノート', + checkingPrerequisites: '前提条件を確認中...', + sdCardReady: 'SDカード準備完了。下をクリックしてファームウェアをアップロードしてください。', + uploadedToSd: 'ファームウェアをSDカードにアップロードしました!', + applyInstructions: 'プリンターでアップデートを適用するには:', + step1: 'プリンターのタッチスクリーンで設定に移動', + step2: 'ファームウェアに移動', + step3: 'SDカードからアップデートを選択', + step4: 'アップデートには10〜20分かかります', + starting: '開始中...', + uploadFirmware: 'ファームウェアをアップロード', + uploadSuccess: 'ファームウェアをアップロードしました!プリンター画面からアップデートを実行してください。', + }, + empty: { + noPrinters: 'プリンターがまだ設定されていません', + addFirst: '最初のプリンターを追加', + }, + toast: { + printStopped: '印刷を停止しました', + printPaused: '印刷を一時停止しました', + printResumed: '印刷を再開しました', + failedToStop: '印刷の停止に失敗しました', + failedToPause: '印刷の一時停止に失敗しました', + failedToResume: '印刷の再開に失敗しました', + chamberLightOn: 'チャンバーライトをオンにしました', + chamberLightOff: 'チャンバーライトをオフにしました', + failedChamberLight: 'チャンバーライトの制御に失敗しました', + objectsSkipped: 'オブジェクトをスキップしました', + failedToSkipObjects: 'オブジェクトのスキップに失敗しました', + rfidRereadInitiated: 'RFID再読み取りを開始しました', + failedRfidReread: 'RFID再読み取りに失敗しました', + }, + progress: '{{percent}}% 完了', + timeRemaining: '残り {{time}}', + maintenanceOk: 'メンテナンス正常', + maintenanceWarning: '{{count}}件の警告', + maintenanceWarning_plural: '{{count}}件の警告', + colors: { + unknown: '不明', + black: '黒', + white: '白', + darkGray: 'ダークグレー', + lightGray: 'ライトグレー', + gray: 'グレー', + brown: '茶色', + red: '赤', + orange: 'オレンジ', + yellow: '黄色', + green: '緑', + cyan: 'シアン', + blue: '青', + purple: '紫', + pink: 'ピンク', + }, + humidity: { + unknown: '不明', + good: '良好', + fair: '注意', + bad: '警告', + }, + temperature: { + good: '良好', + fair: '注意', + bad: '高温', + }, + wifi: { + excellent: '非常に良い', + good: '良い', + fair: '普通', + weak: '弱い', + veryWeak: '非常に弱い', + }, + h2Series: 'H2シリーズ', + x1Series: 'X1シリーズ', + pSeries: 'Pシリーズ', + a1Series: 'A1シリーズ', + searchPresets: 'プリセットを検索...', + noCloudPresets: 'クラウドプリセットがありません。Bambu Cloudにログインして同期してください。', + noMatchingPresets: '一致するプリセットが見つかりません。', + colorNamePlaceholder: '色の名前またはHex値(例:brown、FF8800)', + clearCustomColor: 'カスタムカラーをクリア', + copySpoolUuid: 'スプールUUIDをコピー', + configureSlot: 'フィラメントプロファイルとK値でスロットを設定', + }, + + // Archives page + archives: { + title: '印刷アーカイブ', + searchPlaceholder: 'アーカイブを検索...', + filterByPrinter: 'プリンターで絞り込み', + filterByStatus: 'ステータスで絞り込み', + sortBy: '並べ替え', + sortNewest: '新しい順', + sortOldest: '古い順', + sortName: '名前順', + sortDuration: '時間順', + noArchives: 'アーカイブが見つかりません', + printTime: '印刷時間', + filamentUsed: 'フィラメント使用量', + cost: 'コスト', + reprint: '再印刷', + preview: 'プレビュー', + deleteArchive: 'アーカイブを削除', + deleteConfirm: 'このアーカイブを削除しますか?', + favorite: 'お気に入り', + unfavorite: 'お気に入りから削除', + viewDetails: '詳細を表示', + status: { + completed: '完了', + failed: '失敗', + stopped: '中止', + }, + // Collections + collections: { + all: 'すべてのアーカイブ', + recent: '過去24時間', + 'this-week': '今週', + 'this-month': '今月', + favorites: 'お気に入り', + failed: '失敗した印刷', + duplicates: '重複', + }, + // Bulk operations + bulkDeleted: '{{count}}件のアーカイブを削除しました', + bulkDeleteFailed: 'アーカイブの削除に失敗しました', + bulkDeleteTitle: 'アーカイブを削除', + bulkDeleteConfirm: '{{count}}件のアーカイブを削除しますか?この操作は元に戻せません。', + deleteCount: '{{count}}件を削除', + // Drag & drop + only3mfSupported: '.3mfファイルのみ対応しています', + dropFilesHere: '.3mfファイルをここにドロップ', + releaseToUpload: 'ドロップしてアップロード', + // Selection toolbar + selectedCount: '{{count}}件選択中', + selectAll: 'すべて選択', + tags: 'タグ', + project: 'プロジェクト', + toggledFavorites: '{{count}}件のアーカイブのお気に入りを切替えました', + favoriteUpdateFailed: 'お気に入りの更新に失敗しました', + favoriteBulk: 'お気に入り', + // Page header + showingCount: '{{total}}件中{{shown}}件を表示', + export: 'エクスポート', + exportDownloaded: 'エクスポートをダウンロードしました', + exportFailed: 'エクスポートに失敗しました', + exportCsv: 'CSVでエクスポート', + exportExcel: 'Excelでエクスポート', + compare: '比較 ({{count}})', + select: '選択', + upload3mf: '3MFアップロード', + // Filters + allPrinters: 'すべてのプリンター', + allMaterials: 'すべての素材', + allFiles: 'すべてのファイル', + slicedGcode: 'スライス済み (GCODE)', + sourceFileOnly: 'ソースのみ', + showAll: 'すべて表示', + showFavoritesOnly: 'お気に入りのみ表示', + favorites: 'お気に入り', + showFailedPrints: '失敗した印刷を表示', + hideFailedPrints: '失敗した印刷を非表示', + hideFailed: '失敗を非表示', + allTags: 'すべてのタグ', + enterNewTag: '新しいタグを入力...', + sortNewestFirst: '新しい順', + sortOldestFirst: '古い順', + sortNameAZ: '名前 A-Z', + sortNameZA: '名前 Z-A', + sortLargestFirst: '大きい順', + sortSmallestFirst: '小さい順', + gridView: 'グリッド表示', + listView: 'リスト表示', + calendarView: 'カレンダー表示', + reset: 'リセット', + colors: 'カラー:', + matchAnyColor: 'いずれかの選択色に一致', + matchAllColors: 'すべての選択色に一致', + clear: 'クリア', + // Content + loading: 'アーカイブを読み込み中...', + noMatchingArchives: '検索に一致するアーカイブはありません', + noArchivesYet: 'アーカイブはまだありません', + autoCreated: '印刷完了時にアーカイブは自動的に作成されます', + unknownPrinter: '不明', + noPrinter: 'プリンターなし', + // ツールチップ + rightClickOptions: '右クリックでオプション表示', + printedBefore: 'このモデルは以前印刷されたことがあります', + openSource3mf: 'ソース3MFをBambu Studioで開く(右クリックでオプション表示)', + viewPhotos: '{{count}}枚の写真を表示', + openFolder: 'フォルダーを開く: {{name}}', + projectName: 'プロジェクト: {{name}}', + makerWorldDesigner: 'MakerWorld: {{designer}}', + notFromMakerWorld: 'MakerWorldではありません', + hasTimelapse: 'タイムラプスあり', + moreOptions: 'その他のオプション', + downloadF3d: 'Fusion 360デザインファイルをダウンロード', + // List view headers + listName: '名前', + listPrinter: 'プリンター', + listDate: '日付', + listSize: 'サイズ', + listActions: 'アクション', + }, + + // Queue page + queue: { + title: '印刷キュー', + description: '印刷ジョブのスケジュールと管理', + addToQueue: 'キューに追加', + clearQueue: 'キューをクリア', + clearHistory: '履歴をクリア', + emptyQueue: 'キューは空です', + position: '順番', + scheduledTime: '予定時刻', + moveUp: '上に移動', + moveDown: '下に移動', + remove: '削除', + requeue: '再キュー', + startNow: '今すぐ開始', + startPrint: '印刷を開始', + stopPrint: '印刷を停止', + unassigned: '未割当', + printerNumber: 'プリンター #{{id}}', + staged: 'ステージ済み', + requiresPreviousSuccess: '前の印刷の成功が必要', + autoPowerOff: '自動電源オフ', + printingInProgress: '印刷中...', + currentlyPrinting: '印刷中', + viewArchive: 'アーカイブを表示', + viewInFileManager: 'ファイルマネージャーで表示', + itemCount: '{{count}}件', + dragToReorder: 'ドラッグして並べ替え(ASAPのみ)', + overdue: '期限超過', + dragReorderTooltip: '順番はASAPアイテムのみに影響します。スケジュール済みアイテムは設定された時間に実行されます。', + anyModel: '任意の{{model}}{{location}}{{filaments}}', + addedBy: '{{username}}が追加', + bulkEdit: { + title: '{{count}}件のアイテムを編集', + description: '変更した設定のみが選択されたアイテムに適用されます。', + printer: 'プリンター', + noChange: '— 変更なし —', + queueOptions: 'キューオプション', + stagedManualStart: 'ステージ済み(手動開始)', + autoPowerOff: '印刷後に自動電源オフ', + requirePreviousSuccess: '前の印刷の成功が必要', + printOptions: '印刷オプション', + bedLevelling: 'ベッドレベリング', + flowCalibration: 'フローキャリブレーション', + vibrationCalibration: '振動キャリブレーション', + firstLayerInspection: '第一層検査', + timelapse: 'タイムラプス', + useAms: 'AMS使用', + on: 'オン', + off: 'オフ', + saving: '保存中...', + applyChanges: '変更を適用', + }, + bulkActions: { + selectAll: 'すべて選択', + deselectAll: 'すべて選択解除', + selected: '{{count}}件選択中', + editSelected: '選択を編集', + cancelSelected: '選択をキャンセル', + }, + permissions: { + noStopPermission: '印刷を停止する権限がありません', + noStartPermission: '印刷を開始する権限がありません', + noEditPermission: 'キューアイテムを編集する権限がありません', + noCancelPermission: 'キューアイテムをキャンセルする権限がありません', + noRequeuePermission: 'アイテムを再キューする権限がありません', + noRemovePermission: 'キューアイテムを削除する権限がありません', + noClearHistoryPermission: '履歴をクリアする権限がありません', + }, + status: { + pending: '待機中', + printing: '印刷中', + completed: '完了', + failed: '失敗', + skipped: 'スキップ', + cancelled: 'キャンセル済み', + waiting: '待機中', + }, + summary: { + printing: '印刷中', + queued: 'キュー中', + totalQueueTime: '合計キュー時間', + history: '履歴', + }, + filters: { + allPrinters: 'すべてのプリンター', + allStatus: 'すべてのステータス', + }, + sort: { + byPosition: '順番で並べ替え', + byName: '名前で並べ替え', + byPrinter: 'プリンターで並べ替え', + bySchedule: 'スケジュールで並べ替え', + byDate: '日付で並べ替え', + ascending: '昇順', + descending: '降順', + ascendingOldest: '昇順(古い順)', + descendingNewest: '降順(新しい順)', + }, + empty: { + title: 'スケジュールされた印刷はありません', + description: 'アーカイブページのコンテキストメニューから「スケジュール」オプションを使用するか、ファイルをドラッグ&ドロップして始めましょう。', + }, + confirm: { + cancelTitle: 'スケジュール済み印刷をキャンセル', + cancelMessage: '「{{name}}」をキャンセルしますか?', + cancelButton: '印刷をキャンセル', + stopTitle: '印刷を停止', + stopMessage: '現在の印刷「{{name}}」を停止しますか?プリンター上の印刷ジョブがキャンセルされます。', + stopButton: '印刷を停止', + removeTitle: '履歴から削除', + removeMessage: '「{{name}}」をキュー履歴から削除しますか?', + clearHistoryMessage: '{{count}}件の履歴をすべて削除しますか?', + thisPrint: 'この印刷', + thisItem: 'このアイテム', + }, + toast: { + itemCancelled: 'キューアイテムをキャンセルしました', + itemRemoved: 'キューアイテムを削除しました', + printStopped: '印刷を停止しました', + printReleased: '印刷をキューに戻しました', + clearedHistory: '{{count}}件の履歴をクリアしました', + failedToCancel: 'アイテムのキャンセルに失敗しました', + failedToRemove: 'アイテムの削除に失敗しました', + failedToStop: '印刷の停止に失敗しました', + failedToStart: '印刷の開始に失敗しました', + failedToReorder: 'キューの並べ替えに失敗しました', + failedToClear: '履歴のクリアに失敗しました', + failedToUpdateItems: 'アイテムの更新に失敗しました', + cancelledItems: '{{count}}件のアイテムをキャンセルしました', + failedToCancelItems: 'アイテムの一括キャンセルに失敗しました', + }, + }, + + // Statistics page + stats: { + title: '統計', + overview: '概要', + totalPrints: '総印刷数', + successRate: '成功率', + totalPrintTime: '総印刷時間', + totalFilament: '総フィラメント使用量', + totalCost: '総コスト', + averagePrintTime: '平均印刷時間', + printsPerDay: '1日あたりの印刷数', + byPrinter: 'プリンター別', + byMaterial: '素材別', + byMonth: '月別', + last7Days: '過去7日間', + last30Days: '過去30日間', + last90Days: '過去90日間', + allTime: '全期間', + // ダッシュボード + dashboard: '統計ダッシュボード', + dashboardDescription: '3Dプリントアクティビティの概要', + loadingStatistics: '統計を読み込み中...', + // クイック統計 + quickStats: 'クイック統計', + printTime: '印刷時間', + filamentUsed: 'フィラメント使用量', + filamentCost: 'フィラメントコスト', + energyUsed: 'エネルギー使用量', + energyCost: 'エネルギーコスト', + // 成功率 + successful: '成功', + failed: '失敗', + printsByPrinter: 'プリンター別印刷数', + printerFallback: 'プリンター #{{id}}', + // 時間精度 + timeAccuracy: '時間精度', + noTimeAccuracyData: '時間精度データがありません', + perfectEstimate: '100% = 完全な推定', + // フィラメントタイプ + filamentTypes: 'フィラメントタイプ', + noFilamentData: 'フィラメントデータがありません', + printsCount: '{{count}}回印刷', + moreTypes: '+{{count}}種類', + // プリンター別印刷数 + noPrinterData: 'プリンターデータがありません', + // フィラメントトレンド + filamentUsageTrends: 'フィラメント使用トレンド', + noPrintData: '印刷データがありません', + // 印刷アクティビティ + printActivity: '印刷アクティビティ', + // 失敗分析 + failureAnalysis30Days: '失敗分析(30日間)', + noPrintDataLast30Days: '過去30日間の印刷データがありません', + printsFailed: '{{total}}回中{{failed}}回失敗', + lastWeek: '先週', + failureReasons: '失敗理由', + topFailureReasons: '主な失敗理由', + unknown: '不明', + moreReasons: '+{{count}}件の理由', + // レイアウトとエクスポート + hiddenCount: '{{count}}件非表示', + layoutReset: 'レイアウトをリセットしました', + resetLayout: 'レイアウトをリセット', + exportStats: '統計をエクスポート', + exportAsCsv: 'CSVでエクスポート', + exportAsExcel: 'Excelでエクスポート', + exportDownloaded: 'エクスポートをダウンロードしました', + exportFailed: 'エクスポートに失敗しました', + filament: 'フィラメント', + cost: 'コスト', + prints: 'プリント', + filamentGrams: 'フィラメント (g)', + // 追加の統計 + weekOf: '週:', + periodFilament: '期間フィラメント', + periodCost: '期間コスト', + avgPerPrint: 'プリントあたりの平均', + total: '合計', + avg: '平均', + usageOverTime: '使用量の推移', + noDataForTimeRange: '選択した期間のデータがありません', + byFilamentType: 'フィラメントタイプ別', + usage: '使用量', + monthlyComparison: '月間比較', + noPermissionRecalculate: 'コストを再計算する権限がありません', + noPermissionResetLayout: 'レイアウトをリセットする権限がありません', + recalculateCosts: 'コストを再計算', + recalculateFailed: 'コストの再計算に失敗しました', + recalculateTooltip: '現在のフィラメント価格に基づいてすべてのプリントコストを再計算します', + }, + + // Profiles page + profiles: { + title: 'フィラメントプロファイル', + addProfile: 'プロファイルを追加', + editProfile: 'プロファイルを編集', + deleteProfile: 'プロファイルを削除', + material: '素材', + brand: 'ブランド', + color: '色', + diameter: '直径', + density: '密度', + costPerKg: '1kgあたりの価格', + spoolWeight: 'スプール重量', + noProfiles: 'プロファイルが登録されていません', + deleteConfirm: 'このプロファイルを削除しますか?', + templateName: 'テンプレート名', + descriptionOptional: '説明(任意)', + searchFields: 'フィールドを検索...', + presetNamePlaceholder: 'マイカスタムプリセット', + searchPresets: 'プリセットを検索...', + // Cloud login + connectToCloud: 'Bambu Cloudに接続', + syncDescription: 'デバイス間でスライサープリセットを同期', + email: 'メールアドレス', + password: 'パスワード', + region: 'リージョン', + regionGlobal: 'グローバル', + regionChina: '中国', + verificationCode: '認証コード', + checkEmail: 'メール ({{email}}) に届いた6桁のコードを入力してください', + accessToken: 'アクセストークン', + accessTokenHint: 'Bambu Labのアクセストークンを貼り付け(Bambu Studioから取得)', + login: 'ログイン', + verify: '認証', + setToken: 'トークン設定', + useTokenInstead: 'アクセストークンを使用', + loginWithEmail: 'メールでログイン', + loggedIn: 'ログインしました', + verificationSent: '認証コードをメールに送信しました', + tokenSet: 'トークンを設定しました', + loggedOut: 'ログアウトしました', + logout: 'ログアウト', + connectedAs: '接続中:', + // Page + pageTitle: 'プロファイル', + pageDescription: 'スライサープリセットと圧力キャリブレーションの管理', + cloudProfiles: 'クラウドプロファイル', + kProfiles: 'Kプロファイル', + scrollToTop: 'トップに戻る', + // Time + justNow: 'たった今', + minutesAgo: '{{count}}分前', + hoursAgo: '{{count}}時間前', + daysAgo: '{{count}}日前', + lastSynced: '最終同期:', + // Presets + duplicate: '複製', + myPresetEditable: 'マイプリセット(編集可能)', + editable: '編集可能', + typePreset: '{{type}}プリセット', + presetDeleted: 'プリセットを削除しました', + presetCreated: 'プリセットを作成しました', + presetUpdated: 'プリセットを更新しました', + presetExported: 'プリセットをエクスポートしました', + presetName: 'プリセット名', + failedToLoadDetails: 'プリセットの詳細を読み込めませんでした', + failedToLoadProfiles: 'プロファイルの読み込みに失敗しました', + deletePresetConfirm: 'このプリセットを削除しますか?', + deletePresetWarning: '"{{name}}"をBambu Cloudから完全に削除します。この操作は元に戻せません。', + noPresetsFound: 'プリセットが見つかりません', + showingPresets: '{{total}}件中{{count}}件を表示', + myPresetLegend: '= マイプリセット(編集可能)', + // Filters + typeLabel: 'タイプ', + typeFilter: 'タイプ:', + owner: '所有者', + myPresets: 'マイプリセット', + builtIn: 'ビルトイン', + nozzle: 'ノズル', + filament: 'フィラメント', + process: 'プロセス', + printer: 'プリンター', + layer: 'レイヤー', + clearFilters: 'フィルターをクリア', + noFilamentPresets: 'フィラメントプリセットなし', + noProcessPresets: 'プロセスプリセットなし', + noPrinterPresets: 'プリンタープリセットなし', + // Compare + compare: '比較', + compareMode: '比較モード', + comparePresets: 'プリセットを比較', + compareNow: '比較を実行', + compareWithBase: 'ベースプリセットと比較', + selectAnotherPreset: '同じタイプ({{type}})の別のプリセットを選択', + clickTwoPresets: '同じタイプのプリセットを2つクリックして比較', + selectFirst: '1. 最初を選択', + selectSecond: '2. 2番目を選択', + left: '左:', + right: '右:', + addedCount: '{{count}}件追加', + removedCount: '{{count}}件削除', + changedCount: '{{count}}件変更', + sameCount: '{{count}}件同じ', + changes: '変更点', + noDifferences: '差分はありません', + noFieldsMatch: '検索に一致するフィールドがありません', + field: 'フィールド', + // Templates + quickTemplates: 'クイックテンプレート', + templates: 'テンプレート', + deleteTemplate: 'テンプレートを削除', + actionCannotBeUndone: 'この操作は元に戻せません', + confirmDeleteTemplate: '"{{name}}"を削除してもよろしいですか?', + templateDeleted: 'テンプレートを削除しました', + templateUpdated: 'テンプレートを更新しました', + templateApplied: 'テンプレートを適用しました', + templateAppliedName: 'テンプレート適用: {{name}}', + templateSaved: 'テンプレートを保存しました', + customTemplate: 'カスタムテンプレート', + noTemplatesYet: 'テンプレートはまだありません', + createTemplatesHint: 'プリセットエディターからテンプレートを作成', + noTemplatesSelected: 'テンプレートが選択されていません。テンプレートボタンから有効にしてください。', + manageTemplatesHint: 'メインページのテンプレートボタンからテンプレートを管理', + settingsJson: '設定 (JSON)', + fieldsCount: '{{count}}フィールド', + shownInModals: 'モーダルに表示', + hiddenInModals: 'モーダルで非表示', + apply: '適用', + saveAsTemplate: 'テンプレートとして保存', + // Create/Edit preset + editPreset: 'プリセットを編集', + duplicatePreset: 'プリセットを複製', + createNewPreset: '新しいプリセットを作成', + newPreset: '新規プリセット', + customizeSettings: '新しいプリセットの設定をカスタマイズ', + dropJsonToImport: 'JSONファイルをドロップしてインポート', + basePreset: 'ベースプリセット', + selectBasePreset: 'ベースプリセットを選択...', + inheritsFrom: '継承元:', + commonTab: '共通', + allFieldsTab: '全フィールド', + jsonTab: 'JSON', + exportToJsonFile: '設定をJSONファイルにエクスポート', + importFromJsonFile: 'JSONファイルから設定をインポート', + commonSettings: '共通設定', + currentOverrides: '現在のオーバーライド', + availableFields: '利用可能なフィールド', + noMatchingFields: '一致するフィールドがありません', + allFieldsAdded: 'すべてのフィールドが追加済みです', + addCustomField: 'カスタムフィールドを追加', + yourOverrides: 'オーバーライド一覧', + noOverridesYet: 'オーバーライドはまだありません', + clickFieldsToAdd: '左のフィールドをクリックして追加', + dragDropTip: 'ヒント: このモーダルに.jsonファイルをドラッグ&ドロップして設定をインポート', + fieldAdded: 'フィールド "{{key}}" を追加しました', + noOverridesToSave: '保存するオーバーライドがありません', + fileImported: 'ファイルをインポートしました', + fileImportedSuccess: 'ファイルを正常にインポートしました', + invalidJson: '無効なJSON', + // 権限 + noPermissionCreate: 'プロファイルを作成する権限がありません', + noPermissionDelete: 'プロファイルを削除する権限がありません', + noPermissionDuplicate: 'プロファイルを複製する権限がありません', + noPermissionEdit: 'プロファイルを編集する権限がありません', + noPermissionLogout: 'ログアウトする権限がありません', + noPermissionManageTemplates: 'テンプレートを管理する権限がありません', + noPermissionRefresh: 'プロファイルを更新する権限がありません', + }, + + // Maintenance page + maintenance: { + title: 'メンテナンス', + overview: '概要', + allOk: 'すべてのメンテナンスは最新です', + dueCount: '{{count}}件の期限到来', + dueCount_plural: '{{count}}件の期限到来', + warningCount: '{{count}}件の警告', + warningCount_plural: '{{count}}件の警告', + totalPrintTime: '総印刷時間', + nextMaintenance: '次回メンテナンス', + nothingDue: '予定なし', + tasks: 'タスク', + lastPerformed: '前回実施日', + interval: '間隔', + hoursRemaining: '残り{{hours}}時間', + hoursOverdue: '{{hours}}時間超過', + markDone: '完了にする', + performMaintenance: 'メンテナンスを実施', + history: '履歴', + noHistory: 'メンテナンス履歴がありません', + editPrintHours: '印刷時間を編集', + currentHours: '現在の時間', + today: '今日', + overdue: '期限超過', + dueSoon: 'まもなく期限', + collapse: '折りたたむ', + expand: '展開', + left: '残り', + timeBasedInterval: '時間ベースのインターバル', + viewDocumentation: 'ドキュメントを表示', + printersAssigned: '{{count}}台のプリンターが割り当て済み - クリックして管理', + deleteTypeConfirm: '「{{name}}」を削除しますか?', + removeFromPrinter: 'このプリンターから削除', + addLabel: '追加:', + maintenanceTypes: 'メンテナンスタイプ', + systemTypesDescription: 'システムタイプとカスタムメンテナンスタスク', + addCustomType: 'カスタムタイプを追加', + intervalType: 'インターバルタイプ', + printHours: '印刷時間', + calendarDays: 'カレンダー日数', + intervalWithUnit: 'インターバル ({{unit}})', + days: '日', + icon: 'アイコン', + documentationLink: 'ドキュメントリンク(任意)', + docLinkPlaceholder: 'ドキュメントリンク(任意)', + namePlaceholder: '例:HEPAフィルター交換', + assignToPrinters: 'プリンターに割り当て', + selectAtLeastOnePrinter: 'プリンターを1台以上選択してください', + addType: 'タイプを追加', + custom: 'カスタム', + assignedToPrinters: '割り当て済みプリンター:', + noPrintersAssigned: 'プリンター未割り当て', + intervalOverrides: 'インターバルのオーバーライド', + customizeIntervals: 'プリンターごとにインターバルをカスタマイズ', + addPrintersForMaintenance: 'メンテナンスインターバルを設定するにはプリンターを追加してください', + // ページレベルの文字列 + reset: 'リセット', + countOverdue: '{{count}}件が期限超過', + countDueSoon: '{{count}}件がまもなく期限', + allGood: '問題なし', + nHours: '{{count}}時間', + tasksOverdue: '{{count}}件のタスクが期限超過', + configureDescription: 'メンテナンスタイプとインターバルを設定', + addPrintersToTrack: 'メンテナンスを追跡するにはプリンターを追加してください', + markedComplete: 'メンテナンスを完了としてマーク', + typeUpdated: 'メンテナンスタイプを更新しました', + typeDeleted: 'メンテナンスタイプを削除しました', + typeAdded: 'メンテナンスタイプを追加しました', + hoursUpdated: '印刷時間を更新しました', + printerAssigned: 'プリンターを割り当てました', + printerRemoved: 'プリンターを削除しました', + wikiUrlPlaceholder: 'https://wiki.bambulab.com/...', + // 期間フォーマット + duration: { + oneDay: '1日', + days: '{{count}}日', + weeks: '{{count}}週間', + months: '{{count}}ヶ月', + oneWeek: '1週間', + nWeeks: '{{count}}週間', + oneMonth: '1ヶ月', + nMonths: '{{count}}ヶ月', + oneYear: '1年', + }, + // 権限 + noPermissionCreate: 'メンテナンス記録を作成する権限がありません', + noPermissionUpdate: 'メンテナンス記録を更新する権限がありません', + noPermissionPerform: 'メンテナンスを実行する権限がありません', + noPermissionRemove: 'メンテナンス記録を削除する権限がありません', + noPermissionAssign: 'メンテナンスを割り当てる権限がありません', + noPermissionEditTypes: 'メンテナンスタイプを編集する権限がありません', + noPermissionDeleteTypes: 'メンテナンスタイプを削除する権限がありません', + noPermissionEditIntervals: 'メンテナンス間隔を編集する権限がありません', + noPermissionEditHours: 'メンテナンス時間を編集する権限がありません', + types: { + lubricateRails: 'リニアレールの潤滑', + cleanNozzle: 'ノズル/ホットエンドの清掃', + checkBelts: 'ベルト張力の確認', + cleanBuildPlate: 'ビルドプレートの清掃', + checkExtruder: 'エクストルーダーギアの確認', + checkCooling: '冷却ファンの確認', + generalInspection: '総合点検', + cleanCarbonRods: 'カーボンロッドの清掃', + checkPtfeTube: 'PTFEチューブの確認', + replaceHepaFilter: 'HEPAフィルター交換', + replaceCarbonFilter: 'カーボンフィルター交換', + lubricateLeftNozzleRail: '左ノズルレールの潤滑', + }, + }, + + // Settings page + settings: { + title: '設定', + general: '一般', + appearance: '外観', + notifications: '通知', + smartPlugs: 'スマートプラグ', + tabSpoolman: 'Spoolman', + updates: 'アップデート', + language: '言語', + languageDescription: '表示言語を選択してください', + theme: 'テーマ', + themeLight: 'ライト', + themeDark: 'ダーク', + themeSystem: 'システム設定に従う', + defaultView: 'デフォルト画面', + defaultViewDescription: 'アプリ起動時に表示するページ', + checkForUpdates: 'アップデートを確認', + autoUpdate: '自動アップデート', + currentVersion: '現在のバージョン', + latestVersion: '最新バージョン', + upToDate: '最新です', + updateAvailable: 'アップデートあり', + telemetry: '匿名テレメトリ', + telemetryDescription: '匿名の使用状況データを送信してBamBuddyの改善に協力する', + telemetryLearnMore: '詳しく見る', + telemetryInfoTitle: 'どのようなデータが収集されますか?', + telemetryInfoIntro: 'BamBuddyはアプリの利用者数、使用バージョン、プリンターモデルを把握するために最小限の匿名データを収集します。これはバグ修正や新機能の優先順位付けに役立ちます。', + telemetryInfoCollected: '収集するデータ:', + telemetryInfoItem1: 'ランダムなインストールID(個人やハードウェアとは紐付きません)', + telemetryInfoItem2: '使用中のアプリバージョン', + telemetryInfoItem3: 'プリンターのモデル名(例: X1C, P1S)- 名前やシリアル番号は含みません', + telemetryInfoItem4: 'タイムスタンプ(日次/週次のアクティブユーザー数の計測用)', + telemetryInfoNotCollected: '収集しないデータ:', + telemetryInfoNotItem1: 'IPアドレスはハッシュ化され、復元できません', + telemetryInfoNotItem2: 'プリンター名、シリアル番号、アクセスコード', + telemetryInfoNotItem3: '印刷履歴、ファイル名、その他の個人的なコンテンツ', + telemetryInfoNotItem4: '個人を特定できる情報', + telemetryInfoFooter: 'テレメトリはいつでも無効にできます。インストールIDはランダムに生成され、個人を追跡することはできません。', + // Notifications + notificationLanguage: '通知の言語', + notificationLanguageDescription: 'プッシュ通知の言語', + notificationProviders: '通知プロバイダー', + addProvider: 'プロバイダーを追加', + editProvider: 'プロバイダーを編集', + providerType: 'プロバイダーの種類', + testNotification: 'テスト通知', + testSuccess: 'テスト通知を送信しました', + testFailed: 'テスト通知の送信に失敗しました', + quietHours: 'おやすみ時間', + quietHoursDescription: 'この時間帯は通知を送信しません', + quietHoursStart: '開始', + quietHoursEnd: '終了', + events: { + title: '通知イベント', + printStart: '印刷開始', + printComplete: '印刷完了', + printFailed: '印刷失敗', + printStopped: '印刷中止', + printProgress: '進捗マイルストーン', + printProgressDescription: '25%, 50%, 75%で通知', + printerOffline: 'プリンターオフライン', + printerError: 'プリンターエラー', + filamentLow: 'フィラメント残量低下', + maintenanceDue: 'メンテナンス期限', + maintenanceDueDescription: 'メンテナンスが必要なときに通知', + }, + // Smart Plugs + smartPlug: { + title: 'スマートプラグ', + add: 'スマートプラグを追加', + edit: 'スマートプラグを編集', + name: '名前', + ipAddress: 'IPアドレス', + linkedPrinter: '連携プリンター', + autoOn: '自動電源オン', + autoOnDescription: '印刷開始時に電源を入れる', + autoOff: '自動電源オフ', + autoOffDescription: '印刷完了後に電源を切る', + offDelay: 'オフ遅延', + offDelayMinutes: '印刷後の待機時間(分)', + offDelayTemp: 'ノズル温度が下回ったとき', + currentState: '現在の状態', + turnOn: '電源オン', + turnOff: '電源オフ', + }, + // Spoolman + spoolman: { + title: 'Spoolman連携', + description: 'Spoolmanに接続してフィラメント在庫を管理します。AMSデータは自動的に同期されます。', + howSyncWorks: '同期の仕組み', + syncInfo1: '公式Bambu LabスプールのみRFIDで同期されます', + syncInfo2: '新しいスプールは初回同期時にSpoolmanに自動作成されます', + syncInfo3: 'サードパーティ・詰め替えスプールはスキップされます', + linkingExisting: '既存スプールの連携', + linkingExistingDesc: '既存のSpoolmanスプールをAMSに連携するには、AMSスロットにカーソルを合わせて「Spoolmanに連携」をクリックしてください。', + enable: 'Spoolmanを有効化', + enableDesc: 'Spoolmanサーバーとフィラメントデータを同期', + url: 'Spoolman URL', + urlHint: 'SpoolmanサーバーのURL(例: http://localhost:7912)', + syncMode: '同期モード', + syncModeAuto: '自動', + syncModeManual: '手動のみ', + syncModeAutoDesc: '変更が検出されるとAMSデータが自動同期されます', + syncModeManualDesc: '手動トリガー時のみ同期', + statusLabel: 'ステータス:', + connected: '接続中', + disconnected: '未接続', + disconnect: '切断', + connect: '接続', + syncAmsData: 'AMSデータを同期', + syncAmsDataDesc: 'プリンターのAMSデータをSpoolmanに手動同期', + allPrinters: 'すべてのプリンター', + sync: '同期', + syncSuccess: '{{count}}個のスプールを同期しました', + syncWithErrors: '{{count}}個のスプールを同期({{errorCount}}件のエラー)', + spoolsSkipped: '{{count}}個のスプールをスキップ', + showAll: 'すべて表示', + showLess: '折りたたむ', + andMore: '...他{{count}}件', + errors: 'エラー:', + // LinkSpoolModal + linkToSpoolman: 'Spoolmanに連携', + linkingAmsTray: '連携するAMSトレイ:', + spoolUuid: 'スプールUUID:', + selectSpoolToLink: '連携するSpoolmanスプールを選択:', + unknownFilament: '不明なフィラメント', + noUnlinkedSpools: 'Spoolmanに未連携のスプールが見つかりません。', + allSpoolsLinked: 'すべてのスプールはAMSトレイに連携済みです。', + linking: '連携中...', + linkSpool: 'スプールを連携', + linkTooltip: 'このスプールをSpoolmanスプールに連携', + noUnlinked: '未連携のスプールがありません', + }, + + // Page + subtitle: 'Bambuddyの設定', + saved: '設定を保存しました', + saveFailed: '保存に失敗しました: {{error}}', + + // Tabs + tabGeneral: '一般', + tabSmartPlugs: 'スマートプラグ', + tabNotifications: '通知', + tabFilament: 'フィラメント', + tabNetwork: 'ネットワーク', + tabApiKeys: 'APIキー', + tabVirtualPrinter: '仮想プリンター', + tabUsers: 'ユーザー', + + // General - Date/Time + dateFormat: '日付形式', + timeFormat: '時刻形式', + systemDefault: 'システムデフォルト', + dateFormatUS: 'US (MM/DD/YYYY)', + dateFormatEU: 'EU (DD/MM/YYYY)', + dateFormatISO: 'ISO (YYYY-MM-DD)', + timeFormat12h: '12時間 (3:30 PM)', + timeFormat24h: '24時間 (15:30)', + defaultPrinter: 'デフォルトプリンター', + noDefaultPrinter: 'デフォルトなし(毎回選択)', + defaultPrinterDescription: 'アップロード、再印刷、その他の操作でこのプリンターを事前選択します。', + sidebarOrder: 'サイドバーの順序', + sidebarOrderDescription: 'サイドバーの項目をドラッグ&ドロップで並べ替えできます。ここでデフォルトの順序にリセットできます。', + reset: 'リセット', + + // Appearance + darkMode: 'ダークモード', + lightMode: 'ライトモード', + active: '(有効)', + background: '背景', + accent: 'アクセント', + style: 'スタイル', + bgNeutral: 'ニュートラル', + bgWarm: 'ウォーム', + bgCool: 'クール', + bgOLED: 'OLED ブラック', + bgSlate: 'スレートブルー', + bgForest: 'フォレストグリーン', + accentGreen: 'グリーン', + accentTeal: 'ティール', + accentBlue: 'ブルー', + accentOrange: 'オレンジ', + accentPurple: 'パープル', + accentRed: 'レッド', + styleClassic: 'クラシック', + styleGlow: 'グロー', + styleVibrant: 'ビブラント', + themeToggleHint: 'サイドバーの太陽/月アイコンでダークモードとライトモードを切り替えます。', + + // Archive Settings + archiveSettings: 'アーカイブ設定', + autoArchive: '自動アーカイブ', + autoArchiveDescription: '印刷完了時に3MFファイルを自動的に保存', + saveThumbnails: 'サムネイルを保存', + saveThumbnailsDescription: '3MFファイルからプレビュー画像を抽出して保存', + captureFinishPhoto: '完了写真を撮影', + captureFinishPhotoDescription: '印刷完了時にプリンターカメラから写真を撮影', + ffmpegNotInstalled: 'ffmpegがインストールされていません', + ffmpegInstruction: 'カメラキャプチャにはffmpegが必要です。brew install ffmpeg(macOS)またはapt install ffmpeg(Linux)でインストールしてください。', + + // Camera + camera: 'カメラ', + cameraViewMode: 'カメラ表示モード', + cameraNewWindow: '新しいウィンドウ', + cameraEmbedded: '埋め込みオーバーレイ', + cameraEmbeddedDescription: 'メイン画面上のリサイズ可能なオーバーレイでカメラを開きます', + cameraNewWindowDescription: '別のブラウザウィンドウでカメラを開きます', + + // Cost Tracking + costTracking: 'コスト追跡', + defaultFilamentCost: 'デフォルトフィラメントコスト(kg単位)', + currency: '通貨', + electricityCost: '電気代(kWh単位)', + energyDisplayMode: 'エネルギー表示モード', + energyPrintsOnly: '印刷のみ', + energyTotalConsumption: '総消費量', + energyPrintsOnlyDescription: 'ダッシュボードに印刷中に使用されたエネルギーの合計を表示', + energyTotalDescription: 'ダッシュボードにスマートプラグの累計エネルギーを表示', + + // File Manager + fileManager: 'ファイルマネージャー', + archiveOnPrint: '印刷時のアーカイブエントリ作成', + archiveAlways: '常にアーカイブエントリを作成', + archiveNever: 'アーカイブエントリを作成しない', + archiveAsk: '毎回確認', + archiveOnPrintDescription: 'ファイルマネージャーから印刷する際、オプションでアーカイブエントリを作成', + lowDiskWarning: 'ディスク容量不足の警告', + lowDiskWarningDescription: '空きディスク容量がこのしきい値を下回ると警告を表示', + + // Updates + checkPrinterFirmware: 'プリンターファームウェアの確認', + checkPrinterFirmwareDescription: 'Bambu Labのプリンターファームウェア更新を確認', + checkForUpdatesDescription: '起動時に自動的に新しいバージョンを確認', + checkNow: '今すぐ確認', + releaseNotes: 'リリースノート', + viewOnGitHub: 'GitHubで表示', + updateViaDocker: 'Docker Composeでアップデート:', + installUpdate: 'アップデートをインストール', + close: '閉じる', + + // Data Management + dataManagement: 'データ管理', + backupData: 'データのバックアップ', + backupDescription: '設定、プロバイダー、プリンターなどをエクスポート', + export: 'エクスポート', + restoreBackup: 'バックアップの復元', + restoreDescription: '重複処理オプション付きでバックアップファイルから設定をインポート', + restore: '復元', + clearLogs: '通知ログを削除', + clearLogsDescription: '30日以上前の通知ログを削除', + clear: '削除', + resetUI: 'UIの設定をリセット', + resetUIDescription: 'サイドバーの順序、テーマ、表示モード、レイアウト設定をリセットします。プリンター、アーカイブ、設定には影響しません。', + clearLogsTitle: '通知ログを削除', + clearLogsMessage: '30日以上前のすべての通知ログを完全に削除します。この操作は元に戻せません。', + clearLogsConfirm: 'ログを削除', + clearLogsFailed: 'ログの削除に失敗しました', + resetUITitle: 'UIの設定をリセット', + resetUIMessage: 'すべてのUI設定をデフォルトにリセットします:サイドバーの順序、テーマ、ダッシュボードレイアウト、表示モード、ソート設定。プリンター、アーカイブ、サーバー設定には影響しません。クリア後にページが再読み込みされます。', + resetPreferences: '設定をリセット', + preferencesReset: 'UI設定をリセットしました。更新中...', + + // Network + externalUrl: '外部URL', + externalUrlDescription: 'Bambuddyがアクセス可能な外部URL。通知画像や外部連携に使用されます。', + bambuddyUrl: 'Bambuddy URL', + externalUrlHint: 'プロトコルとポートを含めてください(例: http://192.168.1.100:8000)', + ftpRetry: 'FTPリトライ', + ftpRetryDescription: 'プリンターのWi-Fiが不安定な場合にFTP操作をリトライします。3MFダウンロード、印刷アップロード、タイムラプスダウンロード、ファームウェアアップデートに適用されます。', + enableRetry: 'リトライを有効化', + enableRetryDescription: '失敗したFTP操作を自動的にリトライ', + retryAttempts: 'リトライ回数', + times: '回', + retryAttemptsDescription: '諦めるまでのリトライ回数(1-10)', + retryDelay: 'リトライ間隔', + seconds: '秒', + retryDelayDescription: 'リトライ間の待ち時間(1-30)', + connectionTimeout: '接続タイムアウト', + connectionTimeoutDescription: '遅い接続用のソケットタイムアウト。Wi-Fiが弱いA1/A1 Miniプリンターの場合は増やしてください(10-120)', + homeAssistant: 'Home Assistant', + connected: '接続済み', + disconnected: '未接続', + homeAssistantDescription: 'Home Assistantに接続してHA REST APIでスマートプラグを制御します。switch、light、input_booleanエンティティに対応しています。', + enableHA: 'Home Assistantを有効化', + enableHADescription: 'Home Assistantでスマートプラグを制御', + haUrl: 'Home Assistant URL', + haToken: '長期アクセストークン', + haTokenHint: 'HAでトークンを作成: プロフィール → 長期アクセストークン → トークン作成', + testConnection: '接続テスト', + connectionSuccessful: '接続成功', + connectionFailed: '接続失敗', + haConnectionSuccess: 'Home Assistantへの接続に成功しました。', + haConnectionFailed: 'Home Assistantへの接続に失敗しました。', + mqttPublishing: 'MQTT配信', + mqttDescription: 'BamBuddyイベントを外部MQTTブローカーに配信し、Node-RED、Home Assistant、その他の自動化システムと連携します。', + enableMqtt: 'MQTTを有効化', + enableMqttDescription: '外部MQTTブローカーにイベントを配信', + brokerHostname: 'ブローカーホスト名', + port: 'ポート', + useTls: 'TLSを使用', + usernameOptional: 'ユーザー名(オプション)', + passwordOptional: 'パスワード(オプション)', + topicPrefix: 'トピックプレフィックス', + connectedTo: '接続先:', + notConnected: '未接続', + + // Smart Plugs + smartPlugsDescription: 'スマートプラグ(TasmotaまたはHome Assistant)を接続して、電源制御を自動化し、プリンターのエネルギー消費を追跡します。', + turnAllPlugsOn: 'すべてのプラグをオン', + turnAllPlugsOff: 'すべてのプラグをオフ', + allOn: '全オン', + allOff: '全オフ', + addSmartPlug: 'スマートプラグを追加', + energySummary: 'エネルギー概要', + currentPower: '現在の電力', + today: '今日', + yesterday: '昨日', + total: '合計', + enablePlugsForEnergy: 'プラグを有効にしてエネルギー概要を表示', + noSmartPlugs: 'スマートプラグが設定されていません', + noSmartPlugsDescription: 'Tasmotaベースのスマートプラグを追加して、エネルギー消費を追跡し、電源制御を自動化します。', + addFirstSmartPlug: '最初のスマートプラグを追加', + + // Notifications + providers: 'プロバイダー', + log: 'ログ', + testAll: 'すべてテスト', + add: '追加', + testResults: 'テスト結果', + dismiss: '閉じる', + noProviders: 'プロバイダーが設定されていません', + noProvidersDescription: 'アラートを受信するにはプロバイダーを追加してください。', + messageTemplates: 'メッセージテンプレート', + templatesDescription: '各イベントの通知メッセージをカスタマイズします。', + noTemplates: 'テンプレートがありません。バックエンドを再起動してデフォルトテンプレートを作成してください。', + testAllSuccess: 'すべて{{count}}件のプロバイダーのテストに成功しました!', + testAllPartial: '{{success}}/{{tested}}件のプロバイダーが成功', + testProvidersFailed: 'プロバイダーのテストに失敗しました: {{error}}', + bulkPlugSuccess: 'すべて{{count}}個のプラグを{{action}}にしました', + bulkPlugPartial: '{{success}}個のプラグを{{action}}にしました、{{failed}}個が失敗', + bulkPlugFailed: '失敗: {{error}}', + + // API Keys + apiKeys: 'APIキー', + apiKeysDescription: '外部連携やWebhook用のAPIキーを作成します。', + createKey: 'キーを作成', + apiKeyCreated: 'APIキーを作成しました', + apiKeyDeleted: 'APIキーを削除しました', + apiKeySuccess: 'APIキーが正常に作成されました', + apiKeyCopyWarning: '今すぐこのキーをコピーしてください - 再表示されません!', + keyCopied: 'キーをクリップボードにコピーしました', + keyCopyFailed: 'キーのコピーに失敗しました', + keyAddedToBrowser: 'キーをAPIブラウザに追加しました', + useInBrowser: 'APIブラウザで使用', + createNewApiKey: '新しいAPIキーを作成', + keyName: 'キー名', + permissions: '権限', + readStatus: 'ステータスの読み取り', + readStatusDescription: 'プリンターのステータスとキューを表示', + manageQueue: 'キューの管理', + manageQueueDescription: '印刷キューへのアイテムの追加と削除', + controlPrinter: 'プリンターの制御', + controlPrinterDescription: '印刷の一時停止、再開、停止', + cancel: 'キャンセル', + lastUsed: '最終使用:', + badgeRead: '読取', + badgeQueue: 'キュー', + badgeControl: '制御', + noApiKeys: 'APIキーがありません', + noApiKeysDescription: '外部サービスとの連携用にAPIキーを作成してください。', + createFirstKey: '最初のキーを作成', + deleteApiKeyTitle: 'APIキーを削除', + deleteApiKeyMessage: 'このAPIキーを削除してもよろしいですか?このキーを使用しているすべての連携が動作しなくなります。', + deleteKey: 'キーを削除', + webhookEndpoints: 'Webhookエンドポイント', + webhookApiKeyHint: 'X-API-KeyヘッダーでAPIキーを使用してください。', + webhookGetAll: 'すべてのプリンターステータスを取得', + webhookGetOne: '特定のプリンターステータスを取得', + webhookQueue: '印刷キューに追加', + webhookPause: '印刷を一時停止', + webhookResume: '印刷を再開', + webhookStop: '印刷を停止', + apiBrowser: 'APIブラウザ', + apiBrowserDescription: 'すべての利用可能なAPIエンドポイントを探索してテストします。', + apiKeyForTesting: 'テスト用APIキー', + apiKeyHeaderHint: 'このキーはリクエストのX-API-Keyヘッダーとして送信されます。', + apiKeyCreateFailed: 'APIキーの作成に失敗しました: {{error}}', + apiKeyDeleteFailed: 'APIキーの削除に失敗しました: {{error}}', + + // Filament + amsThresholds: 'AMS表示しきい値', + amsThresholdsDescription: 'AMS湿度と温度インジケーターの色しきい値を設定します。', + humidity: '湿度', + goodGreen: '良好(緑)≤', + fairOrange: '普通(オレンジ)≤', + aboveFairBad: '普通のしきい値以上は赤(悪い)で表示', + temperature: '温度', + goodBlue: '良好(青)≤', + aboveFairHot: '普通のしきい値以上は赤(高温)で表示', + historyRetention: '履歴の保持', + keepHistoryFor: 'センサー履歴の保持期間', + days: '日', + historyRetentionDescription: '古い湿度と温度データは自動的に削除されます', + printModal: '印刷ダイアログ', + expandMapping: 'カスタムマッピングをデフォルトで展開', + expandMappingDescription: '複数のプリンターに印刷する際、プリンターごとのAMSマッピングを展開して表示', + + // Users + currentUser: '現在のユーザー', + role: 'ロール:', + roleAdmin: '管理者', + roleUser: 'ユーザー', + manageUsers: 'ユーザー管理', + disableAuth: '認証を無効化', + rolePermissions: 'ロール権限', + rolePermissionsDescription: '各ロールの権限の概要。', + adminPerm1: 'プリンター設定の管理', + adminPerm2: 'ユーザーの作成、編集、削除', + adminPerm3: 'すべてのシステム機能へのアクセス', + userPerm1: '印刷ジョブの送信', + userPerm2: 'ファイルとアーカイブの管理', + userPerm3: 'フィラメントの管理', + disableAuthTitle: '認証を無効化', + disableAuthMessage: '認証を無効にしてもよろしいですか?これにより、Bambuddyインスタンスはログインなしでアクセス可能になります。すべてのユーザーはデータベースに残りますが、認証は無効になります。', + disableAuthConfirm: '認証を無効化', + authDisabledSuccess: '認証を正常に無効化しました', + disableAuthFailed: '認証の無効化に失敗しました', + unknownError: '不明なエラー', + haUrlPlaceholder: 'http://homeassistant.local:8123', + haTokenPlaceholder: '長期アクセストークン', + mqttHostPlaceholder: '例: 192.168.1.100', + leaveEmptyAnonymous: '匿名接続の場合は空欄', + mqttTopicDefault: 'bambuddy', + apiKeyNamePlaceholder: '例: Home Assistantインテグレーション', + apiKeyTestPlaceholder: 'テスト用APIキーを貼り付け', + unnamedKey: '名前なしキー', + plugsOnline: '{{online}}/{{total}} オンライン', + passed: '{{count}}件 成功', + failed: '{{count}}件 失敗', + externalUrlPlaceholder: 'http://192.168.1.100:8000', + bulkPlugTitle: 'すべてのプラグを{{action}}', + bulkPlugMessage: '有効な{{count}}個のスマートプラグをすべて{{action}}しますか?', + bulkPlugConfirm: 'すべて{{action}}', + updateCheckFailed: '確認失敗: {{error}}', + releaseNotesTitle: 'リリースノート - v{{version}}', + mqttTopicsHint: 'トピック: {{prefix}}/printers//status など', + virtualPrinterUpdated: '仮想プリンター設定を更新しました', + vp: { + title: '仮想プリンター', + running: '稼働中', + stopped: '停止中', + description: 'Bambu StudioやOrcaSlicerに表示される仮想プリンターを有効にします。このプリンターに送信されたファイルは印刷せずに直接アーカイブされます。', + enable: '仮想プリンターを有効化', + visibleInSlicer: 'スライサーの検出リストに「Bambuddy」として表示', + notVisible: 'スライサーに表示されません', + printerModel: 'プリンターモデル', + printerModelDescription: 'エミュレートするプリンターモデルを選択します。', + modelRestartWarning: 'モデルを変更すると仮想プリンターが再起動されます', + accessCode: 'アクセスコード', + accessCodeSet: 'アクセスコードが設定済み', + noAccessCode: 'アクセスコード未設定 - 有効化に必要です', + accessCodeRequired: '先にアクセスコードを設定してください', + accessCodeEmpty: 'アクセスコードは空にできません', + accessCodeLength: 'アクセスコードは8文字である必要があります', + accessCodeHint: '8文字である必要があります。スライサーの認証に使用されます。', + mode: 'モード', + modeArchive: 'アーカイブ', + modeArchiveDesc: 'ファイルを即座にアーカイブ', + modeReview: 'レビュー', + modeReviewDesc: 'アーカイブ前にレビューとタグ付け', + modeQueue: 'キュー', + modeQueueDesc: 'アーカイブしてキューに追加', + setupRequired: 'セットアップが必要', + setupDescription: '仮想プリンター機能を使用するには、追加のシステム設定が必要です。ポートフォワーディング、ファイアウォールルール、プラットフォーム固有の設定が含まれます。', + readSetupGuide: '有効化する前にセットアップガイドをお読みください', + howItWorks: '仕組み:', + step1: 'お使いのプラットフォームのセットアップガイドを完了する', + step2: '仮想プリンターを有効にしてアクセスコードを設定する', + step3: 'Bambu StudioまたはOrcaSlicerで「プリンターを追加」を開く', + step4: '検出リストに「Bambuddy」プリンターが表示される', + step5: '設定したアクセスコードで接続する', + step6: 'Bambuddyに「印刷」すると、3MFファイルがアーカイブされる', + statusDetails: 'ステータス詳細', + printerName: 'プリンター名', + model: 'モデル', + serialNumber: 'シリアルナンバー', + pendingFiles: '保留中のファイル', + }, + enterNewCodeToChange: '新しいコードを入力して変更', + enter8CharCode: '8文字のコードを入力', + notificationTitlePlaceholder: '通知タイトル...', + notificationBodyPlaceholder: '通知本文...', + templateTitleRequired: 'タイトルは必須です', + templateBodyRequired: '本文は必須です', + editTemplate: 'テンプレートを編集: {{name}}', + templateTitle: 'タイトル', + templateBody: '本文', + availableVariables: '利用可能な変数', + insertVariableHint: 'クリックして本文のカーソル位置に挿入', + livePreview: 'ライブプレビュー', + loadingPreview: 'プレビューを読み込み中...', + previewTitle: 'タイトル:', + previewBody: '本文:', + enterTemplateToPreview: 'テンプレートの内容を入力するとプレビューが表示されます', + resetToDefault: 'デフォルトに戻す', + noExternalLinks: '外部リンクが設定されていません', + clickAddLink: '「リンクを追加」をクリックして追加', + deleteLink: 'リンクを削除', + deleteLinkConfirm: '「{{name}}」を削除しますか?この操作は取り消せません。', + editLink: 'リンクを編集', + addExternalLink: '外部リンクを追加', + addLink: 'リンクを追加', + sidebarLinks: 'サイドバーリンク', + sidebarLinksDescription: '外部リンクをサイドバーナビゲーションに追加します。ドラッグで並べ替え。', + linkNamePlaceholder: 'マイリンク', + linkNameLabel: '名前', + linkUrlLabel: 'URL', + linkIconLabel: 'アイコン', + linkCustomIcon: 'カスタムアイコン', + linkCustomIconHint: 'PNG, JPG, GIF, SVG, WebP, ICO。最大1MB。', + linkChoosePresetIcon: 'またはプリセットアイコンを選択', + linkNameRequired: '名前は必須です', + linkUrlRequired: 'URLは必須です', + linkUrlInvalid: 'URLは http:// または https:// で始まる必要があります', + linkInvalidImageType: '有効な画像ファイルを選択してください(PNG, JPG, GIF, SVG, WebP, ICO)', + linkImageTooLarge: '画像ファイルは1MB以下にしてください', + removeCustomIcon: 'カスタムアイコンを削除', + jsonRequestBody: 'JSONリクエストボディ...', + searchEndpoints: 'エンドポイントを検索...', + // Groups and Users + groups: 'グループ', + addGroup: 'グループを追加', + noGroupsFound: 'グループが見つかりません', + systemGroup: 'システム', + noDescription: '説明なし', + users: 'ユーザー', + addUser: 'ユーザーを追加', + noUsersFound: 'ユーザーが見つかりません', + admin: '管理者', + authentication: '認証', + authEnableDescription: '認証を有効にして、ユーザーアカウントの作成、権限の管理、Bambuddyインスタンスのセキュリティ保護を行います。', + authSecuredDescription: 'Bambuddyインスタンスは認証で保護されています。', + enable: '有効にする', + disable: '無効にする', + changePassword: 'パスワードを変更', + backup: 'バックアップ', + backupAndRestore: 'バックアップと復元', + backupAndRestoreDescription: 'Bambuddyデータのバックアップを作成および復元します', + goToBackup: 'バックアップへ移動', + homeAssistantDescriptionFull: 'Home Assistantに接続してスマートホームデバイスを制御します', + usersCount: '{{count}}人のユーザー', + permissionsCount: '{{count}}個の権限', + + // Users tab - Auth Disabled + authDisabledTitle: '認証が無効です', + authDisabledDescription: '認証を有効にして、ユーザーアカウントの作成、権限の管理、Bambuddyインスタンスのセキュリティを確保しましょう。', + authFeature1: 'システムへのアクセスにログインを要求', + authFeature2: 'グループベースの権限を持つ複数のユーザーを作成', + authFeature3: '50以上のきめ細かい権限でアクセスを制御', + enableAuthentication: '認証を有効にする', + + // Users tab - Create User Modal + createUser: 'ユーザーを作成', + username: 'ユーザー名', + enterUsername: 'ユーザー名を入力', + password: 'パスワード', + enterPassword: 'パスワードを入力(6文字以上)', + confirmPassword: 'パスワードの確認', + confirmPasswordPlaceholder: 'パスワードを確認', + passwordsDoNotMatch: 'パスワードが一致しません', + groupsLabel: 'グループ', + systemLabel: '(システム)', + noGroupsAvailable: '利用可能なグループがありません', + creating: '作成中...', + + // Users tab - Edit User Modal + editUser: 'ユーザーを編集', + leaveBlankToKeep: '(現在のパスワードを維持する場合は空白)', + enterNewPassword: '新しいパスワードを入力', + confirmNewPassword: '新しいパスワードを確認', + + // Users tab - Delete User + deleteUser: 'ユーザーを削除', + deleteUserConfirm: 'このユーザーを削除してもよろしいですか?この操作は元に戻せません。', + + // Users tab - Create/Edit Group Modal + createGroup: 'グループを作成', + editGroup: 'グループを編集', + groupName: 'グループ名', + enterGroupName: 'グループ名を入力', + systemGroupNameReadonly: 'システムグループ名は変更できません', + descriptionLabel: '説明', + enterDescription: '説明を入力(任意)', + permissionsSelected: '権限({{count}}件選択中)', + + // Users tab - Delete Group + deleteGroup: 'グループを削除', + deleteGroupConfirm: 'このグループを削除してもよろしいですか?このグループのユーザーはこれらの権限を失います。', + + // Users tab - Change Password Modal + changePasswordTitle: 'パスワードの変更', + currentPassword: '現在のパスワード', + enterCurrentPassword: '現在のパスワードを入力', + newPassword: '新しいパスワード', + enterNewPasswordMin6: '新しいパスワードを入力(6文字以上)', + confirmNewPasswordPlaceholder: '新しいパスワードを確認', + passwordMinLength: 'パスワードは6文字以上である必要があります', + passwordChanged: 'パスワードが正常に変更されました', + failedToChangePassword: 'パスワードの変更に失敗しました', + changingPassword: '変更中...', + + // Prometheus Metrics + prometheusTitle: 'Prometheusメトリクス', + prometheusDescriptionPre: 'プリンターメトリクスを', + prometheusDescriptionPost: 'でPrometheus/Grafanaモニタリング用に公開します。', + enableMetricsEndpoint: 'メトリクスエンドポイントを有効化', + exposePrometheusData: 'プリンターデータをPrometheus形式で公開', + bearerTokenOptional: 'Bearerトークン(任意)', + bearerTokenPlaceholder: '認証不要の場合は空欄のまま', + bearerTokenHint: '設定した場合、リクエストに次のヘッダーが必要: ', + availableMetrics: '利用可能なメトリクス', + metricConnectionStatus: '接続状態', + metricPrinterState: 'プリンター状態(アイドル/印刷中など)', + metricPrintProgress: '印刷進捗 0-100%', + metricBedTemp: 'ベッド温度', + metricNozzleTemp: 'ノズル温度', + metricPrintsTotal: '結果別の合計印刷数', + metricAndMore: '...その他(レイヤー、ファン、キュー、フィラメント使用量)', + }, + + // Notifications (for push notifications) + notification: { + printStarted: { + title: '印刷開始', + body: '{{printer}}: {{filename}} の印刷を開始しました', + }, + printCompleted: { + title: '印刷完了', + body: '{{printer}}: {{filename}} が正常に完了しました', + }, + printFailed: { + title: '印刷失敗', + body: '{{printer}}: {{filename}} が失敗しました', + }, + printStopped: { + title: '印刷中止', + body: '{{printer}}: {{filename}} が中止されました', + }, + printProgress: { + title: '印刷進捗', + body: '{{printer}}: {{filename}} は {{percent}}% 完了', + }, + printerOffline: { + title: 'プリンターオフライン', + body: '{{printer}} がオフラインです', + }, + printerError: { + title: 'プリンターエラー', + body: '{{printer}}: {{error}}', + }, + filamentLow: { + title: 'フィラメント残量低下', + body: '{{printer}}: フィラメントが残りわずかです', + }, + maintenanceDue: { + title: 'メンテナンス期限', + body: '{{printer}}: {{items}} の対応が必要です', + }, + }, + + // Errors + errors: { + generic: '問題が発生しました', + networkError: 'ネットワークエラーです。接続を確認してください。', + notFound: '見つかりません', + unauthorized: '認証エラー', + serverError: 'サーバーエラー', + validationError: '入力内容を確認してください', + printerConnectionFailed: 'プリンターへの接続に失敗しました', + saveFailed: '保存に失敗しました', + deleteFailed: '削除に失敗しました', + loadFailed: 'データの読み込みに失敗しました', + }, + + // Confirmations + confirm: { + delete: '削除しますか?', + unsavedChanges: '保存されていない変更があります。このページを離れますか?', + clearQueue: 'キューをクリアしますか?', + }, + + // Calendar + calendar: { + months: { + january: '1月', february: '2月', march: '3月', + april: '4月', may: '5月', june: '6月', + july: '7月', august: '8月', september: '9月', + october: '10月', november: '11月', december: '12月', + }, + daysShort: { + sun: '日', mon: '月', tue: '火', wed: '水', + thu: '木', fri: '金', sat: '土', + }, + }, + + // 通知ログ + notificationLog: { + title: '通知ログ', + lastDays: '過去{{days}}日間:', + notifications: '件の通知', + sent: '送信済み', + failed: '失敗', + last24Hours: '過去24時間', + showFailedOnly: '失敗のみ表示', + clearOld: '古いログを削除', + noFailedNotifications: '失敗した通知はありません', + noNotificationsLogged: '通知ログはありません', + unknownProvider: '不明なプロバイダー', + titleLabel: 'タイトル', + messageLabel: 'メッセージ', + errorLabel: 'エラー', + provider: 'プロバイダー:', + time: '時間:', + clearLogsFailed: 'ログの削除に失敗しました: {{error}}', + events: { + print_start: '印刷開始', + print_complete: '印刷完了', + print_failed: '印刷失敗', + print_stopped: '印刷中止', + print_progress: '進捗', + printer_offline: 'プリンターオフライン', + printer_error: 'プリンターエラー', + filament_low: 'フィラメント残量低下', + maintenance_due: 'メンテナンス期限', + ams_humidity_high: 'AMS湿度高', + ams_temperature_high: 'AMS温度高', + test: 'テスト', + }, + }, + + // Notification providers + providers: { + callmebot: 'CallMeBot/WhatsApp', + ntfy: 'ntfy', + pushover: 'Pushover', + telegram: 'Telegram', + email: 'メール', + discord: 'Discord', + webhook: 'Webhook', + descriptions: { + email: 'SMTPメール通知', + telegram: 'Telegramボット経由の通知', + discord: 'Webhook経由でDiscordチャンネルに送信', + ntfy: '無料のセルフホスト対応プッシュ通知', + pushover: 'シンプルで確実なプッシュ通知', + callmebot: 'CallMeBot経由の無料WhatsApp通知', + webhook: '任意のURLへの汎用HTTP POST', + }, + }, + + // Backup / Restore + backup: { + categories: { + settings: '設定', + notification_providers: '通知プロバイダー', + notification_templates: '通知テンプレート', + smart_plugs: 'スマートプラグ', + printers: 'プリンター', + filaments: 'フィラメント', + maintenance_types: 'メンテナンスタイプ', + archives: 'アーカイブ', + projects: 'プロジェクト', + pending_uploads: 'アップロード待ち', + external_links: '外部リンク', + api_keys: 'APIキー', + }, + notificationProviders: '通知プロバイダー', + notificationTemplates: '通知テンプレート', + externalLinks: '外部リンク', + printers: 'プリンター', + filamentInventory: 'フィラメント在庫', + maintenanceTypes: 'メンテナンスタイプ', + printArchives: '印刷アーカイブ', + projects: 'プロジェクト', + pendingUploads: '保留中のアップロード', + apiKeys: 'APIキー', + settingsDescription: '言語、テーマ、更新設定', + notificationProvidersDescription: 'ntfy、Pushover、Discordなど', + notificationTemplatesDescription: 'カスタムメッセージテンプレート', + smartPlugsDescription: 'Tasmotaプラグ設定', + externalLinksDescription: '外部サービスへのサイドバーリンク', + printersDescription: 'プリンター情報(アクセスコードを除く)', + filamentInventoryDescription: 'フィラメントの種類とコスト', + maintenanceDescription: 'カスタムメンテナンススケジュール', + printArchivesDescription: '全印刷データ+ファイル(3MF、サムネイル、写真)', + projectsDescription: 'プロジェクト、BOMアイテム、添付ファイル', + pendingUploadsDescription: 'レビュー待ちの仮想プリンターアップロード', + apiKeysDescription: 'Webhook APIキー(インポート時に新しいキーが生成されます)', + }, + + // Restore modal + restore: { + failedToRestore: 'バックアップの復元に失敗しました。ファイル形式を確認してください。', + title: 'バックアップの復元', + restoring: '復元中...', + complete: '復元完了', + failed: '復元失敗', + importDescription: 'バックアップファイルから設定をインポート', + pleaseWait: 'データを復元しています。しばらくお待ちください', + duplicateHandling: '重複処理の仕組み:', + clickToSelect: 'クリックしてバックアップファイルを選択 (.json または .zip)', + replaceExisting: '既存データを上書き', + keepExisting: '既存データを保持', + overwriteDescription: '既に存在する項目をバックアップデータで上書きします', + skipDescription: 'まだ存在しない項目のみ復元します', + caution: '注意:', + overwriteWarning: '上書きすると、現在の設定がバックアップのデータに置き換えられます。セキュリティのため、プリンターのアクセスコードは上書きされません。', + restore: '復元', + processing: 'バックアップファイルを処理中...', + itemsRestored: '復元済み項目', + itemsSkipped: 'スキップ済み項目', + restoredSection: '復元済み', + filesSection: 'ファイル (3MF、サムネイルなど)', + skippedSection: 'スキップ (既に存在)', + andMore: '...他 {{count}} 件', + newApiKeys: '新しいAPIキーが生成されました', + copyKeysWarning: 'これらのキーは一度だけ表示されます。今すぐコピーしてください!', + copy: 'コピー', + noDataFound: 'バックアップファイルに復元するデータが見つかりませんでした。', + dupPrinters: 'プリンター', + dupPrintersDesc: 'シリアル番号で照合', + dupSmartPlugs: 'スマートプラグ', + dupSmartPlugsDesc: 'IPアドレスで照合', + dupNotificationProviders: '通知プロバイダー', + dupNotificationProvidersDesc: '名前で照合', + dupFilaments: 'フィラメント', + dupFilamentsDesc: '名前 + 種類 + ブランドで照合', + dupArchives: 'アーカイブ', + dupArchivesDesc: 'コンテンツハッシュで照合 (常にスキップ)', + dupPendingUploads: 'アップロード待ち', + dupPendingUploadsDesc: 'ファイル名で照合', + dupSettingsTemplates: '設定とテンプレート', + dupSettingsTemplatesDesc: '常に上書き', + }, + + // File manager + files: { + root: 'ルート', + cache: 'キャッシュ', + models: 'モデル', + timelapse: 'タイムラプス', + used: '使用中:', + free: '空き:', + filterPlaceholder: 'ファイルを検索...', + noFiles: 'このディレクトリにファイルがありません', + deleteFile: 'ファイルを削除', + deleteConfirm: '"{{name}}"を削除しますか?この操作は元に戻せません。', + // ファイル管理ページ + fileManager: 'ファイル管理', + pageDescription: 'プリントファイルを整理・管理', + newFolder: '新しいフォルダ', + folderName: 'フォルダ名', + folderNamePlaceholder: '例: 機能パーツ', + renameFile: 'ファイル名を変更', + renameFolder: 'フォルダ名を変更', + rename: '名前変更', + rootNoFolder: 'ルート(フォルダなし)', + moveFilesCount: '{{count}}個のファイルを移動', + current: '(現在)', + move: '移動', + linkFolder: 'フォルダをリンク', + linkFolderDescription: '「{{name}}」をプロジェクトまたはアーカイブにリンクしてすばやくアクセス。', + noProjectsFound: 'プロジェクトが見つかりません', + noArchivesFound: 'アーカイブが見つかりません', + unlink: 'リンク解除', + link: 'リンク', + uploadFiles: 'ファイルをアップロード', + dropFilesHere: 'ここにファイルをドロップ', + dragAndDropFiles: 'ファイルをドラッグ&ドロップ', + orClickToBrowse: 'またはクリックして選択', + zipAutoExtract: 'ZIPファイルは自動的に展開されます', + zipFilesDetected: 'ZIPファイルを検出', + zipChooseHandling: 'ZIPファイルが展開されます。フォルダ構造の処理方法を選択してください:', + preserveZipStructure: 'ZIPのフォルダ構造を保持', + willBeExtracted: '• 展開予定', + filesExtracted: '• {{count}}個のファイルを展開済み', + uploadComplete: 'アップロード完了: {{count}}個成功', + uploadErrorCount: '、{{count}}個失敗', + uploading: 'アップロード中...', + filesFailed: '{{count}}個のファイルが失敗', + uploadFailed: 'アップロード失敗', + linkToProjectOrArchive: 'プロジェクトまたはアーカイブにリンク', + changeLink: 'リンクを変更...', + linkTo: 'リンク先...', + printedCount: '{{count}}回印刷済み', + addToQueue: 'キューに追加', + adding: '追加中...', + folderCreated: 'フォルダを作成しました', + folderDeleted: 'フォルダを削除しました', + fileDeleted: 'ファイルを削除しました', + deletedFiles: '{{count}}個のファイルを削除しました', + filesMoved: 'ファイルを移動しました', + folderUnlinked: 'フォルダのリンクを解除しました', + folderLinked: 'フォルダをリンクしました', + addedToQueue: '{{count}}個のファイルをキューに追加しました', + addedToQueueWithErrors: '{{added}}個追加、{{errors}}個失敗', + failedToAddFiles: 'ファイルの追加に失敗: {{error}}', + fileRenamed: 'ファイル名を変更しました', + folderRenamed: 'フォルダ名を変更しました', + gridView: 'グリッド表示', + listView: 'リスト表示', + lowDiskSpaceWarning: 'ディスク容量不足の警告', + lowDiskSpaceDescription: '空き容量は{{free}}(合計{{total}})。しきい値は設定で{{threshold}} GBに設定されています。', + filesLabel: 'ファイル:', + foldersLabel: 'フォルダ:', + sizeLabel: 'サイズ:', + freeLabel: '空き:', + folders: 'フォルダ', + allFiles: 'すべてのファイル', + allTypes: 'すべての種類', + date: '日付', + size: 'サイズ', + type: '種類', + prints: '印刷回数', + ascending: '昇順', + descending: '降順', + filteredCount: '{{total}}件中{{filtered}}件', + deselectAll: 'すべて選択解除', + selectAll: 'すべて選択', + selectedCount: '{{count}}件選択中', + loadingFiles: 'ファイルを読み込み中...', + folderEmpty: 'フォルダは空です', + noFilesYet: 'ファイルはまだありません', + emptyFolderDescription: 'ファイルをアップロードするか、このフォルダにファイルを移動してください。', + emptyRootDescription: 'プリント関連ファイルの整理を始めるにはファイルをアップロードしてください。', + noMatchingFiles: '一致するファイルがありません', + noMatchingFilesDescription: '現在の検索またはフィルター条件に一致するファイルがありません。', + clearFilters: 'フィルターをクリア', + sort: { + nameAsc: '名前 (A-Z)', + nameDesc: '名前 (Z-A)', + sizeAsc: 'サイズ (小さい順)', + sizeDesc: 'サイズ (大きい順)', + dateAsc: '日付 (古い順)', + dateDesc: '日付 (新しい順)', + }, + searchFiles: 'ファイルを検索...', + deleteFolder: 'フォルダを削除', + deleteBulkTitle: '{{count}}件のファイルを削除', + deleteFolderConfirm: 'このフォルダを削除しますか?中のファイルもすべて削除されます。', + deleteMultipleConfirm: '選択した{{count}}件のファイルを削除しますか?この操作は元に戻せません。', + deleteFileConfirm: 'このファイルを削除しますか?', + deleting: '削除中...', + }, + + // Print options + printOptions: { + title: '印刷オプション', + bedLevelling: 'ベッドレベリング', + bedLevellingDesc: '印刷前にベッドを自動レベリング', + flowCali: 'フローキャリブレーション', + flowCaliDesc: '押出量を校正', + vibrationCali: '振動キャリブレーション', + vibrationCaliDesc: 'リンギングを低減', + layerInspect: '初層検査', + layerInspectDesc: 'AIによる初層の検査', + timelapse: 'タイムラプス', + timelapseDesc: 'タイムラプス動画を記録', + }, + + // 印刷モーダル + printModal: { + powerOffWhenDone: '完了後にプリンターの電源をオフ', + immediateHelp: 'プリンターがアイドル状態になり次第、印刷を開始します。', + scheduledHelp: 'スケジュールされた時間にプリンターがアイドル状態であれば印刷を開始します。ビジー状態の場合は、利用可能になるまで待機します。', + stagedHelp: '印刷はステージングされますが、自動的には開始されません。キューに送るにはスタートボタンを使用してください。', + print: '印刷', + reprint: '再印刷', + printToMultiple: '{{count}}台のプリンターに印刷', + editQueueItem: 'キューアイテムを編集', + sameTypeDifferentColor: '同じタイプ、異なる色', + filamentTypeNotLoaded: 'フィラメントタイプが読み込まれていません', + specificPrinter: '特定のプリンター', + selectPrinters: 'プリンターを選択', + selectAll: 'すべて選択', + printersSelected: '{{count}}台のプリンターを選択中', + noPrintersAvailable: '利用可能なプリンターがありません', + noActivePrintersAvailable: 'アクティブなプリンターがありません', + inactive: '非アクティブ', + unknownModel: '不明なモデル', + customMapping: 'カスタムマッピング', + auto: '自動', + showAll: 'すべて表示', + selectAtLeastOne: 'プリンターを1台以上選択してください', + selectTargetModel: 'ターゲットモデルを選択', + selectSlot: 'スロットを選択...', + reRead: '再読み込み', + customSlotMapping: 'カスタムスロットマッピング', + autoMatched: '自動マッチ', + manuallySelected: '手動選択', + schedulerWillAssign: 'スケジューラーが最初に利用可能なアイドル状態の{{model}}プリンターに割り当てます', + inLocation: '{{location}}内', + anyModel: '任意の{{model}}', + hiddenPrinters: '他{{count}}台のプリンターが非表示(異なるモデル)', + showOnlyModel: '{{model}}プリンターのみ表示', + matchedCount: '({{matched}}/{{total}} 一致)', + targetModelLabel: 'ターゲットモデル', + selectAModel: 'モデルを選択...', + locationFilterLabel: 'ロケーションフィルター(任意)', + anyLocation: 'すべてのロケーション', + }, + + // ログインページ + login: { + title: 'Bambuddy ログイン', + subtitle: 'アカウントにサインイン', + username: 'ユーザー名', + usernamePlaceholder: 'ユーザー名を入力', + password: 'パスワード', + passwordPlaceholder: 'パスワードを入力', + loggingIn: 'ログイン中...', + signIn: 'サインイン', + enterCredentials: 'ユーザー名とパスワードを入力してください', + success: 'ログインしました', + failed: 'ログインに失敗しました', + }, + + // セットアップページ + setup: { + title: 'Bambuddy セットアップ', + description: 'Bambuddyインスタンスの認証を設定します', + enableAuthentication: '認証を有効にする', + adminAccount: '管理者アカウント', + adminAccountDescription: '既に管理者ユーザーが存在する場合、既存の管理者アカウントを使用して認証が有効になります。既存の管理者を使用するには以下のフィールドを空のままにするか、新しい管理者ユーザーを作成するには新しい認証情報を入力してください。', + adminUsername: '管理者ユーザー名', + adminPassword: '管理者パスワード', + optionalIfAdminsExist: '管理者ユーザーが存在する場合は任意', + placeholderAdminUsername: '管理者ユーザー名を入力(任意)', + placeholderAdminPassword: '管理者パスワードを入力(任意)', + confirmPassword: 'パスワードの確認', + placeholderConfirmPassword: '管理者パスワードを確認', + settingUp: 'セットアップ中...', + completeSetup: 'セットアップを完了', + toast: { + authEnabledAdminCreated: '認証が有効になり、管理者ユーザーが作成されました', + authEnabledExistingAdmins: '既存の管理者ユーザーを使用して認証が有効になりました', + setupCompleted: 'セットアップが完了しました', + enterBothOrLeaveEmpty: '管理者ユーザー名とパスワードの両方を入力するか、既存の管理者ユーザーを使用するには両方を空にしてください', + passwordsDoNotMatch: 'パスワードが一致しません', + passwordMinLength: 'パスワードは6文字以上必要です', + }, + }, + + // ユーザーページ + users: { + title: 'ユーザー管理', + description: 'Bambuddyインスタンスのユーザーとアクセスを管理します', + noPermission: 'このページにアクセスする権限がありません。', + backToSettings: '設定に戻る', + createUser: 'ユーザーを作成', + deleteUser: 'ユーザーを削除', + deleteConfirmMessage: 'このユーザーを削除してもよろしいですか?この操作は元に戻せません。', + password: 'パスワード', + placeholderUsername: 'ユーザー名を入力', + placeholderPassword: 'パスワードを入力', + roleUser: 'ユーザー', + roleAdmin: '管理者', + statusActive: 'アクティブ', + statusInactive: '非アクティブ', + save: '保存', + cancel: 'キャンセル', + edit: '編集', + delete: '削除', + creating: '作成中...', + admin: '管理者', + editUser: 'ユーザーを編集', + groups: 'グループ', + noGroups: 'グループなし', + noGroupsAvailable: '利用可能なグループがありません', + confirmPassword: 'パスワードの確認', + placeholderNewPassword: '新しいパスワード', + placeholderConfirmPassword: 'パスワードの確認', + placeholderConfirmNewPassword: '新しいパスワードの確認', + leaveBlankToKeepCurrent: '現在のパスワードを維持する場合は空のままにしてください', + saveChanges: '変更を保存', + saving: '保存中...', + system: 'システム', + table: { + username: 'ユーザー名', + role: 'ロール', + status: 'ステータス', + actions: 'アクション', + groups: 'グループ', + }, + toast: { + userCreated: 'ユーザーが正常に作成されました', + userUpdated: 'ユーザーが正常に更新されました', + userDeleted: 'ユーザーが正常に削除されました', + fillRequiredFields: '必須項目をすべて入力してください', + passwordMinLength: 'パスワードは6文字以上である必要があります', + passwordsDoNotMatch: 'パスワードが一致しません', + }, + }, + + // アップロードモーダル + upload: { + title: '3MFファイルのアップロード', + dragDrop: '.3mfファイルをここにドラッグ&ドロップ', + or: 'または', + browseFiles: 'ファイルを参照', + associatePrinter: 'プリンターに関連付け(任意)', + noPrinter: 'プリンターなし', + uploaded: 'アップロード済み', + failedCount: '失敗', + filesUploaded: '{{count}}ファイルをアップロードしました', + printerModelExtracted: 'プリンターモデルは3MFメタデータから自動抽出されます', + filesFailed: '{{count}}ファイルのアップロードに失敗しました', + partialResult: '{{uploaded}}件アップロード、{{failed}}件失敗', + failed: 'アップロードに失敗しました', + uploading: 'アップロード中...', + upload: 'アップロード', + }, + + // G-codeビューアー + gcode: { + loading: 'G-codeを読み込み中...', + notAvailable: 'G-codeが利用できません', + notSlicedMessage: 'このファイルはまだスライスされていません。G-codeプレビューはBambu StudioまたはOrca Slicerでスライス後に利用可能です。', + loadFailed: 'G-codeの読み込みに失敗しました', + }, + + // ダッシュボード + dashboard: { + dragToReorder: 'ドラッグして並べ替え', + sizeClickCycle: 'サイズ: {{size}} - クリックで変更', + hideWidget: 'ウィジェットを非表示', + resetLayout: 'レイアウトをリセット', + hiddenCount: '{{count}}件非表示', + hiddenWidgets: '非表示のウィジェット(クリックで表示):', + allHidden: 'すべてのウィジェットが非表示です。', + }, + + // プリンターキューウィジェット + printerQueue: { + nextInQueue: '次のキュー', + asap: '即時', + now: '今すぐ', + inLessThanMin: '1分以内', + inMinutes: '{{count}}分後', + inHours: '{{count}}時間後', + }, + + // スマートプラグ + smartPlug: { + offline: 'オフライン', + admin: '管理', + openAdminPage: 'プラグの管理ページを開く', + linkedTo: '接続先:', + alerts: 'アラート', + automationSettings: '自動化設定', + showInSwitchbar: 'スイッチバーに表示', + switchbarDesc: 'サイドバーからクイックアクセス', + enabledDesc: 'このプラグの自動化を有効にする', + autoOffDesc: '印刷完了後に自動オフ(1回のみ)', + delayMode: 'オフ遅延モード', + temp: '温度', + delayMinutes: '遅延(分)', + tempThreshold: '温度しきい値(℃)', + tempThresholdDesc: 'ノズルがこの温度以下に冷えたらオフにします', + deleteTitle: 'スマートプラグを削除', + deleteConfirm: '"{{name}}"を削除してもよろしいですか?この操作は元に戻せません。', + turnOnTitle: 'スマートプラグをオン', + turnOnConfirm: '"{{name}}"をオンにしてもよろしいですか?', + turnOn: 'オン', + turnOffTitle: 'スマートプラグをオフ', + turnOffConfirm: '"{{name}}"をオフにしてもよろしいですか?接続されたデバイスの電源が切断されます。', + turnOff: 'オフ', + controlFailed: '"{{name}}"の{{action}}に失敗しました', + monitorOnly: 'モニタリングのみ', + waiting: 'データを待機中...', + monitor: 'モニター', + power: '電力', + kwhToday: '本日の消費電力', + settings: '設定', + smartSwitches: 'スマートスイッチ', + noSwitchesInSwitchbar: 'スイッチバーに有効なスイッチがありません', + enableInSettings: '設定 → スマートプラグで有効にしてください', + }, + + // スマートプラグの追加/編集モーダル + addSmartPlug: { + addTitle: 'スマートプラグを追加', + editTitle: 'スマートプラグを編集', + // プラグタイプ選択 + tasmota: 'Tasmota', + homeAssistant: 'Home Assistant', + // デバイス検出 + stopScanning: 'スキャンを停止', + discoverDevices: 'Tasmotaデバイスを検出', + scanningNetwork: 'ネットワークをスキャン中...', + foundDevices: '{{count}}台のデバイスが見つかりました - クリックして選択:', + noDevicesFound: 'ネットワーク上にTasmotaデバイスが見つかりません', + failedToStartScan: 'スキャンの開始に失敗しました', + // Home Assistant + haNotConfigured: 'Home Assistantが設定されていません。', + haNotConfiguredPath: '設定 \u2192 ネットワーク \u2192 Home Assistant で設定してください', + selectEntity: 'エンティティを選択', + chooseEntity: 'エンティティを選択...', + loadingEntities: 'エンティティを読み込み中...', + failedToLoadEntities: 'エンティティの読み込みに失敗しました: {{error}}', + searchEntities: 'エンティティを検索...', + noEntitiesMatching: '「{{search}}」に一致するエンティティが見つかりません', + noEntitiesAvailable: '利用可能なエンティティがありません', + searchingEntities: 'すべてのエンティティを検索中({{count}}件見つかりました)', + showingEntities: 'switch、light、input_booleanを表示中({{count}}件利用可能)', + // エネルギーモニタリング + energyMonitoring: 'エネルギーモニタリング(任意)', + energyMonitoringDescription: '電力/エネルギーデータを提供するセンサーを検索して選択します。', + powerSensor: '電力センサー(W)', + searchPowerSensors: '電力センサーを検索...', + energyToday: '今日のエネルギー(kWh)', + totalEnergy: '総エネルギー(kWh)', + searchEnergySensors: 'エネルギーセンサーを検索...', + noMatchingSensors: '一致するセンサーがありません', + // IPアドレスとテスト + ipAddress: 'IPアドレス', + ipAddressPlaceholder: '192.168.1.100', + test: 'テスト', + connected: '接続されました!', + device: 'デバイス', + state: '状態', + connectionFailed: '接続に失敗しました', + // 名前 + name: '名前', + namePlaceholder: 'リビングのプラグ', + // 認証 + username: 'ユーザー名', + usernamePlaceholder: 'admin', + password: 'パスワード', + passwordPlaceholder: '********', + authHint: 'Tasmotaデバイスが認証を必要としない場合は空のままにしてください', + // プリンターとの連携 + linkToPrinter: 'プリンターに連携', + noPrinterOption: 'プリンターなし(手動制御のみ)', + linkToPrinterHint: '連携すると印刷の開始/完了時に自動オン/オフが有効になります', + // 電力アラート + powerAlerts: '電力アラート', + alertAbove: '超過時にアラート(W)', + alertAbovePlaceholder: '例: 200', + alertBelow: '下回った時にアラート(W)', + alertBelowPlaceholder: '例: 10', + powerAlertHint: '消費電力がこれらのしきい値を超えた/下回った場合に通知します。無効にするには空のままにしてください。', + // スケジュール + dailySchedule: 'デイリースケジュール', + turnOnAt: 'オンにする時刻', + turnOffAt: 'オフにする時刻', + scheduleHint: '毎日これらの時刻にプラグを自動的にオン/オフします。スキップするには空のままにしてください。', + // スイッチバー + showInSwitchbar: 'スイッチバーに表示', + showInSwitchbarHint: 'サイドバーからクイックアクセス', + // バリデーション + nameRequired: '名前は必須です', + ipRequired: 'Tasmotaプラグの場合、IPアドレスは必須です', + entityRequired: 'Home Assistantプラグの場合、エンティティは必須です', + // MQTT + mqtt: 'MQTT', + mqttTopicRequired: 'MQTTトピックは、電力、エネルギー、またはステートのいずれかを設定する必要があります', + mqttBrokerNotConfigured: 'MQTTブローカーが設定されていません。ブローカーアドレスを設定してください:', + mqttBrokerNotConfiguredPath: '設定 → ネットワーク → MQTT発行', + mqttBrokerNotConfiguredHint: '(パブリッシュを有効にする必要はありません。ブローカーの詳細を入力するだけです)。', + mqttMonitorOnly: 'モニタリングのみ', + mqttMonitorOnlyDescription: 'MQTTプラグはMQTTサブスクリプション経由で電力/エネルギーデータを受信します。オン/オフ制御はできません - MQTTブローカーまたはホームオートメーションシステムを使用してください。', + mqttPowerMonitoring: '電力モニタリング', + mqttEnergyMonitoring: 'エネルギーモニタリング', + mqttStateMonitoring: 'ステートモニタリング', + mqttTopic: 'トピック', + mqttJsonPath: 'JSONパス', + mqttMultiplier: '乗数', + mqttOnValue: 'ONの値', + mqttPowerJsonPathHint: 'JSONパスはJSONペイロードから値を抽出します(例:「power_l1」)。トピックが生の数値を発行する場合は空のままにしてください。', + mqttPowerMultiplierHint: '乗数 0.001 で mW→W、1000 で kW→W に変換します。', + mqttEnergyJsonPathHint: 'JSONパスはJSONペイロードから値を抽出します。生の値の場合は空のままにしてください。', + mqttEnergyMultiplierHint: '乗数 0.001 で Wh→kWh、1000 で MWh→kWh に変換します。', + mqttStateJsonPathHint: 'JSONパスはJSONペイロードから値を抽出します。生の値の場合は空のままにしてください。', + mqttStateOnValueHint: 'ONの値:「ON」を意味する正確な文字列。自動検出(ON、true、1)の場合は空のままにしてください。', + }, + + // 通知プロバイダーの追加/編集モーダル + addNotification: { + addTitle: '通知プロバイダーを追加', + editTitle: '通知プロバイダーを編集', + nameRequired: '名前は必須です', + fieldRequired: '{{field}}は必須です', + namePlaceholder: 'マイ通知', + providerType: 'プロバイダータイプ', + configuration: '設定', + testConfiguration: '設定をテスト', + printerFilter: 'プリンターフィルター', + allPrinters: 'すべてのプリンター', + printerFilterDesc: 'このプリンターのイベントのみ通知を送信', + quietHours: 'サイレント時間(おやすみモード)', + start: '開始', + end: '終了', + dailyDigest: 'デイリーダイジェスト', + dailyDigestDesc: '通知をまとめて1日1回のサマリーとして送信', + sendDigestAt: 'ダイジェスト送信時刻', + digestDescription: 'イベントを収集し、この時刻にまとめて送信します', + notificationEvents: '通知イベント', + printEvents: '印刷イベント', + printerStatus: 'プリンターステータス', + events: { + start: '開始', + complete: '完了', + failed: '失敗', + stopped: '停止', + progress: '進捗', + offline: 'オフライン', + error: 'エラー', + lowFilament: 'フィラメント残量少', + maintenance: 'メンテナンス', + }, + config: { + callmebot: { + phoneNumber: '電話番号', + apiKey: 'APIキー', + apiKeyPlaceholder: 'CallMeBot APIキー', + }, + ntfy: { + serverUrl: 'サーバーURL', + topic: 'トピック', + authToken: '認証トークン', + authTokenPlaceholder: '認証(任意)', + }, + pushover: { + userKey: 'ユーザーキー', + userKeyPlaceholder: 'Pushoverユーザーキー', + appToken: 'アプリトークン', + appTokenPlaceholder: 'Pushoverアプリトークン', + priority: '優先度', + priorityPlaceholder: '0(通常)', + }, + telegram: { + botToken: 'Botトークン', + botTokenPlaceholder: '@BotFatherから取得したトークン', + chatId: 'チャットID', + chatIdPlaceholder: 'チャットまたはグループID', + }, + email: { + smtpServer: 'SMTPサーバー', + smtpPort: 'SMTPポート', + security: 'セキュリティ', + starttls: 'STARTTLS(ポート587)', + ssl: 'SSL/TLS(ポート465)', + securityNone: 'なし(ポート25)', + authentication: '認証', + username: 'ユーザー名', + password: 'パスワード', + passwordPlaceholder: 'アプリパスワード', + fromEmail: '送信元メール', + toEmail: '送信先メール', + }, + discord: { + webhookUrl: 'Webhook URL', + }, + webhook: { + webhookUrl: 'Webhook URL', + payloadFormat: 'ペイロード形式', + genericJson: '汎用JSON', + slackMattermost: 'Slack / Mattermost', + authorization: '認証', + authorizationPlaceholder: 'Bearerトークン(任意)', + titleFieldName: 'タイトルフィールド名', + messageFieldName: 'メッセージフィールド名', + }, + }, + }, + + // アップロード待ち + pendingUploads: { + title: '保留中のアップロード({{count}}件)', + justNow: 'たった今', + minutesAgo: '{{count}}分前', + hoursAgo: '{{count}}時間前', + daysAgo: '{{count}}日前', + fromSource: '{{ip}}から', + archive: 'アーカイブ', + archiveAll: 'すべてアーカイブ', + discardAll: 'すべて破棄', + discard: '破棄', + discardTitle: 'アップロードを破棄', + discardConfirm: '"{{filename}}"を破棄してもよろしいですか?この操作は元に戻せません。', + tags: 'タグ', + tagsPlaceholder: '例: 機能部品、プロトタイプ、ギフト', + notes: 'メモ', + notesPlaceholder: 'この印刷についてメモを追加...', + project: 'プロジェクト', + noProject: 'プロジェクトなし', + description: 'これらのファイルはバーチャルプリンター経由でアップロードされました。確認してアーカイブし、コレクションに追加してください。', + archiveAllTitle: 'すべてのアップロードをアーカイブ', + archiveAllConfirm: '保留中のアップロード{{count}}件をすべてアーカイブしてもよろしいですか?', + discardAllTitle: 'すべてのアップロードを破棄', + discardAllConfirm: '保留中のアップロード{{count}}件をすべて破棄してもよろしいですか?この操作は元に戻せません。', + archived: 'アーカイブ済み: {{name}}', + archiveFailed: 'アーカイブに失敗しました', + discarded: 'アップロードを破棄しました', + discardFailed: '破棄に失敗しました', + archivedCount: '{{count}}ファイルをアーカイブしました', + discardedCount: '{{count}}ファイルを破棄しました', + archiveAllFailed: 'すべてのアーカイブに失敗しました', + discardAllFailed: 'すべての破棄に失敗しました', + }, + + // キーボードショートカット + shortcuts: { + title: 'キーボードショートカット', + navigation: 'ナビゲーション', + archives: 'アーカイブ', + profiles: 'K-プロファイル', + general: '一般', + goToPrinters: 'プリンターへ', + goToArchives: 'アーカイブへ', + goToQueue: 'キューへ', + goToStatistics: '統計へ', + goToProfiles: 'クラウドプロファイルへ', + goToSettings: '設定へ', + openItem: '{{item}}を開く', + goToItem: '{{item}}へ移動', + focusSearch: '検索にフォーカス', + openUpload: 'アップロードダイアログを開く', + clearSelection: '選択解除 / 入力をクリア', + contextMenu: 'カードのコンテキストメニュー', + refreshProfiles: 'プロファイルを更新', + newProfile: '新しいプロファイル', + exitSelection: '選択モードを終了', + showHelp: 'このヘルプを表示', + pressKey: '押す', + orClickToClose: 'または外側をクリックで閉じる', + }, + + // ログビューアー + logViewer: { + title: 'アプリケーションログ', + liveStreaming: 'ライブストリーミング - {{count}}エントリ', + description: 'アプリケーションログの表示とフィルタ', + live: 'ライブ', + stop: '停止', + start: '開始', + clear: 'クリア', + autoScroll: '自動スクロール', + searchPlaceholder: 'メッセージまたはロガー名で検索...', + noEntries: 'ログエントリが見つかりません', + emptyLog: 'ログファイルが空またはクリアされています', + autoRefreshing: '2秒ごとに自動更新中', + clickStart: '開始をクリックしてライブログストリーミングを有効にする', + }, + + // アーカイブ編集モーダル + editArchive: { + title: 'アーカイブを編集', + name: '名前', + printNamePlaceholder: '印刷名', + printer: 'プリンター', + noPrinter: 'プリンターなし', + project: 'プロジェクト', + noProject: 'プロジェクトなし', + itemsPrinted: '印刷数', + itemsPrintedDescription: 'この印刷ジョブで生産されたアイテム数', + notes: 'メモ', + notesPlaceholder: 'この印刷についてメモを追加...', + tags: 'タグ', + addTags: 'タグを追加...', + addMoreTags: 'タグをさらに追加...', + existingTagsHint: '既存のタグ(クリックで追加)', + externalLink: '外部リンク', + externalLinkPlaceholder: 'https://...', + externalLinkDescription: 'MakerWorld、Printables、Thingiverseなどへのリンク', + status: 'ステータス', + statusCompleted: '完了', + statusFailed: '失敗', + statusCancelled: 'キャンセル', + statusPrinting: '印刷中', + failureReason: '失敗理由', + selectReason: '理由を選択...', + failureReasons: { + adhesionFailure: '定着不良', + spaghettiDetached: 'スパゲッティ / 剥離', + layerShift: 'レイヤーシフト', + cloggedNozzle: 'ノズル詰まり', + filamentRunout: 'フィラメント切れ', + warping: '反り', + stringing: '糸引き', + underExtrusion: '押出不足', + powerFailure: '電源障害', + userCancelled: 'ユーザーによるキャンセル', + other: 'その他', + }, + photos: '印刷結果の写真', + printResult: '印刷結果', + photosDescription: '+をクリックして印刷結果の写真を追加', + saving: '保存中...', + }, + + // MQTTデバッグ + mqttDebug: { + title: 'MQTTデバッグログ', + empty: '<空>', + startLogging: 'ログ記録を開始', + searchPlaceholder: 'トピックまたはペイロードで検索...', + incoming: '受信', + outgoing: '送信', + noMessages: 'まだメッセージが記録されていません', + clickStart: '「ログ記録を開始」をクリックしてMQTTメッセージの記録を開始', + noMatch: 'フィルタに一致するメッセージがありません', + adjustFilter: '検索条件またはフィルタ条件を調整してみてください', + loggingActive: 'ログ記録中 - メッセージは自動更新されます', + loggingStopped: 'ログ記録停止', + }, + + // アーカイブアクション + archiveActions: { + print: '印刷', + schedule: 'スケジュール', + openInSlicer: 'Bambu Studioで開く', + slice: 'スライス', + viewMakerWorld: 'MakerWorldで表示', + preview3d: '3Dプレビュー', + viewTimelapse: 'タイムラプスを表示', + scanTimelapse: 'タイムラプスを検索', + downloadSource3mf: 'ソース3MFをダウンロード', + uploadSource3mf: 'ソース3MFをアップロード', + replaceSource3mf: 'ソース3MFを置換', + removeSource3mf: 'ソース3MFを削除', + replaceF3d: 'F3Dを置換', + uploadF3d: 'F3Dをアップロード', + downloadF3d: 'F3Dをダウンロード', + removeF3d: 'F3Dを削除', + copyLink: 'ダウンロードリンクをコピー', + qrCode: 'QRコード', + viewPhotos: '写真を表示', + projectPage: 'プロジェクトページ', + goToProject: 'プロジェクトへ: {{name}}', + addToProject: 'プロジェクトに追加', + removeFromProject: 'プロジェクトから削除', + noProjects: '利用可能なプロジェクトがありません', + deselect: '選択解除', + select: '選択', + remove: '削除', + source3mfAttached: 'ソース3MFを添付しました: {{filename}}', + source3mfUploadFailed: 'ソース3MFのアップロードに失敗しました', + source3mfRemoved: 'ソース3MFを削除しました', + source3mfRemoveFailed: 'ソース3MFの削除に失敗しました', + f3dAttached: 'F3Dを添付しました: {{filename}}', + f3dUploadFailed: 'F3Dのアップロードに失敗しました', + f3dRemoved: 'F3Dを削除しました', + f3dRemoveFailed: 'F3Dの削除に失敗しました', + timelapseAttached: 'タイムラプスを添付しました: {{filename}}', + timelapseExists: 'タイムラプスは既に添付されています', + noTimelapseFound: '一致するタイムラプスが見つかりません', + timelapseScanFailed: 'タイムラプスの検索に失敗しました', + timelapseAttachFailed: 'タイムラプスの添付に失敗しました', + deleted: 'アーカイブを削除しました', + deleteFailed: 'アーカイブの削除に失敗しました', + addedToFavorites: 'お気に入りに追加しました', + removedFromFavorites: 'お気に入りから削除しました', + projectUpdated: 'プロジェクトを更新しました', + projectUpdateFailed: 'プロジェクトの更新に失敗しました', + linkCopied: 'リンクをクリップボードにコピーしました', + linkCopyFailed: 'リンクのコピーに失敗しました', + photoDeleted: '写真を削除しました', + photoDeleteFailed: '写真の削除に失敗しました', + deleteTitle: 'アーカイブを削除', + deleteConfirm: '"{{name}}"を削除してもよろしいですか?この操作は元に戻せません。', + removeSource3mfTitle: 'ソース3MFを削除', + removeSource3mfConfirm: '"{{name}}"からソース3MFファイルを削除してもよろしいですか?元のスライサープロジェクトファイルが削除されます。', + removeF3dTitle: 'F3Dを削除', + removeF3dConfirm: '"{{name}}"からFusion 360デザインファイルを削除してもよろしいですか?', + selectTimelapse: 'タイムラプスを選択', + selectTimelapseDesc: '自動一致が見つかりませんでした。この印刷のタイムラプスを選択してください:', + }, + + // カメラページ + camera: { + camera: 'カメラ', + invalidPrinterId: '無効なプリンターID', + printerFallback: 'プリンター #{{id}}', + // モード切替 + live: 'ライブ', + snapshot: 'スナップショット', + // コントロール + restartStream: 'ストリームを再開', + refreshSnapshot: 'スナップショットを更新', + fullscreen: 'フルスクリーン', + exitFullscreen: 'フルスクリーンを終了', + // 読み込み状態 + connectingToCamera: 'カメラに接続中...', + capturingSnapshot: 'スナップショットを撮影中...', + // 再接続 + connectionLost: '接続が切断されました', + reconnectingIn: '{{seconds}}秒後に再接続します(試行{{attempt}}/{{maxAttempts}})', + reconnectNow: '今すぐ再接続', + // エラー状態 + cameraUnavailable: 'カメラが利用できません', + makeSurePrinterConnected: 'プリンターが接続されていること、およびプリンター設定でカメラが有効になっていることを確認してください。', + retry: '再試行', + // 画像 + cameraStream: 'カメラストリーム', + // ズームコントロール + zoomIn: 'ズームイン', + zoomOut: 'ズームアウト', + resetZoom: 'ズームをリセット', + skipBack: '5秒戻る', + skipForward: '5秒進む', + refreshStream: 'ストリームを更新', + dragToResize: 'ドラッグしてリサイズ', + }, + + // アーカイブカードラベル + archiveCard: { + slicedReady: 'スライス済みファイル - 印刷可能', + sourceOnly: 'ソースファイルのみ - AMSマッピングなし', + gcode: 'GCODE', + source: 'ソース', + layers: 'レイヤー', + objects: '{{count}}オブジェクト', + objects_other: '{{count}}オブジェクト', + cancelled: 'キャンセル', + failed: '失敗', + duplicate: '重複', + }, + + // 通知プロバイダーカード + providerCard: { + last: '最終: ', + lastSuccessAt: '最終: {{date}}', + printer: 'プリンター: ', + allPrinters: 'すべてのプリンター', + tagStart: '開始', + tagComplete: '完了', + tagFailed: '失敗', + tagStopped: '中止', + tagProgress: '進捗', + tagOffline: 'オフライン', + tagLowFilament: 'フィラメント残量低下', + tagMaintenance: 'メンテナンス', + tagAmsHumidity: 'AMS湿度', + tagAmsTemp: 'AMS温度', + tagAmsHtHumidity: 'AMS-HT湿度', + tagAmsHtTemp: 'AMS-HT温度', + quiet: 'おやすみ', + digest: 'ダイジェスト ', + digestAt: 'ダイジェスト {{time}}', + sendTest: 'テスト通知を送信', + eventSettings: 'イベント設定', + sendNotifications: 'このプロバイダーから通知を送信', + printEvents: '印刷イベント', + printerStatus: 'プリンターステータス', + amsAlarms: 'AMSアラーム', + amsHumidityHigh: 'AMS湿度高', + amsHumidityHighDesc: '通常AMSの湿度がしきい値を超過', + amsTempHigh: 'AMS温度高', + amsTempHighDesc: '通常AMSの温度がしきい値を超過', + amsHtAlarms: 'AMS-HTアラーム', + amsHtHumidityHigh: 'AMS-HT湿度高', + amsHtHumidityHighDesc: 'AMS-HTの湿度がしきい値を超過', + amsHtTempHigh: 'AMS-HT温度高', + amsHtTempHighDesc: 'AMS-HTの温度がしきい値を超過', + noNotificationsDuring: 'この時間帯は通知を送信しません', + editQuietHours: 'プロバイダーを編集しておやすみ時間を変更', + dailyDigest: 'デイリーダイジェスト', + dailyDigestDesc: '通知を1日1回のサマリーにまとめる', + sendAt: '送信時刻', + editDigestTime: 'プロバイダーを編集してダイジェスト時刻を変更', + deleteTitle: '通知プロバイダーを削除', + deleteConfirm: '「{{name}}」を削除してもよろしいですか?この操作は元に戻せません。', + }, + + // Projects page + projects: { + title: 'プロジェクト', + subtitle: '印刷プロジェクトを管理', + editProject: 'プロジェクトを編集', + newProject: '新規プロジェクト', + namePlaceholder: 'プロジェクト名', + descriptionPlaceholder: 'プロジェクトの説明(任意)', + color: '色', + targetPlates: '目標プレート数', + targetPlatesPlaceholder: '例: 10', + targetPlatesHint: '必要な印刷ジョブ/プレート数', + targetParts: '目標パーツ数', + targetPartsPlaceholder: '例: 50', + targetPartsHint: '必要な個別パーツの総数', + tags: 'タグ', + tagsPlaceholder: 'カンマ区切りのタグ', + dueDate: '期限', + priorityLabel: '優先度', + priority: { + low: '低', + normal: '通常', + high: '高', + urgent: '緊急', + }, + status: { + active: '進行中', + completed: '完了', + archived: 'アーカイブ済み', + }, + create: '作成', + parts: 'パーツ', + plates: 'プレート', + failed: '失敗', + completed: '完了', + inQueue: 'キュー内', + noPrintsYet: '印刷履歴なし', + more: 'もっと見る', + printJobsPlates: '印刷ジョブ / プレート', + partsPrinted: '印刷済みパーツ', + failedParts: '失敗パーツ', + projectCreated: 'プロジェクトを作成しました', + projectUpdated: 'プロジェクトを更新しました', + projectDeleted: 'プロジェクトを削除しました', + all: 'すべて', + loading: 'プロジェクトを読み込み中...', + noProjectsYet: 'プロジェクトがまだありません', + noStatusProjects: '{{status}}のプロジェクトはありません', + noProjectsHint: 'プロジェクトを作成して印刷を整理・追跡しましょう', + noStatusProjectsHint: 'ステータスが「{{status}}」のプロジェクトはありません', + createFirstProject: '最初のプロジェクトを作成', + deleteProject: 'プロジェクトを削除', + deleteProjectConfirm: 'このプロジェクトを削除しますか?この操作は取り消せません。', + exportAllProjects: 'すべてのプロジェクトをエクスポート', + importProject: 'プロジェクトをインポート', + importFailed: 'インポートに失敗しました', + projectImported: 'プロジェクトがインポートされました', + projectsExported: 'プロジェクトがエクスポートされました', + noCreatePermission: 'プロジェクトを作成する権限がありません', + noDeletePermission: 'プロジェクトを削除する権限がありません', + noEditPermission: 'プロジェクトを編集する権限がありません', + noExportPermission: 'プロジェクトをエクスポートする権限がありません', + noImportPermission: 'プロジェクトをインポートする権限がありません', + }, + + // Project detail page + projectDetail: { + statusActive: '進行中', + statusCompleted: '完了', + statusArchived: 'アーカイブ済み', + noPrintsYet: '印刷履歴なし', + print: '印刷', + unknown: '不明', + priorityLow: '低', + priorityNormal: '通常', + priorityHigh: '高', + priorityUrgent: '緊急', + overdue: '期限超過', + dueToday: '本日期限', + daysLeft: '残り{{count}}日', + projectUpdated: 'プロジェクトを更新しました', + partAdded: 'パーツを追加しました', + partRemoved: 'パーツを削除しました', + deletePart: 'パーツを削除', + deletePartConfirm: '「{{name}}」を削除しますか?', + templateCreated: 'プロジェクトからテンプレートを作成しました', + error: 'エラー', + projectNotFound: 'プロジェクトが見つかりません', + backToProjects: 'プロジェクト一覧に戻る', + projects: 'プロジェクト', + edit: '編集', + platesProgress: 'プレート進捗', + printJobs: '印刷ジョブ', + percentComplete: '% 完了', + remaining: '残り', + partsProgress: 'パーツ進捗', + parts: 'パーツ', + printJobsCard: '印刷ジョブ', + total: '合計', + failed: '失敗', + partsPrinted: '印刷済みパーツ', + printTime: '印刷時間', + filamentUsed: 'フィラメント使用量', + costTracking: 'コスト追跡', + filamentCost: 'フィラメント', + energy: 'エネルギー', + budget: '予算', + budgetRemaining: '残り予算', + subProjects: 'サブプロジェクト ({{count}})', + partOf: '所属先', + priority: '優先度', + notes: 'メモ', + cancel: 'キャンセル', + save: '保存', + notesPlaceholder: 'このプロジェクトについてメモを追加...', + noNotesYet: 'メモがありません。編集をクリックして追加してください。', + files: 'ファイル', + linkFoldersFromFileManager: 'ファイルマネージャーからフォルダーをリンク', + toThisProjectForQuickAccess: 'してクイックアクセス。', + fileCount: '{{count}}ファイル', + noFoldersLinked: 'リンクされたフォルダーはありません', + billOfMaterials: '部品表(BOM)', + bomAcquired: '{{completed}}/{{total}} 取得済み', + showAll: 'すべて表示', + hideDone: '完了を非表示', + addPart: 'パーツを追加', + partNamePlaceholder: 'パーツ名', + qty: '数量', + pricePlaceholder: '価格 ({{currency}})', + sourcingUrlPlaceholder: 'URL(任意)', + remarksPlaceholder: '備考', + delete: '削除', + totalCost: '合計コスト', + noBomParts: 'BOMにパーツがありません', + activityTimeline: 'アクティビティタイムライン', + noActivityYet: 'アクティビティがありません', + timelineEvents: { + project_created: 'プロジェクト作成', + print_completed: '印刷完了', + print_failed: '印刷失敗', + print_started: '印刷開始', + queued: 'キューに追加', + }, + saveAsTemplate: 'テンプレートとして保存', + queue: 'キュー', + viewAll: 'すべて表示', + printing: '印刷中', + queued: 'キュー内', + prints: '{{count}}件の印刷', + exportProject: 'プロジェクトをエクスポート', + exportFailed: 'エクスポートに失敗しました', + projectExported: 'プロジェクトがエクスポートされました', + noEditPermission: 'このプロジェクトを編集する権限がありません', + noAddPartsPermission: 'パーツを追加する権限がありません', + noDeletePartsPermission: 'パーツを削除する権限がありません', + noEditPartsPermission: 'パーツを編集する権限がありません', + noUpdatePartsPermission: 'パーツを更新する権限がありません', + noEditNotesPermission: 'ノートを編集する権限がありません', + noCreateTemplatesPermission: 'テンプレートを作成する権限がありません', + noExportPermission: 'プロジェクトをエクスポートする権限がありません', + }, + + // Project page modal + projectPage: { + title: 'プロジェクトページ', + loadFailed: 'プロジェクトページデータの読み込みに失敗', + noData: 'プロジェクトページデータがありません', + noDataHint: 'このプロジェクトにはMakerWorldページデータがありません', + titleField: 'タイトル', + designer: 'デザイナー', + license: 'ライセンス', + description: '説明', + descriptionPlaceholder: 'プロジェクトの説明...', + printProfile: '印刷プロファイル', + profileTitle: 'プロファイルタイトル', + profileDescriptionPlaceholder: 'プロファイルの説明', + byUser: '{{name}} 作', + images: '画像 ({{count}})', + viewOnMakerWorld: 'MakerWorldで表示', + }, + + // Batch project modal + batchProject: { + addedToProject: '{{count}}件のアーカイブを「{{project}}」に追加しました', + assignFailed: 'プロジェクトへのアーカイブ割り当てに失敗しました', + removedFromProject: '{{count}}件のアーカイブをプロジェクトから削除しました', + removeFailed: 'プロジェクトからのアーカイブ削除に失敗しました', + assignTitle: 'プロジェクトに割り当て', + assignDescription: '{{count}}件の選択されたアーカイブのプロジェクトを選択:', + removeFromProject: 'プロジェクトから削除', + clearAssignment: '選択されたアーカイブのプロジェクト割り当てを解除', + orAssignTo: 'または割り当て先:', + archiveCount: '{{count}}件のアーカイブ', + noProjects: 'プロジェクトがありません。先にプロジェクトを作成してください。', + }, + + // リッチテキストエディター + richTextEditor: { + bold: '太字', + italic: '斜体', + underline: '下線', + bulletList: '箇条書き', + numberedList: '番号付きリスト', + alignLeft: '左揃え', + alignCenter: '中央揃え', + alignRight: '右揃え', + addLink: 'リンクを追加', + removeLink: 'リンクを削除', + }, + + // K-プロファイル + kProfiles: { + editProfile: 'K-プロファイルを編集', + addProfile: 'K-プロファイルを追加', + hasNote: 'メモあり', + copyProfile: 'プロファイルをコピー', + profileNamePlaceholder: 'マイPLAプロファイル', + notesPlaceholder: 'このプロファイルのメモを追加...', + searchPlaceholder: '名前またはフィラメントで検索...', + exportToJson: 'JSONにエクスポート', + importFromJson: 'JSONからインポート', + selectAllVisible: '表示中のプロファイルをすべて選択', + enterSelectionMode: '一括削除の選択モードに入る', + // Profile card + unnamed: '名前なし', + notePrefix: 'メモ: ', + // Profile modal + profileName: 'プロファイル名', + kValue: 'K値', + kValueRange: '一般的な範囲: PLA 0.01 - 0.06、PETG 0.02 - 0.10', + filament: 'フィラメント', + selectFilament: 'フィラメントを選択...', + noFilamentsFound: 'フィラメントが見つかりません。まずBambu StudioでKプロファイルを作成してください。', + flowType: 'フロータイプ', + highFlow: 'ハイフロー', + standard: 'スタンダード', + nozzleSize: 'ノズルサイズ', + extruder: 'エクストルーダー', + extruders: 'エクストルーダー', + left: '左', + right: '右', + notesStoredLocally: 'メモ(ローカル保存)', + notesHint: 'メモはBambuddyに保存され、プリンターには保存されません', + deleteProfileTitle: 'プロファイルを削除', + cannotBeUndone: 'この操作は元に戻せません', + confirmDeleteProfile: '"{{name}}"をプリンターから削除してもよろしいですか?', + profileSaved: 'Kプロファイルを保存しました', + profileDeleted: 'Kプロファイルを削除しました', + selectExtruder: 'エクストルーダーを少なくとも1つ選択してください', + profileSavedToExtruders: 'Kプロファイルを{{count}}個のエクストルーダーに保存しました', + failedToSave: 'Kプロファイルの保存に失敗しました', + syncingWithPrinter: 'プリンターと同期中...', + pleaseWait: 'お待ちください', + savingToExtruder: 'エクストルーダー {{current}}/{{total}} に保存中...', + // Main view + noPrintersConfigured: 'プリンターが設定されていません', + addPrinterHint: '設定でプリンターを追加してKプロファイルを管理', + noActivePrinters: 'アクティブなプリンターがありません', + enablePrinterHint: 'プリンター接続を有効にしてKプロファイルを表示', + loadingProfiles: 'Kプロファイルを読み込み中...', + nozzle: 'ノズル', + allExtruders: 'すべてのエクストルーダー', + leftOnly: '左のみ', + rightOnly: '右のみ', + allFlow: 'すべてのフロー', + hfOnly: 'HFのみ', + sOnly: 'Sのみ', + sortName: 'ソート: 名前', + sortKValue: 'ソート: K値', + sortFilament: 'ソート: フィラメント', + selectAll: 'すべて選択', + select: '選択', + printerOffline: 'プリンターオフライン', + printerOfflineHint: 'プリンターが接続されていません。電源を入れてKプロファイルを表示してください。', + leftExtruder: '左エクストルーダー', + rightExtruder: '右エクストルーダー', + noMatchingProfiles: '一致するプロファイルなし', + noProfilesMatch: '検索条件に一致するプロファイルがありません', + noKProfiles: 'Kプロファイルなし', + noProfilesForNozzle: '{{diameter}}mmノズルの圧力キャリブレーションプロファイルが見つかりません', + createFirstProfile: '最初のプロファイルを作成', + deleteProfiles: 'プロファイルを削除', + confirmBulkDelete: '{{count}}件の選択されたプロファイルをプリンターから削除してもよろしいですか?', + noProfilesToExport: 'エクスポートするプロファイルがありません', + exportedProfiles: '{{count}}件のプロファイルをエクスポートしました', + invalidFileFormat: '無効なファイル形式', + importedProfiles: '{{total}}件中{{imported}}件のプロファイルをインポートしました', + failedToParseImport: 'インポートファイルの解析に失敗しました', + deletedProfiles: '{{count}}件のプロファイルを削除しました', + failedToSaveNote: 'メモの保存に失敗しました', + noPermissionAdd: 'K-プロファイルを追加する権限がありません', + noPermissionDelete: 'K-プロファイルを削除する権限がありません', + noPermissionDeleteBulk: 'K-プロファイルを一括削除する権限がありません', + noPermissionExport: 'K-プロファイルをエクスポートする権限がありません', + noPermissionImport: 'K-プロファイルをインポートする権限がありません', + noPermissionRefresh: 'K-プロファイルを更新する権限がありません', + }, + + // APIブラウザ + apiBrowser: { + validationError: 'バリデーションエラー', + missingRequiredParams: '必須パラメーターが不足: {{params}}', + networkError: 'ネットワークエラー', + pathParameters: 'パスパラメーター', + queryParameters: 'クエリパラメーター', + selectOption: '-- 選択 --', + requestBody: 'リクエストボディ', + execute: '実行', + fillInRequired: '入力してください: {{params}}', + response: 'レスポンス', + failedToFetchSchema: 'OpenAPIスキーマの取得に失敗しました', + failedToLoadSchema: 'APIスキーマの読み込みに失敗しました', + otherCategory: 'その他', + expandAll: 'すべて展開', + collapseAll: 'すべて折りたたむ', + swaggerUI: 'Swagger UI', + endpointCount: '{{categories}}カテゴリー内{{count}}エンドポイント', + }, + githubBackup: { + title: 'GitHubバックアップ', + enabled: '有効', + cloudLoginRequired: 'Bambu Cloudのログインが必要です。プロファイル → クラウドプロファイルからサインインしてGitHubバックアップを有効にしてください。', + description: 'プロファイルをプライベートGitHubリポジトリに自動同期し、バックアップとバージョン履歴を管理します。', + repositoryUrl: 'リポジトリURL', + personalAccessToken: 'パーソナルアクセストークン', + saved: '保存済み', + enterNewToken: '新しいトークンを入力して更新', + tokenHint: 'Contents読み取り/書き込み権限を持つFine-grainedトークン', + branch: 'ブランチ', + autoBackup: '自動バックアップ', + manualOnly: '手動のみ', + hourly: '毎時', + daily: '毎日', + weekly: '毎週', + includeInBackup: 'バックアップに含める', + kProfiles: 'Kプロファイル', + noPrintersConnected: 'プリンター未接続', + printersConnected: '{{connected}}/{{total}} 接続中', + kProfilesDescription: '接続されたプリンターからの圧力前進キャリブレーション', + cloudProfiles: 'クラウドプロファイル', + cloudProfilesDescription: 'Bambu Cloudのフィラメント、プリンター、プロセスプリセット', + appSettings: 'アプリ設定', + appSettingsDescription: 'Bambuddyの設定(機密データを除く)', + lastBackup: '最終バックアップ', + noBackupsYet: 'バックアップなし', + next: '次回', + startingBackup: 'バックアップ開始中...', + backupNow: '今すぐバックアップ', + test: 'テスト', + enableBackup: 'バックアップを有効化', + testConnection: '接続テスト', + history: '履歴', + date: '日付', + status: 'ステータス', + commit: 'コミット', + localBackup: 'ローカルバックアップ', + localDescription: 'Bambuddyデータをローカルファイルとしてエクスポートまたはインポートし、手動バックアップや移行に利用できます。', + exportData: 'データエクスポート', + exportDescription: 'すべての設定、プリンター、プロファイルをダウンロード', + importBackup: 'バックアップのインポート', + importDescription: '以前のエクスポートファイルから復元', + tokenUpdated: 'トークンを更新しました', + settingsSaved: '設定を保存しました', + failedToSave: '保存に失敗しました: {{error}}', + backupEnabled: 'GitHubバックアップを有効にしました', + backupComplete: 'バックアップ完了 - {{count}}ファイル更新', + backupSkipped: 'バックアップをスキップ - 変更なし', + backupFailed: 'バックアップに失敗しました: {{error}}', + logsCleared: '{{count}}件のログを削除しました', + failedToClearLogs: 'ログの削除に失敗しました: {{error}}', + enterRepoUrl: 'リポジトリURLを入力してください', + enterRepoUrlAndToken: 'リポジトリURLとアクセストークンを入力してください', + repoUrlRequired: 'リポジトリURLは必須です', + tokenRequired: 'アクセストークンは必須です', + backupDownloaded: 'バックアップのダウンロードが完了しました', + failedToCreateBackup: 'バックアップの作成に失敗しました', + backupRestored: 'バックアップの復元が完了しました', + }, +}; diff --git a/static/assets/index-DvXO59gA.js b/static/assets/index-DvXO59gA.js index 04cbe533e..78221c78c 100644 --- a/static/assets/index-DvXO59gA.js +++ b/static/assets/index-DvXO59gA.js @@ -1,7 +1,12 @@ +<<<<<<<< HEAD:static/assets/index-DvXO59gA.js function Cae(t,e){for(var n=0;nr[i]})}}}return Object.freeze(Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}))}(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))r(i);new MutationObserver(i=>{for(const a of i)if(a.type==="childList")for(const o of a.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&r(o)}).observe(document,{childList:!0,subtree:!0});function n(i){const a={};return i.integrity&&(a.integrity=i.integrity),i.referrerPolicy&&(a.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?a.credentials="include":i.crossOrigin==="anonymous"?a.credentials="omit":a.credentials="same-origin",a}function r(i){if(i.ep)return;i.ep=!0;const a=n(i);fetch(i.href,a)}})();var Aw=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function hl(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var zE={exports:{}},Eb={};var FU;function jae(){if(FU)return Eb;FU=1;var t=Symbol.for("react.transitional.element"),e=Symbol.for("react.fragment");function n(r,i,a){var o=null;if(a!==void 0&&(o=""+a),i.key!==void 0&&(o=""+i.key),"key"in i){a={};for(var l in i)l!=="key"&&(a[l]=i[l])}else a=i;return i=a.ref,{$$typeof:t,type:r,key:o,ref:i!==void 0?i:null,props:a}}return Eb.Fragment=e,Eb.jsx=n,Eb.jsxs=n,Eb}var IU;function Pae(){return IU||(IU=1,zE.exports=jae()),zE.exports}var s=Pae(),BE={exports:{}},yn={};var UU;function Dae(){if(UU)return yn;UU=1;var t=Symbol.for("react.transitional.element"),e=Symbol.for("react.portal"),n=Symbol.for("react.fragment"),r=Symbol.for("react.strict_mode"),i=Symbol.for("react.profiler"),a=Symbol.for("react.consumer"),o=Symbol.for("react.context"),l=Symbol.for("react.forward_ref"),c=Symbol.for("react.suspense"),u=Symbol.for("react.memo"),d=Symbol.for("react.lazy"),f=Symbol.for("react.activity"),p=Symbol.iterator;function m($){return $===null||typeof $!="object"?null:($=p&&$[p]||$["@@iterator"],typeof $=="function"?$:null)}var x={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},b=Object.assign,y={};function v($,X,ne){this.props=$,this.context=X,this.refs=y,this.updater=ne||x}v.prototype.isReactComponent={},v.prototype.setState=function($,X){if(typeof $!="object"&&typeof $!="function"&&$!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,$,X,"setState")},v.prototype.forceUpdate=function($){this.updater.enqueueForceUpdate(this,$,"forceUpdate")};function S(){}S.prototype=v.prototype;function M($,X,ne){this.props=$,this.context=X,this.refs=y,this.updater=ne||x}var T=M.prototype=new S;T.constructor=M,b(T,v.prototype),T.isPureReactComponent=!0;var k=Array.isArray;function C(){}var E={H:null,A:null,T:null,S:null},R=Object.prototype.hasOwnProperty;function A($,X,ne){var se=ne.ref;return{$$typeof:t,type:$,key:X,ref:se!==void 0?se:null,props:ne}}function D($,X){return A($.type,X,$.props)}function I($){return typeof $=="object"&&$!==null&&$.$$typeof===t}function F($){var X={"=":"=0",":":"=2"};return"$"+$.replace(/[=:]/g,function(ne){return X[ne]})}var z=/\/+/g;function j($,X){return typeof $=="object"&&$!==null&&$.key!=null?F(""+$.key):X.toString(36)}function H($){switch($.status){case"fulfilled":return $.value;case"rejected":throw $.reason;default:switch(typeof $.status=="string"?$.then(C,C):($.status="pending",$.then(function(X){$.status==="pending"&&($.status="fulfilled",$.value=X)},function(X){$.status==="pending"&&($.status="rejected",$.reason=X)})),$.status){case"fulfilled":return $.value;case"rejected":throw $.reason}}throw $}function K($,X,ne,se,be){var xe=typeof $;(xe==="undefined"||xe==="boolean")&&($=null);var de=!1;if($===null)de=!0;else switch(xe){case"bigint":case"string":case"number":de=!0;break;case"object":switch($.$$typeof){case t:case e:de=!0;break;case d:return de=$._init,K(de($._payload),X,ne,se,be)}}if(de)return be=be($),de=se===""?"."+j($,0):se,k(be)?(ne="",de!=null&&(ne=de.replace(z,"$&/")+"/"),K(be,X,ne,"",function(Me){return Me})):be!=null&&(I(be)&&(be=D(be,ne+(be.key==null||$&&$.key===be.key?"":(""+be.key).replace(z,"$&/")+"/")+de)),X.push(be)),1;de=0;var Pe=se===""?".":se+":";if(k($))for(var ie=0;ie<$.length;ie++)se=$[ie],xe=Pe+j(se,ie),de+=K(se,X,ne,xe,be);else if(ie=m($),typeof ie=="function")for($=ie.call($),ie=0;!(se=$.next()).done;)se=se.value,xe=Pe+j(se,ie++),de+=K(se,X,ne,xe,be);else if(xe==="object"){if(typeof $.then=="function")return K(H($),X,ne,se,be);throw X=String($),Error("Objects are not valid as a React child (found: "+(X==="[object Object]"?"object with keys {"+Object.keys($).join(", ")+"}":X)+"). If you meant to render a collection of children, use an array instead.")}return de}function V($,X,ne){if($==null)return $;var se=[],be=0;return K($,se,"","",function(xe){return X.call(ne,xe,be++)}),se}function Q($){if($._status===-1){var X=$._result;X=X(),X.then(function(ne){($._status===0||$._status===-1)&&($._status=1,$._result=ne)},function(ne){($._status===0||$._status===-1)&&($._status=2,$._result=ne)}),$._status===-1&&($._status=0,$._result=X)}if($._status===1)return $._result.default;throw $._result}var Z=typeof reportError=="function"?reportError:function($){if(typeof window=="object"&&typeof window.ErrorEvent=="function"){var X=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:typeof $=="object"&&$!==null&&typeof $.message=="string"?String($.message):String($),error:$});if(!window.dispatchEvent(X))return}else if(typeof process=="object"&&typeof process.emit=="function"){process.emit("uncaughtException",$);return}console.error($)},ae={map:V,forEach:function($,X,ne){V($,function(){X.apply(this,arguments)},ne)},count:function($){var X=0;return V($,function(){X++}),X},toArray:function($){return V($,function(X){return X})||[]},only:function($){if(!I($))throw Error("React.Children.only expected to receive a single React element child.");return $}};return yn.Activity=f,yn.Children=ae,yn.Component=v,yn.Fragment=n,yn.Profiler=i,yn.PureComponent=M,yn.StrictMode=r,yn.Suspense=c,yn.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=E,yn.__COMPILER_RUNTIME={__proto__:null,c:function($){return E.H.useMemoCache($)}},yn.cache=function($){return function(){return $.apply(null,arguments)}},yn.cacheSignal=function(){return null},yn.cloneElement=function($,X,ne){if($==null)throw Error("The argument must be a React element, but you passed "+$+".");var se=b({},$.props),be=$.key;if(X!=null)for(xe in X.key!==void 0&&(be=""+X.key),X)!R.call(X,xe)||xe==="key"||xe==="__self"||xe==="__source"||xe==="ref"&&X.ref===void 0||(se[xe]=X[xe]);var xe=arguments.length-2;if(xe===1)se.children=ne;else if(1>>1,ae=K[Z];if(0>>1;Z<$;){var X=2*(Z+1)-1,ne=K[X],se=X+1,be=K[se];if(0>i(ne,Q))sei(be,ne)?(K[Z]=be,K[se]=Q,Z=se):(K[Z]=ne,K[X]=Q,Z=X);else if(sei(be,Q))K[Z]=be,K[se]=Q,Z=se;else break e}}return V}function i(K,V){var Q=K.sortIndex-V.sortIndex;return Q!==0?Q:K.id-V.id}if(t.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var a=performance;t.unstable_now=function(){return a.now()}}else{var o=Date,l=o.now();t.unstable_now=function(){return o.now()-l}}var c=[],u=[],d=1,f=null,p=3,m=!1,x=!1,b=!1,y=!1,v=typeof setTimeout=="function"?setTimeout:null,S=typeof clearTimeout=="function"?clearTimeout:null,M=typeof setImmediate<"u"?setImmediate:null;function T(K){for(var V=n(u);V!==null;){if(V.callback===null)r(u);else if(V.startTime<=K)r(u),V.sortIndex=V.expirationTime,e(c,V);else break;V=n(u)}}function k(K){if(b=!1,T(K),!x)if(n(c)!==null)x=!0,C||(C=!0,F());else{var V=n(u);V!==null&&H(k,V.startTime-K)}}var C=!1,E=-1,R=5,A=-1;function D(){return y?!0:!(t.unstable_now()-AK&&D());){var Z=f.callback;if(typeof Z=="function"){f.callback=null,p=f.priorityLevel;var ae=Z(f.expirationTime<=K);if(K=t.unstable_now(),typeof ae=="function"){f.callback=ae,T(K),V=!0;break t}f===n(c)&&r(c),T(K)}else r(c);f=n(c)}if(f!==null)V=!0;else{var $=n(u);$!==null&&H(k,$.startTime-K),V=!1}}break e}finally{f=null,p=Q,m=!1}V=void 0}}finally{V?F():C=!1}}}var F;if(typeof M=="function")F=function(){M(I)};else if(typeof MessageChannel<"u"){var z=new MessageChannel,j=z.port2;z.port1.onmessage=I,F=function(){j.postMessage(null)}}else F=function(){v(I,0)};function H(K,V){E=v(function(){K(t.unstable_now())},V)}t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(K){K.callback=null},t.unstable_forceFrameRate=function(K){0>K||125Z?(K.sortIndex=Q,e(u,K),n(c)===null&&K===n(u)&&(b?(S(E),E=-1):b=!0,H(k,Q-Z))):(K.sortIndex=ae,e(c,K),x||m||(x=!0,C||(C=!0,F()))),K},t.unstable_shouldYield=D,t.unstable_wrapCallback=function(K){var V=p;return function(){var Q=p;p=V;try{return K.apply(this,arguments)}finally{p=Q}}}})(VE)),VE}var $U;function Lae(){return $U||($U=1,HE.exports=Oae()),HE.exports}var GE={exports:{}},$a={};var HU;function Fae(){if(HU)return $a;HU=1;var t=px();function e(c){var u="https://react.dev/errors/"+c;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(t)}catch(e){console.error(e)}}return t(),GE.exports=Fae(),GE.exports}var GU;function Iae(){if(GU)return Tb;GU=1;var t=Lae(),e=px(),n=vq();function r(h){var g="https://react.dev/errors/"+h;if(1ae||(h.current=Z[ae],Z[ae]=null,ae--)}function ne(h,g){ae++,Z[ae]=h.current,h.current=g}var se=$(null),be=$(null),xe=$(null),de=$(null);function Pe(h,g){switch(ne(xe,g),ne(be,h),ne(se,null),g.nodeType){case 9:case 11:h=(h=g.documentElement)&&(h=h.namespaceURI)?sU(h):0;break;default:if(h=g.tagName,g=g.namespaceURI)g=sU(g),h=oU(g,h);else switch(h){case"svg":h=1;break;case"math":h=2;break;default:h=0}}X(se),ne(se,h)}function ie(){X(se),X(be),X(xe)}function Me(h){h.memoizedState!==null&&ne(de,h);var g=se.current,w=oU(g,h.type);g!==w&&(ne(be,h),ne(se,w))}function Oe(h){be.current===h&&(X(se),X(be)),de.current===h&&(X(de),Sb._currentValue=Q)}var ge,Ke;function G(h){if(ge===void 0)try{throw Error()}catch(w){var g=w.stack.trim().match(/\n( *(at )?)/);ge=g&&g[1]||"",Ke=-1r[i]})}}}return Object.freeze(Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}))}(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))r(i);new MutationObserver(i=>{for(const a of i)if(a.type==="childList")for(const o of a.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&r(o)}).observe(document,{childList:!0,subtree:!0});function n(i){const a={};return i.integrity&&(a.integrity=i.integrity),i.referrerPolicy&&(a.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?a.credentials="include":i.crossOrigin==="anonymous"?a.credentials="omit":a.credentials="same-origin",a}function r(i){if(i.ep)return;i.ep=!0;const a=n(i);fetch(i.href,a)}})();var Aw=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function hl(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var zE={exports:{}},Eb={};var FU;function Cae(){if(FU)return Eb;FU=1;var t=Symbol.for("react.transitional.element"),e=Symbol.for("react.fragment");function n(r,i,a){var o=null;if(a!==void 0&&(o=""+a),i.key!==void 0&&(o=""+i.key),"key"in i){a={};for(var l in i)l!=="key"&&(a[l]=i[l])}else a=i;return i=a.ref,{$$typeof:t,type:r,key:o,ref:i!==void 0?i:null,props:a}}return Eb.Fragment=e,Eb.jsx=n,Eb.jsxs=n,Eb}var IU;function jae(){return IU||(IU=1,zE.exports=Cae()),zE.exports}var s=jae(),BE={exports:{}},yn={};var UU;function Pae(){if(UU)return yn;UU=1;var t=Symbol.for("react.transitional.element"),e=Symbol.for("react.portal"),n=Symbol.for("react.fragment"),r=Symbol.for("react.strict_mode"),i=Symbol.for("react.profiler"),a=Symbol.for("react.consumer"),o=Symbol.for("react.context"),l=Symbol.for("react.forward_ref"),c=Symbol.for("react.suspense"),u=Symbol.for("react.memo"),d=Symbol.for("react.lazy"),f=Symbol.for("react.activity"),p=Symbol.iterator;function m(B){return B===null||typeof B!="object"?null:(B=p&&B[p]||B["@@iterator"],typeof B=="function"?B:null)}var x={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},b=Object.assign,y={};function v(B,X,ne){this.props=B,this.context=X,this.refs=y,this.updater=ne||x}v.prototype.isReactComponent={},v.prototype.setState=function(B,X){if(typeof B!="object"&&typeof B!="function"&&B!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,B,X,"setState")},v.prototype.forceUpdate=function(B){this.updater.enqueueForceUpdate(this,B,"forceUpdate")};function S(){}S.prototype=v.prototype;function N(B,X,ne){this.props=B,this.context=X,this.refs=y,this.updater=ne||x}var T=N.prototype=new S;T.constructor=N,b(T,v.prototype),T.isPureReactComponent=!0;var k=Array.isArray;function C(){}var E={H:null,A:null,T:null,S:null},R=Object.prototype.hasOwnProperty;function A(B,X,ne){var se=ne.ref;return{$$typeof:t,type:B,key:X,ref:se!==void 0?se:null,props:ne}}function D(B,X){return A(B.type,X,B.props)}function U(B){return typeof B=="object"&&B!==null&&B.$$typeof===t}function F(B){var X={"=":"=0",":":"=2"};return"$"+B.replace(/[=:]/g,function(ne){return X[ne]})}var $=/\/+/g;function j(B,X){return typeof B=="object"&&B!==null&&B.key!=null?F(""+B.key):X.toString(36)}function H(B){switch(B.status){case"fulfilled":return B.value;case"rejected":throw B.reason;default:switch(typeof B.status=="string"?B.then(C,C):(B.status="pending",B.then(function(X){B.status==="pending"&&(B.status="fulfilled",B.value=X)},function(X){B.status==="pending"&&(B.status="rejected",B.reason=X)})),B.status){case"fulfilled":return B.value;case"rejected":throw B.reason}}throw B}function K(B,X,ne,se,be){var xe=typeof B;(xe==="undefined"||xe==="boolean")&&(B=null);var de=!1;if(B===null)de=!0;else switch(xe){case"bigint":case"string":case"number":de=!0;break;case"object":switch(B.$$typeof){case t:case e:de=!0;break;case d:return de=B._init,K(de(B._payload),X,ne,se,be)}}if(de)return be=be(B),de=se===""?"."+j(B,0):se,k(be)?(ne="",de!=null&&(ne=de.replace($,"$&/")+"/"),K(be,X,ne,"",function(Ne){return Ne})):be!=null&&(U(be)&&(be=D(be,ne+(be.key==null||B&&B.key===be.key?"":(""+be.key).replace($,"$&/")+"/")+de)),X.push(be)),1;de=0;var Pe=se===""?".":se+":";if(k(B))for(var ie=0;ie>>1,ae=K[Z];if(0>>1;Zi(ne,Q))sei(be,ne)?(K[Z]=be,K[se]=Q,Z=se):(K[Z]=ne,K[X]=Q,Z=X);else if(sei(be,Q))K[Z]=be,K[se]=Q,Z=se;else break e}}return V}function i(K,V){var Q=K.sortIndex-V.sortIndex;return Q!==0?Q:K.id-V.id}if(t.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var a=performance;t.unstable_now=function(){return a.now()}}else{var o=Date,l=o.now();t.unstable_now=function(){return o.now()-l}}var c=[],u=[],d=1,f=null,p=3,m=!1,x=!1,b=!1,y=!1,v=typeof setTimeout=="function"?setTimeout:null,S=typeof clearTimeout=="function"?clearTimeout:null,N=typeof setImmediate<"u"?setImmediate:null;function T(K){for(var V=n(u);V!==null;){if(V.callback===null)r(u);else if(V.startTime<=K)r(u),V.sortIndex=V.expirationTime,e(c,V);else break;V=n(u)}}function k(K){if(b=!1,T(K),!x)if(n(c)!==null)x=!0,C||(C=!0,F());else{var V=n(u);V!==null&&H(k,V.startTime-K)}}var C=!1,E=-1,R=5,A=-1;function D(){return y?!0:!(t.unstable_now()-AK&&D());){var Z=f.callback;if(typeof Z=="function"){f.callback=null,p=f.priorityLevel;var ae=Z(f.expirationTime<=K);if(K=t.unstable_now(),typeof ae=="function"){f.callback=ae,T(K),V=!0;break t}f===n(c)&&r(c),T(K)}else r(c);f=n(c)}if(f!==null)V=!0;else{var B=n(u);B!==null&&H(k,B.startTime-K),V=!1}}break e}finally{f=null,p=Q,m=!1}V=void 0}}finally{V?F():C=!1}}}var F;if(typeof N=="function")F=function(){N(U)};else if(typeof MessageChannel<"u"){var $=new MessageChannel,j=$.port2;$.port1.onmessage=U,F=function(){j.postMessage(null)}}else F=function(){v(U,0)};function H(K,V){E=v(function(){K(t.unstable_now())},V)}t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(K){K.callback=null},t.unstable_forceFrameRate=function(K){0>K||125Z?(K.sortIndex=Q,e(u,K),n(c)===null&&K===n(u)&&(b?(S(E),E=-1):b=!0,H(k,Q-Z))):(K.sortIndex=ae,e(c,K),x||m||(x=!0,C||(C=!0,F()))),K},t.unstable_shouldYield=D,t.unstable_wrapCallback=function(K){var V=p;return function(){var Q=p;p=V;try{return K.apply(this,arguments)}finally{p=Q}}}})(VE)),VE}var HU;function Oae(){return HU||(HU=1,$E.exports=Rae()),$E.exports}var GE={exports:{}},Ha={};var $U;function Lae(){if($U)return Ha;$U=1;var t=px();function e(c){var u="https://react.dev/errors/"+c;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(t)}catch(e){console.error(e)}}return t(),GE.exports=Lae(),GE.exports}var GU;function Fae(){if(GU)return Tb;GU=1;var t=Oae(),e=px(),n=yq();function r(h){var g="https://react.dev/errors/"+h;if(1ae||(h.current=Z[ae],Z[ae]=null,ae--)}function ne(h,g){ae++,Z[ae]=h.current,h.current=g}var se=B(null),be=B(null),xe=B(null),de=B(null);function Pe(h,g){switch(ne(xe,g),ne(be,h),ne(se,null),g.nodeType){case 9:case 11:h=(h=g.documentElement)&&(h=h.namespaceURI)?sU(h):0;break;default:if(h=g.tagName,g=g.namespaceURI)g=sU(g),h=oU(g,h);else switch(h){case"svg":h=1;break;case"math":h=2;break;default:h=0}}X(se),ne(se,h)}function ie(){X(se),X(be),X(xe)}function Ne(h){h.memoizedState!==null&&ne(de,h);var g=se.current,w=oU(g,h.type);g!==w&&(ne(be,h),ne(se,w))}function Oe(h){be.current===h&&(X(se),X(be)),de.current===h&&(X(de),Sb._currentValue=Q)}var ge,Ke;function G(h){if(ge===void 0)try{throw Error()}catch(w){var g=w.stack.trim().match(/\n( *(at )?)/);ge=g&&g[1]||"",Ke=-1>>>>>>> 588a771 (Added Japanese language pack (Thanks to @nmori)):static/assets/index-DcyUztYr.js at`)?" ()":-1P||Ue[N]!==it[P]){var gt=` `+Ue[N].replace(" at new "," at ");return h.displayName&>.includes("")&&(gt=gt.replace("",h.displayName)),gt}while(1<=N&&0<=P);break}}}finally{Y=!1,Error.prepareStackTrace=w}return(w=h?h.displayName||h.name:"")?G(w):""}function q(h,g){switch(h.tag){case 26:case 27:case 5:return G(h.type);case 16:return G("Lazy");case 13:return h.child!==g&&g!==null?G("Suspense Fallback"):G("Suspense");case 19:return G("SuspenseList");case 0:case 15:return ce(h.type,!1);case 11:return ce(h.type.render,!1);case 1:return ce(h.type,!0);case 31:return G("Activity");default:return""}}function te(h){try{var g="",w=null;do g+=q(h,w),w=h,h=h.return;while(h);return g}catch(N){return` Error generating stack: `+N.message+` @@ -15,6 +20,21 @@ Please change the parent to {var n=s4();if(pc(n.width)&&pc(n.height))return t.children;var{width:r,height:i}=Gxe({width:t.width,height:t.height,aspect:t.aspect}),{calculatedWidth:a,calculatedHeight:o}=sX(void 0,void 0,{width:r,height:i,aspect:t.aspect,maxHeight:t.maxHeight});return zt(a)&&zt(o)?_.createElement(lX,{width:a,height:o},t.children):_.createElement(Yxe,UP({},t,{width:r,height:i,ref:e}))});function cX(t){if(t)return{x:t.x,y:t.y,upperWidth:"upperWidth"in t?t.upperWidth:t.width,lowerWidth:"lowerWidth"in t?t.lowerWidth:t.width,width:t.width,height:t.height}}var Gy=()=>{var t,e=ra(),n=It(Pxe),r=It(O2),i=(t=It(R2))===null||t===void 0?void 0:t.padding;return!e||!r||!i?n:{width:r.width-i.left-i.right,height:r.height-i.top-i.bottom,x:i.left,y:i.top}},Qxe={top:0,bottom:0,left:0,right:0,width:0,height:0,brushBottom:0},uX=()=>{var t;return(t=It(na))!==null&&t!==void 0?t:Qxe},o4=()=>It(qu),l4=()=>It(Wu),Zxe=()=>It(t=>t.layout.margin),Vn=t=>t.layout.layoutType,Em=()=>It(Vn),Jxe=()=>{var t=Em();if(t==="horizontal"||t==="vertical")return t},ebe=()=>{var t=Em();return t!==void 0},L2=t=>{var e=Lr(),n=ra(),{width:r,height:i}=t,a=s4(),o=r,l=i;return a&&(o=a.width>0?a.width:r,l=a.height>0?a.height:i),_.useEffect(()=>{!n&&pc(o)&&pc(l)&&e(ixe({width:o,height:l}))},[e,n,o,l]),null},dX=Symbol.for("immer-nothing"),x8=Symbol.for("immer-draftable"),yo=Symbol.for("immer-state");function Tl(t,...e){throw new Error(`[Immer] minified error nr: ${t}. Full error at: https://bit.ly/3cXEKWf`)}var J0=Object.getPrototypeOf;function qg(t){return!!t&&!!t[yo]}function um(t){return t?hX(t)||Array.isArray(t)||!!t[x8]||!!t.constructor?.[x8]||qy(t)||I2(t):!1}var tbe=Object.prototype.constructor.toString(),b8=new WeakMap;function hX(t){if(!t||typeof t!="object")return!1;const e=Object.getPrototypeOf(t);if(e===null||e===Object.prototype)return!0;const n=Object.hasOwnProperty.call(e,"constructor")&&e.constructor;if(n===Object)return!0;if(typeof n!="function")return!1;let r=b8.get(n);return r===void 0&&(r=Function.toString.call(n),b8.set(n,r)),r===tbe}function dS(t,e,n=!0){F2(t)===0?(n?Reflect.ownKeys(t):Object.keys(t)).forEach(i=>{e(i,t[i],t)}):t.forEach((r,i)=>e(i,r,t))}function F2(t){const e=t[yo];return e?e.type_:Array.isArray(t)?1:qy(t)?2:I2(t)?3:0}function zP(t,e){return F2(t)===2?t.has(e):Object.prototype.hasOwnProperty.call(t,e)}function fX(t,e,n){const r=F2(t);r===2?t.set(e,n):r===3?t.add(n):t[e]=n}function nbe(t,e){return t===e?t!==0||1/t===1/e:t!==t&&e!==e}function qy(t){return t instanceof Map}function I2(t){return t instanceof Set}function wf(t){return t.copy_||t.base_}function BP(t,e){if(qy(t))return new Map(t);if(I2(t))return new Set(t);if(Array.isArray(t))return Array.prototype.slice.call(t);const n=hX(t);if(e===!0||e==="class_only"&&!n){const r=Object.getOwnPropertyDescriptors(t);delete r[yo];let i=Reflect.ownKeys(r);for(let a=0;a1&&Object.defineProperties(t,{set:Bw,add:Bw,clear:Bw,delete:Bw}),Object.freeze(t),e&&Object.values(t).forEach(n=>c4(n,!0))),t}function rbe(){Tl(2)}var Bw={value:rbe};function U2(t){return t===null||typeof t!="object"?!0:Object.isFrozen(t)}var ibe={};function dm(t){const e=ibe[t];return e||Tl(0,t),e}var ey;function mX(){return ey}function abe(t,e){return{drafts_:[],parent_:t,immer_:e,canAutoFreeze_:!0,unfinalizedDrafts_:0}}function y8(t,e){e&&(dm("Patches"),t.patches_=[],t.inversePatches_=[],t.patchListener_=e)}function $P(t){HP(t),t.drafts_.forEach(sbe),t.drafts_=null}function HP(t){t===ey&&(ey=t.parent_)}function v8(t){return ey=abe(ey,t)}function sbe(t){const e=t[yo];e.type_===0||e.type_===1?e.revoke_():e.revoked_=!0}function w8(t,e){e.unfinalizedDrafts_=e.drafts_.length;const n=e.drafts_[0];return t!==void 0&&t!==n?(n[yo].modified_&&($P(e),Tl(4)),um(t)&&(t=hS(e,t),e.parent_||fS(e,t)),e.patches_&&dm("Patches").generateReplacementPatches_(n[yo].base_,t,e.patches_,e.inversePatches_)):t=hS(e,n,[]),$P(e),e.patches_&&e.patchListener_(e.patches_,e.inversePatches_),t!==dX?t:void 0}function hS(t,e,n){if(U2(e))return e;const r=t.immer_.shouldUseStrictIteration(),i=e[yo];if(!i)return dS(e,(a,o)=>_8(t,i,e,a,o,n),r),e;if(i.scope_!==t)return e;if(!i.modified_)return fS(t,i.base_,!0),i.base_;if(!i.finalized_){i.finalized_=!0,i.scope_.unfinalizedDrafts_--;const a=i.copy_;let o=a,l=!1;i.type_===3&&(o=new Set(a),a.clear(),l=!0),dS(o,(c,u)=>_8(t,i,a,c,u,n,l),r),fS(t,a,!1),n&&t.patches_&&dm("Patches").generatePatches_(i,n,t.patches_,t.inversePatches_)}return i.copy_}function _8(t,e,n,r,i,a,o){if(i==null||typeof i!="object"&&!o)return;const l=U2(i);if(!(l&&!o)){if(qg(i)){const c=a&&e&&e.type_!==3&&!zP(e.assigned_,r)?a.concat(r):void 0,u=hS(t,i,c);if(fX(n,r,u),qg(u))t.canAutoFreeze_=!1;else return}else o&&n.add(i);if(um(i)&&!l){if(!t.immer_.autoFreeze_&&t.unfinalizedDrafts_<1||e&&e.base_&&e.base_[r]===i&&l)return;hS(t,i),(!e||!e.scope_.parent_)&&typeof r!="symbol"&&(qy(n)?n.has(r):Object.prototype.propertyIsEnumerable.call(n,r))&&fS(t,i)}}}function fS(t,e,n=!1){!t.parent_&&t.immer_.autoFreeze_&&t.canAutoFreeze_&&c4(e,n)}function obe(t,e){const n=Array.isArray(t),r={type_:n?1:0,scope_:e?e.scope_:mX(),modified_:!1,finalized_:!1,assigned_:{},parent_:e,base_:t,draft_:null,copy_:null,revoke_:null,isManual_:!1};let i=r,a=u4;n&&(i=[r],a=ty);const{revoke:o,proxy:l}=Proxy.revocable(i,a);return r.draft_=l,r.revoke_=o,l}var u4={get(t,e){if(e===yo)return t;const n=wf(t);if(!zP(n,e))return lbe(t,n,e);const r=n[e];return t.finalized_||!um(r)?r:r===sA(t.base_,e)?(oA(t),t.copy_[e]=GP(r,t)):r},has(t,e){return e in wf(t)},ownKeys(t){return Reflect.ownKeys(wf(t))},set(t,e,n){const r=pX(wf(t),e);if(r?.set)return r.set.call(t.draft_,n),!0;if(!t.modified_){const i=sA(wf(t),e),a=i?.[yo];if(a&&a.base_===n)return t.copy_[e]=n,t.assigned_[e]=!1,!0;if(nbe(n,i)&&(n!==void 0||zP(t.base_,e)))return!0;oA(t),VP(t)}return t.copy_[e]===n&&(n!==void 0||e in t.copy_)||Number.isNaN(n)&&Number.isNaN(t.copy_[e])||(t.copy_[e]=n,t.assigned_[e]=!0),!0},deleteProperty(t,e){return sA(t.base_,e)!==void 0||e in t.base_?(t.assigned_[e]=!1,oA(t),VP(t)):delete t.assigned_[e],t.copy_&&delete t.copy_[e],!0},getOwnPropertyDescriptor(t,e){const n=wf(t),r=Reflect.getOwnPropertyDescriptor(n,e);return r&&{writable:!0,configurable:t.type_!==1||e!=="length",enumerable:r.enumerable,value:n[e]}},defineProperty(){Tl(11)},getPrototypeOf(t){return J0(t.base_)},setPrototypeOf(){Tl(12)}},ty={};dS(u4,(t,e)=>{ty[t]=function(){return arguments[0]=arguments[0][0],e.apply(this,arguments)}});ty.deleteProperty=function(t,e){return ty.set.call(this,t,e,void 0)};ty.set=function(t,e,n){return u4.set.call(this,t[0],e,n,t[0])};function sA(t,e){const n=t[yo];return(n?wf(n):t)[e]}function lbe(t,e,n){const r=pX(e,n);return r?"value"in r?r.value:r.get?.call(t.draft_):void 0}function pX(t,e){if(!(e in t))return;let n=J0(t);for(;n;){const r=Object.getOwnPropertyDescriptor(n,e);if(r)return r;n=J0(n)}}function VP(t){t.modified_||(t.modified_=!0,t.parent_&&VP(t.parent_))}function oA(t){t.copy_||(t.copy_=BP(t.base_,t.scope_.immer_.useStrictShallowCopy_))}var cbe=class{constructor(t){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.useStrictIteration_=!0,this.produce=(e,n,r)=>{if(typeof e=="function"&&typeof n!="function"){const a=n;n=e;const o=this;return function(c=a,...u){return o.produce(c,d=>n.call(this,d,...u))}}typeof n!="function"&&Tl(6),r!==void 0&&typeof r!="function"&&Tl(7);let i;if(um(e)){const a=v8(this),o=GP(e,void 0);let l=!0;try{i=n(o),l=!1}finally{l?$P(a):HP(a)}return y8(a,r),w8(i,a)}else if(!e||typeof e!="object"){if(i=n(e),i===void 0&&(i=e),i===dX&&(i=void 0),this.autoFreeze_&&c4(i,!0),r){const a=[],o=[];dm("Patches").generateReplacementPatches_(e,i,a,o),r(a,o)}return i}else Tl(1,e)},this.produceWithPatches=(e,n)=>{if(typeof e=="function")return(o,...l)=>this.produceWithPatches(o,c=>e(c,...l));let r,i;return[this.produce(e,n,(o,l)=>{r=o,i=l}),r,i]},typeof t?.autoFreeze=="boolean"&&this.setAutoFreeze(t.autoFreeze),typeof t?.useStrictShallowCopy=="boolean"&&this.setUseStrictShallowCopy(t.useStrictShallowCopy),typeof t?.useStrictIteration=="boolean"&&this.setUseStrictIteration(t.useStrictIteration)}createDraft(t){um(t)||Tl(8),qg(t)&&(t=ube(t));const e=v8(this),n=GP(t,void 0);return n[yo].isManual_=!0,HP(e),n}finishDraft(t,e){const n=t&&t[yo];(!n||!n.isManual_)&&Tl(9);const{scope_:r}=n;return y8(r,e),w8(void 0,r)}setAutoFreeze(t){this.autoFreeze_=t}setUseStrictShallowCopy(t){this.useStrictShallowCopy_=t}setUseStrictIteration(t){this.useStrictIteration_=t}shouldUseStrictIteration(){return this.useStrictIteration_}applyPatches(t,e){let n;for(n=e.length-1;n>=0;n--){const i=e[n];if(i.path.length===0&&i.op==="replace"){t=i.value;break}}n>-1&&(e=e.slice(n+1));const r=dm("Patches").applyPatches_;return qg(t)?r(t,e):this.produce(t,i=>r(i,e))}};function GP(t,e){const n=qy(t)?dm("MapSet").proxyMap_(t,e):I2(t)?dm("MapSet").proxySet_(t,e):obe(t,e);return(e?e.scope_:mX()).drafts_.push(n),n}function ube(t){return qg(t)||Tl(10,t),gX(t)}function gX(t){if(!um(t)||U2(t))return t;const e=t[yo];let n,r=!0;if(e){if(!e.modified_)return e.base_;e.finalized_=!0,n=BP(t,e.scope_.immer_.useStrictShallowCopy_),r=e.scope_.immer_.shouldUseStrictIteration()}else n=BP(t,!0);return dS(n,(i,a)=>{fX(n,i,gX(a))},r),e&&(e.finalized_=!1),n}var dbe=new cbe;dbe.produce;var hbe={settings:{layout:"horizontal",align:"center",verticalAlign:"middle",itemSorter:"value"},size:{width:0,height:0},payload:[]},xX=Vs({name:"legend",initialState:hbe,reducers:{setLegendSize(t,e){t.size.width=e.payload.width,t.size.height=e.payload.height},setLegendSettings(t,e){t.settings.align=e.payload.align,t.settings.layout=e.payload.layout,t.settings.verticalAlign=e.payload.verticalAlign,t.settings.itemSorter=e.payload.itemSorter},addLegendPayload:{reducer(t,e){t.payload.push(e.payload)},prepare:Jr()},replaceLegendPayload:{reducer(t,e){var{prev:n,next:r}=e.payload,i=Ol(t).payload.indexOf(n);i>-1&&(t.payload[i]=r)},prepare:Jr()},removeLegendPayload:{reducer(t,e){var n=Ol(t).payload.indexOf(e.payload);n>-1&&t.payload.splice(n,1)},prepare:Jr()}}}),{setLegendSize:S8,setLegendSettings:fbe,addLegendPayload:bX,replaceLegendPayload:yX,removeLegendPayload:vX}=xX.actions,mbe=xX.reducer,pbe=["contextPayload"];function qP(){return qP=Object.assign?Object.assign.bind():function(t){for(var e=1;e{e(fbe(t))},[e,t]),null}function Mbe(t){var e=Lr();return _.useEffect(()=>(e(S8(t)),()=>{e(S8({width:0,height:0}))}),[e,t]),null}function kbe(t,e,n,r){return t==="vertical"&&zt(e)?{height:e}:t==="horizontal"?{width:n||r}:null}var Ebe={align:"center",iconSize:14,itemSorter:"value",layout:"horizontal",verticalAlign:"bottom"};function d4(t){var e=li(t,Ebe),n=sge(),r=ome(),i=Zxe(),{width:a,height:o,wrapperStyle:l,portal:c}=e,[u,d]=SK([n]),f=o4(),p=l4();if(f==null||p==null)return null;var m=f-(i?.left||0)-(i?.right||0),x=kbe(e.layout,o,a,m),b=c?l:Wg(Wg({position:"absolute",width:x?.width||a||"auto",height:x?.height||o||"auto"},Sbe(l,e,i,f,p,u)),l),y=c??r;if(y==null||n==null)return null;var v=_.createElement("div",{className:"recharts-legend-wrapper",style:b,ref:d},_.createElement(Nbe,{layout:e.layout,align:e.align,verticalAlign:e.verticalAlign,itemSorter:e.itemSorter}),!c&&_.createElement(Mbe,{width:u.width,height:u.height}),_.createElement(_be,qP({},e,x,{margin:i,chartWidth:f,chartHeight:p,contextPayload:n})));return gu.createPortal(v,y)}d4.displayName="Legend";function WP(){return WP=Object.assign?Object.assign.bind():function(t){for(var e=1;e{var{separator:e=" : ",contentStyle:n={},itemStyle:r={},labelStyle:i={},payload:a,formatter:o,itemSorter:l,wrapperClassName:c,labelClassName:u,label:d,labelFormatter:f,accessibilityLayer:p=!1}=t,m=()=>{if(a&&a.length){var k={padding:0,margin:0},C=(l?S2(a,l):a).map((E,R)=>{if(E.type==="none")return null;var A=E.formatter||o||jbe,{value:D,name:I}=E,F=D,z=I;if(A){var j=A(D,I,E,R,a);if(Array.isArray(j))[F,z]=j;else if(j!=null)F=j;else return null}var H=lA({display:"block",paddingTop:4,paddingBottom:4,color:E.color||"#000"},r);return _.createElement("li",{className:"recharts-tooltip-item",key:"tooltip-item-".concat(R),style:H},cl(z)?_.createElement("span",{className:"recharts-tooltip-item-name"},z):null,cl(z)?_.createElement("span",{className:"recharts-tooltip-item-separator"},e):null,_.createElement("span",{className:"recharts-tooltip-item-value"},F),_.createElement("span",{className:"recharts-tooltip-item-unit"},E.unit||""))});return _.createElement("ul",{className:"recharts-tooltip-item-list",style:k},C)}return null},x=lA({margin:0,padding:10,backgroundColor:"#fff",border:"1px solid #ccc",whiteSpace:"nowrap"},n),b=lA({margin:0},i),y=!Yr(d),v=y?d:"",S=er("recharts-default-tooltip",c),M=er("recharts-tooltip-label",u);y&&f&&a!==void 0&&a!==null&&(v=f(d,a));var T=p?{role:"status","aria-live":"assertive"}:{};return _.createElement("div",WP({className:S,style:x},T),_.createElement("p",{className:M,style:b},_.isValidElement(v)?v:"".concat(v)),m())},jb="recharts-tooltip-wrapper",Dbe={visibility:"hidden"};function Rbe(t){var{coordinate:e,translateX:n,translateY:r}=t;return er(jb,{["".concat(jb,"-right")]:zt(n)&&e&&zt(e.x)&&n>=e.x,["".concat(jb,"-left")]:zt(n)&&e&&zt(e.x)&&n=e.y,["".concat(jb,"-top")]:zt(r)&&e&&zt(e.y)&&r0?i:0),f=n[r]+i;if(e[r])return o[r]?d:f;var p=c[r];if(p==null)return 0;if(o[r]){var m=d,x=p;return my?Math.max(d,p):Math.max(f,p)}function Obe(t){var{translateX:e,translateY:n,useTranslate3d:r}=t;return{transform:r?"translate3d(".concat(e,"px, ").concat(n,"px, 0)"):"translate(".concat(e,"px, ").concat(n,"px)")}}function Lbe(t){var{allowEscapeViewBox:e,coordinate:n,offsetTopLeft:r,position:i,reverseDirection:a,tooltipBox:o,useTranslate3d:l,viewBox:c}=t,u,d,f;return o.height>0&&o.width>0&&n?(d=k8({allowEscapeViewBox:e,coordinate:n,key:"x",offsetTopLeft:r,position:i,reverseDirection:a,tooltipDimension:o.width,viewBox:c,viewBoxDimension:c.width}),f=k8({allowEscapeViewBox:e,coordinate:n,key:"y",offsetTopLeft:r,position:i,reverseDirection:a,tooltipDimension:o.height,viewBox:c,viewBoxDimension:c.height}),u=Obe({translateX:d,translateY:f,useTranslate3d:l})):u=Dbe,{cssProperties:u,cssClasses:Rbe({translateX:d,translateY:f,coordinate:n})}}function E8(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(t,i).enumerable})),n.push.apply(n,r)}return n}function $w(t){for(var e=1;e{if(e.key==="Escape"){var n,r,i,a;this.setState({dismissed:!0,dismissedAtCoordinate:{x:(n=(r=this.props.coordinate)===null||r===void 0?void 0:r.x)!==null&&n!==void 0?n:0,y:(i=(a=this.props.coordinate)===null||a===void 0?void 0:a.y)!==null&&i!==void 0?i:0}})}})}componentDidMount(){document.addEventListener("keydown",this.handleKeyDown)}componentWillUnmount(){document.removeEventListener("keydown",this.handleKeyDown)}componentDidUpdate(){var e,n;this.state.dismissed&&(((e=this.props.coordinate)===null||e===void 0?void 0:e.x)!==this.state.dismissedAtCoordinate.x||((n=this.props.coordinate)===null||n===void 0?void 0:n.y)!==this.state.dismissedAtCoordinate.y)&&(this.state.dismissed=!1)}render(){var{active:e,allowEscapeViewBox:n,animationDuration:r,animationEasing:i,children:a,coordinate:o,hasPayload:l,isAnimationActive:c,offset:u,position:d,reverseDirection:f,useTranslate3d:p,viewBox:m,wrapperStyle:x,lastBoundingBox:b,innerRef:y,hasPortalFromProps:v}=this.props,{cssClasses:S,cssProperties:M}=Lbe({allowEscapeViewBox:n,coordinate:o,offsetTopLeft:u,position:d,reverseDirection:f,tooltipBox:{height:b.height,width:b.width},useTranslate3d:p,viewBox:m}),T=v?{}:$w($w({transition:c&&e?"transform ".concat(r,"ms ").concat(i):void 0},M),{},{pointerEvents:"none",visibility:!this.state.dismissed&&e&&l?"visible":"hidden",position:"absolute",top:0,left:0}),k=$w($w({},T),{},{visibility:!this.state.dismissed&&e&&l?"visible":"hidden"},x);return _.createElement("div",{xmlns:"http://www.w3.org/1999/xhtml",tabIndex:-1,className:S,style:k,ref:y},a)}}var wX=()=>{var t;return(t=It(e=>e.rootProps.accessibilityLayer))!==null&&t!==void 0?t:!0};function XP(){return XP=Object.assign?Object.assign.bind():function(t){for(var e=1;eyr(t.x)&&yr(t.y),j8=t=>t.base!=null&&mS(t.base)&&mS(t),Pb=t=>t.x,Db=t=>t.y,Hbe=(t,e)=>{if(typeof t=="function")return t;var n="curve".concat(Iy(t));return(n==="curveMonotone"||n==="curveBump")&&e?C8["".concat(n).concat(e==="vertical"?"Y":"X")]:C8[n]||w2},Vbe=t=>{var{type:e="linear",points:n=[],baseLine:r,layout:i,connectNulls:a=!1}=t,o=Hbe(e,i),l=a?n.filter(mS):n,c;if(Array.isArray(r)){var u=n.map((m,x)=>A8(A8({},m),{},{base:r[x]}));i==="vertical"?c=Rw().y(Db).x1(Pb).x0(m=>m.base.x):c=Rw().x(Pb).y1(Db).y0(m=>m.base.y);var d=c.defined(j8).curve(o),f=a?u.filter(j8):u;return d(f)}i==="vertical"&&zt(r)?c=Rw().y(Db).x1(Pb).x0(r):zt(r)?c=Rw().x(Pb).y1(Db).y0(r):c=qW().x(Pb).y(Db);var p=c.defined(mS).curve(o);return p(l)},kg=t=>{var{className:e,points:n,path:r,pathRef:i}=t;if((!n||!n.length)&&!r)return null;var a=n&&n.length?Vbe(t):r;return _.createElement("path",XP({},xs(t),KR(t),{className:er("recharts-curve",e),d:a===null?void 0:a,ref:i}))},Gbe=["x","y","top","left","width","height","className"];function YP(){return YP=Object.assign?Object.assign.bind():function(t){for(var e=1;e"M".concat(t,",").concat(i,"v").concat(r,"M").concat(a,",").concat(e,"h").concat(n),Jbe=t=>{var{x:e=0,y:n=0,top:r=0,left:i=0,width:a=0,height:o=0,className:l}=t,c=Ybe(t,Gbe),u=qbe({x:e,y:n,top:r,left:i,width:a,height:o},c);return!zt(e)||!zt(n)||!zt(a)||!zt(o)||!zt(r)||!zt(i)?null:_.createElement("path",YP({},za(u),{className:er("recharts-cross",l),d:Zbe(e,n,a,o,r,i)}))};function e0e(t,e,n,r){var i=r/2;return{stroke:"none",fill:"#ccc",x:t==="horizontal"?e.x-i:n.left+.5,y:t==="horizontal"?n.top+.5:e.y-i,width:t==="horizontal"?r:n.width-1,height:t==="horizontal"?n.height-1:r}}function D8(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(t,i).enumerable})),n.push.apply(n,r)}return n}function R8(t){for(var e=1;et.replace(/([A-Z])/g,e=>"-".concat(e.toLowerCase())),_X=(t,e,n)=>t.map(r=>"".concat(i0e(r)," ").concat(e,"ms ").concat(n)).join(","),a0e=(t,e)=>[Object.keys(t),Object.keys(e)].reduce((n,r)=>n.filter(i=>r.includes(i))),ny=(t,e)=>Object.keys(e).reduce((n,r)=>R8(R8({},n),{},{[r]:t(r,e[r])}),{});function O8(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(t,i).enumerable})),n.push.apply(n,r)}return n}function Ki(t){for(var e=1;et+(e-t)*n,QP=t=>{var{from:e,to:n}=t;return e!==n},SX=(t,e,n)=>{var r=ny((i,a)=>{if(QP(a)){var[o,l]=t(a.from,a.to,a.velocity);return Ki(Ki({},a),{},{from:o,velocity:l})}return a},e);return n<1?ny((i,a)=>QP(a)?Ki(Ki({},a),{},{velocity:pS(a.velocity,r[i].velocity,n),from:pS(a.from,r[i].from,n)}):a,e):SX(t,r,n-1)};function c0e(t,e,n,r,i,a){var o,l=r.reduce((p,m)=>Ki(Ki({},p),{},{[m]:{from:t[m],velocity:0,to:e[m]}}),{}),c=()=>ny((p,m)=>m.from,l),u=()=>!Object.values(l).filter(QP).length,d=null,f=p=>{o||(o=p);var m=p-o,x=m/n.dt;l=SX(n,l,x),i(Ki(Ki(Ki({},t),e),c())),o=p,u()||(d=a.setTimeout(f))};return()=>(d=a.setTimeout(f),()=>{var p;(p=d)===null||p===void 0||p()})}function u0e(t,e,n,r,i,a,o){var l=null,c=i.reduce((f,p)=>Ki(Ki({},f),{},{[p]:[t[p],e[p]]}),{}),u,d=f=>{u||(u=f);var p=(f-u)/r,m=ny((b,y)=>pS(...y,n(p)),c);if(a(Ki(Ki(Ki({},t),e),m)),p<1)l=o.setTimeout(d);else{var x=ny((b,y)=>pS(...y,n(1)),c);a(Ki(Ki(Ki({},t),e),x))}};return()=>(l=o.setTimeout(d),()=>{var f;(f=l)===null||f===void 0||f()})}const d0e=(t,e,n,r,i,a)=>{var o=a0e(t,e);return n==null?()=>(i(Ki(Ki({},t),e)),()=>{}):n.isStepper===!0?c0e(t,e,n,o,i,a):u0e(t,e,n,r,o,i,a)};var gS=1e-4,NX=(t,e)=>[0,3*t,3*e-6*t,3*t-3*e+1],MX=(t,e)=>t.map((n,r)=>n*e**r).reduce((n,r)=>n+r),L8=(t,e)=>n=>{var r=NX(t,e);return MX(r,n)},h0e=(t,e)=>n=>{var r=NX(t,e),i=[...r.map((a,o)=>a*o).slice(1),0];return MX(i,n)},f0e=function(){for(var e=arguments.length,n=new Array(e),r=0;rparseFloat(l));return[o[0],o[1],o[2],o[3]]}}}return n.length===4?n:[0,0,1,1]},m0e=(t,e,n,r)=>{var i=L8(t,n),a=L8(e,r),o=h0e(t,n),l=u=>u>1?1:u<0?0:u,c=u=>{for(var d=u>1?1:u,f=d,p=0;p<8;++p){var m=i(f)-d,x=o(f);if(Math.abs(m-d)0&&arguments[0]!==void 0?arguments[0]:{},{stiff:n=100,damping:r=8,dt:i=17}=e,a=(o,l,c)=>{var u=-(o-l)*n,d=c*r,f=c+(u-d)*i/1e3,p=c*i/1e3+o;return Math.abs(p-l){if(typeof t=="string")switch(t){case"ease":case"ease-in-out":case"ease-out":case"ease-in":case"linear":return F8(t);case"spring":return p0e();default:if(t.split("(")[0]==="cubic-bezier")return F8(t)}return typeof t=="function"?t:null};function x0e(t){var e,n=()=>null,r=!1,i=null,a=o=>{if(!r){if(Array.isArray(o)){if(!o.length)return;var l=o,[c,...u]=l;if(typeof c=="number"){i=t.setTimeout(a.bind(null,u),c);return}a(c),i=t.setTimeout(a.bind(null,u));return}typeof o=="string"&&(e=o,n(e)),typeof o=="object"&&(e=o,n(e)),typeof o=="function"&&o()}};return{stop:()=>{r=!0},start:o=>{r=!1,i&&(i(),i=null),a(o)},subscribe:o=>(n=o,()=>{n=()=>null}),getTimeoutController:()=>t}}class b0e{setTimeout(e){var n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0,r=performance.now(),i=null,a=o=>{o-r>=n?e(o):typeof requestAnimationFrame=="function"&&(i=requestAnimationFrame(a))};return i=requestAnimationFrame(a),()=>{i!=null&&cancelAnimationFrame(i)}}}function y0e(){return x0e(new b0e)}var v0e=_.createContext(y0e);function w0e(t,e){var n=_.useContext(v0e);return _.useMemo(()=>e??n(t),[t,e,n])}var _0e=()=>!(typeof window<"u"&&window.document&&window.document.createElement&&window.setTimeout),yx={devToolsEnabled:!1,isSsr:_0e()},S0e={begin:0,duration:1e3,easing:"ease",isActive:!0,canBegin:!0,onAnimationEnd:()=>{},onAnimationStart:()=>{}},I8={t:0},cA={t:1};function vx(t){var e=li(t,S0e),{isActive:n,canBegin:r,duration:i,easing:a,begin:o,onAnimationEnd:l,onAnimationStart:c,children:u}=e,d=n==="auto"?!yx.isSsr:n,f=w0e(e.animationId,e.animationManager),[p,m]=_.useState(d?I8:cA),x=_.useRef(null);return _.useEffect(()=>{d||m(cA)},[d]),_.useEffect(()=>{if(!d||!r)return Uy;var b=d0e(I8,cA,g0e(a),i,m,f.getTimeoutController()),y=()=>{x.current=b()};return f.start([c,o,y,i,l]),()=>{f.stop(),x.current&&x.current(),l()}},[d,r,i,a,o,c,l,f]),u(p.t)}function wx(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"animation-",n=_.useRef(X0(e)),r=_.useRef(t);return r.current!==t&&(n.current=X0(e),r.current=t),n.current}var N0e=["radius"],M0e=["radius"];function U8(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(t,i).enumerable})),n.push.apply(n,r)}return n}function z8(t){for(var e=1;e{var a=Math.min(Math.abs(n)/2,Math.abs(r)/2),o=r>=0?1:-1,l=n>=0?1:-1,c=r>=0&&n>=0||r<0&&n<0?1:0,u;if(a>0&&i instanceof Array){for(var d=[0,0,0,0],f=0,p=4;fa?a:i[f];u="M".concat(t,",").concat(e+o*d[0]),d[0]>0&&(u+="A ".concat(d[0],",").concat(d[0],",0,0,").concat(c,",").concat(t+l*d[0],",").concat(e)),u+="L ".concat(t+n-l*d[1],",").concat(e),d[1]>0&&(u+="A ".concat(d[1],",").concat(d[1],",0,0,").concat(c,`, +======== +`);for(P=M=0;MP||Ue[M]!==it[P]){var gt=` +`+Ue[M].replace(" at new "," at ");return h.displayName&>.includes("")&&(gt=gt.replace("",h.displayName)),gt}while(1<=M&&0<=P);break}}}finally{Y=!1,Error.prepareStackTrace=w}return(w=h?h.displayName||h.name:"")?G(w):""}function q(h,g){switch(h.tag){case 26:case 27:case 5:return G(h.type);case 16:return G("Lazy");case 13:return h.child!==g&&g!==null?G("Suspense Fallback"):G("Suspense");case 19:return G("SuspenseList");case 0:case 15:return ce(h.type,!1);case 11:return ce(h.type.render,!1);case 1:return ce(h.type,!0);case 31:return G("Activity");default:return""}}function te(h){try{var g="",w=null;do g+=q(h,w),w=h,h=h.return;while(h);return g}catch(M){return` +Error generating stack: `+M.message+` +`+M.stack}}var I=Object.prototype.hasOwnProperty,fe=t.unstable_scheduleCallback,me=t.unstable_cancelCallback,Ee=t.unstable_shouldYield,z=t.unstable_requestPaint,O=t.unstable_now,ee=t.unstable_getCurrentPriorityLevel,le=t.unstable_ImmediatePriority,_e=t.unstable_UserBlockingPriority,we=t.unstable_NormalPriority,re=t.unstable_LowPriority,Fe=t.unstable_IdlePriority,He=t.log,Ve=t.unstable_setDisableYieldValue,$e=null,ye=null;function je(h){if(typeof He=="function"&&Ve(h),ye&&typeof ye.setStrictMode=="function")try{ye.setStrictMode($e,h)}catch{}}var Be=Math.clz32?Math.clz32:Me,Se=Math.log,Xe=Math.LN2;function Me(h){return h>>>=0,h===0?32:31-(Se(h)/Xe|0)|0}var tt=256,ke=262144,We=4194304;function ze(h){var g=h&42;if(g!==0)return g;switch(h&-h){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return h&261888;case 262144:case 524288:case 1048576:case 2097152:return h&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return h&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return h}}function W(h,g,w){var M=h.pendingLanes;if(M===0)return 0;var P=0,L=h.suspendedLanes,J=h.pingedLanes;h=h.warmLanes;var ve=M&134217727;return ve!==0?(M=ve&~L,M!==0?P=ze(M):(J&=ve,J!==0?P=ze(J):w||(w=ve&~h,w!==0&&(P=ze(w))))):(ve=M&~L,ve!==0?P=ze(ve):J!==0?P=ze(J):w||(w=M&~h,w!==0&&(P=ze(w)))),P===0?0:g!==0&&g!==P&&(g&L)===0&&(L=P&-P,w=g&-g,L>=w||L===32&&(w&4194048)!==0)?g:P}function De(h,g){return(h.pendingLanes&~(h.suspendedLanes&~h.pingedLanes)&g)===0}function Ye(h,g){switch(h){case 1:case 2:case 4:case 8:case 64:return g+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return g+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function xt(){var h=We;return We<<=1,(We&62914560)===0&&(We=4194304),h}function ft(h){for(var g=[],w=0;31>w;w++)g.push(h);return g}function Bt(h,g){h.pendingLanes|=g,g!==268435456&&(h.suspendedLanes=0,h.pingedLanes=0,h.warmLanes=0)}function Lt(h,g,w,M,P,L){var J=h.pendingLanes;h.pendingLanes=w,h.suspendedLanes=0,h.pingedLanes=0,h.warmLanes=0,h.expiredLanes&=w,h.entangledLanes&=w,h.errorRecoveryDisabledLanes&=w,h.shellSuspendCounter=0;var ve=h.entanglements,Ue=h.expirationTimes,it=h.hiddenUpdates;for(w=J&~w;0"u")return null;try{return h.activeElement||h.body}catch{return h.body}}var tr=/[\n"\\]/g;function jn(h){return h.replace(tr,function(g){return"\\"+g.charCodeAt(0).toString(16)+" "})}function ii(h,g,w,M,P,L,J,ve){h.name="",J!=null&&typeof J!="function"&&typeof J!="symbol"&&typeof J!="boolean"?h.type=J:h.removeAttribute("type"),g!=null?J==="number"?(g===0&&h.value===""||h.value!=g)&&(h.value=""+cn(g)):h.value!==""+cn(g)&&(h.value=""+cn(g)):J!=="submit"&&J!=="reset"||h.removeAttribute("value"),g!=null?lr(h,J,cn(g)):w!=null?lr(h,J,cn(w)):M!=null&&h.removeAttribute("value"),P==null&&L!=null&&(h.defaultChecked=!!L),P!=null&&(h.checked=P&&typeof P!="function"&&typeof P!="symbol"),ve!=null&&typeof ve!="function"&&typeof ve!="symbol"&&typeof ve!="boolean"?h.name=""+cn(ve):h.removeAttribute("name")}function nr(h,g,w,M,P,L,J,ve){if(L!=null&&typeof L!="function"&&typeof L!="symbol"&&typeof L!="boolean"&&(h.type=L),g!=null||w!=null){if(!(L!=="submit"&&L!=="reset"||g!=null)){sn(h);return}w=w!=null?""+cn(w):"",g=g!=null?""+cn(g):w,ve||g===h.value||(h.value=g),h.defaultValue=g}M=M??P,M=typeof M!="function"&&typeof M!="symbol"&&!!M,h.checked=ve?h.checked:!!M,h.defaultChecked=!!M,J!=null&&typeof J!="function"&&typeof J!="symbol"&&typeof J!="boolean"&&(h.name=J),sn(h)}function lr(h,g,w){g==="number"&&Yt(h.ownerDocument)===h||h.defaultValue===""+w||(h.defaultValue=""+w)}function et(h,g,w,M){if(h=h.options,g){g={};for(var P=0;P"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),Ux=!1;if(Hr)try{var $h={};Object.defineProperty($h,"passive",{get:function(){Ux=!0}}),window.addEventListener("test",$h,$h),window.removeEventListener("test",$h,$h)}catch{Ux=!1}var $l=null,zx=null,Dm=null;function Rm(){if(Dm)return Dm;var h,g=zx,w=g.length,M,P="value"in $l?$l.value:$l.textContent,L=P.length;for(h=0;h=Vx),fF=" ",mF=!1;function pF(h,g){switch(h){case"keyup":return Qre.indexOf(g.keyCode)!==-1;case"keydown":return g.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function gF(h){return h=h.detail,typeof h=="object"&&"data"in h?h.data:null}var Um=!1;function Jre(h,g){switch(h){case"compositionend":return gF(g);case"keypress":return g.which!==32?null:(mF=!0,fF);case"textInput":return h=g.data,h===fF&&mF?null:h;default:return null}}function eie(h,g){if(Um)return h==="compositionend"||!q2&&pF(h,g)?(h=Rm(),Dm=zx=$l=null,Um=!1,h):null;switch(h){case"paste":return null;case"keypress":if(!(g.ctrlKey||g.altKey||g.metaKey)||g.ctrlKey&&g.altKey){if(g.char&&1=g)return{node:w,offset:g-h};h=M}e:{for(;w;){if(w.nextSibling){w=w.nextSibling;break e}w=w.parentNode}w=void 0}w=MF(w)}}function kF(h,g){return h&&g?h===g?!0:h&&h.nodeType===3?!1:g&&g.nodeType===3?kF(h,g.parentNode):"contains"in h?h.contains(g):h.compareDocumentPosition?!!(h.compareDocumentPosition(g)&16):!1:!1}function EF(h){h=h!=null&&h.ownerDocument!=null&&h.ownerDocument.defaultView!=null?h.ownerDocument.defaultView:window;for(var g=Yt(h.document);g instanceof h.HTMLIFrameElement;){try{var w=typeof g.contentWindow.location.href=="string"}catch{w=!1}if(w)h=g.contentWindow;else break;g=Yt(h.document)}return g}function X2(h){var g=h&&h.nodeName&&h.nodeName.toLowerCase();return g&&(g==="input"&&(h.type==="text"||h.type==="search"||h.type==="tel"||h.type==="url"||h.type==="password")||g==="textarea"||h.contentEditable==="true")}var lie=Hr&&"documentMode"in document&&11>=document.documentMode,zm=null,Y2=null,Kx=null,Q2=!1;function TF(h,g,w){var M=w.window===w?w.document:w.nodeType===9?w:w.ownerDocument;Q2||zm==null||zm!==Yt(M)||(M=zm,"selectionStart"in M&&X2(M)?M={start:M.selectionStart,end:M.selectionEnd}:(M=(M.ownerDocument&&M.ownerDocument.defaultView||window).getSelection(),M={anchorNode:M.anchorNode,anchorOffset:M.anchorOffset,focusNode:M.focusNode,focusOffset:M.focusOffset}),Kx&&Wx(Kx,M)||(Kx=M,M=mw(Y2,"onSelect"),0>=J,P-=J,Gl=1<<32-Be(g)+P|w<Mn?(qn=Wt,Wt=null):qn=Wt.sibling;var ar=ct(Je,Wt,rt[Mn],bt);if(ar===null){Wt===null&&(Wt=qn);break}h&&Wt&&ar.alternate===null&&g(Je,Wt),Ge=L(ar,Ge,Mn),ir===null?Kt=ar:ir.sibling=ar,ir=ar,Wt=qn}if(Mn===rt.length)return w(Je,Wt),Xn&&Pc(Je,Mn),Kt;if(Wt===null){for(;MnMn?(qn=Wt,Wt=null):qn=Wt.sibling;var wd=ct(Je,Wt,ar.value,bt);if(wd===null){Wt===null&&(Wt=qn);break}h&&Wt&&wd.alternate===null&&g(Je,Wt),Ge=L(wd,Ge,Mn),ir===null?Kt=wd:ir.sibling=wd,ir=wd,Wt=qn}if(ar.done)return w(Je,Wt),Xn&&Pc(Je,Mn),Kt;if(Wt===null){for(;!ar.done;Mn++,ar=rt.next())ar=vt(Je,ar.value,bt),ar!==null&&(Ge=L(ar,Ge,Mn),ir===null?Kt=ar:ir.sibling=ar,ir=ar);return Xn&&Pc(Je,Mn),Kt}for(Wt=M(Wt);!ar.done;Mn++,ar=rt.next())ar=pt(Wt,Je,Mn,ar.value,bt),ar!==null&&(h&&ar.alternate!==null&&Wt.delete(ar.key===null?Mn:ar.key),Ge=L(ar,Ge,Mn),ir===null?Kt=ar:ir.sibling=ar,ir=ar);return h&&Wt.forEach(function(Tae){return g(Je,Tae)}),Xn&&Pc(Je,Mn),Kt}function _r(Je,Ge,rt,bt){if(typeof rt=="object"&&rt!==null&&rt.type===b&&rt.key===null&&(rt=rt.props.children),typeof rt=="object"&&rt!==null){switch(rt.$$typeof){case m:e:{for(var Kt=rt.key;Ge!==null;){if(Ge.key===Kt){if(Kt=rt.type,Kt===b){if(Ge.tag===7){w(Je,Ge.sibling),bt=P(Ge,rt.props.children),bt.return=Je,Je=bt;break e}}else if(Ge.elementType===Kt||typeof Kt=="object"&&Kt!==null&&Kt.$$typeof===R&&Jh(Kt)===Ge.type){w(Je,Ge.sibling),bt=P(Ge,rt.props),eb(bt,rt),bt.return=Je,Je=bt;break e}w(Je,Ge);break}else g(Je,Ge);Ge=Ge.sibling}rt.type===b?(bt=Kh(rt.props.children,Je.mode,bt,rt.key),bt.return=Je,Je=bt):(bt=jv(rt.type,rt.key,rt.props,null,Je.mode,bt),eb(bt,rt),bt.return=Je,Je=bt)}return J(Je);case x:e:{for(Kt=rt.key;Ge!==null;){if(Ge.key===Kt)if(Ge.tag===4&&Ge.stateNode.containerInfo===rt.containerInfo&&Ge.stateNode.implementation===rt.implementation){w(Je,Ge.sibling),bt=P(Ge,rt.children||[]),bt.return=Je,Je=bt;break e}else{w(Je,Ge);break}else g(Je,Ge);Ge=Ge.sibling}bt=ik(rt,Je.mode,bt),bt.return=Je,Je=bt}return J(Je);case R:return rt=Jh(rt),_r(Je,Ge,rt,bt)}if(H(rt))return Vt(Je,Ge,rt,bt);if(F(rt)){if(Kt=F(rt),typeof Kt!="function")throw Error(r(150));return rt=Kt.call(rt),nn(Je,Ge,rt,bt)}if(typeof rt.then=="function")return _r(Je,Ge,Iv(rt),bt);if(rt.$$typeof===N)return _r(Je,Ge,Rv(Je,rt),bt);Uv(Je,rt)}return typeof rt=="string"&&rt!==""||typeof rt=="number"||typeof rt=="bigint"?(rt=""+rt,Ge!==null&&Ge.tag===6?(w(Je,Ge.sibling),bt=P(Ge,rt),bt.return=Je,Je=bt):(w(Je,Ge),bt=rk(rt,Je.mode,bt),bt.return=Je,Je=bt),J(Je)):w(Je,Ge)}return function(Je,Ge,rt,bt){try{Jx=0;var Kt=_r(Je,Ge,rt,bt);return Qm=null,Kt}catch(Wt){if(Wt===Ym||Wt===Lv)throw Wt;var ir=Ys(29,Wt,null,Je.mode);return ir.lanes=bt,ir.return=Je,ir}finally{}}}var tf=QF(!0),ZF=QF(!1),id=!1;function gk(h){h.updateQueue={baseState:h.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function xk(h,g){h=h.updateQueue,g.updateQueue===h&&(g.updateQueue={baseState:h.baseState,firstBaseUpdate:h.firstBaseUpdate,lastBaseUpdate:h.lastBaseUpdate,shared:h.shared,callbacks:null})}function ad(h){return{lane:h,tag:0,payload:null,callback:null,next:null}}function sd(h,g,w){var M=h.updateQueue;if(M===null)return null;if(M=M.shared,(cr&2)!==0){var P=M.pending;return P===null?g.next=g:(g.next=P.next,P.next=g),M.pending=g,g=Cv(h),OF(h,null,w),g}return Av(h,M,g,w),Cv(h)}function tb(h,g,w){if(g=g.updateQueue,g!==null&&(g=g.shared,(w&4194048)!==0)){var M=g.lanes;M&=h.pendingLanes,w|=M,g.lanes=w,Jt(h,w)}}function bk(h,g){var w=h.updateQueue,M=h.alternate;if(M!==null&&(M=M.updateQueue,w===M)){var P=null,L=null;if(w=w.firstBaseUpdate,w!==null){do{var J={lane:w.lane,tag:w.tag,payload:w.payload,callback:null,next:null};L===null?P=L=J:L=L.next=J,w=w.next}while(w!==null);L===null?P=L=g:L=L.next=g}else P=L=g;w={baseState:M.baseState,firstBaseUpdate:P,lastBaseUpdate:L,shared:M.shared,callbacks:M.callbacks},h.updateQueue=w;return}h=w.lastBaseUpdate,h===null?w.firstBaseUpdate=g:h.next=g,w.lastBaseUpdate=g}var yk=!1;function nb(){if(yk){var h=Xm;if(h!==null)throw h}}function rb(h,g,w,M){yk=!1;var P=h.updateQueue;id=!1;var L=P.firstBaseUpdate,J=P.lastBaseUpdate,ve=P.shared.pending;if(ve!==null){P.shared.pending=null;var Ue=ve,it=Ue.next;Ue.next=null,J===null?L=it:J.next=it,J=Ue;var gt=h.alternate;gt!==null&&(gt=gt.updateQueue,ve=gt.lastBaseUpdate,ve!==J&&(ve===null?gt.firstBaseUpdate=it:ve.next=it,gt.lastBaseUpdate=Ue))}if(L!==null){var vt=P.baseState;J=0,gt=it=Ue=null,ve=L;do{var ct=ve.lane&-536870913,pt=ct!==ve.lane;if(pt?(Gn&ct)===ct:(M&ct)===ct){ct!==0&&ct===Km&&(yk=!0),gt!==null&&(gt=gt.next={lane:0,tag:ve.tag,payload:ve.payload,callback:null,next:null});e:{var Vt=h,nn=ve;ct=g;var _r=w;switch(nn.tag){case 1:if(Vt=nn.payload,typeof Vt=="function"){vt=Vt.call(_r,vt,ct);break e}vt=Vt;break e;case 3:Vt.flags=Vt.flags&-65537|128;case 0:if(Vt=nn.payload,ct=typeof Vt=="function"?Vt.call(_r,vt,ct):Vt,ct==null)break e;vt=f({},vt,ct);break e;case 2:id=!0}}ct=ve.callback,ct!==null&&(h.flags|=64,pt&&(h.flags|=8192),pt=P.callbacks,pt===null?P.callbacks=[ct]:pt.push(ct))}else pt={lane:ct,tag:ve.tag,payload:ve.payload,callback:ve.callback,next:null},gt===null?(it=gt=pt,Ue=vt):gt=gt.next=pt,J|=ct;if(ve=ve.next,ve===null){if(ve=P.shared.pending,ve===null)break;pt=ve,ve=pt.next,pt.next=null,P.lastBaseUpdate=pt,P.shared.pending=null}}while(!0);gt===null&&(Ue=vt),P.baseState=Ue,P.firstBaseUpdate=it,P.lastBaseUpdate=gt,L===null&&(P.shared.lanes=0),dd|=J,h.lanes=J,h.memoizedState=vt}}function JF(h,g){if(typeof h!="function")throw Error(r(191,h));h.call(g)}function eI(h,g){var w=h.callbacks;if(w!==null)for(h.callbacks=null,h=0;hL?L:8;var J=K.T,ve={};K.T=ve,Ik(h,!1,g,w);try{var Ue=P(),it=K.S;if(it!==null&&it(ve,Ue),Ue!==null&&typeof Ue=="object"&&typeof Ue.then=="function"){var gt=xie(Ue,M);sb(h,g,gt,to(h))}else sb(h,g,M,to(h))}catch(vt){sb(h,g,{then:function(){},status:"rejected",reason:vt},to())}finally{V.p=L,J!==null&&ve.types!==null&&(J.types=ve.types),K.T=J}}function Sie(){}function Lk(h,g,w,M){if(h.tag!==5)throw Error(r(476));var P=PI(h).queue;jI(h,P,g,Q,w===null?Sie:function(){return DI(h),w(M)})}function PI(h){var g=h.memoizedState;if(g!==null)return g;g={memoizedState:Q,baseState:Q,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Lc,lastRenderedState:Q},next:null};var w={};return g.next={memoizedState:w,baseState:w,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Lc,lastRenderedState:w},next:null},h.memoizedState=g,h=h.alternate,h!==null&&(h.memoizedState=g),g}function DI(h){var g=PI(h);g.next===null&&(g=h.alternate.memoizedState),sb(h,g.next.queue,{},to())}function Fk(){return Na(Sb)}function RI(){return Ni().memoizedState}function OI(){return Ni().memoizedState}function Mie(h){for(var g=h.return;g!==null;){switch(g.tag){case 24:case 3:var w=to();h=ad(w);var M=sd(g,h,w);M!==null&&(As(M,g,w),tb(M,g,w)),g={cache:hk()},h.payload=g;return}g=g.return}}function Nie(h,g,w){var M=to();w={lane:M,revertLane:0,gesture:null,action:w,hasEagerState:!1,eagerState:null,next:null},Xv(h)?FI(g,w):(w=tk(h,g,w,M),w!==null&&(As(w,h,M),II(w,g,M)))}function LI(h,g,w){var M=to();sb(h,g,w,M)}function sb(h,g,w,M){var P={lane:M,revertLane:0,gesture:null,action:w,hasEagerState:!1,eagerState:null,next:null};if(Xv(h))FI(g,P);else{var L=h.alternate;if(h.lanes===0&&(L===null||L.lanes===0)&&(L=g.lastRenderedReducer,L!==null))try{var J=g.lastRenderedState,ve=L(J,w);if(P.hasEagerState=!0,P.eagerState=ve,Xs(ve,J))return Av(h,g,P,0),Pr===null&&Tv(),!1}catch{}finally{}if(w=tk(h,g,P,M),w!==null)return As(w,h,M),II(w,g,M),!0}return!1}function Ik(h,g,w,M){if(M={lane:2,revertLane:gE(),gesture:null,action:M,hasEagerState:!1,eagerState:null,next:null},Xv(h)){if(g)throw Error(r(479))}else g=tk(h,w,M,2),g!==null&&As(g,h,2)}function Xv(h){var g=h.alternate;return h===_n||g!==null&&g===_n}function FI(h,g){Jm=Hv=!0;var w=h.pending;w===null?g.next=g:(g.next=w.next,w.next=g),h.pending=g}function II(h,g,w){if((w&4194048)!==0){var M=g.lanes;M&=h.pendingLanes,w|=M,g.lanes=w,Jt(h,w)}}var ob={readContext:Na,use:Gv,useCallback:di,useContext:di,useEffect:di,useImperativeHandle:di,useLayoutEffect:di,useInsertionEffect:di,useMemo:di,useReducer:di,useRef:di,useState:di,useDebugValue:di,useDeferredValue:di,useTransition:di,useSyncExternalStore:di,useId:di,useHostTransitionStatus:di,useFormState:di,useActionState:di,useOptimistic:di,useMemoCache:di,useCacheRefresh:di};ob.useEffectEvent=di;var UI={readContext:Na,use:Gv,useCallback:function(h,g){return ss().memoizedState=[h,g===void 0?null:g],h},useContext:Na,useEffect:_I,useImperativeHandle:function(h,g,w){w=w!=null?w.concat([h]):null,Wv(4194308,4,kI.bind(null,g,h),w)},useLayoutEffect:function(h,g){return Wv(4194308,4,h,g)},useInsertionEffect:function(h,g){Wv(4,2,h,g)},useMemo:function(h,g){var w=ss();g=g===void 0?null:g;var M=h();if(nf){je(!0);try{h()}finally{je(!1)}}return w.memoizedState=[M,g],M},useReducer:function(h,g,w){var M=ss();if(w!==void 0){var P=w(g);if(nf){je(!0);try{w(g)}finally{je(!1)}}}else P=g;return M.memoizedState=M.baseState=P,h={pending:null,lanes:0,dispatch:null,lastRenderedReducer:h,lastRenderedState:P},M.queue=h,h=h.dispatch=Nie.bind(null,_n,h),[M.memoizedState,h]},useRef:function(h){var g=ss();return h={current:h},g.memoizedState=h},useState:function(h){h=jk(h);var g=h.queue,w=LI.bind(null,_n,g);return g.dispatch=w,[h.memoizedState,w]},useDebugValue:Rk,useDeferredValue:function(h,g){var w=ss();return Ok(w,h,g)},useTransition:function(){var h=jk(!1);return h=jI.bind(null,_n,h.queue,!0,!1),ss().memoizedState=h,[!1,h]},useSyncExternalStore:function(h,g,w){var M=_n,P=ss();if(Xn){if(w===void 0)throw Error(r(407));w=w()}else{if(w=g(),Pr===null)throw Error(r(349));(Gn&127)!==0||sI(M,g,w)}P.memoizedState=w;var L={value:w,getSnapshot:g};return P.queue=L,_I(lI.bind(null,M,L,h),[h]),M.flags|=2048,tp(9,{destroy:void 0},oI.bind(null,M,L,w,g),null),w},useId:function(){var h=ss(),g=Pr.identifierPrefix;if(Xn){var w=ql,M=Gl;w=(M&~(1<<32-Be(M)-1)).toString(32)+w,g="_"+g+"R_"+w,w=$v++,0<\/script>",L=L.removeChild(L.firstChild);break;case"select":L=typeof M.is=="string"?J.createElement("select",{is:M.is}):J.createElement("select"),M.multiple?L.multiple=!0:M.size&&(L.size=M.size);break;default:L=typeof M.is=="string"?J.createElement(P,{is:M.is}):J.createElement(P)}}L[Kn]=g,L[bn]=M;e:for(J=g.child;J!==null;){if(J.tag===5||J.tag===6)L.appendChild(J.stateNode);else if(J.tag!==4&&J.tag!==27&&J.child!==null){J.child.return=J,J=J.child;continue}if(J===g)break e;for(;J.sibling===null;){if(J.return===null||J.return===g)break e;J=J.return}J.sibling.return=J.return,J=J.sibling}g.stateNode=L;e:switch(Ea(L,P,M),P){case"button":case"input":case"select":case"textarea":M=!!M.autoFocus;break e;case"img":M=!0;break e;default:M=!1}M&&Ic(g)}}return Vr(g),Zk(g,g.type,h===null?null:h.memoizedProps,g.pendingProps,w),null;case 6:if(h&&g.stateNode!=null)h.memoizedProps!==M&&Ic(g);else{if(typeof M!="string"&&g.stateNode===null)throw Error(r(166));if(h=xe.current,qm(g)){if(h=g.stateNode,w=g.memoizedProps,M=null,P=Ma,P!==null)switch(P.tag){case 27:case 5:M=P.memoizedProps}h[Kn]=g,h=!!(h.nodeValue===w||M!==null&&M.suppressHydrationWarning===!0||iU(h.nodeValue,w)),h||nd(g,!0)}else h=pw(h).createTextNode(M),h[Kn]=g,g.stateNode=h}return Vr(g),null;case 31:if(w=g.memoizedState,h===null||h.memoizedState!==null){if(M=qm(g),w!==null){if(h===null){if(!M)throw Error(r(318));if(h=g.memoizedState,h=h!==null?h.dehydrated:null,!h)throw Error(r(557));h[Kn]=g}else Xh(),(g.flags&128)===0&&(g.memoizedState=null),g.flags|=4;Vr(g),h=!1}else w=lk(),h!==null&&h.memoizedState!==null&&(h.memoizedState.hydrationErrors=w),h=!0;if(!h)return g.flags&256?(Zs(g),g):(Zs(g),null);if((g.flags&128)!==0)throw Error(r(558))}return Vr(g),null;case 13:if(M=g.memoizedState,h===null||h.memoizedState!==null&&h.memoizedState.dehydrated!==null){if(P=qm(g),M!==null&&M.dehydrated!==null){if(h===null){if(!P)throw Error(r(318));if(P=g.memoizedState,P=P!==null?P.dehydrated:null,!P)throw Error(r(317));P[Kn]=g}else Xh(),(g.flags&128)===0&&(g.memoizedState=null),g.flags|=4;Vr(g),P=!1}else P=lk(),h!==null&&h.memoizedState!==null&&(h.memoizedState.hydrationErrors=P),P=!0;if(!P)return g.flags&256?(Zs(g),g):(Zs(g),null)}return Zs(g),(g.flags&128)!==0?(g.lanes=w,g):(w=M!==null,h=h!==null&&h.memoizedState!==null,w&&(M=g.child,P=null,M.alternate!==null&&M.alternate.memoizedState!==null&&M.alternate.memoizedState.cachePool!==null&&(P=M.alternate.memoizedState.cachePool.pool),L=null,M.memoizedState!==null&&M.memoizedState.cachePool!==null&&(L=M.memoizedState.cachePool.pool),L!==P&&(M.flags|=2048)),w!==h&&w&&(g.child.flags|=8192),ew(g,g.updateQueue),Vr(g),null);case 4:return ie(),h===null&&vE(g.stateNode.containerInfo),Vr(g),null;case 10:return Rc(g.type),Vr(g),null;case 19:if(X(Mi),M=g.memoizedState,M===null)return Vr(g),null;if(P=(g.flags&128)!==0,L=M.rendering,L===null)if(P)cb(M,!1);else{if(hi!==0||h!==null&&(h.flags&128)!==0)for(h=g.child;h!==null;){if(L=Bv(h),L!==null){for(g.flags|=128,cb(M,!1),h=L.updateQueue,g.updateQueue=h,ew(g,h),g.subtreeFlags=0,h=w,w=g.child;w!==null;)LF(w,h),w=w.sibling;return ne(Mi,Mi.current&1|2),Xn&&Pc(g,M.treeForkCount),g.child}h=h.sibling}M.tail!==null&&O()>aw&&(g.flags|=128,P=!0,cb(M,!1),g.lanes=4194304)}else{if(!P)if(h=Bv(L),h!==null){if(g.flags|=128,P=!0,h=h.updateQueue,g.updateQueue=h,ew(g,h),cb(M,!0),M.tail===null&&M.tailMode==="hidden"&&!L.alternate&&!Xn)return Vr(g),null}else 2*O()-M.renderingStartTime>aw&&w!==536870912&&(g.flags|=128,P=!0,cb(M,!1),g.lanes=4194304);M.isBackwards?(L.sibling=g.child,g.child=L):(h=M.last,h!==null?h.sibling=L:g.child=L,M.last=L)}return M.tail!==null?(h=M.tail,M.rendering=h,M.tail=h.sibling,M.renderingStartTime=O(),h.sibling=null,w=Mi.current,ne(Mi,P?w&1|2:w&1),Xn&&Pc(g,M.treeForkCount),h):(Vr(g),null);case 22:case 23:return Zs(g),wk(),M=g.memoizedState!==null,h!==null?h.memoizedState!==null!==M&&(g.flags|=8192):M&&(g.flags|=8192),M?(w&536870912)!==0&&(g.flags&128)===0&&(Vr(g),g.subtreeFlags&6&&(g.flags|=8192)):Vr(g),w=g.updateQueue,w!==null&&ew(g,w.retryQueue),w=null,h!==null&&h.memoizedState!==null&&h.memoizedState.cachePool!==null&&(w=h.memoizedState.cachePool.pool),M=null,g.memoizedState!==null&&g.memoizedState.cachePool!==null&&(M=g.memoizedState.cachePool.pool),M!==w&&(g.flags|=2048),h!==null&&X(Zh),null;case 24:return w=null,h!==null&&(w=h.memoizedState.cache),g.memoizedState.cache!==w&&(g.flags|=2048),Rc(Ci),Vr(g),null;case 25:return null;case 30:return null}throw Error(r(156,g.tag))}function Cie(h,g){switch(sk(g),g.tag){case 1:return h=g.flags,h&65536?(g.flags=h&-65537|128,g):null;case 3:return Rc(Ci),ie(),h=g.flags,(h&65536)!==0&&(h&128)===0?(g.flags=h&-65537|128,g):null;case 26:case 27:case 5:return Oe(g),null;case 31:if(g.memoizedState!==null){if(Zs(g),g.alternate===null)throw Error(r(340));Xh()}return h=g.flags,h&65536?(g.flags=h&-65537|128,g):null;case 13:if(Zs(g),h=g.memoizedState,h!==null&&h.dehydrated!==null){if(g.alternate===null)throw Error(r(340));Xh()}return h=g.flags,h&65536?(g.flags=h&-65537|128,g):null;case 19:return X(Mi),null;case 4:return ie(),null;case 10:return Rc(g.type),null;case 22:case 23:return Zs(g),wk(),h!==null&&X(Zh),h=g.flags,h&65536?(g.flags=h&-65537|128,g):null;case 24:return Rc(Ci),null;case 25:return null;default:return null}}function c5(h,g){switch(sk(g),g.tag){case 3:Rc(Ci),ie();break;case 26:case 27:case 5:Oe(g);break;case 4:ie();break;case 31:g.memoizedState!==null&&Zs(g);break;case 13:Zs(g);break;case 19:X(Mi);break;case 10:Rc(g.type);break;case 22:case 23:Zs(g),wk(),h!==null&&X(Zh);break;case 24:Rc(Ci)}}function ub(h,g){try{var w=g.updateQueue,M=w!==null?w.lastEffect:null;if(M!==null){var P=M.next;w=P;do{if((w.tag&h)===h){M=void 0;var L=w.create,J=w.inst;M=L(),J.destroy=M}w=w.next}while(w!==P)}}catch(ve){pr(g,g.return,ve)}}function cd(h,g,w){try{var M=g.updateQueue,P=M!==null?M.lastEffect:null;if(P!==null){var L=P.next;M=L;do{if((M.tag&h)===h){var J=M.inst,ve=J.destroy;if(ve!==void 0){J.destroy=void 0,P=g;var Ue=w,it=ve;try{it()}catch(gt){pr(P,Ue,gt)}}}M=M.next}while(M!==L)}}catch(gt){pr(g,g.return,gt)}}function u5(h){var g=h.updateQueue;if(g!==null){var w=h.stateNode;try{eI(g,w)}catch(M){pr(h,h.return,M)}}}function d5(h,g,w){w.props=rf(h.type,h.memoizedProps),w.state=h.memoizedState;try{w.componentWillUnmount()}catch(M){pr(h,g,M)}}function db(h,g){try{var w=h.ref;if(w!==null){switch(h.tag){case 26:case 27:case 5:var M=h.stateNode;break;case 30:M=h.stateNode;break;default:M=h.stateNode}typeof w=="function"?h.refCleanup=w(M):w.current=M}}catch(P){pr(h,g,P)}}function Wl(h,g){var w=h.ref,M=h.refCleanup;if(w!==null)if(typeof M=="function")try{M()}catch(P){pr(h,g,P)}finally{h.refCleanup=null,h=h.alternate,h!=null&&(h.refCleanup=null)}else if(typeof w=="function")try{w(null)}catch(P){pr(h,g,P)}else w.current=null}function h5(h){var g=h.type,w=h.memoizedProps,M=h.stateNode;try{e:switch(g){case"button":case"input":case"select":case"textarea":w.autoFocus&&M.focus();break e;case"img":w.src?M.src=w.src:w.srcSet&&(M.srcset=w.srcSet)}}catch(P){pr(h,h.return,P)}}function Jk(h,g,w){try{var M=h.stateNode;Zie(M,h.type,w,g),M[bn]=g}catch(P){pr(h,h.return,P)}}function f5(h){return h.tag===5||h.tag===3||h.tag===26||h.tag===27&&gd(h.type)||h.tag===4}function eE(h){e:for(;;){for(;h.sibling===null;){if(h.return===null||f5(h.return))return null;h=h.return}for(h.sibling.return=h.return,h=h.sibling;h.tag!==5&&h.tag!==6&&h.tag!==18;){if(h.tag===27&&gd(h.type)||h.flags&2||h.child===null||h.tag===4)continue e;h.child.return=h,h=h.child}if(!(h.flags&2))return h.stateNode}}function tE(h,g,w){var M=h.tag;if(M===5||M===6)h=h.stateNode,g?(w.nodeType===9?w.body:w.nodeName==="HTML"?w.ownerDocument.body:w).insertBefore(h,g):(g=w.nodeType===9?w.body:w.nodeName==="HTML"?w.ownerDocument.body:w,g.appendChild(h),w=w._reactRootContainer,w!=null||g.onclick!==null||(g.onclick=_i));else if(M!==4&&(M===27&&gd(h.type)&&(w=h.stateNode,g=null),h=h.child,h!==null))for(tE(h,g,w),h=h.sibling;h!==null;)tE(h,g,w),h=h.sibling}function tw(h,g,w){var M=h.tag;if(M===5||M===6)h=h.stateNode,g?w.insertBefore(h,g):w.appendChild(h);else if(M!==4&&(M===27&&gd(h.type)&&(w=h.stateNode),h=h.child,h!==null))for(tw(h,g,w),h=h.sibling;h!==null;)tw(h,g,w),h=h.sibling}function m5(h){var g=h.stateNode,w=h.memoizedProps;try{for(var M=h.type,P=g.attributes;P.length;)g.removeAttributeNode(P[0]);Ea(g,M,w),g[Kn]=h,g[bn]=w}catch(L){pr(h,h.return,L)}}var Uc=!1,Di=!1,nE=!1,p5=typeof WeakSet=="function"?WeakSet:Set,ua=null;function jie(h,g){if(h=h.containerInfo,SE=_w,h=EF(h),X2(h)){if("selectionStart"in h)var w={start:h.selectionStart,end:h.selectionEnd};else e:{w=(w=h.ownerDocument)&&w.defaultView||window;var M=w.getSelection&&w.getSelection();if(M&&M.rangeCount!==0){w=M.anchorNode;var P=M.anchorOffset,L=M.focusNode;M=M.focusOffset;try{w.nodeType,L.nodeType}catch{w=null;break e}var J=0,ve=-1,Ue=-1,it=0,gt=0,vt=h,ct=null;t:for(;;){for(var pt;vt!==w||P!==0&&vt.nodeType!==3||(ve=J+P),vt!==L||M!==0&&vt.nodeType!==3||(Ue=J+M),vt.nodeType===3&&(J+=vt.nodeValue.length),(pt=vt.firstChild)!==null;)ct=vt,vt=pt;for(;;){if(vt===h)break t;if(ct===w&&++it===P&&(ve=J),ct===L&&++gt===M&&(Ue=J),(pt=vt.nextSibling)!==null)break;vt=ct,ct=vt.parentNode}vt=pt}w=ve===-1||Ue===-1?null:{start:ve,end:Ue}}else w=null}w=w||{start:0,end:0}}else w=null;for(ME={focusedElem:h,selectionRange:w},_w=!1,ua=g;ua!==null;)if(g=ua,h=g.child,(g.subtreeFlags&1028)!==0&&h!==null)h.return=g,ua=h;else for(;ua!==null;){switch(g=ua,L=g.alternate,h=g.flags,g.tag){case 0:if((h&4)!==0&&(h=g.updateQueue,h=h!==null?h.events:null,h!==null))for(w=0;w title"))),Ea(L,M,w),L[Kn]=h,Le(L),M=L;break e;case"link":var J=wU("link","href",P).get(M+(w.href||""));if(J){for(var ve=0;ve_r&&(J=_r,_r=nn,nn=J);var Je=NF(ve,nn),Ge=NF(ve,_r);if(Je&&Ge&&(pt.rangeCount!==1||pt.anchorNode!==Je.node||pt.anchorOffset!==Je.offset||pt.focusNode!==Ge.node||pt.focusOffset!==Ge.offset)){var rt=vt.createRange();rt.setStart(Je.node,Je.offset),pt.removeAllRanges(),nn>_r?(pt.addRange(rt),pt.extend(Ge.node,Ge.offset)):(rt.setEnd(Ge.node,Ge.offset),pt.addRange(rt))}}}}for(vt=[],pt=ve;pt=pt.parentNode;)pt.nodeType===1&&vt.push({element:pt,left:pt.scrollLeft,top:pt.scrollTop});for(typeof ve.focus=="function"&&ve.focus(),ve=0;vew?32:w,K.T=null,w=cE,cE=null;var L=fd,J=Vc;if(qi=0,sp=fd=null,Vc=0,(cr&6)!==0)throw Error(r(331));var ve=cr;if(cr|=4,k5(L.current),S5(L,L.current,J,w),cr=ve,xb(0,!1),ye&&typeof ye.onPostCommitFiberRoot=="function")try{ye.onPostCommitFiberRoot($e,L)}catch{}return!0}finally{V.p=P,K.T=M,V5(h,g)}}function q5(h,g,w){g=Eo(w,g),g=Hk(h.stateNode,g,2),h=sd(h,g,2),h!==null&&(Bt(h,2),Kl(h))}function pr(h,g,w){if(h.tag===3)q5(h,h,w);else for(;g!==null;){if(g.tag===3){q5(g,h,w);break}else if(g.tag===1){var M=g.stateNode;if(typeof g.type.getDerivedStateFromError=="function"||typeof M.componentDidCatch=="function"&&(hd===null||!hd.has(M))){h=Eo(w,h),w=WI(2),M=sd(g,w,2),M!==null&&(KI(w,M,g,h),Bt(M,2),Kl(M));break}}g=g.return}}function fE(h,g,w){var M=h.pingCache;if(M===null){M=h.pingCache=new Rie;var P=new Set;M.set(g,P)}else P=M.get(g),P===void 0&&(P=new Set,M.set(g,P));P.has(w)||(aE=!0,P.add(w),h=Uie.bind(null,h,g,w),g.then(h,h))}function Uie(h,g,w){var M=h.pingCache;M!==null&&M.delete(g),h.pingedLanes|=h.suspendedLanes&w,h.warmLanes&=~w,Pr===h&&(Gn&w)===w&&(hi===4||hi===3&&(Gn&62914560)===Gn&&300>O()-iw?(cr&2)===0&&op(h,0):sE|=w,ap===Gn&&(ap=0)),Kl(h)}function W5(h,g){g===0&&(g=xt()),h=Wh(h,g),h!==null&&(Bt(h,g),Kl(h))}function zie(h){var g=h.memoizedState,w=0;g!==null&&(w=g.retryLane),W5(h,w)}function Bie(h,g){var w=0;switch(h.tag){case 31:case 13:var M=h.stateNode,P=h.memoizedState;P!==null&&(w=P.retryLane);break;case 19:M=h.stateNode;break;case 22:M=h.stateNode._retryCache;break;default:throw Error(r(314))}M!==null&&M.delete(g),W5(h,w)}function Hie(h,g){return fe(h,g)}var dw=null,cp=null,mE=!1,hw=!1,pE=!1,pd=0;function Kl(h){h!==cp&&h.next===null&&(cp===null?dw=cp=h:cp=cp.next=h),hw=!0,mE||(mE=!0,Vie())}function xb(h,g){if(!pE&&hw){pE=!0;do for(var w=!1,M=dw;M!==null;){if(h!==0){var P=M.pendingLanes;if(P===0)var L=0;else{var J=M.suspendedLanes,ve=M.pingedLanes;L=(1<<31-Be(42|h)+1)-1,L&=P&~(J&~ve),L=L&201326741?L&201326741|1:L?L|2:0}L!==0&&(w=!0,Q5(M,L))}else L=Gn,L=W(M,M===Pr?L:0,M.cancelPendingCommit!==null||M.timeoutHandle!==-1),(L&3)===0||De(M,L)||(w=!0,Q5(M,L));M=M.next}while(w);pE=!1}}function $ie(){K5()}function K5(){hw=mE=!1;var h=0;pd!==0&&eae()&&(h=pd);for(var g=O(),w=null,M=dw;M!==null;){var P=M.next,L=X5(M,g);L===0?(M.next=null,w===null?dw=P:w.next=P,P===null&&(cp=w)):(w=M,(h!==0||(L&3)!==0)&&(hw=!0)),M=P}qi!==0&&qi!==5||xb(h),pd!==0&&(pd=0)}function X5(h,g){for(var w=h.suspendedLanes,M=h.pingedLanes,P=h.expirationTimes,L=h.pendingLanes&-62914561;0ve)break;var gt=Ue.transferSize,vt=Ue.initiatorType;gt&&aU(vt)&&(Ue=Ue.responseEnd,J+=gt*(Ue"u"?null:document;function xU(h,g,w){var M=up;if(M&&typeof g=="string"&&g){var P=jn(g);P='link[rel="'+h+'"][href="'+P+'"]',typeof w=="string"&&(P+='[crossorigin="'+w+'"]'),gU.has(P)||(gU.add(P),h={rel:h,crossOrigin:w,href:g},M.querySelector(P)===null&&(g=M.createElement("link"),Ea(g,"link",h),Le(g),M.head.appendChild(g)))}}function cae(h){Gc.D(h),xU("dns-prefetch",h,null)}function uae(h,g){Gc.C(h,g),xU("preconnect",h,g)}function dae(h,g,w){Gc.L(h,g,w);var M=up;if(M&&h&&g){var P='link[rel="preload"][as="'+jn(g)+'"]';g==="image"&&w&&w.imageSrcSet?(P+='[imagesrcset="'+jn(w.imageSrcSet)+'"]',typeof w.imageSizes=="string"&&(P+='[imagesizes="'+jn(w.imageSizes)+'"]')):P+='[href="'+jn(h)+'"]';var L=P;switch(g){case"style":L=dp(h);break;case"script":L=hp(h)}Do.has(L)||(h=f({rel:"preload",href:g==="image"&&w&&w.imageSrcSet?void 0:h,as:g},w),Do.set(L,h),M.querySelector(P)!==null||g==="style"&&M.querySelector(wb(L))||g==="script"&&M.querySelector(_b(L))||(g=M.createElement("link"),Ea(g,"link",h),Le(g),M.head.appendChild(g)))}}function hae(h,g){Gc.m(h,g);var w=up;if(w&&h){var M=g&&typeof g.as=="string"?g.as:"script",P='link[rel="modulepreload"][as="'+jn(M)+'"][href="'+jn(h)+'"]',L=P;switch(M){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":L=hp(h)}if(!Do.has(L)&&(h=f({rel:"modulepreload",href:h},g),Do.set(L,h),w.querySelector(P)===null)){switch(M){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(w.querySelector(_b(L)))return}M=w.createElement("link"),Ea(M,"link",h),Le(M),w.head.appendChild(M)}}}function fae(h,g,w){Gc.S(h,g,w);var M=up;if(M&&h){var P=Ie(M).hoistableStyles,L=dp(h);g=g||"default";var J=P.get(L);if(!J){var ve={loading:0,preload:null};if(J=M.querySelector(wb(L)))ve.loading=5;else{h=f({rel:"stylesheet",href:h,"data-precedence":g},w),(w=Do.get(L))&&jE(h,w);var Ue=J=M.createElement("link");Le(Ue),Ea(Ue,"link",h),Ue._p=new Promise(function(it,gt){Ue.onload=it,Ue.onerror=gt}),Ue.addEventListener("load",function(){ve.loading|=1}),Ue.addEventListener("error",function(){ve.loading|=2}),ve.loading|=4,xw(J,g,M)}J={type:"stylesheet",instance:J,count:1,state:ve},P.set(L,J)}}}function mae(h,g){Gc.X(h,g);var w=up;if(w&&h){var M=Ie(w).hoistableScripts,P=hp(h),L=M.get(P);L||(L=w.querySelector(_b(P)),L||(h=f({src:h,async:!0},g),(g=Do.get(P))&&PE(h,g),L=w.createElement("script"),Le(L),Ea(L,"link",h),w.head.appendChild(L)),L={type:"script",instance:L,count:1,state:null},M.set(P,L))}}function pae(h,g){Gc.M(h,g);var w=up;if(w&&h){var M=Ie(w).hoistableScripts,P=hp(h),L=M.get(P);L||(L=w.querySelector(_b(P)),L||(h=f({src:h,async:!0,type:"module"},g),(g=Do.get(P))&&PE(h,g),L=w.createElement("script"),Le(L),Ea(L,"link",h),w.head.appendChild(L)),L={type:"script",instance:L,count:1,state:null},M.set(P,L))}}function bU(h,g,w,M){var P=(P=xe.current)?gw(P):null;if(!P)throw Error(r(446));switch(h){case"meta":case"title":return null;case"style":return typeof w.precedence=="string"&&typeof w.href=="string"?(g=dp(w.href),w=Ie(P).hoistableStyles,M=w.get(g),M||(M={type:"style",instance:null,count:0,state:null},w.set(g,M)),M):{type:"void",instance:null,count:0,state:null};case"link":if(w.rel==="stylesheet"&&typeof w.href=="string"&&typeof w.precedence=="string"){h=dp(w.href);var L=Ie(P).hoistableStyles,J=L.get(h);if(J||(P=P.ownerDocument||P,J={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},L.set(h,J),(L=P.querySelector(wb(h)))&&!L._p&&(J.instance=L,J.state.loading=5),Do.has(h)||(w={rel:"preload",as:"style",href:w.href,crossOrigin:w.crossOrigin,integrity:w.integrity,media:w.media,hrefLang:w.hrefLang,referrerPolicy:w.referrerPolicy},Do.set(h,w),L||gae(P,h,w,J.state))),g&&M===null)throw Error(r(528,""));return J}if(g&&M!==null)throw Error(r(529,""));return null;case"script":return g=w.async,w=w.src,typeof w=="string"&&g&&typeof g!="function"&&typeof g!="symbol"?(g=hp(w),w=Ie(P).hoistableScripts,M=w.get(g),M||(M={type:"script",instance:null,count:0,state:null},w.set(g,M)),M):{type:"void",instance:null,count:0,state:null};default:throw Error(r(444,h))}}function dp(h){return'href="'+jn(h)+'"'}function wb(h){return'link[rel="stylesheet"]['+h+"]"}function yU(h){return f({},h,{"data-precedence":h.precedence,precedence:null})}function gae(h,g,w,M){h.querySelector('link[rel="preload"][as="style"]['+g+"]")?M.loading=1:(g=h.createElement("link"),M.preload=g,g.addEventListener("load",function(){return M.loading|=1}),g.addEventListener("error",function(){return M.loading|=2}),Ea(g,"link",w),Le(g),h.head.appendChild(g))}function hp(h){return'[src="'+jn(h)+'"]'}function _b(h){return"script[async]"+h}function vU(h,g,w){if(g.count++,g.instance===null)switch(g.type){case"style":var M=h.querySelector('style[data-href~="'+jn(w.href)+'"]');if(M)return g.instance=M,Le(M),M;var P=f({},w,{"data-href":w.href,"data-precedence":w.precedence,href:null,precedence:null});return M=(h.ownerDocument||h).createElement("style"),Le(M),Ea(M,"style",P),xw(M,w.precedence,h),g.instance=M;case"stylesheet":P=dp(w.href);var L=h.querySelector(wb(P));if(L)return g.state.loading|=4,g.instance=L,Le(L),L;M=yU(w),(P=Do.get(P))&&jE(M,P),L=(h.ownerDocument||h).createElement("link"),Le(L);var J=L;return J._p=new Promise(function(ve,Ue){J.onload=ve,J.onerror=Ue}),Ea(L,"link",M),g.state.loading|=4,xw(L,w.precedence,h),g.instance=L;case"script":return L=hp(w.src),(P=h.querySelector(_b(L)))?(g.instance=P,Le(P),P):(M=w,(P=Do.get(L))&&(M=f({},w),PE(M,P)),h=h.ownerDocument||h,P=h.createElement("script"),Le(P),Ea(P,"link",M),h.head.appendChild(P),g.instance=P);case"void":return null;default:throw Error(r(443,g.type))}else g.type==="stylesheet"&&(g.state.loading&4)===0&&(M=g.instance,g.state.loading|=4,xw(M,w.precedence,h));return g.instance}function xw(h,g,w){for(var M=w.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),P=M.length?M[M.length-1]:null,L=P,J=0;J title"):null)}function xae(h,g,w){if(w===1||g.itemProp!=null)return!1;switch(h){case"meta":case"title":return!0;case"style":if(typeof g.precedence!="string"||typeof g.href!="string"||g.href==="")break;return!0;case"link":if(typeof g.rel!="string"||typeof g.href!="string"||g.href===""||g.onLoad||g.onError)break;switch(g.rel){case"stylesheet":return h=g.disabled,typeof g.precedence=="string"&&h==null;default:return!0}case"script":if(g.async&&typeof g.async!="function"&&typeof g.async!="symbol"&&!g.onLoad&&!g.onError&&g.src&&typeof g.src=="string")return!0}return!1}function SU(h){return!(h.type==="stylesheet"&&(h.state.loading&3)===0)}function bae(h,g,w,M){if(w.type==="stylesheet"&&(typeof M.media!="string"||matchMedia(M.media).matches!==!1)&&(w.state.loading&4)===0){if(w.instance===null){var P=dp(M.href),L=g.querySelector(wb(P));if(L){g=L._p,g!==null&&typeof g=="object"&&typeof g.then=="function"&&(h.count++,h=yw.bind(h),g.then(h,h)),w.state.loading|=4,w.instance=L,Le(L);return}L=g.ownerDocument||g,M=yU(M),(P=Do.get(P))&&jE(M,P),L=L.createElement("link"),Le(L);var J=L;J._p=new Promise(function(ve,Ue){J.onload=ve,J.onerror=Ue}),Ea(L,"link",M),w.instance=L}h.stylesheets===null&&(h.stylesheets=new Map),h.stylesheets.set(w,g),(g=w.state.preload)&&(w.state.loading&3)===0&&(h.count++,w=yw.bind(h),g.addEventListener("load",w),g.addEventListener("error",w))}}var DE=0;function yae(h,g){return h.stylesheets&&h.count===0&&ww(h,h.stylesheets),0DE?50:800)+g);return h.unsuspend=w,function(){h.unsuspend=null,clearTimeout(M),clearTimeout(P)}}:null}function yw(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)ww(this,this.stylesheets);else if(this.unsuspend){var h=this.unsuspend;this.unsuspend=null,h()}}}var vw=null;function ww(h,g){h.stylesheets=null,h.unsuspend!==null&&(h.count++,vw=new Map,g.forEach(vae,h),vw=null,yw.call(h))}function vae(h,g){if(!(g.state.loading&4)){var w=vw.get(h);if(w)var M=w.get(null);else{w=new Map,vw.set(h,w);for(var P=h.querySelectorAll("link[data-precedence],style[data-precedence]"),L=0;L"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(t)}catch(e){console.error(e)}}return t(),HE.exports=Fae(),HE.exports}var Uae=Iae();const fn=t=>typeof t=="string",Ab=()=>{let t,e;const n=new Promise((r,i)=>{t=r,e=i});return n.resolve=t,n.reject=e,n},WU=t=>t==null?"":""+t,zae=(t,e,n)=>{t.forEach(r=>{e[r]&&(n[r]=e[r])})},Bae=/###/g,KU=t=>t&&t.indexOf("###")>-1?t.replace(Bae,"."):t,XU=t=>!t||fn(t),x0=(t,e,n)=>{const r=fn(e)?e.split("."):e;let i=0;for(;i{const{obj:r,k:i}=x0(t,e,Object);if(r!==void 0||e.length===1){r[i]=n;return}let a=e[e.length-1],o=e.slice(0,e.length-1),l=x0(t,o,Object);for(;l.obj===void 0&&o.length;)a=`${o[o.length-1]}.${a}`,o=o.slice(0,o.length-1),l=x0(t,o,Object),l?.obj&&typeof l.obj[`${l.k}.${a}`]<"u"&&(l.obj=void 0);l.obj[`${l.k}.${a}`]=n},Hae=(t,e,n,r)=>{const{obj:i,k:a}=x0(t,e,Object);i[a]=i[a]||[],i[a].push(n)},U1=(t,e)=>{const{obj:n,k:r}=x0(t,e);if(n&&Object.prototype.hasOwnProperty.call(n,r))return n[r]},$ae=(t,e,n)=>{const r=U1(t,n);return r!==void 0?r:U1(e,n)},vq=(t,e,n)=>{for(const r in e)r!=="__proto__"&&r!=="constructor"&&(r in t?fn(t[r])||t[r]instanceof String||fn(e[r])||e[r]instanceof String?n&&(t[r]=e[r]):vq(t[r],e[r],n):t[r]=e[r]);return t},mp=t=>t.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&");var Vae={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"};const Gae=t=>fn(t)?t.replace(/[&<>"'\/]/g,e=>Vae[e]):t;class qae{constructor(e){this.capacity=e,this.regExpMap=new Map,this.regExpQueue=[]}getRegExp(e){const n=this.regExpMap.get(e);if(n!==void 0)return n;const r=new RegExp(e);return this.regExpQueue.length===this.capacity&&this.regExpMap.delete(this.regExpQueue.shift()),this.regExpMap.set(e,r),this.regExpQueue.push(e),r}}const Wae=[" ",",","?","!",";"],Kae=new qae(20),Xae=(t,e,n)=>{e=e||"",n=n||"";const r=Wae.filter(o=>e.indexOf(o)<0&&n.indexOf(o)<0);if(r.length===0)return!0;const i=Kae.getRegExp(`(${r.map(o=>o==="?"?"\\?":o).join("|")})`);let a=!i.test(t);if(!a){const o=t.indexOf(n);o>0&&!i.test(t.substring(0,o))&&(a=!0)}return a},Yj=(t,e,n=".")=>{if(!t)return;if(t[e])return Object.prototype.hasOwnProperty.call(t,e)?t[e]:void 0;const r=e.split(n);let i=t;for(let a=0;a-1&&ct?.replace("_","-"),Yae={type:"logger",log(t){this.output("log",t)},warn(t){this.output("warn",t)},error(t){this.output("error",t)},output(t,e){console?.[t]?.apply?.(console,e)}};class z1{constructor(e,n={}){this.init(e,n)}init(e,n={}){this.prefix=n.prefix||"i18next:",this.logger=e||Yae,this.options=n,this.debug=n.debug}log(...e){return this.forward(e,"log","",!0)}warn(...e){return this.forward(e,"warn","",!0)}error(...e){return this.forward(e,"error","")}deprecate(...e){return this.forward(e,"warn","WARNING DEPRECATED: ",!0)}forward(e,n,r,i){return i&&!this.debug?null:(fn(e[0])&&(e[0]=`${r}${this.prefix} ${e[0]}`),this.logger[n](e))}create(e){return new z1(this.logger,{prefix:`${this.prefix}:${e}:`,...this.options})}clone(e){return e=e||this.options,e.prefix=e.prefix||this.prefix,new z1(this.logger,e)}}var sc=new z1;let tN=class{constructor(){this.observers={}}on(e,n){return e.split(" ").forEach(r=>{this.observers[r]||(this.observers[r]=new Map);const i=this.observers[r].get(n)||0;this.observers[r].set(n,i+1)}),this}off(e,n){if(this.observers[e]){if(!n){delete this.observers[e];return}this.observers[e].delete(n)}}emit(e,...n){this.observers[e]&&Array.from(this.observers[e].entries()).forEach(([i,a])=>{for(let o=0;o{for(let o=0;o-1&&this.options.ns.splice(n,1)}getResource(e,n,r,i={}){const a=i.keySeparator!==void 0?i.keySeparator:this.options.keySeparator,o=i.ignoreJSONStructure!==void 0?i.ignoreJSONStructure:this.options.ignoreJSONStructure;let l;e.indexOf(".")>-1?l=e.split("."):(l=[e,n],r&&(Array.isArray(r)?l.push(...r):fn(r)&&a?l.push(...r.split(a)):l.push(r)));const c=U1(this.data,l);return!c&&!n&&!r&&e.indexOf(".")>-1&&(e=l[0],n=l[1],r=l.slice(2).join(".")),c||!o||!fn(r)?c:Yj(this.data?.[e]?.[n],r,a)}addResource(e,n,r,i,a={silent:!1}){const o=a.keySeparator!==void 0?a.keySeparator:this.options.keySeparator;let l=[e,n];r&&(l=l.concat(o?r.split(o):r)),e.indexOf(".")>-1&&(l=e.split("."),i=n,n=l[1]),this.addNamespaces(n),YU(this.data,l,i),a.silent||this.emit("added",e,n,r,i)}addResources(e,n,r,i={silent:!1}){for(const a in r)(fn(r[a])||Array.isArray(r[a]))&&this.addResource(e,n,a,r[a],{silent:!0});i.silent||this.emit("added",e,n,r)}addResourceBundle(e,n,r,i,a,o={silent:!1,skipCopy:!1}){let l=[e,n];e.indexOf(".")>-1&&(l=e.split("."),i=r,r=n,n=l[1]),this.addNamespaces(n);let c=U1(this.data,l)||{};o.skipCopy||(r=JSON.parse(JSON.stringify(r))),i?vq(c,r,a):c={...c,...r},YU(this.data,l,c),o.silent||this.emit("added",e,n,r)}removeResourceBundle(e,n){this.hasResourceBundle(e,n)&&delete this.data[e][n],this.removeNamespaces(n),this.emit("removed",e,n)}hasResourceBundle(e,n){return this.getResource(e,n)!==void 0}getResourceBundle(e,n){return n||(n=this.options.defaultNS),this.getResource(e,n)}getDataByLanguage(e){return this.data[e]}hasLanguageSomeTranslations(e){const n=this.getDataByLanguage(e);return!!(n&&Object.keys(n)||[]).find(i=>n[i]&&Object.keys(n[i]).length>0)}toJSON(){return this.data}}var wq={processors:{},addPostProcessor(t){this.processors[t.name]=t},handle(t,e,n,r,i){return t.forEach(a=>{e=this.processors[a]?.process(e,n,r,i)??e}),e}};const _q=Symbol("i18next/PATH_KEY");function Qae(){const t=[],e=Object.create(null);let n;return e.get=(r,i)=>(n?.revoke?.(),i===_q?t:(t.push(i),n=Proxy.revocable(r,e),n.proxy)),Proxy.revocable(Object.create(null),e).proxy}function Qj(t,e){const{[_q]:n}=t(Qae());return n.join(e?.keySeparator??".")}const ZU={},qE=t=>!fn(t)&&typeof t!="boolean"&&typeof t!="number";class B1 extends tN{constructor(e,n={}){super(),zae(["resourceStore","languageUtils","pluralResolver","interpolator","backendConnector","i18nFormat","utils"],e,this),this.options=n,this.options.keySeparator===void 0&&(this.options.keySeparator="."),this.logger=sc.create("translator")}changeLanguage(e){e&&(this.language=e)}exists(e,n={interpolation:{}}){const r={...n};if(e==null)return!1;const i=this.resolve(e,r);if(i?.res===void 0)return!1;const a=qE(i.res);return!(r.returnObjects===!1&&a)}extractFromKey(e,n){let r=n.nsSeparator!==void 0?n.nsSeparator:this.options.nsSeparator;r===void 0&&(r=":");const i=n.keySeparator!==void 0?n.keySeparator:this.options.keySeparator;let a=n.ns||this.options.defaultNS||[];const o=r&&e.indexOf(r)>-1,l=!this.options.userDefinedKeySeparator&&!n.keySeparator&&!this.options.userDefinedNsSeparator&&!n.nsSeparator&&!Xae(e,r,i);if(o&&!l){const c=e.match(this.interpolator.nestingRegexp);if(c&&c.length>0)return{key:e,namespaces:fn(a)?[a]:a};const u=e.split(r);(r!==i||r===i&&this.options.ns.indexOf(u[0])>-1)&&(a=u.shift()),e=u.join(i)}return{key:e,namespaces:fn(a)?[a]:a}}translate(e,n,r){let i=typeof n=="object"?{...n}:n;if(typeof i!="object"&&this.options.overloadTranslationOptionHandler&&(i=this.options.overloadTranslationOptionHandler(arguments)),typeof i=="object"&&(i={...i}),i||(i={}),e==null)return"";typeof e=="function"&&(e=Qj(e,{...this.options,...i})),Array.isArray(e)||(e=[String(e)]);const a=i.returnDetails!==void 0?i.returnDetails:this.options.returnDetails,o=i.keySeparator!==void 0?i.keySeparator:this.options.keySeparator,{key:l,namespaces:c}=this.extractFromKey(e[e.length-1],i),u=c[c.length-1];let d=i.nsSeparator!==void 0?i.nsSeparator:this.options.nsSeparator;d===void 0&&(d=":");const f=i.lng||this.language,p=i.appendNamespaceToCIMode||this.options.appendNamespaceToCIMode;if(f?.toLowerCase()==="cimode")return p?a?{res:`${u}${d}${l}`,usedKey:l,exactUsedKey:l,usedLng:f,usedNS:u,usedParams:this.getUsedParamsDetails(i)}:`${u}${d}${l}`:a?{res:l,usedKey:l,exactUsedKey:l,usedLng:f,usedNS:u,usedParams:this.getUsedParamsDetails(i)}:l;const m=this.resolve(e,i);let x=m?.res;const b=m?.usedKey||l,y=m?.exactUsedKey||l,v=["[object Number]","[object Function]","[object RegExp]"],S=i.joinArrays!==void 0?i.joinArrays:this.options.joinArrays,N=!this.i18nFormat||this.i18nFormat.handleAsObject,T=i.count!==void 0&&!fn(i.count),k=B1.hasDefaultValue(i),C=T?this.pluralResolver.getSuffix(f,i.count,i):"",E=i.ordinal&&T?this.pluralResolver.getSuffix(f,i.count,{ordinal:!1}):"",R=T&&!i.ordinal&&i.count===0,A=R&&i[`defaultValue${this.options.pluralSeparator}zero`]||i[`defaultValue${C}`]||i[`defaultValue${E}`]||i.defaultValue;let D=x;N&&!x&&k&&(D=A);const U=qE(D),F=Object.prototype.toString.apply(D);if(N&&D&&U&&v.indexOf(F)<0&&!(fn(S)&&Array.isArray(D))){if(!i.returnObjects&&!this.options.returnObjects){this.options.returnedObjectHandler||this.logger.warn("accessing an object - but returnObjects options is not enabled!");const $=this.options.returnedObjectHandler?this.options.returnedObjectHandler(b,D,{...i,ns:c}):`key '${l} (${this.language})' returned an object instead of string.`;return a?(m.res=$,m.usedParams=this.getUsedParamsDetails(i),m):$}if(o){const $=Array.isArray(D),j=$?[]:{},H=$?y:b;for(const K in D)if(Object.prototype.hasOwnProperty.call(D,K)){const V=`${H}${o}${K}`;k&&!x?j[K]=this.translate(V,{...i,defaultValue:qE(A)?A[K]:void 0,joinArrays:!1,ns:c}):j[K]=this.translate(V,{...i,joinArrays:!1,ns:c}),j[K]===V&&(j[K]=D[K])}x=j}}else if(N&&fn(S)&&Array.isArray(x))x=x.join(S),x&&(x=this.extendTranslation(x,e,i,r));else{let $=!1,j=!1;!this.isValidLookup(x)&&k&&($=!0,x=A),this.isValidLookup(x)||(j=!0,x=l);const K=(i.missingKeyNoValueFallbackToKey||this.options.missingKeyNoValueFallbackToKey)&&j?void 0:x,V=k&&A!==x&&this.options.updateMissing;if(j||$||V){if(this.logger.log(V?"updateKey":"missingKey",f,u,l,V?A:x),o){const B=this.resolve(l,{...i,keySeparator:!1});B&&B.res&&this.logger.warn("Seems the loaded translations were in flat JSON format instead of nested. Either set keySeparator: false on init or make sure your translations are published in nested format.")}let Q=[];const Z=this.languageUtils.getFallbackCodes(this.options.fallbackLng,i.lng||this.language);if(this.options.saveMissingTo==="fallback"&&Z&&Z[0])for(let B=0;B{const se=k&&ne!==x?ne:K;this.options.missingKeyHandler?this.options.missingKeyHandler(B,u,X,se,V,i):this.backendConnector?.saveMissing&&this.backendConnector.saveMissing(B,u,X,se,V,i),this.emit("missingKey",B,u,X,x)};this.options.saveMissing&&(this.options.saveMissingPlurals&&T?Q.forEach(B=>{const X=this.pluralResolver.getSuffixes(B,i);R&&i[`defaultValue${this.options.pluralSeparator}zero`]&&X.indexOf(`${this.options.pluralSeparator}zero`)<0&&X.push(`${this.options.pluralSeparator}zero`),X.forEach(ne=>{ae([B],l+ne,i[`defaultValue${ne}`]||A)})}):ae(Q,l,A))}x=this.extendTranslation(x,e,i,m,r),j&&x===l&&this.options.appendNamespaceToMissingKey&&(x=`${u}${d}${l}`),(j||$)&&this.options.parseMissingKeyHandler&&(x=this.options.parseMissingKeyHandler(this.options.appendNamespaceToMissingKey?`${u}${d}${l}`:l,$?x:void 0,i))}return a?(m.res=x,m.usedParams=this.getUsedParamsDetails(i),m):x}extendTranslation(e,n,r,i,a){if(this.i18nFormat?.parse)e=this.i18nFormat.parse(e,{...this.options.interpolation.defaultVariables,...r},r.lng||this.language||i.usedLng,i.usedNS,i.usedKey,{resolved:i});else if(!r.skipInterpolation){r.interpolation&&this.interpolator.init({...r,interpolation:{...this.options.interpolation,...r.interpolation}});const c=fn(e)&&(r?.interpolation?.skipOnVariables!==void 0?r.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables);let u;if(c){const f=e.match(this.interpolator.nestingRegexp);u=f&&f.length}let d=r.replace&&!fn(r.replace)?r.replace:r;if(this.options.interpolation.defaultVariables&&(d={...this.options.interpolation.defaultVariables,...d}),e=this.interpolator.interpolate(e,d,r.lng||this.language||i.usedLng,r),c){const f=e.match(this.interpolator.nestingRegexp),p=f&&f.length;ua?.[0]===f[0]&&!r.context?(this.logger.warn(`It seems you are nesting recursively key: ${f[0]} in key: ${n[0]}`),null):this.translate(...f,n),r)),r.interpolation&&this.interpolator.reset()}const o=r.postProcess||this.options.postProcess,l=fn(o)?[o]:o;return e!=null&&l?.length&&r.applyPostProcessor!==!1&&(e=wq.handle(l,e,n,this.options&&this.options.postProcessPassResolved?{i18nResolved:{...i,usedParams:this.getUsedParamsDetails(r)},...r}:r,this)),e}resolve(e,n={}){let r,i,a,o,l;return fn(e)&&(e=[e]),e.forEach(c=>{if(this.isValidLookup(r))return;const u=this.extractFromKey(c,n),d=u.key;i=d;let f=u.namespaces;this.options.fallbackNS&&(f=f.concat(this.options.fallbackNS));const p=n.count!==void 0&&!fn(n.count),m=p&&!n.ordinal&&n.count===0,x=n.context!==void 0&&(fn(n.context)||typeof n.context=="number")&&n.context!=="",b=n.lngs?n.lngs:this.languageUtils.toResolveHierarchy(n.lng||this.language,n.fallbackLng);f.forEach(y=>{this.isValidLookup(r)||(l=y,!ZU[`${b[0]}-${y}`]&&this.utils?.hasLoadedNamespace&&!this.utils?.hasLoadedNamespace(l)&&(ZU[`${b[0]}-${y}`]=!0,this.logger.warn(`key "${i}" for languages "${b.join(", ")}" won't get resolved as namespace "${l}" was not yet loaded`,"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!")),b.forEach(v=>{if(this.isValidLookup(r))return;o=v;const S=[d];if(this.i18nFormat?.addLookupKeys)this.i18nFormat.addLookupKeys(S,d,v,y,n);else{let T;p&&(T=this.pluralResolver.getSuffix(v,n.count,n));const k=`${this.options.pluralSeparator}zero`,C=`${this.options.pluralSeparator}ordinal${this.options.pluralSeparator}`;if(p&&(n.ordinal&&T.indexOf(C)===0&&S.push(d+T.replace(C,this.options.pluralSeparator)),S.push(d+T),m&&S.push(d+k)),x){const E=`${d}${this.options.contextSeparator||"_"}${n.context}`;S.push(E),p&&(n.ordinal&&T.indexOf(C)===0&&S.push(E+T.replace(C,this.options.pluralSeparator)),S.push(E+T),m&&S.push(E+k))}}let N;for(;N=S.pop();)this.isValidLookup(r)||(a=N,r=this.getResource(v,y,N,n))}))})}),{res:r,usedKey:i,exactUsedKey:a,usedLng:o,usedNS:l}}isValidLookup(e){return e!==void 0&&!(!this.options.returnNull&&e===null)&&!(!this.options.returnEmptyString&&e==="")}getResource(e,n,r,i={}){return this.i18nFormat?.getResource?this.i18nFormat.getResource(e,n,r,i):this.resourceStore.getResource(e,n,r,i)}getUsedParamsDetails(e={}){const n=["defaultValue","ordinal","context","replace","lng","lngs","fallbackLng","ns","keySeparator","nsSeparator","returnObjects","returnDetails","joinArrays","postProcess","interpolation"],r=e.replace&&!fn(e.replace);let i=r?e.replace:e;if(r&&typeof e.count<"u"&&(i.count=e.count),this.options.interpolation.defaultVariables&&(i={...this.options.interpolation.defaultVariables,...i}),!r){i={...i};for(const a of n)delete i[a]}return i}static hasDefaultValue(e){const n="defaultValue";for(const r in e)if(Object.prototype.hasOwnProperty.call(e,r)&&n===r.substring(0,n.length)&&e[r]!==void 0)return!0;return!1}}class JU{constructor(e){this.options=e,this.supportedLngs=this.options.supportedLngs||!1,this.logger=sc.create("languageUtils")}getScriptPartFromCode(e){if(e=B0(e),!e||e.indexOf("-")<0)return null;const n=e.split("-");return n.length===2||(n.pop(),n[n.length-1].toLowerCase()==="x")?null:this.formatLanguageCode(n.join("-"))}getLanguagePartFromCode(e){if(e=B0(e),!e||e.indexOf("-")<0)return e;const n=e.split("-");return this.formatLanguageCode(n[0])}formatLanguageCode(e){if(fn(e)&&e.indexOf("-")>-1){let n;try{n=Intl.getCanonicalLocales(e)[0]}catch{}return n&&this.options.lowerCaseLng&&(n=n.toLowerCase()),n||(this.options.lowerCaseLng?e.toLowerCase():e)}return this.options.cleanCode||this.options.lowerCaseLng?e.toLowerCase():e}isSupportedCode(e){return(this.options.load==="languageOnly"||this.options.nonExplicitSupportedLngs)&&(e=this.getLanguagePartFromCode(e)),!this.supportedLngs||!this.supportedLngs.length||this.supportedLngs.indexOf(e)>-1}getBestMatchFromCodes(e){if(!e)return null;let n;return e.forEach(r=>{if(n)return;const i=this.formatLanguageCode(r);(!this.options.supportedLngs||this.isSupportedCode(i))&&(n=i)}),!n&&this.options.supportedLngs&&e.forEach(r=>{if(n)return;const i=this.getScriptPartFromCode(r);if(this.isSupportedCode(i))return n=i;const a=this.getLanguagePartFromCode(r);if(this.isSupportedCode(a))return n=a;n=this.options.supportedLngs.find(o=>{if(o===a)return o;if(!(o.indexOf("-")<0&&a.indexOf("-")<0)&&(o.indexOf("-")>0&&a.indexOf("-")<0&&o.substring(0,o.indexOf("-"))===a||o.indexOf(a)===0&&a.length>1))return o})}),n||(n=this.getFallbackCodes(this.options.fallbackLng)[0]),n}getFallbackCodes(e,n){if(!e)return[];if(typeof e=="function"&&(e=e(n)),fn(e)&&(e=[e]),Array.isArray(e))return e;if(!n)return e.default||[];let r=e[n];return r||(r=e[this.getScriptPartFromCode(n)]),r||(r=e[this.formatLanguageCode(n)]),r||(r=e[this.getLanguagePartFromCode(n)]),r||(r=e.default),r||[]}toResolveHierarchy(e,n){const r=this.getFallbackCodes((n===!1?[]:n)||this.options.fallbackLng||[],e),i=[],a=o=>{o&&(this.isSupportedCode(o)?i.push(o):this.logger.warn(`rejecting language code not found in supportedLngs: ${o}`))};return fn(e)&&(e.indexOf("-")>-1||e.indexOf("_")>-1)?(this.options.load!=="languageOnly"&&a(this.formatLanguageCode(e)),this.options.load!=="languageOnly"&&this.options.load!=="currentOnly"&&a(this.getScriptPartFromCode(e)),this.options.load!=="currentOnly"&&a(this.getLanguagePartFromCode(e))):fn(e)&&a(this.formatLanguageCode(e)),r.forEach(o=>{i.indexOf(o)<0&&a(this.formatLanguageCode(o))}),i}}const ez={zero:0,one:1,two:2,few:3,many:4,other:5},tz={select:t=>t===1?"one":"other",resolvedOptions:()=>({pluralCategories:["one","other"]})};class Zae{constructor(e,n={}){this.languageUtils=e,this.options=n,this.logger=sc.create("pluralResolver"),this.pluralRulesCache={}}addRule(e,n){this.rules[e]=n}clearCache(){this.pluralRulesCache={}}getRule(e,n={}){const r=B0(e==="dev"?"en":e),i=n.ordinal?"ordinal":"cardinal",a=JSON.stringify({cleanedCode:r,type:i});if(a in this.pluralRulesCache)return this.pluralRulesCache[a];let o;try{o=new Intl.PluralRules(r,{type:i})}catch{if(!Intl)return this.logger.error("No Intl support, please use an Intl polyfill!"),tz;if(!e.match(/-|_/))return tz;const c=this.languageUtils.getLanguagePartFromCode(e);o=this.getRule(c,n)}return this.pluralRulesCache[a]=o,o}needsPlural(e,n={}){let r=this.getRule(e,n);return r||(r=this.getRule("dev",n)),r?.resolvedOptions().pluralCategories.length>1}getPluralFormsOfKey(e,n,r={}){return this.getSuffixes(e,r).map(i=>`${n}${i}`)}getSuffixes(e,n={}){let r=this.getRule(e,n);return r||(r=this.getRule("dev",n)),r?r.resolvedOptions().pluralCategories.sort((i,a)=>ez[i]-ez[a]).map(i=>`${this.options.prepend}${n.ordinal?`ordinal${this.options.prepend}`:""}${i}`):[]}getSuffix(e,n,r={}){const i=this.getRule(e,r);return i?`${this.options.prepend}${r.ordinal?`ordinal${this.options.prepend}`:""}${i.select(n)}`:(this.logger.warn(`no plural rule found for: ${e}`),this.getSuffix("dev",n,r))}}const nz=(t,e,n,r=".",i=!0)=>{let a=$ae(t,e,n);return!a&&i&&fn(n)&&(a=Yj(t,n,r),a===void 0&&(a=Yj(e,n,r))),a},WE=t=>t.replace(/\$/g,"$$$$");class Jae{constructor(e={}){this.logger=sc.create("interpolator"),this.options=e,this.format=e?.interpolation?.format||(n=>n),this.init(e)}init(e={}){e.interpolation||(e.interpolation={escapeValue:!0});const{escape:n,escapeValue:r,useRawValueToEscape:i,prefix:a,prefixEscaped:o,suffix:l,suffixEscaped:c,formatSeparator:u,unescapeSuffix:d,unescapePrefix:f,nestingPrefix:p,nestingPrefixEscaped:m,nestingSuffix:x,nestingSuffixEscaped:b,nestingOptionsSeparator:y,maxReplaces:v,alwaysFormat:S}=e.interpolation;this.escape=n!==void 0?n:Gae,this.escapeValue=r!==void 0?r:!0,this.useRawValueToEscape=i!==void 0?i:!1,this.prefix=a?mp(a):o||"{{",this.suffix=l?mp(l):c||"}}",this.formatSeparator=u||",",this.unescapePrefix=d?"":f||"-",this.unescapeSuffix=this.unescapePrefix?"":d||"",this.nestingPrefix=p?mp(p):m||mp("$t("),this.nestingSuffix=x?mp(x):b||mp(")"),this.nestingOptionsSeparator=y||",",this.maxReplaces=v||1e3,this.alwaysFormat=S!==void 0?S:!1,this.resetRegExp()}reset(){this.options&&this.init(this.options)}resetRegExp(){const e=(n,r)=>n?.source===r?(n.lastIndex=0,n):new RegExp(r,"g");this.regexp=e(this.regexp,`${this.prefix}(.+?)${this.suffix}`),this.regexpUnescape=e(this.regexpUnescape,`${this.prefix}${this.unescapePrefix}(.+?)${this.unescapeSuffix}${this.suffix}`),this.nestingRegexp=e(this.nestingRegexp,`${this.nestingPrefix}((?:[^()"']+|"[^"]*"|'[^']*'|\\((?:[^()]|"[^"]*"|'[^']*')*\\))*?)${this.nestingSuffix}`)}interpolate(e,n,r,i){let a,o,l;const c=this.options&&this.options.interpolation&&this.options.interpolation.defaultVariables||{},u=m=>{if(m.indexOf(this.formatSeparator)<0){const v=nz(n,c,m,this.options.keySeparator,this.options.ignoreJSONStructure);return this.alwaysFormat?this.format(v,void 0,r,{...i,...n,interpolationkey:m}):v}const x=m.split(this.formatSeparator),b=x.shift().trim(),y=x.join(this.formatSeparator).trim();return this.format(nz(n,c,b,this.options.keySeparator,this.options.ignoreJSONStructure),y,r,{...i,...n,interpolationkey:b})};this.resetRegExp();const d=i?.missingInterpolationHandler||this.options.missingInterpolationHandler,f=i?.interpolation?.skipOnVariables!==void 0?i.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables;return[{regex:this.regexpUnescape,safeValue:m=>WE(m)},{regex:this.regexp,safeValue:m=>this.escapeValue?WE(this.escape(m)):WE(m)}].forEach(m=>{for(l=0;a=m.regex.exec(e);){const x=a[1].trim();if(o=u(x),o===void 0)if(typeof d=="function"){const y=d(e,a,i);o=fn(y)?y:""}else if(i&&Object.prototype.hasOwnProperty.call(i,x))o="";else if(f){o=a[0];continue}else this.logger.warn(`missed to pass in variable ${x} for interpolating ${e}`),o="";else!fn(o)&&!this.useRawValueToEscape&&(o=WU(o));const b=m.safeValue(o);if(e=e.replace(a[0],b),f?(m.regex.lastIndex+=o.length,m.regex.lastIndex-=a[0].length):m.regex.lastIndex=0,l++,l>=this.maxReplaces)break}}),e}nest(e,n,r={}){let i,a,o;const l=(c,u)=>{const d=this.nestingOptionsSeparator;if(c.indexOf(d)<0)return c;const f=c.split(new RegExp(`${d}[ ]*{`));let p=`{${f[1]}`;c=f[0],p=this.interpolate(p,o);const m=p.match(/'/g),x=p.match(/"/g);((m?.length??0)%2===0&&!x||x.length%2!==0)&&(p=p.replace(/'/g,'"'));try{o=JSON.parse(p),u&&(o={...u,...o})}catch(b){return this.logger.warn(`failed parsing options string in nesting for key ${c}`,b),`${c}${d}${p}`}return o.defaultValue&&o.defaultValue.indexOf(this.prefix)>-1&&delete o.defaultValue,c};for(;i=this.nestingRegexp.exec(e);){let c=[];o={...r},o=o.replace&&!fn(o.replace)?o.replace:o,o.applyPostProcessor=!1,delete o.defaultValue;const u=/{.*}/.test(i[1])?i[1].lastIndexOf("}")+1:i[1].indexOf(this.formatSeparator);if(u!==-1&&(c=i[1].slice(u).split(this.formatSeparator).map(d=>d.trim()).filter(Boolean),i[1]=i[1].slice(0,u)),a=n(l.call(this,i[1].trim(),o),o),a&&i[0]===e&&!fn(a))return a;fn(a)||(a=WU(a)),a||(this.logger.warn(`missed to resolve ${i[1]} for nesting ${e}`),a=""),c.length&&(a=c.reduce((d,f)=>this.format(d,f,r.lng,{...r,interpolationkey:i[1].trim()}),a.trim())),e=e.replace(i[0],a),this.regexp.lastIndex=0}return e}}const ese=t=>{let e=t.toLowerCase().trim();const n={};if(t.indexOf("(")>-1){const r=t.split("(");e=r[0].toLowerCase().trim();const i=r[1].substring(0,r[1].length-1);e==="currency"&&i.indexOf(":")<0?n.currency||(n.currency=i.trim()):e==="relativetime"&&i.indexOf(":")<0?n.range||(n.range=i.trim()):i.split(";").forEach(o=>{if(o){const[l,...c]=o.split(":"),u=c.join(":").trim().replace(/^'+|'+$/g,""),d=l.trim();n[d]||(n[d]=u),u==="false"&&(n[d]=!1),u==="true"&&(n[d]=!0),isNaN(u)||(n[d]=parseInt(u,10))}})}return{formatName:e,formatOptions:n}},rz=t=>{const e={};return(n,r,i)=>{let a=i;i&&i.interpolationkey&&i.formatParams&&i.formatParams[i.interpolationkey]&&i[i.interpolationkey]&&(a={...a,[i.interpolationkey]:void 0});const o=r+JSON.stringify(a);let l=e[o];return l||(l=t(B0(r),i),e[o]=l),l(n)}},tse=t=>(e,n,r)=>t(B0(n),r)(e);class nse{constructor(e={}){this.logger=sc.create("formatter"),this.options=e,this.init(e)}init(e,n={interpolation:{}}){this.formatSeparator=n.interpolation.formatSeparator||",";const r=n.cacheInBuiltFormats?rz:tse;this.formats={number:r((i,a)=>{const o=new Intl.NumberFormat(i,{...a});return l=>o.format(l)}),currency:r((i,a)=>{const o=new Intl.NumberFormat(i,{...a,style:"currency"});return l=>o.format(l)}),datetime:r((i,a)=>{const o=new Intl.DateTimeFormat(i,{...a});return l=>o.format(l)}),relativetime:r((i,a)=>{const o=new Intl.RelativeTimeFormat(i,{...a});return l=>o.format(l,a.range||"day")}),list:r((i,a)=>{const o=new Intl.ListFormat(i,{...a});return l=>o.format(l)})}}add(e,n){this.formats[e.toLowerCase().trim()]=n}addCached(e,n){this.formats[e.toLowerCase().trim()]=rz(n)}format(e,n,r,i={}){const a=n.split(this.formatSeparator);if(a.length>1&&a[0].indexOf("(")>1&&a[0].indexOf(")")<0&&a.find(l=>l.indexOf(")")>-1)){const l=a.findIndex(c=>c.indexOf(")")>-1);a[0]=[a[0],...a.splice(1,l)].join(this.formatSeparator)}return a.reduce((l,c)=>{const{formatName:u,formatOptions:d}=ese(c);if(this.formats[u]){let f=l;try{const p=i?.formatParams?.[i.interpolationkey]||{},m=p.locale||p.lng||i.locale||i.lng||r;f=this.formats[u](l,m,{...d,...i,...p})}catch(p){this.logger.warn(p)}return f}else this.logger.warn(`there was no format function for ${u}`);return l},e)}}const rse=(t,e)=>{t.pending[e]!==void 0&&(delete t.pending[e],t.pendingCount--)};class ise extends tN{constructor(e,n,r,i={}){super(),this.backend=e,this.store=n,this.services=r,this.languageUtils=r.languageUtils,this.options=i,this.logger=sc.create("backendConnector"),this.waitingReads=[],this.maxParallelReads=i.maxParallelReads||10,this.readingCalls=0,this.maxRetries=i.maxRetries>=0?i.maxRetries:5,this.retryTimeout=i.retryTimeout>=1?i.retryTimeout:350,this.state={},this.queue=[],this.backend?.init?.(r,i.backend,i)}queueLoad(e,n,r,i){const a={},o={},l={},c={};return e.forEach(u=>{let d=!0;n.forEach(f=>{const p=`${u}|${f}`;!r.reload&&this.store.hasResourceBundle(u,f)?this.state[p]=2:this.state[p]<0||(this.state[p]===1?o[p]===void 0&&(o[p]=!0):(this.state[p]=1,d=!1,o[p]===void 0&&(o[p]=!0),a[p]===void 0&&(a[p]=!0),c[f]===void 0&&(c[f]=!0)))}),d||(l[u]=!0)}),(Object.keys(a).length||Object.keys(o).length)&&this.queue.push({pending:o,pendingCount:Object.keys(o).length,loaded:{},errors:[],callback:i}),{toLoad:Object.keys(a),pending:Object.keys(o),toLoadLanguages:Object.keys(l),toLoadNamespaces:Object.keys(c)}}loaded(e,n,r){const i=e.split("|"),a=i[0],o=i[1];n&&this.emit("failedLoading",a,o,n),!n&&r&&this.store.addResourceBundle(a,o,r,void 0,void 0,{skipCopy:!0}),this.state[e]=n?-1:2,n&&r&&(this.state[e]=0);const l={};this.queue.forEach(c=>{Hae(c.loaded,[a],o),rse(c,e),n&&c.errors.push(n),c.pendingCount===0&&!c.done&&(Object.keys(c.loaded).forEach(u=>{l[u]||(l[u]={});const d=c.loaded[u];d.length&&d.forEach(f=>{l[u][f]===void 0&&(l[u][f]=!0)})}),c.done=!0,c.errors.length?c.callback(c.errors):c.callback())}),this.emit("loaded",l),this.queue=this.queue.filter(c=>!c.done)}read(e,n,r,i=0,a=this.retryTimeout,o){if(!e.length)return o(null,{});if(this.readingCalls>=this.maxParallelReads){this.waitingReads.push({lng:e,ns:n,fcName:r,tried:i,wait:a,callback:o});return}this.readingCalls++;const l=(u,d)=>{if(this.readingCalls--,this.waitingReads.length>0){const f=this.waitingReads.shift();this.read(f.lng,f.ns,f.fcName,f.tried,f.wait,f.callback)}if(u&&d&&i{this.read.call(this,e,n,r,i+1,a*2,o)},a);return}o(u,d)},c=this.backend[r].bind(this.backend);if(c.length===2){try{const u=c(e,n);u&&typeof u.then=="function"?u.then(d=>l(null,d)).catch(l):l(null,u)}catch(u){l(u)}return}return c(e,n,l)}prepareLoading(e,n,r={},i){if(!this.backend)return this.logger.warn("No backend was added via i18next.use. Will not load resources."),i&&i();fn(e)&&(e=this.languageUtils.toResolveHierarchy(e)),fn(n)&&(n=[n]);const a=this.queueLoad(e,n,r,i);if(!a.toLoad.length)return a.pending.length||i(),null;a.toLoad.forEach(o=>{this.loadOne(o)})}load(e,n,r){this.prepareLoading(e,n,{},r)}reload(e,n,r){this.prepareLoading(e,n,{reload:!0},r)}loadOne(e,n=""){const r=e.split("|"),i=r[0],a=r[1];this.read(i,a,"read",void 0,void 0,(o,l)=>{o&&this.logger.warn(`${n}loading namespace ${a} for language ${i} failed`,o),!o&&l&&this.logger.log(`${n}loaded namespace ${a} for language ${i}`,l),this.loaded(e,o,l)})}saveMissing(e,n,r,i,a,o={},l=()=>{}){if(this.services?.utils?.hasLoadedNamespace&&!this.services?.utils?.hasLoadedNamespace(n)){this.logger.warn(`did not save key "${r}" as the namespace "${n}" was not yet loaded`,"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!");return}if(!(r==null||r==="")){if(this.backend?.create){const c={...o,isUpdate:a},u=this.backend.create.bind(this.backend);if(u.length<6)try{let d;u.length===5?d=u(e,n,r,i,c):d=u(e,n,r,i),d&&typeof d.then=="function"?d.then(f=>l(null,f)).catch(l):l(null,d)}catch(d){l(d)}else u(e,n,r,i,l,c)}!e||!e[0]||this.store.addResource(e[0],n,r,i)}}}const iz=()=>({debug:!1,initAsync:!0,ns:["translation"],defaultNS:["translation"],fallbackLng:["dev"],fallbackNS:!1,supportedLngs:!1,nonExplicitSupportedLngs:!1,load:"all",preload:!1,simplifyPluralSuffix:!0,keySeparator:".",nsSeparator:":",pluralSeparator:"_",contextSeparator:"_",partialBundledLanguages:!1,saveMissing:!1,updateMissing:!1,saveMissingTo:"fallback",saveMissingPlurals:!0,missingKeyHandler:!1,missingInterpolationHandler:!1,postProcess:!1,postProcessPassResolved:!1,returnNull:!1,returnEmptyString:!0,returnObjects:!1,joinArrays:!1,returnedObjectHandler:!1,parseMissingKeyHandler:!1,appendNamespaceToMissingKey:!1,appendNamespaceToCIMode:!1,overloadTranslationOptionHandler:t=>{let e={};if(typeof t[1]=="object"&&(e=t[1]),fn(t[1])&&(e.defaultValue=t[1]),fn(t[2])&&(e.tDescription=t[2]),typeof t[2]=="object"||typeof t[3]=="object"){const n=t[3]||t[2];Object.keys(n).forEach(r=>{e[r]=n[r]})}return e},interpolation:{escapeValue:!0,format:t=>t,prefix:"{{",suffix:"}}",formatSeparator:",",unescapePrefix:"-",nestingPrefix:"$t(",nestingSuffix:")",nestingOptionsSeparator:",",maxReplaces:1e3,skipOnVariables:!0},cacheInBuiltFormats:!0}),az=t=>(fn(t.ns)&&(t.ns=[t.ns]),fn(t.fallbackLng)&&(t.fallbackLng=[t.fallbackLng]),fn(t.fallbackNS)&&(t.fallbackNS=[t.fallbackNS]),t.supportedLngs?.indexOf?.("cimode")<0&&(t.supportedLngs=t.supportedLngs.concat(["cimode"])),typeof t.initImmediate=="boolean"&&(t.initAsync=t.initImmediate),t),Cw=()=>{},ase=t=>{Object.getOwnPropertyNames(Object.getPrototypeOf(t)).forEach(n=>{typeof t[n]=="function"&&(t[n]=t[n].bind(t))})};class b0 extends tN{constructor(e={},n){if(super(),this.options=az(e),this.services={},this.logger=sc,this.modules={external:[]},ase(this),n&&!this.isInitialized&&!e.isClone){if(!this.options.initAsync)return this.init(e,n),this;setTimeout(()=>{this.init(e,n)},0)}}init(e={},n){this.isInitializing=!0,typeof e=="function"&&(n=e,e={}),e.defaultNS==null&&e.ns&&(fn(e.ns)?e.defaultNS=e.ns:e.ns.indexOf("translation")<0&&(e.defaultNS=e.ns[0]));const r=iz();this.options={...r,...this.options,...az(e)},this.options.interpolation={...r.interpolation,...this.options.interpolation},e.keySeparator!==void 0&&(this.options.userDefinedKeySeparator=e.keySeparator),e.nsSeparator!==void 0&&(this.options.userDefinedNsSeparator=e.nsSeparator);const i=u=>u?typeof u=="function"?new u:u:null;if(!this.options.isClone){this.modules.logger?sc.init(i(this.modules.logger),this.options):sc.init(null,this.options);let u;this.modules.formatter?u=this.modules.formatter:u=nse;const d=new JU(this.options);this.store=new QU(this.options.resources,this.options);const f=this.services;f.logger=sc,f.resourceStore=this.store,f.languageUtils=d,f.pluralResolver=new Zae(d,{prepend:this.options.pluralSeparator,simplifyPluralSuffix:this.options.simplifyPluralSuffix}),this.options.interpolation.format&&this.options.interpolation.format!==r.interpolation.format&&this.logger.deprecate("init: you are still using the legacy format function, please use the new approach: https://www.i18next.com/translation-function/formatting"),u&&(!this.options.interpolation.format||this.options.interpolation.format===r.interpolation.format)&&(f.formatter=i(u),f.formatter.init&&f.formatter.init(f,this.options),this.options.interpolation.format=f.formatter.format.bind(f.formatter)),f.interpolator=new Jae(this.options),f.utils={hasLoadedNamespace:this.hasLoadedNamespace.bind(this)},f.backendConnector=new ise(i(this.modules.backend),f.resourceStore,f,this.options),f.backendConnector.on("*",(m,...x)=>{this.emit(m,...x)}),this.modules.languageDetector&&(f.languageDetector=i(this.modules.languageDetector),f.languageDetector.init&&f.languageDetector.init(f,this.options.detection,this.options)),this.modules.i18nFormat&&(f.i18nFormat=i(this.modules.i18nFormat),f.i18nFormat.init&&f.i18nFormat.init(this)),this.translator=new B1(this.services,this.options),this.translator.on("*",(m,...x)=>{this.emit(m,...x)}),this.modules.external.forEach(m=>{m.init&&m.init(this)})}if(this.format=this.options.interpolation.format,n||(n=Cw),this.options.fallbackLng&&!this.services.languageDetector&&!this.options.lng){const u=this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);u.length>0&&u[0]!=="dev"&&(this.options.lng=u[0])}!this.services.languageDetector&&!this.options.lng&&this.logger.warn("init: no languageDetector is used and no lng is defined"),["getResource","hasResourceBundle","getResourceBundle","getDataByLanguage"].forEach(u=>{this[u]=(...d)=>this.store[u](...d)}),["addResource","addResources","addResourceBundle","removeResourceBundle"].forEach(u=>{this[u]=(...d)=>(this.store[u](...d),this)});const l=Ab(),c=()=>{const u=(d,f)=>{this.isInitializing=!1,this.isInitialized&&!this.initializedStoreOnce&&this.logger.warn("init: i18next is already initialized. You should call init just once!"),this.isInitialized=!0,this.options.isClone||this.logger.log("initialized",this.options),this.emit("initialized",this.options),l.resolve(f),n(d,f)};if(this.languages&&!this.isInitialized)return u(null,this.t.bind(this));this.changeLanguage(this.options.lng,u)};return this.options.resources||!this.options.initAsync?c():setTimeout(c,0),l}loadResources(e,n=Cw){let r=n;const i=fn(e)?e:this.language;if(typeof e=="function"&&(r=e),!this.options.resources||this.options.partialBundledLanguages){if(i?.toLowerCase()==="cimode"&&(!this.options.preload||this.options.preload.length===0))return r();const a=[],o=l=>{if(!l||l==="cimode")return;this.services.languageUtils.toResolveHierarchy(l).forEach(u=>{u!=="cimode"&&a.indexOf(u)<0&&a.push(u)})};i?o(i):this.services.languageUtils.getFallbackCodes(this.options.fallbackLng).forEach(c=>o(c)),this.options.preload?.forEach?.(l=>o(l)),this.services.backendConnector.load(a,this.options.ns,l=>{!l&&!this.resolvedLanguage&&this.language&&this.setResolvedLanguage(this.language),r(l)})}else r(null)}reloadResources(e,n,r){const i=Ab();return typeof e=="function"&&(r=e,e=void 0),typeof n=="function"&&(r=n,n=void 0),e||(e=this.languages),n||(n=this.options.ns),r||(r=Cw),this.services.backendConnector.reload(e,n,a=>{i.resolve(),r(a)}),i}use(e){if(!e)throw new Error("You are passing an undefined module! Please check the object you are passing to i18next.use()");if(!e.type)throw new Error("You are passing a wrong module! Please check the object you are passing to i18next.use()");return e.type==="backend"&&(this.modules.backend=e),(e.type==="logger"||e.log&&e.warn&&e.error)&&(this.modules.logger=e),e.type==="languageDetector"&&(this.modules.languageDetector=e),e.type==="i18nFormat"&&(this.modules.i18nFormat=e),e.type==="postProcessor"&&wq.addPostProcessor(e),e.type==="formatter"&&(this.modules.formatter=e),e.type==="3rdParty"&&this.modules.external.push(e),this}setResolvedLanguage(e){if(!(!e||!this.languages)&&!(["cimode","dev"].indexOf(e)>-1)){for(let n=0;n-1)&&this.store.hasLanguageSomeTranslations(r)){this.resolvedLanguage=r;break}}!this.resolvedLanguage&&this.languages.indexOf(e)<0&&this.store.hasLanguageSomeTranslations(e)&&(this.resolvedLanguage=e,this.languages.unshift(e))}}changeLanguage(e,n){this.isLanguageChangingTo=e;const r=Ab();this.emit("languageChanging",e);const i=l=>{this.language=l,this.languages=this.services.languageUtils.toResolveHierarchy(l),this.resolvedLanguage=void 0,this.setResolvedLanguage(l)},a=(l,c)=>{c?this.isLanguageChangingTo===e&&(i(c),this.translator.changeLanguage(c),this.isLanguageChangingTo=void 0,this.emit("languageChanged",c),this.logger.log("languageChanged",c)):this.isLanguageChangingTo=void 0,r.resolve((...u)=>this.t(...u)),n&&n(l,(...u)=>this.t(...u))},o=l=>{!e&&!l&&this.services.languageDetector&&(l=[]);const c=fn(l)?l:l&&l[0],u=this.store.hasLanguageSomeTranslations(c)?c:this.services.languageUtils.getBestMatchFromCodes(fn(l)?[l]:l);u&&(this.language||i(u),this.translator.language||this.translator.changeLanguage(u),this.services.languageDetector?.cacheUserLanguage?.(u)),this.loadResources(u,d=>{a(d,u)})};return!e&&this.services.languageDetector&&!this.services.languageDetector.async?o(this.services.languageDetector.detect()):!e&&this.services.languageDetector&&this.services.languageDetector.async?this.services.languageDetector.detect.length===0?this.services.languageDetector.detect().then(o):this.services.languageDetector.detect(o):o(e),r}getFixedT(e,n,r){const i=(a,o,...l)=>{let c;typeof o!="object"?c=this.options.overloadTranslationOptionHandler([a,o].concat(l)):c={...o},c.lng=c.lng||i.lng,c.lngs=c.lngs||i.lngs,c.ns=c.ns||i.ns,c.keyPrefix!==""&&(c.keyPrefix=c.keyPrefix||r||i.keyPrefix);const u=this.options.keySeparator||".";let d;return c.keyPrefix&&Array.isArray(a)?d=a.map(f=>(typeof f=="function"&&(f=Qj(f,{...this.options,...o})),`${c.keyPrefix}${u}${f}`)):(typeof a=="function"&&(a=Qj(a,{...this.options,...o})),d=c.keyPrefix?`${c.keyPrefix}${u}${a}`:a),this.t(d,c)};return fn(e)?i.lng=e:i.lngs=e,i.ns=n,i.keyPrefix=r,i}t(...e){return this.translator?.translate(...e)}exists(...e){return this.translator?.exists(...e)}setDefaultNamespace(e){this.options.defaultNS=e}hasLoadedNamespace(e,n={}){if(!this.isInitialized)return this.logger.warn("hasLoadedNamespace: i18next was not initialized",this.languages),!1;if(!this.languages||!this.languages.length)return this.logger.warn("hasLoadedNamespace: i18n.languages were undefined or empty",this.languages),!1;const r=n.lng||this.resolvedLanguage||this.languages[0],i=this.options?this.options.fallbackLng:!1,a=this.languages[this.languages.length-1];if(r.toLowerCase()==="cimode")return!0;const o=(l,c)=>{const u=this.services.backendConnector.state[`${l}|${c}`];return u===-1||u===0||u===2};if(n.precheck){const l=n.precheck(this,o);if(l!==void 0)return l}return!!(this.hasResourceBundle(r,e)||!this.services.backendConnector.backend||this.options.resources&&!this.options.partialBundledLanguages||o(r,e)&&(!i||o(a,e)))}loadNamespaces(e,n){const r=Ab();return this.options.ns?(fn(e)&&(e=[e]),e.forEach(i=>{this.options.ns.indexOf(i)<0&&this.options.ns.push(i)}),this.loadResources(i=>{r.resolve(),n&&n(i)}),r):(n&&n(),Promise.resolve())}loadLanguages(e,n){const r=Ab();fn(e)&&(e=[e]);const i=this.options.preload||[],a=e.filter(o=>i.indexOf(o)<0&&this.services.languageUtils.isSupportedCode(o));return a.length?(this.options.preload=i.concat(a),this.loadResources(o=>{r.resolve(),n&&n(o)}),r):(n&&n(),Promise.resolve())}dir(e){if(e||(e=this.resolvedLanguage||(this.languages?.length>0?this.languages[0]:this.language)),!e)return"rtl";try{const i=new Intl.Locale(e);if(i&&i.getTextInfo){const a=i.getTextInfo();if(a&&a.direction)return a.direction}}catch{}const n=["ar","shu","sqr","ssh","xaa","yhd","yud","aao","abh","abv","acm","acq","acw","acx","acy","adf","ads","aeb","aec","afb","ajp","apc","apd","arb","arq","ars","ary","arz","auz","avl","ayh","ayl","ayn","ayp","bbz","pga","he","iw","ps","pbt","pbu","pst","prp","prd","ug","ur","ydd","yds","yih","ji","yi","hbo","men","xmn","fa","jpr","peo","pes","prs","dv","sam","ckb"],r=this.services?.languageUtils||new JU(iz());return e.toLowerCase().indexOf("-latn")>1?"ltr":n.indexOf(r.getLanguagePartFromCode(e))>-1||e.toLowerCase().indexOf("-arab")>1?"rtl":"ltr"}static createInstance(e={},n){const r=new b0(e,n);return r.createInstance=b0.createInstance,r}cloneInstance(e={},n=Cw){const r=e.forkResourceStore;r&&delete e.forkResourceStore;const i={...this.options,...e,isClone:!0},a=new b0(i);if((e.debug!==void 0||e.prefix!==void 0)&&(a.logger=a.logger.clone(e)),["store","services","language"].forEach(l=>{a[l]=this[l]}),a.services={...this.services},a.services.utils={hasLoadedNamespace:a.hasLoadedNamespace.bind(a)},r){const l=Object.keys(this.store.data).reduce((c,u)=>(c[u]={...this.store.data[u]},c[u]=Object.keys(c[u]).reduce((d,f)=>(d[f]={...c[u][f]},d),c[u]),c),{});a.store=new QU(l,i),a.services.resourceStore=a.store}return a.translator=new B1(a.services,i),a.translator.on("*",(l,...c)=>{a.emit(l,...c)}),a.init(i,n),a.translator.options=i,a.translator.backendConnector.services.utils={hasLoadedNamespace:a.hasLoadedNamespace.bind(a)},a}toJSON(){return{options:this.options,store:this.store,language:this.language,languages:this.languages,resolvedLanguage:this.resolvedLanguage}}}const _s=b0.createInstance();_s.createInstance;_s.dir;_s.init;_s.loadResources;_s.reloadResources;_s.use;_s.changeLanguage;_s.getFixedT;_s.t;_s.exists;_s.setDefaultNamespace;_s.hasLoadedNamespace;_s.loadNamespaces;_s.loadLanguages;const sse=(t,e,n,r)=>{const i=[n,{code:e,...r||{}}];if(t?.services?.logger?.forward)return t.services.logger.forward(i,"warn","react-i18next::",!0);em(i[0])&&(i[0]=`react-i18next:: ${i[0]}`),t?.services?.logger?.warn?t.services.logger.warn(...i):console?.warn&&console.warn(...i)},sz={},Sq=(t,e,n,r)=>{em(n)&&sz[n]||(em(n)&&(sz[n]=new Date),sse(t,e,n,r))},Mq=(t,e)=>()=>{if(t.isInitialized)e();else{const n=()=>{setTimeout(()=>{t.off("initialized",n)},0),e()};t.on("initialized",n)}},Zj=(t,e,n)=>{t.loadNamespaces(e,Mq(t,n))},oz=(t,e,n,r)=>{if(em(n)&&(n=[n]),t.options.preload&&t.options.preload.indexOf(e)>-1)return Zj(t,n,r);n.forEach(i=>{t.options.ns.indexOf(i)<0&&t.options.ns.push(i)}),t.loadLanguages(e,Mq(t,r))},ose=(t,e,n={})=>!e.languages||!e.languages.length?(Sq(e,"NO_LANGUAGES","i18n.languages were undefined or empty",{languages:e.languages}),!0):e.hasLoadedNamespace(t,{lng:n.lng,precheck:(r,i)=>{if(n.bindI18n&&n.bindI18n.indexOf("languageChanging")>-1&&r.services.backendConnector.backend&&r.isLanguageChangingTo&&!i(r.isLanguageChangingTo,t))return!1}}),em=t=>typeof t=="string",lse=t=>typeof t=="object"&&t!==null,cse=/&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34|nbsp|#160|copy|#169|reg|#174|hellip|#8230|#x2F|#47);/g,use={"&":"&","&":"&","<":"<","<":"<",">":">",">":">","'":"'","'":"'",""":'"',""":'"'," ":" "," ":" ","©":"©","©":"©","®":"®","®":"®","…":"…","…":"…","/":"/","/":"/"},dse=t=>use[t],hse=t=>t.replace(cse,dse);let Jj={bindI18n:"languageChanged",bindI18nStore:"",transEmptyNodeValue:"",transSupportBasicHtmlNodes:!0,transWrapTextNodes:"",transKeepBasicHtmlNodesFor:["br","strong","i","p"],useSuspense:!0,unescape:hse};const fse=(t={})=>{Jj={...Jj,...t}},mse=()=>Jj;let Nq;const pse=t=>{Nq=t},gse=()=>Nq,xse={type:"3rdParty",init(t){fse(t.options.react),pse(t)}},bse=_.createContext();class yse{constructor(){this.usedNamespaces={}}addUsedNamespaces(e){e.forEach(n=>{this.usedNamespaces[n]||(this.usedNamespaces[n]=!0)})}getUsedNamespaces(){return Object.keys(this.usedNamespaces)}}var KE={exports:{}},XE={};var lz;function vse(){if(lz)return XE;lz=1;var t=px();function e(f,p){return f===p&&(f!==0||1/f===1/p)||f!==f&&p!==p}var n=typeof Object.is=="function"?Object.is:e,r=t.useState,i=t.useEffect,a=t.useLayoutEffect,o=t.useDebugValue;function l(f,p){var m=p(),x=r({inst:{value:m,getSnapshot:p}}),b=x[0].inst,y=x[1];return a(function(){b.value=m,b.getSnapshot=p,c(b)&&y({inst:b})},[f,m,p]),i(function(){return c(b)&&y({inst:b}),f(function(){c(b)&&y({inst:b})})},[f]),o(m),m}function c(f){var p=f.getSnapshot;f=f.value;try{var m=p();return!n(f,m)}catch{return!0}}function u(f,p){return p()}var d=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?u:l;return XE.useSyncExternalStore=t.useSyncExternalStore!==void 0?t.useSyncExternalStore:d,XE}var cz;function kq(){return cz||(cz=1,KE.exports=vse()),KE.exports}var fR=kq();const wse=(t,e)=>em(e)?e:lse(e)&&em(e.defaultValue)?e.defaultValue:Array.isArray(t)?t[t.length-1]:t,_se={t:wse,ready:!1},Sse=()=>()=>{},Hn=(t,e={})=>{const{i18n:n}=e,{i18n:r,defaultNS:i}=_.useContext(bse)||{},a=n||r||gse();a&&!a.reportNamespaces&&(a.reportNamespaces=new yse),a||Sq(a,"NO_I18NEXT_INSTANCE","useTranslation: You will need to pass in an i18next instance by using initReactI18next");const o=_.useMemo(()=>({...mse(),...a?.options?.react,...e}),[a,e]),{useSuspense:l,keyPrefix:c}=o,u=i||a?.options?.defaultNS,d=em(u)?[u]:u||["translation"],f=_.useMemo(()=>d,d);a?.reportNamespaces?.addUsedNamespaces?.(f);const p=_.useRef(0),m=_.useCallback(A=>{if(!a)return Sse;const{bindI18n:D,bindI18nStore:U}=o,F=()=>{p.current+=1,A()};return D&&a.on(D,F),U&&a.store.on(U,F),()=>{D&&D.split(" ").forEach($=>a.off($,F)),U&&U.split(" ").forEach($=>a.store.off($,F))}},[a,o]),x=_.useRef(),b=_.useCallback(()=>{if(!a)return _se;const A=!!(a.isInitialized||a.initializedStoreOnce)&&f.every(H=>ose(H,a,o)),D=e.lng||a.language,U=p.current,F=x.current;if(F&&F.ready===A&&F.lng===D&&F.keyPrefix===c&&F.revision===U)return F;const j={t:a.getFixedT(D,o.nsMode==="fallback"?f:f[0],c),ready:A,lng:D,keyPrefix:c,revision:U};return x.current=j,j},[a,f,c,o,e.lng]),[y,v]=_.useState(0),{t:S,ready:N}=fR.useSyncExternalStore(m,b,b);_.useEffect(()=>{if(a&&!N&&!l){const A=()=>v(D=>D+1);e.lng?oz(a,e.lng,f,A):Zj(a,f,A)}},[a,e.lng,f,N,l,y]);const T=a||{},k=_.useRef(null),C=_.useRef(),E=A=>{const D=Object.getOwnPropertyDescriptors(A);D.__original&&delete D.__original;const U=Object.create(Object.getPrototypeOf(A),D);if(!Object.prototype.hasOwnProperty.call(U,"__original"))try{Object.defineProperty(U,"__original",{value:A,writable:!1,enumerable:!1,configurable:!1})}catch{}return U},R=_.useMemo(()=>{const A=T,D=A?.language;let U=A;A&&(k.current&&k.current.__original===A?C.current!==D?(U=E(A),k.current=U,C.current=D):U=k.current:(U=E(A),k.current=U,C.current=D));const F=[S,U,N];return F.t=S,F.i18n=U,F.ready=N,F},[S,T,N,T.resolvedLanguage,T.language,T.languages]);if(a&&l&&!N)throw new Promise(A=>{const D=()=>A();e.lng?oz(a,e.lng,f,D):Zj(a,f,D)});return R},{slice:Mse,forEach:Nse}=[];function kse(t){return Nse.call(Mse.call(arguments,1),e=>{if(e)for(const n in e)t[n]===void 0&&(t[n]=e[n])}),t}function Ese(t){return typeof t!="string"?!1:[/<\s*script.*?>/i,/<\s*\/\s*script\s*>/i,/<\s*img.*?on\w+\s*=/i,/<\s*\w+\s*on\w+\s*=.*?>/i,/javascript\s*:/i,/vbscript\s*:/i,/expression\s*\(/i,/eval\s*\(/i,/alert\s*\(/i,/document\.cookie/i,/document\.write\s*\(/i,/window\.location/i,/innerHTML/i].some(n=>n.test(t))}const uz=/^[\u0009\u0020-\u007e\u0080-\u00ff]+$/,Tse=function(t,e){const r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{path:"/"},i=encodeURIComponent(e);let a=`${t}=${i}`;if(r.maxAge>0){const o=r.maxAge-0;if(Number.isNaN(o))throw new Error("maxAge should be a Number");a+=`; Max-Age=${Math.floor(o)}`}if(r.domain){if(!uz.test(r.domain))throw new TypeError("option domain is invalid");a+=`; Domain=${r.domain}`}if(r.path){if(!uz.test(r.path))throw new TypeError("option path is invalid");a+=`; Path=${r.path}`}if(r.expires){if(typeof r.expires.toUTCString!="function")throw new TypeError("option expires is invalid");a+=`; Expires=${r.expires.toUTCString()}`}if(r.httpOnly&&(a+="; HttpOnly"),r.secure&&(a+="; Secure"),r.sameSite)switch(typeof r.sameSite=="string"?r.sameSite.toLowerCase():r.sameSite){case!0:a+="; SameSite=Strict";break;case"lax":a+="; SameSite=Lax";break;case"strict":a+="; SameSite=Strict";break;case"none":a+="; SameSite=None";break;default:throw new TypeError("option sameSite is invalid")}return r.partitioned&&(a+="; Partitioned"),a},dz={create(t,e,n,r){let i=arguments.length>4&&arguments[4]!==void 0?arguments[4]:{path:"/",sameSite:"strict"};n&&(i.expires=new Date,i.expires.setTime(i.expires.getTime()+n*60*1e3)),r&&(i.domain=r),document.cookie=Tse(t,e,i)},read(t){const e=`${t}=`,n=document.cookie.split(";");for(let r=0;r-1&&(r=window.location.hash.substring(window.location.hash.indexOf("?")));const a=r.substring(1).split("&");for(let o=0;o0&&a[o].substring(0,l)===e&&(n=a[o].substring(l+1))}}return n}},jse={name:"hash",lookup(t){let{lookupHash:e,lookupFromHashIndex:n}=t,r;if(typeof window<"u"){const{hash:i}=window.location;if(i&&i.length>2){const a=i.substring(1);if(e){const o=a.split("&");for(let l=0;l0&&o[l].substring(0,c)===e&&(r=o[l].substring(c+1))}}if(r)return r;if(!r&&n>-1){const o=i.match(/\/([a-zA-Z-]*)/g);return Array.isArray(o)?o[typeof n=="number"?n:0]?.replace("/",""):void 0}}}return r}};let pp=null;const hz=()=>{if(pp!==null)return pp;try{if(pp=typeof window<"u"&&window.localStorage!==null,!pp)return!1;const t="i18next.translate.boo";window.localStorage.setItem(t,"foo"),window.localStorage.removeItem(t)}catch{pp=!1}return pp};var Pse={name:"localStorage",lookup(t){let{lookupLocalStorage:e}=t;if(e&&hz())return window.localStorage.getItem(e)||void 0},cacheUserLanguage(t,e){let{lookupLocalStorage:n}=e;n&&hz()&&window.localStorage.setItem(n,t)}};let gp=null;const fz=()=>{if(gp!==null)return gp;try{if(gp=typeof window<"u"&&window.sessionStorage!==null,!gp)return!1;const t="i18next.translate.boo";window.sessionStorage.setItem(t,"foo"),window.sessionStorage.removeItem(t)}catch{gp=!1}return gp};var Dse={name:"sessionStorage",lookup(t){let{lookupSessionStorage:e}=t;if(e&&fz())return window.sessionStorage.getItem(e)||void 0},cacheUserLanguage(t,e){let{lookupSessionStorage:n}=e;n&&fz()&&window.sessionStorage.setItem(n,t)}},Rse={name:"navigator",lookup(t){const e=[];if(typeof navigator<"u"){const{languages:n,userLanguage:r,language:i}=navigator;if(n)for(let a=0;a0?e:void 0}},Ose={name:"htmlTag",lookup(t){let{htmlTag:e}=t,n;const r=e||(typeof document<"u"?document.documentElement:null);return r&&typeof r.getAttribute=="function"&&(n=r.getAttribute("lang")),n}},Lse={name:"path",lookup(t){let{lookupFromPathIndex:e}=t;if(typeof window>"u")return;const n=window.location.pathname.match(/\/([a-zA-Z-]*)/g);return Array.isArray(n)?n[typeof e=="number"?e:0]?.replace("/",""):void 0}},Fse={name:"subdomain",lookup(t){let{lookupFromSubdomainIndex:e}=t;const n=typeof e=="number"?e+1:1,r=typeof window<"u"&&window.location?.hostname?.match(/^(\w{2,5})\.(([a-z0-9-]{1,63}\.[a-z]{2,6})|localhost)/i);if(r)return r[n]}};let Eq=!1;try{document.cookie,Eq=!0}catch{}const Tq=["querystring","cookie","localStorage","sessionStorage","navigator","htmlTag"];Eq||Tq.splice(1,1);const Ise=()=>({order:Tq,lookupQuerystring:"lng",lookupCookie:"i18next",lookupLocalStorage:"i18nextLng",lookupSessionStorage:"i18nextLng",caches:["localStorage"],excludeCacheFor:["cimode"],convertDetectedLanguage:t=>t});class Aq{constructor(e){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};this.type="languageDetector",this.detectors={},this.init(e,n)}init(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{languageUtils:{}},n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};this.services=e,this.options=kse(n,this.options||{},Ise()),typeof this.options.convertDetectedLanguage=="string"&&this.options.convertDetectedLanguage.indexOf("15897")>-1&&(this.options.convertDetectedLanguage=i=>i.replace("-","_")),this.options.lookupFromUrlIndex&&(this.options.lookupFromPathIndex=this.options.lookupFromUrlIndex),this.i18nOptions=r,this.addDetector(Ase),this.addDetector(Cse),this.addDetector(Pse),this.addDetector(Dse),this.addDetector(Rse),this.addDetector(Ose),this.addDetector(Lse),this.addDetector(Fse),this.addDetector(jse)}addDetector(e){return this.detectors[e.name]=e,this}detect(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:this.options.order,n=[];return e.forEach(r=>{if(this.detectors[r]){let i=this.detectors[r].lookup(this.options);i&&typeof i=="string"&&(i=[i]),i&&(n=n.concat(i))}}),n=n.filter(r=>r!=null&&!Ese(r)).map(r=>this.options.convertDetectedLanguage(r)),this.services&&this.services.languageUtils&&this.services.languageUtils.getBestMatchFromCodes?n:n.length>0?n[0]:null}cacheUserLanguage(e){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:this.options.caches;n&&(this.options.excludeCacheFor&&this.options.excludeCacheFor.indexOf(e)>-1||n.forEach(r=>{this.detectors[r]&&this.detectors[r].cacheUserLanguage(e,this.options)}))}}Aq.type="languageDetector";const Use={nav:{printers:"Printers",archives:"Archives",queue:"Queue",stats:"Statistics",profiles:"Profiles",maintenance:"Maintenance",projects:"Projects",files:"File Manager",settings:"Settings",system:"System",collapseSidebar:"Collapse sidebar",expandSidebar:"Expand sidebar",update:"Update",updateAvailable:"Update available: v{{version}}",updateAvailableBanner:"Version {{version}} is available!",viewUpdate:"View update",viewOnGithub:"View on GitHub",keyboardShortcuts:"Keyboard shortcuts (?)",switchToLight:"Switch to light mode",switchToDark:"Switch to dark mode",smartSwitches:"Smart Switches",logout:"Logout"},common:{save:"Save",saving:"Saving...",cancel:"Cancel",delete:"Delete",edit:"Edit",add:"Add",close:"Close",confirm:"Confirm",loading:"Loading...",error:"Error",success:"Success",warning:"Warning",enabled:"Enabled",disabled:"Disabled",yes:"Yes",no:"No",on:"On",off:"Off",all:"All",none:"None",search:"Search",filter:"Filter",sort:"Sort",refresh:"Refresh",download:"Download",upload:"Upload",actions:"Actions",status:"Status",name:"Name",description:"Description",date:"Date",time:"Time",hours:"hours",minutes:"minutes",seconds:"seconds",days:"days",enable:"Enable",disable:"Disable",permissions:"Permissions",noPrinters:"No printers configured",noData:"No data available",linkNotFound:"Link not found",required:"Required",optional:"Optional",dismiss:"Dismiss",apply:"Apply",reset:"Reset",clear:"Clear",selectAll:"Select All",deselectAll:"Deselect All",noChange:"— No change —",unchanged:"Unchanged",unassigned:"Unassigned",unknown:"Unknown",unknownError:"Unknown error",today:"Today",asap:"ASAP",overdue:"Overdue",now:"Now",collapse:"Collapse",expand:"Expand",viewArchive:"View archive",viewInFileManager:"View in File Manager",addedBy:"Added by {{username}}",prints:"prints",more:"+{{count}} more",ascending:"Ascending",descending:"Descending",printer:"Printer",remove:"Remove",type:"Type",print:"Print",rename:"Rename",move:"Move",create:"Create",duplicate:"Duplicate",left:"Left",right:"Right"},printers:{title:"Printers",addPrinter:"Add Printer",editPrinter:"Edit Printer",deletePrinter:"Delete Printer",printerName:"Printer Name",serialNumber:"Serial Number",ipAddress:"IP Address",accessCode:"Access Code",model:"Model",nozzleCount:"Nozzle Count",autoArchive:"Auto Archive",status:{idle:"Idle",printing:"Printing",paused:"Paused",offline:"Offline",error:"Error",finished:"Finished",unknown:"Unknown"},temperatures:{nozzle:"Nozzle",bed:"Bed",chamber:"Chamber"},progress:"{{percent}}% complete",timeRemaining:"{{time}} remaining",deleteConfirm:'Are you sure you want to delete "{{name}}"?',maintenanceOk:"Maintenance OK",maintenanceWarning:"{{count}} warning",maintenanceWarning_plural:"{{count}} warnings",maintenanceDue:"{{count}} due",maintenanceDue_plural:"{{count}} due",sort:{name:"Name",status:"Status",model:"Model",location:"Location",ascending:"Sort ascending",descending:"Sort descending"},cardSize:{small:"Small cards",medium:"Medium cards",large:"Large cards",extraLarge:"Extra large cards"},hideOffline:"Hide offline",powerOn:"Power On",offlinePrintersWithPlugs:"Offline printers with smart plugs",noPrintersConfigured:"No printers configured yet",readyToPrint:"Ready to print",external:"External",deleteArchives:"Delete print archives",noLabel:"No label",printPreview:"Print preview",width:"Width",height:"Height",noObjectsFound:"No objects found",objectsLoadedOnPrintStart:"Objects are loaded when a print starts",willBeSkipped:"Will be skipped",name:"Name",serialCannotBeChanged:"Serial number cannot be changed",locationHelp:"Used to group printers and filter queue jobs",wifiSignal:{veryWeak:"Very weak",weak:"Weak",fair:"Fair",good:"Good",excellent:"Excellent"},maintenanceUpToDate:"All maintenance up to date - Click to view",chamberLightOn:"Turn on chamber light",chamberLightOff:"Turn off chamber light",browseFiles:"Browse printer files",autoOffAfterPrint:"Auto power-off after print",autoOffExecuted:"Auto-off was executed - turn printer on to reset",hmsErrors:"HMS Errors",viewHmsErrors:"View {{count}} HMS error(s)",resume:"Resume",pause:"Pause",stop:"Stop",camera:"Camera",skipObject:"Skip Object",reconnect:"Reconnect",mqttDebug:"MQTT Debug",activeNozzle:"Active: {{nozzle}} nozzle",firmwareUpdate:"Firmware Update",firmwareInstructions:"On the printer's touchscreen, go to",firmwareNav:"Navigate to",settings:"Settings",firmware:"Firmware",discoverPrinters:"Discover Printers",searching:"Searching...",manualEntry:"Manual Entry",addFromCloud:"Add from Cloud",toast:{printerDeleted:"Printer deleted",printerAdded:"Printer added",printerUpdated:"Printer updated",failedToDelete:"Failed to delete printer",failedToAdd:"Failed to add printer",failedToUpdate:"Failed to update printer",commandSent:"Command sent",failedToSendCommand:"Failed to send command",turnedOn:"{{name}} turned on",failedToPowerOn:"Failed to power on {{name}}",scriptTriggered:"Script triggered",printStopped:"Print stopped",printPaused:"Print paused",printResumed:"Print resumed",referenceDeleted:"Reference deleted",detectionAreaSaved:"Detection area saved",failedToRunScript:"Failed to run script",failedToStopPrint:"Failed to stop print",failedToPausePrint:"Failed to pause print",failedToResumePrint:"Failed to resume print",failedToControlChamberLight:"Failed to control chamber light",failedToUpdateSetting:"Failed to update setting",failedToSkipObjects:"Failed to skip objects",failedToRereadRfid:"Failed to re-read RFID",failedToCheckPlate:"Failed to check plate",failedToUpdateLabel:"Failed to update label",failedToDeleteReference:"Failed to delete reference",failedToSaveDetectionArea:"Failed to save detection area",plateCheckEnabled:"Plate check enabled",plateCheckDisabled:"Plate check disabled",calibrationSaved:"Calibration saved!",calibrationFailed:"Calibration failed",rfidRereadInitiated:"RFID re-read initiated"},connection:{connected:"Connected",offline:"Offline"},queue:{inQueue:"{{count}} print in queue",inQueue_plural:"{{count}} prints in queue"},controls:"Controls",rfid:{reread:"Re-read RFID"},permission:{noAdd:"You do not have permission to add printers",noEdit:"You do not have permission to edit printers",noDelete:"You do not have permission to delete printers",noControl:"You do not have permission to control printers",noFiles:"You do not have permission to access printer files",noAmsRfid:"You do not have permission to re-read AMS RFID",noSmartPlugControl:"You do not have permission to control smart plugs"},modal:{addTitle:"Add Printer",editTitle:"Edit Printer",myPrinter:"My Printer",selectModel:"Select model...",locationGroup:"Location / Group (optional)",locationPlaceholder:"e.g., Workshop, Office, Basement",autoArchiveLabel:"Auto-archive completed prints",fromPrinterSettings:"From printer settings",modelOptional:"Model (optional)",saveChanges:"Save Changes"},skipObjects:{tooltip:"Skip objects",onlyWhilePrinting:"Skip objects (only while printing)",requiresMultiple:"Skip objects (requires 2+ objects)",title:"Skip Objects",matchIdsInfo:"Match IDs with your printer display",printerShowsIds:"The printer screen shows object IDs on the build plate",skipSelected:"Skip Selected",skipping:"Skipping...",noObjectsSelected:"No objects selected",selectObjectsToSkip:"Select objects you want to skip from the current print",skipped:"skipped",objectsSkipped:"Objects skipped",activeCount:"{{count}} active",waitForLayer:"Wait for layer 2+ to skip objects (currently layer {{layer}})",skip:"Skip"},confirm:{deleteTitle:"Delete Printer",deleteMessage:'Are you sure you want to delete "{{name}}"? This will remove all connection settings.',deleteArchivesNote:"All print history for this printer will be permanently deleted.",keepArchivesNote:"Print history will be kept but no longer associated with this printer.",stopTitle:"Stop Print",stopMessage:'Are you sure you want to stop the current print on "{{name}}"? This will cancel the print job.',stopButton:"Stop Print",pauseTitle:"Pause Print",pauseMessage:'Are you sure you want to pause the current print on "{{name}}"?',pauseButton:"Pause Print",resumeTitle:"Resume Print",resumeMessage:'Are you sure you want to resume the print on "{{name}}"?',resumeButton:"Resume Print",powerOnTitle:"Power On Printer",powerOnMessage:'Are you sure you want to turn ON the power for "{{name}}"?',powerOnButton:"Power On",powerOffTitle:"Power Off Printer",powerOffMessage:'Are you sure you want to turn OFF the power for "{{name}}"?',powerOffWarning:'WARNING: "{{name}}" is currently printing! Are you sure you want to turn OFF the power? This will interrupt the print and may damage the printer.',powerOffButton:"Power Off"},discovery:{title:"Discover Printers",searching:"Searching...",scanning:"Scanning...",scanProgress:"Scanning... {{scanned}}/{{total}}",foundPrinters:"Found {{count}} printer(s)",noPrintersFound:"No printers found",noPrintersFoundSubnet:"No printers found in the specified subnet.",noPrintersFoundNetwork:"No printers found on the network.",allConfigured:"All discovered printers are already configured.",alreadyAdded:"Already added",select:"Select",manualEntry:"Manual Entry",addFromCloud:"Add from Cloud",subnetToScan:"Subnet to scan",dockerNote:"Docker detected. Enter your printer's subnet in CIDR notation. Requires network_mode: host in docker-compose.yml.",scanSubnet:"Scan Subnet for Printers",discoverNetwork:"Discover Printers on Network",scanningSubnet:"Scanning subnet for Bambu printers...",scanningNetwork:"Scanning network...",serialRequired:"Serial required",unknown:"Unknown",failedToStart:"Failed to start discovery"},filaments:"Filaments",openCameraOverlay:"Open camera overlay",openCameraWindow:"Open camera in new window",firmwareUpdateAvailable:"Firmware update available: {{current}} → {{latest}}",firmwareUpdateButton:"Update",plateDetection:{noPermission:"You do not have permission to update printers",enabledClick:"Plate check enabled - Click to disable",disabledClick:"Plate check disabled - Click to enable",manageCalibration:"Manage plate detection calibration",calibrationRequired:"Calibration Required",calibrationInstructions:"Please ensure the build plate is completely empty, then click Calibrate.",calibrationDescription:"Calibration captures a reference image of the empty plate. Future checks will compare against this reference to detect objects.",calibrationTip:"Tip: You can store up to 5 calibrations for different plates. The system automatically uses the best match when checking.",plateEmpty:"Plate appears empty",objectsDetected:"Objects detected on plate",confidence:"Confidence",difference:"Difference",analysisPreview:"Analysis preview:",analysisLegend:"Green box = detection area, Red overlay = differences from calibration",savedReferences:"Saved References ({{count}}/{{max}})",deleteReference:"Delete reference",labelPlaceholder:"Label...",clickToEdit:"{{label}} - Click to edit",clickToAddLabel:"Click to add label"},fans:{partCooling:"Part Cooling Fan",auxiliary:"Auxiliary Fan",chamber:"Chamber Fan"},clickToViewHmsErrors:"Click to view HMS errors",estimatedCompletion:"Estimated completion time",slotOptions:"Slot options",firmwareModal:{title:"Firmware Update",currentVersion:"Current:",latestVersion:"Latest:",releaseNotes:"Release Notes",checkingPrereqs:"Checking prerequisites...",sdCardReady:"SD card ready. Click below to upload firmware.",uploadedSuccess:"Firmware uploaded to SD card!",applyInstructions:"To apply the update on your printer:",step1:"On the printer's touchscreen, go to Settings",step2:"Navigate to Firmware",step3:"Select Update from SD card",step4:"The update will take 10-20 minutes",done:"Done",starting:"Starting...",uploadFirmware:"Upload Firmware",uploadedToast:"Firmware uploaded! Trigger update from printer screen."},accessCodePlaceholder:"Leave empty to keep current",roi:{title:"Detection Area (ROI)",xStart:"X Start",yStart:"Y Start",width:"Width",height:"Height",instruction:"Adjust the detection area to focus on the build plate. The green box in the preview shows the current area."}},archives:{title:"Print Archives",searchPlaceholder:"Search archives...",filterByPrinter:"Filter by printer",filterByStatus:"Filter by status",sortBy:"Sort by",sortNewest:"Newest first",sortOldest:"Oldest first",sortName:"Name",sortDuration:"Duration",sortLargest:"Largest first",sortSmallest:"Smallest first",sortSize:"Size",noArchives:"No archives found",noArchivesSearch:"No archives match your search",noArchivesYet:"No archives yet",loadingArchives:"Loading archives...",releaseToUpload:"Release to upload",showAll:"Show all",showFavoritesOnly:"Show favorites only",gridView:"Grid view",listView:"List view",calendarView:"Calendar view",manageTags:"Manage Tags",showFailedPrints:"Show failed prints",hideFailedPrints:"Hide failed prints",printTime:"Print Time",filamentUsed:"Filament Used",cost:"Cost",reprint:"Reprint",preview:"Preview",deleteArchive:"Delete Archive",deleteConfirm:"Are you sure you want to delete this archive?",favorite:"Favorite",unfavorite:"Remove from favorites",viewDetails:"View Details",status:{completed:"Completed",failed:"Failed",stopped:"Stopped"},toast:{source3mfAttached:"Source 3MF attached: {{filename}}",failedUploadSource3mf:"Failed to upload source 3MF",source3mfRemoved:"Source 3MF removed",failedRemoveSource3mf:"Failed to remove source 3MF",f3dAttached:"F3D attached: {{filename}}",failedUploadF3d:"Failed to upload F3D",f3dRemoved:"F3D removed",failedRemoveF3d:"Failed to remove F3D",timelapseAttached:"Timelapse attached: {{filename}}",timelapseAlreadyAttached:"Timelapse already attached",noMatchingTimelapse:"No matching timelapse found",failedScanTimelapse:"Failed to scan for timelapse",failedAttachTimelapse:"Failed to attach timelapse",archiveDeleted:"Archive deleted",failedDeleteArchive:"Failed to delete archive",addedToFavorites:"Added to favorites",removedFromFavorites:"Removed from favorites",projectUpdated:"Project updated",failedUpdateProject:"Failed to update project",linkCopied:"Link copied to clipboard",failedCopyLink:"Failed to copy link",photoDeleted:"Photo deleted",failedDeletePhoto:"Failed to delete photo",failedDeleteArchives:"Failed to delete archives",failedUpdateFavorites:"Failed to update favorites",exportDownloaded:"Export downloaded",exportFailed:"Export failed"},menu:{print:"Print",schedule:"Schedule",openInBambuStudio:"Open in Bambu Studio",slice:"Slice",externalLink:"External Link",viewOnMakerWorld:"View on MakerWorld",preview3d:"3D Preview",viewTimelapse:"View Timelapse",scanForTimelapse:"Scan for Timelapse",downloadSource3mf:"Download Source 3MF",uploadSource3mf:"Upload Source 3MF",replaceSource3mf:"Replace Source 3MF",removeSource3mf:"Remove Source 3MF",uploadF3d:"Upload F3D",replaceF3d:"Replace F3D",downloadF3d:"Download F3D",removeF3d:"Remove F3D",download:"Download",copyDownloadLink:"Copy Download Link",qrCode:"QR Code",viewPhotos:"View Photos",viewPhotosCount:"View Photos ({{count}})",projectPage:"Project Page",addToFavorites:"Add to Favorites",removeFromFavorites:"Remove from Favorites",edit:"Edit",goToProject:"Go to Project: {{name}}",addToProject:"Add to Project",removeFromProject:"Remove from Project",loading:"Loading...",noProjectsAvailable:"No projects available",select:"Select",deselect:"Deselect",delete:"Delete"},permission:{noReprint:"You do not have permission to reprint this archive",noAddToQueue:"You do not have permission to add to queue",noUpdateArchives:"You do not have permission to update archives",noUploadFiles:"You do not have permission to upload files",noDownload:"You do not have permission to download archives",noCopyLink:"You do not have permission to copy download links",noDelete:"You do not have permission to delete this archive",noCreate:"You do not have permission to create archives"},card:{previousPlate:"Previous plate",nextPlate:"Next plate",plateNumber:"Plate {{index}}",moreOptions:"Right-click for more options",addToFavorites:"Add to favorites",removeFromFavorites:"Remove from favorites",cancelled:"cancelled",failed:"failed",duplicate:"duplicate",duplicateTitle:"This model has been printed before",openSource3mf:"Open source 3MF in Bambu Studio (right-click for more options)",downloadF3d:"Download Fusion 360 design file",viewTimelapse:"View timelapse",viewPhoto:"View 1 photo",viewPhotos:"View {{count}} photos",openFolder:"Open folder: {{name}}",slicedFile:"Sliced file - ready to print",sourceFile:"Source file only - no AMS mapping available",gcode:"GCODE",source:"SOURCE",project:"Project: {{name}}",estimated:"Estimated: {{time}}",actual:"Actual: {{time}}",accuracy:"Accuracy: {{percent}}%",filament:"{{weight}}g",layer:"{{count}} layer",layers:"{{count}} layers",object:"{{count}} object",objects:"{{count}} objects",slicedFor:"Sliced for {{model}}",uploadedBy:"Uploaded by {{name}}",noPermissionReprint:"You do not have permission to reprint",noPermissionEdit:"You do not have permission to edit archives",noPermissionDelete:"You do not have permission to delete archives",reprint:"Reprint",schedulePrint:"Schedule Print",schedule:"Schedule",openInBambuStudio:"Open in Bambu Studio",openInBambuStudioToSlice:"Open in Bambu Studio to slice",slice:"Slice",externalLink:"External Link",makerWorld:"MakerWorld: {{designer}}",viewProject:"View project",noExternalLink:"No external link",preview3d:"3D Preview",download:"Download",edit:"Edit",delete:"Delete"},modal:{deleteArchive:"Delete Archive",deleteConfirm:'Are you sure you want to delete "{{name}}"? This action cannot be undone.',deleteButton:"Delete",removeSource3mf:"Remove Source 3MF",removeSource3mfConfirm:'Are you sure you want to remove the source 3MF file from "{{name}}"? This will delete the original slicer project file.',removeButton:"Remove",removeF3d:"Remove F3D",removeF3dConfirm:'Are you sure you want to remove the Fusion 360 design file from "{{name}}"?',timelapse:"{{name}} - Timelapse",selectTimelapse:"Select Timelapse",selectTimelapseDesc:"No auto-match found. Select the timelapse for this print:",deleteArchives:"Delete Archives",deleteArchivesConfirm:"Are you sure you want to delete {{count}} archive(s)? This action cannot be undone.",deleteCount:"Delete {{count}}"},page:{title:"Archives",printsCount:"{{filtered}} of {{total}} prints",dropFilesHere:"Drop .3mf files here",releaseToUpload:"Release to upload",only3mfSupported:"Only .3mf files are supported",close:"Close",selected:"{{count}} selected",selectAll:"Select All",tags:"Tags",project:"Project",favorite:"Favorite",delete:"Delete",toggledFavorites:"Toggled favorites for {{count}} archive(s)",failedUpdateFavorites:"Failed to update favorites",archivesDeleted:"{{count}} archive(s) deleted",failedDeleteArchives:"Failed to delete archives",photoDeleted:"Photo deleted",failedDeletePhoto:"Failed to delete photo"},list:{name:"Name",printer:"Printer",date:"Date",size:"Size",actions:"Actions",hasTimelapse:"Has timelapse"}},queue:{title:"Print Queue",subtitle:"Schedule and manage your print jobs",addToQueue:"Add to Queue",print:"Print",reprint:"Re-print",schedulePrint:"Schedule Print",editQueueItem:"Edit Queue Item",printToPrinters:"Print to {{count}} Printers",queueToPrinters:"Queue to {{count}} Printers",sending:"Sending...",sendingProgress:"Sending {{current}}/{{total}}...",adding:"Adding...",addingProgress:"Adding {{current}}/{{total}}...",savingProgress:"Saving {{current}}/{{total}}...",clearQueue:"Clear Queue",clearHistory:"Clear History",emptyQueue:"Queue is empty",position:"Position",scheduledTime:"Scheduled Time",moveUp:"Move Up",moveDown:"Move Down",startNow:"Start Now",printingInProgress:"Printing in progress...",viewArchive:"View archive",viewInFileManager:"View in File Manager",itemCount:"{{count}} item",itemCount_plural:"{{count}} items",dragToReorder:"Drag to reorder (ASAP only)",reorderHint:"Position only affects ASAP items. Scheduled items run at their set time.",addedBy:"Added by {{name}}",sections:{currentlyPrinting:"Currently Printing",queued:"Queued",history:"History"},status:{pending:"Pending",waiting:"Waiting",printing:"Printing",completed:"Completed",failed:"Failed",skipped:"Skipped",cancelled:"Cancelled"},summary:{printing:"Printing",queued:"Queued",totalTime:"Total Queue Time",history:"History"},filter:{allPrinters:"All Printers",unassigned:"Unassigned",allStatus:"All Status",allLocations:"All Locations",any:"Any"},sort:{byPosition:"Sort by Position",byName:"Sort by Name",byPrinter:"Sort by Printer",bySchedule:"Sort by Schedule",byDate:"Sort by Date",ascendingOldest:"Ascending (oldest first)",descendingNewest:"Descending (newest first)"},badges:{staged:"Staged",requiresPrevious:"Requires previous success",autoPowerOff:"Auto power off"},empty:{title:"No prints scheduled",description:'Schedule a print from the Archives page using the "Schedule" option in the context menu, or drag and drop files to get started.'},time:{asap:"ASAP",overdue:"Overdue",now:"Now",lessThanMinute:"In less than a minute",inMinutes:"In {{count}} min",inHours:"In {{count}} hours"},actions:{stopPrint:"Stop Print",startPrint:"Start Print",requeue:"Re-queue"},bulkEdit:{title:"Edit {{count}} Item",title_plural:"Edit {{count}} Items",description:"Only changed settings will be applied to selected items.",printer:"Printer",noChange:"— No change —",queueOptions:"Queue Options",staged:"Staged (manual start)",autoPowerOff:"Auto power off after print",requirePrevious:"Require previous success",printOptions:"Print Options",bedLevelling:"Bed levelling",flowCalibration:"Flow calibration",vibrationCalibration:"Vibration calibration",layerInspection:"First layer inspection",timelapse:"Timelapse",useAms:"Use AMS",applyChanges:"Apply Changes",selectAll:"Select All",deselectAll:"Deselect All",selected:"{{count}} selected",editSelected:"Edit Selected",cancelSelected:"Cancel Selected"},confirm:{cancelTitle:"Cancel Scheduled Print",cancelMessage:'Are you sure you want to cancel "{{name}}"?',stopTitle:"Stop Print",stopMessage:'Are you sure you want to stop the current print "{{name}}"? This will cancel the print job on the printer.',removeTitle:"Remove from History",removeMessage:'Are you sure you want to remove "{{name}}" from the queue history?',clearHistoryTitle:"Clear History",clearHistoryMessage:"Are you sure you want to remove all {{count}} item(s) from the history?",cancelButton:"Cancel Print",stopButton:"Stop Print",thisPrint:"this print",thisItem:"this item"},toast:{cancelled:"Queue item cancelled",cancelFailed:"Failed to cancel item",removed:"Queue item removed",removeFailed:"Failed to remove item",stopped:"Print stopped",stopFailed:"Failed to stop print",released:"Print released to queue",startFailed:"Failed to start print",reorderFailed:"Failed to reorder queue",historyCleared:"Cleared {{count}} history item(s)",clearHistoryFailed:"Failed to clear history",updateFailed:"Failed to update items",bulkCancelled:"Cancelled {{count}} item(s)",bulkCancelFailed:"Failed to cancel items"},permissions:{noStopPrint:"You do not have permission to stop prints",noStartPrint:"You do not have permission to start prints",noEdit:"You do not have permission to edit this queue item",noCancel:"You do not have permission to cancel this queue item",noRequeue:"You do not have permission to re-queue items",noRemove:"You do not have permission to remove this queue item",noClearHistory:"You do not have permission to clear all history",noEditItems:"You do not have permission to edit queue items",noCancelItems:"You do not have permission to cancel queue items"}},stats:{title:"Dashboard",subtitle:"Drag widgets to rearrange. Click the eye icon to hide.",overview:"Overview",totalPrints:"Total Prints",successRate:"Success Rate",totalPrintTime:"Total Print Time",printTime:"Print Time",totalFilament:"Total Filament Used",filamentUsed:"Filament Used",filamentCost:"Filament Cost",totalCost:"Total Cost",energyUsed:"Energy Used",energyCost:"Energy Cost",averagePrintTime:"Average Print Time",printsPerDay:"Prints per Day",byPrinter:"By Printer",printsByPrinter:"Prints by Printer",byMaterial:"By Material",byMonth:"By Month",last7Days:"Last 7 Days",last30Days:"Last 30 Days",last90Days:"Last 90 Days",allTime:"All Time",quickStats:"Quick Stats",printActivity:"Print Activity",filamentTypes:"Filament Types",filamentTrends:"Filament Trends",failureAnalysis:"Failure Analysis",timeAccuracy:"Time Accuracy",successful:"Successful:",failed:"Failed:",perfectEstimate:"100% = perfect estimate",noTimeAccuracyData:"No time accuracy data yet",noFilamentData:"No filament data available",noPrinterData:"No printer data available",noPrintData:"No print data available",noPrintDataLast30Days:"No print data in the last 30 days",failureReasons:"Failure Reasons",topFailureReasons:"Top Failure Reasons",failedPrintsCount:"{{failed}} / {{total}} prints failed",lastWeekRate:"Last week: {{rate}}%",resetLayout:"Reset Layout",recalculateCosts:"Recalculate Costs",recalculateCostsHint:"Recalculate all archive costs using current filament prices",exportStats:"Export Stats",exportAsCsv:"Export as CSV",exportAsExcel:"Export as Excel",hiddenCount:"{{count}} Hidden",exportDownloaded:"Export downloaded",exportFailed:"Export failed",layoutReset:"Layout reset",recalculatedCosts:"Recalculated costs for {{count}} archives",recalculateFailed:"Failed to recalculate costs",loadingStats:"Loading statistics...",noPermissionResetLayout:"You do not have permission to reset layout",noPermissionRecalculate:"You do not have permission to recalculate costs"},maintenance:{title:"Maintenance",overview:"Overview",allOk:"All maintenance up to date",dueCount:"{{count}} item due",dueCount_plural:"{{count}} items due",warningCount:"{{count}} warning",warningCount_plural:"{{count}} warnings",totalPrintTime:"Total Print Time",nextMaintenance:"Next Maintenance",nothingDue:"Nothing due",tasks:"Tasks",lastPerformed:"Last performed",interval:"Interval",hoursRemaining:"{{hours}}h remaining",hoursOverdue:"{{hours}}h overdue",markDone:"Mark as Done",performMaintenance:"Perform Maintenance",history:"History",noHistory:"No maintenance history",editPrintHours:"Edit Print Hours",currentHours:"Current Hours",statusTab:"Status",settingsTab:"Settings",overdueCount:"{{count}} overdue",dueSoonCount:"{{count}} due soon",dueSoon:"Due soon",allGood:"All good",overdueBy:"Overdue by {{duration}}",dueIn:"Due in {{duration}}",timeLeft:"{{duration}} left",day:"1 day",days:"{{count}} days",week:"1 week",weeks:"{{count}} weeks",month:"1 month",months:"{{count}} months",year:"1 year",maintenanceTypes:"Maintenance Types",maintenanceTypesDescription:"System types and your custom maintenance tasks",addCustomType:"Add Custom Type",intervalType:"Interval Type",intervalValue:"Interval ({{type}})",icon:"Icon",documentationLink:"Documentation Link (optional)",assignToPrinters:"Assign to Printers",selectAtLeastOnePrinter:"Select at least one printer",addType:"Add Type",custom:"Custom",printHours:"Print Hours",calendarDays:"Calendar Days",exampleName:"e.g., Replace HEPA Filter",viewDocumentation:"View documentation",timeBasedInterval:"Time-based interval",intervalOverrides:"Interval Overrides",intervalOverridesDescription:"Customize intervals for specific printers",assignedToPrinters:"Assigned to printers:",noPrintersAssigned:"No printers assigned",addPrinterShort:"Add:",printersAssignedClick:"{{count}} printer(s) assigned - click to manage",removeFromPrinter:"Remove from this printer",types:{lubricateRails:"Lubricate Linear Rails",cleanNozzle:"Clean Nozzle/Hotend",checkBelts:"Check Belt Tension",cleanBuildPlate:"Clean Build Plate",checkExtruder:"Check Extruder Gears",checkCooling:"Check Cooling Fans",generalInspection:"General Inspection",cleanCarbonRods:"Clean Carbon Rods",checkPtfeTube:"Check PTFE Tube",replaceHepaFilter:"Replace HEPA Filter",replaceCarbonFilter:"Replace Carbon Filter",lubricateLeftNozzleRail:"Lubricate Left Nozzle Rail"},maintenanceComplete:"Maintenance marked as complete",typeUpdated:"Maintenance type updated",typeDeleted:"Maintenance type deleted",printHoursUpdated:"Print hours updated",printerAssigned:"Printer assigned",printerRemoved:"Printer removed",deleteTypeConfirm:'Delete "{{name}}"?',noPermissionUpdate:"You do not have permission to update maintenance items",noPermissionPerform:"You do not have permission to perform maintenance",noPermissionEditTypes:"You do not have permission to edit maintenance types",noPermissionDeleteTypes:"You do not have permission to delete maintenance types",noPermissionEditHours:"You do not have permission to edit print hours",noPermissionRemovePrinter:"You do not have permission to remove printer assignments",noPermissionAssignPrinter:"You do not have permission to assign printers",noPermissionEditIntervals:"You do not have permission to edit intervals",configureSettings:"Configure maintenance types and intervals"},settings:{title:"Settings",general:"General",tabs:{general:"General",smartPlugs:"Smart Plugs",notifications:"Notifications",filament:"Filament",network:"Network",apiKeys:"API Keys",virtualPrinter:"Virtual Printer",users:"Users",backup:"Backup"},appearance:"Appearance",notifications:"Notifications",smartPlugs:"Smart Plugs",spoolman:"Spoolman",updates:"Updates",language:"Language",languageDescription:"Select your preferred language",theme:"Theme",themeLight:"Light",themeDark:"Dark",themeSystem:"System",defaultView:"Default View",defaultViewDescription:"Page to show when opening the app",checkForUpdates:"Check for Updates",autoUpdate:"Auto Update",currentVersion:"Current Version",latestVersion:"Latest Version",upToDate:"You are up to date",updateAvailable:"Update available",notificationLanguage:"Notification Language",notificationLanguageDescription:"Language for push notifications",notificationProviders:"Notification Providers",addProvider:"Add Provider",editProvider:"Edit Provider",providerType:"Provider Type",testNotification:"Test Notification",testSuccess:"Test notification sent successfully",testFailed:"Failed to send test notification",quietHours:"Quiet Hours",quietHoursDescription:"Do not disturb during these hours",quietHoursStart:"Start",quietHoursEnd:"End",events:{title:"Notification Events",printStart:"Print Started",printComplete:"Print Completed",printFailed:"Print Failed",printStopped:"Print Stopped",printProgress:"Progress Milestones",printProgressDescription:"Notify at 25%, 50%, 75%",printerOffline:"Printer Offline",printerError:"Printer Error",filamentLow:"Low Filament",maintenanceDue:"Maintenance Due",maintenanceDueDescription:"Notify when maintenance is needed"},smartPlug:{title:"Smart Plugs",add:"Add Smart Plug",edit:"Edit Smart Plug",name:"Name",ipAddress:"IP Address",linkedPrinter:"Linked Printer",autoOn:"Auto Power On",autoOnDescription:"Turn on when print starts",autoOff:"Auto Power Off",autoOffDescription:"Turn off after print completes",offDelay:"Off Delay",offDelayMinutes:"Minutes after print",offDelayTemp:"When nozzle below temperature",currentState:"Current State",turnOn:"Turn On",turnOff:"Turn Off"},spoolmanEnabled:"Enable Spoolman Integration",spoolmanUrl:"Spoolman URL",spoolmanConnected:"Connected",spoolmanDisconnected:"Disconnected",noDefaultPrinter:"No default (ask each time)",sidebarOrder:"Sidebar order",saveThumbnails:"Save thumbnails",captureFinishPhoto:"Capture finish photo",noPrintersConfigured:"No printers configured",archiveMode:{always:"Always create archive entry",never:"Never create archive entry",ask:"Ask each time"},checkForUpdatesLabel:"Check for updates",checkPrinterFirmware:"Check printer firmware",enableRetry:"Enable retry",homeAssistantDescription:"Control smart plugs via Home Assistant",mqttConnectedTo:"Connected to",prometheusDescription:"Expose printer data in Prometheus format",noSmartPlugsTitle:"No smart plugs configured",noSmartPlugsDescription:"Add a Tasmota-based smart plug to track energy usage and automate power control.",noProvidersTitle:"No providers configured",noProvidersDescription:"Add a provider to receive alerts.",noTemplatesAvailable:"No templates available. Restart the backend to seed default templates.",apiPermissionView:"View printer status and queue",apiPermissionEdit:"Add and remove items from print queue",apiKeysEmptyTitle:"No API keys",apiKeysEmptyDescription:"Create an API key to integrate with external services.",noUsersFound:"No users found",noGroupsFound:"No groups found",noGroupsAvailable:"No groups available",passwordsDoNotMatch:"Passwords do not match",systemGroupWarning:"System group names cannot be changed",authDisabledTitle:"Authentication is Disabled",authDisabledFeature1:"Require login to access the system",authDisabledFeature2:"Create multiple users with group-based permissions",authDisabledFeature3:"Control access with 50+ granular permissions",userHasCreated:"This user has created:",userItemsQuestion:"What would you like to do with these items?",deleteUserConfirm:"Are you sure you want to delete this user?",actionCannotBeUndone:"This action cannot be undone.",addFirstSmartPlug:"Add Your First Smart Plug",providers:"Providers",log:"Log",testAll:"Test All",testResults:"Test Results",testPassedCount:"{{count}} passed",testFailedCount:"{{count}} failed",messageTemplates:"Message Templates",messageTemplatesDescription:"Customize notification messages for each event.",apiKeys:"API Keys",apiKeysDescription:"Create API keys for external integrations and webhooks.",createKey:"Create Key",apiKeyCreated:"API Key Created Successfully",apiKeyCopyWarning:"Copy this key now - it won't be shown again!",useInApiBrowser:"Use in API Browser",createNewApiKey:"Create New API Key",keyName:"Key Name",keyNamePlaceholder:"e.g., Home Assistant, OctoPrint",readStatus:"Read Status",readStatusDescription:"View printer status and queue",manageQueue:"Manage Queue",manageQueueDescription:"Add and remove items from print queue",controlPrinter:"Control Printer",controlPrinterDescription:"Pause, resume, and stop prints",unnamedKey:"Unnamed Key",lastUsed:"Last used",read:"Read",control:"Control",createFirstKey:"Create Your First Key",webhookEndpoints:"Webhook Endpoints",webhookApiKeyHint:"Use your API key in the X-API-Key header.",webhook:{getAllStatus:"Get all printer status",getSpecificStatus:"Get specific printer status",addToQueue:"Add to print queue",pausePrint:"Pause print",resumePrint:"Resume print",stopPrint:"Stop print"},apiBrowser:"API Browser",apiBrowserDescription:"Explore and test all available API endpoints.",apiKeyForTesting:"API Key for Testing",apiKeyPlaceholder:"Paste your API key here to test authenticated endpoints...",apiKeyHint:"This key will be sent as X-API-Key header with requests.",deleteApiKeyTitle:"Delete API Key",deleteApiKeyMessage:"Are you sure you want to delete this API key? Any integrations using this key will stop working.",deleteKey:"Delete Key",amsDisplayThresholds:"AMS Display Thresholds",amsThresholdsDescription:"Configure color thresholds for AMS humidity and temperature indicators.",humidity:"Humidity",goodGreen:"Good (green)",fairOrange:"Fair (orange)",aboveFairBad:"Above fair threshold shows as red (bad)",temperature:"Temperature",goodBlue:"Good (blue)",aboveFairHot:"Above fair threshold shows as red (hot)",historyRetention:"History Retention",keepSensorHistory:"Keep sensor history for",historyRetentionDescription:"Older humidity and temperature data will be automatically deleted",printModal:"Print Modal",expandCustomMapping:"Expand custom mapping by default",expandCustomMappingDescription:"When printing to multiple printers, show per-printer AMS mapping expanded",authentication:"Authentication",authEnabledDescription:"Your instance is secured with user authentication",authDisabledDescription:"Enable to require login and manage user access",authDisabledMessage:"Enable authentication to create user accounts, manage permissions, and secure your Bambuddy instance.",enableAuthentication:"Enable Authentication",currentUser:"Current User",changePassword:"Change Password",admin:"Admin",users:"Users",addUser:"Add User",groups:"Groups",addGroup:"Add Group",system:"System",noDescription:"No description",userCount:"{{count}} users",permissionCount:"{{count}} permissions",createUser:"Create User",username:"Username",enterUsername:"Enter username",password:"Password",enterPassword:"Enter password (min 6 characters)",confirmPassword:"Confirm Password",confirmPasswordPlaceholder:"Confirm password",viewReleaseOnGitHub:"View release on GitHub",turnAllPlugsOn:"Turn all plugs on",turnAllPlugsOff:"Turn all plugs off",clearNotificationLogs:"Clear Notification Logs",clearLogsMessage:"This will permanently delete all notification logs older than 30 days. This action cannot be undone.",clearLogs:"Clear Logs",resetUiPreferences:"Reset UI Preferences",resetUiPreferencesMessage:"This will reset all UI preferences to defaults: sidebar order, theme, dashboard layout, view modes, and sorting preferences. Your printers, archives, and server settings will NOT be affected. The page will reload after clearing.",resetPreferences:"Reset Preferences",deleteGroupTitle:"Delete Group",deleteGroupMessage:"Are you sure you want to delete this group? Users in this group will lose these permissions.",deleteGroup:"Delete Group",disableAuthenticationTitle:"Disable Authentication",disableAuthenticationMessage:"Are you sure you want to disable authentication? This will make your Bambuddy instance accessible without login. All users will remain in the database but authentication will be disabled.",disableAuthentication:"Disable Authentication",configureBambuddy:"Configure Bambuddy",systemDefault:"System Default",archiveSettings:"Archive Settings",newWindow:"New Window",embeddedOverlay:"Embedded Overlay",externalCameras:"External Cameras",costTracking:"Cost Tracking",printsOnly:"Prints Only",totalConsumption:"Total Consumption",dataManagement:"Data Management",clearNotificationLogsDescription:"Delete notification logs older than 30 days",resetUiPreferencesDescription:"Reset sidebar order, theme, view modes, and layout preferences. Printers, archives, and settings are not affected.",enableHomeAssistant:"Enable Home Assistant",enableMqtt:"Enable MQTT",useTls:"Use TLS",enableMetricsEndpoint:"Enable Metrics Endpoint",availableMetrics:"Available Metrics",editUser:"Edit User",deleteUserTitle:"Delete User",groupName:"Group Name",leaveEmptyForAnonymous:"Leave empty for anonymous",leaveEmptyForNoAuth:"Leave empty for no authentication",enterNewPassword:"Enter new password",confirmNewPassword:"Confirm new password",enterGroupName:"Enter group name",enterDescriptionOptional:"Enter description (optional)",enterCurrentPassword:"Enter current password",enterNewPasswordMin6:"Enter new password (min 6 characters)",toast:{keyCopied:"Key copied to clipboard",copyFailed:"Failed to copy key",keyAddedToBrowser:"Key added to API Browser",clearLogsFailed:"Failed to clear logs",uiPreferencesReset:"UI preferences reset. Refreshing...",authDisabled:"Authentication disabled successfully",authDisableFailed:"Failed to disable authentication",apiKeyCreated:"API key created",apiKeyDeleted:"API key deleted",userCreated:"User created successfully",userUpdated:"User updated successfully",userDeleted:"User deleted successfully",groupCreated:"Group created successfully",groupUpdated:"Group updated successfully",groupDeleted:"Group deleted successfully",fillRequiredFields:"Please fill in all required fields",passwordsDoNotMatch:"Passwords do not match",passwordTooShort:"Password must be at least 6 characters",enterGroupName:"Please enter a group name",settingsSaved:"Settings saved",cameraSettingsSaved:"Camera settings saved",enterCameraUrl:"Please enter a camera URL",passwordChanged:"Password changed successfully",connectionFailed:"Connection failed",testFailed:"Test failed",cameraConnected:"Camera connected{{resolution}}"},testConnection:"Test Connection"},notification:{printStarted:{title:"Print Started",body:"{{printer}}: {{filename}} has started printing"},printCompleted:{title:"Print Completed",body:"{{printer}}: {{filename}} completed successfully"},printFailed:{title:"Print Failed",body:"{{printer}}: {{filename}} has failed"},printStopped:{title:"Print Stopped",body:"{{printer}}: {{filename}} was stopped"},printProgress:{title:"Print Progress",body:"{{printer}}: {{filename}} is {{percent}}% complete"},printerOffline:{title:"Printer Offline",body:"{{printer}} is offline"},printerError:{title:"Printer Error",body:"{{printer}}: {{error}}"},filamentLow:{title:"Low Filament",body:"{{printer}}: Filament is running low"},maintenanceDue:{title:"Maintenance Due",body:"{{printer}}: {{items}} need attention"}},errors:{generic:"Something went wrong",networkError:"Network error. Please check your connection.",notFound:"Not found",unauthorized:"Unauthorized",serverError:"Server error",validationError:"Please check your input",printerConnectionFailed:"Failed to connect to printer",saveFailed:"Failed to save changes",deleteFailed:"Failed to delete",loadFailed:"Failed to load data"},hmsErrors:{title:"Errors - {{name}}",noErrors:"No errors",viewOnWiki:"View on Bambu Lab Wiki",clearInstructions:"Clear errors on the printer to dismiss them here."},mqttDebug:{title:"MQTT Debug Log",searchPlaceholder:"Search topic or payload...",noMessages:"No messages logged yet",startLoggingHint:'Click "Start Logging" to begin capturing MQTT messages',noMessagesMatch:"No messages match your filter",adjustFilterHint:"Try adjusting your search or filter criteria",incoming:"Incoming",outgoing:"Outgoing",loggingStopped:"Logging stopped",loggingActive:"Logging active - messages will auto-refresh",startLogging:"Start Logging",stopLogging:"Stop Logging",clearLog:"Clear Log",topic:"Topic",timestamp:"Timestamp",direction:"Direction",all:"All"},printerFiles:{title:"File Manager",storageUsed:"Used:",storageFree:"Free:",filterPlaceholder:"Filter files...",deleteButton:"Delete",deleteFiles:"Delete {{count}} Files",deleteFileConfirm:'Delete "{{name}}"? This cannot be undone.',deleteFilesConfirm:"Delete {{count}} selected files? This cannot be undone.",noFiles:"No files on printer",loadingFiles:"Loading files...",failedToLoad:"Failed to load files",toast:{filesDeleted:"Deleted {{count}} file(s)",deleteFailed:"Delete failed: {{error}}"}},confirm:{delete:"Are you sure you want to delete this?",unsavedChanges:"You have unsaved changes. Are you sure you want to leave?",clearQueue:"Are you sure you want to clear the queue?"},login:{title:"Bambuddy Login",subtitle:"Sign in to your account",username:"Username",usernamePlaceholder:"Enter your username",password:"Password",passwordPlaceholder:"Enter your password",signIn:"Sign in",signingIn:"Logging in...",forgotPassword:"Forgot your password?",loginSuccess:"Logged in successfully",loginFailed:"Login failed",enterCredentials:"Please enter username and password",forgotPasswordTitle:"Forgot Password",forgotPasswordMessage:"If you've forgotten your password, please contact your system administrator to reset it.",howToReset:"How to reset your password:",resetStep1:"Contact your Bambuddy administrator",resetStep2:"Ask them to reset your password in User Management",resetStep3:"They can set a new temporary password for you",resetStep4:"Log in with the new password and change it in Settings",gotIt:"Got it"},setup:{title:"Bambuddy Setup",subtitle:"Configure authentication for your Bambuddy instance",enableAuth:"Enable Authentication",adminAccount:"Admin Account",adminAccountDesc:"If admin users already exist, authentication will be enabled using the existing admin accounts. Leave the fields below empty to use existing admins, or enter new credentials to create a new admin user.",adminUsername:"Admin Username",adminPassword:"Admin Password",optionalIfAdminExists:"(optional if admin users exist)",adminUsernamePlaceholder:"Enter admin username (optional)",adminPasswordPlaceholder:"Enter admin password (optional)",confirmPassword:"Confirm Password",confirmPasswordPlaceholder:"Confirm admin password",settingUp:"Setting up...",completeSetup:"Complete Setup",toast:{authEnabledAdminCreated:"Authentication enabled and admin user created",authEnabledExistingAdmins:"Authentication enabled using existing admin users",setupCompleted:"Setup completed",enterBothCredentials:"Please enter both admin username and password, or leave both empty to use existing admin users",passwordsDoNotMatch:"Passwords do not match",passwordTooShort:"Password must be at least 6 characters"}},changePassword:{title:"Change Password",currentPassword:"Current Password",currentPasswordPlaceholder:"Enter current password",newPassword:"New Password",newPasswordPlaceholder:"Enter new password (min 6 characters)",confirmPassword:"Confirm New Password",confirmPasswordPlaceholder:"Confirm new password",passwordsDoNotMatch:"Passwords do not match",passwordTooShort:"Password must be at least 6 characters",changing:"Changing...",success:"Password changed successfully",failed:"Failed to change password"},plateAlert:{title:"Print Paused!",message:"Objects detected on build plate. The print has been automatically paused. Please clear the plate and resume the print.",understand:"I Understand"},camera:{title:"Camera View",invalidPrinterId:"Invalid printer ID",live:"Live",snapshot:"Snapshot",restartStream:"Restart stream",refreshSnapshot:"Refresh snapshot",fullscreen:"Fullscreen",exitFullscreen:"Exit fullscreen",connectingToCamera:"Connecting to camera...",capturingSnapshot:"Capturing snapshot...",connectionLost:"Connection lost",connectionFailed:"Camera connection failed",reconnecting:"Reconnecting in {{countdown}}s... (attempt {{attempt}}/{{max}})",reconnectNow:"Reconnect now",cameraUnavailable:"Camera unavailable",cameraUnavailableDesc:"Make sure the printer is powered on and connected.",noCamera:"No camera available",retry:"Retry",cameraStream:"Camera stream",zoomOut:"Zoom out",zoomIn:"Zoom in",resetZoom:"Reset zoom",recording:"Recording",startRecording:"Start Recording",stopRecording:"Stop Recording"},groups:{title:"Group Management",subtitle:"Manage permission groups for access control",backToSettings:"Back to Settings",createGroup:"Create Group",noPermission:"You do not have permission to access this page.",system:"System",noDescription:"No description",usersCount:"{{count}} users",permissionsCount:"{{count}} permissions",edit:"Edit",delete:"Delete",toast:{created:"Group created successfully",updated:"Group updated successfully",deleted:"Group deleted successfully",enterGroupName:"Please enter a group name"},modal:{editGroup:"Edit Group",createGroup:"Create Group",cancel:"Cancel",saving:"Saving...",creating:"Creating...",saveChanges:"Save Changes"},form:{groupName:"Group Name",groupNamePlaceholder:"Enter group name",systemGroupWarning:"System group names cannot be changed",description:"Description",descriptionPlaceholder:"Enter description (optional)",permissions:"Permissions ({{count}} selected)"},deleteModal:{title:"Delete Group",message:"Are you sure you want to delete this group? Users in this group will lose these permissions.",confirm:"Delete Group"}},users:{title:"User Management",subtitle:"Manage users and their access to your Bambuddy instance",backToSettings:"Back to Settings",createUser:"Create User",noPermission:"You do not have permission to access this page.",admin:"Admin",noGroups:"No groups",active:"Active",inactive:"Inactive",edit:"Edit",delete:"Delete",system:"System",noGroupsAvailable:"No groups available",table:{username:"Username",groups:"Groups",status:"Status",actions:"Actions"},toast:{created:"User created successfully",updated:"User updated successfully",deleted:"User deleted successfully",fillRequired:"Please fill in all required fields",passwordsDoNotMatch:"Passwords do not match",passwordTooShort:"Password must be at least 6 characters"},modal:{createUser:"Create User",editUser:"Edit User",cancel:"Cancel",creating:"Creating...",saving:"Saving...",saveChanges:"Save Changes"},form:{username:"Username",usernamePlaceholder:"Enter username",password:"Password",passwordPlaceholder:"Enter password",confirmPassword:"Confirm Password",confirmPasswordPlaceholder:"Confirm password",newPasswordPlaceholder:"Enter new password",confirmNewPasswordPlaceholder:"Confirm new password",leaveBlankToKeep:"leave blank to keep current",groups:"Groups"},deleteModal:{title:"Delete User",message:"Are you sure you want to delete this user? This action cannot be undone.",confirm:"Delete User"}},streamOverlay:{title:"Stream Overlay",invalidPrinterId:"Invalid printer ID",cameraStream:"Camera stream",progress:"Progress",eta:"ETA",tomorrow:"Tomorrow",printerIdle:"Printer is idle",printerOffline:"Printer offline",status:{printing:"Printing",paused:"Paused",finished:"Finished",failed:"Failed",idle:"Idle",unknown:"Unknown"}},profiles:{title:"Profiles",subtitle:"Manage your slicer presets and pressure advance calibrations",tabs:{cloud:"Cloud Profiles",kprofiles:"K-Profiles"},connectedAs:"Connected as",logout:"Logout",noLogoutPermission:"You do not have permission to logout",failedToLoad:"Failed to load profiles",retry:"Retry",time:{justNow:"Just now",minsAgo:"{{count}}m ago",hoursAgo:"{{count}}h ago",daysAgo:"{{count}}d ago"},toast:{loggedOut:"Logged out"},login:{title:"Connect to Bambu Cloud",subtitle:"Sync your slicer presets across devices",email:"Email",password:"Password",region:"Region",regionGlobal:"Global",regionChina:"China",verificationCode:"Verification Code",checkEmail:"Check your email ({{email}}) for a 6-digit code",accessToken:"Access Token",accessTokenHint:"Paste your Bambu Lab access token (from Bambu Studio)",back:"Back",loginButton:"Login",verifyButton:"Verify",setTokenButton:"Set Token",useToken:"Use access token instead",useEmail:"Login with email instead",toast:{loggedIn:"Logged in successfully",codeSent:"Verification code sent to your email",tokenSet:"Token set successfully"}},presets:{myPreset:"My preset (editable)",duplicate:"Duplicate",editable:"Editable",failedToLoadDetails:"Failed to load preset details",deleteConfirm:"Delete this preset?",deleteWarning:'This will permanently delete "{{name}}" from Bambu Cloud. This cannot be undone.',noDuplicatePermission:"You do not have permission to duplicate presets",noEditPermission:"You do not have permission to edit presets",noDeletePermission:"You do not have permission to delete presets",types:{filament:"Filament preset",printer:"Printer preset",process:"Process preset"},toast:{deleted:"Preset deleted",created:"Preset created",updated:"Preset updated",duplicated:"Preset duplicated",fieldAdded:'Field "{{key}}" added',exported:"Preset exported"},baseLabel:"Base: {{name}}",currentLabel:"Current: {{name}}",newPreset:"New Preset",editPreset:"Edit Preset",duplicatePreset:"Duplicate Preset",createNewPreset:"Create New Preset",customizeSettings:"Customize settings for your new preset",compareWithBase:"Compare with base preset",compare:"Compare",basePreset:"Base Preset",selectBasePreset:"Select base preset...",presetName:"Preset Name",myCustomPreset:"My custom preset",inheritsFrom:"Inherits from",dropJsonToImport:"Drop JSON to import",tabs:{common:"Common",allFields:"All Fields"},availableFields:"Available Fields",searchFieldsPlaceholder:"Search fields...",noMatchingFields:"No matching fields",allFieldsAdded:"All fields added",addCustomField:"Add custom field",yourOverrides:"Your Overrides",noOverridesYet:"No overrides yet",clickFieldsToAdd:"Click fields on the left to add them",saveAsTemplate:"Save as template",jsonTip:"Tip: Drag & drop a .json file anywhere on this modal to import settings"},cloudView:{searchPlaceholder:"Search presets...",templates:"Templates",refresh:"Refresh",newPreset:"New Preset",clearFilters:"Clear filters",compareMode:"Compare Mode",selectAnotherPreset:"Select another {{type}} preset",clickTwoPresets:"Click two presets of the same type to compare",selectFirst:"1. Select first",selectSecond:"2. Select second",compareNow:"Compare Now",lastSynced:"Last synced:",showingCount:"Showing {{showing}} of {{total}} presets",noPresetsFound:"No presets found",columns:{filament:"Filament",process:"Process",printer:"Printer"},noFilamentPresets:"No filament presets",noProcessPresets:"No process presets",noPrinterPresets:"No printer presets",filters:{type:"Type",owner:"Owner",printer:"Printer",nozzle:"Nozzle",filament:"Filament",layer:"Layer",all:"All",myPresets:"My Presets",builtIn:"Built-in",process:"Process"},noTemplatesPermission:"You do not have permission to manage templates",noRefreshPermission:"You do not have permission to refresh profiles",noCreatePermission:"You do not have permission to create presets"},templates:{title:"Quick Templates",noTemplates:"No templates yet",createFirst:"Create templates from the preset editor",typeFilter:"Type:",deleteTitle:"Delete Template",deleteWarning:"This action cannot be undone",deleteConfirm:'Are you sure you want to delete "{{name}}"?',namePlaceholder:"Template name",descriptionPlaceholder:"Description",settingsJson:"Settings (JSON)",fieldsCount:"{{count}} fields",shownInModals:"Shown in modals",hiddenInModals:"Hidden in modals",apply:"Apply",toast:{deleted:"Template deleted",updated:"Template updated",created:"Template created",applied:"Template applied"}}},support:{debugLoggingActive:"Debug logging is active",manageLogs:"Manage"},fileManager:{title:"File Manager",subtitle:"Organize and manage your print files",uploadFiles:"Upload Files",newFolder:"New Folder",folderName:"Folder Name",folderNamePlaceholder:"e.g., Functional Parts",renameFile:"Rename File",renameFolder:"Rename Folder",moveFiles:"Move {{count}} File(s)",rootNoFolder:"Root (No Folder)",current:"current",linkFolder:"Link Folder",linkFolderDescription:'Link "{{name}}" to a project or archive for quick access.',project:"Project",archive:"Archive",noProjectsFound:"No projects found",noArchivesFound:"No archives found",unlink:"Unlink",link:"Link",dragDropFiles:"Drag & drop files here",dropFilesHere:"Drop files here",orClickToBrowse:"or click to browse",allFileTypesSupported:"All file types supported. ZIP files will be extracted.",zipFilesDetected:"ZIP files detected",zipExtractOptions:"ZIP files will be extracted. Choose how to handle folder structure:",preserveZipStructure:"Preserve folder structure from ZIP",createFolderFromZip:"Create folder from ZIP filename",stlThumbnailGeneration:"STL thumbnail generation",zipMayContainStl:"ZIP files may contain STL files. Thumbnails can be generated during extraction.",thumbnailsCanBeGenerated:"Thumbnails can be generated for STL files. Large models may take longer to process.",generateThumbnailsForStl:"Generate thumbnails for STL files",willBeExtracted:"Will be extracted",filesExtracted:"{{count}} files extracted",uploadComplete:"Upload complete: {{succeeded}} succeeded",uploadFailed:"{{count}} failed",uploading:"Uploading...",changeLink:"Change Link...",linkTo:"Link to...",linkToProjectOrArchive:"Link to project or archive",addToQueue:"Add to Queue",generateThumbnail:"Generate Thumbnail",generateThumbnails:"Generate Thumbnails",generateThumbnailsForMissing:"Generate thumbnails for STL files missing them",gridView:"Grid view",listView:"List view",lowDiskSpaceWarning:"Low disk space warning",lowDiskSpaceDetails:"Only {{free}} free of {{total}} total. Threshold is set to {{threshold}} GB in settings.",files:"Files",folders:"Folders",size:"Size",free:"Free",allFiles:"All Files",wrap:"Wrap",enableTextWrapping:"Enable text wrapping",disableTextWrapping:"Disable text wrapping",dragToResizeTooltip:"Drag to resize, double-click to reset",searchFiles:"Search files...",allTypes:"All types",prints:"Prints",ascending:"Ascending",descending:"Descending",resultsCount:"{{showing}} of {{total}} files",selectAll:"Select All",deselectAll:"Deselect All",selected:"{{count}} selected",adding:"Adding...",loadingFiles:"Loading files...",folderIsEmpty:"Folder is empty",noFilesYet:"No files yet",folderEmptyDescription:"Upload files or move files into this folder to get started.",noFilesDescription:"Upload files to start organizing your print-related files.",noMatchingFiles:"No matching files",noMatchingFilesDescription:"No files match your current search or filter criteria.",clearFilters:"Clear filters",printedCount:"Printed {{count}}x",uploadedBy:"Uploaded by {{name}}",deleteFolder:"Delete Folder",deleteFile:"Delete File",deleteFilesCount:"Delete {{count}} Files",deleteFolderConfirm:"Are you sure you want to delete this folder? All files inside will also be deleted.",deleteFileConfirm:"Are you sure you want to delete this file?",deleteFilesConfirm:"Are you sure you want to delete {{count}} selected files? This action cannot be undone.",deleting:"Deleting...",noPermissionRenameFolder:"You do not have permission to rename folders",noPermissionLinkFolder:"You do not have permission to link folders",noPermissionDeleteFolder:"You do not have permission to delete folders",noPermissionPrint:"You do not have permission to print",noPermissionAddToQueue:"You do not have permission to add to queue",noPermissionDownload:"You do not have permission to download files",noPermissionRenameFile:"You do not have permission to rename this file",noPermissionGenerateThumbnail:"You do not have permission to generate thumbnails",noPermissionDeleteFile:"You do not have permission to delete this file",noPermissionCreateFolder:"You do not have permission to create folders",noPermissionUpload:"You do not have permission to upload files",noPermissionMoveFiles:"You do not have permission to move files",noPermissionDeleteFiles:"You do not have permission to delete files",toast:{folderCreated:"Folder created",folderDeleted:"Folder deleted",fileDeleted:"File deleted",filesDeleted:"Deleted {{count}} files",filesMoved:"Files moved",folderLinked:"Folder linked",folderUnlinked:"Folder unlinked",addedToQueue:"Added {{count}} file(s) to queue",addedToQueuePartial:"Added {{added}} file(s), {{failed}} failed",failedToAddToQueue:"Failed to add files: {{error}}",fileRenamed:"File renamed",folderRenamed:"Folder renamed",thumbnailsGenerated:"Generated {{count}} thumbnail(s)",thumbnailsGeneratedPartial:"Generated {{succeeded}} thumbnail(s), {{failed}} failed",noStlMissingThumbnails:"No STL files missing thumbnails",failedToGenerateThumbnails:"Failed to generate thumbnails: {{error}}",thumbnailGenerated:"Thumbnail generated",failedToGenerateThumbnail:"Failed to generate thumbnail: {{error}}"}},projects:{title:"Projects",subtitle:"Organize and track your 3D printing projects",newProject:"New Project",editProject:"Edit Project",deleteProject:"Delete Project",projectName:"Project Name",description:"Description",noProjects:"No projects yet",noProjectsFiltered:"No {{status}} projects",noProjectsFilteredHelp:"You don't have any {{status}} projects. Projects will appear here when their status changes.",createFirst:"Create your first project to start organizing related prints, tracking progress, and managing your builds.",createFirstButton:"Create Your First Project",create:"Create",files:"Files",prints:"Prints",plates:"plates",parts:"parts",lastModified:"Last Modified",deleteConfirm:"Are you sure you want to delete this project? Archives and queue items will be unlinked but not deleted.",addFiles:"Add Files",removeFile:"Remove File",viewDetails:"View Details",namePlaceholder:"e.g., Voron 2.4 Build",descriptionPlaceholder:"Optional description...",color:"Color",targetPlates:"Target Plates",targetPlatesPlaceholder:"e.g., 25",targetPlatesHelp:"Number of print jobs",targetParts:"Target Parts",targetPartsPlaceholder:"e.g., 150",targetPartsHelp:"Total objects needed",tagsLabel:"Tags (comma-separated)",tagsPlaceholder:"e.g., voron, functional, gift",dueDate:"Due Date",priority:"Priority",priorityLow:"Low",priorityNormal:"Normal",priorityHigh:"High",priorityUrgent:"Urgent",statusActive:"Active",statusCompleted:"Completed",statusArchived:"Archived",done:"Done",completed:"completed",failed:"failed",inQueue:"in queue",noPrintsYet:"No prints yet",printJobs:"Print jobs (plates)",partsPrinted:"Parts printed",failedParts:"Failed parts",import:"Import",export:"Export",importProject:"Import project",exportAll:"Export all projects",loading:"Loading projects...",noEditPermission:"You do not have permission to edit projects",noDeletePermission:"You do not have permission to delete projects",noCreatePermission:"You do not have permission to create projects",noImportPermission:"You do not have permission to import projects",noExportPermission:"You do not have permission to export projects",toast:{created:"Project created",updated:"Project updated",deleted:"Project deleted",imported:"Project imported",multipleImported:"{{count}} projects imported",importFailed:"Import failed",exported:"Projects exported (metadata only)"}},projectDetail:{notFound:"Project not found",backToProjects:"Back to Projects",export:"Export",exportProject:"Export project",noExportPermission:"You do not have permission to export projects",noEditPermission:"You do not have permission to edit projects",partOf:"Part of:",priorityLabel:"Priority:",noPrints:"No prints in this project yet",status:{active:"Active",completed:"Completed",archived:"Archived"},priority:{low:"Low",normal:"Normal",high:"High",urgent:"Urgent"},dueDate:{overdue:"Overdue",today:"Due today",daysLeft:"{{count}} days left"},progress:{platesProgress:"Plates Progress",partsProgress:"Parts Progress",printJobs:"print jobs",parts:"parts",percentComplete:"{{percent}}% complete",remaining:"{{count}} remaining"},stats:{printJobs:"Print Jobs",total:"total",failed:"{{count}} failed",partsPrinted:"{{count}} parts printed",printTime:"Print Time",filamentUsed:"Filament Used"},cost:{title:"Cost Tracking",filamentCost:"Filament Cost",energy:"Energy",budget:"Budget",remaining:"Remaining"},subProjects:{title:"Sub-projects ({{count}})"},notes:{title:"Notes",noEditPermission:"You do not have permission to edit notes",placeholder:"Add notes about this project...",empty:"No notes yet. Click Edit to add notes."},files:{title:"Files",linkFolders:"Link folders from the File Manager",forQuickAccess:"to this project for quick access.",fileCount:"{{count}} file(s)",empty:"No folders linked. Go to File Manager and link a folder to this project."},bom:{title:"Bill of Materials",acquired:"{{completed}}/{{total}} acquired",showAll:"Show all",hideDone:"Hide done",addPart:"Add Part",noAddPermission:"You do not have permission to add parts",partNamePlaceholder:"Part name (e.g., M3x8 screws)",partName:"Part name",qty:"Qty",price:"Price ({{currency}})",sourcingUrlPlaceholder:"Sourcing URL (optional)",remarksPlaceholder:"Remarks (optional)",deletePart:"Delete Part",deleteConfirm:'Are you sure you want to delete "{{name}}"?',noUpdatePermission:"You do not have permission to update parts",noEditPermission:"You do not have permission to edit parts",noDeletePermission:"You do not have permission to delete parts",totalCost:"Total cost:",empty:"No parts in the bill of materials. Add hardware, electronics, or other components to track what needs to be sourced."},timeline:{title:"Activity Timeline",empty:"No activity yet."},template:{saveAsTemplate:"Save as Template",noCreatePermission:"You do not have permission to create templates"},queue:{title:"Queue",viewAll:"View all",printing:"{{count}} printing",queued:"{{count}} queued"},prints:{title:"Prints ({{count}})"},toast:{projectUpdated:"Project updated",partAdded:"Part added",partRemoved:"Part removed",exportFailed:"Export failed",projectExported:"Project exported",templateCreated:"Template created"}},system:{title:"System Information",version:"Version",uptime:"Uptime",cpuUsage:"CPU Usage",memoryUsage:"Memory Usage",diskUsage:"Disk Usage",networkInfo:"Network Info",logs:"Logs",debugMode:"Debug Mode",enableDebug:"Enable Debug Logging",disableDebug:"Disable Debug Logging",downloadLogs:"Download Logs",clearLogs:"Clear Logs",dockerInfo:"Docker Info",containerName:"Container Name",imageName:"Image Name",platform:"Platform",architecture:"Architecture"},library:{title:"Filament Library",addFilament:"Add Filament",editFilament:"Edit Filament",deleteFilament:"Delete Filament",vendor:"Vendor",material:"Material",color:"Color",kFactor:"K Factor",temperature:"Temperature",noFilaments:"No filaments in library",deleteConfirm:"Are you sure you want to delete this filament?",importFromPrinter:"Import from Printer",exportToFile:"Export to File"},spoolman:{title:"Spoolman Integration",enabled:"Spoolman Enabled",url:"Spoolman URL",connected:"Connected",disconnected:"Not Connected",testConnection:"Test Connection",sync:"Sync",syncing:"Syncing...",lastSync:"Last Sync",linkToSpoolman:"Link to Spoolman",openInSpoolman:"Open in Spoolman",unlinkSpool:"Unlink Spool",selectSpool:"Select Spool",noUnlinkedSpools:"No unlinked spools available",linkSuccess:"Spool linked to Spoolman successfully",linkFailed:"Failed to link spool",spoolId:"Spool ID",weight:"Weight",remaining:"Remaining"},timelapse:{title:"Timelapse",create:"Create Timelapse",download:"Download",delete:"Delete",preview:"Preview",frameRate:"Frame Rate",quality:"Quality",processing:"Processing...",noTimelapses:"No timelapses available"},ams:{title:"AMS",slot:"Slot",empty:"Empty",emptySlot:"Empty slot",unknown:"Unknown",humidity:"Humidity",temperature:"Temperature",filamentType:"Filament Type",filamentColor:"Color",remaining:"Remaining",history:"AMS History",noHistory:"No history available",configureSlot:"Configure Slot",externalSpool:"External Spool",profile:"Profile",kFactor:"K Factor",fill:"Fill",configure:"Configure"},printModal:{title:"Start Print",selectPrinter:"Select Printer",selectPlate:"Select Plate",filamentMapping:"Filament Mapping",printSettings:"Print Settings",bedLeveling:"Bed Leveling",flowCalibration:"Flow Calibration",vibrationCalibration:"Vibration Calibration",layerInspection:"First Layer Inspection",timelapse:"Timelapse",startPrint:"Start Print",addToQueue:"Add to Queue",cancel:"Cancel",noPrintersAvailable:"No printers available",printerBusy:"Printer is busy",printerOffline:"Printer is offline"},backup:{title:"Backup & Restore",createBackup:"Create Backup",restoreBackup:"Restore Backup",downloadBackup:"Download Backup",uploadBackup:"Upload Backup",lastBackup:"Last Backup",autoBackup:"Auto Backup",backupNow:"Backup Now",restoreWarning:"Warning: Restoring a backup will overwrite all current data.",includeArchives:"Include Archives",includeSettings:"Include Settings",includeProfiles:"Include Profiles",backupSuccess:"Backup created successfully",restoreSuccess:"Backup restored successfully",backupFailed:"Backup failed",restoreFailed:"Restore failed"},tags:{title:"Tags",addTag:"Add Tag",editTag:"Edit Tag",deleteTag:"Delete Tag",tagName:"Tag Name",tagColor:"Tag Color",noTags:"No tags",deleteConfirm:"Are you sure you want to delete this tag?",manageTags:"Manage Tags"},uploadModal:{title:"Upload 3MF Files",dragDrop:"Drag & drop .3mf files here",or:"or",browseFiles:"Browse Files",extractionInfo:"The printer model will be automatically extracted from the 3MF file metadata.",uploaded:"uploaded",failed:"failed",uploading:"Uploading...",upload:"Upload",uploadFailed:"Upload failed"},editArchive:{title:"Edit Archive",name:"Name",namePlaceholder:"Print name",printer:"Printer",noPrinter:"No printer",project:"Project",noProject:"No project",itemsPrinted:"Items Printed",itemsPrintedHelp:"Number of items produced in this print job",notes:"Notes",notesPlaceholder:"Add notes about this print...",externalLink:"External Link",externalLinkPlaceholder:"https://printables.com/model/...",externalLinkHelp:"Link to Printables, Thingiverse, or other source",tags:"Tags",tagsPlaceholder:"Add tags...",addMoreTags:"Add more tags...",matchingTags:'Matching "{{query}}"',existingTags:"Existing tags",clickToAdd:"(click to add)",status:"Status",failureReason:"Failure Reason",selectReason:"Select reason...",photos:"Photos of Printed Result",photosHelp:"Click + to add photos of your printed result",printResult:"Print result",saving:"Saving...",failureReasons:{adhesionFailure:"Adhesion failure",spaghettiDetached:"Spaghetti / Detached",layerShift:"Layer shift",cloggedNozzle:"Clogged nozzle",filamentRunout:"Filament runout",warping:"Warping",stringing:"Stringing",underExtrusion:"Under-extrusion",powerFailure:"Power failure",userCancelled:"User cancelled",other:"Other"},statuses:{completed:"Completed",failed:"Failed",aborted:"Cancelled",printing:"Printing"}},kProfiles:{title:"K-Profiles",noPrintersConfigured:"No Printers Configured",addPrinterInSettings:"Add a printer in Settings to manage K-profiles",noActivePrinters:"No Active Printers",enablePrinterConnection:"Enable a printer connection to view its K-profiles",loadingProfiles:"Loading K-Profiles...",printerOffline:"Printer Offline",printerOfflineDesc:"The selected printer is not connected. Power it on to view K-profiles.",noMatchingProfiles:"No Matching Profiles",noMatchingProfilesDesc:"No profiles match your search criteria",noKProfiles:"No K-Profiles",noKProfilesDesc:"No pressure advance profiles found for {{diameter}}mm nozzle",createFirstProfile:"Create First Profile",printer:"Printer",nozzle:"Nozzle",refresh:"Refresh",addProfile:"Add Profile",export:"Export",import:"Import",select:"Select",selectAll:"Select All",delete:"Delete",searchPlaceholder:"Search by name or filament...",allExtruders:"All Extruders",leftOnly:"Left Only",rightOnly:"Right Only",allFlow:"All Flow",hfOnly:"HF Only",sOnly:"S Only",sortName:"Sort: Name",sortKValue:"Sort: K-Value",sortFilament:"Sort: Filament",leftExtruder:"Left Extruder",rightExtruder:"Right Extruder",modal:{addTitle:"Add K-Profile",editTitle:"Edit K-Profile",profileName:"Profile Name",profileNamePlaceholder:"My PLA Profile",kValue:"K-Value",kValuePlaceholder:"0.020",kValueHelp:"Typical range: 0.01 - 0.06 for PLA, 0.02 - 0.10 for PETG",filament:"Filament",selectFilament:"Select filament...",noFilamentsHelp:"No filaments found. Create a K-profile in Bambu Studio first.",flowType:"Flow Type",highFlow:"High Flow",standard:"Standard",nozzleSize:"Nozzle Size",extruder:"Extruder",extruders:"Extruders",left:"Left",right:"Right",notes:"Notes (stored locally)",notesPlaceholder:"Add notes about this profile...",notesHelp:"Notes are saved in Bambuddy, not on the printer",syncing:"Syncing with printer...",savingExtruder:"Saving to extruder {{current}}/{{total}}...",pleaseWait:"Please wait"},deleteConfirm:{title:"Delete Profile",cannotUndo:"This cannot be undone",message:'Are you sure you want to delete "{{name}}" from the printer?'},bulkDelete:{title:"Delete Profiles",cannotUndo:"This cannot be undone",message:"Are you sure you want to delete {{count}} selected profiles from the printer?"},toast:{profileSaved:"K-profile saved",profilesSaved:"K-profile saved to {{count}} extruders",selectAtLeastOneExtruder:"Please select at least one extruder",profileDeleted:"K-profile deleted",profilesDeleted:"Deleted {{count}} profiles",exportedProfiles:"Exported {{count}} profiles",importedProfiles:"Imported {{count}} of {{total}} profiles",noProfilesToExport:"No profiles to export",invalidFileFormat:"Invalid file format",failedToParseImport:"Failed to parse import file",failedToSaveBatch:"Failed to save K-profiles",noteSaved:"Note saved",failedToSaveNote:"Failed to save note"},permission:{noRead:"You do not have permission to refresh profiles",noCreate:"You do not have permission to add profiles",noUpdate:"You do not have permission to update K-profiles",noDelete:"You do not have permission to delete K-profiles",noExport:"You do not have permission to export profiles",noImport:"You do not have permission to import profiles"}},maintenanceDescriptions:{lubricateRails:"Apply lubricant to linear rails for smooth motion",cleanNozzle:"Clean hotend and nozzle to prevent clogs",checkBelts:"Verify belt tension for accurate prints",cleanBuildPlate:"Clean build plate for better adhesion",checkExtruder:"Inspect extruder gears for wear",checkCooling:"Ensure cooling fans are working properly",generalInspection:"General printer inspection",cleanCarbonRods:"Clean carbon rods to reduce friction",checkPtfeTube:"Inspect PTFE tube for wear or damage",replaceHepaFilter:"Replace HEPA filter for air quality",replaceCarbonFilter:"Replace activated carbon filter",lubricateLeftNozzleRail:"Lubricate left nozzle rail (H2 series)"}},zse={nav:{printers:"Drucker",archives:"Archiv",queue:"Warteschlange",stats:"Statistiken",profiles:"Profile",maintenance:"Wartung",projects:"Projekte",files:"Dateimanager",settings:"Einstellungen",system:"System",collapseSidebar:"Seitenleiste einklappen",expandSidebar:"Seitenleiste ausklappen",update:"Update",updateAvailable:"Update verfügbar: v{{version}}",updateAvailableBanner:"Version {{version}} ist verfügbar!",viewUpdate:"Update anzeigen",viewOnGithub:"Auf GitHub ansehen",keyboardShortcuts:"Tastaturkürzel (?)",switchToLight:"Zum hellen Modus wechseln",switchToDark:"Zum dunklen Modus wechseln",smartSwitches:"Smart Switches",logout:"Abmelden"},common:{save:"Speichern",saving:"Speichern...",cancel:"Abbrechen",delete:"Löschen",edit:"Bearbeiten",add:"Hinzufügen",close:"Schließen",confirm:"Bestätigen",loading:"Lädt...",error:"Fehler",success:"Erfolg",warning:"Warnung",enabled:"Aktiviert",disabled:"Deaktiviert",yes:"Ja",no:"Nein",on:"An",off:"Aus",all:"Alle",none:"Keine",search:"Suchen",filter:"Filtern",sort:"Sortieren",refresh:"Aktualisieren",download:"Herunterladen",upload:"Hochladen",actions:"Aktionen",status:"Status",name:"Name",description:"Beschreibung",date:"Datum",time:"Zeit",hours:"Stunden",minutes:"Minuten",seconds:"Sekunden",days:"Tage",enable:"Aktivieren",disable:"Deaktivieren",permissions:"Berechtigungen",noPrinters:"Keine Drucker konfiguriert",noData:"Keine Daten verfügbar",linkNotFound:"Link nicht gefunden",required:"Erforderlich",optional:"Optional",dismiss:"Schließen",apply:"Anwenden",reset:"Zurücksetzen",clear:"Leeren",selectAll:"Alle auswählen",deselectAll:"Auswahl aufheben",noChange:"— Keine Änderung —",unchanged:"Unverändert",unassigned:"Nicht zugewiesen",unknown:"Unbekannt",unknownError:"Unbekannter Fehler",today:"Heute",asap:"Sofort",overdue:"Überfällig",now:"Jetzt",collapse:"Einklappen",expand:"Ausklappen",viewArchive:"Archiv anzeigen",viewInFileManager:"Im Dateimanager anzeigen",addedBy:"Hinzugefügt von {{username}}",prints:"Drucke",more:"+{{count}} weitere",ascending:"Aufsteigend",descending:"Absteigend",printer:"Drucker",remove:"Entfernen",type:"Typ",print:"Drucken",rename:"Umbenennen",move:"Verschieben",create:"Erstellen",duplicate:"Duplizieren",left:"Links",right:"Rechts"},printers:{title:"Drucker",addPrinter:"Drucker hinzufügen",editPrinter:"Drucker bearbeiten",deletePrinter:"Drucker löschen",printerName:"Druckername",serialNumber:"Seriennummer",ipAddress:"IP-Adresse",accessCode:"Zugangscode",model:"Modell",nozzleCount:"Düsenanzahl",autoArchive:"Automatische Archivierung",status:{idle:"Bereit",printing:"Druckt",paused:"Pausiert",offline:"Offline",error:"Fehler",finished:"Fertig",unknown:"Unbekannt"},temperatures:{nozzle:"Düse",bed:"Druckbett",chamber:"Kammer"},progress:"{{percent}}% abgeschlossen",timeRemaining:"Noch {{time}}",deleteConfirm:'Möchten Sie "{{name}}" wirklich löschen?',maintenanceOk:"Wartung OK",maintenanceWarning:"{{count}} Warnung",maintenanceWarning_plural:"{{count}} Warnungen",maintenanceDue:"{{count}} fällig",maintenanceDue_plural:"{{count}} fällig",sort:{name:"Name",status:"Status",model:"Modell",location:"Standort",ascending:"Aufsteigend sortieren",descending:"Absteigend sortieren"},cardSize:{small:"Kleine Karten",medium:"Mittlere Karten",large:"Große Karten",extraLarge:"Extra große Karten"},hideOffline:"Offline ausblenden",powerOn:"Einschalten",offlinePrintersWithPlugs:"Offline-Drucker mit Smart-Plugs",noPrintersConfigured:"Noch keine Drucker konfiguriert",readyToPrint:"Druckbereit",external:"Extern",deleteArchives:"Druckarchive löschen",noLabel:"Keine Bezeichnung",printPreview:"Druckvorschau",width:"Breite",height:"Höhe",noObjectsFound:"Keine Objekte gefunden",objectsLoadedOnPrintStart:"Objekte werden beim Druckstart geladen",willBeSkipped:"Wird übersprungen",name:"Name",serialCannotBeChanged:"Seriennummer kann nicht geändert werden",locationHelp:"Dient zur Gruppierung von Druckern und zum Filtern von Warteschlangenaufträgen",wifiSignal:{veryWeak:"Sehr schwach",weak:"Schwach",fair:"Ausreichend",good:"Gut",excellent:"Ausgezeichnet"},maintenanceUpToDate:"Alle Wartungen aktuell - Klicken zum Anzeigen",chamberLightOn:"Kammerbeleuchtung einschalten",chamberLightOff:"Kammerbeleuchtung ausschalten",browseFiles:"Druckerdateien durchsuchen",autoOffAfterPrint:"Automatisches Ausschalten nach Druck",autoOffExecuted:"Auto-off wurde ausgeführt - Drucker einschalten zum Zurücksetzen",hmsErrors:"HMS-Fehler",viewHmsErrors:"{{count}} HMS-Fehler anzeigen",resume:"Fortsetzen",pause:"Pausieren",stop:"Stoppen",camera:"Kamera",skipObject:"Objekt überspringen",reconnect:"Neu verbinden",mqttDebug:"MQTT-Debug",activeNozzle:"Aktiv: {{nozzle}} Düse",firmwareUpdate:"Firmware-Update",firmwareInstructions:"Gehen Sie auf dem Touchscreen des Druckers zu",firmwareNav:"Navigieren Sie zu",settings:"Einstellungen",firmware:"Firmware",discoverPrinters:"Drucker entdecken",searching:"Suche...",manualEntry:"Manuelle Eingabe",addFromCloud:"Aus Cloud hinzufügen",toast:{printerDeleted:"Drucker gelöscht",printerAdded:"Drucker hinzugefügt",printerUpdated:"Drucker aktualisiert",failedToDelete:"Drucker konnte nicht gelöscht werden",failedToAdd:"Drucker konnte nicht hinzugefügt werden",failedToUpdate:"Drucker konnte nicht aktualisiert werden",commandSent:"Befehl gesendet",failedToSendCommand:"Befehl konnte nicht gesendet werden",turnedOn:"{{name}} eingeschaltet",failedToPowerOn:"{{name}} konnte nicht eingeschaltet werden",scriptTriggered:"Skript ausgelöst",printStopped:"Druck gestoppt",printPaused:"Druck pausiert",printResumed:"Druck fortgesetzt",referenceDeleted:"Referenz gelöscht",detectionAreaSaved:"Erkennungsbereich gespeichert",failedToRunScript:"Skript konnte nicht ausgeführt werden",failedToStopPrint:"Druck konnte nicht gestoppt werden",failedToPausePrint:"Druck konnte nicht pausiert werden",failedToResumePrint:"Druck konnte nicht fortgesetzt werden",failedToControlChamberLight:"Kammerbeleuchtung konnte nicht gesteuert werden",failedToUpdateSetting:"Einstellung konnte nicht aktualisiert werden",failedToSkipObjects:"Objekte konnten nicht übersprungen werden",failedToRereadRfid:"RFID konnte nicht erneut gelesen werden",failedToCheckPlate:"Platte konnte nicht überprüft werden",failedToUpdateLabel:"Bezeichnung konnte nicht aktualisiert werden",failedToDeleteReference:"Referenz konnte nicht gelöscht werden",failedToSaveDetectionArea:"Erkennungsbereich konnte nicht gespeichert werden",plateCheckEnabled:"Plattenprüfung aktiviert",plateCheckDisabled:"Plattenprüfung deaktiviert",calibrationSaved:"Kalibrierung gespeichert!",calibrationFailed:"Kalibrierung fehlgeschlagen",rfidRereadInitiated:"RFID-Neueinlesen gestartet"},connection:{connected:"Verbunden",offline:"Offline"},queue:{inQueue:"{{count}} Druck in Warteschlange",inQueue_plural:"{{count}} Drucke in Warteschlange"},controls:"Steuerung",rfid:{reread:"RFID neu lesen"},permission:{noAdd:"Sie haben keine Berechtigung, Drucker hinzuzufügen",noEdit:"Sie haben keine Berechtigung, Drucker zu bearbeiten",noDelete:"Sie haben keine Berechtigung, Drucker zu löschen",noControl:"Sie haben keine Berechtigung, Drucker zu steuern",noFiles:"Sie haben keine Berechtigung, auf Druckerdateien zuzugreifen",noAmsRfid:"Sie haben keine Berechtigung, AMS-RFID erneut zu lesen",noSmartPlugControl:"Sie haben keine Berechtigung, Smart Plugs zu steuern"},modal:{addTitle:"Drucker hinzufügen",editTitle:"Drucker bearbeiten",myPrinter:"Mein Drucker",selectModel:"Modell auswählen...",locationGroup:"Standort / Gruppe (optional)",locationPlaceholder:"z.B. Werkstatt, Büro, Keller",autoArchiveLabel:"Abgeschlossene Drucke automatisch archivieren",fromPrinterSettings:"Aus Druckereinstellungen",modelOptional:"Modell (optional)",saveChanges:"Änderungen speichern"},skipObjects:{tooltip:"Objekte überspringen",onlyWhilePrinting:"Objekte überspringen (nur während des Drucks)",requiresMultiple:"Objekte überspringen (erfordert 2+ Objekte)",title:"Objekte überspringen",matchIdsInfo:"IDs mit Drucker-Display abgleichen",printerShowsIds:"Der Druckerbildschirm zeigt Objekt-IDs auf der Bauplatte",skipSelected:"Ausgewählte überspringen",skipping:"Überspringe...",noObjectsSelected:"Keine Objekte ausgewählt",selectObjectsToSkip:"Wählen Sie Objekte aus, die Sie vom aktuellen Druck überspringen möchten",skipped:"übersprungen",objectsSkipped:"Objekte übersprungen",activeCount:"{{count}} aktiv",waitForLayer:"Warten Sie auf Schicht 2+ zum Überspringen von Objekten (aktuell Schicht {{layer}})",skip:"Überspringen"},confirm:{deleteTitle:"Drucker löschen",deleteMessage:'Möchten Sie "{{name}}" wirklich löschen? Alle Verbindungseinstellungen werden entfernt.',deleteArchivesNote:"Der gesamte Druckverlauf für diesen Drucker wird dauerhaft gelöscht.",keepArchivesNote:"Der Druckverlauf wird beibehalten, aber nicht mehr mit diesem Drucker verknüpft.",stopTitle:"Druck stoppen",stopMessage:'Möchten Sie den aktuellen Druck auf "{{name}}" wirklich stoppen? Der Druckauftrag wird abgebrochen.',stopButton:"Druck stoppen",pauseTitle:"Druck pausieren",pauseMessage:'Möchten Sie den aktuellen Druck auf "{{name}}" wirklich pausieren?',pauseButton:"Druck pausieren",resumeTitle:"Druck fortsetzen",resumeMessage:'Möchten Sie den Druck auf "{{name}}" fortsetzen?',resumeButton:"Druck fortsetzen",powerOnTitle:"Drucker einschalten",powerOnMessage:'Möchten Sie die Stromversorgung für "{{name}}" wirklich EINSCHALTEN?',powerOnButton:"Einschalten",powerOffTitle:"Drucker ausschalten",powerOffMessage:'Möchten Sie die Stromversorgung für "{{name}}" wirklich AUSSCHALTEN?',powerOffWarning:'WARNUNG: "{{name}}" druckt gerade! Möchten Sie die Stromversorgung wirklich AUSSCHALTEN? Dies unterbricht den Druck und kann den Drucker beschädigen.',powerOffButton:"Ausschalten"},discovery:{title:"Drucker entdecken",searching:"Suche...",scanning:"Scanne...",scanProgress:"Scanne... {{scanned}}/{{total}}",foundPrinters:"{{count}} Drucker gefunden",noPrintersFound:"Keine Drucker gefunden",noPrintersFoundSubnet:"Keine Drucker im angegebenen Subnetz gefunden.",noPrintersFoundNetwork:"Keine Drucker im Netzwerk gefunden.",allConfigured:"Alle erkannten Drucker sind bereits konfiguriert.",alreadyAdded:"Bereits hinzugefügt",select:"Auswählen",manualEntry:"Manuelle Eingabe",addFromCloud:"Aus Cloud hinzufügen",subnetToScan:"Zu scannendes Subnetz",dockerNote:"Docker erkannt. Geben Sie das Subnetz Ihres Druckers in CIDR-Notation ein. Erfordert network_mode: host in docker-compose.yml.",scanSubnet:"Subnetz nach Druckern scannen",discoverNetwork:"Drucker im Netzwerk suchen",scanningSubnet:"Subnetz wird nach Bambu-Druckern gescannt...",scanningNetwork:"Netzwerk wird gescannt...",serialRequired:"Seriennummer erforderlich",unknown:"Unbekannt",failedToStart:"Erkennung konnte nicht gestartet werden"},filaments:"Filamente",openCameraOverlay:"Kamera-Overlay öffnen",openCameraWindow:"Kamera in neuem Fenster öffnen",firmwareUpdateAvailable:"Firmware-Update verfügbar: {{current}} → {{latest}}",firmwareUpdateButton:"Update",plateDetection:{noPermission:"Sie haben keine Berechtigung, Drucker zu aktualisieren",enabledClick:"Plattenprüfung aktiviert - Klicken zum Deaktivieren",disabledClick:"Plattenprüfung deaktiviert - Klicken zum Aktivieren",manageCalibration:"Platten-Erkennungskalibrierung verwalten",calibrationRequired:"Kalibrierung erforderlich",calibrationInstructions:"Bitte stellen Sie sicher, dass die Druckplatte vollständig leer ist, und klicken Sie dann auf Kalibrieren.",calibrationDescription:"Die Kalibrierung erfasst ein Referenzbild der leeren Platte. Zukünftige Prüfungen vergleichen mit dieser Referenz, um Objekte zu erkennen.",calibrationTip:"Tipp: Sie können bis zu 5 Kalibrierungen für verschiedene Platten speichern. Das System verwendet automatisch die beste Übereinstimmung bei der Prüfung.",plateEmpty:"Platte erscheint leer",objectsDetected:"Objekte auf Platte erkannt",confidence:"Konfidenz",difference:"Differenz",analysisPreview:"Analysevorschau:",analysisLegend:"Grüner Rahmen = Erkennungsbereich, Rote Überlagerung = Unterschiede zur Kalibrierung",savedReferences:"Gespeicherte Referenzen ({{count}}/{{max}})",deleteReference:"Referenz löschen",labelPlaceholder:"Bezeichnung...",clickToEdit:"{{label}} - Zum Bearbeiten klicken",clickToAddLabel:"Zum Hinzufügen einer Bezeichnung klicken"},fans:{partCooling:"Bauteilkühlung",auxiliary:"Hilfsventilator",chamber:"Kammerventilator"},clickToViewHmsErrors:"Klicken, um HMS-Fehler anzuzeigen",estimatedCompletion:"Geschätzte Fertigstellungszeit",slotOptions:"Slot-Optionen",firmwareModal:{title:"Firmware-Update",currentVersion:"Aktuell:",latestVersion:"Neueste:",releaseNotes:"Versionshinweise",checkingPrereqs:"Prüfe Voraussetzungen...",sdCardReady:"SD-Karte bereit. Klicken Sie unten, um die Firmware hochzuladen.",uploadedSuccess:"Firmware auf SD-Karte hochgeladen!",applyInstructions:"So wenden Sie das Update auf Ihrem Drucker an:",step1:"Gehen Sie auf dem Touchscreen des Druckers zu Einstellungen",step2:"Navigieren Sie zu Firmware",step3:"Wählen Sie Update von SD-Karte",step4:"Das Update dauert 10-20 Minuten",done:"Fertig",starting:"Starte...",uploadFirmware:"Firmware hochladen",uploadedToast:"Firmware hochgeladen! Starten Sie das Update vom Druckerbildschirm."},accessCodePlaceholder:"Leer lassen, um den aktuellen zu behalten",roi:{title:"Erkennungsbereich (ROI)",xStart:"X-Start",yStart:"Y-Start",width:"Breite",height:"Höhe",instruction:"Passen Sie den Erkennungsbereich an, um sich auf die Druckplatte zu konzentrieren. Der grüne Rahmen in der Vorschau zeigt den aktuellen Bereich."}},archives:{title:"Druckarchiv",searchPlaceholder:"Archiv durchsuchen...",filterByPrinter:"Nach Drucker filtern",filterByStatus:"Nach Status filtern",sortBy:"Sortieren nach",sortNewest:"Neueste zuerst",sortOldest:"Älteste zuerst",sortName:"Name",sortDuration:"Dauer",sortLargest:"Größte zuerst",sortSmallest:"Kleinste zuerst",sortSize:"Größe",noArchives:"Keine Archive gefunden",noArchivesSearch:"Keine Archive entsprechen Ihrer Suche",noArchivesYet:"Noch keine Archive",loadingArchives:"Lade Archive...",releaseToUpload:"Loslassen zum Hochladen",showAll:"Alle anzeigen",showFavoritesOnly:"Nur Favoriten anzeigen",gridView:"Rasteransicht",listView:"Listenansicht",calendarView:"Kalenderansicht",manageTags:"Tags verwalten",showFailedPrints:"Fehlgeschlagene Drucke anzeigen",hideFailedPrints:"Fehlgeschlagene Drucke ausblenden",printTime:"Druckzeit",filamentUsed:"Verbrauchtes Filament",cost:"Kosten",reprint:"Drucken",preview:"Vorschau",deleteArchive:"Archiv löschen",deleteConfirm:"Möchten Sie dieses Archiv wirklich löschen?",favorite:"Favorit",unfavorite:"Aus Favoriten entfernen",viewDetails:"Details anzeigen",status:{completed:"Abgeschlossen",failed:"Fehlgeschlagen",stopped:"Gestoppt"},toast:{source3mfAttached:"Quell-3MF angehängt: {{filename}}",failedUploadSource3mf:"Fehler beim Hochladen der Quell-3MF",source3mfRemoved:"Quell-3MF entfernt",failedRemoveSource3mf:"Fehler beim Entfernen der Quell-3MF",f3dAttached:"F3D angehängt: {{filename}}",failedUploadF3d:"Fehler beim Hochladen der F3D",f3dRemoved:"F3D entfernt",failedRemoveF3d:"Fehler beim Entfernen der F3D",timelapseAttached:"Zeitraffer angehängt: {{filename}}",timelapseAlreadyAttached:"Zeitraffer bereits angehängt",noMatchingTimelapse:"Kein passender Zeitraffer gefunden",failedScanTimelapse:"Fehler beim Suchen nach Zeitraffer",failedAttachTimelapse:"Fehler beim Anhängen des Zeitraffers",archiveDeleted:"Archiv gelöscht",failedDeleteArchive:"Fehler beim Löschen des Archivs",addedToFavorites:"Zu Favoriten hinzugefügt",removedFromFavorites:"Aus Favoriten entfernt",projectUpdated:"Projekt aktualisiert",failedUpdateProject:"Fehler beim Aktualisieren des Projekts",linkCopied:"Link in die Zwischenablage kopiert",failedCopyLink:"Fehler beim Kopieren des Links",photoDeleted:"Foto gelöscht",failedDeletePhoto:"Fehler beim Löschen des Fotos",failedDeleteArchives:"Fehler beim Löschen der Archive",failedUpdateFavorites:"Fehler beim Aktualisieren der Favoriten",exportDownloaded:"Export heruntergeladen",exportFailed:"Export fehlgeschlagen"},menu:{print:"Drucken",schedule:"Planen",openInBambuStudio:"In Bambu Studio öffnen",slice:"Slicen",externalLink:"Externer Link",viewOnMakerWorld:"Auf MakerWorld ansehen",preview3d:"3D-Vorschau",viewTimelapse:"Zeitraffer ansehen",scanForTimelapse:"Nach Zeitraffer suchen",downloadSource3mf:"Quell-3MF herunterladen",uploadSource3mf:"Quell-3MF hochladen",replaceSource3mf:"Quell-3MF ersetzen",removeSource3mf:"Quell-3MF entfernen",uploadF3d:"F3D hochladen",replaceF3d:"F3D ersetzen",downloadF3d:"F3D herunterladen",removeF3d:"F3D entfernen",download:"Herunterladen",copyDownloadLink:"Download-Link kopieren",qrCode:"QR-Code",viewPhotos:"Fotos ansehen",viewPhotosCount:"Fotos ansehen ({{count}})",projectPage:"Projektseite",addToFavorites:"Zu Favoriten hinzufügen",removeFromFavorites:"Aus Favoriten entfernen",edit:"Bearbeiten",goToProject:"Zum Projekt: {{name}}",addToProject:"Zu Projekt hinzufügen",removeFromProject:"Aus Projekt entfernen",loading:"Laden...",noProjectsAvailable:"Keine Projekte verfügbar",select:"Auswählen",deselect:"Abwählen",delete:"Löschen"},permission:{noReprint:"Sie haben keine Berechtigung, dieses Archiv erneut zu drucken",noAddToQueue:"Sie haben keine Berechtigung, zur Warteschlange hinzuzufügen",noUpdateArchives:"Sie haben keine Berechtigung, Archive zu aktualisieren",noUploadFiles:"Sie haben keine Berechtigung, Dateien hochzuladen",noDownload:"Sie haben keine Berechtigung, Archive herunterzuladen",noCopyLink:"Sie haben keine Berechtigung, Download-Links zu kopieren",noDelete:"Sie haben keine Berechtigung, dieses Archiv zu löschen",noCreate:"Sie haben keine Berechtigung, Archive zu erstellen"},card:{previousPlate:"Vorherige Platte",nextPlate:"Nächste Platte",plateNumber:"Platte {{index}}",moreOptions:"Rechtsklick für mehr Optionen",addToFavorites:"Zu Favoriten hinzufügen",removeFromFavorites:"Aus Favoriten entfernen",cancelled:"abgebrochen",failed:"fehlgeschlagen",duplicate:"Duplikat",duplicateTitle:"Dieses Modell wurde bereits zuvor gedruckt",openSource3mf:"Quell-3MF in Bambu Studio öffnen (Rechtsklick für mehr Optionen)",downloadF3d:"Fusion 360 Designdatei herunterladen",viewTimelapse:"Zeitraffer ansehen",viewPhoto:"1 Foto ansehen",viewPhotos:"{{count}} Fotos ansehen",openFolder:"Ordner öffnen: {{name}}",slicedFile:"Geslicte Datei - druckbereit",sourceFile:"Nur Quelldatei - keine AMS-Zuordnung verfügbar",gcode:"GCODE",source:"QUELLE",project:"Projekt: {{name}}",estimated:"Geschätzt: {{time}}",actual:"Tatsächlich: {{time}}",accuracy:"Genauigkeit: {{percent}}%",filament:"{{weight}}g",layer:"{{count}} Schicht",layers:"{{count}} Schichten",object:"{{count}} Objekt",objects:"{{count}} Objekte",slicedFor:"Geslict für {{model}}",uploadedBy:"Hochgeladen von {{name}}",noPermissionReprint:"Sie haben keine Berechtigung, erneut zu drucken",noPermissionEdit:"Sie haben keine Berechtigung, Archive zu bearbeiten",noPermissionDelete:"Sie haben keine Berechtigung, Archive zu löschen",reprint:"Drucken",schedulePrint:"Druck planen",schedule:"Planen",openInBambuStudio:"In Bambu Studio öffnen",openInBambuStudioToSlice:"In Bambu Studio öffnen zum Slicen",slice:"Slicen",externalLink:"Externer Link",makerWorld:"MakerWorld: {{designer}}",viewProject:"Projekt ansehen",noExternalLink:"Kein externer Link",preview3d:"3D-Vorschau",download:"Herunterladen",edit:"Bearbeiten",delete:"Löschen"},modal:{deleteArchive:"Archiv löschen",deleteConfirm:'Möchten Sie "{{name}}" wirklich löschen? Diese Aktion kann nicht rückgängig gemacht werden.',deleteButton:"Löschen",removeSource3mf:"Quell-3MF entfernen",removeSource3mfConfirm:'Möchten Sie die Quell-3MF-Datei wirklich von "{{name}}" entfernen? Die ursprüngliche Slicer-Projektdatei wird gelöscht.',removeButton:"Entfernen",removeF3d:"F3D entfernen",removeF3dConfirm:'Möchten Sie die Fusion 360 Designdatei wirklich von "{{name}}" entfernen?',timelapse:"{{name}} - Zeitraffer",selectTimelapse:"Zeitraffer auswählen",selectTimelapseDesc:"Keine automatische Übereinstimmung gefunden. Wählen Sie den Zeitraffer für diesen Druck:",deleteArchives:"Archive löschen",deleteArchivesConfirm:"Möchten Sie wirklich {{count}} Archiv(e) löschen? Diese Aktion kann nicht rückgängig gemacht werden.",deleteCount:"{{count}} löschen"},page:{title:"Archive",printsCount:"{{filtered}} von {{total}} Drucken",dropFilesHere:".3mf-Dateien hier ablegen",releaseToUpload:"Loslassen zum Hochladen",only3mfSupported:"Nur .3mf-Dateien werden unterstützt",close:"Schließen",selected:"{{count}} ausgewählt",selectAll:"Alle auswählen",tags:"Tags",project:"Projekt",favorite:"Favorit",delete:"Löschen",toggledFavorites:"Favoriten für {{count}} Archiv(e) umgeschaltet",failedUpdateFavorites:"Fehler beim Aktualisieren der Favoriten",archivesDeleted:"{{count}} Archiv(e) gelöscht",failedDeleteArchives:"Fehler beim Löschen der Archive",photoDeleted:"Foto gelöscht",failedDeletePhoto:"Fehler beim Löschen des Fotos"},list:{name:"Name",printer:"Drucker",date:"Datum",size:"Größe",actions:"Aktionen",hasTimelapse:"Hat Zeitraffer"}},queue:{title:"Druckwarteschlange",subtitle:"Planen und verwalten Sie Ihre Druckaufträge",addToQueue:"Zur Warteschlange hinzufügen",print:"Drucken",reprint:"Erneut drucken",schedulePrint:"Druck planen",editQueueItem:"Warteschlangeneintrag bearbeiten",printToPrinters:"Auf {{count}} Druckern drucken",queueToPrinters:"Zu {{count}} Druckern hinzufügen",sending:"Wird gesendet...",sendingProgress:"Sende {{current}}/{{total}}...",adding:"Wird hinzugefügt...",addingProgress:"Füge hinzu {{current}}/{{total}}...",savingProgress:"Speichere {{current}}/{{total}}...",clearQueue:"Warteschlange leeren",clearHistory:"Verlauf löschen",emptyQueue:"Warteschlange ist leer",position:"Position",scheduledTime:"Geplante Zeit",moveUp:"Nach oben",moveDown:"Nach unten",startNow:"Jetzt starten",printingInProgress:"Druck läuft...",viewArchive:"Archiv anzeigen",viewInFileManager:"Im Dateimanager anzeigen",itemCount:"{{count}} Element",itemCount_plural:"{{count}} Elemente",dragToReorder:"Ziehen zum Neuordnen (nur Sofort)",reorderHint:"Position betrifft nur Sofort-Elemente. Geplante Elemente werden zur festgelegten Zeit ausgeführt.",addedBy:"Hinzugefügt von {{name}}",sections:{currentlyPrinting:"Aktuell druckend",queued:"In Warteschlange",history:"Verlauf"},status:{pending:"Ausstehend",waiting:"Wartend",printing:"Druckt",completed:"Abgeschlossen",failed:"Fehlgeschlagen",skipped:"Übersprungen",cancelled:"Abgebrochen"},summary:{printing:"Druckt",queued:"In Warteschlange",totalTime:"Gesamte Wartezeit",history:"Verlauf"},filter:{allPrinters:"Alle Drucker",unassigned:"Nicht zugewiesen",allStatus:"Alle Status",allLocations:"Alle Standorte",any:"Beliebig"},sort:{byPosition:"Nach Position sortieren",byName:"Nach Name sortieren",byPrinter:"Nach Drucker sortieren",bySchedule:"Nach Zeitplan sortieren",byDate:"Nach Datum sortieren",ascendingOldest:"Aufsteigend (älteste zuerst)",descendingNewest:"Absteigend (neueste zuerst)"},badges:{staged:"Bereitgestellt",requiresPrevious:"Erfordert vorherigen Erfolg",autoPowerOff:"Automatisch ausschalten"},empty:{title:"Keine Drucke geplant",description:'Planen Sie einen Druck von der Archivseite über die Option "Planen" im Kontextmenü oder ziehen Sie Dateien hierher.'},time:{asap:"Sofort",overdue:"Überfällig",now:"Jetzt",lessThanMinute:"In weniger als einer Minute",inMinutes:"In {{count}} Min",inHours:"In {{count}} Stunden"},actions:{stopPrint:"Druck stoppen",startPrint:"Druck starten",requeue:"Erneut einreihen"},bulkEdit:{title:"{{count}} Element bearbeiten",title_plural:"{{count}} Elemente bearbeiten",description:"Nur geänderte Einstellungen werden auf ausgewählte Elemente angewendet.",printer:"Drucker",noChange:"— Keine Änderung —",queueOptions:"Warteschlangenoptionen",staged:"Bereitgestellt (manueller Start)",autoPowerOff:"Nach Druck automatisch ausschalten",requirePrevious:"Vorherigen Erfolg erfordern",printOptions:"Druckoptionen",bedLevelling:"Bett-Nivellierung",flowCalibration:"Fluss-Kalibrierung",vibrationCalibration:"Vibrations-Kalibrierung",layerInspection:"Erste-Schicht-Prüfung",timelapse:"Zeitraffer",useAms:"AMS verwenden",applyChanges:"Änderungen übernehmen",selectAll:"Alle auswählen",deselectAll:"Auswahl aufheben",selected:"{{count}} ausgewählt",editSelected:"Ausgewählte bearbeiten",cancelSelected:"Ausgewählte abbrechen"},confirm:{cancelTitle:"Geplanten Druck abbrechen",cancelMessage:'Möchten Sie "{{name}}" wirklich abbrechen?',stopTitle:"Druck stoppen",stopMessage:'Möchten Sie den aktuellen Druck "{{name}}" wirklich stoppen? Der Druckauftrag wird am Drucker abgebrochen.',removeTitle:"Aus Verlauf entfernen",removeMessage:'Möchten Sie "{{name}}" wirklich aus dem Warteschlangenverlauf entfernen?',clearHistoryTitle:"Verlauf löschen",clearHistoryMessage:"Möchten Sie alle {{count}} Element(e) aus dem Verlauf entfernen?",cancelButton:"Druck abbrechen",stopButton:"Druck stoppen",thisPrint:"diesen Druck",thisItem:"dieses Element"},toast:{cancelled:"Warteschlangenelement abgebrochen",cancelFailed:"Element konnte nicht abgebrochen werden",removed:"Warteschlangenelement entfernt",removeFailed:"Element konnte nicht entfernt werden",stopped:"Druck gestoppt",stopFailed:"Druck konnte nicht gestoppt werden",released:"Druck in Warteschlange freigegeben",startFailed:"Druck konnte nicht gestartet werden",reorderFailed:"Warteschlange konnte nicht neu geordnet werden",historyCleared:"{{count}} Verlaufselement(e) gelöscht",clearHistoryFailed:"Verlauf konnte nicht gelöscht werden",updateFailed:"Elemente konnten nicht aktualisiert werden",bulkCancelled:"{{count}} Element(e) abgebrochen",bulkCancelFailed:"Elemente konnten nicht abgebrochen werden"},permissions:{noStopPrint:"Sie haben keine Berechtigung, Drucke zu stoppen",noStartPrint:"Sie haben keine Berechtigung, Drucke zu starten",noEdit:"Sie haben keine Berechtigung, dieses Warteschlangenelement zu bearbeiten",noCancel:"Sie haben keine Berechtigung, dieses Warteschlangenelement abzubrechen",noRequeue:"Sie haben keine Berechtigung, Elemente erneut einzureihen",noRemove:"Sie haben keine Berechtigung, dieses Warteschlangenelement zu entfernen",noClearHistory:"Sie haben keine Berechtigung, den gesamten Verlauf zu löschen",noEditItems:"Sie haben keine Berechtigung, Warteschlangenelemente zu bearbeiten",noCancelItems:"Sie haben keine Berechtigung, Warteschlangenelemente abzubrechen"}},stats:{title:"Dashboard",subtitle:"Widgets zum Neuanordnen ziehen. Auf das Augensymbol klicken zum Ausblenden.",overview:"Übersicht",totalPrints:"Gesamtdrucke",successRate:"Erfolgsrate",totalPrintTime:"Gesamtdruckzeit",printTime:"Druckzeit",totalFilament:"Gesamtverbrauch Filament",filamentUsed:"Filamentverbrauch",filamentCost:"Filamentkosten",totalCost:"Gesamtkosten",energyUsed:"Energieverbrauch",energyCost:"Energiekosten",averagePrintTime:"Durchschnittliche Druckzeit",printsPerDay:"Drucke pro Tag",byPrinter:"Nach Drucker",printsByPrinter:"Drucke nach Drucker",byMaterial:"Nach Material",byMonth:"Nach Monat",last7Days:"Letzte 7 Tage",last30Days:"Letzte 30 Tage",last90Days:"Letzte 90 Tage",allTime:"Gesamt",quickStats:"Schnellstatistiken",printActivity:"Druckaktivität",filamentTypes:"Filamenttypen",filamentTrends:"Filamenttrends",failureAnalysis:"Fehleranalyse",timeAccuracy:"Zeitgenauigkeit",successful:"Erfolgreich:",failed:"Fehlgeschlagen:",perfectEstimate:"100% = perfekte Schätzung",noTimeAccuracyData:"Noch keine Zeitgenauigkeitsdaten",noFilamentData:"Keine Filamentdaten verfügbar",noPrinterData:"Keine Druckerdaten verfügbar",noPrintData:"Keine Druckdaten verfügbar",noPrintDataLast30Days:"Keine Druckdaten in den letzten 30 Tagen",failureReasons:"Fehlerursachen",topFailureReasons:"Häufigste Fehlerursachen",failedPrintsCount:"{{failed}} / {{total}} Drucke fehlgeschlagen",lastWeekRate:"Letzte Woche: {{rate}}%",resetLayout:"Layout zurücksetzen",recalculateCosts:"Kosten neu berechnen",recalculateCostsHint:"Alle Archivkosten mit aktuellen Filamentpreisen neu berechnen",exportStats:"Statistiken exportieren",exportAsCsv:"Als CSV exportieren",exportAsExcel:"Als Excel exportieren",hiddenCount:"{{count}} ausgeblendet",exportDownloaded:"Export heruntergeladen",exportFailed:"Export fehlgeschlagen",layoutReset:"Layout zurückgesetzt",recalculatedCosts:"Kosten für {{count}} Archive neu berechnet",recalculateFailed:"Kosten konnten nicht neu berechnet werden",loadingStats:"Statistiken werden geladen...",noPermissionResetLayout:"Sie haben keine Berechtigung, das Layout zurückzusetzen",noPermissionRecalculate:"Sie haben keine Berechtigung, Kosten neu zu berechnen"},maintenance:{title:"Wartung",overview:"Übersicht",allOk:"Alle Wartungen aktuell",dueCount:"{{count}} Aufgabe fällig",dueCount_plural:"{{count}} Aufgaben fällig",warningCount:"{{count}} Warnung",warningCount_plural:"{{count}} Warnungen",totalPrintTime:"Gesamtdruckzeit",nextMaintenance:"Nächste Wartung",nothingDue:"Nichts fällig",tasks:"Aufgaben",lastPerformed:"Zuletzt durchgeführt",interval:"Intervall",hoursRemaining:"{{hours}}h verbleibend",hoursOverdue:"{{hours}}h überfällig",markDone:"Als erledigt markieren",performMaintenance:"Wartung durchführen",history:"Verlauf",noHistory:"Kein Wartungsverlauf",editPrintHours:"Druckstunden bearbeiten",currentHours:"Aktuelle Stunden",statusTab:"Status",settingsTab:"Einstellungen",overdueCount:"{{count}} überfällig",dueSoonCount:"{{count}} bald fällig",dueSoon:"Bald fällig",allGood:"Alles in Ordnung",overdueBy:"Überfällig um {{duration}}",dueIn:"Fällig in {{duration}}",timeLeft:"{{duration}} verbleibend",day:"1 Tag",days:"{{count}} Tage",week:"1 Woche",weeks:"{{count}} Wochen",month:"1 Monat",months:"{{count}} Monate",year:"1 Jahr",maintenanceTypes:"Wartungstypen",maintenanceTypesDescription:"Systemtypen und Ihre benutzerdefinierten Wartungsaufgaben",addCustomType:"Benutzerdefinierten Typ hinzufügen",intervalType:"Intervalltyp",intervalValue:"Intervall ({{type}})",icon:"Symbol",documentationLink:"Dokumentationslink (optional)",assignToPrinters:"Druckern zuweisen",selectAtLeastOnePrinter:"Wählen Sie mindestens einen Drucker",addType:"Typ hinzufügen",custom:"Benutzerdefiniert",printHours:"Druckstunden",calendarDays:"Kalendertage",exampleName:"z.B. HEPA-Filter ersetzen",viewDocumentation:"Dokumentation anzeigen",timeBasedInterval:"Zeitbasiertes Intervall",intervalOverrides:"Intervall-Überschreibungen",intervalOverridesDescription:"Intervalle für bestimmte Drucker anpassen",assignedToPrinters:"Druckern zugewiesen:",noPrintersAssigned:"Keine Drucker zugewiesen",addPrinterShort:"Hinzufügen:",printersAssignedClick:"{{count}} Drucker zugewiesen - klicken zum Verwalten",removeFromPrinter:"Von diesem Drucker entfernen",types:{lubricateRails:"Linearschienen schmieren",cleanNozzle:"Düse/Hotend reinigen",checkBelts:"Riemenspannung prüfen",cleanBuildPlate:"Druckbett reinigen",checkExtruder:"Extruderzahnräder prüfen",checkCooling:"Kühlungslüfter prüfen",generalInspection:"Allgemeine Inspektion",cleanCarbonRods:"Kohlenstoffstangen reinigen",checkPtfeTube:"PTFE-Schlauch prüfen",replaceHepaFilter:"HEPA-Filter ersetzen",replaceCarbonFilter:"Aktivkohlefilter ersetzen",lubricateLeftNozzleRail:"Linke Düsenschiene schmieren"},maintenanceComplete:"Wartung als abgeschlossen markiert",typeUpdated:"Wartungstyp aktualisiert",typeDeleted:"Wartungstyp gelöscht",printHoursUpdated:"Druckstunden aktualisiert",printerAssigned:"Drucker zugewiesen",printerRemoved:"Drucker entfernt",deleteTypeConfirm:'"{{name}}" löschen?',noPermissionUpdate:"Sie haben keine Berechtigung, Wartungselemente zu aktualisieren",noPermissionPerform:"Sie haben keine Berechtigung, Wartungen durchzuführen",noPermissionEditTypes:"Sie haben keine Berechtigung, Wartungstypen zu bearbeiten",noPermissionDeleteTypes:"Sie haben keine Berechtigung, Wartungstypen zu löschen",noPermissionEditHours:"Sie haben keine Berechtigung, Druckstunden zu bearbeiten",noPermissionRemovePrinter:"Sie haben keine Berechtigung, Druckerzuweisungen zu entfernen",noPermissionAssignPrinter:"Sie haben keine Berechtigung, Drucker zuzuweisen",noPermissionEditIntervals:"Sie haben keine Berechtigung, Intervalle zu bearbeiten",configureSettings:"Wartungstypen und Intervalle konfigurieren"},settings:{title:"Einstellungen",general:"Allgemein",tabs:{general:"Allgemein",smartPlugs:"Smart Plugs",notifications:"Benachrichtigungen",filament:"Filament",network:"Netzwerk",apiKeys:"API-Schlüssel",virtualPrinter:"Virtueller Drucker",users:"Benutzer",backup:"Sicherung"},appearance:"Erscheinungsbild",notifications:"Benachrichtigungen",smartPlugs:"Smart Plugs",spoolman:"Spoolman",updates:"Updates",language:"Sprache",languageDescription:"Wählen Sie Ihre bevorzugte Sprache",theme:"Design",themeLight:"Hell",themeDark:"Dunkel",themeSystem:"System",defaultView:"Standardansicht",defaultViewDescription:"Seite, die beim Öffnen der App angezeigt wird",checkForUpdates:"Nach Updates suchen",autoUpdate:"Automatische Updates",currentVersion:"Aktuelle Version",latestVersion:"Neueste Version",upToDate:"Sie sind auf dem neuesten Stand",updateAvailable:"Update verfügbar",notificationLanguage:"Benachrichtigungssprache",notificationLanguageDescription:"Sprache für Push-Benachrichtigungen",notificationProviders:"Benachrichtigungsanbieter",addProvider:"Anbieter hinzufügen",editProvider:"Anbieter bearbeiten",providerType:"Anbietertyp",testNotification:"Testbenachrichtigung",testSuccess:"Testbenachrichtigung erfolgreich gesendet",testFailed:"Testbenachrichtigung konnte nicht gesendet werden",quietHours:"Ruhezeiten",quietHoursDescription:"Keine Störungen während dieser Zeiten",quietHoursStart:"Beginn",quietHoursEnd:"Ende",events:{title:"Benachrichtigungsereignisse",printStart:"Druck gestartet",printComplete:"Druck abgeschlossen",printFailed:"Druck fehlgeschlagen",printStopped:"Druck gestoppt",printProgress:"Fortschrittsmeldungen",printProgressDescription:"Bei 25%, 50%, 75% benachrichtigen",printerOffline:"Drucker offline",printerError:"Druckerfehler",filamentLow:"Filament niedrig",maintenanceDue:"Wartung fällig",maintenanceDueDescription:"Benachrichtigen, wenn Wartung erforderlich"},smartPlug:{title:"Smart Plugs",add:"Smart Plug hinzufügen",edit:"Smart Plug bearbeiten",name:"Name",ipAddress:"IP-Adresse",linkedPrinter:"Verknüpfter Drucker",autoOn:"Automatisch einschalten",autoOnDescription:"Einschalten beim Druckstart",autoOff:"Automatisch ausschalten",autoOffDescription:"Ausschalten nach Druckende",offDelay:"Ausschaltverzögerung",offDelayMinutes:"Minuten nach Druck",offDelayTemp:"Wenn Düse unter Temperatur",currentState:"Aktueller Status",turnOn:"Einschalten",turnOff:"Ausschalten"},spoolmanEnabled:"Spoolman-Integration aktivieren",spoolmanUrl:"Spoolman URL",spoolmanConnected:"Verbunden",spoolmanDisconnected:"Nicht verbunden",noDefaultPrinter:"Kein Standard (jedes Mal fragen)",sidebarOrder:"Seitenleisten-Reihenfolge",saveThumbnails:"Vorschaubilder speichern",captureFinishPhoto:"Abschlussfoto aufnehmen",noPrintersConfigured:"Keine Drucker konfiguriert",archiveMode:{always:"Immer Archiveintrag erstellen",never:"Nie Archiveintrag erstellen",ask:"Jedes Mal fragen"},checkForUpdatesLabel:"Nach Updates suchen",checkPrinterFirmware:"Drucker-Firmware prüfen",enableRetry:"Wiederholung aktivieren",homeAssistantDescription:"Smart Plugs über Home Assistant steuern",mqttConnectedTo:"Verbunden mit",prometheusDescription:"Druckerdaten im Prometheus-Format bereitstellen",noSmartPlugsTitle:"Keine Smart Plugs konfiguriert",noSmartPlugsDescription:"Fügen Sie einen Tasmota-basierten Smart Plug hinzu, um den Energieverbrauch zu verfolgen und die Stromsteuerung zu automatisieren.",noProvidersTitle:"Keine Anbieter konfiguriert",noProvidersDescription:"Fügen Sie einen Anbieter hinzu, um Benachrichtigungen zu erhalten.",noTemplatesAvailable:"Keine Vorlagen verfügbar. Starten Sie das Backend neu, um Standardvorlagen zu laden.",apiPermissionView:"Druckerstatus und Warteschlange anzeigen",apiPermissionEdit:"Elemente zur Druckwarteschlange hinzufügen und entfernen",apiKeysEmptyTitle:"Keine API-Schlüssel",apiKeysEmptyDescription:"Erstellen Sie einen API-Schlüssel zur Integration mit externen Diensten.",noUsersFound:"Keine Benutzer gefunden",noGroupsFound:"Keine Gruppen gefunden",noGroupsAvailable:"Keine Gruppen verfügbar",passwordsDoNotMatch:"Passwörter stimmen nicht überein",systemGroupWarning:"System-Gruppennamen können nicht geändert werden",authDisabledTitle:"Authentifizierung ist deaktiviert",authDisabledFeature1:"Anmeldung zum Zugriff auf das System erforderlich",authDisabledFeature2:"Mehrere Benutzer mit gruppenbasierten Berechtigungen erstellen",authDisabledFeature3:"Zugriff mit über 50 granularen Berechtigungen steuern",userHasCreated:"Dieser Benutzer hat erstellt:",userItemsQuestion:"Was möchten Sie mit diesen Elementen tun?",deleteUserConfirm:"Möchten Sie diesen Benutzer wirklich löschen?",actionCannotBeUndone:"Diese Aktion kann nicht rückgängig gemacht werden.",addFirstSmartPlug:"Ersten Smart Plug hinzufügen",providers:"Anbieter",log:"Protokoll",testAll:"Alle testen",testResults:"Testergebnisse",testPassedCount:"{{count}} bestanden",testFailedCount:"{{count}} fehlgeschlagen",messageTemplates:"Nachrichtenvorlagen",messageTemplatesDescription:"Passen Sie Benachrichtigungen für jedes Ereignis an.",apiKeys:"API-Schlüssel",apiKeysDescription:"Erstellen Sie API-Schlüssel für externe Integrationen und Webhooks.",createKey:"Schlüssel erstellen",apiKeyCreated:"API-Schlüssel erfolgreich erstellt",apiKeyCopyWarning:"Kopieren Sie diesen Schlüssel jetzt - er wird nicht mehr angezeigt!",useInApiBrowser:"Im API-Browser verwenden",createNewApiKey:"Neuen API-Schlüssel erstellen",keyName:"Schlüsselname",keyNamePlaceholder:"z.B. Home Assistant, OctoPrint",readStatus:"Status lesen",readStatusDescription:"Druckerstatus und Warteschlange anzeigen",manageQueue:"Warteschlange verwalten",manageQueueDescription:"Elemente zur Druckwarteschlange hinzufügen und entfernen",controlPrinter:"Drucker steuern",controlPrinterDescription:"Drucke pausieren, fortsetzen und stoppen",unnamedKey:"Unbenannter Schlüssel",lastUsed:"Zuletzt verwendet",read:"Lesen",control:"Steuern",createFirstKey:"Ersten Schlüssel erstellen",webhookEndpoints:"Webhook-Endpunkte",webhookApiKeyHint:"Verwenden Sie Ihren API-Schlüssel im X-API-Key-Header.",webhook:{getAllStatus:"Alle Druckerstatus abrufen",getSpecificStatus:"Spezifischen Druckerstatus abrufen",addToQueue:"Zur Druckwarteschlange hinzufügen",pausePrint:"Druck pausieren",resumePrint:"Druck fortsetzen",stopPrint:"Druck stoppen"},apiBrowser:"API-Browser",apiBrowserDescription:"Erkunden und testen Sie alle verfügbaren API-Endpunkte.",apiKeyForTesting:"API-Schlüssel zum Testen",apiKeyPlaceholder:"Fügen Sie hier Ihren API-Schlüssel ein, um authentifizierte Endpunkte zu testen...",apiKeyHint:"Dieser Schlüssel wird als X-API-Key-Header mit Anfragen gesendet.",deleteApiKeyTitle:"API-Schlüssel löschen",deleteApiKeyMessage:"Möchten Sie diesen API-Schlüssel wirklich löschen? Alle Integrationen, die diesen Schlüssel verwenden, funktionieren nicht mehr.",deleteKey:"Schlüssel löschen",amsDisplayThresholds:"AMS-Anzeigeschwellenwerte",amsThresholdsDescription:"Konfigurieren Sie Farbschwellenwerte für AMS-Feuchtigkeits- und Temperaturanzeigen.",humidity:"Luftfeuchtigkeit",goodGreen:"Gut (grün)",fairOrange:"Mittel (orange)",aboveFairBad:"Über dem mittleren Schwellenwert wird rot angezeigt (schlecht)",temperature:"Temperatur",goodBlue:"Gut (blau)",aboveFairHot:"Über dem mittleren Schwellenwert wird rot angezeigt (heiß)",historyRetention:"Verlaufsaufbewahrung",keepSensorHistory:"Sensorverlauf behalten für",historyRetentionDescription:"Ältere Feuchtigkeits- und Temperaturdaten werden automatisch gelöscht",printModal:"Druckdialog",expandCustomMapping:"Benutzerdefinierte Zuordnung standardmäßig erweitern",expandCustomMappingDescription:"Bei Druck auf mehrere Drucker die AMS-Zuordnung pro Drucker erweitert anzeigen",authentication:"Authentifizierung",authEnabledDescription:"Ihre Instanz ist mit Benutzerauthentifizierung gesichert",authDisabledDescription:"Aktivieren Sie die Anmeldepflicht und verwalten Sie den Benutzerzugriff",authDisabledMessage:"Aktivieren Sie die Authentifizierung, um Benutzerkonten zu erstellen, Berechtigungen zu verwalten und Ihre Bambuddy-Instanz zu sichern.",enableAuthentication:"Authentifizierung aktivieren",currentUser:"Aktueller Benutzer",changePassword:"Passwort ändern",admin:"Admin",users:"Benutzer",addUser:"Benutzer hinzufügen",groups:"Gruppen",addGroup:"Gruppe hinzufügen",system:"System",noDescription:"Keine Beschreibung",userCount:"{{count}} Benutzer",permissionCount:"{{count}} Berechtigungen",createUser:"Benutzer erstellen",username:"Benutzername",enterUsername:"Benutzername eingeben",password:"Passwort",enterPassword:"Passwort eingeben (min. 6 Zeichen)",confirmPassword:"Passwort bestätigen",confirmPasswordPlaceholder:"Passwort bestätigen",viewReleaseOnGitHub:"Release auf GitHub anzeigen",turnAllPlugsOn:"Alle Stecker einschalten",turnAllPlugsOff:"Alle Stecker ausschalten",clearNotificationLogs:"Benachrichtigungsprotokolle löschen",clearLogsMessage:"Dadurch werden alle Benachrichtigungsprotokolle, die älter als 30 Tage sind, dauerhaft gelöscht. Diese Aktion kann nicht rückgängig gemacht werden.",clearLogs:"Protokolle löschen",resetUiPreferences:"UI-Einstellungen zurücksetzen",resetUiPreferencesMessage:"Dadurch werden alle UI-Einstellungen auf Standardwerte zurückgesetzt: Seitenleisten-Reihenfolge, Theme, Dashboard-Layout, Ansichtsmodi und Sortiereinstellungen. Ihre Drucker, Archive und Servereinstellungen werden NICHT beeinträchtigt. Die Seite wird nach dem Löschen neu geladen.",resetPreferences:"Einstellungen zurücksetzen",deleteGroupTitle:"Gruppe löschen",deleteGroupMessage:"Möchten Sie diese Gruppe wirklich löschen? Benutzer in dieser Gruppe verlieren diese Berechtigungen.",deleteGroup:"Gruppe löschen",disableAuthenticationTitle:"Authentifizierung deaktivieren",disableAuthenticationMessage:"Möchten Sie die Authentifizierung wirklich deaktivieren? Dadurch wird Ihre Bambuddy-Instanz ohne Anmeldung zugänglich. Alle Benutzer bleiben in der Datenbank, aber die Authentifizierung wird deaktiviert.",disableAuthentication:"Authentifizierung deaktivieren",configureBambuddy:"Bambuddy konfigurieren",systemDefault:"Systemstandard",archiveSettings:"Archiv-Einstellungen",newWindow:"Neues Fenster",embeddedOverlay:"Eingebettetes Overlay",externalCameras:"Externe Kameras",costTracking:"Kostenverfolgung",printsOnly:"Nur Drucke",totalConsumption:"Gesamtverbrauch",dataManagement:"Datenverwaltung",clearNotificationLogsDescription:"Benachrichtigungsprotokolle älter als 30 Tage löschen",resetUiPreferencesDescription:"Seitenleisten-Reihenfolge, Theme, Ansichtsmodi und Layout-Einstellungen zurücksetzen. Drucker, Archive und Einstellungen werden nicht beeinflusst.",enableHomeAssistant:"Home Assistant aktivieren",enableMqtt:"MQTT aktivieren",useTls:"TLS verwenden",enableMetricsEndpoint:"Metrik-Endpunkt aktivieren",availableMetrics:"Verfügbare Metriken",editUser:"Benutzer bearbeiten",deleteUserTitle:"Benutzer löschen",groupName:"Gruppenname",leaveEmptyForAnonymous:"Leer lassen für anonym",leaveEmptyForNoAuth:"Leer lassen für keine Authentifizierung",enterNewPassword:"Neues Passwort eingeben",confirmNewPassword:"Neues Passwort bestätigen",enterGroupName:"Gruppenname eingeben",enterDescriptionOptional:"Beschreibung eingeben (optional)",enterCurrentPassword:"Aktuelles Passwort eingeben",enterNewPasswordMin6:"Neues Passwort eingeben (min. 6 Zeichen)",toast:{keyCopied:"Schlüssel in Zwischenablage kopiert",copyFailed:"Schlüssel konnte nicht kopiert werden",keyAddedToBrowser:"Schlüssel zum API-Browser hinzugefügt",clearLogsFailed:"Protokolle konnten nicht gelöscht werden",uiPreferencesReset:"UI-Einstellungen zurückgesetzt. Wird neu geladen...",authDisabled:"Authentifizierung erfolgreich deaktiviert",authDisableFailed:"Authentifizierung konnte nicht deaktiviert werden",apiKeyCreated:"API-Schlüssel erstellt",apiKeyDeleted:"API-Schlüssel gelöscht",userCreated:"Benutzer erfolgreich erstellt",userUpdated:"Benutzer erfolgreich aktualisiert",userDeleted:"Benutzer erfolgreich gelöscht",groupCreated:"Gruppe erfolgreich erstellt",groupUpdated:"Gruppe erfolgreich aktualisiert",groupDeleted:"Gruppe erfolgreich gelöscht",fillRequiredFields:"Bitte füllen Sie alle erforderlichen Felder aus",passwordsDoNotMatch:"Passwörter stimmen nicht überein",passwordTooShort:"Passwort muss mindestens 6 Zeichen lang sein",enterGroupName:"Bitte geben Sie einen Gruppennamen ein",settingsSaved:"Einstellungen gespeichert",cameraSettingsSaved:"Kamera-Einstellungen gespeichert",enterCameraUrl:"Bitte geben Sie eine Kamera-URL ein",passwordChanged:"Passwort erfolgreich geändert",connectionFailed:"Verbindung fehlgeschlagen",testFailed:"Test fehlgeschlagen",cameraConnected:"Kamera verbunden{{resolution}}"},testConnection:"Verbindung testen"},notification:{printStarted:{title:"Druck gestartet",body:"{{printer}}: {{filename}} wird gedruckt"},printCompleted:{title:"Druck abgeschlossen",body:"{{printer}}: {{filename}} erfolgreich abgeschlossen"},printFailed:{title:"Druck fehlgeschlagen",body:"{{printer}}: {{filename}} ist fehlgeschlagen"},printStopped:{title:"Druck gestoppt",body:"{{printer}}: {{filename}} wurde gestoppt"},printProgress:{title:"Druckfortschritt",body:"{{printer}}: {{filename}} ist zu {{percent}}% abgeschlossen"},printerOffline:{title:"Drucker offline",body:"{{printer}} ist offline"},printerError:{title:"Druckerfehler",body:"{{printer}}: {{error}}"},filamentLow:{title:"Filament niedrig",body:"{{printer}}: Filament geht zur Neige"},maintenanceDue:{title:"Wartung fällig",body:"{{printer}}: {{items}} benötigen Aufmerksamkeit"}},errors:{generic:"Etwas ist schiefgelaufen",networkError:"Netzwerkfehler. Bitte überprüfen Sie Ihre Verbindung.",notFound:"Nicht gefunden",unauthorized:"Nicht autorisiert",serverError:"Serverfehler",validationError:"Bitte überprüfen Sie Ihre Eingabe",printerConnectionFailed:"Verbindung zum Drucker fehlgeschlagen",saveFailed:"Speichern fehlgeschlagen",deleteFailed:"Löschen fehlgeschlagen",loadFailed:"Laden der Daten fehlgeschlagen"},hmsErrors:{title:"Fehler - {{name}}",noErrors:"Keine Fehler",viewOnWiki:"Im Bambu Lab Wiki ansehen",clearInstructions:"Löschen Sie die Fehler am Drucker, um sie hier zu entfernen."},mqttDebug:{title:"MQTT-Debug-Protokoll",searchPlaceholder:"Topic oder Payload suchen...",noMessages:"Noch keine Nachrichten protokolliert",startLoggingHint:'Klicken Sie auf "Protokollierung starten", um MQTT-Nachrichten aufzuzeichnen',noMessagesMatch:"Keine Nachrichten entsprechen Ihrem Filter",adjustFilterHint:"Versuchen Sie, Ihre Such- oder Filterkriterien anzupassen",incoming:"Eingehend",outgoing:"Ausgehend",loggingStopped:"Protokollierung gestoppt",loggingActive:"Protokollierung aktiv - Nachrichten werden automatisch aktualisiert",startLogging:"Protokollierung starten",stopLogging:"Protokollierung stoppen",clearLog:"Protokoll löschen",topic:"Topic",timestamp:"Zeitstempel",direction:"Richtung",all:"Alle"},printerFiles:{title:"Dateimanager",storageUsed:"Belegt:",storageFree:"Frei:",filterPlaceholder:"Dateien filtern...",deleteButton:"Löschen",deleteFiles:"{{count}} Dateien löschen",deleteFileConfirm:'"{{name}}" löschen? Dies kann nicht rückgängig gemacht werden.',deleteFilesConfirm:"{{count}} ausgewählte Dateien löschen? Dies kann nicht rückgängig gemacht werden.",noFiles:"Keine Dateien auf dem Drucker",loadingFiles:"Dateien werden geladen...",failedToLoad:"Dateien konnten nicht geladen werden",toast:{filesDeleted:"{{count}} Datei(en) gelöscht",deleteFailed:"Löschen fehlgeschlagen: {{error}}"}},confirm:{delete:"Möchten Sie dies wirklich löschen?",unsavedChanges:"Sie haben ungespeicherte Änderungen. Möchten Sie wirklich verlassen?",clearQueue:"Möchten Sie die Warteschlange wirklich leeren?"},login:{title:"Bambuddy Anmeldung",subtitle:"Melden Sie sich bei Ihrem Konto an",username:"Benutzername",usernamePlaceholder:"Benutzername eingeben",password:"Passwort",passwordPlaceholder:"Passwort eingeben",signIn:"Anmelden",signingIn:"Anmeldung läuft...",forgotPassword:"Passwort vergessen?",loginSuccess:"Erfolgreich angemeldet",loginFailed:"Anmeldung fehlgeschlagen",enterCredentials:"Bitte Benutzername und Passwort eingeben",forgotPasswordTitle:"Passwort vergessen",forgotPasswordMessage:"Wenn Sie Ihr Passwort vergessen haben, wenden Sie sich bitte an Ihren Systemadministrator.",howToReset:"So setzen Sie Ihr Passwort zurück:",resetStep1:"Kontaktieren Sie Ihren Bambuddy-Administrator",resetStep2:"Bitten Sie ihn, Ihr Passwort in der Benutzerverwaltung zurückzusetzen",resetStep3:"Er kann ein neues temporäres Passwort für Sie festlegen",resetStep4:"Melden Sie sich mit dem neuen Passwort an und ändern Sie es in den Einstellungen",gotIt:"Verstanden"},setup:{title:"Bambuddy Einrichtung",subtitle:"Konfigurieren Sie die Authentifizierung für Ihre Bambuddy-Instanz",enableAuth:"Authentifizierung aktivieren",adminAccount:"Admin-Konto",adminAccountDesc:"Wenn bereits Admin-Benutzer existieren, wird die Authentifizierung mit den vorhandenen Admin-Konten aktiviert. Lassen Sie die Felder unten leer, um vorhandene Admins zu verwenden, oder geben Sie neue Anmeldedaten ein, um einen neuen Admin-Benutzer zu erstellen.",adminUsername:"Admin-Benutzername",adminPassword:"Admin-Passwort",optionalIfAdminExists:"(optional, wenn Admin-Benutzer existieren)",adminUsernamePlaceholder:"Admin-Benutzernamen eingeben (optional)",adminPasswordPlaceholder:"Admin-Passwort eingeben (optional)",confirmPassword:"Passwort bestätigen",confirmPasswordPlaceholder:"Admin-Passwort bestätigen",settingUp:"Einrichtung läuft...",completeSetup:"Einrichtung abschließen",toast:{authEnabledAdminCreated:"Authentifizierung aktiviert und Admin-Benutzer erstellt",authEnabledExistingAdmins:"Authentifizierung mit vorhandenen Admin-Benutzern aktiviert",setupCompleted:"Einrichtung abgeschlossen",enterBothCredentials:"Bitte geben Sie sowohl Admin-Benutzernamen als auch Passwort ein, oder lassen Sie beide leer, um vorhandene Admin-Benutzer zu verwenden",passwordsDoNotMatch:"Passwörter stimmen nicht überein",passwordTooShort:"Passwort muss mindestens 6 Zeichen lang sein"}},changePassword:{title:"Passwort ändern",currentPassword:"Aktuelles Passwort",currentPasswordPlaceholder:"Aktuelles Passwort eingeben",newPassword:"Neues Passwort",newPasswordPlaceholder:"Neues Passwort eingeben (min. 6 Zeichen)",confirmPassword:"Neues Passwort bestätigen",confirmPasswordPlaceholder:"Neues Passwort bestätigen",passwordsDoNotMatch:"Passwörter stimmen nicht überein",passwordTooShort:"Passwort muss mindestens 6 Zeichen lang sein",changing:"Wird geändert...",success:"Passwort erfolgreich geändert",failed:"Passwortänderung fehlgeschlagen"},plateAlert:{title:"Druck pausiert!",message:"Objekte auf dem Druckbett erkannt. Der Druck wurde automatisch pausiert. Bitte räumen Sie das Druckbett und setzen Sie den Druck fort.",understand:"Verstanden"},camera:{title:"Kameraansicht",invalidPrinterId:"Ungültige Drucker-ID",live:"Live",snapshot:"Schnappschuss",restartStream:"Stream neu starten",refreshSnapshot:"Schnappschuss aktualisieren",fullscreen:"Vollbild",exitFullscreen:"Vollbild beenden",connectingToCamera:"Verbinde mit Kamera...",capturingSnapshot:"Schnappschuss wird aufgenommen...",connectionLost:"Verbindung verloren",connectionFailed:"Kameraverbindung fehlgeschlagen",reconnecting:"Neuverbindung in {{countdown}}s... (Versuch {{attempt}}/{{max}})",reconnectNow:"Jetzt verbinden",cameraUnavailable:"Kamera nicht verfügbar",cameraUnavailableDesc:"Stellen Sie sicher, dass der Drucker eingeschaltet und verbunden ist.",noCamera:"Keine Kamera verfügbar",retry:"Erneut versuchen",cameraStream:"Kamera-Stream",zoomOut:"Verkleinern",zoomIn:"Vergrößern",resetZoom:"Zoom zurücksetzen",recording:"Aufnahme",startRecording:"Aufnahme starten",stopRecording:"Aufnahme stoppen"},groups:{title:"Gruppenverwaltung",subtitle:"Berechtigungsgruppen für Zugriffskontrolle verwalten",backToSettings:"Zurück zu Einstellungen",createGroup:"Gruppe erstellen",noPermission:"Sie haben keine Berechtigung, auf diese Seite zuzugreifen.",system:"System",noDescription:"Keine Beschreibung",usersCount:"{{count}} Benutzer",permissionsCount:"{{count}} Berechtigungen",edit:"Bearbeiten",delete:"Löschen",toast:{created:"Gruppe erfolgreich erstellt",updated:"Gruppe erfolgreich aktualisiert",deleted:"Gruppe erfolgreich gelöscht",enterGroupName:"Bitte geben Sie einen Gruppennamen ein"},modal:{editGroup:"Gruppe bearbeiten",createGroup:"Gruppe erstellen",cancel:"Abbrechen",saving:"Speichern...",creating:"Erstellen...",saveChanges:"Änderungen speichern"},form:{groupName:"Gruppenname",groupNamePlaceholder:"Gruppennamen eingeben",systemGroupWarning:"Systemgruppennamen können nicht geändert werden",description:"Beschreibung",descriptionPlaceholder:"Beschreibung eingeben (optional)",permissions:"Berechtigungen ({{count}} ausgewählt)"},deleteModal:{title:"Gruppe löschen",message:"Sind Sie sicher, dass Sie diese Gruppe löschen möchten? Benutzer in dieser Gruppe verlieren diese Berechtigungen.",confirm:"Gruppe löschen"}},users:{title:"Benutzerverwaltung",subtitle:"Benutzer und deren Zugriff auf Ihre Bambuddy-Instanz verwalten",backToSettings:"Zurück zu Einstellungen",createUser:"Benutzer erstellen",noPermission:"Sie haben keine Berechtigung, auf diese Seite zuzugreifen.",admin:"Admin",noGroups:"Keine Gruppen",active:"Aktiv",inactive:"Inaktiv",edit:"Bearbeiten",delete:"Löschen",system:"System",noGroupsAvailable:"Keine Gruppen verfügbar",table:{username:"Benutzername",groups:"Gruppen",status:"Status",actions:"Aktionen"},toast:{created:"Benutzer erfolgreich erstellt",updated:"Benutzer erfolgreich aktualisiert",deleted:"Benutzer erfolgreich gelöscht",fillRequired:"Bitte füllen Sie alle Pflichtfelder aus",passwordsDoNotMatch:"Passwörter stimmen nicht überein",passwordTooShort:"Passwort muss mindestens 6 Zeichen lang sein"},modal:{createUser:"Benutzer erstellen",editUser:"Benutzer bearbeiten",cancel:"Abbrechen",creating:"Erstellen...",saving:"Speichern...",saveChanges:"Änderungen speichern"},form:{username:"Benutzername",usernamePlaceholder:"Benutzernamen eingeben",password:"Passwort",passwordPlaceholder:"Passwort eingeben",confirmPassword:"Passwort bestätigen",confirmPasswordPlaceholder:"Passwort bestätigen",newPasswordPlaceholder:"Neues Passwort eingeben",confirmNewPasswordPlaceholder:"Neues Passwort bestätigen",leaveBlankToKeep:"leer lassen, um das aktuelle zu behalten",groups:"Gruppen"},deleteModal:{title:"Benutzer löschen",message:"Sind Sie sicher, dass Sie diesen Benutzer löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.",confirm:"Benutzer löschen"}},streamOverlay:{title:"Stream-Overlay",invalidPrinterId:"Ungültige Drucker-ID",cameraStream:"Kamera-Stream",progress:"Fortschritt",eta:"ETA",tomorrow:"Morgen",printerIdle:"Drucker ist inaktiv",printerOffline:"Drucker offline",status:{printing:"Druckt",paused:"Pausiert",finished:"Fertig",failed:"Fehlgeschlagen",idle:"Inaktiv",unknown:"Unbekannt"}},profiles:{title:"Profile",subtitle:"Verwalten Sie Ihre Slicer-Voreinstellungen und Druckvorschub-Kalibrierungen",tabs:{cloud:"Cloud-Profile",kprofiles:"K-Profile"},connectedAs:"Verbunden als",logout:"Abmelden",noLogoutPermission:"Sie haben keine Berechtigung zum Abmelden",failedToLoad:"Profile konnten nicht geladen werden",retry:"Erneut versuchen",time:{justNow:"Gerade eben",minsAgo:"vor {{count}}m",hoursAgo:"vor {{count}}h",daysAgo:"vor {{count}}d"},toast:{loggedOut:"Abgemeldet"},login:{title:"Mit Bambu Cloud verbinden",subtitle:"Synchronisieren Sie Ihre Slicer-Voreinstellungen geräteübergreifend",email:"E-Mail",password:"Passwort",region:"Region",regionGlobal:"Global",regionChina:"China",verificationCode:"Bestätigungscode",checkEmail:"Prüfen Sie Ihre E-Mail ({{email}}) für einen 6-stelligen Code",accessToken:"Zugriffstoken",accessTokenHint:"Fügen Sie Ihr Bambu Lab Zugriffstoken ein (aus Bambu Studio)",back:"Zurück",loginButton:"Anmelden",verifyButton:"Bestätigen",setTokenButton:"Token setzen",useToken:"Stattdessen Zugriffstoken verwenden",useEmail:"Stattdessen mit E-Mail anmelden",toast:{loggedIn:"Erfolgreich angemeldet",codeSent:"Bestätigungscode an Ihre E-Mail gesendet",tokenSet:"Token erfolgreich gesetzt"}},presets:{myPreset:"Mein Profil (bearbeitbar)",duplicate:"Duplizieren",editable:"Bearbeitbar",failedToLoadDetails:"Profil-Details konnten nicht geladen werden",deleteConfirm:"Dieses Profil löschen?",deleteWarning:'"{{name}}" wird dauerhaft aus Bambu Cloud gelöscht. Dies kann nicht rückgängig gemacht werden.',noDuplicatePermission:"Sie haben keine Berechtigung zum Duplizieren von Profilen",noEditPermission:"Sie haben keine Berechtigung zum Bearbeiten von Profilen",noDeletePermission:"Sie haben keine Berechtigung zum Löschen von Profilen",types:{filament:"Filament-Profil",printer:"Drucker-Profil",process:"Prozess-Profil"},toast:{deleted:"Profil gelöscht",created:"Profil erstellt",updated:"Profil aktualisiert",duplicated:"Profil dupliziert",fieldAdded:'Feld "{{key}}" hinzugefügt',exported:"Profil exportiert"},baseLabel:"Basis: {{name}}",currentLabel:"Aktuell: {{name}}",newPreset:"Neues Profil",editPreset:"Profil bearbeiten",duplicatePreset:"Profil duplizieren",createNewPreset:"Neues Profil erstellen",customizeSettings:"Passen Sie die Einstellungen für Ihr neues Profil an",compareWithBase:"Mit Basis-Profil vergleichen",compare:"Vergleichen",basePreset:"Basis-Profil",selectBasePreset:"Basis-Profil auswählen...",presetName:"Profilname",myCustomPreset:"Mein eigenes Profil",inheritsFrom:"Erbt von",dropJsonToImport:"JSON zum Importieren ablegen",tabs:{common:"Allgemein",allFields:"Alle Felder"},availableFields:"Verfügbare Felder",searchFieldsPlaceholder:"Felder suchen...",noMatchingFields:"Keine passenden Felder",allFieldsAdded:"Alle Felder hinzugefügt",addCustomField:"Eigenes Feld hinzufügen",yourOverrides:"Ihre Überschreibungen",noOverridesYet:"Noch keine Überschreibungen",clickFieldsToAdd:"Klicken Sie links auf Felder, um sie hinzuzufügen",saveAsTemplate:"Als Vorlage speichern",jsonTip:"Tipp: Ziehen Sie eine .json-Datei auf dieses Fenster, um Einstellungen zu importieren"},cloudView:{searchPlaceholder:"Profile suchen...",templates:"Vorlagen",refresh:"Aktualisieren",newPreset:"Neues Profil",clearFilters:"Filter zurücksetzen",compareMode:"Vergleichsmodus",selectAnotherPreset:"Wählen Sie ein weiteres {{type}}-Profil",clickTwoPresets:"Klicken Sie auf zwei Profile des gleichen Typs zum Vergleichen",selectFirst:"1. Erstes auswählen",selectSecond:"2. Zweites auswählen",compareNow:"Jetzt vergleichen",lastSynced:"Zuletzt synchronisiert:",showingCount:"{{showing}} von {{total}} Profilen",noPresetsFound:"Keine Profile gefunden",columns:{filament:"Filament",process:"Prozess",printer:"Drucker"},noFilamentPresets:"Keine Filament-Profile",noProcessPresets:"Keine Prozess-Profile",noPrinterPresets:"Keine Drucker-Profile",filters:{type:"Typ",owner:"Besitzer",printer:"Drucker",nozzle:"Düse",filament:"Filament",layer:"Schicht",all:"Alle",myPresets:"Meine Profile",builtIn:"Voreingestellt",process:"Prozess"},noTemplatesPermission:"Sie haben keine Berechtigung, Vorlagen zu verwalten",noRefreshPermission:"Sie haben keine Berechtigung, Profile zu aktualisieren",noCreatePermission:"Sie haben keine Berechtigung, Profile zu erstellen"},templates:{title:"Schnellvorlagen",noTemplates:"Noch keine Vorlagen",createFirst:"Erstellen Sie Vorlagen aus dem Preset-Editor",typeFilter:"Typ:",deleteTitle:"Vorlage löschen",deleteWarning:"Diese Aktion kann nicht rückgängig gemacht werden",deleteConfirm:'Möchten Sie "{{name}}" wirklich löschen?',namePlaceholder:"Vorlagenname",descriptionPlaceholder:"Beschreibung",settingsJson:"Einstellungen (JSON)",fieldsCount:"{{count}} Felder",shownInModals:"In Dialogen angezeigt",hiddenInModals:"In Dialogen ausgeblendet",apply:"Anwenden",toast:{deleted:"Vorlage gelöscht",updated:"Vorlage aktualisiert",created:"Vorlage erstellt",applied:"Vorlage angewendet"}}},support:{debugLoggingActive:"Debug-Protokollierung ist aktiv",manageLogs:"Verwalten"},fileManager:{title:"Dateimanager",subtitle:"Organisieren und verwalten Sie Ihre Druckdateien",uploadFiles:"Dateien hochladen",newFolder:"Neuer Ordner",folderName:"Ordnername",folderNamePlaceholder:"z.B. Funktionsteile",renameFile:"Datei umbenennen",renameFolder:"Ordner umbenennen",moveFiles:"{{count}} Datei(en) verschieben",rootNoFolder:"Stammverzeichnis (Kein Ordner)",current:"aktuell",linkFolder:"Ordner verknüpfen",linkFolderDescription:'"{{name}}" mit einem Projekt oder Archiv verknüpfen für schnellen Zugriff.',project:"Projekt",archive:"Archiv",noProjectsFound:"Keine Projekte gefunden",noArchivesFound:"Keine Archive gefunden",unlink:"Verknüpfung aufheben",link:"Verknüpfen",dragDropFiles:"Dateien hierher ziehen",dropFilesHere:"Dateien hier ablegen",orClickToBrowse:"oder klicken zum Durchsuchen",allFileTypesSupported:"Alle Dateitypen werden unterstützt. ZIP-Dateien werden extrahiert.",zipFilesDetected:"ZIP-Dateien erkannt",zipExtractOptions:"ZIP-Dateien werden extrahiert. Wählen Sie, wie die Ordnerstruktur behandelt werden soll:",preserveZipStructure:"Ordnerstruktur aus ZIP beibehalten",createFolderFromZip:"Ordner aus ZIP-Dateiname erstellen",stlThumbnailGeneration:"STL-Vorschaubildgenerierung",zipMayContainStl:"ZIP-Dateien können STL-Dateien enthalten. Vorschaubilder können während der Extraktion generiert werden.",thumbnailsCanBeGenerated:"Vorschaubilder können für STL-Dateien generiert werden. Große Modelle benötigen möglicherweise mehr Zeit.",generateThumbnailsForStl:"Vorschaubilder für STL-Dateien generieren",willBeExtracted:"Wird extrahiert",filesExtracted:"{{count}} Dateien extrahiert",uploadComplete:"Upload abgeschlossen: {{succeeded}} erfolgreich",uploadFailed:"{{count}} fehlgeschlagen",uploading:"Hochladen...",changeLink:"Verknüpfung ändern...",linkTo:"Verknüpfen mit...",linkToProjectOrArchive:"Mit Projekt oder Archiv verknüpfen",addToQueue:"Zur Warteschlange",generateThumbnail:"Vorschaubild generieren",generateThumbnails:"Vorschaubilder generieren",generateThumbnailsForMissing:"Vorschaubilder für STL-Dateien ohne Vorschau generieren",gridView:"Rasteransicht",listView:"Listenansicht",lowDiskSpaceWarning:"Warnung: Wenig Speicherplatz",lowDiskSpaceDetails:"Nur {{free}} frei von {{total}} gesamt. Schwellenwert ist auf {{threshold}} GB eingestellt.",files:"Dateien",folders:"Ordner",size:"Größe",free:"Frei",allFiles:"Alle Dateien",wrap:"Umbrechen",enableTextWrapping:"Textumbruch aktivieren",disableTextWrapping:"Textumbruch deaktivieren",dragToResizeTooltip:"Ziehen zum Ändern der Größe, Doppelklick zum Zurücksetzen",searchFiles:"Dateien suchen...",allTypes:"Alle Typen",prints:"Drucke",ascending:"Aufsteigend",descending:"Absteigend",resultsCount:"{{showing}} von {{total}} Dateien",selectAll:"Alle auswählen",deselectAll:"Auswahl aufheben",selected:"{{count}} ausgewählt",adding:"Hinzufügen...",loadingFiles:"Dateien werden geladen...",folderIsEmpty:"Ordner ist leer",noFilesYet:"Noch keine Dateien",folderEmptyDescription:"Laden Sie Dateien hoch oder verschieben Sie Dateien in diesen Ordner.",noFilesDescription:"Laden Sie Dateien hoch, um Ihre Druckdateien zu organisieren.",noMatchingFiles:"Keine passenden Dateien",noMatchingFilesDescription:"Keine Dateien entsprechen Ihren aktuellen Such- oder Filterkriterien.",clearFilters:"Filter zurücksetzen",printedCount:"{{count}}x gedruckt",uploadedBy:"Hochgeladen von {{name}}",deleteFolder:"Ordner löschen",deleteFile:"Datei löschen",deleteFilesCount:"{{count}} Dateien löschen",deleteFolderConfirm:"Möchten Sie diesen Ordner wirklich löschen? Alle Dateien darin werden ebenfalls gelöscht.",deleteFileConfirm:"Möchten Sie diese Datei wirklich löschen?",deleteFilesConfirm:"Möchten Sie {{count}} ausgewählte Dateien wirklich löschen? Diese Aktion kann nicht rückgängig gemacht werden.",deleting:"Wird gelöscht...",noPermissionRenameFolder:"Sie haben keine Berechtigung, Ordner umzubenennen",noPermissionLinkFolder:"Sie haben keine Berechtigung, Ordner zu verknüpfen",noPermissionDeleteFolder:"Sie haben keine Berechtigung, Ordner zu löschen",noPermissionPrint:"Sie haben keine Berechtigung zum Drucken",noPermissionAddToQueue:"Sie haben keine Berechtigung, zur Warteschlange hinzuzufügen",noPermissionDownload:"Sie haben keine Berechtigung, Dateien herunterzuladen",noPermissionRenameFile:"Sie haben keine Berechtigung, diese Datei umzubenennen",noPermissionGenerateThumbnail:"Sie haben keine Berechtigung, Vorschaubilder zu generieren",noPermissionDeleteFile:"Sie haben keine Berechtigung, diese Datei zu löschen",noPermissionCreateFolder:"Sie haben keine Berechtigung, Ordner zu erstellen",noPermissionUpload:"Sie haben keine Berechtigung, Dateien hochzuladen",noPermissionMoveFiles:"Sie haben keine Berechtigung, Dateien zu verschieben",noPermissionDeleteFiles:"Sie haben keine Berechtigung, Dateien zu löschen",toast:{folderCreated:"Ordner erstellt",folderDeleted:"Ordner gelöscht",fileDeleted:"Datei gelöscht",filesDeleted:"{{count}} Dateien gelöscht",filesMoved:"Dateien verschoben",folderLinked:"Ordner verknüpft",folderUnlinked:"Ordnerverknüpfung aufgehoben",addedToQueue:"{{count}} Datei(en) zur Warteschlange hinzugefügt",addedToQueuePartial:"{{added}} Datei(en) hinzugefügt, {{failed}} fehlgeschlagen",failedToAddToQueue:"Fehler beim Hinzufügen: {{error}}",fileRenamed:"Datei umbenannt",folderRenamed:"Ordner umbenannt",thumbnailsGenerated:"{{count}} Vorschaubild(er) generiert",thumbnailsGeneratedPartial:"{{succeeded}} Vorschaubild(er) generiert, {{failed}} fehlgeschlagen",noStlMissingThumbnails:"Keine STL-Dateien ohne Vorschaubild",failedToGenerateThumbnails:"Fehler beim Generieren der Vorschaubilder: {{error}}",thumbnailGenerated:"Vorschaubild generiert",failedToGenerateThumbnail:"Fehler beim Generieren des Vorschaubildes: {{error}}"}},projects:{title:"Projekte",subtitle:"Organisieren und verfolgen Sie Ihre 3D-Druckprojekte",newProject:"Neues Projekt",editProject:"Projekt bearbeiten",deleteProject:"Projekt löschen",projectName:"Projektname",description:"Beschreibung",noProjects:"Noch keine Projekte",noProjectsFiltered:"Keine {{status}} Projekte",noProjectsFilteredHelp:"Sie haben keine {{status}} Projekte. Projekte werden hier angezeigt, wenn sich ihr Status ändert.",createFirst:"Erstellen Sie Ihr erstes Projekt, um verwandte Drucke zu organisieren, den Fortschritt zu verfolgen und Ihre Builds zu verwalten.",createFirstButton:"Erstes Projekt erstellen",create:"Erstellen",files:"Dateien",prints:"Drucke",plates:"Platten",parts:"Teile",lastModified:"Zuletzt geändert",deleteConfirm:"Möchten Sie dieses Projekt wirklich löschen? Archive und Warteschlangenelemente werden getrennt, aber nicht gelöscht.",addFiles:"Dateien hinzufügen",removeFile:"Datei entfernen",viewDetails:"Details anzeigen",namePlaceholder:"z.B. Voron 2.4 Build",descriptionPlaceholder:"Optionale Beschreibung...",color:"Farbe",targetPlates:"Ziel-Platten",targetPlatesPlaceholder:"z.B. 25",targetPlatesHelp:"Anzahl der Druckaufträge",targetParts:"Ziel-Teile",targetPartsPlaceholder:"z.B. 150",targetPartsHelp:"Benötigte Objekte insgesamt",tagsLabel:"Tags (kommagetrennt)",tagsPlaceholder:"z.B. voron, funktional, geschenk",dueDate:"Fälligkeitsdatum",priority:"Priorität",priorityLow:"Niedrig",priorityNormal:"Normal",priorityHigh:"Hoch",priorityUrgent:"Dringend",statusActive:"Aktiv",statusCompleted:"Abgeschlossen",statusArchived:"Archiviert",done:"Fertig",completed:"abgeschlossen",failed:"fehlgeschlagen",inQueue:"in Warteschlange",noPrintsYet:"Noch keine Drucke",printJobs:"Druckaufträge (Platten)",partsPrinted:"Gedruckte Teile",failedParts:"Fehlgeschlagene Teile",import:"Importieren",export:"Exportieren",importProject:"Projekt importieren",exportAll:"Alle Projekte exportieren",loading:"Projekte werden geladen...",noEditPermission:"Sie haben keine Berechtigung, Projekte zu bearbeiten",noDeletePermission:"Sie haben keine Berechtigung, Projekte zu löschen",noCreatePermission:"Sie haben keine Berechtigung, Projekte zu erstellen",noImportPermission:"Sie haben keine Berechtigung, Projekte zu importieren",noExportPermission:"Sie haben keine Berechtigung, Projekte zu exportieren",toast:{created:"Projekt erstellt",updated:"Projekt aktualisiert",deleted:"Projekt gelöscht",imported:"Projekt importiert",multipleImported:"{{count}} Projekte importiert",importFailed:"Import fehlgeschlagen",exported:"Projekte exportiert (nur Metadaten)"}},projectDetail:{notFound:"Projekt nicht gefunden",backToProjects:"Zurück zu Projekten",export:"Exportieren",exportProject:"Projekt exportieren",noExportPermission:"Sie haben keine Berechtigung, Projekte zu exportieren",noEditPermission:"Sie haben keine Berechtigung, Projekte zu bearbeiten",partOf:"Teil von:",priorityLabel:"Priorität:",noPrints:"Noch keine Drucke in diesem Projekt",status:{active:"Aktiv",completed:"Abgeschlossen",archived:"Archiviert"},priority:{low:"Niedrig",normal:"Normal",high:"Hoch",urgent:"Dringend"},dueDate:{overdue:"Überfällig",today:"Heute fällig",daysLeft:"{{count}} Tage übrig"},progress:{platesProgress:"Platten-Fortschritt",partsProgress:"Teile-Fortschritt",printJobs:"Druckaufträge",parts:"Teile",percentComplete:"{{percent}}% abgeschlossen",remaining:"{{count}} verbleibend"},stats:{printJobs:"Druckaufträge",total:"gesamt",failed:"{{count}} fehlgeschlagen",partsPrinted:"{{count}} Teile gedruckt",printTime:"Druckzeit",filamentUsed:"Filament verbraucht"},cost:{title:"Kostenverfolgung",filamentCost:"Filamentkosten",energy:"Energie",budget:"Budget",remaining:"Verbleibend"},subProjects:{title:"Unterprojekte ({{count}})"},notes:{title:"Notizen",noEditPermission:"Sie haben keine Berechtigung, Notizen zu bearbeiten",placeholder:"Notizen zu diesem Projekt hinzufügen...",empty:"Noch keine Notizen. Klicken Sie auf Bearbeiten, um Notizen hinzuzufügen."},files:{title:"Dateien",linkFolders:"Ordner aus dem Dateimanager verknüpfen",forQuickAccess:"für schnellen Zugriff auf dieses Projekt.",fileCount:"{{count}} Datei(en)",empty:"Keine Ordner verknüpft. Gehen Sie zum Dateimanager und verknüpfen Sie einen Ordner mit diesem Projekt."},bom:{title:"Stückliste",acquired:"{{completed}}/{{total}} beschafft",showAll:"Alle anzeigen",hideDone:"Erledigte ausblenden",addPart:"Teil hinzufügen",noAddPermission:"Sie haben keine Berechtigung, Teile hinzuzufügen",partNamePlaceholder:"Teilename (z.B. M3x8 Schrauben)",partName:"Teilename",qty:"Menge",price:"Preis ({{currency}})",sourcingUrlPlaceholder:"Bezugsquelle-URL (optional)",remarksPlaceholder:"Bemerkungen (optional)",deletePart:"Teil löschen",deleteConfirm:'Möchten Sie "{{name}}" wirklich löschen?',noUpdatePermission:"Sie haben keine Berechtigung, Teile zu aktualisieren",noEditPermission:"Sie haben keine Berechtigung, Teile zu bearbeiten",noDeletePermission:"Sie haben keine Berechtigung, Teile zu löschen",totalCost:"Gesamtkosten:",empty:"Keine Teile in der Stückliste. Fügen Sie Hardware, Elektronik oder andere Komponenten hinzu, um zu verfolgen, was beschafft werden muss."},timeline:{title:"Aktivitätsverlauf",empty:"Noch keine Aktivität."},template:{saveAsTemplate:"Als Vorlage speichern",noCreatePermission:"Sie haben keine Berechtigung, Vorlagen zu erstellen"},queue:{title:"Warteschlange",viewAll:"Alle anzeigen",printing:"{{count}} druckend",queued:"{{count}} in Warteschlange"},prints:{title:"Drucke ({{count}})"},toast:{projectUpdated:"Projekt aktualisiert",partAdded:"Teil hinzugefügt",partRemoved:"Teil entfernt",exportFailed:"Export fehlgeschlagen",projectExported:"Projekt exportiert",templateCreated:"Vorlage erstellt"}},system:{title:"Systeminformationen",version:"Version",uptime:"Laufzeit",cpuUsage:"CPU-Auslastung",memoryUsage:"Speicherauslastung",diskUsage:"Festplattenauslastung",networkInfo:"Netzwerkinformationen",logs:"Protokolle",debugMode:"Debug-Modus",enableDebug:"Debug-Protokollierung aktivieren",disableDebug:"Debug-Protokollierung deaktivieren",downloadLogs:"Protokolle herunterladen",clearLogs:"Protokolle löschen",dockerInfo:"Docker-Info",containerName:"Container-Name",imageName:"Image-Name",platform:"Plattform",architecture:"Architektur"},library:{title:"Filament-Bibliothek",addFilament:"Filament hinzufügen",editFilament:"Filament bearbeiten",deleteFilament:"Filament löschen",vendor:"Hersteller",material:"Material",color:"Farbe",kFactor:"K-Faktor",temperature:"Temperatur",noFilaments:"Keine Filamente in der Bibliothek",deleteConfirm:"Möchten Sie dieses Filament wirklich löschen?",importFromPrinter:"Vom Drucker importieren",exportToFile:"In Datei exportieren"},spoolman:{title:"Spoolman-Integration",enabled:"Spoolman aktiviert",url:"Spoolman URL",connected:"Verbunden",disconnected:"Nicht verbunden",testConnection:"Verbindung testen",sync:"Synchronisieren",syncing:"Synchronisiert...",lastSync:"Letzte Synchronisierung",linkToSpoolman:"Mit Spoolman verknüpfen",openInSpoolman:"In Spoolman öffnen",unlinkSpool:"Spule trennen",selectSpool:"Spule auswählen",noUnlinkedSpools:"Keine nicht verknüpften Spulen verfügbar",linkSuccess:"Spule erfolgreich mit Spoolman verknüpft",linkFailed:"Verknüpfung mit Spoolman fehlgeschlagen",spoolId:"Spulen-ID",weight:"Gewicht",remaining:"Verbleibend"},timelapse:{title:"Zeitraffer",create:"Zeitraffer erstellen",download:"Herunterladen",delete:"Löschen",preview:"Vorschau",frameRate:"Bildrate",quality:"Qualität",processing:"Wird verarbeitet...",noTimelapses:"Keine Zeitraffer verfügbar"},ams:{title:"AMS",slot:"Slot",empty:"Leer",emptySlot:"Leerer Slot",unknown:"Unbekannt",humidity:"Luftfeuchtigkeit",temperature:"Temperatur",filamentType:"Filamenttyp",filamentColor:"Farbe",remaining:"Verbleibend",history:"AMS-Verlauf",noHistory:"Kein Verlauf verfügbar",configureSlot:"Slot konfigurieren",externalSpool:"Externe Spule",profile:"Profil",kFactor:"K-Faktor",fill:"Füllstand",configure:"Konfigurieren"},printModal:{title:"Druck starten",selectPrinter:"Drucker auswählen",selectPlate:"Platte auswählen",filamentMapping:"Filamentzuordnung",printSettings:"Druckeinstellungen",bedLeveling:"Bett-Nivellierung",flowCalibration:"Fluss-Kalibrierung",vibrationCalibration:"Vibrations-Kalibrierung",layerInspection:"Erste-Schicht-Prüfung",timelapse:"Zeitraffer",startPrint:"Druck starten",addToQueue:"Zur Warteschlange hinzufügen",cancel:"Abbrechen",noPrintersAvailable:"Keine Drucker verfügbar",printerBusy:"Drucker ist beschäftigt",printerOffline:"Drucker ist offline"},backup:{title:"Sichern & Wiederherstellen",createBackup:"Sicherung erstellen",restoreBackup:"Sicherung wiederherstellen",downloadBackup:"Sicherung herunterladen",uploadBackup:"Sicherung hochladen",lastBackup:"Letzte Sicherung",autoBackup:"Automatische Sicherung",backupNow:"Jetzt sichern",restoreWarning:"Warnung: Das Wiederherstellen einer Sicherung überschreibt alle aktuellen Daten.",includeArchives:"Archive einschließen",includeSettings:"Einstellungen einschließen",includeProfiles:"Profile einschließen",backupSuccess:"Sicherung erfolgreich erstellt",restoreSuccess:"Sicherung erfolgreich wiederhergestellt",backupFailed:"Sicherung fehlgeschlagen",restoreFailed:"Wiederherstellung fehlgeschlagen"},tags:{title:"Tags",addTag:"Tag hinzufügen",editTag:"Tag bearbeiten",deleteTag:"Tag löschen",tagName:"Tag-Name",tagColor:"Tag-Farbe",noTags:"Keine Tags",deleteConfirm:"Möchten Sie diesen Tag wirklich löschen?",manageTags:"Tags verwalten"},uploadModal:{title:"3MF-Dateien hochladen",dragDrop:"3MF-Dateien hierher ziehen",or:"oder",browseFiles:"Dateien durchsuchen",extractionInfo:"Das Druckermodell wird automatisch aus den 3MF-Datei-Metadaten extrahiert.",uploaded:"hochgeladen",failed:"fehlgeschlagen",uploading:"Wird hochgeladen...",upload:"Hochladen",uploadFailed:"Hochladen fehlgeschlagen"},editArchive:{title:"Archiv bearbeiten",name:"Name",namePlaceholder:"Druckname",printer:"Drucker",noPrinter:"Kein Drucker",project:"Projekt",noProject:"Kein Projekt",itemsPrinted:"Gedruckte Teile",itemsPrintedHelp:"Anzahl der in diesem Druckauftrag produzierten Teile",notes:"Notizen",notesPlaceholder:"Notizen zu diesem Druck hinzufügen...",externalLink:"Externer Link",externalLinkPlaceholder:"https://printables.com/model/...",externalLinkHelp:"Link zu Printables, Thingiverse oder anderer Quelle",tags:"Tags",tagsPlaceholder:"Tags hinzufügen...",addMoreTags:"Weitere Tags hinzufügen...",matchingTags:'Übereinstimmend mit "{{query}}"',existingTags:"Vorhandene Tags",clickToAdd:"(zum Hinzufügen klicken)",status:"Status",failureReason:"Fehlergrund",selectReason:"Grund auswählen...",photos:"Fotos des Druckergebnisses",photosHelp:"Klicken Sie auf + um Fotos Ihres Druckergebnisses hinzuzufügen",printResult:"Druckergebnis",saving:"Wird gespeichert...",failureReasons:{adhesionFailure:"Haftungsfehler",spaghettiDetached:"Spaghetti / Abgelöst",layerShift:"Schichtversatz",cloggedNozzle:"Verstopfte Düse",filamentRunout:"Filament aufgebraucht",warping:"Verformung",stringing:"Fadenziehen",underExtrusion:"Unterextrusion",powerFailure:"Stromausfall",userCancelled:"Vom Benutzer abgebrochen",other:"Sonstiges"},statuses:{completed:"Abgeschlossen",failed:"Fehlgeschlagen",aborted:"Abgebrochen",printing:"Druckt"}},kProfiles:{title:"K-Profile",noPrintersConfigured:"Keine Drucker konfiguriert",addPrinterInSettings:"Fügen Sie einen Drucker in den Einstellungen hinzu, um K-Profile zu verwalten",noActivePrinters:"Keine aktiven Drucker",enablePrinterConnection:"Aktivieren Sie eine Druckerverbindung, um K-Profile anzuzeigen",loadingProfiles:"Lade K-Profile...",printerOffline:"Drucker offline",printerOfflineDesc:"Der ausgewählte Drucker ist nicht verbunden. Schalten Sie ihn ein, um K-Profile anzuzeigen.",noMatchingProfiles:"Keine passenden Profile",noMatchingProfilesDesc:"Keine Profile entsprechen Ihren Suchkriterien",noKProfiles:"Keine K-Profile",noKProfilesDesc:"Keine Druckvorschub-Profile für {{diameter}}mm Düse gefunden",createFirstProfile:"Erstes Profil erstellen",printer:"Drucker",nozzle:"Düse",refresh:"Aktualisieren",addProfile:"Profil hinzufügen",export:"Exportieren",import:"Importieren",select:"Auswählen",selectAll:"Alle auswählen",delete:"Löschen",searchPlaceholder:"Nach Name oder Filament suchen...",allExtruders:"Alle Extruder",leftOnly:"Nur links",rightOnly:"Nur rechts",allFlow:"Alle Flusstypen",hfOnly:"Nur HF",sOnly:"Nur S",sortName:"Sortieren: Name",sortKValue:"Sortieren: K-Wert",sortFilament:"Sortieren: Filament",leftExtruder:"Linker Extruder",rightExtruder:"Rechter Extruder",modal:{addTitle:"K-Profil hinzufügen",editTitle:"K-Profil bearbeiten",profileName:"Profilname",profileNamePlaceholder:"Mein PLA-Profil",kValue:"K-Wert",kValuePlaceholder:"0,020",kValueHelp:"Typischer Bereich: 0,01 - 0,06 für PLA, 0,02 - 0,10 für PETG",filament:"Filament",selectFilament:"Filament auswählen...",noFilamentsHelp:"Keine Filamente gefunden. Erstellen Sie zuerst ein K-Profil in Bambu Studio.",flowType:"Flusstyp",highFlow:"High Flow",standard:"Standard",nozzleSize:"Düsengröße",extruder:"Extruder",extruders:"Extruder",left:"Links",right:"Rechts",notes:"Notizen (lokal gespeichert)",notesPlaceholder:"Notizen zu diesem Profil hinzufügen...",notesHelp:"Notizen werden in Bambuddy gespeichert, nicht auf dem Drucker",syncing:"Synchronisiert mit Drucker...",savingExtruder:"Speichern auf Extruder {{current}}/{{total}}...",pleaseWait:"Bitte warten"},deleteConfirm:{title:"Profil löschen",cannotUndo:"Dies kann nicht rückgängig gemacht werden",message:'Möchten Sie "{{name}}" wirklich vom Drucker löschen?'},bulkDelete:{title:"Profile löschen",cannotUndo:"Dies kann nicht rückgängig gemacht werden",message:"Möchten Sie wirklich {{count}} ausgewählte Profile vom Drucker löschen?"},toast:{profileSaved:"K-Profil gespeichert",profilesSaved:"K-Profil auf {{count}} Extrudern gespeichert",selectAtLeastOneExtruder:"Bitte wählen Sie mindestens einen Extruder aus",profileDeleted:"K-Profil gelöscht",profilesDeleted:"{{count}} Profile gelöscht",exportedProfiles:"{{count}} Profile exportiert",importedProfiles:"{{count}} von {{total}} Profilen importiert",noProfilesToExport:"Keine Profile zum Exportieren",invalidFileFormat:"Ungültiges Dateiformat",failedToParseImport:"Import-Datei konnte nicht gelesen werden",failedToSaveBatch:"K-Profile konnten nicht gespeichert werden",noteSaved:"Notiz gespeichert",failedToSaveNote:"Notiz konnte nicht gespeichert werden"},permission:{noRead:"Sie haben keine Berechtigung, Profile zu aktualisieren",noCreate:"Sie haben keine Berechtigung, Profile hinzuzufügen",noUpdate:"Sie haben keine Berechtigung, K-Profile zu aktualisieren",noDelete:"Sie haben keine Berechtigung, K-Profile zu löschen",noExport:"Sie haben keine Berechtigung, Profile zu exportieren",noImport:"Sie haben keine Berechtigung, Profile zu importieren"}},maintenanceDescriptions:{lubricateRails:"Schmiermittel auf Linearschienen für sanfte Bewegung auftragen",cleanNozzle:"Hotend und Düse reinigen, um Verstopfungen zu verhindern",checkBelts:"Riemenspannung für präzise Drucke überprüfen",cleanBuildPlate:"Druckplatte für bessere Haftung reinigen",checkExtruder:"Extruderzahnräder auf Verschleiß prüfen",checkCooling:"Sicherstellen, dass Lüfter ordnungsgemäß funktionieren",generalInspection:"Allgemeine Druckerinspektion",cleanCarbonRods:"Karbonstäbe reinigen, um Reibung zu reduzieren",checkPtfeTube:"PTFE-Schlauch auf Verschleiß oder Beschädigung prüfen",replaceHepaFilter:"HEPA-Filter für Luftqualität ersetzen",replaceCarbonFilter:"Aktivkohlefilter ersetzen",lubricateLeftNozzleRail:"Linke Düsenschiene schmieren (H2-Serie)"}},Bse={nav:{printers:"プリンター",archives:"アーカイブ",queue:"キュー",stats:"統計",profiles:"プロファイル",maintenance:"メンテナンス",projects:"プロジェクト",files:"ファイル管理",settings:"設定",system:"システム",collapseSidebar:"サイドバーを閉じる",expandSidebar:"サイドバーを開く",update:"アップデート",updateAvailable:"アップデートあり: v{{version}}",viewOnGithub:"GitHubで表示",keyboardShortcuts:"キーボードショートカット (?)",switchToLight:"ライトモードに切替",switchToDark:"ダークモードに切替"},common:{save:"保存",cancel:"キャンセル",delete:"削除",edit:"編集",add:"追加",close:"閉じる",confirm:"確認",loading:"読み込み中...",error:"エラー",success:"成功",warning:"警告",enabled:"有効",disabled:"無効",yes:"はい",no:"いいえ",on:"オン",off:"オフ",all:"すべて",none:"なし",search:"検索",filter:"フィルター",sort:"並べ替え",refresh:"更新",download:"ダウンロード",upload:"アップロード",actions:"操作",status:"ステータス",name:"名前",description:"説明",date:"日付",time:"時間",hours:"時間",minutes:"分",seconds:"秒",noPrinters:"プリンターが登録されていません",noData:"データがありません",required:"必須",optional:"オプション",unknown:"不明",done:"完了",saving:"保存中...",saveChanges:"変更を保存",today:"今日",turnOn:"オンにする",turnOff:"オフにする",deletePhoto:"写真を削除",deletePhotoConfirm:"この写真を削除しますか?元に戻せません。",create:"作成",print:"印刷",clear:"クリア",project:"プロジェクト",archive:"アーカイブ",unknownError:"不明なエラー",show:"表示",hide:"非表示",back:"戻る",export:"エクスポート",import:"インポート",retry:"リトライ",printer:"プリンター",model:"モデル",ok:"OK"},printers:{title:"プリンター",addPrinter:"プリンターを追加",editPrinter:"プリンターを編集",deletePrinter:"プリンターを削除",printerName:"プリンター名",serialNumber:"シリアル番号",ipAddress:"IPアドレス",accessCode:"アクセスコード",model:"モデル",nozzleCount:"ノズル数",autoArchive:"自動アーカイブ",connected:"接続中",offline:"オフライン",unknownModel:"不明なモデル",statusLabel:"ステータス",status:{printing:"印刷中",paused:"一時停止",finished:"完了",failed:"失敗",idle:"待機中"},lastPrint:"最後",readyToPrint:"印刷可能",estimatedCompletion:"完了予定時刻",filaments:"フィラメント",controls:"コントロール",external:"外部",externalSpool:"外部スプール",files:"ファイル",browseFiles:"プリンターのファイルを参照",update:"アップデート",loading:"プリンターを読み込み中...",hideOffline:"オフラインを非表示",ungrouped:"未グループ",hmsErrors:"クリックしてHMSエラーを表示",slotOptions:"スロットオプション",rereadRfid:"RFIDを再読み取り",clickToView:"クリックして表示",maintenanceUpToDate:"すべてのメンテナンスが最新です",maintenanceDue:"{{count}}件のメンテナンス期限",maintenanceDueSoon:"{{count}}件のメンテナンスがまもなく期限",printsInQueue:"キューに{{count}}件の印刷",firmwareUpdateAvailable:"ファームウェアアップデートあり: {{current}} → {{latest}}",statusSummary:{printing:"印刷中",idle:"待機中",offline:"オフライン"},sort:{name:"名前",status:"ステータス",model:"モデル",location:"ロケーション",ascending:"昇順で並べ替え",descending:"降順で並べ替え"},cardSize:{small:"小",medium:"中",large:"大",extraLarge:"特大",cards:"カード"},temps:{nozzle:"ノズル",bed:"ベッド",chamber:"チャンバー",left:"左",right:"右",activeNozzle:"アクティブ: {{side}}ノズル"},fans:{partCooling:"パーツ冷却ファン",auxiliary:"補助ファン",chamber:"チャンバーファン"},printControl:{stop:"停止",pause:"一時停止",resume:"再開",stopPrint:"印刷を停止",pausePrint:"印刷を一時停止",resumePrint:"印刷を再開"},power:{on:"オン",off:"オフ",powerOn:"電源オン",autoOff:"自動オフ",autoOffDone:"自動オフ完了",autoOffTooltip:"印刷後に自動電源オフ",autoOffExecutedTooltip:"自動オフが実行されました - リセットするにはプリンターの電源を入れてください",offlineWithPlugs:"スマートプラグ付きオフラインプリンター",noPlugs:"スマートプラグ付きプリンターなし"},chamberLight:{turnOn:"チャンバーライトをオン",turnOff:"チャンバーライトをオフ"},camera:{openOverlay:"カメラオーバーレイを開く",openWindow:"カメラを新しいウィンドウで開く"},menu:{reconnect:"再接続",mqttDebug:"MQTTデバッグ"},confirm:{deleteTitle:"プリンターを削除",deleteMessage:"「{{name}}」を削除しますか?すべての接続設定が削除されます。",deleteArchives:"印刷アーカイブを削除",deleteArchivesYes:"このプリンターのすべての印刷履歴が完全に削除されます。",deleteArchivesNo:"印刷履歴は保持されますが、このプリンターとの関連付けは解除されます。",powerOnTitle:"プリンターの電源をオン",powerOnMessage:"「{{name}}」の電源をオンにしますか?",powerOn:"電源オン",powerOffTitle:"プリンターの電源をオフ",powerOffMessage:"「{{name}}」の電源をオフにしますか?",powerOffWarning:"警告: 「{{name}}」は現在印刷中です!電源をオフにしますか?印刷が中断され、プリンターが損傷する可能性があります。",powerOff:"電源オフ",stopTitle:"印刷を停止",stopMessage:"「{{name}}」の現在の印刷を停止しますか?印刷ジョブがキャンセルされます。",stopButton:"印刷を停止",pauseTitle:"印刷を一時停止",pauseMessage:"「{{name}}」の現在の印刷を一時停止しますか?",pauseButton:"印刷を一時停止",resumeTitle:"印刷を再開",resumeMessage:"「{{name}}」の印刷を再開しますか?",resumeButton:"印刷を再開"},skipObjects:{title:"オブジェクトスキップ",onlyWhilePrinting:"オブジェクトスキップ(印刷中のみ)",requires2Objects:"オブジェクトスキップ(2つ以上のオブジェクトが必要)",noObjects:"オブジェクトが見つかりません",objectsLoadedOnStart:"オブジェクトは印刷開始時に読み込まれます",matchIds:"プリンターのディスプレイとIDを照合してください",printerScreenShows:"プリンター画面にビルドプレート上のオブジェクトIDが表示されます",skippedCount:"{{skipped}}/{{total}}スキップ済み",waitForLayer:"オブジェクトをスキップするにはレイヤー2以降をお待ちください(現在レイヤー{{layer}})",activeCount:"{{count}}個アクティブ",willBeSkipped:"スキップされます",waitForLayer2:"レイヤー2以降をお待ちください",skipThisObject:"このオブジェクトをスキップ",skip:"スキップ",skipped:"スキップ済み"},form:{name:"名前",namePlaceholder:"マイプリンター",ipAddress:"IPアドレス",serialNumber:"シリアル番号",serialCannotChange:"シリアル番号は変更できません",accessCode:"アクセスコード",accessCodePlaceholder:"プリンター設定から取得",accessCodeKeepCurrent:"現在のコードを維持する場合は空のまま",modelOptional:"モデル(任意)",model:"モデル",selectModel:"モデルを選択...",locationGroup:"ロケーション / グループ",locationPlaceholder:"例: 工房、オフィス、地下室",locationHint:"プリンターのグループ化とキュージョブのフィルタリングに使用",autoArchive:"完了した印刷を自動アーカイブ"},discovery:{subnetToScan:"スキャンするサブネット",dockerSubnetHint:"Dockerが検出されました。CIDR表記でプリンターのサブネットを入力してください。docker-compose.ymlにnetwork_mode: hostが必要です。",scanning:"スキャン中...",scanningProgress:"スキャン中... {{scanned}}/{{total}}",scanSubnet:"サブネットをスキャンしてプリンターを検出",discoverNetwork:"ネットワーク上のプリンターを検出",serialRequired:"シリアル番号が必要です",scanningSubnet:"サブネットでBambuプリンターをスキャン中...",scanningNetwork:"ネットワークをスキャン中...",noPrintersSubnet:"指定されたサブネットにプリンターが見つかりません。",noPrintersNetwork:"ネットワーク上にプリンターが見つかりません。",allConfigured:"検出されたすべてのプリンターは既に設定済みです。"},firmware:{title:"ファームウェアアップデート",current:"現在",latest:"最新",releaseNotes:"リリースノート",checkingPrerequisites:"前提条件を確認中...",sdCardReady:"SDカード準備完了。下をクリックしてファームウェアをアップロードしてください。",uploadedToSd:"ファームウェアをSDカードにアップロードしました!",applyInstructions:"プリンターでアップデートを適用するには:",step1:"プリンターのタッチスクリーンで設定に移動",step2:"ファームウェアに移動",step3:"SDカードからアップデートを選択",step4:"アップデートには10〜20分かかります",starting:"開始中...",uploadFirmware:"ファームウェアをアップロード",uploadSuccess:"ファームウェアをアップロードしました!プリンター画面からアップデートを実行してください。"},empty:{noPrinters:"プリンターがまだ設定されていません",addFirst:"最初のプリンターを追加"},toast:{printStopped:"印刷を停止しました",printPaused:"印刷を一時停止しました",printResumed:"印刷を再開しました",failedToStop:"印刷の停止に失敗しました",failedToPause:"印刷の一時停止に失敗しました",failedToResume:"印刷の再開に失敗しました",chamberLightOn:"チャンバーライトをオンにしました",chamberLightOff:"チャンバーライトをオフにしました",failedChamberLight:"チャンバーライトの制御に失敗しました",objectsSkipped:"オブジェクトをスキップしました",failedToSkipObjects:"オブジェクトのスキップに失敗しました",rfidRereadInitiated:"RFID再読み取りを開始しました",failedRfidReread:"RFID再読み取りに失敗しました"},progress:"{{percent}}% 完了",timeRemaining:"残り {{time}}",maintenanceOk:"メンテナンス正常",maintenanceWarning:"{{count}}件の警告",maintenanceWarning_plural:"{{count}}件の警告",colors:{unknown:"不明",black:"黒",white:"白",darkGray:"ダークグレー",lightGray:"ライトグレー",gray:"グレー",brown:"茶色",red:"赤",orange:"オレンジ",yellow:"黄色",green:"緑",cyan:"シアン",blue:"青",purple:"紫",pink:"ピンク"},humidity:{unknown:"不明",good:"良好",fair:"注意",bad:"警告"},temperature:{good:"良好",fair:"注意",bad:"高温"},wifi:{excellent:"非常に良い",good:"良い",fair:"普通",weak:"弱い",veryWeak:"非常に弱い"},h2Series:"H2シリーズ",x1Series:"X1シリーズ",pSeries:"Pシリーズ",a1Series:"A1シリーズ",searchPresets:"プリセットを検索...",noCloudPresets:"クラウドプリセットがありません。Bambu Cloudにログインして同期してください。",noMatchingPresets:"一致するプリセットが見つかりません。",colorNamePlaceholder:"色の名前またはHex値(例:brown、FF8800)",clearCustomColor:"カスタムカラーをクリア",copySpoolUuid:"スプールUUIDをコピー",configureSlot:"フィラメントプロファイルとK値でスロットを設定"},archives:{title:"印刷アーカイブ",searchPlaceholder:"アーカイブを検索...",filterByPrinter:"プリンターで絞り込み",filterByStatus:"ステータスで絞り込み",sortBy:"並べ替え",sortNewest:"新しい順",sortOldest:"古い順",sortName:"名前順",sortDuration:"時間順",noArchives:"アーカイブが見つかりません",printTime:"印刷時間",filamentUsed:"フィラメント使用量",cost:"コスト",reprint:"再印刷",preview:"プレビュー",deleteArchive:"アーカイブを削除",deleteConfirm:"このアーカイブを削除しますか?",favorite:"お気に入り",unfavorite:"お気に入りから削除",viewDetails:"詳細を表示",status:{completed:"完了",failed:"失敗",stopped:"中止"},collections:{all:"すべてのアーカイブ",recent:"過去24時間","this-week":"今週","this-month":"今月",favorites:"お気に入り",failed:"失敗した印刷",duplicates:"重複"},bulkDeleted:"{{count}}件のアーカイブを削除しました",bulkDeleteFailed:"アーカイブの削除に失敗しました",bulkDeleteTitle:"アーカイブを削除",bulkDeleteConfirm:"{{count}}件のアーカイブを削除しますか?この操作は元に戻せません。",deleteCount:"{{count}}件を削除",only3mfSupported:".3mfファイルのみ対応しています",dropFilesHere:".3mfファイルをここにドロップ",releaseToUpload:"ドロップしてアップロード",selectedCount:"{{count}}件選択中",selectAll:"すべて選択",tags:"タグ",project:"プロジェクト",toggledFavorites:"{{count}}件のアーカイブのお気に入りを切替えました",favoriteUpdateFailed:"お気に入りの更新に失敗しました",favoriteBulk:"お気に入り",showingCount:"{{total}}件中{{shown}}件を表示",export:"エクスポート",exportDownloaded:"エクスポートをダウンロードしました",exportFailed:"エクスポートに失敗しました",exportCsv:"CSVでエクスポート",exportExcel:"Excelでエクスポート",compare:"比較 ({{count}})",select:"選択",upload3mf:"3MFアップロード",allPrinters:"すべてのプリンター",allMaterials:"すべての素材",allFiles:"すべてのファイル",slicedGcode:"スライス済み (GCODE)",sourceFileOnly:"ソースのみ",showAll:"すべて表示",showFavoritesOnly:"お気に入りのみ表示",favorites:"お気に入り",showFailedPrints:"失敗した印刷を表示",hideFailedPrints:"失敗した印刷を非表示",hideFailed:"失敗を非表示",allTags:"すべてのタグ",enterNewTag:"新しいタグを入力...",sortNewestFirst:"新しい順",sortOldestFirst:"古い順",sortNameAZ:"名前 A-Z",sortNameZA:"名前 Z-A",sortLargestFirst:"大きい順",sortSmallestFirst:"小さい順",gridView:"グリッド表示",listView:"リスト表示",calendarView:"カレンダー表示",reset:"リセット",colors:"カラー:",matchAnyColor:"いずれかの選択色に一致",matchAllColors:"すべての選択色に一致",clear:"クリア",loading:"アーカイブを読み込み中...",noMatchingArchives:"検索に一致するアーカイブはありません",noArchivesYet:"アーカイブはまだありません",autoCreated:"印刷完了時にアーカイブは自動的に作成されます",unknownPrinter:"不明",noPrinter:"プリンターなし",rightClickOptions:"右クリックでオプション表示",printedBefore:"このモデルは以前印刷されたことがあります",openSource3mf:"ソース3MFをBambu Studioで開く(右クリックでオプション表示)",viewPhotos:"{{count}}枚の写真を表示",openFolder:"フォルダーを開く: {{name}}",projectName:"プロジェクト: {{name}}",makerWorldDesigner:"MakerWorld: {{designer}}",notFromMakerWorld:"MakerWorldではありません",hasTimelapse:"タイムラプスあり",moreOptions:"その他のオプション",downloadF3d:"Fusion 360デザインファイルをダウンロード",listName:"名前",listPrinter:"プリンター",listDate:"日付",listSize:"サイズ",listActions:"アクション"},queue:{title:"印刷キュー",description:"印刷ジョブのスケジュールと管理",addToQueue:"キューに追加",clearQueue:"キューをクリア",clearHistory:"履歴をクリア",emptyQueue:"キューは空です",position:"順番",scheduledTime:"予定時刻",moveUp:"上に移動",moveDown:"下に移動",remove:"削除",requeue:"再キュー",startNow:"今すぐ開始",startPrint:"印刷を開始",stopPrint:"印刷を停止",unassigned:"未割当",printerNumber:"プリンター #{{id}}",staged:"ステージ済み",requiresPreviousSuccess:"前の印刷の成功が必要",autoPowerOff:"自動電源オフ",printingInProgress:"印刷中...",currentlyPrinting:"印刷中",viewArchive:"アーカイブを表示",viewInFileManager:"ファイルマネージャーで表示",itemCount:"{{count}}件",dragToReorder:"ドラッグして並べ替え(ASAPのみ)",overdue:"期限超過",dragReorderTooltip:"順番はASAPアイテムのみに影響します。スケジュール済みアイテムは設定された時間に実行されます。",anyModel:"任意の{{model}}{{location}}{{filaments}}",addedBy:"{{username}}が追加",bulkEdit:{title:"{{count}}件のアイテムを編集",description:"変更した設定のみが選択されたアイテムに適用されます。",printer:"プリンター",noChange:"— 変更なし —",queueOptions:"キューオプション",stagedManualStart:"ステージ済み(手動開始)",autoPowerOff:"印刷後に自動電源オフ",requirePreviousSuccess:"前の印刷の成功が必要",printOptions:"印刷オプション",bedLevelling:"ベッドレベリング",flowCalibration:"フローキャリブレーション",vibrationCalibration:"振動キャリブレーション",firstLayerInspection:"第一層検査",timelapse:"タイムラプス",useAms:"AMS使用",on:"オン",off:"オフ",saving:"保存中...",applyChanges:"変更を適用"},bulkActions:{selectAll:"すべて選択",deselectAll:"すべて選択解除",selected:"{{count}}件選択中",editSelected:"選択を編集",cancelSelected:"選択をキャンセル"},permissions:{noStopPermission:"印刷を停止する権限がありません",noStartPermission:"印刷を開始する権限がありません",noEditPermission:"キューアイテムを編集する権限がありません",noCancelPermission:"キューアイテムをキャンセルする権限がありません",noRequeuePermission:"アイテムを再キューする権限がありません",noRemovePermission:"キューアイテムを削除する権限がありません",noClearHistoryPermission:"履歴をクリアする権限がありません"},status:{pending:"待機中",printing:"印刷中",completed:"完了",failed:"失敗",skipped:"スキップ",cancelled:"キャンセル済み",waiting:"待機中"},summary:{printing:"印刷中",queued:"キュー中",totalQueueTime:"合計キュー時間",history:"履歴"},filters:{allPrinters:"すべてのプリンター",allStatus:"すべてのステータス"},sort:{byPosition:"順番で並べ替え",byName:"名前で並べ替え",byPrinter:"プリンターで並べ替え",bySchedule:"スケジュールで並べ替え",byDate:"日付で並べ替え",ascending:"昇順",descending:"降順",ascendingOldest:"昇順(古い順)",descendingNewest:"降順(新しい順)"},empty:{title:"スケジュールされた印刷はありません",description:"アーカイブページのコンテキストメニューから「スケジュール」オプションを使用するか、ファイルをドラッグ&ドロップして始めましょう。"},confirm:{cancelTitle:"スケジュール済み印刷をキャンセル",cancelMessage:"「{{name}}」をキャンセルしますか?",cancelButton:"印刷をキャンセル",stopTitle:"印刷を停止",stopMessage:"現在の印刷「{{name}}」を停止しますか?プリンター上の印刷ジョブがキャンセルされます。",stopButton:"印刷を停止",removeTitle:"履歴から削除",removeMessage:"「{{name}}」をキュー履歴から削除しますか?",clearHistoryMessage:"{{count}}件の履歴をすべて削除しますか?",thisPrint:"この印刷",thisItem:"このアイテム"},toast:{itemCancelled:"キューアイテムをキャンセルしました",itemRemoved:"キューアイテムを削除しました",printStopped:"印刷を停止しました",printReleased:"印刷をキューに戻しました",clearedHistory:"{{count}}件の履歴をクリアしました",failedToCancel:"アイテムのキャンセルに失敗しました",failedToRemove:"アイテムの削除に失敗しました",failedToStop:"印刷の停止に失敗しました",failedToStart:"印刷の開始に失敗しました",failedToReorder:"キューの並べ替えに失敗しました",failedToClear:"履歴のクリアに失敗しました",failedToUpdateItems:"アイテムの更新に失敗しました",cancelledItems:"{{count}}件のアイテムをキャンセルしました",failedToCancelItems:"アイテムの一括キャンセルに失敗しました"}},stats:{title:"統計",overview:"概要",totalPrints:"総印刷数",successRate:"成功率",totalPrintTime:"総印刷時間",totalFilament:"総フィラメント使用量",totalCost:"総コスト",averagePrintTime:"平均印刷時間",printsPerDay:"1日あたりの印刷数",byPrinter:"プリンター別",byMaterial:"素材別",byMonth:"月別",last7Days:"過去7日間",last30Days:"過去30日間",last90Days:"過去90日間",allTime:"全期間",dashboard:"統計ダッシュボード",dashboardDescription:"3Dプリントアクティビティの概要",loadingStatistics:"統計を読み込み中...",quickStats:"クイック統計",printTime:"印刷時間",filamentUsed:"フィラメント使用量",filamentCost:"フィラメントコスト",energyUsed:"エネルギー使用量",energyCost:"エネルギーコスト",successful:"成功",failed:"失敗",printsByPrinter:"プリンター別印刷数",printerFallback:"プリンター #{{id}}",timeAccuracy:"時間精度",noTimeAccuracyData:"時間精度データがありません",perfectEstimate:"100% = 完全な推定",filamentTypes:"フィラメントタイプ",noFilamentData:"フィラメントデータがありません",printsCount:"{{count}}回印刷",moreTypes:"+{{count}}種類",noPrinterData:"プリンターデータがありません",filamentUsageTrends:"フィラメント使用トレンド",noPrintData:"印刷データがありません",printActivity:"印刷アクティビティ",failureAnalysis30Days:"失敗分析(30日間)",noPrintDataLast30Days:"過去30日間の印刷データがありません",printsFailed:"{{total}}回中{{failed}}回失敗",lastWeek:"先週",failureReasons:"失敗理由",topFailureReasons:"主な失敗理由",unknown:"不明",moreReasons:"+{{count}}件の理由",hiddenCount:"{{count}}件非表示",layoutReset:"レイアウトをリセットしました",resetLayout:"レイアウトをリセット",exportStats:"統計をエクスポート",exportAsCsv:"CSVでエクスポート",exportAsExcel:"Excelでエクスポート",exportDownloaded:"エクスポートをダウンロードしました",exportFailed:"エクスポートに失敗しました",filament:"フィラメント",cost:"コスト",prints:"プリント",filamentGrams:"フィラメント (g)",weekOf:"週:",periodFilament:"期間フィラメント",periodCost:"期間コスト",avgPerPrint:"プリントあたりの平均",total:"合計",avg:"平均",usageOverTime:"使用量の推移",noDataForTimeRange:"選択した期間のデータがありません",byFilamentType:"フィラメントタイプ別",usage:"使用量",monthlyComparison:"月間比較",noPermissionRecalculate:"コストを再計算する権限がありません",noPermissionResetLayout:"レイアウトをリセットする権限がありません",recalculateCosts:"コストを再計算",recalculateFailed:"コストの再計算に失敗しました",recalculateTooltip:"現在のフィラメント価格に基づいてすべてのプリントコストを再計算します"},profiles:{title:"フィラメントプロファイル",addProfile:"プロファイルを追加",editProfile:"プロファイルを編集",deleteProfile:"プロファイルを削除",material:"素材",brand:"ブランド",color:"色",diameter:"直径",density:"密度",costPerKg:"1kgあたりの価格",spoolWeight:"スプール重量",noProfiles:"プロファイルが登録されていません",deleteConfirm:"このプロファイルを削除しますか?",templateName:"テンプレート名",descriptionOptional:"説明(任意)",searchFields:"フィールドを検索...",presetNamePlaceholder:"マイカスタムプリセット",searchPresets:"プリセットを検索...",connectToCloud:"Bambu Cloudに接続",syncDescription:"デバイス間でスライサープリセットを同期",email:"メールアドレス",password:"パスワード",region:"リージョン",regionGlobal:"グローバル",regionChina:"中国",verificationCode:"認証コード",checkEmail:"メール ({{email}}) に届いた6桁のコードを入力してください",accessToken:"アクセストークン",accessTokenHint:"Bambu Labのアクセストークンを貼り付け(Bambu Studioから取得)",login:"ログイン",verify:"認証",setToken:"トークン設定",useTokenInstead:"アクセストークンを使用",loginWithEmail:"メールでログイン",loggedIn:"ログインしました",verificationSent:"認証コードをメールに送信しました",tokenSet:"トークンを設定しました",loggedOut:"ログアウトしました",logout:"ログアウト",connectedAs:"接続中:",pageTitle:"プロファイル",pageDescription:"スライサープリセットと圧力キャリブレーションの管理",cloudProfiles:"クラウドプロファイル",kProfiles:"Kプロファイル",scrollToTop:"トップに戻る",justNow:"たった今",minutesAgo:"{{count}}分前",hoursAgo:"{{count}}時間前",daysAgo:"{{count}}日前",lastSynced:"最終同期:",duplicate:"複製",myPresetEditable:"マイプリセット(編集可能)",editable:"編集可能",typePreset:"{{type}}プリセット",presetDeleted:"プリセットを削除しました",presetCreated:"プリセットを作成しました",presetUpdated:"プリセットを更新しました",presetExported:"プリセットをエクスポートしました",presetName:"プリセット名",failedToLoadDetails:"プリセットの詳細を読み込めませんでした",failedToLoadProfiles:"プロファイルの読み込みに失敗しました",deletePresetConfirm:"このプリセットを削除しますか?",deletePresetWarning:'"{{name}}"をBambu Cloudから完全に削除します。この操作は元に戻せません。',noPresetsFound:"プリセットが見つかりません",showingPresets:"{{total}}件中{{count}}件を表示",myPresetLegend:"= マイプリセット(編集可能)",typeLabel:"タイプ",typeFilter:"タイプ:",owner:"所有者",myPresets:"マイプリセット",builtIn:"ビルトイン",nozzle:"ノズル",filament:"フィラメント",process:"プロセス",printer:"プリンター",layer:"レイヤー",clearFilters:"フィルターをクリア",noFilamentPresets:"フィラメントプリセットなし",noProcessPresets:"プロセスプリセットなし",noPrinterPresets:"プリンタープリセットなし",compare:"比較",compareMode:"比較モード",comparePresets:"プリセットを比較",compareNow:"比較を実行",compareWithBase:"ベースプリセットと比較",selectAnotherPreset:"同じタイプ({{type}})の別のプリセットを選択",clickTwoPresets:"同じタイプのプリセットを2つクリックして比較",selectFirst:"1. 最初を選択",selectSecond:"2. 2番目を選択",left:"左:",right:"右:",addedCount:"{{count}}件追加",removedCount:"{{count}}件削除",changedCount:"{{count}}件変更",sameCount:"{{count}}件同じ",changes:"変更点",noDifferences:"差分はありません",noFieldsMatch:"検索に一致するフィールドがありません",field:"フィールド",quickTemplates:"クイックテンプレート",templates:"テンプレート",deleteTemplate:"テンプレートを削除",actionCannotBeUndone:"この操作は元に戻せません",confirmDeleteTemplate:'"{{name}}"を削除してもよろしいですか?',templateDeleted:"テンプレートを削除しました",templateUpdated:"テンプレートを更新しました",templateApplied:"テンプレートを適用しました",templateAppliedName:"テンプレート適用: {{name}}",templateSaved:"テンプレートを保存しました",customTemplate:"カスタムテンプレート",noTemplatesYet:"テンプレートはまだありません",createTemplatesHint:"プリセットエディターからテンプレートを作成",noTemplatesSelected:"テンプレートが選択されていません。テンプレートボタンから有効にしてください。",manageTemplatesHint:"メインページのテンプレートボタンからテンプレートを管理",settingsJson:"設定 (JSON)",fieldsCount:"{{count}}フィールド",shownInModals:"モーダルに表示",hiddenInModals:"モーダルで非表示",apply:"適用",saveAsTemplate:"テンプレートとして保存",editPreset:"プリセットを編集",duplicatePreset:"プリセットを複製",createNewPreset:"新しいプリセットを作成",newPreset:"新規プリセット",customizeSettings:"新しいプリセットの設定をカスタマイズ",dropJsonToImport:"JSONファイルをドロップしてインポート",basePreset:"ベースプリセット",selectBasePreset:"ベースプリセットを選択...",inheritsFrom:"継承元:",commonTab:"共通",allFieldsTab:"全フィールド",jsonTab:"JSON",exportToJsonFile:"設定をJSONファイルにエクスポート",importFromJsonFile:"JSONファイルから設定をインポート",commonSettings:"共通設定",currentOverrides:"現在のオーバーライド",availableFields:"利用可能なフィールド",noMatchingFields:"一致するフィールドがありません",allFieldsAdded:"すべてのフィールドが追加済みです",addCustomField:"カスタムフィールドを追加",yourOverrides:"オーバーライド一覧",noOverridesYet:"オーバーライドはまだありません",clickFieldsToAdd:"左のフィールドをクリックして追加",dragDropTip:"ヒント: このモーダルに.jsonファイルをドラッグ&ドロップして設定をインポート",fieldAdded:'フィールド "{{key}}" を追加しました',noOverridesToSave:"保存するオーバーライドがありません",fileImported:"ファイルをインポートしました",fileImportedSuccess:"ファイルを正常にインポートしました",invalidJson:"無効なJSON",noPermissionCreate:"プロファイルを作成する権限がありません",noPermissionDelete:"プロファイルを削除する権限がありません",noPermissionDuplicate:"プロファイルを複製する権限がありません",noPermissionEdit:"プロファイルを編集する権限がありません",noPermissionLogout:"ログアウトする権限がありません",noPermissionManageTemplates:"テンプレートを管理する権限がありません",noPermissionRefresh:"プロファイルを更新する権限がありません"},maintenance:{title:"メンテナンス",overview:"概要",allOk:"すべてのメンテナンスは最新です",dueCount:"{{count}}件の期限到来",dueCount_plural:"{{count}}件の期限到来",warningCount:"{{count}}件の警告",warningCount_plural:"{{count}}件の警告",totalPrintTime:"総印刷時間",nextMaintenance:"次回メンテナンス",nothingDue:"予定なし",tasks:"タスク",lastPerformed:"前回実施日",interval:"間隔",hoursRemaining:"残り{{hours}}時間",hoursOverdue:"{{hours}}時間超過",markDone:"完了にする",performMaintenance:"メンテナンスを実施",history:"履歴",noHistory:"メンテナンス履歴がありません",editPrintHours:"印刷時間を編集",currentHours:"現在の時間",today:"今日",overdue:"期限超過",dueSoon:"まもなく期限",collapse:"折りたたむ",expand:"展開",left:"残り",timeBasedInterval:"時間ベースのインターバル",viewDocumentation:"ドキュメントを表示",printersAssigned:"{{count}}台のプリンターが割り当て済み - クリックして管理",deleteTypeConfirm:"「{{name}}」を削除しますか?",removeFromPrinter:"このプリンターから削除",addLabel:"追加:",maintenanceTypes:"メンテナンスタイプ",systemTypesDescription:"システムタイプとカスタムメンテナンスタスク",addCustomType:"カスタムタイプを追加",intervalType:"インターバルタイプ",printHours:"印刷時間",calendarDays:"カレンダー日数",intervalWithUnit:"インターバル ({{unit}})",days:"日",icon:"アイコン",documentationLink:"ドキュメントリンク(任意)",docLinkPlaceholder:"ドキュメントリンク(任意)",namePlaceholder:"例:HEPAフィルター交換",assignToPrinters:"プリンターに割り当て",selectAtLeastOnePrinter:"プリンターを1台以上選択してください",addType:"タイプを追加",custom:"カスタム",assignedToPrinters:"割り当て済みプリンター:",noPrintersAssigned:"プリンター未割り当て",intervalOverrides:"インターバルのオーバーライド",customizeIntervals:"プリンターごとにインターバルをカスタマイズ",addPrintersForMaintenance:"メンテナンスインターバルを設定するにはプリンターを追加してください",reset:"リセット",countOverdue:"{{count}}件が期限超過",countDueSoon:"{{count}}件がまもなく期限",allGood:"問題なし",nHours:"{{count}}時間",tasksOverdue:"{{count}}件のタスクが期限超過",configureDescription:"メンテナンスタイプとインターバルを設定",addPrintersToTrack:"メンテナンスを追跡するにはプリンターを追加してください",markedComplete:"メンテナンスを完了としてマーク",typeUpdated:"メンテナンスタイプを更新しました",typeDeleted:"メンテナンスタイプを削除しました",typeAdded:"メンテナンスタイプを追加しました",hoursUpdated:"印刷時間を更新しました",printerAssigned:"プリンターを割り当てました",printerRemoved:"プリンターを削除しました",wikiUrlPlaceholder:"https://wiki.bambulab.com/...",duration:{oneDay:"1日",days:"{{count}}日",weeks:"{{count}}週間",months:"{{count}}ヶ月",oneWeek:"1週間",nWeeks:"{{count}}週間",oneMonth:"1ヶ月",nMonths:"{{count}}ヶ月",oneYear:"1年"},noPermissionCreate:"メンテナンス記録を作成する権限がありません",noPermissionUpdate:"メンテナンス記録を更新する権限がありません",noPermissionPerform:"メンテナンスを実行する権限がありません",noPermissionRemove:"メンテナンス記録を削除する権限がありません",noPermissionAssign:"メンテナンスを割り当てる権限がありません",noPermissionEditTypes:"メンテナンスタイプを編集する権限がありません",noPermissionDeleteTypes:"メンテナンスタイプを削除する権限がありません",noPermissionEditIntervals:"メンテナンス間隔を編集する権限がありません",noPermissionEditHours:"メンテナンス時間を編集する権限がありません",types:{lubricateRails:"リニアレールの潤滑",cleanNozzle:"ノズル/ホットエンドの清掃",checkBelts:"ベルト張力の確認",cleanBuildPlate:"ビルドプレートの清掃",checkExtruder:"エクストルーダーギアの確認",checkCooling:"冷却ファンの確認",generalInspection:"総合点検",cleanCarbonRods:"カーボンロッドの清掃",checkPtfeTube:"PTFEチューブの確認",replaceHepaFilter:"HEPAフィルター交換",replaceCarbonFilter:"カーボンフィルター交換",lubricateLeftNozzleRail:"左ノズルレールの潤滑"}},settings:{title:"設定",general:"一般",appearance:"外観",notifications:"通知",smartPlugs:"スマートプラグ",tabSpoolman:"Spoolman",updates:"アップデート",language:"言語",languageDescription:"表示言語を選択してください",theme:"テーマ",themeLight:"ライト",themeDark:"ダーク",themeSystem:"システム設定に従う",defaultView:"デフォルト画面",defaultViewDescription:"アプリ起動時に表示するページ",checkForUpdates:"アップデートを確認",autoUpdate:"自動アップデート",currentVersion:"現在のバージョン",latestVersion:"最新バージョン",upToDate:"最新です",updateAvailable:"アップデートあり",telemetry:"匿名テレメトリ",telemetryDescription:"匿名の使用状況データを送信してBamBuddyの改善に協力する",telemetryLearnMore:"詳しく見る",telemetryInfoTitle:"どのようなデータが収集されますか?",telemetryInfoIntro:"BamBuddyはアプリの利用者数、使用バージョン、プリンターモデルを把握するために最小限の匿名データを収集します。これはバグ修正や新機能の優先順位付けに役立ちます。",telemetryInfoCollected:"収集するデータ:",telemetryInfoItem1:"ランダムなインストールID(個人やハードウェアとは紐付きません)",telemetryInfoItem2:"使用中のアプリバージョン",telemetryInfoItem3:"プリンターのモデル名(例: X1C, P1S)- 名前やシリアル番号は含みません",telemetryInfoItem4:"タイムスタンプ(日次/週次のアクティブユーザー数の計測用)",telemetryInfoNotCollected:"収集しないデータ:",telemetryInfoNotItem1:"IPアドレスはハッシュ化され、復元できません",telemetryInfoNotItem2:"プリンター名、シリアル番号、アクセスコード",telemetryInfoNotItem3:"印刷履歴、ファイル名、その他の個人的なコンテンツ",telemetryInfoNotItem4:"個人を特定できる情報",telemetryInfoFooter:"テレメトリはいつでも無効にできます。インストールIDはランダムに生成され、個人を追跡することはできません。",notificationLanguage:"通知の言語",notificationLanguageDescription:"プッシュ通知の言語",notificationProviders:"通知プロバイダー",addProvider:"プロバイダーを追加",editProvider:"プロバイダーを編集",providerType:"プロバイダーの種類",testNotification:"テスト通知",testSuccess:"テスト通知を送信しました",testFailed:"テスト通知の送信に失敗しました",quietHours:"おやすみ時間",quietHoursDescription:"この時間帯は通知を送信しません",quietHoursStart:"開始",quietHoursEnd:"終了",events:{title:"通知イベント",printStart:"印刷開始",printComplete:"印刷完了",printFailed:"印刷失敗",printStopped:"印刷中止",printProgress:"進捗マイルストーン",printProgressDescription:"25%, 50%, 75%で通知",printerOffline:"プリンターオフライン",printerError:"プリンターエラー",filamentLow:"フィラメント残量低下",maintenanceDue:"メンテナンス期限",maintenanceDueDescription:"メンテナンスが必要なときに通知"},smartPlug:{title:"スマートプラグ",add:"スマートプラグを追加",edit:"スマートプラグを編集",name:"名前",ipAddress:"IPアドレス",linkedPrinter:"連携プリンター",autoOn:"自動電源オン",autoOnDescription:"印刷開始時に電源を入れる",autoOff:"自動電源オフ",autoOffDescription:"印刷完了後に電源を切る",offDelay:"オフ遅延",offDelayMinutes:"印刷後の待機時間(分)",offDelayTemp:"ノズル温度が下回ったとき",currentState:"現在の状態",turnOn:"電源オン",turnOff:"電源オフ"},spoolman:{title:"Spoolman連携",description:"Spoolmanに接続してフィラメント在庫を管理します。AMSデータは自動的に同期されます。",howSyncWorks:"同期の仕組み",syncInfo1:"公式Bambu LabスプールのみRFIDで同期されます",syncInfo2:"新しいスプールは初回同期時にSpoolmanに自動作成されます",syncInfo3:"サードパーティ・詰め替えスプールはスキップされます",linkingExisting:"既存スプールの連携",linkingExistingDesc:"既存のSpoolmanスプールをAMSに連携するには、AMSスロットにカーソルを合わせて「Spoolmanに連携」をクリックしてください。",enable:"Spoolmanを有効化",enableDesc:"Spoolmanサーバーとフィラメントデータを同期",url:"Spoolman URL",urlHint:"SpoolmanサーバーのURL(例: http://localhost:7912)",syncMode:"同期モード",syncModeAuto:"自動",syncModeManual:"手動のみ",syncModeAutoDesc:"変更が検出されるとAMSデータが自動同期されます",syncModeManualDesc:"手動トリガー時のみ同期",statusLabel:"ステータス:",connected:"接続中",disconnected:"未接続",disconnect:"切断",connect:"接続",syncAmsData:"AMSデータを同期",syncAmsDataDesc:"プリンターのAMSデータをSpoolmanに手動同期",allPrinters:"すべてのプリンター",sync:"同期",syncSuccess:"{{count}}個のスプールを同期しました",syncWithErrors:"{{count}}個のスプールを同期({{errorCount}}件のエラー)",spoolsSkipped:"{{count}}個のスプールをスキップ",showAll:"すべて表示",showLess:"折りたたむ",andMore:"...他{{count}}件",errors:"エラー:",linkToSpoolman:"Spoolmanに連携",linkingAmsTray:"連携するAMSトレイ:",spoolUuid:"スプールUUID:",selectSpoolToLink:"連携するSpoolmanスプールを選択:",unknownFilament:"不明なフィラメント",noUnlinkedSpools:"Spoolmanに未連携のスプールが見つかりません。",allSpoolsLinked:"すべてのスプールはAMSトレイに連携済みです。",linking:"連携中...",linkSpool:"スプールを連携",linkTooltip:"このスプールをSpoolmanスプールに連携",noUnlinked:"未連携のスプールがありません"},subtitle:"Bambuddyの設定",saved:"設定を保存しました",saveFailed:"保存に失敗しました: {{error}}",tabGeneral:"一般",tabSmartPlugs:"スマートプラグ",tabNotifications:"通知",tabFilament:"フィラメント",tabNetwork:"ネットワーク",tabApiKeys:"APIキー",tabVirtualPrinter:"仮想プリンター",tabUsers:"ユーザー",dateFormat:"日付形式",timeFormat:"時刻形式",systemDefault:"システムデフォルト",dateFormatUS:"US (MM/DD/YYYY)",dateFormatEU:"EU (DD/MM/YYYY)",dateFormatISO:"ISO (YYYY-MM-DD)",timeFormat12h:"12時間 (3:30 PM)",timeFormat24h:"24時間 (15:30)",defaultPrinter:"デフォルトプリンター",noDefaultPrinter:"デフォルトなし(毎回選択)",defaultPrinterDescription:"アップロード、再印刷、その他の操作でこのプリンターを事前選択します。",sidebarOrder:"サイドバーの順序",sidebarOrderDescription:"サイドバーの項目をドラッグ&ドロップで並べ替えできます。ここでデフォルトの順序にリセットできます。",reset:"リセット",darkMode:"ダークモード",lightMode:"ライトモード",active:"(有効)",background:"背景",accent:"アクセント",style:"スタイル",bgNeutral:"ニュートラル",bgWarm:"ウォーム",bgCool:"クール",bgOLED:"OLED ブラック",bgSlate:"スレートブルー",bgForest:"フォレストグリーン",accentGreen:"グリーン",accentTeal:"ティール",accentBlue:"ブルー",accentOrange:"オレンジ",accentPurple:"パープル",accentRed:"レッド",styleClassic:"クラシック",styleGlow:"グロー",styleVibrant:"ビブラント",themeToggleHint:"サイドバーの太陽/月アイコンでダークモードとライトモードを切り替えます。",archiveSettings:"アーカイブ設定",autoArchive:"自動アーカイブ",autoArchiveDescription:"印刷完了時に3MFファイルを自動的に保存",saveThumbnails:"サムネイルを保存",saveThumbnailsDescription:"3MFファイルからプレビュー画像を抽出して保存",captureFinishPhoto:"完了写真を撮影",captureFinishPhotoDescription:"印刷完了時にプリンターカメラから写真を撮影",ffmpegNotInstalled:"ffmpegがインストールされていません",ffmpegInstruction:"カメラキャプチャにはffmpegが必要です。brew install ffmpeg(macOS)またはapt install ffmpeg(Linux)でインストールしてください。",camera:"カメラ",cameraViewMode:"カメラ表示モード",cameraNewWindow:"新しいウィンドウ",cameraEmbedded:"埋め込みオーバーレイ",cameraEmbeddedDescription:"メイン画面上のリサイズ可能なオーバーレイでカメラを開きます",cameraNewWindowDescription:"別のブラウザウィンドウでカメラを開きます",costTracking:"コスト追跡",defaultFilamentCost:"デフォルトフィラメントコスト(kg単位)",currency:"通貨",electricityCost:"電気代(kWh単位)",energyDisplayMode:"エネルギー表示モード",energyPrintsOnly:"印刷のみ",energyTotalConsumption:"総消費量",energyPrintsOnlyDescription:"ダッシュボードに印刷中に使用されたエネルギーの合計を表示",energyTotalDescription:"ダッシュボードにスマートプラグの累計エネルギーを表示",fileManager:"ファイルマネージャー",archiveOnPrint:"印刷時のアーカイブエントリ作成",archiveAlways:"常にアーカイブエントリを作成",archiveNever:"アーカイブエントリを作成しない",archiveAsk:"毎回確認",archiveOnPrintDescription:"ファイルマネージャーから印刷する際、オプションでアーカイブエントリを作成",lowDiskWarning:"ディスク容量不足の警告",lowDiskWarningDescription:"空きディスク容量がこのしきい値を下回ると警告を表示",checkPrinterFirmware:"プリンターファームウェアの確認",checkPrinterFirmwareDescription:"Bambu Labのプリンターファームウェア更新を確認",checkForUpdatesDescription:"起動時に自動的に新しいバージョンを確認",checkNow:"今すぐ確認",releaseNotes:"リリースノート",viewOnGitHub:"GitHubで表示",updateViaDocker:"Docker Composeでアップデート:",installUpdate:"アップデートをインストール",close:"閉じる",dataManagement:"データ管理",backupData:"データのバックアップ",backupDescription:"設定、プロバイダー、プリンターなどをエクスポート",export:"エクスポート",restoreBackup:"バックアップの復元",restoreDescription:"重複処理オプション付きでバックアップファイルから設定をインポート",restore:"復元",clearLogs:"通知ログを削除",clearLogsDescription:"30日以上前の通知ログを削除",clear:"削除",resetUI:"UIの設定をリセット",resetUIDescription:"サイドバーの順序、テーマ、表示モード、レイアウト設定をリセットします。プリンター、アーカイブ、設定には影響しません。",clearLogsTitle:"通知ログを削除",clearLogsMessage:"30日以上前のすべての通知ログを完全に削除します。この操作は元に戻せません。",clearLogsConfirm:"ログを削除",clearLogsFailed:"ログの削除に失敗しました",resetUITitle:"UIの設定をリセット",resetUIMessage:"すべてのUI設定をデフォルトにリセットします:サイドバーの順序、テーマ、ダッシュボードレイアウト、表示モード、ソート設定。プリンター、アーカイブ、サーバー設定には影響しません。クリア後にページが再読み込みされます。",resetPreferences:"設定をリセット",preferencesReset:"UI設定をリセットしました。更新中...",externalUrl:"外部URL",externalUrlDescription:"Bambuddyがアクセス可能な外部URL。通知画像や外部連携に使用されます。",bambuddyUrl:"Bambuddy URL",externalUrlHint:"プロトコルとポートを含めてください(例: http://192.168.1.100:8000)",ftpRetry:"FTPリトライ",ftpRetryDescription:"プリンターのWi-Fiが不安定な場合にFTP操作をリトライします。3MFダウンロード、印刷アップロード、タイムラプスダウンロード、ファームウェアアップデートに適用されます。",enableRetry:"リトライを有効化",enableRetryDescription:"失敗したFTP操作を自動的にリトライ",retryAttempts:"リトライ回数",times:"回",retryAttemptsDescription:"諦めるまでのリトライ回数(1-10)",retryDelay:"リトライ間隔",seconds:"秒",retryDelayDescription:"リトライ間の待ち時間(1-30)",connectionTimeout:"接続タイムアウト",connectionTimeoutDescription:"遅い接続用のソケットタイムアウト。Wi-Fiが弱いA1/A1 Miniプリンターの場合は増やしてください(10-120)",homeAssistant:"Home Assistant",connected:"接続済み",disconnected:"未接続",homeAssistantDescription:"Home Assistantに接続してHA REST APIでスマートプラグを制御します。switch、light、input_booleanエンティティに対応しています。",enableHA:"Home Assistantを有効化",enableHADescription:"Home Assistantでスマートプラグを制御",haUrl:"Home Assistant URL",haToken:"長期アクセストークン",haTokenHint:"HAでトークンを作成: プロフィール → 長期アクセストークン → トークン作成",testConnection:"接続テスト",connectionSuccessful:"接続成功",connectionFailed:"接続失敗",haConnectionSuccess:"Home Assistantへの接続に成功しました。",haConnectionFailed:"Home Assistantへの接続に失敗しました。",mqttPublishing:"MQTT配信",mqttDescription:"BamBuddyイベントを外部MQTTブローカーに配信し、Node-RED、Home Assistant、その他の自動化システムと連携します。",enableMqtt:"MQTTを有効化",enableMqttDescription:"外部MQTTブローカーにイベントを配信",brokerHostname:"ブローカーホスト名",port:"ポート",useTls:"TLSを使用",usernameOptional:"ユーザー名(オプション)",passwordOptional:"パスワード(オプション)",topicPrefix:"トピックプレフィックス",connectedTo:"接続先:",notConnected:"未接続",smartPlugsDescription:"スマートプラグ(TasmotaまたはHome Assistant)を接続して、電源制御を自動化し、プリンターのエネルギー消費を追跡します。",turnAllPlugsOn:"すべてのプラグをオン",turnAllPlugsOff:"すべてのプラグをオフ",allOn:"全オン",allOff:"全オフ",addSmartPlug:"スマートプラグを追加",energySummary:"エネルギー概要",currentPower:"現在の電力",today:"今日",yesterday:"昨日",total:"合計",enablePlugsForEnergy:"プラグを有効にしてエネルギー概要を表示",noSmartPlugs:"スマートプラグが設定されていません",noSmartPlugsDescription:"Tasmotaベースのスマートプラグを追加して、エネルギー消費を追跡し、電源制御を自動化します。",addFirstSmartPlug:"最初のスマートプラグを追加",providers:"プロバイダー",log:"ログ",testAll:"すべてテスト",add:"追加",testResults:"テスト結果",dismiss:"閉じる",noProviders:"プロバイダーが設定されていません",noProvidersDescription:"アラートを受信するにはプロバイダーを追加してください。",messageTemplates:"メッセージテンプレート",templatesDescription:"各イベントの通知メッセージをカスタマイズします。",noTemplates:"テンプレートがありません。バックエンドを再起動してデフォルトテンプレートを作成してください。",testAllSuccess:"すべて{{count}}件のプロバイダーのテストに成功しました!",testAllPartial:"{{success}}/{{tested}}件のプロバイダーが成功",testProvidersFailed:"プロバイダーのテストに失敗しました: {{error}}",bulkPlugSuccess:"すべて{{count}}個のプラグを{{action}}にしました",bulkPlugPartial:"{{success}}個のプラグを{{action}}にしました、{{failed}}個が失敗",bulkPlugFailed:"失敗: {{error}}",apiKeys:"APIキー",apiKeysDescription:"外部連携やWebhook用のAPIキーを作成します。",createKey:"キーを作成",apiKeyCreated:"APIキーを作成しました",apiKeyDeleted:"APIキーを削除しました",apiKeySuccess:"APIキーが正常に作成されました",apiKeyCopyWarning:"今すぐこのキーをコピーしてください - 再表示されません!",keyCopied:"キーをクリップボードにコピーしました",keyCopyFailed:"キーのコピーに失敗しました",keyAddedToBrowser:"キーをAPIブラウザに追加しました",useInBrowser:"APIブラウザで使用",createNewApiKey:"新しいAPIキーを作成",keyName:"キー名",permissions:"権限",readStatus:"ステータスの読み取り",readStatusDescription:"プリンターのステータスとキューを表示",manageQueue:"キューの管理",manageQueueDescription:"印刷キューへのアイテムの追加と削除",controlPrinter:"プリンターの制御",controlPrinterDescription:"印刷の一時停止、再開、停止",cancel:"キャンセル",lastUsed:"最終使用:",badgeRead:"読取",badgeQueue:"キュー",badgeControl:"制御",noApiKeys:"APIキーがありません",noApiKeysDescription:"外部サービスとの連携用にAPIキーを作成してください。",createFirstKey:"最初のキーを作成",deleteApiKeyTitle:"APIキーを削除",deleteApiKeyMessage:"このAPIキーを削除してもよろしいですか?このキーを使用しているすべての連携が動作しなくなります。",deleteKey:"キーを削除",webhookEndpoints:"Webhookエンドポイント",webhookApiKeyHint:"X-API-KeyヘッダーでAPIキーを使用してください。",webhookGetAll:"すべてのプリンターステータスを取得",webhookGetOne:"特定のプリンターステータスを取得",webhookQueue:"印刷キューに追加",webhookPause:"印刷を一時停止",webhookResume:"印刷を再開",webhookStop:"印刷を停止",apiBrowser:"APIブラウザ",apiBrowserDescription:"すべての利用可能なAPIエンドポイントを探索してテストします。",apiKeyForTesting:"テスト用APIキー",apiKeyHeaderHint:"このキーはリクエストのX-API-Keyヘッダーとして送信されます。",apiKeyCreateFailed:"APIキーの作成に失敗しました: {{error}}",apiKeyDeleteFailed:"APIキーの削除に失敗しました: {{error}}",amsThresholds:"AMS表示しきい値",amsThresholdsDescription:"AMS湿度と温度インジケーターの色しきい値を設定します。",humidity:"湿度",goodGreen:"良好(緑)≤",fairOrange:"普通(オレンジ)≤",aboveFairBad:"普通のしきい値以上は赤(悪い)で表示",temperature:"温度",goodBlue:"良好(青)≤",aboveFairHot:"普通のしきい値以上は赤(高温)で表示",historyRetention:"履歴の保持",keepHistoryFor:"センサー履歴の保持期間",days:"日",historyRetentionDescription:"古い湿度と温度データは自動的に削除されます",printModal:"印刷ダイアログ",expandMapping:"カスタムマッピングをデフォルトで展開",expandMappingDescription:"複数のプリンターに印刷する際、プリンターごとのAMSマッピングを展開して表示",currentUser:"現在のユーザー",role:"ロール:",roleAdmin:"管理者",roleUser:"ユーザー",manageUsers:"ユーザー管理",disableAuth:"認証を無効化",rolePermissions:"ロール権限",rolePermissionsDescription:"各ロールの権限の概要。",adminPerm1:"プリンター設定の管理",adminPerm2:"ユーザーの作成、編集、削除",adminPerm3:"すべてのシステム機能へのアクセス",userPerm1:"印刷ジョブの送信",userPerm2:"ファイルとアーカイブの管理",userPerm3:"フィラメントの管理",disableAuthTitle:"認証を無効化",disableAuthMessage:"認証を無効にしてもよろしいですか?これにより、Bambuddyインスタンスはログインなしでアクセス可能になります。すべてのユーザーはデータベースに残りますが、認証は無効になります。",disableAuthConfirm:"認証を無効化",authDisabledSuccess:"認証を正常に無効化しました",disableAuthFailed:"認証の無効化に失敗しました",unknownError:"不明なエラー",haUrlPlaceholder:"http://homeassistant.local:8123",haTokenPlaceholder:"長期アクセストークン",mqttHostPlaceholder:"例: 192.168.1.100",leaveEmptyAnonymous:"匿名接続の場合は空欄",mqttTopicDefault:"bambuddy",apiKeyNamePlaceholder:"例: Home Assistantインテグレーション",apiKeyTestPlaceholder:"テスト用APIキーを貼り付け",unnamedKey:"名前なしキー",plugsOnline:"{{online}}/{{total}} オンライン",passed:"{{count}}件 成功",failed:"{{count}}件 失敗",externalUrlPlaceholder:"http://192.168.1.100:8000",bulkPlugTitle:"すべてのプラグを{{action}}",bulkPlugMessage:"有効な{{count}}個のスマートプラグをすべて{{action}}しますか?",bulkPlugConfirm:"すべて{{action}}",updateCheckFailed:"確認失敗: {{error}}",releaseNotesTitle:"リリースノート - v{{version}}",mqttTopicsHint:"トピック: {{prefix}}/printers//status など",virtualPrinterUpdated:"仮想プリンター設定を更新しました",vp:{title:"仮想プリンター",running:"稼働中",stopped:"停止中",description:"Bambu StudioやOrcaSlicerに表示される仮想プリンターを有効にします。このプリンターに送信されたファイルは印刷せずに直接アーカイブされます。",enable:"仮想プリンターを有効化",visibleInSlicer:"スライサーの検出リストに「Bambuddy」として表示",notVisible:"スライサーに表示されません",printerModel:"プリンターモデル",printerModelDescription:"エミュレートするプリンターモデルを選択します。",modelRestartWarning:"モデルを変更すると仮想プリンターが再起動されます",accessCode:"アクセスコード",accessCodeSet:"アクセスコードが設定済み",noAccessCode:"アクセスコード未設定 - 有効化に必要です",accessCodeRequired:"先にアクセスコードを設定してください",accessCodeEmpty:"アクセスコードは空にできません",accessCodeLength:"アクセスコードは8文字である必要があります",accessCodeHint:"8文字である必要があります。スライサーの認証に使用されます。",mode:"モード",modeArchive:"アーカイブ",modeArchiveDesc:"ファイルを即座にアーカイブ",modeReview:"レビュー",modeReviewDesc:"アーカイブ前にレビューとタグ付け",modeQueue:"キュー",modeQueueDesc:"アーカイブしてキューに追加",setupRequired:"セットアップが必要",setupDescription:"仮想プリンター機能を使用するには、追加のシステム設定が必要です。ポートフォワーディング、ファイアウォールルール、プラットフォーム固有の設定が含まれます。",readSetupGuide:"有効化する前にセットアップガイドをお読みください",howItWorks:"仕組み:",step1:"お使いのプラットフォームのセットアップガイドを完了する",step2:"仮想プリンターを有効にしてアクセスコードを設定する",step3:"Bambu StudioまたはOrcaSlicerで「プリンターを追加」を開く",step4:"検出リストに「Bambuddy」プリンターが表示される",step5:"設定したアクセスコードで接続する",step6:"Bambuddyに「印刷」すると、3MFファイルがアーカイブされる",statusDetails:"ステータス詳細",printerName:"プリンター名",model:"モデル",serialNumber:"シリアルナンバー",pendingFiles:"保留中のファイル"},enterNewCodeToChange:"新しいコードを入力して変更",enter8CharCode:"8文字のコードを入力",notificationTitlePlaceholder:"通知タイトル...",notificationBodyPlaceholder:"通知本文...",templateTitleRequired:"タイトルは必須です",templateBodyRequired:"本文は必須です",editTemplate:"テンプレートを編集: {{name}}",templateTitle:"タイトル",templateBody:"本文",availableVariables:"利用可能な変数",insertVariableHint:"クリックして本文のカーソル位置に挿入",livePreview:"ライブプレビュー",loadingPreview:"プレビューを読み込み中...",previewTitle:"タイトル:",previewBody:"本文:",enterTemplateToPreview:"テンプレートの内容を入力するとプレビューが表示されます",resetToDefault:"デフォルトに戻す",noExternalLinks:"外部リンクが設定されていません",clickAddLink:"「リンクを追加」をクリックして追加",deleteLink:"リンクを削除",deleteLinkConfirm:"「{{name}}」を削除しますか?この操作は取り消せません。",editLink:"リンクを編集",addExternalLink:"外部リンクを追加",addLink:"リンクを追加",sidebarLinks:"サイドバーリンク",sidebarLinksDescription:"外部リンクをサイドバーナビゲーションに追加します。ドラッグで並べ替え。",linkNamePlaceholder:"マイリンク",linkNameLabel:"名前",linkUrlLabel:"URL",linkIconLabel:"アイコン",linkCustomIcon:"カスタムアイコン",linkCustomIconHint:"PNG, JPG, GIF, SVG, WebP, ICO。最大1MB。",linkChoosePresetIcon:"またはプリセットアイコンを選択",linkNameRequired:"名前は必須です",linkUrlRequired:"URLは必須です",linkUrlInvalid:"URLは http:// または https:// で始まる必要があります",linkInvalidImageType:"有効な画像ファイルを選択してください(PNG, JPG, GIF, SVG, WebP, ICO)",linkImageTooLarge:"画像ファイルは1MB以下にしてください",removeCustomIcon:"カスタムアイコンを削除",jsonRequestBody:"JSONリクエストボディ...",searchEndpoints:"エンドポイントを検索...",groups:"グループ",addGroup:"グループを追加",noGroupsFound:"グループが見つかりません",systemGroup:"システム",noDescription:"説明なし",users:"ユーザー",addUser:"ユーザーを追加",noUsersFound:"ユーザーが見つかりません",admin:"管理者",authentication:"認証",authEnableDescription:"認証を有効にして、ユーザーアカウントの作成、権限の管理、Bambuddyインスタンスのセキュリティ保護を行います。",authSecuredDescription:"Bambuddyインスタンスは認証で保護されています。",enable:"有効にする",disable:"無効にする",changePassword:"パスワードを変更",backup:"バックアップ",backupAndRestore:"バックアップと復元",backupAndRestoreDescription:"Bambuddyデータのバックアップを作成および復元します",goToBackup:"バックアップへ移動",homeAssistantDescriptionFull:"Home Assistantに接続してスマートホームデバイスを制御します",usersCount:"{{count}}人のユーザー",permissionsCount:"{{count}}個の権限",authDisabledTitle:"認証が無効です",authDisabledDescription:"認証を有効にして、ユーザーアカウントの作成、権限の管理、Bambuddyインスタンスのセキュリティを確保しましょう。",authFeature1:"システムへのアクセスにログインを要求",authFeature2:"グループベースの権限を持つ複数のユーザーを作成",authFeature3:"50以上のきめ細かい権限でアクセスを制御",enableAuthentication:"認証を有効にする",createUser:"ユーザーを作成",username:"ユーザー名",enterUsername:"ユーザー名を入力",password:"パスワード",enterPassword:"パスワードを入力(6文字以上)",confirmPassword:"パスワードの確認",confirmPasswordPlaceholder:"パスワードを確認",passwordsDoNotMatch:"パスワードが一致しません",groupsLabel:"グループ",systemLabel:"(システム)",noGroupsAvailable:"利用可能なグループがありません",creating:"作成中...",editUser:"ユーザーを編集",leaveBlankToKeep:"(現在のパスワードを維持する場合は空白)",enterNewPassword:"新しいパスワードを入力",confirmNewPassword:"新しいパスワードを確認",deleteUser:"ユーザーを削除",deleteUserConfirm:"このユーザーを削除してもよろしいですか?この操作は元に戻せません。",createGroup:"グループを作成",editGroup:"グループを編集",groupName:"グループ名",enterGroupName:"グループ名を入力",systemGroupNameReadonly:"システムグループ名は変更できません",descriptionLabel:"説明",enterDescription:"説明を入力(任意)",permissionsSelected:"権限({{count}}件選択中)",deleteGroup:"グループを削除",deleteGroupConfirm:"このグループを削除してもよろしいですか?このグループのユーザーはこれらの権限を失います。",changePasswordTitle:"パスワードの変更",currentPassword:"現在のパスワード",enterCurrentPassword:"現在のパスワードを入力",newPassword:"新しいパスワード",enterNewPasswordMin6:"新しいパスワードを入力(6文字以上)",confirmNewPasswordPlaceholder:"新しいパスワードを確認",passwordMinLength:"パスワードは6文字以上である必要があります",passwordChanged:"パスワードが正常に変更されました",failedToChangePassword:"パスワードの変更に失敗しました",changingPassword:"変更中...",prometheusTitle:"Prometheusメトリクス",prometheusDescriptionPre:"プリンターメトリクスを",prometheusDescriptionPost:"でPrometheus/Grafanaモニタリング用に公開します。",enableMetricsEndpoint:"メトリクスエンドポイントを有効化",exposePrometheusData:"プリンターデータをPrometheus形式で公開",bearerTokenOptional:"Bearerトークン(任意)",bearerTokenPlaceholder:"認証不要の場合は空欄のまま",bearerTokenHint:"設定した場合、リクエストに次のヘッダーが必要: ",availableMetrics:"利用可能なメトリクス",metricConnectionStatus:"接続状態",metricPrinterState:"プリンター状態(アイドル/印刷中など)",metricPrintProgress:"印刷進捗 0-100%",metricBedTemp:"ベッド温度",metricNozzleTemp:"ノズル温度",metricPrintsTotal:"結果別の合計印刷数",metricAndMore:"...その他(レイヤー、ファン、キュー、フィラメント使用量)"},notification:{printStarted:{title:"印刷開始",body:"{{printer}}: {{filename}} の印刷を開始しました"},printCompleted:{title:"印刷完了",body:"{{printer}}: {{filename}} が正常に完了しました"},printFailed:{title:"印刷失敗",body:"{{printer}}: {{filename}} が失敗しました"},printStopped:{title:"印刷中止",body:"{{printer}}: {{filename}} が中止されました"},printProgress:{title:"印刷進捗",body:"{{printer}}: {{filename}} は {{percent}}% 完了"},printerOffline:{title:"プリンターオフライン",body:"{{printer}} がオフラインです"},printerError:{title:"プリンターエラー",body:"{{printer}}: {{error}}"},filamentLow:{title:"フィラメント残量低下",body:"{{printer}}: フィラメントが残りわずかです"},maintenanceDue:{title:"メンテナンス期限",body:"{{printer}}: {{items}} の対応が必要です"}},errors:{generic:"問題が発生しました",networkError:"ネットワークエラーです。接続を確認してください。",notFound:"見つかりません",unauthorized:"認証エラー",serverError:"サーバーエラー",validationError:"入力内容を確認してください",printerConnectionFailed:"プリンターへの接続に失敗しました",saveFailed:"保存に失敗しました",deleteFailed:"削除に失敗しました",loadFailed:"データの読み込みに失敗しました"},confirm:{delete:"削除しますか?",unsavedChanges:"保存されていない変更があります。このページを離れますか?",clearQueue:"キューをクリアしますか?"},calendar:{months:{january:"1月",february:"2月",march:"3月",april:"4月",may:"5月",june:"6月",july:"7月",august:"8月",september:"9月",october:"10月",november:"11月",december:"12月"},daysShort:{sun:"日",mon:"月",tue:"火",wed:"水",thu:"木",fri:"金",sat:"土"}},notificationLog:{title:"通知ログ",lastDays:"過去{{days}}日間:",notifications:"件の通知",sent:"送信済み",failed:"失敗",last24Hours:"過去24時間",showFailedOnly:"失敗のみ表示",clearOld:"古いログを削除",noFailedNotifications:"失敗した通知はありません",noNotificationsLogged:"通知ログはありません",unknownProvider:"不明なプロバイダー",titleLabel:"タイトル",messageLabel:"メッセージ",errorLabel:"エラー",provider:"プロバイダー:",time:"時間:",clearLogsFailed:"ログの削除に失敗しました: {{error}}",events:{print_start:"印刷開始",print_complete:"印刷完了",print_failed:"印刷失敗",print_stopped:"印刷中止",print_progress:"進捗",printer_offline:"プリンターオフライン",printer_error:"プリンターエラー",filament_low:"フィラメント残量低下",maintenance_due:"メンテナンス期限",ams_humidity_high:"AMS湿度高",ams_temperature_high:"AMS温度高",test:"テスト"}},providers:{callmebot:"CallMeBot/WhatsApp",ntfy:"ntfy",pushover:"Pushover",telegram:"Telegram",email:"メール",discord:"Discord",webhook:"Webhook",descriptions:{email:"SMTPメール通知",telegram:"Telegramボット経由の通知",discord:"Webhook経由でDiscordチャンネルに送信",ntfy:"無料のセルフホスト対応プッシュ通知",pushover:"シンプルで確実なプッシュ通知",callmebot:"CallMeBot経由の無料WhatsApp通知",webhook:"任意のURLへの汎用HTTP POST"}},backup:{categories:{settings:"設定",notification_providers:"通知プロバイダー",notification_templates:"通知テンプレート",smart_plugs:"スマートプラグ",printers:"プリンター",filaments:"フィラメント",maintenance_types:"メンテナンスタイプ",archives:"アーカイブ",projects:"プロジェクト",pending_uploads:"アップロード待ち",external_links:"外部リンク",api_keys:"APIキー"},notificationProviders:"通知プロバイダー",notificationTemplates:"通知テンプレート",externalLinks:"外部リンク",printers:"プリンター",filamentInventory:"フィラメント在庫",maintenanceTypes:"メンテナンスタイプ",printArchives:"印刷アーカイブ",projects:"プロジェクト",pendingUploads:"保留中のアップロード",apiKeys:"APIキー",settingsDescription:"言語、テーマ、更新設定",notificationProvidersDescription:"ntfy、Pushover、Discordなど",notificationTemplatesDescription:"カスタムメッセージテンプレート",smartPlugsDescription:"Tasmotaプラグ設定",externalLinksDescription:"外部サービスへのサイドバーリンク",printersDescription:"プリンター情報(アクセスコードを除く)",filamentInventoryDescription:"フィラメントの種類とコスト",maintenanceDescription:"カスタムメンテナンススケジュール",printArchivesDescription:"全印刷データ+ファイル(3MF、サムネイル、写真)",projectsDescription:"プロジェクト、BOMアイテム、添付ファイル",pendingUploadsDescription:"レビュー待ちの仮想プリンターアップロード",apiKeysDescription:"Webhook APIキー(インポート時に新しいキーが生成されます)"},restore:{failedToRestore:"バックアップの復元に失敗しました。ファイル形式を確認してください。",title:"バックアップの復元",restoring:"復元中...",complete:"復元完了",failed:"復元失敗",importDescription:"バックアップファイルから設定をインポート",pleaseWait:"データを復元しています。しばらくお待ちください",duplicateHandling:"重複処理の仕組み:",clickToSelect:"クリックしてバックアップファイルを選択 (.json または .zip)",replaceExisting:"既存データを上書き",keepExisting:"既存データを保持",overwriteDescription:"既に存在する項目をバックアップデータで上書きします",skipDescription:"まだ存在しない項目のみ復元します",caution:"注意:",overwriteWarning:"上書きすると、現在の設定がバックアップのデータに置き換えられます。セキュリティのため、プリンターのアクセスコードは上書きされません。",restore:"復元",processing:"バックアップファイルを処理中...",itemsRestored:"復元済み項目",itemsSkipped:"スキップ済み項目",restoredSection:"復元済み",filesSection:"ファイル (3MF、サムネイルなど)",skippedSection:"スキップ (既に存在)",andMore:"...他 {{count}} 件",newApiKeys:"新しいAPIキーが生成されました",copyKeysWarning:"これらのキーは一度だけ表示されます。今すぐコピーしてください!",copy:"コピー",noDataFound:"バックアップファイルに復元するデータが見つかりませんでした。",dupPrinters:"プリンター",dupPrintersDesc:"シリアル番号で照合",dupSmartPlugs:"スマートプラグ",dupSmartPlugsDesc:"IPアドレスで照合",dupNotificationProviders:"通知プロバイダー",dupNotificationProvidersDesc:"名前で照合",dupFilaments:"フィラメント",dupFilamentsDesc:"名前 + 種類 + ブランドで照合",dupArchives:"アーカイブ",dupArchivesDesc:"コンテンツハッシュで照合 (常にスキップ)",dupPendingUploads:"アップロード待ち",dupPendingUploadsDesc:"ファイル名で照合",dupSettingsTemplates:"設定とテンプレート",dupSettingsTemplatesDesc:"常に上書き"},files:{root:"ルート",cache:"キャッシュ",models:"モデル",timelapse:"タイムラプス",used:"使用中:",free:"空き:",filterPlaceholder:"ファイルを検索...",noFiles:"このディレクトリにファイルがありません",deleteFile:"ファイルを削除",deleteConfirm:'"{{name}}"を削除しますか?この操作は元に戻せません。',fileManager:"ファイル管理",pageDescription:"プリントファイルを整理・管理",newFolder:"新しいフォルダ",folderName:"フォルダ名",folderNamePlaceholder:"例: 機能パーツ",renameFile:"ファイル名を変更",renameFolder:"フォルダ名を変更",rename:"名前変更",rootNoFolder:"ルート(フォルダなし)",moveFilesCount:"{{count}}個のファイルを移動",current:"(現在)",move:"移動",linkFolder:"フォルダをリンク",linkFolderDescription:"「{{name}}」をプロジェクトまたはアーカイブにリンクしてすばやくアクセス。",noProjectsFound:"プロジェクトが見つかりません",noArchivesFound:"アーカイブが見つかりません",unlink:"リンク解除",link:"リンク",uploadFiles:"ファイルをアップロード",dropFilesHere:"ここにファイルをドロップ",dragAndDropFiles:"ファイルをドラッグ&ドロップ",orClickToBrowse:"またはクリックして選択",zipAutoExtract:"ZIPファイルは自動的に展開されます",zipFilesDetected:"ZIPファイルを検出",zipChooseHandling:"ZIPファイルが展開されます。フォルダ構造の処理方法を選択してください:",preserveZipStructure:"ZIPのフォルダ構造を保持",willBeExtracted:"• 展開予定",filesExtracted:"• {{count}}個のファイルを展開済み",uploadComplete:"アップロード完了: {{count}}個成功",uploadErrorCount:"、{{count}}個失敗",uploading:"アップロード中...",filesFailed:"{{count}}個のファイルが失敗",uploadFailed:"アップロード失敗",linkToProjectOrArchive:"プロジェクトまたはアーカイブにリンク",changeLink:"リンクを変更...",linkTo:"リンク先...",printedCount:"{{count}}回印刷済み",addToQueue:"キューに追加",adding:"追加中...",folderCreated:"フォルダを作成しました",folderDeleted:"フォルダを削除しました",fileDeleted:"ファイルを削除しました",deletedFiles:"{{count}}個のファイルを削除しました",filesMoved:"ファイルを移動しました",folderUnlinked:"フォルダのリンクを解除しました",folderLinked:"フォルダをリンクしました",addedToQueue:"{{count}}個のファイルをキューに追加しました",addedToQueueWithErrors:"{{added}}個追加、{{errors}}個失敗",failedToAddFiles:"ファイルの追加に失敗: {{error}}",fileRenamed:"ファイル名を変更しました",folderRenamed:"フォルダ名を変更しました",gridView:"グリッド表示",listView:"リスト表示",lowDiskSpaceWarning:"ディスク容量不足の警告",lowDiskSpaceDescription:"空き容量は{{free}}(合計{{total}})。しきい値は設定で{{threshold}} GBに設定されています。",filesLabel:"ファイル:",foldersLabel:"フォルダ:",sizeLabel:"サイズ:",freeLabel:"空き:",folders:"フォルダ",allFiles:"すべてのファイル",allTypes:"すべての種類",date:"日付",size:"サイズ",type:"種類",prints:"印刷回数",ascending:"昇順",descending:"降順",filteredCount:"{{total}}件中{{filtered}}件",deselectAll:"すべて選択解除",selectAll:"すべて選択",selectedCount:"{{count}}件選択中",loadingFiles:"ファイルを読み込み中...",folderEmpty:"フォルダは空です",noFilesYet:"ファイルはまだありません",emptyFolderDescription:"ファイルをアップロードするか、このフォルダにファイルを移動してください。",emptyRootDescription:"プリント関連ファイルの整理を始めるにはファイルをアップロードしてください。",noMatchingFiles:"一致するファイルがありません",noMatchingFilesDescription:"現在の検索またはフィルター条件に一致するファイルがありません。",clearFilters:"フィルターをクリア",sort:{nameAsc:"名前 (A-Z)",nameDesc:"名前 (Z-A)",sizeAsc:"サイズ (小さい順)",sizeDesc:"サイズ (大きい順)",dateAsc:"日付 (古い順)",dateDesc:"日付 (新しい順)"},searchFiles:"ファイルを検索...",deleteFolder:"フォルダを削除",deleteBulkTitle:"{{count}}件のファイルを削除",deleteFolderConfirm:"このフォルダを削除しますか?中のファイルもすべて削除されます。",deleteMultipleConfirm:"選択した{{count}}件のファイルを削除しますか?この操作は元に戻せません。",deleteFileConfirm:"このファイルを削除しますか?",deleting:"削除中..."},printOptions:{title:"印刷オプション",bedLevelling:"ベッドレベリング",bedLevellingDesc:"印刷前にベッドを自動レベリング",flowCali:"フローキャリブレーション",flowCaliDesc:"押出量を校正",vibrationCali:"振動キャリブレーション",vibrationCaliDesc:"リンギングを低減",layerInspect:"初層検査",layerInspectDesc:"AIによる初層の検査",timelapse:"タイムラプス",timelapseDesc:"タイムラプス動画を記録"},printModal:{powerOffWhenDone:"完了後にプリンターの電源をオフ",immediateHelp:"プリンターがアイドル状態になり次第、印刷を開始します。",scheduledHelp:"スケジュールされた時間にプリンターがアイドル状態であれば印刷を開始します。ビジー状態の場合は、利用可能になるまで待機します。",stagedHelp:"印刷はステージングされますが、自動的には開始されません。キューに送るにはスタートボタンを使用してください。",print:"印刷",reprint:"再印刷",printToMultiple:"{{count}}台のプリンターに印刷",editQueueItem:"キューアイテムを編集",sameTypeDifferentColor:"同じタイプ、異なる色",filamentTypeNotLoaded:"フィラメントタイプが読み込まれていません",specificPrinter:"特定のプリンター",selectPrinters:"プリンターを選択",selectAll:"すべて選択",printersSelected:"{{count}}台のプリンターを選択中",noPrintersAvailable:"利用可能なプリンターがありません",noActivePrintersAvailable:"アクティブなプリンターがありません",inactive:"非アクティブ",unknownModel:"不明なモデル",customMapping:"カスタムマッピング",auto:"自動",showAll:"すべて表示",selectAtLeastOne:"プリンターを1台以上選択してください",selectTargetModel:"ターゲットモデルを選択",selectSlot:"スロットを選択...",reRead:"再読み込み",customSlotMapping:"カスタムスロットマッピング",autoMatched:"自動マッチ",manuallySelected:"手動選択",schedulerWillAssign:"スケジューラーが最初に利用可能なアイドル状態の{{model}}プリンターに割り当てます",inLocation:"{{location}}内",anyModel:"任意の{{model}}",hiddenPrinters:"他{{count}}台のプリンターが非表示(異なるモデル)",showOnlyModel:"{{model}}プリンターのみ表示",matchedCount:"({{matched}}/{{total}} 一致)",targetModelLabel:"ターゲットモデル",selectAModel:"モデルを選択...",locationFilterLabel:"ロケーションフィルター(任意)",anyLocation:"すべてのロケーション"},login:{title:"Bambuddy ログイン",subtitle:"アカウントにサインイン",username:"ユーザー名",usernamePlaceholder:"ユーザー名を入力",password:"パスワード",passwordPlaceholder:"パスワードを入力",loggingIn:"ログイン中...",signIn:"サインイン",enterCredentials:"ユーザー名とパスワードを入力してください",success:"ログインしました",failed:"ログインに失敗しました"},setup:{title:"Bambuddy セットアップ",description:"Bambuddyインスタンスの認証を設定します",enableAuthentication:"認証を有効にする",adminAccount:"管理者アカウント",adminAccountDescription:"既に管理者ユーザーが存在する場合、既存の管理者アカウントを使用して認証が有効になります。既存の管理者を使用するには以下のフィールドを空のままにするか、新しい管理者ユーザーを作成するには新しい認証情報を入力してください。",adminUsername:"管理者ユーザー名",adminPassword:"管理者パスワード",optionalIfAdminsExist:"管理者ユーザーが存在する場合は任意",placeholderAdminUsername:"管理者ユーザー名を入力(任意)",placeholderAdminPassword:"管理者パスワードを入力(任意)",confirmPassword:"パスワードの確認",placeholderConfirmPassword:"管理者パスワードを確認",settingUp:"セットアップ中...",completeSetup:"セットアップを完了",toast:{authEnabledAdminCreated:"認証が有効になり、管理者ユーザーが作成されました",authEnabledExistingAdmins:"既存の管理者ユーザーを使用して認証が有効になりました",setupCompleted:"セットアップが完了しました",enterBothOrLeaveEmpty:"管理者ユーザー名とパスワードの両方を入力するか、既存の管理者ユーザーを使用するには両方を空にしてください",passwordsDoNotMatch:"パスワードが一致しません",passwordMinLength:"パスワードは6文字以上必要です"}},users:{title:"ユーザー管理",description:"Bambuddyインスタンスのユーザーとアクセスを管理します",noPermission:"このページにアクセスする権限がありません。",backToSettings:"設定に戻る",createUser:"ユーザーを作成",deleteUser:"ユーザーを削除",deleteConfirmMessage:"このユーザーを削除してもよろしいですか?この操作は元に戻せません。",password:"パスワード",placeholderUsername:"ユーザー名を入力",placeholderPassword:"パスワードを入力",roleUser:"ユーザー",roleAdmin:"管理者",statusActive:"アクティブ",statusInactive:"非アクティブ",save:"保存",cancel:"キャンセル",edit:"編集",delete:"削除",creating:"作成中...",admin:"管理者",editUser:"ユーザーを編集",groups:"グループ",noGroups:"グループなし",noGroupsAvailable:"利用可能なグループがありません",confirmPassword:"パスワードの確認",placeholderNewPassword:"新しいパスワード",placeholderConfirmPassword:"パスワードの確認",placeholderConfirmNewPassword:"新しいパスワードの確認",leaveBlankToKeepCurrent:"現在のパスワードを維持する場合は空のままにしてください",saveChanges:"変更を保存",saving:"保存中...",system:"システム",table:{username:"ユーザー名",role:"ロール",status:"ステータス",actions:"アクション",groups:"グループ"},toast:{userCreated:"ユーザーが正常に作成されました",userUpdated:"ユーザーが正常に更新されました",userDeleted:"ユーザーが正常に削除されました",fillRequiredFields:"必須項目をすべて入力してください",passwordMinLength:"パスワードは6文字以上である必要があります",passwordsDoNotMatch:"パスワードが一致しません"}},upload:{title:"3MFファイルのアップロード",dragDrop:".3mfファイルをここにドラッグ&ドロップ",or:"または",browseFiles:"ファイルを参照",associatePrinter:"プリンターに関連付け(任意)",noPrinter:"プリンターなし",uploaded:"アップロード済み",failedCount:"失敗",filesUploaded:"{{count}}ファイルをアップロードしました",printerModelExtracted:"プリンターモデルは3MFメタデータから自動抽出されます",filesFailed:"{{count}}ファイルのアップロードに失敗しました",partialResult:"{{uploaded}}件アップロード、{{failed}}件失敗",failed:"アップロードに失敗しました",uploading:"アップロード中...",upload:"アップロード"},gcode:{loading:"G-codeを読み込み中...",notAvailable:"G-codeが利用できません",notSlicedMessage:"このファイルはまだスライスされていません。G-codeプレビューはBambu StudioまたはOrca Slicerでスライス後に利用可能です。",loadFailed:"G-codeの読み込みに失敗しました"},dashboard:{dragToReorder:"ドラッグして並べ替え",sizeClickCycle:"サイズ: {{size}} - クリックで変更",hideWidget:"ウィジェットを非表示",resetLayout:"レイアウトをリセット",hiddenCount:"{{count}}件非表示",hiddenWidgets:"非表示のウィジェット(クリックで表示):",allHidden:"すべてのウィジェットが非表示です。"},printerQueue:{nextInQueue:"次のキュー",asap:"即時",now:"今すぐ",inLessThanMin:"1分以内",inMinutes:"{{count}}分後",inHours:"{{count}}時間後"},smartPlug:{offline:"オフライン",admin:"管理",openAdminPage:"プラグの管理ページを開く",linkedTo:"接続先:",alerts:"アラート",automationSettings:"自動化設定",showInSwitchbar:"スイッチバーに表示",switchbarDesc:"サイドバーからクイックアクセス",enabledDesc:"このプラグの自動化を有効にする",autoOffDesc:"印刷完了後に自動オフ(1回のみ)",delayMode:"オフ遅延モード",temp:"温度",delayMinutes:"遅延(分)",tempThreshold:"温度しきい値(℃)",tempThresholdDesc:"ノズルがこの温度以下に冷えたらオフにします",deleteTitle:"スマートプラグを削除",deleteConfirm:'"{{name}}"を削除してもよろしいですか?この操作は元に戻せません。',turnOnTitle:"スマートプラグをオン",turnOnConfirm:'"{{name}}"をオンにしてもよろしいですか?',turnOn:"オン",turnOffTitle:"スマートプラグをオフ",turnOffConfirm:'"{{name}}"をオフにしてもよろしいですか?接続されたデバイスの電源が切断されます。',turnOff:"オフ",controlFailed:'"{{name}}"の{{action}}に失敗しました',monitorOnly:"モニタリングのみ",waiting:"データを待機中...",monitor:"モニター",power:"電力",kwhToday:"本日の消費電力",settings:"設定",smartSwitches:"スマートスイッチ",noSwitchesInSwitchbar:"スイッチバーに有効なスイッチがありません",enableInSettings:"設定 → スマートプラグで有効にしてください"},addSmartPlug:{addTitle:"スマートプラグを追加",editTitle:"スマートプラグを編集",tasmota:"Tasmota",homeAssistant:"Home Assistant",stopScanning:"スキャンを停止",discoverDevices:"Tasmotaデバイスを検出",scanningNetwork:"ネットワークをスキャン中...",foundDevices:"{{count}}台のデバイスが見つかりました - クリックして選択:",noDevicesFound:"ネットワーク上にTasmotaデバイスが見つかりません",failedToStartScan:"スキャンの開始に失敗しました",haNotConfigured:"Home Assistantが設定されていません。",haNotConfiguredPath:"設定 → ネットワーク → Home Assistant で設定してください",selectEntity:"エンティティを選択",chooseEntity:"エンティティを選択...",loadingEntities:"エンティティを読み込み中...",failedToLoadEntities:"エンティティの読み込みに失敗しました: {{error}}",searchEntities:"エンティティを検索...",noEntitiesMatching:"「{{search}}」に一致するエンティティが見つかりません",noEntitiesAvailable:"利用可能なエンティティがありません",searchingEntities:"すべてのエンティティを検索中({{count}}件見つかりました)",showingEntities:"switch、light、input_booleanを表示中({{count}}件利用可能)",energyMonitoring:"エネルギーモニタリング(任意)",energyMonitoringDescription:"電力/エネルギーデータを提供するセンサーを検索して選択します。",powerSensor:"電力センサー(W)",searchPowerSensors:"電力センサーを検索...",energyToday:"今日のエネルギー(kWh)",totalEnergy:"総エネルギー(kWh)",searchEnergySensors:"エネルギーセンサーを検索...",noMatchingSensors:"一致するセンサーがありません",ipAddress:"IPアドレス",ipAddressPlaceholder:"192.168.1.100",test:"テスト",connected:"接続されました!",device:"デバイス",state:"状態",connectionFailed:"接続に失敗しました",name:"名前",namePlaceholder:"リビングのプラグ",username:"ユーザー名",usernamePlaceholder:"admin",password:"パスワード",passwordPlaceholder:"********",authHint:"Tasmotaデバイスが認証を必要としない場合は空のままにしてください",linkToPrinter:"プリンターに連携",noPrinterOption:"プリンターなし(手動制御のみ)",linkToPrinterHint:"連携すると印刷の開始/完了時に自動オン/オフが有効になります",powerAlerts:"電力アラート",alertAbove:"超過時にアラート(W)",alertAbovePlaceholder:"例: 200",alertBelow:"下回った時にアラート(W)",alertBelowPlaceholder:"例: 10",powerAlertHint:"消費電力がこれらのしきい値を超えた/下回った場合に通知します。無効にするには空のままにしてください。",dailySchedule:"デイリースケジュール",turnOnAt:"オンにする時刻",turnOffAt:"オフにする時刻",scheduleHint:"毎日これらの時刻にプラグを自動的にオン/オフします。スキップするには空のままにしてください。",showInSwitchbar:"スイッチバーに表示",showInSwitchbarHint:"サイドバーからクイックアクセス",nameRequired:"名前は必須です",ipRequired:"Tasmotaプラグの場合、IPアドレスは必須です",entityRequired:"Home Assistantプラグの場合、エンティティは必須です",mqtt:"MQTT",mqttTopicRequired:"MQTTトピックは、電力、エネルギー、またはステートのいずれかを設定する必要があります",mqttBrokerNotConfigured:"MQTTブローカーが設定されていません。ブローカーアドレスを設定してください:",mqttBrokerNotConfiguredPath:"設定 → ネットワーク → MQTT発行",mqttBrokerNotConfiguredHint:"(パブリッシュを有効にする必要はありません。ブローカーの詳細を入力するだけです)。",mqttMonitorOnly:"モニタリングのみ",mqttMonitorOnlyDescription:"MQTTプラグはMQTTサブスクリプション経由で電力/エネルギーデータを受信します。オン/オフ制御はできません - MQTTブローカーまたはホームオートメーションシステムを使用してください。",mqttPowerMonitoring:"電力モニタリング",mqttEnergyMonitoring:"エネルギーモニタリング",mqttStateMonitoring:"ステートモニタリング",mqttTopic:"トピック",mqttJsonPath:"JSONパス",mqttMultiplier:"乗数",mqttOnValue:"ONの値",mqttPowerJsonPathHint:"JSONパスはJSONペイロードから値を抽出します(例:「power_l1」)。トピックが生の数値を発行する場合は空のままにしてください。",mqttPowerMultiplierHint:"乗数 0.001 で mW→W、1000 で kW→W に変換します。",mqttEnergyJsonPathHint:"JSONパスはJSONペイロードから値を抽出します。生の値の場合は空のままにしてください。",mqttEnergyMultiplierHint:"乗数 0.001 で Wh→kWh、1000 で MWh→kWh に変換します。",mqttStateJsonPathHint:"JSONパスはJSONペイロードから値を抽出します。生の値の場合は空のままにしてください。",mqttStateOnValueHint:"ONの値:「ON」を意味する正確な文字列。自動検出(ON、true、1)の場合は空のままにしてください。"},addNotification:{addTitle:"通知プロバイダーを追加",editTitle:"通知プロバイダーを編集",nameRequired:"名前は必須です",fieldRequired:"{{field}}は必須です",namePlaceholder:"マイ通知",providerType:"プロバイダータイプ",configuration:"設定",testConfiguration:"設定をテスト",printerFilter:"プリンターフィルター",allPrinters:"すべてのプリンター",printerFilterDesc:"このプリンターのイベントのみ通知を送信",quietHours:"サイレント時間(おやすみモード)",start:"開始",end:"終了",dailyDigest:"デイリーダイジェスト",dailyDigestDesc:"通知をまとめて1日1回のサマリーとして送信",sendDigestAt:"ダイジェスト送信時刻",digestDescription:"イベントを収集し、この時刻にまとめて送信します",notificationEvents:"通知イベント",printEvents:"印刷イベント",printerStatus:"プリンターステータス",events:{start:"開始",complete:"完了",failed:"失敗",stopped:"停止",progress:"進捗",offline:"オフライン",error:"エラー",lowFilament:"フィラメント残量少",maintenance:"メンテナンス"},config:{callmebot:{phoneNumber:"電話番号",apiKey:"APIキー",apiKeyPlaceholder:"CallMeBot APIキー"},ntfy:{serverUrl:"サーバーURL",topic:"トピック",authToken:"認証トークン",authTokenPlaceholder:"認証(任意)"},pushover:{userKey:"ユーザーキー",userKeyPlaceholder:"Pushoverユーザーキー",appToken:"アプリトークン",appTokenPlaceholder:"Pushoverアプリトークン",priority:"優先度",priorityPlaceholder:"0(通常)"},telegram:{botToken:"Botトークン",botTokenPlaceholder:"@BotFatherから取得したトークン",chatId:"チャットID",chatIdPlaceholder:"チャットまたはグループID"},email:{smtpServer:"SMTPサーバー",smtpPort:"SMTPポート",security:"セキュリティ",starttls:"STARTTLS(ポート587)",ssl:"SSL/TLS(ポート465)",securityNone:"なし(ポート25)",authentication:"認証",username:"ユーザー名",password:"パスワード",passwordPlaceholder:"アプリパスワード",fromEmail:"送信元メール",toEmail:"送信先メール"},discord:{webhookUrl:"Webhook URL"},webhook:{webhookUrl:"Webhook URL",payloadFormat:"ペイロード形式",genericJson:"汎用JSON",slackMattermost:"Slack / Mattermost",authorization:"認証",authorizationPlaceholder:"Bearerトークン(任意)",titleFieldName:"タイトルフィールド名",messageFieldName:"メッセージフィールド名"}}},pendingUploads:{title:"保留中のアップロード({{count}}件)",justNow:"たった今",minutesAgo:"{{count}}分前",hoursAgo:"{{count}}時間前",daysAgo:"{{count}}日前",fromSource:"{{ip}}から",archive:"アーカイブ",archiveAll:"すべてアーカイブ",discardAll:"すべて破棄",discard:"破棄",discardTitle:"アップロードを破棄",discardConfirm:'"{{filename}}"を破棄してもよろしいですか?この操作は元に戻せません。',tags:"タグ",tagsPlaceholder:"例: 機能部品、プロトタイプ、ギフト",notes:"メモ",notesPlaceholder:"この印刷についてメモを追加...",project:"プロジェクト",noProject:"プロジェクトなし",description:"これらのファイルはバーチャルプリンター経由でアップロードされました。確認してアーカイブし、コレクションに追加してください。",archiveAllTitle:"すべてのアップロードをアーカイブ",archiveAllConfirm:"保留中のアップロード{{count}}件をすべてアーカイブしてもよろしいですか?",discardAllTitle:"すべてのアップロードを破棄",discardAllConfirm:"保留中のアップロード{{count}}件をすべて破棄してもよろしいですか?この操作は元に戻せません。",archived:"アーカイブ済み: {{name}}",archiveFailed:"アーカイブに失敗しました",discarded:"アップロードを破棄しました",discardFailed:"破棄に失敗しました",archivedCount:"{{count}}ファイルをアーカイブしました",discardedCount:"{{count}}ファイルを破棄しました",archiveAllFailed:"すべてのアーカイブに失敗しました",discardAllFailed:"すべての破棄に失敗しました"},shortcuts:{title:"キーボードショートカット",navigation:"ナビゲーション",archives:"アーカイブ",profiles:"K-プロファイル",general:"一般",goToPrinters:"プリンターへ",goToArchives:"アーカイブへ",goToQueue:"キューへ",goToStatistics:"統計へ",goToProfiles:"クラウドプロファイルへ",goToSettings:"設定へ",openItem:"{{item}}を開く",goToItem:"{{item}}へ移動",focusSearch:"検索にフォーカス",openUpload:"アップロードダイアログを開く",clearSelection:"選択解除 / 入力をクリア",contextMenu:"カードのコンテキストメニュー",refreshProfiles:"プロファイルを更新",newProfile:"新しいプロファイル",exitSelection:"選択モードを終了",showHelp:"このヘルプを表示",pressKey:"押す",orClickToClose:"または外側をクリックで閉じる"},logViewer:{title:"アプリケーションログ",liveStreaming:"ライブストリーミング - {{count}}エントリ",description:"アプリケーションログの表示とフィルタ",live:"ライブ",stop:"停止",start:"開始",clear:"クリア",autoScroll:"自動スクロール",searchPlaceholder:"メッセージまたはロガー名で検索...",noEntries:"ログエントリが見つかりません",emptyLog:"ログファイルが空またはクリアされています",autoRefreshing:"2秒ごとに自動更新中",clickStart:"開始をクリックしてライブログストリーミングを有効にする"},editArchive:{title:"アーカイブを編集",name:"名前",printNamePlaceholder:"印刷名",printer:"プリンター",noPrinter:"プリンターなし",project:"プロジェクト",noProject:"プロジェクトなし",itemsPrinted:"印刷数",itemsPrintedDescription:"この印刷ジョブで生産されたアイテム数",notes:"メモ",notesPlaceholder:"この印刷についてメモを追加...",tags:"タグ",addTags:"タグを追加...",addMoreTags:"タグをさらに追加...",existingTagsHint:"既存のタグ(クリックで追加)",externalLink:"外部リンク",externalLinkPlaceholder:"https://...",externalLinkDescription:"MakerWorld、Printables、Thingiverseなどへのリンク",status:"ステータス",statusCompleted:"完了",statusFailed:"失敗",statusCancelled:"キャンセル",statusPrinting:"印刷中",failureReason:"失敗理由",selectReason:"理由を選択...",failureReasons:{adhesionFailure:"定着不良",spaghettiDetached:"スパゲッティ / 剥離",layerShift:"レイヤーシフト",cloggedNozzle:"ノズル詰まり",filamentRunout:"フィラメント切れ",warping:"反り",stringing:"糸引き",underExtrusion:"押出不足",powerFailure:"電源障害",userCancelled:"ユーザーによるキャンセル",other:"その他"},photos:"印刷結果の写真",printResult:"印刷結果",photosDescription:"+をクリックして印刷結果の写真を追加",saving:"保存中..."},mqttDebug:{title:"MQTTデバッグログ",empty:"<空>",startLogging:"ログ記録を開始",searchPlaceholder:"トピックまたはペイロードで検索...",incoming:"受信",outgoing:"送信",noMessages:"まだメッセージが記録されていません",clickStart:"「ログ記録を開始」をクリックしてMQTTメッセージの記録を開始",noMatch:"フィルタに一致するメッセージがありません",adjustFilter:"検索条件またはフィルタ条件を調整してみてください",loggingActive:"ログ記録中 - メッセージは自動更新されます",loggingStopped:"ログ記録停止"},archiveActions:{print:"印刷",schedule:"スケジュール",openInSlicer:"Bambu Studioで開く",slice:"スライス",viewMakerWorld:"MakerWorldで表示",preview3d:"3Dプレビュー",viewTimelapse:"タイムラプスを表示",scanTimelapse:"タイムラプスを検索",downloadSource3mf:"ソース3MFをダウンロード",uploadSource3mf:"ソース3MFをアップロード",replaceSource3mf:"ソース3MFを置換",removeSource3mf:"ソース3MFを削除",replaceF3d:"F3Dを置換",uploadF3d:"F3Dをアップロード",downloadF3d:"F3Dをダウンロード",removeF3d:"F3Dを削除",copyLink:"ダウンロードリンクをコピー",qrCode:"QRコード",viewPhotos:"写真を表示",projectPage:"プロジェクトページ",goToProject:"プロジェクトへ: {{name}}",addToProject:"プロジェクトに追加",removeFromProject:"プロジェクトから削除",noProjects:"利用可能なプロジェクトがありません",deselect:"選択解除",select:"選択",remove:"削除",source3mfAttached:"ソース3MFを添付しました: {{filename}}",source3mfUploadFailed:"ソース3MFのアップロードに失敗しました",source3mfRemoved:"ソース3MFを削除しました",source3mfRemoveFailed:"ソース3MFの削除に失敗しました",f3dAttached:"F3Dを添付しました: {{filename}}",f3dUploadFailed:"F3Dのアップロードに失敗しました",f3dRemoved:"F3Dを削除しました",f3dRemoveFailed:"F3Dの削除に失敗しました",timelapseAttached:"タイムラプスを添付しました: {{filename}}",timelapseExists:"タイムラプスは既に添付されています",noTimelapseFound:"一致するタイムラプスが見つかりません",timelapseScanFailed:"タイムラプスの検索に失敗しました",timelapseAttachFailed:"タイムラプスの添付に失敗しました",deleted:"アーカイブを削除しました",deleteFailed:"アーカイブの削除に失敗しました",addedToFavorites:"お気に入りに追加しました",removedFromFavorites:"お気に入りから削除しました",projectUpdated:"プロジェクトを更新しました",projectUpdateFailed:"プロジェクトの更新に失敗しました",linkCopied:"リンクをクリップボードにコピーしました",linkCopyFailed:"リンクのコピーに失敗しました",photoDeleted:"写真を削除しました",photoDeleteFailed:"写真の削除に失敗しました",deleteTitle:"アーカイブを削除",deleteConfirm:'"{{name}}"を削除してもよろしいですか?この操作は元に戻せません。',removeSource3mfTitle:"ソース3MFを削除",removeSource3mfConfirm:'"{{name}}"からソース3MFファイルを削除してもよろしいですか?元のスライサープロジェクトファイルが削除されます。',removeF3dTitle:"F3Dを削除",removeF3dConfirm:'"{{name}}"からFusion 360デザインファイルを削除してもよろしいですか?',selectTimelapse:"タイムラプスを選択",selectTimelapseDesc:"自動一致が見つかりませんでした。この印刷のタイムラプスを選択してください:"},camera:{camera:"カメラ",invalidPrinterId:"無効なプリンターID",printerFallback:"プリンター #{{id}}",live:"ライブ",snapshot:"スナップショット",restartStream:"ストリームを再開",refreshSnapshot:"スナップショットを更新",fullscreen:"フルスクリーン",exitFullscreen:"フルスクリーンを終了",connectingToCamera:"カメラに接続中...",capturingSnapshot:"スナップショットを撮影中...",connectionLost:"接続が切断されました",reconnectingIn:"{{seconds}}秒後に再接続します(試行{{attempt}}/{{maxAttempts}})",reconnectNow:"今すぐ再接続",cameraUnavailable:"カメラが利用できません",makeSurePrinterConnected:"プリンターが接続されていること、およびプリンター設定でカメラが有効になっていることを確認してください。",retry:"再試行",cameraStream:"カメラストリーム",zoomIn:"ズームイン",zoomOut:"ズームアウト",resetZoom:"ズームをリセット",skipBack:"5秒戻る",skipForward:"5秒進む",refreshStream:"ストリームを更新",dragToResize:"ドラッグしてリサイズ"},archiveCard:{slicedReady:"スライス済みファイル - 印刷可能",sourceOnly:"ソースファイルのみ - AMSマッピングなし",gcode:"GCODE",source:"ソース",layers:"レイヤー",objects:"{{count}}オブジェクト",objects_other:"{{count}}オブジェクト",cancelled:"キャンセル",failed:"失敗",duplicate:"重複"},providerCard:{last:"最終: ",lastSuccessAt:"最終: {{date}}",printer:"プリンター: ",allPrinters:"すべてのプリンター",tagStart:"開始",tagComplete:"完了",tagFailed:"失敗",tagStopped:"中止",tagProgress:"進捗",tagOffline:"オフライン",tagLowFilament:"フィラメント残量低下",tagMaintenance:"メンテナンス",tagAmsHumidity:"AMS湿度",tagAmsTemp:"AMS温度",tagAmsHtHumidity:"AMS-HT湿度",tagAmsHtTemp:"AMS-HT温度",quiet:"おやすみ",digest:"ダイジェスト ",digestAt:"ダイジェスト {{time}}",sendTest:"テスト通知を送信",eventSettings:"イベント設定",sendNotifications:"このプロバイダーから通知を送信",printEvents:"印刷イベント",printerStatus:"プリンターステータス",amsAlarms:"AMSアラーム",amsHumidityHigh:"AMS湿度高",amsHumidityHighDesc:"通常AMSの湿度がしきい値を超過",amsTempHigh:"AMS温度高",amsTempHighDesc:"通常AMSの温度がしきい値を超過",amsHtAlarms:"AMS-HTアラーム",amsHtHumidityHigh:"AMS-HT湿度高",amsHtHumidityHighDesc:"AMS-HTの湿度がしきい値を超過",amsHtTempHigh:"AMS-HT温度高",amsHtTempHighDesc:"AMS-HTの温度がしきい値を超過",noNotificationsDuring:"この時間帯は通知を送信しません",editQuietHours:"プロバイダーを編集しておやすみ時間を変更",dailyDigest:"デイリーダイジェスト",dailyDigestDesc:"通知を1日1回のサマリーにまとめる",sendAt:"送信時刻",editDigestTime:"プロバイダーを編集してダイジェスト時刻を変更",deleteTitle:"通知プロバイダーを削除",deleteConfirm:"「{{name}}」を削除してもよろしいですか?この操作は元に戻せません。"},projects:{title:"プロジェクト",subtitle:"印刷プロジェクトを管理",editProject:"プロジェクトを編集",newProject:"新規プロジェクト",namePlaceholder:"プロジェクト名",descriptionPlaceholder:"プロジェクトの説明(任意)",color:"色",targetPlates:"目標プレート数",targetPlatesPlaceholder:"例: 10",targetPlatesHint:"必要な印刷ジョブ/プレート数",targetParts:"目標パーツ数",targetPartsPlaceholder:"例: 50",targetPartsHint:"必要な個別パーツの総数",tags:"タグ",tagsPlaceholder:"カンマ区切りのタグ",dueDate:"期限",priorityLabel:"優先度",priority:{low:"低",normal:"通常",high:"高",urgent:"緊急"},status:{active:"進行中",completed:"完了",archived:"アーカイブ済み"},create:"作成",parts:"パーツ",plates:"プレート",failed:"失敗",completed:"完了",inQueue:"キュー内",noPrintsYet:"印刷履歴なし",more:"もっと見る",printJobsPlates:"印刷ジョブ / プレート",partsPrinted:"印刷済みパーツ",failedParts:"失敗パーツ",projectCreated:"プロジェクトを作成しました",projectUpdated:"プロジェクトを更新しました",projectDeleted:"プロジェクトを削除しました",all:"すべて",loading:"プロジェクトを読み込み中...",noProjectsYet:"プロジェクトがまだありません",noStatusProjects:"{{status}}のプロジェクトはありません",noProjectsHint:"プロジェクトを作成して印刷を整理・追跡しましょう",noStatusProjectsHint:"ステータスが「{{status}}」のプロジェクトはありません",createFirstProject:"最初のプロジェクトを作成",deleteProject:"プロジェクトを削除",deleteProjectConfirm:"このプロジェクトを削除しますか?この操作は取り消せません。",exportAllProjects:"すべてのプロジェクトをエクスポート",importProject:"プロジェクトをインポート",importFailed:"インポートに失敗しました",projectImported:"プロジェクトがインポートされました",projectsExported:"プロジェクトがエクスポートされました",noCreatePermission:"プロジェクトを作成する権限がありません",noDeletePermission:"プロジェクトを削除する権限がありません",noEditPermission:"プロジェクトを編集する権限がありません",noExportPermission:"プロジェクトをエクスポートする権限がありません",noImportPermission:"プロジェクトをインポートする権限がありません"},projectDetail:{statusActive:"進行中",statusCompleted:"完了",statusArchived:"アーカイブ済み",noPrintsYet:"印刷履歴なし",print:"印刷",unknown:"不明",priorityLow:"低",priorityNormal:"通常",priorityHigh:"高",priorityUrgent:"緊急",overdue:"期限超過",dueToday:"本日期限",daysLeft:"残り{{count}}日",projectUpdated:"プロジェクトを更新しました",partAdded:"パーツを追加しました",partRemoved:"パーツを削除しました",deletePart:"パーツを削除",deletePartConfirm:"「{{name}}」を削除しますか?",templateCreated:"プロジェクトからテンプレートを作成しました",error:"エラー",projectNotFound:"プロジェクトが見つかりません",backToProjects:"プロジェクト一覧に戻る",projects:"プロジェクト",edit:"編集",platesProgress:"プレート進捗",printJobs:"印刷ジョブ",percentComplete:"% 完了",remaining:"残り",partsProgress:"パーツ進捗",parts:"パーツ",printJobsCard:"印刷ジョブ",total:"合計",failed:"失敗",partsPrinted:"印刷済みパーツ",printTime:"印刷時間",filamentUsed:"フィラメント使用量",costTracking:"コスト追跡",filamentCost:"フィラメント",energy:"エネルギー",budget:"予算",budgetRemaining:"残り予算",subProjects:"サブプロジェクト ({{count}})",partOf:"所属先",priority:"優先度",notes:"メモ",cancel:"キャンセル",save:"保存",notesPlaceholder:"このプロジェクトについてメモを追加...",noNotesYet:"メモがありません。編集をクリックして追加してください。",files:"ファイル",linkFoldersFromFileManager:"ファイルマネージャーからフォルダーをリンク",toThisProjectForQuickAccess:"してクイックアクセス。",fileCount:"{{count}}ファイル",noFoldersLinked:"リンクされたフォルダーはありません",billOfMaterials:"部品表(BOM)",bomAcquired:"{{completed}}/{{total}} 取得済み",showAll:"すべて表示",hideDone:"完了を非表示",addPart:"パーツを追加",partNamePlaceholder:"パーツ名",qty:"数量",pricePlaceholder:"価格 ({{currency}})",sourcingUrlPlaceholder:"URL(任意)",remarksPlaceholder:"備考",delete:"削除",totalCost:"合計コスト",noBomParts:"BOMにパーツがありません",activityTimeline:"アクティビティタイムライン",noActivityYet:"アクティビティがありません",timelineEvents:{project_created:"プロジェクト作成",print_completed:"印刷完了",print_failed:"印刷失敗",print_started:"印刷開始",queued:"キューに追加"},saveAsTemplate:"テンプレートとして保存",queue:"キュー",viewAll:"すべて表示",printing:"印刷中",queued:"キュー内",prints:"{{count}}件の印刷",exportProject:"プロジェクトをエクスポート",exportFailed:"エクスポートに失敗しました",projectExported:"プロジェクトがエクスポートされました",noEditPermission:"このプロジェクトを編集する権限がありません",noAddPartsPermission:"パーツを追加する権限がありません",noDeletePartsPermission:"パーツを削除する権限がありません",noEditPartsPermission:"パーツを編集する権限がありません",noUpdatePartsPermission:"パーツを更新する権限がありません",noEditNotesPermission:"ノートを編集する権限がありません",noCreateTemplatesPermission:"テンプレートを作成する権限がありません",noExportPermission:"プロジェクトをエクスポートする権限がありません"},projectPage:{title:"プロジェクトページ",loadFailed:"プロジェクトページデータの読み込みに失敗",noData:"プロジェクトページデータがありません",noDataHint:"このプロジェクトにはMakerWorldページデータがありません",titleField:"タイトル",designer:"デザイナー",license:"ライセンス",description:"説明",descriptionPlaceholder:"プロジェクトの説明...",printProfile:"印刷プロファイル",profileTitle:"プロファイルタイトル",profileDescriptionPlaceholder:"プロファイルの説明",byUser:"{{name}} 作",images:"画像 ({{count}})",viewOnMakerWorld:"MakerWorldで表示"},batchProject:{addedToProject:"{{count}}件のアーカイブを「{{project}}」に追加しました",assignFailed:"プロジェクトへのアーカイブ割り当てに失敗しました",removedFromProject:"{{count}}件のアーカイブをプロジェクトから削除しました",removeFailed:"プロジェクトからのアーカイブ削除に失敗しました",assignTitle:"プロジェクトに割り当て",assignDescription:"{{count}}件の選択されたアーカイブのプロジェクトを選択:",removeFromProject:"プロジェクトから削除",clearAssignment:"選択されたアーカイブのプロジェクト割り当てを解除",orAssignTo:"または割り当て先:",archiveCount:"{{count}}件のアーカイブ",noProjects:"プロジェクトがありません。先にプロジェクトを作成してください。"},richTextEditor:{bold:"太字",italic:"斜体",underline:"下線",bulletList:"箇条書き",numberedList:"番号付きリスト",alignLeft:"左揃え",alignCenter:"中央揃え",alignRight:"右揃え",addLink:"リンクを追加",removeLink:"リンクを削除"},kProfiles:{editProfile:"K-プロファイルを編集",addProfile:"K-プロファイルを追加",hasNote:"メモあり",copyProfile:"プロファイルをコピー",profileNamePlaceholder:"マイPLAプロファイル",notesPlaceholder:"このプロファイルのメモを追加...",searchPlaceholder:"名前またはフィラメントで検索...",exportToJson:"JSONにエクスポート",importFromJson:"JSONからインポート",selectAllVisible:"表示中のプロファイルをすべて選択",enterSelectionMode:"一括削除の選択モードに入る",unnamed:"名前なし",notePrefix:"メモ: ",profileName:"プロファイル名",kValue:"K値",kValueRange:"一般的な範囲: PLA 0.01 - 0.06、PETG 0.02 - 0.10",filament:"フィラメント",selectFilament:"フィラメントを選択...",noFilamentsFound:"フィラメントが見つかりません。まずBambu StudioでKプロファイルを作成してください。",flowType:"フロータイプ",highFlow:"ハイフロー",standard:"スタンダード",nozzleSize:"ノズルサイズ",extruder:"エクストルーダー",extruders:"エクストルーダー",left:"左",right:"右",notesStoredLocally:"メモ(ローカル保存)",notesHint:"メモはBambuddyに保存され、プリンターには保存されません",deleteProfileTitle:"プロファイルを削除",cannotBeUndone:"この操作は元に戻せません",confirmDeleteProfile:'"{{name}}"をプリンターから削除してもよろしいですか?',profileSaved:"Kプロファイルを保存しました",profileDeleted:"Kプロファイルを削除しました",selectExtruder:"エクストルーダーを少なくとも1つ選択してください",profileSavedToExtruders:"Kプロファイルを{{count}}個のエクストルーダーに保存しました",failedToSave:"Kプロファイルの保存に失敗しました",syncingWithPrinter:"プリンターと同期中...",pleaseWait:"お待ちください",savingToExtruder:"エクストルーダー {{current}}/{{total}} に保存中...",noPrintersConfigured:"プリンターが設定されていません",addPrinterHint:"設定でプリンターを追加してKプロファイルを管理",noActivePrinters:"アクティブなプリンターがありません",enablePrinterHint:"プリンター接続を有効にしてKプロファイルを表示",loadingProfiles:"Kプロファイルを読み込み中...",nozzle:"ノズル",allExtruders:"すべてのエクストルーダー",leftOnly:"左のみ",rightOnly:"右のみ",allFlow:"すべてのフロー",hfOnly:"HFのみ",sOnly:"Sのみ",sortName:"ソート: 名前",sortKValue:"ソート: K値",sortFilament:"ソート: フィラメント",selectAll:"すべて選択",select:"選択",printerOffline:"プリンターオフライン",printerOfflineHint:"プリンターが接続されていません。電源を入れてKプロファイルを表示してください。",leftExtruder:"左エクストルーダー",rightExtruder:"右エクストルーダー",noMatchingProfiles:"一致するプロファイルなし",noProfilesMatch:"検索条件に一致するプロファイルがありません",noKProfiles:"Kプロファイルなし",noProfilesForNozzle:"{{diameter}}mmノズルの圧力キャリブレーションプロファイルが見つかりません",createFirstProfile:"最初のプロファイルを作成",deleteProfiles:"プロファイルを削除",confirmBulkDelete:"{{count}}件の選択されたプロファイルをプリンターから削除してもよろしいですか?",noProfilesToExport:"エクスポートするプロファイルがありません",exportedProfiles:"{{count}}件のプロファイルをエクスポートしました",invalidFileFormat:"無効なファイル形式",importedProfiles:"{{total}}件中{{imported}}件のプロファイルをインポートしました",failedToParseImport:"インポートファイルの解析に失敗しました",deletedProfiles:"{{count}}件のプロファイルを削除しました",failedToSaveNote:"メモの保存に失敗しました",noPermissionAdd:"K-プロファイルを追加する権限がありません",noPermissionDelete:"K-プロファイルを削除する権限がありません",noPermissionDeleteBulk:"K-プロファイルを一括削除する権限がありません",noPermissionExport:"K-プロファイルをエクスポートする権限がありません",noPermissionImport:"K-プロファイルをインポートする権限がありません",noPermissionRefresh:"K-プロファイルを更新する権限がありません"},apiBrowser:{validationError:"バリデーションエラー",missingRequiredParams:"必須パラメーターが不足: {{params}}",networkError:"ネットワークエラー",pathParameters:"パスパラメーター",queryParameters:"クエリパラメーター",selectOption:"-- 選択 --",requestBody:"リクエストボディ",execute:"実行",fillInRequired:"入力してください: {{params}}",response:"レスポンス",failedToFetchSchema:"OpenAPIスキーマの取得に失敗しました",failedToLoadSchema:"APIスキーマの読み込みに失敗しました",otherCategory:"その他",expandAll:"すべて展開",collapseAll:"すべて折りたたむ",swaggerUI:"Swagger UI",endpointCount:"{{categories}}カテゴリー内{{count}}エンドポイント"},githubBackup:{title:"GitHubバックアップ",enabled:"有効",cloudLoginRequired:"Bambu Cloudのログインが必要です。プロファイル → クラウドプロファイルからサインインしてGitHubバックアップを有効にしてください。",description:"プロファイルをプライベートGitHubリポジトリに自動同期し、バックアップとバージョン履歴を管理します。",repositoryUrl:"リポジトリURL",personalAccessToken:"パーソナルアクセストークン",saved:"保存済み",enterNewToken:"新しいトークンを入力して更新",tokenHint:"Contents読み取り/書き込み権限を持つFine-grainedトークン",branch:"ブランチ",autoBackup:"自動バックアップ",manualOnly:"手動のみ",hourly:"毎時",daily:"毎日",weekly:"毎週",includeInBackup:"バックアップに含める",kProfiles:"Kプロファイル",noPrintersConnected:"プリンター未接続",printersConnected:"{{connected}}/{{total}} 接続中",kProfilesDescription:"接続されたプリンターからの圧力前進キャリブレーション",cloudProfiles:"クラウドプロファイル",cloudProfilesDescription:"Bambu Cloudのフィラメント、プリンター、プロセスプリセット",appSettings:"アプリ設定",appSettingsDescription:"Bambuddyの設定(機密データを除く)",lastBackup:"最終バックアップ",noBackupsYet:"バックアップなし",next:"次回",startingBackup:"バックアップ開始中...",backupNow:"今すぐバックアップ",test:"テスト",enableBackup:"バックアップを有効化",testConnection:"接続テスト",history:"履歴",date:"日付",status:"ステータス",commit:"コミット",localBackup:"ローカルバックアップ",localDescription:"Bambuddyデータをローカルファイルとしてエクスポートまたはインポートし、手動バックアップや移行に利用できます。",exportData:"データエクスポート",exportDescription:"すべての設定、プリンター、プロファイルをダウンロード",importBackup:"バックアップのインポート",importDescription:"以前のエクスポートファイルから復元",tokenUpdated:"トークンを更新しました",settingsSaved:"設定を保存しました",failedToSave:"保存に失敗しました: {{error}}",backupEnabled:"GitHubバックアップを有効にしました",backupComplete:"バックアップ完了 - {{count}}ファイル更新",backupSkipped:"バックアップをスキップ - 変更なし",backupFailed:"バックアップに失敗しました: {{error}}",logsCleared:"{{count}}件のログを削除しました",failedToClearLogs:"ログの削除に失敗しました: {{error}}",enterRepoUrl:"リポジトリURLを入力してください",enterRepoUrlAndToken:"リポジトリURLとアクセストークンを入力してください",repoUrlRequired:"リポジトリURLは必須です",tokenRequired:"アクセストークンは必須です",backupDownloaded:"バックアップのダウンロードが完了しました",failedToCreateBackup:"バックアップの作成に失敗しました",backupRestored:"バックアップの復元が完了しました"}},Hse={en:{translation:Use},de:{translation:zse},ja:{translation:Bse}};_s.use(Aq).use(xse).init({resources:Hse,fallbackLng:"en",supportedLngs:["en","de","ja"],detection:{order:["localStorage","navigator","htmlTag"],lookupLocalStorage:"bambutrack_language",caches:["localStorage"]},interpolation:{escapeValue:!1},react:{useSuspense:!1}});const mz=[{code:"en",name:"English",nativeName:"English"},{code:"de",name:"German",nativeName:"Deutsch"},{code:"ja",name:"Japanese",nativeName:"日本語"}];var pz="popstate";function $se(t={}){function e(r,i){let{pathname:a,search:o,hash:l}=r.location;return eP("",{pathname:a,search:o,hash:l},i.state&&i.state.usr||null,i.state&&i.state.key||"default")}function n(r,i){return typeof i=="string"?i:H0(i)}return Gse(e,n,null,t)}function ni(t,e){if(t===!1||t===null||typeof t>"u")throw new Error(e)}function bo(t,e){if(!t){typeof console<"u"&&console.warn(e);try{throw new Error(e)}catch{}}}function Vse(){return Math.random().toString(36).substring(2,10)}function gz(t,e){return{usr:t.state,key:t.key,idx:e}}function eP(t,e,n=null,r){return{pathname:typeof t=="string"?t:t.pathname,search:"",hash:"",...typeof e=="string"?gx(e):e,state:n,key:e&&e.key||r||Vse()}}function H0({pathname:t="/",search:e="",hash:n=""}){return e&&e!=="?"&&(t+=e.charAt(0)==="?"?e:"?"+e),n&&n!=="#"&&(t+=n.charAt(0)==="#"?n:"#"+n),t}function gx(t){let e={};if(t){let n=t.indexOf("#");n>=0&&(e.hash=t.substring(n),t=t.substring(0,n));let r=t.indexOf("?");r>=0&&(e.search=t.substring(r),t=t.substring(0,r)),t&&(e.pathname=t)}return e}function Gse(t,e,n,r={}){let{window:i=document.defaultView,v5Compat:a=!1}=r,o=i.history,l="POP",c=null,u=d();u==null&&(u=0,o.replaceState({...o.state,idx:u},""));function d(){return(o.state||{idx:null}).idx}function f(){l="POP";let y=d(),v=y==null?null:y-u;u=y,c&&c({action:l,location:b.location,delta:v})}function p(y,v){l="PUSH";let S=eP(b.location,y,v);u=d()+1;let N=gz(S,u),T=b.createHref(S);try{o.pushState(N,"",T)}catch(k){if(k instanceof DOMException&&k.name==="DataCloneError")throw k;i.location.assign(T)}a&&c&&c({action:l,location:b.location,delta:1})}function m(y,v){l="REPLACE";let S=eP(b.location,y,v);u=d();let N=gz(S,u),T=b.createHref(S);o.replaceState(N,"",T),a&&c&&c({action:l,location:b.location,delta:0})}function x(y){return qse(y)}let b={get action(){return l},get location(){return t(i,o)},listen(y){if(c)throw new Error("A history only accepts one active listener");return i.addEventListener(pz,f),c=y,()=>{i.removeEventListener(pz,f),c=null}},createHref(y){return e(i,y)},createURL:x,encodeLocation(y){let v=x(y);return{pathname:v.pathname,search:v.search,hash:v.hash}},push:p,replace:m,go(y){return o.go(y)}};return b}function qse(t,e=!1){let n="http://localhost";typeof window<"u"&&(n=window.location.origin!=="null"?window.location.origin:window.location.href),ni(n,"No window.location.(origin|href) available to create URL");let r=typeof t=="string"?t:H0(t);return r=r.replace(/ $/,"%20"),!e&&r.startsWith("//")&&(r=n+r),new URL(r,n)}function Cq(t,e,n="/"){return Wse(t,e,n,!1)}function Wse(t,e,n,r){let i=typeof e=="string"?gx(e):e,a=Du(i.pathname||"/",n);if(a==null)return null;let o=jq(t);Kse(o);let l=null;for(let c=0;l==null&&c{let d={relativePath:u===void 0?o.path||"":u,caseSensitive:o.caseSensitive===!0,childrenIndex:l,route:o};if(d.relativePath.startsWith("/")){if(!d.relativePath.startsWith(r)&&c)return;ni(d.relativePath.startsWith(r),`Absolute route path "${d.relativePath}" nested under path "${r}" is not valid. An absolute child route path must start with the combined path of all its parent routes.`),d.relativePath=d.relativePath.slice(r.length)}let f=Mu([r,d.relativePath]),p=n.concat(d);o.children&&o.children.length>0&&(ni(o.index!==!0,`Index routes must not have child routes. Please remove all child routes from route path "${f}".`),jq(o.children,e,p,f,c)),!(o.path==null&&!o.index)&&e.push({path:f,score:toe(f,o.index),routesMeta:p})};return t.forEach((o,l)=>{if(o.path===""||!o.path?.includes("?"))a(o,l);else for(let c of Pq(o.path))a(o,l,!0,c)}),e}function Pq(t){let e=t.split("/");if(e.length===0)return[];let[n,...r]=e,i=n.endsWith("?"),a=n.replace(/\?$/,"");if(r.length===0)return i?[a,""]:[a];let o=Pq(r.join("/")),l=[];return l.push(...o.map(c=>c===""?a:[a,c].join("/"))),i&&l.push(...o),l.map(c=>t.startsWith("/")&&c===""?"/":c)}function Kse(t){t.sort((e,n)=>e.score!==n.score?n.score-e.score:noe(e.routesMeta.map(r=>r.childrenIndex),n.routesMeta.map(r=>r.childrenIndex)))}var Xse=/^:[\w-]+$/,Yse=3,Qse=2,Zse=1,Jse=10,eoe=-2,xz=t=>t==="*";function toe(t,e){let n=t.split("/"),r=n.length;return n.some(xz)&&(r+=eoe),e&&(r+=Qse),n.filter(i=>!xz(i)).reduce((i,a)=>i+(Xse.test(a)?Yse:a===""?Zse:Jse),r)}function noe(t,e){return t.length===e.length&&t.slice(0,-1).every((r,i)=>r===e[i])?t[t.length-1]-e[e.length-1]:0}function roe(t,e,n=!1){let{routesMeta:r}=t,i={},a="/",o=[];for(let l=0;l{if(d==="*"){let x=l[p]||"";o=a.slice(0,a.length-x.length).replace(/(.)\/+$/,"$1")}const m=l[p];return f&&!m?u[d]=void 0:u[d]=(m||"").replace(/%2F/g,"/"),u},{}),pathname:a,pathnameBase:o,pattern:t}}function ioe(t,e=!1,n=!0){bo(t==="*"||!t.endsWith("*")||t.endsWith("/*"),`Route path "${t}" will be treated as if it were "${t.replace(/\*$/,"/*")}" because the \`*\` character must always follow a \`/\` in the pattern. To get rid of this warning, please change the route path to "${t.replace(/\*$/,"/*")}".`);let r=[],i="^"+t.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(o,l,c)=>(r.push({paramName:l,isOptional:c!=null}),c?"/?([^\\/]+)?":"/([^\\/]+)")).replace(/\/([\w-]+)\?(\/|$)/g,"(/$1)?$2");return t.endsWith("*")?(r.push({paramName:"*"}),i+=t==="*"||t==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):n?i+="\\/*$":t!==""&&t!=="/"&&(i+="(?:(?=\\/|$))"),[new RegExp(i,e?void 0:"i"),r]}function aoe(t){try{return t.split("/").map(e=>decodeURIComponent(e).replace(/\//g,"%2F")).join("/")}catch(e){return bo(!1,`The URL path "${t}" could not be decoded because it is a malformed URL segment. This is probably due to a bad percent encoding (${e}).`),t}}function Du(t,e){if(e==="/")return t;if(!t.toLowerCase().startsWith(e.toLowerCase()))return null;let n=e.endsWith("/")?e.length-1:e.length,r=t.charAt(n);return r&&r!=="/"?null:t.slice(n)||"/"}var Dq=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,soe=t=>Dq.test(t);function ooe(t,e="/"){let{pathname:n,search:r="",hash:i=""}=typeof t=="string"?gx(t):t,a;if(n)if(soe(n))a=n;else{if(n.includes("//")){let o=n;n=n.replace(/\/\/+/g,"/"),bo(!1,`Pathnames cannot have embedded double slashes - normalizing ${o} -> ${n}`)}n.startsWith("/")?a=bz(n.substring(1),"/"):a=bz(n,e)}else a=e;return{pathname:a,search:uoe(r),hash:doe(i)}}function bz(t,e){let n=e.replace(/\/+$/,"").split("/");return t.split("/").forEach(i=>{i===".."?n.length>1&&n.pop():i!=="."&&n.push(i)}),n.length>1?n.join("/"):"/"}function YE(t,e,n,r){return`Cannot include a '${t}' character in a manually specified \`to.${e}\` field [${JSON.stringify(r)}]. Please separate it out to the \`to.${n}\` field. Alternatively you may provide the full path as a string in and the router will parse it for you.`}function loe(t){return t.filter((e,n)=>n===0||e.route.path&&e.route.path.length>0)}function mR(t){let e=loe(t);return e.map((n,r)=>r===e.length-1?n.pathname:n.pathnameBase)}function pR(t,e,n,r=!1){let i;typeof t=="string"?i=gx(t):(i={...t},ni(!i.pathname||!i.pathname.includes("?"),YE("?","pathname","search",i)),ni(!i.pathname||!i.pathname.includes("#"),YE("#","pathname","hash",i)),ni(!i.search||!i.search.includes("#"),YE("#","search","hash",i)));let a=t===""||i.pathname==="",o=a?"/":i.pathname,l;if(o==null)l=n;else{let f=e.length-1;if(!r&&o.startsWith("..")){let p=o.split("/");for(;p[0]==="..";)p.shift(),f-=1;i.pathname=p.join("/")}l=f>=0?e[f]:"/"}let c=ooe(i,l),u=o&&o!=="/"&&o.endsWith("/"),d=(a||o===".")&&n.endsWith("/");return!c.pathname.endsWith("/")&&(u||d)&&(c.pathname+="/"),c}var Mu=t=>t.join("/").replace(/\/\/+/g,"/"),coe=t=>t.replace(/\/+$/,"").replace(/^\/*/,"/"),uoe=t=>!t||t==="?"?"":t.startsWith("?")?t:"?"+t,doe=t=>!t||t==="#"?"":t.startsWith("#")?t:"#"+t,hoe=class{constructor(t,e,n,r=!1){this.status=t,this.statusText=e||"",this.internal=r,n instanceof Error?(this.data=n.toString(),this.error=n):this.data=n}};function foe(t){return t!=null&&typeof t.status=="number"&&typeof t.statusText=="string"&&typeof t.internal=="boolean"&&"data"in t}function moe(t){return t.map(e=>e.route.path).filter(Boolean).join("/").replace(/\/\/*/g,"/")||"/"}var Rq=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u";function Oq(t,e){let n=t;if(typeof n!="string"||!Dq.test(n))return{absoluteURL:void 0,isExternal:!1,to:n};let r=n,i=!1;if(Rq)try{let a=new URL(window.location.href),o=n.startsWith("//")?new URL(a.protocol+n):new URL(n),l=Du(o.pathname,e);o.origin===a.origin&&l!=null?n=l+o.search+o.hash:i=!0}catch{bo(!1,` contains an invalid URL which will probably break when clicked - please update to a valid URL path.`)}return{absoluteURL:r,isExternal:i,to:n}}Object.getOwnPropertyNames(Object.prototype).sort().join("\0");var Lq=["POST","PUT","PATCH","DELETE"];new Set(Lq);var poe=["GET",...Lq];new Set(poe);var xx=_.createContext(null);xx.displayName="DataRouter";var nN=_.createContext(null);nN.displayName="DataRouterState";var goe=_.createContext(!1),Fq=_.createContext({isTransitioning:!1});Fq.displayName="ViewTransition";var xoe=_.createContext(new Map);xoe.displayName="Fetchers";var boe=_.createContext(null);boe.displayName="Await";var wo=_.createContext(null);wo.displayName="Navigation";var Oy=_.createContext(null);Oy.displayName="Location";var fl=_.createContext({outlet:null,matches:[],isDataRoute:!1});fl.displayName="Route";var gR=_.createContext(null);gR.displayName="RouteError";var Iq="REACT_ROUTER_ERROR",yoe="REDIRECT",voe="ROUTE_ERROR_RESPONSE";function woe(t){if(t.startsWith(`${Iq}:${yoe}:{`))try{let e=JSON.parse(t.slice(28));if(typeof e=="object"&&e&&typeof e.status=="number"&&typeof e.statusText=="string"&&typeof e.location=="string"&&typeof e.reloadDocument=="boolean"&&typeof e.replace=="boolean")return e}catch{}}function _oe(t){if(t.startsWith(`${Iq}:${voe}:{`))try{let e=JSON.parse(t.slice(40));if(typeof e=="object"&&e&&typeof e.status=="number"&&typeof e.statusText=="string")return new hoe(e.status,e.statusText,e.data)}catch{}}function Soe(t,{relative:e}={}){ni(bx(),"useHref() may be used only in the context of a component.");let{basename:n,navigator:r}=_.useContext(wo),{hash:i,pathname:a,search:o}=Ly(t,{relative:e}),l=a;return n!=="/"&&(l=a==="/"?n:Mu([n,a])),r.createHref({pathname:l,search:o,hash:i})}function bx(){return _.useContext(Oy)!=null}function Mc(){return ni(bx(),"useLocation() may be used only in the context of a component."),_.useContext(Oy).location}var Uq="You should call navigate() in a React.useEffect(), not when your component is first rendered.";function zq(t){_.useContext(wo).static||_.useLayoutEffect(t)}function Nc(){let{isDataRoute:t}=_.useContext(fl);return t?Ioe():Moe()}function Moe(){ni(bx(),"useNavigate() may be used only in the context of a component.");let t=_.useContext(xx),{basename:e,navigator:n}=_.useContext(wo),{matches:r}=_.useContext(fl),{pathname:i}=Mc(),a=JSON.stringify(mR(r)),o=_.useRef(!1);return zq(()=>{o.current=!0}),_.useCallback((c,u={})=>{if(bo(o.current,Uq),!o.current)return;if(typeof c=="number"){n.go(c);return}let d=pR(c,JSON.parse(a),i,u.relative==="path");t==null&&e!=="/"&&(d.pathname=d.pathname==="/"?e:Mu([e,d.pathname])),(u.replace?n.replace:n.push)(d,u.state,u)},[e,n,a,i,t])}var Noe=_.createContext(null);function koe(t){let e=_.useContext(fl).outlet;return _.useMemo(()=>e&&_.createElement(Noe.Provider,{value:t},e),[e,t])}function rN(){let{matches:t}=_.useContext(fl),e=t[t.length-1];return e?e.params:{}}function Ly(t,{relative:e}={}){let{matches:n}=_.useContext(fl),{pathname:r}=Mc(),i=JSON.stringify(mR(n));return _.useMemo(()=>pR(t,JSON.parse(i),r,e==="path"),[t,i,r,e])}function Eoe(t,e){return Bq(t,e)}function Bq(t,e,n,r,i){ni(bx(),"useRoutes() may be used only in the context of a component.");let{navigator:a}=_.useContext(wo),{matches:o}=_.useContext(fl),l=o[o.length-1],c=l?l.params:{},u=l?l.pathname:"/",d=l?l.pathnameBase:"/",f=l&&l.route;{let S=f&&f.path||"";$q(u,!f||S.endsWith("*")||S.endsWith("*?"),`You rendered descendant (or called \`useRoutes()\`) at "${u}" (under ) but the parent route path has no trailing "*". This means if you navigate deeper, the parent won't match anymore and therefore the child routes will never render. + +Please change the parent to .`)}let p=Mc(),m;if(e){let S=typeof e=="string"?gx(e):e;ni(d==="/"||S.pathname?.startsWith(d),`When overriding the location using \`\` or \`useRoutes(routes, location)\`, the location pathname must begin with the portion of the URL pathname that was matched by all parent routes. The current pathname base is "${d}" but pathname "${S.pathname}" was given in the \`location\` prop.`),m=S}else m=p;let x=m.pathname||"/",b=x;if(d!=="/"){let S=d.replace(/^\//,"").split("/");b="/"+x.replace(/^\//,"").split("/").slice(S.length).join("/")}let y=Cq(t,{pathname:b});bo(f||y!=null,`No routes matched location "${m.pathname}${m.search}${m.hash}" `),bo(y==null||y[y.length-1].route.element!==void 0||y[y.length-1].route.Component!==void 0||y[y.length-1].route.lazy!==void 0,`Matched leaf route at location "${m.pathname}${m.search}${m.hash}" does not have an element or Component. This means it will render an with a null value by default resulting in an "empty" page.`);let v=Poe(y&&y.map(S=>Object.assign({},S,{params:Object.assign({},c,S.params),pathname:Mu([d,a.encodeLocation?a.encodeLocation(S.pathname.replace(/\?/g,"%3F").replace(/#/g,"%23")).pathname:S.pathname]),pathnameBase:S.pathnameBase==="/"?d:Mu([d,a.encodeLocation?a.encodeLocation(S.pathnameBase.replace(/\?/g,"%3F").replace(/#/g,"%23")).pathname:S.pathnameBase])})),o,n,r,i);return e&&v?_.createElement(Oy.Provider,{value:{location:{pathname:"/",search:"",hash:"",state:null,key:"default",...m},navigationType:"POP"}},v):v}function Toe(){let t=Foe(),e=foe(t)?`${t.status} ${t.statusText}`:t instanceof Error?t.message:JSON.stringify(t),n=t instanceof Error?t.stack:null,r="rgba(200,200,200, 0.5)",i={padding:"0.5rem",backgroundColor:r},a={padding:"2px 4px",backgroundColor:r},o=null;return console.error("Error handled by React Router default ErrorBoundary:",t),o=_.createElement(_.Fragment,null,_.createElement("p",null,"💿 Hey developer 👋"),_.createElement("p",null,"You can provide a way better UX than this when your app throws errors by providing your own ",_.createElement("code",{style:a},"ErrorBoundary")," or"," ",_.createElement("code",{style:a},"errorElement")," prop on your route.")),_.createElement(_.Fragment,null,_.createElement("h2",null,"Unexpected Application Error!"),_.createElement("h3",{style:{fontStyle:"italic"}},e),n?_.createElement("pre",{style:i},n):null,o)}var Aoe=_.createElement(Toe,null),Hq=class extends _.Component{constructor(t){super(t),this.state={location:t.location,revalidation:t.revalidation,error:t.error}}static getDerivedStateFromError(t){return{error:t}}static getDerivedStateFromProps(t,e){return e.location!==t.location||e.revalidation!=="idle"&&t.revalidation==="idle"?{error:t.error,location:t.location,revalidation:t.revalidation}:{error:t.error!==void 0?t.error:e.error,location:e.location,revalidation:t.revalidation||e.revalidation}}componentDidCatch(t,e){this.props.onError?this.props.onError(t,e):console.error("React Router caught the following error during render",t)}render(){let t=this.state.error;if(this.context&&typeof t=="object"&&t&&"digest"in t&&typeof t.digest=="string"){const n=_oe(t.digest);n&&(t=n)}let e=t!==void 0?_.createElement(fl.Provider,{value:this.props.routeContext},_.createElement(gR.Provider,{value:t,children:this.props.component})):this.props.children;return this.context?_.createElement(Coe,{error:t},e):e}};Hq.contextType=goe;var QE=new WeakMap;function Coe({children:t,error:e}){let{basename:n}=_.useContext(wo);if(typeof e=="object"&&e&&"digest"in e&&typeof e.digest=="string"){let r=woe(e.digest);if(r){let i=QE.get(e);if(i)throw i;let a=Oq(r.location,n);if(Rq&&!QE.get(e))if(a.isExternal||r.reloadDocument)window.location.href=a.absoluteURL||a.to;else{const o=Promise.resolve().then(()=>window.__reactRouterDataRouter.navigate(a.to,{replace:r.replace}));throw QE.set(e,o),o}return _.createElement("meta",{httpEquiv:"refresh",content:`0;url=${a.absoluteURL||a.to}`})}}return t}function joe({routeContext:t,match:e,children:n}){let r=_.useContext(xx);return r&&r.static&&r.staticContext&&(e.route.errorElement||e.route.ErrorBoundary)&&(r.staticContext._deepestRenderedBoundaryId=e.route.id),_.createElement(fl.Provider,{value:t},n)}function Poe(t,e=[],n=null,r=null,i=null){if(t==null){if(!n)return null;if(n.errors)t=n.matches;else if(e.length===0&&!n.initialized&&n.matches.length>0)t=n.matches;else return null}let a=t,o=n?.errors;if(o!=null){let d=a.findIndex(f=>f.route.id&&o?.[f.route.id]!==void 0);ni(d>=0,`Could not find a matching route for errors on route IDs: ${Object.keys(o).join(",")}`),a=a.slice(0,Math.min(a.length,d+1))}let l=!1,c=-1;if(n)for(let d=0;d=0?a=a.slice(0,c+1):a=[a[0]];break}}}let u=n&&r?(d,f)=>{r(d,{location:n.location,params:n.matches?.[0]?.params??{},unstable_pattern:moe(n.matches),errorInfo:f})}:void 0;return a.reduceRight((d,f,p)=>{let m,x=!1,b=null,y=null;n&&(m=o&&f.route.id?o[f.route.id]:void 0,b=f.route.errorElement||Aoe,l&&(c<0&&p===0?($q("route-fallback",!1,"No `HydrateFallback` element provided to render during initial hydration"),x=!0,y=null):c===p&&(x=!0,y=f.route.hydrateFallbackElement||null)));let v=e.concat(a.slice(0,p+1)),S=()=>{let N;return m?N=b:x?N=y:f.route.Component?N=_.createElement(f.route.Component,null):f.route.element?N=f.route.element:N=d,_.createElement(joe,{match:f,routeContext:{outlet:d,matches:v,isDataRoute:n!=null},children:N})};return n&&(f.route.ErrorBoundary||f.route.errorElement||p===0)?_.createElement(Hq,{location:n.location,revalidation:n.revalidation,component:b,error:m,children:S(),routeContext:{outlet:null,matches:v,isDataRoute:!0},onError:u}):S()},null)}function xR(t){return`${t} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}function Doe(t){let e=_.useContext(xx);return ni(e,xR(t)),e}function Roe(t){let e=_.useContext(nN);return ni(e,xR(t)),e}function Ooe(t){let e=_.useContext(fl);return ni(e,xR(t)),e}function bR(t){let e=Ooe(t),n=e.matches[e.matches.length-1];return ni(n.route.id,`${t} can only be used on routes that contain a unique "id"`),n.route.id}function Loe(){return bR("useRouteId")}function Foe(){let t=_.useContext(gR),e=Roe("useRouteError"),n=bR("useRouteError");return t!==void 0?t:e.errors?.[n]}function Ioe(){let{router:t}=Doe("useNavigate"),e=bR("useNavigate"),n=_.useRef(!1);return zq(()=>{n.current=!0}),_.useCallback(async(i,a={})=>{bo(n.current,Uq),n.current&&(typeof i=="number"?await t.navigate(i):await t.navigate(i,{fromRouteId:e,...a}))},[t,e])}var yz={};function $q(t,e,n){!e&&!yz[t]&&(yz[t]=!0,bo(!1,n))}_.memo(Uoe);function Uoe({routes:t,future:e,state:n,onError:r}){return Bq(t,void 0,n,r,e)}function Fg({to:t,replace:e,state:n,relative:r}){ni(bx()," may be used only in the context of a component.");let{static:i}=_.useContext(wo);bo(!i," must not be used on the initial render in a . This is a no-op, but you should modify your code so the is only ever rendered in response to some user interaction or state change.");let{matches:a}=_.useContext(fl),{pathname:o}=Mc(),l=Nc(),c=pR(t,mR(a),o,r==="path"),u=JSON.stringify(c);return _.useEffect(()=>{l(JSON.parse(u),{replace:e,state:n,relative:r})},[l,u,r,e,n]),null}function zoe(t){return koe(t.context)}function Li(t){ni(!1,"A is only ever to be used as the child of element, never rendered directly. Please wrap your in a .")}function Boe({basename:t="/",children:e=null,location:n,navigationType:r="POP",navigator:i,static:a=!1,unstable_useTransitions:o}){ni(!bx(),"You cannot render a inside another . You should never have more than one in your app.");let l=t.replace(/^\/*/,"/"),c=_.useMemo(()=>({basename:l,navigator:i,static:a,unstable_useTransitions:o,future:{}}),[l,i,a,o]);typeof n=="string"&&(n=gx(n));let{pathname:u="/",search:d="",hash:f="",state:p=null,key:m="default"}=n,x=_.useMemo(()=>{let b=Du(u,l);return b==null?null:{location:{pathname:b,search:d,hash:f,state:p,key:m},navigationType:r}},[l,u,d,f,p,m,r]);return bo(x!=null,` is not able to match the URL "${u}${d}${f}" because it does not start with the basename, so the won't render anything.`),x==null?null:_.createElement(wo.Provider,{value:c},_.createElement(Oy.Provider,{children:e,value:x}))}function Hoe({children:t,location:e}){return Eoe(tP(t),e)}function tP(t,e=[]){let n=[];return _.Children.forEach(t,(r,i)=>{if(!_.isValidElement(r))return;let a=[...e,i];if(r.type===_.Fragment){n.push.apply(n,tP(r.props.children,a));return}ni(r.type===Li,`[${typeof r.type=="string"?r.type:r.type.name}] is not a component. All component children of must be a or `),ni(!r.props.index||!r.props.children,"An index route cannot have child routes.");let o={id:r.props.id||a.join("-"),caseSensitive:r.props.caseSensitive,element:r.props.element,Component:r.props.Component,index:r.props.index,path:r.props.path,middleware:r.props.middleware,loader:r.props.loader,action:r.props.action,hydrateFallbackElement:r.props.hydrateFallbackElement,HydrateFallback:r.props.HydrateFallback,errorElement:r.props.errorElement,ErrorBoundary:r.props.ErrorBoundary,hasErrorBoundary:r.props.hasErrorBoundary===!0||r.props.ErrorBoundary!=null||r.props.errorElement!=null,shouldRevalidate:r.props.shouldRevalidate,handle:r.props.handle,lazy:r.props.lazy};r.props.children&&(o.children=tP(r.props.children,a)),n.push(o)}),n}var f1="get",m1="application/x-www-form-urlencoded";function iN(t){return typeof HTMLElement<"u"&&t instanceof HTMLElement}function $oe(t){return iN(t)&&t.tagName.toLowerCase()==="button"}function Voe(t){return iN(t)&&t.tagName.toLowerCase()==="form"}function Goe(t){return iN(t)&&t.tagName.toLowerCase()==="input"}function qoe(t){return!!(t.metaKey||t.altKey||t.ctrlKey||t.shiftKey)}function Woe(t,e){return t.button===0&&(!e||e==="_self")&&!qoe(t)}function nP(t=""){return new URLSearchParams(typeof t=="string"||Array.isArray(t)||t instanceof URLSearchParams?t:Object.keys(t).reduce((e,n)=>{let r=t[n];return e.concat(Array.isArray(r)?r.map(i=>[n,i]):[[n,r]])},[]))}function Koe(t,e){let n=nP(t);return e&&e.forEach((r,i)=>{n.has(i)||e.getAll(i).forEach(a=>{n.append(i,a)})}),n}var jw=null;function Xoe(){if(jw===null)try{new FormData(document.createElement("form"),0),jw=!1}catch{jw=!0}return jw}var Yoe=new Set(["application/x-www-form-urlencoded","multipart/form-data","text/plain"]);function ZE(t){return t!=null&&!Yoe.has(t)?(bo(!1,`"${t}" is not a valid \`encType\` for \`
\`/\`\` and will default to "${m1}"`),null):t}function Qoe(t,e){let n,r,i,a,o;if(Voe(t)){let l=t.getAttribute("action");r=l?Du(l,e):null,n=t.getAttribute("method")||f1,i=ZE(t.getAttribute("enctype"))||m1,a=new FormData(t)}else if($oe(t)||Goe(t)&&(t.type==="submit"||t.type==="image")){let l=t.form;if(l==null)throw new Error('Cannot submit a