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

  // Common
  common: {
    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: '展開',
    viewArchive: 'アーカイブを表示',
    viewInFileManager: 'ファイルマネージャーで表示',
    addedBy: '{{username}}が追加',
    prints: 'プリント',
    more: '+{{count}}件',
    ascending: '昇順',
    descending: '降順',
    back: '戻る',
    copy: 'コピー',
    copied: 'コピーしました!',
    printer: 'プリンター',
    remove: '削除',
    type: '種類',
    print: '印刷',
    rename: '名前変更',
    move: '移動',
    create: '作成',
    duplicate: '複製',
    left: '左',
    right: '右',
  },
  // Printers page
  printers: {
    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: 'チャンバー',
    },
    progress: '{{percent}}% 完了',
    timeRemaining: '残り {{time}}',
    deleteConfirm: '「{{name}}」を削除しますか？',
    maintenanceOk: 'メンテナンス正常',
    maintenanceWarning: '{{count}}件の警告',
    maintenanceWarning_plural: '{{count}}件の警告',
    maintenanceDue: '{{count}}件のメンテナンス期限',
    maintenanceDue_plural: '{{count}}件の期限',
    // Sort options
    sort: {
      name: '名前',
      status: 'ステータス',
      model: 'モデル',
      location: 'ロケーション',
      ascending: '昇順で並べ替え',
      descending: '降順で並べ替え',
    },
    // Card size
    cardSize: {
      small: '小',
      medium: '中',
      large: '大',
      extraLarge: '特大',
    },
    // 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: 'すべてのメンテナンスが最新です',
    // 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}}',
      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: {
      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}}」をスキップしますか？この操作は元に戻せません。',
    },
    // 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: '印刷の開始に失敗しました',
    },
    // AMS Drying
    drying: {
      start: '乾燥開始',
      stop: '乾燥停止',
      temperature: '温度',
      duration: '時間',
      hours: '時間',
      timeRemaining: '残り {{time}}',
      active: '乾燥中',
      notSupported: '乾燥非対応',
      powerRequired: 'AMS電源アダプターを接続して乾燥を有効にしてください',
      startingDrying: '乾燥を開始しています...',
      stoppingDrying: '乾燥を停止しています...',
      rotateTray: '乾燥中にスプールを回転',
    },
    // Filaments section
    filaments: 'フィラメント',
    // 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: '補助ファン',
      chamber: 'チャンバーファン',
    },
    // HMS errors
    clickToViewHmsErrors: 'クリックしてHMSエラーを表示',
    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: '印刷アーカイブ',
    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: 'コスト',
    reprint: '再印刷',
    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: '印刷',
      schedule: 'スケジュール',
      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: 'このアーカイブを削除する権限がありません',
      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ファイルがありません — 印刷記録時にプリンターからファイルをダウンロードできませんでした',
      noPermissionEdit: 'プロファイルを編集する権限がありません',
      noPermissionDelete: 'アーカイブを削除する権限がありません',
      reprint: '再印刷',
      schedulePrint: '印刷をスケジュール',
      schedule: 'スケジュール',
      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からも削除（フィラメント、時間、コスト、電力）',
      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: 'フィラメント',
      allPrinters: '全プリンター',
      allUsers: '全ユーザー',
      allStatuses: '全ステータス',
      cancelled: 'キャンセル',
      skipped: 'スキップ',
      dateFrom: '開始日',
      dateTo: '終了日',
      noEntries: '印刷ログが見つかりません',
      showing: '{{total}}件中{{count}}件を表示',
      rowsPerPage: '行数',
      page: 'ページ',
      prev: '前へ',
      next: '次へ',
      clearLog: 'ログをクリア',
      clearLogTitle: '印刷ログをクリア',
      clearLogConfirm: 'すべての印刷ログエントリが完全に削除されます。アーカイブとキューアイテムには影響しません。この操作は元に戻せません。よろしいですか？',
      clearLogButton: 'すべてクリア',
      cleared: '{{count}}件のログエントリを削除しました',
      clearFailed: '印刷ログの削除に失敗しました',
    },
  },

  // Queue page
  queue: {
    title: '印刷キュー',
    subtitle: '印刷ジョブのスケジュールと管理',
    addToQueue: 'キューに追加',
    // Print modal
    print: '印刷',
    reprint: '再印刷',
    schedulePrint: '印刷をスケジュール',
    editQueueItem: 'キューアイテムを編集',
    printToPrinters: '{{count}}台のプリンターで印刷',
    queueToPrinters: '{{count}}台のプリンターでキュー追加',
    queueSelectedPlates: '{{count}}プレートをキューに追加',
    selectAllPlates: '全{{count}}プレートを選択',
    deselectAll: '全て解除',
    printQueued: 'キューに追加しました',
    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}}件のキューアイテムを作成',
    activeBatches: 'アクティブなバッチ',
    batchProgress: '{{total}}件中{{completed}}件完了',
    cancelBatch: '残りをキャンセル',
    batchCancelled: '残りのバッチアイテムをキャンセルしました',
    cancelBatchConfirmTitle: 'バッチをキャンセル',
    cancelBatchConfirmMessage: 'このバッチの残りの保留中アイテムをすべてキャンセルしますか？',
    batch: 'バッチ',
    // 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: {
      asap: '即時',
      overdue: '期限超過',
      now: '今すぐ',
      lessThanMinute: '1分以内',
      inMinutes: '{{count}}分後',
      inHours: '{{count}}時間後',
    },
    // Actions
    actions: {
      stopPrint: '印刷を停止',
      startPrint: '印刷を開始',
      requeue: '再キュー',
    },
    // Bulk edit
    bulkEdit: {
      title: '{{count}}件のアイテムを編集',
      title_plural: '{{count}}件のアイテムを編集',
      description: '変更した設定のみが選択されたアイテムに適用されます。',
      printer: 'プリンター',
      noChange: '— 変更なし —',
      queueOptions: 'キューオプション',
      staged: 'ステージ済み',
      autoPowerOff: '印刷後に自動電源オフ',
      requirePrevious: '前の成功を必要とする',
      printOptions: '印刷オプション',
      bedLevelling: 'ベッドレベリング',
      flowCalibration: 'フローキャリブレーション',
      vibrationCalibration: '振動キャリブレーション',
      layerInspection: '第一層検査',
      timelapse: 'タイムラプス',
      useAms: 'AMS使用',
      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: 'アイテムのキャンセルに失敗しました',
    },
    // Timeline view
    timeline: {
      listView: 'リスト',
      timelineView: 'タイムライン',
      unassigned: '未割当',
      noData: 'この日の予定された印刷はありません',
      allDoneBy: 'すべての印刷は {{time}} までに完了予定',
      staged: 'ステージング',
      filterAll: 'すべて表示',
      filterPrinting: '印刷中',
      filterQueued: '待機中',
      time: {
        anyMoment: 'まもなく',
        minutesLeft: '残り{{minutes}}分',
        hoursLeft: '残り{{hours}}時間',
        hoursMinutesLeft: '残り{{hours}}時間{{minutes}}分',
      },
      day: {
        previous: '前日',
        next: '翌日',
        today: '今日',
      },
    },
    // Permissions
    permissions: {
      noStopPrint: '印刷を停止する権限がありません',
      noStartPrint: '印刷を開始する権限がありません',
      noEdit: 'このキューアイテムを編集する権限がありません',
      noCancel: 'このキューアイテムをキャンセルする権限がありません',
      noRequeue: 'アイテムを再キューする権限がありません',
      noRemove: 'このキューアイテムを削除する権限がありません',
      noClearHistory: 'すべての履歴をクリアする権限がありません',
      noEditItems: 'キューアイテムを編集する権限がありません',
      noCancelItems: 'キューアイテムをキャンセルする権限がありません',
    },
  },

  backgroundDispatch: {
    unknownFile: '不明なファイル',
    unknownPrinter: '不明なプリンター',
    startingPrints: '印刷開始中',
    progressSummary: '{{complete}}/{{total}} 完了 • 配信済み: {{dispatched}} • 処理中: {{processing}}',
    expandDetails: '配信詳細を展開',
    collapseDetails: '配信詳細を折りたたむ',
    dismissToast: '配信トーストを閉じる',
    cancelDispatchJob: '配信ジョブをキャンセル',
    cancel: 'キャンセル',
    cancelling: 'キャンセル中…',
    awaitingPrinter: 'プリンターを待機中…',
    status: {
      dispatched: '配信済み',
      processing: '処理中',
      completed: '完了',
      failed: '失敗',
      cancelled: 'キャンセル済み',
    },
    toast: {
      cancellingUpload: 'アップロードをキャンセル中...',
      cancelled: '配信をキャンセルしました',
      cancelFailed: '配信のキャンセルに失敗しました',
      completeWithFailures: 'バックグラウンド配信完了: {{completed}} 件成功、{{failed}} 件失敗',
      completeSuccess: 'バックグラウンド配信完了: {{completed}} 件成功',
      printStartedRemaining: '{{completed}} 件の印刷を開始、残り {{remaining}} 件送信中...',
    },
  },

  // 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: '失敗',
    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: '時間推移',
    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: {
    title: '設定',
    general: '一般',
    // Tab names
    tabs: {
      general: '一般',
      smartPlugs: 'スマートプラグ',
      notifications: '通知',
      queue: 'ワークフロー',
      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 温度',
      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サーバーを使用できます。',
    filamentChecks: 'フィラメントチェック',
    disableFilamentWarnings: 'フィラメント警告を無効化',
    disableFilamentWarningsDesc: '印刷またはキュー追加時にフィラメント不足の警告を表示しない',
    preferLowestFilament: '残量が少ないフィラメントを優先',
    preferLowestFilamentDesc: '複数のスプールが一致する場合、残量が最も少ないものを使用します',
    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: 'アップデート確認時にベータ版およびプレリリース版を通知する',
    // 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ブラウザーで使用',
    createNewApiKey: '新しいAPIキーを作成',
    keyName: 'キー名',
    keyNamePlaceholder: '例: Home Assistant, OctoPrint',
    readStatus: 'ステータスの読み取り',
    readStatusDescription: 'プリンターのステータスとキューを表示',
    manageQueue: 'キューの管理',
    manageQueueDescription: '印刷キューへのアイテムの追加と削除',
    controlPrinter: 'プリンターの制御',
    controlPrinterDescription: '印刷の一時停止、再開、停止',
    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: 'このしきい値は自動乾燥のトリガーにも使用されます',
    temperature: '温度',
    goodBlue: '良好（青）≤',
    aboveFairHot: '普通のしきい値以上は赤（高温）で表示',
    historyRetention: '履歴の保持',
    keepSensorHistory: 'センサー履歴の保持期間',
    historyRetentionDescription: '古い湿度と温度データは自動的に削除されます',
    defaultPrintOptions: 'デフォルト印刷オプション',
    defaultPrintOptionsDescription: '新しい印刷のデフォルト値を設定します。印刷ダイアログで個別に変更できます。',
    defaultBedLevelling: 'ベッドレベリング',
    defaultBedLevellingDesc: '印刷前にベッドを自動レベリング',
    defaultFlowCali: 'フローキャリブレーション',
    defaultFlowCaliDesc: '押出フローのキャリブレーション',
    defaultVibrationCali: '振動キャリブレーション',
    defaultVibrationCaliDesc: 'リンギングアーティファクトを低減',
    defaultLayerInspect: '第1層検査',
    defaultLayerInspectDesc: 'AIによる第1層の検査',
    defaultTimelapse: 'タイムラプス',
    defaultTimelapseDesc: 'タイムラプス動画を記録',
    staggeredStart: '段階的開始',
    staggeredStartDescription: '複数プリンターのバッチ開始を段階的に行う際のデフォルトのグループサイズと間隔。プリントモーダルでバッチごとに上書き可能。',
    plateClear: 'プレートクリア確認',
    requirePlateClear: 'プレートクリア確認を必須にする',
    requirePlateClearDescription: '有効にすると、スケジューラーは完了したプリンターでキューの印刷を開始する前に、プリンターごとのプレートクリア確認を待ちます。無効にすると、プリンターカード上のプレート状態バッジと「プレートをクリア済みにする」ボタンも非表示になります。',
    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: 'キューに関係なく、アイドル状態のプリンターで湿度がしきい値を超えた場合に自動的にフィラメントを乾燥。',
    dryingPresets: '乾燥プリセット',
    dryingPresetsDescription: 'フィラメントタイプごとの温度と時間。AMS 2 Proは低温、AMS-HTは高温に対応。',
    dryingFilament: 'フィラメント',
    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: 'ファイルを開くスライサーアプリケーションを選択',
    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',
    slicerApiUrlDescription: 'slicer-APIサイドカーコンテナのURL。空のままにすると SLICER_API_URL / BAMBU_STUDIO_API_URL 環境変数のデフォルト値が使用されます。',
    slicerBundles: {
      title: 'スライサーバンドル',
      description: 'BambuStudioからエクスポートされたPrinter Preset Bundle（.bbscfg）をインポートします（ファイル → エクスポート → プリセットバンドルをエクスポート → "Printer preset bundle"）。インポート後、スライス要求はJSONプロファイルトリプレットを再アップロードせずにバンドルから名前でプリセットを選択できます。',
      uploadButton: 'バンドルをアップロード',
      uploading: 'アップロード中…',
      loading: 'バンドルを読み込み中…',
      empty: 'バンドルはまだインポートされていません。',
      summary: '{{processCount}}プロセス · {{filamentCount}}フィラメントプリセット',
      delete: '削除',
      uploadSuccess: '{{name}}をインポート済み',
      uploadError: 'バンドルのアップロードに失敗: {{message}}',
      deleteSuccess: 'バンドルを削除しました',
      deleteError: 'バンドルの削除に失敗: {{message}}',
      confirmDeleteTitle: 'このバンドルを削除しますか？',
      confirmDeleteMessage: '「{{name}}」を参照するスライス要求は、バンドルを再インポートするまで失敗します。',
    },
    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: '利用可能なメトリクス',
    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}}',
    },
    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: 'サイドバーの太陽/月アイコンでダークモードとライトモードを切り替えます。',
    // Archive
    autoArchivePrints: '印刷を自動アーカイブ',
    autoArchiveDescription: '印刷完了時に3MFファイルを自動保存',
    saveThumbnailsDescription: '3MFファイルからプレビュー画像を抽出して保存',
    captureFinishPhotoDescription: '印刷完了時にプリンターカメラから写真を撮影',
    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でアップデート:',
    updateViaHomeAssistant: 'アップデートはHome Assistant Supervisorによって管理されます。Home Assistantの設定→アドオン→Bambuddyを開いて新しいバージョンをインストールしてください。',
    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: 'アカウントのリンクを解除しました。',
    },

    // 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（デフォルト）',
      },
    },

    // 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 を再起動して再試行してください。',
    },

  },

  // 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で表示',
    clearInstructions: 'プリンターでエラーをクリアするとここからも消えます。',
    clearErrors: 'エラーをクリア',
    clearSuccess: 'HMSエラーをクリアしました',
    clearFailed: 'HMSエラーのクリアに失敗しました',
  },

  // 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: 'パスワードをお忘れですか？',
    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: '検索に一致する権限がありません',
    },
  },

  // 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: 'プリンターオフライン',
    status: {
      printing: '印刷中',
      paused: '一時停止',
      finished: '完了',
      failed: '失敗',
      idle: '待機中',
      unknown: '不明',
    },
  },

  // Profiles
  profiles: {
    title: 'フィラメントプロファイル',
    subtitle: 'スライサープリセットと圧力キャリブレーションの管理',
    tabs: {
      cloud: 'クラウドプロファイル',
      local: 'ローカルプロファイル',
      kprofiles: 'Kプロファイル',
    },
    localProfiles: {
      title: 'ローカルプロファイル',
      subtitle: 'OrcaSlicerからスライサープリセットをインポート・管理',
      import: 'プロファイルをインポート',
      importDesc: '.bbscfg、.bbsflmt、.orca_filament、.zip、.jsonファイルをここにドロップ',
      importing: 'インポート中...',
      search: 'ローカルプリセットを検索...',
      noPresets: 'ローカルプリセットがまだありません',
      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: '接続中:',
    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: 'アクセストークンを使用',
      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環境の詳細',
  },

  // File manager
  fileManager: {
    title: 'ファイル管理',
    subtitle: '印刷ファイルの整理と管理',
    uploadFiles: 'ファイルをアップロード',
    newFolder: '新しいフォルダ',
    folderName: 'フォルダ名',
    folderNamePlaceholder: '例: 機能パーツ',
    renameFile: 'ファイル名を変更',
    renameFolder: 'フォルダ名を変更',
    moveFiles: '{{count}}件のファイルを移動',
    rootNoFolder: 'ルート（フォルダなし）',
    current: '（現在）',
    linkFolder: 'フォルダをリンク',
    linkFolderDescription: '「{{name}}」をプロジェクトまたはアーカイブにリンクしてすばやくアクセス。',
    project: 'プロジェクト',
    archive: 'アーカイブ',
    noProjectsFound: 'プロジェクトが見つかりません',
    noArchivesFound: 'アーカイブが見つかりません',
    unlink: 'リンク解除',
    link: 'リンク',
    dragDropFiles: 'ファイルをここにドラッグ＆ドロップ',
    dropFilesHere: 'ここにファイルをドロップ',
    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: 'プロジェクトまたはアーカイブにリンク',
    addToQueue: 'キューに追加',
    schedulePrint: '印刷をスケジュール',
    generateThumbnail: 'サムネイルを生成',
    generateThumbnails: 'サムネイルを生成',
    generateThumbnailsForMissing: 'サムネイルのないSTLファイルのサムネイルを生成',
    gridView: 'グリッド表示',
    listView: 'リスト表示',
    lowDiskSpaceWarning: 'ディスク容量不足の警告',
    lowDiskSpaceDetails: '{{total}}中{{free}}の空き容量のみ。しきい値は設定で{{threshold}}GBに設定されています。',
    files: 'ファイル',
    folders: 'フォルダ',
    size: 'サイズ',
    free: '空き:',
    allFiles: 'すべてのファイル',
    wrap: '折り返し',
    enableTextWrapping: 'テキスト折り返しを有効化',
    disableTextWrapping: 'テキスト折り返しを無効化',
    collapse: '折りたたむ',
    collapseFoldersByDefault: 'フォルダをデフォルトで折りたたむ',
    expandFoldersByDefault: 'フォルダをデフォルトで展開する',
    dragToResizeTooltip: 'ドラッグしてリサイズ、ダブルクリックでリセット',
    searchFiles: 'ファイルを検索...',
    allTypes: 'すべての種類',
    prints: '印刷回数',
    ascending: '昇順',
    descending: '降順',
    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: 'フォルダーを削除する権限がありません',
    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: 'フォルダを作成しました',
      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: {
    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: '必要なオブジェクトの総数',
    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: 'パーツ進捗',
      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}})',
    },
    notes: {
      title: 'メモ',
      noEditPermission: 'このプロジェクトを編集する権限がありません',
      placeholder: 'このプロジェクトについてメモを追加...',
      empty: '<空>',
    },
    files: {
      title: 'ファイル',
      linkFolders: 'ファイルマネージャーからフォルダーをリンク',
      forQuickAccess: 'してクイックアクセスできるようにします。',
      fileCount: '{{count}}ファイル',
      empty: '<空>',
      noFiles: 'このフォルダにファイルはありません。',
      print: '今すぐ印刷',
      addToQueue: 'キューに追加',
    },
    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: 'アーキテクチャ',
  },

  // Library (K Profiles)
  library: {
    title: 'フィラメントライブラリ',
    addFilament: 'フィラメントを追加',
    editFilament: 'フィラメントを編集',
    deleteFilament: 'フィラメントを削除',
    vendor: 'メーカー',
    material: '素材',
    color: '色',
    kFactor: 'K値',
    temperature: '温度',
    noFilaments: 'ライブラリにフィラメントがありません',
    deleteConfirm: 'このフィラメントを削除しますか？',
    importFromPrinter: 'プリンターからインポート',
    exportToFile: 'ファイルにエクスポート',
  },

  // Slice (slicer-API integration via SliceModal)
  slice: {
    title: 'モデルをスライス',
    action: 'スライス',
    slicing: 'スライス中…',
    printer: 'プリンタープロファイル',
    process: 'プロセスプロファイル',
    filament: 'フィラメントプロファイル',
    filamentSlot: 'フィラメント {{index}}（{{type}}）',
    selectPreset: '— プリセットを選択 —',
    loadingPresets: 'プリセットを読み込み中…',
    analyzingPlateFilaments: 'プレートのフィラメントを分析中…',
    analyzingPlateFilamentsHint: 'このプレートが使用するAMSスロットを検出するためにプレビュースライスを実行中。キャッシュ後は再オープンが即座になります。',
    previewToast: '{{name}}を分析中 – {{elapsed}}',
    previewWithProgress: '{{name}}を分析中 – {{stage}} ({{percent}}%) – {{elapsed}}',
    notUsedByPlate: '— このプレートでは使用しない',
    printerMismatch: 'この3MFは{{source}}用にスライスされていますが、{{target}}を選択しました。スライサーCLIは異なるプリンター用に3MFを再スライスできません — Bambu Studioでソースを開き、プリンターを変更して再エクスポートしてください。',
    noPresetsForSlot: 'プリセットなし',
    presetsLoadFailed: 'プリセットの読み込みに失敗。先に設定 → プロファイルからインポートしてください。',
    allPresetsRequired: 'すべてのプリセットを選択する必要があります',
    enqueuing: 'スライスジョブを送信中…',
    queued: '待機中…',
    failed: 'スライスに失敗。サイドカーのログを確認してください。',
    startedToast: 'バックグラウンドで{{name}}をスライス中…',
    queuedToast: '待機中: {{name}} – {{elapsed}}',
    runningToast: '{{name}}をスライス中 – {{elapsed}}',
    runningWithProgress: '{{name}} – {{stage}} ({{percent}}%) – {{elapsed}}',
    completedToast: '{{name}}をスライス済み',
    failedToast: '{{name}}のスライスに失敗: {{detail}}',
    tier: {
      local: 'インポート済み',
      cloud: 'クラウド',
      standard: '標準',
    },
    cloud: {
      notAuthenticated: 'Bambu Cloudにサインイン（設定 → プロファイル → クラウド）してクラウドプリセットを表示。',
      expired: 'Bambu Cloudセッションの有効期限切れ – クラウドプリセットを更新するには再ログインしてください。',
      unreachable: 'Bambu Cloudに接続できません。ローカルと標準のプリセットは引き続き使用できます。',
    },
    bedType: {
      label: 'ビルドプレート',
      auto: '自動（プロセスプリセットを使用）',
      coolPlate: 'クールプレート',
      coolPlateSuperTack: 'Cool Plate SuperTack',
      engineering: 'Engineering Plate',
      highTemp: 'High Temp Plate',
      texturedPEI: 'Textured PEI Plate',
      smoothPEI: 'Smooth PEI Plate',
    },
  },

  // 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: '印刷が失敗またはキャンセルされた場合、レイヤー進捗に基づいてその時点までの推定フィラメント使用量を報告します。',
  },

  // Inventory
  inventory: {
    title: 'スプール在庫管理',
    subtitle: 'スプールを管理',
    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: 'ラベルを印刷するスプールを選択:',
      searchPlaceholder: '名前、ブランド、#IDで検索',
      filterByMaterial: '素材:',
      allMaterials: 'すべて',
      selectVisible: '表示中をすべて選択 ({{count}})',
      deselectVisible: '表示中を選択解除',
      clearAll: 'すべてクリア',
      noSpoolsToShow: '表示するスプールはありません。フィルターを調整して再試行してください。',
      noMatches: '現在の検索またはフィルターに一致するスプールはありません。',
      printOne: 'このスプールのラベルを印刷',
      printLabels: 'ラベルを印刷…',
      bulkTitle: '現在表示中の{{count}}件からラベルを印刷するスプールを選択',
      noSpoolsTitle: 'ラベル付けするスプールなし',
      error: 'ラベルを生成できませんでした: {{msg}}',
      sortBy: {
        label: '並べ替え:',
        id: 'ID順',
        color: '色順',
      },
      templates: {
        ams: {
          label: 'AMS holder (30 × 15 mm)',
          hint: '1ページに1ラベル、人気のAMSフィラメントラベルホルダーに適合。',
        },
        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枚のラベル。',
        },
      },
    },
    addSpool: 'スプールを追加',
    editSpool: 'スプールを編集',
    copySpool: 'スプールをコピー',
    material: '素材',
    selectMaterial: '素材を選択...',
    subtype: 'サブタイプ',
    brand: 'ブランド',
    searchBrand: 'ブランドを検索...',
    useCustomBrand: '「{{brand}}」を使用',
    useCustomMaterial: 'カスタム素材を使用: {{material}}',
    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スロットを設定しました',
    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: '追跡開始以降',
    resetUsage: '使用量を0にリセット',
    resetUsageTooltip: 'このスプールの消費量カウンタを0にする',
    resetUsageConfirm: 'このスプールの消費量カウンタを0にリセットしますか？以降の印刷は再びゼロからカウントされます。スプール自体、残量計算、設定は変更されません。',
    resetAllUsage: '全スプールの使用量をリセット',
    resetAllUsageTooltip: 'すべてのアクティブなスプールの消費量カウンタを0にする',
    resetAllUsageConfirm: '{{count}}件すべてのアクティブなスプールの消費量カウンタを0にリセットしますか？「累計消費量」の値がクリアされ、以降の印刷はゼロからカウントされます。スプール自体と残量は変更されません。',
    usageReset: 'スプールの使用量を0にリセットしました',
    allUsageReset: '{{count}}件のスプールをリセットしました',
    resetUsageFailed: 'スプールの使用量リセットに失敗しました',
    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}}」と一致しません。続行しますか？',
    // 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: '空のスロット',
    unknown: '不明',
    humidity: '湿度',
    temperature: '温度',
    filamentType: 'フィラメントタイプ',
    filamentColor: '色',
    remaining: '残り',
    history: 'AMS履歴',
    noHistory: 'メンテナンス履歴がありません',
    configureSlot: 'フィラメントプロファイルとK値でスロットを設定',
    externalSpool: '外部スプール',
    profile: 'プロファイル',
    kFactor: 'K値',
    fill: '充填率',
    configure: '設定',
    used: '使用済み',
    remainingUnit: '残り',
  },

  // Print modal
  printModal: {
    title: '印刷を開始',
    selectPrinter: 'プリンターを選択',
    selectPlate: 'プレートを選択',
    filamentMapping: 'フィラメントマッピング',
    totalCost: '合計コスト:',
    slotRemainingShort: ' - 残{{grams}}g',
    printSettings: '印刷設定',
    bedLeveling: 'ベッドレベリング',
    flowCalibration: 'フローキャリブレーション',
    vibrationCalibration: '振動キャリブレーション',
    layerInspection: '第一層検査',
    timelapse: 'タイムラプス',
    startPrint: '印刷を開始',
    addToQueue: 'キューに追加',
    cancel: 'キャンセル',
    noPrintersAvailable: '利用可能なプリンターがありません',
    printerBusy: 'プリンターは使用中です',
    printerOffline: 'プリンターはオフラインです',
    sameTypeDifferentColor: '同じ種類、異なる色',
    filamentTypeNotLoaded: 'フィラメントタイプが未読み込み',
    openCalendar: 'カレンダーを開く',
    leftNozzle: 'L',
    rightNozzle: 'R',
    leftNozzleTooltip: '左ノズル',
    rightNozzleTooltip: '右ノズル',
    filamentOverride: 'フィラメントオーバーライド',
    filamentOverrideHint: 'モデルベースの割り当てに使用するフィラメントをオプションで上書きします。スケジューラは元の3MF値ではなく、選択したフィラメントに基づいてマッチングします。',
    originalFilament: 'オリジナル',
    overrideWith: '変更先',
    resetToOriginal: 'オリジナルに戻す',
    insufficientFilamentTitle: 'フィラメントが不足しています',
    insufficientFilamentMessage: '割り当てられたスプールの一部は、この印刷に必要な量より残量が少ないです:',
    insufficientFilamentLine: '{{printer}} - {{slot}}: 必要 {{required}}g、残り {{remaining}}g',
    printAnyway: 'それでも印刷',
    forceColorMatch: 'カラーマッチを強制',
    staggerPrinterStarts: 'プリンター開始を段階的に',
    staggerGroupSize: 'グループサイズ',
    staggerInterval: '間隔（分）',
    staggerPreview: '{{printers}}台のプリンター → {{size}}台ずつ{{groups}}グループ、{{interval}}分ごとに開始',
    staggerLastGroup: '最終グループ: {{count}}',
    staggerTotal: '合計: {{minutes}}分',
    staggerToPrinters: '{{count}}台のプリンターに段階的に送信',
    gcodeInjection: '自動印刷G-codeを挿入',
  },

  // 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: '新しいトークンを入力して更新',
    tokenHint: 'Contents読み書き権限を持つきめ細かいトークン',
    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からのフィラメント、プリンター、プロセスプリセット',
    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}}',

    // History
    history: '履歴',
    clear: 'クリア',
    date: '日付',
    status: 'ステータス',
    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: 'サイズ',
    utc: 'UTC',
    defaultPathLabel: 'デフォルト:',

    // 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: 'フィラメントを選択...',
      noFilamentsHelp: 'フィラメントが見つかりません。Bambu Studioでまずプロファイルを作成してください。',
      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つ以上選択してください',
      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)',
    },
    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: '正確なフィラメントタイプと色がロードされていないプリンターへの送信を拒否します。デフォルトはオフ — これがないと、キューはモデルのみのマッチングを使用し、間違った色がロードされたプリンターを選ぶ可能性があります。',
    },
    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文字である必要があります',
      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で送信したファイル名を使用します — 「プリンターに送信」ダイアログでジョブ名を変更した場合に便利です。',
      metadata: 'メタデータ',
      filename: 'ファイル名',
    },
  },

  // Model Viewer
  modelViewer: {
    openInSlicer: 'スライサーで開く',
    tabs: {
      model: '3Dモデル',
      gcode: 'G-codeプレビュー',
    },
    notAvailable: '利用不可',
    notSliced: '未スライス',
    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
  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: 'ワンショットではなく印刷間で有効のまま維持',
    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パス',
    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',
    },
    // Provider descriptions
    providerDescriptions: {
      email: 'SMTPメール通知',
      telegram: 'Telegramボット経由の通知',
      discord: 'Webhook経由でDiscordチャンネルに送信',
      ntfy: '無料のセルフホスト可能なプッシュ通知',
      pushover: 'シンプルで信頼性の高いプッシュ通知',
      callmebot: 'CallMeBot経由の無料WhatsApp通知',
      webhook: '任意のURLへの汎用HTTP POST',
      homeassistant: 'Home Assistantダッシュボードの永続通知',
    },
    // 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温度',
    amsHtHumidity: 'AMS-HT湿度',
    amsHtTemp: 'AMS-HT温度',
    bedCooled: 'ベッド冷却済み',
    firstLayer: '第1層完了',
    quiet: '静音',
    digest: 'ダイジェスト {{time}}',
    // Event labels (expanded settings)
    printStarted: '印刷開始',
    plateNotEmpty: 'プレートが空でない',
    plateNotEmptyDescription: '印刷前にオブジェクトが検出されました',
    printCompleted: '印刷完了',
    bedCooledLabel: 'ベッド冷却済み',
    bedCooledDescription: '印刷後にベッドがしきい値以下に冷却',
    firstLayerCompleteLabel: '第1層完了',
    firstLayerCompleteDescription: '第1層完了時にスナップショット付きで通知',
    missingSpoolAssignmentLabel: 'スプール割り当て不足',
    missingSpoolAssignmentDescription: '印刷開始時に必要トレイへスプールが未割り当ての場合に通知',
    printFailed: '印刷失敗',
    printStopped: '印刷停止',
    progressMilestones: '進捗マイルストーン',
    progressMilestonesDescription: '25%、50%、75%で通知',
    printerOffline: 'プリンターオフライン',
    printerError: 'プリンターエラー',
    lowFilamentLabel: 'フィラメント残量低下',
    maintenanceDue: 'メンテナンス期限',
    maintenanceDueDescription: 'メンテナンスが必要な場合に通知',
    amsHumidityHigh: 'AMS湿度高',
    amsHumidityHighDescription: '通常AMSの湿度がしきい値を超過',
    amsTemperatureHigh: 'AMS温度高',
    amsTemperatureHighDescription: '通常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: '（印刷完了後）',
    // Per-event ntfy priority (#990)
    eventPriority: {
      sectionTitle: 'ntfy 優先度',
      helpNtfy: '有効な各イベントに優先度を選択してください。ntfy はこれを使って通知の挙動（音、表示、プッシュ動作）を切り替えます。ここで設定していないレベルは ntfy サーバーのデフォルトを使用します。',
      min: '最小',
      low: '低',
      default: 'デフォルト',
      high: '高',
      urgent: '緊急',
    },
    cancel: 'キャンセル',
    save: '保存',
    add: '追加',
    nameRequired: '名前は必須です',
    fieldRequired: '{{field}}は必須です',
    // Config field labels
    phoneNumber: '電話番号',
    apiKey: 'APIキー',
    serverUrl: 'サーバーURL',
    topic: 'トピック',
    authToken: '認証トークン',
    userKey: 'ユーザーキー',
    appToken: 'アプリトークン',
    priority: '優先度',
    botToken: 'ボットトークン',
    chatId: 'チャット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: {
    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: '内蔵',
    settingsSentToPrinter: '設定をプリンターに送信しました',
    filamentProfile: 'フィラメントプロファイル',
    kProfileLabel: 'Kプロファイル（Pressure Advance）',
    filteringFor: 'フィルター中: {{material}}',
    noKProfile: 'Kプロファイルなし（デフォルト0.020を使用）',
    noMatchingKProfiles: '一致するKプロファイルが見つかりません。デフォルトK=0.020が使用されます。',
    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: '風袋コマンドを送信しました。デバイスを待っています...',
      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: 'オフ',
    },
  },

  bugReport: {
    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: 'バグレポートを送信中...',
    submitSuccess: 'バグレポートが正常に送信されました！',
    submitFailed: 'バグレポートの送信に失敗しました',
    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)。',
    test: 'テスト',
    testSuccess: '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 アカウントが必要です。',
    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: {
    back: '戻る',
    backToArchives: '印刷アーカイブに戻る',
    backToFiles: 'ファイル管理に戻る',
  },
  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: {
    title: 'カメラAPIトークン',
    navTitle: 'カメラAPIトークン',
    description:
      'Home Assistant、Frigate、キオスク、その他安定したURLが必要なツールにカメラストリームを埋め込むための長期トークン。各トークンはカメラストリーム専用で、いつでも取り消し可能。',
    loading: '読み込み中…',
    confirmRevoke: {
      title: 'このトークンを取り消しますか？',
      body: '「{{name}}」を使用しているデバイスは直ちにアクセスできなくなります。元に戻せません。',
      cancel: 'キャンセル',
      confirm: '取り消し',
    },
    create: {
      title: '新しいトークンを作成',
      nameLabel: 'トークン名',
      namePlaceholder: '例：Home Assistant',
      daysLabel: '有効期限までの日数',
      submit: '作成',
      hint:
        '最大有効期間は365日。トークン値は作成時に一度だけ表示されます — 今すぐコピーしてください。',
    },
    created: {
      title: 'トークンを作成しました – 今すぐコピー',
      warning:
        'このトークンが表示されるのは今回限りです。このダイアログを閉じると二度と表示できません。',
      copy: 'コピー',
      dismiss: '保存しました',
    },
    list: {
      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: '予測設定を変更する権限がありません。',
  },
};
