export default {
  nav: {
    printers: '프린터',
    archives: '아카이브',
    queue: '대기열',
    stats: '통계',
    profiles: '프로필',
    maintenance: '유지보수',
    projects: '프로젝트',
    inventory: '필라멘트',
    finance: '재무',
    files: '파일 관리자',
    makerworld: 'MakerWorld',
    notifications: '알림',
    settings: '설정',
    system: '시스템',
    collapseSidebar: '사이드바 접기',
    expandSidebar: '사이드바 펼치기',
    update: '업데이트',
    updateAvailable: '업데이트 가능: v{{version}}',
    updateAvailableBanner: '버전 {{version}}이(가) 출시되었습니다!',
    viewUpdate: '업데이트 보기',
    viewOnGithub: 'GitHub에서 보기',
    keyboardShortcuts: '키보드 단축키 (?)',
    switchToLight: '라이트 모드로 전환',
    switchToDark: '다크 모드로 전환',
    switchToSystem: '기기 설정으로 전환',
    smartSwitches: '스마트 스위치',
    logout: '로그아웃',
    installApp: '앱 설치',
    installAppSuccess: 'Bambuddy가 설치되었습니다'
  },
  common: {
    plusNMore: '외 {{count}}개',
    save: '저장',
    saving: '저장 중...',
    cancel: '취소',
    delete: '삭제',
    edit: '편집',
    add: '추가',
    close: '닫기',
    confirm: '확인',
    loading: '로딩 중...',
    error: '오류',
    errorLoading: '데이터 로딩 오류',
    retry: '재시도',
    success: '성공',
    warning: '경고',
    enabled: '활성화됨',
    disabled: '비활성화됨',
    yes: '예',
    no: '아니요',
    on: '켜짐',
    off: '꺼짐',
    all: '전체',
    none: '없음',
    search: '검색',
    filter: '필터',
    sort: '정렬',
    refresh: '새로고침',
    download: '다운로드',
    upload: '업로드',
    uploading: '업로드 중...',
    uploadFailed: '업로드 실패',
    actions: '작업',
    status: '상태',
    name: '이름',
    description: '설명',
    date: '날짜',
    time: '시간',
    hours: '시간',
    minutes: '분',
    seconds: '초',
    days: '일',
    enable: '활성화',
    disable: '비활성화',
    permissions: '권한',
    noPrinters: '등록된 프린터가 없습니다',
    noData: '데이터가 없습니다',
    linkNotFound: '링크를 찾을 수 없습니다',
    required: '필수',
    optional: '선택',
    dismiss: '닫기',
    apply: '적용',
    reset: '초기화',
    export: '내보내기',
    import: '가져오기',
    clear: '지우기',
    selectAll: '전체 선택',
    deselectAll: '전체 해제',
    noChange: '— 변경 없음 —',
    unchanged: '변경 없음',
    unassigned: '미할당',
    unknown: '알 수 없음',
    unknownError: '알 수 없는 오류',
    today: '오늘',
    tomorrow: '내일',
    asap: '즉시',
    overdue: '기한 초과',
    now: '지금',
    collapse: '접기',
    expand: '펼치기',
    previous: '이전',
    next: '다음',
    viewArchive: '아카이브 보기',
    viewInFileManager: '파일 관리자에서 보기',
    addedBy: '{{username}}님이 추가함',
    prints: '인쇄',
    more: '+{{count}}개 더',
    ascending: '오름차순',
    descending: '내림차순',
    back: '뒤로',
    copy: '복사',
    copied: '복사됨!',
    printer: '프린터',
    remove: '제거',
    type: '유형',
    print: '인쇄',
    rename: '이름 변경',
    move: '이동',
    create: '만들기',
    duplicate: '복제',
    left: '왼쪽',
    right: '오른쪽',
    user: '사용자',
    run: '실행',
    running: '실행 중...'
  },
  finance: {
    allTypes: '모든 유형',
    allCostCenters: '모든 비용 센터',
    title: '재무',
    subtitle: '지갑, 개인 거래 및 비용 센터',
    noAccess: '재무 데이터를 볼 권한이 없습니다.',
    personalView: '개인 보기',
    adminView: '관리자 보기',
    createCostCenter: '비용 센터 만들기',
    adjustWallet: '지갑 조정',
    addManualPrint: '수동 인쇄 추가',
    manageMembers: '비용 센터 구성원 관리',
    currentBalance: '개인 잔액',
    transactions: '거래',
    personalTransactions: '개인 거래',
    costCenters: '비용 센터',
    availableForPrinting: '인쇄 할당 가능',
    costCenterName: '이름',
    budgetType: '예산 유형',
    monthlyBudget: '월 예산',
    totalBudget: '총예산',
    noBudget: '예산 없음',
    create: '만들기',
    selectUser: '사용자 선택',
    transactionType: '유형',
    amount: '금액',
    noCostCenter: '비용 센터 없음',
    descriptionOptional: '설명(선택 사항)',
    applyAdjustment: '조정 적용',
    memberCanPrint: '구성원이 인쇄할 수 있음',
    addMember: '구성원 추가',
    canPrint: '인쇄 가능',
    noMembers: '할당된 구성원이 없습니다.',
    editCostCenter: '비용 센터 편집',
    myCostCenters: '내 비용 센터',
    costCentersHint: '예산 한도를 검토하고 비용을 관리하세요',
    noCostCenters: '비용 센터를 찾을 수 없습니다.',
    owner: '소유자',
    balance: '계정 잔액',
    unlimited: '무제한',
    budgetPolicyHint: '계정 잔액은 비용을 기록합니다. 인쇄는 선택한 비용 센터의 예산으로만 제한되며, 예산이 없으면 무제한입니다.',
    budget: '예산',
    shared: '공유',
    cannotEditPrivateCostCenter: '비공개 비용 센터는 여기에서 편집할 수 없습니다',
    recentTransactions: '최근 거래',
    transactionsHint: '유형 및 비용 센터별 필터링',
    first: '처음',
    prev: '이전',
    next: '다음',
    last: '마지막',
    pageNumberOf: '{{total}}페이지 중 {{page}}페이지',
    noTransactions: '사용 가능한 거래가 없습니다.',
    noTransactionsForFilter: '선택한 필터와 일치하는 거래가 없습니다.',
    costCenter: '비용 센터',
    balanceAfter: '거래 후 잔액',
    userWithId: '사용자 #{{id}}',
    partial: '일부',
    editTransaction: '거래 편집',
    selectCostCenter: '비용 센터 선택...',
    costCenterRequired: '비용 센터를 선택하세요',
    amountExample: '예: 4.00',
    manualAdjustmentExample: '예: 수동 조정',
    userRequired: '사용자를 선택하세요',
    amountInvalid: '금액은 유효한 숫자여야 합니다',
    createdCostCenter: '비용 센터를 만들었습니다',
    createCostCenterFailed: '비용 센터를 만들지 못했습니다',
    transactionDeleted: '거래를 삭제했습니다',
    deleteTransactionFailed: '거래를 삭제하지 못했습니다',
    transactionEdited: '거래를 업데이트하고 원장을 다시 계산했습니다',
    editTransactionFailed: '거래를 편집하지 못했습니다',
    manualPrintCreated: '수동 인쇄 비용을 추가하고 원장을 다시 계산했습니다',
    manualPrintFailed: '수동 인쇄를 만들지 못했습니다',
    memberSaved: '구성원을 저장했습니다',
    memberSaveFailed: '구성원을 저장하지 못했습니다',
    memberRemoved: '구성원을 제거했습니다',
    memberRemoveFailed: '구성원을 제거하지 못했습니다',
    costCenterNameRequired: '비용 센터 이름은 필수입니다',
    costCenterUpdated: '비용 센터를 업데이트했습니다',
    costCenterUpdateFailed: '비용 센터를 업데이트하지 못했습니다',
    confirmDeleteCostCenter: '비용 센터 "{{name}}"을(를) 삭제하시겠습니까?',
    costCenterDeleted: '비용 센터를 삭제했습니다',
    costCenterDeleteFailed: '비용 센터를 삭제하지 못했습니다',
    deleteTransactionConfirm: '이 거래를 삭제하시겠습니까? 잔액은 자동으로 다시 계산됩니다.',
    deposit: '입금',
    withdraw: '출금',
    printCharge: '인쇄 비용',
    deleteTransaction: '거래 삭제',
  },
  printers: {
    title: '프린터',
    addPrinter: '프린터 추가',
    editPrinter: '프린터 편집',
    deletePrinter: '프린터 삭제',
    printerName: '프린터 이름',
    serialNumber: '일련번호',
    ipAddress: 'IP 주소 / 호스트명',
    accessCode: '액세스 코드',
    model: '모델',
    nozzleCount: '노즐 수',
    autoArchive: '자동 아카이브',
    status: {
      available: '사용 가능',
      idle: '대기 중',
      printing: '인쇄 중',
      paused: '일시정지',
      offline: '오프라인',
      problem: '문제 발생',
      error: '오류',
      finished: '완료',
      unknown: '알 수 없음'
    },
    temperatures: {
      nozzle: '노즐',
      bed: '베드',
      chamber: '챔버'
    },
    heaterHistory: {
      title: '히터 기록',
      openLabel: '히터 기록 보기',
      nozzle: '노즐',
      nozzle2: '노즐 2',
      bed: '베드',
      chamber: '챔버',
      error: '기록을 불러올 수 없습니다',
      empty: '아직 기록된 데이터가 없습니다'
    },
    progress: '{{percent}}% 완료',
    timeRemaining: '{{time}} 남음',
    deleteConfirm: '"{{name}}"을(를) 삭제하시겠습니까?',
    maintenanceOk: '유지보수 정상',
    maintenanceWarning: '{{count}}개 경고',
    maintenanceWarning_plural: '{{count}}개 경고',
    maintenanceDue: '{{count}}개 예정',
    maintenanceDue_plural: '{{count}}개 예정',
    sort: {
      name: '이름',
      status: '상태',
      model: '모델',
      location: '위치',
      eta: '남은 시간',
      ascending: '오름차순 정렬',
      descending: '내림차순 정렬'
    },
    cardSize: {
      small: '작은 카드',
      medium: '중간 카드',
      large: '큰 카드',
      extraLarge: '아주 큰 카드'
    },
    pageView: {
      openCamWallPage: '카메라 월을 페이지로 열기',
      cards: '카드',
      camWall: '카메라 월'
    },
    camWall: {
      page: {
        tokenRejected:
          '이 카메라 월 링크는 더 이상 유효하지 않습니다. 토큰이 만료되었거나 취소되었을 수 있습니다.',
        loadFailed: '프린터를 불러오지 못했습니다.',
      },
      noPrinters: '표시할 프린터가 없습니다',
      noSignal: '신호 없음',
      live: '라이브',
      snap: '스냅',
      off: '꺼짐',
      summary: '라이브 {{live}}개, 스냅 {{snap}}개, 총 {{total}}개',
      layer: '레이어 {{cur}}/{{total}}',
      timeLeft: '{{time}} 남음',
      statusMode: {
        off: '꺼짐',
        compact: '간단',
        full: '전체'
      },
      settings: {
        title: '카메라 월 설정',
        maxLive: '최대 라이브 스트림',
        maxLiveHint: '동시에 라이브 스트리밍할 타일 수. 나머지는 스냅샷으로 갱신됩니다.',
        snapshotInterval: '스냅샷 간격(초)',
        snapshotIntervalHint: '비라이브 타일이 새 스냅샷을 가져오는 주기.',
        statusOverlay: '상태 표시',
        statusOverlayHint: '간단: 상태 배지만 표시. 전체: + 진행률, 레이어, 남은 시간.'
      }
    },
    hideOffline: '오프라인 숨기기',
    nextAvailable: '다음 가용',
    powerOn: '전원 켜기',
    offlinePrintersWithPlugs: '스마트 플러그가 연결된 오프라인 프린터',
    noPrintersConfigured: '아직 설정된 프린터가 없습니다',
    search: '프린터 검색...',
    noSearchResults: '검색 또는 필터 조건에 맞는 프린터가 없습니다',
    filter: {
      allStatuses: '모든 상태',
      allLocations: '모든 위치'
    },
    toolbar: {
      filters: '필터',
      view: '보기',
      actions: '작업'
    },
    readyToPrint: '인쇄 준비 완료',
    external: '외부',
    extL: '외부-L',
    extR: '외부-R',
    deleteArchives: '인쇄 아카이브 삭제',
    noLabel: '라벨 없음',
    printPreview: '인쇄 미리보기',
    width: '너비',
    height: '높이',
    noObjectsFound: '객체를 찾을 수 없습니다',
    objectsLoadedOnPrintStart: '인쇄 시작 시 객체가 로드됩니다',
    willBeSkipped: '건너뛸 예정',
    name: '이름',
    serialCannotBeChanged: '일련번호는 변경할 수 없습니다',
    locationHelp: '프린터 그룹화 및 대기열 작업 필터링에 사용됩니다',
    wifiSignal: {
      veryWeak: '매우 약함',
      weak: '약함',
      fair: '보통',
      good: '좋음',
      excellent: '매우 좋음'
    },
    maintenanceUpToDate: '모든 유지보수 최신 상태 - 클릭하여 보기',
    maintenance: {
      title: '유지보수 중',
      subtitle: '이 프린터는 일시 중지되었습니다 — 연결되지 않음, 대기열에서 제외, 알림 전송 안 함.',
      pillLabel: '유지보수',
      exitButton: '유지보수 종료',
      menuEnter: '유지보수 모드로 전환',
      menuExit: '유지보수 모드 종료',
      toastEntered: '{{name}} 은(는) 이제 유지보수 모드입니다',
      toastExited: '{{name}} 이(가) 다시 온라인 상태입니다',
      confirmMidPrintTitle: '인쇄 중 유지보수 모드로 전환하시겠습니까?',
      confirmMidPrintMessage: '{{name}} 은(는) 현재 인쇄 중입니다. 유지보수 모드로 전환하면 MQTT가 연결 해제되고 이 작업의 진행률 추적 및 완료 알림이 중지됩니다. 계속하시겠습니까?',
      editFieldLabel: '유지보수 모드',
      editFieldHelp: '활성화하면 이 프린터는 MQTT, 대기열 디스패치 및 알림에서 일시 중지됩니다 — 수리, 병렬 Bambuddy 설치 또는 임시 중지에 유용합니다.',
    },
    chamberLightOn: '챔버 조명 켜기',
    chamberLightOff: '챔버 조명 끄기',
    files: '파일',
    browseFiles: '프린터 파일 탐색',
    autoOffAfterPrint: '인쇄 후 자동 전원 끄기',
    autoOffExecuted: '자동 끄기 실행됨 - 초기화하려면 프린터를 켜세요',
    hmsErrors: 'HMS 오류',
    viewHmsErrors: '{{count}}개 HMS 오류 보기',
    resume: '재개',
    pause: '일시정지',
    stop: '정지',
    camera: '카메라',
    skipObject: '객체 건너뛰기',
    reconnect: '재연결',
    forceRefresh: '강제 새로고침',
    forceRefreshSuccess: '새로고침 요청됨',
    mqttDebug: 'MQTT 디버그',
    printerInformation: '프린터 정보',
    copyToClipboard: '복사',
    copied: '복사됨!',
    state: '상태',
    wifiSignalLabel: 'WiFi 신호',
    developerMode: '개발자 모드',
    enabled: '활성화됨',
    disabled: '비활성화됨',
    addedOn: '추가됨',
    sdCard: 'SD 카드',
    inserted: '삽입됨',
    notInserted: '삽입되지 않음',
    totalPrintHours: '인쇄 시간',
    activeNozzle: '활성: {{nozzle}} 노즐',
    nozzleRack: '노즐 랙',
    nozzleDocked: '도킹됨',
    nozzleMounted: '장착됨',
    nozzleActive: '활성',
    nozzleIdle: '대기',
    nozzleDiameter: '직경',
    nozzleType: '유형',
    nozzleStatus: '상태',
    nozzleFilament: '필라멘트',
    nozzleWear: '마모',
    nozzleMaxTemp: '최대 온도',
    nozzleSerial: '일련번호',
    nozzleHardenedSteel: '경화강',
    nozzleStainlessSteel: '스테인리스강',
    nozzleTungstenCarbide: '텅스텐 카바이드',
    nozzleFlow: '유량',
    nozzleHighFlow: '고유량',
    nozzleStandardFlow: '표준',
    firmwareUpdate: '펌웨어 업데이트',
    firmwareInstructions: '프린터 터치스크린에서',
    firmwareNav: '이동',
    settings: '설정',
    firmware: '펌웨어',
    discoverPrinters: '프린터 검색',
    searching: '검색 중...',
    manualEntry: '수동 입력',
    addFromCloud: '클라우드에서 추가',
    toast: {
      printerDeleted: '프린터가 삭제되었습니다',
      missingSpoolAssignment: '{{printer}}에서 인쇄가 시작되었습니다. 슬롯 할당 누락: {{slots}}',
      killSwitchTriggered: '결제 킬 스위치가 {{printer}}에서 승인되지 않은 인쇄를 중지했습니다: {{filename}}',
      billingChargeFailed: '{{printer}}의 {{filename}} 결제에 실패했습니다. 예산 예약은 유지되었습니다. 서버 로그를 확인하세요.',
      assignmentVerified: '슬롯 {{slot}}에 필라멘트가 로드되었습니다 ({{printer}})',
      assignmentVerifiedNoKprofile: '{{printer}}의 슬롯 {{slot}}이(가) 로드되었지만 유량 보정 프로파일(K 프로파일)이 적용되지 않았습니다',
      assignmentNotConfirmed: '{{printer}}의 슬롯 {{slot}} 할당을 확인할 수 없습니다. AMS 슬롯을 확인하세요',
      printerAdded: '프린터가 추가되었습니다',
      printerUpdated: '프린터가 업데이트되었습니다',
      failedToDelete: '프린터 삭제 실패',
      failedToAdd: '프린터 추가 실패',
      failedToUpdate: '프린터 업데이트 실패',
      commandSent: '명령이 전송되었습니다',
      failedToSendCommand: '명령 전송 실패',
      turnedOn: '{{name}} 켜짐',
      failedToPowerOn: '{{name}} 전원 켜기 실패',
      scriptTriggered: '스크립트가 실행되었습니다',
      printStopped: '인쇄가 정지되었습니다',
      printPaused: '인쇄가 일시정지되었습니다',
      printResumed: '인쇄가 재개되었습니다',
      referenceDeleted: '참조가 삭제되었습니다',
      detectionAreaSaved: '감지 영역이 저장되었습니다',
      failedToRunScript: '스크립트 실행 실패',
      failedToStopPrint: '인쇄 정지 실패',
      failedToPausePrint: '인쇄 일시정지 실패',
      failedToResumePrint: '인쇄 재개 실패',
      failedToControlChamberLight: '챔버 조명 제어 실패',
      failedToSetSpeed: '인쇄 속도 설정 실패',
      failedToUpdateSetting: '설정 업데이트 실패',
      failedToSkipObjects: '객체 건너뛰기 실패',
      failedToRereadRfid: 'RFID 재읽기 실패',
      failedToCheckPlate: '플레이트 확인 실패',
      failedToUpdateLabel: '라벨 업데이트 실패',
      failedToDeleteReference: '참조 삭제 실패',
      failedToSaveDetectionArea: '감지 영역 저장 실패',
      plateCheckEnabled: '플레이트 확인 활성화됨',
      plateCheckDisabled: '플레이트 확인 비활성화됨',
      calibrationSaved: '캘리브레이션이 저장되었습니다!',
      calibrationFailed: '캘리브레이션 실패',
      rfidRereadInitiated: 'RFID 재읽기가 시작되었습니다',
      loadInitiated: '필라멘트 로딩 중…',
      unloadInitiated: '필라멘트 언로딩 중…',
      failedToLoad: '필라멘트 로드 실패',
      failedToUnload: '필라멘트 언로드 실패',
      connectionFailedNotAdded: '프린터에 연결할 수 없습니다. IP, 시리얼 번호, 액세스 코드를 확인하고 LAN 전용 모드가 켜져 있는지 확인하세요. 프린터가 추가되지 않았습니다.'
    },
    connection: {
      connected: '연결됨',
      offline: '오프라인'
    },
    plateStatus: {
      markCleared: '플레이트 비움으로 표시',
      cleared: '플레이트 비워짐',
      notCleared: '플레이트 미비움',
      inUse: '플레이트 사용 중'
    },
    queue: {
      inQueue: '대기열에 {{count}}개',
      inQueue_plural: '대기열에 {{count}}개'
    },
    controls: '제어',
    rfid: {
      reread: 'RFID 재읽기'
    },
    ams: {
      load: '로드',
      unload: '언로드'
    },
    bedJog: {
      limitWarning: '수동 이동 중에는 이동 한계가 적용되지 않습니다. Bambu 펌웨어 버그로 인해 원격 명령에서는 소프트웨어 엔드스톱이 무시됩니다. 충돌하지 않도록 주의해서 이동하세요.',
      title: '조그 컨트롤',
      bed: '베드',
      step: '이동 거리 (mm)',
      up: '플레이트 위로',
      down: '플레이트 아래로',
      disabledWhilePrinting: '인쇄 중 비활성화됨',
      notHomedTitle: '프린터 홈 설정 필요',
      notHomedMessage: '마지막 인쇄 이후 홈 설정이 되지 않았습니다. 안전한 위치 지정을 위해 자동 홈 설정을 먼저 실행하거나, 그냥 이동하세요 — 소프트 엔드스톱이 무시됩니다.',
      homeZ: '자동 홈 설정',
      moveAnyway: '그냥 이동',
      homingStarted: '프린터 자동 홈 설정 중…'
    },
    permission: {
      noAdd: '프린터를 추가할 권한이 없습니다',
      noEdit: '프린터를 편집할 권한이 없습니다',
      noDelete: '프린터를 삭제할 권한이 없습니다',
      noControl: '프린터를 제어할 권한이 없습니다',
      noFiles: '프린터 파일에 접근할 권한이 없습니다',
      noAmsRfid: 'AMS RFID를 재읽기할 권한이 없습니다',
      noSmartPlugControl: '스마트 플러그를 제어할 권한이 없습니다',
      noCamera: '카메라를 볼 권한이 없습니다'
    },
    modal: {
      addTitle: '프린터 추가',
      editTitle: '프린터 편집',
      myPrinter: '내 프린터',
      selectModel: '모델 선택...',
      locationGroup: '위치 / 그룹 (선택사항)',
      locationPlaceholder: '예: 작업실, 사무실, 지하실',
      autoArchiveLabel: '완료된 인쇄 자동 아카이브',
      fromPrinterSettings: '프린터 설정에서',
      modelOptional: '모델 (선택사항)',
      saveChanges: '변경사항 저장'
    },
    skipObjects: {
      tooltip: '객체 건너뛰기',
      onlyWhilePrinting: '객체 건너뛰기 (인쇄 중에만)',
      requiresMultiple: '객체 건너뛰기 (2개 이상 필요)',
      title: '객체 건너뛰기',
      matchIdsInfo: '프린터 화면의 ID와 일치',
      printerShowsIds: '프린터 화면에서 빌드 플레이트의 객체 ID를 표시합니다',
      skipSelected: '선택 항목 건너뛰기',
      skipping: '건너뛰는 중...',
      noObjectsSelected: '선택된 객체 없음',
      selectObjectsToSkip: '현재 인쇄에서 건너뛸 객체를 선택하세요',
      skipped: '건너뜀',
      objectsSkipped: '객체가 건너뛰어졌습니다',
      activeCount: '{{count}}개 활성',
      waitForLayer: '객체를 건너뛰려면 2층 이상을 기다리세요 (현재 {{layer}}층)',
      skip: '건너뛰기',
      confirmTitle: '객체를 건너뛰시겠습니까?',
      confirmMessage: '"{{name}}"을(를) 건너뛰시겠습니까? 이 작업은 취소할 수 없습니다.',
      confirmAllMessage: '남아 있는 모든 개체가 선택되었습니다. 인쇄 작업이 중지됩니다. 계속하시겠습니까?',
      confirmMultipleMessage: '선택한 {{count}}개의 객체를 건너뛰시겠습니까? 이 작업은 취소할 수 없습니다.',
    },
    confirm: {
      deleteTitle: '프린터 삭제',
      deleteMessage: '"{{name}}"을(를) 삭제하시겠습니까? 모든 연결 설정이 제거됩니다.',
      deleteArchivesNote: '이 프린터의 모든 인쇄 기록이 영구적으로 삭제됩니다.',
      keepArchivesNote: '인쇄 기록은 유지되지만 이 프린터와 연결이 해제됩니다.',
      stopTitle: '인쇄 정지',
      stopMessage: '"{{name}}"의 현재 인쇄를 정지하시겠습니까? 인쇄 작업이 취소됩니다.',
      stopButton: '인쇄 정지',
      pauseTitle: '인쇄 일시정지',
      pauseMessage: '"{{name}}"의 현재 인쇄를 일시정지하시겠습니까?',
      pauseButton: '인쇄 일시정지',
      resumeTitle: '인쇄 재개',
      resumeMessage: '"{{name}}"의 인쇄를 재개하시겠습니까?',
      resumeButton: '인쇄 재개',
      powerOnTitle: '프린터 전원 켜기',
      powerOnMessage: '"{{name}}"의 전원을 켜시겠습니까?',
      powerOnButton: '전원 켜기',
      powerOffTitle: '프린터 전원 끄기',
      powerOffMessage: '"{{name}}"의 전원을 끄시겠습니까?',
      powerOffWarning: '경고: "{{name}}"이(가) 현재 인쇄 중입니다! 전원을 끄시겠습니까? 인쇄가 중단되고 프린터가 손상될 수 있습니다.',
      powerOffButton: '전원 끄기',
      haToggleTitle: '"{{name}}" 토글',
      haToggleMessage: 'Home Assistant 엔티티 {{entity}}를 토글하시겠습니까? 현재 켜져 있으면 전원이 꺼질 수 있습니다.',
      haToggleWarning: '경고: "{{name}}"이(가) 현재 인쇄 중입니다! {{entity}}를 토글하면 전원이 차단되어 인쇄가 중단될 수 있습니다. 계속하시겠습니까?',
      haToggleButton: '토글'
    },
    bulk: {
      select: '선택',
      selectAll: '전체 선택',
      selectByLocation: '위치별 선택',
      selected: '{{count}}개 선택됨',
      actions: {
        stop: '정지',
        pause: '일시정지',
        resume: '재개',
        clearPlate: '베드 비우기',
        clearHMS: '알림 지우기'
      },
      confirm: {
        stopTitle: '{{count}}개 인쇄 정지',
        stopMessage: '{{count}}개 프린터의 활성 인쇄를 취소합니다. 이 작업은 취소할 수 없습니다.',
        stopButton: '모두 정지',
        pauseTitle: '{{count}}개 인쇄 일시정지',
        pauseMessage: '{{count}}개 프린터의 활성 인쇄를 일시정지합니다.',
        pauseButton: '모두 일시정지',
        clearPlateTitle: '{{count}}개 인쇄 베드 비우기',
        clearPlateMessage: '{{count}}개 프린터의 인쇄 베드를 비우고 대기열 작업을 시작할 수 있습니다.',
        clearPlateButton: '모두 비우기'
      },
      success: '{{count}}개 프린터에서 {{action}} 완료',
      partial: '{{succeeded}}개 성공, {{failed}}개 실패',
      noneApplicable: '선택된 프린터 중 이 작업에 적합한 상태의 프린터가 없습니다',
      selectByState: '상태별 선택'
    },
    discovery: {
      title: '프린터 검색',
      searching: '검색 중...',
      scanning: '스캔 중...',
      scanProgress: '스캔 중... {{scanned}}/{{total}}',
      foundPrinters: '{{count}}개 프린터 발견',
      noPrintersFound: '프린터를 찾을 수 없습니다',
      noPrintersFoundSubnet: '지정된 서브넷에서 프린터를 찾을 수 없습니다.',
      noPrintersFoundNetwork: '네트워크에서 프린터를 찾을 수 없습니다.',
      allConfigured: '검색된 모든 프린터가 이미 설정되어 있습니다.',
      alreadyAdded: '이미 추가됨',
      select: '선택',
      manualEntry: '수동 입력',
      addFromCloud: '클라우드에서 추가',
      subnetToScan: '스캔할 서브넷',
      dockerNote: 'Docker가 감지되었습니다. CIDR 표기법으로 프린터의 서브넷을 입력하세요. docker-compose.yml에 network_mode: host가 필요합니다.',
      scanSubnet: '서브넷에서 프린터 스캔',
      discoverNetwork: '네트워크에서 프린터 검색',
      scanningSubnet: 'Bambu 프린터를 위해 서브넷 스캔 중...',
      scanningNetwork: '네트워크 스캔 중...',
      serialRequired: '일련번호 필수',
      unknown: '알 수 없음',
      failedToStart: '검색 시작 실패',
      customSubnetOption: '사용자 지정 서브넷...',
      customSubnetLabel: '사용자 지정 서브넷 (CIDR)',
      customSubnetNote: '프린터가 이 서버와 다른 네트워크에 있는 경우 사용자 지정 서브넷을 사용하세요. FTP (990) 및 MQTT (8883) 포트가 라우팅 경계를 통해 접근 가능해야 합니다.',
    },
    drying: {
      start: '건조 시작',
      stop: '건조 정지',
      temperature: '온도',
      duration: '시간',
      hours: '시간',
      timeRemaining: '{{time}} 남음',
      active: '건조 중',
      targetSummary: '{{filament}} @ {{temp}}°C',
      notSupported: '건조 지원 안 됨',
      powerRequired: '건조를 활성화하려면 AMS 전원 어댑터를 연결하세요',
      startingDrying: '건조 시작 중...',
      toastCommandSent: '건조 명령을 전송했습니다',
      toastStopped: '건조를 중지했습니다',
      toastNotStarted: '프린터가 명령을 수락했지만 AMS가 건조를 시작하지 않았습니다. AMS 전원 어댑터가 연결되어 있는지, 프린터가 대기 상태인지 확인하십시오.',
      screenOnly: '이 프린터에서는 AMS 건조를 프린터 자체 화면에서만 제어할 수 있습니다 (Bambu 제한 사항)',
      stoppingDrying: '건조 정지 중...',
      rotateTray: '건조 중 스풀 회전',
      rotateUnavailableReason: '사용할 수 없음 — 이 AMS의 슬롯이 툴헤드로 로드되어 있습니다. 스풀이 공급 튜브에 의해 고정되어 회전할 수 없습니다. 먼저 필라멘트를 뺀 후 다시 시도하십시오.'
    },
    amsBackup: {
      titleOn: 'AMS 필라멘트 백업이 켜져 있습니다. 비활성화하려면 클릭하세요.',
      titleOff: 'AMS 필라멘트 백업이 꺼져 있습니다. 활성화하려면 클릭하세요.',
      titleUnknown: '이 프린터에서는 AMS 필라멘트 백업 상태를 확인할 수 없습니다.',
      toastEnabled: 'AMS 필라멘트 백업이 활성화되었습니다',
      toastDisabled: 'AMS 필라멘트 백업이 비활성화되었습니다',
      modalTitle: 'AMS 필라멘트 백업',
      modalHelp: '활성 슬롯이 소진되면 프린터는 같은 프리셋과 색상의 슬롯을 이 순서로 순환합니다.',
      modalNoSlots: '필라멘트가 로드되지 않았습니다.',
      modalNoPairs: '백업 쌍이 없습니다 — 프리셋과 색상이 모두 일치하는 슬롯이 없습니다.',
      extruderRightShort: '우',
      extruderLeftShort: '좌',
      stateOn: '활성화됨',
      stateOff: '비활성화됨',
      stateUnknown: '이 프린터에서 지원되지 않음'
    },
    activeJobSlot: {
      title: '이 슬롯은 활성 인쇄의 필라멘트 {{n}}입니다',
      ariaLabel: '활성 인쇄 슬롯 {{n}}'
    },
    expectedSlot: {
      title: '프린터가 이 슬롯의 필라멘트를 기다리고 있습니다',
      ariaLabel: '요청된 필라멘트 슬롯 {{n}}',
      label: '{{ams}} · 슬롯 {{slot}}',
      external: '외부 스풀',
    },
    filaments: '필라멘트',
    externalSpool: {
      hide: '외부 스풀 숨기기',
      show: '외부 스풀 표시',
    },
    openCameraOverlay: '카메라 오버레이 열기',
    openCameraWindow: '새 창에서 카메라 열기',
    firmwareUpdateAvailable: '펌웨어 업데이트 가능: {{current}} → {{latest}}',
    firmwareUpToDate: '펌웨어 {{version}} — 최신 상태',
    firmwareUpdateButton: '업데이트',
    plateDetection: {
      noPermission: '프린터를 업데이트할 권한이 없습니다',
      enabledClick: '플레이트 확인 활성화됨 - 클릭하여 비활성화',
      disabledClick: '플레이트 확인 비활성화됨 - 클릭하여 활성화',
      manageCalibration: '플레이트 감지 캘리브레이션 관리',
      calibrationRequired: '캘리브레이션 필요',
      calibrationInstructions: '빌드 플레이트가 <strong>완전히 비어 있는지</strong> 확인한 후 캘리브레이션을 클릭하세요.',
      calibrationDescription: '캘리브레이션은 빈 플레이트의 참조 이미지를 캡처합니다. 이후 확인 시 이 참조와 비교하여 객체를 감지합니다.',
      calibrationTip: '<strong>팁:</strong> 다른 플레이트에 대해 최대 5개의 캘리브레이션을 저장할 수 있습니다. 확인 시 시스템이 자동으로 가장 잘 맞는 것을 사용합니다.',
      plateEmpty: '플레이트가 비어 있는 것으로 보입니다',
      objectsDetected: '플레이트에 객체가 감지되었습니다',
      confidence: '신뢰도',
      difference: '차이',
      analysisPreview: '분석 미리보기:',
      analysisLegend: '초록 박스 = 감지 영역, 빨간 오버레이 = 캘리브레이션과의 차이',
      savedReferences: '저장된 참조 ({{count}}/{{max}})',
      deleteReference: '참조 삭제',
      labelPlaceholder: '라벨...',
      clickToEdit: '{{label}} - 클릭하여 편집',
      clickToAddLabel: '클릭하여 라벨 추가'
    },
    speed: {
      title: '인쇄 속도',
      silent: '조용함 (50%)',
      standard: '표준 (100%)',
      sport: '스포츠 (124%)',
      ludicrous: '루디크러스 (166%)'
    },
    airduct: {
      title: '에어덕트 모드',
      cooling: '냉각',
      heating: '가열'
    },
    noSdCard: 'SD 없음',
    door: {
      open: '열림',
      closed: '닫힘'
    },
    fans: {
      partCooling: '파트 냉각 팬',
      auxiliary: '보조 팬',
      leftAuxiliary: '왼쪽 보조 팬',
      exhaust: '배기',
      chamber: '챔버 팬'
    },
    clickToViewHmsErrors: 'HMS 오류 보기 클릭',
    aiDetection: {
      safe: '안전',
      warning: '경고',
      failure: '실패',
      idle: '대기 중',
      tooltip: 'AI 실패 감지: {{status}} (점수 {{score}}) - 클릭하여 자세히 보기',
      tooltipIdle: 'AI 실패 감지 활성화됨 - 다음 인쇄부터 모니터링을 시작합니다 - 클릭하여 자세히 보기',
      modalTitle: 'AI 실패 감지 - {{name}}',
      currentStatus: '상태',
      score: '점수',
      framesAnalyzed: '분석된 프레임',
      idleHint: '현재 모니터링 중인 인쇄가 없습니다. 다음 인쇄부터 자동으로 모니터링을 시작합니다.',
      lastError: '마지막 오류',
      openSettings: '설정 열기'
    },
    estimatedCompletion: '예상 완료 시간',
    plateNumber: '플레이트 {{number}}',
    slotOptions: '슬롯 옵션',
    amsPopup: {
      friendlyName: 'AMS 이름',
      friendlyNamePlaceholder: '예: AMS 친숙한 이름',
      serialNumber: '일련번호',
      firmwareVersion: '펌웨어',
      save: '저장',
      clear: '지우기',
      noEditPermission: 'AMS 유닛 이름을 변경할 권한이 없습니다'
    },
    firmwareModal: {
      title: '펌웨어 업데이트',
      titleUpToDate: '펌웨어 정보',
      currentVersion: '현재:',
      latestVersion: '최신:',
      releaseNotes: '릴리스 노트',
      checkingPrereqs: '전제 조건 확인 중...',
      sdCardReady: 'SD 카드 준비됨. 아래를 클릭하여 펌웨어를 업로드하세요.',
      uploadedSuccess: 'SD 카드에 펌웨어가 업로드되었습니다!',
      applyInstructions: '프린터에서 업데이트를 적용하려면:',
      step1: '프린터 터치스크린에서 <strong>설정</strong>으로 이동하세요',
      step2: '<strong>펌웨어</strong>로 이동하세요',
      step3: '<strong>SD 카드에서 업데이트</strong>를 선택하세요',
      step4: '업데이트에 10-20분이 소요됩니다',
      done: '완료',
      starting: '시작 중...',
      uploadFirmware: '펌웨어 업로드',
      uploadFailed: '업로드 시작 실패: {{error}}',
      uploadedToast: '펌웨어 업로드됨! 프린터 화면에서 업데이트를 시작하세요.',
      availableVersions: '사용 가능한 버전',
      usable: '사용 가능',
      unavailable: '사용 불가',
      installed: '설치됨',
      newerBadge: '최신',
      olderBadge: '이전',
      currentBadge: '현재'
    },
    accessCodePlaceholder: '현재 값을 유지하려면 비워두세요',
    roi: {
      title: '감지 영역 (ROI)',
      xStart: 'X 시작',
      yStart: 'Y 시작',
      width: '너비',
      height: '높이',
      instruction: '빌드 플레이트에 집중할 감지 영역을 조정하세요. 미리보기의 초록 박스가 현재 영역을 표시합니다.'
    },
    developerModeWarning: '개발자 LAN 모드가 활성화되지 않음: {{names}}. 일부 기능이 작동하지 않을 수 있습니다.',
    howToEnable: '활성화 방법',
    incompatibleFile: '이 파일은 {{slicedFor}}용으로 슬라이싱되었지만, 이 프린터는 {{printerModel}}입니다',
    dropNotPrintable: '.gcode 및 .gcode.3mf 파일만 인쇄할 수 있습니다',
    dropToPrint: '놓아서 인쇄',
    cannotPrint: '프린터 사용 중',
    addPreflight: {
      checking: '연결 확인 중...',
      warning: '일부 연결 확인이 실패했습니다. 이 프린터가 오프라인으로 표시될 수 있습니다. 아래 항목을 검토하고 수정하거나 그냥 저장하세요.',
      back: '뒤로',
      saveAnyway: '그냥 저장'
    }
  },
  archives: {
    title: '인쇄 아카이브',
    no3mfBanner: {
      title: '최근 일부 인쇄가 썸네일과 함께 아카이브되지 않았습니다',
      body: '슬라이서가 프린터의 SD 카드에 .gcode.3mf 파일을 남기지 않아서 Bambuddy가 썸네일이나 슬라이서 메타데이터를 가져올 수 없었습니다. 일반적으로 슬라이서 (Bambu Studio / OrcaSlicer 장치 탭)에서 "전송된 파일을 외부 저장소에 저장"이 꺼져 있을 때 발생합니다.',
      docsLink: '설치 단계 4 보기',
      docsLinkInternalStorage: '왜 이런 일이 생기나요',
      titleInternalStorage: '최근 일부 출력물이 프린터 내부 저장소에 남았습니다',
      bodyInternalStorage: '프린터가 슬라이싱된 파일을 카드가 아니라 자체 내부 저장소에 보관해서 Bambuddy가 FTP로 읽을 것이 없었습니다. H2 시리즈와 P2S 펌웨어가 이렇게 동작하며 «보낸 파일을 외부 저장소에 저장»으로는 바뀌지 않습니다. 해당 출력물은 이름과 시간과 함께 계속 보관되지만 썸네일과 슬라이서 메타데이터는 없습니다.',
      titleNoExternalStorage: '최근 일부 출력물을 보관하지 못했습니다 — 프린터에 저장소가 없습니다',
      bodyNoExternalStorage: '프린터 슬롯에 카드도 USB도 감지되지 않아 슬라이싱된 파일이 저장될 곳이 없었고 Bambuddy가 읽을 것도 없었습니다. 하나 넣으면 다음 출력물은 온전히 보관됩니다.',
      dismissLabel: '이 알림 닫기'
    },
    searchPlaceholder: '아카이브 검색...',
    filterByPrinter: '프린터별 필터',
    filterByStatus: '상태별 필터',
    sortBy: '정렬 기준',
    sortNewest: '최신순',
    sortOldest: '오래된순',
    sortName: '이름',
    sortDuration: '시간',
    sortLargest: '큰 것 먼저',
    sortSmallest: '작은 것 먼저',
    sortSize: '크기',
    noArchives: '아카이브를 찾을 수 없습니다',
    noArchivesSearch: '검색 조건에 맞는 아카이브가 없습니다',
    originalPrintNotVisible: '원본 인쇄가 보이지 않음 - 필터를 지워보세요',
    noArchivesYet: '아직 아카이브가 없습니다',
    prints: '인쇄',
    pagination: {
      showing: '표시 중',
      to: '~',
      of: '/',
      show: '표시',
      page: '페이지',
      all: '전체'
    },
    loadingArchives: '아카이브 로딩 중...',
    releaseToUpload: '놓아서 업로드',
    showAll: '모두 보기',
    showFavoritesOnly: '즐겨찾기만 보기',
    gridView: '그리드 보기',
    listView: '목록 보기',
    calendarView: '달력 보기',
    logView: '인쇄 로그',
    manageTags: '태그 관리',
    showFailedPrints: '실패한 인쇄 표시',
    hideFailedPrints: '실패한 인쇄 숨기기',
    hideDuplicates: '중복 숨기기',
    viewOriginalPrint: '원본 인쇄 보기 클릭 (#{{id}})',
    printTime: '인쇄 시간',
    filamentUsed: '사용된 필라멘트',
    cost: '비용',
    preview: '미리보기',
    deleteArchive: '아카이브 삭제',
    deleteConfirm: '이 아카이브를 삭제하시겠습니까?',
    favorite: '즐겨찾기',
    unfavorite: '즐겨찾기에서 제거',
    viewDetails: '상세 보기',
    status: {
      completed: '완료',
      failed: '실패',
      stopped: '정지됨'
    },
    toast: {
      source3mfAttached: '소스 3MF 첨부됨: {{filename}}',
      failedUploadSource3mf: '소스 3MF 업로드 실패',
      source3mfRemoved: '소스 3MF 제거됨',
      failedRemoveSource3mf: '소스 3MF 제거 실패',
      f3dAttached: 'F3D 첨부됨: {{filename}}',
      failedUploadF3d: 'F3D 업로드 실패',
      f3dRemoved: 'F3D 제거됨',
      failedRemoveF3d: 'F3D 제거 실패',
      timelapseAttached: '타임랩스 첨부됨: {{filename}}',
      timelapseAlreadyAttached: '타임랩스가 이미 첨부됨',
      noMatchingTimelapse: '일치하는 타임랩스를 찾을 수 없습니다',
      failedScanTimelapse: '타임랩스 스캔 실패',
      failedAttachTimelapse: '타임랩스 첨부 실패',
      timelapseRemoved: '타임랩스 제거됨',
      failedRemoveTimelapse: '타임랩스 제거 실패',
      timelapseUploaded: '타임랩스 업로드됨: {{filename}}',
      failedUploadTimelapse: '타임랩스 업로드 실패',
      archiveDeleted: '아카이브가 삭제되었습니다',
      failedDeleteArchive: '아카이브 삭제 실패',
      addedToFavorites: '즐겨찾기에 추가됨',
      removedFromFavorites: '즐겨찾기에서 제거됨',
      projectUpdated: '프로젝트가 업데이트되었습니다',
      failedUpdateProject: '프로젝트 업데이트 실패',
      linkCopied: '링크가 클립보드에 복사되었습니다',
      failedCopyLink: '링크 복사 실패',
      photoDeleted: '사진이 삭제되었습니다',
      failedDeletePhoto: '사진 삭제 실패',
      failedDeleteArchives: '아카이브 삭제 실패',
      failedUpdateFavorites: '즐겨찾기 업데이트 실패',
      exportDownloaded: '내보내기 다운로드됨',
      exportFailed: '내보내기 실패'
    },
    menu: {
      print: '인쇄',
      openInBambuStudio: '슬라이서에서 열기',
      slice: '슬라이스',
      externalLink: '외부 링크',
      viewOnMakerWorld: 'MakerWorld에서 보기',
      preview3d: '3D 미리보기',
      viewTimelapse: '타임랩스 보기',
      scanForTimelapse: '타임랩스 검색',
      uploadTimelapse: '타임랩스 업로드',
      removeTimelapse: '타임랩스 제거',
      downloadSource3mf: '소스 3MF 다운로드',
      uploadSource3mf: '소스 3MF 업로드',
      replaceSource3mf: '소스 3MF 교체',
      removeSource3mf: '소스 3MF 제거',
      uploadF3d: 'F3D 업로드',
      replaceF3d: 'F3D 교체',
      downloadF3d: 'F3D 다운로드',
      removeF3d: 'F3D 제거',
      download: '다운로드',
      copyDownloadLink: '다운로드 링크 복사',
      qrCode: 'QR 코드',
      viewPhotos: '사진 보기',
      viewPhotosCount: '사진 보기 ({{count}})',
      projectPage: '프로젝트 페이지',
      addToFavorites: '즐겨찾기에 추가',
      removeFromFavorites: '즐겨찾기에서 제거',
      edit: '편집',
      goToProject: '프로젝트로 이동: {{name}}',
      addToProject: '프로젝트에 추가',
      removeFromProject: '프로젝트에서 제거',
      loading: '로딩 중...',
      noProjectsAvailable: '사용 가능한 프로젝트 없음',
      searchProjects: '프로젝트 검색…',
      select: '선택',
      deselect: '선택 해제',
      delete: '삭제',
      printLog: '인쇄 기록'
    },
    permission: {
      noReprint: '이 아카이브를 재인쇄할 권한이 없습니다',
      noAddToQueue: '대기열에 추가할 권한이 없습니다',
      noUpdateArchives: '아카이브를 업데이트할 권한이 없습니다',
      noUploadFiles: '파일을 업로드할 권한이 없습니다',
      noDownload: '아카이브를 다운로드할 권한이 없습니다',
      noCopyLink: '다운로드 링크를 복사할 권한이 없습니다',
      noDelete: '이 아카이브를 삭제할 권한이 없습니다',
      noEdit: '이 항목을 편집할 권한이 없습니다',
      noCreate: '아카이브를 만들 권한이 없습니다'
    },
    platePicker: {
      title: '미리 볼 플레이트 선택',
      hint: '이 아카이브에는 여러 플레이트가 있습니다. G코드 뷰어에서 열 플레이트를 선택하세요.',
      plateLabel: '플레이트 {{index}}',
      objectCount: '{{count}}개 객체',
      objectCount_plural: '{{count}}개 객체',
      noGcode: '이 아카이브에는 미리 볼 슬라이싱된 G코드가 없습니다. Bambu Studio에서 먼저 슬라이싱하세요.'
    },
    card: {
      previousPlate: '이전 플레이트',
      nextPlate: '다음 플레이트',
      plateNumber: '플레이트 {{index}}',
      moreOptions: '더 많은 옵션은 우클릭',
      addToFavorites: '즐겨찾기에 추가',
      removeFromFavorites: '즐겨찾기에서 제거',
      cancelled: '취소됨',
      failed: '실패',
      duplicate: '중복',
      duplicateTitle: '이 모델은 이전에 인쇄된 적이 있습니다',
      openSource3mf: 'Bambu Studio에서 소스 3MF 열기 (더 많은 옵션은 우클릭)',
      downloadF3d: 'Fusion 360 디자인 파일 다운로드',
      viewTimelapse: '타임랩스 보기',
      viewPhoto: '사진 1장 보기',
      viewPhotos: '사진 {{count}}장 보기',
      openFolder: '폴더 열기: {{name}}',
      slicedFile: '슬라이싱된 파일 - 인쇄 준비 완료',
      sourceFile: '소스 파일만 - AMS 매핑 없음',
      gcode: 'GCODE',
      source: '소스',
      project: '프로젝트: {{name}}',
      estimated: '예상: {{time}}',
      actual: '실제: {{time}}',
      accuracy: '정확도: {{percent}}%',
      filament: '{{weight}}g',
      layer: '{{count}}층',
      layers: '{{count}}층',
      object: '{{count}}개 객체',
      objects: '{{count}}개 객체',
      slicedFor: '{{model}}용으로 슬라이싱됨',
      uploadedBy: '업로드한 사용자',
      noPermissionReprint: '재인쇄 권한이 없습니다',
      noFileForReprint: '3MF 파일 없음 — 인쇄 기록 시 프린터에서 파일을 다운로드할 수 없었습니다',
      slicerAmsMapping: 'AMS 매핑 저장됨({{printer}})',
      slicerAmsMappingTooltip: '슬라이서가 선택한 AMS 슬롯이 {{printer}}용으로 저장되었습니다. 슬롯 번호는 해당 프린터에서만 의미가 있으므로, 다시 {{printer}}로 보낼 때만 재인쇄에서 재사용됩니다.',
      noPermissionEdit: '아카이브를 편집할 권한이 없습니다',
      noPermissionDelete: '아카이브를 삭제할 권한이 없습니다',
      openInBambuStudio: '슬라이서에서 열기',
      openInBambuStudioToSlice: '슬라이스하려면 슬라이서에서 열기',
      slice: '슬라이스',
      externalLink: '외부 링크',
      makerWorld: 'MakerWorld: {{designer}}',
      viewProject: '프로젝트 보기',
      noExternalLink: '외부 링크 없음',
      preview3d: '3D 미리보기',
      download: '다운로드',
      edit: '편집',
      delete: '삭제',
      runsBadge: '{{count}}회 인쇄',
      runsBadgeTitle: '총 {{count}}회 인쇄 — {{successful}}회 성공, {{failed}}회 실패. 전체 인쇄 기록을 보려면 클릭하세요.'
    },
    modal: {
      deleteArchive: '아카이브 삭제',
      deleteConfirm: '"{{name}}"을(를) 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.',
      deleteButton: '삭제',
      removeSource3mf: '소스 3MF 제거',
      removeSource3mfConfirm: '"{{name}}"에서 소스 3MF 파일을 제거하시겠습니까? 원본 슬라이서 프로젝트 파일이 삭제됩니다.',
      removeButton: '제거',
      removeF3d: 'F3D 제거',
      removeF3dConfirm: '"{{name}}"에서 Fusion 360 디자인 파일을 제거하시겠습니까?',
      removeTimelapse: '타임랩스 제거',
      removeTimelapseConfirm: '"{{name}}"에서 타임랩스 영상을 제거하시겠습니까?',
      timelapse: '{{name}} - 타임랩스',
      selectTimelapse: '타임랩스 선택',
      selectTimelapseDesc: '자동 일치 항목 없음. 이 인쇄의 타임랩스를 선택하세요:',
      deleteArchives: '아카이브 삭제',
      deleteArchivesConfirm: '{{count}}개 아카이브를 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.',
      deleteCount: '{{count}}개 삭제',
      deletePurgeStats: '빠른 통계에서도 이 인쇄 항목 제거 (필라멘트, 시간, 비용, 에너지)',
      deleteQueueItemsWarning: '이 아카이브와 연결된 {{count}}개의 대기열 항목도 함께 제거됩니다.',
      deleteBlockedByPrinting: '삭제할 수 없습니다 — {{count}}개의 대기열 항목이 현재 인쇄 중입니다. 인쇄를 먼저 중지한 다음 다시 시도하십시오.'
    },
    page: {
      title: '아카이브',
      printsCount: '{{total}}개 중 {{filtered}}개 인쇄',
      dropFilesHere: '.3mf 파일을 여기에 놓으세요',
      releaseToUpload: '놓아서 업로드',
      only3mfSupported: '.3mf 파일만 지원됩니다',
      close: '닫기',
      selected: '{{count}}개 선택됨',
      selectAll: '전체 선택',
      tags: '태그',
      project: '프로젝트',
      favorite: '즐겨찾기',
      delete: '삭제',
      toggledFavorites: '{{count}}개 아카이브의 즐겨찾기가 변경됨',
      failedUpdateFavorites: '즐겨찾기 업데이트 실패',
      archivesDeleted: '{{count}}개 아카이브가 삭제됨',
      failedDeleteArchives: '아카이브 삭제 실패',
      photoDeleted: '사진이 삭제됨',
      failedDeletePhoto: '사진 삭제 실패'
    },
    list: {
      name: '이름',
      printer: '프린터',
      date: '날짜',
      size: '크기',
      actions: '작업',
      hasTimelapse: '타임랩스 있음'
    },
    log: {
      date: '날짜',
      printName: '인쇄 이름',
      printer: '프린터',
      user: '사용자',
      status: '상태',
      duration: '소요 시간',
      filament: '필라멘트',
      filamentUsed: '사용 필라멘트량',
      cost: '비용',
      energy: '전력량',
      energyCost: '전력 비용',
      completedAt: '완료',
      columns: '열',
      sortBy: '{{column}} 기준 정렬',
      allPrinters: '모든 프린터',
      allUsers: '모든 사용자',
      allStatuses: '모든 상태',
      cancelled: '취소됨',
      skipped: '건너뜀',
      dateFrom: '시작',
      dateTo: '종료',
      noEntries: '인쇄 로그 항목이 없습니다',
      showing: '{{total}}개 중 {{count}}개 표시',
      rowsPerPage: '행',
      page: '페이지',
      prev: '이전',
      next: '다음',
      clearLog: '로그 지우기',
      clearLogTitle: '인쇄 로그 지우기',
      clearLogConfirm: '모든 인쇄 로그 항목이 영구적으로 삭제됩니다. 아카이브와 대기열 항목은 영향받지 않습니다. 이 작업은 취소할 수 없습니다. 계속하시겠습니까?',
      clearLogButton: '모두 지우기',
      cleared: '{{count}}개 로그 항목이 지워졌습니다',
      clearFailed: '인쇄 로그 지우기 실패',
      deleteEntryTitle: '인쇄 로그 항목 삭제',
      deleteEntryConfirm: '이 항목이 로그에서 삭제되며 필라멘트, 시간 및 비용 기여도가 빠른 통계에서 제외됩니다. 해당 아카이브(있는 경우)는 영향을 받지 않습니다. 이 작업은 취소할 수 없습니다.',
      entryDeleted: '인쇄 로그 항목이 삭제되었습니다',
      entryDeleteFailed: '인쇄 로그 항목 삭제 실패',
      editEntryTitle: '인쇄 로그 항목 편집',
      editEntryDescription: '이 인쇄를 분류합니다. 실패 분석 위젯이 이 값으로 그룹화하므로 업데이트가 통계에 즉시 반영됩니다.',
      entryUpdated: '인쇄 로그 항목이 업데이트되었습니다',
      entryUpdateFailed: '인쇄 로그 항목 업데이트 실패',
      statuses: {
        completed: '완료됨',
        failed: '실패',
        stopped: '중지됨',
        cancelled: '취소됨',
        skipped: '건너뜀'
      }
    },
    runLog: {
      title: '인쇄 기록',
      modalTitle: '인쇄 기록 — {{name}}',
      modalTitleFallback: '이 아카이브',
      empty: '이 아카이브에 대해 기록된 인쇄 이벤트가 없습니다.',
      col: {
        date: '날짜',
        status: '상태',
        duration: '소요 시간',
        filament: '필라멘트',
        cost: '비용'
      },
      status: {
        completed: '완료',
        failed: '실패',
        cancelled: '취소됨',
        stopped: '중지됨',
        skipped: '건너뜀',
        printing: '인쇄 중'
      }
    }
  },
  dispatchToast: {
    untitled: '인쇄 작업',
    startingPrints: '인쇄 시작 중',
    progressSummary: '{{complete}}/{{total}} 완료 • 처리 중: {{processing}}',
    expandDetails: '디스패치 세부 정보 펼치기',
    collapseDetails: '디스패치 세부 정보 접기',
    awaitingPrinter: '프린터 응답 대기 중…',
    status: {
      processing: '처리 중',
      completed: '완료',
      failed: '실패',
    },
    failed: {
      generic: '디스패치 실패',
      upload_failed: '프린터로 업로드 실패',
      start_command_failed: '프린터가 시작 명령을 거부했습니다',
    },
    dismiss: '닫기',
  },
  // Pipeline Runs dashboard (#1425 PR C).
  pipelineRuns: {
    title: '파이프라인 실행',
    loading: '불러오는 중…',
    empty: '아직 파이프라인 실행이 없습니다.',
    filter: {
      pipeline: '파이프라인',
      status: '상태',
      target: '대상',
      all: '전체',
      allPipelines: '모든 파이프라인',
      allStatus: '모든 상태',
      allTargets: '모든 대상',
      clear: '필터 지우기',
      noMatches: '현재 필터와 일치하는 실행이 없습니다.',
    },
    totalCount_one: '{{n}}회 실행',
    totalCount_other: '{{n}}회 실행',
    copies: '사본 {{n}}',
    failedCount: '실패 {{n}}',
    copyN: '사본 {{n}}',
    retryFailed: '실패 재시도',
    retryOf: '#{{n}}의 재시도',
    pagination: '{{total}} 중 {{start}}–{{end}}',
    toast: {
      cancelled: '실행 취소됨',
      cancelFailed: '취소 실패',
      retryStarted: '재시도 시작됨',
      retryFailed: '재시도 실패',
      cleared: '{{n}}회 실행 삭제됨',
      clearFailed: '삭제 실패',
    },
    clearLog: '로그 지우기',
    clearConfirmTitle: '로그를 지울까요?',
    clearConfirmBody: '완료, 실패, 취소, 부분 실패한 모든 파이프라인 실행을 삭제합니까? 진행 중인 실행은 유지됩니다. 되돌릴 수 없습니다.',
    clearConfirmAction: '지우기',
    jobStatus: {
      pending: '대기 중',
      awaiting_printer: '프린터 대기 중',
      queued: '대기 중',
      printing: '인쇄 중',
      completed: '완료됨',
      failed: '실패',
      cancelled: '취소됨',
    },
    cancelledByUser: '사용자에 의해 취소됨',
  },

  queue: {
    title: '인쇄 대기열',
    subtitle: '인쇄 작업을 예약하고 관리하세요',
    editQueueItem: '대기열 항목 편집',
    selectAllPlates: '{{count}}개 플레이트 전체 선택',
    deselectAll: '전체 해제',
    printQueued: '인쇄가 대기열에 추가됨',
    printQueuedWillStartWhenIdle: '프린터가 유휴 상태가 되면 시작됩니다',
    itemsQueued: '{{count}}개 항목이 대기열에 추가됨',
    sending: '전송 중...',
    sendingProgress: '{{current}}/{{total}} 전송 중...',
    adding: '추가 중...',
    addingProgress: '{{current}}/{{total}} 추가 중...',
    savingProgress: '{{current}}/{{total}} 저장 중...',
    clearQueue: '대기열 지우기',
    clearHistory: '기록 지우기',
    emptyQueue: '대기열이 비어 있습니다',
    position: '위치',
    scheduledTime: '예약 시간',
    moveUp: '위로 이동',
    moveDown: '아래로 이동',
    startNow: '지금 시작',
    printingInProgress: '인쇄 중...',
    viewArchive: '아카이브 보기',
    viewInFileManager: '파일 관리자에서 보기',
    itemCount: '{{count}}개 항목',
    itemCount_plural: '{{count}}개 항목',
    dragToReorder: '드래그하여 순서 변경 (즉시만)',
    reorderHint: '위치는 즉시 항목에만 영향을 줍니다. 예약된 항목은 설정된 시간에 실행됩니다.',
    sjf: {
      label: 'SJF',
      tooltip: '최단 작업 우선 — 스케줄러가 짧은 인쇄를 우선합니다'
    },
    addedBy: '{{name}}님이 추가함',
    nextInQueue: '다음 대기',
    clearPlateSuccess: '플레이트 비워짐 — 다음 인쇄 준비 완료',
    plateNumber: '플레이트 {{index}}',
    quantity: '수량',
    quantityHint: '{{count}}개 대기열 항목 생성',
    plateQuantityLabel: '{{plate}} 실행 횟수',
    plateQuantityTotal_one: '총 {{count}}회',
    plateQuantityTotal_other: '총 {{count}}회',
    batchOrders: {
      title: '배치 주문',
      emptyTitle: '배치 주문 없음',
      emptyDescription: '여러 플레이트 파일이나 한 플레이트의 여러 복사본을 대기열에 넣으면 주문이 진행 상황과 함께 여기에 표시됩니다.',
      filter: {
        active: '진행 중',
        completed: '완료',
        cancelled: '취소됨',
        all: '전체',
      },
      status: {
        active: '진행 중',
        completed: '완료',
        cancelled: '취소됨',
      },
      noTargets: '그룹만',
      noTargetsHint: '플레이트별 목표 수량이 도입되기 전에 생성되어 목표가 아닌 대기열에 넣은 실행을 추적합니다.',
      dispatchRemaining: '남은 {{count}}개 대기열 추가',
      dispatchPlate: '남은 항목 추가',
      dispatched: '{{name}}의 남은 실행을 대기열에 추가했습니다',
      plateProgress: '{{target}}개 중 {{completed}}개 완료',
      remaining: '{{count}}개 남음',
      failed: '{{count}}개 실패',
      printing: '{{count}}개 인쇄 중',
      wholeFile: '파일 전체',
      due: '기한 {{date}}',
      costSoFar: '현재까지 {{amount}}',
      costRemaining: '({{amount}} 남음)',
    },
    activeBatches: '활성 배치',
    batchProgress: '{{total}}개 중 {{completed}}개 완료',
    cancelBatch: '나머지 취소',
    batchCancelled: '남은 배치 항목이 취소되었습니다',
    cancelBatchConfirmTitle: '배치 취소',
    cancelBatchConfirmMessage: '이 배치의 남은 대기 항목을 모두 취소하시겠습니까?',
    batch: {
      defaultName: '배치',
      label: '{{count}}개 항목',
      label_plural: '{{count}}개 항목',
      pendingCount: '{{count}}개 대기 중',
      pendingCount_plural: '{{count}}개 대기 중',
      expand: '배치 펼치기',
      collapse: '배치 접기',
      groupAsBatch: '배치로 묶기…',
      groupAsBatchDescription: '선택한 {{count}}개 항목을 접을 수 있는 하나의 배치로 묶습니다.',
      nameLabel: '배치 이름',
      namePlaceholder: '예: 금요일 선물',
      create: '배치 만들기',
      ungroup: '그룹 해제',
      ungroupConfirmTitle: '배치 그룹을 해제하시겠습니까?',
      ungroupConfirmMessage: '항목은 큐에 남아 있지만 더 이상 함께 그룹화되지 않습니다.',
      dragGroup: '그룹 드래그',
    },
    tabs: {
      batches: '배치',
      queue: '큐',
      history: '기록',
      timeline: '타임라인',
      pipelines: '파이프라인',
    },
    layout: {
      flatList: '목록',
      byPrinter: '프린터별',
      groupByPrinter: '프린터별로 묶기',
    },
    history: {
      emptyTitle: '아직 기록이 없습니다',
      emptyDescription: '완료·취소·실패한 인쇄가 여기에 표시됩니다.',
      showMore: '더 보기',
      showingCount: '{{total}}개 중 {{shown}}개 표시',
    },
    dragGhost: {
      multiCount: '{{count}}개 항목',
      batch: '{{name}} ({{count}}부)',
      batch_plural: '{{name}} ({{count}}부)',
    },
    sections: {
      currentlyPrinting: '현재 인쇄 중',
      queued: '대기 중',
      history: '기록'
    },
    status: {
      pending: '대기 중',
      waiting: '기다리는 중',
      printing: '인쇄 중',
      paused: '일시정지',
      completed: '완료',
      failed: '실패',
      skipped: '건너뜀',
      cancelled: '취소됨'
    },
    summary: {
      printing: '인쇄 중',
      queued: '대기 중',
      totalTime: '총 대기열 시간',
      totalWeight: '총 대기열 무게',
      history: '기록'
    },
    filter: {
      allPrinters: '모든 프린터',
      unassigned: '미할당',
      allStatus: '모든 상태',
      allLocations: '모든 위치',
      any: '전체'
    },
    sort: {
      byPosition: '위치별 정렬',
      byName: '이름별 정렬',
      byPrinter: '프린터별 정렬',
      bySchedule: '예약별 정렬',
      byDate: '날짜별 정렬',
      ascendingOldest: '오름차순 (오래된 것 먼저)',
      descendingNewest: '내림차순 (최신 것 먼저)'
    },
    badges: {
      staged: '준비됨',
      requiresPrevious: '이전 성공 필요',
      autoPowerOff: '자동 전원 끄기',
      gcodeInjection: 'G코드'
    },
    empty: {
      title: '예약된 인쇄 없음',
      description: '아카이브 페이지의 컨텍스트 메뉴에서 "예약" 옵션을 사용하거나 파일을 드래그 앤 드롭하여 시작하세요.'
    },
    time: {
      etaIfStartedNow: '이 작업을 지금 시작할 경우의 완료 예정 시각',
      asap: '즉시',
      overdue: '기한 초과',
      now: '지금',
      lessThanMinute: '1분 이내',
      inMinutes: '{{count}}분 후',
      inHours: '{{count}}시간 후'
    },
    actions: {
      startPrint: '인쇄 시작',
      stopPrint: '인쇄 정지',
      requeue: '재대기'
    },
    bulkEdit: {
      title: '{{count}}개 항목 편집',
      title_plural: '{{count}}개 항목 편집',
      description: '변경된 설정만 선택된 항목에 적용됩니다.',
      printer: '프린터',
      noChange: '— 변경 없음 —',
      queueOptions: '대기열 옵션',
      staged: '준비됨 (수동 시작)',
      autoPowerOff: '인쇄 후 자동 전원 끄기',
      requirePrevious: '이전 성공 필요',
      printOptions: '인쇄 옵션',
      bedLevelling: '베드 레벨링',
      flowCalibration: '유량 캘리브레이션',
      vibrationCalibration: '진동 캘리브레이션',
      layerInspection: '첫 번째 층 검사',
      timelapse: '타임랩스',
      useAms: 'AMS 사용',
      nozzleOffsetCali: '노즐 오프셋 보정',
      applyChanges: '변경사항 적용',
      selectAll: '전체 선택',
      deselectAll: '전체 해제',
      selected: '{{count}}개 선택됨',
      editSelected: '선택 항목 편집',
      cancelSelected: '선택 항목 취소'
    },
    confirm: {
      cancelTitle: '예약된 인쇄 취소',
      cancelMessage: '"{{name}}"을(를) 취소하시겠습니까?',
      stopTitle: '인쇄 정지',
      stopMessage: '"{{name}}"의 현재 인쇄를 정지하시겠습니까? 프린터의 인쇄 작업이 취소됩니다.',
      removeTitle: '기록에서 제거',
      removeMessage: '대기열 기록에서 "{{name}}"을(를) 제거하시겠습니까?',
      clearHistoryTitle: '기록 지우기',
      clearHistoryMessage: '기록에서 {{count}}개 항목을 모두 제거하시겠습니까?',
      cancelButton: '인쇄 취소',
      stopButton: '인쇄 정지',
      thisPrint: '이 인쇄',
      thisItem: '이 항목'
    },
    toast: {
      cancelled: '대기열 항목이 취소되었습니다',
      cancelFailed: '항목 취소 실패',
      removed: '대기열 항목이 제거되었습니다',
      removeFailed: '항목 제거 실패',
      stopped: '인쇄가 정지되었습니다',
      stopFailed: '인쇄 정지 실패',
      released: '인쇄가 대기열에 릴리스되었습니다',
      startFailed: '인쇄 시작 실패',
      reorderFailed: '대기열 순서 변경 실패',
      historyCleared: '{{count}}개 기록 항목이 지워졌습니다',
      clearHistoryFailed: '기록 지우기 실패',
      updateFailed: '항목 업데이트 실패',
      bulkCancelled: '{{count}}개 항목이 취소되었습니다',
      bulkCancelFailed: '항목 취소 실패',
      batchCreated: '"{{name}}" 배치를 만들었습니다',
      batchCreateFailed: '배치 만들기에 실패했습니다',
      batchUngrouped: '{{count}}개 항목의 그룹을 해제했습니다',
      batchUngroupFailed: '배치 그룹 해제에 실패했습니다',
      resumedAfterFailure: '큐를 재개했습니다 — {{restored}}개 작업을 대기 상태로 복원했습니다',
      resumeAfterFailureFailed: '큐 재개에 실패했습니다',
    },
    resumeAfterFailure: {
      banner: '{{printer}}이(가) 이전 인쇄 실패로 인해 차단되었습니다 — {{count}}개 작업이 건너뛰어졌습니다',
      bannerHint: '프린터 문제를 해결한 후 재개하여 건너뛴 작업을 복원하고 차단을 해제하세요.',
      button: '실패 후 재개',
      confirmTitle: '실패 후 큐를 재개하시겠습니까?',
      confirmMessage: '{{printer}}에서 건너뛴 {{count}}개 작업을 대기 상태로 복원하고 이전 인쇄 차단을 해제합니다. 계속하기 전에 프린터가 준비되었는지 확인하세요.',
    },
    timeline: {
      listView: '목록',
      timelineView: '타임라인',
      unassigned: '미할당',
      noData: '이 날에 예약된 인쇄 없음',
      nothingCommitted: '이 시간 창에 확정된 일정이 없습니다. 대기 중인 항목, 보류된 항목, 유휴 프린터의 ASAP 작업은 표시되지 않습니다 — 예약 시간을 설정하거나 대기 항목을 릴리스하면 여기에 표시됩니다.',
      allDoneBy: '모든 인쇄 예상 완료 시간: {{time}}',
      staged: '준비됨',
      filterAll: '모두 표시',
      filterPrinting: '인쇄 중',
      filterQueued: '대기 중',
      time: {
        anyMoment: '잠시 후',
        minutesLeft: '{{minutes}}분 남음',
        hoursLeft: '{{hours}}시간 남음',
        hoursMinutesLeft: '{{hours}}시간 {{minutes}}분 남음'
      },
      day: {
        previous: '이전 날',
        next: '다음 날',
        today: '오늘'
      },
      window: {
        back12h: '12시간 이전',
        forward12h: '12시간 이후',
        now: '지금',
      },
      printerColumnHeader: '프린터',
    },
    permissions: {
      noStopPrint: '인쇄를 정지할 권한이 없습니다',
      noStartPrint: '인쇄를 시작할 권한이 없습니다',
      noEdit: '이 대기열 항목을 편집할 권한이 없습니다',
      noCancel: '이 대기열 항목을 취소할 권한이 없습니다',
      noRequeue: '항목을 재대기할 권한이 없습니다',
      noRemove: '이 대기열 항목을 제거할 권한이 없습니다',
      noClearHistory: '모든 기록을 지울 권한이 없습니다',
      noEditItems: '대기열 항목을 편집할 권한이 없습니다',
      noCancelItems: '대기열 항목을 취소할 권한이 없습니다'
    },
    filamentShort: {
      rowBadge: '할당된 스풀의 필라멘트가 부족합니다',
      rowTooltip: '디스패치 스케줄러가 이 항목을 표시했습니다. 재생 버튼을 클릭하여 슬롯별 부족량을 확인하고 인쇄 여부를 결정하세요.',
      confirmTitle: '필라멘트 부족',
      confirmIntro: '할당된 스풀이 하나 이상의 슬롯을 채울 수 없습니다. 그래도 인쇄하시겠습니까?',
      lineItem: '슬롯 {{slot}}: {{required}}g 필요, {{remaining}}g 남음',
      unknown: '알 수 없음',
      printAnyway: '그냥 인쇄'
    },
    slicerAmsMapping: {
      rowBadge: '이 프린터용으로 저장된 AMS 슬롯',
      rowTooltip: '이 아카이브에는 슬라이서가 선택한 정확한 AMS 슬롯이 이 항목의 대상 프린터용으로 저장되어 있습니다. 해당 프린터에서 재인쇄하면 유형과 색상으로 다시 맞추는 대신 그 트레이를 재사용할 수 있습니다.',
    },
  },
  stats: {
    title: '대시보드',
    subtitle: '위젯을 드래그하여 정렬하세요. 눈 아이콘을 클릭하여 숨기세요.',
    overview: '개요',
    totalPrints: '총 인쇄 수',
    successRate: '성공률',
    totalPrintTime: '총 인쇄 시간',
    printTime: '인쇄 시간',
    totalFilament: '총 사용 필라멘트',
    filamentUsed: '사용된 필라멘트',
    filamentCost: '필라멘트 비용',
    totalCost: '총 비용',
    energyUsed: '사용된 에너지',
    energyCost: '에너지 비용',
    energyWarmingUpTooltip: '에너지 추적이 시간별 스냅샷을 수집 중입니다. 날짜 범위 합계는 선택한 범위 이전에 하나 이상의 스냅샷이 존재하면 정확해집니다. 초기 값이 적게 집계될 수 있습니다.',
    averagePrintTime: '평균 인쇄 시간',
    printsPerDay: '일일 인쇄 수',
    byPrinter: '프린터별',
    printsByPrinter: '프린터별 인쇄',
    byMaterial: '재료별',
    byMonth: '월별',
    last7Days: '최근 7일',
    last30Days: '최근 30일',
    last90Days: '최근 90일',
    allTime: '전체 기간',
    quickStats: '빠른 통계',
    printActivity: '인쇄 활동',
    filamentTypes: '필라멘트 종류',
    filamentTrends: '필라멘트 추세',
    failureAnalysis: '실패 분석',
    timeAccuracy: '시간 정확도',
    successful: '성공:',
    failed: '실패:',
    cancelled: '취소됨:',
    perfectEstimate: '100% = 완벽한 예상',
    noTimeAccuracyData: '아직 시간 정확도 데이터 없음',
    noFilamentData: '필라멘트 데이터 없음',
    noPrinterData: '프린터 데이터 없음',
    noPrintData: '인쇄 데이터 없음',
    noPrintDataLast30Days: '최근 30일 인쇄 데이터 없음',
    failureReasons: '실패 원인',
    topFailureReasons: '주요 실패 원인',
    failedPrintsCount: '{{total}}개 인쇄 중 {{failed}}개 실패',
    lastWeekRate: '지난 주: {{rate}}%',
    resetLayout: '레이아웃 초기화',
    recalculateCosts: '비용 재계산',
    recalculateCostsHint: '현재 필라멘트 가격으로 모든 아카이브 비용 재계산',
    exportStats: '통계 내보내기',
    exportAsCsv: 'CSV로 내보내기',
    exportAsExcel: 'Excel로 내보내기',
    hiddenCount: '{{count}}개 숨겨짐',
    exportDownloaded: '내보내기 다운로드됨',
    exportFailed: '내보내기 실패',
    layoutReset: '레이아웃이 초기화되었습니다',
    recalculatedCosts: '{{count}}개 아카이브의 비용이 재계산되었습니다',
    recalculateFailed: '비용 재계산 실패',
    loadingStats: '통계 로딩 중...',
    noPermissionResetLayout: '레이아웃을 초기화할 권한이 없습니다',
    noPermissionRecalculate: '비용을 재계산할 권한이 없습니다',
    noPrintDataInRange: '선택한 범위에 인쇄 데이터 없음',
    periodFilament: '기간 필라멘트',
    periodCost: '기간 비용',
    avgPerPrint: '인쇄당 평균',
    usageOverTime: '시간별 사용량',
    energyOverTime: '시간별 에너지 사용량',
    filamentByWeight: '무게',
    printDuration: '인쇄 시간',
    printerUtilization: '프린터 사용률',
    filamentSuccess: '재료별 성공률',
    printHabits: '인쇄 습관',
    printTimeOfDay: '시간대별 인쇄',
    colorDistribution: '색상 분포',
    noColorData: '색상 데이터 없음',
    records: '기록',
    longestPrint: '최장 인쇄',
    heaviestPrint: '가장 무거운 인쇄',
    mostExpensivePrint: '가장 비싼 인쇄',
    busiestDay: '가장 바쁜 날',
    successStreak: '연속 성공',
    streakPrint: '연속 인쇄',
    streakPrints: '{{count}}번 연속 인쇄',
    printerStats: '프린터 통계',
    hours: '시간',
    avgPrints: '평균 인쇄',
    noArchiveData: '인쇄 데이터 없음',
    filamentByTime: '시간',
    avgWeight: '평균 무게',
    avgTime: '평균 시간',
    filamentByPrints: '인쇄',
    timeframe: {
      today: '오늘',
      "this-week": '이번 주',
      "this-month": '이번 달',
      "last-7": '최근 7일',
      "last-30": '최근 30일',
      "last-90": '최근 90일',
      "this-year": '올해',
      "all-time": '전체 기간',
      custom: '사용자 지정 범위',
      from: '시작',
      to: '종료'
    },
    allUsers: '모든 사용자',
    noUser: '사용자 없음 (시스템)',
    filterByUser: '사용자별 필터'
  },
  maintenance: {
    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: '현재 시간',
    statusTab: '상태',
    settingsTab: '설정',
    overdueCount: '{{count}}개 초과',
    dueSoonCount: '{{count}}개 곧 예정',
    dueSoon: '곧 예정',
    allGood: '모두 정상',
    overdueBy: '{{duration}} 초과',
    dueIn: '{{duration}} 후 예정',
    timeLeft: '{{duration}} 남음',
    day: '1일',
    days: '{{count}}일',
    week: '1주',
    weeks: '{{count}}주',
    month: '1개월',
    months: '{{count}}개월',
    year: '1년',
    maintenanceTypes: '유지보수 유형',
    maintenanceTypesDescription: '시스템 유형 및 사용자 지정 유지보수 작업',
    addCustomType: '사용자 지정 유형 추가',
    restoreDefaults: '기본 작업 복원',
    intervalType: '간격 유형',
    intervalValue: '간격 ({{type}})',
    icon: '아이콘',
    documentationLink: '문서 링크 (선택사항)',
    assignToPrinters: '프린터에 할당',
    selectAtLeastOnePrinter: '최소 한 개의 프린터를 선택하세요',
    addType: '유형 추가',
    custom: '사용자 지정',
    printHours: '인쇄 시간',
    calendarDays: '달력 일수',
    exampleName: '예: HEPA 필터 교체',
    viewDocumentation: '문서 보기',
    timeBasedInterval: '시간 기반 간격',
    intervalOverrides: '간격 재정의',
    intervalOverridesDescription: '특정 프린터의 간격 사용자 지정',
    assignedToPrinters: '할당된 프린터:',
    noPrintersAssigned: '할당된 프린터 없음',
    addPrinterShort: '추가:',
    printersAssignedClick: '{{count}}개 프린터 할당됨 - 클릭하여 관리',
    removeFromPrinter: '이 프린터에서 제거',
    types: {
      lubricateCarbonRods: '카본 로드 윤활',
      lubricateRails: '리니어 레일 윤활',
      cleanNozzle: '노즐/핫엔드 청소',
      checkBelts: '벨트 장력 확인',
      cleanBuildPlate: '빌드 플레이트 청소',
      checkExtruder: '압출기 기어 확인',
      checkCooling: '냉각 팬 확인',
      generalInspection: '일반 점검',
      cleanCarbonRods: '카본 로드 청소',
      lubricateSteelRods: '스틸 로드 윤활',
      cleanSteelRods: '스틸 로드 청소',
      cleanLinearRails: '리니어 레일 청소',
      checkPtfeTube: 'PTFE 튜브 확인',
      replaceHepaFilter: 'HEPA 필터 교체',
      replaceCarbonFilter: '활성탄 필터 교체',
      lubricateLeftNozzleRail: '좌측 노즐 레일 윤활'
    },
    maintenanceComplete: '유지보수가 완료로 표시되었습니다',
    typeUpdated: '유지보수 유형이 업데이트되었습니다',
    typeDeleted: '유지보수 유형이 삭제되었습니다',
    defaultsRestored: '{{count}}개 기본 작업이 복원되었습니다',
    printHoursUpdated: '인쇄 시간이 업데이트되었습니다',
    printerAssigned: '프린터가 할당되었습니다',
    printerRemoved: '프린터가 제거되었습니다',
    deleteTypeConfirm: '"{{name}}"을(를) 삭제하시겠습니까?',
    deleteSystemTypeTitle: '기본 유지보수 작업을 삭제하시겠습니까?',
    deleteSystemTypeMessage: '기본 유지보수 작업 "{{name}}"을(를) 삭제하시겠습니까?',
    noPermissionUpdate: '유지보수 항목을 업데이트할 권한이 없습니다',
    noPermissionPerform: '유지보수를 수행할 권한이 없습니다',
    noPermissionEditTypes: '유지보수 유형을 편집할 권한이 없습니다',
    noPermissionDeleteTypes: '유지보수 유형을 삭제할 권한이 없습니다',
    noPermissionEditHours: '인쇄 시간을 편집할 권한이 없습니다',
    noPermissionRemovePrinter: '프린터 할당을 제거할 권한이 없습니다',
    noPermissionAssignPrinter: '프린터를 할당할 권한이 없습니다',
    noPermissionEditIntervals: '간격을 편집할 권한이 없습니다',
    configureSettings: '유지보수 유형 및 간격 설정'
  },
  settings: {
    sliceEngine: '슬라이스 엔진',
    sliceEngineSidecar: '서버 사이드카',
    sliceEngineSidecarHint: '슬라이싱이 서버의 슬라이서 사이드카 컨테이너에서 실행됩니다.',
    sliceEngineBrowser: '브라우저에서',
    sliceEngineBrowserHint: '슬라이싱이 서버 없이 이 기기에서 실행됩니다.',
    title: '설정',
    general: '일반',
    tabs: {
      general: '일반',
      smartPlugs: '스마트 플러그',
      notifications: '알림',
      queue: '워크플로우',
      queueDispatch: '큐 및 디스패치',
      queuePipelines: '파이프라인',
      filament: '필라멘트',
      network: '네트워크',
      apiKeys: 'API 키',
      virtualPrinter: '가상 프린터',
      spoolbuddy: 'SpoolBuddy',
      failureDetection: '실패 감지',
      users: '인증',
      backup: '백업',
      emailAuth: '이메일 인증',
      ldap: 'LDAP',
      twoFa: '이중 인증',
      oidc: 'SSO / OIDC',
      security: '보안'
    },
    spoolbuddy: {
      infoTitle: 'SpoolBuddy 기기',
      infoBody: 'SpoolBuddy 키오스크는 하트비트를 통해 자동으로 등록됩니다. 더 이상 사용하지 않거나 데몬 충돌로 인한 중복이 있는 경우 여기서 기기를 등록 해제하세요.',
      duplicatesTitle: '{{count}}개 기기 등록됨',
      duplicatesBody: '첫 번째로 등록된 기기만 키오스크 UI에서 사용됩니다. 충돌로 인한 오래된 중복이 있으면 등록 해제하세요 — 온라인 기기는 다음 하트비트에서 자동으로 재등록됩니다.',
      empty: '아직 등록된 SpoolBuddy 기기가 없습니다.',
      online: '온라인',
      offline: '오프라인',
      unregister: '등록 해제',
      unregisterSuccess: '기기 등록 해제됨',
      unregisterError: '기기 등록 해제 실패',
      confirmTitle: 'SpoolBuddy 기기를 등록 해제하시겠습니까?',
      confirmBody: '데이터베이스에서 "{{hostname}}" ({{deviceId}})를 제거합니다. 기기가 온라인이면 다음 하트비트에서 자동으로 재등록됩니다.',
      ipAddress: 'IP 주소',
      firmware: '펌웨어',
      lastSeen: '마지막 확인',
      daemonUptime: '데몬 가동 시간',
      systemUptime: '시스템 가동 시간',
      never: '없음',
      nfc: 'NFC',
      scale: '저울',
      cpuTemp: 'CPU 온도',
      memory: '메모리',
      disk: '디스크',
      update: '업데이트',
      updateConfirmTitle: 'Spoolbuddy 데몬을 업데이트하시겠습니까?',
      updateConfirmBody: '"{{hostname}}"에서 소프트웨어 업데이트를 실행하시겠습니까? 업데이트가 적용되면 데몬이 재시작됩니다.',
      restartBrowser: '브라우저 재시작',
      restartBrowserConfirmTitle: '키오스크 브라우저를 재시작하시겠습니까?',
      restartBrowserConfirmBody: '"{{hostname}}"의 키오스크 브라우저를 재시작하시겠습니까? 화면이 잠시 꺼집니다.',
      restartDaemon: '데몬 재시작',
      restartDaemonConfirmTitle: 'Spoolbuddy 데몬을 재시작하시겠습니까?',
      restartDaemonConfirmBody: '"{{hostname}}"의 Spoolbuddy 데몬을 재시작하시겠습니까? 기기가 몇 초 동안 오프라인 상태가 됩니다.',
      reboot: '재부팅',
      rebootConfirmTitle: '기기를 재부팅하시겠습니까?',
      rebootConfirmBody: '"{{hostname}}"을(를) 재부팅하시겠습니까? 기기가 약 1분 동안 오프라인 상태가 됩니다.',
      shutdown: '종료',
      shutdownConfirmTitle: '기기를 종료하시겠습니까?',
      shutdownConfirmBody: '"{{hostname}}"을(를) 종료하시겠습니까? 다시 켜려면 물리적 접근이 필요합니다.',
      commandConfirm: '확인',
      commandQueued: '명령이 대기열에 추가됨',
      commandError: '명령 전송 실패',
      cpuLoad: 'CPU 부하'
    },
    ldap: {
      title: 'LDAP 인증',
      enabledDesc: 'LDAP 인증이 활성화되어 있습니다',
      disabledDesc: 'LDAP 인증이 비활성화되어 있습니다',
      disabledHint: '아래에서 LDAP 설정을 구성하고 저장한 후 활성화하세요.',
      enabled: 'LDAP 인증 활성화됨',
      disabled: 'LDAP 인증 비활성화됨',
      feature1: '사용자가 LDAP 자격 증명으로 로그인 가능',
      feature2: '로컬 관리자 계정이 대체 수단으로 유지됨',
      feature3: 'LDAP 그룹이 로그인 시 Bambuddy 그룹에 매핑됨',
      serverConfig: 'LDAP 서버 설정',
      serverUrl: '서버 URL',
      serverUrlHint: 'SSL에는 ldaps://, StartTLS에는 ldap:// 사용',
      security: '보안',
      securityHint: 'StartTLS는 일반 연결을 TLS로 업그레이드합니다. LDAPS는 처음부터 TLS를 사용합니다.',
      bindDn: '바인드 DN (서비스 계정)',
      bindPassword: '바인드 비밀번호',
      searchBase: '검색 기반 DN',
      userFilter: '사용자 검색 필터',
      userFilterHint: '{username}은 로그인 사용자명으로 대체됩니다. OpenLDAP의 경우 (uid={username})을 사용하세요.',
      autoProvision: '사용자 자동 프로비저닝',
      autoProvisionHint: '첫 LDAP 로그인 시 자동으로 Bambuddy 계정 생성',
      defaultGroup: '기본 그룹',
      defaultGroupNone: '— 없음 (대체 없음) —',
      defaultGroupHint: 'LDAP 사용자가 인증되었지만 매핑된 LDAP 그룹에 없을 때 할당되는 대체 그룹. 비워두면 매핑되지 않은 사용자에게 권한이 없습니다.',
      groupMapping: '그룹 매핑 (JSON)',
      groupMappingHint: 'LDAP 그룹 DN을 Bambuddy 그룹에 매핑합니다. 사용 가능한 그룹: ',
      testConnection: '연결 테스트',
      settingsSaved: 'LDAP 설정이 저장되었습니다',
      errors: {
        serverRequired: 'LDAP 서버 URL이 필요합니다',
        searchBaseRequired: '검색 기반 DN이 필요합니다',
        enableAuthFirst: '먼저 인증을 활성화하세요',
        configureLdapFirst: '먼저 LDAP 설정을 저장하세요'
      },
      advanced: '고급'
    },
    email: {
      smtpSettings: 'SMTP 설정',
      smtpHost: 'SMTP 서버',
      smtpPort: 'SMTP 포트',
      security: '보안',
      authentication: '인증',
      username: '사용자명',
      password: '비밀번호',
      fromEmail: '발신 이메일',
      fromName: '발신자 이름',
      testConnection: 'SMTP 연결 테스트',
      testRecipient: '테스트 수신자 이메일',
      sendTest: '테스트 이메일 전송',
      sending: '전송 중...',
      save: '설정 저장',
      saving: '저장 중...',
      advancedAuth: '고급 인증',
      advancedAuthEnabled: '고급 인증이 활성화되어 있습니다',
      advancedAuthEnabledDesc: '이메일 기반 사용자 관리 기능이 활성화되어 있습니다. 신규 사용자는 이메일로 자동 생성된 비밀번호를 받으며, 사용자는 비밀번호 찾기 기능으로 비밀번호를 재설정할 수 있습니다.',
      advancedAuthDisabled: '고급 인증이 비활성화되어 있습니다',
      advancedAuthDisabledDesc: '이메일 기반 사용자 관리 기능을 활성화하려면 고급 인증을 활성화하세요.',
      enable: '활성화',
      disable: '비활성화',
      feature1: '비밀번호가 자동 생성되어 신규 사용자에게 이메일로 전송됨',
      feature2: '사용자가 사용자명 또는 이메일로 로그인 가능',
      feature3: '비밀번호 찾기 기능 사용 가능',
      feature4: '관리자가 이메일로 사용자 비밀번호 재설정 가능',
      errors: {
        requiredFields: '모든 필수 항목을 입력하세요',
        usernameRequired: '인증이 활성화된 경우 사용자명이 필요합니다',
        enterTestEmail: '테스트 이메일 주소를 입력하세요',
        smtpServerAndEmail: '테스트 전에 SMTP 서버와 발신 이메일을 입력하세요',
        usernamePasswordRequired: '인증이 활성화된 경우 사용자명과 비밀번호가 필요합니다',
        configureSmtpFirst: '먼저 SMTP 설정을 구성하고 테스트하세요',
        enableAuthFirst: '이메일 기반 기능을 사용하려면 먼저 인증을 활성화하세요.'
      },
      success: {
        settingsSaved: 'SMTP 설정이 성공적으로 저장되었습니다'
      },
      securityOptions: {
        starttls: 'STARTTLS (포트 587)',
        ssl: 'SSL/TLS (포트 465)',
        none: '없음 (포트 25)'
      },
      authOptions: {
        enabled: '활성화됨',
        disabled: '비활성화됨'
      }
    },
    appearance: '모양',
    notifications: '알림',
    smartPlugs: '스마트 플러그',
    spoolman: 'Spoolman',
    updates: '업데이트',
    language: '언어',
    languageDescription: '선호하는 언어를 선택하세요',
    theme: '테마',
    themeLight: '라이트',
    themeDark: '다크',
    themeSystem: '시스템',
    defaultView: '기본 보기',
    defaultViewDescription: '앱을 열 때 표시할 페이지',
    checkForUpdates: '업데이트 확인',
    autoUpdate: '자동 업데이트',
    currentVersion: '현재 버전',
    latestVersion: '최신 버전',
    upToDate: '최신 상태입니다',
    updateAvailable: '업데이트 가능',
    notificationLanguage: '알림 언어',
    notificationLanguageDescription: '푸시 알림 언어',
    bedCooledThreshold: '베드 냉각 임계값',
    bedCooledThresholdDescription: '인쇄 후 베드가 냉각된 것으로 간주되는 온도',
    userNotificationsEnabled: '사용자 알림',
    userNotificationsEnabledDescription: '사용자 알림 메뉴 및 인쇄 작업 이벤트에 대한 이메일 알림을 활성화합니다. 고급 인증이 필요합니다.',
    userNotificationsDisabledHint: '사용자 알림을 사용하려면 고급 인증을 활성화하세요.',
    notificationProviders: '알림 제공자',
    addProvider: '제공자 추가',
    editProvider: '제공자 편집',
    providerType: '제공자 유형',
    testNotification: '알림 테스트',
    testSuccess: '테스트 알림이 성공적으로 전송되었습니다',
    testFailed: '테스트 알림 전송 실패',
    quietHours: '방해 금지 시간',
    quietHoursDescription: '이 시간 동안 방해하지 않음',
    quietHoursStart: '시작',
    quietHoursEnd: '종료',
    events: {
      title: '알림 이벤트',
      printStart: '인쇄 시작됨',
      printComplete: '인쇄 완료됨',
      printFailed: '인쇄 실패',
      printStopped: '인쇄 정지됨',
      printProgress: '진행 마일스톤',
      printProgressDescription: '25%, 50%, 75%에 알림',
      printerOffline: '프린터 오프라인',
      printerError: '프린터 오류',
      filamentLow: '필라멘트 부족',
      maintenanceDue: '유지보수 예정',
      maintenanceDueDescription: '유지보수가 필요할 때 알림'
    },
    smartPlug: {
      title: '스마트 플러그',
      add: '스마트 플러그 추가',
      edit: '스마트 플러그 편집',
      name: '이름',
      ipAddress: 'IP 주소',
      linkedPrinter: '연결된 프린터',
      autoOn: '자동 켜기',
      autoOnDescription: '인쇄 시작 시 켜기',
      autoOff: '자동 끄기',
      autoOffDescription: '인쇄 완료 후 끄기',
      offDelay: '끄기 지연',
      offDelayMinutes: '인쇄 후 분',
      offDelayTemp: '노즐 온도 이하일 때',
      currentState: '현재 상태',
      turnOn: '켜기',
      turnOff: '끄기'
    },
    filamentTracking: '필라멘트 추적',
    filamentTrackingDesc: '필라멘트 스풀을 추적하는 방법을 선택하세요. 내장 인벤토리를 사용하거나 외부 Spoolman 서버에 연결할 수 있습니다.',
    autoAddUnknownRfid: '알 수 없는 RFID 스풀 자동 추가',
    autoAddUnknownRfidDesc: '알 수 없는 RFID 태그가 있는 스풀이 감지되면 자동으로 인벤토리 항목을 생성합니다. 새 스풀을 미리 수동으로 등록한다면 중복을 피하기 위해 끄세요.',
    filamentChecks: '필라멘트 확인',
    disableFilamentWarnings: '필라멘트 경고 비활성화',
    disableFilamentWarningsDesc: '인쇄 또는 대기열 추가 시 필라멘트 부족 경고 표시 안 함',
    preferLowestFilament: '남은 필라멘트가 가장 적은 것 우선',
    preferLowestFilamentDesc: '여러 스풀이 일치할 때 남은 필라멘트가 가장 적은 것 사용',
    preferLowestFilamentBackupNote: '프린터에서 AMS 필라멘트 백업이 활성화된 경우에만 적용됩니다. 그렇지 않으면 선택한 스풀이 다 떨어졌을 때 두 번째 스풀로 전환할 수 없습니다.',
    trackingModeBuiltIn: '내장 인벤토리',
    trackingModeBuiltInDesc: 'RFID 자동 매칭 및 사용량 추적 포함',
    trackingModeSpoolmanDesc: '외부 필라멘트 관리 서버',
    builtInFeatureRfid: 'AMS의 Bambu Lab RFID 스풀 자동 감지',
    builtInFeatureUsage: '인쇄당 필라멘트 소비량 추적',
    builtInFeatureCatalog: '스풀, 색상, K 팩터 프로필 관리',
    builtInFeatureThirdParty: '서드파티 스풀을 인벤토리 스풀에 할당 가능',
    amsSyncButton: 'AMS에서 무게 동기화',
    amsSyncTitle: 'AMS에서 스풀 무게 동기화',
    amsSyncMessage: '연결된 프린터의 현재 AMS 잔여% 값으로 모든 인벤토리 스풀 무게를 덮어씁니다. 손상된 무게 데이터를 복구하는 데 사용하세요. 프린터가 온라인이어야 합니다.',
    amsSyncing: '동기화 중...',
    amsSyncSuccess: '{{synced}}개 스풀 동기화됨, {{skipped}}개 건너뜀',
    amsSyncError: 'AMS에서 무게 동기화 실패',
    spoolmanAmsSyncButton: 'AMS에서 Spoolman 무게 동기화',
    spoolmanAmsSyncTitle: 'AMS에서 Spoolman 스풀 무게 동기화',
    spoolmanAmsSyncMessage: '연결된 프린터의 현재 AMS 잔여% 값으로 모든 Spoolman 스풀 무게를 업데이트합니다. 프린터가 온라인이어야 합니다.',
    spoolmanAmsSyncing: '동기화 중...',
    spoolmanAmsSyncSuccess: '{{synced}}개 스풀 동기화됨, {{skipped}}개 건너뜀',
    spoolmanAmsSyncError: 'AMS에서 Spoolman 무게 동기화 실패',
    spoolmanAmsSyncErrorUnreachable: 'Spoolman 무게 동기화 실패 (Spoolman 접근 불가)',
    spoolmanAmsSyncErrorNotConfigured: 'Spoolman 무게 동기화 실패 (Spoolman 미설정)',
    spoolmanNotConfigured: 'Spoolman 미설정',
    spoolmanFilamentCatalogTitle: 'Spoolman 필라멘트 카탈로그',
    spoolmanFilamentCatalogDesc: 'Spoolman 인스턴스의 필라멘트 이름 및 공 무게. 이름과 스풀 무게는 여기서 편집 가능하며 다른 속성은 Spoolman에서 직접 관리됩니다.',
    spoolmanUrl: 'Spoolman URL',
    spoolmanUrlHint: 'Spoolman 서버의 URL (예: http://localhost:7912)',
    spoolmanConnected: '연결됨',
    spoolmanDisconnected: '연결 끊김',
    status: '상태',
    connect: '연결',
    disconnect: '연결 해제',
    howSyncWorks: '동기화 작동 방식',
    syncInfoRfidOnly: 'RFID가 있는 공식 Bambu Lab 스풀만 동기화됨',
    syncInfoAutoCreate: '새 스풀은 첫 번째 동기화 시 Spoolman에 자동 생성됨',
    syncInfoThirdPartySkipped: '비 Bambu Lab 스풀 (서드파티, 리필)은 건너뜀',
    linkingExistingSpools: '기존 스풀 연결',
    linkingExistingSpoolsDesc: '기존 Spoolman 스풀을 AMS에 연결하려면 AMS 슬롯 위에 마우스를 올리고 "Spoolman에 연결"을 클릭하세요.',
    syncMode: '동기화 모드',
    syncModeAuto: '자동',
    syncModeManual: '수동만',
    syncModeAutoDesc: '변경이 감지되면 AMS 데이터가 자동으로 동기화됨',
    syncModeManualDesc: '수동으로 트리거할 때만 동기화',
    syncAmsData: 'AMS 데이터 동기화',
    syncAmsDataDesc: '프린터 AMS 데이터를 Spoolman에 수동으로 동기화',
    allPrinters: '모든 프린터',
    noDefaultPrinter: '기본값 없음 (매번 묻기)',
    sidebarOrder: '사이드바 순서',
    saveThumbnails: '썸네일 저장',
    captureFinishPhoto: '완료 사진 캡처',
    noPrintersConfigured: '설정된 프린터 없음',
    archiveMode: {
      always: '항상 아카이브 항목 생성',
      never: '아카이브 항목 생성 안 함',
      ask: '매번 묻기'
    },
    checkForUpdatesLabel: '업데이트 확인',
    checkPrinterFirmware: '프린터 펌웨어 확인',
    includeBetaUpdates: '베타 버전 포함',
    includeBetaUpdatesDesc: '업데이트 확인 시 베타 및 사전 릴리스 버전에 대해 알림',
    localLogin: {
      disable: '로컬 사용자명/비밀번호 로그인 비활성화',
      disableHint: '활성화하면 SSO 공급자로만 로그인할 수 있습니다. LDAP는 영향을 받지 않습니다. 서버에서 BAMBUDDY_LOCAL_LOGIN=true 를 설정하면 복구 경로가 유지됩니다.'
    },
    enableRetry: '재시도 활성화',
    homeAssistantDescription: 'Home Assistant를 통해 스마트 플러그 제어',
    environmentManagedLabel: '(환경 변수 관리)',
    autoEnabledViaEnv: '환경 변수를 통해 자동 활성화됨',
    urlFromEnvReadOnly: 'HA_URL 환경 변수에서 값 설정됨 (읽기 전용)',
    tokenFromEnvReadOnly: 'HA_TOKEN 환경 변수에서 값 설정됨 (읽기 전용)',
    mqttConnectedTo: '연결됨',
    prometheusDescription: 'Prometheus 형식으로 프린터 데이터 노출',
    noSmartPlugsTitle: '설정된 스마트 플러그 없음',
    noSmartPlugsDescription: '에너지 사용량 추적 및 전원 제어 자동화를 위해 Tasmota 기반 스마트 플러그를 추가하세요.',
    noProvidersTitle: '설정된 제공자 없음',
    noProvidersDescription: '알림을 받으려면 제공자를 추가하세요.',
    noTemplatesAvailable: '사용 가능한 템플릿 없음. 기본 템플릿을 시드하려면 백엔드를 재시작하세요.',
    apiPermissionView: '프린터 상태 및 대기열 보기',
    apiPermissionEdit: '인쇄 대기열에서 항목 추가 및 제거',
    apiKeysEmptyTitle: 'API 키 없음',
    apiKeysEmptyDescription: '외부 서비스와 통합하려면 API 키를 만드세요.',
    noUsersFound: '사용자를 찾을 수 없습니다',
    noGroupsFound: '그룹을 찾을 수 없습니다',
    noGroupsAvailable: '사용 가능한 그룹 없음',
    passwordsDoNotMatch: '비밀번호가 일치하지 않습니다',
    systemGroupWarning: '시스템 그룹 이름은 변경할 수 없습니다',
    authDisabledTitle: '인증이 비활성화되어 있습니다',
    authDisabledFeature1: '시스템 접근 시 로그인 필요',
    authDisabledFeature2: '그룹 기반 권한으로 여러 사용자 생성',
    authDisabledFeature3: '50개 이상의 세분화된 권한으로 접근 제어',
    userHasCreated: '이 사용자가 만든 항목:',
    userItemsQuestion: '이 항목들을 어떻게 처리하시겠습니까?',
    deleteUserConfirm: '이 사용자를 삭제하시겠습니까?',
    actionCannotBeUndone: '이 작업은 취소할 수 없습니다.',
    addFirstSmartPlug: '첫 번째 스마트 플러그 추가',
    providers: '제공자',
    log: '로그',
    testAll: '모두 테스트',
    testResults: '테스트 결과',
    testPassedCount: '{{count}}개 통과',
    testFailedCount: '{{count}}개 실패',
    messageTemplates: '메시지 템플릿',
    messageTemplatesDescription: '각 이벤트에 대한 알림 메시지를 사용자 지정하세요.',
    apiKeys: 'API 키',
    apiKeysDescription: '외부 통합 및 웹훅을 위한 API 키를 만드세요.',
    createKey: '키 만들기',
    apiKeyCreated: 'API 키가 성공적으로 생성되었습니다',
    apiKeyCopyWarning: '지금 이 키를 복사하세요 - 다시 표시되지 않습니다!',
    useInApiBrowser: 'API 브라우저에서 사용',
    apiKeyQrButton: 'QR 코드',
    apiKeyQrTitle: '스캔하여 설정',
    apiKeyQrCaption: '모바일 앱으로 스캔하여 이 서버와 API 키를 추가하세요.',
    apiKeyQrWarning: '비밀 API 키가 포함되어 있습니다. 다른 사람이 볼 수 있는 곳에서 공유하거나 스크린샷하지 마세요.',
    createNewApiKey: '새 API 키 만들기',
    keyName: '키 이름',
    keyNamePlaceholder: '예: Home Assistant, OctoPrint',
    readStatus: '상태 읽기',
    readStatusDescription: '프린터 상태, 대기열, 라이브러리, 아카이브 및 슬라이서 파이프라인 보기',
    manageQueue: '대기열 관리',
    manageQueueDescription: '인쇄 대기열에서 항목 추가 및 제거. "라이브러리 관리"와 함께 슬라이서 파이프라인 실행',
    controlPrinter: '프린터 제어',
    controlPrinterDescription: '인쇄 일시정지, 재개, 정지',
    manageLibrary: '라이브러리 관리',
    manageLibraryDescription: '라이브러리 파일 업로드, 이름 변경, 삭제 및 슬라이스; MakerWorld에서 모델 가져오기. "대기열 관리"와 함께 슬라이서 파이프라인 실행',
    manageInventory: '재고 관리',
    manageInventoryDescription: '스풀 및 재고 레코드 생성, 업데이트 및 삭제. SpoolBuddy 키오스크(NFC 스캔, 저울 측정값, 키오스크 시스템 명령)에 필요합니다.',
    manageMaintenance: '유지보수 관리',
    manageMaintenanceDescription: '완료된 유지보수 기록, 카운터 재설정, 주기 편집, 유지보수 유형 카탈로그 관리. 프린터 제어를 더 광범위하게 허용하지 않고 "노즐을 청소했다"를 기록하는 Home Assistant 자동화에 적합합니다.',
    manageArchives: '아카이브 관리',
    manageArchivesDescription: '오래된 출력물과 통계 기여 항목의 제거를 포함하여 출력 아카이브를 편집하고 삭제합니다. 출력 기록을 정리하는 자동화에 적합합니다.',
    manageProjects: '프로젝트 관리',
    manageProjectsDescription: '프로젝트를 생성, 업데이트, 삭제하고 프로젝트에 아카이브를 추가합니다. 출력물을 프로젝트로 정리하는 자동화에 적합합니다.',
    maintenanceBadge: '유지보수',
    archivesBadge: '아카이브',
    projectsBadge: '프로젝트',
    libraryBadge: '라이브러리',
    inventoryBadge: '재고',
    cloudAccess: '클라우드 접근 허용',
    cloudAccessDescription: '사용자를 대신하여 Bambu Cloud 프리셋 및 필라멘트를 읽습니다. Bambu Cloud에 로그인되어 있어야 합니다.',
    cloudBadge: '클라우드',
    legacyKey: '레거시',
    legacyKeyTooltip: '사용자별 소유권 이전에 생성됨. 클라우드 접근을 사용하려면 재생성하세요',
    unnamedKey: '이름 없는 키',
    lastUsed: '마지막 사용',
    read: '읽기',
    control: '제어',
    createFirstKey: '첫 번째 키 만들기',
    webhookEndpoints: '웹훅 엔드포인트',
    webhookApiKeyHint: 'X-API-Key 헤더에 API 키를 사용하세요.',
    webhook: {
      getAllStatus: '모든 프린터 상태 가져오기',
      getSpecificStatus: '특정 프린터 상태 가져오기',
      addToQueue: '인쇄 대기열에 추가',
      pausePrint: '인쇄 일시정지',
      resumePrint: '인쇄 재개',
      stopPrint: '인쇄 정지'
    },
    apiBrowser: 'API 브라우저',
    apiBrowserDescription: '사용 가능한 모든 API 엔드포인트를 탐색하고 테스트하세요.',
    apiKeyForTesting: '테스트용 API 키',
    apiKeyPlaceholder: '인증된 엔드포인트를 테스트하려면 API 키를 여기에 붙여넣으세요...',
    apiKeyHint: '이 키는 요청과 함께 X-API-Key 헤더로 전송됩니다.',
    deleteApiKeyTitle: 'API 키 삭제',
    deleteApiKeyMessage: '이 API 키를 삭제하시겠습니까? 이 키를 사용하는 모든 통합이 작동을 멈춥니다.',
    deleteKey: '키 삭제',
    amsDisplayThresholds: 'AMS 표시 임계값',
    amsThresholdsDescription: 'AMS 습도 및 온도 표시기의 색상 임계값을 설정하세요.',
    humidity: '습도',
    goodGreen: '좋음 (녹색)',
    fairOrange: '보통 (주황색)',
    aboveFairBad: '보통 임계값 초과 시 빨간색 (나쁨)으로 표시',
    fairAlsoDryingThreshold: '이 임계값은 자동 건조 활성화 시 트리거로도 사용됨',
    fairBelowDryingFloor: '자동 건조로는 이 값에 도달할 수 없습니다. AMS는 히터가 작동하는 동안 {{floor}}% 이상을 보고하므로 각 주기가 끝나고 곧바로 다시 시작됩니다. 자동 건조를 사용한다면 {{floor}}%보다 높게 설정하세요.',
    temperature: '온도',
    goodBlue: '좋음 (파란색)',
    aboveFairHot: '보통 임계값 초과 시 빨간색 (뜨거움)으로 표시',
    historyRetention: '기록 보존',
    keepSensorHistory: '센서 기록 보존 기간',
    historyRetentionDescription: '오래된 습도 및 온도 데이터가 자동으로 삭제됩니다',
    defaultPrintOptions: '기본 인쇄 옵션',
    defaultPrintOptionsDescription: '새 인쇄 시작 시 기본값을 설정하세요. 인쇄 대화 상자에서 인쇄별로 재정의할 수 있습니다.',
    defaultBedLevelling: '베드 레벨링',
    defaultBedLevellingDesc: '인쇄 전 자동 베드 레벨링',
    defaultFlowCali: '유량 캘리브레이션',
    defaultFlowCaliDesc: '압출 유량 캘리브레이션',
    defaultVibrationCali: '진동 캘리브레이션',
    defaultVibrationCaliDesc: '링잉 아티팩트 감소',
    defaultLayerInspect: '첫 번째 층 검사',
    defaultLayerInspectDesc: '첫 번째 층 AI 검사',
    defaultTimelapse: '타임랩스',
    defaultTimelapseDesc: '타임랩스 영상 녹화',
    defaultNozzleOffsetCali: '노즐 오프셋 보정',
    defaultNozzleOffsetCaliDesc: '익스트루더 간 노즐 오프셋 보정',
    tempFanPresetsTitle: '온도 및 팬 프리셋',
    tempFanPresetsDescription: '프린터 카드의 온도 및 팬 속도 팝오버에 표시되는 빠른 선택 값을 사용자 지정합니다. 끄기 버튼은 항상 표시됩니다.',
    tempFanPresetsNozzle: '노즐 온도',
    tempFanPresetsBed: '베드 온도',
    tempFanPresetsChamber: '챔버 온도',
    tempFanPresetsFan: '팬 속도',
    tempFanPresetsReset: '기본값으로 재설정',
    concurrentUploadsTitle: '동시 업로드',
    concurrentUploadsDescription: '대기열이 동시에 파일을 보낼 수 있는 프린터 수입니다. 프린터는 파일을 느리게 받으며(큰 출력물은 몇 분이 걸릴 수 있습니다) 각 프린터는 자기 차례를 기다립니다. 따라서 프린터가 많은 환경에서는 이 값을 높이면 배치의 마지막 프린터가 앞선 모든 전송이 끝나기를 기다리지 않아도 됩니다. 네트워크나 Bambuddy 호스트가 병렬 전송을 버거워하면 값을 낮추세요.',
    concurrentUploadsLabel: '동시에 전송할 프린터 수',
    concurrentUploadsHelp: '1이면 한 번에 한 대씩 전송합니다(기존 동작). 기본값은 4입니다.',
    staggeredStart: '엇갈린 시작',
    staggeredStartDescription: '다중 프린터 일괄 시작 시 기본 그룹 크기 및 간격. 인쇄 모달에서 배치별로 재정의할 수 있습니다.',
    preheatTitle: '예열 & 히트 소크',
    preheatDescription: '대기열의 각 인쇄가 시작되기 전에 베드(및 지원되는 경우 챔버)를 가열하고 온도를 유지합니다. 챔버 능동 가열이 없는 프린터에서 엔지니어링 필라멘트(PA, ABS) 인쇄에 유용합니다. 소크 타이머가 진행되는 동안 베드 복사열로 챔버가 데워집니다. 베드 목표 온도는 인쇄 파일에서 읽어오며 챔버 동작은 프린터 모델에 따라 다릅니다.',
    preheatEnabled: '예열 & 소크 활성화',
    preheatEnabledDesc: '꺼짐일 경우 대기열 인쇄가 즉시 시작됩니다. 각 항목은 인쇄별로 재정의할 수 있습니다.',
    preheatFilamentTargetsLabel: '필라멘트별 챔버 목표 (°C)',
    preheatFilamentTargetsHint: 'Bambuddy는 로드된 AMS 슬롯 중 가장 높은 목표를 선택합니다. PLA만 사용하는 인쇄는 0으로 도출되어 챔버 단계를 자동으로 건너뜁니다.',
    preheatFilamentTargetsReset: '기본값으로 재설정',
    preheatFilamentTargetsDefaultRow: '기타 / 미매핑',
    preheatMaxWait: '최대 대기 (초)',
    preheatMaxWaitHelp: '소크로 전환되기 전 챔버 가열 단계의 상한.',
    preheatSoak: '소크 (초)',
    preheatSoakHelp: '목표 도달 또는 최대 대기 경과 후 유지 시간.',
    preheatHardwareTitle: '프린터별 동작:',
    preheatHardwareDetail: 'H2C/H2D/H2D Pro/H2S/X2D/X1E는 M141으로 챔버를 능동적으로 가열합니다. X1C/P2S는 챔버 온도를 읽지만 베드 복사열로만 가열됩니다. P1S/P1P/A1/A1 Mini는 챔버 센서가 없어 소크 타이머만 적용됩니다.',
    preheatPerItemDesc: '이 인쇄가 시작되기 전에 베드와 챔버를 가열합니다. 기본적으로 설정 → 워크플로의 전역 토글을 사용합니다.',
    preheatOverride_inherit: '상속',
    preheatOverride_on: '켜기',
    preheatOverride_off: '끄기',
    calibrationMode_off: '끄기',
    calibrationMode_on: '켜기',
    calibrationMode_auto: '자동',
    preheatTargetOverride: '챔버 목표 재정의 (°C, 비우면 필라멘트 기본값)',
    plateClear: '플레이트 비움 확인',
    requirePlateClear: '플레이트 비움 확인 필요',
    requirePlateClearDescription: '활성화하면 스케줄러가 완료된 작업이 있는 프린터에서 대기 중인 인쇄를 시작하기 전에 프린터별 플레이트 비움 확인을 기다립니다.',
    keepBedWarm: '출력 사이에 베드 온도 유지',
    keepBedWarmDesc: '플레이트 클리어 확인 대기 중에 아래의 온도 유지 값으로 베드를 유지하여 챔버를 따뜻하게 유지합니다. 다음 출력의 베드 온도가 더 높으면 그 값을 사용합니다. 다음 출력에 챔버 가열이 필요한 경우에만 적용됩니다(ASA, ABS, PA, PC 등). 플레이트 클리어 확인이 활성화되어 있어야 합니다.',
    keepWarmBedTemp: '온도 유지 시 베드 온도 (°C)',
    keepWarmBedTempHelp: '베드로 챔버를 가열해야 할 때 사용됩니다(온도 유지 중, 그리고 출력 파일에 베드 온도가 없는 경우의 예열 시). 출력 파일의 베드 온도가 더 높으면 항상 그 값이 우선합니다.',
    keepWarmMaxMinutes: '온도 유지 종료 시간(분)',
    keepWarmMaxMinutesHelp: '이 시간 안에 플레이트를 비우지 않으면 히터를 무기한 켜두지 않고 끕니다.',
    gcodeInjection: 'G코드 주입',
    gcodeInjectionDescription: '자동 인쇄 시스템을 위한 인쇄 시작 및/또는 종료 시 주입할 사용자 지정 G코드를 설정하세요.',
    gcodeInjectionNoPrinters: '프린터가 없습니다. G코드 스니펫을 설정하려면 프린터를 추가하세요.',
    gcodeStartLabel: '시작 G코드',
    gcodeEndLabel: '종료 G코드',
    gcodeStartPlaceholder: '인쇄 시작 전 앞에 추가되는 G코드...',
    gcodeEndPlaceholder: '인쇄 종료 후 뒤에 추가되는 G코드...',
    staggerGroupSize: '그룹 크기',
    staggerGroupSizeHelp: '그룹당 동시에 시작할 프린터 수',
    staggerInterval: '간격 (분)',
    staggerIntervalHelp: '각 그룹 시작 사이의 지연',
    queueDrying: '대기열 자동 건조',
    queueDryingDescription: '대기 중인 인쇄 사이에 프린터가 유휴 상태일 때 AMS 필라멘트를 자동으로 건조합니다.',
    queueDryingEnabled: '자동 건조 활성화',
    queueDryingEnabledDescription: '프린터가 유휴 상태이고 습도가 임계값 초과 시 자동으로 AMS 건조 시작',
    queueDryingBlock: '건조 완료까지 대기',
    queueDryingBlockDescription: '건조가 완료될 때까지 인쇄 대기열을 차단합니다. 끄면 인쇄가 건조보다 우선합니다.',
    ambientDryingEnabled: '주변 건조',
    ambientDryingEnabledDescription: '대기 중인 인쇄가 없어도 습도가 임계값을 초과하면 유휴 프린터에서 자동으로 필라멘트 건조',
    printDryingEnabled: '인쇄 중 건조 계속',
    printDryingEnabledDescription: '지원되는 하드웨어(H2D, H2C, H2S, P2S, H2D Pro, X2D, X1C, A2L 최신 펌웨어)에서 인쇄 중에도 자동 건조를 계속 실행합니다. 스풀 보호를 위해 건조 온도가 유휴 프리셋보다 자동으로 5°C 낮게 제한됩니다.',
    dryingPresets: '건조 프리셋',
    dryingPresetsDescription: '필라멘트 유형별 온도 및 시간. AMS 2 Pro는 낮은 온도, AMS-HT는 높은 온도를 지원합니다.',
    dryingFilament: '필라멘트',
    humidityThresholds: '습도 임계값',
    humidityThresholdsDescription: '자동 건조 및 알람용 필라멘트 유형별 습도 임계값. 한 AMS에 혼합 적재 시 가장 낮은 값을 사용합니다.',
    humidityThresholdCol: '임계값',
    humidityThresholdDefault: '기본값 (알 수 없는 유형)',
    printModal: '인쇄 모달',
    expandCustomMapping: '사용자 지정 매핑 기본 펼침',
    expandCustomMappingDescription: '여러 프린터에 인쇄할 때 프린터별 AMS 매핑을 펼친 상태로 표시',
    authentication: '인증',
    authEnabledDescription: '인스턴스가 사용자 인증으로 보안됨',
    authDisabledDescription: '로그인 필요 및 사용자 접근 관리를 위해 활성화',
    authDisabledMessage: '사용자 계정 생성, 권한 관리, Bambuddy 인스턴스 보안을 위해 인증을 활성화하세요.',
    enableAuthentication: '인증 활성화',
    currentUser: '현재 사용자',
    changePassword: '비밀번호 변경',
    admin: '관리자',
    users: '사용자',
    addUser: '사용자 추가',
    groups: '그룹',
    addGroup: '그룹 추가',
    system: '시스템',
    noDescription: '설명 없음',
    userCount: '{{count}}명의 사용자',
    permissionCount: '{{count}}개 권한',
    createUser: '사용자 만들기',
    username: '사용자명',
    enterUsername: '사용자명 입력',
    password: '비밀번호',
    enterPassword: '비밀번호 입력 (최소 6자)',
    confirmPassword: '비밀번호 확인',
    confirmPasswordPlaceholder: '비밀번호 확인',
    viewReleaseOnGitHub: 'GitHub에서 릴리스 보기',
    turnAllPlugsOn: '모든 플러그 켜기',
    turnAllPlugsOff: '모든 플러그 끄기',
    clearNotificationLogs: '알림 로그 지우기',
    clearLogsMessage: '30일보다 오래된 모든 알림 로그를 영구적으로 삭제합니다. 이 작업은 취소할 수 없습니다.',
    clearLogs: '로그 지우기',
    resetUiPreferences: 'UI 기본 설정 초기화',
    resetUiPreferencesMessage: '모든 UI 기본 설정을 기본값으로 초기화합니다: 사이드바 순서, 테마, 대시보드 레이아웃, 보기 모드, 정렬 기본 설정. 프린터, 아카이브, 서버 설정은 영향받지 않습니다. 지운 후 페이지가 새로고침됩니다.',
    resetPreferences: '기본 설정 초기화',
    deleteGroupTitle: '그룹 삭제',
    deleteGroupMessage: '이 그룹을 삭제하시겠습니까? 이 그룹의 사용자는 이 권한을 잃게 됩니다.',
    deleteGroup: '그룹 삭제',
    disableAuthenticationTitle: '인증 비활성화',
    disableAuthenticationMessage: '인증을 비활성화하시겠습니까? 이렇게 하면 로그인 없이 Bambuddy 인스턴스에 접근할 수 있게 됩니다. 모든 사용자는 데이터베이스에 유지되지만 인증은 비활성화됩니다.',
    disableAuthentication: '인증 비활성화',
    configureBambuddy: 'Bambuddy 설정',
    systemDefault: '시스템 기본값',
    archiveSettings: '아카이브 설정',
    newWindow: '새 창',
    embeddedOverlay: '내장 오버레이',
    preferredSlicer: '선호하는 슬라이서',
    preferredSlicerDescription: 'API 사이드카를 통한 앱 내 슬라이싱에 사용되는 슬라이서',
    openInSlicerLabel: '슬라이서에서 열기',
    openInSlicerInherit: 'API 슬라이서와 동일',
    openInSlicerDescription: "'슬라이서에서 열기' 버튼이 사용하는 데스크톱 슬라이서입니다. 'API 슬라이서와 동일'로 두어 상속하거나 로컬에서 사용할 다른 슬라이서를 선택하세요.",
    orcaslicerKnownIssuesWarning: 'OrcaSlicer 2.3.2 / 2.4.0-dev에는 Bambu 제작 3MF 파일 슬라이싱을 차단하는 알려진 CLI 버그가 있습니다. 업스트림 수정이 출시될 때까지 Bambu Studio를 사용하는 것이 좋습니다.',
    useSlicerApi: '슬라이서 API 사용',
    useSlicerApiDescription: '켜면 "슬라이스" 작업이 앱 내 슬라이서 모달을 열고 슬라이서 API 사이드카를 호출합니다. 끄면 URI 스킴을 통해 데스크톱 슬라이서로 전달합니다.',
    slicerCard: '슬라이서',
    orcaslicerApiUrl: 'OrcaSlicer 사이드카 URL',
    bambuStudioApiUrl: 'Bambu Studio 사이드카 URL',
    slicerStallTimeout: '슬라이서 정지 시간 제한(분)',
    slicerStallTimeoutDescription: '사이드카에서 이 시간 동안 진행 상황이 없으면 슬라이싱을 중단합니다. 진행 상황을 계속 보고하는 무거운 모델은 아무리 오래 걸려도 중단되지 않습니다. 진행 상황을 보고하지 않는 사이드카에서는 이 값이 전체 시간 제한으로 사용됩니다.',
    slicerApiUrlDescription: '슬라이서 API 사이드카 컨테이너의 URL. SLICER_API_URL / BAMBU_STUDIO_API_URL 환경 변수 기본값을 사용하려면 비워두세요.',
    externalCameras: '외부 카메라',
    costTracking: '비용 추적',
    billingEnabled: '결제 기능 사용',
    billingEnabledDescription: '사용자에게 인쇄 비용을 청구하고 재무 기능을 사용합니다',
    printerKillSwitch: '무단 인쇄 자동 중지',
    printerKillSwitchDescription: '승인 없이 시작된 인쇄를 즉시 중지합니다.',
    financeBudgetReset: '월별 재무 예산 초기화',
    financeBudgetResetDay: '초기화 날짜',
    financeBudgetResetDayHelp: '해당 날짜가 없는 짧은 달에는 그 달의 마지막 날에 초기화합니다.',
    financeBudgetResetTimezone: '초기화 시간대',
    financeBudgetResetTimezoneHelp: '예산 기간의 시작은 이 시간대를 기준으로 계산됩니다.',
    rebuildLedger: '지갑 원장 재구성',
    rebuildLedgerStarted: '원장 재구성을 시작했습니다',
    rebuildLedgerConfirmTitle: '지갑 원장을 재구성하시겠습니까?',
    rebuildLedgerConfirmMessage: '과거 잔액 값을 복구하기 위해 지갑 원장을 재구성합니다. 수행 내용을 정확히 아는 경우에만 실행하세요.',
    rebuildLedgerInProgress: '재구성 시작 중...',
    printsOnly: '인쇄만',
    totalConsumption: '총 소비',
    dataManagement: '데이터 관리',
    storageUsage: '저장소 사용량',
    storageUsageDescription: '카테고리별 데이터 사용량 분류',
    storageUsageTotal: '총계',
    storageUsageErrors: '오류',
    storageUsageOtherBreakdown: '기타 (정적 자산, 스크립트, 구성 파일 포함)',
    storageUsageSystem: '시스템',
    storageUsageData: '데이터',
    storageUsageUnavailable: '저장소 사용량 정보 불가',
    clearNotificationLogsDescription: '30일보다 오래된 알림 로그 삭제',
    resetUiPreferencesDescription: '사이드바 순서, 테마, 보기 모드, 레이아웃 기본 설정 초기화. 프린터, 아카이브, 설정은 영향받지 않습니다.',
    enableHomeAssistant: 'Home Assistant 활성화',
    enableMqtt: 'MQTT 활성화',
    useTls: 'TLS 사용',
    enableMetricsEndpoint: '메트릭 엔드포인트 활성화',
    availableMetrics: '사용 가능한 메트릭',
    editUser: '사용자 편집',
    deleteUserTitle: '사용자 삭제',
    groupName: '그룹 이름',
    leaveEmptyForAnonymous: '익명으로 두려면 비워두세요',
    leaveEmptyForNoAuth: '인증 없이 두려면 비워두세요',
    enterNewPassword: '새 비밀번호 입력',
    confirmNewPassword: '새 비밀번호 확인',
    enterGroupName: '그룹 이름 입력',
    enterDescriptionOptional: '설명 입력 (선택사항)',
    enterCurrentPassword: '현재 비밀번호 입력',
    enterNewPasswordMin6: '새 비밀번호 입력 (최소 6자)',
    toast: {
      keyCopied: '키가 클립보드에 복사되었습니다',
      copyFailed: '키 복사 실패',
      keyAddedToBrowser: 'API 브라우저에 키가 추가되었습니다',
      clearLogsFailed: '로그 지우기 실패',
      uiPreferencesReset: 'UI 기본 설정이 초기화되었습니다. 새로고침 중...',
      authDisabled: '인증이 성공적으로 비활성화되었습니다',
      authDisableFailed: '인증 비활성화 실패',
      apiKeyCreated: 'API 키가 생성되었습니다',
      apiKeyDeleted: 'API 키가 삭제되었습니다',
      userCreated: '사용자가 성공적으로 생성되었습니다',
      userUpdated: '사용자가 성공적으로 업데이트되었습니다',
      userDeleted: '사용자가 성공적으로 삭제되었습니다',
      groupCreated: '그룹이 성공적으로 생성되었습니다',
      groupUpdated: '그룹이 성공적으로 업데이트되었습니다',
      groupDeleted: '그룹이 성공적으로 삭제되었습니다',
      fillRequiredFields: '모든 필수 항목을 입력하세요',
      passwordsDoNotMatch: '비밀번호가 일치하지 않습니다',
      passwordTooShort: '비밀번호는 최소 6자여야 합니다',
      enterGroupName: '그룹 이름을 입력하세요',
      settingsSaved: '설정이 저장되었습니다',
      noPermissionUpdate: '설정을 변경할 권한이 없습니다',
      cameraSettingsSaved: '카메라 설정이 저장되었습니다',
      enterCameraUrl: '카메라 URL을 입력하세요',
      passwordChanged: '비밀번호가 성공적으로 변경되었습니다',
      connectionFailed: '연결 실패',
      testFailed: '테스트 실패',
      cameraConnected: '카메라 연결됨{{resolution}}',
      cameraConnectedCoalesced: '카메라 연결됨{{resolution}} (이미 진행 중인 캡처와 공유됨)',
      passwordNeedsUppercase: '비밀번호에 대문자가 최소 1개 포함되어야 합니다',
      passwordNeedsLowercase: '비밀번호에 소문자가 최소 1개 포함되어야 합니다',
      passwordNeedsDigit: '비밀번호에 숫자가 최소 1개 포함되어야 합니다',
      passwordNeedsSpecial: '비밀번호에 특수문자가 최소 1개 포함되어야 합니다'
    },
    testConnection: '연결 테스트',
    catalog: {
      spoolCatalog: '스풀 카탈로그',
      spoolCatalogDescription: '브랜드/유형별 빈 스풀 무게. 스풀 추가 시 자동 무게 조회에 사용됩니다.',
      searchCatalog: '카탈로그 검색...',
      addNewEntry: '새 항목 추가',
      namePlaceholder: '이름 (예: Bambu Lab - Plastic)',
      weight: '무게',
      type: '유형',
      default: '기본',
      custom: '사용자 지정',
      noMatch: '검색에 일치하는 항목 없음',
      empty: '카탈로그에 항목 없음',
      deleteEntry: '항목 삭제',
      deleteConfirm: '"{{name}}"을(를) 삭제하시겠습니까?',
      resetCatalog: '카탈로그 초기화',
      resetConfirm: '카탈로그를 기본값으로 초기화하시겠습니까? 모든 사용자 지정 항목이 제거됩니다.',
      loadFailed: '스풀 카탈로그 로드 실패',
      nameWeightRequired: '이름과 무게가 필요합니다',
      entryAdded: '항목이 추가되었습니다',
      addFailed: '항목 추가 실패',
      entryUpdated: '항목이 업데이트되었습니다',
      updateFailed: '항목 업데이트 실패',
      entryDeleted: '항목이 삭제되었습니다',
      deleteFailed: '항목 삭제 실패',
      resetSuccess: '카탈로그가 기본값으로 초기화되었습니다',
      resetFailed: '카탈로그 초기화 실패',
      exported: '{{count}}개 항목이 내보내졌습니다',
      imported: '{{added}}개 항목 가져옴 ({{skipped}}개 건너뜀)',
      importFailed: '가져오기 실패: 잘못된 JSON 형식',
      exportTooltip: 'JSON으로 카탈로그 내보내기',
      importTooltip: 'JSON에서 카탈로그 가져오기',
      resetTooltip: '기본값으로 초기화',
      selectedCount: '{{count}}개 선택됨',
      deleteSelected: '선택 항목 삭제',
      bulkDeleteConfirm: '{{count}}개 항목을 삭제하시겠습니까?',
      bulkDeleted: '{{count}}개 항목이 삭제되었습니다',
      bulkDeleteFailed: '항목 삭제 실패',
      material: '재료',
      spoolWeight: '스풀 무게',
      color: '색상',
      updateSpoolWeight: '스풀 무게 업데이트',
      filamentUpdated: '필라멘트가 업데이트되었습니다',
      filamentUpdateFailed: '필라멘트 업데이트 실패',
      filamentUpdateInvalid: '잘못된 필라멘트 데이터',
      keepExistingSpoolWeight: '기존 스풀에 이전 무게 유지',
      keepExistingSpoolWeightDesc: '이 필라멘트 유형으로 이미 생성된 스풀은 이전 공 무게를 유지합니다. 새 스풀은 업데이트된 값을 사용합니다.',
      applyToAllSpools: '모든 스풀에 적용',
      applyToAllSpoolsDesc: '이 필라멘트 유형의 모든 무게 계산이 즉시 새 공 무게를 사용합니다.'
    },
    colorCatalog: {
      title: '색상 카탈로그',
      description: '제조사/재료별 필라멘트 색상. 스풀 추가 시 자동 색상 조회에 사용됩니다.',
      searchColors: '색상 검색...',
      allManufacturers: '모든 제조사',
      addNewColor: '새 색상 추가',
      manufacturer: '제조사',
      colorName: '색상 이름',
      hex: '헥스',
      materialOptional: '재료 (선택사항)',
      showing: '{{total}}개 중 {{filtered}}개 색상 표시',
      noMatch: '검색에 일치하는 색상 없음',
      empty: '카탈로그에 색상 없음',
      deleteColor: '색상 삭제',
      deleteConfirm: '"{{name}}"을(를) 삭제하시겠습니까?',
      resetCatalog: '색상 카탈로그 초기화',
      resetConfirm: '카탈로그를 기본값으로 초기화하시겠습니까? 모든 사용자 지정 색상이 제거됩니다.',
      sync: '동기화',
      starting: '시작 중...',
      syncTooltip: 'FilamentColors.xyz에서 동기화 (2000개 이상 색상, 약 1분 소요)',
      loadFailed: '색상 카탈로그 로드 실패',
      fieldsRequired: '제조사, 색상 이름, 헥스 색상이 필요합니다',
      colorAdded: '색상이 추가되었습니다',
      addFailed: '색상 추가 실패',
      colorUpdated: '색상이 업데이트되었습니다',
      updateFailed: '색상 업데이트 실패',
      colorDeleted: '색상이 삭제되었습니다',
      deleteFailed: '색상 삭제 실패',
      resetSuccess: '색상 카탈로그가 기본값으로 초기화되었습니다',
      resetFailed: '카탈로그 초기화 실패',
      syncUpToDate: '이미 최신 상태 ({{count}}개 색상 확인됨)',
      syncComplete: '{{added}}개 새 색상 추가됨 ({{skipped}}개 이미 존재)',
      syncError: '동기화 오류',
      syncFailed: 'FilamentColors.xyz에서 동기화 실패',
      exported: '{{count}}개 색상이 내보내졌습니다',
      imported: '{{added}}개 색상 가져옴 ({{skipped}}개 건너뜀)',
      importFailed: '가져오기 실패: 잘못된 JSON 형식',
      selectedCount: '{{count}}개 선택됨',
      deleteSelected: '선택 항목 삭제',
      bulkDeleteConfirm: '{{count}}개 색상을 삭제하시겠습니까?',
      bulkDeleted: '{{count}}개 색상이 삭제되었습니다',
      bulkDeleteFailed: '색상 삭제 실패'
    },
    dateFormat: '날짜 형식',
    dateFormatUs: '미국 (MM/DD/YYYY)',
    dateFormatEu: '유럽 (DD/MM/YYYY)',
    dateFormatIso: 'ISO (YYYY-MM-DD)',
    timeFormat: '시간 형식',
    timeFormat12: '12시간 (오후 3:30)',
    timeFormat24: '24시간 (15:30)',
    defaultPrinter: '기본 프린터',
    defaultPrinterDescription: '업로드, 재인쇄 등 작업에서 이 프린터를 미리 선택합니다.',
    slicerBambuStudio: 'Bambu Studio',
    slicerOrcaSlicer: 'OrcaSlicer',
    sidebarOrderDescription: '사이드바 레이아웃에서 항목 순서를 변경하고, 표시 상태를 초기화하고, 사용자 지정 링크를 관리하세요.',
    setDefault: '기본값 설정',
    sidebarOrderSetDefaultHint: '기본값 설정은 현재 메뉴 순서를 사용자 지정하지 않은 사용자에게 적용합니다.',
    sidebarDefaultSet: '기본 메뉴 순서가 설정되었습니다.',
    sidebarDefaultCleared: '기본 메뉴 순서가 지워졌습니다.',
    sidebarDefaultFailed: '기본 메뉴 순서 설정 실패.',
    reset: '초기화',
    darkMode: '다크 모드',
    lightMode: '라이트 모드',
    active: '(활성)',
    background: '배경',
    accent: '강조',
    style: '스타일',
    bgNeutral: '중립',
    bgWarm: '따뜻함',
    bgCool: '시원함',
    bgOled: 'OLED 블랙',
    bgSlate: '슬레이트 블루',
    bgForest: '포레스트 그린',
    accentGreen: '그린',
    accentTeal: '틸',
    accentBlue: '블루',
    accentOrange: '오렌지',
    accentPurple: '퍼플',
    accentRed: '레드',
    styleClassic: '클래식',
    styleGlow: '글로우',
    styleVibrant: '비브런트',
    themeToggleHint: '사이드바의 태양/달 아이콘으로 다크 모드와 라이트 모드를 전환하세요.',
    progressInTitle: '탭에 인쇄 진행률 표시',
    progressInTitleDescription: '브라우저 탭에 진행 중인 인쇄의 백분율과 진행 링을 표시합니다.',
    autoArchivePrints: '인쇄 자동 아카이브',
    autoArchiveDescription: '인쇄 완료 시 3MF 파일 자동 저장',
    saveThumbnailsDescription: '3MF 파일에서 미리보기 이미지 추출 및 저장',
    captureFinishPhotoDescription: '인쇄 완료 시 프린터 카메라로 사진 촬영. Bambuddy는 인쇄 중 짧은 타임랩스를 기록하여 베드가 내려가기 전 순간에서 사진을 가져올 수 있도록 합니다. 이 인쇄에 대해 타임랩스를 활성화한 경우 타임랩스 파일이 보관되며, 그렇지 않으면 사진 촬영 후 자동으로 삭제됩니다.',
    finishPhotoRestorePlate: '완료 사진을 위해 베드 올리기',
    finishPhotoRestorePlateDescription: '프린터는 인쇄가 끝나면 베드를 약 100 mm 내리므로 완성된 출력물이 카메라 화각 아래에 놓입니다. Bambuddy는 베드를 마지막 인쇄 레이어 바로 위까지 다시 올려 사진을 찍은 뒤 다시 내립니다. 출력 높이를 알 수 없거나 다른 작업이 대기 중이면 건너뜁니다.',
    ffmpegNotInstalled: 'ffmpeg 미설치',
    ffmpegRequired: '카메라 캡처에 ffmpeg가 필요합니다. macOS에서는 <brew>brew install ffmpeg</brew>, Linux에서는 <apt>apt install ffmpeg</apt>로 설치하세요.',
    camera: '카메라',
    cameraViewMode: '카메라 보기 모드',
    cameraOverlayDescription: '카메라가 메인 화면의 크기 조절 가능한 오버레이에서 열립니다',
    cameraWindowDescription: '카메라가 별도의 브라우저 창에서 열립니다',
    externalCamerasDescription: '내장 프린터 카메라를 교체할 외부 카메라를 설정하세요. MJPEG 스트림, RTSP, HTTP 스냅샷, USB 카메라(V4L2)를 지원합니다.',
    cameraPlaceholderUsb: '장치 경로 (/dev/video0)',
    cameraPlaceholderUrl: '카메라 URL (rtsp://... 또는 http://...)',
    cameraTypeMjpeg: 'MJPEG 스트림',
    cameraTypeRtsp: 'RTSP 스트림',
    cameraTypeSnapshot: 'HTTP 스냅샷',
    cameraTypeUsb: 'USB 카메라 (V4L2)',
    cameraSnapshotUrl: '스냅샷 URL (선택사항)',
    cameraSnapshotUrlPlaceholder: 'http://192.168.1.61:1984/api/frame.jpeg?src=printer',
    cameraSnapshotUrlHelp: '알림 썸네일, 완료 사진, 타임랩스, 플레이트 감지에 사용되는 단일 프레임 URL.',
    cameraRotation: '회전',
    test: '테스트',
    connected: '연결됨',
    disconnected: '연결 끊김',
    currency: '통화',
    defaultFilamentCost: '기본 필라멘트 비용 (kg당)',
    electricityCost: 'kWh당 전기 비용',
    energyDisplayMode: '에너지 표시 모드',
    energyModePrintDescription: '대시보드가 인쇄 중 사용된 에너지 합계를 표시',
    energyModeTotalDescription: '대시보드가 스마트 플러그의 전체 에너지를 표시',
    fileManager: '파일 관리자',
    createArchiveEntry: '인쇄 시 아카이브 항목 생성',
    createArchiveEntryDescription: '파일 관리자에서 인쇄할 때 선택적으로 아카이브 항목 생성',
    lowDiskSpaceWarning: '디스크 공간 부족 경고',
    lowDiskSpaceDescription: '여유 디스크 공간이 이 임계값 아래로 떨어지면 경고 표시',
    printerFirmware: '프린터 펌웨어',
    checkFirmwareDescription: 'Bambu Lab의 프린터 펌웨어 업데이트 확인',
    bambuddySoftware: 'Bambuddy 소프트웨어',
    autoCheckDescription: '시작 시 자동으로 새 버전 확인',
    checkNow: '지금 확인',
    updateAvailableVersion: '업데이트 가능: v{{version}}',
    releaseNotes: '릴리스 노트',
    updateViaDocker: 'Docker Compose로 업데이트:',
    composeDirectory: 'Compose 디렉터리',
    composeDirectoryHint: 'docker-compose.yml이 있는 디렉터리입니다. 비워 두면 cd를 생략합니다.',
    copyUpdateCommand: '업데이트 명령 복사',
    updateViaHomeAssistant: '업데이트는 Home Assistant 수퍼바이저에서 관리됩니다. Home Assistant에서 설정 → 애드온 → Bambuddy를 열어 새 버전을 설치하세요.',
    updateViaWindowsInstaller: 'Windows 설치본은 설치 프로그램을 다시 실행하여 업데이트합니다. 아래에서 새 버전을 다운로드하세요 — 데이터, 설정 및 프린터는 유지됩니다.',
    downloadWindowsInstaller: 'v{{version}} 설치 프로그램 다운로드',
    installUpdate: '업데이트 설치',
    latestVersionRunning: '최신 버전을 실행 중입니다',
    failedToCheckUpdates: '업데이트 확인 실패: {{error}}',
    backupRestore: '백업 및 복원',
    backupRestoreDescription: '설정 내보내기/가져오기 및 GitHub 백업 설정',
    goToBackup: '백업으로 이동',
    externalUrl: '외부 URL',
    externalUrlDescription: 'Bambuddy에 접근할 수 있는 외부 URL. 알림 이미지 및 외부 통합에 사용됩니다.',
    bambuddyUrl: 'Bambuddy URL',
    externalUrlHint: '프로토콜과 포트를 포함하세요 (예: http://192.168.1.100:8000)',
    ftpRetry: 'FTP 재시도',
    ftpRetryDescription: '프린터 WiFi가 불안정할 때 FTP 작업을 재시도합니다.',
    autoRetryDescription: '실패한 FTP 작업 자동 재시도',
    retryAttempts: '재시도 횟수',
    retryDelay: '재시도 지연',
    connectionTimeout: '연결 제한 시간',
    time_one: '{{count}}번',
    time_other: '{{count}}번',
    second_one: '{{count}}초',
    second_other: '{{count}}초',
    nSeconds: '{{count}}초',
    increaseForWeakWifi: 'WiFi가 약한 프린터에서 늘리세요',
    homeAssistant: 'Home Assistant',
    homeAssistantFullDescription: 'Home Assistant의 REST API를 통해 스마트 플러그를 제어하려면 연결하세요.',
    homeAssistantUrl: 'Home Assistant URL',
    longLivedAccessToken: '장기 액세스 토큰',
    haTokenHint: 'HA에서 토큰 생성: 프로필 → 장기 액세스 토큰 → 토큰 생성',
    connectionSuccessful: '연결 성공',
    connectionFailed: '연결 실패',
    haConnectionSuccess: 'Home Assistant에 성공적으로 연결되었습니다.',
    haConnectionFailed: 'Home Assistant 연결 실패.',
    mqttPublishing: 'MQTT 게시',
    mqttDescription: 'Node-RED, Home Assistant 등 자동화 시스템과 통합하기 위해 Bambuddy 이벤트를 외부 MQTT 브로커에 게시하세요.',
    mqttEnableDescription: '외부 MQTT 브로커에 이벤트 게시',
    brokerHostname: '브로커 호스트명',
    port: '포트',
    usernameOptional: '사용자명 (선택사항)',
    passwordOptional: '비밀번호 (선택사항)',
    topicPrefix: '토픽 접두사',
    topicPrefixHint: '토픽은 다음과 같습니다: {{prefix}}/printers/<serial>/status 등',
    prometheusMetrics: 'Prometheus 메트릭',
    prometheusEndpointDescription: 'Prometheus/Grafana 모니터링을 위해 <code>/api/v1/metrics</code>에서 프린터 메트릭을 노출합니다.',
    bearerTokenOptional: '베어러 토큰 (선택사항)',
    bearerTokenHint: '설정하면 요청에 <code>Authorization: Bearer <token></code>을 포함해야 합니다',
    metricsConnectionStatus: '연결 상태',
    metricsPrinterState: '프린터 상태 (유휴/인쇄 중/등)',
    metricsPrintProgress: '인쇄 진행 0-100%',
    metricsBedTemp: '베드 온도',
    metricsNozzleTemp: '노즐 온도',
    metricsPrintsTotal: '결과별 총 인쇄 수',
    metricsMore: '...및 더 많은 것 (레이어, 팬, 대기열, 필라멘트 사용량)',
    smartPlugsDescription: '에너지 사용량 추적 및 프린터 전원 제어를 자동화하기 위해 스마트 플러그(Tasmota 또는 Home Assistant)를 연결하세요.',
    allOn: '모두 켜기',
    allOff: '모두 끄기',
    addSmartPlug: '스마트 플러그 추가',
    energySummary: '에너지 요약',
    currentPower: '현재 전력',
    plugsOnline: '{{reachable}}/{{total}}개 플러그 온라인',
    today: '오늘',
    yesterday: '어제',
    total: '총계',
    enablePlugsForSummary: '에너지 요약을 보려면 플러그를 활성화하세요',
    addNotificationProvider: '추가',
    systemBadge: '(시스템)',
    creating: '생성 중...',
    changing: '변경 중...',
    deleteUserAndItems: '사용자 및 항목 삭제',
    deleteUserKeepItems: '사용자 삭제, 항목 유지 (소유자 없음)',
    ok: '확인',
    twoFa: {
      totpTitle: '인증 앱 (TOTP)',
      totpDesc: 'Google Authenticator, Aegis, Authy 같은 인증 앱을 사용하세요.',
      emailOtpTitle: '이메일 OTP',
      emailOtpDesc: '로그인 시 {{email}}로 일회용 코드를 전송합니다.',
      emailOtpNoEmail: '이 방법을 활성화하려면 계정에 이메일 주소를 추가하세요.',
      addEmailFirst: '계정에 이메일 주소가 없습니다. 이메일 OTP를 활성화하기 전에 관리자에게 추가를 요청하세요.',
      setupTotp: '인증 앱 설정',
      setupAuthApp: '인증 앱 설정',
      setupInstructions: '아래 QR 코드를 인증 앱으로 스캔한 후 코드로 확인하세요.',
      manualEntry: '스캔할 수 없나요? 이 비밀을 수동으로 입력하세요:',
      scannedContinue: '코드를 스캔했습니다 — 계속',
      enterCodeToConfirm: '인증 앱의 6자리 코드를 입력하여 설정을 확인하세요.',
      activate: '활성화',
      disableTotp: '인증기 비활성화',
      disableConfirmHint: '인증기를 비활성화하려면 유효한 TOTP 코드나 백업 코드를 입력하세요.',
      totpDisabled: '인증 앱이 비활성화되었습니다.',
      emailOtpEnabled: '이메일 OTP가 활성화되었습니다.',
      emailOtpDisabled: '이메일 OTP가 비활성화되었습니다.',
      smtpRequired: '먼저 SMTP 설정을 구성하고 테스트하세요.',
      invalidCode: '잘못된 코드입니다. 다시 시도하세요.',
      enableEmailOtp: '이메일 OTP 활성화',
      disableEmailOtp: '이메일 OTP 비활성화',
      emailSetupEnterCode: '이메일 주소로 인증 코드가 전송되었습니다. 아래에 입력하여 이 받은 편지함을 소유하고 있음을 확인하세요.',
      verifyAndEnable: '확인 및 활성화',
      emailDisablePasswordHint: '이메일 OTP 비활성화를 확인하려면 계정 비밀번호를 입력하세요.',
      passwordPlaceholder: '비밀번호 입력',
      backupCodesTitle: '백업 코드 저장',
      backupCodesWarning: '이 코드를 안전한 곳에 저장하세요. 각 코드는 한 번만 사용할 수 있으며 다시 표시되지 않습니다.',
      backupCodesRemaining: '{{count}}개 백업 코드 남음',
      savedCodes: '코드를 저장했습니다',
      regenBackup: '백업 코드 재생성',
      regenBackupHint: '현재 TOTP 코드를 입력하여 10개의 새 백업 코드를 생성하세요. 기존 백업 코드는 모두 무효화됩니다.',
      newBackupCodes: '새 백업 코드',
      linkedAccounts: '연결된 SSO 계정',
      linkedAccountsDesc: '이 외부 ID 제공자가 계정에 연결되어 있습니다.',
      oidcUnlinked: '계정 연결이 해제되었습니다.'
    },
    // 세션 정책 (#1706)
    sessionPolicy: {
      title: '세션 정책',
      description: '신규 사용자 로그인의 최대 세션 수명입니다. 이미 발급된 토큰은 원래 만료 시간을 유지합니다.',
      preset24h: '24시간',
      preset7d: '7일',
      preset30d: '30일',
      customHoursLabel: '사용자 지정 세션 수명(시간)',
      hoursSuffix: '시간',
      warning: '세션이 길어질수록 자동 로그아웃 보호가 약해집니다. 신뢰할 수 있는 단일 사용자 배포에서만 권장됩니다.'
    },
    oidc: {
      title: 'SSO / OIDC 제공자',
      desc: '외부 ID 제공자를 통해 싱글 사인온을 허용하도록 OpenID Connect 제공자를 설정하세요.',
      addProvider: '제공자 추가',
      newProvider: '새 제공자',
      empty: '아직 설정된 OIDC 제공자가 없습니다.',
      created: '제공자가 생성되었습니다.',
      updated: '제공자가 업데이트되었습니다.',
      deleted: '제공자가 삭제되었습니다.',
      deleteTitle: '제공자 삭제',
      deleteMessage: '"{{name}}"을(를) 삭제하시겠습니까? 연결된 모든 사용자 계정의 연결이 해제됩니다.',
      form: {
        name: '표시 이름',
        issuerUrl: '발급자 URL',
        clientId: '클라이언트 ID',
        clientSecret: '클라이언트 시크릿',
        scopes: '범위',
        iconUrl: '아이콘 URL (선택사항)',
        enabled: '활성화됨',
        autoCreate: '사용자 자동 생성',
        autoCreateDesc: '첫 번째 로그인 시 자동으로 로컬 계정 생성.',
        autoLink: '기존 계정 자동 연결',
        autoLinkDesc: '첫 번째 로그인 시 이메일 일치로 기존 로컬 계정 연결.',
        secretHint: '현재 값을 유지하려면 비워두세요',
        secretPlaceholder: '새 시크릿',
        emailClaim: '이메일 클레임',
        emailClaimDesc: '이메일 ID로 사용되는 JWT 클레임.',
        emailClaimPlaceholder: 'email',
        emailClaimCustomClaimAutoLinkWarning: '사용자 지정 클레임은 값이 테넌트 관리인 경우에만 자동 연결에 안전합니다. IdP가 사용자가 이 클레임을 직접 주장할 수 있게 하면 자동 연결을 활성화하지 마세요.',
        requireEmailVerified: '이메일 확인 필요',
        requireEmailVerifiedDesc: '제공자가 확인된 것으로 표시한 경우에만 이메일 클레임을 수락합니다.',
        requireEmailVerifiedWarning: '경고: 확인 없이도 이메일이 수락됩니다. 신뢰할 수 있는 제공자에만 사용하세요.',
        requireEmailVerifiedAutoLink: '이 설정을 변경하려면 먼저 자동 연결을 비활성화하세요.',
        defaultGroup: '기본 그룹',
        defaultGroupDesc: '자동 생성된 사용자에게 할당되는 그룹. 설정되지 않으면 Viewers로 대체됩니다.',
        defaultGroupViewersFallback: 'Viewers (기본값)',
        autologin: '자동 로그인',
        autologinDesc: '인증되지 않은 방문자를 이 공급자로 바로 리디렉션합니다. 이 플래그를 가질 수 있는 공급자는 하나뿐입니다.'
      },
      refreshIcon: '아이콘 새로고침',
      removeIcon: '아이콘 제거',
      iconRefreshed: '아이콘이 새로고침되었습니다.',
      iconRemoved: '아이콘이 제거되었습니다.',
      iconFetchFailed: '공급자 URL에서 아이콘을 가져올 수 없습니다.'
    },
    encryption: {
      title: 'MFA 암호화 상태',
      enabledFromEnv: '저장 시 암호화 활성화됨 (MFA_ENCRYPTION_KEY 환경 변수에서 키)',
      enabledFromFile: '저장 시 암호화 활성화됨 (데이터 디렉토리에서 키 로드됨)',
      enabledGenerated: '자동 생성된 키로 저장 시 암호화 활성화됨',
      notConfigured: '저장 시 암호화가 설정되지 않음',
      notConfiguredDesc: 'TOTP 시크릿 및 OIDC client_secret이 일반 텍스트로 저장됩니다. MFA_ENCRYPTION_KEY를 설정하거나 쓰기 가능한 데이터 디렉토리로 Bambuddy를 재시작하여 자동 생성하세요.',
      allEncrypted: '모든 MFA 시크릿이 저장 시 암호화되어 있습니다.',
      legacyRowsLabel: '레거시 일반 텍스트 행',
      encryptedRowsLabel: '암호화된 행',
      legacyRowsWarning: '{{count}}개 레거시 일반 텍스트 행이 감지되었습니다. 암호화된 저장소로 마이그레이션하려면 OIDC 제공자를 다시 저장하거나 사용자의 인증 앱을 재등록하세요.',
      backupHint: '자동 생성된 키는 DATA_DIR/.mfa_encryption_key에 저장되며 로컬 백업 ZIP에 포함됩니다. 백업을 안전하게 보관하거나 MFA_ENCRYPTION_KEY를 명시적으로 설정하세요.',
      decryptionBrokenTitle: '암호화 키 누락',
      decryptionBrokenError: '암호화 키를 더 이상 사용할 수 없어 {{count}}개의 암호화된 레코드를 복호화할 수 없습니다.',
      migrationErrorWarning: '시작 시 {{count}}개 레거시 행을 재암호화하지 못했습니다. 서버 로그를 확인하고 Bambuddy를 재시작하여 재시도하세요.'
    },
    updateEnergyCost: '전기 요금 업데이트',
    updateEnergyCostDescription: '이 키가 /settings/electricity-price에 새 kWh당 전기 요금을 POST할 수 있도록 허용합니다. Home Assistant 동적 요금 자동화(Tibber, Octopus 등)에 유용합니다. API 키로 쓸 수 있는 유일한 설정 필드입니다.',
    energyCostBadge: '에너지',
    passwordRequirements: '최소 8자, 대문자, 소문자, 숫자, 특수문자 각 1개 이상 포함',

    pipelineLimits: {
      title: '슬라이서 파이프라인 한도',
      maxCopiesLabel: '실행당 최대 사본 수',
      maxCopiesDesc: '운영자가 파이프라인 실행 시 요청할 수 있는 사본 수의 상한. 서버 측 절대 상한은 1000입니다.',
    },

    // Slicer Pipelines (#1425): list/edit/delete preset bundles users saved
    // from the Slice dialog. Lives in Settings → Workflow → Pipelines sub-tab.
    pipelines: {
      title: '슬라이서 파이프라인',
      subtitle: '재사용 가능한 프리셋 묶음(프린터 + 프로세스 + 필라멘트 + 베드 유형). 슬라이스 대화상자에서 저장한 후 다음 파일에 한 번의 클릭으로 적용하세요.',
      loading: '파이프라인 불러오는 중…',
      loadError: '파이프라인을 불러오지 못했습니다.',
      confirmDelete: '이 파이프라인을 삭제하시겠습니까? 되돌릴 수 없습니다.',
      staleWarning: '참조된 프리셋이 더 이상 존재하지 않습니다. 슬라이스 대화상자에서 이 파이프라인을 다시 저장하여 수정하세요.',
      empty: {
        title: '아직 파이프라인이 없습니다.',
        howto: '임의의 파일에서 슬라이스 대화상자를 열고 프린터 / 프로세스 / 필라멘트 / 베드를 선택한 다음 "파이프라인으로 저장"을 클릭하세요. 저장된 파이프라인이 여기에 표시됩니다.',
      },
      field: {
        name: '파이프라인 이름',
        description: '설명',
        targetPrinter: '대상 프린터',
        noTarget: '— 대상 없음 —',
        targetKind: '대상 유형',
        targetKindSpecific: '특정 프린터',
        targetKindClass: '프린터 클래스',
        targetModelClass: '프린터 모델',
        fanoutStrategy: '분산 전략',
        fanout: {
          max_parallel: '최대 병렬 — 일치하는 유휴 프린터에 분산',
          round_robin: '라운드 로빈 — 적격 프린터를 순환',
          fill_one_first: '하나 먼저 채우기 — 모든 사본을 한 프린터에 고정',
        },
        fanoutShort: {
          max_parallel: '병렬',
          round_robin: '라운드 로빈',
          fill_one_first: '하나 먼저',
        },
      },
      action: {
        save: '저장',
        cancel: '취소',
        rename: '이름 변경',
        delete: '삭제',
      },
      slot: {
        printer: '프린터',
        process: '프로세스',
        filament: '필라멘트',
        filamentN: '필라멘트 {{n}}',
        filamentAll: '전체 {{n}} 슬롯',
        bed: '베드',
      },
      group: {
        profiles: '프로필',
        filaments: '필라멘트',
      },
      searchPlaceholder: '파이프라인 검색…',
      filterTargetType: '대상 유형으로 필터',
      filterTarget: '대상으로 필터',
      filter: {
        all: '모든 대상',
        noTarget: '대상 미설정',
        count: '{{shown}} / {{total}}',
        noMatches: '현재 필터와 일치하는 파이프라인이 없습니다.',
      },
      toast: {
        saved: '파이프라인이 저장되었습니다',
        saveFailed: '저장 실패',
        deleted: '파이프라인이 삭제되었습니다',
        deleteFailed: '삭제 실패',
      },
      noTargetHint: '실행하려면 대상 프린터를 설정하세요',
      noTargetWarning: '이 파이프라인을 실행하기 전에 대상 프린터를 설정하세요.',
      runs: {
        lastRun: '마지막 실행',
        status: {
          queued: '대기 중',
          slicing: '슬라이싱 중',
          dispatching: '전송 중',
          in_progress: '인쇄 중',
          completed: '완료됨',
          failed: '실패',
          partial_failure: '부분 실패',
          cancelled: '취소됨',
        },
      },
    },
  },
  notification: {
    printStarted: {
      title: '인쇄 시작됨',
      body: '{{printer}}: {{filename}} 인쇄가 시작되었습니다'
    },
    printCompleted: {
      title: '인쇄 완료됨',
      body: '{{printer}}: {{filename}}이(가) 성공적으로 완료되었습니다'
    },
    printFailed: {
      title: '인쇄 실패',
      body: '{{printer}}: {{filename}}이(가) 실패했습니다'
    },
    printStopped: {
      title: '인쇄 정지됨',
      body: '{{printer}}: {{filename}}이(가) 정지되었습니다'
    },
    printProgress: {
      title: '인쇄 진행',
      body: '{{printer}}: {{filename}} {{percent}}% 완료'
    },
    printerOffline: {
      title: '프린터 오프라인',
      body: '{{printer}}이(가) 오프라인 상태입니다'
    },
    printerError: {
      title: '프린터 오류',
      body: '{{printer}}: {{error}}'
    },
    filamentLow: {
      title: '필라멘트 부족',
      body: '{{printer}}: 필라멘트가 부족합니다'
    },
    maintenanceDue: {
      title: '유지보수 예정',
      body: '{{printer}}: {{items}} 주의 필요'
    }
  },
  errors: {
    generic: '문제가 발생했습니다',
    networkError: '네트워크 오류. 연결을 확인하세요.',
    notFound: '찾을 수 없습니다',
    unauthorized: '권한 없음',
    serverError: '서버 오류',
    validationError: '입력값을 확인하세요',
    printerConnectionFailed: '프린터 연결 실패',
    saveFailed: '변경사항 저장 실패',
    deleteFailed: '삭제 실패',
    loadFailed: '데이터 로드 실패'
  },
  hmsErrors: {
    title: '오류 - {{name}}',
    noErrors: '오류 없음',
    viewOnWiki: 'Bambu Lab 위키에서 보기',
    mqttVerifyFailedRemedy: '프린터에서 개발자 모드를 활성화하고 프린터를 재시작한 다음 작업을 다시 시작하세요.',
    unknownCode: '알 수 없는 HMS 코드 — 자세한 내용은 Bambu Lab 위키를 참조하세요.',
    clearInstructions: '오류를 해제하려면 프린터에서 오류를 지우세요.',
    clearErrors: '오류 지우기',
    clearSuccess: 'HMS 오류가 지워졌습니다',
    clearFailed: 'HMS 오류 지우기 실패',
    actionSuccess: '프린터에 작업을 전송함',
    actionFailed: '작업 전송 실패',
    runoutExpectedSlot: '{{ranOut}}의 필라멘트가 소진되었습니다. 프린터가 이제 {{expected}}에 호환 필라멘트를 기다리고 있습니다. {{expected}}에 스풀을 넣은 다음 다시 시도를 선택하세요.',
    runoutExpectedSlotOnly: '프린터가 {{expected}}에 호환 필라멘트를 기다리고 있습니다. 거기에 스풀을 넣은 다음 다시 시도를 선택하세요.',
    runoutSlotUnknown: '필라멘트가 소진되어 인쇄가 일시정지되었습니다. Bambuddy가 프린터가 현재 요청하는 슬롯을 확인할 수 없습니다 — 프린터 화면에서 요청된 슬롯을 확인하세요.',
    actions: {
      RESUME_PRINTING: '인쇄 재개',
      RESUME_PRINTING_DEFECTS: '재개 (결함 허용)',
      RESUME_PRINTING_PROBELM_SOLVED: '재개 (문제 해결됨)',
      STOP_PRINTING: '인쇄 중지',
      CHECK_ASSISTANT: '도우미 보기',
      FILAMENT_EXTRUDED: '필라멘트 압출됨, 계속',
      RETRY_FILAMENT_EXTRUDED: '아직 압출되지 않음, 다시 시도',
      CONTINUE: '완료, 계속',
      LOAD_VIRTUAL_TRAY: '필라멘트 로드',
      OK_BUTTON: '확인',
      FILAMENT_LOAD_RESUME: '필라멘트 로드됨, 재개',
      JUMP_TO_LIVEVIEW: '실시간 보기',
      NO_REMINDER_NEXT_TIME: '다음에 알리지 않음',
      REFRESH_NOZZLE: '다시 확인',
      IGNORE_NO_REMINDER_NEXT_TIME: '무시 및 다시 알리지 않음',
      IGNORE_RESUME: '무시하고 재개',
      PROBLEM_SOLVED_RESUME: '문제 해결됨, 재개',
      TURN_OFF_FIRE_ALARM: '확인, 화재 경보 끄기',
      RETRY_PROBLEM_SOLVED: '다시 시도 (문제 해결됨)',
      CANCLE: '취소',
      STOP_DRYING: '건조 중지',
      PROCEED: '계속',
      OK_JUMP_RACK: '확인',
      ABORT: '중단',
      DISABLE_PURIFICATION: '이 인쇄에 대해 공기 정화 비활성화',
      DONT_REMIND_NEXT_TIME: '알리지 않음',
      DBL_CHECK_CANCEL: '취소',
      DBL_CHECK_DONE: '완료',
      DBL_CHECK_RETRY: '다시 시도',
      DBL_CHECK_RESUME: '재개',
      DBL_CHECK_OK: '확인',
      REMOVE_CLOSE_BTN: '닫기',
    },
  },
  mqttDebug: {
    title: 'MQTT 디버그 로그',
    searchPlaceholder: '토픽 또는 페이로드 검색...',
    noMessages: '아직 기록된 메시지 없음',
    startLoggingHint: '"로깅 시작"을 클릭하여 MQTT 메시지 캡처 시작',
    noMessagesMatch: '필터에 일치하는 메시지 없음',
    adjustFilterHint: '검색 또는 필터 기준을 조정해 보세요',
    incoming: '수신',
    outgoing: '송신',
    loggingStopped: '로깅 정지됨',
    loggingActive: '로깅 활성 - 메시지가 자동 새로고침됨',
    startLogging: '로깅 시작',
    stopLogging: '로깅 정지',
    clearLog: '로그 지우기',
    topic: '토픽',
    timestamp: '타임스탬프',
    direction: '방향',
    all: '전체'
  },
  printerFiles: {
    title: '파일 관리자',
    storageUsed: '사용됨:',
    storageFree: '여유:',
    filterPlaceholder: '파일 필터...',
    deleteButton: '삭제',
    deleteFiles: '{{count}}개 파일 삭제',
    deleteFileConfirm: '"{{name}}"을(를) 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.',
    deleteFilesConfirm: '선택된 {{count}}개 파일을 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.',
    noFiles: '프린터에 파일 없음',
    loadingFiles: '파일 로딩 중...',
    failedToLoad: '파일 로드 실패',
    toast: {
      filesDeleted: '{{count}}개 파일이 삭제되었습니다',
      deleteFailed: '삭제 실패: {{error}}'
    }
  },
  confirm: {
    delete: '이것을 삭제하시겠습니까?',
    unsavedChanges: '저장되지 않은 변경사항이 있습니다. 정말 나가시겠습니까?',
    clearQueue: '대기열을 지우시겠습니까?'
  },
  login: {
    title: 'Bambuddy 로그인',
    subtitle: '계정에 로그인하세요',
    username: '사용자명',
    usernamePlaceholder: '사용자명을 입력하세요',
    usernameOrEmail: '사용자명 또는 이메일',
    usernameOrEmailPlaceholder: '사용자명 또는 @ 이메일',
    password: '비밀번호',
    passwordPlaceholder: '비밀번호를 입력하세요',
    signIn: '로그인',
    signingIn: '로그인 중...',
    rememberMe: '로그인 유지',
    forgotPassword: '비밀번호를 잊으셨나요?',
    autologinFailed: 'SSO 자동 로그인에 실패했습니다. 아래에서 계속할 공급자를 선택하세요.',
    localDisabledNotice: '로컬 로그인이 비활성화되어 있습니다. 아래 SSO 공급자 중 하나를 사용하세요.',
    loginSuccess: '성공적으로 로그인되었습니다',
    loginFailed: '로그인 실패',
    enterCredentials: '사용자명과 비밀번호를 입력하세요',
    enterEmail: '이메일 주소를 입력하세요',
    oidcLoginFailed: 'OIDC 로그인 실패',
    oidcErrors: {
      providerError: 'ID 제공자에서 오류가 반환되었습니다',
      missingParameters: 'OIDC 콜백에 필수 매개변수가 없습니다',
      invalidState: 'OIDC 상태가 잘못되었거나 이미 사용되었습니다',
      stateExpired: 'OIDC 로그인 세션이 만료되었습니다 — 다시 시도하세요',
      providerNotFound: 'OIDC 제공자를 찾을 수 없습니다',
      discoveryFailed: 'OIDC 검색 문서를 가져오지 못했습니다',
      invalidDiscovery: 'OIDC 검색 문서가 잘못되었습니다',
      networkError: 'OIDC 토큰 교환 중 네트워크 오류',
      badResponse: 'OIDC 토큰 교환 중 예상치 못한 응답',
      noIdToken: 'OIDC 제공자가 ID 토큰을 반환하지 않았습니다',
      validationFailed: 'OIDC 토큰 검증 실패',
      nonceMismatch: 'OIDC 논스 불일치 — 재생 공격 가능성',
      missingSubClaim: 'OIDC 토큰에 sub 클레임이 없습니다',
      noLinkedAccount: 'OIDC ID에 연결된 로컬 계정이 없습니다',
      accountInactive: '계정이 비활성 상태입니다',
      userResolutionFailed: '계정 확인 실패',
      internalError: 'OIDC 로그인 중 내부 오류 발생',
      tokenExchangeFailed: 'OIDC 토큰 교환 실패'
    },
    forgotPasswordTitle: '비밀번호 찾기',
    forgotPasswordMessage: '비밀번호를 잊으셨다면 시스템 관리자에게 초기화를 요청하세요.',
    forgotPasswordEmailMessage: '이메일 주소를 입력하면 새 비밀번호를 전송해 드립니다.',
    emailAddress: '이메일 주소',
    emailPlaceholder: 'your.email@example.com',
    cancel: '취소',
    sending: '전송 중...',
    sendResetEmail: '초기화 이메일 전송',
    howToReset: '비밀번호 초기화 방법:',
    resetStep1: 'Bambuddy 관리자에게 문의하세요',
    resetStep2: '사용자 관리에서 비밀번호 초기화를 요청하세요',
    resetStep3: '관리자가 임시 비밀번호를 설정해 드립니다',
    resetStep4: '새 비밀번호로 로그인하고 설정에서 변경하세요',
    gotIt: '확인',
    resetPassword: {
      title: '새 비밀번호 설정',
      subtitle: '아래에 새 비밀번호를 입력하고 확인하세요.',
      newPassword: '새 비밀번호',
      newPasswordPlaceholder: '최소 8자',
      confirmPassword: '비밀번호 확인',
      confirmPasswordPlaceholder: '새 비밀번호 반복',
      saving: '저장 중…',
      submit: '새 비밀번호 설정',
      backToLogin: '로그인으로 돌아가기',
      passwordsDoNotMatch: '비밀번호가 일치하지 않습니다',
      passwordTooShort: '비밀번호는 최소 8자여야 합니다',
      resetFailed: '비밀번호 초기화 실패. 링크가 만료되었을 수 있습니다.'
    },
    twoFA: {
      title: '이중 인증',
      subtitle: '계정이 2FA로 보호되어 있습니다. 아래에 인증 코드를 입력하세요.',
      methodAuthenticator: '인증 앱',
      methodEmail: '이메일 코드',
      methodBackup: '백업 코드',
      instructionsTotp: '인증 앱을 열고 Bambuddy의 6자리 코드를 입력하세요.',
      instructionsEmail: '이메일 주소로 6자리 코드가 전송되었습니다. 10분 후 만료됩니다.',
      instructionsEmailNotSent: '아래 버튼을 클릭하여 이메일로 인증 코드를 받으세요.',
      instructionsBackup: '8자리 백업 복구 코드 중 하나를 입력하세요. 각 코드는 한 번만 사용할 수 있습니다.',
      sendCodeButton: '이메일로 코드 전송',
      sendingCode: '전송 중...',
      resendCode: '코드 재전송',
      codeLabel: '인증 코드',
      backupCodeLabel: '백업 코드',
      codePlaceholder: '000000',
      backupCodePlaceholder: 'XXXXXXXX',
      verifyButton: '확인',
      verifyingButton: '확인 중...',
      backToLogin: '← 로그인으로 돌아가기',
      orContinueWith: '또는 계속',
      signInWith: '{{provider}}로 로그인',
      enterCode: '인증 코드를 입력하세요',
      sendCodeFailed: '인증 코드 전송 실패',
      invalidCode: '잘못된 코드입니다. 다시 시도하세요.'
    }
  },
  setup: {
    title: 'Bambuddy 설정',
    subtitle: 'Bambuddy 인스턴스의 인증을 설정하세요',
    enableAuth: '인증 활성화',
    adminAccount: '관리자 계정',
    adminAccountDesc: '관리자 사용자가 이미 있는 경우 기존 관리자 계정으로 인증이 활성화됩니다. 기존 관리자를 사용하려면 아래 필드를 비워두거나, 새 관리자 사용자를 만들려면 자격 증명을 입력하세요.',
    adminUsername: '관리자 사용자명',
    adminPassword: '관리자 비밀번호',
    optionalIfAdminExists: '(관리자 사용자가 있는 경우 선택사항)',
    adminUsernamePlaceholder: '관리자 사용자명 입력 (선택사항)',
    adminPasswordPlaceholder: '관리자 비밀번호 입력 (선택사항)',
    confirmPassword: '비밀번호 확인',
    confirmPasswordPlaceholder: '관리자 비밀번호 확인',
    settingUp: '설정 중...',
    completeSetup: '설정 완료',
    toast: {
      authEnabledAdminCreated: '인증 활성화 및 관리자 사용자 생성됨',
      authEnabledExistingAdmins: '기존 관리자 사용자로 인증 활성화됨',
      setupCompleted: '설정이 완료되었습니다',
      enterBothCredentials: '관리자 사용자명과 비밀번호를 모두 입력하거나, 기존 관리자 사용자를 사용하려면 둘 다 비워두세요',
      passwordsDoNotMatch: '비밀번호가 일치하지 않습니다',
      passwordTooShort: '비밀번호는 최소 6자여야 합니다'
    }
  },
  changePassword: {
    title: '비밀번호 변경',
    currentPassword: '현재 비밀번호',
    currentPasswordPlaceholder: '현재 비밀번호 입력',
    newPassword: '새 비밀번호',
    newPasswordPlaceholder: '새 비밀번호 입력 (최소 6자)',
    confirmPassword: '새 비밀번호 확인',
    confirmPasswordPlaceholder: '새 비밀번호 확인',
    passwordsDoNotMatch: '비밀번호가 일치하지 않습니다',
    passwordTooShort: '비밀번호는 최소 6자여야 합니다',
    changing: '변경 중...',
    success: '비밀번호가 성공적으로 변경되었습니다',
    failed: '비밀번호 변경 실패'
  },
  plateAlert: {
    title: '인쇄 일시정지됨!',
    message: '빌드 플레이트에 객체가 감지되었습니다. 인쇄가 자동으로 일시정지되었습니다. 플레이트를 비우고 인쇄를 재개하세요.',
    understand: '확인했습니다'
  },
  camera: {
    title: '카메라 보기',
    invalidPrinterId: '유효하지 않은 프린터 ID',
    live: '실시간',
    snapshot: '스냅샷',
    restartStream: '스트림 재시작',
    refreshSnapshot: '스냅샷 새로고침',
    fullscreen: '전체 화면',
    exitFullscreen: '전체 화면 종료',
    connectingToCamera: '카메라에 연결 중...',
    capturingSnapshot: '스냅샷 캡처 중...',
    connectionLost: '연결 끊김',
    connectionFailed: '카메라 연결 실패',
    reconnecting: '{{countdown}}초 후 재연결 중... (시도 {{attempt}}/{{max}})',
    reconnectNow: '지금 재연결',
    cameraUnavailable: '카메라를 사용할 수 없음',
    cameraUnavailableDesc: '프린터가 켜져 있고 연결되어 있는지 확인하세요.',
    noCamera: '사용 가능한 카메라 없음',
    retry: '다시 시도',
    cameraStream: '카메라 스트림',
    zoomOut: '축소',
    zoomIn: '확대',
    resetZoom: '배율 초기화',
    recording: '녹화 중',
    startRecording: '녹화 시작',
    stopRecording: '녹화 중지',
    chamberLight: '챔버 조명 전환',
    unavailable: '카메라 사용 불가',
    diagnose: {
      button: '진단',
      modalTitle: '카메라 진단',
      running: '진단 실행 중...',
      runFailed: '진단 실행 실패: {{error}}',
      retry: '다시 실행',
      stage: {
        tcp_reachable: '네트워크 연결 가능 여부',
        first_frame: '프레임 캡처',
        live_stream_active: '라이브 스트림 활성'
      },
      summary: {
        all_ok: '카메라가 정상 작동 중입니다. 모든 단계를 성공적으로 완료했습니다.',
        live_stream_active_healthy: '카메라가 최근 프레임으로 스트리밍 중입니다 — 테스트가 필요 없습니다.',
        printer_unreachable: '프린터에 연결할 수 없습니다. IP 주소, 네트워크 연결, 프린터 전원을 확인하세요.',
        camera_port_closed: '프린터에 연결됐지만 카메라 포트가 닫혀 있습니다. 프린터 설정에서 LAN 전용 모드와 개발자 모드가 활성화되어 있는지 확인하세요.',
        no_frame: '카메라에 연결됐지만 프레임이 수신되지 않았습니다. 다시 시도하거나 프린터 설정에서 카메라가 활성화되어 있는지 확인하세요.',
        unknown_failure: '알 수 없는 이유로 카메라 진단에 실패했습니다. 지원 로그를 확인하세요.'
      },
      meta: {
        protocol: '프로토콜',
        port: '포트',
        profile: '프로파일'
      }
    }
  },
  groups: {
    title: '그룹 관리',
    subtitle: '접근 제어를 위한 권한 그룹 관리',
    backToSettings: '설정으로 돌아가기',
    createGroup: '그룹 생성',
    noPermission: '이 페이지에 접근할 권한이 없습니다.',
    system: '시스템',
    noDescription: '설명 없음',
    usersCount: '{{count}}명의 사용자',
    permissionsCount: '{{count}}개의 권한',
    edit: '편집',
    delete: '삭제',
    toast: {
      created: '그룹이 성공적으로 생성되었습니다',
      updated: '그룹이 성공적으로 업데이트되었습니다',
      deleted: '그룹이 성공적으로 삭제되었습니다',
      enterGroupName: '그룹 이름을 입력해 주세요'
    },
    modal: {
      editGroup: '그룹 편집',
      createGroup: '그룹 생성',
      cancel: '취소',
      saving: '저장 중...',
      creating: '생성 중...',
      saveChanges: '변경 사항 저장'
    },
    form: {
      groupName: '그룹 이름',
      groupNamePlaceholder: '그룹 이름 입력',
      systemGroupWarning: '시스템 그룹 이름은 변경할 수 없습니다',
      description: '설명',
      descriptionPlaceholder: '설명 입력 (선택사항)',
      permissions: '권한 ({{count}}개 선택됨)'
    },
    deleteModal: {
      title: '그룹 삭제',
      message: '이 그룹을 삭제하시겠습니까? 이 그룹의 사용자는 해당 권한을 잃게 됩니다.',
      confirm: '그룹 삭제'
    },
    editor: {
      title: '그룹 편집',
      createTitle: '그룹 생성',
      search: '권한 검색...',
      selectAll: '모두 선택',
      clearAll: '모두 해제',
      permissionsSelected: '{{count}}개 선택됨',
      noResults: '검색과 일치하는 권한이 없습니다',
      websocketHint: '실시간 업데이트에 필요합니다. 이 권한이 없으면 인터페이스는 주기적 폴링으로 대체됩니다.'
    }
  },
  users: {
    title: '사용자 관리',
    subtitle: 'Bambuddy 인스턴스에 대한 사용자 및 접근 권한 관리',
    backToSettings: '설정으로 돌아가기',
    createUser: '사용자 생성',
    noPermission: '이 페이지에 접근할 권한이 없습니다.',
    admin: '관리자',
    noGroups: '그룹 없음',
    active: '활성',
    inactive: '비활성',
    edit: '편집',
    delete: '삭제',
    system: '시스템',
    noGroupsAvailable: '사용 가능한 그룹 없음',
    table: {
      username: '사용자 이름',
      groups: '그룹',
      status: '상태',
      actions: '작업'
    },
    toast: {
      created: '사용자가 성공적으로 생성되었습니다',
      updated: '사용자가 성공적으로 업데이트되었습니다',
      deleted: '사용자가 성공적으로 삭제되었습니다',
      fillRequired: '모든 필수 항목을 입력해 주세요',
      passwordsDoNotMatch: '비밀번호가 일치하지 않습니다',
      passwordTooShort: '비밀번호는 최소 6자 이상이어야 합니다',
      ldapProvisioned: 'LDAP 사용자 "{{username}}"이(가) 생성되었습니다'
    },
    modal: {
      createUser: '사용자 생성',
      editUser: '사용자 편집',
      cancel: '취소',
      creating: '생성 중...',
      saving: '저장 중...',
      saveChanges: '변경 사항 저장',
      advancedAuthSubtitle: '고급 인증 사용',
      tabsAriaLabel: '사용자 소스',
      localTab: '로컬',
      ldapTab: 'LDAP',
      ldapSearchLabel: '디렉터리 검색',
      ldapSearchPlaceholder: '사용자명, 이름, 이메일을 입력하세요...',
      ldapMinChars: '검색하려면 최소 2자 이상 입력하세요',
      ldapTypeToSearch: 'LDAP 디렉터리를 검색하려면 입력을 시작하세요',
      ldapSearching: '디렉터리 검색 중...',
      ldapNoResults: '디렉터리에서 일치하는 사용자가 없습니다',
      ldapSearchError: '디렉터리 검색에 실패했습니다. LDAP 서버 상태를 확인하세요.',
      ldapAlreadyProvisioned: '이미 생성됨',
      ldapSelectedLabel: '선택됨',
      ldapProvision: '사용자 생성',
      ldapProvisioning: '생성 중...',
      ldapErrorProvision: '생성에 실패했습니다. LDAP 서버 상태를 확인하고 다시 시도하세요.'
    },
    form: {
      username: '사용자 이름',
      usernamePlaceholder: '사용자 이름 입력',
      email: '이메일',
      emailPlaceholder: 'user@example.com',
      password: '비밀번호',
      passwordPlaceholder: '비밀번호 입력',
      confirmPassword: '비밀번호 확인',
      confirmPasswordPlaceholder: '비밀번호 확인',
      newPasswordPlaceholder: '새 비밀번호 입력',
      confirmNewPasswordPlaceholder: '새 비밀번호 확인',
      leaveBlankToKeep: '현재 비밀번호 유지 시 비워두기',
      groups: '그룹',
      optional: '선택사항',
      autoGeneratedPassword: '안전한 비밀번호가 자동으로 생성되어 사용자에게 이메일로 전송됩니다.',
      passwordManagedByAdvancedAuth: '비밀번호는 고급 인증에 의해 관리됩니다. "비밀번호 재설정"을 사용하여 이메일로 새 비밀번호를 전송하세요.',
      resetPassword: '비밀번호 재설정',
      resettingPassword: '비밀번호 재설정 중...'
    },
    deleteModal: {
      title: '사용자 삭제',
      message: '이 사용자를 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.',
      confirm: '사용자 삭제'
    }
  },
  streamOverlay: {
    title: '스트림 오버레이',
    invalidPrinterId: '유효하지 않은 프린터 ID',
    cameraStream: '카메라 스트림',
    progress: '진행률',
    eta: '예상 완료',
    printerIdle: '프린터 대기 중',
    printerOffline: '프린터 오프라인',
    builder: {
      title: '스트림 오버레이',
      description: '스트림 오버레이 URL을 만듭니다. 전체 화면 카메라 영상 위에 실시간 출력 정보를 겹쳐 보여주며 OBS, 벽걸이 디스플레이 등 모든 브라우저 소스에서 쓸 수 있습니다. 원하는 항목을 고르고 URL을 복사하세요.',
      printer: '프린터',
      size: '글자 크기',
      sizeSmall: '작게',
      sizeMedium: '보통',
      sizeLarge: '크게',
      fps: '프레임 속도',
      fpsHint: 'A1 및 P1 카메라는 요청한 값과 관계없이 초당 약 5프레임이 한계입니다.',
      token: '스트림 오버레이 토큰(선택)',
      tokenHint: '로그인을 사용할 때만 필요합니다. OBS에는 자체 세션이 없습니다. 위에서 스트림 오버레이 범위로 발급하세요.',
      tokenWarning: '이 URL에는 토큰이 들어 있습니다. URL을 읽을 수 있는 사람은 누구나 영상과 파일 이름을 볼 수 있습니다. 접근을 끊으려면 토큰을 폐기하세요.',
      fields: '표시할 항목',
      fieldPrinter: '프린터 이름',
      fieldFilename: '파일 이름',
      fieldStatus: '상태',
      fieldProgress: '진행률 막대',
      fieldLayers: '레이어 수',
      fieldEta: '남은 시간과 완료 예정 시각',
      fieldCamera: '카메라 영상',
      chamberHint: '챔버 온도는 실제 센서가 있는 모델에서만 표시됩니다. P1과 A1은 의미 없는 값을 보고하므로 제외됩니다.',
      urlTitle: '오버레이 URL',
      open: '열기',
      showPreview: '미리보기 표시',
      hidePreview: '미리보기 숨기기',
      previewTitle: '오버레이 미리보기',
    },
    status: {
      printing: '인쇄 중',
      paused: '일시 중지됨',
      finished: '완료됨',
      failed: '실패',
      idle: '대기 중',
      unknown: '알 수 없음'
    }
  },
  profiles: {
    title: '프로필',
    subtitle: '슬라이서 프리셋 및 압력 전진 보정 관리',
    tabs: {
      bambuCloud: 'Bambu Cloud',
      orcaCloud: 'Orca Cloud',
      local: '로컬 프로필',
      kprofiles: 'K-프로필'
    },
    orcaCloud: {
      connectedAs: '연결됨',
      connectedShort: 'Orca Cloud에 연결됨',
      logout: '연결 해제',
      noLogoutPermission: '연결을 해제할 권한이 없습니다',
      noConnectPermission: 'Orca Cloud에 연결할 권한이 없습니다',
      retry: '다시 시도',
      connectButton: 'Orca Cloud 연결',
      connect: {
        title: 'Orca Cloud에 연결',
        description: 'Orca Cloud 계정에 로그인하여 슬라이서 프로필을 Bambuddy에 동기화하세요.',
      },
      device: {
        title: 'Orca Cloud에서 Bambuddy 승인',
        instruction: 'Orca Cloud를 열고 이 코드를 승인하세요. 승인하면 Bambuddy가 자동으로 연결됩니다.',
        codeLabel: '페어링 코드',
        openButton: 'Orca Cloud 승인 페이지 열기',
        manualHint: '또는 {{url}}(으)로 이동하여 위 코드를 입력하세요.',
        waiting: '승인을 기다리는 중…',
        cancel: '취소',
      },
      profiles: {
        title: 'Orca Cloud 프로필 ({{count}})',
        refresh: '새로고침',
        empty: 'Orca Cloud 계정에 아직 프로필이 없습니다.',
      },
      toast: {
        disconnected: 'Orca Cloud 연결 해제됨',
      },
      errors: {
        startFailed: 'Orca Cloud 로그인 흐름을 시작할 수 없습니다.',
        denied: 'Orca Cloud에서 페어링이 거부되었습니다.',
        expired: '페어링 코드가 만료되었습니다. 연결을 클릭하여 다시 시도하세요.',
        pollFailed: '승인을 기다리는 중 연결이 끊겼습니다. 다시 시도하세요.',
      },
    },
    localProfiles: {
      title: '로컬 프로필',
      subtitle: 'OrcaSlicer에서 슬라이서 프리셋 가져오기 및 관리',
      import: '프로필 가져오기',
      importDesc: '.bbscfg, .bbsflmt, .orca_filament, .zip 또는 .json 파일을 여기에 드롭하세요',
      importing: '가져오는 중...',
      search: '로컬 프리셋 검색...',
      noPresets: '로컬 프리셋 없음',
      badge: '로컬',
      edit: '편집',
      delete: '삭제',
      cancel: '취소',
      deleteConfirmTitle: '프리셋 삭제',
      deleteConfirm: '이 프리셋을 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.',
      source: '출처',
      inheritsFrom: '상속',
      filamentType: '유형',
      vendor: '제조사',
      compatiblePrinters: '프린터',
      nozzleTemp: '노즐 온도',
      cost: '비용',
      density: '밀도',
      pressureAdvance: '압력 전진',
      filament: '필라멘트',
      process: '프로세스',
      printer: '프린터',
      toast: {
        importSuccess: '{{count}}개 프리셋 가져옴',
        importSkipped: '{{count}}개 프리셋 건너뜀 (중복)',
        importError: '가져오기 중 {{count}}개 오류 발생',
        deleted: '프리셋 삭제됨',
        updated: '프리셋 업데이트됨'
      },
      noSearchResults: '검색어와 일치하는 프리셋이 없습니다'
    },
    connectedAs: '연결된 계정',
    signInExpiredTitle: 'Bambu 클라우드 로그인이 만료되었습니다',
    signInExpiredBody: 'Bambu Lab이 저장된 토큰을 더 이상 허용하지 않습니다. 클라우드 프로필, MakerWorld 가져오기, 펌웨어 확인을 복구하려면 다시 로그인하세요.',
    logout: '로그아웃',
    noLogoutPermission: '로그아웃 권한이 없습니다',
    failedToLoad: '프로필 불러오기 실패',
    retry: '다시 시도',
    time: {
      justNow: '방금',
      minsAgo: '{{count}}분 전',
      hoursAgo: '{{count}}시간 전',
      daysAgo: '{{count}}일 전'
    },
    toast: {
      loggedOut: '로그아웃되었습니다'
    },
    login: {
      title: 'Bambu 클라우드 연결',
      subtitle: '기기 간 슬라이서 프리셋 동기화',
      email: '이메일',
      password: '비밀번호',
      region: '지역',
      regionGlobal: '글로벌',
      regionChina: '중국',
      verificationCode: '인증 코드',
      totpCode: '인증앱 코드',
      checkEmail: '이메일({{email}})로 전송된 6자리 코드를 확인하세요',
      enterTotpHint: '인증앱에서 6자리 코드를 입력하세요',
      accessToken: '액세스 토큰',
      accessTokenHint: 'Bambu Studio에서 Bambu Lab 액세스 토큰을 붙여넣으세요',
      back: '뒤로',
      loginButton: '로그인',
      verifyButton: '인증',
      setTokenButton: '토큰 설정',
      useToken: '액세스 토큰 대신 사용',
      captchaTitle: 'Bambu Cloud가 CAPTCHA를 요구합니다',
      captchaBody: 'Bambu가 로그인을 처리하기 전에 네트워크에 CAPTCHA 확인을 요구하고 있으며, 이 확인은 Bambuddy에서 응답할 수 없습니다. 이메일과 비밀번호의 문제가 아닙니다. 차단은 공용 IP 주소에 연결되어 있으며 보통 몇 시간 안에 저절로 풀립니다. 반복해서 재시도하면 오히려 더 오래 지속됩니다. 지금 로그인하려면 브라우저 세션에서 가져온 액세스 토큰을 사용하세요.',
      useEmail: '이메일로 로그인',
      toast: {
        loggedIn: '성공적으로 로그인되었습니다',
        codeSent: '이메일로 인증 코드가 전송되었습니다',
        enterTotp: '인증앱에서 코드를 입력하세요',
        tokenSet: '토큰이 성공적으로 설정되었습니다'
      }
    },
    presets: {
      myPreset: '내 프리셋 (편집 가능)',
      duplicate: '복제',
      editable: '편집 가능',
      failedToLoadDetails: '프리셋 세부 정보 불러오기 실패',
      deleteConfirm: '이 프리셋을 삭제하시겠습니까?',
      deleteWarning: 'Bambu 클라우드에서 "{{name}}"을(를) 영구적으로 삭제합니다. 이 작업은 취소할 수 없습니다.',
      noDuplicatePermission: '프리셋 복제 권한이 없습니다',
      noEditPermission: '프리셋 편집 권한이 없습니다',
      noDeletePermission: '프리셋 삭제 권한이 없습니다',
      types: {
        filament: '필라멘트 프리셋',
        printer: '프린터 프리셋',
        process: '프로세스 프리셋'
      },
      toast: {
        deleted: '프리셋 삭제됨',
        created: '프리셋 생성됨',
        updated: '프리셋 업데이트됨',
        duplicated: '프리셋 복제됨',
        fieldAdded: '"{{key}}" 필드 추가됨',
        exported: '프리셋 내보냄'
      },
      baseLabel: '기본: {{name}}',
      currentLabel: '현재: {{name}}',
      newPreset: '새 프리셋',
      editPreset: '프리셋 편집',
      duplicatePreset: '프리셋 복제',
      createNewPreset: '새 프리셋 생성',
      customizeSettings: '새 프리셋의 설정 사용자 지정',
      compareWithBase: '기본 프리셋과 비교',
      compare: '비교',
      basePreset: '기본 프리셋',
      selectBasePreset: '기본 프리셋 선택...',
      presetName: '프리셋 이름',
      myCustomPreset: '내 사용자 지정 프리셋',
      inheritsFrom: '상속 출처',
      dropJsonToImport: 'JSON 파일을 드롭하여 가져오기',
      tabs: {
        common: '공통',
        allFields: '모든 필드'
      },
      availableFields: '사용 가능한 필드',
      searchFieldsPlaceholder: '필드 검색...',
      noMatchingFields: '일치하는 필드 없음',
      allFieldsAdded: '모든 필드 추가됨',
      addCustomField: '사용자 지정 필드 추가',
      yourOverrides: '내 재정의',
      noOverridesYet: '아직 재정의 없음',
      clickFieldsToAdd: '왼쪽 필드를 클릭하여 추가',
      saveAsTemplate: '템플릿으로 저장',
      jsonTip: '팁: 이 모달 어디서나 .json 파일을 드래그 앤 드롭하여 설정을 가져올 수 있습니다'
    },
    cloudView: {
      searchPlaceholder: '프리셋 검색...',
      templates: '템플릿',
      refresh: '새로고침',
      newPreset: '새 프리셋',
      clearFilters: '필터 초기화',
      compareMode: '비교 모드',
      selectAnotherPreset: '다른 {{type}} 프리셋 선택',
      clickTwoPresets: '같은 유형의 프리셋 두 개를 클릭하여 비교',
      selectFirst: '1. 첫 번째 선택',
      selectSecond: '2. 두 번째 선택',
      compareNow: '지금 비교',
      lastSynced: '마지막 동기화:',
      showingCount: '{{total}}개 중 {{showing}}개 표시',
      noPresetsFound: '프리셋을 찾을 수 없음',
      columns: {
        filament: '필라멘트',
        process: '프로세스',
        printer: '프린터'
      },
      noFilamentPresets: '필라멘트 프리셋 없음',
      noProcessPresets: '프로세스 프리셋 없음',
      noPrinterPresets: '프린터 프리셋 없음',
      filters: {
        type: '유형',
        owner: '소유자',
        printer: '프린터',
        nozzle: '노즐',
        filament: '필라멘트',
        layer: '레이어',
        all: '전체',
        myPresets: '내 프리셋',
        builtIn: '기본 제공',
        process: '프로세스'
      },
      noTemplatesPermission: '템플릿 관리 권한이 없습니다',
      noRefreshPermission: '프로필 새로고침 권한이 없습니다',
      noCreatePermission: '프리셋 생성 권한이 없습니다'
    },
    templates: {
      title: '빠른 템플릿',
      noTemplates: '아직 템플릿 없음',
      createFirst: '프리셋 편집기에서 템플릿을 생성하세요',
      typeFilter: '유형:',
      deleteTitle: '템플릿 삭제',
      deleteWarning: '이 작업은 취소할 수 없습니다',
      deleteConfirm: '"{{name}}"을(를) 삭제하시겠습니까?',
      namePlaceholder: '템플릿 이름',
      descriptionPlaceholder: '설명',
      settingsJson: '설정 (JSON)',
      fieldsCount: '{{count}}개 필드',
      shownInModals: '모달에 표시됨',
      hiddenInModals: '모달에서 숨겨짐',
      apply: '적용',
      toast: {
        deleted: '템플릿 삭제됨',
        updated: '템플릿 업데이트됨',
        created: '템플릿 생성됨',
        applied: '템플릿 적용됨'
      }
    }
  },
  support: {
    debugLoggingActive: '디버그 로깅이 활성화되어 있습니다',
    manageLogs: '관리',
    collectItem7: '프린터 연결 및 펌웨어 버전',
    collectItem8: '통합 상태 (Spoolman, MQTT, HA)',
    collectItem9: '네트워크 인터페이스 (서브넷만)',
    collectItem10: 'Python 패키지 버전',
    collectItem11: '데이터베이스 상태 확인',
    collectItem12: 'Docker 환경 세부 정보',
    bundleGenerating: '번들 생성 중...',
    bundleStepConnection: '프린터 연결 확인 실행 중',
    bundleStepVirtualPrinters: '가상 프린터 설정 확인 실행 중',
    bundleStepLogScan: '알려진 문제가 있는지 최근 로그 스캔 중',
    bundleStepBuild: '지원 번들 ZIP 빌드 중'
  },
  fileManager: {
    variants: {
      badge: '버전 {{count}}개',
      groupAction: '버전으로 그룹화',
      groupTooltip: '이 파일들을 서로 다른 프린터용으로 슬라이스한 동일 작업으로 표시합니다',
      grouped: '파일 {{count}}개를 버전으로 그룹화했습니다',
      printAlternatives: '인쇄 (대안 {{count}}개)',
    },
    title: '파일 관리자',
    subtitle: '인쇄 파일 정리 및 관리',
    uploadFiles: '파일 업로드',
    newFolder: '새 폴더',
    folderName: '폴더 이름',
    folderNamePlaceholder: '예: 기능성 부품',
    renameFile: '파일 이름 바꾸기',
    renameFolder: '폴더 이름 바꾸기',
    invalidFilenameChar: '"{{char}}" 문자는 인쇄 파일 이름에 허용되지 않습니다. 프린터 SD 카드가 거부하는 문자: < > : " / \\ | ? *',
    moveFiles: '{{count}}개 파일 이동',
    rootNoFolder: '루트 (폴더 없음)',
    current: '현재',
    linkFolder: '폴더 연결',
    linkFolderDescription: '"{{name}}"을(를) 프로젝트 또는 아카이브에 연결하여 빠른 접근.',
    project: '프로젝트',
    archive: '아카이브',
    noProjectsFound: '프로젝트를 찾을 수 없음',
    noArchivesFound: '아카이브를 찾을 수 없음',
    unlink: '연결 해제',
    link: '연결',
    dragDropFiles: '파일을 여기에 드래그 앤 드롭',
    dropFilesHere: '파일을 여기에 드롭',
    releaseToUpload: '놓아서 업로드',
    orClickToBrowse: '또는 클릭하여 탐색',
    allFileTypesSupported: '모든 파일 형식 지원. ZIP 파일은 압축 해제됩니다.',
    zipFilesDetected: 'ZIP 파일 감지됨',
    zipExtractOptions: 'ZIP 파일이 압축 해제됩니다. 폴더 구조 처리 방법을 선택하세요:',
    preserveZipStructure: 'ZIP에서 폴더 구조 유지',
    createFolderFromZip: 'ZIP 파일 이름으로 폴더 생성',
    stlThumbnailGeneration: 'STL 썸네일 생성',
    zipMayContainStl: 'ZIP 파일에 STL 파일이 포함될 수 있습니다. 압축 해제 중 썸네일을 생성할 수 있습니다.',
    thumbnailsCanBeGenerated: 'STL 파일의 썸네일을 생성할 수 있습니다. 대형 모델은 처리 시간이 더 걸릴 수 있습니다.',
    generateThumbnailsForStl: 'STL 파일의 썸네일 생성',
    threemfDetected: '3MF 파일 감지됨',
    threemfExtractionInfo: '프린터 모델, 재료, 색상 및 인쇄 설정이 3MF 파일에서 자동으로 추출됩니다.',
    willBeExtracted: '추출 예정',
    filesExtracted: '{{count}}개 파일 추출됨',
    uploadComplete: '업로드 완료: {{succeeded}}개 성공',
    uploadFailed: '업로드 실패',
    zipFilesFailed: '{{count}}개 파일 실패',
    uploading: '업로드 중...',
    changeLink: '링크 변경...',
    linkTo: '연결 대상...',
    linkToProjectOrArchive: '프로젝트 또는 아카이브에 연결',
    generateThumbnail: '썸네일 생성',
    generateThumbnails: '썸네일 생성',
    generateThumbnailsForMissing: '썸네일이 없는 STL 파일의 썸네일 생성',
    gridView: '격자 보기',
    listView: '목록 보기',
    lowDiskSpaceWarning: '디스크 공간 부족 경고',
    lowDiskSpaceDetails: '전체 {{total}} 중 {{free}}만 남음. 임계값은 설정에서 {{threshold}}GB로 설정됩니다.',
    files: '파일',
    folders: '폴더',
    size: '크기',
    free: '여유',
    allFiles: '모든 파일',
    allExternal: '외부',
    externalIsEmpty: '외부 파일 없음',
    externalEmptyDescription: '연결된 외부 폴더의 파일이 여기에 표시됩니다.',
    wrap: '줄 바꿈',
    enableTextWrapping: '텍스트 줄 바꿈 활성화',
    disableTextWrapping: '텍스트 줄 바꿈 비활성화',
    collapse: '접기',
    collapseFoldersByDefault: '기본적으로 폴더 접기',
    expandFoldersByDefault: '기본적으로 폴더 펼치기',
    folderSort: '폴더 정렬',
    folderSortByName: '이름순',
    folderSortByActivity: '최근 활동순',
    dragToResizeTooltip: '드래그하여 크기 조정, 더블클릭하여 초기화',
    searchFiles: '파일 검색...',
    searchSubfoldersHint: '하위 폴더 포함',
    readme: {
      truncated: '잘림',
      show: 'README 표시',
      hide: 'README 숨기기',
      label: 'README',
    },
    tags: {
      title: '태그',
      subtitle: '파일에 가로지르는 필터용 라벨을 붙이세요 — 장난감, 어린이용, PETG 전용 등.',
      manage: '태그',
      manageTitle: '태그 카탈로그 관리',
      add: '새 태그',
      edit: '태그 이름 변경',
      name: '이름',
      fileCount: '파일',
      empty: '아직 태그가 없습니다. 만들어서 파일에 라벨을 붙이세요.',
      noMatches: '일치하는 태그가 없습니다.',
      createPlaceholder: '예: 장난감, 어린이용, petg',
      createButton: '만들기',
      nameRequired: '이름은 필수입니다.',
      searchPlaceholder: '태그 필터...',
      created: '태그가 만들어졌습니다.',
      updated: '태그 이름이 변경되었습니다.',
      deleted: '태그가 제거되었습니다.',
      saveFailed: '태그를 저장할 수 없습니다.',
      deleteFailed: '태그를 제거할 수 없습니다.',
      applyFailed: '태그를 적용할 수 없습니다.',
      applyAdd: '태그 추가',
      applyRemove: '태그 제거',
      applyAddSuccess: '{{files}}개 파일에 태그 {{count}}개를 추가했습니다.',
      applyRemoveSuccess: '{{files}}개 파일에서 태그 {{count}}개를 제거했습니다.',
      actionAdd: '선택한 파일에 추가',
      actionRemove: '선택한 파일에서 제거',
      tagAction: '태그',
      bulkTitle: '선택한 {{count}}개 파일에 태그 지정',
      bulkTooltip: '선택한 모든 파일에 태그를 추가하거나 제거합니다.',
      noPermission: '파일에 태그를 붙일 권한이 없습니다.',
      filterLabel: '필터:',
      clearAll: '모두 지우기',
      confirmDelete: '태그 "{{name}}"을(를) 삭제하시겠습니까?',
      confirmDeleteMessage: '카탈로그에서 태그를 제거합니다. 파일과 다른 태그는 그대로 유지됩니다.',
      confirmDeleteInUseMessage: '이 태그는 {{count}}개 파일에 있습니다. 삭제하면 모든 파일에서 칩이 사라지지만 파일 자체는 변경되지 않습니다.',
      editAria: '{{name}} 편집',
      deleteAria: '{{name}} 삭제',
    },
    allTypes: '모든 유형',
    prints: '인쇄물',
    ascending: '오름차순',
    descending: '내림차순',
    showModified: '수정 날짜 표시',
    hideModified: '수정 날짜 숨기기',
    lastModified: '마지막 수정',
    lastActivity: '마지막 활동',
    resultsCount: '전체 {{total}}개 중 {{showing}}개',
    selectAll: '모두 선택',
    deselectAll: '모두 선택 해제',
    selected: '{{count}}개 선택됨',
    adding: '추가 중...',
    loadingFiles: '파일 불러오는 중...',
    folderIsEmpty: '폴더가 비어 있음',
    noFilesYet: '파일 없음',
    folderEmptyDescription: '파일을 업로드하거나 이 폴더로 이동하여 시작하세요.',
    noFilesDescription: '파일을 업로드하여 인쇄 관련 파일을 정리하세요.',
    noMatchingFiles: '일치하는 파일 없음',
    noMatchingFilesDescription: '현재 검색 또는 필터 조건과 일치하는 파일이 없습니다.',
    clearFilters: '필터 초기화',
    printedCount: '{{count}}회 인쇄됨',
    uploadedBy: '업로드한 사람',
    deleteFolder: '폴더 삭제',
    deleteFile: '파일 삭제',
    deleteFilesCount: '{{count}}개 파일 삭제',
    deleteFolderConfirm: '이 폴더를 삭제하시겠습니까? 안의 모든 파일도 삭제됩니다.',
    deleteFileConfirm: '이 파일을 삭제하시겠습니까?',
    deleteFilesConfirm: '선택한 {{count}}개 파일을 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.',
    deleting: '삭제 중...',
    noPermissionRenameFolder: '폴더 이름 변경 권한이 없습니다',
    noPermissionLinkFolder: '폴더 연결 권한이 없습니다',
    noPermissionDeleteFolder: '폴더 삭제 권한이 없습니다',
    onlyEmptyFoldersDeletable: '빈 폴더만 삭제할 수 있습니다',
    noPermissionPrint: '인쇄 권한이 없습니다',
    noPermissionAddToQueue: '대기열 추가 권한이 없습니다',
    noPermissionSlice: '파일 슬라이싱 권한이 없습니다',
    noPermissionDownload: '파일 다운로드 권한이 없습니다',
    noPermissionRenameFile: '파일 이름 변경 권한이 없습니다',
    noPermissionGenerateThumbnail: '썸네일 생성 권한이 없습니다',
    noPermissionDeleteFile: '파일 삭제 권한이 없습니다',
    noPermissionCreateFolder: '폴더 생성 권한이 없습니다',
    noPermissionUpload: '파일 업로드 권한이 없습니다',
    noPermissionMoveFiles: '파일 이동 권한이 없습니다',
    noPermissionDeleteFiles: '파일 삭제 권한이 없습니다',
    linkExternal: '외부 연결',
    linkExternalFolder: '외부 폴더 연결',
    linkExternalFolderDescription: '호스트 디렉토리(NAS, USB, 네트워크 공유)를 파일 관리자에 마운트합니다. 파일은 복사되지 않고 원래 경로에서 직접 접근합니다.',
    externalFolderNamePlaceholder: '예: NAS 인쇄물',
    externalPath: '호스트 경로',
    externalPathHelp: 'Docker 호스트의 디렉토리 절대 경로. 컨테이너에 바인드 마운트되어야 합니다.',
    readOnly: '읽기 전용',
    readOnlyHelp: '업로드 및 삭제 방지',
    showHiddenFiles: '숨김 파일 표시 (dotfiles)',
    externalFolder: '외부 폴더',
    scanFolder: '스캔',
    toast: {
      folderCreated: '폴더 생성됨',
      openInSlicerFailed: '슬라이서에서 열 수 없습니다',
      folderDeleted: '폴더 삭제됨',
      fileDeleted: '파일 삭제됨',
      filesDeleted: '{{count}}개 파일 삭제됨',
      filesMoved: '파일 이동됨',
      folderLinked: '폴더 연결됨',
      folderUnlinked: '폴더 연결 해제됨',
      externalFolderLinked: '외부 폴더 연결 및 스캔됨',
      folderScanned: '스캔 완료: {{added}}개 추가, {{removed}}개 제거',
      addedToQueue: '{{count}}개 파일을 대기열에 추가함',
      addedToQueuePartial: '{{added}}개 추가됨, {{failed}}개 실패',
      failedToAddToQueue: '파일 추가 실패: {{error}}',
      fileRenamed: '파일 이름 변경됨',
      folderRenamed: '폴더 이름 변경됨',
      thumbnailsGenerated: '{{count}}개 썸네일 생성됨',
      thumbnailsGeneratedPartial: '{{succeeded}}개 썸네일 생성됨, {{failed}}개 실패',
      noStlMissingThumbnails: '썸네일이 없는 STL 파일 없음',
      failedToGenerateThumbnails: '썸네일 생성 실패: {{error}}',
      thumbnailGenerated: '썸네일 생성됨',
      failedToGenerateThumbnail: '썸네일 생성 실패: {{error}}'
    }
  },
  projects: {
    parentLabel: '상위 프로젝트',
    parentNone: '없음 (최상위 프로젝트)',
    parentHint: '이 프로젝트를 다른 프로젝트 아래에 두면 수치가 마스터 프로젝트로 합산됩니다',
    partOf: '{{name}}의 일부',
    subProjectCount: '하위 프로젝트 {{count}}개',
    subProjectsOf: '{{name}}의 하위 프로젝트',
    title: '프로젝트',
    subtitle: '3D 인쇄 프로젝트 정리 및 추적',
    newProject: '새 프로젝트',
    editProject: '프로젝트 편집',
    deleteProject: '프로젝트 삭제',
    projectName: '프로젝트 이름',
    description: '설명',
    noProjects: '프로젝트 없음',
    noProjectsFiltered: '{{status}} 프로젝트 없음',
    noProjectsFilteredHelp: '{{status}} 프로젝트가 없습니다. 상태가 변경되면 여기에 표시됩니다.',
    createFirst: '첫 번째 프로젝트를 만들어 관련 인쇄물을 정리하고 진행 상황을 추적하며 빌드를 관리하세요.',
    createFirstButton: '첫 번째 프로젝트 만들기',
    create: '만들기',
    files: '파일',
    prints: '인쇄물',
    plates: '플레이트',
    parts: '부품',
    lastModified: '마지막 수정',
    deleteConfirm: '이 프로젝트를 삭제하시겠습니까? 아카이브 및 대기열 항목은 연결 해제되지만 삭제되지는 않습니다.',
    addFiles: '파일 추가',
    removeFile: '파일 제거',
    viewDetails: '세부 정보 보기',
    namePlaceholder: '예: Voron 2.4 빌드',
    descriptionPlaceholder: '선택적 설명...',
    urlLabel: 'URL',
    urlPlaceholder: 'https://makerworld.com/...',
    urlInvalid: 'URL은 http:// 또는 https://로 시작해야 합니다',
    openExternalUrl: '프로젝트 URL 열기',
    coverImageLabel: '커버 사진',
    coverImageAlt: '프로젝트 커버 사진',
    coverImageUpload: '업로드',
    coverImageReplace: '교체',
    coverImageRemove: '제거',
    color: '색상',
    targetPlates: '목표 플레이트',
    targetPlatesPlaceholder: '예: 25',
    targetPlatesHelp: '인쇄 작업 수',
    targetParts: '목표 부품',
    targetPartsPlaceholder: '예: 150',
    targetPartsHelp: '필요한 총 개체 수',
    targetSets: '파일당 복사본 수',
    targetSetsPlaceholder: '예: 10',
    targetSetsHelp: '각 인쇄 가능한 파일을 인쇄할 횟수',
    tagsLabel: '태그 (쉼표로 구분)',
    tagsPlaceholder: '예: voron, 기능성, 선물',
    dueDate: '마감일',
    priority: '우선순위',
    priorityLow: '낮음',
    priorityNormal: '보통',
    priorityHigh: '높음',
    priorityUrgent: '긴급',
    statusActive: '활성',
    statusCompleted: '완료됨',
    statusArchived: '보관됨',
    done: '완료',
    completed: '완료됨',
    failed: '실패',
    inQueue: '대기 중',
    noPrintsYet: '인쇄물 없음',
    printJobs: '인쇄 작업 (플레이트)',
    partsPrinted: '인쇄된 부품',
    failedParts: '실패한 부품',
    import: '가져오기',
    export: '내보내기',
    importProject: '프로젝트 가져오기',
    exportAll: '모든 프로젝트 내보내기',
    loading: '프로젝트 불러오는 중...',
    noEditPermission: '프로젝트 편집 권한이 없습니다',
    noDeletePermission: '프로젝트 삭제 권한이 없습니다',
    noCreatePermission: '프로젝트 생성 권한이 없습니다',
    noImportPermission: '프로젝트 가져오기 권한이 없습니다',
    noExportPermission: '프로젝트 내보내기 권한이 없습니다',
    toast: {
      created: '프로젝트 생성됨',
      updated: '프로젝트 업데이트됨',
      deleted: '프로젝트 삭제됨',
      imported: '프로젝트 가져옴',
      multipleImported: '{{count}}개 프로젝트 가져옴',
      importFailed: '가져오기 실패',
      exported: '프로젝트 내보냄 (메타데이터만)'
    }
  },
  projectDetail: {
    notFound: '프로젝트를 찾을 수 없음',
    backToProjects: '프로젝트로 돌아가기',
    export: '내보내기',
    exportProject: '프로젝트 내보내기',
    noExportPermission: '프로젝트 내보내기 권한이 없습니다',
    noEditPermission: '프로젝트 편집 권한이 없습니다',
    partOf: '속한 프로젝트:',
    priorityLabel: '우선순위:',
    noPrints: '이 프로젝트에 아직 인쇄물이 없습니다',
    status: {
      active: '활성',
      completed: '완료됨',
      archived: '보관됨'
    },
    priority: {
      low: '낮음',
      normal: '보통',
      high: '높음',
      urgent: '긴급'
    },
    dueDate: {
      overdue: '기한 초과',
      today: '오늘 마감',
      daysLeft: '{{count}}일 남음'
    },
    progress: {
      platesProgress: '플레이트 진행률',
      partsProgress: '부품 진행률',
      setsProgress: '완성된 세트',
      sets: '세트',
      setsHint: '모든 인쇄 가능한 파일이 이 횟수에 도달하면 세트가 완성됩니다',
      printJobs: '인쇄 작업',
      parts: '부품',
      percentComplete: '{{percent}}% 완료',
      remaining: '{{count}}개 남음'
    },
    stats: {
      printJobs: '인쇄 작업',
      total: '합계',
      failed: '{{count}}개 실패',
      partsPrinted: '{{count}}개 부품 인쇄됨',
      printTime: '인쇄 시간',
      filamentUsed: '사용된 필라멘트'
    },
    cost: {
      title: '비용 추적',
      filamentCost: '필라멘트 비용',
      energy: '에너지',
      totalCost: '총 비용',
      total: '합계',
      includesBom: 'BOM 포함',
      budget: '예산',
      remaining: '남은 예산'
    },
    subProjects: {
      title: '하위 프로젝트 ({{count}})',
      jobs: '작업 {{count}}개',
    },
    rollup: {
      title: '하위 프로젝트 {{count}}개 포함',
      progress: '전체 진행률',
      percentComplete: '{{percent}}% 완료',
    },
    notes: {
      title: '메모',
      noEditPermission: '메모 편집 권한이 없습니다',
      placeholder: '이 프로젝트에 대한 메모 추가...',
      empty: '아직 메모가 없습니다. 편집을 클릭하여 메모를 추가하세요.'
    },
    files: {
      title: '파일',
      linkFolders: '파일 관리자에서 폴더 연결',
      forQuickAccess: '빠른 접근을 위해 이 프로젝트에 연결합니다.',
      fileCount: '{{count}}개 파일',
      empty: '연결된 폴더가 없습니다. 파일 관리자로 이동하여 폴더를 이 프로젝트에 연결하세요.',
      printedCount: '{{count}}회 인쇄됨',
      progressTooltip: '{{target}}회 중 {{done}}회 인쇄 완료',
      noFiles: '이 폴더에 파일이 없습니다.'
    },
    bom: {
      title: '부품 목록',
      acquired: '{{total}}개 중 {{completed}}개 확보',
      showAll: '전체 표시',
      hideDone: '완료된 것 숨기기',
      addPart: '부품 추가',
      noAddPermission: '부품 추가 권한이 없습니다',
      partNamePlaceholder: '부품 이름 (예: M3x8 나사)',
      partName: '부품 이름',
      qty: '수량',
      price: '가격 ({{currency}})',
      sourcingUrlPlaceholder: '구매 URL (선택사항)',
      remarksPlaceholder: '비고 (선택사항)',
      deletePart: '부품 삭제',
      deleteConfirm: '"{{name}}"을(를) 삭제하시겠습니까?',
      noUpdatePermission: '부품 업데이트 권한이 없습니다',
      noEditPermission: '부품 편집 권한이 없습니다',
      noDeletePermission: '부품 삭제 권한이 없습니다',
      totalCost: '총 비용:',
      empty: '부품 목록에 부품이 없습니다. 하드웨어, 전자 부품 또는 기타 구성품을 추가하여 조달이 필요한 것을 추적하세요.'
    },
    timeline: {
      title: '활동 타임라인',
      empty: '아직 활동이 없습니다.'
    },
    template: {
      saveAsTemplate: '템플릿으로 저장',
      noCreatePermission: '템플릿 생성 권한이 없습니다'
    },
    queue: {
      title: '대기열',
      viewAll: '전체 보기',
      printing: '{{count}}개 인쇄 중',
      queued: '{{count}}개 대기 중'
    },
    prints: {
      title: '인쇄물 ({{count}})'
    },
    toast: {
      projectUpdated: '프로젝트 업데이트됨',
      partAdded: '부품 추가됨',
      partRemoved: '부품 제거됨',
      exportFailed: '내보내기 실패',
      projectExported: '프로젝트 내보냄',
      templateCreated: '템플릿 생성됨'
    }
  },
  system: {
    title: '시스템 정보',
    version: '버전',
    uptime: '가동 시간',
    cpuUsage: 'CPU 사용량',
    memoryUsage: '메모리 사용량',
    diskUsage: '디스크 사용량',
    networkInfo: '네트워크 정보',
    logs: '로그',
    debugMode: '디버그 모드',
    enableDebug: '디버그 로깅 활성화',
    disableDebug: '디버그 로깅 비활성화',
    downloadLogs: '로그 다운로드',
    clearLogs: '로그 초기화',
    dockerInfo: 'Docker 정보',
    containerName: '컨테이너 이름',
    imageName: '이미지 이름',
    platform: '플랫폼',
    architecture: '아키텍처'
  },
  sponsors: {
    sectionTitle: '독립적·커뮤니티 후원',
    tagline: 'Bambuddy는 무료이며, 자발적으로 후원하는 사용자 덕분에 계속 무료로 유지됩니다. VC도 없고, 클라우드 종속도 없습니다.',
    viewSupporters: '후원자 보기',
    toastPrints: 'Bambuddy로 {{count}}회 인쇄를 완료했습니다. Bambuddy는 후원자 덕분에 무료로 유지됩니다.',
    toastCost: 'Bambuddy로 {{total}}만큼의 필라멘트를 추적했습니다. 프로젝트를 독립적으로 유지하는 사람들을 만나보세요.',
    toastArchives: 'Bambuddy로 {{count}}회 인쇄를 아카이브했습니다. 독립성을 지지하는 사람들을 만나보세요.',
    toastAnniversary: 'Bambuddy와 함께한 지 1년입니다! 프로젝트를 독립적으로 유지하는 사람들을 만나보세요.',
    toastVersionUpdate: 'v{{version}}로 업데이트되었습니다. Bambuddy는 후원자 덕분에 무료로 유지됩니다.',
    toastBusiness: '프린터 {{count}}대에서 Bambuddy를 운영 중이신가요? 팀을 위한 지원 플랜이 있습니다. 우선 수정, 인보이스 발행, 메인테이너와의 직접 소통을 제공합니다.',
    businessCta: '비즈니스용 Bambuddy',
    businessTitle: '비즈니스용 Bambuddy',
    businessTagline: '프린터 {{count}}대를 운영 중입니다. 팀과 프린트 팜을 위한 우선 지원, 상용 라이선스, 인보이스 발행을 제공합니다.',
  },
  library: {
    title: '필라멘트 라이브러리',
    addFilament: '필라멘트 추가',
    editFilament: '필라멘트 편집',
    deleteFilament: '필라멘트 삭제',
    vendor: '제조사',
    material: '재료',
    color: '색상',
    kFactor: 'K 계수',
    temperature: '온도',
    noFilaments: '라이브러리에 필라멘트 없음',
    deleteConfirm: '이 필라멘트를 삭제하시겠습니까?',
    importFromPrinter: '프린터에서 가져오기',
    exportToFile: '파일로 내보내기',
    runWithPipeline: {
      actionLabel: '파이프라인으로 실행',
      noPermission: '파이프라인을 실행할 권한이 없습니다',
      modalTitle: '파이프라인으로 실행',
      confirmTitle: '실행 확인',
      confirmIntro: '사전 점검에서 이 실행과 관련된 문제를 발견했습니다',
      sourceHint: '소스',
      pipelineHint: '파이프라인',
      targetHint: '대상',
      pipelineListAria: '사용 가능한 파이프라인',
      runAnyway: '그래도 실행',
      loading: '불러오는 중…',
      empty: '저장된 파이프라인이 없습니다. 슬라이스 대화상자를 열고 "파이프라인으로 저장"을 클릭하여 생성하세요.',
      noTarget: '대상 프린터가 설정되지 않음',
      noTargetMessage: '이 파이프라인에는 대상 프린터가 없습니다. 설정에서 열어 선택하세요.',
      copies: '사본 수',
      copiesHint: '최대 {{n}}',
      classTarget: '임의의 {{model}}',
      toast: {
        started: '파이프라인 실행 시작됨',
        failed: '실행을 시작할 수 없습니다',
      },
      issue: {
        printerNotSet: '이 파이프라인에 대상 프린터가 설정되어 있지 않습니다.',
        printerNotFound: '대상 프린터가 더 이상 존재하지 않습니다.',
        printerDisabled: '대상 프린터가 비활성화되어 있습니다.',
        printerOffline: '대상 프린터가 오프라인입니다.',
        filamentType: '필라멘트 슬롯 {{slot}}: 예상 {{expected}}, AMS 실제 {{actual}}',
        filamentColor: '필라멘트 슬롯 {{slot}}: 색상이 다릅니다 (예상 {{expected}}, AMS {{actual}})',
        amsSlotMissing: 'AMS 슬롯 {{slot}}이(가) 이 프린터에서 사용 불가',
        filamentUnverified: '필라멘트 슬롯 {{slot}}은(는) 클라우드/표준 프리셋이며 정적으로 검증할 수 없습니다.',
        noClassMatches: '이 설치에서 파이프라인의 대상 모델 클래스({{expected}})와 일치하는 프린터가 없습니다.',
        classNotSet: '파이프라인 대상이 프린터 클래스로 설정되었지만 모델이 선택되지 않았습니다.',
      },
    },
  },
  slicerSettings: {
    presetValuesOutdatedSidecar: '슬라이서 기본값을 표시합니다. 슬라이서 사이드카가 이 기능보다 오래되어 프리셋 값을 가져올 수 없습니다. 값을 보려면 사이드카 이미지를 업데이트하세요. 변경하지 않은 항목은 계속 프리셋 값을 사용합니다.',
    presetValuesNotConfigured: '슬라이서 기본값을 표시합니다. 슬라이서 사이드카가 설정되지 않아 프리셋 값을 읽을 수 없습니다. 변경하지 않은 항목은 계속 프리셋 값을 사용합니다.',
    presetValuesSidecarUnavailable: '슬라이서 기본값을 표시합니다. 슬라이서 사이드카가 응답하지 않아 프리셋 값을 읽을 수 없습니다. 변경하지 않은 항목은 계속 프리셋 값을 사용합니다.',
    presetValuesUnavailable: '슬라이서 기본값을 표시합니다. 선택한 프리셋의 값을 읽을 수 없었습니다. 변경하지 않은 항목은 계속 프리셋 값을 사용합니다.',
    filamentDefault: '기본값',
    fromFile: '파일에서',
    fromFileHint: '디자이너가 원본 파일에서 이 항목을 변경했습니다. 값은 {{value}}입니다.',
    fromFilePrinterCoupled: '디자이너의 프린터',
    fromFilePrinterCoupledHint: '이 파일이 설계된 프린터에 맞춘 값입니다. 사용 중인 프린터에서는 잘못되거나 범위를 벗어날 수 있습니다.',
    useFromFile: '{{option}}에 원본 파일의 값 사용',
    otherFromFile: '이 파일의 기타 설정',
    loading: '슬라이서 설정을 불러오는 중…',
    mode: {
      simple: '간단',
      advanced: '고급',
      expert: '전문가',
    },
    searchPlaceholder: '설정 검색',
    resetAll: '{{count}}개 초기화',
    resetOption: '기본값으로 되돌리기',
    noMatches: '검색과 일치하는 설정이 없습니다.',
  },
  slice: {
    filamentSlotUnset: '미설정',
    processSettingsEmbedded: "'파일에 포함된 설정 사용'이 켜져 있는 동안에는 사용되지 않습니다. 이 슬라이스는 파일 자체의 설정을 따릅니다.",
    processSettingsInactive: '비활성',
    presetsHidden: '{{count}}개 숨김',
    showAllPresets: '모두 표시',
    showFewerPresets: '간략히 표시',
    processSettings: '프로세스 설정',
    processSettingsHint: '이 슬라이스에 사용할 프리셋을 조정합니다. 건드리지 않은 항목은 프리셋 정의를 그대로 따릅니다.',
    processSettingsChanged: '{{count}}개 변경됨',
    processSettingsUnchanged: '프리셋 기본값',
    title: '모델 슬라이싱',
    action: '슬라이싱',
    slicing: '슬라이싱 중…',
    printer: '프린터 프로필',
    process: '프로세스 프로필',
    filament: '필라멘트 프로필',
    filamentSlot: '필라멘트 {{index}} ({{type}})',
    selectPreset: '— 프리셋 선택 —',
    loadingPresets: '프리셋 불러오는 중…',
    analyzingPlateFilaments: '플레이트 필라멘트 분석 중…',
    analyzingPlateFilamentsHint: '이 플레이트가 사용하는 AMS 슬롯을 확인하기 위해 미리보기 슬라이싱을 실행합니다. 캐시 후에는 재오픈이 즉각적입니다.',
    previewToast: '{{name}} 분석 중 — {{elapsed}}',
    previewWithProgress: '{{name}} 분석 중 — {{stage}} ({{percent}}%) — {{elapsed}}',
    notUsedByPlate: '— 이 플레이트에서 사용되지 않음',
    noPresetsForSlot: '사용 가능한 프리셋 없음',
    presetsLoadFailed: '프리셋 불러오기 실패. 먼저 설정 → 프로필에서 가져오세요.',
    refreshPresets: '새로 고침',
    refreshPresetsTitle: '프리셋 새로 고침 — 최신 클라우드 및 번들 목록 가져오기 (Bambu Studio 또는 Bambu Handy에서 프리셋 삭제 후 사용)',
    allPresetsRequired: '모든 프리셋을 선택해야 합니다',
    useEmbedded: '파일에 포함된 설정 사용',
    useEmbeddedHint: '위 프로필 대신 디자이너가 설정한 대로(벽, 내부 채움, 필라멘트) 슬라이싱합니다. 프린터가 파일과 일치하여 사용할 수 있습니다.',
    autoOrient: '개체 방향 자동 조정',
    autoOrientHint: '슬라이싱하기 전에 각 개체를 출력하기 좋은 면으로 회전시킵니다. 파일에 저장된 방향을 덮어씁니다.',
    autoArrange: '플레이트에 자동 배치',
    autoArrangeHint: '개체가 겹치지 않도록 슬라이서가 다시 배치합니다. 파일의 배치를 대체합니다.',
    enqueuing: '슬라이싱 작업 제출 중…',
    queued: '대기 중…',
    failed: '슬라이싱 실패. 슬라이서 사이드카 로그를 확인하세요.',
    startedToast: '백그라운드에서 {{name}} 슬라이싱 중…',
    queuedToast: '대기 중: {{name}} — {{elapsed}}',
    runningToast: '{{name}} 슬라이싱 중 — {{elapsed}}',
    runningWithProgress: '{{name}} — {{stage}} ({{percent}}%) — {{elapsed}}',
    completedToast: '{{name}} 슬라이싱 완료',
    externalWriteFallbackToast: '내부 라이브러리에 저장했습니다: 외부 폴더에 쓸 수 없습니다',
    failedToast: '{{name}} 슬라이싱 실패: {{detail}}',
    tier: {
      local: '가져온 것',
      cloud: 'Bambu Cloud',
      orcaCloud: 'Orca Cloud',
      standard: '표준'
    },
    cloud: {
      notAuthenticated: '클라우드 프리셋을 보려면 Bambu Cloud에 로그인하세요 (설정 → 프로필 → Bambu Cloud).',
      expired: 'Bambu Cloud 세션이 만료되었습니다 — 다시 로그인하여 클라우드 프리셋을 새로고침하세요.',
      unreachable: '현재 Bambu Cloud에 연결할 수 없습니다. 로컬 및 표준 프리셋은 계속 작동합니다.'
    },
    orcaCloud: {
      notAuthenticated: 'Orca 프리셋을 보려면 Orca Cloud (프로필 → Orca Cloud)에 로그인하세요.',
      expired: 'Orca Cloud 세션이 만료되었습니다 — Orca 프리셋을 새로고침하려면 다시 로그인하세요.',
      unreachable: 'Orca Cloud에 현재 연결할 수 없습니다. 다른 프리셋은 계속 작동합니다.'
    },
    actionAll: '{{count}}개 플레이트 모두 슬라이싱',
    actionAllTitle: '모든 플레이트를 단일 다중 플레이트 출력으로 슬라이싱합니다 (단일 아카이브). 필라멘트 선택은 프로젝트가 정의하는 모든 슬롯을 포함합니다.',
    allPlatesToggle: '{{count}}개 플레이트 모두 슬라이싱',
    otherPrinters: '다른 프린터',
    runningWithProgressMultiPlate: '플레이트 {{plateIndex}}/{{plateCount}} • {{name}} — {{stage}} ({{percent}}%) — {{elapsed}}',
    failedTitle: '슬라이싱 실패',
    bedType: {
      label: '빌드 플레이트',
      auto: '자동 (프로세스 프리셋 사용)',
      coolPlate: '쿨 플레이트',
      coolPlateSuperTack: '쿨 플레이트 슈퍼택',
      engineering: '엔지니어링 플레이트',
      highTemp: '고온 플레이트',
      texturedPEI: '텍스처 PEI 플레이트',
      smoothPEI: '매끄러운 PEI 플레이트'
    },
    // Slicer Pipelines (#1425) — apply a saved bundle or save the current pick.
    pipelines: {
      label: '파이프라인',
      applyAria: '파이프라인 적용',
      applyPrompt: '파이프라인 적용…',
      empty: '저장된 파이프라인이 없습니다',
      saveButton: '파이프라인으로 저장',
      saveTitle: '현재 네 개 슬롯의 선택을 재사용 가능한 파이프라인으로 저장합니다',
      namePlaceholder: '파이프라인 이름',
      nameAria: '새 파이프라인 이름',
      toast: {
        applied: '"{{name}}" 적용됨',
        saved: '파이프라인이 저장되었습니다',
        saveFailed: '저장 실패',
      },
    },
  },
  spoolman: {
    title: 'Spoolman 통합',
    enabled: 'Spoolman 활성화됨',
    url: 'Spoolman URL',
    connected: '연결됨',
    disconnected: '연결되지 않음',
    testConnection: '연결 테스트',
    sync: '동기화',
    syncing: '동기화 중...',
    lastSync: '마지막 동기화',
    linkToSpoolman: 'Spoolman에 연결',
    openInSpoolman: 'Spoolman에서 열기',
    unlinkSpool: '스풀 연결 해제',
    unlinkConfirmTitle: '스풀 할당 해제?',
    unlinkConfirmMessage: '이 슬롯에서 스풀을 제거합니다. 스풀 데이터 자체는 변경되지 않습니다.',
    selectSpool: '스풀 선택',
    noUnlinkedSpools: '할당되지 않은 스풀 없음',
    linkSuccess: '스풀이 성공적으로 할당되었습니다',
    linkFailed: '스풀 할당 실패',
    unlinkSuccess: '스풀이 성공적으로 할당 해제되었습니다',
    unlinkFailed: '스풀 할당 해제 실패',
    linkedSpool: '할당된 스풀',
    spoolId: '스풀 ID',
    fillSourceLabel: '(Spoolman)',
    weight: '무게',
    remaining: '남은 양',
    disableWeightSync: 'AMS 예상 무게 동기화 비활성화',
    disableWeightSyncDesc: 'AMS 추정치에서 남은 용량을 업데이트하지 않습니다. AMS 백분율 기반 추정 대신 Spoolman의 사용량 추적을 선호하는 경우 사용하세요. 새 스풀은 여전히 AMS 추정치를 초기 무게로 사용합니다.',
    reportPartialUsage: '실패한 인쇄물에 대한 부분 사용량 보고',
    reportPartialUsageDesc: '인쇄가 실패하거나 취소될 때 레이어 진행률을 기반으로 해당 시점까지 사용된 예상 필라멘트를 보고합니다.'
  },

  locations: {
    title: '보관 위치',
    subtitle: '스풀의 선반, 서랍 등 물리적 보관 장소를 관리합니다',
    add: '위치 추가',
    addShort: '추가',
    edit: '위치 편집',
    name: '이름',
    spools: '스풀',
    empty: '아직 보관 위치가 없습니다. 첫 번째 선반이나 서랍을 만드세요.',
    manage: '위치',
    createPlaceholder: '예: 선반 A, 서랍 1',
    nameRequired: '위치 이름은 필수입니다',
    created: '위치가 생성되었습니다',
    updated: '위치가 업데이트되었습니다',
    deleted: '위치가 삭제되었습니다',
    saveFailed: '위치 저장에 실패했습니다',
    deleteFailed: '위치 삭제에 실패했습니다',
    deleteBlocked: '삭제하기 전에 이 위치의 모든 스풀을 옮기세요',
    confirmDelete: '"{{name}}"을(를) 삭제하시겠습니까?',
    confirmDeleteMessage: '이 위치가 카탈로그에서 제거됩니다. 스풀을 먼저 옮겨야 합니다.',
  },

  inventory: {
    title: '스풀 재고',
    addToInventory: '인벤토리에 추가',
    addToInventoryPending: '추가 중...',
    addToInventorySuccess: '스풀이 인벤토리에 추가됨',
    addToInventoryFailed: '스풀을 인벤토리에 추가하지 못함',
    unknownSpoolTitle: '새 필라멘트 감지됨',
    unknownSpoolMessage: '{{location}}에서 알 수 없는 RFID 태그가 있는 스풀이 감지되었습니다. 지금 인벤토리에 추가하시겠습니까?',
    unknownSpoolSlot: '슬롯',
    bulk: {
      selectAllVisible: '표시된 항목 모두 선택',
      selectRow: '행 선택',
      selectGroup: '그룹 선택',
      selectionCount: '{{count}}개 선택됨',
      edit: '편집',
      printLabels: '라벨 인쇄',
      resetUsage: '사용량 재설정',
      restore: '복원',
      archive: '보관',
      delete: '삭제',
      clearSelection: '선택 해제',
      editTitle: '스풀 일괄 편집',
      editSubtitle: '선택한 {{count}}개의 스풀에 적용됩니다. 체크한 필드만 업데이트됩니다.',
      editHint: '필드에 입력하면 업데이트할 항목으로 표시됩니다 — 체크된 행만 전송됩니다. 빈 필드는 스풀을 변경하지 않습니다 (필드 비우기는 개별 스풀에서만 가능).',
      useCustom: '"{{value}}" 사용',
      toggleField: '이 필드의 업데이트 전환',
      changeCount: '{{count}}개의 필드가 업데이트됩니다.',
      applyPending: '적용 중...',
      applyButton: '{{count}}개에 적용',
      deleteTitle: '선택한 스풀 삭제',
      archiveTitle: '선택한 스풀 보관',
      restoreTitle: '선택한 스풀 복원',
      resetUsageTitle: '선택한 스풀의 사용량 재설정',
      deleteMessage: '{{count}}개의 스풀을 영구적으로 삭제하시겠습니까? 되돌릴 수 없습니다.',
      archiveMessage: '{{count}}개의 스풀을 보관하시겠습니까? 나중에 복원할 수 있습니다.',
      restoreMessage: '{{count}}개의 보관된 스풀을 복원하시겠습니까?',
      resetUsageMessage: '{{count}}개의 스풀에서 "총 사용량" 카운터를 재설정하시겠습니까? 남은 무게는 보존됩니다.',
      updateSuccess: '{{count}}개의 스풀 업데이트됨',
      updateFailed: '일괄 업데이트 실패',
      updatePartial: '{{ok}}개 업데이트, {{failed}}개 실패',
      updateAllFailed: '{{count}}개의 업데이트가 모두 실패했습니다 — 재시도를 위해 선택이 유지됩니다',
      deleteSuccess: '{{count}}개의 스풀 삭제됨',
      deleteFailed: '일괄 삭제 실패',
      deletePartial: '{{ok}}개 삭제, {{failed}}개 실패',
      deleteAllFailed: '{{count}}개의 삭제가 모두 실패했습니다 — 재시도를 위해 선택이 유지됩니다',
      archiveSuccess: '{{count}}개의 스풀 보관됨',
      archiveFailed: '일괄 보관 실패',
      archivePartial: '{{ok}}개 보관, {{failed}}개 실패',
      archiveAllFailed: '{{count}}개의 보관이 모두 실패했습니다 — 재시도를 위해 선택이 유지됩니다',
      restoreSuccess: '{{count}}개의 스풀 복원됨',
      restoreFailed: '일괄 복원 실패',
      restorePartial: '{{ok}}개 복원, {{failed}}개 실패',
      restoreAllFailed: '{{count}}개의 복원이 모두 실패했습니다 — 재시도를 위해 선택이 유지됩니다',
      invalidHex: '16진수 6자(RRGGBB) 또는 8자(RRGGBBAA)를 입력하세요. 그렇지 않으면 필드가 적용되지 않습니다.',
    },
    spoolmanMixedContentTitle: 'HTTPS에서 Spoolman을 불러올 수 없음 — 브라우저가 혼합 콘텐츠를 차단함',
    spoolmanMixedContentBody: 'Bambuddy가 HTTPS로 서비스되고 있지만 Spoolman URL은 여전히 HTTP입니다. 브라우저는 보안상 혼합 콘텐츠를 차단하므로 내장된 Spoolman UI가 렌더링되지 않습니다. 이 기능이 작동하려면 Spoolman이 HTTPS로 접근 가능해야 합니다.',
    spoolmanMixedContentFixReverseProxy: 'Spoolman을 Bambuddy와 같은 리버스 프록시(Traefik / Nginx / Caddy) 뒤에 HTTPS로 배치한 다음 설정에서 Spoolman URL을 새 HTTPS 주소로 업데이트하세요.',
    spoolmanMixedContentFixOpenNewTab: '임시 방편으로 HTTP로 새 브라우저 탭에서 Spoolman을 여세요 — 혼합 콘텐츠 규칙은 내장 프레임에만 적용되므로 독립 탭은 여전히 작동합니다.',
    spoolmanOpenInNewTab: '새 탭에서 Spoolman 열기',
    labels: {
      title: '스풀 라벨 인쇄',
      selectedCount: '{{count}}개 선택됨',
      pickSpools: '라벨을 인쇄할 스풀 선택:',
      monochrome: '흑백 (흑백 프린터)',
      monochromeHint: '색상 견본을 제거하고 텍스트를 넓힙니다',
      searchPlaceholder: '이름, 브랜드 또는 #ID 검색',
      filterByMaterial: '재료:',
      allMaterials: '전체',
      selectVisible: '보이는 모든 항목 선택 ({{count}})',
      deselectVisible: '보이는 항목 선택 해제',
      clearAll: '모두 초기화',
      noSpoolsToShow: '표시할 스풀이 없습니다. 필터를 조정하고 다시 시도하세요.',
      noMatches: '현재 검색 또는 필터와 일치하는 스풀이 없습니다.',
      printOne: '이 스풀의 라벨 인쇄',
      printLabels: '라벨 인쇄…',
      bulkTitle: '현재 표시된 {{count}}개에서 라벨을 인쇄할 스풀 선택',
      noSpoolsTitle: '라벨을 붙일 스풀 없음',
      error: '라벨을 생성할 수 없습니다: {{msg}}',
      templates: {
        box40x30: {
          label: '박스 라벨 (40 × 30 mm)',
          hint: '페이지당 단일 라벨; 일반 DK/Brother 롤 크기, 필라멘트 가방 및 보관함 라벨에 적합.'
        },
        box: {
          label: '박스 라벨 (62 × 29 mm)',
          hint: '페이지당 단일 라벨; Brother PT/QL 및 Dymo 소형 라벨에 맞는 크기.'
        },
        averyL7160: {
          label: 'Avery L7160 — A4 시트 (38.1 × 63.5 mm × 21)',
          hint: 'EU 시트; A4 페이지당 21개 라벨.'
        },
        avery5160: {
          label: 'Avery 5160 — US Letter 시트 (25.4 × 66.7 mm × 30)',
          hint: 'US 시트; Letter 페이지당 30개 라벨.'
        },
        amsHolderSmall: {
          label: 'AMS 홀더 — 소형 (74 × 33 mm)',
          hint: '페이지당 단일 레이블; MakerWorld 모델 752566 (AMS 필라멘트 레이블 홀더)의 인쇄 가능 레이블과 일치합니다.'
        },
        amsHolderLarge: {
          label: 'AMS 홀더 — 대형 (75 × 55 mm)',
          hint: '페이지당 단일 레이블; AMS 필라멘트 레이블 홀더의 카드스톡 삽입 변형에 맞습니다. 스와치, 브랜드, 재질, ID, QR 코드에 충분한 공간이 있습니다.'
        }
      },
      sortBy: {
        label: '정렬:',
        id: 'ID 순',
        color: '색상 순'
      }
    },
    csv: {
      importButton: 'CSV 가져오기',
      exportButton: 'CSV 내보내기',
      modalTitle: 'CSV에서 스풀 가져오기',
      selectFile: 'CSV 파일을 선택하거나 여기로 끌어다 놓으세요',
      dragHint: '헤더: material(필수), brand, subtype, color_name, rgba, …',
      parsing: '파일을 읽는 중…',
      previewError: 'CSV 파일을 읽을 수 없습니다',
      validCount: '유효 {{count}}개',
      errorCount: '오류 {{count}}개',
      skippedCount: '건너뜀 {{count}}개',
      colRow: '행',
      colStatus: '상태',
      colColor: '색상',
      colorResolved: '카탈로그에서 색상 채움',
      colorCrossMaterial: '다른 재료에서 색상을 가져옴 — 카탈로그에 정확히 일치하는 항목 없음',
      duplicateExisting: '이 재료, 브랜드, 색상의 스풀이 이미 존재합니다 — 그래도 새 스풀로 가져옵니다',
      spoolmanHint: 'Spoolman 모드에서는 Spoolman의 기본 CSV 가져오기/내보내기를 사용하세요.',
      importValidRows: '유효한 {{count}}개 행 가져오기',
      noValidRows: '유효한 행 없음',
      importing: '가져오는 중…',
      importSuccess: '{{count}}개 스풀을 가져왔습니다',
      importError: '가져오기 실패',
      exportError: '내보내기 실패',
    },
    addSpool: '스풀 추가',
    editSpool: '스풀 편집',
    copySpool: '스풀 복사',
    material: '재료',
    selectMaterial: '재료 선택...',
    subtype: '하위 유형',
    brand: '브랜드',
    searchBrand: '브랜드 검색...',
    useCustomBrand: '"{{brand}}" 사용',
    useCustomMaterial: '사용자 지정 재료 사용: {{material}}',
    suggestedOptions: '추천',
    allOptions: '전체',
    colorName: '색상 이름',
    colorNamePlaceholder: '제이드 화이트, 파이어 레드...',
    color: '색상',
    hexColor: '16진수 색상',
    pickColor: '사용자 지정 색상 선택',
    labelWeight: '라벨 무게',
    coreWeight: '빈 스풀 무게',
    searchSpoolWeight: '스풀 무게 검색...',
    weightUsed: '사용됨',
    currentWeight: '남은 무게',
    measuredWeight: '측정된 무게',
    spoolName: '스풀',
    costPerKg: 'kg당 비용',
    storageLocation: '보관 위치',
    storageLocationPlaceholder: '예: 선반 A, 서랍 1',
    openInInventory: '재고에서 열기',
    measuredWeightError: '측정된 무게는 {{min}}g과 {{max}}g 사이여야 합니다.',
    slicerFilament: '슬라이서 필라멘트',
    slicerFilamentName: '슬라이서 프리셋 이름',
    slicerPreset: '슬라이서 프리셋',
    searchPresets: '필라멘트 프리셋 검색...',
    selectedPreset: '선택됨',
    noPresetsFound: '프리셋을 찾을 수 없음',
    tempOverrides: '온도 재정의',
    note: '메모',
    notePlaceholder: '이 스풀에 대한 추가 메모...',
    category: '카테고리',
    categoryPlaceholder: '예: 생산, 프로토타입, 고객 A',
    categoryNone: '미분류',
    lowStockThresholdOverride: '재고 부족 임계값 (이 스풀)',
    lowStockThresholdOverrideHelp: '전역 임계값({{global}}%)을 사용하려면 비워두세요.',
    clearRfid: 'RFID 태그 초기화',
    rfidCleared: 'RFID 태그가 초기화되었습니다',
    archive: '보관',
    restore: '복원',
    noSpools: '아직 스풀이 없습니다. 첫 번째 스풀을 추가하여 시작하세요.',
    noAvailableSpools: '사용 가능한 스풀이 없습니다. 재고에 스풀을 추가하거나 먼저 다른 슬롯에서 해제하세요.',
    kProfiles: 'K-프로필',
    addKProfile: 'K-프로필 추가',
    assignSpool: '스풀 할당',
    unassignSpool: '할당 해제',
    assignSuccess: '스풀 할당 및 AMS 슬롯 구성됨',
    assignPendingInsert: '할당됨. 스풀을 삽입하면 슬롯이 구성됩니다.',
    assignFailed: '스풀 할당 실패',
    selectSpool: '이 슬롯에 할당할 스풀 선택',
    assigned: '할당됨',
    assigning: '할당 중...',
    searchSpools: '스풀 검색...',
    showAllSpools: '모든 스풀 표시',
    spoolmanSpools: 'Spoolman 스풀',
    allMaterials: '모든 재료',
    filterByBrand: '브랜드로 필터...',
    showArchived: '보관된 항목 표시',
    quickAdd: '빠른 추가 (재고)',
    quantity: '수량',
    stock: '재고',
    configured: '구성됨',
    spoolsCreated: '{{count}}개 스풀 생성됨',
    spoolsPartiallyCreated: '{{total}}개 중 {{created}}개 스풀 생성됨 (일부 실패)',
    spoolCreated: '스풀 생성됨',
    spoolUpdated: '스풀 업데이트됨',
    spoolDeleted: '스풀 삭제됨',
    deepLinkSpoolNotFound: '스풀을 찾을 수 없음',
    deepLinkFetchFailed: '스풀을 불러올 수 없음 — 다시 시도하세요',
    spoolArchived: '스풀 보관됨',
    spoolRestored: '스풀 복원됨',
    kProfileSaveFailed: 'K-프로필 설정을 저장할 수 없습니다',
    syncWeightSpoolNotFound: '스풀을 찾을 수 없음 — 삭제되었을 수 있습니다',
    syncWeightSpoolmanUnreachable: 'Spoolman에 연결할 수 없음 — 나중에 다시 시도하세요',
    syncWeightFailed: '무게 동기화 실패',
    spoolmanUnreachable: 'Spoolman에 연결할 수 없습니다 — 나중에 다시 시도하세요',
    deleteSpoolNotFound: '스풀을 찾을 수 없음 — 이미 삭제되었을 수 있습니다',
    deleteFailed: '스풀 삭제 실패',
    archiveSpoolNotFound: '스풀을 찾을 수 없음 — 이미 삭제되었을 수 있습니다',
    archiveFailed: '스풀 보관 실패',
    restoreSpoolNotFound: '스풀을 찾을 수 없음 — 이미 삭제되었을 수 있습니다',
    restoreFailed: '스풀 복원 실패',
    saveFailed: '변경 사항 저장 실패',
    tagClearFailed: '태그 초기화 실패',
    deleteConfirm: '이 스풀을 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.',
    archiveConfirm: '이 스풀을 보관하시겠습니까?',
    advancedSettings: '고급 설정',
    filamentInfoTab: '필라멘트 정보',
    paProfileTab: 'PA 프로필',
    filamentInfo: '필라멘트',
    additional: '추가',
    loadingPresets: '클라우드 프리셋 불러오는 중...',
    cloudConnected: '클라우드 연결됨',
    cloudNotConnected: '클라우드 연결되지 않음 (기본값 사용)',
    recentColors: '최근',
    searchColors: '색상 검색...',
    searchResults: '검색 결과',
    allColors: '모든 색상',
    commonColors: '일반 색상',
    showLess: '간략히 보기',
    showAll: '모두 보기',
    noColorsFound: '검색과 일치하는 색상 없음',
    noResults: '일치하는 항목 없음',
    extraColorsLabel: '추가 색상',
    extraColorsPlaceholder: 'EC984C,#6CD4BC,A66EB9,D87694',
    extraColorsHint: '2~8개의 16진수 색상값을 쉼표로 구분하여 붙여넣으세요. 그라데이션으로 렌더링됩니다.',
    extraColorsInvalid: '유효하지 않은 16진수 무시됨: {{tokens}}',
    colorEffectLabel: '효과',
    colorEffect: {
      none: '없음',
      sparkle: '스파클',
      wood: '우드',
      marble: '마블',
      glow: '글로우',
      matte: '매트',
      silk: '실크',
      galaxy: '갤럭시',
      rainbow: '레인보우',
      metal: '메탈',
      translucent: '반투명',
      gradient: '그라데이션',
      dualColor: '듀얼 컬러',
      triColor: '트리 컬러',
      multicolor: '멀티컬러'
    },
    selectMaterialFirst: '먼저 필라멘트 정보 탭에서 재료를 선택해 주세요.',
    noPrintersConfigured: '구성된 프린터 없음. PA 프로필을 사용하려면 프린터를 추가하세요.',
    matchingFilter: '일치',
    anyBrand: '모든 브랜드',
    anyVariant: '모든 변형',
    autoSelect: '자동 선택',
    matches: '일치',
    match: '일치',
    noMatches: '일치 없음',
    connected: '연결됨',
    offline: '오프라인',
    printerOffline: '프린터가 오프라인입니다. 연결하여 보정 프로필을 확인하세요.',
    noKProfilesMatch: '선택한 필라멘트와 일치하는 K-프로필이 없습니다.',
    leftNozzle: '왼쪽 노즐',
    rightNozzle: '오른쪽 노즐',
    profilesSelected: '보정 프로필 선택됨',
    totalInventory: '총 재고',
    totalConsumed: '총 소비량',
    byMaterial: '재료별',
    inPrinter: '프린터 내',
    lowStock: '재고 부족',
    sinceTracking: '추적 시작 이후',
    loadedInAms: 'AMS/외부에 장착됨',
    remaining: '남은 양',
    weightCheck: '무게 확인',
    lastWeighed: '마지막 계량',
    neverWeighed: '계량 기록 없음',
    search: '스풀 검색...',
    showing: '표시 중',
    to: '~',
    of: '/',
    show: '표시',
    spools: '스풀',
    spool: '스풀',
    page: '페이지',
    noSpoolsMatch: '결과를 찾을 수 없음',
    noSpoolsMatchDesc: '검색 또는 필터를 조정하여 원하는 항목을 찾아보세요.',
    active: '활성',
    archived: '보관됨',
    all: '전체',
    used: '사용됨',
    new: '새것',
    clearFilters: '필터 초기화',
    table: '테이블',
    cards: '카드',
    net: '순',
    groupSimilar: '그룹화',
    groupedSpools: '동일한 스풀 {{count}}개',
    groupedRows: '행',
    columns: '열',
    configureColumns: '열 구성',
    configureColumnsDesc: '드래그하여 열 순서를 변경하거나 화살표를 사용하세요. 눈 아이콘으로 표시 여부를 전환합니다.',
    visible: '표시됨',
    reset: '초기화',
    cancel: '취소',
    applyChanges: '변경 사항 적용',
    moveUp: '위로 이동',
    moveDown: '아래로 이동',
    hideColumn: '열 숨기기',
    showColumn: '열 표시',
    linkToSpool: '스풀에 연결',
    tagLinked: '태그가 스풀에 연결됨',
    tagLinkFailed: '태그 연결 실패',
    tagAlreadyLinked: '태그가 이미 다른 스풀에 연결됨',
    unknownTag: '알 수 없는 RFID 태그 감지됨',
    usageHistory: '사용 기록',
    noUsageHistory: '사용 기록 없음',
    printName: '인쇄 이름',
    weightConsumed: '소비 무게',
    clearHistory: '초기화',
    historyCleared: '사용 기록 초기화됨',
    fillSourceLabel: '(재고)',
    lowStockThresholdError: '임계값은 0.1에서 99.9 사이여야 합니다',
    assignMismatchTitle: '재료 불일치',
    assignMismatchMessage: '선택한 스풀 재료 "{{spoolMaterial}}"이(가) {{location}}의 트레이 재료 "{{trayMaterial}}"과(와) 일치하지 않습니다. 그래도 할당하시겠습니까?',
    assignMismatchConfirm: '그래도 할당',
    assignPartialMismatchMessage: '스풀 재료 "{{spoolMaterial}}"이(가) {{location}}의 "{{trayMaterial}}"과(와) 유사하지만 정확히 일치하지 않습니다. 계속하시겠습니까?',
    assignProfileMismatchMessage: '스풀 프로필 "{{spoolProfile}}"이(가) {{location}}의 트레이 프로필 "{{trayProfile}}"과(와) 일치하지 않습니다. 계속하시겠습니까?',
    assignReconfigureNote: 'AMS 슬롯이 스풀의 프로필을 사용하도록 재구성됩니다.',
    spoolmanFilamentCatalog: 'Spoolman 필라멘트 카탈로그',
    pickFromSpoolmanCatalog: 'Spoolman 카탈로그에서 선택…',
    spoolmanFilamentSelected: 'Spoolman 카탈로그에서 필라멘트 선택됨',
    spoolmanFilamentUnlinked: '필라멘트 카탈로그 연결 해제됨',
    noSpoolmanFilaments: 'Spoolman 카탈로그에서 필라멘트를 찾을 수 없음',
    spoolmanFilamentColorSwatch: '필라멘트 색상',
    spoolWeightManagedBySpoolman: '빈 스풀 무게는 Spoolman에서 필라멘트 유형별로 관리됩니다',
    spoolmanCatalogLoadFailed: 'Spoolman 필라멘트 카탈로그 불러오기 실패',
    subtitle: '스풀 관리',
    storageLocationNone: '위치 미설정',
    resetConsumedCounter: '카운터 초기화',
    resetConsumedCounterTooltip: '이 스풀의 소비된 그램 카운터를 0으로 초기화합니다. 잔여 무게는 변경되지 않습니다.',
    resetConsumedCounterConfirm: '이 스풀의 소비된 그램 카운터를 0으로 초기화하시겠습니까? 이후 인쇄는 처음부터 추적됩니다. 스풀 자체, 잔여 무게 계산 및 설정은 변경되지 않습니다.',
    resetAllConsumedCounters: '모든 카운터 초기화',
    resetAllConsumedCountersTooltip: '모든 스풀의 소비된 그램 카운터를 0으로 초기화합니다. 잔여 무게는 변경되지 않습니다.',
    resetAllConsumedCountersConfirm: '{{count}}개 스풀(아카이브 포함)의 소비된 그램 카운터를 모두 0으로 초기화하시겠습니까? 이는 "총 소비량" 통계를 지워 이후 인쇄가 처음부터 추적되도록 합니다. 스풀과 잔여 무게는 변경되지 않습니다.',
    consumedCounterReset: '카운터가 초기화되었습니다',
    allConsumedCountersReset: '{{count}}개 스풀의 카운터가 초기화되었습니다',
    resetConsumedCounterFailed: '카운터 초기화 실패'
  },
  timelapse: {
    title: '타임랩스',
    create: '타임랩스 만들기',
    download: '다운로드',
    delete: '삭제',
    preview: '미리보기',
    frameRate: '프레임 속도',
    quality: '품질',
    processing: '처리 중...',
    noTimelapses: '사용 가능한 타임랩스 없음'
  },
  ams: {
    title: 'AMS',
    slot: '슬롯',
    empty: '비어 있음',
    emptySlot: '빈 슬롯',
    unknown: '알 수 없음',
    humidity: '습도',
    temperature: '온도',
    filamentType: '필라멘트 유형',
    filamentColor: '색상',
    remaining: '남은 양',
    history: 'AMS 기록',
    noHistory: '기록 없음',
    configureSlot: '슬롯 구성',
    externalSpool: '외부 스풀',
    profile: '프로필',
    kFactor: 'K 계수',
    fill: '채우기',
    configure: '구성',
    used: '사용됨',
    remainingUnit: '남음',
    slotEmpty: '비어 있음',
    slotUnconfigured: '?',
    emptySlotReset: '필라멘트가 할당되지 않음'
  },
  printModal: {
    variants: {
      editNote: '이 대안은 대기열에 추가할 때 정해집니다. 변경하려면 취소 후 다시 추가하세요.',
      title: '프린터 대안',
      help: '작업 하나, 대기열 한 자리. 조건이 맞는 프린터 중 먼저 비는 프린터가 해당 파일을 인쇄합니다.',
      unknownModel: '알 수 없는 모델',
      plateFor: '{{filename}}의 플레이트',
      moveUp: '위로',
      moveDown: '아래로',
      queued: '대안 {{count}}개와 함께 대기열에 추가했습니다',
    },
    selectPrinter: '프린터 선택',
    selectPlate: '플레이트 선택',
    filamentMapping: '필라멘트 매핑',
    useArchiveMapping: '매핑',
    useArchiveMappingTooltip: '유형/색상으로 매칭하는 대신, 이 아카이브에 저장된 AMS 매핑(슬라이서 제공)에서 모든 슬롯을 선택합니다.',
    clickToChangeSlot: '클릭하여 슬롯 할당 변경',
    reRead: '다시 읽기',
    plateN: '플레이트 {{n}}',
    plateFilamentsUnreadable: '선택한 플레이트의 필라멘트를 읽을 수 없어 매핑할 수 없습니다. 해당 플레이트를 선택 해제하면 나머지를 대기열에 추가할 수 있습니다.',
    totalCost: '총 비용:',
    slotRemainingShort: ' - {{grams}}g 남음',
    printSettings: '인쇄 설정',
    bedLeveling: '베드 레벨링',
    flowCalibration: '유량 보정',
    vibrationCalibration: '진동 보정',
    layerInspection: '첫 번째 레이어 검사',
    timelapse: '타임랩스',
    cancel: '취소',
    noPrintersAvailable: '사용 가능한 프린터 없음',
    printerBusy: '프린터가 사용 중입니다',
    printerOffline: '프린터가 오프라인입니다',
    sameTypeDifferentColor: '같은 유형, 다른 색상',
    filamentTypeNotLoaded: '필라멘트 유형이 장착되지 않음',
    whenToPrint: '인쇄 시점',
    asap: '최대한 빨리',
    queue: '대기열',
    schedule: '예약',
    dateTime: '날짜 및 시간',
    invalidDateTime: '유효한 날짜와 시간을 입력하세요',
    openCalendar: '달력 열기',
    requireManualStart: '수동 시작 필요',
    requirePreviousSuccess: '이전 인쇄가 성공한 경우에만 시작',
    autoOffAfter: '완료 후 프린터 전원 끄기',
    helpAsap: '인쇄가 대기열 맨 앞에 추가되고 적합한 프린터가 유휴 상태가 되는 즉시 시작됩니다.',
    helpSchedule: '프린터가 유휴 상태이면 예약된 시간에 인쇄가 시작됩니다. 사용 중이면 프린터가 사용 가능해질 때까지 대기합니다.',
    helpQueue: '인쇄가 대기열 맨 뒤에 추가됩니다.',
    leftNozzle: 'L',
    rightNozzle: 'R',
    leftNozzleTooltip: '왼쪽 노즐',
    rightNozzleTooltip: '오른쪽 노즐',
    rackPosition: '랙 위치',
    rackPositionTooltip: '이 필라멘트를 출력할 랙의 노즐입니다. 위치 번호는 프린터와 동일합니다.',
    rackEmptyPosition: '이 랙 위치는 비어 있습니다',
    rackWrongNozzle: '{{has}} 노즐이 장착되어 있습니다. 이 필라멘트에는 {{needs}}이(가) 필요합니다',
    filamentOverride: '필라멘트 재정의',
    filamentOverrideHint: '선택적으로 모델 기반 할당을 위해 필라멘트를 재정의합니다. 스케줄러는 원래 3MF 값 대신 선택한 필라멘트와 일치시킵니다.',
    originalFilament: '원래',
    overrideWith: '재정의',
    resetToOriginal: '원래대로 초기화',
    insufficientFilamentTitle: '필라멘트 부족',
    waitingForAmsStatus: '{{printer}}의 AMS 상태를 기다리는 중…',
    insufficientFilamentMessage: '일부 할당된 스풀에 이 인쇄에 필요한 것보다 적은 필라멘트가 남아 있습니다:',
    insufficientFilamentLine: '{{printer}} - {{slot}}: {{required}}g 필요, {{remaining}}g 남음',
    insufficientFilamentLinePooled: '{{printer}} - {{slot}}: {{required}}g 필요, 일치하는 스풀 합계 {{remaining}}g (AMS 필라멘트 백업)',
    printAnyway: '그래도 인쇄',
    forceColorMatch: '색상 일치 강제',
    staggerPrinterStarts: '프린터 시작 분산',
    staggerGroupSize: '그룹 크기',
    staggerInterval: '간격 (분)',
    staggerPreview: '{{printers}}대 프린터 → {{size}}대씩 {{groups}}개 그룹, 매 {{interval}}분마다 시작',
    staggerLastGroup: '마지막 그룹: {{count}}',
    staggerTotal: '합계: {{minutes}}분',
    staggerToPrinters: '{{count}}대 프린터에 분산',
    gcodeInjection: '자동 인쇄 G-code 삽입',
    insufficientBudget: '예산 부족',
    unlimitedNoBudget: '무제한 – 예산 한도가 설정되지 않았습니다.',
    noPrintableCostCenters: '인쇄에 사용할 수 있는 활성 비용 센터가 없습니다. 관리자에게 인쇄 권한을 요청하세요.',
  },
  backup: {
    includesEncryptionKey: '로컬 백업에는 MFA 암호화 키 파일(DATA_DIR/.mfa_encryption_key)이 포함되어 백업 ZIP이 자체 완결됩니다. ZIP 파일을 민감하게 취급하세요 — 파일을 가진 누구나 내부에 저장된 OIDC 클라이언트 비밀과 TOTP 비밀을 복호화할 수 있습니다.',
    title: '백업 및 복원',
    createBackup: '백업 만들기',
    restoreBackup: '백업 복원',
    restoreDescription: '백업 파일에서 모든 데이터 교체',
    downloadBackup: '백업 다운로드',
    uploadBackup: '백업 업로드',
    lastBackup: '마지막 백업',
    autoBackup: '자동 백업',
    backupNow: '지금 백업',
    restoreWarning: '경고: 백업을 복원하면 현재 모든 데이터를 덮어씁니다.',
    includeArchives: '아카이브 포함',
    includeSettings: '설정 포함',
    includeProfiles: '프로필 포함',
    backupSuccess: '백업이 성공적으로 생성되었습니다',
    restoreSuccess: '백업이 성공적으로 복원되었습니다',
    backupFailed: '백업 실패',
    restoreFailed: '복원 실패',
    restoreNote: '복원 중 가상 프린터가 중지됩니다',
    githubBackup: 'Git 백업',
    enabled: '활성화됨',
    cloudLoginRequired: 'Bambu 클라우드 로그인 필요. GitHub 백업을 활성화하려면 프로필 → 클라우드 프로필에서 로그인하세요.',
    cloudLoginRequiredShort: '클라우드 로그인 필요',
    githubDescription: '백업 및 버전 기록을 위해 비공개 GitHub 저장소에 프로필을 자동으로 동기화합니다.',
    repositoryUrl: '저장소 URL',
    repoUrlPlaceholderGitHub: 'https://github.com/username/repo-name',
    repoUrlPlaceholderGitea: 'https://gitea.example.com/username/repo-name',
    repoUrlPlaceholderForgejo: 'https://forgejo.example.com/username/repo-name',
    repoUrlPlaceholderGitLab: 'https://gitlab.com/username/repo-name',
    allowInsecureHttp: '비보안 HTTP 허용',
    allowInsecureHttpHint: 'TLS가 없는 개인 네트워크의 자체 호스팅 인스턴스에 활성화',
    personalAccessToken: '개인 액세스 토큰',
    tokenSaved: '(저장됨)',
    enterNewToken: '업데이트하려면 새 토큰 입력',
    tokenHintGitHub: 'Contents 읽기 및 쓰기 권한이 있는 세분화된 토큰 또는 repo 범위를 가진 클래식 토큰.',
    tokenHintGitLab: 'api 범위 또는 read_repository와 write_repository를 함께 가진 토큰.',
    tokenHintGitea: 'write:repository 범위를 가진 토큰.',
    tokenHintForgejo: 'write:repository 범위를 가진 토큰. 이 저장소 하나로만 제한된 토큰이면 충분합니다.',
    branch: '브랜치',
    provider: 'Git 제공자',
    providerGitHub: 'GitHub',
    providerGitLab: 'GitLab',
    providerGitea: 'Gitea',
    providerForgejo: 'Forgejo',
    manualOnly: '수동만',
    hourly: '매시간',
    daily: '매일',
    weekly: '매주',
    includeInBackup: '백업에 포함',
    kProfiles: 'K-프로필',
    kProfilesDescription: '연결된 프린터의 압력 전진 보정',
    noPrintersConnected: '연결된 프린터 없음',
    printersConnected: '{{total}}개 중 {{connected}}개 연결됨',
    cloudProfiles: '클라우드 프로필',
    cloudProfilesDescription: 'Bambu 클라우드와 Orca 클라우드의 필라멘트, 프린터 및 프로세스 프리셋',
    cloudProfilesAccounts: '연결된 계정 — Bambu 클라우드: {{bambu}}, Orca 클라우드: {{orca}}',
    appSettings: '앱 설정',
    appSettingsDescription: 'Bambuddy 구성 (전체 데이터베이스)',
    spoolInventory: '스풀 재고',
    spoolInventoryDescription: '필라멘트 스풀, 사용 기록 및 비용 추적',
    printArchives: '인쇄 아카이브',
    printArchivesDescription: '인쇄 기록 메타데이터 (gcode/3MF 파일 제외)',
    lastBackupAt: '마지막 백업:',
    noBackupsYet: '아직 백업 없음',
    next: '다음:',
    startingBackup: '백업 시작 중...',
    test: '테스트',
    enableBackup: '백업 활성화',
    testConnection: '연결 테스트',
    enterRepoUrl: '저장소 URL 입력',
    enterRepoAndToken: '저장소 URL 및 액세스 토큰 입력',
    repoRequired: '저장소 URL이 필요합니다',
    tokenRequired: '액세스 토큰이 필요합니다',
    githubBackupEnabled: 'GitHub 백업 활성화됨',
    tokenUpdated: '토큰 업데이트됨',
    settingsSaved: '설정 저장됨',
    failedToSave: '저장 실패: {{message}}',
    backupCompleteFiles: '백업 완료 - {{count}}개 파일 업데이트됨',
    backupSkippedNoChanges: '변경 사항 없어 백업 건너뜀',
    backupFailed2: '백업 실패: {{message}}',
    clearedLogs: '{{count}}개 로그 초기화됨',
    failedToClearLogs: '로그 초기화 실패: {{message}}',

    // Restore from Git backup (#2656)
    restoreFromGit: {
      button: 'Git에서 복원',
      title: 'Git 백업에서 복원',
      subtitle: '커밋과 복원할 항목을 선택하세요',
      commitLabel: '백업 커밋',
      latestCommit: '최신 백업 (브랜치 최신 커밋)',
      categoriesLabel: '복원할 항목',
      inspecting: '백업 내용을 읽고 있습니다...',
      itemCount: '백업에 {{count}}개',
      overwriteLabel: '기존 항목 덮어쓰기',
      overwriteOn: '기존 항목이 백업 내용으로 업데이트됩니다.',
      overwriteOff: '없는 항목만 추가되고 기존 항목은 그대로 유지됩니다.',
      selectedCount: '{{count}}개 선택됨',
      restoring: '복원 중...',
      confirmTitle: '백업에서 복원하시겠습니까?',
      confirmMessage: '선택한 항목을 이 커밋에서 복원합니다. 없는 항목은 추가되고 기존 항목은 그대로 유지됩니다.',
      confirmMessageOverwrite: '선택한 항목을 이 커밋에서 복원하고 로컬에 이미 있는 항목을 덮어씁니다. 이 작업은 취소할 수 없습니다.',
      kprofilesOverwriteCaveat: 'K 프로파일은 예외입니다. 슬롯에 쓰면 프린터의 캘리브레이션이 항상 교체됩니다.',
      tally: '복원 {{restored}}개, 건너뜀 {{skipped}}개, 실패 {{failed}}개',
      reloadHint: '복원된 데이터가 모든 화면에 반영되도록 Bambuddy를 새로 고치세요.',
      partialHint: '위에 표시된 카테고리는 완료되어 저장되었습니다. 표시되지 않은 카테고리는 실행되지 않았습니다.',
      failed: '복원에 실패했습니다.',
      loadFailed: '백업 저장소를 읽을 수 없습니다.',
      details: {
        notPresent: '이 백업 커밋에는 없습니다',
        unreadableJson: '읽을 수 없는 JSON: {{paths}}',
        settingsNoPayload: '데이터에 설정이 없습니다',
        settingsCredentialsWillSkip: '자격 증명처럼 보이는 키 {{count}}개를 건너뜁니다',
        settingsCompanionWillSkip: '자격 증명처럼 보이는 키 {{count}}개를 건너뛰고, 이에 의존하는 스위치 {{companion}}개는 꺼진 상태로 둡니다',
        settingsCompanionOnlyWillSkip: '스위치 {{companion}}개는 꺼진 상태로 둡니다 - 각각에 필요한 자격 증명은 백업에서 복원할 수 없습니다',
        spoolsUsageCount: '사용 기록 {{count}}건 포함',
        archivesMetadataOnly: '메타데이터만 - 3MF 파일과 썸네일은 Git 백업에 포함되지 않습니다',
        kprofilesPrinterCount: '프린터 {{count}}대 분량',
      },
      notes: {
        noData: '이 백업에는 이런 종류의 데이터가 없습니다',
        archivesPrinterMissing: '일부 아카이브가 더 이상 존재하지 않는 프린터를 참조했습니다 - 연결을 해제했습니다',
        archivesProjectMissing: '일부 아카이브가 더 이상 존재하지 않는 프로젝트를 참조했습니다 - 연결을 해제했습니다',
        archivesOwnerCleared: '일부 아카이브가 더 이상 존재하지 않는 사용자를 참조했습니다 - 소유자를 비웠으므로 관리자가 다시 지정하기 전까지 archives:read_all 권한이 있는 사용자에게만 보입니다',
        archivesOwnerUnmatched: '일부 아카이브가 이 인스턴스에 없는 소유자를 가리킵니다 - 백업의 사용자 ID로 추측하지 않고 소유자를 비웠으므로 관리자가 다시 지정하기 전까지 archives:read_all 권한이 있는 사용자에게만 보입니다',
        archivesOwnerUnknown: '일부 아카이브가 소유자 없이 복원되었습니다 - 이 백업에 소유자가 기록되어 있지 않으므로 관리자가 지정하기 전까지 archives:read_all 권한이 있는 사용자에게만 보입니다',
        archivesUndeleted: '백업 이후 삭제된 아카이브가 다시 표시됩니다 - 덮어쓰기가 켜져 있었습니다',
        archivesMetadataOnly: '복원된 아카이브에는 메타데이터만 있습니다 - 3MF 파일과 썸네일은 Git 백업에 포함되지 않습니다',
        spoolUsageUnresolved: '사용 기록 {{count}}건을 건너뛰었습니다 - 해당 스풀이 이 백업의 스풀 목록에 없어 연결할 대상이 없습니다.',
        spoolUsageUnlinked: '사용 기록 {{count}}건을 출력 기록 연결 없이 복원했습니다 - 연결을 유지하려면 스풀 재고와 함께 출력 아카이브도 선택하세요.',
        spoolTagKept: '스풀 태그 {{count}}개를 그대로 두었습니다 - 백업대로라면 그 사이 스캔된 태그가 지워지거나 다른 스풀로 옮겨졌을 것입니다.',
        settingsCredentialsSkipped: '자격 증명처럼 보이는 키 {{count}}개를 건너뛰었습니다 - 비밀 값은 직접 다시 입력하세요',
        settingsAuthSkipped: '인증 설정 {{count}}개를 건너뛰었습니다 - 잠금 검사가 계속 동작하도록 설정 > 인증에서 변경하세요',
        settingsCompanionSkipped: '{{keys}}을(를) 꺼진 상태로 두었습니다 - 각 항목에 필요한 자격 증명은 백업에서 복원할 수 없고 이 인스턴스에도 저장되어 있지 않아, 켜면 연동이 인증 없이 열립니다',
        settingsMqttRelayFailed: 'MQTT 설정을 복원했지만 릴레이를 다시 연결하지 못했습니다 - Bambuddy를 재시작하세요',
        kprofilesAlwaysOverwrite: 'K 프로파일은 항상 프린터의 해당 슬롯을 덮어씁니다',
        kprofilesAckUnreliable: '응답하지 않는 프린터도 복원됨으로 집계됩니다 - 프린터에서 프로파일을 확인하세요',
        kprofilesPrinterMissing: '시리얼 {{serial}}인 프린터가 없습니다 - 건너뛰었습니다',
        kprofilesPrinterOffline: '{{printer}}({{serial}})이(가) 연결되어 있지 않습니다 - 건너뛰었습니다',
        kprofilesUnknownNozzle: '{{serial}}의 예상치 못한 노즐 직경 {{nozzle}} - 그대로 전송했습니다',
        kprofilesUnmatched: '{{nozzle}}용 프로파일 {{count}}개가 {{printer}}에 대응 항목이 없습니다 - 새 프로파일로 추가했습니다',
        kprofilesSendFailed: '{{nozzle}} 프로파일을 {{printer}}({{serial}})에 보내지 못했습니다',
        kprofilesRefused: '{{printer}}({{serial}})이(가) {{nozzle}} 프로파일을 거부했습니다: {{reason}}',
        kprofilesStepFailed: 'K 프로파일 단계를 완료하지 못했습니다 - {{reason}}. 그 전에 복원된 항목은 그대로 저장되어 있습니다.',
      },
    },
    history: '기록',
    clear: '초기화',
    date: '날짜',
    status: '상태',
    trigger: '유형',
    triggers: {
      manual: '백업(수동)',
      scheduled: '백업(예약)',
      restore: '복원',
    },
    commit: '커밋',
    localBackup: '로컬 백업',
    localBackupDescription: '데이터베이스, 아카이브, 업로드 및 모든 파일을 포함한 Bambuddy 데이터의 전체 백업을 만듭니다.',
    downloadBackupLabel: '백업 다운로드',
    completeBackupZip: '전체 백업: 데이터베이스 + 모든 파일 (ZIP)',
    download: '다운로드',
    preparingBackup: '백업 준비 중...',
    creatingArchive: '백업 아카이브 생성 중... 대용량 아카이브의 경우 시간이 걸릴 수 있습니다.',
    downloadingFile: '백업 파일 다운로드 중...',
    backupDownloaded: '백업이 성공적으로 다운로드되었습니다',
    failedToCreateBackup: '백업 생성 실패: {{message}}',
    restore: '복원',
    restoreReplacesAll: '복원은 모든 데이터를 교체합니다.',
    restoreReplacesAllDetail: '현재 데이터베이스와 파일이 완전히 교체됩니다. 복원 후 재시작이 필요합니다.',
    restoreConfirmTitle: '백업 복원',
    restoreConfirmMessage: '"{{filename}}"에서 복원하시겠습니까? 현재 데이터베이스와 모든 파일이 완전히 교체됩니다. 복원 후 애플리케이션을 재시작해야 합니다.',
    restoreConfirmButton: '백업 복원',
    uploadingFile: '백업 파일 업로드 중...',
    backupRestoredRestart: '백업 복원됨. Bambuddy를 재시작하세요.',
    failedToRestore: '백업 복원 실패. 파일 형식을 확인하세요.',
    reloadNow: '지금 새로고침',
    creatingBackup: '백업 만드는 중',
    restoringBackup: '백업 복원 중',
    preparing: '준비 중...',
    processing: '처리 중...',
    doNotClosePage: '이 페이지를 닫거나 다른 곳으로 이동하지 마세요. 대용량 백업의 경우 몇 분이 걸릴 수 있습니다.',
    restoring: '복원 중...',
    restoreComplete: '복원 완료',
    restoreFailed2: '복원 실패',
    importSettings: '백업 파일에서 설정 가져오기',
    pleaseWaitRestoring: '데이터가 복원되는 동안 기다려 주세요',
    selectBackupFile: '백업 파일 클릭하여 선택 (.json 또는 .zip)',
    duplicateHandling: '중복 처리 방법:',
    matchPrinters: '프린터',
    matchPrintersBy: '일련번호로 일치',
    matchSmartPlugs: '스마트 플러그',
    matchSmartPlugsBy: 'IP 주소로 일치',
    matchNotificationProviders: '알림 제공자',
    matchNotificationProvidersBy: '이름으로 일치',
    matchFilaments: '필라멘트',
    matchFilamentsBy: '이름 + 유형 + 브랜드로 일치',
    matchArchives: '아카이브',
    matchArchivesBy: '콘텐츠 해시로 일치 (항상 건너뜀)',
    matchPendingUploads: '대기 중인 업로드',
    matchPendingUploadsBy: '파일 이름으로 일치',
    matchSettingsTemplates: '설정 및 템플릿',
    matchSettingsTemplatesBy: '항상 덮어씀',
    replaceExisting: '기존 데이터 교체',
    keepExisting: '기존 데이터 유지',
    overwriteDescription: '백업 데이터로 이미 존재하는 항목 덮어쓰기',
    keepDescription: '아직 존재하지 않는 항목만 복원',
    overwriteCaution: '주의:',
    overwriteWarning: '덮어쓰기는 현재 구성을 백업 데이터로 교체합니다. 보안상 프린터 액세스 코드는 절대 덮어쓰지 않습니다.',
    cancel: '취소',
    processingBackup: '백업 파일 처리 중...',
    itemsRestored: '복원된 항목',
    itemsSkipped: '건너뛴 항목',
    restored: '복원됨',
    skippedAlreadyExist: '건너뜀 (이미 존재)',
    filesCategory: '파일 (3MF, 썸네일 등)',
    andMore: '...및 {{count}}개 더',
    newApiKeysGenerated: '새 API 키 생성됨',
    keysShownOnce: '이 키는 한 번만 표시됩니다. 지금 복사하세요!',
    copy: '복사',
    noDataFound: '백업 파일에서 복원할 데이터를 찾을 수 없습니다.',
    close: '닫기',
    scheduledBackup: '예약 백업',
    scheduledBackupDescription: '일정에 따라 백업 스냅샷을 자동으로 생성합니다. 출력 디렉토리를 NAS 또는 외부 저장소에 마운트할 수 있습니다.',
    frequency: '주기',
    backupTime: '시간',
    retention: '보존',
    retentionDescription: '유지할 백업 수',
    outputPath: '출력 경로',
    outputPathPlaceholder: '기본값: {{path}}',
    outputPathDescription: '기본 위치를 사용하려면 비워두세요',
    runNow: '지금 실행',
    backupFiles: '백업 파일',
    noScheduledBackups: '아직 백업 없음',
    deleteBackup: '삭제',
    deleteBackupConfirm: '이 백업 파일을 삭제하시겠습니까?',
    backupRunning: '백업 진행 중...',
    scheduledBackupComplete: '백업이 성공적으로 완료되었습니다',
    scheduledBackupFailed: '백업 실패',
    nextBackup: '다음 백업',
    backupSize: '크기',
    localTimeHint: '현지 시간 ({{tz}})',
    defaultPathLabel: '기본값:',
    // Backup output-path probe (#2544)
    pathCheck: {
      title: 'Bambuddy가 이 디렉터리에 쓸 수 없습니다',
      howToFix: '해결 방법:',
      sandboxed: 'Bambuddy 서비스가 {{path}}에 쓸 수 없습니다. systemd 유닛이 ProtectSystem=strict로 실행되어 설치·데이터·로그 디렉터리를 제외한 모든 디렉터리가 서비스에서는 읽기 전용입니다. 사용자 셸에서는 쓸 수 있는 디렉터리라도 마찬가지입니다.',
      read_only: '{{path}}이(가) 읽기 전용 파일 시스템에 있습니다.',
      permission_denied: 'Bambuddy에 {{path}} 쓰기 권한이 없습니다. 디렉터리 소유자와 권한을 확인하세요.',
      no_space: '{{path}}이(가) 있는 파일 시스템에 남은 공간이 없습니다.',
      not_a_directory: '{{path}}이(가) 존재하지만 디렉터리가 아닙니다.',
      missing: '{{path}}이(가) 존재하지 않으며 생성할 수도 없습니다.',
      error: 'Bambuddy가 {{path}}에 쓸 수 없습니다.',
      ephemeralTitle: '이 백업은 컨테이너를 다시 만들면 사라집니다',
      container_ephemeral: '{{path}}은(는) 호스트가 아니라 Bambuddy 컨테이너 내부에 있습니다. 여기에 기록된 백업은 컨테이너를 재생성하면 사라집니다. 호스트의 디렉터리를 마운트하세요:',
    },
    categories: {
      settings: '설정',
      notification_providers: '알림 제공자',
      notification_templates: '알림 템플릿',
      smart_plugs: '스마트 플러그',
      printers: '프린터',
      filaments: '필라멘트',
      maintenance_types: '유지 관리 유형',
      archives: '아카이브',
      projects: '프로젝트',
      pending_uploads: '대기 중인 업로드',
      external_links: '외부 링크',
      api_keys: 'API 키'
    },
    repoIsPrivate: '저장소가 비공개입니다 — 안전하게 백업할 수 있습니다.',
    repoIsPublicWarning: '저장소가 공개입니다. Bambuddy 백업에는 MQTT 자격증명, Home Assistant 토큰, Prometheus 토큰, Bambu Cloud 이메일, K-프로파일을 통한 프린터 액세스 코드가 포함됩니다. 공급자 설정에서 저장소를 비공개로 변경할 때까지 저장이 차단됩니다.',
    repoVisibilityUnknown: '저장소 공개 여부를 확인할 수 없습니다. Bambuddy는 비공개로 확인된 저장소에만 백업하며, 저장이 차단됩니다.'
  },
  tags: {
    title: '태그',
    addTag: '태그 추가',
    editTag: '태그 편집',
    deleteTag: '태그 삭제',
    tagName: '태그 이름',
    tagColor: '태그 색상',
    noTags: '태그 없음',
    deleteConfirm: '이 태그를 삭제하시겠습니까?',
    manageTags: '태그 관리'
  },
  uploadModal: {
    title: '3MF 파일 업로드',
    dragDrop: '.3mf 파일을 여기에 드래그 앤 드롭',
    or: '또는',
    browseFiles: '파일 탐색',
    extractionInfo: '프린터 모델은 3MF 파일 메타데이터에서 자동으로 추출됩니다.',
    uploaded: '업로드됨',
    failed: '실패',
    uploading: '업로드 중...',
    upload: '업로드',
    uploadFailed: '업로드 실패'
  },
  editArchive: {
    title: '아카이브 편집',
    name: '이름',
    namePlaceholder: '인쇄 이름',
    printer: '프린터',
    noPrinter: '프린터 없음',
    project: '프로젝트',
    noProject: '프로젝트 없음',
    itemsPrinted: '인쇄된 항목',
    itemsPrintedHelp: '이 인쇄 작업에서 생산된 항목 수',
    notes: '메모',
    notesPlaceholder: '이 인쇄에 대한 메모 추가...',
    externalLink: '외부 링크',
    externalLinkPlaceholder: 'https://printables.com/model/...',
    externalLinkHelp: 'Printables, Thingiverse 또는 다른 출처 링크',
    tags: '태그',
    tagsPlaceholder: '태그 추가...',
    addMoreTags: '더 많은 태그 추가...',
    matchingTags: '"{{query}}"와 일치',
    existingTags: '기존 태그',
    clickToAdd: '(클릭하여 추가)',
    status: '상태',
    failureReason: '실패 원인',
    selectReason: '원인 선택...',
    photos: '인쇄 결과 사진',
    photosHelp: '+를 클릭하여 인쇄 결과 사진 추가',
    printResult: '인쇄 결과',
    saving: '저장 중...',
    failureReasons: {
      adhesionFailure: '접착 실패',
      spaghettiDetached: '스파게티 / 분리',
      layerShift: '레이어 시프트',
      cloggedNozzle: '노즐 막힘',
      filamentRunout: '필라멘트 소진',
      warping: '휨',
      stringing: '스트링',
      underExtrusion: '압출 부족',
      powerFailure: '전원 실패',
      userCancelled: '사용자 취소',
      other: '기타'
    },
    statuses: {
      completed: '완료됨',
      failed: '실패',
      aborted: '취소됨',
      printing: '인쇄 중'
    }
  },
  kProfiles: {
    title: 'K-프로필',
    noPrintersConfigured: '구성된 프린터 없음',
    addPrinterInSettings: 'K-프로필을 관리하려면 설정에서 프린터를 추가하세요',
    noActivePrinters: '활성 프린터 없음',
    enablePrinterConnection: 'K-프로필을 보려면 프린터 연결을 활성화하세요',
    loadingProfiles: 'K-프로필 불러오는 중...',
    printerOffline: '프린터 오프라인',
    printerOfflineDesc: '선택한 프린터가 연결되지 않았습니다. 켜서 K-프로필을 확인하세요.',
    noMatchingProfiles: '일치하는 프로필 없음',
    noMatchingProfilesDesc: '검색 기준과 일치하는 프로필이 없습니다',
    noKProfiles: 'K-프로필 없음',
    noKProfilesDesc: '{{diameter}}mm 노즐에 대한 압력 전진 프로필이 없습니다',
    createFirstProfile: '첫 번째 프로필 만들기',
    printer: '프린터',
    nozzle: '노즐',
    refresh: '새로고침',
    addProfile: '프로필 추가',
    export: '내보내기',
    import: '가져오기',
    select: '선택',
    selectAll: '모두 선택',
    delete: '삭제',
    searchPlaceholder: '이름 또는 필라멘트로 검색...',
    allExtruders: '모든 압출기',
    leftOnly: '왼쪽만',
    rightOnly: '오른쪽만',
    allFlow: '모든 유량',
    hfOnly: 'HF만',
    sOnly: 'S만',
    sortName: '정렬: 이름',
    sortKValue: '정렬: K값',
    sortFilament: '정렬: 필라멘트',
    leftExtruder: '왼쪽 압출기',
    rightExtruder: '오른쪽 압출기',
    modal: {
      addTitle: 'K-프로필 추가',
      editTitle: 'K-프로필 편집',
      profileName: '프로필 이름',
      profileNamePlaceholder: '내 PLA 프로필',
      kValue: 'K값',
      kValuePlaceholder: '0.020',
      kValueHelp: '일반 범위: PLA 0.01~0.06, PETG 0.02~0.10',
      filament: '필라멘트',
      selectFilament: '필라멘트 선택...',
      source: {
        local: '가져온 것',
        orcaCloud: 'Orca Cloud',
        bambuCloud: 'Bambu Cloud',
        builtin: '기본 제공',
      },
      noFilamentsHelp: '사용할 수 있는 필라먼트가 없습니다. Bambu Cloud에 로그인하거나 프로파일 → 로컬 프로파일에서 프리셋을 가져오세요.',
      searchFilaments: '필라먼트 검색...',
      noFilamentMatches: '검색과 일치하는 필라먼트가 없습니다',
      flowType: '유량 유형',
      highFlow: '고유량',
      standard: '표준',
      nozzleSize: '노즐 크기',
      extruder: '압출기',
      extruders: '압출기',
      left: '왼쪽',
      right: '오른쪽',
      notes: '메모 (로컬 저장)',
      notesPlaceholder: '이 프로필에 대한 메모 추가...',
      notesHelp: '메모는 프린터가 아닌 Bambuddy에 저장됩니다',
      syncing: '프린터와 동기화 중...',
      savingExtruder: '압출기 {{current}}/{{total}}에 저장 중...',
      pleaseWait: '기다려 주세요'
    },
    deleteConfirm: {
      title: '프로필 삭제',
      cannotUndo: '이 작업은 취소할 수 없습니다',
      message: '프린터에서 "{{name}}"을(를) 삭제하시겠습니까?'
    },
    bulkDelete: {
      title: '프로필 삭제',
      cannotUndo: '이 작업은 취소할 수 없습니다',
      message: '프린터에서 선택한 {{count}}개 프로필을 삭제하시겠습니까?'
    },
    toast: {
      profileSaved: 'K-프로필 저장됨',
      profilesSaved: '{{count}}개 압출기에 K-프로필 저장됨',
      selectAtLeastOneExtruder: '적어도 하나의 압출기를 선택해 주세요',
      selectFilament: '먼저 필라먼트를 선택하세요',
      filamentNotResolvable: '{{name}}에 해당하는 Bambu 필라먼트 ID가 없어 프린터가 프로파일을 저장할 수 없습니다',
      profileDeleted: 'K-프로필 삭제됨',
      profilesDeleted: '{{count}}개 프로필 삭제됨',
      exportedProfiles: '{{count}}개 프로필 내보냄',
      importedProfiles: '{{total}}개 중 {{count}}개 프로필 가져옴',
      noProfilesToExport: '내보낼 프로필 없음',
      invalidFileFormat: '유효하지 않은 파일 형식',
      failedToParseImport: '가져오기 파일 파싱 실패',
      failedToSaveBatch: 'K-프로필 저장 실패',
      noteSaved: '메모 저장됨',
      failedToSaveNote: '메모 저장 실패'
    },
    permission: {
      noRead: '프로필 새로고침 권한이 없습니다',
      noCreate: '프로필 추가 권한이 없습니다',
      noUpdate: 'K-프로필 업데이트 권한이 없습니다',
      noDelete: 'K-프로필 삭제 권한이 없습니다',
      noExport: '프로필 내보내기 권한이 없습니다',
      noImport: '프로필 가져오기 권한이 없습니다'
    }
  },
  virtualPrinter: {
    title: '가상 프린터',
    running: '실행 중',
    stopped: '중지됨',
    description: {
      default: 'Bambu Studio 및 OrcaSlicer에 표시되는 가상 프린터를 활성화합니다. 이 프린터로 전송된 파일은 인쇄 없이 바로 아카이브됩니다.',
      proxy: '실제 프린터로 슬라이서 트래픽을 릴레이하는 프록시를 활성화하여 모든 네트워크에서 원격 인쇄가 가능합니다.'
    },
    enable: {
      title: '가상 프린터 활성화',
      visibleInSlicer: '슬라이서 검색에서 "Bambuddy"로 표시됨',
      proxyingTo: '{{name}}으로 프록시 중',
      notActive: '활성화되지 않음'
    },
    model: {
      title: '프린터 모델',
      description: '에뮬레이션할 프린터 모델을 선택하세요.',
      restartWarning: '모델 변경 시 가상 프린터가 재시작됩니다'
    },
    accessCode: {
      title: '액세스 코드',
      isSet: '액세스 코드가 설정됨',
      notSet: '액세스 코드가 설정되지 않음 - 활성화하려면 필요',
      placeholder: '8자리 코드 입력',
      placeholderChange: '변경하려면 새 코드 입력',
      hint: '정확히 8자여야 합니다. 슬라이서가 인증하는 데 사용됩니다.',
      charCount: '({{count}}/8)',
      inheritedFromTarget: '대상 프린터에서 상속됨',
      derivedFromTargetHint: '대상 프린터의 액세스 코드를 사용합니다. 브리지는 슬라이서 인증을 실제 프린터로 전달하므로 코드가 일치해야 합니다 — 변경하려면 프린터 설정에서 액세스 코드를 편집하세요.',
      reveal: '액세스 코드 표시',
      hide: '액세스 코드 숨기기'
    },
    targetPrinter: {
      title: '대상 프린터',
      configured: '프록시 대상 구성됨',
      notConfigured: '대상 프린터가 선택되지 않음 - 프록시 모드에 필요',
      placeholder: '프린터 선택...',
      hint: '슬라이서 트래픽을 프록시할 프린터를 선택하세요. 프린터는 LAN 모드여야 합니다.',
      noPrinters: '구성된 프린터 없음. 프록시 모드를 사용하려면 먼저 프린터를 추가하세요.'
    },
    remoteInterface: {
      title: '네트워크 인터페이스 재정의',
      configured: '인터페이스 재정의 활성',
      optional: '선택사항 - 자동 감지된 IP가 잘못된 경우 사용 (예: 여러 NIC, Docker, VPN)',
      placeholder: '자동 감지 (기본값)...',
      hint: 'SSDP를 통해 광고되고 TLS 인증서에 사용되는 IP 주소를 재정의합니다. Bambuddy에 여러 네트워크 인터페이스가 있을 때 유용합니다.'
    },
    mode: {
      title: '모드',
      archive: '아카이브',
      archiveDesc: '파일 즉시 아카이브',
      review: '검토',
      reviewDesc: '아카이브 전 검토',
      queue: '대기열',
      queueDesc: '아카이브 후 대기열 추가',
      proxy: '프록시',
      proxyDesc: '실제 프린터로 릴레이'
    },
    autoDispatch: {
      title: '자동 발송',
      description: '대기열에 추가될 때 자동으로 인쇄를 시작합니다. 꺼져 있으면 수동 발송을 기다립니다.'
    },
    queueForceColorMatch: {
      title: '색상 일치 강제',
      description: '정확한 필라멘트 유형과 색상이 장착되지 않은 프린터에는 발송을 거부합니다. 기본적으로 꺼져 있음 — 이 옵션 없이는 대기열이 모델 전용 매칭을 사용하여 잘못된 색상이 장착된 프린터를 선택할 수 있습니다.'
    },
    saveAmsMapping: {
      title: 'AMS 매핑 저장',
      description: '슬라이서가 직접 선택한 AMS 슬롯(project_file MQTT 명령에서)을 아카이브에 저장하여, 이후 재인쇄 시 파일의 유형/색상에서 다시 유추하지 않고 동일한 실물 스풀을 재사용하도록 합니다. 기본값은 꺼짐입니다.',
    },
    gcodeInjection: {
      title: 'G-code 주입',
      description: '설정에서 모델별로 구성한 G-code 스니펫을 이 가상 프린터의 작업에 적용합니다. 기본값은 꺼짐입니다.'
    },
    tailscaleDisabled: {
      title: 'Tailscale 통합',
      description: '이 가상 프린터가 Tailscale을 통해 노출되도록 표시하려면 활성화하세요. 슬라이서에 붙여넣을 IP를 알 수 있도록 호스트의 Tailscale 주소를 표시합니다. CA 가져오기 단계는 변경되지 않음 — 이 토글은 인증서에 영향을 미치지 않습니다.'
    },
    setupRequired: {
      title: '설정 필요',
      description: '가상 프린터 기능이 작동하려면 추가 시스템 구성이 필요합니다. 여기에는 포트 포워딩, 방화벽 규칙 및 플랫폼별 설정이 포함됩니다.',
      readGuide: '활성화 전에 설정 가이드를 읽으세요'
    },
    archiveNameSource: {
      title: '아카이브 이름 출처',
      description: '가상 프린터를 통해 파일이 도착할 때 새 아카이브의 이름 지정 방법을 선택합니다. "메타데이터"는 3MF의 슬라이서 내장 제목을 사용합니다(기본값). "파일 이름"은 Bambu Studio가 FTP를 통해 전송한 파일 이름을 사용합니다. 참고: Bambu Studio는 3MF에 제목 필드가 있을 경우 "프린터로 보내기" 대화 상자에 입력한 이름을 해당 값으로 덮어쓰므로, 두 모드 모두 동일한 문자열이 표시되는 경우가 많습니다.',
      metadata: '메타데이터',
      filename: '파일 이름'
    },
    howItWorks: {
      title: '작동 방식',
      step1: '같은 LAN에서 가상 프린터는 검색을 통해 슬라이서(Bambu Studio / OrcaSlicer)에 자동으로 나타납니다. 다른 네트워크에서는 IP 주소와 액세스 코드로 수동으로 추가하세요.',
      step2: '아카이브, 검토, 대기열 모드에서 슬라이서의 "전송" 버튼을 사용하여 3MF 파일을 Bambuddy에 업로드하세요. 슬라이서는 "인쇄 성공"을 표시하지만 파일은 저장되고 인쇄되지 않습니다.',
      step3: '프록시 모드에서 가상 프린터는 모든 트래픽을 실제 프린터로 릴레이합니다 — 직접 연결된 것처럼 즉시 인쇄가 시작됩니다.'
    },
    status: {
      title: '상태 세부 정보',
      printerName: '프린터 이름',
      model: '모델',
      serialNumber: '일련 번호',
      mode: '모드',
      pendingFiles: '대기 중인 파일',
      targetPrinter: '대상 프린터',
      ftpPort: 'FTP 포트',
      mqttPort: 'MQTT 포트',
      ftpConnections: 'FTP 연결',
      mqttConnections: 'MQTT 연결'
    },
    toast: {
      updated: '가상 프린터 설정 업데이트됨',
      failedToUpdate: '설정 업데이트 실패',
      copyFailed: '복사 실패 — 텍스트를 수동으로 선택하여 복사해 보세요',
      accessCodeRequired: '먼저 액세스 코드를 설정해 주세요',
      targetPrinterRequired: '먼저 대상 프린터를 선택해 주세요',
      bindIpRequired: '먼저 바인드 IP를 설정해 주세요',
      accessCodeEmpty: '액세스 코드는 비워둘 수 없습니다',
      accessCodeLength: '액세스 코드는 정확히 8자여야 합니다',
      targetCodeChangedRebind: '액세스 코드가 새 대상 프린터에 동기화되었습니다. 새 코드를 적용하려면 슬라이서에서 이 장치를 다시 추가하세요.',
      created: '가상 프린터 생성됨',
      failedToCreate: '가상 프린터 생성 실패',
      deleted: '가상 프린터 삭제됨',
      failedToDelete: '가상 프린터 삭제 실패'
    },
    list: {
      title: '가상 프린터',
      add: '추가',
      addFirst: '가상 프린터 추가',
      empty: '구성된 가상 프린터 없음. 하나를 추가하여 시작하세요.'
    },
    bindIp: {
      title: '바인드 인터페이스',
      placeholder: '인터페이스 선택...',
      hint: '이 가상 프린터가 바인딩할 네트워크 인터페이스. 프린터당 고유해야 합니다.'
    },
    proxy: {
      accessCodeHint: '프록시 모드에서는 슬라이서에서 대상 프린터의 액세스 코드를 사용하세요. 연결은 실제 프린터로 투명하게 전달됩니다.'
    },
    addDialog: {
      title: '가상 프린터 추가',
      name: '이름',
      hint: '생성 후 액세스 코드, 대상 프린터 및 기타 설정을 구성할 수 있습니다.',
      create: '생성'
    },
    deleteConfirm: {
      title: '가상 프린터 삭제',
      message: '"{{name}}"을(를) 삭제하시겠습니까? 이 프린터의 모든 서비스가 중지됩니다.'
    },
    caCert: {
      title: '슬라이서 인증서',
      description: '가상 프린터는 Bambuddy CA가 서명한 TLS 인증서를 사용합니다. 이 CA 인증서를 슬라이서의 신뢰 저장소에 한 번만 가져오면 연결을 수락합니다 — 명령줄에서 복사할 필요가 없습니다.',
      copy: '복사',
      copied: '복사됨',
      download: '다운로드',
      fingerprint: 'SHA-256'
    }
  },
  modelViewer: {
    openInSlicer: '슬라이서에서 열기',
    openInSlicerWith: '{{slicer}}에서 열기',
    moreSlicerOptions: '슬라이서 옵션 더 보기',
    openInSlicerFailed: '슬라이서에서 열 수 없습니다',
    tabs: {
      model: '3D 모델',
    },
    notAvailable: '사용 불가',
    plates: '플레이트',
    allPlates: '모든 플레이트',
    plateNumber: '플레이트 {{number}}',
    plateCount: '플레이트 {{count}}개',
    plateCount_other: '플레이트 {{count}}개',
    objectCount: '개체 {{count}}개',
    objectCount_other: '개체 {{count}}개',
    filamentCount: '필라멘트 {{count}}개',
    filamentCount_other: '필라멘트 {{count}}개',
    eta: '예상 {{minutes}}분',
    noPreview: '이 파일에 대한 미리보기를 사용할 수 없습니다',
    pagination: {
      pageOf: '{{total}}페이지 중 {{current}}',
      prev: '이전',
      next: '다음'
    },
    errors: {
      failedToLoad: '파일 불러오기 실패',
      noMeshes: '3MF 파일에서 메쉬를 찾을 수 없음',
      unsupportedFormat: '지원되지 않는 파일 형식'
    }
  },
  maintenanceDescriptions: {
    lubricateCarbonRods: '부드러운 움직임을 위해 카본 로드에 윤활유 도포',
    lubricateRails: '부드러운 움직임을 위해 선형 레일에 윤활유 도포',
    cleanNozzle: '막힘 방지를 위해 핫엔드와 노즐 청소',
    checkBelts: '정확한 인쇄를 위해 벨트 장력 확인',
    cleanBuildPlate: '접착력 향상을 위해 빌드 플레이트 청소',
    checkExtruder: '마모 여부 확인을 위해 압출기 기어 점검',
    checkCooling: '냉각 팬이 제대로 작동하는지 확인',
    generalInspection: '전반적인 프린터 점검',
    cleanCarbonRods: '마찰 감소를 위해 카본 로드 청소',
    lubricateSteelRods: '부드러운 움직임을 위해 스틸 로드에 윤활유 도포',
    cleanSteelRods: '마찰 감소를 위해 스틸 로드 청소',
    cleanLinearRails: '먼지와 이물질 제거를 위해 선형 레일 닦기',
    checkPtfeTube: '마모 또는 손상 여부 확인을 위해 PTFE 튜브 점검',
    replaceHepaFilter: '공기 품질을 위해 HEPA 필터 교체',
    replaceCarbonFilter: '활성탄 필터 교체',
    lubricateLeftNozzleRail: '왼쪽 노즐 레일 윤활 (H2 시리즈)'
  },
  haSensors: {
    label: '센서',
    unavailable: '사용 불가',
    blocksPrints: '{{entity}} — 경고 중에는 인쇄를 보류합니다',
    states: {
      open: '열림',
      closed: '닫힘',
      unlocked: '잠금 해제',
      locked: '잠김',
      detected: '감지됨',
      clear: '없음',
      wet: '젖음',
      dry: '건조',
      problem: '문제',
      ok: '정상',
      running: '작동 중',
      stopped: '정지',
      on: '켜짐',
      off: '꺼짐',
    },
    sectionTitle: 'Home Assistant 센서',
    add: '센서 추가',
    addTitle: 'Home Assistant 센서 추가',
    editTitle: 'Home Assistant 센서 편집',
    empty: '아직 센서가 없습니다. Home Assistant의 도어 센서나 온도계를 연결하면 프린터 카드에 표시됩니다.',
    unknownPrinter: '알 수 없는 프린터',
    badgeBlocks: '인쇄 보류',
    badgeNotifies: '알림',
    badgeHidden: '카드에서 숨김',
    printer: '프린터',
    entity: '엔터티',
    searchPlaceholder: '엔터티 검색...',
    noEntities: '일치하는 엔터티 없음',
    name: '표시 이름',
    alertWhen: '경고 조건',
    alertNever: '없음 — 표시만',
    alertAbove: '초과',
    alertBelow: '미만',
    alertHint: '경고 상태가 되면 프린터 카드에서 강조되고 아래 옵션이 활성화됩니다.',
    showOnCard: '프린터 카드에 표시',
    notifyOnAlert: '경고가 시작되면 알림 보내기',
    blockPrint: '경고 중에는 대기 중인 인쇄를 보류',
    blockPrintHint: '작업은 대기열에 남아 있다가 센서가 해제되면 자동으로 시작됩니다. Home Assistant에 연결할 수 없는 동안에는 무시됩니다.',
    toast: {
      created: '센서를 추가했습니다',
      updated: '센서를 저장했습니다',
      deleted: '센서를 삭제했습니다',
    },
    error: {
      pickEntity: 'Home Assistant 엔터티를 선택하세요',
      nameRequired: '표시 이름을 입력하세요',
      printerRequired: '프린터를 선택하세요',
      alertRequired: '먼저 경고 조건을 설정하세요',
    },
  },
  smartPlugs: {
    offline: '오프라인',
    admin: '관리자',
    openPlugAdminPage: '플러그 관리 페이지 열기',
    deleteSmartPlug: '스마트 플러그 삭제',
    turnOnSmartPlug: '스마트 플러그 켜기',
    turnOffSmartPlug: '스마트 플러그 끄기',
    turnOn: '켜기',
    turnOff: '끄기',
    addSmartPlug: {
      scanningNetwork: '네트워크 스캔 중...',
      chooseEntity: '엔티티 선택...',
      connectionFailed: '연결 실패',
      searchEntities: '엔티티 검색...',
      searchPowerSensors: '전력 센서 검색...',
      searchEnergySensors: '에너지 센서 검색...',
      placeholders: {
        plugName: '거실 플러그',
        mqttStateOnValue: 'ON, true, 1',
        mqttSameAsPower: '전력 토픽과 같거나 다름'
      }
    },
    linkedTo: '연결됨:',
    monitorOnly: '모니터만',
    alerts: '알림',
    scheduleOn: '켜기 {{time}}',
    scheduleOff: '끄기 {{time}}',
    on: '켜짐',
    off: '꺼짐',
    power: '전력',
    kwhToday: '오늘 kWh',
    settings: '설정',
    automationSettings: '자동화 설정',
    showInSwitchbar: '스위치바에 표시',
    quickAccessSidebar: '사이드바에서 빠른 접근',
    enabled: '활성화됨',
    enableAutomation: '이 플러그의 자동화 활성화',
    autoOn: '자동 켜기',
    autoOnDescription: '인쇄 시작 시 켜기',
    autoOff: '자동 끄기',
    autoOffDescription: '인쇄 완료 시 끄기 (1회)',
    autoOffPersistent: '계속 활성화',
    autoOffPersistentDescription: '1회성 대신 인쇄 사이에 활성화 유지',
    controlsPrinterPower: '프린터에 전원 공급',
    controlsPrinterPowerDescription: '이 플러그가 액세서리(필터 팬, 조명)에만 전원을 공급한다면 끄세요. 그렇지 않으면 플러그를 끌 때 프린터가 오프라인으로 표시됩니다.',
    turnOffDelayMode: '끄기 지연 모드',
    time: '시간',
    temp: '온도',
    delayMinutes: '지연 (분)',
    tempThreshold: '온도 임계값 (°C)',
    tempThresholdDescription: '노즐이 이 온도 이하로 냉각될 때 끄기',
    edit: '편집',
    deleteConfirm: '"{{name}}"을(를) 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.',
    turnOnConfirm: '"{{name}}"을(를) 켜시겠습니까?',
    turnOffConfirm: '"{{name}}"을(를) 끄시겠습니까? 연결된 장치의 전원이 차단됩니다.',
    failedToTurn: '"{{name}}" {{action}} 실패',
    unknown: '알 수 없음',
    addTitle: '스마트 플러그 추가',
    editTitle: '스마트 플러그 편집',
    stopScanning: '스캔 중지',
    discoverTasmota: 'Tasmota 장치 검색',
    foundDevices: '{{count}}개 장치 발견 - 클릭하여 선택:',
    noDevicesFound: '네트워크에서 Tasmota 장치를 찾을 수 없음',
    haNotConfigured: 'Home Assistant가 구성되지 않았습니다.',
    haSettingsPath: '설정 → 네트워크 → Home Assistant',
    selectEntity: '엔티티 선택 *',
    ipAddress: 'IP 주소 *',
    nameLabel: '이름 *',
    username: '사용자 이름',
    password: '비밀번호',
    authHint: 'Tasmota 장치에 인증이 필요하지 않으면 비워두세요',
    linkToPrinter: '프린터에 연결',
    noPrinter: '프린터 없음 (수동 제어만)',
    linkingDescription: '연결하면 인쇄 시작/완료 시 자동 켜기/끄기가 활성화됩니다',
    powerAlerts: '전력 알림',
    alertAbove: '초과 시 알림 (W)',
    alertBelow: '미만 시 알림 (W)',
    alertDescription: '전력 소비가 이 임계값을 초과할 때 알림 받기. 해당 방향을 비활성화하려면 비워두세요.',
    dailySchedule: '일일 스케줄',
    turnOnAt: '켜기 시각',
    turnOffAt: '끄기 시각',
    scheduleDescription: '매일 이 시간에 자동으로 켜기/끄기. 해당 동작을 건너뛰려면 비워두세요.',
    showOnPrinterCard: '프린터 카드에 표시',
    displayOnPrinterCard: '프린터 카드에 버튼 표시',
    connectedResult: '연결됨!',
    deviceLabel: '장치: {{name}} - ',
    stateLabel: '상태: {{state}}',
    test: '테스트',
    delete: '삭제',
    save: '저장',
    add: '추가',
    cancel: '취소',
    failedToStartScan: '스캔 시작 실패',
    nameRequired: '이름이 필요합니다',
    entityRequired: 'Home Assistant 플러그에는 엔티티가 필요합니다',
    mqttTopicRequired: '전력, 에너지 또는 상태 모니터링을 위한 MQTT 토픽이 하나 이상 구성되어야 합니다',
    loadingEntities: '엔티티 불러오는 중...',
    loading: '불러오는 중...',
    failedToLoadEntities: '엔티티 불러오기 실패: {{error}}',
    noEntitiesMatching: '"{{search}}"과 일치하는 엔티티를 찾을 수 없음',
    noEntitiesAvailable: '사용 가능한 엔티티 없음',
    searchingEntities: '모든 엔티티 검색 중 ({{count}}개 발견)',
    showingEntities: 'switch, light, input_boolean 표시 중 ({{count}}개 사용 가능)',
    energyMonitoringOptional: '에너지 모니터링 (선택사항)',
    energyMonitoringHint: '전력/에너지 데이터를 제공하는 센서를 검색하여 선택하세요.',
    powerSensorW: '전력 센서 (W)',
    energyTodayKwh: '오늘 에너지 (kWh)',
    totalEnergyKwh: '총 에너지 (kWh)',
    noMatchingSensors: '일치하는 센서 없음',
    none: '없음',
    mqttNotConfigured: 'MQTT 브로커가 구성되지 않았습니다.',
    mqttSettingsPath: '설정 → 네트워크 → MQTT 게시',
    mqttNotConfiguredSuffix: '(게시를 활성화할 필요는 없고 브로커 세부 정보만 입력하면 됩니다).',
    mqttMonitorOnlyDescription: 'MQTT 플러그는 MQTT 구독을 통해 전력/에너지 데이터를 받습니다. 켜기/끄기 제어는 불가능 — MQTT 브로커나 홈 자동화 시스템을 사용하세요.',
    powerMonitoring: '전력 모니터링',
    energyMonitoring: '에너지 모니터링',
    stateMonitoring: '상태 모니터링',
    optional: '선택사항',
    topic: '토픽',
    jsonPath: 'JSON 경로',
    multiplier: '배수',
    onValue: 'ON 값',
    mqttPowerHint: 'JSON 경로는 JSON 페이로드에서 값을 추출합니다 (예: "power_l1"). 토픽이 원시 숫자 값을 게시하면 비워두세요.\nmW→W에는 배수 0.001, kW→W에는 1000을 사용하세요.',
    mqttEnergyHint: 'JSON 경로는 JSON 페이로드에서 값을 추출합니다. 원시 값에는 비워두세요.\nWh→kWh에는 배수 0.001, MWh→kWh에는 1000을 사용하세요.',
    mqttStateHint: 'JSON 경로는 JSON 페이로드에서 값을 추출합니다. 원시 값에는 비워두세요.\nON 값: "ON"을 의미하는 정확한 문자열. 자동 감지(ON, true, 1)를 위해 비워두세요.',
    restControl: '제어',
    restOnUrl: '켜기 URL',
    restOffUrl: '끄기 URL',
    restOnBody: 'ON 요청 본문',
    restOffBody: 'OFF 요청 본문',
    restMethod: 'HTTP 방법',
    restHeaders: '사용자 지정 헤더 (JSON)',
    restStatusUrl: '상태 URL',
    restStatusPath: '상태 JSON 경로',
    restStatusOnValue: 'ON 값',
    restPowerUrl: '전력 URL',
    restPowerPath: '전력 JSON 경로',
    restPowerMultiplier: '전력 배수',
    restEnergyUrl: '에너지 URL',
    restEnergyPath: '에너지 JSON 경로 (오늘)',
    restEnergyTotalPath: '에너지 JSON 경로 (누적값)',
    restEnergyTotalMultiplier: '누적값 배율',
    restEnergyTotalPathHint: '예: aenergy.total',
    restEnergyTotalHint:
      '많은 플러그가 — Shelly는 모두 — 초기화되지 않는 누적 카운터만 보고합니다. 그 값은 위 항목이 아니라 여기에 입력하세요. 오늘 사용량으로 읽으면 자정에 초기화되지 않고, 어제와 총계는 계속 비어 있게 됩니다. Bambuddy가 누적값에서 오늘과 어제를 계산하며, 이를 위해 하루에서 이틀 치 측정값이 필요합니다. Shelly는 와트시로 보고하므로 배율은 0.001을 사용하세요.',
    restEnergyMultiplier: '에너지 배수',
    restUrlRequired: 'REST 플러그에는 URL(ON 또는 OFF) 중 하나 이상이 필요합니다',
    restHeadersHint: '예: {"Authorization": "Bearer your-token"}',
    restBodyHint: '예: ON, {"state": "on"}',
    restStatusHint: '현재 상태를 폴링할 URL',
    restPathHint: '예: state 또는 data.power.status',
    restPowerUrlHint: '전력 데이터의 별도 URL (비어 있으면 상태 URL 사용)',
    restEnergyUrlHint: '에너지 데이터의 별도 URL (비어 있으면 상태 URL 사용)',
    restEnergyHint: '각 값은 자체 URL을 사용하거나 상태 URL로 대체할 수 있습니다. 단위 변환에 배수를 사용하세요 (예: Wh→kWh에 0.001).',
    testConnection: '연결 테스트',
    connectionSuccess: '연결 성공',
    noSwitchesInSwitchbar: '스위치바에 스위치 없음',
    enableSwitchbarHint: '설정 > 스마트 플러그에서 "스위치바에 표시"를 활성화하세요',
    autoOffAfterDrying: '건조 후 자동 끄기',
    autoOffAfterDryingDescription: 'AMS 건조가 완료되면 끄기',
    delayAfterDryingMinutes: '건조 후 지연 (분)'
  },
  notifications: {
    providerTypes: {
      callmebot: 'CallMeBot/WhatsApp',
      ntfy: 'ntfy',
      pushover: 'Pushover',
      telegram: 'Telegram',
      email: '이메일',
      discord: 'Discord',
      webhook: 'Webhook',
      homeassistant: 'Home Assistant',
      bark: 'Bark'
    },
    providerDescriptions: {
      email: 'SMTP 이메일 알림',
      telegram: 'Telegram 봇을 통한 알림',
      discord: 'Webhook을 통해 Discord 채널로 전송',
      ntfy: '무료, 자체 호스팅 가능한 푸시 알림',
      pushover: '간단하고 신뢰할 수 있는 푸시 알림',
      callmebot: 'CallMeBot을 통한 무료 WhatsApp 알림',
      webhook: '모든 URL에 일반 HTTP POST',
      homeassistant: 'Home Assistant 대시보드의 지속적인 알림',
      bark: 'Bark를 통한 iOS 푸시 알림(셀프 호스팅 가능)'
    },
    lastSuccess: '마지막: {{date}}',
    error: '오류',
    printer: '프린터:',
    allPrinters: '모든 프린터',
    sendTestNotification: '테스트 알림 전송',
    eventSettings: '이벤트 설정',
    enabled: '활성화됨',
    sendFromProvider: '이 제공자에서 알림 전송',
    printEvents: '인쇄 이벤트',
    printerStatus: '프린터 상태',
    amsAlarms: 'AMS 알람',
    amsHtAlarms: 'AMS-HT 알람',
    printQueue: '인쇄 대기열',
    start: '시작',
    plateCheck: '플레이트 확인',
    complete: '완료',
    failed: '실패',
    stopped: '중지됨',
    progress: '진행률',
    offline: '오프라인',
    lowFilament: '필라멘트 부족',
    maintenance: '유지 관리',
    amsHumidity: 'AMS 습도',
    amsTemp: 'AMS 온도',
    amsDryingSuspended: '건조 중단됨',
    amsHtHumidity: 'AMS-HT 습도',
    amsHtTemp: 'AMS-HT 온도',
    bedCooled: '베드 냉각됨',
    firstLayer: '첫 번째 레이어',
    quiet: '방해 금지',
    digest: '요약 {{time}}',
    printStarted: '인쇄 시작됨',
    plateNotEmpty: '플레이트 비어 있지 않음',
    plateNotEmptyDescription: '인쇄 전 개체 감지됨',
    plateClearRequired: '플레이트 비움 확인 필요',
    plateClearRequiredDescription: '인쇄 완료, 대기열이 플레이트 확인을 기다림',
    plateClear: '플레이트 확인',
    printCompleted: '인쇄 완료됨',
    bedCooledLabel: '베드 냉각됨',
    bedCooledDescription: '인쇄 후 베드가 임계값 이하로 냉각됨',
    firstLayerCompleteLabel: '첫 번째 레이어 완료',
    firstLayerCompleteDescription: '첫 번째 레이어 완료 시 스냅샷과 함께 알림',
    missingSpoolAssignmentLabel: '스풀 할당 누락',
    billingChargeFailedLabel: '결제 처리 실패',
    billingChargeFailedDescription: '인쇄 비용을 기록하지 못한 경우 알림',
    missingSpoolAssignmentDescription: '인쇄 시작 시 필요한 트레이에 할당된 스풀이 없을 때 알림',
    printFailed: '인쇄 실패',
    printStopped: '인쇄 중지됨',
    progressMilestones: '진행률 이정표',
    progressMilestonesDescription: '25%, 50%, 75%에서 알림',
    printerOffline: '프린터 오프라인',
    printerError: '프린터 오류',
    aiFailureDetection: 'AI 실패 감지',
    aiFailureDetectionDescription: 'Obico AI가 인쇄 실패 가능성을 감지하면 알림',
    lowFilamentLabel: '필라멘트 부족',
    maintenanceDue: '유지 관리 필요',
    maintenanceDueDescription: '유지 관리가 필요할 때 알림',
    amsHumidityHigh: 'AMS 습도 높음',
    amsHumidityHighDescription: '일반 AMS 습도가 임계값 초과',
    amsTemperatureHigh: 'AMS 온도 높음',
    amsTemperatureHighDescription: '일반 AMS 온도가 임계값 초과',
    amsDryingSuspendedTitle: '자동 건조 중단',
    amsDryingSuspendedDescription: '습도가 임계값 아래로 내려가지 않아 AMS 유닛의 자동 건조를 중단했습니다',
    amsHtHumidityHigh: 'AMS-HT 습도 높음',
    amsHtHumidityHighDescription: 'AMS-HT 습도가 임계값 초과',
    amsHtTemperatureHigh: 'AMS-HT 온도 높음',
    amsHtTemperatureHighDescription: 'AMS-HT 온도가 임계값 초과',
    inventoryAlerts: '재고 알림',
    stockReorderAlert: '재주문 알림',
    stockReorderAlertDescription: 'SKU가 재주문 시점에 도달함',
    stockBreakAlert: '재고 소진 알림',
    stockBreakAlertDescription: '보충 전에 재고가 소진될 것임',
    jobAdded: '작업 추가됨',
    jobAddedDescription: '대기열에 작업 추가됨',
    jobAssigned: '작업 할당됨',
    jobAssignedDescription: '모델 기반 작업이 프린터에 할당됨',
    jobStarted: '작업 시작됨',
    jobStartedDescription: '대기열 작업 인쇄 시작됨',
    jobWaiting: '작업 대기 중',
    jobWaitingDescription: '필라멘트 또는 프린터를 기다리는 작업',
    jobSkipped: '작업 건너뜀',
    jobSkippedDescription: '작업 건너뜀 (이전 실패)',
    jobFailed: '작업 실패',
    jobFailedDescription: '작업 시작 실패',
    queueComplete: '대기열 완료',
    queueCompleteDescription: '모든 대기열 작업 완료',
    quietHours: '방해 금지 시간',
    noNotificationsDuring: '이 시간 동안 알림 없음',
    editProviderToChangeQuietHours: '방해 금지 시간을 변경하려면 제공자를 편집하세요',
    dailyDigest: '일일 요약',
    batchNotifications: '알림을 하나의 일일 요약으로 묶기',
    sendAt: '{{time}}에 전송',
    editProviderToChangeDigestTime: '요약 시간을 변경하려면 제공자를 편집하세요',
    edit: '편집',
    deleteProvider: '알림 제공자 삭제',
    deleteConfirm: '"{{name}}"을(를) 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.',
    delete: '삭제',
    addTitle: '알림 제공자 추가',
    editTitle: '알림 제공자 편집',
    nameLabel: '이름 *',
    namePlaceholder: '내 알림',
    providerTypeLabel: '제공자 유형 *',
    configuration: '구성',
    testConfiguration: '구성 테스트',
    printerFilter: '프린터 필터',
    onlyFromPrinter: '이 프린터의 이벤트에 대한 알림만 전송',
    quietHoursDnd: '방해 금지 시간',
    quietStart: '시작',
    quietEnd: '종료',
    dailyDigestLabel: '일일 요약',
    sendDigestAt: '요약 전송 시각',
    digestCollected: '이벤트가 수집되어 이 시간에 하나의 요약으로 전송됩니다',
    notificationEvents: '알림 이벤트',
    progressPercent: '(25%, 50%, 75%)',
    bedCooledAfterPrint: '(인쇄 완료 후)',
    haSensorAlert: '센서 경고',
    haSensorAlertDescription: '(연결된 Home Assistant 센서에 주의가 필요합니다)',
    eventPriority: {
      sectionTitle: 'ntfy 우선순위',
      helpNtfy: '각 활성화된 이벤트에 대한 우선순위를 선택하세요. ntfy는 이를 사용하여 알림을 에스컬레이션합니다(소리, 가시성, 푸시 동작). 여기서 설정되지 않은 수준은 ntfy 서버 기본값을 사용합니다.',
      min: '최소',
      low: '낮음',
      default: '기본값',
      high: '높음',
      urgent: '긴급'
    },
    cancel: '취소',
    save: '저장',
    add: '추가',
    nameRequired: '이름이 필요합니다',
    fieldRequired: '{{field}}이(가) 필요합니다',
    haDataInvalid: 'Data 필드는 유효한 JSON 객체여야 합니다(예: {"priority": "high", "ttl": 0})',
    phoneNumber: '전화번호',
    apiKey: 'API 키',
    serverUrl: '서버 URL',
    topic: '토픽',
    authToken: '인증 토큰',
    userKey: '사용자 키',
    appToken: '앱 토큰',
    priority: '우선순위',
    pushoverRetry: '긴급 재알림 (초)',
    pushoverExpire: '긴급 만료 (초)',
    botToken: '봇 토큰',
    chatId: '채팅 ID',
    telegramThreadId: '포럼 주제 ID',
    telegramThreadIdHelp: '선택 사항. 포럼 그룹의 특정 주제로 전송합니다. 주제 링크의 마지막 숫자입니다 (t.me/c/.../25). 비워 두면 General 주제로 전송됩니다.',
    telegramThreadIdInvalid: '포럼 주제 ID는 숫자여야 합니다.',
    smtpServer: 'SMTP 서버',
    smtpPort: 'SMTP 포트',
    security: '보안',
    authentication: '인증',
    username: '사용자 이름',
    password: '비밀번호',
    fromEmail: '발신 이메일',
    toEmail: '수신 이메일',
    webhookUrl: 'Webhook URL',
    payloadFormat: '페이로드 형식',
    authorization: '인증',
    titleFieldName: '제목 필드 이름',
    messageFieldName: '메시지 필드 이름',
    editTemplate: '템플릿 편집: {{name}}',
    titleLabel: '제목',
    bodyLabel: '본문',
    titlePlaceholder: '알림 제목...',
    bodyPlaceholder: '알림 본문...',
    availableVariables: '사용 가능한 변수',
    clickToInsert: '클릭하여 본문의 커서 위치에 삽입',
    livePreview: '실시간 미리보기',
    hide: '숨기기',
    show: '표시',
    loadingPreview: '미리보기 불러오는 중...',
    enterTemplateContent: '미리보기를 보려면 템플릿 내용을 입력하세요',
    titlePreview: '제목:',
    bodyPreview: '본문:',
    resetToDefault: '기본값으로 초기화',
    titleRequired: '제목이 필요합니다',
    bodyRequired: '본문이 필요합니다',
    notificationLog: '알림 로그',
    showFailedOnly: '실패만',
    last24Hours: '최근 24시간',
    last7Days: '최근 7일',
    last30Days: '최근 30일',
    last90Days: '최근 90일',
    justNow: '방금',
    noFailedNotifications: '실패한 알림 없음',
    noNotificationsLogged: '기록된 알림 없음',
    unknownProvider: '알 수 없는 제공자',
    logTitle: '제목',
    logMessage: '메시지',
    logError: '오류',
    logProvider: '제공자: {{type}}',
    logTime: '시간: {{time}}',
    refresh: '새로고침',
    clearOld: '오래된 것 삭제',
    statsSummary: '최근 {{days}}일:',
    statsNotifications: '알림',
    statsSent: '{{count}}개 전송됨',
    statsFailed: '{{count}}개 실패',
    eventTypes: {
      print_start: '인쇄 시작됨',
      print_complete: '인쇄 완료',
      print_failed: '인쇄 실패',
      print_stopped: '인쇄 중지됨',
      print_progress: '진행률',
      printer_offline: '프린터 오프라인',
      printer_error: '프린터 오류',
      filament_low: '필라멘트 부족',
      maintenance_due: '유지 관리 필요',
      test: '테스트'
    },
    userEmail: {
      title: '알림',
      emailNotifications: '이메일 알림',
      emailNotificationsDesc: '내 인쇄 작업에 대한 이메일 알림을 받습니다. 이메일은 고급 인증에서 구성된 시스템 SMTP 설정을 사용하여 전송됩니다.',
      sendingTo: '알림이 전송될 주소',
      noEmailWarning: '계정에 이메일 주소가 없습니다. 관리자에게 연락하여 추가하세요.',
      printJobNotifications: '인쇄 작업 알림',
      printJobNotificationsDesc: '내가 제출한 인쇄 작업에 대해 이메일 알림을 트리거할 이벤트를 선택하세요.',
      printJobStarts: '인쇄 작업 시작',
      printJobStartsDesc: '인쇄 작업이 시작될 때 알림 받기.',
      printJobFinishes: '인쇄 작업 완료',
      printJobFinishesDesc: '인쇄 작업이 성공적으로 완료될 때 알림 받기.',
      printErrors: '인쇄 오류',
      printErrorsDesc: '인쇄 작업이 실패하거나 오류가 발생할 때 알림 받기.',
      printJobStops: '인쇄 작업 중지',
      printJobStopsDesc: '인쇄 작업이 취소되거나 중지될 때 알림 받기.',
      saveSuccess: '알림 환경 설정이 저장되었습니다.',
      saveError: '알림 환경 설정 저장 실패.'
    }
  },
  richTextEditor: {
    bold: '굵게',
    italic: '기울임',
    underline: '밑줄',
    bulletList: '글머리 기호 목록',
    numberedList: '번호 목록',
    alignLeft: '왼쪽 정렬',
    alignCenter: '가운데 정렬',
    alignRight: '오른쪽 정렬',
    addLink: '링크 추가',
    removeLink: '링크 제거'
  },
  externalLinks: {
    title: '사이드바 링크',
    sidebarLayout: '사이드바',
    sidebarLayoutDescription: '기본 제공 페이지를 표시하거나 숨기고, 외부 링크를 추가하고, 항목을 드래그하여 사이드바 탐색 순서를 변경하세요.',
    systemPages: 'Bambuddy 페이지',
    externalLinks: '외부 링크',
    visibleInSidebar: '사이드바에 표시',
    hiddenFromSidebar: '사이드바에서 숨김',
    requiredInSidebar: '사이드바에 필수',
    hidePage: '페이지 숨기기',
    showPage: '페이지 표시',
    settingsCannotBeHidden: '설정은 숨길 수 없습니다',
    noLinksConfigured: '구성된 외부 링크 없음',
    deleteLink: '링크 삭제',
    removeCustomIcon: '사용자 지정 아이콘 제거',
    openInNewTab: '새 탭에서 열기',
    placeholders: {
      linkName: '내 링크'
    }
  },
  keyboardShortcuts: {
    title: '키보드 단축키',
    navigation: '탐색',
    archivesSection: '아카이브',
    kProfilesSection: 'K-프로필',
    generalSection: '일반',
    shortcuts: {
      goToPrinters: '프린터로 이동',
      goToArchives: '아카이브로 이동',
      goToQueue: '대기열로 이동',
      goToStats: '통계로 이동',
      goToProfiles: '클라우드 프로필로 이동',
      goToSettings: '설정으로 이동',
      focusSearch: '검색 포커스',
      openUploadModal: '업로드 모달 열기',
      clearSelection: '선택 초기화 / 입력 포커스 해제',
      contextMenu: '카드 컨텍스트 메뉴',
      refreshProfiles: '프로필 새로고침',
      newProfile: '새 프로필',
      exitSelectionMode: '선택 모드 종료',
      showHelp: '이 도움말 표시'
    },
    footer: 'Esc를 누르거나 외부를 클릭하여 닫기'
  },
  notificationLog: {
    title: '알림 로그',
    events: {
      printStarted: '인쇄 시작됨',
      printComplete: '인쇄 완료',
      printFailed: '인쇄 실패',
      printStopped: '인쇄 중지됨',
      progress: '진행률',
      printerOffline: '프린터 오프라인',
      printerError: '프린터 오류',
      lowFilament: '필라멘트 부족',
      maintenanceDue: '유지 관리 필요',
      test: '테스트'
    },
    timeAgo: {
      justNow: '방금',
      minutesAgo: '{{minutes}}분 전',
      hoursAgo: '{{hours}}시간 전'
    }
  },
  restoreBackup: {
    title: '백업 복원',
    restoring: '복원 중...',
    restoreComplete: '복원 완료',
    restoreFailed: '복원 실패',
    importSettings: '백업 파일에서 설정 가져오기',
    pleaseWait: '데이터가 복원되는 동안 기다려 주세요',
    clickToSelect: '백업 파일 클릭하여 선택 (.json 또는 .zip)',
    howDuplicateHandling: '중복 처리 방법:',
    categories: {
      printers: '프린터',
      smartPlugs: '스마트 플러그',
      notificationProviders: '알림 제공자',
      filaments: '필라멘트',
      archives: '아카이브',
      pendingUploads: '대기 중인 업로드',
      settingsTemplates: '설정 및 템플릿'
    },
    matchingInfo: {
      printers: '일련번호로 일치',
      smartPlugs: 'IP 주소로 일치',
      notificationProviders: '이름으로 일치',
      filaments: '이름 + 유형 + 브랜드로 일치',
      archives: '콘텐츠 해시로 일치',
      pendingUploads: '파일 이름으로 일치',
      settingsTemplates: '항상 덮어씀'
    },
    replaceExisting: '기존 데이터 교체',
    keepExisting: '기존 데이터 유지',
    replaceDescription: '백업 데이터로 이미 존재하는 항목 덮어쓰기',
    keepDescription: '아직 존재하지 않는 항목만 복원',
    caution: '주의:',
    cautionText: '덮어쓰기는 현재 구성을 백업 데이터로 교체합니다. 보안상 프린터 액세스 코드는 절대 덮어쓰지 않습니다.',
    itemsRestored: '복원된 항목',
    itemsSkipped: '건너뛴 항목',
    restored: '복원됨',
    skipped: '건너뜀 (이미 존재)',
    filesLabel: '파일 (3MF, 썸네일 등)',
    newApiKeysGenerated: '새 API 키 생성됨',
    newApiKeysWarning: '이 키는 한 번만 표시됩니다. 지금 복사하세요!',
    processingBackup: '백업 파일 처리 중...',
    noDataFound: '백업 파일에서 복원할 데이터를 찾을 수 없습니다.',
    failedToRestore: '백업 복원 실패. 파일 형식을 확인하세요.'
  },
  backupExport: {
    title: '백업 내보내기',
    selectData: '포함할 데이터 선택',
    selectAll: '모두 선택',
    selectNone: '선택 없음',
    categoryDescriptions: {
      settings: '언어, 테마, 업데이트 환경 설정',
      notifications: 'ntfy, Pushover, Discord 등',
      templates: '사용자 지정 메시지 템플릿',
      smartPlugs: 'Tasmota 플러그 구성',
      externalLinks: '외부 서비스에 대한 사이드바 링크',
      printers: '프린터 정보 (액세스 코드 제외)',
      plateDetection: '빈 플레이트 기준 이미지',
      filaments: '필라멘트 유형 및 비용',
      maintenance: '사용자 지정 유지 관리 일정',
      archives: '모든 인쇄 데이터 + 파일 (3MF, 썸네일, 사진)',
      projects: '프로젝트, BOM 항목 및 첨부 파일',
      pendingUploads: '검토 대기 중인 가상 프린터 업로드',
      apiKeys: 'Webhook API 키 (가져오기 시 새 키 생성)'
    },
    requiresPrinters: '프린터 선택 필요',
    zipFileWarning: 'ZIP 파일이 생성됩니다.',
    zipFileDescription: '모든 3MF 파일, 썸네일, 타임랩스 및 사진을 포함합니다. 시간이 걸리고 파일이 커질 수 있습니다.',
    includeAccessCodes: '액세스 코드 포함',
    includeAccessCodesDescription: '다른 기기로 전송하는 경우',
    includeAccessCodesWarning: '액세스 코드가 평문으로 포함됩니다. 이 백업 파일을 안전하게 보관하세요!',
    categoriesSelected: '{{selectedCount}}개 카테고리 선택됨'
  },
  pendingUploads: {
    placeholders: {
      notes: '이 인쇄에 대한 메모 추가...'
    },
    discardUpload: '업로드 삭제',
    archiveAllUploads: '모든 업로드 아카이브',
    discardAllUploads: '모든 업로드 삭제',
    archive: '아카이브',
    timeAgo: {
      justNow: '방금',
      minutesAgo: '{{minutes}}분 전',
      hoursAgo: '{{hours}}시간 전',
      daysAgo: '{{days}}일 전'
    }
  },
  apiBrowser: {
    placeholders: {
      requestBody: 'JSON 요청 본문...',
      searchEndpoints: '엔드포인트 검색...'
    }
  },
  configureAmsSlot: {
    title: 'AMS 슬롯 구성',
    slotConfigured: '슬롯 구성됨!',
    configuringSlot: '슬롯 구성 중:',
    slotLabel: '{{ams}} 슬롯 {{slot}}',
    searchPresets: '프리셋 검색...',
    colorPlaceholder: '색상 이름 또는 16진수 (예: brown, FF8800)',
    clearCustomColor: '사용자 지정 색상 초기화',
    noCloudPresets: '클라우드 프리셋 없음. Bambu 클라우드에 로그인하여 동기화하세요.',
    noPresetsAvailable: '사용 가능한 프리셋 없음. Bambu 클라우드에 로그인하거나 로컬 프로필을 가져오세요.',
    noMatchingPresets: '일치하는 프리셋을 찾을 수 없습니다.',
    custom: '사용자 지정',
    builtin: '기본 제공',
    orcaCloud: 'Orca Cloud',
    bambuCloud: 'Bambu Cloud',
    settingsSentToPrinter: '설정이 프린터로 전송됨',
    filamentProfile: '필라멘트 프로필',
    kProfileLabel: 'K 프로필 (압력 전진)',
    filteringFor: '필터링 중: {{material}}',
    noKProfile: 'K 프로필 없음 (기본값 0.020 사용)',
    noMatchingKProfiles: '일치하는 K 프로필을 찾을 수 없습니다. 기본값 K=0.020이 사용됩니다.',
    otherKProfiles: '이 프린터의 다른 K 프로필',
    selectFilamentFirst: '먼저 필라멘트 프로필을 선택하세요',
    kFromCalibration: 'K={{value}} (프린터 보정에서)',
    customColorLabel: '사용자 지정 색상 (선택사항)',
    presetColors: '{{name}} 색상:',
    showLessColors: '색상 간략히 보기',
    showMoreColors: '더 많은 색상 보기',
    clear: '초기화',
    hexLabel: '16진수: #{{hex}}',
    resetting: '초기화 중...',
    resetSlot: '슬롯 초기화',
    cancel: '취소',
    configuring: '구성 중...',
    configureSlot: '슬롯 구성'
  },
  githubBackup: {
    title: 'Git 백업',
    history: '기록',
    downloadBackup: '백업 다운로드',
    restoreBackup: '백업 복원',
    noBackupsYet: '아직 백업 없음'
  },
  emailSettings: {
    placeholders: {
      fromName: 'Bambuddy'
    }
  },
  tagManagement: {
    searchTags: '태그 검색...',
    renameTag: '태그 이름 바꾸기',
    deleteTag: '태그 삭제'
  },
  notificationTemplates: {
    placeholders: {
      title: '알림 제목...',
      body: '알림 본문...'
    }
  },
  batchTag: {
    placeholders: {
      newTag: '새 태그 입력...'
    }
  },
  photoGallery: {
    deletePhoto: '사진 삭제'
  },
  filamentHoverCard: {
    copySpoolUuid: '스풀 UUID 복사'
  },
  kProfilesView: {
    hasNote: '메모 있음',
    copyProfile: '프로필 복사'
  },
  layout: {
    openMenu: '메뉴 열기',
    noPermissionSystemInfo: '시스템 정보를 볼 권한이 없습니다'
  },
  dashboard: {
    dragToReorder: '드래그하여 순서 변경',
    hideWidget: '위젯 숨기기'
  },
  notificationProviderCard: {
    deleteNotificationProvider: '알림 제공자 삭제'
  },
  fileManagerModal: {
    closeFileManager: '파일 관리자 닫기',
    sortFiles: '파일 정렬',
    goToParentFolder: '상위 폴더로 이동',
    threeView: '3D 보기'
  },
  embeddedCameraViewer: {
    refreshStream: '스트림 새로고침',
    close: '닫기',
    zoomOut: '축소',
    resetZoom: '배율 초기화',
    zoomIn: '확대',
    dragToResize: '드래그하여 크기 조정'
  },
  timelapseViewer: {
    skipBack5s: '5초 뒤로',
    skipForward5s: '5초 앞으로'
  },
  notificationProviders: {
    descriptions: {
      email: 'SMTP 이메일 알림',
      telegram: 'Telegram 봇을 통한 알림',
      discord: 'Webhook을 통해 Discord 채널로 전송',
      ntfy: '무료, 자체 호스팅 가능한 푸시 알림',
      pushover: '간단하고 신뢰할 수 있는 푸시 알림',
      callmebot: 'CallMeBot을 통한 무료 WhatsApp 알림',
      webhook: '모든 URL에 일반 HTTP POST'
    }
  },
  logViewer: {
    searchPlaceholder: '메시지 또는 로거 이름 검색...',
    noLogEntries: '로그 항목을 찾을 수 없음'
  },
  switchbarPopover: {
    noSwitchesInSwitchbar: '스위치바에 스위치 없음'
  },
  projectPageModal: {
    placeholders: {
      title: '제목',
      designer: '디자이너',
      license: '라이선스',
      description: '설명 입력...',
      profileTitle: '프로필 제목',
      profileDescription: '프로필 설명...'
    }
  },
  SpoolmanSettings: {},
  time: {
    unknown: '-',
    waiting: '대기 중',
    justNow: '방금',
    now: '지금',
    minsAgo: '{{count}}분 전',
    inMins: '{{count}}분 후',
    hoursAgo: '{{count}}시간 전',
    inHours: '{{count}}시간 후',
    daysAgo: '{{count}}일 전',
    inDays: '{{count}}일 후'
  },
  spoolbuddy: {
    nav: {
      dashboard: '대시보드',
      ams: 'AMS',
      inventory: '재고',
      writeTag: '태그 쓰기',
      settings: '설정'
    },
    status: {
      nfcReady: 'NFC 준비됨',
      nfcOff: 'NFC 꺼짐',
      offline: '오프라인',
      online: '온라인',
      noPrinters: '프린터 없음',
      deviceOffline: '장치 오프라인',
      waitingConnection: '장치 연결 대기 중...',
      systemReady: '시스템 준비됨',
      status: '상태'
    },
    dashboard: {
      readyToScan: '스캔 준비됨',
      idleMessage: '스풀을 저울에 올려 식별하세요',
      nfcHint: 'NFC 태그가 자동으로 읽힙니다',
      device: '장치',
      syncWeight: '무게 동기화',
      weightSynced: '동기화됨!',
      unknownTag: '알 수 없는 태그',
      newTag: '새 태그 감지됨',
      onScale: '저울 위',
      linkSpool: '스풀에 연결',
      linkTagTitle: '태그를 스풀에 연결',
      linkTag: '태그 연결',
      selectSpool: '이 태그를 연결할 스풀 선택:',
      noUntagged: '태그 없는 스풀을 찾을 수 없음',
      tagDetected: '태그 감지됨',
      noTag: '태그 없음',
      tagId: '태그',
      grossWeight: '총 무게',
      spoolSize: '스풀 크기',
      close: '닫기',
      currentSpool: '현재 스풀',
      plateReady: '플레이트 준비됨: {{name}}',
      plateReadyLabel: '초기화할 플레이트',
      plateClearAction: '초기화',
      plateClearedToast: '플레이트가 초기화됨으로 표시됨',
      plateClearFailed: '플레이트를 초기화됨으로 표시할 수 없음'
    },
    modal: {
      spoolDetected: '스풀 감지됨',
      assignToAms: 'AMS에 할당',
      syncWeight: '무게 동기화',
      weightSynced: '동기화됨!',
      syncing: '동기화 중...',
      newTagDetected: '새 태그 감지됨',
      addToInventory: '재고에 추가',
      assignToAmsTitle: 'AMS에 할당',
      selectSlot: '슬롯 선택',
      assign: '할당',
      assigning: '할당 중...',
      assignSuccess: '할당됨!',
      assignPendingInsert: '할당됨. 스풀을 삽입하면 슬롯이 구성됩니다.',
      assignError: '스풀 할당 실패. 다시 시도하세요.',
      noPrinterSelected: '프린터 선택...',
      noAmsDetected: '이 프린터에서 AMS가 감지되지 않음',
      slot: '슬롯'
    },
    weight: {
      noReading: '읽기 없음',
      stable: '안정됨',
      measuring: '측정 중...',
      tare: '영점 조정',
      calibrate: '보정'
    },
    spool: {
      remaining: '남은 양',
      material: '재료',
      brand: '브랜드',
      color: '색상',
      coreWeight: '코어',
      labelWeight: '라벨',
      scaleWeight: '저울',
      netWeight: '순 무게',
      lastUsed: '마지막 사용'
    },
    ams: {
      noData: 'AMS가 감지되지 않음',
      connectAms: '필라멘트 슬롯을 보려면 AMS를 연결하세요',
      noPrinter: '선택된 프린터 없음',
      selectPrinter: '상단 표시줄에서 프린터를 선택하세요',
      printerDisconnected: '프린터 연결 끊김',
      humidity: '습도',
      level: '레벨',
      active: '활성',
      slot: '슬롯',
      empty: '비어 있음'
    },
    inventory: {
      search: '스풀 검색...',
      empty: '재고에 스풀 없음',
      noResults: '일치하는 스풀 없음',
      spools: '스풀',
      addSpool: '스풀 추가'
    },
    settings: {
      tabDevice: '장치',
      tabDisplay: '화면',
      tabScale: '저울',
      tabUpdates: '업데이트',
      nfcReader: 'NFC 리더',
      type: '유형',
      connection: '연결',
      notConnected: 'N/A',
      deviceInfo: '장치 정보',
      hostname: '호스트',
      uptime: '가동 시간',
      systemConfig: '백엔드 및 인증',
      backendUrl: 'Bambuddy 백엔드 URL',
      apiToken: 'API 토큰',
      apiTokenPlaceholder: 'API 토큰 입력',
      saveConfig: '구성 저장',
      systemQueued: '구성 대기 중.',
      nfcDiagnostic: 'NFC 진단',
      scaleDiagnostic: '저울 진단',
      readTagDiagnostic: '태그 읽기 진단',
      testNfc: '리더 테스트',
      testScale: '정확도 테스트',
      testReadTag: '태그 읽기',
      systemFieldsRequired: '백엔드 URL이 필요합니다.',
      brightness: '밝기',
      saved: '저장됨',
      noBacklight: 'DSI 백라이트가 감지되지 않음. 밝기 제어는 DSI 디스플레이가 필요합니다.',
      screenBlank: '화면 꺼짐 대기 시간',
      screenBlankDesc: '비활성 후 화면이 꺼집니다. 터치하여 깨우세요.',
      displayNote: '밝기는 소프트웨어 필터로 적용됩니다.',
      scaleCalibration: '저울 보정',
      currentWeight: '현재 무게',
      tareOffset: '영점',
      calFactor: '계수',
      knownWeight: '알려진 무게',
      calStep1: '저울에서 모든 물건을 제거하고 영점 설정을 누르세요.',
      calStep2: '저울에 알려진 무게를 올리세요.',
      setZero: '영점 설정',
      calibrateNow: '보정',
      calibrated: '보정됨',
      tareSet: '영점 조정 명령 전송됨. 장치 대기 중...',
      tareComplete: '영점 조정 완료!',
      tareTimedOut: '영점 조정 시간 초과 — SpoolBuddy 데몬이 실행 중인가요?',
      tareFailed: '영점 조정 명령 전송 실패',
      zeroSet: '영점이 설정됨. 저울에 알려진 무게를 올리세요.',
      calibrationDone: '보정 완료!',
      calibrationFailed: '보정 실패',
      lastCalibrated: '마지막 보정',
      stable: '안정됨',
      settling: '안정화 중...',
      firmware: '펌웨어',
      scale: '저울',
      noDevice: 'SpoolBuddy 장치를 찾을 수 없음',
      daemonVersion: '데몬 버전',
      currentVersion: '현재',
      versionPending: '데몬 대기 중...',
      checking: '확인 중...',
      checkUpdates: '업데이트 확인',
      updateAvailable: '업데이트 사용 가능',
      updateInstructions: 'SSH를 통해 업데이트: SpoolBuddy 설치 스크립트를 실행하여 업그레이드하세요.',
      upToDate: '최신 버전',
      includeBeta: '베타 버전 포함'
    },
    writeTag: {
      tabExisting: '기존 스풀',
      tabNew: '새 스풀',
      tabReplace: '태그 교체',
      searchPlaceholder: '재료, 색상, 브랜드로 검색...',
      noUntaggedSpools: '태그 없는 스풀 없음',
      noTaggedSpools: '태그 있는 스풀 없음',
      selectSpool: '스풀을 선택한 후 빈 NTAG를 리더에 올려놓으세요',
      placeTag: 'NTAG를 리더에 올려놓으세요',
      tagReady: '태그 감지됨 — 쓰기 준비됨',
      writeTag: '태그 쓰기',
      replaceTag: '태그 교체',
      writing: '태그 쓰는 중...',
      waiting: 'SpoolBuddy 대기 중...',
      writeSuccess: '태그 성공적으로 쓰여짐!',
      writeFailed: '쓰기 실패',
      queueFailed: '쓰기 명령 대기 실패',
      tryAgain: '다시 시도',
      cancel: '취소',
      replaceWarning: '이전 태그가 연결 해제됩니다. 새 태그가 교체합니다.',
      deviceOffline: 'SpoolBuddy가 오프라인입니다',
      material: '재료',
      colorName: '색상 이름',
      color: '색상',
      brand: '브랜드',
      weight: '무게 (g)',
      createSpool: '스풀 생성',
      creating: '생성 중...',
      spoolCreated: '스풀 생성됨! 쓰기 준비됨.',
      createFailed: '스풀 생성 실패',
      incompleteDataWarning: '불완전한 Spoolman 데이터로 태그 쓰여짐'
    },
    quickMenu: {
      printerPower: '프린터 전원',
      systemControls: '시스템',
      restartDaemon: '데몬 재시작',
      restartBrowser: '브라우저 재시작',
      reboot: '재부팅',
      shutdown: '종료',
      swipeToClose: '아래로 스와이프하여 닫기',
      confirmTitle: '확인',
      confirmShutdown: 'SpoolBuddy를 종료하시겠습니까? 다시 켜려면 물리적 접근이 필요합니다.',
      confirmReboot: 'SpoolBuddy를 재부팅하시겠습니까?',
      confirmRestartDaemon: 'SpoolBuddy 데몬을 재시작하시겠습니까? NFC와 저울이 일시적으로 사용 불가능합니다.',
      confirmRestartBrowser: '키오스크 브라우저를 재시작하시겠습니까? 화면이 잠시 꺼집니다.',
      confirm: '확인',
      confirmPlugOn: '{{name}}을(를) 켜시겠습니까?',
      confirmPlugOff: '{{name}}을(를) 끄시겠습니까?',
      turnOn: '켜기',
      turnOff: '끄기'
    }
  },
  bugReport: {
    title: '버그 신고',
    description: '설명',
    descriptionPlaceholder: '무엇이 잘못되었나요? 문제를 설명해 주세요...',
    email: '이메일 (선택사항)',
    emailPlaceholder: 'your@email.com',
    emailPrivacy: '제공하면 이메일이 GitHub 이슈의 접힌 섹션에 포함되어 관리자가 후속 조치를 취할 수 있습니다.',
    screenshot: '스크린샷',
    uploadOrPaste: '이미지 업로드, 붙여넣기 또는 드래그',
    dataCollectedSummary: '보고서에 포함되는 데이터는?',
    dataIncluded: '포함됨:',
    dataIncludedList: '앱 버전, OS, 아키텍처, Python 버전, 데이터베이스 통계(개수만), 프린터 모델, 노즐 개수, 펌웨어 버전, 연결 상태, 통합 상태(Spoolman, MQTT, HA), 비민감 설정, 네트워크 인터페이스 수, Docker 세부 정보, 의존성 버전.',
    dataNeverIncluded: '절대 포함되지 않음:',
    dataNeverIncludedList: '프린터 이름, 일련 번호, 액세스 코드, 비밀번호, IP 주소, 이메일 주소, API 키, 토큰, Webhook URL, 호스트 이름 또는 사용자 이름.',
    submit: '제출',
    startLogging: '디버그 로깅 시작',
    stepEnableLogging: '디버그 로깅 활성화됨',
    stepReproduce: '이제 문제를 재현하세요',
    stepStopLogging: '중지 후 보고서 제출',
    stopAndSubmit: '중지 후 제출',
    maxDuration: '{{minutes}}분 후 자동 중지',
    stoppingLogs: '로그 수집 및 제출 중...',
    submitting: '버그 보고서 제출 중...',
    submitSuccess: '버그 보고서가 성공적으로 제출되었습니다!',
    submitFailed: '버그 보고서 제출 실패',
    thankYou: '감사합니다!',
    submitted: '버그 보고서가 제출되었습니다.',
    viewIssue: '이슈 보기',
    unexpectedError: '예상치 못한 오류가 발생했습니다',
    submittingStepConnection: '프린터 연결 확인 실행 중',
    submittingStepVirtualPrinters: '가상 프린터 설정 확인 실행 중',
    submittingStepLogScan: '알려진 문제가 있는지 최근 로그 스캔 중',
    submittingStepSubmit: 'GitHub에 보고서 제출 중',
    diagnosticChecking: '프린터 연결 확인 중...',
    diagnosticHealthy: '연결 확인 통과 — 프린터에서 문제가 발견되지 않았습니다.',
    diagnosticSummary: '{{total}}개 프린터 중 {{problems}}개에서 연결 문제가 있습니다',
    diagnosticIntro: '하나 이상의 프린터에 연결 문제가 있어 현재 문제의 원인일 수 있습니다. 아래에서 프린터를 펼쳐 수정 방법을 확인하세요 — 해결하면 버그 보고서 없이 문제가 해결될 수 있습니다. 아래에서 보고서를 제출할 수도 있습니다.',
    logHealthSummary: '로그에서 알려진 문제가 발견되었습니다',
    logHealthIntro: '최근 로그가 알려진 문제와 일치합니다. 아래 수정 방법을 확인하세요 — 해결하면 버그 보고서 없이 문제가 해결될 수 있습니다. 아래에서 보고서를 제출할 수도 있습니다.'
  },
  failureDetection: {
    title: 'AI 실패 감지',
    description: '자체 호스팅 Obico ML API로 인쇄를 모니터링하고 감지된 실패에 자동으로 조치합니다.',
    mlUrl: 'Obico ML API URL',
    mlUrlHint: '자체 호스팅 Obico ml_api 컨테이너의 기본 URL (예: http://192.168.1.10:3333).',
    mlToken: 'ML API 토큰 (선택 사항)',
    mlTokenPlaceholder: '서버가 ML_API_TOKEN 없이 실행 중이면 비워 두세요',
    mlTokenHint: 'Obico ml_api 컨테이너의 ML_API_TOKEN 환경 변수와 일치해야 합니다. 컨테이너가 토큰 없이 실행 중이면 비워 두세요.',
    test: '테스트',
    testSuccess: 'ML API에 도달 가능하며 정상입니다.',
    testSuccessTokenUnknown: 'ML API에 도달 가능하며 정상입니다. 토큰은 확인할 수 없었습니다.',
    testFailed: 'ML API에 도달할 수 없습니다.',
    sensitivity: '민감도',
    sensitivityLow: '낮음 (오탐 적음)',
    sensitivityMedium: '중간 (균형)',
    sensitivityHigh: '높음 (조기 감지, 오탐 많음)',
    sensitivityHint: '경고 및 실패를 트리거하는 신뢰도 임계값을 조정합니다.',
    action: '감지된 실패에 대한 조치',
    actionNotify: '알림만',
    actionPause: '인쇄 일시 중지',
    actionPauseOff: '일시 중지 후 전원 끄기',
    pollInterval: '폴링 간격 (초)',
    pollIntervalHint: '인쇄 중 각 프린터를 확인하는 빈도. 최소 5초, 최대 120초.',
    externalUrlMissing: '외부 URL이 설정되지 않았습니다.',
    externalUrlHint: 'ML API가 URL을 통해 카메라 스냅샷을 가져옵니다. ML API 컨테이너가 Bambuddy에 도달할 수 있도록 일반 설정에서 외부 URL을 설정하세요.',
    perPrinterTitle: '모니터링되는 프린터',
    perPrinterHint: '감지 서비스가 감시할 프린터를 선택하세요.',
    monitorAll: '연결된 모든 프린터 모니터링',
    statusTitle: '상태',
    serviceRunning: '서비스 실행 중',
    thresholds: '낮음 / 높음 임계값',
    activePrinters: '활성 인쇄물',
    noActivePrints: '현재 실행 중인 인쇄물 없음.',
    historyTitle: '최근 감지',
    noHistory: '아직 감지 없음.'
  },
  makerworld: {
    title: 'MakerWorld',
    description: 'MakerWorld 모델 URL을 붙여넣어 Bambu Handy 앱을 떠나지 않고 Bambuddy에서 직접 가져오고 인쇄하세요.',
    pasteUrlHeader: 'MakerWorld에서 가져오기',
    pasteUrlPlaceholder: 'https://makerworld.com/en/models/… 또는 MakerWorld 링크 붙여넣기',
    resolveButton: '확인',
    signInRequiredTitle: '다운로드하려면 Bambu 클라우드 로그인 필요',
    signInRequiredBody: '익명으로 모델 세부 정보를 탐색할 수 있지만 MakerWorld는 3MF 파일을 다운로드하려면 Bambu 클라우드 계정이 필요합니다.',
    signInExpiredTitle: 'Bambu 클라우드 로그인이 만료되었습니다',
    signInExpiredBody: 'Bambuddy에는 여전히 로그인되어 있지만 Bambu Lab이 저장된 토큰을 더 이상 허용하지 않아 다운로드가 실패합니다. Bambu 클라우드에 다시 로그인하세요.',
    openCloudSettings: '클라우드 설정 열기',
    untitledModel: '제목 없는 모델',
    byCreator: '{{name}} 제작',
    downloadsCount: '{{count}}회 다운로드',
    licensePrefix: '라이선스',
    alreadyImported: '이미 라이브러리에 있음',
    openOnMakerworld: 'MakerWorld에서 열기',
    alreadyInLibrary: '이 모델이 이미 라이브러리에 있습니다 — 파일 관리자 → MakerWorld에서 찾으세요',
    importSuccess: '{{filename}} 가져옴 — 파일 관리자 → MakerWorld에 저장됨',
    platesHeader: '플레이트 ({{count}})',
    plateDefaultName: '플레이트 {{n}}',
    materialCount: '{{count}}개 필라멘트',
    amsRequired: 'AMS 필요',
    slicedFor: '{{printer}}용으로 슬라이싱됨',
    alsoCompatible: '호환 가능으로도 표시됨: {{printers}}',
    importToLibrary: '저장',
    sliceIn: '{{slicer}}에서 저장 및 슬라이싱',
    disclaimer: 'MakerWorld 통합은 커뮤니티가 문서화한 API 엔드포인트를 사용합니다. Bambuddy는 MakerWorld 또는 Bambu Lab과 제휴하거나 이들의 승인을 받지 않았습니다.',
    lastImportSuccess: '라이브러리에 가져옴',
    lastImportAlreadyInLibrary: '이미 라이브러리에 있음',
    viewInLibrary: '파일 관리자에서 보기',
    openInBambuStudio: 'Bambu Studio에서 열기',
    openInOrcaSlicer: 'OrcaSlicer에서 열기',
    importTo: '파일 관리자로 가져오기',
    recentImportsHeader: '최근 가져오기',
    phaseResolving: '확인 중',
    phaseDownloading: '다운로드 중',
    folderAuto: 'MakerWorld (기본값)',
    importAll: '모두 가져오기',
    importAllProgress: '{{total}}개 중 {{current}}개 가져오는 중',
    openGallery: '이미지 갤러리 열기',
    galleryPrev: '이전 이미지',
    galleryNext: '다음 이미지',
    deleteImport: '라이브러리에서 제거',
    importDeleting: '제거 중…',
    importDeleted: '라이브러리에서 제거됨',
    confirmDelete: '라이브러리에서 {{filename}}을(를) 제거하시겠습니까? 로컬 파일이 삭제되지만 MakerWorld에서 다시 가져올 수 있습니다.',
    errors: {
      resolveFailed: 'MakerWorld URL을 확인할 수 없습니다.',
      downloadFailed: '다운로드 실패. 다시 시도하세요.',
      deleteFailed: '라이브러리에서 파일을 제거할 수 없습니다.'
    }
  },
  gcodeViewer: {
    filamentSlot: '필라멘트 {{n}}',
    loading: '툴패스를 읽는 중…',
    loadFailed: '이 파일의 G코드를 불러올 수 없습니다.',
    showTravel: '이동 경로',
    topLayer: '최상단 레이어',
    bottomLayer: '최하단 레이어',
    noSource: '미리 볼 파일이 지정되지 않았습니다.',
    view: {
      filament: '필라멘트',
      feature: '유형',
      height: '높이',
      width: '너비',
    },
    feature: {
      wall: '벽',
      sparseInfill: '성긴 채움',
      solidInfill: '솔리드 채움',
      bridge: '브리지 / 오버행',
      support: '서포트',
      skirt: '스커트 / 브림',
      gapFill: '틈 채움',
      ironing: '다림질',
      primeTower: '프라임 타워',
    },
    back: '뒤로',
    backToArchives: '인쇄 아카이브로 돌아가기',
    backToFiles: '파일 관리자로 돌아가기',
    plates: '플레이트',
    plateN: '플레이트 {{n}}',
  },
  libraryTrash: {
    title: '휴지통',
    headerButton: '휴지통',
    headerTooltip: '휴지통으로 이동된 파일 보기',
    backToFiles: '파일 관리자로 돌아가기',
    subtitleAdmin: '삭제된 파일은 {{days}}일 동안 여기에 보관된 후 자동 삭제됩니다. 이 보기는 모든 사용자의 휴지통 파일을 표시합니다.',
    subtitleUser: '삭제된 파일은 {{days}}일 동안 여기에 보관된 후 자동 삭제됩니다.',
    loading: '휴지통 불러오는 중…',
    loadError: '휴지통을 불러올 수 없습니다.',
    empty: '휴지통이 비어 있습니다.',
    summary: '{{count}}개 파일 · {{size}}',
    emptyTrash: '휴지통 비우기',
    restore: '복원',
    purgeNow: '지금 삭제',
    autoPurgeIn: '{{when}} 후 자동 삭제',
    days: '일',
    retentionLabel: '자동 삭제 기간',
    selectAll: '모두 선택',
    selectOne: '{{filename}} 선택',
    selectionCount: '{{count}}개 선택됨',
    bulkRestore: '선택 항목 복원',
    bulkPurge: '선택 항목 삭제',
    col: {
      filename: '파일',
      folder: '폴더',
      size: '크기',
      deleted: '휴지통 이동일',
      autoPurge: '자동 삭제일',
      owner: '소유자',
      actions: '작업'
    },
    confirm: {
      purgeTitle: '영구 삭제?',
      purgeBody: '{{filename}}이(가) 디스크에서 삭제되며 복원할 수 없습니다.',
      emptyTitle: '휴지통을 비우시겠습니까?',
      emptyBody: '{{count}}개의 모든 파일이 디스크에서 삭제됩니다. 이 작업은 취소할 수 없습니다.',
      bulkPurgeTitle: '선택한 파일을 영구 삭제하시겠습니까?',
      bulkPurgeBody: '선택한 {{count}}개 파일이 디스크에서 삭제되며 복원할 수 없습니다.',
      cta: '영구 삭제'
    },
    toast: {
      restored: '파일이 복원되었습니다.',
      restoreFailed: '파일을 복원할 수 없습니다.',
      purged: '파일이 영구 삭제되었습니다.',
      purgeFailed: '파일을 삭제할 수 없습니다.',
      emptied: '휴지통에서 {{count}}개 파일이 삭제되었습니다.',
      emptyFailed: '휴지통을 비울 수 없습니다.',
      retentionSaved: '자동 삭제가 {{days}}일로 설정되었습니다.',
      retentionFailed: '보존 설정을 저장할 수 없습니다.',
      bulkRestored: '{{count}}개 파일이 복원되었습니다.',
      bulkPurged: '{{count}}개 파일이 삭제되었습니다.'
    }
  },
  libraryPurge: {
    title: '오래된 파일 삭제',
    headerButton: '오래된 파일 삭제',
    headerTooltip: '오래된 파일을 휴지통으로 일괄 이동',
    description: '라이브러리에서 오래된 파일을 한 번에 정리합니다. 인쇄 기록이 있는 파일은 마지막 인쇄 날짜 기준으로, 한 번도 인쇄되지 않은 파일은 업로드 날짜 기준으로 계산됩니다.',
    ageLabel: '다음보다 오래된 파일 이동',
    days: '일',
    includeNeverPrinted: '한 번도 인쇄되지 않은 파일 포함',
    effectsTitle: '삭제 클릭 시 일어나는 일',
    effect1: '일치하는 파일이 휴지통으로 이동됩니다 — 디스크에서 아직 삭제되지 않습니다.',
    effect2: '보존 기간이 만료되기 전까지 언제든 휴지통에서 복원할 수 있습니다.',
    effect3: '보존 기간 후 휴지통 청소기가 디스크에서 영구적으로 제거합니다.',
    effect4: '외부(연결된) 폴더의 파일은 건너뜁니다 — Bambuddy는 자신이 소유하지 않은 바이트는 절대 삭제하지 않습니다.',
    previewLoading: '일치하는 파일 수 확인 중…',
    previewFailed: '삭제 미리보기를 불러올 수 없습니다.',
    previewSummary: '{{count}}개 파일 · {{size}}이(가) 휴지통으로 이동됩니다',
    andMore: '…및 {{count}}개 더',
    warning: '휴지통 파일은 보존 기간이 만료될 때까지 저장 공간을 차지합니다. 즉시 디스크를 확보하려면 나중에 휴지통을 비우세요.',
    confirmCta: '{{count}}개를 휴지통으로 이동',
    purging: '휴지통으로 이동 중…',
    toast: {
      success: '{{count}}개 파일을 휴지통으로 이동했습니다.',
      failed: '파일을 삭제할 수 없습니다.'
    }
  },
  libraryAutoPurge: {
    enableLabel: '오래된 파일 자동 삭제',
    enableDescription: '매일 한 번 관리자 삭제를 실행합니다. 파일이 먼저 휴지통으로 이동됩니다 — 즉시 삭제되지 않습니다.',
    ageLabel: '다음보다 오래된 파일 자동 삭제',
    ageDescription: '최소 7일, 최대 10년. 수동 삭제 버튼과 같은 날짜 규칙을 사용합니다.',
    days: '일',
    includeNeverPrinted: '한 번도 인쇄되지 않은 파일 포함',
    saveFailed: '자동 삭제 설정을 저장할 수 없습니다.'
  },
  archivePurge: {
    headerButton: '오래된 것 삭제',
    headerTooltip: '오래된 아카이브 일괄 삭제',
    title: '오래된 아카이브 삭제',
    description: '오래된 인쇄 기록을 정리합니다. 각 아카이브는 가장 최근 인쇄 완료 시점 기준으로 계산됩니다 — 아카이브를 다시 인쇄하면 날짜가 새로고침되므로 활성 작업은 절대 삭제되지 않습니다.',
    ageLabel: '다음 기간 동안 인쇄되지 않은 아카이브 삭제',
    days: '일',
    effectsTitle: '삭제 클릭 시 일어나는 일',
    effect1: '일치하는 각 아카이브가 데이터베이스에서 영구적으로 제거됩니다.',
    effect2: '3MF, 썸네일, 타임랩스, 소스 3MF, F3D 디자인 파일 및 사진 폴더가 모두 디스크에서 삭제됩니다.',
    effect3: '아카이브에 대한 휴지통이 없습니다 — 삭제는 즉각적이며 취소할 수 없습니다.',
    effect4: '아카이브를 다시 인쇄하면 날짜 카운터가 초기화되므로 여전히 사용하는 아카이브는 안전합니다.',
    previewLoading: '일치하는 아카이브 수 확인 중…',
    previewFailed: '삭제 미리보기를 불러올 수 없습니다.',
    previewSummary: '{{count}}개 아카이브 · {{size}}이(가) 삭제됩니다',
    andMore: '…및 {{count}}개 더',
    warning: '영구적입니다. 계속하기 전에 보관하고 싶은 것을 다운로드하거나 즐겨찾기에 추가하세요.',
    confirmCta: '{{count}}개 아카이브 삭제',
    purging: '삭제 중…',
    toast: {
      success: '{{count}}개 아카이브가 삭제되었습니다.',
      failed: '아카이브를 삭제할 수 없습니다.'
    },
    purgeStatsLabel: '통계에서도 제거',
    purgeStatsHint: '일치하는 아카이브를 빠른 통계(필라멘트, 시간, 비용, 에너지)에서 삭제합니다. 이 옵션 없이는 빠른 통계는 모든 기여를 유지하고 파일만 디스크에서 제거됩니다.'
  },
  archiveAutoPurge: {
    enableLabel: '오래된 아카이브 자동 삭제',
    enableDescription: '매일 한 번, 임계값 내에 인쇄되지 않은 아카이브를 영구적으로 삭제합니다. 아카이브를 다시 인쇄하면 카운터가 초기화됩니다. 휴지통 없음 — 삭제는 즉각적입니다.',
    ageLabel: '다음 기간 동안 인쇄되지 않은 아카이브 자동 삭제',
    ageDescription: '최소 7일, 최대 10년. 가장 최근 인쇄 완료 시점 기준 — 아카이브를 다시 인쇄하면 날짜가 새로고침됩니다. 아카이브, 3MF, 썸네일, 타임랩스 및 사진을 삭제합니다.',
    days: '일',
    runNow: '지금 아카이브 삭제',
    saveFailed: '자동 삭제 설정을 저장할 수 없습니다.',
    purgeStatsLabel: '통계에서도 제거',
    purgeStatsDescription: '활성화되면 일일 정리 작업도 각 삭제된 아카이브를 빠른 통계(필라멘트, 시간, 비용, 에너지)에서 제거합니다. 기본값 비활성화 — 빠른 통계는 기여를 유지하고 파일만 디스크에서 제거됩니다.'
  },
  cameraTokens: {
    scope: {
      camera_stream: '카메라 스트림',
      camwall: '카메라 월',
      overlay: '스트리밍 오버레이',
    },
    title: '카메라 API 토큰',
    navTitle: '카메라 API 토큰',
    description:
      'Home Assistant, Frigate, 키오스크 화면 등 안정적인 주소가 필요한 도구에 카메라 스트림을 삽입하기 위한 장기 토큰입니다. 범위는 생성할 때 선택하며, 토큰은 언제든지 취소할 수 있습니다.',
    loading: '불러오는 중…',
    confirmRevoke: {
      title: '이 토큰을 취소하시겠습니까?',
      body: '"{{name}}"을(를) 사용하는 모든 장치가 즉시 접근을 잃습니다. 이 작업은 취소할 수 없습니다.',
      cancel: '취소',
      confirm: '취소'
    },
    create: {
      scopeLabel: '범위',
      hintCameraStream:
        '카메라 스트림 토큰은 카메라 스트림과 스냅숏만 가져올 수 있습니다. Home Assistant, Frigate 등 카메라 하나를 삽입하는 용도로 사용하세요.',
      hintCamWall:
        '카메라 월 토큰은 로그인 없이 화면에서 /camwall을 엽니다. 모든 프린터의 이름과 상태, 카메라 스트림을 볼 수 있습니다. 파일 이름, 주소, 액세스 코드는 볼 수 없습니다.',
      hintOverlay:
        '스트리밍 오버레이 토큰은 로그인 없이 화면에서 /overlay/{printerId}을 엽니다 — OBS나 모든 라이브 방송용입니다. 프린터 한 대의 카메라 스트림과 화면에 표시되는 파일 이름을 포함한 실시간 인쇄 상태를 볼 수 있습니다. 주소나 액세스 코드는 볼 수 없습니다.',
      title: '새 토큰 만들기',
      nameLabel: '토큰 이름',
      namePlaceholder: '예: Home Assistant',
      daysLabel: '만료까지 일 수',
      submit: '만들기',
      hint: '최대 수명은 365일입니다. 토큰 값은 생성 시 한 번만 표시됩니다 — 지금 복사하세요.'
    },
    created: {
      camWallUrlTitle: '이 화면용 카메라 월 주소',
      camWallUrlHint:
        '이 주소를 화면에서 여세요. 주소를 읽을 수 있는 사람은 누구나 월을 볼 수 있으므로 열쇠처럼 다루세요. 토큰을 취소하면 해당 화면의 접근이 차단됩니다.',
      overlayUrlTitle: 'OBS용 오버레이 주소',
      overlayUrlHint:
        'OBS에서 이것을 브라우저 소스로 추가하세요. /overlay/1의 숫자를 프린터의 번호(프린터 페이지의 주소에 표시됨)로 변경하세요. 주소를 읽을 수 있는 사람은 누구나 스트림을 볼 수 있으므로 열쇠처럼 다루세요 — 접근을 차단하려면 토큰을 취소하세요.',
      title: '토큰 생성됨 — 지금 복사하세요',
      warning: '이 토큰은 이 번만 볼 수 있습니다. 이 대화상자를 닫으면 다시는 볼 수 없습니다.',
      copy: '복사',
      dismiss: '저장했습니다'
    },
    list: {
      scope: '범위',
      myTitle: '내 토큰',
      allTitle: '모든 사용자 (관리자 보기)',
      empty: '아직 토큰 없음.',
      name: '이름',
      owner: '소유자',
      prefix: '접두사',
      created: '생성일',
      expires: '만료일',
      lastUsed: '마지막 사용',
      revoke: '취소',
      expired: '만료됨'
    },
    toast: {
      created: '토큰 생성됨',
      createFailed: '토큰 생성 실패',
      revoked: '토큰 취소됨',
      revokeFailed: '토큰 취소 실패',
      loadFailed: '토큰 불러오기 실패',
      copied: '클립보드에 복사됨',
      copyFailed: '복사 실패 — 수동으로 선택하여 복사하세요'
    }
  },
  forecast: {
    title: '예측',
    noSpools: '활성 스풀을 찾을 수 없습니다. 예측 데이터를 보려면 재고에 스풀을 추가하세요.',
    noUsageData: '사용 데이터를 사용할 수 없습니다 — 재고 타임라인을 예측할 수 없습니다.',
    sku: 'SKU',
    material: '재료',
    stock: '재고',
    dailyRate: '소비율',
    daysLeft: '남은 일수',
    emptyBy: '소진 예정일',
    reorderBy: '재주문 기한',
    actions: '작업',
    trend: '추세',
    estimated: '추정',
    noData: '데이터 없음',
    timeframe: '기간',
    chartTitle: '예상 재고 — 상위 5개 재료',
    dashedLinesROP: '점선 = 재주문 시점',
    stockLevel: '재고 수준',
    reorderPoint: '재주문 시점',
    safetyMargin: '안전 마진',
    trendLegend: '추세 (기록 기반, 95% 서비스 수준)',
    estimatedLegend: '추정 (무게 변화)',
    noDataLegend: '데이터 없음',
    ropLabel: 'ROP',
    ssLabel: 'SS',
    safetyStockLegend: '안전 재고',
    stockArrivalLegend: '재고 입고',
    stockoutLegend: '재고 소진',
    alertCount_one: '{{count}}개 알림',
    alertCount_other: '{{count}}개 알림',
    order: '주문',
    save: '저장',
    cancel: '취소',
    settingsSaved: '설정 저장됨',
    failedSaveSettings: '설정 저장 실패',
    globalLeadTimeSaved: '전역 리드 타임 저장됨',
    globalLeadTime: '전역 리드 타임',
    globalLeadTimeHint: '전역 리드 타임 하한값 — 모든 SKU의 재주문 시점 계산에 사용됨',
    skuLeadTimeOverride: 'SKU 리드 타임 재정의',
    skuLeadTimeHint: '0 = 전역 리드 타임 사용. 이 SKU에 대해 재정의하려면 >0으로 설정.',
    safetyMarginLabel: '안전 마진',
    effectiveLeadTime: '유효 리드 타임',
    effectiveLeadTimeHint: 'max(전역 {{global}}일, SKU {{sku}}일)',
    reorderPointHint: 'd̄ × LT + 안전 마진 — 재고가 이 수준에 도달하면 주문',
    safetyMarginHint: '통계적 안전 재고 (z=1.65 × σ × √LT) + 사용자 정의 버퍼',
    safetyMarginHintDays: '통계적 안전 재고 위에 추가되는 버퍼.{{approx}}',
    safetyMarginHintDaysApprox: ' ≈ 현재 소비율로 {{g}}g.',
    safetyMarginHintG: '통계적 안전 재고 위에 추가되는 고정 무게 버퍼.{{approx}}',
    safetyMarginHintGApprox: ' ≈ 현재 소비율로 {{days}}일.',
    individualSpools: '개별 스풀',
    labelWeight: '라벨',
    spoolCount_one: '스풀 {{count}}개',
    spoolCount_other: '스풀 {{count}}개',
    stockBreakRisk: '재고 소진 위험',
    stockBreakDetail: '{{days}}일 남음, 리드 타임 {{lt}}일.',
    stockBreakBefore: '보충 전 재고 소진',
    reorderNow: '지금 재주문',
    reorderTriggerPassed: '트리거 날짜 {{date}}가 지났습니다.',
    shoppingList: '쇼핑 목록',
    shoppingListItems_one: '({{count}}개 항목)',
    shoppingListItems_other: '({{count}}개 항목)',
    shoppingListEmpty: '쇼핑 목록이 비어 있습니다. 항목을 추가하려면 행의 장바구니 아이콘을 클릭하세요.',
    addToCart: '쇼핑 목록에 추가',
    alertsSnoozed: '이 SKU의 알림 음소거',
    alertsEnabled: '이 SKU의 알림 음소거 해제',
    addedToCart: '쇼핑 목록에 추가됨',
    failedAddItem: '항목 추가 실패',
    listView: '목록',
    logisticsView: '물류',
    qty: '수량',
    weight: '무게',
    leadTime: '리드 타임',
    expectedRestock: '예상 재입고',
    status: '상태',
    note: '메모',
    pending: '대기 중',
    purchased: '구매됨',
    received: '수령됨',
    markPurchased: '구매됨으로 표시',
    markReceived: '수령됨으로 표시 — 재고에 스풀 추가',
    resetToPending: '대기 중으로 초기화',
    remove: '제거',
    clearAll: '모두 초기화',
    downloadCsv: 'CSV',
    addToCartTitle: '쇼핑 목록에 추가',
    byQuantity: '수량 기준',
    byDuration: '기간 기준',
    numberOfSpools: '스풀 수',
    lastHowManyDays: '몇 일 동안 지속되어야 합니까?',
    noUsageQty: '사용 데이터 없음 — 수량을 1로 설정합니다.',
    noteOptional: '메모 (선택사항)',
    notePlaceholder: '예: 프로젝트 X용, 긴급…',
    addNSpools_one: '스풀 {{count}}개 추가',
    addNSpools_other: '스풀 {{count}}개 추가',
    onArrival: '입고 시',
    stockBreakIn: '{{days}}일 후 재고 소진.',
    stockRunsOutBefore: '{{lt}}일 리드 타임이 경과하기 전에 재고가 소진됩니다.',
    atRate: '{{rate}}g/일 소비율로',
    moreSpools_one: '스풀 {{count}}개 더',
    moreSpools_other: '스풀 {{count}}개 더',
    bridgeGap: '격차를 메우기 위해 필요합니다.',
    noReadAccess: '재고 예측을 볼 권한이 없습니다.',
    noWriteAccess: '예측 설정을 수정할 권한이 없습니다.'
  },
  diagnostic: {
    modalTitle: '연결 진단 — {{name}}',
    running: '진단 실행 중...',
    runningElapsed: '진단 실행 중... ({{elapsed}}초)',
    waitingForReportHint: '프린터가 상태 보고를 게시하기를 기다리는 중 — 최대 {{max}}초 걸릴 수 있습니다.',
    runFailed: '진단 실행 실패: {{error}}',
    retry: '다시 실행',
    runButton: '진단 실행',
    sectionTitle: '연결 진단',
    sectionDescription: '프린터가 연결되지 않거나 인쇄되지 않는 이유를 확인합니다 — 포트 연결 가능 여부, LAN 개발자 모드, Docker 네트워크 모드, 자격증명.',
    noPrinters: '구성된 프린터가 없습니다.',
    overall: {
      ok: '문제가 발견되지 않았습니다 — 프린터 연결이 정상입니다.',
      warnings: '프린터가 작동하지만 일부 항목에 주의가 필요합니다.',
      problems: '프린터가 연결되지 않거나 인쇄되지 않는 원인이 되는 문제가 발견되었습니다.'
    },
    check: {
      port_mqtt: {
        title: '제어 포트 (MQTT 8883)',
        pass: '연결 가능 — 프린터가 제어 연결을 수락하고 있습니다.',
        fail: '포트 8883에 연결할 수 없습니다. 프린터가 꺼져 있거나, IP 주소가 다르거나, 방화벽이 차단하고 있습니다. 프린터 IP를 확인하고 포트 8883이 차단되지 않았는지 확인하세요.'
      },
      port_ftps: {
        title: '파일 전송 포트 (FTPS 990)',
        pass: '연결 가능 — 인쇄 파일 전송이 작동합니다.',
        warn: '포트 990에 연결할 수 없습니다. 모니터링은 작동할 수 있지만 프린터로 파일 전송에 실패합니다. 포트 990이 차단되지 않았는지 확인하세요.',
        warn_no_tls: '포트 990은 열려 있지만 프린터의 파일 서비스가 TLS 핸드셰이크를 완료하지 못합니다. 인쇄 파일, 미리보기, 타임랩스를 가져올 수 없어 아카이브가 비어 있게 됩니다. 프린터를 재시작하세요 — 포트 차단을 해제해도 해결되지 않습니다.'
      },
      external_storage: {
        title: '전송된 파일을 외부 저장소에 저장 (설치 단계 4)',
        pass: '프린터가 이 옵션이 켜져 있다고 보고합니다 — 전송된 파일이 SD 카드에 저장되며 아카이브에 썸네일과 슬라이서 메타데이터가 포함됩니다.',
        fail: '프린터가 이 옵션이 꺼져 있다고 보고합니다. "전송된 파일을 외부 저장소에 저장"을 활성화하세요 — 최신 펌웨어 (P2S 01.02 / Bambu Studio 2.6 이상)에서는 프린터의 인쇄 설정에 토글이 있고, 이전 버전에서는 Bambu Studio / OrcaSlicer의 장치 탭에 있습니다. 이 옵션이 없으면 아카이브된 모든 인쇄물에 썸네일과 슬라이서 메타데이터가 없습니다.',
        skip: '확인되지 않음 — 활성 MQTT 연결이 필요합니다. 이 설정이 슬라이서에만 존재하는 이전 슬라이서에서는 프린터가 보고하지 않으므로, 옵션이 꺼져 있어도 이 검사는 통과합니다 — 설치 단계 4를 수동으로 확인하세요.',
        skip_unsupported_model: '이 모델에는 SD 슬롯이 있지만 옵션을 켤 방법이 없습니다 — 현재 P1 시리즈 펌웨어는 Bambu Studio에 토글을 표시하지 않으며 프린터에 화면도 없습니다. 여기서 고칠 것은 없습니다. Bambu Lab이 펌웨어로 지원할 때까지 보관된 출력물에는 썸네일과 슬라이서 메타데이터가 없을 수 있습니다.',
        fail_no_media: '옵션은 켜져 있지만 프린터 슬롯에 카드도 USB도 감지되지 않아 보낸 파일이 갈 곳이 없습니다. 하나 넣고 다시 출력하세요. 그전까지는 보관되는 모든 출력물에 썸네일과 슬라이서 메타데이터가 없습니다.',
        warn_internal_storage: '옵션이 켜져 있고 저장소도 있지만 이 프린터는 마지막 출력물을 Bambuddy가 읽을 수 없는 내부 저장소에 보관했습니다. H2 시리즈와 P2S 펌웨어가 이렇게 동작하며 어떤 설정으로도 바뀌지 않습니다. 출력물은 이름과 시간과 함께 보관되지만 썸네일과 슬라이서 메타데이터는 없습니다.',
      },
      port_rtsps: {
        title: '카메라 포트 ({{protocol}} {{port}})',
        pass: '연결 가능 — 카메라 스트림이 작동합니다.',
        warn: '포트 {{port}}에 연결할 수 없습니다. 라이브 카메라 보기가 작동하지 않습니다. 인쇄에는 영향을 주지 않습니다.'
      },
      network_mode: {
        title: 'Docker 네트워크 모드',
        pass: '호스트 네트워크 모드로 실행 중입니다.',
        warn: 'Bambuddy가 Docker 브리지 네트워킹으로 실행 중입니다. 프린터 검색과 가상 프린터에는 호스트 네트워크 모드가 필요합니다 — "network_mode: host"로 컨테이너를 재생성하세요.',
        skip: 'Docker에서 실행 중이 아닙니다 — 해당 없음.'
      },
      subnet: {
        title: '네트워크 서브넷',
        pass: '프린터와 Bambuddy가 같은 서브넷에 있습니다.',
        warn: '프린터({{printer_ip}})와 Bambuddy({{host_ip}})가 다른 서브넷에 있습니다. 서브넷 간 라우팅이 구성되어 있지 않으면 서로 연결하지 못할 수 있습니다.',
        skip: '서브넷을 확인할 수 없어 건너뜁니다.'
      },
      mqtt_auth: {
        title: '프린터 자격증명',
        pass: '프린터가 연결을 수락했습니다.',
        fail: '프린터에 도달할 수 있지만 Bambuddy가 연결되지 않았습니다. 액세스 코드 또는 시리얼 번호가 잘못됐을 가능성이 높습니다 — LAN 전용 모드나 개발자 모드를 토글할 때마다 액세스 코드가 변경되므로 프린터 화면에서 다시 복사하세요. 재부팅 중이거나 이미 동시 연결 한도에 도달한 프린터도 똑같이 보입니다.',
        fail_auth_rejected: '프린터가 Bambuddy의 자격증명을 거부했습니다. 액세스 코드 또는 시리얼 번호가 잘못됐습니다 — LAN 전용 모드나 개발자 모드를 토글할 때마다 액세스 코드가 변경됩니다. 프린터 화면에서 다시 복사한 뒤 프린터 설정에 저장하세요.',
        skip: '확인하지 않음 — 프린터에 연결할 수 없었습니다.'
      },
      developer_mode: {
        title: 'LAN 개발자 모드',
        pass: '개발자 모드가 활성화되어 있습니다.',
        fail: '프린터에서 개발자 모드가 꺼져 있습니다. 프린터의 LAN 설정에서 활성화하고 확인을 누르세요. 이 없으면 인쇄가 시작되지 않습니다.',
        skip: '확인할 수 없음 — 프린터에 연결되어 있어야 합니다.'
      },
      printer_publishing: {
        title: '프린터가 상태를 게시 중',
        pass: '프린터가 상태 업데이트를 게시하고 있습니다 — AMS, 필라멘트, K-프로파일이 슬라이서에 올바르게 반영됩니다.',
        fail: 'MQTT 브로커는 연결을 수락했지만 프린터가 상태 보고를 게시하지 않았습니다. 거의 항상 시리얼 번호가 잘못되었거나 대소문자가 일치하지 않아서 발생합니다 — device/<serial>/report 토픽은 대소문자를 구분합니다. 프린터 설정의 시리얼 번호를 프린터 화면 표시와 비교해 확인하세요.',
        skip: '확인할 수 없음 — 프린터에 연결되어 있어야 합니다.'
      }
    }
  },
  systemHealth: {
    sectionTitle: '시스템 상태',
    sectionDescription: '최근 로그에서 지원 티켓이 되기 전에 직접 해결할 수 있는 알려진 문제를 스캔합니다.',
    rescan: '다시 스캔',
    clean: '최근 {{times}}개 로그 항목에서 알려진 문제가 발견되지 않았습니다.',
    logUnavailable: '파일 로깅이 비활성화되어 로그를 스캔할 수 없습니다. 이 확인을 사용하려면 파일 로깅을 활성화하세요.',
    learnMore: '수정 방법',
    fixLabel: '수정:',
    occurrences: '{{times}}회 발견 — 마지막: {{lastSeen}}',
    category: {
      layer8: '직접 해결 가능',
      environment: '환경',
      bug: '버그 보고 바람'
    },
    signature: {
      "ftp-auth-rejected": {
        name: '프린터가 액세스 코드를 거부함',
        cause: '프린터가 파일 전송 로그인을 거부했습니다. 액세스 코드가 잘못됐거나 개발자 모드를 토글한 후 변경됐습니다.',
        fix: '프린터 화면(LAN 설정)에서 액세스 코드를 다시 복사하여 Bambuddy의 프린터 설정에서 업데이트하세요.'
      },
      "ftp-connection-timeout": {
        name: '파일 전송 연결 시간 초과',
        cause: 'Bambuddy가 프린터의 파일 전송 포트(FTPS 990)에 연결할 수 없었습니다. 포트가 차단됐거나 프린터가 꺼져 있거나 다른 서브넷에 있습니다.',
        fix: 'Bambuddy와 프린터 사이에서 포트 990을 차단하는 것이 없는지 확인하고, 같은 네트워크에 있는지 확인하세요.'
      },
      "ftp-ssl-error": {
        name: '보안 파일 전송 핸드셰이크 실패',
        cause: '프린터의 파일 서비스가 990 포트에서 TLS 없이 응답했습니다. 프린터 쪽 파일 서버가 멈춘 상태이며 방화벽이나 펌웨어 문제가 아닙니다.',
        fix: '프린터를 재시작하세요. 그때까지 인쇄 파일, 커버 이미지, 타임랩스를 가져올 수 없지만 인쇄 자체에는 영향이 없습니다.'
      },
      "bambu-cloud-captcha": {
        name: 'Bambu Cloud가 CAPTCHA를 요구합니다',
        cause: 'Bambu의 남용 방지 계층이 이 네트워크를 확인하고 있어 Bambu Cloud 로그인을 완료할 수 없습니다. 계정이나 이 설치 환경이 아니라 공용 IP 주소에 연결된 문제입니다.',
        fix: '기다리세요. 보통 몇 시간 안에 해제되며 로그인을 반복하면 더 길어집니다. 그동안에는 브라우저 세션에서 가져온 액세스 토큰으로 로그인하세요.'
      },
      "mqtt-connection-flapping": {
        name: '프린터 연결이 계속 끊김',
        cause: '제어 연결(MQTT 8883)이 반복적으로 끊어지고 다시 연결됩니다 — 주로 불안정한 네트워크 경로나 부분적으로 차단된 포트가 원인입니다.',
        fix: '프린터의 Wi-Fi 신호를 확인하고, 유선 연결을 권장하며, 포트 8883이 안정적으로 연결 가능한지 확인하세요.'
      },
      "camera-connection-refused": {
        name: '카메라 스트림 연결 불가',
        cause: '포트 RTSPS 322에서 라이브 카메라에 연결할 수 없었습니다. 포트가 차단됐거나 프린터에서 카메라 또는 LAN 라이브뷰가 꺼져 있습니다.',
        fix: '프린터에서 카메라와 LAN 라이브뷰를 활성화하고 포트 322가 차단되지 않았는지 확인하세요. 인쇄에는 영향을 주지 않습니다.'
      },
      "database-locked": {
        name: '데이터베이스 쓰기 경합',
        cause: 'SQLite 데이터베이스에 부하 시 "database is locked" 오류가 발생합니다 — 여러 프린터를 동시에 실행할 때 흔한 문제입니다.',
        fix: 'Bambuddy를 외부 PostgreSQL 데이터베이스로 전환하세요. 설명서의 PostgreSQL 가이드를 참고하세요.'
      }
    }
  },
  vpDiagnostic: {
    title: '설정 확인 — {{name}}',
    runButton: '설정 확인 실행',
    running: '설정 확인 실행 중...',
    runFailed: '설정 확인을 실행할 수 없습니다: {{error}}',
    retry: '다시 실행',
    overall: {
      ok: '모든 확인이 통과됐습니다 — 이 가상 프린터가 올바르게 설정되었습니다.',
      warnings: '가상 프린터가 작동하지만 일부 항목에 주의가 필요합니다.',
      problems: '슬라이서가 이 가상 프린터를 인식하거나 사용할 수 없는 원인이 되는 문제가 발견되었습니다.'
    },
    check: {
      enabled: {
        title: '가상 프린터 활성화',
        fail: '이 가상 프린터가 꺼져 있습니다. 검색 가능하게 하려면 켜세요.'
      },
      running: {
        title: '서비스 실행 중',
        fail: '가상 프린터가 활성화됐지만 서비스가 실행 중이 아닙니다. Bambuddy 로그를 확인하세요 — 바인드 IP 충돌이나 권한 오류가 보통 원인입니다.'
      },
      bind_interface: {
        title: '바인드 네트워크 인터페이스',
        fail: '바인드 인터페이스가 설정되지 않았거나 이 호스트에 더 이상 존재하지 않습니다. 바인드 인터페이스 드롭다운에서 현재 인터페이스를 선택하세요.'
      },
      access_code: {
        title: '액세스 코드 설정됨',
        fail: '액세스 코드가 설정되지 않았습니다. 슬라이서에는 여기에 설정한 것과 동일한 8자리 액세스 코드가 필요합니다.'
      },
      target_printer: {
        title: '대상 프린터',
        fail: '대상 프린터가 선택되지 않았습니다. 프록시 모드에는 실제 프린터가 필요합니다.',
        warn: '대상 프린터가 현재 오프라인입니다 — 재연결되면 프록시가 재개됩니다.'
      },
      port_ftps: {
        title: '파일 업로드 서비스 (포트 {{port}})',
        fail: '바인드 IP의 포트 {{port}}에서 수신 중인 서비스가 없어 슬라이서가 파일을 업로드할 수 없습니다. 이 인터페이스의 포트 충돌이 일반적인 원인입니다.'
      },
      port_mqtt: {
        title: '제어 서비스 (포트 {{port}})',
        fail: '바인드 IP의 포트 {{port}}에서 수신 중인 서비스가 없어 슬라이서가 연결하거나 상태를 표시할 수 없습니다.'
      },
      port_bind: {
        title: '검색 서비스 (포트 {{port}})',
        fail: '바인드 IP의 포트 {{port}}에서 수신 중인 서비스가 없어 슬라이서의 검색 핸드셰이크가 실패합니다.'
      },
      privileged_ports: {
        title: '특권 포트 바인딩',
        fail: '포트 {{port}}은(는) 1024 미만이며 이 서비스에는 바인딩 권한이 없습니다. 위에서 아무것도 수신 대기하지 않는 이유입니다. /etc/systemd/system/bambuddy.service에 AmbientCapabilities=CAP_NET_BIND_SERVICE를 추가하고 재시작하거나 "sudo setcap cap_net_bind_service=+ep $(readlink -f $(which python3))"를 실행하세요. Docker에서는 cap_add: [NET_BIND_SERVICE]를 추가합니다.',
      },
      certificate: {
        title: 'TLS 인증서',
        pass: '인증서가 준비됐습니다. Bambuddy CA 인증서(위)가 슬라이서의 신뢰 저장소에 가져와져 있는지 확인하세요.',
        fail: '이 가상 프린터의 TLS 인증서가 없습니다. Bambuddy 데이터 디렉터리가 쓰기 가능한지 확인하세요.'
      }
    }
  }
};
