export default {
  // Navigation
  nav: {
    printers: 'プリンター',
    archives: 'アーカイブ',
    queue: '印刷キュー',
    stats: '統計',
    profiles: 'プロファイル',
    maintenance: 'メンテナンス',
    projects: 'プロジェクト',
    inventory: 'フィラメント',
    finance: 'ファイナンス',
    files: 'ファイル管理',
    makerworld: 'MakerWorld',
    notifications: '通知',
    settings: '設定',
    system: 'システム',
    collapseSidebar: 'サイドバーを閉じる',
    expandSidebar: 'サイドバーを開く',
    update: 'アップデート',
    updateAvailable: 'アップデートあり: v{{version}}',
    updateAvailableBanner: 'バージョン {{version}} が利用可能です！',
    viewUpdate: 'アップデートを表示',
    viewOnGithub: 'GitHubで表示',
    keyboardShortcuts: 'キーボードショートカット (?)',
    switchToLight: 'ライトモードに切替',
    switchToDark: 'ダークモードに切替',
    switchToSystem: 'システムモードに切替',
    smartSwitches: 'スマートスイッチ',
    logout: 'ログアウト',
    installApp: 'アプリをインストール',
    installAppSuccess: 'Bambuddyをインストールしました',
  },

  // Common
  common: {
    plusNMore: '他{{count}}件',
    save: '保存',
    saving: '保存中...',
    cancel: 'キャンセル',
    delete: '削除',
    edit: '編集',
    add: '追加',
    close: '閉じる',
    confirm: '確認',
    loading: '読み込み中...',
    error: 'エラー',
    errorLoading: 'データの読み込みエラー',
    retry: '再試行',
    success: '成功',
    warning: '警告',
    enabled: '有効',
    disabled: '無効',
    yes: 'はい',
    no: 'いいえ',
    on: 'オン',
    off: 'オフ',
    all: 'すべて',
    none: 'なし',
    search: '検索',
    filter: 'フィルター',
    sort: '並べ替え',
    refresh: '更新',
    download: 'ダウンロード',
    upload: 'アップロード',
    uploading: 'アップロード中...',
    uploadFailed: 'アップロード失敗',
    actions: '操作',
    status: 'ステータス',
    name: '名前',
    description: '説明',
    date: '日付',
    time: '時間',
    hours: '時間',
    minutes: '分',
    seconds: '秒',
    days: '日',
    enable: '有効化',
    disable: '無効にする',
    permissions: '権限',
    noPrinters: 'プリンターが登録されていません',
    noData: 'データがありません',
    linkNotFound: 'リンクが見つかりません',
    required: '必須',
    optional: 'オプション',
    dismiss: '閉じる',
    apply: '適用',
    reset: 'リセット',
    export: 'エクスポート',
    import: 'インポート',
    clear: 'クリア',
    selectAll: 'すべて選択',
    deselectAll: 'すべて選択解除',
    noChange: '— 変更なし —',
    unchanged: '変更なし',
    unassigned: '未割当',
    unknown: '不明',
    unknownError: '不明なエラー',
    today: '今日',
    tomorrow: '明日',
    asap: '即時',
    overdue: '期限超過',
    now: '今すぐ',
    collapse: '折りたたむ',
    expand: '展開',
    previous: '前へ',
    next: '次へ',
    viewArchive: 'アーカイブを表示',
    viewInFileManager: 'ファイルマネージャーで表示',
    addedBy: '{{username}}が追加',
    prints: 'プリント',
    more: '+{{count}}件',
    ascending: '昇順',
    descending: '降順',
    back: '戻る',
    copy: 'コピー',
    copied: 'コピーしました!',
    printer: 'プリンター',
    remove: '削除',
    type: '種類',
    print: '印刷',
    rename: '名前変更',
    move: '移動',
    create: '作成',
    duplicate: '複製',
    left: '左',
    right: '右',
    user: 'ユーザー',
    run: '実行',
    running: '実行中...',
  },

  finance: {
    allTypes: 'すべてのタイプ',
    allCostCenters: 'すべてのコストセンター',
    title: 'ファイナンス',
    subtitle: 'ウォレット、個人トランザクション、およびコストセンター',
    noAccess: '財務データを表示する権限がありません。',
    personalView: '個人ビュー',
    adminView: '管理者ビュー',
    createCostCenter: 'コストセンターを作成',
    adjustWallet: 'ウォレットを調整',
    addManualPrint: '手動プリントを追加',
    manageMembers: 'コストセンターメンバーを管理',
    currentBalance: '個人残高',
    transactions: 'トランザクション',
    personalTransactions: '個人トランザクション',
    costCenters: 'コストセンター',
    availableForPrinting: 'プリント割り当てが可能',
    costCenterName: '名前',
    budgetType: '予算タイプ',
    monthlyBudget: '月間予算',
    totalBudget: '総予算',
    noBudget: '予算なし',
    create: '作成',
    selectUser: 'ユーザーを選択',
    transactionType: 'タイプ',
    amount: '金額',
    noCostCenter: 'コストセンターなし',
    descriptionOptional: '説明（オプション）',
    applyAdjustment: '調整を適用',
    memberCanPrint: 'メンバーはプリント可能',
    addMember: 'メンバーを追加',
    canPrint: 'プリント可能',
    noMembers: '割り当てられたメンバーはありません。',
    editCostCenter: 'コストセンターを編集',
    myCostCenters: 'マイコストセンター',
    costCentersHint: '予算限度額を確認し、コストを管理下に置きます',
    noCostCenters: 'コストセンターが見つかりません。',
    owner: '所有者',
    balance: '口座残高',
    unlimited: '無制限',
    budgetPolicyHint: '口座残高はコストの記録に使用されます。印刷は選択したコストセンターの予算によってのみ制限され、予算がなければ無制限です。',
    budget: '予算',
    shared: '共有',
    cannotEditPrivateCostCenter: 'プライベートコストセンターはここで編集できません',
    recentTransactions: '最近のトランザクション',
    transactionsHint: 'タイプとコストセンターでフィルタリングしてから、ページを移動します',
    first: '最初',
    prev: '前へ',
    next: '次へ',
    last: '最後',
    pageNumberOf: 'ページ {{page}} / {{total}}',
    noTransactions: '利用可能なトランザクションはありません。',
    noTransactionsForFilter: '選択したフィルターに一致するトランザクションはありません。',
    costCenter: 'コストセンター',
    balanceAfter: '調整後残高',
    userWithId: 'ユーザー #{{id}}',
    partial: '部分',
    editTransaction: 'トランザクションを編集',
    selectCostCenter: 'コストセンターを選択...',
    costCenterRequired: 'コストセンターを選択してください',
    amountExample: '例：4.00',
    manualAdjustmentExample: '例：手動調整',
    userRequired: 'ユーザーを選択してください',
    amountInvalid: '金額は有効な数値である必要があります',
    createdCostCenter: 'コストセンターが作成されました',
    createCostCenterFailed: 'コストセンターの作成に失敗しました',
    transactionDeleted: 'トランザクションが削除されました',
    deleteTransactionFailed: 'トランザクションの削除に失敗しました',
    transactionEdited: 'トランザクションが更新され、レジャーが再計算されました',
    editTransactionFailed: 'トランザクションの編集に失敗しました',
    manualPrintCreated: '手動プリント料金が追加され、レジャーが再計算されました',
    manualPrintFailed: '手動プリントの作成に失敗しました',
    memberSaved: 'メンバーが保存されました',
    memberSaveFailed: 'メンバーの保存に失敗しました',
    memberRemoved: 'メンバーが削除されました',
    memberRemoveFailed: 'メンバーの削除に失敗しました',
    costCenterNameRequired: 'コストセンター名は必須です',
    costCenterUpdated: 'コストセンターが更新されました',
    costCenterUpdateFailed: 'コストセンターの更新に失敗しました',
    confirmDeleteCostCenter: 'コストセンター "{{name}}" を削除しますか？',
    costCenterDeleted: 'コストセンターが削除されました',
    costCenterDeleteFailed: 'コストセンターの削除に失敗しました',
    deleteTransactionConfirm: 'このトランザクションを削除しますか？残高は自動的に再計算されます。',
    deposit: '預金',
    withdraw: '引き出し',
    printCharge: 'プリント料金',
    deleteTransaction: 'トランザクションを削除',
  },
  // Printers page
  printers: {
    addPreflight: {
      checking: '接続を確認しています...',
      warning: '一部の接続チェックに失敗しました。このプリンターはオフラインと表示される可能性があります。下のチェックを確認し、可能な範囲で修正するか、そのまま保存してください。',
      back: '戻る',
      saveAnyway: 'そのまま保存',
    },
    title: 'プリンター',
    addPrinter: 'プリンターを追加',
    editPrinter: 'プリンターを編集',
    deletePrinter: 'プリンターを削除',
    printerName: 'プリンター名',
    serialNumber: 'シリアル番号',
    ipAddress: 'IPアドレス / ホスト名',
    accessCode: 'アクセスコード',
    model: 'モデル',
    nozzleCount: 'ノズル数',
    autoArchive: '自動アーカイブ',
    status: {
      available: '利用可能',
      idle: '待機中',
      printing: '印刷中',
      paused: '一時停止',
      offline: 'オフライン',
      problem: '問題',
      error: 'エラー',
      finished: '完了',
      unknown: '不明',
    },
    temperatures: {
      nozzle: 'ノズル',
      bed: 'ベッド',
      chamber: 'チャンバー',
    },
    heaterHistory: {
      title: 'ヒーター履歴',
      openLabel: 'ヒーター履歴を表示',
      nozzle: 'ノズル',
      nozzle2: 'ノズル 2',
      bed: 'ベッド',
      chamber: 'チャンバー',
      error: '履歴を読み込めませんでした',
      empty: 'まだデータが記録されていません',
    },
    progress: '{{percent}}% 完了',
    timeRemaining: '残り {{time}}',
    deleteConfirm: '「{{name}}」を削除しますか？',
    maintenanceOk: 'メンテナンス正常',
    maintenanceWarning: '{{count}}件の警告',
    maintenanceWarning_plural: '{{count}}件の警告',
    maintenanceDue: '{{count}}件のメンテナンス期限',
    maintenanceDue_plural: '{{count}}件の期限',
    // Sort options
    sort: {
      name: '名前',
      status: 'ステータス',
      model: 'モデル',
      location: 'ロケーション',
      eta: '残り時間',
      ascending: '昇順で並べ替え',
      descending: '降順で並べ替え',
    },
    // Card size
    cardSize: {
      small: '小',
      medium: '中',
      large: '大',
      extraLarge: '特大',
    },
    pageView: {
      openCamWallPage: 'カメラウォールをページとして開く',
      cards: 'カード',
      camWall: 'カメラウォール',
    },
    camWall: {
      page: {
        tokenRejected:
          'このカメラウォールのリンクは無効です。トークンの有効期限が切れたか、取り消された可能性があります。',
        loadFailed: 'プリンターを読み込めませんでした。',
      },
      noPrinters: '表示するプリンターがありません',
      noSignal: '信号なし',
      live: 'ライブ',
      snap: 'スナップ',
      off: 'オフ',
      summary: 'ライブ {{live}}件、スナップ {{snap}}件、合計 {{total}}件',
      layer: 'レイヤー {{cur}}/{{total}}',
      timeLeft: '残り {{time}}',
      statusMode: {
        off: 'オフ',
        compact: 'コンパクト',
        full: 'フル',
      },
      settings: {
        title: 'カメラウォール設定',
        maxLive: '最大ライブ配信数',
        maxLiveHint: '同時にライブ配信するタイル数。残りはスナップショットとして更新されます。',
        snapshotInterval: 'スナップショット間隔（秒）',
        snapshotIntervalHint: '非ライブのタイルが新しいスナップショットを取得する頻度。',
        statusOverlay: 'ステータス表示',
        statusOverlayHint: 'コンパクト：状態バッジのみ。フル：＋進捗・レイヤー・残り時間。',
      },
    },
    // Controls
    hideOffline: 'オフラインを非表示',
    nextAvailable: '次に完了',
    powerOn: '電源オン',
    offlinePrintersWithPlugs: 'スマートプラグ付きオフラインプリンター',
    noPrintersConfigured: 'プリンターが設定されていません',
    search: 'プリンターを検索...',
    noSearchResults: '検索またはフィルターに一致するプリンターがありません',
    filter: {
      allStatuses: 'すべてのステータス',
      allLocations: 'すべての場所',
    },
    toolbar: {
      filters: 'フィルター',
      view: '表示',
      actions: '操作',
    },
    // Printer card
    readyToPrint: '印刷可能',
    external: '外部',
    extL: 'Ext-L',
    extR: 'Ext-R',
    deleteArchives: '印刷アーカイブを削除',
    noLabel: 'ラベルなし',
    printPreview: '印刷プレビュー',
    width: '幅',
    height: '高さ',
    noObjectsFound: 'オブジェクトが見つかりません',
    objectsLoadedOnPrintStart: 'オブジェクトは印刷開始時に読み込まれます',
    willBeSkipped: 'スキップされます',
    name: '名前',
    serialCannotBeChanged: 'シリアル番号は変更できません',
    locationHelp: 'プリンターのグループ化とキュージョブのフィルタリングに使用',
    // WiFi signal strength
    wifiSignal: {
      veryWeak: '非常に弱い',
      weak: '弱い',
      fair: '注意',
      good: '良好',
      excellent: '非常に良い',
    },
    // Maintenance
    maintenanceUpToDate: 'すべてのメンテナンスが最新です',
    maintenance: {
      title: 'メンテナンス中',
      subtitle: 'このプリンターは一時停止中です — 未接続、キュー対象外、通知も送信されません。',
      pillLabel: 'メンテナンス',
      exitButton: 'メンテナンスを終了',
      menuEnter: 'メンテナンスモードに入る',
      menuExit: 'メンテナンスモードを終了',
      toastEntered: '{{name}} はメンテナンスモードになりました',
      toastExited: '{{name}} がオンラインに戻りました',
      confirmMidPrintTitle: '印刷中にメンテナンスモードに入りますか？',
      confirmMidPrintMessage: '{{name}} は現在印刷中です。メンテナンスモードに入るとMQTTが切断され、このジョブの進行状況の追跡と完了通知が停止します。続行しますか？',
      editFieldLabel: 'メンテナンスモード',
      editFieldHelp: '有効にすると、このプリンターはMQTT、キューディスパッチ、通知から一時停止されます — 修理、並列のBambuddyインストール、または一時的な停止に役立ちます。',
    },
    // Chamber light
    chamberLightOn: 'チャンバーライトをオンにしました',
    chamberLightOff: 'チャンバーライトをオフにしました',
    // Files
    files: 'ファイル',
    browseFiles: 'プリンターのファイルを参照',
    // Smart plug
    autoOffAfterPrint: '印刷後に自動電源オフ',
    autoOffExecuted: '自動オフが実行されました - リセットするにはプリンターの電源を入れてください',
    // HMS errors
    hmsErrors: 'クリックしてHMSエラーを表示',
    viewHmsErrors: '{{count}}件のHMSエラーを表示',
    // Actions
    resume: '再開',
    pause: '一時停止',
    stop: '停止',
    camera: 'カメラ',
    skipObject: 'オブジェクトスキップ',
    reconnect: '再接続',
    forceRefresh: '強制更新',
    forceRefreshSuccess: '更新をリクエストしました',
    mqttDebug: 'MQTTデバッグ',
    printerInformation: 'プリンター情報',
    copyToClipboard: 'コピー',
    copied: 'コピーしました！',
    state: '状態',
    wifiSignalLabel: 'WiFi信号',
    developerMode: '開発者モード',
    enabled: '有効',
    disabled: '無効',
    addedOn: '追加日',
    sdCard: 'SDカード',
    inserted: '挿入済み',
    notInserted: '未挿入',
    totalPrintHours: '印刷時間',
    activeNozzle: 'アクティブ: {{nozzle}}ノズル',
    nozzleRack: 'ノズルラック',
    nozzleDocked: 'ドッキング中',
    nozzleMounted: 'マウント中',
    nozzleActive: 'アクティブ',
    nozzleIdle: 'アイドル',
    nozzleDiameter: '直径',
    nozzleType: 'タイプ',
    nozzleStatus: 'ステータス',
    nozzleFilament: 'フィラメント',
    nozzleWear: '摩耗',
    nozzleMaxTemp: '最高温度',
    nozzleSerial: 'シリアル',
    nozzleHardenedSteel: '焼入れ鋼',
    nozzleStainlessSteel: 'ステンレス鋼',
    nozzleTungstenCarbide: 'タングステンカーバイド',
    nozzleFlow: 'フロー',
    nozzleHighFlow: 'ハイフロー',
    nozzleStandardFlow: 'スタンダード',
    // Firmware
    firmwareUpdate: 'ファームウェアアップデート',
    firmwareInstructions: 'プリンターのタッチスクリーンで',
    firmwareNav: 'に移動',
    settings: '設定',
    firmware: 'ファームウェア',
    // Discovery
    discoverPrinters: 'プリンターを検出',
    searching: '検索中...',
    manualEntry: '手動入力',
    addFromCloud: 'クラウドから追加',
    // Toast messages
    toast: {
      printerDeleted: 'プリンターを削除しました',
      missingSpoolAssignment: '{{printer}}で印刷を開始しました。以下のスプール割り当てがありません: {{slots}}',
      killSwitchTriggered: '課金キルスイッチが{{printer}}で未承認の印刷を停止しました：{{filename}}',
      billingChargeFailed: '{{printer}} の {{filename}} を課金できませんでした。予算予約は保持されています。サーバーログを確認してください。',
      assignmentVerified: 'スロット{{slot}}にフィラメントを読み込みました（{{printer}}）',
      assignmentVerifiedNoKprofile: '{{printer}}のスロット{{slot}}を読み込みましたが、フロー校正プロファイル（Kプロファイル）は適用されませんでした',
      assignmentNotConfirmed: '{{printer}}のスロット{{slot}}の割り当てを確認できませんでした。AMSスロットを確認してください',
      printerAdded: 'プリンターを追加しました',
      printerUpdated: 'プリンターを更新しました',
      failedToDelete: 'プリンターの削除に失敗しました',
      failedToAdd: 'プリンターの追加に失敗しました',
      connectionFailedNotAdded: 'プリンターに接続できませんでした。IPアドレス、シリアル番号、アクセスコードを確認し、LAN専用モードが有効になっていることを確認してください。プリンターは追加されていません。',
      failedToUpdate: 'プリンターの更新に失敗しました',
      commandSent: 'コマンドを送信しました',
      failedToSendCommand: 'コマンドの送信に失敗しました',
      turnedOn: '{{name}} の電源をオンにしました',
      failedToPowerOn: '{{name}} の電源オンに失敗しました',
      scriptTriggered: 'スクリプトを実行しました',
      printStopped: '印刷を停止しました',
      printPaused: '印刷を一時停止しました',
      printResumed: '印刷を再開しました',
      referenceDeleted: 'リファレンスを削除しました',
      detectionAreaSaved: '検出エリアを保存しました',
      failedToRunScript: 'スクリプトの実行に失敗しました',
      failedToStopPrint: '印刷の停止に失敗しました',
      failedToPausePrint: '印刷の一時停止に失敗しました',
      failedToResumePrint: '印刷の再開に失敗しました',
      failedToControlChamberLight: 'チャンバーライトの制御に失敗しました',
      failedToSetSpeed: '印刷速度の設定に失敗しました',
      failedToUpdateSetting: '設定の更新に失敗しました',
      failedToSkipObjects: 'オブジェクトのスキップに失敗しました',
      failedToRereadRfid: 'RFIDの再読み取りに失敗しました',
      failedToCheckPlate: 'プレートの確認に失敗しました',
      failedToUpdateLabel: 'ラベルの更新に失敗しました',
      failedToDeleteReference: 'リファレンスの削除に失敗しました',
      failedToSaveDetectionArea: '検出エリアの保存に失敗しました',
      plateCheckEnabled: 'プレートチェックを有効にしました',
      plateCheckDisabled: 'プレートチェックを無効にしました',
      calibrationSaved: 'キャリブレーションを保存しました！',
      calibrationFailed: 'キャリブレーションに失敗しました',
      rfidRereadInitiated: 'RFID再読み取りを開始しました',
      loadInitiated: 'フィラメントをロード中…',
      unloadInitiated: 'フィラメントをアンロード中…',
      failedToLoad: 'フィラメントのロードに失敗',
      failedToUnload: 'フィラメントのアンロードに失敗',
    },
    // Connection status
    connection: {
      connected: '接続中',
      offline: 'オフライン',
    },
    plateStatus: {
      markCleared: 'プレートをクリア済みにする',
      cleared: 'プレートクリア済み',
      notCleared: 'プレート未クリア',
      inUse: 'プレート使用中',
    },
    // Queue info
    queue: {
      inQueue: 'キュー内 {{count}} 件',
      inQueue_plural: '{{count}}件がキュー内',
    },
    // Controls section
    controls: 'コントロール',
    // RFID
    rfid: {
      reread: 'RFID再読み取り',
    },
    // AMS load/unload (#891)
    ams: {
      load: 'ロード',
      unload: 'アンロード',
    },
    bedJog: {
      limitWarning: '手動移動では可動範囲の制限が適用されません。Bambu のファームウェアの不具合により、リモートコマンドではソフトウェアリミットが無視されます。衝突しないよう注意して操作してください。',
      title: 'ジョグ操作',
      bed: 'ベッド',
      step: 'ステップ (mm)',
      up: 'プレートを上へ',
      down: 'プレートを下へ',
      disabledWhilePrinting: '印刷中は無効',
      notHomedTitle: 'プリンターがホーミングされていません',
      notHomedMessage: '前回の印刷以降、プリンターがホーミングされていません。安全な位置決めのためにまずオートホーミングを実行するか（ツールヘッドをパークしてからX・Y・Zをホーミングします）、このまま移動してください — ソフトエンドストップはバイパスされます。',
      homeZ: 'オートホーミング',
      moveAnyway: 'このまま移動',
      homingStarted: 'プリンターをオートホーミング中…',
    },
    // Permissions
    permission: {
      noAdd: 'プリンターを追加する権限がありません',
      noEdit: 'プリンターを編集する権限がありません',
      noDelete: 'プリンターを削除する権限がありません',
      noControl: 'プリンターを制御する権限がありません',
      noFiles: 'このディレクトリにファイルがありません',
      noAmsRfid: 'AMS RFIDを再読み取りする権限がありません',
      noSmartPlugControl: 'スマートプラグを制御する権限がありません',
      noCamera: 'カメラを表示する権限がありません',
    },
    // Add/Edit modal
    modal: {
      addTitle: 'プリンターを追加',
      editTitle: 'プリンターを編集',
      myPrinter: 'マイプリンター',
      selectModel: 'モデルを選択...',
      locationGroup: 'ロケーション / グループ',
      locationPlaceholder: '例: 工房、オフィス、地下室',
      autoArchiveLabel: '完了した印刷を自動アーカイブ',
      fromPrinterSettings: 'プリンターの設定から取得',
      modelOptional: 'モデル（任意）',
      saveChanges: '変更を保存',
    },
    // Skip objects
    skipObjects: {
      tooltip: 'オブジェクトスキップ',
      onlyWhilePrinting: 'オブジェクトスキップ（印刷中のみ）',
      requiresMultiple: 'オブジェクトスキップ（2個以上必要）',
      title: 'オブジェクトスキップ',
      matchIdsInfo: 'プリンター画面のIDと照合してください',
      printerShowsIds: 'プリンター画面にビルドプレート上のオブジェクトIDが表示されます',
      skipSelected: '選択をスキップ',
      skipping: 'スキップ中...',
      noObjectsSelected: 'オブジェクトが選択されていません',
      selectObjectsToSkip: '現在の印刷からスキップするオブジェクトを選択してください',
      skipped: 'スキップ済み',
      objectsSkipped: 'オブジェクトをスキップしました',
      activeCount: '{{count}}個アクティブ',
      waitForLayer: 'オブジェクトをスキップするにはレイヤー2以降をお待ちください（現在レイヤー{{layer}}）',
      skip: 'スキップ',
      confirmTitle: 'オブジェクトをスキップしますか？',
      confirmMessage: '「{{name}}」をスキップしますか？この操作は元に戻せません。',
      confirmAllMessage: '残りのオブジェクトがすべて選択されています。印刷ジョブは停止します。続行しますか？',
      confirmMultipleMessage: '選択した{{count}}個のオブジェクトをスキップしますか？この操作は元に戻せません。',
    },
    // Confirm modals
    confirm: {
      deleteTitle: 'プリンターを削除',
      deleteMessage: '「{{name}}」を削除しますか？すべての接続設定が削除されます。',
      deleteArchivesNote: 'このプリンターのすべての印刷履歴が完全に削除されます。',
      keepArchivesNote: '印刷履歴は保持されますが、このプリンターとの関連は解除されます。',
      stopTitle: '印刷を停止',
      stopMessage: '「{{name}}」の現在の印刷を停止しますか？印刷ジョブがキャンセルされます。',
      stopButton: '印刷を停止',
      pauseTitle: '印刷を一時停止',
      pauseMessage: '「{{name}}」の現在の印刷を一時停止しますか？',
      pauseButton: '印刷を一時停止',
      resumeTitle: '印刷を再開',
      resumeMessage: '「{{name}}」の印刷を再開しますか？',
      resumeButton: '印刷を再開',
      powerOnTitle: 'プリンターの電源をオン',
      powerOnMessage: '「{{name}}」の電源をオンにしますか？',
      powerOnButton: '電源オン',
      powerOffTitle: 'プリンターの電源をオフ',
      powerOffMessage: '「{{name}}」の電源をオフにしますか？',
      powerOffWarning: '警告: 「{{name}}」は現在印刷中です！電源をオフにしますか？印刷が中断され、プリンターが損傷する可能性があります。',
      powerOffButton: '電源オフ',
      haToggleTitle: '「{{name}}」を切り替え',
      haToggleMessage: 'Home Assistant エンティティ {{entity}} を切り替えますか？現在オンの場合、電源がオフになる可能性があります。',
      haToggleWarning: '警告: 「{{name}}」は現在印刷中です！{{entity}} を切り替えると電源が切れ、印刷が中断される可能性があります。続行しますか？',
      haToggleButton: '切り替え',
    },
    // Bulk actions
    bulk: {
      select: '選択',
      selectAll: 'すべて選択',
      selectByLocation: '場所で選択',
      selected: '{{count}}件選択中',
      actions: {
        stop: '停止',
        pause: '一時停止',
        resume: '再開',
        clearPlate: 'ベッドをクリア',
        clearHMS: '通知をクリア',
      },
      confirm: {
        stopTitle: '{{count}}件の印刷を停止',
        stopMessage: '{{count}}台のプリンターのアクティブな印刷をキャンセルします。この操作は元に戻せません。',
        stopButton: 'すべて停止',
        pauseTitle: '{{count}}件の印刷を一時停止',
        pauseMessage: '{{count}}台のプリンターのアクティブな印刷を一時停止します。',
        pauseButton: 'すべて一時停止',
        clearPlateTitle: '{{count}}台のプリントベッドをクリア',
        clearPlateMessage: '{{count}}台のプリンターのプリントベッドをクリアし、キュー内のジョブが開始される場合があります。',
        clearPlateButton: 'すべてクリア',
      },
      success: '{{count}}台のプリンターで{{action}}が完了',
      partial: '{{succeeded}}件成功、{{failed}}件失敗',
      noneApplicable: '選択したプリンターにこのアクションに適した状態のものがありません',
      selectByState: 'ステータスで選択',
    },
    // Discovery
    discovery: {
      title: 'プリンター',
      searching: '検索中...',
      scanning: 'スキャン中...',
      scanProgress: 'スキャン中... {{scanned}}/{{total}}',
      foundPrinters: '{{count}}台のプリンターを検出',
      noPrintersFound: 'プリンターが見つかりません',
      noPrintersFoundSubnet: '指定されたサブネットにプリンターが見つかりません。',
      noPrintersFoundNetwork: 'ネットワーク上にプリンターが見つかりません。',
      allConfigured: '検出されたすべてのプリンターは既に設定済みです。',
      alreadyAdded: '追加済み',
      select: '選択',
      manualEntry: '手動入力',
      addFromCloud: 'クラウドから追加',
      subnetToScan: 'スキャンするサブネット',
      dockerNote: 'Dockerを検出しました。プリンターのサブネットをCIDR表記で入力してください。docker-compose.ymlでnetwork_mode: hostが必要です。',
      scanSubnet: 'サブネットをスキャンしてプリンターを検出',
      discoverNetwork: 'ネットワーク上のプリンターを検出',
      scanningSubnet: 'サブネットでBambuプリンターをスキャン中...',
      scanningNetwork: 'ネットワークをスキャン中...',
      serialRequired: 'シリアル番号が必要です',
      unknown: '不明',
      failedToStart: '印刷の開始に失敗しました',
      customSubnetOption: 'カスタムサブネット...',
      customSubnetLabel: 'カスタムサブネット (CIDR)',
      customSubnetNote: 'プリンターがこのサーバーと別のネットワークにある場合は、カスタムサブネットを使用してください。FTP (990) と MQTT (8883) のポートが、ルーティング境界を越えて到達可能である必要があります。',
    },
    // AMS Drying
    drying: {
      start: '乾燥開始',
      stop: '乾燥停止',
      temperature: '温度',
      duration: '時間',
      hours: '時間',
      timeRemaining: '残り {{time}}',
      active: '乾燥中',
      targetSummary: '{{filament}} @ {{temp}}°C',
      notSupported: '乾燥非対応',
      powerRequired: 'AMS電源アダプターを接続して乾燥を有効にしてください',
      startingDrying: '乾燥を開始しています...',
      toastCommandSent: '乾燥コマンドを送信しました',
      toastStopped: '乾燥を停止しました',
      toastNotStarted: 'プリンターはコマンドを受け付けましたが、AMS は乾燥を開始しませんでした。AMS の電源アダプターが接続されているか、プリンターがアイドル状態かを確認してください。',
      screenOnly: 'このプリンターでは、AMS の乾燥はプリンター本体の画面からのみ操作できます (Bambu の仕様上の制限)',
      stoppingDrying: '乾燥を停止しています...',
      rotateTray: '乾燥中にスプールを回転',
      rotateUnavailableReason: '利用不可 — このAMSのスロットがツールヘッドにロードされています。スプールが供給チューブで固定されているため回転できません。先にフィラメントを引き戻してください。',
    },
    amsBackup: {
      titleOn: 'AMSフィラメントバックアップはONです。クリックして無効化します。',
      titleOff: 'AMSフィラメントバックアップはOFFです。クリックして有効化します。',
      titleUnknown: 'このプリンタではAMSフィラメントバックアップ状態を確認できません。',
      toastEnabled: 'AMSフィラメントバックアップを有効化しました',
      toastDisabled: 'AMSフィラメントバックアップを無効化しました',
      modalTitle: 'AMS フィラメントバックアップ',
      modalHelp: 'アクティブなスロットが空になると、プリンターは同じプリセット・同じ色のスロットをこの順序で循環します。',
      modalNoSlots: 'フィラメントが読み込まれていません。',
      modalNoPairs: 'バックアップペアがありません — プリセットと色の両方が一致するスロットがありません。',
      extruderRightShort: '右',
      extruderLeftShort: '左',
      stateOn: '有効',
      stateOff: '無効',
      stateUnknown: 'このプリンターでは未対応',
    },
    activeJobSlot: {
      title: 'このスロットはアクティブな印刷のフィラメント {{n}} です',
      ariaLabel: 'アクティブ印刷スロット {{n}}',
    },
    expectedSlot: {
      title: 'プリンターはこのスロットのフィラメントを待っています',
      ariaLabel: '要求スロット {{n}}',
      label: '{{ams}} · スロット {{slot}}',
      external: '外部スプール',
    },
    // Filaments section
    filaments: 'フィラメント',
    externalSpool: {
      hide: '外部スプールを非表示にする',
      show: '外部スプールを表示する',
    },
    // Camera
    openCameraOverlay: 'カメラオーバーレイを開く',
    openCameraWindow: 'カメラを新しいウィンドウで開く',
    // Firmware
    firmwareUpdateAvailable: 'ファームウェアアップデートあり: {{current}} → {{latest}}',
    firmwareUpToDate: 'ファームウェア {{version}} — 最新',
    firmwareUpdateButton: 'アップデート',
    // Plate detection
    plateDetection: {
      noPermission: 'このページにアクセスする権限がありません。',
      enabledClick: 'プレートチェック有効 - クリックして無効化',
      disabledClick: 'プレートチェック無効 - クリックして有効化',
      manageCalibration: 'プレート検出キャリブレーションを管理',
      calibrationRequired: 'キャリブレーションが必要です',
      calibrationInstructions: 'ビルドプレートが<strong>完全に空</strong>であることを確認してから、キャリブレーションをクリックしてください。',
      calibrationDescription: 'キャリブレーションは空のプレートのリファレンス画像を撮影します。以降のチェックではこのリファレンスと比較してオブジェクトを検出します。',
      calibrationTip: '<strong>ヒント:</strong> 異なるプレート用に最大5つのキャリブレーションを保存できます。チェック時に最適なものが自動的に使用されます。',
      plateEmpty: 'プレートは空のようです',
      objectsDetected: 'オブジェクトを検出しました',
      confidence: '信頼度',
      difference: '差分',
      analysisPreview: '分析プレビュー:',
      analysisLegend: '緑の枠 = 検出エリア、赤のオーバーレイ = キャリブレーションとの差分',
      savedReferences: '保存済みリファレンス ({{count}}/{{max}})',
      deleteReference: 'リファレンスを削除',
      labelPlaceholder: 'ラベル...',
      clickToEdit: '{{label}} - クリックして編集',
      clickToAddLabel: 'クリックしてラベルを追加',
    },
    // Speed
    speed: {
      title: '印刷速度',
      silent: 'サイレント (50%)',
      standard: 'スタンダード (100%)',
      sport: 'スポーツ (124%)',
      ludicrous: 'ルディクラス (166%)',
    },
    airduct: {
      title: 'エアダクトモード',
      cooling: '冷却',
      heating: '加熱',
    },
    noSdCard: 'SDなし',
    door: {
      open: '開',
      closed: '閉',
    },
    // Fans
    fans: {
      partCooling: 'パーツ冷却ファン',
      auxiliary: '補助ファン',
      leftAuxiliary: '左補助ファン',
      exhaust: '排気',
      chamber: 'チャンバーファン',
    },
    // HMS errors
    clickToViewHmsErrors: 'クリックしてHMSエラーを表示',
    aiDetection: {
      safe: '安全',
      warning: '警告',
      failure: '失敗',
      idle: '待機中',
      tooltip: 'AI 失敗検出: {{status}}（スコア {{score}}）- クリックで詳細を表示',
      tooltipIdle: 'AI 失敗検出が有効 - 次の印刷から監視を開始します - クリックで詳細を表示',
      modalTitle: 'AI 失敗検出 - {{name}}',
      currentStatus: 'ステータス',
      score: 'スコア',
      framesAnalyzed: '解析フレーム数',
      idleHint: '現在監視中の印刷はありません。次の印刷から自動的に監視を開始します。',
      lastError: '最後のエラー',
      openSettings: '設定を開く',
    },
    estimatedCompletion: '完了予定時刻',
    plateNumber: 'プレート {{number}}',
    slotOptions: 'スロットオプション',
    // AMS hover popup
    amsPopup: {
      friendlyName: 'AMS名',
      friendlyNamePlaceholder: '例: AMS フレンドリー名',
      serialNumber: 'シリアル番号',
      firmwareVersion: 'ファームウェア',
      save: '保存',
      clear: 'クリア',
      noEditPermission: 'AMS ユニットの名前を変更する権限がありません',
    },
    // Firmware modal
    firmwareModal: {
      title: 'ファームウェアアップデート',
      titleUpToDate: 'ファームウェア情報',
      currentVersion: '現在のバージョン',
      latestVersion: '最新バージョン',
      releaseNotes: 'リリースノート',
      checkingPrereqs: '前提条件を確認中...',
      sdCardReady: 'SDカード準備完了。下をクリックしてファームウェアをアップロードしてください。',
      uploadedSuccess: 'ファームウェアをSDカードにアップロードしました！',
      applyInstructions: 'プリンターでアップデートを適用するには:',
      step1: 'プリンターのタッチスクリーンで設定に移動',
      step2: 'ファームウェアに移動',
      step3: 'SDカードからアップデートを選択',
      step4: 'アップデートには10〜20分かかります',
      done: '完了',
      starting: '開始中...',
      uploadFirmware: 'ファームウェアをアップロード',
      uploadFailed: 'アップロード開始に失敗しました: {{error}}',
      uploadedToast: 'ファームウェアをアップロードしました！プリンター画面からアップデートを実行してください。',
      availableVersions: '利用可能なバージョン',
      usable: '利用可',
      unavailable: '利用不可',
      installed: 'インストール済み',
      newerBadge: '新しい',
      olderBadge: '古い',
      currentBadge: '現在',
    },
    accessCodePlaceholder: 'プリンター設定から取得',
    // ROI editor
    roi: {
      title: 'プリンター',
      xStart: 'X開始',
      yStart: 'Y開始',
      width: '幅',
      height: '高さ',
      instruction: 'ビルドプレートに焦点を合わせるように検出エリアを調整してください。プレビューの緑の枠が現在のエリアを示しています。',
    },
    developerModeWarning: '開発者LANモードが有効になっていません: {{names}}。一部の機能が動作しない可能性があります。',
    howToEnable: '有効化方法',
    incompatibleFile: 'このファイルは{{slicedFor}}用にスライスされていますが、このプリンターは{{printerModel}}です',
    dropNotPrintable: '.gcodeおよび.gcode.3mfファイルのみ印刷できます',
    dropToPrint: 'ドロップして印刷',
    cannotPrint: 'プリンター使用中',
  },

  // Archives page
  archives: {
    title: '印刷アーカイブ',
    no3mfBanner: {
      title: '最近の一部の印刷でサムネイル付きのアーカイブができませんでした',
      body: 'スライサーがプリンターのSDカードに.gcode.3mfファイルを残さなかったため、Bambuddyはサムネイルもスライサーメタデータも取得できませんでした。これは通常、スライサー (Bambu Studio / OrcaSlicer のデバイスタブ) で「送信ファイルを外部ストレージに保存」がオフになっていることが原因です。',
      docsLink: 'インストール手順4を参照',
      docsLinkInternalStorage: '原因について',
      titleInternalStorage: '最近の一部の印刷はプリンターの内部ストレージに残りました',
      bodyInternalStorage: 'プリンターがスライス済みファイルをカードではなく自身の内部ストレージに保存したため、BambuddyがFTPで読み取れるものがありませんでした。H2シリーズとP2Sのファームウェアはこの動作をし、「送信ファイルを外部ストレージに保存」を変更しても変わりません。これらの印刷は名前と時間付きで引き続きアーカイブされますが、サムネイルとスライサーメタデータはありません。',
      titleNoExternalStorage: '最近の一部の印刷をアーカイブできませんでした — プリンターにストレージがありません',
      bodyNoExternalStorage: 'プリンターのスロットにカードもUSBメモリも検出されないため、スライス済みファイルの保存先がなく、Bambuddyが読み取るものもありませんでした。挿入すれば次の印刷は完全にアーカイブされます。',
      dismissLabel: 'この通知を閉じる',
    },
    searchPlaceholder: 'アーカイブを検索...',
    filterByPrinter: 'プリンターで絞り込み',
    filterByStatus: 'ステータスで絞り込み',
    sortBy: '並べ替え',
    sortNewest: '新しい順',
    sortOldest: '古い順',
    sortName: '名前順',
    sortDuration: '時間順',
    sortLargest: '大きい順',
    sortSmallest: '小さい順',
    sortSize: 'サイズ',
    noArchives: 'アーカイブが見つかりません',
    noArchivesSearch: '検索条件に一致するアーカイブがありません',
    originalPrintNotVisible: '元の印刷が表示されていません - フィルターをクリアしてみてください',
    noArchivesYet: 'アーカイブはまだありません',
    prints: '件',
    pagination: {
      showing: '表示中',
      to: '〜',
      of: '/',
      show: '表示',
      page: 'ページ',
      all: 'すべて',
    },
    loadingArchives: 'アーカイブを読み込み中...',
    releaseToUpload: 'ドロップしてアップロード',
    showAll: 'すべて表示',
    showFavoritesOnly: 'お気に入りのみ表示',
    gridView: 'グリッド表示',
    listView: 'リスト表示',
    calendarView: 'カレンダー表示',
    logView: '印刷ログ',
    manageTags: 'タグを管理',
    showFailedPrints: '失敗した印刷を表示',
    hideFailedPrints: '失敗した印刷を非表示',
    hideDuplicates: '重複を非表示',
    viewOriginalPrint: 'クリックして元の印刷を表示 (#{{id}})',
    printTime: '印刷時間',
    filamentUsed: 'フィラメント使用量',
    cost: 'コスト',
    preview: 'プレビュー',
    deleteArchive: 'アーカイブを削除',
    deleteConfirm: 'このアーカイブを削除しますか？',
    favorite: 'お気に入り',
    unfavorite: 'お気に入りから削除',
    viewDetails: '詳細を表示',
    status: {
      completed: '完了',
      failed: '失敗',
      stopped: '中止',
    },
    toast: {
      source3mfAttached: 'ソース3MFを添付しました: {{filename}}',
      failedUploadSource3mf: 'ソース3MFのアップロードに失敗しました',
      source3mfRemoved: 'ソース3MFを削除しました',
      failedRemoveSource3mf: 'ソース3MFの削除に失敗しました',
      f3dAttached: 'F3Dを添付しました: {{filename}}',
      failedUploadF3d: 'F3Dのアップロードに失敗しました',
      f3dRemoved: 'F3Dを削除しました',
      failedRemoveF3d: 'F3Dの削除に失敗しました',
      timelapseAttached: 'タイムラプスを添付しました: {{filename}}',
      timelapseAlreadyAttached: 'タイムラプスは既に添付されています',
      noMatchingTimelapse: '一致するタイムラプスが見つかりません',
      failedScanTimelapse: 'タイムラプスのスキャンに失敗しました',
      failedAttachTimelapse: 'タイムラプスの添付に失敗しました',
      timelapseRemoved: 'タイムラプスを削除しました',
      failedRemoveTimelapse: 'タイムラプスの削除に失敗しました',
      timelapseUploaded: 'タイムラプスをアップロードしました: {{filename}}',
      failedUploadTimelapse: 'タイムラプスのアップロードに失敗しました',
      archiveDeleted: 'アーカイブを削除しました',
      failedDeleteArchive: 'アーカイブの削除に失敗しました',
      addedToFavorites: 'お気に入りに追加しました',
      removedFromFavorites: 'お気に入りから削除しました',
      projectUpdated: 'プロジェクトを更新しました',
      failedUpdateProject: 'プロジェクトの更新に失敗しました',
      linkCopied: 'リンクをクリップボードにコピーしました',
      failedCopyLink: 'リンクのコピーに失敗しました',
      photoDeleted: '写真を削除しました',
      failedDeletePhoto: '写真の削除に失敗しました',
      failedDeleteArchives: 'アーカイブの削除に失敗しました',
      failedUpdateFavorites: 'お気に入りの更新に失敗しました',
      exportDownloaded: 'エクスポートをダウンロードしました',
      exportFailed: 'エクスポートに失敗しました',
    },
    menu: {
      print: '印刷',
      openInBambuStudio: 'スライサーで開く',
      slice: 'スライス',
      externalLink: '外部リンク',
      viewOnMakerWorld: 'MakerWorldで表示',
      preview3d: '3Dプレビュー',
      viewTimelapse: 'タイムラプスを表示',
      scanForTimelapse: 'タイムラプスをスキャン',
      uploadTimelapse: 'タイムラプスをアップロード',
      removeTimelapse: 'タイムラプスを削除',
      downloadSource3mf: 'ソース3MFをダウンロード',
      uploadSource3mf: 'ソース3MFをアップロード',
      replaceSource3mf: 'ソース3MFを置換',
      removeSource3mf: 'ソース3MFを削除',
      uploadF3d: 'F3Dをアップロード',
      replaceF3d: 'F3Dを置換',
      downloadF3d: 'Fusion 360デザインファイルをダウンロード',
      removeF3d: 'F3Dを削除',
      download: 'ダウンロード',
      copyDownloadLink: 'ダウンロードリンクをコピー',
      qrCode: 'QRコード',
      viewPhotos: '写真を表示',
      viewPhotosCount: '写真を表示 ({{count}})',
      projectPage: 'プロジェクトページ',
      addToFavorites: 'お気に入りに追加',
      removeFromFavorites: 'お気に入りから削除',
      edit: '編集',
      printLog: '印刷ログ',
      goToProject: 'プロジェクトへ: {{name}}',
      addToProject: 'プロジェクトに追加',
      removeFromProject: 'プロジェクトから削除',
      loading: 'アーカイブを読み込み中...',
      noProjectsAvailable: '利用可能なプロジェクトがありません',
      searchProjects: 'プロジェクトを検索…',
      select: '選択',
      deselect: '選択解除',
      delete: '削除',
    },
    permission: {
      noReprint: 'このアーカイブを再印刷する権限がありません',
      noAddToQueue: 'キューに追加する権限がありません',
      noUpdateArchives: 'アーカイブを更新する権限がありません',
      noUploadFiles: 'ファイルをアップロードする権限がありません',
      noDownload: 'アーカイブをダウンロードする権限がありません',
      noCopyLink: 'ダウンロードリンクをコピーする権限がありません',
      noDelete: 'このアーカイブを削除する権限がありません',
      noEdit: 'このエントリを編集する権限がありません',
      noCreate: 'アーカイブを作成する権限がありません',
    },
    platePicker: {
      title: 'プレビューするプレートを選択',
      hint: 'このアーカイブには複数のプレートがあります。GCodeビューアで開くプレートを選択してください。',
      plateLabel: 'プレート {{index}}',
      objectCount: '{{count}} オブジェクト',
      objectCount_plural: '{{count}} オブジェクト',
      noGcode: 'このアーカイブにはプレビュー可能なスライス済みGコードがありません。まずBambu Studioで開いてスライスしてください。',
    },
    card: {
      previousPlate: '前のプレート',
      nextPlate: '次のプレート',
      plateNumber: 'プレート {{index}}',
      moreOptions: 'その他のオプション',
      addToFavorites: 'お気に入りに追加',
      removeFromFavorites: 'お気に入りから削除',
      cancelled: 'キャンセル',
      failed: '失敗',
      duplicate: '重複',
      duplicateTitle: 'このモデルは以前印刷されています',
      openSource3mf: 'ソース3MFをBambu Studioで開く（右クリックでオプション表示）',
      downloadF3d: 'Fusion 360デザインファイルをダウンロード',
      viewTimelapse: 'タイムラプスを表示',
      viewPhoto: '写真を表示',
      viewPhotos: '{{count}}枚の写真を表示',
      openFolder: 'フォルダーを開く: {{name}}',
      slicedFile: 'スライス済みファイル - 印刷可能',
      sourceFile: 'ソースファイルのみ - AMSマッピング不可',
      gcode: 'GCODE',
      source: 'ソース',
      project: 'プロジェクト: {{name}}',
      runsBadge: '{{count}} 回印刷',
      runsBadgeTitle: '合計 {{count}} 回 — 成功 {{successful}} 回、失敗 {{failed}} 回。クリックして印刷ログを開きます。',
      estimated: '推定: {{time}}',
      actual: '実際: {{time}}',
      accuracy: '精度: {{percent}}%',
      filament: '{{weight}} g',
      layer: '{{count}} レイヤー',
      layers: '{{count}} レイヤー',
      object: '{{count}}オブジェクト',
      objects: '{{count}}オブジェクト',
      slicedFor: '{{model}}用にスライス',
      uploadedBy: 'アップロード者',
      noPermissionReprint: '再印刷する権限がありません',
      noFileForReprint: '3MFファイルがありません — 印刷記録時にプリンターからファイルをダウンロードできませんでした',
      slicerAmsMapping: 'AMSマッピングを保存済み（{{printer}}）',
      slicerAmsMappingTooltip: 'スライサーが選んだAMSスロットは{{printer}}用に保存されています。スロット番号はそのプリンターでのみ意味を持つため、再印刷で再利用されるのは再び{{printer}}に送る場合だけです。',
      noPermissionEdit: 'プロファイルを編集する権限がありません',
      noPermissionDelete: 'アーカイブを削除する権限がありません',
      openInBambuStudio: 'スライサーで開く',
      openInBambuStudioToSlice: 'スライサーでスライス',
      slice: 'スライス',
      externalLink: '外部リンク',
      makerWorld: 'MakerWorld – {{designer}}',
      viewProject: 'プロジェクトを表示',
      noExternalLink: '外部リンクなし',
      preview3d: '3Dプレビュー',
      download: 'ダウンロード',
      edit: '編集',
      delete: '削除',
    },
    runLog: {
      title: '印刷ログ',
      modalTitle: '印刷ログ — {{name}}',
      modalTitleFallback: 'このアーカイブ',
      empty: 'このアーカイブの印刷イベントはまだ記録されていません。',
      col: {
        date: '日付',
        status: 'ステータス',
        duration: '時間',
        filament: 'フィラメント',
        cost: 'コスト',
      },
      status: {
        completed: '完了',
        failed: '失敗',
        cancelled: 'キャンセル',
        stopped: '停止',
        skipped: 'スキップ',
        printing: '印刷中',
      },
    },
    modal: {
      deleteArchive: 'アーカイブを削除',
      deleteConfirm: '"{{name}}" を削除しますか？この操作は取り消せません。',
      deleteButton: '削除',
      deletePurgeStats: 'このプリントをQuick Statsからも削除（フィラメント、時間、コスト、電力）',
      deleteQueueItemsWarning: 'このアーカイブにリンクされた {{count}} 件のキュー項目も削除されます。',
      deleteBlockedByPrinting: '削除できません — {{count}} 件のキュー項目が現在印刷中です。先に印刷を停止してから再試行してください。',
      removeSource3mf: 'ソース3MFを削除',
      removeSource3mfConfirm: '"{{name}}"からソース3MFファイルを削除してもよろしいですか？元のスライサープロジェクトファイルが削除されます。',
      removeButton: '削除',
      removeF3d: 'F3Dを削除',
      removeF3dConfirm: '"{{name}}"からFusion 360デザインファイルを削除してもよろしいですか？',
      removeTimelapse: 'タイムラプスを削除',
      removeTimelapseConfirm: '"{{name}}"からタイムラプス動画を削除してもよろしいですか？',
      timelapse: '{{name}} - タイムラプス',
      selectTimelapse: 'タイムラプスを選択',
      selectTimelapseDesc: '自動一致が見つかりませんでした。この印刷のタイムラプスを選択してください:',
      deleteArchives: '印刷アーカイブを削除',
      deleteArchivesConfirm: '{{count}}件のアーカイブを削除しますか？この操作は元に戻せません。',
      deleteCount: '{{count}}件を削除',
    },
    page: {
      title: '印刷アーカイブ',
      printsCount: '{{filtered}} / {{total}} 件のプリント',
      dropFilesHere: '.3mfファイルをここにドロップ',
      releaseToUpload: 'ドロップしてアップロード',
      only3mfSupported: '.3mfファイルのみ対応しています',
      close: '閉じる',
      selected: '{{count}}件選択中',
      selectAll: 'すべて選択',
      tags: 'タグ',
      project: 'プロジェクト',
      favorite: 'お気に入り',
      delete: '削除',
      toggledFavorites: '{{count}}件のアーカイブのお気に入りを切替えました',
      failedUpdateFavorites: 'お気に入りの更新に失敗しました',
      archivesDeleted: '{{count}}件のアーカイブを削除しました',
      failedDeleteArchives: 'アーカイブの削除に失敗しました',
      photoDeleted: '写真を削除しました',
      failedDeletePhoto: '写真の削除に失敗しました',
    },
    list: {
      name: '名前',
      printer: 'プリンター',
      date: '日付',
      size: 'サイズ',
      actions: '操作',
      hasTimelapse: 'タイムラプスあり',
    },
    log: {
      date: '日時',
      printName: '印刷名',
      printer: 'プリンター',
      user: 'ユーザー',
      status: 'ステータス',
      duration: '所要時間',
      filament: 'フィラメント',
      filamentUsed: '使用フィラメント量',
      cost: 'コスト',
      energy: '電力量',
      energyCost: '電力コスト',
      completedAt: '終了',
      columns: '列',
      sortBy: '{{column}} で並べ替え',
      allPrinters: '全プリンター',
      allUsers: '全ユーザー',
      allStatuses: '全ステータス',
      cancelled: 'キャンセル',
      skipped: 'スキップ',
      dateFrom: '開始日',
      dateTo: '終了日',
      noEntries: '印刷ログが見つかりません',
      showing: '{{total}}件中{{count}}件を表示',
      rowsPerPage: '行数',
      page: 'ページ',
      prev: '前へ',
      next: '次へ',
      clearLog: 'ログをクリア',
      clearLogTitle: '印刷ログをクリア',
      clearLogConfirm: 'すべての印刷ログエントリが完全に削除されます。アーカイブとキューアイテムには影響しません。この操作は元に戻せません。よろしいですか？',
      clearLogButton: 'すべてクリア',
      cleared: '{{count}}件のログエントリを削除しました',
      clearFailed: '印刷ログの削除に失敗しました',
      deleteEntryTitle: '印刷ログのエントリを削除',
      deleteEntryConfirm: 'このエントリはログから削除され、フィラメント、時間、コストの寄与はクイック統計から除外されます。対応するアーカイブ（ある場合）は影響を受けません。この操作は取り消せません。',
      entryDeleted: '印刷ログのエントリを削除しました',
      entryDeleteFailed: '印刷ログのエントリを削除できませんでした',
      editEntryTitle: '印刷ログのエントリを編集',
      editEntryDescription: 'この印刷を分類します。失敗分析ウィジェットはこれらの値でグループ化されるため、更新は即座に統計に反映されます。',
      entryUpdated: '印刷ログのエントリを更新しました',
      entryUpdateFailed: '印刷ログのエントリを更新できませんでした',
      statuses: {
        completed: '完了',
        failed: '失敗',
        stopped: '停止',
        cancelled: 'キャンセル',
        skipped: 'スキップ',
      },
    },
  },

  // Sticky upload-progress toast (#1625 follow-up)
  dispatchToast: {
    untitled: '印刷ジョブ',
    startingPrints: '印刷を開始しています',
    progressSummary: '{{complete}}/{{total}} 完了 • 処理中: {{processing}}',
    expandDetails: '送信の詳細を表示',
    collapseDetails: '送信の詳細を非表示',
    awaitingPrinter: 'プリンターを待機中…',
    status: {
      processing: '処理中',
      completed: '完了',
      failed: '失敗',
    },
    failed: {
      generic: '送信に失敗しました',
      upload_failed: 'プリンターへのアップロードに失敗しました',
      start_command_failed: 'プリンターが開始コマンドを拒否しました',
    },
    dismiss: '閉じる',
  },

  // Pipeline Runs dashboard (#1425 PR C).
  pipelineRuns: {
    title: 'パイプライン実行',
    loading: '読み込み中…',
    empty: 'パイプラインの実行はまだありません。',
    filter: {
      pipeline: 'パイプライン',
      status: 'ステータス',
      target: '対象',
      all: 'すべて',
      allPipelines: 'すべてのパイプライン',
      allStatus: 'すべてのステータス',
      allTargets: 'すべての対象',
      clear: 'フィルターをクリア',
      noMatches: '現在のフィルターに一致する実行はありません。',
    },
    totalCount_one: '{{n}} 件の実行',
    totalCount_other: '{{n}} 件の実行',
    copies: '{{n}} 部',
    failedCount: '{{n}} 失敗',
    copyN: 'コピー {{n}}',
    retryFailed: '失敗を再試行',
    retryOf: '#{{n}} の再試行',
    pagination: '{{total}} 件中 {{start}}–{{end}}',
    toast: {
      cancelled: '実行をキャンセルしました',
      cancelFailed: 'キャンセルに失敗しました',
      retryStarted: '再試行を開始しました',
      retryFailed: '再試行に失敗しました',
      cleared: '{{n}} 件の実行を削除しました',
      clearFailed: '削除に失敗しました',
    },
    clearLog: 'ログをクリア',
    clearConfirmTitle: 'ログをクリアしますか？',
    clearConfirmBody: '完了、失敗、キャンセル、部分的失敗のすべてのパイプライン実行を削除しますか？実行中のものは残ります。元に戻せません。',
    clearConfirmAction: 'クリア',
    jobStatus: {
      pending: '保留中',
      awaiting_printer: 'プリンター待機中',
      queued: '待機中',
      printing: '印刷中',
      completed: '完了',
      failed: '失敗',
      cancelled: 'キャンセル',
    },
    cancelledByUser: 'ユーザーによりキャンセル',
  },

  // Queue page
  queue: {
    filamentShort: {
      rowBadge: '割り当てられたスプールのフィラメントが不足しています',
      rowTooltip: 'スケジューラーがこのアイテムをフラグしました。再生ボタンをクリックしてスロットごとの不足量を確認し、それでも印刷するか判断してください。',
      confirmTitle: 'フィラメント不足',
      confirmIntro: '割り当てられたスプールでは少なくとも 1 つのスロットを賄えません。それでも印刷しますか？',
      lineItem: 'スロット {{slot}}：必要 {{required}} g、残り {{remaining}} g',
      unknown: '不明',
      printAnyway: 'それでも印刷',
    },
    slicerAmsMapping: {
      rowBadge: 'このプリンター用に保存されたAMSスロット',
      rowTooltip: 'このアーカイブには、スライサーが選択した正確なAMSスロットが、この項目の対象プリンター用に保存されています。そのプリンターでの再印刷では、タイプと色で照合し直す代わりにそれらのトレイを再利用できます。',
    },
    title: '印刷キュー',
    subtitle: '印刷ジョブのスケジュールと管理',
    // Print modal
    editQueueItem: 'キューアイテムを編集',
    selectAllPlates: '全{{count}}プレートを選択',
    deselectAll: '全て解除',
    printQueued: 'キューに追加しました',
    printQueuedWillStartWhenIdle: 'プリンターがアイドル状態になると開始します',
    itemsQueued: '{{count}}件をキューに追加しました',
    sending: '送信中...',
    sendingProgress: '送信中 {{current}}/{{total}}...',
    adding: '追加中...',
    addingProgress: '追加中 {{current}}/{{total}}...',
    savingProgress: '保存中 {{current}}/{{total}}...',
    clearQueue: 'キューをクリア',
    clearHistory: '履歴をクリア',
    emptyQueue: 'キューは空です',
    position: '順番',
    scheduledTime: '予定時刻',
    moveUp: '上に移動',
    moveDown: '下に移動',
    startNow: '今すぐ開始',
    printingInProgress: '印刷中...',
    viewArchive: 'アーカイブを表示',
    viewInFileManager: 'ファイルマネージャーで表示',
    itemCount: '{{count}}件',
    itemCount_plural: '{{count}}件のアイテム',
    dragToReorder: 'ドラッグして並べ替え（ASAPのみ）',
    reorderHint: '順番はASAPアイテムのみに影響します。スケジュール済みアイテムは設定時刻に実行されます。',
    sjf: {
      label: 'SJF',
      tooltip: '短いジョブ優先 — スケジューラーが短い印刷を優先します',
    },
    addedBy: '{{name}} が追加',
    nextInQueue: '次のキュー',
    clearPlateSuccess: 'プレートをクリアしました — 次の印刷の準備完了',
    plateNumber: 'プレート {{index}}',
    // Batch / quantity
    quantity: '数量',
    quantityHint: '{{count}}件のキューアイテムを作成',
    plateQuantityLabel: '{{plate}} の実行回数',
    plateQuantityTotal_one: '合計 {{count}} 回',
    plateQuantityTotal_other: '合計 {{count}} 回',
    batchOrders: {
      title: 'バッチ注文',
      emptyTitle: 'バッチ注文はありません',
      emptyDescription: '複数プレートのファイル、または同じプレートを複数回キューに入れると、注文がここに進捗とともに表示されます。',
      filter: {
        active: '進行中',
        completed: '完了',
        cancelled: 'キャンセル済み',
        all: 'すべて',
      },
      status: {
        active: '進行中',
        completed: '完了',
        cancelled: 'キャンセル済み',
      },
      noTargets: 'グループのみ',
      noTargetsHint: 'プレートごとの目標数が導入される前に作成されたため、目標ではなくキューに入れた実行を追跡します。',
      dispatchRemaining: '残り{{count}}件をキューに追加',
      dispatchPlate: '残りをキューに追加',
      dispatched: '{{name}} の残りの実行をキューに追加しました',
      plateProgress: '{{target}}件中{{completed}}件完了',
      remaining: '残り{{count}}件',
      failed: '{{count}}件失敗',
      printing: '{{count}}件印刷中',
      wholeFile: 'ファイル全体',
      due: '期限 {{date}}',
      costSoFar: 'これまで {{amount}}',
      costRemaining: '(残り {{amount}})',
    },
    activeBatches: 'アクティブなバッチ',
    batchProgress: '{{total}}件中{{completed}}件完了',
    cancelBatch: '残りをキャンセル',
    batchCancelled: '残りのバッチアイテムをキャンセルしました',
    cancelBatchConfirmTitle: 'バッチをキャンセル',
    cancelBatchConfirmMessage: 'このバッチの残りの保留中アイテムをすべてキャンセルしますか？',
    batch: {
      defaultName: 'バッチ',
      label: '{{count}}件',
      label_plural: '{{count}}件',
      pendingCount: '{{count}}件待機中',
      pendingCount_plural: '{{count}}件待機中',
      expand: 'バッチを展開',
      collapse: 'バッチを折りたたむ',
      groupAsBatch: 'バッチとしてグループ化…',
      groupAsBatchDescription: '選択した{{count}}件をひとつの折りたたみ可能なバッチにまとめます。',
      nameLabel: 'バッチ名',
      namePlaceholder: '例：金曜のプレゼント',
      create: 'バッチを作成',
      ungroup: 'グループ解除',
      ungroupConfirmTitle: 'バッチのグループを解除しますか？',
      ungroupConfirmMessage: 'アイテムはキューに残りますが、グループ化されなくなります。',
      dragGroup: 'グループをドラッグ',
    },
    tabs: {
      batches: 'バッチ',
      queue: 'キュー',
      history: '履歴',
      timeline: 'タイムライン',
      pipelines: 'パイプライン',
    },
    layout: {
      flatList: 'リスト',
      byPrinter: 'プリンター別',
      groupByPrinter: 'プリンター別にグループ化',
    },
    history: {
      emptyTitle: '履歴はまだありません',
      emptyDescription: '完了・キャンセル・失敗した印刷がここに表示されます。',
      showMore: 'さらに表示',
      showingCount: '{{total}} 件中 {{shown}} 件を表示',
    },
    dragGhost: {
      multiCount: '{{count}}件',
      batch: '{{name}}（{{count}}部）',
      batch_plural: '{{name}}（{{count}}部）',
    },
    // Sections
    sections: {
      currentlyPrinting: '印刷中',
      queued: 'キュー中',
      history: '履歴',
    },
    // Status
    status: {
      pending: '待機中',
      waiting: '待機中',
      printing: '印刷中',
      paused: '一時停止',
      completed: '完了',
      failed: '失敗',
      skipped: 'スキップ',
      cancelled: 'キャンセル済み',
    },
    // Summary cards
    summary: {
      printing: '印刷中',
      queued: 'キュー中',
      totalTime: 'キュー合計時間',
      totalWeight: 'キュー合計重量',
      history: '履歴',
    },
    // Filters
    filter: {
      allPrinters: 'すべてのプリンター',
      unassigned: '未割当',
      allStatus: 'すべてのステータス',
      allLocations: 'すべてのロケーション',
      any: 'すべて',
    },
    // Sort
    sort: {
      byPosition: '順番で並べ替え',
      byName: '名前で並べ替え',
      byPrinter: 'プリンターで並べ替え',
      bySchedule: 'スケジュールで並べ替え',
      byDate: '日付で並べ替え',
      ascendingOldest: '昇順（古い順）',
      descendingNewest: '降順（新しい順）',
    },
    // Badges
    badges: {
      staged: 'ステージ済み',
      requiresPrevious: '前の成功が必要',
      autoPowerOff: '自動電源オフ',
      gcodeInjection: 'G-code',
    },
    // Empty state
    empty: {
      title: 'スケジュールされた印刷はありません',
      description: 'アーカイブページのコンテキストメニューから「スケジュール」オプションを使用するか、ファイルをドラッグ＆ドロップして始めましょう。',
    },
    // Time
    time: {
      etaIfStartedNow: 'このジョブを今開始した場合の完了予定時刻',
      asap: '即時',
      overdue: '期限超過',
      now: '今すぐ',
      lessThanMinute: '1分以内',
      inMinutes: '{{count}}分後',
      inHours: '{{count}}時間後',
    },
    // Actions
    actions: {
      startPrint: '印刷を開始',
      stopPrint: '印刷を停止',
      requeue: '再キュー',
    },
    // Bulk edit
    bulkEdit: {
      title: '{{count}}件のアイテムを編集',
      title_plural: '{{count}}件のアイテムを編集',
      description: '変更した設定のみが選択されたアイテムに適用されます。',
      printer: 'プリンター',
      noChange: '— 変更なし —',
      queueOptions: 'キューオプション',
      staged: 'ステージ済み',
      autoPowerOff: '印刷後に自動電源オフ',
      requirePrevious: '前の成功を必要とする',
      printOptions: '印刷オプション',
      bedLevelling: 'ベッドレベリング',
      flowCalibration: 'フローキャリブレーション',
      vibrationCalibration: '振動キャリブレーション',
      layerInspection: '第一層検査',
      timelapse: 'タイムラプス',
      useAms: 'AMS使用',
      nozzleOffsetCali: 'ノズルオフセットキャリブレーション',
      applyChanges: '変更を適用',
      selectAll: 'すべて選択',
      deselectAll: 'すべて選択解除',
      selected: '{{count}}件選択中',
      editSelected: '選択を編集',
      cancelSelected: '選択をキャンセル',
    },
    // Confirmations
    confirm: {
      cancelTitle: 'スケジュール済み印刷をキャンセル',
      cancelMessage: '「{{name}}」をキャンセルしますか？',
      stopTitle: '印刷を停止',
      stopMessage: '現在の印刷「{{name}}」を停止しますか？プリンター上の印刷ジョブがキャンセルされます。',
      removeTitle: '履歴から削除',
      removeMessage: '「{{name}}」をキュー履歴から削除しますか？',
      clearHistoryTitle: '履歴をクリア',
      clearHistoryMessage: '{{count}}件の履歴をすべて削除しますか？',
      cancelButton: '印刷をキャンセル',
      stopButton: '印刷を停止',
      thisPrint: 'この印刷',
      thisItem: 'このアイテム',
    },
    // Toast messages
    toast: {
      cancelled: 'キャンセル済み',
      cancelFailed: 'アイテムのキャンセルに失敗しました',
      removed: 'キューアイテムを削除しました',
      removeFailed: 'プロジェクトからのアーカイブ削除に失敗しました',
      stopped: '印刷を停止しました',
      stopFailed: '印刷の停止に失敗しました',
      released: '印刷をキューにリリースしました',
      startFailed: '印刷の開始に失敗しました',
      reorderFailed: 'キューの並べ替えに失敗しました',
      historyCleared: '{{count}}件の履歴をクリアしました',
      clearHistoryFailed: '履歴のクリアに失敗しました',
      updateFailed: 'アイテムの更新に失敗しました',
      bulkCancelled: '{{count}}件のアイテムをキャンセルしました',
      bulkCancelFailed: 'アイテムのキャンセルに失敗しました',
      batchCreated: 'バッチ「{{name}}」を作成しました',
      batchCreateFailed: 'バッチの作成に失敗しました',
      batchUngrouped: '{{count}}件のグループを解除しました',
      batchUngroupFailed: 'バッチのグループ解除に失敗しました',
      resumedAfterFailure: 'キューを再開しました — {{restored}}件のジョブを保留状態に戻しました',
      resumeAfterFailureFailed: 'キューの再開に失敗しました',
    },
    resumeAfterFailure: {
      banner: '{{printer}} は前回の印刷失敗によりブロックされています — {{count}}件のジョブをスキップしました',
      bannerHint: 'プリンターの問題を解決してから再開すると、スキップされたジョブを復元してブロックを解除できます。',
      button: '失敗後に再開',
      confirmTitle: '失敗後にキューを再開しますか？',
      confirmMessage: '{{printer}} のスキップされた {{count}} 件のジョブを保留状態に戻し、前回の印刷ブロックを解除します。続行する前にプリンターが準備完了していることを確認してください。',
    },
    // Timeline view
    timeline: {
      listView: 'リスト',
      timelineView: 'タイムライン',
      unassigned: '未割当',
      noData: 'この日の予定された印刷はありません',
      nothingCommitted: 'この時間枠に確定したスケジュールはありません。手動開始のステージ済み項目、待機中の項目、アイドル状態のプリンターのASAPジョブは表示されません — 予定時刻を設定するか、ステージ済み項目をリリースすると表示されます。',
      allDoneBy: 'すべての印刷は {{time}} までに完了予定',
      staged: 'ステージング',
      filterAll: 'すべて表示',
      filterPrinting: '印刷中',
      filterQueued: '待機中',
      time: {
        anyMoment: 'まもなく',
        minutesLeft: '残り{{minutes}}分',
        hoursLeft: '残り{{hours}}時間',
        hoursMinutesLeft: '残り{{hours}}時間{{minutes}}分',
      },
      day: {
        previous: '前日',
        next: '翌日',
        today: '今日',
      },
      window: {
        back12h: '12時間戻る',
        forward12h: '12時間進む',
        now: '現在',
      },
      printerColumnHeader: 'プリンター',
    },
    // Permissions
    permissions: {
      noStopPrint: '印刷を停止する権限がありません',
      noStartPrint: '印刷を開始する権限がありません',
      noEdit: 'このキューアイテムを編集する権限がありません',
      noCancel: 'このキューアイテムをキャンセルする権限がありません',
      noRequeue: 'アイテムを再キューする権限がありません',
      noRemove: 'このキューアイテムを削除する権限がありません',
      noClearHistory: 'すべての履歴をクリアする権限がありません',
      noEditItems: 'キューアイテムを編集する権限がありません',
      noCancelItems: 'キューアイテムをキャンセルする権限がありません',
    },
  },

  // Statistics page
  stats: {
    title: '統計',
    subtitle: 'ウィジェットをドラッグして並べ替え。目のアイコンをクリックして非表示。',
    overview: '概要',
    totalPrints: '総印刷数',
    successRate: '成功率',
    totalPrintTime: '総印刷時間',
    printTime: '印刷時間',
    totalFilament: '総フィラメント使用量',
    filamentUsed: 'フィラメント使用量',
    filamentCost: 'フィラメントコスト',
    totalCost: '総コスト',
    energyUsed: 'エネルギー使用量',
    energyCost: 'エネルギーコスト',
    energyWarmingUpTooltip: 'エネルギー追跡は毎時スナップショットを収集中です。選択範囲の前に少なくとも1つのスナップショットが存在すると、期間合計が正確になります。初期値は過小になる場合があります。',
    averagePrintTime: '平均印刷時間',
    printsPerDay: '1日あたりの印刷数',
    byPrinter: 'プリンター別',
    printsByPrinter: 'プリンター別印刷数',
    byMaterial: '素材別',
    byMonth: '月別',
    last7Days: '過去7日間',
    last30Days: '過去30日間',
    last90Days: '過去90日間',
    allTime: '全期間',
    // Widgets
    quickStats: 'クイック統計',
    printActivity: '印刷アクティビティ',
    filamentTypes: 'フィラメントタイプ',
    filamentTrends: 'フィラメントトレンド',
    failureAnalysis: '失敗分析',
    timeAccuracy: '時間精度',
    successful: '成功',
    failed: '失敗',
    cancelled: 'キャンセル',
    perfectEstimate: '100% = 完全な推定',
    noTimeAccuracyData: '時間精度データがありません',
    noFilamentData: 'フィラメントデータがありません',
    noPrinterData: 'プリンターデータがありません',
    noPrintData: '印刷データがありません',
    noPrintDataLast30Days: '過去30日間の印刷データがありません',
    failureReasons: '失敗理由',
    topFailureReasons: '主な失敗理由',
    failedPrintsCount: '{{failed}} / {{total}} 件の印刷が失敗',
    lastWeekRate: '先週: {{rate}}%',
    // Actions
    resetLayout: 'レイアウトをリセット',
    recalculateCosts: 'コストを再計算',
    recalculateCostsHint: '現在のフィラメント価格ですべてのアーカイブコストを再計算',
    exportStats: '統計をエクスポート',
    exportAsCsv: 'CSVでエクスポート',
    exportAsExcel: 'Excelでエクスポート',
    hiddenCount: '{{count}}件非表示',
    // Toast
    exportDownloaded: 'エクスポートをダウンロードしました',
    exportFailed: 'エクスポートに失敗しました',
    layoutReset: 'レイアウトをリセットしました',
    recalculatedCosts: '{{count}}件のアーカイブのコストを再計算しました',
    recalculateFailed: 'コストの再計算に失敗しました',
    // Loading
    loadingStats: '統計を読み込み中...',
    // Permissions
    noPermissionResetLayout: 'レイアウトをリセットする権限がありません',
    noPermissionRecalculate: 'コストを再計算する権限がありません',
    noPrintDataInRange: '選択した期間にデータがありません',
    periodFilament: 'フィラメント使用量',
    periodCost: 'コスト',
    avgPerPrint: '1印刷あたりの平均',
    usageOverTime: '時間推移',
    energyOverTime: 'エネルギー使用量の推移',
    filamentByWeight: '重量',
    printDuration: '印刷時間分布',
    printerUtilization: 'プリンター稼働率',
    filamentSuccess: '素材別成功率',
    printHabits: '印刷習慣',
    printTimeOfDay: '時間帯別プリント',
    colorDistribution: 'カラー分布',
    noColorData: 'カラーデータがありません',
    records: '記録',
    longestPrint: '最長プリント',
    heaviestPrint: '最重プリント',
    mostExpensivePrint: '最高額',
    busiestDay: '最多プリント日',
    successStreak: '連続成功',
    streakPrint: '連続プリント',
    streakPrints: '{{count}}連続プリント',
    printerStats: 'プリンター統計',
    hours: '時間',
    avgPrints: '平均印刷数',
    noArchiveData: '印刷データがありません',
    filamentByTime: '推移',
    avgWeight: '平均重量',
    avgTime: '平均時間',
    filamentByPrints: '印刷数',
    timeframe: {
      today: '今日',
      'this-week': '今週',
      'this-month': '今月',
      'last-7': '過去7日間',
      'last-30': '過去30日間',
      'last-90': '過去90日間',
      'this-year': '今年',
      'all-time': '全期間',
      custom: 'カスタム',
      from: '開始',
      to: '終了',
    },
    allUsers: '全ユーザー',
    noUser: 'ユーザーなし（システム）',
    filterByUser: 'ユーザーでフィルター',
  },

  // 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: '現在の時間',
    // Tabs
    statusTab: 'ステータス',
    settingsTab: '設定',
    // Status
    overdueCount: '{{count}}件超過',
    dueSoonCount: '{{count}}件まもなく期限',
    dueSoon: 'まもなく期限',
    allGood: '問題なし',
    overdueBy: '{{duration}}超過',
    dueIn: 'あと{{duration}}',
    timeLeft: '残り{{duration}}',
    // Duration formats
    day: '1日',
    days: '{{count}} 日',
    week: '1週間',
    weeks: '{{count}}週間',
    month: '1ヶ月',
    months: '{{count}}ヶ月',
    year: '1年',
    // Settings
    maintenanceTypes: 'メンテナンスタイプ',
    maintenanceTypesDescription: 'システムタイプとカスタムメンテナンスタスク',
    addCustomType: 'カスタムタイプを追加',
    restoreDefaults: 'デフォルトタスクを復元',
    intervalType: 'インターバルタイプ',
    intervalValue: '間隔 ({{type}})',
    icon: 'アイコン',
    documentationLink: 'ドキュメントリンク（任意）',
    assignToPrinters: 'プリンターに割り当て',
    selectAtLeastOnePrinter: 'プリンターを1台以上選択してください',
    addType: 'タイプを追加',
    custom: 'カスタム',
    printHours: '印刷時間',
    calendarDays: 'カレンダー日数',
    exampleName: '例: HEPAフィルター交換',
    viewDocumentation: 'ドキュメントを表示',
    timeBasedInterval: '時間ベースのインターバル',
    // Interval overrides
    intervalOverrides: 'インターバルのオーバーライド',
    intervalOverridesDescription: '特定のプリンターの間隔をカスタマイズ',
    // Printer assignment
    assignedToPrinters: '割り当て済みプリンター：',
    noPrintersAssigned: 'プリンター未割り当て',
    addPrinterShort: '追加:',
    printersAssignedClick: '{{count}}台のプリンターを割り当て済み - クリックして管理',
    removeFromPrinter: 'このプリンターから削除',
    // Types
    types: {
      lubricateCarbonRods: 'カーボンロッドの潤滑',
      lubricateRails: 'リニアレールの潤滑',
      cleanNozzle: 'ノズル/ホットエンドの清掃',
      checkBelts: 'ベルト張力の確認',
      cleanBuildPlate: 'ビルドプレートの清掃',
      checkExtruder: 'エクストルーダーギアの確認',
      checkCooling: '冷却ファンの確認',
      generalInspection: '総合点検',
      cleanCarbonRods: 'カーボンロッドの清掃',
      lubricateSteelRods: 'スチールロッドの潤滑',
      cleanSteelRods: 'スチールロッドの清掃',
      cleanLinearRails: 'リニアレールの清掃',
      checkPtfeTube: 'PTFEチューブの確認',
      replaceHepaFilter: 'HEPAフィルター交換',
      replaceCarbonFilter: 'カーボンフィルター交換',
      lubricateLeftNozzleRail: '左ノズルレールの潤滑',
    },
    // Toast
    maintenanceComplete: 'メンテナンスを完了としてマークしました',
    typeUpdated: 'メンテナンスタイプを更新しました',
    typeDeleted: 'メンテナンスタイプを削除しました',
    defaultsRestored: 'デフォルトタスクを{{count}}件復元しました',
    printHoursUpdated: '印刷時間を更新しました',
    printerAssigned: 'プリンターを割り当てました',
    printerRemoved: 'プリンターを削除しました',
    // Confirmation
    deleteTypeConfirm: '「{{name}}」を削除しますか？',
    deleteSystemTypeTitle: 'デフォルトのメンテナンスタスクを削除しますか？',
    deleteSystemTypeMessage: 'デフォルトのメンテナンスタスク「{{name}}」を削除してもよろしいですか？',
    // Permissions
    noPermissionUpdate: 'メンテナンス記録を更新する権限がありません',
    noPermissionPerform: 'メンテナンスを実行する権限がありません',
    noPermissionEditTypes: 'メンテナンスタイプを編集する権限がありません',
    noPermissionDeleteTypes: 'メンテナンスタイプを削除する権限がありません',
    noPermissionEditHours: 'メンテナンス時間を編集する権限がありません',
    noPermissionRemovePrinter: 'プリンターの割り当てを解除する権限がありません',
    noPermissionAssignPrinter: 'プリンターを割り当てる権限がありません',
    noPermissionEditIntervals: 'メンテナンス間隔を編集する権限がありません',
    // Configure link
    configureSettings: 'メンテナンスタイプと間隔を設定',
  },

  // Settings page
  settings: {
    sliceEngine: 'スライスエンジン',
    sliceEngineSidecar: 'サーバーサイドカー',
    sliceEngineSidecarHint: 'スライスはサーバー上のスライサーサイドカーコンテナーで実行されます。',
    sliceEngineBrowser: 'ブラウザー内',
    sliceEngineBrowserHint: 'スライスはサーバーを介さず、このデバイス上で実行されます。',
    title: '設定',
    general: '一般',
    // Tab names
    tabs: {
      general: '一般',
      smartPlugs: 'スマートプラグ',
      notifications: '通知',
      queue: 'ワークフロー',
      queueDispatch: 'キューとディスパッチ',
      queuePipelines: 'パイプライン',
      filament: 'フィラメント',
      network: 'ネットワーク',
      apiKeys: 'APIキー',
      virtualPrinter: '仮想プリンター',
      spoolbuddy: 'SpoolBuddy',
      failureDetection: '失敗検出',
      users: '認証',
      backup: 'バックアップ',
      emailAuth: 'メール認証',
      ldap: 'LDAP',
      twoFa: '二段階認証',
      oidc: 'SSO / OIDC',
      security: 'セキュリティ',
    },
    spoolbuddy: {
      infoTitle: 'SpoolBuddy デバイス',
      infoBody: 'SpoolBuddy キオスクはハートビートにより自動的に登録されます。使用されなくなった場合や、デーモンのクラッシュにより古い重複が残った場合は、ここでデバイスの登録を解除してください。',
      duplicatesTitle: '{{count}} 台のデバイスが登録されています',
      duplicatesBody: 'キオスク UI は最初に登録されたデバイスのみを使用します。クラッシュによる古い重複がある場合は登録解除してください。オンラインのデバイスは次回のハートビートで自動的に再登録されます。',
      empty: 'SpoolBuddy デバイスはまだ登録されていません。',
      online: 'オンライン',
      offline: 'オフライン',
      unregister: '登録解除',
      unregisterSuccess: 'デバイスの登録を解除しました',
      unregisterError: 'デバイスの登録解除に失敗しました',
      confirmTitle: 'SpoolBuddy デバイスの登録を解除しますか？',
      confirmBody: '「{{hostname}}」（{{deviceId}}）をデータベースから削除します。デバイスがオンラインの場合、次回のハートビートで自動的に再登録されます。',
      ipAddress: 'IPアドレス',
      firmware: 'ファームウェア',
      lastSeen: '最終接続',
      daemonUptime: 'デーモン稼働時間',
      systemUptime: 'システム稼働時間',
      never: 'なし',
      nfc: 'NFC',
      scale: '計量器',
      cpuTemp: 'CPU 温度',
      cpuLoad: 'CPU 負荷',
      memory: 'メモリ',
      disk: 'ディスク',
      update: 'アップデート',
      updateConfirmTitle: 'Spoolbuddyデーモンを更新しますか？',
      updateConfirmBody: '"{{hostname}}"のソフトウェア更新を実行しますか？更新後にデーモンが再起動されます。',
      restartBrowser: 'ブラウザを再起動',
      restartBrowserConfirmTitle: 'キオスクブラウザを再起動しますか？',
      restartBrowserConfirmBody: '"{{hostname}}"のキオスクブラウザを再起動しますか？画面が一時的に消えます。',
      restartDaemon: 'デーモンを再起動',
      restartDaemonConfirmTitle: 'Spoolbuddyデーモンを再起動しますか？',
      restartDaemonConfirmBody: '"{{hostname}}"のSpoolbuddyデーモンを再起動しますか？デバイスが数秒間オフラインになります。',
      reboot: '再起動',
      rebootConfirmTitle: 'デバイスを再起動しますか？',
      rebootConfirmBody: '"{{hostname}}"を再起動しますか？デバイスは約1分間オフラインになります。',
      shutdown: 'シャットダウン',
      shutdownConfirmTitle: 'デバイスをシャットダウンしますか？',
      shutdownConfirmBody: '"{{hostname}}"をシャットダウンしますか？再起動には物理的なアクセスが必要です。',
      commandConfirm: '確認',
      commandQueued: 'コマンドをキューに追加しました',
      commandError: 'コマンドの送信に失敗しました',
    },
    ldap: {
      title: 'LDAP認証',
      enabledDesc: 'LDAP認証が有効です',
      disabledDesc: 'LDAP認証が無効です',
      disabledHint: '以下のLDAP設定を構成して保存し、有効にしてください。',
      enabled: 'LDAP認証を有効にしました',
      disabled: 'LDAP認証を無効にしました',
      feature1: 'LDAP資格情報でログインできます',
      feature2: 'ローカル管理者アカウントはフォールバックとして残ります',
      feature3: 'ログイン時にLDAPグループがBamBuddyグループにマッピングされます',
      serverConfig: 'LDAPサーバー設定',
      serverUrl: 'サーバーURL',
      serverUrlHint: '標準はldap://、SSL接続はldaps://を使用',
      security: 'セキュリティ',
      securityHint: 'StartTLSはプレーン接続をTLSにアップグレードします。LDAPSは最初からTLSを使用します。',
      bindDn: 'バインドDN（サービスアカウント）',
      bindPassword: 'バインドパスワード',
      searchBase: '検索ベースDN',
      userFilter: 'ユーザー検索フィルター',
      userFilterHint: '{username}はログインユーザー名に置き換えられます。OpenLDAPの場合は(uid={username})を使用。',
      advanced: '詳細設定',
      autoProvision: 'ユーザー自動作成',
      autoProvisionHint: '初回LDAPログイン時にBamBuddyアカウントを自動作成',
      defaultGroup: 'デフォルトグループ',
      defaultGroupNone: '— なし（フォールバックなし）—',
      defaultGroupHint: 'LDAPユーザーが認証されたがマッピングされたLDAPグループに属していない場合に割り当てられるフォールバックグループ。空欄の場合、マッピングされていないユーザーは権限なしのままになります。',
      groupMapping: 'グループマッピング（JSON）',
      groupMappingHint: 'LDAPグループDNをBamBuddyグループにマッピング。利用可能なグループ: ',
      testConnection: '接続テスト',
      settingsSaved: 'LDAP設定を保存しました',
      errors: {
        serverRequired: 'LDAPサーバーURLは必須です',
        searchBaseRequired: '検索ベースDNは必須です',
        enableAuthFirst: '先に認証を有効にしてください',
        configureLdapFirst: '先にLDAP設定を保存してください',
      },
    },
    // Email settings
    email: {
      smtpSettings: 'SMTP設定',
      smtpHost: 'SMTPサーバー',
      smtpPort: 'SMTPポート',
      security: 'セキュリティ',
      authentication: '認証',
      username: 'ユーザー名',
      password: 'パスワード',
      fromEmail: '送信元メールアドレス',
      fromName: '送信者名',
      testConnection: 'SMTP接続テスト',
      testRecipient: 'テスト受信者メール',
      sendTest: 'テストメール送信',
      sending: '送信中...',
      save: '設定を保存',
      saving: '保存中...',
      advancedAuth: '高度な認証',
      advancedAuthEnabled: '高度な認証が有効です',
      advancedAuthEnabledDesc: 'メールベースのユーザー管理機能が有効になっています。新規ユーザーには自動生成されたパスワードがメールで送信され、ユーザーはパスワード忘れ機能でパスワードをリセットできます。',
      advancedAuthDisabled: '高度な認証が無効です',
      advancedAuthDisabledDesc: '高度な認証を有効にして、ユーザー管理のメールベース機能を有効化してください。',
      enable: '有効にする',
      disable: '無効にする',
      feature1: 'パスワードは自動生成され、新規ユーザーにメールで送信されます',
      feature2: 'ユーザーはユーザー名またはメールでログインできます',
      feature3: 'パスワード忘れ機能が利用可能です',
      feature4: '管理者はメールでユーザーパスワードをリセットできます',
      // Error messages
      errors: {
        requiredFields: 'すべての必須フィールドに入力してください',
        usernameRequired: '認証が有効な場合、ユーザー名は必須です',
        enterTestEmail: 'テストメールアドレスを入力してください',
        smtpServerAndEmail: 'テストする前にSMTPサーバーと送信元メールを入力してください',
        usernamePasswordRequired: '認証が有効な場合、ユーザー名とパスワードは必須です',
        configureSmtpFirst: '最初にSMTP設定を構成してテストしてください',
        enableAuthFirst: 'メール関連機能をご利用いただくには、まず認証を有効にしてください。',
      },
      // Success messages
      success: {
        settingsSaved: 'SMTP設定を保存しました',
      },
      // Security options
      securityOptions: {
        starttls: 'STARTTLS (ポート 587)',
        ssl: 'SSL/TLS (ポート 465)',
        none: 'なし (ポート 25)',
      },
      // Authentication options
      authOptions: {
        enabled: '有効',
        disabled: '無効',
      },
    },
    appearance: '外観',
    notifications: '通知',
    smartPlugs: 'スマートプラグ',
    spoolman: 'Spoolman',
    updates: 'アップデート',
    language: '言語',
    languageDescription: '表示言語を選択してください',
    theme: 'テーマ',
    themeLight: 'ライト',
    themeDark: 'ダーク',
    themeSystem: 'システム設定に従う',
    defaultView: 'デフォルト画面',
    defaultViewDescription: 'アプリ起動時に表示するページ',
    checkForUpdates: 'アップデートを確認',
    autoUpdate: '自動アップデート',
    currentVersion: '現在のバージョン',
    latestVersion: '最新バージョン',
    upToDate: '最新です',
    updateAvailable: 'アップデートあり',
    // Notifications
    notificationLanguage: '通知の言語',
    notificationLanguageDescription: 'プッシュ通知の言語',
    bedCooledThreshold: 'ベッド冷却しきい値',
    bedCooledThresholdDescription: '印刷後にベッドが冷却されたと見なす温度',
    userNotificationsEnabled: 'ユーザー通知',
    userNotificationsEnabledDescription: 'ユーザー通知メニューと印刷ジョブイベントのメール通知を有効にします。高度な認証が必要です。',
    userNotificationsDisabledHint: 'ユーザー通知を使用するには高度な認証を有効にしてください。',
    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: '電源オフ',
    },
    // Filament Tracking Mode
    filamentTracking: 'フィラメント追跡',
    filamentTrackingDesc: 'フィラメントスプールの追跡方法を選択してください。内蔵インベントリまたは外部Spoolmanサーバーを使用できます。',
    autoAddUnknownRfid: '不明なRFIDスプールを自動追加',
    autoAddUnknownRfidDesc: '不明なRFIDタグのスプールが検出されたとき、自動的に在庫エントリを作成します。新しいスプールを事前に手動で登録している場合は、重複を避けるためにオフにしてください。',
    filamentChecks: 'フィラメントチェック',
    disableFilamentWarnings: 'フィラメント警告を無効化',
    disableFilamentWarningsDesc: '印刷またはキュー追加時にフィラメント不足の警告を表示しない',
    preferLowestFilament: '残量が少ないフィラメントを優先',
    preferLowestFilamentDesc: '複数のスプールが一致する場合、残量が最も少ないものを使用します',
    preferLowestFilamentBackupNote: 'プリンタ側でAMSフィラメントバックアップが有効な場合のみ動作します。無効の場合、選択したスプールが切れても予備スプールに切り替えできません。',
    trackingModeBuiltIn: '内蔵インベントリ',
    trackingModeBuiltInDesc: 'RFID自動検出と使用量追跡を含む',
    trackingModeSpoolmanDesc: '外部フィラメント管理サーバー',
    builtInFeatureRfid: 'AMS内のBambu Lab RFIDスプールを自動検出',
    builtInFeatureUsage: 'プリントごとのフィラメント消費量を追跡',
    builtInFeatureCatalog: 'スプール、カラー、K値プロファイルを管理',
    builtInFeatureThirdParty: 'サードパーティ製スプールをインベントリスプールに割り当て可能',
    amsSyncButton: 'AMSから重量を同期',
    amsSyncTitle: 'AMSからスプール重量を同期',
    amsSyncMessage: '接続されたプリンターの現在のAMS残量値で、すべてのインベントリスプール重量を上書きします。破損した重量データの復旧に使用してください。プリンターがオンラインである必要があります。',
    amsSyncing: '同期中...',
    amsSyncSuccess: '{{synced}}個のスプールを同期、{{skipped}}個をスキップ',
    amsSyncError: 'AMSからの重量同期に失敗しました',
    spoolmanAmsSyncButton: 'AMSからSpoolmanの重量を同期',
    spoolmanAmsSyncTitle: 'AMSからSpoolmanスプール重量を同期',
    spoolmanAmsSyncMessage: '接続されたプリンターの現在のAMS残量値に基づいて、すべてのSpoolmanスプール重量を更新します。プリンターがオンラインである必要があります。',
    spoolmanAmsSyncing: '同期中...',
    spoolmanAmsSyncSuccess: '{{synced}}個のSpoolmanスプールを同期、{{skipped}}個をスキップ',
    spoolmanAmsSyncError: 'AMSからのSpoolman重量同期に失敗しました',
    spoolmanAmsSyncErrorUnreachable: '同期失敗（Spoolmanに接続できません）',
    spoolmanAmsSyncErrorNotConfigured: '同期失敗（Spoolmanが設定されていません）',
    spoolmanNotConfigured: 'Spoolmanが設定されていません',
    // Spoolman filament catalog section in spool catalog settings
    spoolmanFilamentCatalogTitle: 'Spoolmanフィラメントカタログ',
    spoolmanFilamentCatalogDesc: 'Spoolmanインスタンスのフィラメント名と風袋重量。名前とスプール重量はここで編集できます。その他の属性はSpoolmanで直接管理してください。',
    // Spoolman settings
    spoolmanUrl: 'Spoolman URL',
    spoolmanUrlHint: 'Spoolmanサーバーのurl（例：http://localhost:7912）',
    spoolmanConnected: '接続中',
    spoolmanDisconnected: '未接続',
    status: 'ステータス',
    connect: '接続',
    disconnect: '切断',
    howSyncWorks: '同期の仕組み',
    syncInfoRfidOnly: 'RFIDを搭載した公式Bambu Labスプールのみ同期されます',
    syncInfoAutoCreate: '新しいスプールは初回同期時にSpoolmanに自動作成されます',
    syncInfoThirdPartySkipped: 'Bambu Lab以外のスプール（サードパーティ、リフィル）はスキップされます',
    linkingExistingSpools: '既存スプールのリンク',
    linkingExistingSpoolsDesc: '既存のSpoolmanスプールをAMSにリンクするには、AMSスロットにカーソルを合わせて「Spoolmanにリンク」をクリックしてください。',
    syncMode: '同期モード',
    syncModeAuto: '自動',
    syncModeManual: '手動のみ',
    syncModeAutoDesc: '変更が検出されるとAMSデータが自動的に同期されます',
    syncModeManualDesc: '手動でトリガーした場合のみ同期',
    syncAmsData: 'AMSデータを同期',
    syncAmsDataDesc: 'プリンターのAMSデータをSpoolmanに手動同期',
    allPrinters: '全プリンター',
    // Default printer
    noDefaultPrinter: 'デフォルトなし（毎回選択）',
    // Sidebar
    sidebarOrder: 'サイドバーの順序',
    // Camera
    saveThumbnails: 'サムネイルを保存',
    captureFinishPhoto: '完了写真を撮影',
    noPrintersConfigured: 'プリンターが設定されていません',
    // Archive settings
    archiveMode: {
      always: '常にアーカイブを作成',
      never: 'アーカイブを作成しない',
      ask: '毎回確認',
    },
    // Updates
    checkForUpdatesLabel: 'アップデートを確認',
    checkPrinterFirmware: 'プリンターファームウェアの確認',
    includeBetaUpdates: 'ベータ版を含める',
    includeBetaUpdatesDesc: 'アップデート確認時にベータ版およびプレリリース版を通知する',
    localLogin: {
      disable: 'ローカルのユーザー名／パスワードログインを無効化',
      disableHint: '有効にすると、SSOプロバイダーのみでサインインできます。LDAPには影響しません。復旧用のパスを残すには、サーバーで BAMBUDDY_LOCAL_LOGIN=true を設定してください。',
    },
    // Queue
    enableRetry: 'リトライを有効化',
    // Home Assistant
    homeAssistantDescription: 'Home Assistantに接続してHA REST APIでスマートプラグを制御します。switch、light、input_booleanエンティティに対応しています。',
    environmentManagedLabel: '(環境変数で管理)',
    autoEnabledViaEnv: '環境変数により自動的に有効化されました',
    urlFromEnvReadOnly: 'HA_URL環境変数で設定された値（読み取り専用）',
    tokenFromEnvReadOnly: 'HA_TOKEN環境変数で設定された値（読み取り専用）',
    // MQTT
    mqttConnectedTo: '接続先:',
    // Prometheus
    prometheusDescription: 'プリンターデータをPrometheus形式で公開',
    // Smart plugs empty state
    noSmartPlugsTitle: 'スマートプラグが設定されていません',
    noSmartPlugsDescription: 'Tasmotaベースのスマートプラグを追加して、エネルギー消費を追跡し、電源制御を自動化します。',
    // Notifications empty state
    noProvidersTitle: 'プロバイダーが設定されていません',
    noProvidersDescription: 'アラートを受信するにはプロバイダーを追加してください。',
    noTemplatesAvailable: 'テンプレートがありません。バックエンドを再起動してデフォルトテンプレートを生成してください。',
    // API permissions
    apiPermissionView: 'プリンターステータスとキューを表示',
    apiPermissionEdit: '印刷キューにアイテムを追加・削除',
    // API keys
    apiKeysEmptyTitle: 'APIキーがありません',
    apiKeysEmptyDescription: '外部サービスと連携するためのAPIキーを作成してください。',
    // Users
    noUsersFound: 'ユーザーが見つかりません',
    noGroupsFound: 'グループが見つかりません',
    noGroupsAvailable: '利用可能なグループがありません',
    passwordsDoNotMatch: 'パスワードが一致しません',
    systemGroupWarning: 'システムグループ名は変更できません',
    // Auth disabled
    authDisabledTitle: '認証が無効です',
    authDisabledFeature1: 'システムへのアクセスにログインを要求',
    authDisabledFeature2: 'グループベースの権限で複数ユーザーを作成',
    authDisabledFeature3: '50以上のきめ細かな権限でアクセスを制御',
    // User deletion
    userHasCreated: 'このユーザーは以下を作成しています：',
    userItemsQuestion: 'これらのアイテムをどうしますか？',
    deleteUserConfirm: 'このユーザーを削除してもよろしいですか？この操作は元に戻せません。',
    actionCannotBeUndone: 'この操作は元に戻せません',
    // Smart plugs
    addFirstSmartPlug: '最初のスマートプラグを追加',
    // Notifications
    providers: 'プロバイダー',
    log: 'ログ',
    testAll: 'すべてテスト',
    testResults: 'テスト結果',
    testPassedCount: '{{count}}件成功',
    testFailedCount: '{{count}}件失敗',
    messageTemplates: 'メッセージテンプレート',
    messageTemplatesDescription: '各イベントの通知メッセージをカスタマイズ。',
    // API Keys section
    apiKeys: 'APIキー',
    apiKeysDescription: '外部連携やWebhook用のAPIキーを作成します。',
    createKey: 'キーを作成',
    apiKeyCreated: 'APIキーを作成しました',
    apiKeyCopyWarning: '今すぐこのキーをコピーしてください - 再表示されません！',
    useInApiBrowser: 'APIブラウザーで使用',
    apiKeyQrButton: 'QRコード',
    apiKeyQrTitle: 'スキャンして設定',
    apiKeyQrCaption: 'モバイルアプリでスキャンして、このサーバーとAPIキーを追加します。',
    apiKeyQrWarning: '秘密のAPIキーが含まれています。他人に見られる場所で共有・スクリーンショットしないでください。',
    createNewApiKey: '新しいAPIキーを作成',
    keyName: 'キー名',
    keyNamePlaceholder: '例: Home Assistant, OctoPrint',
    readStatus: 'ステータスの読み取り',
    readStatusDescription: 'プリンターのステータス、キュー、ライブラリ、アーカイブ、スライサーパイプラインを表示',
    manageQueue: 'キューの管理',
    manageQueueDescription: '印刷キューへのアイテムの追加と削除。「ライブラリの管理」と併せてスライサーパイプラインを実行',
    controlPrinter: 'プリンターの制御',
    controlPrinterDescription: '印刷の一時停止、再開、停止',
    manageLibrary: 'ライブラリの管理',
    manageLibraryDescription: 'ライブラリファイルのアップロード、名前変更、削除、スライス。MakerWorld からのモデルインポート。「キューの管理」と併せてスライサーパイプラインを実行。',
    manageInventory: '在庫の管理',
    manageInventoryDescription: 'スプールと在庫レコードの作成、更新、削除。SpoolBuddy キオスク（NFC スキャン、はかり読み取り、キオスクのシステムコマンド）に必要です。',
    manageMaintenance: 'メンテナンスの管理',
    manageMaintenanceDescription: '完了したメンテナンスの記録、カウンターのリセット、間隔の編集、メンテナンス種類カタログの管理。より広範なプリンター制御を許可することなく「ノズルをクリーニングした」を記録する Home Assistant オートメーションに適しています。',
    manageArchives: 'アーカイブの管理',
    manageArchivesDescription: '古い印刷とその統計への寄与の削除を含む、印刷アーカイブの編集と削除。印刷履歴を整理するオートメーションに適しています。',
    manageProjects: 'プロジェクトの管理',
    manageProjectsDescription: 'プロジェクトの作成、更新、削除、およびプロジェクトへのアーカイブの追加。印刷をプロジェクトに整理するオートメーションに適しています。',
    maintenanceBadge: 'メンテナンス',
    archivesBadge: 'アーカイブ',
    projectsBadge: 'プロジェクト',
    libraryBadge: 'ライブラリ',
    inventoryBadge: '在庫',
    cloudAccess: 'クラウドアクセスを許可',
    cloudAccessDescription: 'Bambu Cloudのプリセットとフィラメントを代わりに読み込みます。Bambu Cloudへのサインインが必要です。',
    cloudBadge: 'クラウド',
    updateEnergyCost: '電気料金を更新',
    updateEnergyCostDescription: 'このキーが /settings/electricity-price に新しいkWhごとの電気料金をPOSTすることを許可。Home Assistantの動的料金自動化（Tibber、Octopusなど）に便利。これはAPIキーで書き込み可能な唯一の設定フィールドです。',
    energyCostBadge: '電力',
    legacyKey: 'レガシー',
    legacyKeyTooltip: 'ユーザー所有以前に作成 - クラウドアクセスには再作成が必要',
    unnamedKey: '名前なしキー',
    lastUsed: '最終使用:',
    read: '読み取り',
    control: '制御',
    createFirstKey: '最初のキーを作成',
    webhookEndpoints: 'Webhookエンドポイント',
    webhookApiKeyHint: 'X-API-KeyヘッダーでAPIキーを使用してください。',
    webhook: {
      getAllStatus: '全プリンターステータスを取得',
      getSpecificStatus: '特定のプリンターステータスを取得',
      addToQueue: '印刷キューに追加',
      pausePrint: '印刷を一時停止',
      resumePrint: '印刷を再開',
      stopPrint: '印刷を停止',
    },
    apiBrowser: 'APIブラウザ',
    apiBrowserDescription: 'すべての利用可能なAPIエンドポイントを探索してテストします。',
    apiKeyForTesting: 'テスト用APIキー',
    apiKeyPlaceholder: 'CallMeBot APIキー',
    apiKeyHint: 'このキーはX-API-Keyヘッダーとしてリクエストに送信されます。',
    deleteApiKeyTitle: 'APIキーを削除',
    deleteApiKeyMessage: 'このAPIキーを削除してもよろしいですか？このキーを使用しているすべての連携が動作しなくなります。',
    deleteKey: 'キーを削除',
    // Filament tab
    amsDisplayThresholds: 'AMS表示しきい値',
    amsThresholdsDescription: 'AMS湿度と温度インジケーターの色しきい値を設定します。',
    humidity: '湿度',
    goodGreen: '良好（緑）≤',
    fairOrange: '普通（オレンジ）≤',
    aboveFairBad: '普通のしきい値以上は赤（悪い）で表示',
    fairAlsoDryingThreshold: 'このしきい値は自動乾燥のトリガーにも使用されます',
    fairBelowDryingFloor: '自動乾燥ではこの値に到達できません。AMS はヒーター動作中に {{floor}}% 以上を示すため、各サイクルが終了してすぐに再開してしまいます。自動乾燥を使う場合は {{floor}}% より高く設定してください。',
    temperature: '温度',
    goodBlue: '良好（青）≤',
    aboveFairHot: '普通のしきい値以上は赤（高温）で表示',
    historyRetention: '履歴の保持',
    keepSensorHistory: 'センサー履歴の保持期間',
    historyRetentionDescription: '古い湿度と温度データは自動的に削除されます',
    defaultPrintOptions: 'デフォルト印刷オプション',
    defaultPrintOptionsDescription: '新しい印刷のデフォルト値を設定します。印刷ダイアログで個別に変更できます。',
    defaultBedLevelling: 'ベッドレベリング',
    defaultBedLevellingDesc: '印刷前にベッドを自動レベリング',
    defaultFlowCali: 'フローキャリブレーション',
    defaultFlowCaliDesc: '押出フローのキャリブレーション',
    defaultVibrationCali: '振動キャリブレーション',
    defaultVibrationCaliDesc: 'リンギングアーティファクトを低減',
    defaultLayerInspect: '第1層検査',
    defaultLayerInspectDesc: 'AIによる第1層の検査',
    defaultTimelapse: 'タイムラプス',
    defaultTimelapseDesc: 'タイムラプス動画を記録',
    defaultNozzleOffsetCali: 'ノズルオフセットキャリブレーション',
    defaultNozzleOffsetCaliDesc: 'エクストルーダー間のノズルオフセットを校正',
    tempFanPresetsTitle: '温度・ファンプリセット',
    tempFanPresetsDescription: 'プリンターカードの温度およびファン速度ポップオーバーに表示されるクイック選択値をカスタマイズします。オフボタンは常に表示されます。',
    tempFanPresetsNozzle: 'ノズル温度',
    tempFanPresetsBed: 'ベッド温度',
    tempFanPresetsChamber: 'チャンバー温度',
    tempFanPresetsFan: 'ファン速度',
    tempFanPresetsReset: 'デフォルトにリセット',
    concurrentUploadsTitle: '同時アップロード',
    concurrentUploadsDescription: 'キューが同時にファイルを送信できるプリンター数です。プリンターのファイル受信は遅く（大きな造形では数分かかることもあります）、各プリンターは順番を待ちます。台数の多い環境では、この値を上げることで、バッチ内の最後のプリンターが先行するすべての転送を待たずに済みます。ネットワークや Bambuddy ホストが並列転送に耐えられない場合は下げてください。',
    concurrentUploadsLabel: '同時に送信するプリンター数',
    concurrentUploadsHelp: '1 にすると 1 台ずつ送信します（従来の動作）。既定値は 4 です。',
    staggeredStart: '段階的開始',
    staggeredStartDescription: '複数プリンターのバッチ開始を段階的に行う際のデフォルトのグループサイズと間隔。プリントモーダルでバッチごとに上書き可能。',
    preheatTitle: 'プレヒート & ヒートソーク',
    preheatDescription: 'キュー内の各印刷を開始する前に、ベッド（および対応している場合はチャンバー）を加熱し、温度を保持します。エンジニアリング素材（PA、ABS）をチャンバー能動加熱のないプリンターで使う際に有効です。ソーク中はベッドの放射熱でチャンバーが温まります。ベッド目標温度は印刷ファイルから読み取られ、チャンバーの挙動はプリンター機種によって異なります。',
    preheatEnabled: 'プレヒート & ソークを有効化',
    preheatEnabledDesc: 'オフにすると、キュー内の印刷は即時開始されます。各キュー項目で印刷ごとに上書き可能です。',
    preheatFilamentTargetsLabel: 'フィラメント別チャンバー目標 (°C)',
    preheatFilamentTargetsHint: 'Bambuddyはロード済みのAMSスロット中で最も高い目標値を選びます。PLAのみの印刷は0となり、チャンバー段階は自動でスキップされます。',
    preheatFilamentTargetsReset: 'デフォルトにリセット',
    preheatFilamentTargetsDefaultRow: 'その他 / 未登録',
    preheatMaxWait: '最大待機時間（秒）',
    preheatMaxWaitHelp: 'ソークへ移行するまでのチャンバー加熱フェーズの上限。',
    preheatSoak: 'ソーク（秒）',
    preheatSoakHelp: '目標到達後または最大待機経過後の保持時間。',
    preheatHardwareTitle: 'プリンター別の挙動:',
    preheatHardwareDetail: 'H2C/H2D/H2D Pro/H2S/X2D/X1EはM141でチャンバーを能動加熱します。X1C/P2Sはチャンバー温度を取得しますが、加熱はベッド放射のみです。P1S/P1P/A1/A1 Miniにはチャンバーセンサーがなく、ソークタイマーのみが適用されます。',
    preheatPerItemDesc: 'この印刷を開始する前にベッドとチャンバーを加熱します。既定では設定 → ワークフローのグローバルトグルを使用します。',
    preheatOverride_inherit: '継承',
    preheatOverride_on: 'オン',
    preheatOverride_off: 'オフ',
    calibrationMode_off: 'オフ',
    calibrationMode_on: 'オン',
    calibrationMode_auto: '自動',
    preheatTargetOverride: 'チャンバー目標を上書き (°C、空欄でフィラメント既定値)',
    plateClear: 'プレートクリア確認',
    requirePlateClear: 'プレートクリア確認を必須にする',
    requirePlateClearDescription: '有効にすると、スケジューラーは完了したプリンターでキューの印刷を開始する前に、プリンターごとのプレートクリア確認を待ちます。無効にすると、プリンターカード上のプレート状態バッジと「プレートをクリア済みにする」ボタンも非表示になります。',
    keepBedWarm: '印刷間ベッド温度維持',
    keepBedWarmDesc: 'プレートクリア確認待ち中、下記の保温温度でベッドを維持してチャンバーを温かく保ちます。次の印刷のベッド温度の方が高い場合はそちらを使用します。次の印刷がチャンバー加熱を必要とする場合のみ適用されます（ASA、ABS、PA、PC など）。プレートクリア確認が有効になっている必要があります。',
    keepWarmBedTemp: '保温時のベッド温度 (°C)',
    keepWarmBedTempHelp: 'ベッドでチャンバーを加熱する場面で使用されます（保温中、および印刷ファイルにベッド温度が含まれない場合の予熱時）。印刷ファイルのベッド温度の方が高い場合は、常にそちらが優先されます。',
    keepWarmMaxMinutes: '保温を終了するまでの時間（分）',
    keepWarmMaxMinutesHelp: 'この時間内にプレートが片付けられない場合、ヒーターは無期限に加熱を続けず停止します。',
    gcodeInjection: 'G-codeインジェクション',
    gcodeInjectionDescription: 'Farmloop、SwapMod、AutoClear、Printflow 3Dなどの自動印刷システム用に、印刷の開始と終了時にカスタムG-codeを挿入します。スニペットはプリンターモデルごとに設定し、キューアイテム��「G-codeを挿入」を有効にすると適用されます。',
    gcodeInjectionNoPrinters: 'プリンターが見つかりません。G-codeスニペットを設定するにはプリンターを追加してください。',
    gcodeStartLabel: '開始G-code',
    gcodeEndLabel: '終了G-code',
    gcodeStartPlaceholder: '印刷開始前に挿入されるG-code...',
    gcodeEndPlaceholder: '印刷終了後に追加されるG-code...',
    staggerGroupSize: 'グループサイズ',
    staggerGroupSizeHelp: 'グループあたり同時に開始するプリンター数',
    staggerInterval: '間隔（分）',
    staggerIntervalHelp: '各グループ開始までの遅延',
    queueDrying: '自動乾燥',
    queueDryingDescription: 'キュー印刷の合間にプリンターがアイドル状態の時、AMSフィラメントを自動的に乾燥します。上記の湿度しきい値を使用します。',
    queueDryingEnabled: '自動乾燥を有効にする',
    queueDryingEnabledDescription: 'プリンターがアイドル状態で湿度がしきい値を超えた場合、AMS乾燥を自動的に開始',
    queueDryingBlock: '乾燥完了まで待機',
    queueDryingBlockDescription: '乾燥が完了するまで印刷キューをブロックします。オフの場合、印刷が優先されます。',
    ambientDryingEnabled: '常時乾燥',
    ambientDryingEnabledDescription: 'キューに関係なく、アイドル状態のプリンターで湿度がしきい値を超えた場合に自動的にフィラメントを乾燥。',
    printDryingEnabled: '印刷中も乾燥を継続',
    printDryingEnabledDescription: '対応ハードウェア（H2D、H2C、H2S、P2S、H2D Pro、X2D、X1C、A2L、最新ファームウェア）で印刷中も自動乾燥を継続します。スプール保護のため、乾燥温度はアイドル時のプリセットより自動的に5°C低く制限されます。',
    dryingPresets: '乾燥プリセット',
    dryingPresetsDescription: 'フィラメントタイプごとの温度と時間。AMS 2 Proは低温、AMS-HTは高温に対応。',
    dryingFilament: 'フィラメント',
    humidityThresholds: '湿度しきい値',
    humidityThresholdsDescription: 'フィラメントタイプごとの自動乾燥・アラームのトリガー湿度。同一AMSで混在の場合は最も低いしきい値を使用。',
    humidityThresholdCol: 'しきい値',
    humidityThresholdDefault: 'デフォルト（未知のタイプ）',
    printModal: '印刷ダイアログ',
    expandCustomMapping: 'カスタムマッピングをデフォルトで展開',
    expandCustomMappingDescription: '複数プリンターに印刷する際、プリンターごとのAMSマッピングを展開表示',
    // User management
    authentication: '認証',
    authEnabledDescription: 'ユーザー認証でインスタンスが保護されています',
    authDisabledDescription: '認証を有効にして、ユーザーアカウントの作成、権限の管理、Bambuddyインスタンスのセキュリティを確保しましょう。',
    authDisabledMessage: '認証を有効にして、ユーザーアカウントの作成、権限の管理、Bambuddyインスタンスのセキュリティを確保しましょう。',
    enableAuthentication: '認証を有効にする',
    currentUser: '現在のユーザー',
    changePassword: 'パスワードを変更',
    admin: '管理者',
    users: 'ユーザー',
    addUser: 'ユーザーを追加',
    groups: 'グループ',
    addGroup: 'グループを追加',
    system: 'システム',
    noDescription: '説明なし',
    userCount: '{{count}}人のユーザー',
    permissionCount: '{{count}}件の権限',
    createUser: 'ユーザーを作成',
    username: 'ユーザー名',
    enterUsername: 'ユーザー名を入力',
    password: 'パスワード',
    enterPassword: 'パスワードを入力',
    passwordRequirements: '大文字、小文字、数字、特殊文字を各1文字以上含む8文字以上。',
    confirmPassword: 'パスワードの確認',
    confirmPasswordPlaceholder: 'パスワードを確認',
    // Title tooltips
    viewReleaseOnGitHub: 'GitHubでリリースを表示',
    turnAllPlugsOn: 'すべてのプラグをオン',
    turnAllPlugsOff: 'すべてのプラグをオフ',
    // Modal: Clear logs
    clearNotificationLogs: '通知ログをクリア',
    clearLogsMessage: '30日以上前のすべての通知ログを完全に削除します。この操作は元に戻せません。',
    clearLogs: '通知ログを削除',
    // Modal: Reset UI
    resetUiPreferences: 'UI設定をリセット',
    resetUiPreferencesMessage: 'すべてのUI設定をデフォルトにリセットします：サイドバー順序、テーマ、ダッシュボードレイアウト、表示モード、ソート設定。プリンター、アーカイブ、サーバー設定は影響を受けません。クリア後にページがリロードされます。',
    resetPreferences: '設定をリセット',
    // Modal: Delete group
    deleteGroupTitle: 'グループを削除',
    deleteGroupMessage: 'このグループを削除しますか？このグループのユーザーはこれらの権限を失います。',
    deleteGroup: 'グループを削除',
    // Modal: Disable auth
    disableAuthenticationTitle: '認証を無効化',
    disableAuthenticationMessage: '認証を無効にしますか？Bambuddyインスタンスにログインなしでアクセスできるようになります。ユーザーはデータベースに残りますが、認証は無効になります。',
    disableAuthentication: '認証を無効化',
    // Additional settings
    configureBambuddy: 'Bambuddyを設定',
    systemDefault: 'システムデフォルト',
    archiveSettings: 'アーカイブ設定',
    newWindow: '新しいウィンドウ',
    embeddedOverlay: '埋め込みオーバーレイ',
    preferredSlicer: '優先スライサー',
    preferredSlicerDescription: 'APIサイドカー経由のアプリ内スライス処理に使用するスライサー',
    openInSlicerLabel: 'スライサーで開く',
    openInSlicerInherit: 'APIスライサーと同じ',
    openInSlicerDescription: '「スライサーで開く」ボタンが使用するデスクトップスライサー。継承するには「APIスライサーと同じ」のままにするか、ローカルで使用する別のスライサーを選択します。',
    orcaslicerKnownIssuesWarning: 'OrcaSlicer 2.3.2 / 2.4.0-devには、Bambu作成の3MFの多くをスライスできない既知のCLIバグがあります — 上流イシュー#12426（ペイント済みマルチエクストルーダーファイルでのsegfault）および#13386（パラメータ範囲の厳格検証拒否）を参照。上流の修正がリリースされるまで、Bambu Studioを推奨します。',
    useSlicerApi: 'スライサーAPIを使用',
    useSlicerApiDescription: 'オンの場合、「Slice」アクションはアプリ内スライサーモーダルを開き、slicer-APIサイドカーを呼び出します。オフ（デフォルト）の場合、URIスキーム経由でデスクトップスライサーに引き継がれます。',
    slicerCard: 'スライサー',
    orcaslicerApiUrl: 'OrcaSlicer sidecar URL',
    bambuStudioApiUrl: 'Bambu Studio sidecar URL',
    slicerStallTimeout: 'スライサー停止タイムアウト（分）',
    slicerStallTimeoutDescription: 'サイドカーからの進捗がこの時間なければスライスを中止します。進捗を報告し続ける重いモデルは、どれだけ時間がかかっても中断されません。進捗を報告しないサイドカーでは、この値が合計時間の上限になります。',
    slicerApiUrlDescription: 'slicer-APIサイドカーコンテナのURL。空のままにすると SLICER_API_URL / BAMBU_STUDIO_API_URL 環境変数のデフォルト値が使用されます。',
    externalCameras: '外部カメラ',
    costTracking: 'コスト追跡',
    printsOnly: '印刷のみ',
    totalConsumption: '総消費量',
    dataManagement: 'データ管理',
    storageUsage: 'ストレージ使用量',
    storageUsageDescription: 'カテゴリ別のデータ使用量の内訳',
    storageUsageTotal: '合計',
    storageUsageErrors: 'エラー',
    storageUsageOtherBreakdown: 'その他（静的アセット、スクリプト、設定ファイルを含む）',
    storageUsageSystem: 'システム',
    storageUsageData: 'データ',
    storageUsageUnavailable: 'ストレージ使用量情報は利用できません',
    clearNotificationLogsDescription: '30日以上前の通知ログを削除',
    resetUiPreferencesDescription: 'サイドバー順序、テーマ、表示モード、レイアウト設定をリセット。プリンター、アーカイブ、設定は影響を受けません。',
    enableHomeAssistant: 'Home Assistantを有効化',
    enableMqtt: 'MQTTを有効化',
    useTls: 'TLSを使用',
    enableMetricsEndpoint: 'メトリクスエンドポイントを有効化',
    availableMetrics: '利用可能なメトリクス',
    billingEnabled: '課金を有効にする',
    billingEnabledDescription: 'ユーザーにプリント料金を請求し、財務機能を有効にします',
    printerKillSwitch: '印刷の自動停止',
    printerKillSwitchDescription: '承認されていない印刷を即座に停止する',
    financeBudgetReset: '月次財務予算のリセット',
    financeBudgetResetDay: 'リセット日',
    financeBudgetResetDayHelp: "短い月の場合、リセットは月の最終日を使用します。",
    financeBudgetResetTimezone: 'リセットタイムゾーン',
    financeBudgetResetTimezoneHelp: "L'inizio della finestra di bilancio viene calcolato in questo fuso orario.",
    rebuildLedger: 'ウォレットレジャーを再構築',
    rebuildLedgerStarted: 'レジャー再構築が開始されました',
    rebuildLedgerConfirmTitle: 'ウォレットレジャーを再構築しますか?',
    rebuildLedgerConfirmMessage:
      'これにより、ウォレットレジャーが再構築され、履歴残高値が修復されます。何をしているかを確認した時にのみこれを実行してください。',
    rebuildLedgerInProgress: '再構築を開始中...',
    editUser: 'ユーザーを編集',
    deleteUserTitle: 'ユーザーを削除',
    groupName: 'グループ名',
    // Placeholders
    leaveEmptyForAnonymous: '匿名の場合は空のまま',
    leaveEmptyForNoAuth: '認証なしの場合は空のまま',
    enterNewPassword: '新しいパスワードを入力',
    confirmNewPassword: '新しいパスワードを確認',
    enterGroupName: 'グループ名を入力',
    enterDescriptionOptional: '説明を入力（任意）',
    enterCurrentPassword: '現在のパスワードを入力',
    enterNewPasswordMin6: '新しいパスワードを入力（6文字以上）',
    toast: {
      keyCopied: 'キーをクリップボードにコピーしました',
      copyFailed: 'キーのコピーに失敗しました',
      keyAddedToBrowser: 'キーをAPIブラウザに追加しました',
      clearLogsFailed: 'ログの削除に失敗しました',
      uiPreferencesReset: 'UI設定をリセットしました。更新中...',
      authDisabled: '認証を無効にしました',
      authDisableFailed: '認証の無効化に失敗しました',
      apiKeyCreated: 'APIキーを作成しました',
      apiKeyDeleted: 'APIキーを削除しました',
      userCreated: 'ユーザーが正常に作成されました',
      userUpdated: 'ユーザーが正常に更新されました',
      userDeleted: 'ユーザーが正常に削除されました',
      groupCreated: 'グループを作成しました',
      groupUpdated: 'グループを更新しました',
      groupDeleted: 'グループを削除しました',
      fillRequiredFields: '必須項目をすべて入力してください',
      passwordsDoNotMatch: 'パスワードが一致しません',
      passwordTooShort: 'パスワードは8文字以上必要です',
      passwordNeedsUppercase: 'パスワードには少なくとも1つの大文字を含める必要があります',
      passwordNeedsLowercase: 'パスワードには少なくとも1つの小文字を含める必要があります',
      passwordNeedsDigit: 'パスワードには少なくとも1つの数字を含める必要があります',
      passwordNeedsSpecial: 'パスワードには少なくとも1つの特殊文字を含める必要があります',
      enterGroupName: 'グループ名を入力',
      settingsSaved: '設定を保存しました',
      noPermissionUpdate: '設定を変更する権限がありません',
      cameraSettingsSaved: 'カメラ設定を保存しました',
      enterCameraUrl: 'カメラURLを入力してください',
      passwordChanged: 'パスワードが正常に変更されました',
      connectionFailed: '接続失敗',
      testFailed: 'テスト通知の送信に失敗しました',
      cameraConnected: 'カメラ接続{{resolution}}',
      cameraConnectedCoalesced: 'カメラ接続{{resolution}}（実行中のキャプチャと共有）',
    },
    testConnection: '接続テスト',
    catalog: {
      spoolCatalog: 'スプールカタログ',
      spoolCatalogDescription: 'ブランド/タイプ別の空スプール重量。スプール追加時の自動重量検索に使用されます。',
      searchCatalog: 'カタログを検索...',
      addNewEntry: '新しいエントリを追加',
      namePlaceholder: '名前（例：Bambu Lab - プラスチック）',
      weight: '重量',
      type: 'タイプ',
      default: 'デフォルト',
      custom: 'カスタム',
      noMatch: '検索に一致するエントリがありません',
      empty: 'カタログにエントリがありません',
      deleteEntry: 'エントリを削除',
      deleteConfirm: '「{{name}}」を削除してもよろしいですか？',
      resetCatalog: 'カタログをリセット',
      resetConfirm: 'カタログをデフォルトにリセットしますか？カスタムエントリはすべて削除されます。',
      loadFailed: 'スプールカタログの読み込みに失敗しました',
      nameWeightRequired: '名前と重量は必須です',
      entryAdded: 'エントリを追加しました',
      addFailed: 'エントリの追加に失敗しました',
      entryUpdated: 'エントリを更新しました',
      updateFailed: 'エントリの更新に失敗しました',
      entryDeleted: 'エントリを削除しました',
      deleteFailed: 'エントリの削除に失敗しました',
      resetSuccess: 'カタログをデフォルトにリセットしました',
      resetFailed: 'カタログのリセットに失敗しました',
      exported: '{{count}}件のエントリをエクスポートしました',
      imported: '{{added}}件のエントリをインポートしました（{{skipped}}件スキップ）',
      importFailed: 'インポートに失敗しました：無効なJSON形式',
      exportTooltip: 'カタログをJSONにエクスポート',
      importTooltip: 'JSONからカタログをインポート',
      resetTooltip: 'デフォルトにリセット',
      selectedCount: '{{count}}件選択中',
      deleteSelected: '選択を削除',
      bulkDeleteConfirm: '{{count}}件のエントリーを削除してもよろしいですか？',
      bulkDeleted: '{{count}}件のエントリーを削除しました',
      bulkDeleteFailed: 'エントリーの削除に失敗しました',
      material: '材料',
      spoolWeight: 'スプール重量',
      color: '色',
      updateSpoolWeight: 'スプール重量を更新',
      filamentUpdated: 'フィラメントを更新しました',
      filamentUpdateFailed: 'フィラメントの更新に失敗しました',
      filamentUpdateInvalid: 'フィラメントデータが無効です',
      keepExistingSpoolWeight: '既存スプールの旧重量を保持',
      keepExistingSpoolWeightDesc: 'このフィラメントタイプで既に作成されたスプールは旧風袋重量を保持します。新しいスプールは更新後の値を使用します。',
      applyToAllSpools: '全スプールに適用',
      applyToAllSpoolsDesc: 'このフィラメントタイプの全重量計算に新しい風袋重量が即座に適用されます。',
    },
    colorCatalog: {
      title: 'カラーカタログ',
      description: 'メーカー/素材別のフィラメントカラー。スプール追加時の自動カラー検索に使用されます。',
      searchColors: 'カラーを検索...',
      allManufacturers: 'すべてのメーカー',
      addNewColor: '新しいカラーを追加',
      manufacturer: 'メーカー',
      colorName: 'カラー名',
      hex: '16進数',
      materialOptional: '素材（任意）',
      showing: '{{total}}件中{{filtered}}件を表示',
      noMatch: '検索に一致するカラーがありません',
      empty: 'カタログにカラーがありません',
      deleteColor: 'カラーを削除',
      deleteConfirm: '「{{name}}」を削除してもよろしいですか？',
      resetCatalog: 'カラーカタログをリセット',
      resetConfirm: 'カタログをデフォルトにリセットしますか？カスタムカラーはすべて削除されます。',
      sync: '同期',
      starting: '開始中...',
      syncTooltip: 'FilamentColors.xyzから同期（2000+カラー）',
      loadFailed: 'カラーカタログの読み込みに失敗しました',
      fieldsRequired: 'メーカー、カラー名、Hexカラーは必須です',
      colorAdded: 'カラーを追加しました',
      addFailed: 'カラーの追加に失敗しました',
      colorUpdated: 'カラーを更新しました',
      updateFailed: 'カラーの更新に失敗しました',
      colorDeleted: 'カラーを削除しました',
      deleteFailed: 'カラーの削除に失敗しました',
      resetSuccess: 'カラーカタログをデフォルトにリセットしました',
      resetFailed: 'カタログのリセットに失敗しました',
      syncUpToDate: '最新の状態です（{{count}}件のカラーを確認）',
      syncComplete: '{{added}}件の新しいカラーを追加しました（{{skipped}}件は既に存在）',
      syncError: '同期エラー',
      syncFailed: 'FilamentColors.xyzからの同期に失敗しました',
      exported: '{{count}}件のカラーをエクスポートしました',
      imported: '{{added}}件のカラーをインポートしました（{{skipped}}件スキップ）',
      importFailed: 'インポートに失敗しました：無効なJSON形式',
      selectedCount: '{{count}}件選択中',
      deleteSelected: '選択を削除',
      bulkDeleteConfirm: '{{count}}件のカラーを削除してもよろしいですか？',
      bulkDeleted: '{{count}}件のカラーを削除しました',
      bulkDeleteFailed: 'カラーの削除に失敗しました',
    },
    // General tab
    dateFormat: '日付形式',
    dateFormatUs: '米国 (MM/DD/YYYY)',
    dateFormatEu: 'EU (DD/MM/YYYY)',
    dateFormatIso: 'ISO (YYYY-MM-DD)',
    timeFormat: '時刻形式',
    timeFormat12: '12時間制 (3:30 PM)',
    timeFormat24: '24時間制 (15:30)',
    defaultPrinter: 'デフォルトプリンター',
    defaultPrinterDescription: 'アップロード、再印刷、その他の操作でこのプリンターを事前選択します。',
    slicerBambuStudio: 'Bambu Studio',
    slicerOrcaSlicer: 'OrcaSlicer',
    sidebarOrderDescription: 'サイドバーレイアウトで項目の並べ替え、表示状態のリセット、カスタムリンクの管理を行います。',
    setDefault: 'デフォルト設定',
    sidebarOrderSetDefaultHint: 'デフォルト設定は、まだカスタマイズしていないユーザーに現在のメニュー順序を適用します。',
    sidebarDefaultSet: 'デフォルトメニュー順序を設定しました。',
    sidebarDefaultCleared: 'デフォルトメニュー順序をクリアしました。',
    sidebarDefaultFailed: 'デフォルトメニュー順序の設定に失敗しました。',
    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: 'サイドバーのアイコンでダーク、ライト、システムモードを切り替えます。',
    progressInTitle: 'タブに印刷の進捗を表示',
    progressInTitleDescription: 'ブラウザのタブに進行中の印刷の進捗率と進捗リングを表示します。',
    // Archive
    autoArchivePrints: '印刷を自動アーカイブ',
    autoArchiveDescription: '印刷完了時に3MFファイルを自動保存',
    saveThumbnailsDescription: '3MFファイルからプレビュー画像を抽出して保存',
    captureFinishPhotoDescription: '印刷完了時にプリンターカメラから写真を撮影します。Bambuddy は印刷中に短いタイムラプスを記録し、ベッドが下がる前の瞬間から写真を取得できるようにします。この印刷でタイムラプスを有効にしていた場合はタイムラプスファイルが保存され、それ以外の場合は写真の取得後に自動的に削除されます。',
    finishPhotoRestorePlate: '完了写真のためにプレートを戻す',
    finishPhotoRestorePlateDescription: 'プリンターは印刷終了時にビルドプレートを約 100 mm 下降させるため、完成した造形物がカメラの画角より下に来ます。Bambuddy はプレートを最終印刷レイヤーのすぐ上まで戻して写真を撮影し、その後再び下降させます。造形高さが不明な場合や次のジョブがキューにある場合はスキップされます。',
    ffmpegNotInstalled: 'ffmpegがインストールされていません',
    ffmpegRequired: 'カメラ撮影にはffmpegが必要です。<brew>brew install ffmpeg</brew>（macOS）または<apt>apt install ffmpeg</apt>（Linux）でインストールしてください。',
    // Camera
    camera: 'カメラ',
    cameraViewMode: 'カメラ表示モード',
    cameraOverlayDescription: 'メイン画面上にリサイズ可能なオーバーレイでカメラを表示',
    cameraWindowDescription: '別のブラウザウィンドウでカメラを表示',
    externalCamerasDescription: '内蔵プリンターカメラの代わりに外部カメラを設定。MJPEGストリーム、RTSP、HTTPスナップショット、USBカメラ（V4L2）をサポート。有効にすると、ライブビューと完了写真に外部カメラが使用されます。',
    cameraPlaceholderUsb: 'デバイスパス (/dev/video0)',
    cameraPlaceholderUrl: 'カメラURL (rtsp://... または http://...)',
    cameraTypeMjpeg: 'MJPEGストリーム',
    cameraTypeRtsp: 'RTSPストリーム',
    cameraTypeSnapshot: 'HTTPスナップショット',
    cameraTypeUsb: 'USBカメラ (V4L2)',
    cameraSnapshotUrl: 'スナップショットURL（任意）',
    cameraSnapshotUrlPlaceholder: 'http://192.168.1.61:1984/api/frame.jpeg?src=printer',
    cameraSnapshotUrlHelp: '通知サムネイル、終了写真、レイヤータイムラプスフレーム、プレート検出に使用される単一フレームURL。タイムラプスとプレート検出はそれぞれプリンターごとのトグルが必要 — このURLはアクティブ時の画像ソースに過ぎません。上記のライブストリームから取得する場合は空のままにします。go2rtc（/api/frame.jpeg）や専用スナップショットエンドポイントを持つIPカメラに便利です。',
    cameraRotation: '回転',
    test: 'テスト',
    connected: '接続済み',
    disconnected: '未接続',
    // Cost tracking
    currency: '通貨',
    defaultFilamentCost: 'デフォルトフィラメントコスト（kg単価）',
    electricityCost: '電気料金（kWh単価）',
    energyDisplayMode: 'エネルギー表示モード',
    energyModePrintDescription: 'ダッシュボードに印刷中の消費エネルギーの合計を表示',
    energyModeTotalDescription: 'ダッシュボードにスマートプラグの累計エネルギーを表示',
    // File Manager
    fileManager: 'ファイルマネージャー',
    createArchiveEntry: '印刷時にアーカイブエントリを作成',
    createArchiveEntryDescription: 'ファイルマネージャーから印刷時に、オプションでアーカイブエントリを作成',
    lowDiskSpaceWarning: 'ディスク容量不足の警告',
    lowDiskSpaceDescription: '空きディスク容量がこのしきい値を下回った場合に警告を表示',
    // Updates
    printerFirmware: 'プリンターファームウェア',
    checkFirmwareDescription: 'Bambu Labのプリンターファームウェア更新を確認',
    bambuddySoftware: 'Bambuddyソフトウェア',
    autoCheckDescription: '起動時に自動的に新しいバージョンを確認',
    checkNow: '今すぐ確認',
    updateAvailableVersion: 'アップデート利用可能: v{{version}}',
    releaseNotes: 'リリースノート',
    updateViaDocker: 'Docker Composeでアップデート:',
    composeDirectory: 'Compose ディレクトリ',
    composeDirectoryHint: 'docker-compose.yml があるディレクトリ。空欄にすると cd を省略します。',
    copyUpdateCommand: '更新コマンドをコピー',
    updateViaHomeAssistant: 'アップデートはHome Assistant Supervisorによって管理されます。Home Assistantの設定→アドオン→Bambuddyを開いて新しいバージョンをインストールしてください。',
    updateViaWindowsInstaller: 'Windowsインストールはインストーラーを再実行して更新します。下のリンクから新しいバージョンをダウンロードしてください — データ、設定、プリンターは保持されます。',
    downloadWindowsInstaller: 'v{{version}} のインストーラーをダウンロード',
    installUpdate: 'アップデートをインストール',
    latestVersionRunning: '最新バージョンを使用しています',
    failedToCheckUpdates: 'アップデートの確認に失敗しました: {{error}}',
    // Data Management
    backupRestore: 'バックアップと復元',
    backupRestoreDescription: '設定のエクスポート/インポートとGitHubバックアップの設定',
    goToBackup: 'バックアップへ',
    // Network tab
    externalUrl: '外部URL',
    externalUrlDescription: 'Bambuddyがアクセス可能な外部URL。通知画像や外部連携に使用されます。',
    bambuddyUrl: 'BambuddyのURL',
    externalUrlHint: 'プロトコルとポートを含めてください（例: http://192.168.1.100:8000）',
    ftpRetry: 'FTPリトライ',
    ftpRetryDescription: 'プリンターのWi-Fiが不安定な場合にFTP操作をリトライ。3MFダウンロード、印刷アップロード、タイムラプスダウンロード、ファームウェア更新に適用。',
    autoRetryDescription: '失敗したFTP操作を自動的にリトライ',
    retryAttempts: 'リトライ回数',
    retryDelay: 'リトライ遅延',
    connectionTimeout: '接続タイムアウト',
    time_one: '{{count}}回',
    time_other: '{{count}}回',
    second_one: '{{count}}秒',
    second_other: '{{count}}秒',
    nSeconds: '{{count}}秒',
    increaseForWeakWifi: 'Wi-Fiが弱いプリンター用に増やしてください',
    // Home Assistant
    homeAssistant: 'Home Assistant',
    homeAssistantFullDescription: 'Home Assistantに接続してHA REST API経由でスマートプラグを制御。switch、light、input_boolean、scriptエンティティをサポート。',
    homeAssistantUrl: 'Home Assistant URL',
    longLivedAccessToken: '長期アクセストークン',
    haTokenHint: 'HAでトークンを作成: プロフィール → 長期アクセストークン → トークンを作成',
    connectionSuccessful: '接続成功',
    connectionFailed: '接続失敗',
    haConnectionSuccess: 'Home Assistantへの接続に成功しました。',
    haConnectionFailed: 'Home Assistantへの接続に失敗しました。',
    // MQTT
    mqttPublishing: 'MQTTパブリッシュ',
    mqttDescription: 'Node-RED、Home Assistant、その他の自動化システムとの統合のため、外部MQTTブローカーにBamBuddyイベントをパブリッシュ。',
    mqttEnableDescription: '外部MQTTブローカーにイベントをパブリッシュ',
    brokerHostname: 'ブローカーホスト名',
    port: 'ポート',
    usernameOptional: 'ユーザー名（オプション）',
    passwordOptional: 'パスワード（オプション）',
    topicPrefix: 'トピックプレフィックス',
    topicPrefixHint: 'トピック形式: {{prefix}}/printers/<serial>/status 等',
    // Prometheus
    prometheusMetrics: 'Prometheusメトリクス',
    prometheusEndpointDescription: 'Prometheus/Grafanaモニタリング用に<code>/api/v1/metrics</code>でプリンターメトリクスを公開。',
    bearerTokenOptional: 'Bearerトークン（オプション）',
    bearerTokenHint: '設定時、リクエストに<code>Authorization: Bearer <token></code>が必要',
    metricsConnectionStatus: '接続状態',
    metricsPrinterState: 'プリンター状態（idle/printing等）',
    metricsPrintProgress: '印刷進捗 0-100%',
    metricsBedTemp: 'ベッド温度',
    metricsNozzleTemp: 'ノズル温度',
    metricsPrintsTotal: '結果別の総印刷数',
    metricsMore: '...その他（レイヤー、ファン、キュー、フィラメント使用量）',
    // Smart Plugs
    smartPlugsDescription: 'スマートプラグ（TasmotaまたはHome Assistant）を接続して、電源制御の自動化とプリンターのエネルギー使用量を追跡。',
    allOn: 'すべてオン',
    allOff: 'すべてオフ',
    addSmartPlug: 'スマートプラグを追加',
    energySummary: 'エネルギー概要',
    currentPower: '現在の消費電力',
    plugsOnline: '{{reachable}}/{{total}}プラグオンライン',
    today: '今日',
    yesterday: '昨日',
    total: '合計',
    enablePlugsForSummary: 'プラグを有効にしてエネルギー概要を表示',
    addNotificationProvider: '追加',
    // Users
    systemBadge: '(システム)',
    creating: '作成中...',
    changing: '変更中...',
    deleteUserAndItems: 'ユーザーとそのアイテムを削除',
    deleteUserKeepItems: 'ユーザーを削除、アイテムは保持（オーナーなしになります）',
    ok: 'OK',

    // 2FA settings
    twoFa: {
      totpTitle: '認証アプリ (TOTP)',
      totpDesc: 'Google Authenticator、Aegis、Authyなどのアプリを使用します。',
      emailOtpTitle: 'メールOTP',
      emailOtpDesc: 'ログイン時に{{email}}にワンタイムコードを送信します。',
      emailOtpNoEmail: 'この方法を有効にするには、アカウントにメールアドレスを追加してください。',
      addEmailFirst: 'アカウントにメールアドレスがありません。管理者に追加を依頼してください。',
      setupTotp: '認証アプリを設定',
      setupAuthApp: '認証アプリを設定',
      setupInstructions: '認証アプリでQRコードをスキャンし、コードで確認してください。',
      manualEntry: 'スキャンできない場合は、このシークレットを手動で入力してください:',
      scannedContinue: 'コードをスキャンしました — 続ける',
      enterCodeToConfirm: '認証アプリの6桁のコードを入力して設定を確認してください。',
      activate: '有効化',
      disableTotp: '認証アプリを無効化',
      disableConfirmHint: '認証アプリを無効にするには、有効なTOTPコードまたはバックアップコードを入力してください。',
      totpDisabled: '認証アプリが無効化されました。',
      emailOtpEnabled: 'メールOTPが有効化されました。',
      emailOtpDisabled: 'メールOTPが無効化されました。',
      smtpRequired: '先にSMTP設定を構成してテストしてください。',
      invalidCode: '無効なコードです。もう一度お試しください。',
      enableEmailOtp: 'メールOTPを有効化',
      disableEmailOtp: 'メールOTPを無効化',
      emailSetupEnterCode: '確認コードがメールアドレスに送信されました。このメールボックスを所有していることを確認するために、以下に入力してください。',
      verifyAndEnable: '確認して有効化',
      emailDisablePasswordHint: 'メールOTPの無効化を確認するには、アカウントのパスワードを入力してください。',
      passwordPlaceholder: 'パスワードを入力してください',
      backupCodesTitle: 'バックアップコードを保存',
      backupCodesWarning: 'これらのコードを安全な場所に保存してください。各コードは一度しか使用できません。',
      backupCodesRemaining: 'バックアップコード残り{{count}}個',
      savedCodes: 'コードを保存しました',
      regenBackup: 'バックアップコードを再生成',
      regenBackupHint: '現在のTOTPコードを入力して10個の新しいバックアップコードを生成します。',
      newBackupCodes: '新しいバックアップコード',
      linkedAccounts: 'リンクされたSSOアカウント',
      linkedAccountsDesc: 'これらの外部IDプロバイダーがあなたのアカウントにリンクされています。',
      oidcUnlinked: 'アカウントのリンクを解除しました。',
    },
    // Session Policy (#1706)
    sessionPolicy: {
      title: 'セッションポリシー',
      description: '新しいユーザーログインの最大セッション有効期間。すでに発行されたトークンは元の有効期限を保持します。',
      preset24h: '24時間',
      preset7d: '7日',
      preset30d: '30日',
      customHoursLabel: 'カスタムセッション有効期間（時間）',
      hoursSuffix: '時間',
      warning: '長いセッションは自動ログアウト保護を弱めます。信頼できる単一ユーザー環境でのみ推奨されます。',
    },

    // OIDC provider settings
    oidc: {
      title: 'SSO / OIDCプロバイダー',
      desc: 'シングルサインオン用のOpenID Connectプロバイダーを設定します。',
      addProvider: 'プロバイダーを追加',
      newProvider: '新しいプロバイダー',
      empty: 'OIDCプロバイダーがまだ設定されていません。',
      created: 'プロバイダーが作成されました。',
      updated: 'プロバイダーが更新されました。',
      deleted: 'プロバイダーが削除されました。',
      refreshIcon: 'アイコンを再取得',
      removeIcon: 'アイコンを削除',
      iconRefreshed: 'アイコンを更新しました。',
      iconRemoved: 'アイコンを削除しました。',
      iconFetchFailed: 'プロバイダーURLからアイコンを取得できませんでした。',
      deleteTitle: 'プロバイダーを削除',
      deleteMessage: '"{{name}}"を削除しますか？リンクされたすべてのユーザーアカウントが切断されます。',
      form: {
        name: '表示名',
        issuerUrl: '発行者URL',
        clientId: 'クライアントID',
        clientSecret: 'クライアントシークレット',
        scopes: 'スコープ',
        iconUrl: 'アイコンURL (任意)',
        enabled: '有効',
        autoCreate: 'ユーザーを自動作成',
        autoCreateDesc: '初回ログイン時にローカルアカウントを自動的に作成します。',
        autoLink: '既存アカウントを自動リンク',
        autoLinkDesc: '初回ログイン時にメールアドレスで既存のローカルアカウントにリンクします。',
        secretHint: '空白のままで現在のものを維持',
        secretPlaceholder: '新しいシークレット',
        emailClaim: 'メールクレーム',
        emailClaimDesc: "メールIDとして使用するJWTクレーム。Azure Entra IDには'preferred_username'または'upn'を使用（email_verifiedを送信しない）。信頼できるクレーム名のみ使用してください。",
        emailClaimPlaceholder: 'メール',
        emailClaimCustomClaimAutoLinkWarning: 'カスタムクレームは、値がテナント管理されている場合（Azure Entra IDのupn / preferred_usernameなど）にのみ自動リンクに安全です。IdPがユーザーにこのクレームの自己宣言を許可している場合は、自動リンクを有効にしないでください。',
        requireEmailVerified: 'メール確認を要求',
        requireEmailVerifiedDesc: 'プロバイダーが確認済みとしてマークした場合にのみメールクレームを受け入れます。',
        requireEmailVerifiedWarning: '警告：確認なしでメールが受け入れられます。信頼できるプロバイダーのみで使用してください。',
        requireEmailVerifiedAutoLink: 'この設定を変更するには、まず自動リンクを無効にしてください。',
        defaultGroup: 'デフォルトグループ',
        defaultGroupDesc: '自動作成ユーザーに割り当てられるグループ。未設定の場合はViewersにフォールバックします。',
        defaultGroupViewersFallback: 'Viewers（デフォルト）',
        autologin: '自動サインイン',
        autologinDesc: '未認証の訪問者をこのプロバイダーに直接リダイレクトします。このフラグを付けられるプロバイダーは1つだけです。',
      },
    },

    // TODO: translate encryption keys
    encryption: {
      title: 'MFA暗号化ステータス',
      enabledFromEnv: '保存時の暗号化が有効（MFA_ENCRYPTION_KEY環境変数のキー）',
      enabledFromFile: '保存時の暗号化が有効（データディレクトリから読み込んだキー）',
      enabledGenerated: '保存時の暗号化が自動生成キーで有効',
      notConfigured: '保存時の暗号化が設定されていません',
      notConfiguredDesc: 'TOTPシークレットとOIDCのclient_secretsは平文で保存されています。MFA_ENCRYPTION_KEYを設定するか、書き込み可能なデータディレクトリでBambuddyを再起動して自動生成してください。',
      allEncrypted: 'すべてのMFAシークレットは保存時に暗号化されています。',
      legacyRowsLabel: 'レガシー平文行',
      encryptedRowsLabel: '暗号化された行',
      legacyRowsWarning: '{{count}}件のレガシー平文行を検出。OIDCプロバイダーを再保存するか、ユーザーの認証アプリを再登録して暗号化ストレージへ移行してください。',
      backupHint: '自動生成キーは DATA_DIR/.mfa_encryption_key に保存され、ローカルバックアップZIPに含まれます。バックアップを安全に保管するか、MFA_ENCRYPTION_KEYを明示的に設定してください。',
      decryptionBrokenTitle: '暗号化キーが見つかりません',
      decryptionBrokenError: '{{count}}件の暗号化レコードを復号できません。暗号化キーが見つかりません。以前のMFA_ENCRYPTION_KEYまたはDATA_DIR/.mfa_encryption_keyを復元してください。',
      migrationErrorWarning: '{{count}} 件のレガシー行を起動時に再暗号化できませんでした。サーバーログを確認し、Bambuddy を再起動して再試行してください。',
    },


    pipelineLimits: {
      title: 'スライサーパイプラインの上限',
      maxCopiesLabel: '実行あたりの最大コピー数',
      maxCopiesDesc: 'パイプライン実行時にオペレーターが要求できるコピー数の上限。サーバー側の上限は 1000 です。',
    },

    // Slicer Pipelines (#1425): list/edit/delete preset bundles users saved
    // from the Slice dialog. Lives in Settings → Workflow → Pipelines sub-tab.
    pipelines: {
      title: 'スライサーパイプライン',
      subtitle: '再利用可能なプリセットバンドル（プリンター + プロセス + フィラメント + ベッドタイプ）。スライスダイアログから保存し、次のファイルにワンクリックで適用できます。',
      loading: 'パイプラインを読み込み中…',
      loadError: 'パイプラインを読み込めませんでした。',
      confirmDelete: 'このパイプラインを削除しますか？元に戻せません。',
      staleWarning: '参照されているプリセットが見つかりません。スライスダイアログから再保存して修正してください。',
      empty: {
        title: 'パイプラインはまだありません。',
        howto: '任意のファイルでスライスダイアログを開き、プリンター / プロセス / フィラメント / ベッドタイプを選んで「パイプラインとして保存」をクリックしてください。保存したパイプラインはここに表示されます。',
      },
      field: {
        name: 'パイプライン名',
        description: '説明',
        targetPrinter: '対象プリンター',
        noTarget: '— 対象なし —',
        targetKind: '対象種別',
        targetKindSpecific: '特定のプリンター',
        targetKindClass: 'プリンタークラス',
        targetModelClass: 'プリンターモデル',
        fanoutStrategy: '分散戦略',
        fanout: {
          max_parallel: '最大並列 — 一致する空きプリンターに分散',
          round_robin: 'ラウンドロビン — 適格なプリンター間で循環',
          fill_one_first: '1台ずつ埋める — すべてのコピーを1台に固定',
        },
        fanoutShort: {
          max_parallel: '並列',
          round_robin: 'ラウンドロビン',
          fill_one_first: '1台ずつ',
        },
      },
      action: {
        save: '保存',
        cancel: 'キャンセル',
        rename: '名前変更',
        delete: '削除',
      },
      slot: {
        printer: 'プリンター',
        process: 'プロセス',
        filament: 'フィラメント',
        filamentN: 'フィラメント {{n}}',
        filamentAll: '{{n}} スロットすべて',
        bed: 'ベッド',
      },
      group: {
        profiles: 'プロファイル',
        filaments: 'フィラメント',
      },
      searchPlaceholder: 'パイプラインを検索…',
      filterTargetType: '対象種別でフィルター',
      filterTarget: '対象でフィルター',
      filter: {
        all: 'すべての対象',
        noTarget: '対象未設定',
        count: '{{shown}} / {{total}}',
        noMatches: '現在のフィルターに一致するパイプラインはありません。',
      },
      toast: {
        saved: 'パイプラインを保存しました',
        saveFailed: '保存に失敗しました',
        deleted: 'パイプラインを削除しました',
        deleteFailed: '削除に失敗しました',
      },
      noTargetHint: '実行するには対象プリンターを設定してください',
      noTargetWarning: 'このパイプラインを実行する前に対象プリンターを設定してください。',
      runs: {
        lastRun: '前回の実行',
        status: {
          queued: '待機中',
          slicing: 'スライス中',
          dispatching: '送信中',
          in_progress: '印刷中',
          completed: '完了',
          failed: '失敗',
          partial_failure: '部分的失敗',
          cancelled: 'キャンセル',
        },
      },
    },
  },

  // 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: 'データの読み込みに失敗しました',
  },

  // HMS Errors modal
  hmsErrors: {
    title: 'エラー - {{name}}',
    noErrors: 'エラーなし',
    viewOnWiki: 'Bambu Lab Wikiで表示',
    mqttVerifyFailedRemedy: 'プリンターで開発者モードを有効にし、プリンターを再起動してから、ジョブをもう一度開始してください。',
    unknownCode: '不明なHMSコード — 詳細はBambu Lab Wikiを参照してください。',
    clearInstructions: 'プリンターでエラーをクリアするとここからも消えます。',
    clearErrors: 'エラーをクリア',
    clearSuccess: 'HMSエラーをクリアしました',
    clearFailed: 'HMSエラーのクリアに失敗しました',
    actionSuccess: 'アクションをプリンターに送信しました',
    actionFailed: 'アクションの送信に失敗しました',
    runoutExpectedSlot: '{{ranOut}} のフィラメントが切れました。プリンターは現在 {{expected}} に対応するフィラメントを待っています。{{expected}} にスプールをセットして、「再試行」を選択してください。',
    runoutExpectedSlotOnly: 'プリンターは {{expected}} に対応するフィラメントを待っています。そこにスプールをセットして、「再試行」を選択してください。',
    runoutSlotUnknown: 'フィラメントが切れて印刷が一時停止しています。プリンターが現在要求しているスロットを Bambuddy が特定できませんでした。プリンターの画面で要求されているスロットを確認してください。',
    actions: {
      RESUME_PRINTING: '印刷を再開',
      RESUME_PRINTING_DEFECTS: '再開（不具合を許容）',
      RESUME_PRINTING_PROBELM_SOLVED: '再開（問題解決）',
      STOP_PRINTING: '印刷を停止',
      CHECK_ASSISTANT: 'アシスタントを開く',
      FILAMENT_EXTRUDED: 'フィラメント排出済み、続行',
      RETRY_FILAMENT_EXTRUDED: 'まだ排出されていない、再試行',
      CONTINUE: '完了、続行',
      LOAD_VIRTUAL_TRAY: 'フィラメントを装填',
      OK_BUTTON: 'OK',
      FILAMENT_LOAD_RESUME: 'フィラメント装填完了、再開',
      JUMP_TO_LIVEVIEW: 'ライブビューを表示',
      NO_REMINDER_NEXT_TIME: '次回は通知しない',
      REFRESH_NOZZLE: '再確認',
      IGNORE_NO_REMINDER_NEXT_TIME: '無視して次回は通知しない',
      IGNORE_RESUME: '無視して再開',
      PROBLEM_SOLVED_RESUME: '問題解決、再開',
      TURN_OFF_FIRE_ALARM: '了解、火災警報をオフ',
      RETRY_PROBLEM_SOLVED: '再試行（問題解決）',
      CANCLE: 'キャンセル',
      STOP_DRYING: '乾燥を停止',
      PROCEED: '続行',
      OK_JUMP_RACK: 'OK',
      ABORT: '中止',
      DISABLE_PURIFICATION: 'この印刷では空気清浄を無効化',
      DONT_REMIND_NEXT_TIME: '今後表示しない',
      DBL_CHECK_CANCEL: 'キャンセル',
      DBL_CHECK_DONE: '完了',
      DBL_CHECK_RETRY: '再試行',
      DBL_CHECK_RESUME: '再開',
      DBL_CHECK_OK: '確認',
      REMOVE_CLOSE_BTN: '閉じる',
    },
  },

  // MQTT Debug modal
  mqttDebug: {
    title: 'MQTTデバッグログ',
    searchPlaceholder: 'トピックまたはペイロードで検索...',
    noMessages: 'まだメッセージが記録されていません',
    startLoggingHint: '「ログ開始」をクリックしてMQTTメッセージのキャプチャを開始',
    noMessagesMatch: 'フィルターに一致するメッセージがありません',
    adjustFilterHint: '検索条件やフィルター条件を調整してみてください',
    incoming: '受信',
    outgoing: '送信',
    loggingStopped: 'ログ記録停止',
    loggingActive: 'ログ記録中 - メッセージは自動更新されます',
    startLogging: 'ログ記録を開始',
    stopLogging: 'ログ停止',
    clearLog: 'ログをクリア',
    topic: 'トピック',
    timestamp: 'タイムスタンプ',
    direction: '方向',
    all: 'すべて',
  },

  // Printer File Manager modal (printer internal storage)
  printerFiles: {
    title: 'ファイル管理',
    storageUsed: '使用中:',
    storageFree: '空き:',
    filterPlaceholder: 'ファイルを検索...',
    deleteButton: '削除',
    deleteFiles: '{{count}}件のファイルを削除',
    deleteFileConfirm: '"{{name}}" を削除しますか？この操作は取り消せません。',
    deleteFilesConfirm: '選択した{{count}}件のファイルを削除しますか？元に戻せません。',
    noFiles: 'このディレクトリにファイルがありません',
    loadingFiles: 'ファイルを読み込み中...',
    failedToLoad: 'ファイルの読み込みに失敗しました',
    toast: {
      filesDeleted: '{{count}}件のファイルを削除しました',
      deleteFailed: '削除に失敗: {{error}}',
    },
  },

  // Confirmations
  confirm: {
    delete: '削除しますか？',
    unsavedChanges: '保存されていない変更があります。このページを離れますか？',
    clearQueue: 'キューをクリアしますか？',
  },

  // Login page
  login: {
    title: 'Bambuddy ログイン',
    subtitle: 'アカウントにサインイン',
    username: 'ユーザー名',
    usernamePlaceholder: 'ユーザー名を入力',
    usernameOrEmail: 'ユーザー名またはメール',
    usernameOrEmailPlaceholder: 'ユーザー名または @ メール',
    password: 'パスワード',
    passwordPlaceholder: 'パスワードを入力',
    signIn: 'サインイン',
    signingIn: 'ログイン中...',
    rememberMe: 'ログイン状態を保持する',
    forgotPassword: 'パスワードをお忘れですか？',
    autologinFailed: 'SSOへの自動サインインに失敗しました。下から続行するプロバイダーを選択してください。',
    localDisabledNotice: 'ローカルサインインは無効化されています。下のSSOプロバイダーをご利用ください。',
    loginSuccess: 'ログインしました',
    loginFailed: 'ログインに失敗しました',
    enterCredentials: 'ユーザー名とパスワードを入力してください',
    enterEmail: 'メールアドレスを入力してください',
    oidcLoginFailed: 'OIDCログインに失敗しました',
    oidcErrors: {
      providerError: 'IDプロバイダーがエラーを返しました',
      missingParameters: 'OIDCコールバックに必須パラメーターがありません',
      invalidState: 'OIDCの状態が無効か、すでに使用されています',
      stateExpired: 'OIDCログインセッションが期限切れです。もう一度お試しください',
      providerNotFound: 'OIDCプロバイダーが見つかりません',
      discoveryFailed: 'OIDCディスカバリードキュメントの取得に失敗しました',
      invalidDiscovery: 'OIDCディスカバリードキュメントが無効です',
      networkError: 'OIDCトークン交換中にネットワークエラーが発生しました',
      badResponse: 'OIDCトークン交換中に予期しない応答を受信しました',
      noIdToken: 'OIDCプロバイダーがIDトークンを返しませんでした',
      validationFailed: 'OIDCトークンの検証に失敗しました',
      nonceMismatch: 'OIDCノンスが一致しません。リプレイ攻撃の可能性があります',
      missingSubClaim: 'OIDCトークンにsubクレームがありません',
      noLinkedAccount: 'このOIDCアイデンティティに関連付けられたローカルアカウントがありません',
      accountInactive: 'あなたのアカウントは無効です',
      userResolutionFailed: 'アカウントを解決できませんでした',
      internalError: 'OIDCログイン中に内部エラーが発生しました',
      tokenExchangeFailed: 'OIDCトークン交換に失敗しました',
    },
    forgotPasswordTitle: 'パスワードを忘れた場合',
    forgotPasswordMessage: 'パスワードを忘れた場合は、システム管理者に連絡してリセットしてもらってください。',
    forgotPasswordEmailMessage: 'メールアドレスを入力すると、新しいパスワードを送信します。',
    emailAddress: 'メールアドレス',
    emailPlaceholder: 'your.email@example.com',
    cancel: 'キャンセル',
    sending: '送信中...',
    sendResetEmail: 'リセットメールを送信',
    howToReset: 'パスワードのリセット方法：',
    resetStep1: 'Bambuddy管理者に連絡',
    resetStep2: 'ユーザー管理でパスワードリセットを依頼',
    resetStep3: '管理者が新しい仮パスワードを設定',
    resetStep4: '新しいパスワードでログインし、設定で変更',
    gotIt: '了解',
    twoFA: {
      title: '二段階認証',
      subtitle: 'アカウントは二段階認証で保護されています。確認コードを入力してください。',
      methodAuthenticator: '認証アプリ',
      methodEmail: 'メール認証',
      methodBackup: 'バックアップコード',
      instructionsTotp: '認証アプリを開いて、Bambuddy用の6桁のコードを入力してください。',
      instructionsEmail: '6桁の確認コードをメールアドレスに送信しました。有効期限は10分です。',
      instructionsEmailNotSent: '下のボタンをクリックして、メールで確認コードを受け取ってください。',
      instructionsBackup: '8文字のバックアップコードをいずれか1つ入力してください。各コードは1回のみ使用可能です。',
      sendCodeButton: 'メールでコードを送信する',
      sendingCode: '送信中...',
      resendCode: 'コードを再送する',
      codeLabel: '確認コード',
      backupCodeLabel: 'バックアップコード',
      codePlaceholder: '000000',
      backupCodePlaceholder: 'XXXXXXXX',
      verifyButton: '確認する',
      verifyingButton: '確認中...',
      backToLogin: '← ログイン画面に戻る',
      orContinueWith: 'または以下でログイン',
      signInWith: '{{provider}}でログイン',
      enterCode: '確認コードを入力してください',
      sendCodeFailed: '確認コードの送信に失敗しました',
      invalidCode: '無効なコードです。もう一度お試しください。',
    },

    resetPassword: {
      title: '新しいパスワードを設定',
      subtitle: '下のフィールドに新しいパスワードを入力して確認してください。',
      newPassword: '新しいパスワード',
      newPasswordPlaceholder: '8文字以上',
      confirmPassword: 'パスワードの確認',
      confirmPasswordPlaceholder: '新しいパスワードを再入力',
      saving: '保存中…',
      submit: '新しいパスワードを設定',
      backToLogin: 'ログインに戻る',
      passwordsDoNotMatch: 'パスワードが一致しません',
      passwordTooShort: 'パスワードは8文字以上で入力してください',
      resetFailed: 'パスワードのリセットに失敗しました。リンクが期限切れの可能性があります。',
    },
  },

  // Setup page
  setup: {
    title: 'Bambuddy セットアップ',
    subtitle: 'Bambuddyインスタンスの認証を設定',
    enableAuth: '認証を有効化',
    adminAccount: '管理者アカウント',
    adminAccountDesc: '既に管理者ユーザーが存在する場合、既存の管理者アカウントを使用して認証が有効化されます。既存の管理者を使用する場合は下のフィールドを空のままにするか、新しい認証情報を入力して新しい管理者ユーザーを作成してください。',
    adminUsername: '管理者ユーザー名',
    adminPassword: '管理者パスワード',
    optionalIfAdminExists: '（管理者ユーザーが存在する場合は任意）',
    adminUsernamePlaceholder: '管理者ユーザー名を入力（任意）',
    adminPasswordPlaceholder: '管理者パスワードを入力（任意）',
    confirmPassword: 'パスワードの確認',
    confirmPasswordPlaceholder: 'パスワードを確認',
    settingUp: 'セットアップ中...',
    completeSetup: 'セットアップを完了',
    toast: {
      authEnabledAdminCreated: '認証が有効になり、管理者ユーザーが作成されました',
      authEnabledExistingAdmins: '既存の管理者ユーザーを使用して認証が有効になりました',
      setupCompleted: 'セットアップが完了しました',
      enterBothCredentials: '管理者のユーザー名とパスワードの両方を入力するか、既存の管理者を使用する場合は両方を空にしてください',
      passwordsDoNotMatch: 'パスワードが一致しません',
      passwordTooShort: 'パスワードは6文字以上必要です',
    },
  },

  // Password change
  changePassword: {
    title: 'パスワードを変更',
    currentPassword: '現在のパスワード',
    currentPasswordPlaceholder: '現在のパスワードを入力',
    newPassword: '新しいパスワード',
    newPasswordPlaceholder: '新しいパスワードを入力（6文字以上）',
    confirmPassword: '新しいパスワード確認',
    confirmPasswordPlaceholder: 'パスワードを確認',
    passwordsDoNotMatch: 'パスワードが一致しません',
    passwordTooShort: 'パスワードは6文字以上必要です',
    changing: '変更中...',
    success: 'パスワードを変更しました',
    failed: 'パスワードの変更に失敗しました',
  },

  // Plate detection alert
  plateAlert: {
    title: '印刷が一時停止されました！',
    message: 'ビルドプレート上にオブジェクトが検出されました。印刷が自動的に一時停止されました。プレートをクリアして印刷を再開してください。',
    understand: '了解',
  },

  // Camera page
  camera: {
    title: 'カメラビュー',
    invalidPrinterId: '無効なプリンターID',
    live: 'ライブ',
    snapshot: 'スナップショット',
    restartStream: 'ストリームを再開',
    refreshSnapshot: 'スナップショットを更新',
    fullscreen: 'フルスクリーン',
    exitFullscreen: 'フルスクリーンを終了',
    connectingToCamera: 'カメラに接続中...',
    capturingSnapshot: 'スナップショットを撮影中...',
    connectionLost: '接続が切断されました',
    connectionFailed: 'カメラ接続に失敗しました',
    reconnecting: '{{countdown}}秒後に再接続... (試行 {{attempt}}/{{max}})',
    reconnectNow: '今すぐ再接続',
    cameraUnavailable: 'カメラが利用できません',
    cameraUnavailableDesc: 'プリンターの電源がオンで接続されていることを確認してください。',
    noCamera: 'カメラがありません',
    retry: '再試行',
    cameraStream: 'カメラストリーム',
    zoomOut: 'ズームアウト',
    zoomIn: 'ズームイン',
    resetZoom: 'ズームをリセット',
    recording: '録画中',
    startRecording: '録画開始',
    stopRecording: '録画停止',
    chamberLight: 'チャンバーライト切替',
    unavailable: 'カメラは利用できません',
    diagnose: {
      button: '診断',
      modalTitle: 'カメラ診断',
      running: '診断を実行中...',
      runFailed: '診断を実行できませんでした: {{error}}',
      retry: '再実行',
      stage: {
        tcp_reachable: 'ネットワーク到達性',
        first_frame: 'フレーム取得',
        live_stream_active: 'ライブストリーム動作中',
      },
      summary: {
        all_ok: 'カメラは正常に動作しています。診断のすべての段階が成功しました。',
        live_stream_active_healthy: 'カメラは現在新しいフレームを配信しています — テストは不要です。',
        printer_unreachable: 'プリンターに到達できません。IPアドレス、ネットワーク接続、プリンターの電源が入っていることを確認してください。',
        camera_port_closed: 'プリンターには到達できますが、カメラポートが閉じています。プリンター設定でLANのみモードと開発者モードが有効になっていることを確認してください。',
        no_frame: 'カメラに接続できましたがフレームを受信できませんでした。再試行するか、プリンター設定でカメラが有効になっていることを確認してください。',
        unknown_failure: 'カメラ診断が不明な理由で失敗しました。詳細はサポートログを確認してください。',
      },
      meta: {
        protocol: 'プロトコル',
        port: 'ポート',
        profile: 'プロファイル',
      },
    },
  },

  // Groups management
  groups: {
    title: 'グループ管理',
    subtitle: 'アクセス制御の権限グループを管理',
    backToSettings: '設定に戻る',
    createGroup: 'グループを作成',
    noPermission: 'このページにアクセスする権限がありません。',
    system: 'システム',
    noDescription: '説明なし',
    usersCount: '{{count}}人のユーザー',
    permissionsCount: '{{count}}個の権限',
    edit: '編集',
    delete: '削除',
    toast: {
      created: 'グループを作成しました',
      updated: 'グループを更新しました',
      deleted: 'アーカイブを削除しました',
      enterGroupName: 'グループ名を入力',
    },
    modal: {
      editGroup: 'グループを編集',
      createGroup: 'グループを作成',
      cancel: 'キャンセル',
      saving: '保存中...',
      creating: '作成中...',
      saveChanges: '変更を保存',
    },
    form: {
      groupName: 'グループ名',
      groupNamePlaceholder: 'グループ名を入力',
      systemGroupWarning: 'システムグループ名は変更できません',
      description: '説明',
      descriptionPlaceholder: '説明を入力（任意）',
      permissions: '権限 ({{count}} 選択中)',
    },
    deleteModal: {
      title: 'グループを削除',
      message: 'このグループを削除しますか？このグループのユーザーはこれらの権限を失います。',
      confirm: '確認',
    },
    editor: {
      title: 'グループを編集',
      createTitle: 'グループを作成',
      search: '権限を検索...',
      selectAll: 'すべて選択',
      clearAll: 'すべて解除',
      permissionsSelected: '{{count}}件選択',
      noResults: '検索に一致する権限がありません',
      websocketHint: 'ライブ更新に必要です。この権限がないと、インターフェースは定期的なポーリングに切り替わります。',
    },
  },

  // Users management
  users: {
    title: 'ユーザー管理',
    subtitle: 'ユーザーとBambuddyインスタンスへのアクセスを管理',
    backToSettings: '設定に戻る',
    createUser: 'ユーザーを作成',
    noPermission: 'このページにアクセスする権限がありません。',
    admin: '管理者',
    noGroups: 'グループなし',
    active: 'アクティブ',
    inactive: '非アクティブ',
    edit: '編集',
    delete: '削除',
    system: 'システム',
    noGroupsAvailable: '利用可能なグループがありません',
    table: {
      username: 'ユーザー名',
      groups: 'グループ',
      status: 'ステータス',
      actions: 'アクション',
    },
    toast: {
      created: 'ユーザーを作成しました',
      updated: 'ユーザーを更新しました',
      deleted: 'アーカイブを削除しました',
      fillRequired: '必須項目をすべて入力してください',
      passwordsDoNotMatch: 'パスワードが一致しません',
      passwordTooShort: 'パスワードは6文字以上必要です',
      ldapProvisioned: 'LDAPユーザー「{{username}}」をプロビジョニング',
    },
    modal: {
      createUser: 'ユーザーを作成',
      editUser: 'ユーザーを編集',
      cancel: 'キャンセル',
      creating: '作成中...',
      saving: '保存中...',
      saveChanges: '変更を保存',
      advancedAuthSubtitle: '高度な認証を使用',
      // Manual LDAP provisioning (#1298) — English fallbacks
      tabsAriaLabel: 'ユーザーソース',
      localTab: 'ローカル',
      ldapTab: 'LDAP',
      ldapSearchLabel: 'ディレクトリを検索',
      ldapSearchPlaceholder: 'ユーザー名、名前、またはメールアドレスを入力...',
      ldapMinChars: '検索するには2文字以上入力してください',
      ldapTypeToSearch: 'LDAPディレクトリを検索するには入力を開始',
      ldapSearching: 'ディレクトリを検索中...',
      ldapNoResults: 'ディレクトリに一致するユーザーがいません',
      ldapSearchError: 'ディレクトリ検索に失敗。LDAPサーバーの状態を確認してください。',
      ldapAlreadyProvisioned: 'プロビジョニング済み',
      ldapSelectedLabel: '選択中',
      ldapProvision: 'ユーザーをプロビジョニング',
      ldapProvisioning: 'プロビジョニング中...',
      ldapErrorProvision: 'プロビジョニングに失敗。LDAPサーバーの状態を確認して再試行してください。',
    },
    form: {
      username: 'ユーザー名',
      usernamePlaceholder: 'ユーザー名を入力',
      email: 'メール',
      emailPlaceholder: 'user@example.com',
      password: 'パスワード',
      passwordPlaceholder: 'パスワードを入力',
      confirmPassword: 'パスワードの確認',
      confirmPasswordPlaceholder: 'パスワードを確認',
      newPasswordPlaceholder: '新しいパスワードを入力',
      confirmNewPasswordPlaceholder: '新しいパスワードを確認',
      leaveBlankToKeep: '（現在のパスワードを維持する場合は空白）',
      groups: 'グループ',
      optional: 'オプション',
      autoGeneratedPassword: '安全なパスワードが自動的に生成され、ユーザーにメールで送信されます。',
      passwordManagedByAdvancedAuth: 'パスワードは高度な認証によって管理されています。「パスワードのリセット」を使用して、メールで新しいパスワードをユーザーに送信してください。',
      resetPassword: 'パスワードのリセット',
      resettingPassword: 'パスワードをリセット中...',
    },
    deleteModal: {
      title: 'ユーザーを削除',
      message: 'このユーザーを削除してもよろしいですか？この操作は元に戻せません。',
      confirm: 'ユーザーを削除',
    },
  },

  // Stream overlay
  streamOverlay: {
    title: 'ストリームオーバーレイ',
    invalidPrinterId: '無効なプリンターID',
    cameraStream: 'カメラストリーム',
    progress: '進捗',
    eta: '残り時間',
    printerIdle: 'プリンター待機中',
    printerOffline: 'プリンターオフライン',
    builder: {
      title: 'ストリームオーバーレイ',
      description: 'ストリームオーバーレイのURLを作成します。全画面のカメラ映像に印刷中の情報を重ねて表示するもので、OBSや壁掛けディスプレイなどのブラウザソースで使えます。表示する項目を選んでURLをコピーしてください。',
      printer: 'プリンター',
      size: '文字サイズ',
      sizeSmall: '小',
      sizeMedium: '中',
      sizeLarge: '大',
      fps: 'フレームレート',
      fpsHint: 'A1およびP1のカメラは、指定した値にかかわらず毎秒5フレーム程度が上限です。',
      token: 'ストリームオーバーレイトークン（任意）',
      tokenHint: 'ログインを有効にしている場合のみ必要です。OBS自体はセッションを持ちません。上の欄でストリームオーバーレイのスコープを選んで作成してください。',
      tokenWarning: 'このURLにはトークンが含まれます。URLを読める人は誰でも映像とファイル名を見られます。アクセスを止めるにはトークンを失効させてください。',
      fields: '表示する項目',
      fieldPrinter: 'プリンター名',
      fieldFilename: 'ファイル名',
      fieldStatus: 'ステータス',
      fieldProgress: '進捗バー',
      fieldLayers: 'レイヤー数',
      fieldEta: '残り時間と終了予定時刻',
      fieldCamera: 'カメラ映像',
      chamberHint: 'チャンバー温度は実際のセンサーを備えたモデルでのみ表示されます。P1およびA1は意味のない値を返すため除外されます。',
      urlTitle: 'オーバーレイURL',
      open: '開く',
      showPreview: 'プレビューを表示',
      hidePreview: 'プレビューを非表示',
      previewTitle: 'オーバーレイのプレビュー',
    },
    status: {
      printing: '印刷中',
      paused: '一時停止',
      finished: '完了',
      failed: '失敗',
      idle: '待機中',
      unknown: '不明',
    },
  },

  // Profiles
  profiles: {
    title: 'フィラメントプロファイル',
    subtitle: 'スライサープリセットと圧力キャリブレーションの管理',
    tabs: {
      bambuCloud: 'Bambu Cloud',
      orcaCloud: 'Orca Cloud',
      local: 'ローカルプロファイル',
      kprofiles: 'Kプロファイル',
    },
    orcaCloud: {
      connectedAs: '接続中',
      connectedShort: 'Orca Cloudに接続済み',
      logout: '切断',
      noLogoutPermission: '切断する権限がありません',
      noConnectPermission: 'Orca Cloudに接続する権限がありません',
      retry: '再試行',
      connectButton: 'Orca Cloudに接続',
      connect: {
        title: 'Orca Cloudに接続',
        description: 'Orca Cloudアカウントにサインインして、スライサープロファイルをBambuddyに同期します。',
      },
      device: {
        title: 'Orca CloudでBambuddyを承認',
        instruction: 'Orca Cloudを開いてこのコードを承認してください。承認するとBambuddyが自動的に接続されます。',
        codeLabel: 'ペアリングコード',
        openButton: 'Orca Cloud承認ページを開く',
        manualHint: 'または {{url}} にアクセスして、上記のコードを入力してください。',
        waiting: '承認をお待ちしています…',
        cancel: 'キャンセル',
      },
      profiles: {
        title: 'Orca Cloudプロファイル ({{count}})',
        refresh: '更新',
        empty: 'Orca Cloudアカウントにまだプロファイルがありません。',
      },
      toast: {
        disconnected: 'Orca Cloudから切断しました',
      },
      errors: {
        startFailed: 'Orca Cloudのサインインを開始できませんでした。',
        denied: 'Orca Cloudでペアリングが拒否されました。',
        expired: 'ペアリングコードの有効期限が切れました。「接続」をクリックしてもう一度お試しください。',
        pollFailed: '承認の待機中に接続が失われました。もう一度お試しください。',
      },
    },
    localProfiles: {
      title: 'ローカルプロファイル',
      subtitle: 'OrcaSlicerからスライサープリセットをインポート・管理',
      import: 'プロファイルをインポート',
      importDesc: '.bbscfg、.bbsflmt、.orca_filament、.zip、.jsonファイルをここにドロップ',
      importing: 'インポート中...',
      search: 'ローカルプリセットを検索...',
      noPresets: 'ローカルプリセットがまだありません',
      noSearchResults: '検索に一致するプリセットがありません',
      badge: 'ローカル',
      edit: '編集',
      delete: '削除',
      cancel: 'キャンセル',
      deleteConfirmTitle: 'プリセットを削除',
      deleteConfirm: 'このプリセットを削除してもよろしいですか？元に戻せません。',
      source: 'ソース',
      inheritsFrom: '継承元',
      filamentType: 'タイプ',
      vendor: 'メーカー',
      compatiblePrinters: 'プリンター',
      nozzleTemp: 'ノズル温度',
      cost: 'コスト',
      density: '密度',
      pressureAdvance: 'プレッシャーアドバンス',
      filament: 'フィラメント',
      process: 'プロセス',
      printer: 'プリンター',
      toast: {
        importSuccess: '{{count}}件のプリセットをインポートしました',
        importSkipped: '{{count}}件のプリセットをスキップしました（重複）',
        importError: 'インポート中に{{count}}件のエラーが発生しました',
        deleted: 'プリセットを削除しました',
        updated: 'プリセットを更新しました',
      },
    },
    connectedAs: '接続中:',
    signInExpiredTitle: 'Bambu Cloud のサインインの有効期限が切れました',
    signInExpiredBody: '保存されたトークンは Bambu Lab に受け付けられなくなりました。クラウドプロファイル、MakerWorld のインポート、ファームウェア確認を復元するには、再度サインインしてください。',
    logout: 'ログアウト',
    noLogoutPermission: 'ログアウトする権限がありません',
    failedToLoad: 'ファイルの読み込みに失敗しました',
    retry: 'リトライ',
    time: {
      justNow: 'たった今',
      minsAgo: '{{count}}分前',
      hoursAgo: '{{count}}時間前',
      daysAgo: '{{count}}日前',
    },
    toast: {
      loggedOut: 'ログアウトしました',
    },
    login: {
      title: 'Bambuddy ログイン',
      subtitle: 'アカウントにサインイン',
      email: 'メールアドレス',
      password: 'パスワード',
      region: 'リージョン',
      regionGlobal: 'グローバル',
      regionChina: '中国',
      verificationCode: '認証コード',
      totpCode: '認証アプリコード',
      checkEmail: 'メール ({{email}}) に届いた6桁のコードを入力してください',
      enterTotpHint: '認証アプリの6桁のコードを入力してください',
      accessToken: 'アクセストークン',
      accessTokenHint: 'Bambu Cloud のアクセストークンを貼り付けてください。中国リージョンのアカウントはこの方法のみ利用可能です（電話番号認証のためメールログイン不可）。トークンの取得方法は MakerWorld の Cookie から（Wiki を参照）。',
      back: '戻る',
      loginButton: 'ログイン',
      verifyButton: '認証',
      setTokenButton: 'トークンを設定',
      useToken: 'アクセストークンを使用',
      captchaTitle: 'Bambu Cloud が CAPTCHA を要求しています',
      captchaBody: 'Bambu がサインインを受け付ける前にネットワークへ CAPTCHA を要求しており、この認証は Bambuddy からは応答できません。メールアドレスやパスワードの問題ではありません。ブロックはグローバル IP アドレスに紐づいており、通常は数時間で自動的に解除されます。繰り返し再試行すると解除が遅くなります。今すぐサインインするには、ブラウザーのセッションから取得したアクセストークンを使用してください。',
      useEmail: 'メールでログイン',
      toast: {
        loggedIn: 'ログインしました',
        codeSent: 'メールに認証コードを送信しました',
        enterTotp: '認証アプリのコードを入力してください',
        tokenSet: 'トークンを設定しました',
      },
    },
    presets: {
      myPreset: 'マイプリセット（編集可能）',
      duplicate: '複製',
      editable: '編集可能',
      failedToLoadDetails: 'プリセットの詳細を読み込めませんでした',
      deleteConfirm: 'このプロファイルを削除しますか？',
      deleteWarning: '「{{name}}」をBambu Cloudから完全に削除します。元に戻せません。',
      noDuplicatePermission: 'プリセットを複製する権限がありません',
      noEditPermission: 'プリセットを編集する権限がありません',
      noDeletePermission: 'プロジェクトを削除する権限がありません',
      types: {
        filament: 'フィラメント',
        printer: 'プリンター',
        process: 'プロセス',
      },
      toast: {
        deleted: 'アーカイブを削除しました',
        created: 'プリセットを作成しました',
        updated: 'プリセットを更新しました',
        duplicated: 'プリセットを複製しました',
        fieldAdded: 'フィールド "{{key}}" を追加しました',
        exported: 'プリセットをエクスポートしました',
      },
      baseLabel: 'ベース: {{name}}',
      currentLabel: '現在: {{name}}',
      newPreset: '新規プリセット',
      editPreset: 'プリセットを編集',
      duplicatePreset: 'プリセットを複製',
      createNewPreset: '新しいプリセットを作成',
      customizeSettings: '新しいプリセットの設定をカスタマイズ',
      compareWithBase: 'ベースプリセットと比較',
      compare: '比較',
      // CreatePresetModal - Basic Info
      basePreset: 'ベースプリセット',
      selectBasePreset: 'ベースプリセットを選択...',
      presetName: 'プリセット名',
      myCustomPreset: 'カスタムプリセット',
      inheritsFrom: '継承元:',
      dropJsonToImport: 'JSONファイルをドロップしてインポート',
      // CreatePresetModal - Tabs
      tabs: {
        common: '一般',
        allFields: 'すべてのフィールド',
      },
      // CreatePresetModal - All Fields Tab
      availableFields: '利用可能なフィールド',
      searchFieldsPlaceholder: 'フィールドを検索...',
      noMatchingFields: '一致するフィールドがありません',
      allFieldsAdded: 'すべてのフィールドが追加済みです',
      addCustomField: 'カスタムフィールドを追加',
      yourOverrides: 'オーバーライド一覧',
      noOverridesYet: 'オーバーライドはまだありません',
      clickFieldsToAdd: '左のフィールドをクリックして追加',
      saveAsTemplate: 'テンプレートとして保存',
      jsonTip: 'ヒント: .jsonファイルをこのモーダルにドラッグ＆ドロップして設定をインポート',
    },
    cloudView: {
      searchPlaceholder: 'プリセットを検索...',
      templates: 'テンプレート',
      refresh: '更新',
      newPreset: '新規プリセット',
      clearFilters: 'フィルターをクリア',
      // Compare mode
      compareMode: '比較モード',
      selectAnotherPreset: '同じタイプ（{{type}}）の別のプリセットを選択',
      clickTwoPresets: '同じタイプのプリセットを2つクリックして比較',
      selectFirst: '1. 最初を選択',
      selectSecond: '2. 2番目を選択',
      compareNow: '比較を実行',
      // Status row
      lastSynced: '最終同期:',
      showingCount: '{{total}} 件中 {{showing}} 件のプリセットを表示',
      noPresetsFound: 'プリセットが見つかりません',
      // Column headers
      columns: {
        filament: 'フィラメント',
        process: 'プロセス',
        printer: 'プリンター',
      },
      noFilamentPresets: 'フィラメントプリセットなし',
      noProcessPresets: 'プロセスプリセットなし',
      noPrinterPresets: 'プリンタープリセットなし',
      // Filters
      filters: {
        type: '種類',
        owner: '所有者',
        printer: 'プリンター',
        nozzle: 'ノズル',
        filament: 'フィラメント',
        layer: 'レイヤー',
        all: 'すべて',
        myPresets: 'マイプリセット',
        builtIn: 'ビルトイン',
        process: 'プロセス',
      },
      // Permissions
      noTemplatesPermission: 'テンプレートを管理する権限がありません',
      noRefreshPermission: 'プロファイルを更新する権限がありません',
      noCreatePermission: 'プロジェクトを作成する権限がありません',
    },
    templates: {
      title: 'フィラメントプロファイル',
      noTemplates: 'テンプレートがありません。バックエンドを再起動してデフォルトテンプレートを作成してください。',
      createFirst: 'プリセットエディタからテンプレートを作成',
      typeFilter: 'タイプ:',
      deleteTitle: 'テンプレートを削除',
      deleteWarning: 'この操作は元に戻せません',
      deleteConfirm: '"{{name}}" を削除しますか？',
      namePlaceholder: 'テンプレート名',
      descriptionPlaceholder: '説明',
      settingsJson: '設定 (JSON)',
      fieldsCount: '{{count}}フィールド',
      shownInModals: 'モーダルに表示',
      hiddenInModals: 'モーダルで非表示',
      apply: '適用',
      toast: {
        deleted: 'アーカイブを削除しました',
        updated: 'テンプレートを更新しました',
        created: 'テンプレートを作成しました',
        applied: 'テンプレートを適用しました',
      },
    },
  },

  // Support/Debug
  support: {
    debugLoggingActive: 'デバッグログが有効です',
    manageLogs: '管理',
    collectItem7: 'プリンター接続状態とファームウェアバージョン',
    collectItem8: '連携状態（Spoolman、MQTT、HA）',
    collectItem9: 'ネットワークインターフェース（サブネットのみ）',
    collectItem10: 'Pythonパッケージバージョン',
    collectItem11: 'データベース健全性チェック',
    collectItem12: 'Docker環境の詳細',
    bundleGenerating: 'バンドルを生成中...',
    bundleStepConnection: 'プリンターの接続確認を実行中',
    bundleStepVirtualPrinters: '仮想プリンターのセットアップ確認を実行中',
    bundleStepLogScan: '最近のログから既知の問題をスキャン中',
    bundleStepBuild: 'サポートバンドル ZIP を作成中',
  },

  // File manager
  fileManager: {
    variants: {
      badge: '{{count}}個のバージョン',
      groupAction: 'バージョンとしてグループ化',
      groupTooltip: 'これらのファイルを、異なるプリンター向けにスライスした同一ジョブとして扱います',
      grouped: '{{count}}個のファイルをバージョンとしてグループ化しました',
      printAlternatives: '印刷（{{count}}件の候補）',
    },
    title: 'ファイル管理',
    subtitle: '印刷ファイルの整理と管理',
    uploadFiles: 'ファイルをアップロード',
    newFolder: '新しいフォルダ',
    folderName: 'フォルダ名',
    folderNamePlaceholder: '例: 機能パーツ',
    renameFile: 'ファイル名を変更',
    renameFolder: 'フォルダ名を変更',
    invalidFilenameChar: '印刷ファイル名に "{{char}}" は使用できません。プリンターのSDカードは次の文字を拒否します: < > : " / \\ | ? *',
    moveFiles: '{{count}}件のファイルを移動',
    rootNoFolder: 'ルート（フォルダなし）',
    current: '（現在）',
    linkFolder: 'フォルダをリンク',
    linkFolderDescription: '「{{name}}」をプロジェクトまたはアーカイブにリンクしてすばやくアクセス。',
    project: 'プロジェクト',
    archive: 'アーカイブ',
    noProjectsFound: 'プロジェクトが見つかりません',
    noArchivesFound: 'アーカイブが見つかりません',
    unlink: 'リンク解除',
    link: 'リンク',
    dragDropFiles: 'ファイルをここにドラッグ＆ドロップ',
    dropFilesHere: 'ここにファイルをドロップ',
    releaseToUpload: '離してアップロード',
    orClickToBrowse: 'またはクリックして選択',
    allFileTypesSupported: 'すべてのファイルタイプに対応。ZIPファイルは展開されます。',
    zipFilesDetected: 'ZIPファイルを検出',
    zipExtractOptions: 'ZIPファイルは展開されます。フォルダー構造の処理方法を選択：',
    preserveZipStructure: 'ZIPのフォルダ構造を保持',
    createFolderFromZip: 'ZIPファイル名からフォルダーを作成',
    stlThumbnailGeneration: 'STLサムネイル生成',
    zipMayContainStl: 'ZIPファイルにSTLファイルが含まれている場合があります。展開時にサムネイルを生成できます。',
    thumbnailsCanBeGenerated: 'STLファイルのサムネイルを生成できます。大きなモデルは処理に時間がかかる場合があります。',
    generateThumbnailsForStl: 'STLファイルのサムネイルを生成',
    threemfDetected: '3MFファイルを検出',
    threemfExtractionInfo: 'プリンターモデル、素材、色、印刷設定は3MFファイルから自動的に抽出されます。',
    willBeExtracted: '• 展開予定',
    filesExtracted: '• {{count}}個のファイルを展開済み',
    uploadComplete: 'アップロード完了: {{succeeded}} 件成功',
    uploadFailed: 'アップロード失敗',
    zipFilesFailed: '{{count}}個のファイルが失敗',
    uploading: 'アップロード中...',
    changeLink: 'リンクを変更...',
    linkTo: 'リンク先...',
    linkToProjectOrArchive: 'プロジェクトまたはアーカイブにリンク',
    generateThumbnail: 'サムネイルを生成',
    generateThumbnails: 'サムネイルを生成',
    generateThumbnailsForMissing: 'サムネイルのないSTLファイルのサムネイルを生成',
    gridView: 'グリッド表示',
    listView: 'リスト表示',
    lowDiskSpaceWarning: 'ディスク容量不足の警告',
    lowDiskSpaceDetails: '{{total}}中{{free}}の空き容量のみ。しきい値は設定で{{threshold}}GBに設定されています。',
    files: 'ファイル',
    folders: 'フォルダ',
    size: 'サイズ',
    free: '空き:',
    allFiles: 'すべてのファイル',
    allExternal: '外部',
    externalIsEmpty: '外部ファイルはありません',
    externalEmptyDescription: 'リンクされた外部フォルダ内のファイルがここに表示されます。',
    wrap: '折り返し',
    enableTextWrapping: 'テキスト折り返しを有効化',
    disableTextWrapping: 'テキスト折り返しを無効化',
    collapse: '折りたたむ',
    collapseFoldersByDefault: 'フォルダをデフォルトで折りたたむ',
    expandFoldersByDefault: 'フォルダをデフォルトで展開する',
    folderSort: 'フォルダの並べ替え',
    folderSortByName: '名前順',
    folderSortByActivity: '最終更新順',
    dragToResizeTooltip: 'ドラッグしてリサイズ、ダブルクリックでリセット',
    searchFiles: 'ファイルを検索...',
    searchSubfoldersHint: 'サブフォルダーを含む',
    readme: {
      truncated: '切り詰め',
      show: 'READMEを表示',
      hide: 'READMEを非表示',
      label: 'README',
    },
    tags: {
      title: 'タグ',
      subtitle: 'ファイルに横断的なフィルタ用のラベルを付けます — おもちゃ、子ども向け、PETGのみ、など。',
      manage: 'タグ',
      manageTitle: 'タグカタログを管理',
      add: '新しいタグ',
      edit: 'タグの名前を変更',
      name: '名前',
      fileCount: 'ファイル数',
      empty: 'タグがまだありません。作成してファイルにラベル付けを始めましょう。',
      noMatches: '一致するタグがありません。',
      createPlaceholder: '例：おもちゃ、子ども向け、petg',
      createButton: '作成',
      nameRequired: '名前は必須です。',
      searchPlaceholder: 'タグを絞り込み...',
      created: 'タグを作成しました。',
      updated: 'タグの名前を変更しました。',
      deleted: 'タグを削除しました。',
      saveFailed: 'タグを保存できませんでした。',
      deleteFailed: 'タグを削除できませんでした。',
      applyFailed: 'タグを適用できませんでした。',
      applyAdd: 'タグを追加',
      applyRemove: 'タグを削除',
      applyAddSuccess: '{{files}}個のファイルに{{count}}個のタグを追加しました。',
      applyRemoveSuccess: '{{files}}個のファイルから{{count}}個のタグを削除しました。',
      actionAdd: '選択したファイルに追加',
      actionRemove: '選択したファイルから削除',
      tagAction: 'タグ付け',
      bulkTitle: '選択した{{count}}個のファイルにタグ付け',
      bulkTooltip: '選択したすべてのファイルでタグを追加・削除します。',
      noPermission: 'ファイルにタグを付ける権限がありません。',
      filterLabel: '絞り込み:',
      clearAll: 'すべてクリア',
      confirmDelete: 'タグ「{{name}}」を削除しますか？',
      confirmDeleteMessage: 'カタログからタグを削除します。ファイル自体や他のタグはそのまま残ります。',
      confirmDeleteInUseMessage: 'このタグは{{count}}個のファイルに付いています。削除するとすべてのファイルからチップが消えますが、ファイル自体はそのままです。',
      editAria: '{{name}}を編集',
      deleteAria: '{{name}}を削除',
    },
    allTypes: 'すべての種類',
    prints: '印刷回数',
    ascending: '昇順',
    descending: '降順',
    showModified: '更新日時を表示',
    hideModified: '更新日時を非表示',
    lastModified: '最終更新',
    lastActivity: '最終アクティビティ',
    resultsCount: '{{total}}件中{{showing}}件',
    selectAll: 'すべて選択',
    deselectAll: 'すべて選択解除',
    selected: '{{count}}件選択中',
    adding: '追加中...',
    loadingFiles: 'ファイルを読み込み中...',
    folderIsEmpty: 'フォルダーは空です',
    noFilesYet: 'ファイルはまだありません',
    folderEmptyDescription: 'ファイルをアップロードするか、このフォルダーにファイルを移動して開始しましょう。',
    noFilesDescription: '印刷関連ファイルの整理を始めるにはファイルをアップロードしてください。',
    noMatchingFiles: '一致するファイルがありません',
    noMatchingFilesDescription: '現在の検索またはフィルター条件に一致するファイルがありません。',
    clearFilters: 'フィルターをクリア',
    printedCount: '{{count}}回印刷済み',
    uploadedBy: 'アップロード者',
    deleteFolder: 'フォルダを削除',
    deleteFile: 'ファイルを削除',
    deleteFilesCount: '{{count}}件のファイルを削除',
    deleteFolderConfirm: 'このフォルダを削除しますか？中のファイルもすべて削除されます。',
    deleteFileConfirm: 'このファイルを削除しますか？',
    deleteFilesConfirm: '選択した{{count}}件のファイルを削除しますか？この操作は元に戻せません。',
    deleting: '削除中...',
    noPermissionRenameFolder: 'フォルダー名を変更する権限がありません',
    noPermissionLinkFolder: 'フォルダーをリンクする権限がありません',
    noPermissionDeleteFolder: 'フォルダーを削除する権限がありません',
    onlyEmptyFoldersDeletable: '空のフォルダーのみ削除できます',
    noPermissionPrint: '印刷する権限がありません',
    noPermissionSlice: 'ファイルをスライスする権限がありません',
    noPermissionAddToQueue: 'キューに追加する権限がありません',
    noPermissionDownload: 'ファイルをダウンロードする権限がありません',
    noPermissionRenameFile: 'このファイル名を変更する権限がありません',
    noPermissionGenerateThumbnail: 'サムネイルを生成する権限がありません',
    noPermissionDeleteFile: 'このファイルを削除する権限がありません',
    noPermissionCreateFolder: 'フォルダーを作成する権限がありません',
    noPermissionUpload: 'ファイルをアップロードする権限がありません',
    noPermissionMoveFiles: 'ファイルを移動する権限がありません',
    noPermissionDeleteFiles: 'ファイルを削除する権限がありません',
    // External folder
    linkExternal: '外部リンク',
    linkExternalFolder: '外部フォルダをリンク',
    linkExternalFolderDescription: 'ホストディレクトリ（NAS、USB、ネットワーク共有）をファイルマネージャにマウントします。ファイルはコピーされず、元のパスから直接アクセスされます。',
    externalFolderNamePlaceholder: '例：NASプリント',
    externalPath: 'ホストパス',
    externalPathHelp: 'Dockerホスト上のディレクトリの絶対パス。コンテナにバインドマウントされている必要があります。',
    readOnly: '読み取り専用',
    readOnlyHelp: 'アップロードと削除を防止',
    showHiddenFiles: '隠しファイルを表示（ドットファイル）',
    externalFolder: '外部フォルダ',
    scanFolder: 'スキャン',
    toast: {
      folderCreated: 'フォルダを作成しました',
      openInSlicerFailed: 'スライサーで開けませんでした',
      folderDeleted: 'フォルダを削除しました',
      fileDeleted: 'ファイルを削除しました',
      filesDeleted: '{{count}}件のファイルを削除しました',
      filesMoved: 'ファイルを移動しました',
      folderLinked: 'フォルダをリンクしました',
      folderUnlinked: 'フォルダのリンクを解除しました',
      externalFolderLinked: '外部フォルダがリンクされスキャンされました',
      folderScanned: 'スキャン完了：{{added}}件追加、{{removed}}件削除',
      addedToQueue: '{{count}}個のファイルをキューに追加しました',
      addedToQueuePartial: '{{added}}件追加、{{failed}}件失敗',
      failedToAddToQueue: 'ファイルの追加に失敗: {{error}}',
      fileRenamed: 'ファイル名を変更しました',
      folderRenamed: 'フォルダ名を変更しました',
      thumbnailsGenerated: '{{count}}件のサムネイルを生成しました',
      thumbnailsGeneratedPartial: '{{succeeded}}件生成、{{failed}}件失敗',
      noStlMissingThumbnails: 'サムネイルのないSTLファイルはありません',
      failedToGenerateThumbnails: 'サムネイルの生成に失敗: {{error}}',
      thumbnailGenerated: 'サムネイルを生成しました',
      failedToGenerateThumbnail: 'サムネイルの生成に失敗: {{error}}',
    },
  },

  // Projects
  projects: {
    parentLabel: '親プロジェクト',
    parentNone: 'なし（トップレベルプロジェクト）',
    parentHint: 'このプロジェクトを別のプロジェクトの下に配置すると、数値がマスタープロジェクトに集計されます',
    partOf: '{{name}} の一部',
    subProjectCount: 'サブプロジェクト {{count}} 件',
    subProjectsOf: '{{name}} のサブプロジェクト',
    title: 'プロジェクト',
    subtitle: '印刷プロジェクトを管理',
    newProject: '新規プロジェクト',
    editProject: 'プロジェクトを編集',
    deleteProject: 'プロジェクトを削除',
    projectName: 'プロジェクト名',
    description: '説明',
    noProjects: 'プロジェクトはまだありません',
    noProjectsFiltered: '{{status}}のプロジェクトはありません',
    noProjectsFilteredHelp: '{{status}}のプロジェクトがありません。ステータスが変更されるとここに表示されます。',
    createFirst: '最初のプロジェクトを作成して、関連する印刷の整理、進捗管理、ビルドの管理を始めましょう。',
    createFirstButton: '最初のプロジェクトを作成',
    create: '作成',
    files: 'ファイル',
    prints: '印刷',
    plates: 'プレート',
    parts: 'パーツ',
    lastModified: '最終更新日',
    deleteConfirm: 'このプロジェクトを削除しますか？アーカイブとキューアイテムはリンク解除されますが、削除されません。',
    addFiles: 'ファイルを追加',
    removeFile: 'ファイルを削除',
    viewDetails: '詳細を表示',
    // Modal fields
    namePlaceholder: 'プロジェクト名',
    descriptionPlaceholder: 'プロジェクトの説明（任意）',
    urlLabel: 'URL',
    urlPlaceholder: 'https://makerworld.com/...',
    urlInvalid: 'URLはhttp://またはhttps://で始まる必要があります',
    openExternalUrl: 'プロジェクトのURLを開く',
    coverImageLabel: 'カバー画像',
    coverImageAlt: 'プロジェクトのカバー画像',
    coverImageUpload: 'アップロード',
    coverImageReplace: '置き換える',
    coverImageRemove: '削除',
    color: '色',
    targetPlates: '目標プレート数',
    targetPlatesPlaceholder: '例: 10',
    targetPlatesHelp: '印刷ジョブの数',
    targetParts: '目標パーツ数',
    targetPartsPlaceholder: '例: 50',
    targetPartsHelp: '必要なオブジェクトの総数',
    targetSets: 'ファイルごとの部数',
    targetSetsPlaceholder: '例: 10',
    targetSetsHelp: '各印刷可能ファイルを印刷する回数',
    tagsLabel: 'タグ（カンマ区切り）',
    tagsPlaceholder: 'カンマ区切りのタグ',
    dueDate: '期限',
    priority: '優先度',
    priorityLow: '低',
    priorityNormal: '通常',
    priorityHigh: '高',
    priorityUrgent: '緊急',
    // Status
    statusActive: '進行中',
    statusCompleted: '完了',
    statusArchived: 'アーカイブ済み',
    done: '完了',
    completed: '完了',
    failed: '失敗',
    inQueue: 'キュー内',
    noPrintsYet: '印刷履歴なし',
    // Footer stats
    printJobs: '印刷ジョブ',
    partsPrinted: '印刷済みパーツ',
    failedParts: '失敗パーツ',
    // Actions
    import: 'インポート',
    export: 'エクスポート',
    importProject: 'プロジェクトをインポート',
    exportAll: 'すべてのプロジェクトをエクスポート',
    loading: 'プロジェクトを読み込み中...',
    // Permissions
    noEditPermission: 'プロジェクトを編集する権限がありません',
    noDeletePermission: 'プロジェクトを削除する権限がありません',
    noCreatePermission: 'プロジェクトを作成する権限がありません',
    noImportPermission: 'プロジェクトをインポートする権限がありません',
    noExportPermission: 'プロジェクトをエクスポートする権限がありません',
    // Toast
    toast: {
      created: 'プロジェクトを作成しました',
      updated: 'プロジェクトを更新しました',
      deleted: 'アーカイブを削除しました',
      imported: 'プロジェクトをインポートしました',
      multipleImported: '{{count}}件のプロジェクトをインポートしました',
      importFailed: 'インポートに失敗しました',
      exported: 'プロジェクトをエクスポートしました（メタデータのみ）',
    },
  },

  // Project detail page
  projectDetail: {
    notFound: '見つかりません',
    backToProjects: 'プロジェクト一覧に戻る',
    export: 'エクスポート',
    exportProject: 'プロジェクトをエクスポート',
    noExportPermission: 'プロジェクトをエクスポートする権限がありません',
    noEditPermission: 'このプロジェクトを編集する権限がありません',
    partOf: '所属先',
    priorityLabel: '優先度',
    noPrints: 'このプロジェクトにはまだ印刷がありません',
    status: {
      active: '進行中',
      completed: '完了',
      archived: 'アーカイブ済み',
    },
    priority: {
      low: '低',
      normal: '通常',
      high: '高',
      urgent: '緊急',
    },
    dueDate: {
      overdue: '期限超過',
      today: '今日が期限',
      daysLeft: '残り{{count}}日',
    },
    progress: {
      platesProgress: 'プレート進捗',
      partsProgress: 'パーツ進捗',
      setsProgress: '完成セット',
      sets: 'セット',
      setsHint: 'すべての印刷可能ファイルがこの回数に達するとセットが完成します',
      printJobs: '印刷ジョブ',
      parts: 'パーツ',
      percentComplete: '{{percent}}% 完了',
      remaining: '残り {{count}} 件',
    },
    stats: {
      printJobs: '印刷ジョブ',
      total: '合計',
      failed: '失敗 {{count}} 件',
      partsPrinted: '印刷済みパーツ {{count}} 件',
      printTime: '印刷時間',
      filamentUsed: 'フィラメント使用量',
    },
    cost: {
      title: 'コスト追跡',
      filamentCost: 'フィラメント',
      energy: 'エネルギー',
      totalCost: '合計コスト',
      total: '合計',
      includesBom: 'BOM含む',
      budget: '予算',
      remaining: '残り',
    },
    subProjects: {
      title: 'サブプロジェクト ({{count}})',
      jobs: 'ジョブ {{count}} 件',
    },
    rollup: {
      title: 'サブプロジェクト {{count}} 件を含む',
      progress: '全体の進捗',
      percentComplete: '{{percent}}% 完了',
    },
    notes: {
      title: 'メモ',
      noEditPermission: 'このプロジェクトを編集する権限がありません',
      placeholder: 'このプロジェクトについてメモを追加...',
      empty: '<空>',
    },
    files: {
      title: 'ファイル',
      linkFolders: 'ファイルマネージャーからフォルダーをリンク',
      forQuickAccess: 'してクイックアクセスできるようにします。',
      fileCount: '{{count}}ファイル',
      empty: '<空>',
      printedCount: '{{count}}回印刷済み',
      progressTooltip: '{{target}}回中{{done}}回の印刷が完了',
      noFiles: 'このフォルダにファイルはありません。',
    },
    bom: {
      title: '部品表',
      acquired: '{{completed}}/{{total}} 取得済み',
      showAll: 'すべて表示',
      hideDone: '完了を非表示',
      addPart: 'パーツを追加',
      noAddPermission: 'パーツを追加する権限がありません',
      partNamePlaceholder: 'パーツ名',
      partName: 'パーツ名',
      qty: '数量',
      price: '価格 ({{currency}})',
      sourcingUrlPlaceholder: 'URL（任意）',
      remarksPlaceholder: '備考',
      deletePart: 'パーツを削除',
      deleteConfirm: '「{{name}}」を削除しますか？',
      noUpdatePermission: 'パーツを更新する権限がありません',
      noEditPermission: 'このプロジェクトを編集する権限がありません',
      noDeletePermission: 'プロジェクトを削除する権限がありません',
      totalCost: '合計コスト',
      empty: '<空>',
    },
    timeline: {
      title: 'アクティビティタイムライン',
      empty: '<空>',
    },
    template: {
      saveAsTemplate: 'テンプレートとして保存',
      noCreatePermission: 'プロジェクトを作成する権限がありません',
    },
    queue: {
      title: '印刷キュー',
      viewAll: 'すべて表示',
      printing: '印刷中 {{count}} 件',
      queued: 'キュー内 {{count}} 件',
    },
    prints: {
      title: '印刷 ({{count}})',
    },
    toast: {
      projectUpdated: 'プロジェクトを更新しました',
      partAdded: 'パーツを追加しました',
      partRemoved: 'パーツを削除しました',
      exportFailed: 'エクスポートに失敗しました',
      projectExported: 'プロジェクトがエクスポートされました',
      templateCreated: 'プロジェクトからテンプレートを作成しました',
    },
  },

  // System info
  system: {
    title: 'システム情報',
    version: 'バージョン',
    uptime: '稼働時間',
    cpuUsage: 'CPU使用率',
    memoryUsage: 'メモリ使用量',
    diskUsage: 'ディスク使用量',
    networkInfo: 'ネットワーク情報',
    logs: 'ログ',
    debugMode: 'デバッグモード',
    enableDebug: 'デバッグログを有効化',
    disableDebug: 'デバッグログを無効化',
    downloadLogs: 'ログをダウンロード',
    clearLogs: '通知ログを削除',
    dockerInfo: 'Docker情報',
    containerName: 'コンテナ名',
    imageName: 'イメージ名',
    platform: 'プラットフォーム',
    architecture: 'アーキテクチャ',
  },

  // Sponsor surface (System page)
  sponsors: {
    sectionTitle: '独立・コミュニティ運営',
    tagline: 'Bambuddyは無料で、これからも無料です。支援してくださる方々のおかげで、VCもクラウドロックインもありません。',
    viewSupporters: 'サポーター一覧',
    toastPrints: 'Bambuddyで{{count}}件の印刷を完了しました。Bambuddyは支援者のおかげで無料で提供されています。',
    toastCost: 'Bambuddyで{{total}}分のフィラメントを記録しました。プロジェクトを支えてくれている方々をご覧ください。',
    toastArchives: '{{count}}件の印刷をBambuddyでアーカイブしました。独立を支えてくれている方々をご覧ください。',
    toastAnniversary: 'Bambuddyとの1周年です！プロジェクトを支えてくれている方々をご覧ください。',
    toastVersionUpdate: 'v{{version}}にアップデートされました。Bambuddyは支援者のおかげで無料で提供されています。',
    toastBusiness: '{{count}}台のプリンターでBambuddyを運用中ですね。チーム向けのサポートプランがあります（優先対応、請求書発行、開発者への直接窓口）。',
    businessCta: 'ビジネス向けBambuddy',
    businessTitle: 'ビジネス向けBambuddy',
    businessTagline: '{{count}}台のプリンターを運用中です。チームやプリントファーム向けに、優先サポート、商用ライセンス、請求書発行をご用意しています。',
  },

  // Library (K Profiles)
  library: {
    title: 'フィラメントライブラリ',
    addFilament: 'フィラメントを追加',
    editFilament: 'フィラメントを編集',
    deleteFilament: 'フィラメントを削除',
    vendor: 'メーカー',
    material: '素材',
    color: '色',
    kFactor: 'K値',
    temperature: '温度',
    noFilaments: 'ライブラリにフィラメントがありません',
    deleteConfirm: 'このフィラメントを削除しますか？',
    importFromPrinter: 'プリンターからインポート',
    exportToFile: 'ファイルにエクスポート',
    runWithPipeline: {
      actionLabel: 'パイプラインで実行',
      noPermission: 'パイプラインを実行する権限がありません',
      modalTitle: 'パイプラインで実行',
      confirmTitle: '実行を確認',
      confirmIntro: 'プリフライトでこの実行に関する問題が見つかりました',
      sourceHint: 'ソース',
      pipelineHint: 'パイプライン',
      targetHint: '対象',
      pipelineListAria: '利用可能なパイプライン',
      runAnyway: 'とにかく実行',
      loading: '読み込み中…',
      empty: '保存されたパイプラインはまだありません。スライスダイアログを開き「パイプラインとして保存」をクリックして作成してください。',
      noTarget: '対象プリンターが未設定',
      noTargetMessage: 'このパイプラインには対象プリンターが設定されていません。設定で開いて選択してください。',
      copies: 'コピー数',
      copiesHint: '最大 {{n}}',
      classTarget: '任意の {{model}}',
      toast: {
        started: 'パイプラインの実行を開始しました',
        failed: '実行を開始できませんでした',
      },
      issue: {
        printerNotSet: 'このパイプラインに対象プリンターが設定されていません。',
        printerNotFound: '対象プリンターが存在しません。',
        printerDisabled: '対象プリンターは無効です。',
        printerOffline: '対象プリンターはオフラインです。',
        filamentType: 'フィラメントスロット {{slot}}: 期待 {{expected}}、AMS は {{actual}}',
        filamentColor: 'フィラメントスロット {{slot}}: 色が異なります（期待 {{expected}}、AMS は {{actual}}）',
        amsSlotMissing: 'AMS スロット {{slot}} はこのプリンターで利用できません',
        filamentUnverified: 'フィラメントスロット {{slot}} はクラウド／標準プリセットからのため、静的に検証できませんでした。',
        noClassMatches: 'このインストール内に、パイプラインの対象モデルクラス（{{expected}}）と一致するプリンターがありません。',
        classNotSet: 'パイプラインの対象がプリンタークラスに設定されていますが、モデルが選択されていません。',
      },
    },
  },

  // Slice (slicer-API integration via SliceModal)
  slicerSettings: {
    presetValuesOutdatedSidecar: 'スライサーの既定値を表示しています。スライサーサイドカーがこの機能より古く、プリセットの値を取得できません。値を表示するにはサイドカーのイメージを更新してください。変更しない項目は引き続きプリセットの値が使われます。',
    presetValuesNotConfigured: 'スライサーの既定値を表示しています。スライサーサイドカーが設定されていないため、プリセットの値を読み取れません。変更しない項目は引き続きプリセットの値が使われます。',
    presetValuesSidecarUnavailable: 'スライサーの既定値を表示しています。スライサーサイドカーが応答しなかったため、プリセットの値を読み取れません。変更しない項目は引き続きプリセットの値が使われます。',
    presetValuesUnavailable: 'スライサーの既定値を表示しています。選択したプリセットの値を読み取れませんでした。変更しない項目は引き続きプリセットの値が使われます。',
    filamentDefault: '既定',
    fromFile: 'ファイル由来',
    fromFileHint: 'この項目は元ファイルで設計者が変更しています。値は {{value}} です。',
    fromFilePrinterCoupled: '設計者のプリンター',
    fromFilePrinterCoupledHint: 'このファイルが設計されたプリンター向けの値です。お使いのプリンターでは不適切または範囲外になる場合があります。',
    useFromFile: '{{option}} に元ファイルの値を使用する',
    otherFromFile: 'このファイルのその他の設定',
    loading: 'スライサー設定を読み込んでいます…',
    mode: {
      simple: 'シンプル',
      advanced: '詳細',
      expert: 'エキスパート',
    },
    searchPlaceholder: '設定を検索',
    resetAll: '{{count}} 件をリセット',
    resetOption: '既定値に戻す',
    noMatches: 'この検索に一致する設定はありません。',
  },
  slice: {
    filamentSlotUnset: '未設定',
    processSettingsEmbedded: '「ファイル内蔵の設定を使用」が有効な間は使用されません。このスライスはファイル自身の設定で実行されます。',
    processSettingsInactive: '無効',
    presetsHidden: '{{count}} 件を非表示',
    showAllPresets: 'すべて表示',
    showFewerPresets: '表示を減らす',
    processSettings: 'プロセス設定',
    processSettingsHint: 'このスライス用に選択したプリセットを調整します。変更しない項目はプリセットの定義のままです。',
    processSettingsChanged: '{{count}} 件変更',
    processSettingsUnchanged: 'プリセットの既定値',
    title: 'モデルをスライス',
    action: 'スライス',
    actionAll: '{{count}} プレートすべてをスライス',
    actionAllTitle: 'すべてのプレートを 1 つのマルチプレート出力としてスライスします（アーカイブは 1 件）。フィラメントの選択はプロジェクトで定義されたすべてのスロットを対象とします。',
    allPlatesToggle: '{{count}} プレートすべてをスライス',
    slicing: 'スライス中…',
    printer: 'プリンタープロファイル',
    process: 'プロセスプロファイル',
    filament: 'フィラメントプロファイル',
    filamentSlot: 'フィラメント {{index}}（{{type}}）',
    selectPreset: '— プリセットを選択 —',
    loadingPresets: 'プリセットを読み込み中…',
    analyzingPlateFilaments: 'プレートのフィラメントを分析中…',
    analyzingPlateFilamentsHint: 'このプレートが使用するAMSスロットを検出するためにプレビュースライスを実行中。キャッシュ後は再オープンが即座になります。',
    previewToast: '{{name}}を分析中 – {{elapsed}}',
    previewWithProgress: '{{name}}を分析中 – {{stage}} ({{percent}}%) – {{elapsed}}',
    notUsedByPlate: '— このプレートでは使用しない',
    noPresetsForSlot: 'プリセットなし',
    otherPrinters: '他のプリンター',
    presetsLoadFailed: 'プリセットの読み込みに失敗。先に設定 → プロファイルからインポートしてください。',
    refreshPresets: '再読み込み',
    refreshPresetsTitle: 'プリセットを再取得 — クラウドとバンドルの最新リストを取得します（Bambu Studio または Bambu Handy でプリセットを削除した後にお使いください）',
    allPresetsRequired: 'すべてのプリセットを選択する必要があります',
    useEmbedded: 'ファイルに埋め込まれた設定を使用',
    useEmbeddedHint: '上のプロファイルではなく、設計者が設定したとおり（ウォール、インフィル、フィラメント）にスライスします。お使いのプリンターがファイルと一致するため利用できます。',
    autoOrient: 'オブジェクトの向きを自動で調整',
    autoOrientHint: 'スライスする前に、各オブジェクトを印刷に適した面へ自動で回転させます。ファイルに保存された向きは上書きされます。',
    autoArrange: 'プレート上に自動配置',
    autoArrangeHint: 'オブジェクトが重ならないようにスライサーが並べ直します。ファイルの配置は置き換えられます。',
    enqueuing: 'スライスジョブを送信中…',
    queued: '待機中…',
    failed: 'スライスに失敗。サイドカーのログを確認してください。',
    startedToast: 'バックグラウンドで{{name}}をスライス中…',
    queuedToast: '待機中: {{name}} – {{elapsed}}',
    runningToast: '{{name}}をスライス中 – {{elapsed}}',
    runningWithProgress: '{{name}} – {{stage}} ({{percent}}%) – {{elapsed}}',
    runningWithProgressMultiPlate: 'プレート {{plateIndex}} / {{plateCount}} • {{name}} – {{stage}} ({{percent}}%) – {{elapsed}}',
    completedToast: '{{name}}をスライス済み',
    externalWriteFallbackToast: '内部ライブラリに保存しました: 外部フォルダーに書き込めませんでした',
    failedTitle: 'スライスに失敗しました',
    failedToast: '{{name}}のスライスに失敗: {{detail}}',
    tier: {
      local: 'インポート済み',
      cloud: 'Bambu Cloud',
      orcaCloud: 'Orca Cloud',
      standard: '標準',
    },
    cloud: {
      notAuthenticated: 'Bambu Cloudにサインイン（設定 → プロファイル → Bambu Cloud）してクラウドプリセットを表示。',
      expired: 'Bambu Cloudセッションの有効期限切れ – クラウドプリセットを更新するには再ログインしてください。',
      unreachable: 'Bambu Cloudに接続できません。ローカルと標準のプリセットは引き続き使用できます。',
    },
    orcaCloud: {
      notAuthenticated: 'Orcaプリセットを表示するには、Orca Cloudにサインインしてください（プロファイル → Orca Cloud）。',
      expired: 'Orca Cloudセッションが期限切れです — Orcaプリセットを更新するには再度サインインしてください。',
      unreachable: 'Orca Cloudは現在到達できません。他のプリセットは引き続き動作します。',
    },
    bedType: {
      label: 'ビルドプレート',
      auto: '自動（プロセスプリセットを使用）',
      coolPlate: 'クールプレート',
      coolPlateSuperTack: 'Cool Plate SuperTack',
      engineering: 'Engineering Plate',
      highTemp: 'High Temp Plate',
      texturedPEI: 'Textured PEI Plate',
      smoothPEI: 'Smooth PEI Plate',
    },
    // Slicer Pipelines (#1425) — apply a saved bundle or save the current pick.
    pipelines: {
      label: 'パイプライン',
      applyAria: 'パイプラインを適用',
      applyPrompt: 'パイプラインを適用…',
      empty: '保存されたパイプラインがありません',
      saveButton: 'パイプラインとして保存',
      saveTitle: '現在の4つのスロットの選択を再利用可能なパイプラインとして保存',
      namePlaceholder: 'パイプライン名',
      nameAria: '新しいパイプライン名',
      toast: {
        applied: '「{{name}}」を適用しました',
        saved: 'パイプラインを保存しました',
        saveFailed: '保存に失敗しました',
      },
    },
  },

  // Spoolman
  spoolman: {
    title: 'Spoolman連携',
    enabled: 'Spoolman有効',
    url: 'Spoolman URL',
    connected: '接続中',
    disconnected: '未接続',
    testConnection: '接続テスト',
    sync: '同期',
    syncing: '同期中...',
    lastSync: '最終同期',
    linkToSpoolman: 'Spoolmanに連携',
    openInSpoolman: 'Spoolmanで開く',
    unlinkSpool: 'スプールのリンクを解除',
    unlinkConfirmTitle: 'スプールの割り当てを解除しますか？',
    unlinkConfirmMessage: 'このスロットからスプールが削除されます。スプール自体のデータは変更されません。',
    selectSpool: 'スプールを選択',
    noUnlinkedSpools: '割り当てられていないスプールがありません',
    linkSuccess: 'スプールが正常に割り当てられました',
    linkFailed: 'スプールの割り当てに失敗しました',
    unlinkSuccess: 'スプールの割り当てが正常に解除されました',
    unlinkFailed: 'スプールの割り当て解除に失敗しました',
    linkedSpool: '割り当て済みスプール',
    spoolId: 'スプールID',
    fillSourceLabel: '(Spoolman)',
    weight: '重量',
    remaining: '残り',
    disableWeightSync: 'AMS推定重量同期を無効化',
    disableWeightSyncDesc: 'AMS推定値から残量を更新しません。AMSの割合ベースの推定よりもSpoolmanの使用量追跡を優先する場合に使用してください。新しいスプールは引き続きAMS推定値を初期重量として使用します。',
    reportPartialUsage: '失敗した印刷の部分使用量を報告',
    reportPartialUsageDesc: '印刷が失敗またはキャンセルされた場合、レイヤー進捗に基づいてその時点までの推定フィラメント使用量を報告します。',
  },

  locations: {
    title: '保管場所',
    subtitle: '棚・引き出しなど、スプールの物理的な保管場所を管理',
    add: '場所を追加',
    addShort: '追加',
    edit: '場所を編集',
    name: '名前',
    spools: 'スプール',
    empty: '保管場所がありません。最初の棚または引き出しを作成してください。',
    manage: '保管場所',
    createPlaceholder: '例: 棚A、引き出し1',
    nameRequired: '場所名が必要です',
    created: '場所を作成しました',
    updated: '場所を更新しました',
    deleted: '場所を削除しました',
    saveFailed: '場所の保存に失敗しました',
    deleteFailed: '場所の削除に失敗しました',
    deleteBlocked: '削除前にこの場所のスプールをすべて移動してください',
    confirmDelete: '「{{name}}」を削除しますか？',
    confirmDeleteMessage: 'この場所はカタログから削除されます。先にスプールを移動してください。',
  },

  // Inventory
  inventory: {
    title: 'スプール在庫管理',
    subtitle: 'スプールを管理',
    addToInventory: '在庫に追加',
    addToInventoryPending: '追加中...',
    addToInventorySuccess: 'スプールを在庫に追加しました',
    addToInventoryFailed: 'スプールの在庫追加に失敗しました',
    unknownSpoolTitle: '新しいフィラメントを検出',
    unknownSpoolMessage: '{{location}} で不明なRFIDタグのスプールが検出されました。今すぐ在庫に追加しますか？',
    unknownSpoolSlot: 'スロット',
    bulk: {
      selectAllVisible: '表示中をすべて選択',
      selectRow: '行を選択',
      selectGroup: 'グループを選択',
      selectionCount: '{{count}} 件選択中',
      edit: '編集',
      printLabels: 'ラベルを印刷',
      resetUsage: '使用量をリセット',
      restore: '復元',
      archive: 'アーカイブ',
      delete: '削除',
      clearSelection: '選択を解除',
      editTitle: 'スプールを一括編集',
      editSubtitle: '選択中の {{count}} 件に適用されます。チェックを入れた項目のみ更新されます。',
      editHint: '項目に入力すると更新対象としてマークされます。チェック済みの行のみ送信されます。空のままだとスプールは変更されません（項目を空にする操作はスプール個別の編集で行ってください）。',
      useCustom: '"{{value}}" を使用',
      toggleField: 'この項目の更新を切り替え',
      changeCount: '{{count}} 件の項目が更新されます。',
      applyPending: '適用中...',
      applyButton: '{{count}} 件に適用',
      deleteTitle: '選択したスプールを削除',
      archiveTitle: '選択したスプールをアーカイブ',
      restoreTitle: '選択したスプールを復元',
      resetUsageTitle: '選択したスプールの使用量をリセット',
      deleteMessage: '{{count}} 件のスプールを完全に削除しますか？元に戻せません。',
      archiveMessage: '{{count}} 件のスプールをアーカイブしますか？後で復元できます。',
      restoreMessage: '{{count}} 件のアーカイブ済みスプールを復元しますか？',
      resetUsageMessage: '{{count}} 件のスプールの「累計使用量」カウンターをリセットしますか？残量は保持されます。',
      updateSuccess: '{{count}} 件のスプールを更新しました',
      updateFailed: '一括更新に失敗しました',
      updatePartial: '{{ok}} 件更新、{{failed}} 件失敗',
      updateAllFailed: '{{count}} 件すべての更新に失敗しました — 再試行のため選択は維持されます',
      deleteSuccess: '{{count}} 件のスプールを削除しました',
      deleteFailed: '一括削除に失敗しました',
      deletePartial: '{{ok}} 件削除、{{failed}} 件失敗',
      deleteAllFailed: '{{count}} 件すべての削除に失敗しました — 再試行のため選択は維持されます',
      archiveSuccess: '{{count}} 件のスプールをアーカイブしました',
      archiveFailed: '一括アーカイブに失敗しました',
      archivePartial: '{{ok}} 件アーカイブ、{{failed}} 件失敗',
      archiveAllFailed: '{{count}} 件すべてのアーカイブに失敗しました — 再試行のため選択は維持されます',
      restoreSuccess: '{{count}} 件のスプールを復元しました',
      restoreFailed: '一括復元に失敗しました',
      restorePartial: '{{ok}} 件復元、{{failed}} 件失敗',
      restoreAllFailed: '{{count}} 件すべての復元に失敗しました — 再試行のため選択は維持されます',
      invalidHex: '16進数 6 文字（RRGGBB）または 8 文字（RRGGBBAA）を入力してください。それ以外の場合この項目は適用されません。',
    },
    spoolmanMixedContentTitle: 'Spoolman を HTTPS で読み込めません — ブラウザが混在コンテンツをブロックしています',
    spoolmanMixedContentBody: 'Bambuddy はリバースプロキシ経由で HTTPS 配信されていますが、Spoolman の URL は HTTP のままです。ブラウザはセキュリティ上の理由で混在コンテンツをブロックするため、埋め込みの Spoolman UI を表示できません。Spoolman も HTTPS でアクセスできる必要があります。',
    spoolmanMixedContentFixReverseProxy: 'Spoolman を Bambuddy と同じリバースプロキシ（Traefik / Nginx / Caddy）の後ろに HTTPS で配置し、設定で Spoolman URL を新しい HTTPS アドレスに更新してください。',
    spoolmanMixedContentFixOpenNewTab: '回避策として Spoolman を新しいタブで HTTP として開くことができます — 混在コンテンツのルールは埋め込みフレームのみに適用され、独立したタブは問題なく動作します。',
    spoolmanOpenInNewTab: 'Spoolman を新しいタブで開く',
    labels: {
      title: 'スプールラベルを印刷',
      selectedCount: '{{count}}件選択中',
      pickSpools: 'ラベルを印刷するスプールを選択:',
      monochrome: 'モノクロ（白黒プリンター）',
      monochromeHint: 'カラースウォッチを削除してテキストを広げます',
      searchPlaceholder: '名前、ブランド、#IDで検索',
      filterByMaterial: '素材:',
      allMaterials: 'すべて',
      selectVisible: '表示中をすべて選択 ({{count}})',
      deselectVisible: '表示中を選択解除',
      clearAll: 'すべてクリア',
      noSpoolsToShow: '表示するスプールはありません。フィルターを調整して再試行してください。',
      noMatches: '現在の検索またはフィルターに一致するスプールはありません。',
      printOne: 'このスプールのラベルを印刷',
      printLabels: 'ラベルを印刷…',
      bulkTitle: '現在表示中の{{count}}件からラベルを印刷するスプールを選択',
      noSpoolsTitle: 'ラベル付けするスプールなし',
      error: 'ラベルを生成できませんでした: {{msg}}',
      sortBy: {
        label: '並べ替え:',
        id: 'ID順',
        color: '色順',
      },
      templates: {
        amsHolderSmall: {
          label: 'AMS ホルダー — 小 (74 × 33 mm)',
          hint: '1ページにつき1枚；MakerWorld モデル 752566 (AMS フィラメントラベルホルダー) の印刷可能なラベルに対応します。',
        },
        amsHolderLarge: {
          label: 'AMS ホルダー — 大 (75 × 55 mm)',
          hint: '1ページにつき1枚；AMS フィラメントラベルホルダーのカード紙挿入バージョンに対応します。色見本、ブランド、素材、ID、QR コードを表示できる広さです。',
        },
        box40x30: {
          label: 'ボックスラベル (40 × 30 mm)',
          hint: '1ページに1枚。DK/Brother の一般的なロールサイズで、フィラメント袋や保管箱のラベルに適しています。',
        },
        box: {
          label: 'Box label (62 × 29 mm)',
          hint: '1ページに1ラベル、Brother PT/QLおよびDymoの小さなラベル用サイズ。',
        },
        averyL7160: {
          label: 'Avery L7160 — A4 sheet (38.1 × 63.5 mm × 21)',
          hint: 'EUシート規格、A4ページに21枚のラベル。',
        },
        avery5160: {
          label: 'Avery 5160 — US Letter sheet (25.4 × 66.7 mm × 30)',
          hint: '米国シート規格、Letterページに30枚のラベル。',
        },
      },
    },
    csv: {
      importButton: 'CSVインポート',
      exportButton: 'CSVエクスポート',
      modalTitle: 'CSVからスプールをインポート',
      selectFile: 'CSVファイルを選択するか、ここにドラッグ',
      dragHint: 'ヘッダー: material（必須）、brand、subtype、color_name、rgba、…',
      parsing: 'ファイルを読み込み中…',
      previewError: 'CSVファイルを読み込めませんでした',
      validCount: '有効{{count}}件',
      errorCount: 'エラー{{count}}件',
      skippedCount: 'スキップ{{count}}件',
      colRow: '行',
      colStatus: 'ステータス',
      colColor: '色',
      colorResolved: 'カタログから色を補完',
      colorCrossMaterial: '別の素材から色を取得しました — カタログに完全一致なし',
      duplicateExisting: 'この素材・ブランド・色のスプールは既に存在します — それでも新しいスプールとしてインポートされます',
      spoolmanHint: 'Spoolmanモードでは、Spoolman内蔵のCSVインポート/エクスポートを使用してください。',
      importValidRows: '有効な{{count}}行をインポート',
      noValidRows: '有効な行がありません',
      importing: 'インポート中…',
      importSuccess: '{{count}}個のスプールをインポートしました',
      importError: 'インポートに失敗しました',
      exportError: 'エクスポートに失敗しました',
    },
    addSpool: 'スプールを追加',
    editSpool: 'スプールを編集',
    copySpool: 'スプールをコピー',
    material: '素材',
    selectMaterial: '素材を選択...',
    subtype: 'サブタイプ',
    brand: 'ブランド',
    searchBrand: 'ブランドを検索...',
    useCustomBrand: '「{{brand}}」を使用',
    useCustomMaterial: 'カスタム素材を使用: {{material}}',
    suggestedOptions: 'おすすめ',
    allOptions: 'すべて',
    colorName: '色名',
    colorNamePlaceholder: 'ジェイドホワイト、ファイアレッド...',
    color: '色',
    hexColor: 'HEXカラー',
    pickColor: 'カスタムカラーを選択',
    labelWeight: '表示重量',
    coreWeight: '空スプール重量',
    searchSpoolWeight: 'スプール重量を検索...',
    weightUsed: '使用量',
    currentWeight: '残量',
    measuredWeight: '計測重量',
    spoolName: 'スプール',
    costPerKg: 'kgあたりのコスト',
    storageLocation: '保管場所',
    storageLocationPlaceholder: '例：棚A、引き出し1',
    openInInventory: 'インベントリで開く',
    measuredWeightError: '計測重量は{{min}}gから{{max}}gの間で入力してください。',
    slicerFilament: 'スライサーフィラメント',
    slicerFilamentName: 'スライサープリセット名',
    slicerPreset: 'スライサープリセット',
    searchPresets: 'フィラメントプリセットを検索...',
    selectedPreset: '選択済み',
    noPresetsFound: 'プリセットが見つかりません',
    tempOverrides: '温度オーバーライド',
    note: 'メモ',
    notePlaceholder: 'このスプールに関する追加メモ...',
    // Per-spool category + low-stock threshold override (#729)
    category: 'カテゴリ',
    categoryPlaceholder: '例：本番、試作、クライアントA',
    categoryNone: 'カテゴリなし',
    storageLocationNone: '保管場所未設定',
    lowStockThresholdOverride: '在庫低下のしきい値（このスプール）',
    lowStockThresholdOverrideHelp: '空欄の場合、グローバル設定（{{global}}%）を使用します。',
    clearRfid: 'RFIDタグをクリア',
    rfidCleared: 'RFIDタグをクリアしました',
    archive: 'アーカイブ',
    restore: '復元',
    noSpools: 'スプールがありません。最初のスプールを追加してください。',
    noAvailableSpools: '利用可能なスプールがありません。インベントリにスプールを追加するか、別のスロットからスプールの割り当てを解除してください。',
    kProfiles: 'Kプロファイル',
    addKProfile: 'Kプロファイルを追加',
    assignSpool: 'スプールを割り当て',
    unassignSpool: '割り当て解除',
    assignSuccess: 'スプールを割り当て、AMSスロットを設定しました',
    assignPendingInsert: '割り当てました。スプールを挿入したときにスロットが設定されます。',
    assignFailed: 'スプールの割り当てに失敗しました',
    selectSpool: 'このスロットに割り当てるスプールを選択',
    assigned: '割り当て済み',
    assigning: '割り当て中...',
    searchSpools: 'スプールを検索...',
    showAllSpools: 'すべてのスプールを表示',
    spoolmanSpools: 'Spoolman スプール',
    allMaterials: 'すべての素材',
    filterByBrand: 'ブランドで絞り込み...',
    showArchived: 'アーカイブ済みを表示',
    quickAdd: 'クイック追加（在庫）',
    quantity: '数量',
    stock: '在庫',
    configured: '設定済み',
    spoolsCreated: '{{count}}本のスプールを作成しました',
    spoolsPartiallyCreated: '{{total}}本中{{created}}本のスプールを作成しました（一部失敗）',
    spoolCreated: 'スプールを作成しました',
    spoolUpdated: 'スプールを更新しました',
    spoolDeleted: 'スプールを削除しました',
    deepLinkSpoolNotFound: 'スプールが見つかりません',
    deepLinkFetchFailed: 'スプールを読み込めませんでした — もう一度お試しください',
    spoolArchived: 'スプールをアーカイブしました',
    spoolRestored: 'スプールを復元しました',
    kProfileSaveFailed: 'Kプロファイル設定を保存できませんでした',
    syncWeightSpoolNotFound: 'スプールが見つかりません — 削除された可能性があります',
    syncWeightSpoolmanUnreachable: 'Spoolmanに接続できません — 後でもう一度お試しください',
    syncWeightFailed: '重量の同期に失敗しました',
    spoolmanUnreachable: 'Spoolmanに接続できません — 後でもう一度お試しください',
    deleteSpoolNotFound: 'スプールが見つかりません — すでに削除された可能性があります',
    deleteFailed: 'スプールを削除できませんでした',
    archiveSpoolNotFound: 'スプールが見つかりません — すでに削除された可能性があります',
    archiveFailed: 'スプールをアーカイブできませんでした',
    restoreSpoolNotFound: 'スプールが見つかりません — すでに削除された可能性があります',
    restoreFailed: 'スプールを復元できませんでした',
    saveFailed: '変更を保存できませんでした',
    tagClearFailed: 'タグを削除できませんでした',
    deleteConfirm: 'このスプールを削除しますか？この操作は元に戻せません。',
    archiveConfirm: 'このスプールをアーカイブしますか？',
    advancedSettings: '詳細設定',
    // Tabs
    filamentInfoTab: 'フィラメント情報',
    paProfileTab: 'PAプロファイル',
    filamentInfo: 'フィラメント',
    additional: '追加情報',
    // Cloud
    loadingPresets: 'クラウドプリセットを読み込み中...',
    cloudConnected: 'クラウド接続済み',
    cloudNotConnected: 'クラウド未接続（デフォルト使用）',
    // Colors
    recentColors: '最近',
    searchColors: '色を検索...',
    searchResults: '検索結果',
    allColors: 'すべての色',
    commonColors: '一般的な色',
    showLess: '少なく表示',
    showAll: 'すべて表示',
    noColorsFound: '一致する色がありません',
    noResults: '結果なし',
    // Multi-color gradient + visual effect (#1154) — English fallback.
    extraColorsLabel: '追加の色',
    extraColorsPlaceholder: 'EC984C,#6CD4BC,A66EB9,D87694',
    extraColorsHint: '2〜8個の16進数ストップをカンマで区切って貼り付けます。グラデーションとして表示されます。',
    extraColorsInvalid: '無効な16進数を無視: {{tokens}}',
    colorEffectLabel: 'エフェクト',
    colorEffect: {
      none: 'なし',
      sparkle: 'スパークル',
      wood: 'ウッド',
      marble: 'マーブル',
      glow: 'グロー',
      matte: 'マット',
      silk: 'シルク',
      galaxy: 'ギャラクシー',
      rainbow: 'レインボー',
      metal: 'メタル',
      translucent: '半透明',
      gradient: 'グラデーション',
      dualColor: 'デュアルカラー',
      triColor: 'トリカラー',
      multicolor: 'マルチカラー',
    },
    // PA Profiles
    selectMaterialFirst: 'フィラメント情報タブで素材を選択してください。',
    noPrintersConfigured: 'プリンターが設定されていません。プリンターを追加してください。',
    matchingFilter: 'フィルター',
    anyBrand: 'すべてのブランド',
    anyVariant: 'すべてのバリアント',
    autoSelect: '自動選択',
    matches: '件一致',
    match: '件一致',
    noMatches: '一致なし',
    connected: '接続済み',
    offline: 'オフライン',
    printerOffline: 'プリンターがオフラインです。接続してキャリブレーションプロファイルを表示してください。',
    noKProfilesMatch: '選択したフィラメントに一致するKプロファイルがありません。',
    leftNozzle: '左ノズル',
    rightNozzle: '右ノズル',
    profilesSelected: 'キャリブレーションプロファイル選択済み',
    // Stats & enhanced table
    totalInventory: '在庫合計',
    totalConsumed: '総消費量',
    byMaterial: '素材別',
    inPrinter: 'プリンター内',
    lowStock: '残量少',
    sinceTracking: '追跡開始以降',
    resetConsumedCounter: 'カウンタをリセット',
    resetConsumedCounterTooltip: 'このスプールの消費量カウンタを0にする。残量は変更されません。',
    resetConsumedCounterConfirm: 'このスプールの消費量カウンタを0にリセットしますか？以降の印刷は再びゼロからカウントされます。スプール自体、残量計算、設定は変更されません。',
    resetAllConsumedCounters: 'すべてのカウンタをリセット',
    resetAllConsumedCountersTooltip: 'すべてのスプールの消費量カウンタを0にする。残量は変更されません。',
    resetAllConsumedCountersConfirm: '{{count}}件すべてのスプール（アーカイブ済みを含む）の消費量カウンタを0にリセットしますか？「累計消費量」の値がクリアされ、以降の印刷はゼロからカウントされます。スプール自体と残量は変更されません。',
    consumedCounterReset: 'カウンタをリセットしました',
    allConsumedCountersReset: '{{count}}件のスプールのカウンタをリセットしました',
    resetConsumedCounterFailed: 'カウンタのリセットに失敗しました',
    loadedInAms: 'AMS/Extに装填中',
    remaining: '残り',
    weightCheck: '重量チェック',
    lastWeighed: '最終計量',
    neverWeighed: '未計量',
    search: 'スプールを検索...',
    showing: '表示',
    to: '〜',
    of: '/',
    show: '表示',
    spools: 'スプール',
    spool: 'スプール',
    page: 'ページ',
    noSpoolsMatch: '結果なし',
    noSpoolsMatchDesc: '検索やフィルターを調整してみてください。',
    active: 'アクティブ',
    archived: 'アーカイブ済み',
    all: 'すべて',
    used: '使用済み',
    new: '新規',
    clearFilters: 'フィルターをクリア',
    table: 'テーブル',
    cards: 'カード',
    net: '正味',
    // Grouping
    groupSimilar: 'グループ化',
    groupedSpools: '{{count}}本の同一スプール',
    groupedRows: '行',
    // Column config
    columns: '列',
    configureColumns: '列の設定',
    configureColumnsDesc: 'ドラッグして並べ替えるか、矢印を使用してください。目のアイコンで表示/非表示を切り替えます。',
    visible: '表示中',
    reset: 'リセット',
    cancel: 'キャンセル',
    applyChanges: '変更を適用',
    moveUp: '上へ移動',
    moveDown: '下へ移動',
    hideColumn: '列を非表示',
    showColumn: '列を表示',
    // Tag linking
    linkToSpool: 'スプールにリンク',
    tagLinked: 'タグがスプールにリンクされました',
    tagLinkFailed: 'タグのリンクに失敗しました',
    tagAlreadyLinked: 'タグは既に別のスプールにリンクされています',
    unknownTag: '不明なRFIDタグが検出されました',
    // Usage history
    usageHistory: '使用履歴',
    noUsageHistory: 'まだ使用記録がありません',
    printName: 'プリント名',
    weightConsumed: '消費重量',
    clearHistory: 'クリア',
    historyCleared: '使用履歴がクリアされました',
    fillSourceLabel: '(在庫)',
    lowStockThresholdError: 'しきい値は0.1から99.9の間でなければなりません',
    assignMismatchTitle: '材料の不一致',
    assignMismatchMessage: '選択したスプールの材料「{{spoolMaterial}}」は、{{location}} のトレイ材料「{{trayMaterial}}」と一致しません。割り当てますか？',
    assignMismatchConfirm: '強制的に割り当て',
    assignPartialMismatchMessage: 'スプールの材料「{{spoolMaterial}}」は「{{trayMaterial}}」に似ていますが、{{location}} と完全には一致しません。続行しますか？',
    assignProfileMismatchMessage: 'スプールのプロファイル「{{spoolProfile}}」は {{location}} のトレイプロファイル「{{trayProfile}}」と一致しません。続行しますか？',
    assignReconfigureNote: 'AMSスロットはスプールのプロファイルで再構成されます。',
    // Spoolman filament catalog picker
    spoolmanFilamentCatalog: 'Spoolmanフィラメントカタログ',
    pickFromSpoolmanCatalog: 'Spoolmanカタログから選択…',
    spoolmanFilamentSelected: 'Spoolmanカタログからフィラメントを選択しました',
    spoolmanFilamentUnlinked: 'フィラメントカタログのリンクを解除しました',
    noSpoolmanFilaments: 'Spoolmanカタログにフィラメントが見つかりません',
    spoolmanFilamentColorSwatch: 'フィラメントの色',
    spoolWeightManagedBySpoolman: '空スプールの重量はSpoolmanでフィラメントタイプごとに管理されています',
    spoolmanCatalogLoadFailed: 'Spoolmanのフィラメントカタログを読み込めませんでした',
  },

  // Timelapse
  timelapse: {
    title: 'タイムラプス',
    create: 'タイムラプスを作成',
    download: 'ダウンロード',
    delete: '削除',
    preview: 'プレビュー',
    frameRate: 'フレームレート',
    quality: '品質',
    processing: 'バックアップファイルを処理中...',
    noTimelapses: '利用可能なタイムラプスがありません',
  },

  // AMS
  ams: {
    title: 'AMS',
    slot: 'スロット',
    empty: '<空>',
    emptySlot: '空のスロット',
    slotEmpty: '空',
    slotUnconfigured: '?',
    emptySlotReset: 'スプール未割当',
    unknown: '不明',
    humidity: '湿度',
    temperature: '温度',
    filamentType: 'フィラメントタイプ',
    filamentColor: '色',
    remaining: '残り',
    history: 'AMS履歴',
    noHistory: 'メンテナンス履歴がありません',
    configureSlot: 'フィラメントプロファイルとK値でスロットを設定',
    externalSpool: '外部スプール',
    profile: 'プロファイル',
    kFactor: 'K値',
    fill: '充填率',
    configure: '設定',
    used: '使用済み',
    remainingUnit: '残り',
  },

  // Print modal
  printModal: {
    variants: {
      editNote: 'これらの候補はキュー追加時に決まります。変更するにはキャンセルして追加し直してください。',
      title: 'プリンターの候補',
      help: '1つのジョブ、キューは1枠。条件に合う最初に空いたプリンターがそのファイルを印刷します。',
      unknownModel: '不明なモデル',
      plateFor: '{{filename}} のプレート',
      moveUp: '上へ',
      moveDown: '下へ',
      queued: '{{count}}件の候補付きでキューに追加しました',
    },
    selectPrinter: 'プリンターを選択',
    selectPlate: 'プレートを選択',
    filamentMapping: 'フィラメントマッピング',
    useArchiveMapping: 'マッピング',
    useArchiveMappingTooltip: 'タイプ/色で照合する代わりに、このアーカイブに保存されたAMSマッピング（スライサーから）からすべてのスロットを選択します。',
    clickToChangeSlot: 'クリックしてスロットの割り当てを変更',
    reRead: '再読み込み',
    plateN: 'プレート {{n}}',
    plateFilamentsUnreadable: '選択したプレートのフィラメントを読み取れなかったため、割り当てできません。そのプレートの選択を解除すると、残りをキューに追加できます。',
    totalCost: '合計コスト:',
    slotRemainingShort: ' - 残{{grams}}g',
    printSettings: '印刷設定',
    bedLeveling: 'ベッドレベリング',
    flowCalibration: 'フローキャリブレーション',
    vibrationCalibration: '振動キャリブレーション',
    layerInspection: '第一層検査',
    timelapse: 'タイムラプス',
    cancel: 'キャンセル',
    noPrintersAvailable: '利用可能なプリンターがありません',
    printerBusy: 'プリンターは使用中です',
    printerOffline: 'プリンターはオフラインです',
    sameTypeDifferentColor: '同じ種類、異なる色',
    filamentTypeNotLoaded: 'フィラメントタイプが未読み込み',
    whenToPrint: '印刷タイミング',
    asap: '即時',
    queue: 'キュー',
    schedule: 'スケジュール',
    dateTime: '日時',
    invalidDateTime: '有効な日時を入力してください',
    openCalendar: 'カレンダーを開く',
    requireManualStart: '手動開始を要求',
    requirePreviousSuccess: '前の印刷が成功した場合のみ開始',
    autoOffAfter: '完了後にプリンターの電源を切る',
    helpAsap: '印刷はキューの先頭に追加され、対象プリンターがアイドルになるとすぐに開始します。',
    helpSchedule: '予定時刻にプリンターがアイドルであれば印刷を開始します。使用中の場合は、利用可能になるまで待機します。',
    helpQueue: '印刷はキューの最後に追加されます。',
    leftNozzle: 'L',
    rightNozzle: 'R',
    leftNozzleTooltip: '左ノズル',
    rightNozzleTooltip: '右ノズル',
    rackPosition: 'ラック位置',
    rackPositionTooltip: 'このフィラメントを印刷するラック上のノズル。位置番号はプリンター本体と同じです。',
    rackEmptyPosition: 'このラック位置は空です',
    rackWrongNozzle: '{{has}} ノズルが装着されています。このフィラメントには {{needs}} が必要です',
    filamentOverride: 'フィラメントオーバーライド',
    filamentOverrideHint: 'モデルベースの割り当てに使用するフィラメントをオプションで上書きします。スケジューラは元の3MF値ではなく、選択したフィラメントに基づいてマッチングします。',
    originalFilament: 'オリジナル',
    overrideWith: '変更先',
    resetToOriginal: 'オリジナルに戻す',
    insufficientFilamentTitle: 'フィラメントが不足しています',
    waitingForAmsStatus: '{{printer}} のAMSステータスを待機しています…',
    insufficientFilamentMessage: '割り当てられたスプールの一部は、この印刷に必要な量より残量が少ないです:',
    insufficientFilamentLine: '{{printer}} - {{slot}}: 必要 {{required}}g、残り {{remaining}}g',
    insufficientFilamentLinePooled: '{{printer}} - {{slot}}: 必要 {{required}}g、一致するスプール合計で {{remaining}}g（AMSフィラメントバックアップ）',
    printAnyway: 'それでも印刷',
    forceColorMatch: 'カラーマッチを強制',
    staggerPrinterStarts: 'プリンター開始を段階的に',
    staggerGroupSize: 'グループサイズ',
    staggerInterval: '間隔（分）',
    staggerPreview: '{{printers}}台のプリンター → {{size}}台ずつ{{groups}}グループ、{{interval}}分ごとに開始',
    staggerLastGroup: '最終グループ: {{count}}',
    staggerTotal: '合計: {{minutes}}分',
    staggerToPrinters: '{{count}}台のプリンターに段階的に送信',
    gcodeInjection: '自動印刷G-codeを挿入',
    insufficientBudget: '予算が不足しています',
    unlimitedNoBudget: '無制限 – 予算上限は設定されていません。',
    noPrintableCostCenters: '印刷に利用できる有効なコストセンターがありません。管理者に印刷アクセスの付与を依頼してください。',
  },

  // Backup
  backup: {
    includesEncryptionKey: 'ローカルバックアップにはMFA暗号化キーファイル（DATA_DIR/.mfa_encryption_key）が含まれ、バックアップZIPは自己完結型です。ZIPを機密扱いしてください — ファイルを持つ人は誰でも内部のOIDCクライアントシークレットとTOTPシークレットを復号できます。',
    title: 'バックアップと復元',
    createBackup: 'バックアップを作成',
    restoreBackup: 'バックアップの復元',
    restoreDescription: 'バックアップファイルからすべてのデータを置き換える',
    downloadBackup: 'バックアップをダウンロード',
    uploadBackup: 'バックアップをアップロード',
    lastBackup: '最終バックアップ',
    autoBackup: '自動バックアップ',
    backupNow: '今すぐバックアップ',
    restoreWarning: '警告: バックアップの復元は現在のすべてのデータを上書きします。',
    includeArchives: 'アーカイブを含む',
    includeSettings: '設定を含む',
    includeProfiles: 'プロファイルを含む',
    backupSuccess: 'バックアップを作成しました',
    restoreSuccess: 'バックアップを復元しました',
    backupFailed: 'バックアップに失敗しました',
    restoreFailed: '復元に失敗しました',
    restoreNote: '復元中、仮想プリンターは停止されます',

    // GitHub Backup
    githubBackup: 'GitHubバックアップ',
    enabled: '有効',
    cloudLoginRequired: 'Bambu Cloudログインが必要です。GitHubバックアップを有効にするには、プロファイル → クラウドプロファイルからサインインしてください。',
    cloudLoginRequiredShort: 'Cloudログインが必要',
    githubDescription: 'プロファイルをプライベートGitHubリポジトリに自動的に同期し、バックアップとバージョン履歴を保持します。',
    repoIsPrivate: 'リポジトリはプライベートです — バックアップしても安全です。',
    repoIsPublicWarning: 'リポジトリが公開（PUBLIC）です。Bambuddyのバックアップには MQTT 認証情報、Home Assistant トークン、Prometheus トークン、Bambu Cloud のメールアドレス、K-プロファイル経由のプリンタアクセスコードが含まれます。プロバイダー側でリポジトリをプライベートに変更するまで保存はブロックされます。',
    repoVisibilityUnknown: 'リポジトリの公開設定を確認できませんでした。Bambuddy はプライベートと確認できないリポジトリへのバックアップを拒否します。保存はブロックされます。',
    repositoryUrl: 'リポジトリURL',
    repoUrlPlaceholderGitHub: 'https://github.com/username/repo-name',
	repoUrlPlaceholderGitea: 'https://gitea.example.com/username/repo-name',
    repoUrlPlaceholderForgejo: 'https://forgejo.example.com/username/repo-name',
    repoUrlPlaceholderGitLab: 'https://gitlab.com/username/repo-name',
    allowInsecureHttp: '安全でないHTTPを許可',
    allowInsecureHttpHint: 'TLSなしのプライベートネットワーク上のセルフホストインスタンスに対して有効化',
    personalAccessToken: '個人アクセストークン',
    tokenSaved: '(保存済み)',
    enterNewToken: '新しいトークンを入力して更新',
    tokenHintGitHub: 'Contentsの読み書き権限を持つきめ細かいトークン、またはrepoスコープを持つクラシックトークン。',
    tokenHintGitLab: 'apiスコープ、またはread_repositoryとwrite_repositoryの両方を持つトークン。',
    tokenHintGitea: 'write:repositoryスコープを持つトークン。',
    tokenHintForgejo: 'write:repositoryスコープを持つトークン。このリポジトリだけに限定したトークンで十分です。',
    branch: 'ブランチ',
    provider: 'Gitプロバイダー',
    providerGitHub: 'GitHub',
	providerGitLab: 'GitLab',
	providerGitea: 'Gitea',
    providerForgejo: 'Forgejo',
    manualOnly: '手動のみ',
    hourly: '毎時',
    daily: '毎日',
    weekly: '毎週',
    includeInBackup: 'バックアップに含める',
    kProfiles: 'Kプロファイル',
    kProfilesDescription: '接続されたプリンターからの圧力キャリブレーション',
    noPrintersConnected: 'プリンターが接続されていません',
    printersConnected: '{{connected}}/{{total}} 接続済み',
    cloudProfiles: 'クラウドプロファイル',
    cloudProfilesDescription: 'Bambu CloudとOrca Cloudからのフィラメント、プリンター、プロセスプリセット',
    cloudProfilesAccounts: '接続済みアカウント — Bambu Cloud: {{bambu}}、Orca Cloud: {{orca}}',
    appSettings: 'アプリ設定',
    appSettingsDescription: 'Bambuddy設定（データベース全体）',
    spoolInventory: 'スプール在庫',
    spoolInventoryDescription: 'フィラメントスプール、使用履歴、コスト追跡',
    printArchives: '印刷アーカイブ',
    printArchivesDescription: '印刷履歴メタデータ（gcode/3MFファイルなし）',
    lastBackupAt: '最終バックアップ:',
    noBackupsYet: 'バックアップはまだありません',
    next: '次回:',
    startingBackup: 'バックアップを開始しています...',
    test: 'テスト',
    enableBackup: 'バックアップを有効化',
    testConnection: '接続テスト',
    enterRepoUrl: 'リポジトリURLを入力してください',
    enterRepoAndToken: 'リポジトリURLとアクセストークンを入力してください',
    repoRequired: 'リポジトリURLは必須です',
    tokenRequired: 'アクセストークンは必須です',
    githubBackupEnabled: 'GitHubバックアップが有効になりました',
    tokenUpdated: 'トークンが更新されました',
    settingsSaved: '設定が保存されました',
    failedToSave: '保存に失敗しました: {{message}}',
    backupCompleteFiles: 'バックアップ完了 - {{count}}ファイルが更新されました',
    backupSkippedNoChanges: 'バックアップをスキップ - 変更なし',
    backupFailed2: 'バックアップに失敗しました: {{message}}',
    clearedLogs: '{{count}}件のログを削除しました',
    failedToClearLogs: 'ログの削除に失敗しました: {{message}}',

    // Restore from Git backup (#2656)
    restoreFromGit: {
      button: 'Git から復元',
      title: 'Git バックアップから復元',
      subtitle: 'コミットと復元する項目を選択します',
      commitLabel: 'バックアップのコミット',
      latestCommit: '最新のバックアップ (ブランチ先端)',
      categoriesLabel: '復元する項目',
      inspecting: 'バックアップの内容を読み込んでいます...',
      itemCount: 'バックアップ内に {{count}} 件',
      overwriteLabel: '既存のエントリを上書きする',
      overwriteOn: '既存のエントリはバックアップの内容で更新されます。',
      overwriteOff: '不足しているエントリのみ追加され、既存のものは変更されません。',
      selectedCount: '{{count}} 件選択中',
      restoring: '復元しています...',
      confirmTitle: 'バックアップから復元しますか?',
      confirmMessage: '選択したカテゴリをこのコミットから復元します。不足しているエントリが追加され、既存のエントリはそのまま残ります。',
      confirmMessageOverwrite: '選択したカテゴリをこのコミットから復元し、ローカルに既存のエントリを上書きします。この操作は取り消せません。',
      kprofilesOverwriteCaveat: 'Kプロファイルは例外です。スロットへの書き込みは、プリンター上のキャリブレーションを常に置き換えます。',
      tally: '復元 {{restored}} 件、スキップ {{skipped}} 件、失敗 {{failed}} 件',
      reloadHint: '復元したデータを全体に反映するには Bambuddy を再読み込みしてください。',
      partialHint: '上に表示されたカテゴリーは完了し、保存されています。表示されていないカテゴリーは実行されていません。',
      failed: '復元に失敗しました。',
      loadFailed: 'バックアップリポジトリを読み取れませんでした。',
      details: {
        notPresent: 'このバックアップコミットには含まれていません',
        unreadableJson: '読み取れない JSON: {{paths}}',
        settingsNoPayload: 'データに設定が含まれていません',
        settingsCredentialsWillSkip: '認証情報のようなキー {{count}} 件はスキップされます',
        settingsCompanionWillSkip: '認証情報のようなキー {{count}} 件はスキップされ、それらに依存するスイッチ {{companion}} 件はオフのままになります',
        settingsCompanionOnlyWillSkip: 'スイッチ {{companion}} 件はオフのままになります - それぞれに必要な認証情報はバックアップから復元できません',
        spoolsUsageCount: '使用履歴 {{count}} 件を含む',
        archivesMetadataOnly: 'メタデータのみ - 3MF ファイルとサムネイルは Git バックアップに含まれません',
        kprofilesPrinterCount: 'プリンター {{count}} 台分',
      },
      notes: {
        noData: 'この種類のデータはこのバックアップに含まれていません',
        archivesPrinterMissing: '一部のアーカイブが存在しないプリンターを参照していました - リンクを解除しました',
        archivesProjectMissing: '一部のアーカイブが存在しないプロジェクトを参照していました - リンクを解除しました',
        archivesOwnerCleared: '一部のアーカイブが存在しないユーザーを参照していました - 所有者を解除したため、管理者が割り当て直すまで archives:read_all 権限を持つユーザーにしか表示されません',
        archivesOwnerUnmatched: '一部のアーカイブはこのインスタンスに存在しない所有者を指しています - バックアップのユーザー ID から推測せずに所有者を解除したため、管理者が割り当て直すまで archives:read_all 権限を持つユーザーにしか表示されません',
        archivesOwnerUnknown: '一部のアーカイブは所有者なしで復元されました - このバックアップに所有者が記録されていないため、管理者が割り当てるまで archives:read_all 権限を持つユーザーにしか表示されません',
        archivesUndeleted: 'バックアップ後に削除されたアーカイブが再び表示されます - 上書きが有効でした',
        archivesMetadataOnly: '復元されたアーカイブはメタデータのみです - 3MF ファイルとサムネイルは Git バックアップに含まれません',
        spoolUsageUnresolved: '使用履歴 {{count}} 件をスキップしました - 対応するスプールがこのバックアップのスプール一覧にないため、紐付ける先がありません。',
        spoolUsageUnlinked: '使用履歴 {{count}} 件を印刷履歴へのリンクなしで復元しました - リンクを保持するにはスプール在庫と一緒に印刷アーカイブも選択してください。',
        spoolTagKept: 'スプールタグ {{count}} 件をそのままにしました - バックアップの内容ではその後スキャンされたタグが消えるか、別のスプールに移ってしまうためです。',
        settingsCredentialsSkipped: '認証情報のようなキー {{count}} 件をスキップしました - シークレットは手動で再入力してください',
        settingsAuthSkipped: '認証設定 {{count}} 件をスキップしました - ロックアウトチェックが働くよう、設定 > 認証で変更してください',
        settingsCompanionSkipped: '{{keys}} はオフのままにしました - 各項目に必要な認証情報はバックアップから復元できず、このインスタンスにも保存されていないため、オンにすると連携が未認証のままになります',
        settingsMqttRelayFailed: 'MQTT 設定を復元しましたが、リレーを再接続できませんでした - Bambuddy を再起動してください',
        kprofilesAlwaysOverwrite: 'K プロファイルは常にプリンター側の該当スロットを上書きします',
        kprofilesAckUnreliable: '応答しないプリンターも復元済みとして数えます - プロファイルはプリンター側で確認してください',
        kprofilesPrinterMissing: 'シリアル {{serial}} のプリンターがありません - スキップしました',
        kprofilesPrinterOffline: '{{printer}} ({{serial}}) は接続されていません - スキップしました',
        kprofilesUnknownNozzle: '{{serial}} に想定外のノズル径 {{nozzle}} - そのまま送信しました',
        kprofilesUnmatched: '{{nozzle}} 用のプロファイル {{count}} 件は {{printer}} に該当がありませんでした - 新規プロファイルとして追加しました',
        kprofilesSendFailed: '{{nozzle}} のプロファイルを {{printer}} ({{serial}}) に送信できませんでした',
        kprofilesRefused: '{{printer}} ({{serial}}) が {{nozzle}} のプロファイルを拒否しました: {{reason}}',
        kprofilesStepFailed: 'K プロファイルの処理を完了できませんでした - {{reason}}。それまでに復元された内容は保存されています。',
      },
    },

    // History
    history: '履歴',
    clear: 'クリア',
    date: '日付',
    status: 'ステータス',
    trigger: '種類',
    triggers: {
      manual: 'バックアップ（手動）',
      scheduled: 'バックアップ（スケジュール）',
      restore: '復元',
    },
    commit: 'コミット',

    // Local Backup
    localBackup: 'ローカルバックアップ',
    localBackupDescription: 'データベース、アーカイブ、アップロード、すべてのファイルを含むBambuddyデータの完全なバックアップを作成します。',
    downloadBackupLabel: 'バックアップをダウンロード',
    completeBackupZip: '完全バックアップ: データベース + 全ファイル (ZIP)',
    download: 'ダウンロード',
    preparingBackup: 'バックアップを準備しています...',
    creatingArchive: 'バックアップアーカイブを作成しています...大きなアーカイブの場合、時間がかかることがあります。',
    downloadingFile: 'バックアップファイルをダウンロードしています...',
    backupDownloaded: 'バックアップのダウンロードが成功しました',
    failedToCreateBackup: 'バックアップの作成に失敗しました: {{message}}',
    restore: '復元',
    restoreReplacesAll: '復元はすべてのデータを置き換えます。',
    restoreReplacesAllDetail: '現在のデータベースとファイルは完全に置き換えられます。復元後に再起動が必要です。',
    restoreConfirmTitle: 'バックアップを復元',
    restoreConfirmMessage: '"{{filename}}"から復元してもよろしいですか？現在のデータベースとすべてのファイルが完全に置き換えられます。復元後にアプリケーションの再起動が必要です。',
    restoreConfirmButton: 'バックアップを復元',
    uploadingFile: 'バックアップファイルをアップロードしています...',
    backupRestoredRestart: 'バックアップが復元されました。Bambuddyを再起動してください。',
    failedToRestore: 'バックアップの復元に失敗しました。ファイル形式を確認してください。',
    reloadNow: '今すぐリロード',
    creatingBackup: 'バックアップを作成中',
    restoringBackup: 'バックアップを復元中',
    preparing: '準備中...',
    processing: '処理中...',
    doNotClosePage: 'このページを閉じたり、移動しないでください。大きなバックアップの場合、この操作には数分かかることがあります。',

    // RestoreModal
    restoring: '復元中...',
    restoreComplete: '復元完了',
    restoreFailed2: '復元失敗',
    importSettings: 'バックアップファイルから設定をインポート',
    pleaseWaitRestoring: 'データの復元中です。お待ちください',
    selectBackupFile: 'クリックしてバックアップファイルを選択 (.jsonまたは.zip)',
    duplicateHandling: '重複処理の仕組み:',
    matchPrinters: 'プリンター',
    matchPrintersBy: 'シリアル番号で照合',
    matchSmartPlugs: 'スマートプラグ',
    matchSmartPlugsBy: 'IPアドレスで照合',
    matchNotificationProviders: '通知プロバイダー',
    matchNotificationProvidersBy: '名前で照合',
    matchFilaments: 'フィラメント',
    matchFilamentsBy: '名前 + タイプ + ブランドで照合',
    matchArchives: 'アーカイブ',
    matchArchivesBy: 'コンテンツハッシュで照合（常にスキップ）',
    matchPendingUploads: '保留中のアップロード',
    matchPendingUploadsBy: 'ファイル名で照合',
    matchSettingsTemplates: '設定とテンプレート',
    matchSettingsTemplatesBy: '常に上書き',
    replaceExisting: '既存のデータを置き換え',
    keepExisting: '既存のデータを保持',
    overwriteDescription: '既に存在する項目をバックアップデータで上書き',
    keepDescription: 'まだ存在しない項目のみ復元',
    overwriteCaution: '注意:',
    overwriteWarning: '上書きすると、現在の設定がバックアップのデータで置き換えられます。プリンターのアクセスコードはセキュリティのため上書きされません。',
    cancel: 'キャンセル',
    processingBackup: 'バックアップファイルを処理しています...',
    itemsRestored: '復元済み',
    itemsSkipped: 'スキップ済み',
    restored: '復元済み',
    skippedAlreadyExist: 'スキップ（既に存在）',
    filesCategory: 'ファイル（3MF、サムネイルなど）',
    andMore: '...他{{count}}件',
    newApiKeysGenerated: '新しいAPIキーが生成されました',
    keysShownOnce: 'これらのキーは一度だけ表示されます。今すぐコピーしてください！',
    copy: 'コピー',
    noDataFound: 'バックアップファイルに復元するデータが見つかりませんでした。',
    close: '閉じる',

    // Scheduled local backups (#884)
    scheduledBackup: 'スケジュールされたバックアップ',
    scheduledBackupDescription: 'スケジュールに基づいてバックアップスナップショットを自動作成。出力ディレクトリはNASや外部ストレージにマウント可能。',
    frequency: '頻度',
    backupTime: '時間',
    retention: '保持期間',
    retentionDescription: '保持するバックアップ数',
    outputPath: '出力パス',
    outputPathPlaceholder: 'デフォルト: {{path}}',
    outputPathDescription: 'デフォルトの場所を使用する場合は空白のまま',
    runNow: '今すぐ実行',
    backupFiles: 'バックアップファイル',
    noScheduledBackups: 'バックアップなし',
    deleteBackup: '削除',
    deleteBackupConfirm: 'このバックアップファイルを削除しますか？',
    backupRunning: 'バックアップ中...',
    scheduledBackupComplete: 'バックアップが正常に完了しました',
    scheduledBackupFailed: 'バックアップに失敗',
    nextBackup: '次回バックアップ',
    backupSize: 'サイズ',
    localTimeHint: '現地時刻 ({{tz}})',
    defaultPathLabel: 'デフォルト:',
    // Backup output-path probe (#2544)
    pathCheck: {
      title: 'Bambuddy はこのディレクトリに書き込めません',
      howToFix: '対処方法:',
      sandboxed: 'Bambuddy サービスは {{path}} に書き込めません。systemd ユニットが ProtectSystem=strict で動作しているため、インストール・データ・ログの各ディレクトリ以外はすべてサービスから読み取り専用になります。自分のシェルからは書き込める場所であっても同様です。',
      read_only: '{{path}} は読み取り専用のファイルシステム上にあります。',
      permission_denied: 'Bambuddy には {{path}} への書き込み権限がありません。ディレクトリの所有者とパーミッションを確認してください。',
      no_space: '{{path}} があるファイルシステムに空き容量がありません。',
      not_a_directory: '{{path}} は存在しますが、ディレクトリではありません。',
      missing: '{{path}} は存在せず、作成もできませんでした。',
      error: 'Bambuddy は {{path}} に書き込めません。',
      ephemeralTitle: 'これらのバックアップはコンテナの再作成で失われます',
      container_ephemeral: '{{path}} はホストではなく Bambuddy コンテナ内にあります。そこに書き込まれたバックアップはコンテナを再作成すると失われます。ホスト側のディレクトリをマウントしてください:',
    },

    // Category labels
    categories: {
      settings: '設定',
      notification_providers: '通知プロバイダー',
      notification_templates: '通知テンプレート',
      smart_plugs: 'スマートプラグ',
      printers: 'プリンター',
      filaments: 'フィラメント',
      maintenance_types: 'メンテナンスタイプ',
      archives: 'アーカイブ',
      projects: 'プロジェクト',
      pending_uploads: '保留中のアップロード',
      external_links: '外部リンク',
      api_keys: 'APIキー',
    },
  },

  // Tags
  tags: {
    title: 'タグ',
    addTag: 'タグを追加',
    editTag: 'タグを編集',
    deleteTag: 'タグを削除',
    tagName: 'タグ名',
    tagColor: 'タグの色',
    noTags: 'タグがありません',
    deleteConfirm: 'このタグを削除しますか？',
    manageTags: 'タグを管理',
  },

  // Upload modal (archives)
  uploadModal: {
    title: '3MFファイルのアップロード',
    dragDrop: '.3mfファイルをここにドラッグ＆ドロップ',
    or: 'または',
    browseFiles: 'ファイルを参照',
    extractionInfo: 'プリンターモデルは3MFファイルのメタデータから自動的に抽出されます。',
    uploaded: 'アップロード済み',
    failed: 'アップロードに失敗しました',
    uploading: 'アップロード中...',
    upload: 'アップロード',
    uploadFailed: 'アップロード失敗',
  },

  // Edit archive modal
  // Edit Archive Modal
  editArchive: {
    title: 'アーカイブを編集',
    name: '名前',
    namePlaceholder: '印刷名',
    printer: 'プリンター',
    noPrinter: 'プリンターなし',
    project: 'プロジェクト',
    noProject: 'プロジェクトなし',
    itemsPrinted: '印刷数',
    itemsPrintedHelp: 'この印刷ジョブで製造したアイテム数',
    notes: 'メモ',
    notesPlaceholder: 'この印刷についてメモを追加...',
    externalLink: '外部リンク',
    externalLinkPlaceholder: 'https://...',
    externalLinkHelp: 'Printables、Thingiverse、その他のソースへのリンク',
    tags: 'タグ',
    tagsPlaceholder: 'タグを追加...',
    addMoreTags: 'タグをさらに追加...',
    matchingTags: '"{{query}}" に一致',
    existingTags: '既存のタグ',
    clickToAdd: '（クリックして追加）',
    status: 'ステータス',
    failureReason: '失敗理由',
    selectReason: '理由を選択...',
    photos: '印刷結果の写真',
    photosHelp: '+ をクリックして印刷結果の写真を追加',
    printResult: '印刷結果',
    saving: '保存中...',
    // Failure reasons
    failureReasons: {
      adhesionFailure: '定着不良',
      spaghettiDetached: 'スパゲッティ / 剥離',
      layerShift: 'レイヤーシフト',
      cloggedNozzle: 'ノズル詰まり',
      filamentRunout: 'フィラメント切れ',
      warping: '反り',
      stringing: '糸引き',
      underExtrusion: '押出不足',
      powerFailure: '電源障害',
      userCancelled: 'ユーザーによるキャンセル',
      other: 'その他',
    },
    // Archive statuses
    statuses: {
      completed: '完了',
      failed: '失敗',
      aborted: 'キャンセル',
      printing: '印刷中',
    },
  },

  // K-Profiles
  kProfiles: {
    title: 'Kプロファイル',
    noPrintersConfigured: 'プリンターが設定されていません',
    addPrinterInSettings: 'Kプロファイルを管理するには設定でプリンターを追加してください',
    noActivePrinters: 'アクティブなプリンターがありません',
    enablePrinterConnection: 'Kプロファイルを表示するにはプリンター接続を有効にしてください',
    loadingProfiles: 'Kプロファイルを読み込み中...',
    printerOffline: 'プリンターオフライン',
    printerOfflineDesc: '選択したプリンターは接続されていません。電源を入れてKプロファイルを表示してください。',
    noMatchingProfiles: '一致するプロファイルなし',
    noMatchingProfilesDesc: '検索条件に一致するプロファイルがありません',
    noKProfiles: 'Kプロファイルなし',
    noKProfilesDesc: '{{diameter}}mmノズル用の圧力キャリブレーションプロファイルが見つかりません',
    createFirstProfile: '最初のプロファイルを作成',
    // Controls
    printer: 'プリンター',
    nozzle: 'ノズル',
    refresh: '更新',
    addProfile: 'K-プロファイルを追加',
    export: 'エクスポート',
    import: 'インポート',
    select: '選択',
    selectAll: 'すべて選択',
    delete: '削除',
    // Filters
    searchPlaceholder: '名前またはフィラメントで検索...',
    allExtruders: 'すべてのエクストルーダー',
    leftOnly: '左のみ',
    rightOnly: '右のみ',
    allFlow: 'すべてのフロー',
    hfOnly: 'HFのみ',
    sOnly: 'Sのみ',
    sortName: 'ソート: 名前',
    sortKValue: 'ソート: K値',
    sortFilament: 'ソート: フィラメント',
    // Dual extruder labels
    leftExtruder: '左エクストルーダー',
    rightExtruder: '右エクストルーダー',
    // Modal
    modal: {
      addTitle: 'Kプロファイルを追加',
      editTitle: 'Kプロファイルを編集',
      profileName: 'プロファイル名',
      profileNamePlaceholder: 'マイPLAプロファイル',
      kValue: 'K値',
      kValuePlaceholder: '0.020',
      kValueHelp: '一般的な範囲: PLA 0.01〜0.06、PETG 0.02〜0.10',
      filament: 'フィラメント',
      selectFilament: 'フィラメントを選択...',
      source: {
        local: 'インポート済み',
        orcaCloud: 'Orca Cloud',
        bambuCloud: 'Bambu Cloud',
        builtin: '内蔵',
      },
      noFilamentsHelp: '利用できるフィラメントがありません。Bambu Cloud にログインするか、プロファイル → ローカルプロファイル でプリセットをインポートしてください。',
      searchFilaments: 'フィラメントを検索...',
      noFilamentMatches: '検索に一致するフィラメントはありません',
      flowType: 'フロータイプ',
      highFlow: 'ハイフロー',
      standard: 'スタンダード',
      nozzleSize: 'ノズルサイズ',
      extruder: 'エクストルーダー',
      extruders: 'エクストルーダー',
      left: '左',
      right: '右',
      notes: 'メモ（ローカル保存）',
      notesPlaceholder: 'このプロファイルのメモを追加...',
      notesHelp: 'メモはBambuddyに保存され、プリンターには保存されません',
      syncing: 'プリンターと同期中...',
      savingExtruder: 'エクストルーダーに保存中 {{current}}/{{total}}...',
      pleaseWait: 'お待ちください',
    },
    // Delete confirmation
    deleteConfirm: {
      title: 'プロファイルを削除',
      cannotUndo: '元に戻せません',
      message: '「{{name}}」をプリンターから削除しますか？',
    },
    // Bulk delete
    bulkDelete: {
      title: 'プロファイルを削除',
      cannotUndo: '元に戻せません',
      message: '選択した{{count}}件のプロファイルをプリンターから削除しますか？',
    },
    // Toast
    toast: {
      profileSaved: 'Kプロファイルを保存しました',
      profilesSaved: 'Kプロファイルを{{count}}台のエクストルーダーに保存しました',
      selectAtLeastOneExtruder: 'エクストルーダーを1つ以上選択してください',
      selectFilament: '先にフィラメントを選択してください',
      filamentNotResolvable: '{{name}} に対応する Bambu フィラメント ID がないため、プリンターはプロファイルを保存できません',
      profileDeleted: 'Kプロファイルを削除しました',
      profilesDeleted: '{{count}}件のプロファイルを削除しました',
      exportedProfiles: '{{count}}件のプロファイルをエクスポートしました',
      importedProfiles: '{{total}} 件中 {{count}} 件のプロファイルをインポートしました',
      noProfilesToExport: 'エクスポートするプロファイルがありません',
      invalidFileFormat: '無効なファイル形式',
      failedToParseImport: 'インポートファイルの解析に失敗しました',
      failedToSaveBatch: 'Kプロファイルの保存に失敗しました',
      noteSaved: 'メモを保存しました',
      failedToSaveNote: 'メモの保存に失敗しました',
    },
    // Permissions
    permission: {
      noRead: 'プロファイルを更新する権限がありません',
      noCreate: 'プロファイルを追加する権限がありません',
      noUpdate: 'Kプロファイルを更新する権限がありません',
      noDelete: 'Kプロファイルを削除する権限がありません',
      noExport: 'プロファイルをエクスポートする権限がありません',
      noImport: 'プロファイルをインポートする権限がありません',
    },
  },

  // Virtual Printer
  virtualPrinter: {
    title: '仮想プリンター',
    running: '稼働中',
    stopped: '停止',
    description: {
      default: 'Bambu StudioとOrcaSlicerに表示される仮想プリンターを有効化。このプリンターに送信されたファイルは印刷せずに直接アーカイブされます。',
      proxy: 'スライサーのトラフィックを実際のプリンターに転送するプロキシを有効化。任意のネットワーク経由でリモート印刷が可能です。',
    },
    enable: {
      title: '仮想プリンターを有効化',
      visibleInSlicer: 'スライサーの検出リストに「Bambuddy」として表示',
      proxyingTo: '{{name}}にプロキシ中',
      notActive: '非アクティブ',
    },
    model: {
      title: 'プリンターモデル',
      description: 'エミュレートするプリンターモデルを選択。',
      restartWarning: 'モデルを変更すると仮想プリンターが再起動されます',
    },
    accessCode: {
      title: 'アクセスコード',
      isSet: 'アクセスコードが設定されています',
      notSet: 'アクセスコード未設定 - 有効化に必要です',
      placeholder: '8文字のコードを入力',
      placeholderChange: '新しいコードを入力して変更',
      hint: '正確に8文字必要です。スライサーの認証に使用されます。',
      charCount: '({{count}}/8)',
      inheritedFromTarget: 'ターゲットプリンターから継承',
      derivedFromTargetHint: 'ターゲットプリンターのアクセスコードを使用します。ブリッジはスライサーの認証情報を実機プリンターに転送するため、コードが一致している必要があります。変更するにはプリンターの設定でアクセスコードを編集してください。',
      reveal: 'アクセスコードを表示',
      hide: 'アクセスコードを隠す',
    },
    targetPrinter: {
      title: 'ターゲットプリンター',
      configured: 'プロキシターゲット設定済み',
      notConfigured: 'ターゲットプリンター未選択 - プロキシモードに必要です',
      placeholder: 'プリンターを選択...',
      hint: 'スライサートラフィックの転送先プリンターを選択。プリンターはLANモードである必要があります。',
      noPrinters: 'プリンターが設定されていません。プロキシモードを使用するにはまずプリンターを追加してください。',
    },
    remoteInterface: {
      title: 'ネットワークインターフェース上書き',
      configured: 'インターフェース上書き有効',
      optional: 'オプション — 自動検出IPが間違っている場合に使用（複数NIC、Docker、VPNなど）',
      placeholder: '自動検出（デフォルト）...',
      hint: 'SSDPで広告され、TLS証明書に使用されるIPアドレスを上書きします。Bambuddyに複数のネットワークインターフェースがある場合に便利です。',
    },
    mode: {
      title: 'モード',
      archive: 'アーカイブ',
      archiveDesc: 'ファイルを即座にアーカイブ',
      review: 'レビュー',
      reviewDesc: 'アーカイブ前にレビュー',
      queue: 'キュー',
      queueDesc: 'アーカイブしてキューに追加',
      proxy: 'プロキシ',
      proxyDesc: '実際のプリンターに転送',
    },
    autoDispatch: {
      title: '自動ディスパッチ',
      description: 'キューに追加されたときに自動的に印刷を開始します。オフの場合、手動ディスパッチを待ちます。',
    },
    queueForceColorMatch: {
      title: '色の一致を強制',
      description: '正確なフィラメントタイプと色がロードされていないプリンターへの送信を拒否します。デフォルトはオフ — これがないと、キューはモデルのみのマッチングを使用し、間違った色がロードされたプリンターを選ぶ可能性があります。',
    },
    saveAmsMapping: {
      title: 'AMSマッピングを保存',
      description: 'スライサー自身が選択したAMSスロット（project_file MQTTコマンドから）をアーカイブに保存し、後で再印刷する際にファイルのタイプ/色から再導出するのではなく、同じ物理スプールを再利用できるようにします。デフォルトはオフです。',
    },
    gcodeInjection: {
      title: 'G-codeインジェクション',
      description: '設定でモデルごとに構成したG-codeスニペットを、このVPのジョブに適用します。デフォルトはオフです。',
    },
    tailscaleDisabled: {
      title: 'Tailscale統合',
      description: 'このVPがTailscale経由で公開されていることをマークするには有効にしてください。スライサーに貼り付けるIPがわかるよう、ホストのTailscaleアドレスを表示します。CAインポート手順は変更されません — このトグルは証明書に影響しません。',
    },
    setupRequired: {
      title: 'セットアップが必要です',
      description: '仮想プリンター機能を使用するには追加のシステム設定が必要です。ポートフォワーディング、ファイアウォールルール、プラットフォーム固有の設定が含まれます。',
      readGuide: '有効にする前にセットアップガイドをお読みください',
    },
    howItWorks: {
      title: '仕組み',
      step1: '同じLAN上では、仮想プリンターはスライサー（Bambu Studio / OrcaSlicer）に自動的に表示されます。他のネットワークからは、IPアドレスとアクセスコードで手動で追加してください。',
      step2: 'アーカイブ、レビュー、キューモードでは、スライサーの「送信」ボタンを使用して3MFファイルをBambuddyにアップロードします。スライサーは「印刷成功」と表示しますが、ファイルは保存され、印刷はされません。',
      step3: 'プロキシモードでは、仮想プリンターはすべてのトラフィックを実際のプリンターに転送します。直接接続されているかのように印刷がすぐに開始されます。',
    },
    status: {
      title: 'ステータス詳細',
      printerName: 'プリンター名',
      model: 'モデル',
      serialNumber: 'シリアル番号',
      mode: 'モード',
      pendingFiles: '保留中のファイル',
      targetPrinter: 'ターゲットプリンター',
      ftpPort: 'FTPポート',
      mqttPort: 'MQTTポート',
      ftpConnections: 'FTP接続数',
      mqttConnections: 'MQTT接続数',
    },
    toast: {
      updated: '仮想プリンター設定を更新しました',
      failedToUpdate: '設定の更新に失敗しました',
      copyFailed: 'コピーに失敗しました — テキストを手動で選択してください',
      accessCodeRequired: '先にアクセスコードを設定してください',
      targetPrinterRequired: '先にターゲットプリンターを選択してください',
      bindIpRequired: '先にバインドIPを設定してください',
      accessCodeEmpty: 'アクセスコードは空にできません',
      accessCodeLength: 'アクセスコードは8文字である必要があります',
      targetCodeChangedRebind: 'アクセスコードが新しいターゲットプリンターに同期されました。新しいコードを反映するには、スライサーでこのデバイスを再登録してください。',
      created: '仮想プリンターを作成しました',
      failedToCreate: '仮想プリンターの作成に失敗しました',
      deleted: '仮想プリンターを削除しました',
      failedToDelete: '仮想プリンターの削除に失敗しました',
    },
    list: {
      title: '仮想プリンター',
      add: '追加',
      addFirst: '仮想プリンターを追加',
      empty: '仮想プリンターが設定されていません。追加して始めましょう。',
    },
    bindIp: {
      title: 'バインドインターフェース',
      placeholder: 'インターフェースを選択...',
      hint: 'この仮想プリンターがバインドするネットワークインターフェース。プリンターごとに一意である必要があります。',
    },
    proxy: {
      accessCodeHint: 'プロキシモードでは、スライサーにターゲットプリンターのアクセスコードを使用してください。接続は実際のプリンターに透過的に転送されます。',
    },
    addDialog: {
      title: '仮想プリンターを追加',
      name: '名前',
      hint: 'アクセスコード、ターゲットプリンター、その他の設定は作成後に設定できます。',
      create: '作成',
    },
    deleteConfirm: {
      title: '仮想プリンターを削除',
      message: '「{{name}}」を削除してもよろしいですか？このプリンターのすべてのサービスが停止されます。',
    },
    archiveNameSource: {
      title: 'アーカイブ名のソース',
      description: '仮想プリンター経由でファイルが到着したときに、新しいアーカイブをどのように命名するかを選択します。「メタデータ」は3MFに埋め込まれたスライサータイトル（デフォルト）を使用します。「ファイル名」はBambu StudioがFTPで送信したファイル名を使用します。注: Bambu Studioは、3MFにタイトルフィールドが存在する場合、「プリンターに送信」ダイアログで入力した名前をその値で上書きするため、両方のモードで同じ文字列になることが多くあります。',
      metadata: 'メタデータ',
      filename: 'ファイル名',
    },
    caCert: {
      title: 'スライサー証明書',
      description: '仮想プリンターは Bambuddy CA が署名した TLS 証明書を使用します。この CA 証明書をスライサーの信頼ストアに一度インポートすると接続が受け入れられます — コマンドラインからコピーする必要はありません。',
      copy: 'コピー',
      copied: 'コピーしました',
      download: 'ダウンロード',
      fingerprint: 'SHA-256',
    },
  },

  // Model Viewer
  modelViewer: {
    openInSlicer: 'スライサーで開く',
    openInSlicerWith: '{{slicer}}で開く',
    moreSlicerOptions: 'その他のスライサーオプション',
    openInSlicerFailed: 'スライサーで開けませんでした',
    tabs: {
      model: '3Dモデル',
    },
    notAvailable: '利用不可',
    plates: 'プレート',
    allPlates: '全プレート',
    plateNumber: 'プレート {{number}}',
    plateCount: '{{count}} プレート',
    plateCount_other: '{{count}} プレート',
    objectCount: '{{count}} オブジェクト',
    objectCount_other: '{{count}} オブジェクト',
    filamentCount: '{{count}} フィラメント',
    filamentCount_other: '{{count}} フィラメント',
    eta: '予想時間 {{minutes}} 分',
    noPreview: 'このファイルのプレビューは利用できません',
    pagination: {
      pageOf: 'ページ {{current}} / {{total}}',
      prev: '前へ',
      next: '次へ',
    },
    errors: {
      failedToLoad: 'ファイルの読み込みに失敗しました',
      noMeshes: '3MFファイルにメッシュが見つかりません',
      unsupportedFormat: 'サポートされていないファイル形式です',
    },
  },

  // Maintenance type descriptions (built-in)
  maintenanceDescriptions: {
    lubricateCarbonRods: 'カーボンロッドに潤滑剤を塗布してスムーズな動きを確保',
    lubricateRails: 'リニアレールの潤滑',
    cleanNozzle: 'ノズル/ホットエンドの清掃',
    checkBelts: 'ベルト張力の確認',
    cleanBuildPlate: 'ビルドプレートの清掃',
    checkExtruder: 'エクストルーダーギアの確認',
    checkCooling: '冷却ファンの確認',
    generalInspection: '総合点検',
    cleanCarbonRods: 'カーボンロッドの清掃',
    lubricateSteelRods: 'スチールロッドに潤滑剤を塗布してスムーズな動きを確保',
    cleanSteelRods: 'スチールロッドの清掃',
    cleanLinearRails: 'リニアレールを拭いてほこりや汚れを除去',
    checkPtfeTube: 'PTFEチューブの確認',
    replaceHepaFilter: 'HEPAフィルター交換',
    replaceCarbonFilter: 'カーボンフィルター交換',
    lubricateLeftNozzleRail: '左ノズルレールの潤滑',
  },

  // Smart Plugs
  haSensors: {
    label: 'センサー',
    unavailable: '利用不可',
    blocksPrints: '{{entity}} — アラート中は印刷を保留します',
    states: {
      open: '開',
      closed: '閉',
      unlocked: '解錠',
      locked: '施錠',
      detected: '検知',
      clear: 'なし',
      wet: '濡れ',
      dry: '乾燥',
      problem: '異常',
      ok: '正常',
      running: '作動中',
      stopped: '停止',
      on: 'オン',
      off: 'オフ',
    },
    sectionTitle: 'Home Assistant センサー',
    add: 'センサーを追加',
    addTitle: 'Home Assistant センサーを追加',
    editTitle: 'Home Assistant センサーを編集',
    empty: 'センサーがまだありません。Home Assistant のドアセンサーや温度計を連携すると、プリンターカードに表示されます。',
    unknownPrinter: '不明なプリンター',
    badgeBlocks: '印刷を保留',
    badgeNotifies: '通知する',
    badgeHidden: 'カードに非表示',
    printer: 'プリンター',
    entity: 'エンティティ',
    searchPlaceholder: 'エンティティを検索...',
    noEntities: '一致するエンティティがありません',
    name: '表示名',
    alertWhen: 'アラート条件',
    alertNever: 'なし — 表示のみ',
    alertAbove: 'しきい値超過',
    alertBelow: 'しきい値未満',
    alertHint: 'アラート状態になるとプリンターカードで強調表示され、下のオプションが有効になります。',
    showOnCard: 'プリンターカードに表示',
    notifyOnAlert: 'アラート発生時に通知を送信',
    blockPrint: 'アラート中はキューの印刷を保留',
    blockPrintHint: 'ジョブはキューに残り、センサーが解除されると自動的に開始します。Home Assistant に接続できない間は無視されます。',
    toast: {
      created: 'センサーを追加しました',
      updated: 'センサーを保存しました',
      deleted: 'センサーを削除しました',
    },
    error: {
      pickEntity: 'Home Assistant のエンティティを選択してください',
      nameRequired: '表示名を入力してください',
      printerRequired: 'プリンターを選択してください',
      alertRequired: '先にアラート条件を設定してください',
    },
  },
  smartPlugs: {
    offline: 'オフライン',
    admin: '管理',
    openPlugAdminPage: 'プラグ管理ページを開く',
    deleteSmartPlug: 'スマートプラグを削除',
    turnOnSmartPlug: 'スマートプラグをオンにする',
    turnOffSmartPlug: 'スマートプラグをオフにする',
    turnOn: 'オンにする',
    turnOff: 'オフにする',
    addSmartPlug: {
      scanningNetwork: 'ネットワークをスキャン中...',
      chooseEntity: 'エンティティを選択...',
      connectionFailed: '接続失敗',
      searchEntities: 'エンティティを検索...',
      searchPowerSensors: '電力センサーを検索...',
      searchEnergySensors: 'エネルギーセンサーを検索...',
      placeholders: {
        plugName: 'リビングルームプラグ',
        mqttStateOnValue: 'ON, true, 1',
        mqttSameAsPower: '電力トピックと同じ、または異なる',
      },
    },
    // SmartPlugCard
    linkedTo: 'リンク先:',
    monitorOnly: '監視のみ',
    alerts: 'アラート',
    scheduleOn: 'オン {{time}}',
    scheduleOff: 'オフ {{time}}',
    on: 'オン',
    off: 'オフ',
    power: '電力',
    kwhToday: '本日のkWh',
    settings: '設定',
    automationSettings: '自動化設定',
    showInSwitchbar: 'スイッチバーに表示',
    quickAccessSidebar: 'サイドバーからクイックアクセス',
    enabled: '有効',
    enableAutomation: 'このプラグの自動化を有効にする',
    autoOn: '自動オン',
    autoOnDescription: '印刷開始時にオンにする',
    autoOff: '自動オフ',
    autoOffDescription: '印刷完了時にオフにする（ワンショット）',
    autoOffPersistent: '有効のまま維持',
    autoOffPersistentDescription: 'ワンショットではなく印刷間で有効のまま維持',
    controlsPrinterPower: 'プリンターに給電',
    controlsPrinterPowerDescription: 'このプラグがアクセサリー（フィルターファン、照明）のみに給電する場合はオフにします。オンのままだと、電源を切ったときにプリンターがオフラインとして扱われます。',
    autoOffAfterDrying: '乾燥完了後に自動オフ',
    autoOffAfterDryingDescription: 'AMSの乾燥が完了したらオフにする',
    delayAfterDryingMinutes: '乾燥後の遅延（分）',
    turnOffDelayMode: 'オフ遅延モード',
    time: '時間',
    temp: '温度',
    delayMinutes: '遅延（分）',
    tempThreshold: '温度しきい値（°C）',
    tempThresholdDescription: 'ノズルがこの温度以下に冷却されるとオフになります',
    edit: '編集',
    deleteConfirm: '"{{name}}"を削除してもよろしいですか？この操作は取り消せません。',
    turnOnConfirm: '"{{name}}"をオンにしてもよろしいですか？',
    turnOffConfirm: '"{{name}}"をオフにしてもよろしいですか？接続されたデバイスの電源が切れます。',
    failedToTurn: '"{{name}}"を{{action}}できませんでした',
    unknown: '不明',
    // AddSmartPlugModal
    addTitle: 'スマートプラグを追加',
    editTitle: 'スマートプラグを編集',
    stopScanning: 'スキャン停止',
    discoverTasmota: 'Tasmotaデバイスを検出',
    foundDevices: '{{count}}台のデバイスが見つかりました - クリックして選択:',
    noDevicesFound: 'ネットワーク上にTasmotaデバイスが見つかりません',
    haNotConfigured: 'Home Assistantが設定されていません。設定場所:',
    haSettingsPath: '設定 → ネットワーク → Home Assistant',
    selectEntity: 'エンティティを選択 *',
    ipAddress: 'IPアドレス *',
    nameLabel: '名前 *',
    username: 'ユーザー名',
    password: 'パスワード',
    authHint: 'Tasmotaデバイスが認証を必要としない場合は空のままにしてください',
    linkToPrinter: 'プリンターにリンク',
    noPrinter: 'プリンターなし（手動制御のみ）',
    linkingDescription: 'リンクすると印刷開始/完了時に自動でオン/オフできます',
    powerAlerts: '電力アラート',
    alertAbove: '上限アラート（W）',
    alertBelow: '下限アラート（W）',
    alertDescription: '電力消費がこれらのしきい値を超えた場合に通知します。無効にするには空のままにしてください。',
    dailySchedule: 'デイリースケジュール',
    turnOnAt: 'オンにする時刻',
    turnOffAt: 'オフにする時刻',
    scheduleDescription: '毎日これらの時刻にプラグを自動的にオン/オフします。スキップするには空のままにしてください。',
    showOnPrinterCard: 'プリンターカードに表示',
    displayOnPrinterCard: 'プリンターカードにボタンを表示',
    connectedResult: '接続成功！',
    deviceLabel: 'デバイス: {{name}} - ',
    stateLabel: '状態: {{state}}',
    test: 'テスト',
    delete: '削除',
    save: '保存',
    add: '追加',
    cancel: 'キャンセル',
    failedToStartScan: 'スキャンを開始できませんでした',
    nameRequired: '名前は必須です',
    entityRequired: 'Home AssistantプラグにはエンティティIDが必要です',
    mqttTopicRequired: '電力、エネルギー、または状態監視用に少なくとも1つのMQTTトピックを設定する必要があります',
    loadingEntities: 'エンティティを読み込み中...',
    loading: '読み込み中...',
    failedToLoadEntities: 'エンティティの読み込みに失敗しました: {{error}}',
    noEntitiesMatching: '"{{search}}"に一致するエンティティが見つかりません',
    noEntitiesAvailable: '利用可能なエンティティがありません',
    searchingEntities: 'すべてのエンティティを検索中（{{count}}件見つかりました）',
    showingEntities: 'switch、light、input_booleanを表示（{{count}}件利用可能）',
    energyMonitoringOptional: 'エネルギー監視（オプション）',
    energyMonitoringHint: '電力/エネルギーデータを提供するセンサーを検索して選択します。',
    powerSensorW: '電力センサー（W）',
    energyTodayKwh: '本日のエネルギー（kWh）',
    totalEnergyKwh: '総エネルギー（kWh）',
    noMatchingSensors: '一致するセンサーがありません',
    none: 'なし',
    mqttNotConfigured: 'MQTTブローカーが設定されていません。ブローカーアドレスを設定してください:',
    mqttSettingsPath: '設定 → ネットワーク → MQTT配信',
    mqttNotConfiguredSuffix: '（配信を有効にする必要はありません。ブローカーの詳細を入力するだけです）。',
    mqttMonitorOnlyDescription: 'MQTTプラグはMQTTサブスクリプション経由で電力/エネルギーデータを受信します。オン/オフ制御は利用できません - MQTTブローカーまたはホームオートメーションシステムを使用してください。',
    powerMonitoring: '電力監視',
    energyMonitoring: 'エネルギー監視',
    stateMonitoring: '状態監視',
    optional: 'オプション',
    topic: 'トピック',
    jsonPath: 'JSONパス',
    multiplier: '乗数',
    onValue: 'ON値',
    mqttPowerHint: 'JSONパスはJSONペイロードから値を抽出します（例: "power_l1"）。トピックが生の数値を送信する場合は空のままにしてください。\n乗数: mW→Wは0.001、kW→Wは1000を使用。',
    mqttEnergyHint: 'JSONパスはJSONペイロードから値を抽出します。生の値の場合は空のままにしてください。\n乗数: Wh→kWhは0.001、MWh→kWhは1000を使用。',
    mqttStateHint: 'JSONパスはJSONペイロードから値を抽出します。生の値の場合は空のままにしてください。\nON値: "ON"を意味する正確な文字列。自動検出（ON、true、1）の場合は空のままにしてください。',
    // REST smart plug
    restControl: 'コントロール',
    restOnUrl: 'オンURL',
    restOffUrl: 'オフURL',
    restOnBody: 'ONリクエスト本文',
    restOffBody: 'OFFリクエスト本文',
    restMethod: 'HTTPメソッド',
    restHeaders: 'Custom Headers (JSON)',
    restStatusUrl: 'ステータスURL',
    restStatusPath: '状態JSONパス',
    restStatusOnValue: 'ON値',
    restPowerUrl: '電力URL',
    restPowerPath: '電力JSONパス',
    restPowerMultiplier: '電力乗数',
    restEnergyUrl: 'エネルギーURL',
    restEnergyPath: 'エネルギーの JSON パス (今日)',
    restEnergyTotalPath: 'エネルギーの JSON パス (積算値)',
    restEnergyTotalMultiplier: '積算値の乗数',
    restEnergyTotalPathHint: '例: aenergy.total',
    restEnergyTotalHint:
      '多くのスマートプラグ (Shelly はすべて) は、リセットされない積算カウンターしか返しません。その値は上の欄ではなく、ここに入力してください。今日の使用量として読むと深夜にリセットされず、昨日と合計は空のままになります。Bambuddy は積算値から今日と昨日を算出しますが、そのためには 1〜2 日分の測定値が必要です。Shelly はワット時で返すため、乗数には 0.001 を指定してください。',
    restEnergyMultiplier: 'エネルギー乗数',
    restUrlRequired: 'RESTプラグには少なくとも1つのURL（ONまたはOFF）が必要',
    restHeadersHint: '例: {"Authorization": "Bearer your-token"}',
    restBodyHint: '例：ON, {"state": "on"}',
    restStatusHint: '現在の状態を取得するURL',
    restPathHint: '例: state または data.power.status',
    restPowerUrlHint: '電力データ用の個別URL（空欄の場合はステータスURLを使用）',
    restEnergyUrlHint: 'エネルギーデータ用の個別URL（空欄の場合はステータスURLを使用）',
    restEnergyHint: '各値は個別のURLを使用するか、ステータスURLにフォールバックできます。乗数で単位変換が可能です（例：WhからkWhへの変換は0.001）。',
    testConnection: '接続テスト',
    connectionSuccess: '接続成功',
    noSwitchesInSwitchbar: 'スイッチバーにスイッチがありません',
    enableSwitchbarHint: '設定 > スマートプラグで「スイッチバーに表示」を有効にしてください',
  },

  // Notifications
  notifications: {
    // Provider types
    providerTypes: {
      callmebot: 'CallMeBot/WhatsApp',
      ntfy: 'ntfy',
      pushover: 'Pushover',
      telegram: 'Telegram',
      email: 'メール',
      discord: 'Discord',
      webhook: 'Webhook',
      homeassistant: 'Home Assistant',
      bark: 'Bark',
    },
    // Provider descriptions
    providerDescriptions: {
      email: 'SMTPメール通知',
      telegram: 'Telegramボット経由の通知',
      discord: 'Webhook経由でDiscordチャンネルに送信',
      ntfy: '無料のセルフホスト可能なプッシュ通知',
      pushover: 'シンプルで信頼性の高いプッシュ通知',
      callmebot: 'CallMeBot経由の無料WhatsApp通知',
      webhook: '任意のURLへの汎用HTTP POST',
      homeassistant: 'Home Assistantダッシュボードの永続通知',
      bark: 'Bark経由のiOSプッシュ通知（セルフホスト可能）',
    },
    // NotificationProviderCard
    lastSuccess: '最終: {{date}}',
    error: 'エラー',
    printer: 'プリンター:',
    allPrinters: 'すべてのプリンター',
    sendTestNotification: 'テスト通知を送信',
    eventSettings: 'イベント設定',
    enabled: '有効',
    sendFromProvider: 'このプロバイダーから通知を送信',
    // Event categories
    printEvents: '印刷イベント',
    printerStatus: 'プリンターステータス',
    amsAlarms: 'AMSアラーム',
    amsHtAlarms: 'AMS-HTアラーム',
    printQueue: '印刷キュー',
    // Event tags (badges)
    start: '開始',
    plateCheck: 'プレートチェック',
    complete: '完了',
    failed: '失敗',
    stopped: '停止',
    progress: '進捗',
    offline: 'オフライン',
    lowFilament: 'フィラメント残量低下',
    maintenance: 'メンテナンス',
    amsHumidity: 'AMS湿度',
    amsTemp: 'AMS温度',
    amsDryingSuspended: '乾燥を停止',
    amsHtHumidity: 'AMS-HT湿度',
    amsHtTemp: 'AMS-HT温度',
    bedCooled: 'ベッド冷却済み',
    firstLayer: '第1層完了',
    quiet: '静音',
    digest: 'ダイジェスト {{time}}',
    // Event labels (expanded settings)
    printStarted: '印刷開始',
    plateNotEmpty: 'プレートが空でない',
    plateNotEmptyDescription: '印刷前にオブジェクトが検出されました',
    plateClearRequired: 'プレート確認が必要',
    plateClearRequiredDescription: '印刷完了、キューはプレート確認を待機中',
    plateClear: 'プレート確認',
    printCompleted: '印刷完了',
    bedCooledLabel: 'ベッド冷却済み',
    bedCooledDescription: '印刷後にベッドがしきい値以下に冷却',
    firstLayerCompleteLabel: '第1層完了',
    firstLayerCompleteDescription: '第1層完了時にスナップショット付きで通知',
    missingSpoolAssignmentLabel: 'スプール割り当て不足',
    billingChargeFailedLabel: '請求処理エラー',
    billingChargeFailedDescription: '印刷コストを記録できなかった場合に通知します',
    missingSpoolAssignmentDescription: '印刷開始時に必要トレイへスプールが未割り当ての場合に通知',
    printFailed: '印刷失敗',
    printStopped: '印刷停止',
    progressMilestones: '進捗マイルストーン',
    progressMilestonesDescription: '25%、50%、75%で通知',
    printerOffline: 'プリンターオフライン',
    printerError: 'プリンターエラー',
    aiFailureDetection: 'AI 故障検出',
    aiFailureDetectionDescription: 'Obico AI が印刷の不具合の可能性を検出したときに通知',
    lowFilamentLabel: 'フィラメント残量低下',
    maintenanceDue: 'メンテナンス期限',
    maintenanceDueDescription: 'メンテナンスが必要な場合に通知',
    amsHumidityHigh: 'AMS湿度高',
    amsHumidityHighDescription: '通常AMSの湿度がしきい値を超過',
    amsTemperatureHigh: 'AMS温度高',
    amsTemperatureHighDescription: '通常AMSの温度がしきい値を超過',
    amsDryingSuspendedTitle: '自動乾燥の停止',
    amsDryingSuspendedDescription: '湿度がしきい値を下回らなかったため、AMS ユニットの自動乾燥を中止しました',
    amsHtHumidityHigh: 'AMS-HT湿度高',
    amsHtHumidityHighDescription: 'AMS-HTの湿度がしきい値を超過',
    amsHtTemperatureHigh: 'AMS-HT温度高',
    amsHtTemperatureHighDescription: 'AMS-HTの温度がしきい値を超過',
    // Inventory stock alert events
    inventoryAlerts: '在庫アラート',
    stockReorderAlert: '発注アラート',
    stockReorderAlertDescription: 'SKUが発注点に達しました',
    stockBreakAlert: '在庫切れアラート',
    stockBreakAlertDescription: '入荷前に在庫が枯渇する見込みです',
    // Queue events
    jobAdded: 'ジョブ追加',
    jobAddedDescription: 'キューにジョブが追加されました',
    jobAssigned: 'ジョブ割り当て',
    jobAssignedDescription: 'モデルベースのジョブがプリンターに割り当てられました',
    jobStarted: 'ジョブ開始',
    jobStartedDescription: 'キュージョブの印刷が開始されました',
    jobWaiting: 'ジョブ待機中',
    jobWaitingDescription: 'フィラメントまたはプリンター待ちのジョブ',
    jobSkipped: 'ジョブスキップ',
    jobSkippedDescription: 'ジョブがスキップされました（前のジョブが失敗）',
    jobFailed: 'ジョブ失敗',
    jobFailedDescription: 'ジョブの開始に失敗しました',
    queueComplete: 'キュー完了',
    queueCompleteDescription: 'すべてのキュージョブが完了しました',
    // Quiet hours
    quietHours: '静音時間',
    noNotificationsDuring: 'この時間帯は通知を送信しません',
    editProviderToChangeQuietHours: 'プロバイダーを編集して静音時間を変更',
    // Daily digest
    dailyDigest: 'デイリーダイジェスト',
    batchNotifications: '通知をまとめて1日のサマリーとして送信',
    sendAt: '{{time}}に送信',
    editProviderToChangeDigestTime: 'プロバイダーを編集してダイジェスト時刻を変更',
    // Actions
    edit: '編集',
    deleteProvider: '通知プロバイダーを削除',
    deleteConfirm: '"{{name}}"を削除してもよろしいですか？この操作は取り消せません。',
    delete: '削除',
    // AddNotificationModal
    addTitle: '通知プロバイダーを追加',
    editTitle: '通知プロバイダーを編集',
    nameLabel: '名前 *',
    namePlaceholder: 'マイ通知',
    providerTypeLabel: 'プロバイダータイプ *',
    configuration: '設定',
    testConfiguration: '設定をテスト',
    printerFilter: 'プリンターフィルター',
    onlyFromPrinter: 'このプリンターからのイベントのみ通知を送信',
    quietHoursDnd: '静音時間（おやすみモード）',
    quietStart: '開始',
    quietEnd: '終了',
    dailyDigestLabel: 'デイリーダイジェスト',
    sendDigestAt: 'ダイジェスト送信時刻',
    digestCollected: 'イベントが収集され、この時刻にまとめて送信されます',
    notificationEvents: '通知イベント',
    progressPercent: '（25%、50%、75%）',
    bedCooledAfterPrint: '（印刷完了後）',
    haSensorAlert: 'センサーアラート',
    haSensorAlertDescription: '（連携した Home Assistant センサーに注意が必要です）',
    // Per-event ntfy priority (#990)
    eventPriority: {
      sectionTitle: 'ntfy 優先度',
      helpNtfy: '有効な各イベントに優先度を選択してください。ntfy はこれを使って通知の挙動（音、表示、プッシュ動作）を切り替えます。ここで設定していないレベルは ntfy サーバーのデフォルトを使用します。',
      min: '最小',
      low: '低',
      default: 'デフォルト',
      high: '高',
      urgent: '緊急',
    },
    cancel: 'キャンセル',
    save: '保存',
    add: '追加',
    nameRequired: '名前は必須です',
    fieldRequired: '{{field}}は必須です',
    haDataInvalid: 'Dataフィールドは有効なJSONオブジェクトである必要があります（例: {"priority": "high", "ttl": 0}）',
    // Config field labels
    phoneNumber: '電話番号',
    apiKey: 'APIキー',
    serverUrl: 'サーバーURL',
    topic: 'トピック',
    authToken: '認証トークン',
    userKey: 'ユーザーキー',
    appToken: 'アプリトークン',
    priority: '優先度',
    pushoverRetry: '緊急再通知 (秒)',
    pushoverExpire: '緊急有効期限 (秒)',
    botToken: 'ボットトークン',
    chatId: 'チャットID',
    telegramThreadId: 'フォーラムトピック ID',
    telegramThreadIdHelp: '任意。フォーラムグループ内の特定のトピックに送信します。トピックリンクの末尾の数字です (t.me/c/.../25)。空欄の場合は General トピックに送信されます。',
    telegramThreadIdInvalid: 'フォーラムトピック ID は数値で入力してください。',
    smtpServer: 'SMTPサーバー',
    smtpPort: 'SMTPポート',
    security: 'セキュリティ',
    authentication: '認証',
    username: 'ユーザー名',
    password: 'パスワード',
    fromEmail: '送信元メール',
    toEmail: '宛先メール',
    webhookUrl: 'WebhookのURL',
    payloadFormat: 'ペイロード形式',
    authorization: '認可',
    titleFieldName: 'タイトルフィールド名',
    messageFieldName: 'メッセージフィールド名',
    // NotificationTemplateEditor
    editTemplate: 'テンプレートを編集: {{name}}',
    titleLabel: 'タイトル',
    bodyLabel: '本文',
    titlePlaceholder: '通知タイトル...',
    bodyPlaceholder: '通知本文...',
    availableVariables: '利用可能な変数',
    clickToInsert: 'クリックして本文のカーソル位置に挿入',
    livePreview: 'ライブプレビュー',
    hide: '非表示',
    show: '表示',
    loadingPreview: 'プレビューを読み込み中...',
    enterTemplateContent: 'テンプレートの内容を入力するとプレビューが表示されます',
    titlePreview: 'タイトル:',
    bodyPreview: '本文:',
    resetToDefault: 'デフォルトにリセット',
    titleRequired: 'タイトルは必須です',
    bodyRequired: '本文は必須です',
    // NotificationLogViewer
    notificationLog: '通知ログ',
    showFailedOnly: '失敗のみ',
    last24Hours: '過去24時間',
    last7Days: '過去7日間',
    last30Days: '過去30日間',
    last90Days: '過去90日間',
    justNow: 'たった今',
    noFailedNotifications: '失敗した通知はありません',
    noNotificationsLogged: '記録された通知はありません',
    unknownProvider: '不明なプロバイダー',
    logTitle: 'タイトル',
    logMessage: 'メッセージ',
    logError: 'エラー',
    logProvider: 'プロバイダー: {{type}}',
    logTime: '時刻: {{time}}',
    refresh: '更新',
    clearOld: '古いものを削除',
    statsSummary: '過去{{days}}日間:',
    statsNotifications: '通知',
    statsSent: '{{count}}件送信',
    statsFailed: '{{count}}件失敗',
    // Event type labels (for log viewer)
    eventTypes: {
      print_start: '印刷開始',
      print_complete: '印刷完了',
      print_failed: '印刷失敗',
      print_stopped: '印刷停止',
      print_progress: '進捗',
      printer_offline: 'プリンターオフライン',
      printer_error: 'プリンターエラー',
      filament_low: 'フィラメント残量低下',
      maintenance_due: 'メンテナンス期限',
      test: 'テスト',
    },
    // User email notification preferences
    userEmail: {
      title: '通知',
      emailNotifications: 'メール通知',
      emailNotificationsDesc: '自分の印刷ジョブに対してメール通知を受け取ります。メールは高度な認証で設定されたSMTP設定を使用して送信されます。',
      sendingTo: '通知の送信先',
      noEmailWarning: 'アカウントにメールアドレスが設定されていません。管理者に連絡して追加してもらってください。',
      printJobNotifications: '印刷ジョブ通知',
      printJobNotificationsDesc: '送信した印刷ジョブのどのイベントでメール通知を送るかを選択します。',
      printJobStarts: '印刷ジョブ開始',
      printJobStartsDesc: '印刷ジョブが開始されたときに通知を受け取る。',
      printJobFinishes: '印刷ジョブ完了',
      printJobFinishesDesc: '印刷ジョブが正常に完了したときに通知を受け取る。',
      printErrors: '印刷エラー',
      printErrorsDesc: '印刷ジョブが失敗またはエラーが発生したときに通知を受け取る。',
      printJobStops: '印刷ジョブ停止',
      printJobStopsDesc: '印刷ジョブがキャンセルまたは停止されたときに通知を受け取る。',
      saveSuccess: '通知設定を保存しました。',
      saveError: '通知設定の保存に失敗しました。',
    },
  },

  // Rich Text Editor
  richTextEditor: {
    bold: '太字',
    italic: '斜体',
    underline: '下線',
    bulletList: '箇条書きリスト',
    numberedList: '番号付きリスト',
    alignLeft: '左揃え',
    alignCenter: '中央揃え',
    alignRight: '右揃え',
    addLink: 'リンクを追加',
    removeLink: 'リンクを削除',
  },

  // External Links
  externalLinks: {
    title: 'サイドバーリンク',
    sidebarLayout: 'サイドバー',
    sidebarLayoutDescription: '組み込みページの表示/非表示を切り替え、外部リンクを追加し、項目をドラッグしてサイドバーナビゲーションを並べ替えます。',
    systemPages: 'Bambuddyページ',
    externalLinks: '外部リンク',
    visibleInSidebar: 'サイドバーに表示',
    hiddenFromSidebar: 'サイドバーで非表示',
    requiredInSidebar: 'サイドバーで必須',
    hidePage: 'ページを非表示',
    showPage: 'ページを表示',
    settingsCannotBeHidden: '設定は非表示にできません',
    noLinksConfigured: '外部リンクが設定されていません',
    deleteLink: 'リンクを削除',
    removeCustomIcon: 'カスタムアイコンを削除',
    openInNewTab: '新しいタブで開く',
    placeholders: {
      linkName: 'マイリンク',
    },
  },

  // Keyboard Shortcuts Modal
  keyboardShortcuts: {
    title: 'キーボードショートカット',
    navigation: 'ナビゲーション',
    archivesSection: 'アーカイブ',
    kProfilesSection: 'Kプロファイル',
    generalSection: '全般',
    shortcuts: {
      goToPrinters: 'プリンターへ移動',
      goToArchives: 'アーカイブへ移動',
      goToQueue: 'キューへ移動',
      goToStats: '統計へ移動',
      goToProfiles: 'クラウドプロファイルへ移動',
      goToSettings: '設定へ移動',
      focusSearch: '検索にフォーカス',
      openUploadModal: 'アップロードモーダルを開く',
      clearSelection: '選択をクリア / 入力をぼかす',
      contextMenu: 'カードのコンテキストメニュー',
      refreshProfiles: 'プロファイルを更新',
      newProfile: '新しいプロファイル',
      exitSelectionMode: '選択モードを終了',
      showHelp: 'このヘルプを表示',
    },
    footer: 'Escキーを押すか外側をクリックして閉じます',
  },

  // Notification Log
  notificationLog: {
    title: '通知ログ',
    events: {
      printStarted: '印刷開始',
      printComplete: '印刷完了',
      printFailed: '印刷失敗',
      printStopped: '印刷停止',
      progress: '進捗',
      printerOffline: 'プリンターオフライン',
      printerError: 'プリンターエラー',
      lowFilament: 'フィラメント残量低下',
      maintenanceDue: 'メンテナンス期限',
      test: 'テスト',
    },
    timeAgo: {
      justNow: 'たった今',
      minutesAgo: '{{minutes}}分前',
      hoursAgo: '{{hours}}時間前',
    },
  },

  // Restore/Backup Modal
  restoreBackup: {
    title: 'バックアップを復元',
    restoring: '復元中...',
    restoreComplete: '復元完了',
    restoreFailed: '復元失敗',
    importSettings: 'バックアップファイルから設定をインポート',
    pleaseWait: 'データの復元中です。しばらくお待ちください',
    clickToSelect: 'クリックしてバックアップファイルを選択（.jsonまたは.zip）',
    howDuplicateHandling: '重複の処理方法:',
    categories: {
      printers: 'プリンター',
      smartPlugs: 'スマートプラグ',
      notificationProviders: '通知プロバイダー',
      filaments: 'フィラメント',
      archives: 'アーカイブ',
      pendingUploads: '保留中のアップロード',
      settingsTemplates: '設定とテンプレート',
    },
    matchingInfo: {
      printers: 'シリアル番号で照合',
      smartPlugs: 'IPアドレスで照合',
      notificationProviders: '名前で照合',
      filaments: '名前+タイプ+ブランドで照合',
      archives: 'コンテンツハッシュで照合',
      pendingUploads: 'ファイル名で照合',
      settingsTemplates: '常に上書き',
    },
    replaceExisting: '既存データを置き換え',
    keepExisting: '既存データを保持',
    replaceDescription: '既に存在するアイテムをバックアップデータで上書き',
    keepDescription: 'まだ存在しないアイテムのみを復元',
    caution: '注意:',
    cautionText: '上書きすると現在の構成がバックアップデータに置き換えられます。セキュリティ上の理由から、プリンターのアクセスコードは上書きされません。',
    itemsRestored: '復元されたアイテム',
    itemsSkipped: 'スキップされたアイテム',
    restored: '復元済み',
    skipped: 'スキップ（既に存在）',
    filesLabel: 'ファイル（3MF、サムネイルなど）',
    newApiKeysGenerated: '新しいAPIキーが生成されました',
    newApiKeysWarning: 'これらのキーは一度だけ表示されます。今すぐコピーしてください！',
    processingBackup: 'バックアップファイルを処理中...',
    noDataFound: 'バックアップファイルに復元するデータが見つかりませんでした。',
    failedToRestore: 'バックアップの復元に失敗しました。ファイル形式を確認してください。',
  },

  // Backup Export Modal
  backupExport: {
    title: 'バックアップをエクスポート',
    selectData: '含めるデータを選択',
    selectAll: 'すべて選択',
    selectNone: 'なし',
    categoryDescriptions: {
      settings: '言語、テーマ、更新設定',
      notifications: 'ntfy、Pushover、Discordなど',
      templates: 'カスタムメッセージテンプレート',
      smartPlugs: 'Tasmotaプラグ設定',
      externalLinks: 'サイドバーの外部サービスへのリンク',
      printers: 'プリンター情報（アクセスコード除外）',
      plateDetection: '空プレート参照画像',
      filaments: 'フィラメントの種類とコスト',
      maintenance: 'カスタムメンテナンススケジュール',
      archives: 'すべての印刷データ+ファイル（3MF、サムネイル、写真）',
      projects: 'プロジェクト、BOMアイテム、添付ファイル',
      pendingUploads: '仮想プリンターアップロード待機中',
      apiKeys: 'Webhook APIキー（インポート時に新しいキーが生成されます）',
    },
    requiresPrinters: 'プリンターを選択する必要があります',
    zipFileWarning: 'ZIPファイルが作成されます。',
    zipFileDescription: 'すべての3MFファイル、サムネイル、タイムラプス、写真が含まれます。これには時間がかかり、大きなファイルになる可能性があります。',
    includeAccessCodes: 'アクセスコードを含める',
    includeAccessCodesDescription: '別のマシンへの転送用',
    includeAccessCodesWarning: 'アクセスコードはプレーンテキストで含まれます。このバックアップファイルを安全に保管してください！',
    categoriesSelected: '{{selectedCount}}カテゴリー選択済み',
  },

  // Pending Uploads Panel
  pendingUploads: {
    placeholders: {
      notes: 'この印刷に関するメモを追加...',
    },
    discardUpload: 'アップロードを破棄',
    archiveAllUploads: 'すべてのアップロードをアーカイブ',
    discardAllUploads: 'すべてのアップロードを破棄',
    archive: 'アーカイブ',
    timeAgo: {
      justNow: 'たった今',
      minutesAgo: '{{minutes}}分前',
      hoursAgo: '{{hours}}時間前',
      daysAgo: '{{days}}日前',
    },
  },

  // API Browser
  apiBrowser: {
    placeholders: {
      requestBody: 'JSONリクエストボディ...',
      searchEndpoints: 'エンドポイントを検索...',
    },
  },

  // Configure AMS Slot Modal
  configureAmsSlot: {
    title: 'AMSスロットの設定',
    slotConfigured: 'スロットを設定しました！',
    configuringSlot: 'スロットを設定中：',
    slotLabel: '{{ams}} スロット {{slot}}',
    searchPresets: 'プリセットを検索...',
    colorPlaceholder: '色名またはHex（例: 茶色、FF8800）',
    clearCustomColor: 'カスタム色をクリア',
    noCloudPresets: 'クラウドプリセットがありません。Bambu Cloudにログインして同期してください。',
    noPresetsAvailable: 'プリセットがありません。Bambu Cloudにログインするか、ローカルプロファイルをインポートしてください。',
    noMatchingPresets: '一致するプリセットが見つかりません。',
    custom: 'カスタム',
    builtin: '内蔵',
    orcaCloud: 'Orca Cloud',
    bambuCloud: 'Bambu Cloud',
    settingsSentToPrinter: '設定をプリンターに送信しました',
    filamentProfile: 'フィラメントプロファイル',
    kProfileLabel: 'Kプロファイル（Pressure Advance）',
    filteringFor: 'フィルター中: {{material}}',
    noKProfile: 'Kプロファイルなし（デフォルト0.020を使用）',
    noMatchingKProfiles: '一致するKプロファイルが見つかりません。デフォルトK=0.020が使用されます。',
    otherKProfiles: 'このプリンターの他のKプロファイル',
    selectFilamentFirst: 'まずフィラメントプロファイルを選択してください',
    kFromCalibration: 'K={{value}}（プリンターキャリブレーションから）',
    customColorLabel: 'カスタム色（オプション）',
    presetColors: '{{name}}の色：',
    showLessColors: '色を減らす',
    showMoreColors: '色をもっと表示',
    clear: 'クリア',
    hexLabel: '16進: #{{hex}}',
    resetting: 'リセット中...',
    resetSlot: 'スロットをリセット',
    cancel: 'キャンセル',
    configuring: '設定中...',
    configureSlot: 'スロットを設定',
  },

  // Git Backup Settings
  githubBackup: {
    title: 'Gitバックアップ',
    history: '履歴',
    downloadBackup: 'バックアップをダウンロード',
    restoreBackup: 'バックアップを復元',
    noBackupsYet: 'バックアップはまだありません',
  },

  // Email Settings
  emailSettings: {
    placeholders: {
      fromName: 'Bambuddy',
    },
  },

  // Tag Management Modal
  tagManagement: {
    searchTags: 'タグを検索...',
    renameTag: 'タグ名を変更',
    deleteTag: 'タグを削除',
  },

  // Notification Template Editor
  notificationTemplates: {
    placeholders: {
      title: '通知タイトル...',
      body: '通知本文...',
    },
  },

  // Batch Tag Modal
  batchTag: {
    placeholders: {
      newTag: '新しいタグを入力...',
    },
  },

  // Photo Gallery Modal
  photoGallery: {
    deletePhoto: '写真を削除',
  },

  // Filament Hover Card
  filamentHoverCard: {
    copySpoolUuid: 'スプールUUIDをコピー',
  },

  // K Profiles View
  kProfilesView: {
    hasNote: 'メモあり',
    copyProfile: 'プロファイルをコピー',
  },

  // Layout/Navigation
  layout: {
    openMenu: 'メニューを開く',
    noPermissionSystemInfo: 'システム情報を表示する権限がありません',
  },

  // Dashboard
  dashboard: {
    dragToReorder: 'ドラッグして並べ替え',
    hideWidget: 'ウィジェットを非表示',
  },

  // Notification Provider Card
  notificationProviderCard: {
    deleteNotificationProvider: '通知プロバイダーを削除',
  },

  // File Manager Modal
  fileManagerModal: {
    closeFileManager: 'ファイルマネージャーを閉じる',
    sortFiles: 'ファイルを並べ替え',
    goToParentFolder: '親フォルダーへ移動',
    threeView: '3Dビュー',
  },

  // Embedded Camera Viewer
  embeddedCameraViewer: {
    refreshStream: 'ストリームを更新',
    close: '閉じる',
    zoomOut: 'ズームアウト',
    resetZoom: 'ズームをリセット',
    zoomIn: 'ズームイン',
    dragToResize: 'ドラッグしてサイズ変更',
  },

  // Timelapse Viewer
  timelapseViewer: {
    skipBack5s: '5秒戻る',
    skipForward5s: '5秒進む',
  },

  // Notification Providers
  notificationProviders: {
    descriptions: {
      email: 'SMTP電子メール通知',
      telegram: 'Telegramボット経由の通知',
      discord: 'Webhookを介してDiscordチャンネルに送信',
      ntfy: '無料でセルフホスト可能なプッシュ通知',
      pushover: 'シンプルで信頼性の高いプッシュ通知',
      callmebot: 'CallMeBot経由の無料WhatsApp通知',
      webhook: '任意のURLへのジェネリックHTTP POST',
    },
  },

  // Log Viewer
  logViewer: {
    searchPlaceholder: 'メッセージまたはロガー名を検索...',
    noLogEntries: 'ログエントリが見つかりません',
  },

  // Switchbar Popover
  switchbarPopover: {
    noSwitchesInSwitchbar: 'スイッチバーにスイッチがありません',
  },

  // Project Page Modal
  projectPageModal: {
    placeholders: {
      title: 'タイトル',
      designer: 'デザイナー',
      license: 'ライセンス',
      description: '説明を入力...',
      profileTitle: 'プロファイルタイトル',
      profileDescription: 'プロファイルの説明...',
    },
  },

  // Spoolman Settings
  spoolmanSettings: {},

  // Time
  time: {
    unknown: '-',
    waiting: '待機中',
    justNow: 'たった今',
    now: '今すぐ',
    minsAgo: '{{count}}分前',
    inMins: 'あと{{count}}分',
    hoursAgo: '{{count}}時間前',
    inHours: 'あと{{count}}時間',
    daysAgo: '{{count}}日前',
    inDays: 'あと{{count}}日',
  },

  // SpoolBuddy Kiosk
  spoolbuddy: {
    nav: {
      dashboard: 'ダッシュボード',
      ams: 'AMS',
      inventory: 'インベントリ',
      writeTag: '書込み',
      settings: '設定',
    },
    status: {
      nfcReady: 'NFC準備完了',
      nfcOff: 'NFCオフ',
      offline: 'オフライン',
      online: 'オンライン',
      noPrinters: 'プリンターなし',
      deviceOffline: 'デバイスオフライン',
      waitingConnection: 'デバイス接続を待っています...',
      systemReady: 'システム準備完了',
      status: 'ステータス',
    },
    dashboard: {
      readyToScan: 'スキャン準備完了',
      idleMessage: 'スプールを計量台に置いて識別します',
      nfcHint: 'NFCタグは自動的に読み取られます',
      device: 'デバイス',
      syncWeight: '重量同期',
      weightSynced: '同期完了！',
      unknownTag: '不明なタグ',
      newTag: '新しいタグを検出',
      onScale: '計量中',
      linkSpool: 'スプールにリンク',
      linkTagTitle: 'タグをスプールにリンク',
      linkTag: 'タグをリンク',
      selectSpool: 'このタグにリンクするスプールを選択:',
      noUntagged: 'タグなしのスプールが見つかりません',
      tagDetected: 'タグ検出',
      noTag: 'タグなし',
      tagId: 'タグ',
      grossWeight: '総重量',
      spoolSize: 'スプールサイズ',
      close: '閉じる',
      currentSpool: '現在のスプール',
      plateReady: 'プレート準備完了: {{name}}',
      plateReadyLabel: '片付け待ちプレート',
      plateClearAction: '片付け',
      plateClearedToast: 'プレートを片付け済みにしました',
      plateClearFailed: 'プレートを片付け済みにできませんでした',
    },
    modal: {
      spoolDetected: 'スプール検出',
      assignToAms: 'AMSに割り当て',
      syncWeight: '重量同期',
      weightSynced: '同期完了！',
      syncing: '同期中...',
      newTagDetected: '新しいタグを検出',
      addToInventory: 'インベントリに追加',
      assignToAmsTitle: 'AMSに割り当て',
      selectSlot: 'スロットを選択',
      assign: '割り当て',
      assigning: '割り当て中...',
      assignSuccess: '割り当て完了！',
      assignPendingInsert: '割り当てました。スプールを挿入したときにスロットが設定されます。',
      assignError: 'スプールの割り当てに失敗しました。再試行してください。',
      noPrinterSelected: 'プリンターを選択...',
      noAmsDetected: 'このプリンターにAMSが検出されません',
      slot: 'スロット',
    },
    weight: {
      noReading: '読み取りなし',
      stable: '安定',
      measuring: '計測中...',
      tare: '風袋引き',
      calibrate: 'キャリブレーション',
    },
    spool: {
      remaining: '残量',
      material: '素材',
      brand: 'ブランド',
      color: '色',
      coreWeight: 'コア',
      labelWeight: 'ラベル',
      scaleWeight: '計量',
      netWeight: '正味',
      lastUsed: '最終使用',
    },
    ams: {
      noData: 'AMSが検出されません',
      connectAms: 'AMSを接続してスロットを表示',
      noPrinter: 'プリンター未選択',
      selectPrinter: '上部バーからプリンターを選択',
      printerDisconnected: 'プリンター切断',
      humidity: '湿度',
      level: 'レベル',
      active: 'アクティブ',
      slot: 'スロット',
      empty: '空',
    },
    inventory: {
      search: 'スプールを検索...',
      empty: 'インベントリにスプールがありません',
      noResults: '一致するスプールがありません',
      spools: 'スプール',
      addSpool: 'スプール追加',
    },
    settings: {
      // Tabs
      tabDevice: 'デバイス',
      tabDisplay: 'ディスプレイ',
      tabScale: '計量',
      tabUpdates: 'アップデート',
      // Device tab
      nfcReader: 'NFCリーダー',
      type: 'タイプ',
      connection: '接続',
      notConnected: '該当なし',
      deviceInfo: 'デバイス情報',
      hostname: 'ホスト',
      uptime: '稼働時間',
      // Display tab
      brightness: '明るさ',
      saved: '保存済み',
      noBacklight: 'DSIバックライトが検出されませんでした。明るさ制御にはDSIディスプレイが必要です。',
      screenBlank: '画面オフタイムアウト',
      screenBlankDesc: '操作がないと画面がオフになります。タッチで復帰。',
      displayNote: '明るさはソフトウェアフィルターとして適用されます。',
      // Scale tab
      scaleCalibration: '計量キャリブレーション',
      currentWeight: '現在の重量',
      tareOffset: '風袋',
      calFactor: '係数',
      knownWeight: '既知の重量',
      calStep1: '計量台からすべてのアイテムを取り除き、ゼロ設定を押してください。',
      calStep2: '既知の重量を計量台に置いてください。',
      setZero: 'ゼロ設定',
      calibrateNow: 'キャリブレーション',
      calibrated: 'キャリブレーション済み',
      tareSet: '風袋コマンドを送信しました。デバイスを待っています...',
      tareComplete: '風袋が完了しました！',
      tareTimedOut: '風袋がタイムアウトしました — SpoolBuddy デーモンは起動していますか？',
      tareFailed: '風袋コマンドの送信に失敗しました',
      zeroSet: 'ゼロ点を設定しました。既知の重量を計量台に置いてください。',
      calibrationDone: 'キャリブレーション完了！',
      calibrationFailed: 'キャリブレーションに失敗しました',
      lastCalibrated: '最終キャリブレーション',
      stable: '安定',
      settling: '安定化中...',
      firmware: 'ファームウェア',
      scale: '計量',
      noDevice: 'SpoolBuddyデバイスが見つかりません',
      // Updates tab
      daemonVersion: 'デーモンバージョン',
      currentVersion: '現在',
      versionPending: 'デーモンを待っています...',
      checking: '確認中...',
      checkUpdates: 'アップデートを確認',
      updateAvailable: 'アップデートあり',
      updateInstructions: 'SSH経由で更新：SpoolBuddyインストールスクリプトを実行してください。',
      upToDate: '最新です',
      includeBeta: 'ベータ版を含む',
      systemConfig: 'バックエンドと認証',
      backendUrl: 'BambuddyバックエンドURL',
      apiToken: 'APIトークン',
      apiTokenPlaceholder: 'APIトークンを入力',
      saveConfig: '設定を保存',
      systemQueued: '設定をキューに追加しました。',
      systemFieldsRequired: 'バックエンドURLは必須です。',
      nfcDiagnostic: 'NFC診断',
      scaleDiagnostic: 'スケール診断',
      readTagDiagnostic: 'タグ読み取り診断',
      testNfc: 'リーダーをテスト',
      testScale: '精度をテスト',
      testReadTag: 'タグを読み取り',
    },
    writeTag: {
      tabExisting: '既存のスプール',
      tabNew: '新規スプール',
      tabReplace: 'タグ交換',
      searchPlaceholder: '素材、色、ブランドで検索...',
      noUntaggedSpools: 'タグなしのスプールがありません',
      noTaggedSpools: 'タグ付きのスプールがありません',
      selectSpool: 'スプールを選択し、NTAGをリーダーに置いてください',
      placeTag: 'NTAGをリーダーに置いてください',
      tagReady: 'タグ検出 — 書込み準備完了',
      writeTag: 'タグ書込み',
      replaceTag: 'タグ交換',
      writing: 'タグ書込み中...',
      waiting: 'SpoolBuddyを待機中...',
      writeSuccess: 'タグの書込みが完了しました！',
      writeFailed: '書込み失敗',
      queueFailed: '書込みコマンドのキューに失敗しました',
      tryAgain: '再試行',
      cancel: 'キャンセル',
      replaceWarning: '古いタグのリンクが解除され、新しいタグに置き換わります。',
      deviceOffline: 'SpoolBuddyはオフラインです',
      material: '素材',
      colorName: '色名',
      color: '色',
      brand: 'ブランド',
      weight: '重量 (g)',
      createSpool: 'スプール作成',
      creating: '作成中...',
      spoolCreated: 'スプール作成完了！書込み準備ができました。',
      createFailed: 'スプールの作成に失敗しました',
      incompleteDataWarning: '不完全なSpoolmanデータでタグを書き込みました',
    },
    quickMenu: {
      printerPower: 'プリンター電源',
      systemControls: 'システム',
      restartDaemon: 'デーモン再起動',
      restartBrowser: 'ブラウザ再起動',
      reboot: '再起動',
      shutdown: 'シャットダウン',
      swipeToClose: '下にスワイプして閉じる',
      confirmTitle: '確認',
      confirmShutdown: 'SpoolBuddyをシャットダウンしますか？再起動するには物理的なアクセスが必要です。',
      confirmReboot: 'SpoolBuddyを再起動しますか？',
      confirmRestartDaemon: 'SpoolBuddyデーモンを再起動しますか？NFCとスケールが一時的に使用できなくなります。',
      confirmRestartBrowser: 'キオスクブラウザを再起動しますか？画面が一時的に暗くなります。',
      confirm: '確認',
      confirmPlugOn: '{{name}}をオンにしますか？',
      confirmPlugOff: '{{name}}をオフにしますか？',
      turnOn: 'オン',
      turnOff: 'オフ',
    },
  },

  diagnostic: {
    modalTitle: '接続診断 — {{name}}',
    running: '診断を実行中...',
    runningElapsed: '診断を実行中... ({{elapsed}}秒)',
    waitingForReportHint: 'プリンターがステータスレポートを送信するのを待っています — 最大 {{max}} 秒かかる場合があります。',
    runFailed: '診断を実行できませんでした: {{error}}',
    retry: '再実行',
    runButton: '診断を実行',
    sectionTitle: '接続診断',
    sectionDescription: 'プリンターが接続できない、または印刷できない原因を確認します — ポートの到達性、LAN開発者モード、Dockerネットワークモード、認証情報。',
    noPrinters: 'プリンターが設定されていません。',
    overall: {
      ok: '問題は見つかりませんでした — プリンター接続は正常のようです。',
      warnings: 'プリンターは動作するはずですが、いくつかの点に注意が必要です。',
      problems: 'プリンターが接続できない、または印刷できない原因となる問題が見つかりました。',
    },
    check: {
      port_mqtt: {
        title: '制御ポート (MQTT 8883)',
        pass: '到達可能 — プリンターは制御接続を受け付けています。',
        fail: 'ポート8883に到達できません。プリンターの電源が切れている、IPアドレスが異なる、またはファイアウォールがブロックしています。プリンターのIPと、ポート8883が何にもブロックされていないことを確認してください。',
      },
      port_ftps: {
        title: 'ファイル転送ポート (FTPS 990)',
        pass: '到達可能 — 印刷ファイルの送信は機能します。',
        warn: 'ポート990に到達できません。監視は引き続き機能する場合がありますが、プリンターへの印刷送信は失敗します。ポート990がブロックされていないことを確認してください。',
        warn_no_tls: 'ポート990は開いていますが、プリンターのファイルサービスがTLSハンドシェイクを完了しません。印刷ファイル、サムネイル、タイムラプスを取得できないため、アーカイブは空のままになります。プリンターを再起動してください — ポートのブロックを解除しても解決しません。',
      },
      external_storage: {
        title: '送信ファイルを外部ストレージに保存 (インストール手順4)',
        pass: 'プリンターはこのオプションが有効と報告しています — 送信されたファイルはSDカードに保存され、アーカイブにはサムネイルとスライサーメタデータが含まれます。',
        fail: 'プリンターはこのオプションが無効と報告しています。「送信ファイルを外部ストレージに保存」を有効にしてください — 新しいファームウェア (P2S 01.02 / Bambu Studio 2.6以降) ではプリンター本体の印刷設定にトグルがあります。古いバージョンでは Bambu Studio / OrcaSlicer のデバイスタブにあります。この設定がないと、アーカイブされた印刷にはサムネイルもスライサーメタデータも残りません。',
        skip: '未確認 — アクティブなMQTT接続が必要です。古いスライサーでこの設定がスライサー側のみに存在する場合、プリンターはそれを報告しないため、オプションが無効でもこのチェックは通過します — インストール手順4を手動で確認してください。',
        skip_unsupported_model: 'このモデルにはSDスロットがありますが、オプションを有効にする方法がありません — 現在のP1シリーズのファームウェアはBambu Studioにトグルを表示せず、プリンターに画面もありません。ここで修正すべきことはありません。Bambu Labがファームウェアで対応するまで、アーカイブされた印刷にはサムネイルやスライサーのメタデータが欠ける場合があります。',
        fail_no_media: 'オプションは有効ですが、プリンターのスロットにカードもUSBメモリも検出されないため、送信ファイルの保存先がありません。挿入して再度印刷してください。それまでアーカイブされる印刷にはサムネイルとスライサーメタデータがありません。',
        warn_internal_storage: 'オプションは有効でストレージも装着されていますが、このプリンターは直近の印刷をBambuddyが読み取れない内部ストレージに保存しました。H2シリーズとP2Sのファームウェアはこの動作をし、どの設定でも変わりません。印刷は名前と時間付きでアーカイブされますが、サムネイルとスライサーメタデータはありません。',
      },
      port_rtsps: {
        title: 'カメラポート ({{protocol}} {{port}})',
        pass: '到達可能 — カメラストリームは機能します。',
        warn: 'ポート{{port}}に到達できません。ライブカメラ表示は機能しません。これは印刷には影響しません。',
      },
      network_mode: {
        title: 'Dockerネットワークモード',
        pass: 'ホストネットワークモードで実行中です。',
        warn: 'BambuddyはDockerブリッジネットワークで実行されています。プリンター検出と仮想プリンターにはホストネットワークモードが必要です — "network_mode: host" でコンテナを再作成してください。',
        skip: 'Dockerで実行されていません — 該当しません。',
      },
      subnet: {
        title: 'ネットワークサブネット',
        pass: 'プリンターとBambuddyは同じサブネットにあります。',
        warn: 'プリンター ({{printer_ip}}) とBambuddy ({{host_ip}}) は異なるサブネットにあります。サブネット間のルーティングが設定されていない限り、互いに到達できない可能性があります。',
        skip: 'サブネットを判定できませんでした — スキップしました。',
      },
      mqtt_auth: {
        title: 'プリンター認証情報',
        pass: 'プリンターが接続を受け入れました。',
        fail: 'プリンターには到達できますが、Bambuddy は接続されていません。アクセスコードまたはシリアル番号が間違っている可能性が高いです — アクセスコードは LAN のみモードや開発者モードを切り替えるたびに変わるため、プリンター画面から再度コピーしてください。再起動中のプリンターや、同時接続数の上限に達しているプリンターでも同じ表示になります。',
        fail_auth_rejected: 'プリンターが Bambuddy の認証情報を拒否しました。アクセスコードまたはシリアル番号が間違っています — アクセスコードは LAN のみモードや開発者モードを切り替えるたびに変わります。プリンター画面から再度コピーし、プリンター設定に保存してください。',
        skip: '未確認 — プリンターに到達できませんでした。',
      },
      developer_mode: {
        title: 'LAN開発者モード',
        pass: '開発者モードは有効です。',
        fail: 'プリンターの開発者モードがオフです。プリンターのLAN設定で有効にし、OKで確定してください。これがないと印刷は開始されません。',
        skip: '確認できませんでした — プリンターへのアクティブな接続が必要です。',
      },
      printer_publishing: {
        title: 'プリンターがステータスを送信中',
        pass: 'プリンターはステータス更新を送信しています — AMS、フィラメント、Kプロファイルがスライサーに正しくミラーされます。',
        fail: 'MQTTブローカーは接続を受け付けましたが、プリンターはステータスレポートを一切送信していません。ほぼ常にシリアル番号の誤りまたは大文字小文字の不一致が原因です — device/<serial>/report トピックは大文字小文字を区別します。プリンター設定のシリアル番号をプリンター本体の画面表示と照合してください。',
        skip: '確認できませんでした — プリンターへのアクティブな接続が必要です。',
      },
    },
  },

  systemHealth: {
    sectionTitle: 'システムの状態',
    sectionDescription: '最近のログから既知の問題を検出します。サポートに問い合わせる前に、多くは自分で解決できます。',
    rescan: '再スキャン',
    clean: '直近 {{times}} 件のログに既知の問題は見つかりませんでした。',
    logUnavailable: 'ファイルへのログ記録が無効になっているため、ログをスキャンできません。このチェックを使うにはファイルログを有効にしてください。',
    learnMore: '対処方法',
    fixLabel: '対処:',
    occurrences: '{{times}} 回発生 — 最終 {{lastSeen}}',
    category: {
      layer8: '自分で解決できます',
      environment: '環境',
      bug: '報告してください',
    },
    signature: {
      'ftp-auth-rejected': {
        name: 'プリンターがアクセスコードを拒否しました',
        cause: 'プリンターがファイル転送のログインを拒否しました。アクセスコードが間違っているか、開発者モードの切り替え後に変更されています。',
        fix: 'プリンター画面（LAN設定）からアクセスコードをコピーし直し、Bambuddy のプリンター設定で更新してください。',
      },
      'ftp-connection-timeout': {
        name: 'ファイル転送の接続がタイムアウトしました',
        cause: 'Bambuddy がプリンターのファイル転送ポート（FTPS 990）に到達できませんでした。ポートがブロックされているか、プリンターの電源が切れているか、別のサブネットにあります。',
        fix: 'Bambuddy とプリンターの間でポート 990 がブロックされていないこと、両者が同じネットワークにあることを確認してください。',
      },
      'ftp-ssl-error': {
        name: 'セキュアなファイル転送のハンドシェイクに失敗しました',
        cause: 'プリンターのファイルサービスがポート 990 で TLS を使わずに応答しました。プリンター側のファイルサーバーがハングした状態で、ファイアウォールやファームウェアの問題ではありません。',
        fix: 'プリンターを再起動してください。それまで印刷ファイル・サムネイル・タイムラプスは取得できませんが、印刷自体には影響ありません。',
      },
      'bambu-cloud-captcha': {
        name: 'Bambu Cloud が CAPTCHA を要求しています',
        cause: 'Bambu の不正利用対策がこのネットワークを検証しているため、Bambu Cloud へのサインインを完了できません。アカウントやこのインストール環境ではなく、グローバル IP アドレスに紐づいた制限です。',
        fix: '待つのが基本です。通常は数時間で解除され、サインインを繰り返すと長引きます。それまでは、ブラウザーのセッションから取得したアクセストークンでサインインしてください。',
      },
      'mqtt-connection-flapping': {
        name: 'プリンター接続が繰り返し切断されます',
        cause: '制御接続（MQTT 8883）が切断と再接続を繰り返しています。通常はネットワークが弱いか、ポートが部分的にブロックされていることが原因です。',
        fix: 'プリンター付近の Wi-Fi 信号を確認し、できれば有線接続を使用し、ポート 8883 が安定して到達できることを確認してください。',
      },
      'camera-connection-refused': {
        name: 'カメラ映像に接続できません',
        cause: 'ポート RTSPS 322 でライブカメラに到達できませんでした。ポートがブロックされているか、プリンターのカメラまたは LAN ライブビューが無効になっています。',
        fix: 'プリンターのカメラと LAN ライブビューを有効にし、ポート 322 がブロックされていないか確認してください。これは印刷には影響しません。',
      },
      'database-locked': {
        name: 'データベースの書き込み競合',
        cause: '負荷時に SQLite データベースで "database is locked" エラーが発生しています。複数のプリンターを同時に使用する場合によく起こります。',
        fix: 'Bambuddy を外部の PostgreSQL データベースに切り替えてください。ドキュメントの PostgreSQL ガイドを参照してください。',
      },
    },
  },

  vpDiagnostic: {
    title: 'セットアップチェック — {{name}}',
    runButton: 'セットアップチェックを実行',
    running: 'セットアップチェックを実行中...',
    runFailed: 'セットアップチェックを実行できませんでした: {{error}}',
    retry: '再実行',
    overall: {
      ok: 'すべてのチェックに合格しました — この仮想プリンターは正しく設定されています。',
      warnings: '仮想プリンターは動作するはずですが、いくつかの点に注意が必要です。',
      problems: 'スライサーがこの仮想プリンターを認識または使用できない理由となる問題が見つかりました。',
    },
    check: {
      enabled: {
        title: '仮想プリンターが有効',
        fail: 'この仮想プリンターはオフです。検出可能にするにはオンに切り替えてください。',
      },
      running: {
        title: 'サービスが稼働中',
        fail: '仮想プリンターは有効ですが、サービスが稼働していません。Bambuddy のログを確認してください — 通常はバインド IP の競合または権限エラーが原因で停止します。',
      },
      bind_interface: {
        title: 'バインドネットワークインターフェース',
        fail: 'バインドインターフェースが設定されていないか、このホストに存在しなくなっています。「バインドインターフェース」のドロップダウンから現在のインターフェースを選択してください。',
      },
      access_code: {
        title: 'アクセスコードが設定済み',
        fail: 'アクセスコードが設定されていません。ここで設定したものと同じ 8 文字のアクセスコードをスライサーに入力する必要があります。',
      },
      target_printer: {
        title: 'ターゲットプリンター',
        fail: 'ターゲットプリンターが選択されていません。プロキシモードには転送先となる実際のプリンターが必要です。',
        warn: 'ターゲットプリンターは現在オフラインです — 再接続されると転送が再開されます。',
      },
      port_ftps: {
        title: 'ファイルアップロードサービス（ポート {{port}}）',
        fail: 'バインド IP のポート {{port}} で待ち受けているものがないため、スライサーはファイルをアップロードできません。通常はこのインターフェースでのポート競合が原因です。',
      },
      port_mqtt: {
        title: '制御サービス（ポート {{port}}）',
        fail: 'バインド IP のポート {{port}} で待ち受けているものがないため、スライサーは接続もステータス表示もできません。',
      },
      port_bind: {
        title: '検出サービス（ポート {{port}}）',
        fail: 'バインド IP のポート {{port}} で待ち受けているものがないため、スライサーの検出ハンドシェイクが失敗します。',
      },
      privileged_ports: {
        title: '特権ポートへのバインド',
        fail: 'ポート {{port}} は 1024 未満で、このサービスにはバインドする権限がありません。上で何も待ち受けていないのはこのためです。/etc/systemd/system/bambuddy.service に AmbientCapabilities=CAP_NET_BIND_SERVICE を追加して再起動するか、"sudo setcap cap_net_bind_service=+ep $(readlink -f $(which python3))" を実行してください。Docker の場合は cap_add: [NET_BIND_SERVICE] を追加します。',
      },
      certificate: {
        title: 'TLS 証明書',
        pass: '証明書の準備ができています。Bambuddy CA 証明書（上記）がスライサーの信頼ストアにインポートされていることを確認してください。',
        fail: 'この仮想プリンターの TLS 証明書がありません。Bambuddy のデータディレクトリが書き込み可能か確認してください。',
      },
    },
  },

  bugReport: {
    logHealthSummary: 'ログから既知の問題が見つかりました',
    logHealthIntro: '最近のログが既知の問題と一致しています。下記の対処方法をご確認ください。解決すればバグ報告なしで問題が解消する可能性があります。下からバグ報告を送ることもできます。',
    title: 'バグを報告',
    description: '説明',
    descriptionPlaceholder: '何が問題でしたか？問題を説明してください...',
    email: 'メールアドレス（任意）',
    emailPlaceholder: 'your@email.com',
    emailPrivacy: '入力された場合、メールアドレスはGitHub Issueの折りたたみセクションに含まれ、メンテナーがフォローアップできるようになります。',
    screenshot: 'スクリーンショット',
    uploadOrPaste: '画像をアップロード、貼り付け、またはドラッグ',
    dataCollectedSummary: 'レポートに含まれるデータは？',
    dataIncluded: '含まれるもの:',
    dataIncludedList: 'アプリバージョン、OS、アーキテクチャ、Pythonバージョン、データベース統計（件数のみ）、プリンターモデル、ノズル数、ファームウェアバージョン、接続状態、統合状態（Spoolman、MQTT、HA）、非機密設定、ネットワークインターフェース数、Docker詳細、依存関係バージョン。',
    dataNeverIncluded: '含まれないもの:',
    dataNeverIncludedList: 'プリンター名、シリアル番号、アクセスコード、パスワード、IPアドレス、メールアドレス、APIキー、トークン、Webhook URL、ホスト名、ユーザー名。',
    submit: '送信',
    startLogging: 'デバッグログ開始',
    stepEnableLogging: 'デバッグログ有効',
    stepReproduce: '問題を再現してください',
    stepStopLogging: '停止してレポート送信',
    stopAndSubmit: '停止して送信',
    maxDuration: '{{minutes}}分後に自動停止',
    stoppingLogs: 'ログ収集・送信中...',
    submitting: 'バグレポートを送信中...',
    submittingStepConnection: 'プリンターの接続確認を実行中',
    submittingStepVirtualPrinters: '仮想プリンターのセットアップ確認を実行中',
    submittingStepLogScan: '最近のログから既知の問題をスキャン中',
    submittingStepSubmit: 'GitHub にレポートを送信中',
    submitSuccess: 'バグレポートが正常に送信されました！',
    submitFailed: 'バグレポートの送信に失敗しました',
    diagnosticChecking: 'プリンター接続を確認中...',
    diagnosticHealthy: '接続チェックに合格しました — プリンターに問題は見つかりませんでした。',
    diagnosticSummary: '{{total}} 台中 {{problems}} 台のプリンターに接続の問題があります',
    diagnosticIntro: '1 台以上のプリンターに接続の問題があり、それが今回の問題の原因である可能性があります。下記のプリンターを展開して対処法を確認してください — それを解決すれば、バグ報告なしで問題が解決するかもしれません。下記から報告を送信することもできます。',
    thankYou: 'ありがとうございます！',
    submitted: 'バグレポートが送信されました。',
    viewIssue: 'Issueを表示',
    unexpectedError: '予期しないエラーが発生しました',
  },
  failureDetection: {
    title: 'AI 失敗検出',
    description: 'セルフホストされた Obico ML API で印刷を監視し、検出された失敗に自動的に対応します。',
    mlUrl: 'Obico ML API の URL',
    mlUrlHint: 'セルフホストした Obico ml_api コンテナのベース URL (例: http://192.168.1.10:3333)。',
    mlToken: 'ML API トークン（任意）',
    mlTokenPlaceholder: 'サーバーが ML_API_TOKEN なしで動作している場合は空のままにします',
    mlTokenHint: 'Obico ml_api コンテナの環境変数 ML_API_TOKEN と一致させる必要があります。コンテナがトークンなしで動作している場合は空のままにしてください。',
    test: 'テスト',
    testSuccess: 'ML API に接続でき、正常です。',
    testSuccessTokenUnknown: 'ML API に接続でき、正常です。トークンは確認できませんでした。',
    testFailed: 'ML API に接続できませんでした。',
    sensitivity: '感度',
    sensitivityLow: '低(誤検出が少ない)',
    sensitivityMedium: '中(バランス型)',
    sensitivityHigh: '高(早期検出、誤検出が増加)',
    sensitivityHint: '警告と失敗をトリガーする信頼度のしきい値を調整します。',
    action: '失敗検出時の動作',
    actionNotify: '通知のみ',
    actionPause: '印刷を一時停止',
    actionPauseOff: '一時停止して電源を切る',
    pollInterval: 'ポーリング間隔(秒)',
    pollIntervalHint: '印刷中に各プリンターをチェックする頻度。最小 5 秒、最大 120 秒。',
    externalUrlMissing: '外部URLが設定されていません。',
    externalUrlHint: 'ML APIはURLでカメラスナップショットを取得します。MLAPIコンテナがBambuddyに到達できるよう、一般設定で外部URLを設定してください。',
    perPrinterTitle: '監視対象プリンター',
    perPrinterHint: '検出サービスが監視するプリンターを選択します。',
    monitorAll: '接続されているすべてのプリンターを監視',
    statusTitle: 'ステータス',
    serviceRunning: 'サービス稼働中',
    thresholds: '低 / 高しきい値',
    activePrinters: 'アクティブな印刷',
    noActivePrints: '現在、実行中の印刷はありません。',
    historyTitle: '最近の検出',
    noHistory: 'まだ検出はありません。',
  },
  makerworld: {
    title: 'MakerWorld',
    description: 'MakerWorld モデルの URL を貼り付けると、Bambu Handy アプリを開かなくても Bambuddy から直接インポート・印刷できます。',
    pasteUrlHeader: 'MakerWorld からインポート',
    pasteUrlPlaceholder: 'https://makerworld.com/en/models/… または任意の MakerWorld リンク',
    resolveButton: '読み込む',
    signInRequiredTitle: 'ダウンロードには Bambu Cloud へのサインインが必要です',
    signInRequiredBody: 'モデルの詳細は匿名で閲覧できますが、3MF ファイルをダウンロードするには Bambu Cloud アカウントが必要です。',
    signInExpiredTitle: 'Bambu Cloud のサインインの有効期限が切れました',
    signInExpiredBody: 'Bambuddy にはサインインしたままですが、Bambu Lab が保存されたトークンを受け付けなくなったため、ダウンロードは失敗します。Bambu Cloud に再度サインインしてください。',
    openCloudSettings: 'Cloud 設定を開く',
    untitledModel: '無題のモデル',
    byCreator: '作成者: {{name}}',
    downloadsCount: 'ダウンロード数: {{count}}',
    licensePrefix: 'ライセンス',
    alreadyImported: 'ライブラリに登録済み',
    openOnMakerworld: 'MakerWorld で開く',
    alreadyInLibrary: 'このモデルはすでにライブラリにあります — ファイルマネージャー → MakerWorld で確認できます',
    importSuccess: '{{filename}} をインポートしました — ファイルマネージャー → MakerWorld に保存済み',
    platesHeader: 'プレート ({{count}})',
    plateDefaultName: 'プレート {{n}}',
    materialCount: 'フィラメント {{count}} 本',
    amsRequired: 'AMS が必要',
    slicedFor: '{{printer}}用にスライス済み',
    alsoCompatible: '互換性ありとも記録: {{printers}}',
    importToLibrary: '保存',
    sliceIn: '保存して {{slicer}} でスライス',
    disclaimer: 'MakerWorld 連携はコミュニティで文書化された API エンドポイントを使用しています。Bambuddy は MakerWorld または Bambu Lab との提携・承認関係はありません。',
    lastImportSuccess: 'ライブラリにインポートしました',
    lastImportAlreadyInLibrary: '既にライブラリに存在します',
    viewInLibrary: 'ファイルマネージャーで表示',
    openInBambuStudio: 'Bambu Studio で開く',
    openInOrcaSlicer: 'OrcaSlicer で開く',
    importTo: 'ファイルマネージャーへのインポート先',
    recentImportsHeader: '最近のインポート',
    phaseResolving: '解決中',
    phaseDownloading: 'ダウンロード中',
    folderAuto: 'MakerWorld (デフォルト)',
    importAll: 'すべてインポート',
    importAllProgress: 'インポート中 {{current}}/{{total}}',
    openGallery: '画像ギャラリーを開く',
    galleryPrev: '前の画像',
    galleryNext: '次の画像',
    deleteImport: 'ライブラリから削除',
    importDeleting: '削除中…',
    importDeleted: 'ライブラリから削除しました',
    confirmDelete: '{{filename}} をライブラリから削除しますか？ローカルファイルは削除されますが、MakerWorld から再インポートできます。',
    errors: {
      resolveFailed: 'この MakerWorld URL を解決できませんでした。',
      downloadFailed: 'ダウンロードに失敗しました。もう一度お試しください。',
      deleteFailed: 'ライブラリからファイルを削除できませんでした。',
    },
  },
  gcodeViewer: {
    filamentSlot: 'フィラメント {{n}}',
    loading: 'ツールパスを読み込んでいます…',
    loadFailed: 'このファイルの G コードを読み込めませんでした。',
    showTravel: '移動（非押出）',
    topLayer: '上端レイヤー',
    bottomLayer: '下端レイヤー',
    noSource: 'プレビューするファイルが指定されていません。',
    view: {
      filament: 'フィラメント',
      feature: '種別',
      height: '高さ',
      width: '幅',
    },
    feature: {
      wall: '壁',
      sparseInfill: '疎インフィル',
      solidInfill: 'ソリッドインフィル',
      bridge: 'ブリッジ／オーバーハング',
      support: 'サポート',
      skirt: 'スカート／ブリム',
      gapFill: 'ギャップ充填',
      ironing: 'アイロン',
      primeTower: 'プライムタワー',
    },
    back: '戻る',
    backToArchives: '印刷アーカイブに戻る',
    backToFiles: 'ファイル管理に戻る',
    plates: 'プレート',
    plateN: 'プレート {{n}}',
  },
  libraryTrash: {
    title: 'ゴミ箱',
    headerButton: 'ゴミ箱',
    headerTooltip: 'ゴミ箱に移動したファイルを表示',
    backToFiles: 'ファイルマネージャーに戻る',
    subtitleAdmin: '削除されたファイルは {{days}} 日間ゴミ箱に残り、その後自動的に削除されます。このビューには全ユーザーのゴミ箱が表示されます。',
    subtitleUser: '削除されたファイルは {{days}} 日間ゴミ箱に残り、その後自動的に削除されます。',
    loading: 'ゴミ箱を読み込み中…',
    loadError: 'ゴミ箱を読み込めませんでした。',
    empty: 'ゴミ箱は空です。',
    summary: '{{count}} 件 · {{size}}',
    emptyTrash: 'ゴミ箱を空にする',
    restore: '復元',
    purgeNow: '今すぐ削除',
    autoPurgeIn: '{{when}} に自動削除',
    days: '日',
    retentionLabel: '自動削除までの期間',
    selectAll: 'すべて選択',
    selectOne: '{{filename}} を選択',
    selectionCount: '{{count}} 件選択中',
    bulkRestore: '選択したものを復元',
    bulkPurge: '選択したものを削除',
    col: {
      filename: 'ファイル',
      folder: 'フォルダ',
      size: 'サイズ',
      deleted: 'ゴミ箱に移動',
      autoPurge: '自動削除',
      owner: '所有者',
      actions: '操作',
    },
    confirm: {
      purgeTitle: '完全に削除しますか？',
      purgeBody: '{{filename}} はディスクから削除され、復元できません。',
      emptyTitle: 'ゴミ箱を空にしますか？',
      emptyBody: '{{count}} 件のファイルすべてがディスクから削除されます。この操作は取り消せません。',
      bulkPurgeTitle: '選択したファイルを完全に削除しますか？',
      bulkPurgeBody: '選択した {{count}} 件のファイルがディスクから削除され、復元できません。',
      cta: '完全に削除',
    },
    toast: {
      restored: 'ファイルを復元しました。',
      restoreFailed: 'ファイルを復元できませんでした。',
      purged: 'ファイルを完全に削除しました。',
      purgeFailed: 'ファイルを削除できませんでした。',
      emptied: 'ゴミ箱から {{count}} 件のファイルを削除しました。',
      emptyFailed: 'ゴミ箱を空にできませんでした。',
      retentionSaved: '自動削除を {{days}} 日に設定しました。',
      retentionFailed: '保持期間の設定を保存できませんでした。',
      bulkRestored: '{{count}} 件のファイルを復元しました。',
      bulkPurged: '{{count}} 件のファイルを削除しました。',
    },
  },
  libraryPurge: {
    title: '古いファイルを一括削除',
    headerButton: '古いファイル削除',
    headerTooltip: '古いファイルをまとめてゴミ箱に移動',
    description: '指定した期間より古いファイルはゴミ箱に移動されます。外部フォルダはスキップされます。自動削除までの間、ゴミ箱から復元できます。',
    ageLabel: '次より古いファイルを移動',
    days: '日',
    includeNeverPrinted: '一度も印刷していないファイルも含める',
    effectsTitle: '「削除」をクリックすると何が起こるか',
    effect1: '一致するファイルはゴミ箱に移動されます。ディスクからはまだ削除されません。',
    effect2: '保持期間が過ぎるまで、いつでもゴミ箱から復元できます。',
    effect3: '保持期間が過ぎると、ゴミ箱クリーナーがディスクから完全に削除します。',
    effect4: '外部（リンク済み）フォルダー内のファイルはスキップされます — Bambuddyは所有していないバイトを削除しません。',    previewLoading: '対象ファイル数を確認中…',
    previewFailed: 'プレビューを取得できませんでした。',
    previewSummary: '{{count}} 件 · {{size}} がゴミ箱に移動されます',
    andMore: '…ほか {{count}} 件',
    warning: 'ファイルはソフト削除されます — 保持期間が終了するまでゴミ箱から復元できます。',
    confirmCta: '{{count}} 件をゴミ箱へ移動',
    purging: 'ゴミ箱へ移動中…',
    toast: {
      success: '{{count}} 件のファイルをゴミ箱に移動しました。',
      failed: 'ファイルを削除できませんでした。',
    },
  },
  libraryAutoPurge: {
    enableLabel: '古いファイルを自動で一括削除',
    enableDescription: '管理者の一括削除を 1 日 1 回実行します。ファイルはまずゴミ箱に移動され、すぐには削除されません。',
    ageLabel: '次より古いファイルを自動削除',
    ageDescription: '最短 7 日、最長 10 年。手動の「古いファイル削除」ボタンと同じ期間ルールを使用します。',
    days: '日',
    includeNeverPrinted: '一度も印刷していないファイルも含める',
    saveFailed: '自動削除の設定を保存できませんでした。',
  },
  archivePurge: {
    headerButton: '古いものを削除',
    headerTooltip: '古いアーカイブを一括削除',
    title: '古いアーカイブを削除',
    description: '古い印刷履歴をクリア。各アーカイブは最新の印刷完了に基づいてエイジングされます — アーカイブを再印刷するとエイジがリセットされるため、現在使用中の作業が削除されることはありません。',
    ageLabel: '印刷されていないアーカイブを削除（過去',
    days: '日',
    effectsTitle: '「削除」をクリックすると何が起こるか',
    effect1: '一致するアーカイブはリストから非表示になり、ファイル（3MF、サムネイル、タイムラプス、ソース3MF、F3D、写真）はディスクから削除されます。',
    effect2: 'アーカイブのレコードはデータベースに残るため、Quick Stats のフィラメント／時間／コスト／エネルギーの寄与は保持されます — 個別アーカイブ削除の既定動作と同じです。',
    effect3: '下の「統計からも削除」を有効にすると、Quick Stats の寄与も破棄されます（個別アーカイブ削除のオプションと同等）。この操作は取り消せません。',
    effect4: 'アーカイブを再印刷するとエイジクロックがリセットされるため、まだ使用中のアーカイブは安全です。',
    purgeStatsLabel: '統計からも削除',
    purgeStatsHint: '一致するアーカイブを Quick Stats（フィラメント、時間、コスト、エネルギー）からも削除します。チェックしない場合、Quick Stats は寄与を保持し、ファイルのみがディスクから消えます。',
    previewLoading: '一致するアーカイブの数を確認中…',
    previewFailed: '削除のプレビューを表示できませんでした。',
    previewSummary: '{{count}}件のアーカイブ · {{size}}が削除されます',
    andMore: '…他に{{count}}件',
    warning: 'ファイルはディスクから削除され、元に戻せません。続行する前に、保持したいものをダウンロードまたはお気に入りに追加してください。',
    confirmCta: '{{count}}件のアーカイブを削除',
    purging: '削除中…',
    toast: {
      success: '{{count}}件のアーカイブを削除しました。',
      failed: 'アーカイブを削除できませんでした。',
    },
  },
  archiveAutoPurge: {
    enableLabel: '古いアーカイブを自動削除',
    enableDescription: '1日1回、しきい値内に印刷されていないアーカイブをリストから非表示にし、ファイルをディスクから削除します。再印刷するとタイマーがリセットされます。',
    ageLabel: '印刷されていないアーカイブを自動削除（過去',
    ageDescription: '最小7日、最大10年。最新の印刷完了に基づきます — 再印刷するとエイジがリセットされます。3MF、サムネイル、タイムラプス、ソース3MF、F3D、写真を削除します。',
    days: '日',
    purgeStatsLabel: '統計からも削除',
    purgeStatsDescription: '有効にすると、毎日のスイーパーが削除した各アーカイブを Quick Stats（フィラメント、時間、コスト、エネルギー）からも除外します。既定はオフ — Quick Stats は寄与を保持し、ファイルのみがディスクから消えます。',
    runNow: 'アーカイブを今すぐ削除',
    saveFailed: '自動削除設定を保存できませんでした。',
  },
  cameraTokens: {
    scope: {
      camera_stream: 'カメラストリーム',
      camwall: 'カメラウォール',
      overlay: '配信オーバーレイ',
    },
    title: 'カメラAPIトークン',
    navTitle: 'カメラAPIトークン',
    description:
      'Home Assistant、Frigate、キオスク画面など、安定した URL を必要とするツールにカメラ映像を埋め込むための長期トークンです。スコープは作成時に選択し、トークンはいつでも取り消せます。',
    loading: '読み込み中…',
    confirmRevoke: {
      title: 'このトークンを取り消しますか？',
      body: '「{{name}}」を使用しているデバイスは直ちにアクセスできなくなります。元に戻せません。',
      cancel: 'キャンセル',
      confirm: '取り消し',
    },
    create: {
      scopeLabel: 'スコープ',
      hintCameraStream:
        'カメラストリームトークンで取得できるのは、カメラの映像とスナップショットだけです。Home Assistant や Frigate など、単一のカメラを埋め込む用途に使用してください。',
      hintCamWall:
        'カメラウォールトークンは、ログインなしの画面で /camwall を開きます。各プリンターの名前と状態、そしてカメラ映像を見ることができます。ファイル名、アドレス、アクセスコードは見えません。',
      hintOverlay:
        '配信オーバーレイトークンは、ログインなしの画面で /overlay/{printerId} を開きます — OBS やライブ配信向けです。1台のプリンターのカメラ映像に加え、画面に表示されるファイル名を含むライブの印刷状況を見ることができます。アドレスやアクセスコードは見えません。',
      title: '新しいトークンを作成',
      nameLabel: 'トークン名',
      namePlaceholder: '例：Home Assistant',
      daysLabel: '有効期限までの日数',
      submit: '作成',
      hint:
        '最大有効期間は365日。トークン値は作成時に一度だけ表示されます — 今すぐコピーしてください。',
    },
    created: {
      camWallUrlTitle: 'この画面用のカメラウォール URL',
      camWallUrlHint:
        'この URL を画面で開いてください。URL を読める人は誰でもウォールを見られるため、鍵と同じように扱ってください。トークンを取り消すと、その画面は遮断されます。',
      overlayUrlTitle: 'OBS 用のオーバーレイ URL',
      overlayUrlHint:
        'これを OBS の「ブラウザ」ソース（Browser Source）として追加してください。/overlay/1 の番号を、お使いのプリンターの番号（プリンターページの URL に表示）に変更します。URL を読める人は誰でも配信を見られるため、鍵と同じように扱い、遮断するにはトークンを取り消してください。',
      title: 'トークンを作成しました – 今すぐコピー',
      warning:
        'このトークンが表示されるのは今回限りです。このダイアログを閉じると二度と表示できません。',
      copy: 'コピー',
      dismiss: '保存しました',
    },
    list: {
      scope: 'スコープ',
      myTitle: 'マイトークン',
      allTitle: '全ユーザー（管理者ビュー）',
      empty: 'トークンはまだありません。',
      name: '名前',
      owner: '所有者',
      prefix: 'プレフィックス',
      created: '作成',
      expires: '有効期限',
      lastUsed: '最終使用',
      revoke: '取り消し',
      expired: '期限切れ',
    },
    toast: {
      created: 'トークンを作成しました',
      createFailed: 'トークンの作成に失敗',
      revoked: 'トークンを取り消しました',
      revokeFailed: 'トークンの取り消しに失敗',
      loadFailed: 'トークンの読み込みに失敗',
      copied: 'クリップボードにコピー',
      copyFailed: 'コピーに失敗 – 手動で選択してコピー',
    },
  },

  // Forecast & Inventory Intelligence
  forecast: {
    title: '在庫予測',
    noSpools: 'アクティブなスプールが見つかりません。予測データを表示するには、在庫にスプールを追加してください。',
    noUsageData: '使用データがありません — 在庫のタイムラインを予測できません。',
    sku: 'SKU',
    // Table headers
    material: '素材',
    stock: '在庫',
    dailyRate: 'レート',
    daysLeft: '残り日数',
    emptyBy: '在庫切れ予定日',
    reorderBy: '発注期限',
    actions: '操作',
    // Rate tier badges
    trend: 'トレンド',
    estimated: '推定',
    noData: 'データなし',
    // Timeframe
    timeframe: '期間',
    // Chart
    chartTitle: '在庫予測 — 上位5素材',
    dashedLinesROP: '破線 = 発注点',
    stockLevel: '在庫量',
    reorderPoint: '発注点',
    safetyMargin: '安全余裕',
    trendLegend: 'トレンド（履歴ベース、95%サービスレベル）',
    estimatedLegend: '推定（重量差分）',
    noDataLegend: 'データなし',
    ropLabel: '発注点',
    ssLabel: '安全在庫',
    safetyStockLegend: '安全在庫',
    stockArrivalLegend: '入荷',
    stockoutLegend: '品切れ',
    // Alerts toolbar
    alertCount_one: '{{count}}件の警告',
    alertCount_other: '{{count}}件の警告',
    order: '注文',
    // Settings
    globalLeadTime: 'グローバルリードタイム',
    globalLeadTimeHint: 'グローバルリードタイムの下限 — 全SKUの発注点計算に使用',
    save: '保存',
    cancel: 'キャンセル',
    settingsSaved: '設定を保存しました',
    failedSaveSettings: '設定の保存に失敗しました',
    globalLeadTimeSaved: 'グローバルリードタイムを保存しました',
    skuLeadTimeOverride: 'SKUリードタイム上書き',
    skuLeadTimeHint: '0 = グローバルリードタイムを使用。このSKUを上書きするには0より大きい値を設定。',
    safetyMarginLabel: '安全余裕',
    effectiveLeadTime: '実効リードタイム',
    effectiveLeadTimeHint: 'max(グローバル {{global}}日, SKU {{sku}}日)',
    reorderPointHint: 'd̄ × LT + safety margin — 在庫がこのレベルに達したら発注',
    safetyMarginHint: '統計的安全在庫 (z=1.65 × σ × √LT) + ユーザー定義バッファ',
    safetyMarginHintDays: '統計的安全在庫に加算されるバッファ。{{approx}}',
    safetyMarginHintDaysApprox: ' ≈ 現在のペースで{{g}}g。',
    safetyMarginHintG: '統計的安全在庫に加算される固定重量バッファ。{{approx}}',
    safetyMarginHintGApprox: ' ≈ 現在のペースで{{days}}日。',
    individualSpools: '個別スプール',
    labelWeight: 'ラベル',
    spoolCount_one: '{{count}}個のスプール',
    spoolCount_other: '{{count}}個のスプール',
    // Alerts
    stockBreakRisk: '在庫切れリスク',
    stockBreakBefore: '補充前の在庫切れ',
    stockBreakDetail: '残り{{days}}日、リードタイム{{lt}}日。',
    reorderNow: '今すぐ発注',
    reorderTriggerPassed: '発注トリガー日 {{date}} が経過しました。',
    // Shopping list
    shoppingList: '購入リスト',
    shoppingListItems_one: '（{{count}}件）',
    shoppingListItems_other: '（{{count}}件）',
    shoppingListEmpty: '購入リストは空です。行のカートアイコンをクリックしてアイテムを追加してください。',
    addToCart: '購入リストに追加',
    alertsSnoozed: 'このSKUのアラートをミュート',
    alertsEnabled: 'このSKUのアラートを有効にする',
    addedToCart: '買い物リストに追加しました',
    failedAddItem: 'アイテムの追加に失敗しました',
    listView: 'リスト',
    logisticsView: 'ロジスティクス',
    qty: '数量',
    weight: '重量',
    leadTime: 'リードタイム',
    expectedRestock: '入荷予定日',
    status: 'ステータス',
    note: 'メモ',
    pending: '保留中',
    purchased: '発注済み',
    received: '受領済み',
    markPurchased: '発注済みとしてマーク',
    markReceived: '受領済みとしてマーク — スプールを在庫に追加',
    resetToPending: '保留中にリセット',
    remove: '削除',
    clearAll: 'すべてクリア',
    downloadCsv: 'CSV',
    // Add to cart modal
    addToCartTitle: '買い物リストに追加',
    byQuantity: '数量で',
    byDuration: '期間で',
    numberOfSpools: 'スプール数',
    lastHowManyDays: '何日間持つべきですか？',
    noUsageQty: '使用データなし — 数量を1に設定しました。',
    noteOptional: 'メモ（任意）',
    notePlaceholder: '例：プロジェクトX用、緊急…',
    addNSpools_one: '{{count}}個のスプールを追加',
    addNSpools_other: '{{count}}個のスプールを追加',
    // Cart logistics
    onArrival: '入荷時',
    stockBreakIn: '{{days}}日後に在庫切れ。',
    stockRunsOutBefore: 'リードタイム{{lt}}日が経過する前に在庫が枯渇します。',
    atRate: '{{rate}}g/日のペースでは',
    moreSpools_one: 'あと{{count}}個のスプール',
    moreSpools_other: 'あと{{count}}個のスプール',
    bridgeGap: 'が不足を補うために必要です。',
    // Permissions
    noReadAccess: '在庫予測を閲覧する権限がありません。',
    noWriteAccess: '予測設定を変更する権限がありません。',
  },
};
