Browse Source

Added Japanese language pack (Thanks to @nmori)

maziggy 3 months ago
parent
commit
588a771ea3
4 changed files with 3045 additions and 2 deletions
  1. 4 1
      frontend/src/i18n/index.ts
  2. 3040 0
      frontend/src/i18n/locales/ja.ts
  3. 0 0
      static/assets/index-DcyUztYr.js
  4. 1 1
      static/index.html

+ 4 - 1
frontend/src/i18n/index.ts

@@ -5,10 +5,12 @@ import LanguageDetector from 'i18next-browser-languagedetector';
 // Import translations directly for bundling
 // Import translations directly for bundling
 import en from './locales/en';
 import en from './locales/en';
 import de from './locales/de';
 import de from './locales/de';
+import ja from './locales/ja';
 
 
 const resources = {
 const resources = {
   en: { translation: en },
   en: { translation: en },
   de: { translation: de },
   de: { translation: de },
+  ja: { translation: ja },
 };
 };
 
 
 i18n
 i18n
@@ -17,7 +19,7 @@ i18n
   .init({
   .init({
     resources,
     resources,
     fallbackLng: 'en',
     fallbackLng: 'en',
-    supportedLngs: ['en', 'de'],
+    supportedLngs: ['en', 'de', 'ja'],
 
 
     detection: {
     detection: {
       // Order of detection methods
       // Order of detection methods
@@ -43,4 +45,5 @@ export default i18n;
 export const availableLanguages = [
 export const availableLanguages = [
   { code: 'en', name: 'English', nativeName: 'English' },
   { code: 'en', name: 'English', nativeName: 'English' },
   { code: 'de', name: 'German', nativeName: 'Deutsch' },
   { code: 'de', name: 'German', nativeName: 'Deutsch' },
+  { code: 'ja', name: 'Japanese', nativeName: '日本語' },
 ];
 ];

+ 3040 - 0
frontend/src/i18n/locales/ja.ts

@@ -0,0 +1,3040 @@
+export default {
+  // Navigation
+  nav: {
+    printers: 'プリンター',
+    archives: 'アーカイブ',
+    queue: 'キュー',
+    stats: '統計',
+    profiles: 'プロファイル',
+    maintenance: 'メンテナンス',
+    projects: 'プロジェクト',
+    files: 'ファイル管理',
+    settings: '設定',
+    system: 'システム',
+    collapseSidebar: 'サイドバーを閉じる',
+    expandSidebar: 'サイドバーを開く',
+    update: 'アップデート',
+    updateAvailable: 'アップデートあり: v{{version}}',
+    viewOnGithub: 'GitHubで表示',
+    keyboardShortcuts: 'キーボードショートカット (?)',
+    switchToLight: 'ライトモードに切替',
+    switchToDark: 'ダークモードに切替',
+  },
+
+  // Common
+  common: {
+    save: '保存',
+    cancel: 'キャンセル',
+    delete: '削除',
+    edit: '編集',
+    add: '追加',
+    close: '閉じる',
+    confirm: '確認',
+    loading: '読み込み中...',
+    error: 'エラー',
+    success: '成功',
+    warning: '警告',
+    enabled: '有効',
+    disabled: '無効',
+    yes: 'はい',
+    no: 'いいえ',
+    on: 'オン',
+    off: 'オフ',
+    all: 'すべて',
+    none: 'なし',
+    search: '検索',
+    filter: 'フィルター',
+    sort: '並べ替え',
+    refresh: '更新',
+    download: 'ダウンロード',
+    upload: 'アップロード',
+    actions: '操作',
+    status: 'ステータス',
+    name: '名前',
+    description: '説明',
+    date: '日付',
+    time: '時間',
+    hours: '時間',
+    minutes: '分',
+    seconds: '秒',
+    noPrinters: 'プリンターが登録されていません',
+    noData: 'データがありません',
+    required: '必須',
+    optional: 'オプション',
+    unknown: '不明',
+    done: '完了',
+    saving: '保存中...',
+    saveChanges: '変更を保存',
+    today: '今日',
+    turnOn: 'オンにする',
+    turnOff: 'オフにする',
+    deletePhoto: '写真を削除',
+    deletePhotoConfirm: 'この写真を削除しますか?元に戻せません。',
+    create: '作成',
+    print: '印刷',
+    clear: 'クリア',
+    project: 'プロジェクト',
+    archive: 'アーカイブ',
+    unknownError: '不明なエラー',
+    show: '表示',
+    hide: '非表示',
+    back: '戻る',
+    export: 'エクスポート',
+    import: 'インポート',
+    retry: 'リトライ',
+    printer: 'プリンター',
+    model: 'モデル',
+    ok: 'OK',
+  },
+
+  // Printers page
+  printers: {
+    title: 'プリンター',
+    addPrinter: 'プリンターを追加',
+    editPrinter: 'プリンターを編集',
+    deletePrinter: 'プリンターを削除',
+    printerName: 'プリンター名',
+    serialNumber: 'シリアル番号',
+    ipAddress: 'IPアドレス',
+    accessCode: 'アクセスコード',
+    model: 'モデル',
+    nozzleCount: 'ノズル数',
+    autoArchive: '自動アーカイブ',
+    connected: '接続中',
+    offline: 'オフライン',
+    unknownModel: '不明なモデル',
+    statusLabel: 'ステータス',
+    status: {
+      printing: '印刷中',
+      paused: '一時停止',
+      finished: '完了',
+      failed: '失敗',
+      idle: '待機中',
+    },
+    lastPrint: '最後',
+    readyToPrint: '印刷可能',
+    estimatedCompletion: '完了予定時刻',
+    filaments: 'フィラメント',
+    controls: 'コントロール',
+    external: '外部',
+    externalSpool: '外部スプール',
+    files: 'ファイル',
+    browseFiles: 'プリンターのファイルを参照',
+    update: 'アップデート',
+    loading: 'プリンターを読み込み中...',
+    hideOffline: 'オフラインを非表示',
+    ungrouped: '未グループ',
+    hmsErrors: 'クリックしてHMSエラーを表示',
+    slotOptions: 'スロットオプション',
+    rereadRfid: 'RFIDを再読み取り',
+    clickToView: 'クリックして表示',
+    maintenanceUpToDate: 'すべてのメンテナンスが最新です',
+    maintenanceDue: '{{count}}件のメンテナンス期限',
+    maintenanceDueSoon: '{{count}}件のメンテナンスがまもなく期限',
+    printsInQueue: 'キューに{{count}}件の印刷',
+    firmwareUpdateAvailable: 'ファームウェアアップデートあり: {{current}} \u2192 {{latest}}',
+    statusSummary: {
+      printing: '印刷中',
+      idle: '待機中',
+      offline: 'オフライン',
+    },
+    sort: {
+      name: '名前',
+      status: 'ステータス',
+      model: 'モデル',
+      location: 'ロケーション',
+      ascending: '昇順で並べ替え',
+      descending: '降順で並べ替え',
+    },
+    cardSize: {
+      small: '小',
+      medium: '中',
+      large: '大',
+      extraLarge: '特大',
+      cards: 'カード',
+    },
+    temps: {
+      nozzle: 'ノズル',
+      bed: 'ベッド',
+      chamber: 'チャンバー',
+      left: '左',
+      right: '右',
+      activeNozzle: 'アクティブ: {{side}}ノズル',
+    },
+    fans: {
+      partCooling: 'パーツ冷却ファン',
+      auxiliary: '補助ファン',
+      chamber: 'チャンバーファン',
+    },
+    printControl: {
+      stop: '停止',
+      pause: '一時停止',
+      resume: '再開',
+      stopPrint: '印刷を停止',
+      pausePrint: '印刷を一時停止',
+      resumePrint: '印刷を再開',
+    },
+    power: {
+      on: 'オン',
+      off: 'オフ',
+      powerOn: '電源オン',
+      autoOff: '自動オフ',
+      autoOffDone: '自動オフ完了',
+      autoOffTooltip: '印刷後に自動電源オフ',
+      autoOffExecutedTooltip: '自動オフが実行されました - リセットするにはプリンターの電源を入れてください',
+      offlineWithPlugs: 'スマートプラグ付きオフラインプリンター',
+      noPlugs: 'スマートプラグ付きプリンターなし',
+    },
+    chamberLight: {
+      turnOn: 'チャンバーライトをオン',
+      turnOff: 'チャンバーライトをオフ',
+    },
+    camera: {
+      openOverlay: 'カメラオーバーレイを開く',
+      openWindow: 'カメラを新しいウィンドウで開く',
+    },
+    menu: {
+      reconnect: '再接続',
+      mqttDebug: 'MQTTデバッグ',
+    },
+    confirm: {
+      deleteTitle: 'プリンターを削除',
+      deleteMessage: '「{{name}}」を削除しますか?すべての接続設定が削除されます。',
+      deleteArchives: '印刷アーカイブを削除',
+      deleteArchivesYes: 'このプリンターのすべての印刷履歴が完全に削除されます。',
+      deleteArchivesNo: '印刷履歴は保持されますが、このプリンターとの関連付けは解除されます。',
+      powerOnTitle: 'プリンターの電源をオン',
+      powerOnMessage: '「{{name}}」の電源をオンにしますか?',
+      powerOn: '電源オン',
+      powerOffTitle: 'プリンターの電源をオフ',
+      powerOffMessage: '「{{name}}」の電源をオフにしますか?',
+      powerOffWarning: '警告: 「{{name}}」は現在印刷中です!電源をオフにしますか?印刷が中断され、プリンターが損傷する可能性があります。',
+      powerOff: '電源オフ',
+      stopTitle: '印刷を停止',
+      stopMessage: '「{{name}}」の現在の印刷を停止しますか?印刷ジョブがキャンセルされます。',
+      stopButton: '印刷を停止',
+      pauseTitle: '印刷を一時停止',
+      pauseMessage: '「{{name}}」の現在の印刷を一時停止しますか?',
+      pauseButton: '印刷を一時停止',
+      resumeTitle: '印刷を再開',
+      resumeMessage: '「{{name}}」の印刷を再開しますか?',
+      resumeButton: '印刷を再開',
+    },
+    skipObjects: {
+      title: 'オブジェクトスキップ',
+      onlyWhilePrinting: 'オブジェクトスキップ(印刷中のみ)',
+      requires2Objects: 'オブジェクトスキップ(2つ以上のオブジェクトが必要)',
+      noObjects: 'オブジェクトが見つかりません',
+      objectsLoadedOnStart: 'オブジェクトは印刷開始時に読み込まれます',
+      matchIds: 'プリンターのディスプレイとIDを照合してください',
+      printerScreenShows: 'プリンター画面にビルドプレート上のオブジェクトIDが表示されます',
+      skippedCount: '{{skipped}}/{{total}}スキップ済み',
+      waitForLayer: 'オブジェクトをスキップするにはレイヤー2以降をお待ちください(現在レイヤー{{layer}})',
+      activeCount: '{{count}}個アクティブ',
+      willBeSkipped: 'スキップされます',
+      waitForLayer2: 'レイヤー2以降をお待ちください',
+      skipThisObject: 'このオブジェクトをスキップ',
+      skip: 'スキップ',
+      skipped: 'スキップ済み',
+    },
+    form: {
+      name: '名前',
+      namePlaceholder: 'マイプリンター',
+      ipAddress: 'IPアドレス',
+      serialNumber: 'シリアル番号',
+      serialCannotChange: 'シリアル番号は変更できません',
+      accessCode: 'アクセスコード',
+      accessCodePlaceholder: 'プリンター設定から取得',
+      accessCodeKeepCurrent: '現在のコードを維持する場合は空のまま',
+      modelOptional: 'モデル(任意)',
+      model: 'モデル',
+      selectModel: 'モデルを選択...',
+      locationGroup: 'ロケーション / グループ',
+      locationPlaceholder: '例: 工房、オフィス、地下室',
+      locationHint: 'プリンターのグループ化とキュージョブのフィルタリングに使用',
+      autoArchive: '完了した印刷を自動アーカイブ',
+    },
+    discovery: {
+      subnetToScan: 'スキャンするサブネット',
+      dockerSubnetHint: 'Dockerが検出されました。CIDR表記でプリンターのサブネットを入力してください。docker-compose.ymlにnetwork_mode: hostが必要です。',
+      scanning: 'スキャン中...',
+      scanningProgress: 'スキャン中... {{scanned}}/{{total}}',
+      scanSubnet: 'サブネットをスキャンしてプリンターを検出',
+      discoverNetwork: 'ネットワーク上のプリンターを検出',
+      serialRequired: 'シリアル番号が必要です',
+      scanningSubnet: 'サブネットでBambuプリンターをスキャン中...',
+      scanningNetwork: 'ネットワークをスキャン中...',
+      noPrintersSubnet: '指定されたサブネットにプリンターが見つかりません。',
+      noPrintersNetwork: 'ネットワーク上にプリンターが見つかりません。',
+      allConfigured: '検出されたすべてのプリンターは既に設定済みです。',
+    },
+    firmware: {
+      title: 'ファームウェアアップデート',
+      current: '現在',
+      latest: '最新',
+      releaseNotes: 'リリースノート',
+      checkingPrerequisites: '前提条件を確認中...',
+      sdCardReady: 'SDカード準備完了。下をクリックしてファームウェアをアップロードしてください。',
+      uploadedToSd: 'ファームウェアをSDカードにアップロードしました!',
+      applyInstructions: 'プリンターでアップデートを適用するには:',
+      step1: 'プリンターのタッチスクリーンで設定に移動',
+      step2: 'ファームウェアに移動',
+      step3: 'SDカードからアップデートを選択',
+      step4: 'アップデートには10〜20分かかります',
+      starting: '開始中...',
+      uploadFirmware: 'ファームウェアをアップロード',
+      uploadSuccess: 'ファームウェアをアップロードしました!プリンター画面からアップデートを実行してください。',
+    },
+    empty: {
+      noPrinters: 'プリンターがまだ設定されていません',
+      addFirst: '最初のプリンターを追加',
+    },
+    toast: {
+      printStopped: '印刷を停止しました',
+      printPaused: '印刷を一時停止しました',
+      printResumed: '印刷を再開しました',
+      failedToStop: '印刷の停止に失敗しました',
+      failedToPause: '印刷の一時停止に失敗しました',
+      failedToResume: '印刷の再開に失敗しました',
+      chamberLightOn: 'チャンバーライトをオンにしました',
+      chamberLightOff: 'チャンバーライトをオフにしました',
+      failedChamberLight: 'チャンバーライトの制御に失敗しました',
+      objectsSkipped: 'オブジェクトをスキップしました',
+      failedToSkipObjects: 'オブジェクトのスキップに失敗しました',
+      rfidRereadInitiated: 'RFID再読み取りを開始しました',
+      failedRfidReread: 'RFID再読み取りに失敗しました',
+    },
+    progress: '{{percent}}% 完了',
+    timeRemaining: '残り {{time}}',
+    maintenanceOk: 'メンテナンス正常',
+    maintenanceWarning: '{{count}}件の警告',
+    maintenanceWarning_plural: '{{count}}件の警告',
+    colors: {
+      unknown: '不明',
+      black: '黒',
+      white: '白',
+      darkGray: 'ダークグレー',
+      lightGray: 'ライトグレー',
+      gray: 'グレー',
+      brown: '茶色',
+      red: '赤',
+      orange: 'オレンジ',
+      yellow: '黄色',
+      green: '緑',
+      cyan: 'シアン',
+      blue: '青',
+      purple: '紫',
+      pink: 'ピンク',
+    },
+    humidity: {
+      unknown: '不明',
+      good: '良好',
+      fair: '注意',
+      bad: '警告',
+    },
+    temperature: {
+      good: '良好',
+      fair: '注意',
+      bad: '高温',
+    },
+    wifi: {
+      excellent: '非常に良い',
+      good: '良い',
+      fair: '普通',
+      weak: '弱い',
+      veryWeak: '非常に弱い',
+    },
+    h2Series: 'H2シリーズ',
+    x1Series: 'X1シリーズ',
+    pSeries: 'Pシリーズ',
+    a1Series: 'A1シリーズ',
+    searchPresets: 'プリセットを検索...',
+    noCloudPresets: 'クラウドプリセットがありません。Bambu Cloudにログインして同期してください。',
+    noMatchingPresets: '一致するプリセットが見つかりません。',
+    colorNamePlaceholder: '色の名前またはHex値(例:brown、FF8800)',
+    clearCustomColor: 'カスタムカラーをクリア',
+    copySpoolUuid: 'スプールUUIDをコピー',
+    configureSlot: 'フィラメントプロファイルとK値でスロットを設定',
+  },
+
+  // Archives page
+  archives: {
+    title: '印刷アーカイブ',
+    searchPlaceholder: 'アーカイブを検索...',
+    filterByPrinter: 'プリンターで絞り込み',
+    filterByStatus: 'ステータスで絞り込み',
+    sortBy: '並べ替え',
+    sortNewest: '新しい順',
+    sortOldest: '古い順',
+    sortName: '名前順',
+    sortDuration: '時間順',
+    noArchives: 'アーカイブが見つかりません',
+    printTime: '印刷時間',
+    filamentUsed: 'フィラメント使用量',
+    cost: 'コスト',
+    reprint: '再印刷',
+    preview: 'プレビュー',
+    deleteArchive: 'アーカイブを削除',
+    deleteConfirm: 'このアーカイブを削除しますか?',
+    favorite: 'お気に入り',
+    unfavorite: 'お気に入りから削除',
+    viewDetails: '詳細を表示',
+    status: {
+      completed: '完了',
+      failed: '失敗',
+      stopped: '中止',
+    },
+    // Collections
+    collections: {
+      all: 'すべてのアーカイブ',
+      recent: '過去24時間',
+      'this-week': '今週',
+      'this-month': '今月',
+      favorites: 'お気に入り',
+      failed: '失敗した印刷',
+      duplicates: '重複',
+    },
+    // Bulk operations
+    bulkDeleted: '{{count}}件のアーカイブを削除しました',
+    bulkDeleteFailed: 'アーカイブの削除に失敗しました',
+    bulkDeleteTitle: 'アーカイブを削除',
+    bulkDeleteConfirm: '{{count}}件のアーカイブを削除しますか?この操作は元に戻せません。',
+    deleteCount: '{{count}}件を削除',
+    // Drag & drop
+    only3mfSupported: '.3mfファイルのみ対応しています',
+    dropFilesHere: '.3mfファイルをここにドロップ',
+    releaseToUpload: 'ドロップしてアップロード',
+    // Selection toolbar
+    selectedCount: '{{count}}件選択中',
+    selectAll: 'すべて選択',
+    tags: 'タグ',
+    project: 'プロジェクト',
+    toggledFavorites: '{{count}}件のアーカイブのお気に入りを切替えました',
+    favoriteUpdateFailed: 'お気に入りの更新に失敗しました',
+    favoriteBulk: 'お気に入り',
+    // Page header
+    showingCount: '{{total}}件中{{shown}}件を表示',
+    export: 'エクスポート',
+    exportDownloaded: 'エクスポートをダウンロードしました',
+    exportFailed: 'エクスポートに失敗しました',
+    exportCsv: 'CSVでエクスポート',
+    exportExcel: 'Excelでエクスポート',
+    compare: '比較 ({{count}})',
+    select: '選択',
+    upload3mf: '3MFアップロード',
+    // Filters
+    allPrinters: 'すべてのプリンター',
+    allMaterials: 'すべての素材',
+    allFiles: 'すべてのファイル',
+    slicedGcode: 'スライス済み (GCODE)',
+    sourceFileOnly: 'ソースのみ',
+    showAll: 'すべて表示',
+    showFavoritesOnly: 'お気に入りのみ表示',
+    favorites: 'お気に入り',
+    showFailedPrints: '失敗した印刷を表示',
+    hideFailedPrints: '失敗した印刷を非表示',
+    hideFailed: '失敗を非表示',
+    allTags: 'すべてのタグ',
+    enterNewTag: '新しいタグを入力...',
+    sortNewestFirst: '新しい順',
+    sortOldestFirst: '古い順',
+    sortNameAZ: '名前 A-Z',
+    sortNameZA: '名前 Z-A',
+    sortLargestFirst: '大きい順',
+    sortSmallestFirst: '小さい順',
+    gridView: 'グリッド表示',
+    listView: 'リスト表示',
+    calendarView: 'カレンダー表示',
+    reset: 'リセット',
+    colors: 'カラー:',
+    matchAnyColor: 'いずれかの選択色に一致',
+    matchAllColors: 'すべての選択色に一致',
+    clear: 'クリア',
+    // Content
+    loading: 'アーカイブを読み込み中...',
+    noMatchingArchives: '検索に一致するアーカイブはありません',
+    noArchivesYet: 'アーカイブはまだありません',
+    autoCreated: '印刷完了時にアーカイブは自動的に作成されます',
+    unknownPrinter: '不明',
+    noPrinter: 'プリンターなし',
+    // ツールチップ
+    rightClickOptions: '右クリックでオプション表示',
+    printedBefore: 'このモデルは以前印刷されたことがあります',
+    openSource3mf: 'ソース3MFをBambu Studioで開く(右クリックでオプション表示)',
+    viewPhotos: '{{count}}枚の写真を表示',
+    openFolder: 'フォルダーを開く: {{name}}',
+    projectName: 'プロジェクト: {{name}}',
+    makerWorldDesigner: 'MakerWorld: {{designer}}',
+    notFromMakerWorld: 'MakerWorldではありません',
+    hasTimelapse: 'タイムラプスあり',
+    moreOptions: 'その他のオプション',
+    downloadF3d: 'Fusion 360デザインファイルをダウンロード',
+    // List view headers
+    listName: '名前',
+    listPrinter: 'プリンター',
+    listDate: '日付',
+    listSize: 'サイズ',
+    listActions: 'アクション',
+  },
+
+  // Queue page
+  queue: {
+    title: '印刷キュー',
+    description: '印刷ジョブのスケジュールと管理',
+    addToQueue: 'キューに追加',
+    clearQueue: 'キューをクリア',
+    clearHistory: '履歴をクリア',
+    emptyQueue: 'キューは空です',
+    position: '順番',
+    scheduledTime: '予定時刻',
+    moveUp: '上に移動',
+    moveDown: '下に移動',
+    remove: '削除',
+    requeue: '再キュー',
+    startNow: '今すぐ開始',
+    startPrint: '印刷を開始',
+    stopPrint: '印刷を停止',
+    unassigned: '未割当',
+    printerNumber: 'プリンター #{{id}}',
+    staged: 'ステージ済み',
+    requiresPreviousSuccess: '前の印刷の成功が必要',
+    autoPowerOff: '自動電源オフ',
+    printingInProgress: '印刷中...',
+    currentlyPrinting: '印刷中',
+    viewArchive: 'アーカイブを表示',
+    viewInFileManager: 'ファイルマネージャーで表示',
+    itemCount: '{{count}}件',
+    dragToReorder: 'ドラッグして並べ替え(ASAPのみ)',
+    overdue: '期限超過',
+    dragReorderTooltip: '順番はASAPアイテムのみに影響します。スケジュール済みアイテムは設定された時間に実行されます。',
+    anyModel: '任意の{{model}}{{location}}{{filaments}}',
+    addedBy: '{{username}}が追加',
+    bulkEdit: {
+      title: '{{count}}件のアイテムを編集',
+      description: '変更した設定のみが選択されたアイテムに適用されます。',
+      printer: 'プリンター',
+      noChange: '— 変更なし —',
+      queueOptions: 'キューオプション',
+      stagedManualStart: 'ステージ済み(手動開始)',
+      autoPowerOff: '印刷後に自動電源オフ',
+      requirePreviousSuccess: '前の印刷の成功が必要',
+      printOptions: '印刷オプション',
+      bedLevelling: 'ベッドレベリング',
+      flowCalibration: 'フローキャリブレーション',
+      vibrationCalibration: '振動キャリブレーション',
+      firstLayerInspection: '第一層検査',
+      timelapse: 'タイムラプス',
+      useAms: 'AMS使用',
+      on: 'オン',
+      off: 'オフ',
+      saving: '保存中...',
+      applyChanges: '変更を適用',
+    },
+    bulkActions: {
+      selectAll: 'すべて選択',
+      deselectAll: 'すべて選択解除',
+      selected: '{{count}}件選択中',
+      editSelected: '選択を編集',
+      cancelSelected: '選択をキャンセル',
+    },
+    permissions: {
+      noStopPermission: '印刷を停止する権限がありません',
+      noStartPermission: '印刷を開始する権限がありません',
+      noEditPermission: 'キューアイテムを編集する権限がありません',
+      noCancelPermission: 'キューアイテムをキャンセルする権限がありません',
+      noRequeuePermission: 'アイテムを再キューする権限がありません',
+      noRemovePermission: 'キューアイテムを削除する権限がありません',
+      noClearHistoryPermission: '履歴をクリアする権限がありません',
+    },
+    status: {
+      pending: '待機中',
+      printing: '印刷中',
+      completed: '完了',
+      failed: '失敗',
+      skipped: 'スキップ',
+      cancelled: 'キャンセル済み',
+      waiting: '待機中',
+    },
+    summary: {
+      printing: '印刷中',
+      queued: 'キュー中',
+      totalQueueTime: '合計キュー時間',
+      history: '履歴',
+    },
+    filters: {
+      allPrinters: 'すべてのプリンター',
+      allStatus: 'すべてのステータス',
+    },
+    sort: {
+      byPosition: '順番で並べ替え',
+      byName: '名前で並べ替え',
+      byPrinter: 'プリンターで並べ替え',
+      bySchedule: 'スケジュールで並べ替え',
+      byDate: '日付で並べ替え',
+      ascending: '昇順',
+      descending: '降順',
+      ascendingOldest: '昇順(古い順)',
+      descendingNewest: '降順(新しい順)',
+    },
+    empty: {
+      title: 'スケジュールされた印刷はありません',
+      description: 'アーカイブページのコンテキストメニューから「スケジュール」オプションを使用するか、ファイルをドラッグ&ドロップして始めましょう。',
+    },
+    confirm: {
+      cancelTitle: 'スケジュール済み印刷をキャンセル',
+      cancelMessage: '「{{name}}」をキャンセルしますか?',
+      cancelButton: '印刷をキャンセル',
+      stopTitle: '印刷を停止',
+      stopMessage: '現在の印刷「{{name}}」を停止しますか?プリンター上の印刷ジョブがキャンセルされます。',
+      stopButton: '印刷を停止',
+      removeTitle: '履歴から削除',
+      removeMessage: '「{{name}}」をキュー履歴から削除しますか?',
+      clearHistoryMessage: '{{count}}件の履歴をすべて削除しますか?',
+      thisPrint: 'この印刷',
+      thisItem: 'このアイテム',
+    },
+    toast: {
+      itemCancelled: 'キューアイテムをキャンセルしました',
+      itemRemoved: 'キューアイテムを削除しました',
+      printStopped: '印刷を停止しました',
+      printReleased: '印刷をキューに戻しました',
+      clearedHistory: '{{count}}件の履歴をクリアしました',
+      failedToCancel: 'アイテムのキャンセルに失敗しました',
+      failedToRemove: 'アイテムの削除に失敗しました',
+      failedToStop: '印刷の停止に失敗しました',
+      failedToStart: '印刷の開始に失敗しました',
+      failedToReorder: 'キューの並べ替えに失敗しました',
+      failedToClear: '履歴のクリアに失敗しました',
+      failedToUpdateItems: 'アイテムの更新に失敗しました',
+      cancelledItems: '{{count}}件のアイテムをキャンセルしました',
+      failedToCancelItems: 'アイテムの一括キャンセルに失敗しました',
+    },
+  },
+
+  // Statistics page
+  stats: {
+    title: '統計',
+    overview: '概要',
+    totalPrints: '総印刷数',
+    successRate: '成功率',
+    totalPrintTime: '総印刷時間',
+    totalFilament: '総フィラメント使用量',
+    totalCost: '総コスト',
+    averagePrintTime: '平均印刷時間',
+    printsPerDay: '1日あたりの印刷数',
+    byPrinter: 'プリンター別',
+    byMaterial: '素材別',
+    byMonth: '月別',
+    last7Days: '過去7日間',
+    last30Days: '過去30日間',
+    last90Days: '過去90日間',
+    allTime: '全期間',
+    // ダッシュボード
+    dashboard: '統計ダッシュボード',
+    dashboardDescription: '3Dプリントアクティビティの概要',
+    loadingStatistics: '統計を読み込み中...',
+    // クイック統計
+    quickStats: 'クイック統計',
+    printTime: '印刷時間',
+    filamentUsed: 'フィラメント使用量',
+    filamentCost: 'フィラメントコスト',
+    energyUsed: 'エネルギー使用量',
+    energyCost: 'エネルギーコスト',
+    // 成功率
+    successful: '成功',
+    failed: '失敗',
+    printsByPrinter: 'プリンター別印刷数',
+    printerFallback: 'プリンター #{{id}}',
+    // 時間精度
+    timeAccuracy: '時間精度',
+    noTimeAccuracyData: '時間精度データがありません',
+    perfectEstimate: '100% = 完全な推定',
+    // フィラメントタイプ
+    filamentTypes: 'フィラメントタイプ',
+    noFilamentData: 'フィラメントデータがありません',
+    printsCount: '{{count}}回印刷',
+    moreTypes: '+{{count}}種類',
+    // プリンター別印刷数
+    noPrinterData: 'プリンターデータがありません',
+    // フィラメントトレンド
+    filamentUsageTrends: 'フィラメント使用トレンド',
+    noPrintData: '印刷データがありません',
+    // 印刷アクティビティ
+    printActivity: '印刷アクティビティ',
+    // 失敗分析
+    failureAnalysis30Days: '失敗分析(30日間)',
+    noPrintDataLast30Days: '過去30日間の印刷データがありません',
+    printsFailed: '{{total}}回中{{failed}}回失敗',
+    lastWeek: '先週',
+    failureReasons: '失敗理由',
+    topFailureReasons: '主な失敗理由',
+    unknown: '不明',
+    moreReasons: '+{{count}}件の理由',
+    // レイアウトとエクスポート
+    hiddenCount: '{{count}}件非表示',
+    layoutReset: 'レイアウトをリセットしました',
+    resetLayout: 'レイアウトをリセット',
+    exportStats: '統計をエクスポート',
+    exportAsCsv: 'CSVでエクスポート',
+    exportAsExcel: 'Excelでエクスポート',
+    exportDownloaded: 'エクスポートをダウンロードしました',
+    exportFailed: 'エクスポートに失敗しました',
+    filament: 'フィラメント',
+    cost: 'コスト',
+    prints: 'プリント',
+    filamentGrams: 'フィラメント (g)',
+    // 追加の統計
+    weekOf: '週:',
+    periodFilament: '期間フィラメント',
+    periodCost: '期間コスト',
+    avgPerPrint: 'プリントあたりの平均',
+    total: '合計',
+    avg: '平均',
+    usageOverTime: '使用量の推移',
+    noDataForTimeRange: '選択した期間のデータがありません',
+    byFilamentType: 'フィラメントタイプ別',
+    usage: '使用量',
+    monthlyComparison: '月間比較',
+    noPermissionRecalculate: 'コストを再計算する権限がありません',
+    noPermissionResetLayout: 'レイアウトをリセットする権限がありません',
+    recalculateCosts: 'コストを再計算',
+    recalculateFailed: 'コストの再計算に失敗しました',
+    recalculateTooltip: '現在のフィラメント価格に基づいてすべてのプリントコストを再計算します',
+  },
+
+  // Profiles page
+  profiles: {
+    title: 'フィラメントプロファイル',
+    addProfile: 'プロファイルを追加',
+    editProfile: 'プロファイルを編集',
+    deleteProfile: 'プロファイルを削除',
+    material: '素材',
+    brand: 'ブランド',
+    color: '色',
+    diameter: '直径',
+    density: '密度',
+    costPerKg: '1kgあたりの価格',
+    spoolWeight: 'スプール重量',
+    noProfiles: 'プロファイルが登録されていません',
+    deleteConfirm: 'このプロファイルを削除しますか?',
+    templateName: 'テンプレート名',
+    descriptionOptional: '説明(任意)',
+    searchFields: 'フィールドを検索...',
+    presetNamePlaceholder: 'マイカスタムプリセット',
+    searchPresets: 'プリセットを検索...',
+    // Cloud login
+    connectToCloud: 'Bambu Cloudに接続',
+    syncDescription: 'デバイス間でスライサープリセットを同期',
+    email: 'メールアドレス',
+    password: 'パスワード',
+    region: 'リージョン',
+    regionGlobal: 'グローバル',
+    regionChina: '中国',
+    verificationCode: '認証コード',
+    checkEmail: 'メール ({{email}}) に届いた6桁のコードを入力してください',
+    accessToken: 'アクセストークン',
+    accessTokenHint: 'Bambu Labのアクセストークンを貼り付け(Bambu Studioから取得)',
+    login: 'ログイン',
+    verify: '認証',
+    setToken: 'トークン設定',
+    useTokenInstead: 'アクセストークンを使用',
+    loginWithEmail: 'メールでログイン',
+    loggedIn: 'ログインしました',
+    verificationSent: '認証コードをメールに送信しました',
+    tokenSet: 'トークンを設定しました',
+    loggedOut: 'ログアウトしました',
+    logout: 'ログアウト',
+    connectedAs: '接続中:',
+    // Page
+    pageTitle: 'プロファイル',
+    pageDescription: 'スライサープリセットと圧力キャリブレーションの管理',
+    cloudProfiles: 'クラウドプロファイル',
+    kProfiles: 'Kプロファイル',
+    scrollToTop: 'トップに戻る',
+    // Time
+    justNow: 'たった今',
+    minutesAgo: '{{count}}分前',
+    hoursAgo: '{{count}}時間前',
+    daysAgo: '{{count}}日前',
+    lastSynced: '最終同期:',
+    // Presets
+    duplicate: '複製',
+    myPresetEditable: 'マイプリセット(編集可能)',
+    editable: '編集可能',
+    typePreset: '{{type}}プリセット',
+    presetDeleted: 'プリセットを削除しました',
+    presetCreated: 'プリセットを作成しました',
+    presetUpdated: 'プリセットを更新しました',
+    presetExported: 'プリセットをエクスポートしました',
+    presetName: 'プリセット名',
+    failedToLoadDetails: 'プリセットの詳細を読み込めませんでした',
+    failedToLoadProfiles: 'プロファイルの読み込みに失敗しました',
+    deletePresetConfirm: 'このプリセットを削除しますか?',
+    deletePresetWarning: '"{{name}}"をBambu Cloudから完全に削除します。この操作は元に戻せません。',
+    noPresetsFound: 'プリセットが見つかりません',
+    showingPresets: '{{total}}件中{{count}}件を表示',
+    myPresetLegend: '= マイプリセット(編集可能)',
+    // Filters
+    typeLabel: 'タイプ',
+    typeFilter: 'タイプ:',
+    owner: '所有者',
+    myPresets: 'マイプリセット',
+    builtIn: 'ビルトイン',
+    nozzle: 'ノズル',
+    filament: 'フィラメント',
+    process: 'プロセス',
+    printer: 'プリンター',
+    layer: 'レイヤー',
+    clearFilters: 'フィルターをクリア',
+    noFilamentPresets: 'フィラメントプリセットなし',
+    noProcessPresets: 'プロセスプリセットなし',
+    noPrinterPresets: 'プリンタープリセットなし',
+    // Compare
+    compare: '比較',
+    compareMode: '比較モード',
+    comparePresets: 'プリセットを比較',
+    compareNow: '比較を実行',
+    compareWithBase: 'ベースプリセットと比較',
+    selectAnotherPreset: '同じタイプ({{type}})の別のプリセットを選択',
+    clickTwoPresets: '同じタイプのプリセットを2つクリックして比較',
+    selectFirst: '1. 最初を選択',
+    selectSecond: '2. 2番目を選択',
+    left: '左:',
+    right: '右:',
+    addedCount: '{{count}}件追加',
+    removedCount: '{{count}}件削除',
+    changedCount: '{{count}}件変更',
+    sameCount: '{{count}}件同じ',
+    changes: '変更点',
+    noDifferences: '差分はありません',
+    noFieldsMatch: '検索に一致するフィールドがありません',
+    field: 'フィールド',
+    // Templates
+    quickTemplates: 'クイックテンプレート',
+    templates: 'テンプレート',
+    deleteTemplate: 'テンプレートを削除',
+    actionCannotBeUndone: 'この操作は元に戻せません',
+    confirmDeleteTemplate: '"{{name}}"を削除してもよろしいですか?',
+    templateDeleted: 'テンプレートを削除しました',
+    templateUpdated: 'テンプレートを更新しました',
+    templateApplied: 'テンプレートを適用しました',
+    templateAppliedName: 'テンプレート適用: {{name}}',
+    templateSaved: 'テンプレートを保存しました',
+    customTemplate: 'カスタムテンプレート',
+    noTemplatesYet: 'テンプレートはまだありません',
+    createTemplatesHint: 'プリセットエディターからテンプレートを作成',
+    noTemplatesSelected: 'テンプレートが選択されていません。テンプレートボタンから有効にしてください。',
+    manageTemplatesHint: 'メインページのテンプレートボタンからテンプレートを管理',
+    settingsJson: '設定 (JSON)',
+    fieldsCount: '{{count}}フィールド',
+    shownInModals: 'モーダルに表示',
+    hiddenInModals: 'モーダルで非表示',
+    apply: '適用',
+    saveAsTemplate: 'テンプレートとして保存',
+    // Create/Edit preset
+    editPreset: 'プリセットを編集',
+    duplicatePreset: 'プリセットを複製',
+    createNewPreset: '新しいプリセットを作成',
+    newPreset: '新規プリセット',
+    customizeSettings: '新しいプリセットの設定をカスタマイズ',
+    dropJsonToImport: 'JSONファイルをドロップしてインポート',
+    basePreset: 'ベースプリセット',
+    selectBasePreset: 'ベースプリセットを選択...',
+    inheritsFrom: '継承元:',
+    commonTab: '共通',
+    allFieldsTab: '全フィールド',
+    jsonTab: 'JSON',
+    exportToJsonFile: '設定をJSONファイルにエクスポート',
+    importFromJsonFile: 'JSONファイルから設定をインポート',
+    commonSettings: '共通設定',
+    currentOverrides: '現在のオーバーライド',
+    availableFields: '利用可能なフィールド',
+    noMatchingFields: '一致するフィールドがありません',
+    allFieldsAdded: 'すべてのフィールドが追加済みです',
+    addCustomField: 'カスタムフィールドを追加',
+    yourOverrides: 'オーバーライド一覧',
+    noOverridesYet: 'オーバーライドはまだありません',
+    clickFieldsToAdd: '左のフィールドをクリックして追加',
+    dragDropTip: 'ヒント: このモーダルに.jsonファイルをドラッグ&ドロップして設定をインポート',
+    fieldAdded: 'フィールド "{{key}}" を追加しました',
+    noOverridesToSave: '保存するオーバーライドがありません',
+    fileImported: 'ファイルをインポートしました',
+    fileImportedSuccess: 'ファイルを正常にインポートしました',
+    invalidJson: '無効なJSON',
+    // 権限
+    noPermissionCreate: 'プロファイルを作成する権限がありません',
+    noPermissionDelete: 'プロファイルを削除する権限がありません',
+    noPermissionDuplicate: 'プロファイルを複製する権限がありません',
+    noPermissionEdit: 'プロファイルを編集する権限がありません',
+    noPermissionLogout: 'ログアウトする権限がありません',
+    noPermissionManageTemplates: 'テンプレートを管理する権限がありません',
+    noPermissionRefresh: 'プロファイルを更新する権限がありません',
+  },
+
+  // Maintenance page
+  maintenance: {
+    title: 'メンテナンス',
+    overview: '概要',
+    allOk: 'すべてのメンテナンスは最新です',
+    dueCount: '{{count}}件の期限到来',
+    dueCount_plural: '{{count}}件の期限到来',
+    warningCount: '{{count}}件の警告',
+    warningCount_plural: '{{count}}件の警告',
+    totalPrintTime: '総印刷時間',
+    nextMaintenance: '次回メンテナンス',
+    nothingDue: '予定なし',
+    tasks: 'タスク',
+    lastPerformed: '前回実施日',
+    interval: '間隔',
+    hoursRemaining: '残り{{hours}}時間',
+    hoursOverdue: '{{hours}}時間超過',
+    markDone: '完了にする',
+    performMaintenance: 'メンテナンスを実施',
+    history: '履歴',
+    noHistory: 'メンテナンス履歴がありません',
+    editPrintHours: '印刷時間を編集',
+    currentHours: '現在の時間',
+    today: '今日',
+    overdue: '期限超過',
+    dueSoon: 'まもなく期限',
+    collapse: '折りたたむ',
+    expand: '展開',
+    left: '残り',
+    timeBasedInterval: '時間ベースのインターバル',
+    viewDocumentation: 'ドキュメントを表示',
+    printersAssigned: '{{count}}台のプリンターが割り当て済み - クリックして管理',
+    deleteTypeConfirm: '「{{name}}」を削除しますか?',
+    removeFromPrinter: 'このプリンターから削除',
+    addLabel: '追加:',
+    maintenanceTypes: 'メンテナンスタイプ',
+    systemTypesDescription: 'システムタイプとカスタムメンテナンスタスク',
+    addCustomType: 'カスタムタイプを追加',
+    intervalType: 'インターバルタイプ',
+    printHours: '印刷時間',
+    calendarDays: 'カレンダー日数',
+    intervalWithUnit: 'インターバル ({{unit}})',
+    days: '日',
+    icon: 'アイコン',
+    documentationLink: 'ドキュメントリンク(任意)',
+    docLinkPlaceholder: 'ドキュメントリンク(任意)',
+    namePlaceholder: '例:HEPAフィルター交換',
+    assignToPrinters: 'プリンターに割り当て',
+    selectAtLeastOnePrinter: 'プリンターを1台以上選択してください',
+    addType: 'タイプを追加',
+    custom: 'カスタム',
+    assignedToPrinters: '割り当て済みプリンター:',
+    noPrintersAssigned: 'プリンター未割り当て',
+    intervalOverrides: 'インターバルのオーバーライド',
+    customizeIntervals: 'プリンターごとにインターバルをカスタマイズ',
+    addPrintersForMaintenance: 'メンテナンスインターバルを設定するにはプリンターを追加してください',
+    // ページレベルの文字列
+    reset: 'リセット',
+    countOverdue: '{{count}}件が期限超過',
+    countDueSoon: '{{count}}件がまもなく期限',
+    allGood: '問題なし',
+    nHours: '{{count}}時間',
+    tasksOverdue: '{{count}}件のタスクが期限超過',
+    configureDescription: 'メンテナンスタイプとインターバルを設定',
+    addPrintersToTrack: 'メンテナンスを追跡するにはプリンターを追加してください',
+    markedComplete: 'メンテナンスを完了としてマーク',
+    typeUpdated: 'メンテナンスタイプを更新しました',
+    typeDeleted: 'メンテナンスタイプを削除しました',
+    typeAdded: 'メンテナンスタイプを追加しました',
+    hoursUpdated: '印刷時間を更新しました',
+    printerAssigned: 'プリンターを割り当てました',
+    printerRemoved: 'プリンターを削除しました',
+    wikiUrlPlaceholder: 'https://wiki.bambulab.com/...',
+    // 期間フォーマット
+    duration: {
+      oneDay: '1日',
+      days: '{{count}}日',
+      weeks: '{{count}}週間',
+      months: '{{count}}ヶ月',
+      oneWeek: '1週間',
+      nWeeks: '{{count}}週間',
+      oneMonth: '1ヶ月',
+      nMonths: '{{count}}ヶ月',
+      oneYear: '1年',
+    },
+    // 権限
+    noPermissionCreate: 'メンテナンス記録を作成する権限がありません',
+    noPermissionUpdate: 'メンテナンス記録を更新する権限がありません',
+    noPermissionPerform: 'メンテナンスを実行する権限がありません',
+    noPermissionRemove: 'メンテナンス記録を削除する権限がありません',
+    noPermissionAssign: 'メンテナンスを割り当てる権限がありません',
+    noPermissionEditTypes: 'メンテナンスタイプを編集する権限がありません',
+    noPermissionDeleteTypes: 'メンテナンスタイプを削除する権限がありません',
+    noPermissionEditIntervals: 'メンテナンス間隔を編集する権限がありません',
+    noPermissionEditHours: 'メンテナンス時間を編集する権限がありません',
+    types: {
+      lubricateRails: 'リニアレールの潤滑',
+      cleanNozzle: 'ノズル/ホットエンドの清掃',
+      checkBelts: 'ベルト張力の確認',
+      cleanBuildPlate: 'ビルドプレートの清掃',
+      checkExtruder: 'エクストルーダーギアの確認',
+      checkCooling: '冷却ファンの確認',
+      generalInspection: '総合点検',
+      cleanCarbonRods: 'カーボンロッドの清掃',
+      checkPtfeTube: 'PTFEチューブの確認',
+      replaceHepaFilter: 'HEPAフィルター交換',
+      replaceCarbonFilter: 'カーボンフィルター交換',
+      lubricateLeftNozzleRail: '左ノズルレールの潤滑',
+    },
+  },
+
+  // Settings page
+  settings: {
+    title: '設定',
+    general: '一般',
+    appearance: '外観',
+    notifications: '通知',
+    smartPlugs: 'スマートプラグ',
+    tabSpoolman: 'Spoolman',
+    updates: 'アップデート',
+    language: '言語',
+    languageDescription: '表示言語を選択してください',
+    theme: 'テーマ',
+    themeLight: 'ライト',
+    themeDark: 'ダーク',
+    themeSystem: 'システム設定に従う',
+    defaultView: 'デフォルト画面',
+    defaultViewDescription: 'アプリ起動時に表示するページ',
+    checkForUpdates: 'アップデートを確認',
+    autoUpdate: '自動アップデート',
+    currentVersion: '現在のバージョン',
+    latestVersion: '最新バージョン',
+    upToDate: '最新です',
+    updateAvailable: 'アップデートあり',
+    telemetry: '匿名テレメトリ',
+    telemetryDescription: '匿名の使用状況データを送信してBamBuddyの改善に協力する',
+    telemetryLearnMore: '詳しく見る',
+    telemetryInfoTitle: 'どのようなデータが収集されますか?',
+    telemetryInfoIntro: 'BamBuddyはアプリの利用者数、使用バージョン、プリンターモデルを把握するために最小限の匿名データを収集します。これはバグ修正や新機能の優先順位付けに役立ちます。',
+    telemetryInfoCollected: '収集するデータ:',
+    telemetryInfoItem1: 'ランダムなインストールID(個人やハードウェアとは紐付きません)',
+    telemetryInfoItem2: '使用中のアプリバージョン',
+    telemetryInfoItem3: 'プリンターのモデル名(例: X1C, P1S)- 名前やシリアル番号は含みません',
+    telemetryInfoItem4: 'タイムスタンプ(日次/週次のアクティブユーザー数の計測用)',
+    telemetryInfoNotCollected: '収集しないデータ:',
+    telemetryInfoNotItem1: 'IPアドレスはハッシュ化され、復元できません',
+    telemetryInfoNotItem2: 'プリンター名、シリアル番号、アクセスコード',
+    telemetryInfoNotItem3: '印刷履歴、ファイル名、その他の個人的なコンテンツ',
+    telemetryInfoNotItem4: '個人を特定できる情報',
+    telemetryInfoFooter: 'テレメトリはいつでも無効にできます。インストールIDはランダムに生成され、個人を追跡することはできません。',
+    // Notifications
+    notificationLanguage: '通知の言語',
+    notificationLanguageDescription: 'プッシュ通知の言語',
+    notificationProviders: '通知プロバイダー',
+    addProvider: 'プロバイダーを追加',
+    editProvider: 'プロバイダーを編集',
+    providerType: 'プロバイダーの種類',
+    testNotification: 'テスト通知',
+    testSuccess: 'テスト通知を送信しました',
+    testFailed: 'テスト通知の送信に失敗しました',
+    quietHours: 'おやすみ時間',
+    quietHoursDescription: 'この時間帯は通知を送信しません',
+    quietHoursStart: '開始',
+    quietHoursEnd: '終了',
+    events: {
+      title: '通知イベント',
+      printStart: '印刷開始',
+      printComplete: '印刷完了',
+      printFailed: '印刷失敗',
+      printStopped: '印刷中止',
+      printProgress: '進捗マイルストーン',
+      printProgressDescription: '25%, 50%, 75%で通知',
+      printerOffline: 'プリンターオフライン',
+      printerError: 'プリンターエラー',
+      filamentLow: 'フィラメント残量低下',
+      maintenanceDue: 'メンテナンス期限',
+      maintenanceDueDescription: 'メンテナンスが必要なときに通知',
+    },
+    // Smart Plugs
+    smartPlug: {
+      title: 'スマートプラグ',
+      add: 'スマートプラグを追加',
+      edit: 'スマートプラグを編集',
+      name: '名前',
+      ipAddress: 'IPアドレス',
+      linkedPrinter: '連携プリンター',
+      autoOn: '自動電源オン',
+      autoOnDescription: '印刷開始時に電源を入れる',
+      autoOff: '自動電源オフ',
+      autoOffDescription: '印刷完了後に電源を切る',
+      offDelay: 'オフ遅延',
+      offDelayMinutes: '印刷後の待機時間(分)',
+      offDelayTemp: 'ノズル温度が下回ったとき',
+      currentState: '現在の状態',
+      turnOn: '電源オン',
+      turnOff: '電源オフ',
+    },
+    // Spoolman
+    spoolman: {
+      title: 'Spoolman連携',
+      description: 'Spoolmanに接続してフィラメント在庫を管理します。AMSデータは自動的に同期されます。',
+      howSyncWorks: '同期の仕組み',
+      syncInfo1: '公式Bambu LabスプールのみRFIDで同期されます',
+      syncInfo2: '新しいスプールは初回同期時にSpoolmanに自動作成されます',
+      syncInfo3: 'サードパーティ・詰め替えスプールはスキップされます',
+      linkingExisting: '既存スプールの連携',
+      linkingExistingDesc: '既存のSpoolmanスプールをAMSに連携するには、AMSスロットにカーソルを合わせて「Spoolmanに連携」をクリックしてください。',
+      enable: 'Spoolmanを有効化',
+      enableDesc: 'Spoolmanサーバーとフィラメントデータを同期',
+      url: 'Spoolman URL',
+      urlHint: 'SpoolmanサーバーのURL(例: http://localhost:7912)',
+      syncMode: '同期モード',
+      syncModeAuto: '自動',
+      syncModeManual: '手動のみ',
+      syncModeAutoDesc: '変更が検出されるとAMSデータが自動同期されます',
+      syncModeManualDesc: '手動トリガー時のみ同期',
+      statusLabel: 'ステータス:',
+      connected: '接続中',
+      disconnected: '未接続',
+      disconnect: '切断',
+      connect: '接続',
+      syncAmsData: 'AMSデータを同期',
+      syncAmsDataDesc: 'プリンターのAMSデータをSpoolmanに手動同期',
+      allPrinters: 'すべてのプリンター',
+      sync: '同期',
+      syncSuccess: '{{count}}個のスプールを同期しました',
+      syncWithErrors: '{{count}}個のスプールを同期({{errorCount}}件のエラー)',
+      spoolsSkipped: '{{count}}個のスプールをスキップ',
+      showAll: 'すべて表示',
+      showLess: '折りたたむ',
+      andMore: '...他{{count}}件',
+      errors: 'エラー:',
+      // LinkSpoolModal
+      linkToSpoolman: 'Spoolmanに連携',
+      linkingAmsTray: '連携するAMSトレイ:',
+      spoolUuid: 'スプールUUID:',
+      selectSpoolToLink: '連携するSpoolmanスプールを選択:',
+      unknownFilament: '不明なフィラメント',
+      noUnlinkedSpools: 'Spoolmanに未連携のスプールが見つかりません。',
+      allSpoolsLinked: 'すべてのスプールはAMSトレイに連携済みです。',
+      linking: '連携中...',
+      linkSpool: 'スプールを連携',
+      linkTooltip: 'このスプールをSpoolmanスプールに連携',
+      noUnlinked: '未連携のスプールがありません',
+    },
+
+    // Page
+    subtitle: 'Bambuddyの設定',
+    saved: '設定を保存しました',
+    saveFailed: '保存に失敗しました: {{error}}',
+
+    // Tabs
+    tabGeneral: '一般',
+    tabSmartPlugs: 'スマートプラグ',
+    tabNotifications: '通知',
+    tabFilament: 'フィラメント',
+    tabNetwork: 'ネットワーク',
+    tabApiKeys: 'APIキー',
+    tabVirtualPrinter: '仮想プリンター',
+    tabUsers: 'ユーザー',
+
+    // General - Date/Time
+    dateFormat: '日付形式',
+    timeFormat: '時刻形式',
+    systemDefault: 'システムデフォルト',
+    dateFormatUS: 'US (MM/DD/YYYY)',
+    dateFormatEU: 'EU (DD/MM/YYYY)',
+    dateFormatISO: 'ISO (YYYY-MM-DD)',
+    timeFormat12h: '12時間 (3:30 PM)',
+    timeFormat24h: '24時間 (15:30)',
+    defaultPrinter: 'デフォルトプリンター',
+    noDefaultPrinter: 'デフォルトなし(毎回選択)',
+    defaultPrinterDescription: 'アップロード、再印刷、その他の操作でこのプリンターを事前選択します。',
+    sidebarOrder: 'サイドバーの順序',
+    sidebarOrderDescription: 'サイドバーの項目をドラッグ&ドロップで並べ替えできます。ここでデフォルトの順序にリセットできます。',
+    reset: 'リセット',
+
+    // Appearance
+    darkMode: 'ダークモード',
+    lightMode: 'ライトモード',
+    active: '(有効)',
+    background: '背景',
+    accent: 'アクセント',
+    style: 'スタイル',
+    bgNeutral: 'ニュートラル',
+    bgWarm: 'ウォーム',
+    bgCool: 'クール',
+    bgOLED: 'OLED ブラック',
+    bgSlate: 'スレートブルー',
+    bgForest: 'フォレストグリーン',
+    accentGreen: 'グリーン',
+    accentTeal: 'ティール',
+    accentBlue: 'ブルー',
+    accentOrange: 'オレンジ',
+    accentPurple: 'パープル',
+    accentRed: 'レッド',
+    styleClassic: 'クラシック',
+    styleGlow: 'グロー',
+    styleVibrant: 'ビブラント',
+    themeToggleHint: 'サイドバーの太陽/月アイコンでダークモードとライトモードを切り替えます。',
+
+    // Archive Settings
+    archiveSettings: 'アーカイブ設定',
+    autoArchive: '自動アーカイブ',
+    autoArchiveDescription: '印刷完了時に3MFファイルを自動的に保存',
+    saveThumbnails: 'サムネイルを保存',
+    saveThumbnailsDescription: '3MFファイルからプレビュー画像を抽出して保存',
+    captureFinishPhoto: '完了写真を撮影',
+    captureFinishPhotoDescription: '印刷完了時にプリンターカメラから写真を撮影',
+    ffmpegNotInstalled: 'ffmpegがインストールされていません',
+    ffmpegInstruction: 'カメラキャプチャにはffmpegが必要です。brew install ffmpeg(macOS)またはapt install ffmpeg(Linux)でインストールしてください。',
+
+    // Camera
+    camera: 'カメラ',
+    cameraViewMode: 'カメラ表示モード',
+    cameraNewWindow: '新しいウィンドウ',
+    cameraEmbedded: '埋め込みオーバーレイ',
+    cameraEmbeddedDescription: 'メイン画面上のリサイズ可能なオーバーレイでカメラを開きます',
+    cameraNewWindowDescription: '別のブラウザウィンドウでカメラを開きます',
+
+    // Cost Tracking
+    costTracking: 'コスト追跡',
+    defaultFilamentCost: 'デフォルトフィラメントコスト(kg単位)',
+    currency: '通貨',
+    electricityCost: '電気代(kWh単位)',
+    energyDisplayMode: 'エネルギー表示モード',
+    energyPrintsOnly: '印刷のみ',
+    energyTotalConsumption: '総消費量',
+    energyPrintsOnlyDescription: 'ダッシュボードに印刷中に使用されたエネルギーの合計を表示',
+    energyTotalDescription: 'ダッシュボードにスマートプラグの累計エネルギーを表示',
+
+    // File Manager
+    fileManager: 'ファイルマネージャー',
+    archiveOnPrint: '印刷時のアーカイブエントリ作成',
+    archiveAlways: '常にアーカイブエントリを作成',
+    archiveNever: 'アーカイブエントリを作成しない',
+    archiveAsk: '毎回確認',
+    archiveOnPrintDescription: 'ファイルマネージャーから印刷する際、オプションでアーカイブエントリを作成',
+    lowDiskWarning: 'ディスク容量不足の警告',
+    lowDiskWarningDescription: '空きディスク容量がこのしきい値を下回ると警告を表示',
+
+    // Updates
+    checkPrinterFirmware: 'プリンターファームウェアの確認',
+    checkPrinterFirmwareDescription: 'Bambu Labのプリンターファームウェア更新を確認',
+    checkForUpdatesDescription: '起動時に自動的に新しいバージョンを確認',
+    checkNow: '今すぐ確認',
+    releaseNotes: 'リリースノート',
+    viewOnGitHub: 'GitHubで表示',
+    updateViaDocker: 'Docker Composeでアップデート:',
+    installUpdate: 'アップデートをインストール',
+    close: '閉じる',
+
+    // Data Management
+    dataManagement: 'データ管理',
+    backupData: 'データのバックアップ',
+    backupDescription: '設定、プロバイダー、プリンターなどをエクスポート',
+    export: 'エクスポート',
+    restoreBackup: 'バックアップの復元',
+    restoreDescription: '重複処理オプション付きでバックアップファイルから設定をインポート',
+    restore: '復元',
+    clearLogs: '通知ログを削除',
+    clearLogsDescription: '30日以上前の通知ログを削除',
+    clear: '削除',
+    resetUI: 'UIの設定をリセット',
+    resetUIDescription: 'サイドバーの順序、テーマ、表示モード、レイアウト設定をリセットします。プリンター、アーカイブ、設定には影響しません。',
+    clearLogsTitle: '通知ログを削除',
+    clearLogsMessage: '30日以上前のすべての通知ログを完全に削除します。この操作は元に戻せません。',
+    clearLogsConfirm: 'ログを削除',
+    clearLogsFailed: 'ログの削除に失敗しました',
+    resetUITitle: 'UIの設定をリセット',
+    resetUIMessage: 'すべてのUI設定をデフォルトにリセットします:サイドバーの順序、テーマ、ダッシュボードレイアウト、表示モード、ソート設定。プリンター、アーカイブ、サーバー設定には影響しません。クリア後にページが再読み込みされます。',
+    resetPreferences: '設定をリセット',
+    preferencesReset: 'UI設定をリセットしました。更新中...',
+
+    // Network
+    externalUrl: '外部URL',
+    externalUrlDescription: 'Bambuddyがアクセス可能な外部URL。通知画像や外部連携に使用されます。',
+    bambuddyUrl: 'Bambuddy URL',
+    externalUrlHint: 'プロトコルとポートを含めてください(例: http://192.168.1.100:8000)',
+    ftpRetry: 'FTPリトライ',
+    ftpRetryDescription: 'プリンターのWi-Fiが不安定な場合にFTP操作をリトライします。3MFダウンロード、印刷アップロード、タイムラプスダウンロード、ファームウェアアップデートに適用されます。',
+    enableRetry: 'リトライを有効化',
+    enableRetryDescription: '失敗したFTP操作を自動的にリトライ',
+    retryAttempts: 'リトライ回数',
+    times: '回',
+    retryAttemptsDescription: '諦めるまでのリトライ回数(1-10)',
+    retryDelay: 'リトライ間隔',
+    seconds: '秒',
+    retryDelayDescription: 'リトライ間の待ち時間(1-30)',
+    connectionTimeout: '接続タイムアウト',
+    connectionTimeoutDescription: '遅い接続用のソケットタイムアウト。Wi-Fiが弱いA1/A1 Miniプリンターの場合は増やしてください(10-120)',
+    homeAssistant: 'Home Assistant',
+    connected: '接続済み',
+    disconnected: '未接続',
+    homeAssistantDescription: 'Home Assistantに接続してHA REST APIでスマートプラグを制御します。switch、light、input_booleanエンティティに対応しています。',
+    enableHA: 'Home Assistantを有効化',
+    enableHADescription: 'Home Assistantでスマートプラグを制御',
+    haUrl: 'Home Assistant URL',
+    haToken: '長期アクセストークン',
+    haTokenHint: 'HAでトークンを作成: プロフィール → 長期アクセストークン → トークン作成',
+    testConnection: '接続テスト',
+    connectionSuccessful: '接続成功',
+    connectionFailed: '接続失敗',
+    haConnectionSuccess: 'Home Assistantへの接続に成功しました。',
+    haConnectionFailed: 'Home Assistantへの接続に失敗しました。',
+    mqttPublishing: 'MQTT配信',
+    mqttDescription: 'BamBuddyイベントを外部MQTTブローカーに配信し、Node-RED、Home Assistant、その他の自動化システムと連携します。',
+    enableMqtt: 'MQTTを有効化',
+    enableMqttDescription: '外部MQTTブローカーにイベントを配信',
+    brokerHostname: 'ブローカーホスト名',
+    port: 'ポート',
+    useTls: 'TLSを使用',
+    usernameOptional: 'ユーザー名(オプション)',
+    passwordOptional: 'パスワード(オプション)',
+    topicPrefix: 'トピックプレフィックス',
+    connectedTo: '接続先:',
+    notConnected: '未接続',
+
+    // Smart Plugs
+    smartPlugsDescription: 'スマートプラグ(TasmotaまたはHome Assistant)を接続して、電源制御を自動化し、プリンターのエネルギー消費を追跡します。',
+    turnAllPlugsOn: 'すべてのプラグをオン',
+    turnAllPlugsOff: 'すべてのプラグをオフ',
+    allOn: '全オン',
+    allOff: '全オフ',
+    addSmartPlug: 'スマートプラグを追加',
+    energySummary: 'エネルギー概要',
+    currentPower: '現在の電力',
+    today: '今日',
+    yesterday: '昨日',
+    total: '合計',
+    enablePlugsForEnergy: 'プラグを有効にしてエネルギー概要を表示',
+    noSmartPlugs: 'スマートプラグが設定されていません',
+    noSmartPlugsDescription: 'Tasmotaベースのスマートプラグを追加して、エネルギー消費を追跡し、電源制御を自動化します。',
+    addFirstSmartPlug: '最初のスマートプラグを追加',
+
+    // Notifications
+    providers: 'プロバイダー',
+    log: 'ログ',
+    testAll: 'すべてテスト',
+    add: '追加',
+    testResults: 'テスト結果',
+    dismiss: '閉じる',
+    noProviders: 'プロバイダーが設定されていません',
+    noProvidersDescription: 'アラートを受信するにはプロバイダーを追加してください。',
+    messageTemplates: 'メッセージテンプレート',
+    templatesDescription: '各イベントの通知メッセージをカスタマイズします。',
+    noTemplates: 'テンプレートがありません。バックエンドを再起動してデフォルトテンプレートを作成してください。',
+    testAllSuccess: 'すべて{{count}}件のプロバイダーのテストに成功しました!',
+    testAllPartial: '{{success}}/{{tested}}件のプロバイダーが成功',
+    testProvidersFailed: 'プロバイダーのテストに失敗しました: {{error}}',
+    bulkPlugSuccess: 'すべて{{count}}個のプラグを{{action}}にしました',
+    bulkPlugPartial: '{{success}}個のプラグを{{action}}にしました、{{failed}}個が失敗',
+    bulkPlugFailed: '失敗: {{error}}',
+
+    // API Keys
+    apiKeys: 'APIキー',
+    apiKeysDescription: '外部連携やWebhook用のAPIキーを作成します。',
+    createKey: 'キーを作成',
+    apiKeyCreated: 'APIキーを作成しました',
+    apiKeyDeleted: 'APIキーを削除しました',
+    apiKeySuccess: 'APIキーが正常に作成されました',
+    apiKeyCopyWarning: '今すぐこのキーをコピーしてください - 再表示されません!',
+    keyCopied: 'キーをクリップボードにコピーしました',
+    keyCopyFailed: 'キーのコピーに失敗しました',
+    keyAddedToBrowser: 'キーをAPIブラウザに追加しました',
+    useInBrowser: 'APIブラウザで使用',
+    createNewApiKey: '新しいAPIキーを作成',
+    keyName: 'キー名',
+    permissions: '権限',
+    readStatus: 'ステータスの読み取り',
+    readStatusDescription: 'プリンターのステータスとキューを表示',
+    manageQueue: 'キューの管理',
+    manageQueueDescription: '印刷キューへのアイテムの追加と削除',
+    controlPrinter: 'プリンターの制御',
+    controlPrinterDescription: '印刷の一時停止、再開、停止',
+    cancel: 'キャンセル',
+    lastUsed: '最終使用:',
+    badgeRead: '読取',
+    badgeQueue: 'キュー',
+    badgeControl: '制御',
+    noApiKeys: 'APIキーがありません',
+    noApiKeysDescription: '外部サービスとの連携用にAPIキーを作成してください。',
+    createFirstKey: '最初のキーを作成',
+    deleteApiKeyTitle: 'APIキーを削除',
+    deleteApiKeyMessage: 'このAPIキーを削除してもよろしいですか?このキーを使用しているすべての連携が動作しなくなります。',
+    deleteKey: 'キーを削除',
+    webhookEndpoints: 'Webhookエンドポイント',
+    webhookApiKeyHint: 'X-API-KeyヘッダーでAPIキーを使用してください。',
+    webhookGetAll: 'すべてのプリンターステータスを取得',
+    webhookGetOne: '特定のプリンターステータスを取得',
+    webhookQueue: '印刷キューに追加',
+    webhookPause: '印刷を一時停止',
+    webhookResume: '印刷を再開',
+    webhookStop: '印刷を停止',
+    apiBrowser: 'APIブラウザ',
+    apiBrowserDescription: 'すべての利用可能なAPIエンドポイントを探索してテストします。',
+    apiKeyForTesting: 'テスト用APIキー',
+    apiKeyHeaderHint: 'このキーはリクエストのX-API-Keyヘッダーとして送信されます。',
+    apiKeyCreateFailed: 'APIキーの作成に失敗しました: {{error}}',
+    apiKeyDeleteFailed: 'APIキーの削除に失敗しました: {{error}}',
+
+    // Filament
+    amsThresholds: 'AMS表示しきい値',
+    amsThresholdsDescription: 'AMS湿度と温度インジケーターの色しきい値を設定します。',
+    humidity: '湿度',
+    goodGreen: '良好(緑)≤',
+    fairOrange: '普通(オレンジ)≤',
+    aboveFairBad: '普通のしきい値以上は赤(悪い)で表示',
+    temperature: '温度',
+    goodBlue: '良好(青)≤',
+    aboveFairHot: '普通のしきい値以上は赤(高温)で表示',
+    historyRetention: '履歴の保持',
+    keepHistoryFor: 'センサー履歴の保持期間',
+    days: '日',
+    historyRetentionDescription: '古い湿度と温度データは自動的に削除されます',
+    printModal: '印刷ダイアログ',
+    expandMapping: 'カスタムマッピングをデフォルトで展開',
+    expandMappingDescription: '複数のプリンターに印刷する際、プリンターごとのAMSマッピングを展開して表示',
+
+    // Users
+    currentUser: '現在のユーザー',
+    role: 'ロール:',
+    roleAdmin: '管理者',
+    roleUser: 'ユーザー',
+    manageUsers: 'ユーザー管理',
+    disableAuth: '認証を無効化',
+    rolePermissions: 'ロール権限',
+    rolePermissionsDescription: '各ロールの権限の概要。',
+    adminPerm1: 'プリンター設定の管理',
+    adminPerm2: 'ユーザーの作成、編集、削除',
+    adminPerm3: 'すべてのシステム機能へのアクセス',
+    userPerm1: '印刷ジョブの送信',
+    userPerm2: 'ファイルとアーカイブの管理',
+    userPerm3: 'フィラメントの管理',
+    disableAuthTitle: '認証を無効化',
+    disableAuthMessage: '認証を無効にしてもよろしいですか?これにより、Bambuddyインスタンスはログインなしでアクセス可能になります。すべてのユーザーはデータベースに残りますが、認証は無効になります。',
+    disableAuthConfirm: '認証を無効化',
+    authDisabledSuccess: '認証を正常に無効化しました',
+    disableAuthFailed: '認証の無効化に失敗しました',
+    unknownError: '不明なエラー',
+    haUrlPlaceholder: 'http://homeassistant.local:8123',
+    haTokenPlaceholder: '長期アクセストークン',
+    mqttHostPlaceholder: '例: 192.168.1.100',
+    leaveEmptyAnonymous: '匿名接続の場合は空欄',
+    mqttTopicDefault: 'bambuddy',
+    apiKeyNamePlaceholder: '例: Home Assistantインテグレーション',
+    apiKeyTestPlaceholder: 'テスト用APIキーを貼り付け',
+    unnamedKey: '名前なしキー',
+    plugsOnline: '{{online}}/{{total}} オンライン',
+    passed: '{{count}}件 成功',
+    failed: '{{count}}件 失敗',
+    externalUrlPlaceholder: 'http://192.168.1.100:8000',
+    bulkPlugTitle: 'すべてのプラグを{{action}}',
+    bulkPlugMessage: '有効な{{count}}個のスマートプラグをすべて{{action}}しますか?',
+    bulkPlugConfirm: 'すべて{{action}}',
+    updateCheckFailed: '確認失敗: {{error}}',
+    releaseNotesTitle: 'リリースノート - v{{version}}',
+    mqttTopicsHint: 'トピック: {{prefix}}/printers/<serial>/status など',
+    virtualPrinterUpdated: '仮想プリンター設定を更新しました',
+    vp: {
+      title: '仮想プリンター',
+      running: '稼働中',
+      stopped: '停止中',
+      description: 'Bambu StudioやOrcaSlicerに表示される仮想プリンターを有効にします。このプリンターに送信されたファイルは印刷せずに直接アーカイブされます。',
+      enable: '仮想プリンターを有効化',
+      visibleInSlicer: 'スライサーの検出リストに「Bambuddy」として表示',
+      notVisible: 'スライサーに表示されません',
+      printerModel: 'プリンターモデル',
+      printerModelDescription: 'エミュレートするプリンターモデルを選択します。',
+      modelRestartWarning: 'モデルを変更すると仮想プリンターが再起動されます',
+      accessCode: 'アクセスコード',
+      accessCodeSet: 'アクセスコードが設定済み',
+      noAccessCode: 'アクセスコード未設定 - 有効化に必要です',
+      accessCodeRequired: '先にアクセスコードを設定してください',
+      accessCodeEmpty: 'アクセスコードは空にできません',
+      accessCodeLength: 'アクセスコードは8文字である必要があります',
+      accessCodeHint: '8文字である必要があります。スライサーの認証に使用されます。',
+      mode: 'モード',
+      modeArchive: 'アーカイブ',
+      modeArchiveDesc: 'ファイルを即座にアーカイブ',
+      modeReview: 'レビュー',
+      modeReviewDesc: 'アーカイブ前にレビューとタグ付け',
+      modeQueue: 'キュー',
+      modeQueueDesc: 'アーカイブしてキューに追加',
+      setupRequired: 'セットアップが必要',
+      setupDescription: '仮想プリンター機能を使用するには、追加のシステム設定が必要です。ポートフォワーディング、ファイアウォールルール、プラットフォーム固有の設定が含まれます。',
+      readSetupGuide: '有効化する前にセットアップガイドをお読みください',
+      howItWorks: '仕組み:',
+      step1: 'お使いのプラットフォームのセットアップガイドを完了する',
+      step2: '仮想プリンターを有効にしてアクセスコードを設定する',
+      step3: 'Bambu StudioまたはOrcaSlicerで「プリンターを追加」を開く',
+      step4: '検出リストに「Bambuddy」プリンターが表示される',
+      step5: '設定したアクセスコードで接続する',
+      step6: 'Bambuddyに「印刷」すると、3MFファイルがアーカイブされる',
+      statusDetails: 'ステータス詳細',
+      printerName: 'プリンター名',
+      model: 'モデル',
+      serialNumber: 'シリアルナンバー',
+      pendingFiles: '保留中のファイル',
+    },
+    enterNewCodeToChange: '新しいコードを入力して変更',
+    enter8CharCode: '8文字のコードを入力',
+    notificationTitlePlaceholder: '通知タイトル...',
+    notificationBodyPlaceholder: '通知本文...',
+    templateTitleRequired: 'タイトルは必須です',
+    templateBodyRequired: '本文は必須です',
+    editTemplate: 'テンプレートを編集: {{name}}',
+    templateTitle: 'タイトル',
+    templateBody: '本文',
+    availableVariables: '利用可能な変数',
+    insertVariableHint: 'クリックして本文のカーソル位置に挿入',
+    livePreview: 'ライブプレビュー',
+    loadingPreview: 'プレビューを読み込み中...',
+    previewTitle: 'タイトル:',
+    previewBody: '本文:',
+    enterTemplateToPreview: 'テンプレートの内容を入力するとプレビューが表示されます',
+    resetToDefault: 'デフォルトに戻す',
+    noExternalLinks: '外部リンクが設定されていません',
+    clickAddLink: '「リンクを追加」をクリックして追加',
+    deleteLink: 'リンクを削除',
+    deleteLinkConfirm: '「{{name}}」を削除しますか?この操作は取り消せません。',
+    editLink: 'リンクを編集',
+    addExternalLink: '外部リンクを追加',
+    addLink: 'リンクを追加',
+    sidebarLinks: 'サイドバーリンク',
+    sidebarLinksDescription: '外部リンクをサイドバーナビゲーションに追加します。ドラッグで並べ替え。',
+    linkNamePlaceholder: 'マイリンク',
+    linkNameLabel: '名前',
+    linkUrlLabel: 'URL',
+    linkIconLabel: 'アイコン',
+    linkCustomIcon: 'カスタムアイコン',
+    linkCustomIconHint: 'PNG, JPG, GIF, SVG, WebP, ICO。最大1MB。',
+    linkChoosePresetIcon: 'またはプリセットアイコンを選択',
+    linkNameRequired: '名前は必須です',
+    linkUrlRequired: 'URLは必須です',
+    linkUrlInvalid: 'URLは http:// または https:// で始まる必要があります',
+    linkInvalidImageType: '有効な画像ファイルを選択してください(PNG, JPG, GIF, SVG, WebP, ICO)',
+    linkImageTooLarge: '画像ファイルは1MB以下にしてください',
+    removeCustomIcon: 'カスタムアイコンを削除',
+    jsonRequestBody: 'JSONリクエストボディ...',
+    searchEndpoints: 'エンドポイントを検索...',
+    // Groups and Users
+    groups: 'グループ',
+    addGroup: 'グループを追加',
+    noGroupsFound: 'グループが見つかりません',
+    systemGroup: 'システム',
+    noDescription: '説明なし',
+    users: 'ユーザー',
+    addUser: 'ユーザーを追加',
+    noUsersFound: 'ユーザーが見つかりません',
+    admin: '管理者',
+    authentication: '認証',
+    authEnableDescription: '認証を有効にして、ユーザーアカウントの作成、権限の管理、Bambuddyインスタンスのセキュリティ保護を行います。',
+    authSecuredDescription: 'Bambuddyインスタンスは認証で保護されています。',
+    enable: '有効にする',
+    disable: '無効にする',
+    changePassword: 'パスワードを変更',
+    backup: 'バックアップ',
+    backupAndRestore: 'バックアップと復元',
+    backupAndRestoreDescription: 'Bambuddyデータのバックアップを作成および復元します',
+    goToBackup: 'バックアップへ移動',
+    homeAssistantDescriptionFull: 'Home Assistantに接続してスマートホームデバイスを制御します',
+    usersCount: '{{count}}人のユーザー',
+    permissionsCount: '{{count}}個の権限',
+
+    // Users tab - Auth Disabled
+    authDisabledTitle: '認証が無効です',
+    authDisabledDescription: '認証を有効にして、ユーザーアカウントの作成、権限の管理、Bambuddyインスタンスのセキュリティを確保しましょう。',
+    authFeature1: 'システムへのアクセスにログインを要求',
+    authFeature2: 'グループベースの権限を持つ複数のユーザーを作成',
+    authFeature3: '50以上のきめ細かい権限でアクセスを制御',
+    enableAuthentication: '認証を有効にする',
+
+    // Users tab - Create User Modal
+    createUser: 'ユーザーを作成',
+    username: 'ユーザー名',
+    enterUsername: 'ユーザー名を入力',
+    password: 'パスワード',
+    enterPassword: 'パスワードを入力(6文字以上)',
+    confirmPassword: 'パスワードの確認',
+    confirmPasswordPlaceholder: 'パスワードを確認',
+    passwordsDoNotMatch: 'パスワードが一致しません',
+    groupsLabel: 'グループ',
+    systemLabel: '(システム)',
+    noGroupsAvailable: '利用可能なグループがありません',
+    creating: '作成中...',
+
+    // Users tab - Edit User Modal
+    editUser: 'ユーザーを編集',
+    leaveBlankToKeep: '(現在のパスワードを維持する場合は空白)',
+    enterNewPassword: '新しいパスワードを入力',
+    confirmNewPassword: '新しいパスワードを確認',
+
+    // Users tab - Delete User
+    deleteUser: 'ユーザーを削除',
+    deleteUserConfirm: 'このユーザーを削除してもよろしいですか?この操作は元に戻せません。',
+
+    // Users tab - Create/Edit Group Modal
+    createGroup: 'グループを作成',
+    editGroup: 'グループを編集',
+    groupName: 'グループ名',
+    enterGroupName: 'グループ名を入力',
+    systemGroupNameReadonly: 'システムグループ名は変更できません',
+    descriptionLabel: '説明',
+    enterDescription: '説明を入力(任意)',
+    permissionsSelected: '権限({{count}}件選択中)',
+
+    // Users tab - Delete Group
+    deleteGroup: 'グループを削除',
+    deleteGroupConfirm: 'このグループを削除してもよろしいですか?このグループのユーザーはこれらの権限を失います。',
+
+    // Users tab - Change Password Modal
+    changePasswordTitle: 'パスワードの変更',
+    currentPassword: '現在のパスワード',
+    enterCurrentPassword: '現在のパスワードを入力',
+    newPassword: '新しいパスワード',
+    enterNewPasswordMin6: '新しいパスワードを入力(6文字以上)',
+    confirmNewPasswordPlaceholder: '新しいパスワードを確認',
+    passwordMinLength: 'パスワードは6文字以上である必要があります',
+    passwordChanged: 'パスワードが正常に変更されました',
+    failedToChangePassword: 'パスワードの変更に失敗しました',
+    changingPassword: '変更中...',
+
+    // Prometheus Metrics
+    prometheusTitle: 'Prometheusメトリクス',
+    prometheusDescriptionPre: 'プリンターメトリクスを',
+    prometheusDescriptionPost: 'でPrometheus/Grafanaモニタリング用に公開します。',
+    enableMetricsEndpoint: 'メトリクスエンドポイントを有効化',
+    exposePrometheusData: 'プリンターデータをPrometheus形式で公開',
+    bearerTokenOptional: 'Bearerトークン(任意)',
+    bearerTokenPlaceholder: '認証不要の場合は空欄のまま',
+    bearerTokenHint: '設定した場合、リクエストに次のヘッダーが必要: ',
+    availableMetrics: '利用可能なメトリクス',
+    metricConnectionStatus: '接続状態',
+    metricPrinterState: 'プリンター状態(アイドル/印刷中など)',
+    metricPrintProgress: '印刷進捗 0-100%',
+    metricBedTemp: 'ベッド温度',
+    metricNozzleTemp: 'ノズル温度',
+    metricPrintsTotal: '結果別の合計印刷数',
+    metricAndMore: '...その他(レイヤー、ファン、キュー、フィラメント使用量)',
+  },
+
+  // Notifications (for push notifications)
+  notification: {
+    printStarted: {
+      title: '印刷開始',
+      body: '{{printer}}: {{filename}} の印刷を開始しました',
+    },
+    printCompleted: {
+      title: '印刷完了',
+      body: '{{printer}}: {{filename}} が正常に完了しました',
+    },
+    printFailed: {
+      title: '印刷失敗',
+      body: '{{printer}}: {{filename}} が失敗しました',
+    },
+    printStopped: {
+      title: '印刷中止',
+      body: '{{printer}}: {{filename}} が中止されました',
+    },
+    printProgress: {
+      title: '印刷進捗',
+      body: '{{printer}}: {{filename}} は {{percent}}% 完了',
+    },
+    printerOffline: {
+      title: 'プリンターオフライン',
+      body: '{{printer}} がオフラインです',
+    },
+    printerError: {
+      title: 'プリンターエラー',
+      body: '{{printer}}: {{error}}',
+    },
+    filamentLow: {
+      title: 'フィラメント残量低下',
+      body: '{{printer}}: フィラメントが残りわずかです',
+    },
+    maintenanceDue: {
+      title: 'メンテナンス期限',
+      body: '{{printer}}: {{items}} の対応が必要です',
+    },
+  },
+
+  // Errors
+  errors: {
+    generic: '問題が発生しました',
+    networkError: 'ネットワークエラーです。接続を確認してください。',
+    notFound: '見つかりません',
+    unauthorized: '認証エラー',
+    serverError: 'サーバーエラー',
+    validationError: '入力内容を確認してください',
+    printerConnectionFailed: 'プリンターへの接続に失敗しました',
+    saveFailed: '保存に失敗しました',
+    deleteFailed: '削除に失敗しました',
+    loadFailed: 'データの読み込みに失敗しました',
+  },
+
+  // Confirmations
+  confirm: {
+    delete: '削除しますか?',
+    unsavedChanges: '保存されていない変更があります。このページを離れますか?',
+    clearQueue: 'キューをクリアしますか?',
+  },
+
+  // Calendar
+  calendar: {
+    months: {
+      january: '1月', february: '2月', march: '3月',
+      april: '4月', may: '5月', june: '6月',
+      july: '7月', august: '8月', september: '9月',
+      october: '10月', november: '11月', december: '12月',
+    },
+    daysShort: {
+      sun: '日', mon: '月', tue: '火', wed: '水',
+      thu: '木', fri: '金', sat: '土',
+    },
+  },
+
+  // 通知ログ
+  notificationLog: {
+    title: '通知ログ',
+    lastDays: '過去{{days}}日間:',
+    notifications: '件の通知',
+    sent: '送信済み',
+    failed: '失敗',
+    last24Hours: '過去24時間',
+    showFailedOnly: '失敗のみ表示',
+    clearOld: '古いログを削除',
+    noFailedNotifications: '失敗した通知はありません',
+    noNotificationsLogged: '通知ログはありません',
+    unknownProvider: '不明なプロバイダー',
+    titleLabel: 'タイトル',
+    messageLabel: 'メッセージ',
+    errorLabel: 'エラー',
+    provider: 'プロバイダー:',
+    time: '時間:',
+    clearLogsFailed: 'ログの削除に失敗しました: {{error}}',
+    events: {
+      print_start: '印刷開始',
+      print_complete: '印刷完了',
+      print_failed: '印刷失敗',
+      print_stopped: '印刷中止',
+      print_progress: '進捗',
+      printer_offline: 'プリンターオフライン',
+      printer_error: 'プリンターエラー',
+      filament_low: 'フィラメント残量低下',
+      maintenance_due: 'メンテナンス期限',
+      ams_humidity_high: 'AMS湿度高',
+      ams_temperature_high: 'AMS温度高',
+      test: 'テスト',
+    },
+  },
+
+  // Notification providers
+  providers: {
+    callmebot: 'CallMeBot/WhatsApp',
+    ntfy: 'ntfy',
+    pushover: 'Pushover',
+    telegram: 'Telegram',
+    email: 'メール',
+    discord: 'Discord',
+    webhook: 'Webhook',
+    descriptions: {
+      email: 'SMTPメール通知',
+      telegram: 'Telegramボット経由の通知',
+      discord: 'Webhook経由でDiscordチャンネルに送信',
+      ntfy: '無料のセルフホスト対応プッシュ通知',
+      pushover: 'シンプルで確実なプッシュ通知',
+      callmebot: 'CallMeBot経由の無料WhatsApp通知',
+      webhook: '任意のURLへの汎用HTTP POST',
+    },
+  },
+
+  // Backup / Restore
+  backup: {
+    categories: {
+      settings: '設定',
+      notification_providers: '通知プロバイダー',
+      notification_templates: '通知テンプレート',
+      smart_plugs: 'スマートプラグ',
+      printers: 'プリンター',
+      filaments: 'フィラメント',
+      maintenance_types: 'メンテナンスタイプ',
+      archives: 'アーカイブ',
+      projects: 'プロジェクト',
+      pending_uploads: 'アップロード待ち',
+      external_links: '外部リンク',
+      api_keys: 'APIキー',
+    },
+    notificationProviders: '通知プロバイダー',
+    notificationTemplates: '通知テンプレート',
+    externalLinks: '外部リンク',
+    printers: 'プリンター',
+    filamentInventory: 'フィラメント在庫',
+    maintenanceTypes: 'メンテナンスタイプ',
+    printArchives: '印刷アーカイブ',
+    projects: 'プロジェクト',
+    pendingUploads: '保留中のアップロード',
+    apiKeys: 'APIキー',
+    settingsDescription: '言語、テーマ、更新設定',
+    notificationProvidersDescription: 'ntfy、Pushover、Discordなど',
+    notificationTemplatesDescription: 'カスタムメッセージテンプレート',
+    smartPlugsDescription: 'Tasmotaプラグ設定',
+    externalLinksDescription: '外部サービスへのサイドバーリンク',
+    printersDescription: 'プリンター情報(アクセスコードを除く)',
+    filamentInventoryDescription: 'フィラメントの種類とコスト',
+    maintenanceDescription: 'カスタムメンテナンススケジュール',
+    printArchivesDescription: '全印刷データ+ファイル(3MF、サムネイル、写真)',
+    projectsDescription: 'プロジェクト、BOMアイテム、添付ファイル',
+    pendingUploadsDescription: 'レビュー待ちの仮想プリンターアップロード',
+    apiKeysDescription: 'Webhook APIキー(インポート時に新しいキーが生成されます)',
+  },
+
+  // Restore modal
+  restore: {
+    failedToRestore: 'バックアップの復元に失敗しました。ファイル形式を確認してください。',
+    title: 'バックアップの復元',
+    restoring: '復元中...',
+    complete: '復元完了',
+    failed: '復元失敗',
+    importDescription: 'バックアップファイルから設定をインポート',
+    pleaseWait: 'データを復元しています。しばらくお待ちください',
+    duplicateHandling: '重複処理の仕組み:',
+    clickToSelect: 'クリックしてバックアップファイルを選択 (.json または .zip)',
+    replaceExisting: '既存データを上書き',
+    keepExisting: '既存データを保持',
+    overwriteDescription: '既に存在する項目をバックアップデータで上書きします',
+    skipDescription: 'まだ存在しない項目のみ復元します',
+    caution: '注意:',
+    overwriteWarning: '上書きすると、現在の設定がバックアップのデータに置き換えられます。セキュリティのため、プリンターのアクセスコードは上書きされません。',
+    restore: '復元',
+    processing: 'バックアップファイルを処理中...',
+    itemsRestored: '復元済み項目',
+    itemsSkipped: 'スキップ済み項目',
+    restoredSection: '復元済み',
+    filesSection: 'ファイル (3MF、サムネイルなど)',
+    skippedSection: 'スキップ (既に存在)',
+    andMore: '...他 {{count}} 件',
+    newApiKeys: '新しいAPIキーが生成されました',
+    copyKeysWarning: 'これらのキーは一度だけ表示されます。今すぐコピーしてください!',
+    copy: 'コピー',
+    noDataFound: 'バックアップファイルに復元するデータが見つかりませんでした。',
+    dupPrinters: 'プリンター',
+    dupPrintersDesc: 'シリアル番号で照合',
+    dupSmartPlugs: 'スマートプラグ',
+    dupSmartPlugsDesc: 'IPアドレスで照合',
+    dupNotificationProviders: '通知プロバイダー',
+    dupNotificationProvidersDesc: '名前で照合',
+    dupFilaments: 'フィラメント',
+    dupFilamentsDesc: '名前 + 種類 + ブランドで照合',
+    dupArchives: 'アーカイブ',
+    dupArchivesDesc: 'コンテンツハッシュで照合 (常にスキップ)',
+    dupPendingUploads: 'アップロード待ち',
+    dupPendingUploadsDesc: 'ファイル名で照合',
+    dupSettingsTemplates: '設定とテンプレート',
+    dupSettingsTemplatesDesc: '常に上書き',
+  },
+
+  // File manager
+  files: {
+    root: 'ルート',
+    cache: 'キャッシュ',
+    models: 'モデル',
+    timelapse: 'タイムラプス',
+    used: '使用中:',
+    free: '空き:',
+    filterPlaceholder: 'ファイルを検索...',
+    noFiles: 'このディレクトリにファイルがありません',
+    deleteFile: 'ファイルを削除',
+    deleteConfirm: '"{{name}}"を削除しますか?この操作は元に戻せません。',
+    // ファイル管理ページ
+    fileManager: 'ファイル管理',
+    pageDescription: 'プリントファイルを整理・管理',
+    newFolder: '新しいフォルダ',
+    folderName: 'フォルダ名',
+    folderNamePlaceholder: '例: 機能パーツ',
+    renameFile: 'ファイル名を変更',
+    renameFolder: 'フォルダ名を変更',
+    rename: '名前変更',
+    rootNoFolder: 'ルート(フォルダなし)',
+    moveFilesCount: '{{count}}個のファイルを移動',
+    current: '(現在)',
+    move: '移動',
+    linkFolder: 'フォルダをリンク',
+    linkFolderDescription: '「{{name}}」をプロジェクトまたはアーカイブにリンクしてすばやくアクセス。',
+    noProjectsFound: 'プロジェクトが見つかりません',
+    noArchivesFound: 'アーカイブが見つかりません',
+    unlink: 'リンク解除',
+    link: 'リンク',
+    uploadFiles: 'ファイルをアップロード',
+    dropFilesHere: 'ここにファイルをドロップ',
+    dragAndDropFiles: 'ファイルをドラッグ&ドロップ',
+    orClickToBrowse: 'またはクリックして選択',
+    zipAutoExtract: 'ZIPファイルは自動的に展開されます',
+    zipFilesDetected: 'ZIPファイルを検出',
+    zipChooseHandling: 'ZIPファイルが展開されます。フォルダ構造の処理方法を選択してください:',
+    preserveZipStructure: 'ZIPのフォルダ構造を保持',
+    willBeExtracted: '• 展開予定',
+    filesExtracted: '• {{count}}個のファイルを展開済み',
+    uploadComplete: 'アップロード完了: {{count}}個成功',
+    uploadErrorCount: '、{{count}}個失敗',
+    uploading: 'アップロード中...',
+    filesFailed: '{{count}}個のファイルが失敗',
+    uploadFailed: 'アップロード失敗',
+    linkToProjectOrArchive: 'プロジェクトまたはアーカイブにリンク',
+    changeLink: 'リンクを変更...',
+    linkTo: 'リンク先...',
+    printedCount: '{{count}}回印刷済み',
+    addToQueue: 'キューに追加',
+    adding: '追加中...',
+    folderCreated: 'フォルダを作成しました',
+    folderDeleted: 'フォルダを削除しました',
+    fileDeleted: 'ファイルを削除しました',
+    deletedFiles: '{{count}}個のファイルを削除しました',
+    filesMoved: 'ファイルを移動しました',
+    folderUnlinked: 'フォルダのリンクを解除しました',
+    folderLinked: 'フォルダをリンクしました',
+    addedToQueue: '{{count}}個のファイルをキューに追加しました',
+    addedToQueueWithErrors: '{{added}}個追加、{{errors}}個失敗',
+    failedToAddFiles: 'ファイルの追加に失敗: {{error}}',
+    fileRenamed: 'ファイル名を変更しました',
+    folderRenamed: 'フォルダ名を変更しました',
+    gridView: 'グリッド表示',
+    listView: 'リスト表示',
+    lowDiskSpaceWarning: 'ディスク容量不足の警告',
+    lowDiskSpaceDescription: '空き容量は{{free}}(合計{{total}})。しきい値は設定で{{threshold}} GBに設定されています。',
+    filesLabel: 'ファイル:',
+    foldersLabel: 'フォルダ:',
+    sizeLabel: 'サイズ:',
+    freeLabel: '空き:',
+    folders: 'フォルダ',
+    allFiles: 'すべてのファイル',
+    allTypes: 'すべての種類',
+    date: '日付',
+    size: 'サイズ',
+    type: '種類',
+    prints: '印刷回数',
+    ascending: '昇順',
+    descending: '降順',
+    filteredCount: '{{total}}件中{{filtered}}件',
+    deselectAll: 'すべて選択解除',
+    selectAll: 'すべて選択',
+    selectedCount: '{{count}}件選択中',
+    loadingFiles: 'ファイルを読み込み中...',
+    folderEmpty: 'フォルダは空です',
+    noFilesYet: 'ファイルはまだありません',
+    emptyFolderDescription: 'ファイルをアップロードするか、このフォルダにファイルを移動してください。',
+    emptyRootDescription: 'プリント関連ファイルの整理を始めるにはファイルをアップロードしてください。',
+    noMatchingFiles: '一致するファイルがありません',
+    noMatchingFilesDescription: '現在の検索またはフィルター条件に一致するファイルがありません。',
+    clearFilters: 'フィルターをクリア',
+    sort: {
+      nameAsc: '名前 (A-Z)',
+      nameDesc: '名前 (Z-A)',
+      sizeAsc: 'サイズ (小さい順)',
+      sizeDesc: 'サイズ (大きい順)',
+      dateAsc: '日付 (古い順)',
+      dateDesc: '日付 (新しい順)',
+    },
+    searchFiles: 'ファイルを検索...',
+    deleteFolder: 'フォルダを削除',
+    deleteBulkTitle: '{{count}}件のファイルを削除',
+    deleteFolderConfirm: 'このフォルダを削除しますか?中のファイルもすべて削除されます。',
+    deleteMultipleConfirm: '選択した{{count}}件のファイルを削除しますか?この操作は元に戻せません。',
+    deleteFileConfirm: 'このファイルを削除しますか?',
+    deleting: '削除中...',
+  },
+
+  // Print options
+  printOptions: {
+    title: '印刷オプション',
+    bedLevelling: 'ベッドレベリング',
+    bedLevellingDesc: '印刷前にベッドを自動レベリング',
+    flowCali: 'フローキャリブレーション',
+    flowCaliDesc: '押出量を校正',
+    vibrationCali: '振動キャリブレーション',
+    vibrationCaliDesc: 'リンギングを低減',
+    layerInspect: '初層検査',
+    layerInspectDesc: 'AIによる初層の検査',
+    timelapse: 'タイムラプス',
+    timelapseDesc: 'タイムラプス動画を記録',
+  },
+
+  // 印刷モーダル
+  printModal: {
+    powerOffWhenDone: '完了後にプリンターの電源をオフ',
+    immediateHelp: 'プリンターがアイドル状態になり次第、印刷を開始します。',
+    scheduledHelp: 'スケジュールされた時間にプリンターがアイドル状態であれば印刷を開始します。ビジー状態の場合は、利用可能になるまで待機します。',
+    stagedHelp: '印刷はステージングされますが、自動的には開始されません。キューに送るにはスタートボタンを使用してください。',
+    print: '印刷',
+    reprint: '再印刷',
+    printToMultiple: '{{count}}台のプリンターに印刷',
+    editQueueItem: 'キューアイテムを編集',
+    sameTypeDifferentColor: '同じタイプ、異なる色',
+    filamentTypeNotLoaded: 'フィラメントタイプが読み込まれていません',
+    specificPrinter: '特定のプリンター',
+    selectPrinters: 'プリンターを選択',
+    selectAll: 'すべて選択',
+    printersSelected: '{{count}}台のプリンターを選択中',
+    noPrintersAvailable: '利用可能なプリンターがありません',
+    noActivePrintersAvailable: 'アクティブなプリンターがありません',
+    inactive: '非アクティブ',
+    unknownModel: '不明なモデル',
+    customMapping: 'カスタムマッピング',
+    auto: '自動',
+    showAll: 'すべて表示',
+    selectAtLeastOne: 'プリンターを1台以上選択してください',
+    selectTargetModel: 'ターゲットモデルを選択',
+    selectSlot: 'スロットを選択...',
+    reRead: '再読み込み',
+    customSlotMapping: 'カスタムスロットマッピング',
+    autoMatched: '自動マッチ',
+    manuallySelected: '手動選択',
+    schedulerWillAssign: 'スケジューラーが最初に利用可能なアイドル状態の{{model}}プリンターに割り当てます',
+    inLocation: '{{location}}内',
+    anyModel: '任意の{{model}}',
+    hiddenPrinters: '他{{count}}台のプリンターが非表示(異なるモデル)',
+    showOnlyModel: '{{model}}プリンターのみ表示',
+    matchedCount: '({{matched}}/{{total}} 一致)',
+    targetModelLabel: 'ターゲットモデル',
+    selectAModel: 'モデルを選択...',
+    locationFilterLabel: 'ロケーションフィルター(任意)',
+    anyLocation: 'すべてのロケーション',
+  },
+
+  // ログインページ
+  login: {
+    title: 'Bambuddy ログイン',
+    subtitle: 'アカウントにサインイン',
+    username: 'ユーザー名',
+    usernamePlaceholder: 'ユーザー名を入力',
+    password: 'パスワード',
+    passwordPlaceholder: 'パスワードを入力',
+    loggingIn: 'ログイン中...',
+    signIn: 'サインイン',
+    enterCredentials: 'ユーザー名とパスワードを入力してください',
+    success: 'ログインしました',
+    failed: 'ログインに失敗しました',
+  },
+
+  // セットアップページ
+  setup: {
+    title: 'Bambuddy セットアップ',
+    description: 'Bambuddyインスタンスの認証を設定します',
+    enableAuthentication: '認証を有効にする',
+    adminAccount: '管理者アカウント',
+    adminAccountDescription: '既に管理者ユーザーが存在する場合、既存の管理者アカウントを使用して認証が有効になります。既存の管理者を使用するには以下のフィールドを空のままにするか、新しい管理者ユーザーを作成するには新しい認証情報を入力してください。',
+    adminUsername: '管理者ユーザー名',
+    adminPassword: '管理者パスワード',
+    optionalIfAdminsExist: '管理者ユーザーが存在する場合は任意',
+    placeholderAdminUsername: '管理者ユーザー名を入力(任意)',
+    placeholderAdminPassword: '管理者パスワードを入力(任意)',
+    confirmPassword: 'パスワードの確認',
+    placeholderConfirmPassword: '管理者パスワードを確認',
+    settingUp: 'セットアップ中...',
+    completeSetup: 'セットアップを完了',
+    toast: {
+      authEnabledAdminCreated: '認証が有効になり、管理者ユーザーが作成されました',
+      authEnabledExistingAdmins: '既存の管理者ユーザーを使用して認証が有効になりました',
+      setupCompleted: 'セットアップが完了しました',
+      enterBothOrLeaveEmpty: '管理者ユーザー名とパスワードの両方を入力するか、既存の管理者ユーザーを使用するには両方を空にしてください',
+      passwordsDoNotMatch: 'パスワードが一致しません',
+      passwordMinLength: 'パスワードは6文字以上必要です',
+    },
+  },
+
+  // ユーザーページ
+  users: {
+    title: 'ユーザー管理',
+    description: 'Bambuddyインスタンスのユーザーとアクセスを管理します',
+    noPermission: 'このページにアクセスする権限がありません。',
+    backToSettings: '設定に戻る',
+    createUser: 'ユーザーを作成',
+    deleteUser: 'ユーザーを削除',
+    deleteConfirmMessage: 'このユーザーを削除してもよろしいですか?この操作は元に戻せません。',
+    password: 'パスワード',
+    placeholderUsername: 'ユーザー名を入力',
+    placeholderPassword: 'パスワードを入力',
+    roleUser: 'ユーザー',
+    roleAdmin: '管理者',
+    statusActive: 'アクティブ',
+    statusInactive: '非アクティブ',
+    save: '保存',
+    cancel: 'キャンセル',
+    edit: '編集',
+    delete: '削除',
+    creating: '作成中...',
+    admin: '管理者',
+    editUser: 'ユーザーを編集',
+    groups: 'グループ',
+    noGroups: 'グループなし',
+    noGroupsAvailable: '利用可能なグループがありません',
+    confirmPassword: 'パスワードの確認',
+    placeholderNewPassword: '新しいパスワード',
+    placeholderConfirmPassword: 'パスワードの確認',
+    placeholderConfirmNewPassword: '新しいパスワードの確認',
+    leaveBlankToKeepCurrent: '現在のパスワードを維持する場合は空のままにしてください',
+    saveChanges: '変更を保存',
+    saving: '保存中...',
+    system: 'システム',
+    table: {
+      username: 'ユーザー名',
+      role: 'ロール',
+      status: 'ステータス',
+      actions: 'アクション',
+      groups: 'グループ',
+    },
+    toast: {
+      userCreated: 'ユーザーが正常に作成されました',
+      userUpdated: 'ユーザーが正常に更新されました',
+      userDeleted: 'ユーザーが正常に削除されました',
+      fillRequiredFields: '必須項目をすべて入力してください',
+      passwordMinLength: 'パスワードは6文字以上である必要があります',
+      passwordsDoNotMatch: 'パスワードが一致しません',
+    },
+  },
+
+  // アップロードモーダル
+  upload: {
+    title: '3MFファイルのアップロード',
+    dragDrop: '.3mfファイルをここにドラッグ&ドロップ',
+    or: 'または',
+    browseFiles: 'ファイルを参照',
+    associatePrinter: 'プリンターに関連付け(任意)',
+    noPrinter: 'プリンターなし',
+    uploaded: 'アップロード済み',
+    failedCount: '失敗',
+    filesUploaded: '{{count}}ファイルをアップロードしました',
+    printerModelExtracted: 'プリンターモデルは3MFメタデータから自動抽出されます',
+    filesFailed: '{{count}}ファイルのアップロードに失敗しました',
+    partialResult: '{{uploaded}}件アップロード、{{failed}}件失敗',
+    failed: 'アップロードに失敗しました',
+    uploading: 'アップロード中...',
+    upload: 'アップロード',
+  },
+
+  // G-codeビューアー
+  gcode: {
+    loading: 'G-codeを読み込み中...',
+    notAvailable: 'G-codeが利用できません',
+    notSlicedMessage: 'このファイルはまだスライスされていません。G-codeプレビューはBambu StudioまたはOrca Slicerでスライス後に利用可能です。',
+    loadFailed: 'G-codeの読み込みに失敗しました',
+  },
+
+  // ダッシュボード
+  dashboard: {
+    dragToReorder: 'ドラッグして並べ替え',
+    sizeClickCycle: 'サイズ: {{size}} - クリックで変更',
+    hideWidget: 'ウィジェットを非表示',
+    resetLayout: 'レイアウトをリセット',
+    hiddenCount: '{{count}}件非表示',
+    hiddenWidgets: '非表示のウィジェット(クリックで表示):',
+    allHidden: 'すべてのウィジェットが非表示です。',
+  },
+
+  // プリンターキューウィジェット
+  printerQueue: {
+    nextInQueue: '次のキュー',
+    asap: '即時',
+    now: '今すぐ',
+    inLessThanMin: '1分以内',
+    inMinutes: '{{count}}分後',
+    inHours: '{{count}}時間後',
+  },
+
+  // スマートプラグ
+  smartPlug: {
+    offline: 'オフライン',
+    admin: '管理',
+    openAdminPage: 'プラグの管理ページを開く',
+    linkedTo: '接続先:',
+    alerts: 'アラート',
+    automationSettings: '自動化設定',
+    showInSwitchbar: 'スイッチバーに表示',
+    switchbarDesc: 'サイドバーからクイックアクセス',
+    enabledDesc: 'このプラグの自動化を有効にする',
+    autoOffDesc: '印刷完了後に自動オフ(1回のみ)',
+    delayMode: 'オフ遅延モード',
+    temp: '温度',
+    delayMinutes: '遅延(分)',
+    tempThreshold: '温度しきい値(℃)',
+    tempThresholdDesc: 'ノズルがこの温度以下に冷えたらオフにします',
+    deleteTitle: 'スマートプラグを削除',
+    deleteConfirm: '"{{name}}"を削除してもよろしいですか?この操作は元に戻せません。',
+    turnOnTitle: 'スマートプラグをオン',
+    turnOnConfirm: '"{{name}}"をオンにしてもよろしいですか?',
+    turnOn: 'オン',
+    turnOffTitle: 'スマートプラグをオフ',
+    turnOffConfirm: '"{{name}}"をオフにしてもよろしいですか?接続されたデバイスの電源が切断されます。',
+    turnOff: 'オフ',
+    controlFailed: '"{{name}}"の{{action}}に失敗しました',
+    monitorOnly: 'モニタリングのみ',
+    waiting: 'データを待機中...',
+    monitor: 'モニター',
+    power: '電力',
+    kwhToday: '本日の消費電力',
+    settings: '設定',
+    smartSwitches: 'スマートスイッチ',
+    noSwitchesInSwitchbar: 'スイッチバーに有効なスイッチがありません',
+    enableInSettings: '設定 → スマートプラグで有効にしてください',
+  },
+
+  // スマートプラグの追加/編集モーダル
+  addSmartPlug: {
+    addTitle: 'スマートプラグを追加',
+    editTitle: 'スマートプラグを編集',
+    // プラグタイプ選択
+    tasmota: 'Tasmota',
+    homeAssistant: 'Home Assistant',
+    // デバイス検出
+    stopScanning: 'スキャンを停止',
+    discoverDevices: 'Tasmotaデバイスを検出',
+    scanningNetwork: 'ネットワークをスキャン中...',
+    foundDevices: '{{count}}台のデバイスが見つかりました - クリックして選択:',
+    noDevicesFound: 'ネットワーク上にTasmotaデバイスが見つかりません',
+    failedToStartScan: 'スキャンの開始に失敗しました',
+    // Home Assistant
+    haNotConfigured: 'Home Assistantが設定されていません。',
+    haNotConfiguredPath: '設定 \u2192 ネットワーク \u2192 Home Assistant で設定してください',
+    selectEntity: 'エンティティを選択',
+    chooseEntity: 'エンティティを選択...',
+    loadingEntities: 'エンティティを読み込み中...',
+    failedToLoadEntities: 'エンティティの読み込みに失敗しました: {{error}}',
+    searchEntities: 'エンティティを検索...',
+    noEntitiesMatching: '「{{search}}」に一致するエンティティが見つかりません',
+    noEntitiesAvailable: '利用可能なエンティティがありません',
+    searchingEntities: 'すべてのエンティティを検索中({{count}}件見つかりました)',
+    showingEntities: 'switch、light、input_booleanを表示中({{count}}件利用可能)',
+    // エネルギーモニタリング
+    energyMonitoring: 'エネルギーモニタリング(任意)',
+    energyMonitoringDescription: '電力/エネルギーデータを提供するセンサーを検索して選択します。',
+    powerSensor: '電力センサー(W)',
+    searchPowerSensors: '電力センサーを検索...',
+    energyToday: '今日のエネルギー(kWh)',
+    totalEnergy: '総エネルギー(kWh)',
+    searchEnergySensors: 'エネルギーセンサーを検索...',
+    noMatchingSensors: '一致するセンサーがありません',
+    // IPアドレスとテスト
+    ipAddress: 'IPアドレス',
+    ipAddressPlaceholder: '192.168.1.100',
+    test: 'テスト',
+    connected: '接続されました!',
+    device: 'デバイス',
+    state: '状態',
+    connectionFailed: '接続に失敗しました',
+    // 名前
+    name: '名前',
+    namePlaceholder: 'リビングのプラグ',
+    // 認証
+    username: 'ユーザー名',
+    usernamePlaceholder: 'admin',
+    password: 'パスワード',
+    passwordPlaceholder: '********',
+    authHint: 'Tasmotaデバイスが認証を必要としない場合は空のままにしてください',
+    // プリンターとの連携
+    linkToPrinter: 'プリンターに連携',
+    noPrinterOption: 'プリンターなし(手動制御のみ)',
+    linkToPrinterHint: '連携すると印刷の開始/完了時に自動オン/オフが有効になります',
+    // 電力アラート
+    powerAlerts: '電力アラート',
+    alertAbove: '超過時にアラート(W)',
+    alertAbovePlaceholder: '例: 200',
+    alertBelow: '下回った時にアラート(W)',
+    alertBelowPlaceholder: '例: 10',
+    powerAlertHint: '消費電力がこれらのしきい値を超えた/下回った場合に通知します。無効にするには空のままにしてください。',
+    // スケジュール
+    dailySchedule: 'デイリースケジュール',
+    turnOnAt: 'オンにする時刻',
+    turnOffAt: 'オフにする時刻',
+    scheduleHint: '毎日これらの時刻にプラグを自動的にオン/オフします。スキップするには空のままにしてください。',
+    // スイッチバー
+    showInSwitchbar: 'スイッチバーに表示',
+    showInSwitchbarHint: 'サイドバーからクイックアクセス',
+    // バリデーション
+    nameRequired: '名前は必須です',
+    ipRequired: 'Tasmotaプラグの場合、IPアドレスは必須です',
+    entityRequired: 'Home Assistantプラグの場合、エンティティは必須です',
+    // MQTT
+    mqtt: 'MQTT',
+    mqttTopicRequired: 'MQTTトピックは、電力、エネルギー、またはステートのいずれかを設定する必要があります',
+    mqttBrokerNotConfigured: 'MQTTブローカーが設定されていません。ブローカーアドレスを設定してください:',
+    mqttBrokerNotConfiguredPath: '設定 → ネットワーク → MQTT発行',
+    mqttBrokerNotConfiguredHint: '(パブリッシュを有効にする必要はありません。ブローカーの詳細を入力するだけです)。',
+    mqttMonitorOnly: 'モニタリングのみ',
+    mqttMonitorOnlyDescription: 'MQTTプラグはMQTTサブスクリプション経由で電力/エネルギーデータを受信します。オン/オフ制御はできません - MQTTブローカーまたはホームオートメーションシステムを使用してください。',
+    mqttPowerMonitoring: '電力モニタリング',
+    mqttEnergyMonitoring: 'エネルギーモニタリング',
+    mqttStateMonitoring: 'ステートモニタリング',
+    mqttTopic: 'トピック',
+    mqttJsonPath: 'JSONパス',
+    mqttMultiplier: '乗数',
+    mqttOnValue: 'ONの値',
+    mqttPowerJsonPathHint: 'JSONパスはJSONペイロードから値を抽出します(例:「power_l1」)。トピックが生の数値を発行する場合は空のままにしてください。',
+    mqttPowerMultiplierHint: '乗数 0.001 で mW→W、1000 で kW→W に変換します。',
+    mqttEnergyJsonPathHint: 'JSONパスはJSONペイロードから値を抽出します。生の値の場合は空のままにしてください。',
+    mqttEnergyMultiplierHint: '乗数 0.001 で Wh→kWh、1000 で MWh→kWh に変換します。',
+    mqttStateJsonPathHint: 'JSONパスはJSONペイロードから値を抽出します。生の値の場合は空のままにしてください。',
+    mqttStateOnValueHint: 'ONの値:「ON」を意味する正確な文字列。自動検出(ON、true、1)の場合は空のままにしてください。',
+  },
+
+  // 通知プロバイダーの追加/編集モーダル
+  addNotification: {
+    addTitle: '通知プロバイダーを追加',
+    editTitle: '通知プロバイダーを編集',
+    nameRequired: '名前は必須です',
+    fieldRequired: '{{field}}は必須です',
+    namePlaceholder: 'マイ通知',
+    providerType: 'プロバイダータイプ',
+    configuration: '設定',
+    testConfiguration: '設定をテスト',
+    printerFilter: 'プリンターフィルター',
+    allPrinters: 'すべてのプリンター',
+    printerFilterDesc: 'このプリンターのイベントのみ通知を送信',
+    quietHours: 'サイレント時間(おやすみモード)',
+    start: '開始',
+    end: '終了',
+    dailyDigest: 'デイリーダイジェスト',
+    dailyDigestDesc: '通知をまとめて1日1回のサマリーとして送信',
+    sendDigestAt: 'ダイジェスト送信時刻',
+    digestDescription: 'イベントを収集し、この時刻にまとめて送信します',
+    notificationEvents: '通知イベント',
+    printEvents: '印刷イベント',
+    printerStatus: 'プリンターステータス',
+    events: {
+      start: '開始',
+      complete: '完了',
+      failed: '失敗',
+      stopped: '停止',
+      progress: '進捗',
+      offline: 'オフライン',
+      error: 'エラー',
+      lowFilament: 'フィラメント残量少',
+      maintenance: 'メンテナンス',
+    },
+    config: {
+      callmebot: {
+        phoneNumber: '電話番号',
+        apiKey: 'APIキー',
+        apiKeyPlaceholder: 'CallMeBot APIキー',
+      },
+      ntfy: {
+        serverUrl: 'サーバーURL',
+        topic: 'トピック',
+        authToken: '認証トークン',
+        authTokenPlaceholder: '認証(任意)',
+      },
+      pushover: {
+        userKey: 'ユーザーキー',
+        userKeyPlaceholder: 'Pushoverユーザーキー',
+        appToken: 'アプリトークン',
+        appTokenPlaceholder: 'Pushoverアプリトークン',
+        priority: '優先度',
+        priorityPlaceholder: '0(通常)',
+      },
+      telegram: {
+        botToken: 'Botトークン',
+        botTokenPlaceholder: '@BotFatherから取得したトークン',
+        chatId: 'チャットID',
+        chatIdPlaceholder: 'チャットまたはグループID',
+      },
+      email: {
+        smtpServer: 'SMTPサーバー',
+        smtpPort: 'SMTPポート',
+        security: 'セキュリティ',
+        starttls: 'STARTTLS(ポート587)',
+        ssl: 'SSL/TLS(ポート465)',
+        securityNone: 'なし(ポート25)',
+        authentication: '認証',
+        username: 'ユーザー名',
+        password: 'パスワード',
+        passwordPlaceholder: 'アプリパスワード',
+        fromEmail: '送信元メール',
+        toEmail: '送信先メール',
+      },
+      discord: {
+        webhookUrl: 'Webhook URL',
+      },
+      webhook: {
+        webhookUrl: 'Webhook URL',
+        payloadFormat: 'ペイロード形式',
+        genericJson: '汎用JSON',
+        slackMattermost: 'Slack / Mattermost',
+        authorization: '認証',
+        authorizationPlaceholder: 'Bearerトークン(任意)',
+        titleFieldName: 'タイトルフィールド名',
+        messageFieldName: 'メッセージフィールド名',
+      },
+    },
+  },
+
+  // アップロード待ち
+  pendingUploads: {
+    title: '保留中のアップロード({{count}}件)',
+    justNow: 'たった今',
+    minutesAgo: '{{count}}分前',
+    hoursAgo: '{{count}}時間前',
+    daysAgo: '{{count}}日前',
+    fromSource: '{{ip}}から',
+    archive: 'アーカイブ',
+    archiveAll: 'すべてアーカイブ',
+    discardAll: 'すべて破棄',
+    discard: '破棄',
+    discardTitle: 'アップロードを破棄',
+    discardConfirm: '"{{filename}}"を破棄してもよろしいですか?この操作は元に戻せません。',
+    tags: 'タグ',
+    tagsPlaceholder: '例: 機能部品、プロトタイプ、ギフト',
+    notes: 'メモ',
+    notesPlaceholder: 'この印刷についてメモを追加...',
+    project: 'プロジェクト',
+    noProject: 'プロジェクトなし',
+    description: 'これらのファイルはバーチャルプリンター経由でアップロードされました。確認してアーカイブし、コレクションに追加してください。',
+    archiveAllTitle: 'すべてのアップロードをアーカイブ',
+    archiveAllConfirm: '保留中のアップロード{{count}}件をすべてアーカイブしてもよろしいですか?',
+    discardAllTitle: 'すべてのアップロードを破棄',
+    discardAllConfirm: '保留中のアップロード{{count}}件をすべて破棄してもよろしいですか?この操作は元に戻せません。',
+    archived: 'アーカイブ済み: {{name}}',
+    archiveFailed: 'アーカイブに失敗しました',
+    discarded: 'アップロードを破棄しました',
+    discardFailed: '破棄に失敗しました',
+    archivedCount: '{{count}}ファイルをアーカイブしました',
+    discardedCount: '{{count}}ファイルを破棄しました',
+    archiveAllFailed: 'すべてのアーカイブに失敗しました',
+    discardAllFailed: 'すべての破棄に失敗しました',
+  },
+
+  // キーボードショートカット
+  shortcuts: {
+    title: 'キーボードショートカット',
+    navigation: 'ナビゲーション',
+    archives: 'アーカイブ',
+    profiles: 'K-プロファイル',
+    general: '一般',
+    goToPrinters: 'プリンターへ',
+    goToArchives: 'アーカイブへ',
+    goToQueue: 'キューへ',
+    goToStatistics: '統計へ',
+    goToProfiles: 'クラウドプロファイルへ',
+    goToSettings: '設定へ',
+    openItem: '{{item}}を開く',
+    goToItem: '{{item}}へ移動',
+    focusSearch: '検索にフォーカス',
+    openUpload: 'アップロードダイアログを開く',
+    clearSelection: '選択解除 / 入力をクリア',
+    contextMenu: 'カードのコンテキストメニュー',
+    refreshProfiles: 'プロファイルを更新',
+    newProfile: '新しいプロファイル',
+    exitSelection: '選択モードを終了',
+    showHelp: 'このヘルプを表示',
+    pressKey: '押す',
+    orClickToClose: 'または外側をクリックで閉じる',
+  },
+
+  // ログビューアー
+  logViewer: {
+    title: 'アプリケーションログ',
+    liveStreaming: 'ライブストリーミング - {{count}}エントリ',
+    description: 'アプリケーションログの表示とフィルタ',
+    live: 'ライブ',
+    stop: '停止',
+    start: '開始',
+    clear: 'クリア',
+    autoScroll: '自動スクロール',
+    searchPlaceholder: 'メッセージまたはロガー名で検索...',
+    noEntries: 'ログエントリが見つかりません',
+    emptyLog: 'ログファイルが空またはクリアされています',
+    autoRefreshing: '2秒ごとに自動更新中',
+    clickStart: '開始をクリックしてライブログストリーミングを有効にする',
+  },
+
+  // アーカイブ編集モーダル
+  editArchive: {
+    title: 'アーカイブを編集',
+    name: '名前',
+    printNamePlaceholder: '印刷名',
+    printer: 'プリンター',
+    noPrinter: 'プリンターなし',
+    project: 'プロジェクト',
+    noProject: 'プロジェクトなし',
+    itemsPrinted: '印刷数',
+    itemsPrintedDescription: 'この印刷ジョブで生産されたアイテム数',
+    notes: 'メモ',
+    notesPlaceholder: 'この印刷についてメモを追加...',
+    tags: 'タグ',
+    addTags: 'タグを追加...',
+    addMoreTags: 'タグをさらに追加...',
+    existingTagsHint: '既存のタグ(クリックで追加)',
+    externalLink: '外部リンク',
+    externalLinkPlaceholder: 'https://...',
+    externalLinkDescription: 'MakerWorld、Printables、Thingiverseなどへのリンク',
+    status: 'ステータス',
+    statusCompleted: '完了',
+    statusFailed: '失敗',
+    statusCancelled: 'キャンセル',
+    statusPrinting: '印刷中',
+    failureReason: '失敗理由',
+    selectReason: '理由を選択...',
+    failureReasons: {
+      adhesionFailure: '定着不良',
+      spaghettiDetached: 'スパゲッティ / 剥離',
+      layerShift: 'レイヤーシフト',
+      cloggedNozzle: 'ノズル詰まり',
+      filamentRunout: 'フィラメント切れ',
+      warping: '反り',
+      stringing: '糸引き',
+      underExtrusion: '押出不足',
+      powerFailure: '電源障害',
+      userCancelled: 'ユーザーによるキャンセル',
+      other: 'その他',
+    },
+    photos: '印刷結果の写真',
+    printResult: '印刷結果',
+    photosDescription: '+をクリックして印刷結果の写真を追加',
+    saving: '保存中...',
+  },
+
+  // MQTTデバッグ
+  mqttDebug: {
+    title: 'MQTTデバッグログ',
+    empty: '<空>',
+    startLogging: 'ログ記録を開始',
+    searchPlaceholder: 'トピックまたはペイロードで検索...',
+    incoming: '受信',
+    outgoing: '送信',
+    noMessages: 'まだメッセージが記録されていません',
+    clickStart: '「ログ記録を開始」をクリックしてMQTTメッセージの記録を開始',
+    noMatch: 'フィルタに一致するメッセージがありません',
+    adjustFilter: '検索条件またはフィルタ条件を調整してみてください',
+    loggingActive: 'ログ記録中 - メッセージは自動更新されます',
+    loggingStopped: 'ログ記録停止',
+  },
+
+  // アーカイブアクション
+  archiveActions: {
+    print: '印刷',
+    schedule: 'スケジュール',
+    openInSlicer: 'Bambu Studioで開く',
+    slice: 'スライス',
+    viewMakerWorld: 'MakerWorldで表示',
+    preview3d: '3Dプレビュー',
+    viewTimelapse: 'タイムラプスを表示',
+    scanTimelapse: 'タイムラプスを検索',
+    downloadSource3mf: 'ソース3MFをダウンロード',
+    uploadSource3mf: 'ソース3MFをアップロード',
+    replaceSource3mf: 'ソース3MFを置換',
+    removeSource3mf: 'ソース3MFを削除',
+    replaceF3d: 'F3Dを置換',
+    uploadF3d: 'F3Dをアップロード',
+    downloadF3d: 'F3Dをダウンロード',
+    removeF3d: 'F3Dを削除',
+    copyLink: 'ダウンロードリンクをコピー',
+    qrCode: 'QRコード',
+    viewPhotos: '写真を表示',
+    projectPage: 'プロジェクトページ',
+    goToProject: 'プロジェクトへ: {{name}}',
+    addToProject: 'プロジェクトに追加',
+    removeFromProject: 'プロジェクトから削除',
+    noProjects: '利用可能なプロジェクトがありません',
+    deselect: '選択解除',
+    select: '選択',
+    remove: '削除',
+    source3mfAttached: 'ソース3MFを添付しました: {{filename}}',
+    source3mfUploadFailed: 'ソース3MFのアップロードに失敗しました',
+    source3mfRemoved: 'ソース3MFを削除しました',
+    source3mfRemoveFailed: 'ソース3MFの削除に失敗しました',
+    f3dAttached: 'F3Dを添付しました: {{filename}}',
+    f3dUploadFailed: 'F3Dのアップロードに失敗しました',
+    f3dRemoved: 'F3Dを削除しました',
+    f3dRemoveFailed: 'F3Dの削除に失敗しました',
+    timelapseAttached: 'タイムラプスを添付しました: {{filename}}',
+    timelapseExists: 'タイムラプスは既に添付されています',
+    noTimelapseFound: '一致するタイムラプスが見つかりません',
+    timelapseScanFailed: 'タイムラプスの検索に失敗しました',
+    timelapseAttachFailed: 'タイムラプスの添付に失敗しました',
+    deleted: 'アーカイブを削除しました',
+    deleteFailed: 'アーカイブの削除に失敗しました',
+    addedToFavorites: 'お気に入りに追加しました',
+    removedFromFavorites: 'お気に入りから削除しました',
+    projectUpdated: 'プロジェクトを更新しました',
+    projectUpdateFailed: 'プロジェクトの更新に失敗しました',
+    linkCopied: 'リンクをクリップボードにコピーしました',
+    linkCopyFailed: 'リンクのコピーに失敗しました',
+    photoDeleted: '写真を削除しました',
+    photoDeleteFailed: '写真の削除に失敗しました',
+    deleteTitle: 'アーカイブを削除',
+    deleteConfirm: '"{{name}}"を削除してもよろしいですか?この操作は元に戻せません。',
+    removeSource3mfTitle: 'ソース3MFを削除',
+    removeSource3mfConfirm: '"{{name}}"からソース3MFファイルを削除してもよろしいですか?元のスライサープロジェクトファイルが削除されます。',
+    removeF3dTitle: 'F3Dを削除',
+    removeF3dConfirm: '"{{name}}"からFusion 360デザインファイルを削除してもよろしいですか?',
+    selectTimelapse: 'タイムラプスを選択',
+    selectTimelapseDesc: '自動一致が見つかりませんでした。この印刷のタイムラプスを選択してください:',
+  },
+
+  // カメラページ
+  camera: {
+    camera: 'カメラ',
+    invalidPrinterId: '無効なプリンターID',
+    printerFallback: 'プリンター #{{id}}',
+    // モード切替
+    live: 'ライブ',
+    snapshot: 'スナップショット',
+    // コントロール
+    restartStream: 'ストリームを再開',
+    refreshSnapshot: 'スナップショットを更新',
+    fullscreen: 'フルスクリーン',
+    exitFullscreen: 'フルスクリーンを終了',
+    // 読み込み状態
+    connectingToCamera: 'カメラに接続中...',
+    capturingSnapshot: 'スナップショットを撮影中...',
+    // 再接続
+    connectionLost: '接続が切断されました',
+    reconnectingIn: '{{seconds}}秒後に再接続します(試行{{attempt}}/{{maxAttempts}})',
+    reconnectNow: '今すぐ再接続',
+    // エラー状態
+    cameraUnavailable: 'カメラが利用できません',
+    makeSurePrinterConnected: 'プリンターが接続されていること、およびプリンター設定でカメラが有効になっていることを確認してください。',
+    retry: '再試行',
+    // 画像
+    cameraStream: 'カメラストリーム',
+    // ズームコントロール
+    zoomIn: 'ズームイン',
+    zoomOut: 'ズームアウト',
+    resetZoom: 'ズームをリセット',
+    skipBack: '5秒戻る',
+    skipForward: '5秒進む',
+    refreshStream: 'ストリームを更新',
+    dragToResize: 'ドラッグしてリサイズ',
+  },
+
+  // アーカイブカードラベル
+  archiveCard: {
+    slicedReady: 'スライス済みファイル - 印刷可能',
+    sourceOnly: 'ソースファイルのみ - AMSマッピングなし',
+    gcode: 'GCODE',
+    source: 'ソース',
+    layers: 'レイヤー',
+    objects: '{{count}}オブジェクト',
+    objects_other: '{{count}}オブジェクト',
+    cancelled: 'キャンセル',
+    failed: '失敗',
+    duplicate: '重複',
+  },
+
+  // 通知プロバイダーカード
+  providerCard: {
+    last: '最終: ',
+    lastSuccessAt: '最終: {{date}}',
+    printer: 'プリンター: ',
+    allPrinters: 'すべてのプリンター',
+    tagStart: '開始',
+    tagComplete: '完了',
+    tagFailed: '失敗',
+    tagStopped: '中止',
+    tagProgress: '進捗',
+    tagOffline: 'オフライン',
+    tagLowFilament: 'フィラメント残量低下',
+    tagMaintenance: 'メンテナンス',
+    tagAmsHumidity: 'AMS湿度',
+    tagAmsTemp: 'AMS温度',
+    tagAmsHtHumidity: 'AMS-HT湿度',
+    tagAmsHtTemp: 'AMS-HT温度',
+    quiet: 'おやすみ',
+    digest: 'ダイジェスト ',
+    digestAt: 'ダイジェスト {{time}}',
+    sendTest: 'テスト通知を送信',
+    eventSettings: 'イベント設定',
+    sendNotifications: 'このプロバイダーから通知を送信',
+    printEvents: '印刷イベント',
+    printerStatus: 'プリンターステータス',
+    amsAlarms: 'AMSアラーム',
+    amsHumidityHigh: 'AMS湿度高',
+    amsHumidityHighDesc: '通常AMSの湿度がしきい値を超過',
+    amsTempHigh: 'AMS温度高',
+    amsTempHighDesc: '通常AMSの温度がしきい値を超過',
+    amsHtAlarms: 'AMS-HTアラーム',
+    amsHtHumidityHigh: 'AMS-HT湿度高',
+    amsHtHumidityHighDesc: 'AMS-HTの湿度がしきい値を超過',
+    amsHtTempHigh: 'AMS-HT温度高',
+    amsHtTempHighDesc: 'AMS-HTの温度がしきい値を超過',
+    noNotificationsDuring: 'この時間帯は通知を送信しません',
+    editQuietHours: 'プロバイダーを編集しておやすみ時間を変更',
+    dailyDigest: 'デイリーダイジェスト',
+    dailyDigestDesc: '通知を1日1回のサマリーにまとめる',
+    sendAt: '送信時刻',
+    editDigestTime: 'プロバイダーを編集してダイジェスト時刻を変更',
+    deleteTitle: '通知プロバイダーを削除',
+    deleteConfirm: '「{{name}}」を削除してもよろしいですか?この操作は元に戻せません。',
+  },
+
+  // Projects page
+  projects: {
+    title: 'プロジェクト',
+    subtitle: '印刷プロジェクトを管理',
+    editProject: 'プロジェクトを編集',
+    newProject: '新規プロジェクト',
+    namePlaceholder: 'プロジェクト名',
+    descriptionPlaceholder: 'プロジェクトの説明(任意)',
+    color: '色',
+    targetPlates: '目標プレート数',
+    targetPlatesPlaceholder: '例: 10',
+    targetPlatesHint: '必要な印刷ジョブ/プレート数',
+    targetParts: '目標パーツ数',
+    targetPartsPlaceholder: '例: 50',
+    targetPartsHint: '必要な個別パーツの総数',
+    tags: 'タグ',
+    tagsPlaceholder: 'カンマ区切りのタグ',
+    dueDate: '期限',
+    priorityLabel: '優先度',
+    priority: {
+      low: '低',
+      normal: '通常',
+      high: '高',
+      urgent: '緊急',
+    },
+    status: {
+      active: '進行中',
+      completed: '完了',
+      archived: 'アーカイブ済み',
+    },
+    create: '作成',
+    parts: 'パーツ',
+    plates: 'プレート',
+    failed: '失敗',
+    completed: '完了',
+    inQueue: 'キュー内',
+    noPrintsYet: '印刷履歴なし',
+    more: 'もっと見る',
+    printJobsPlates: '印刷ジョブ / プレート',
+    partsPrinted: '印刷済みパーツ',
+    failedParts: '失敗パーツ',
+    projectCreated: 'プロジェクトを作成しました',
+    projectUpdated: 'プロジェクトを更新しました',
+    projectDeleted: 'プロジェクトを削除しました',
+    all: 'すべて',
+    loading: 'プロジェクトを読み込み中...',
+    noProjectsYet: 'プロジェクトがまだありません',
+    noStatusProjects: '{{status}}のプロジェクトはありません',
+    noProjectsHint: 'プロジェクトを作成して印刷を整理・追跡しましょう',
+    noStatusProjectsHint: 'ステータスが「{{status}}」のプロジェクトはありません',
+    createFirstProject: '最初のプロジェクトを作成',
+    deleteProject: 'プロジェクトを削除',
+    deleteProjectConfirm: 'このプロジェクトを削除しますか?この操作は取り消せません。',
+    exportAllProjects: 'すべてのプロジェクトをエクスポート',
+    importProject: 'プロジェクトをインポート',
+    importFailed: 'インポートに失敗しました',
+    projectImported: 'プロジェクトがインポートされました',
+    projectsExported: 'プロジェクトがエクスポートされました',
+    noCreatePermission: 'プロジェクトを作成する権限がありません',
+    noDeletePermission: 'プロジェクトを削除する権限がありません',
+    noEditPermission: 'プロジェクトを編集する権限がありません',
+    noExportPermission: 'プロジェクトをエクスポートする権限がありません',
+    noImportPermission: 'プロジェクトをインポートする権限がありません',
+  },
+
+  // Project detail page
+  projectDetail: {
+    statusActive: '進行中',
+    statusCompleted: '完了',
+    statusArchived: 'アーカイブ済み',
+    noPrintsYet: '印刷履歴なし',
+    print: '印刷',
+    unknown: '不明',
+    priorityLow: '低',
+    priorityNormal: '通常',
+    priorityHigh: '高',
+    priorityUrgent: '緊急',
+    overdue: '期限超過',
+    dueToday: '本日期限',
+    daysLeft: '残り{{count}}日',
+    projectUpdated: 'プロジェクトを更新しました',
+    partAdded: 'パーツを追加しました',
+    partRemoved: 'パーツを削除しました',
+    deletePart: 'パーツを削除',
+    deletePartConfirm: '「{{name}}」を削除しますか?',
+    templateCreated: 'プロジェクトからテンプレートを作成しました',
+    error: 'エラー',
+    projectNotFound: 'プロジェクトが見つかりません',
+    backToProjects: 'プロジェクト一覧に戻る',
+    projects: 'プロジェクト',
+    edit: '編集',
+    platesProgress: 'プレート進捗',
+    printJobs: '印刷ジョブ',
+    percentComplete: '% 完了',
+    remaining: '残り',
+    partsProgress: 'パーツ進捗',
+    parts: 'パーツ',
+    printJobsCard: '印刷ジョブ',
+    total: '合計',
+    failed: '失敗',
+    partsPrinted: '印刷済みパーツ',
+    printTime: '印刷時間',
+    filamentUsed: 'フィラメント使用量',
+    costTracking: 'コスト追跡',
+    filamentCost: 'フィラメント',
+    energy: 'エネルギー',
+    budget: '予算',
+    budgetRemaining: '残り予算',
+    subProjects: 'サブプロジェクト ({{count}})',
+    partOf: '所属先',
+    priority: '優先度',
+    notes: 'メモ',
+    cancel: 'キャンセル',
+    save: '保存',
+    notesPlaceholder: 'このプロジェクトについてメモを追加...',
+    noNotesYet: 'メモがありません。編集をクリックして追加してください。',
+    files: 'ファイル',
+    linkFoldersFromFileManager: 'ファイルマネージャーからフォルダーをリンク',
+    toThisProjectForQuickAccess: 'してクイックアクセス。',
+    fileCount: '{{count}}ファイル',
+    noFoldersLinked: 'リンクされたフォルダーはありません',
+    billOfMaterials: '部品表(BOM)',
+    bomAcquired: '{{completed}}/{{total}} 取得済み',
+    showAll: 'すべて表示',
+    hideDone: '完了を非表示',
+    addPart: 'パーツを追加',
+    partNamePlaceholder: 'パーツ名',
+    qty: '数量',
+    pricePlaceholder: '価格 ({{currency}})',
+    sourcingUrlPlaceholder: 'URL(任意)',
+    remarksPlaceholder: '備考',
+    delete: '削除',
+    totalCost: '合計コスト',
+    noBomParts: 'BOMにパーツがありません',
+    activityTimeline: 'アクティビティタイムライン',
+    noActivityYet: 'アクティビティがありません',
+    timelineEvents: {
+      project_created: 'プロジェクト作成',
+      print_completed: '印刷完了',
+      print_failed: '印刷失敗',
+      print_started: '印刷開始',
+      queued: 'キューに追加',
+    },
+    saveAsTemplate: 'テンプレートとして保存',
+    queue: 'キュー',
+    viewAll: 'すべて表示',
+    printing: '印刷中',
+    queued: 'キュー内',
+    prints: '{{count}}件の印刷',
+    exportProject: 'プロジェクトをエクスポート',
+    exportFailed: 'エクスポートに失敗しました',
+    projectExported: 'プロジェクトがエクスポートされました',
+    noEditPermission: 'このプロジェクトを編集する権限がありません',
+    noAddPartsPermission: 'パーツを追加する権限がありません',
+    noDeletePartsPermission: 'パーツを削除する権限がありません',
+    noEditPartsPermission: 'パーツを編集する権限がありません',
+    noUpdatePartsPermission: 'パーツを更新する権限がありません',
+    noEditNotesPermission: 'ノートを編集する権限がありません',
+    noCreateTemplatesPermission: 'テンプレートを作成する権限がありません',
+    noExportPermission: 'プロジェクトをエクスポートする権限がありません',
+  },
+
+  // Project page modal
+  projectPage: {
+    title: 'プロジェクトページ',
+    loadFailed: 'プロジェクトページデータの読み込みに失敗',
+    noData: 'プロジェクトページデータがありません',
+    noDataHint: 'このプロジェクトにはMakerWorldページデータがありません',
+    titleField: 'タイトル',
+    designer: 'デザイナー',
+    license: 'ライセンス',
+    description: '説明',
+    descriptionPlaceholder: 'プロジェクトの説明...',
+    printProfile: '印刷プロファイル',
+    profileTitle: 'プロファイルタイトル',
+    profileDescriptionPlaceholder: 'プロファイルの説明',
+    byUser: '{{name}} 作',
+    images: '画像 ({{count}})',
+    viewOnMakerWorld: 'MakerWorldで表示',
+  },
+
+  // Batch project modal
+  batchProject: {
+    addedToProject: '{{count}}件のアーカイブを「{{project}}」に追加しました',
+    assignFailed: 'プロジェクトへのアーカイブ割り当てに失敗しました',
+    removedFromProject: '{{count}}件のアーカイブをプロジェクトから削除しました',
+    removeFailed: 'プロジェクトからのアーカイブ削除に失敗しました',
+    assignTitle: 'プロジェクトに割り当て',
+    assignDescription: '{{count}}件の選択されたアーカイブのプロジェクトを選択:',
+    removeFromProject: 'プロジェクトから削除',
+    clearAssignment: '選択されたアーカイブのプロジェクト割り当てを解除',
+    orAssignTo: 'または割り当て先:',
+    archiveCount: '{{count}}件のアーカイブ',
+    noProjects: 'プロジェクトがありません。先にプロジェクトを作成してください。',
+  },
+
+  // リッチテキストエディター
+  richTextEditor: {
+    bold: '太字',
+    italic: '斜体',
+    underline: '下線',
+    bulletList: '箇条書き',
+    numberedList: '番号付きリスト',
+    alignLeft: '左揃え',
+    alignCenter: '中央揃え',
+    alignRight: '右揃え',
+    addLink: 'リンクを追加',
+    removeLink: 'リンクを削除',
+  },
+
+  // K-プロファイル
+  kProfiles: {
+    editProfile: 'K-プロファイルを編集',
+    addProfile: 'K-プロファイルを追加',
+    hasNote: 'メモあり',
+    copyProfile: 'プロファイルをコピー',
+    profileNamePlaceholder: 'マイPLAプロファイル',
+    notesPlaceholder: 'このプロファイルのメモを追加...',
+    searchPlaceholder: '名前またはフィラメントで検索...',
+    exportToJson: 'JSONにエクスポート',
+    importFromJson: 'JSONからインポート',
+    selectAllVisible: '表示中のプロファイルをすべて選択',
+    enterSelectionMode: '一括削除の選択モードに入る',
+    // Profile card
+    unnamed: '名前なし',
+    notePrefix: 'メモ: ',
+    // Profile modal
+    profileName: 'プロファイル名',
+    kValue: 'K値',
+    kValueRange: '一般的な範囲: PLA 0.01 - 0.06、PETG 0.02 - 0.10',
+    filament: 'フィラメント',
+    selectFilament: 'フィラメントを選択...',
+    noFilamentsFound: 'フィラメントが見つかりません。まずBambu StudioでKプロファイルを作成してください。',
+    flowType: 'フロータイプ',
+    highFlow: 'ハイフロー',
+    standard: 'スタンダード',
+    nozzleSize: 'ノズルサイズ',
+    extruder: 'エクストルーダー',
+    extruders: 'エクストルーダー',
+    left: '左',
+    right: '右',
+    notesStoredLocally: 'メモ(ローカル保存)',
+    notesHint: 'メモはBambuddyに保存され、プリンターには保存されません',
+    deleteProfileTitle: 'プロファイルを削除',
+    cannotBeUndone: 'この操作は元に戻せません',
+    confirmDeleteProfile: '"{{name}}"をプリンターから削除してもよろしいですか?',
+    profileSaved: 'Kプロファイルを保存しました',
+    profileDeleted: 'Kプロファイルを削除しました',
+    selectExtruder: 'エクストルーダーを少なくとも1つ選択してください',
+    profileSavedToExtruders: 'Kプロファイルを{{count}}個のエクストルーダーに保存しました',
+    failedToSave: 'Kプロファイルの保存に失敗しました',
+    syncingWithPrinter: 'プリンターと同期中...',
+    pleaseWait: 'お待ちください',
+    savingToExtruder: 'エクストルーダー {{current}}/{{total}} に保存中...',
+    // Main view
+    noPrintersConfigured: 'プリンターが設定されていません',
+    addPrinterHint: '設定でプリンターを追加してKプロファイルを管理',
+    noActivePrinters: 'アクティブなプリンターがありません',
+    enablePrinterHint: 'プリンター接続を有効にしてKプロファイルを表示',
+    loadingProfiles: 'Kプロファイルを読み込み中...',
+    nozzle: 'ノズル',
+    allExtruders: 'すべてのエクストルーダー',
+    leftOnly: '左のみ',
+    rightOnly: '右のみ',
+    allFlow: 'すべてのフロー',
+    hfOnly: 'HFのみ',
+    sOnly: 'Sのみ',
+    sortName: 'ソート: 名前',
+    sortKValue: 'ソート: K値',
+    sortFilament: 'ソート: フィラメント',
+    selectAll: 'すべて選択',
+    select: '選択',
+    printerOffline: 'プリンターオフライン',
+    printerOfflineHint: 'プリンターが接続されていません。電源を入れてKプロファイルを表示してください。',
+    leftExtruder: '左エクストルーダー',
+    rightExtruder: '右エクストルーダー',
+    noMatchingProfiles: '一致するプロファイルなし',
+    noProfilesMatch: '検索条件に一致するプロファイルがありません',
+    noKProfiles: 'Kプロファイルなし',
+    noProfilesForNozzle: '{{diameter}}mmノズルの圧力キャリブレーションプロファイルが見つかりません',
+    createFirstProfile: '最初のプロファイルを作成',
+    deleteProfiles: 'プロファイルを削除',
+    confirmBulkDelete: '{{count}}件の選択されたプロファイルをプリンターから削除してもよろしいですか?',
+    noProfilesToExport: 'エクスポートするプロファイルがありません',
+    exportedProfiles: '{{count}}件のプロファイルをエクスポートしました',
+    invalidFileFormat: '無効なファイル形式',
+    importedProfiles: '{{total}}件中{{imported}}件のプロファイルをインポートしました',
+    failedToParseImport: 'インポートファイルの解析に失敗しました',
+    deletedProfiles: '{{count}}件のプロファイルを削除しました',
+    failedToSaveNote: 'メモの保存に失敗しました',
+    noPermissionAdd: 'K-プロファイルを追加する権限がありません',
+    noPermissionDelete: 'K-プロファイルを削除する権限がありません',
+    noPermissionDeleteBulk: 'K-プロファイルを一括削除する権限がありません',
+    noPermissionExport: 'K-プロファイルをエクスポートする権限がありません',
+    noPermissionImport: 'K-プロファイルをインポートする権限がありません',
+    noPermissionRefresh: 'K-プロファイルを更新する権限がありません',
+  },
+
+  // APIブラウザ
+  apiBrowser: {
+    validationError: 'バリデーションエラー',
+    missingRequiredParams: '必須パラメーターが不足: {{params}}',
+    networkError: 'ネットワークエラー',
+    pathParameters: 'パスパラメーター',
+    queryParameters: 'クエリパラメーター',
+    selectOption: '-- 選択 --',
+    requestBody: 'リクエストボディ',
+    execute: '実行',
+    fillInRequired: '入力してください: {{params}}',
+    response: 'レスポンス',
+    failedToFetchSchema: 'OpenAPIスキーマの取得に失敗しました',
+    failedToLoadSchema: 'APIスキーマの読み込みに失敗しました',
+    otherCategory: 'その他',
+    expandAll: 'すべて展開',
+    collapseAll: 'すべて折りたたむ',
+    swaggerUI: 'Swagger UI',
+    endpointCount: '{{categories}}カテゴリー内{{count}}エンドポイント',
+  },
+  githubBackup: {
+    title: 'GitHubバックアップ',
+    enabled: '有効',
+    cloudLoginRequired: 'Bambu Cloudのログインが必要です。プロファイル → クラウドプロファイルからサインインしてGitHubバックアップを有効にしてください。',
+    description: 'プロファイルをプライベートGitHubリポジトリに自動同期し、バックアップとバージョン履歴を管理します。',
+    repositoryUrl: 'リポジトリURL',
+    personalAccessToken: 'パーソナルアクセストークン',
+    saved: '保存済み',
+    enterNewToken: '新しいトークンを入力して更新',
+    tokenHint: 'Contents読み取り/書き込み権限を持つFine-grainedトークン',
+    branch: 'ブランチ',
+    autoBackup: '自動バックアップ',
+    manualOnly: '手動のみ',
+    hourly: '毎時',
+    daily: '毎日',
+    weekly: '毎週',
+    includeInBackup: 'バックアップに含める',
+    kProfiles: 'Kプロファイル',
+    noPrintersConnected: 'プリンター未接続',
+    printersConnected: '{{connected}}/{{total}} 接続中',
+    kProfilesDescription: '接続されたプリンターからの圧力前進キャリブレーション',
+    cloudProfiles: 'クラウドプロファイル',
+    cloudProfilesDescription: 'Bambu Cloudのフィラメント、プリンター、プロセスプリセット',
+    appSettings: 'アプリ設定',
+    appSettingsDescription: 'Bambuddyの設定(機密データを除く)',
+    lastBackup: '最終バックアップ',
+    noBackupsYet: 'バックアップなし',
+    next: '次回',
+    startingBackup: 'バックアップ開始中...',
+    backupNow: '今すぐバックアップ',
+    test: 'テスト',
+    enableBackup: 'バックアップを有効化',
+    testConnection: '接続テスト',
+    history: '履歴',
+    date: '日付',
+    status: 'ステータス',
+    commit: 'コミット',
+    localBackup: 'ローカルバックアップ',
+    localDescription: 'Bambuddyデータをローカルファイルとしてエクスポートまたはインポートし、手動バックアップや移行に利用できます。',
+    exportData: 'データエクスポート',
+    exportDescription: 'すべての設定、プリンター、プロファイルをダウンロード',
+    importBackup: 'バックアップのインポート',
+    importDescription: '以前のエクスポートファイルから復元',
+    tokenUpdated: 'トークンを更新しました',
+    settingsSaved: '設定を保存しました',
+    failedToSave: '保存に失敗しました: {{error}}',
+    backupEnabled: 'GitHubバックアップを有効にしました',
+    backupComplete: 'バックアップ完了 - {{count}}ファイル更新',
+    backupSkipped: 'バックアップをスキップ - 変更なし',
+    backupFailed: 'バックアップに失敗しました: {{error}}',
+    logsCleared: '{{count}}件のログを削除しました',
+    failedToClearLogs: 'ログの削除に失敗しました: {{error}}',
+    enterRepoUrl: 'リポジトリURLを入力してください',
+    enterRepoUrlAndToken: 'リポジトリURLとアクセストークンを入力してください',
+    repoUrlRequired: 'リポジトリURLは必須です',
+    tokenRequired: 'アクセストークンは必須です',
+    backupDownloaded: 'バックアップのダウンロードが完了しました',
+    failedToCreateBackup: 'バックアップの作成に失敗しました',
+    backupRestored: 'バックアップの復元が完了しました',
+  },
+};

File diff suppressed because it is too large
+ 0 - 0
static/assets/index-DcyUztYr.js


+ 1 - 1
static/index.html

@@ -23,7 +23,7 @@
 
 
     <!-- Splash screens for iOS -->
     <!-- Splash screens for iOS -->
     <link rel="apple-touch-startup-image" href="/img/android-chrome-512x512.png" />
     <link rel="apple-touch-startup-image" href="/img/android-chrome-512x512.png" />
-    <script type="module" crossorigin src="/assets/index-BQgTn9O8.js"></script>
+    <script type="module" crossorigin src="/assets/index-DcyUztYr.js"></script>
     <link rel="stylesheet" crossorigin href="/assets/index-CPqcJWwC.css">
     <link rel="stylesheet" crossorigin href="/assets/index-CPqcJWwC.css">
   </head>
   </head>
   <body>
   <body>

Some files were not shown because too many files changed in this diff