import type { zhCN } from './zh-CN';
import { en } from './en';

// 한국어 (Beta) — AI 기계 번역 기반. 원어민 검토를 권장합니다.
// 구조는 zh-CN.ts 를 따릅니다. 새 key 를 추가할 때 ja.ts / ko.ts 도 동시에
// 갱신해 주세요(갱신되지 않은 key 는 ...en 으로 영어로 fallback 됩니다).
export const ko: typeof zhCN = {
  ...en,
  app: {
    name: 'OpenLess',
    tagline: '자연스럽게 말하고, 정확하게 작성하세요',
  },
  common: {
    loading: '로딩 중…',
    retry: '다시 시도',
    settingsLoadFailed: '설정 로드 실패',
    refresh: '새로고침',
    clear: '지우기',
    copy: '복사',
    delete: '삭제',
    later: '나중에',
    cancel: '취소',
    close: '닫기',
    show: '표시',
    hide: '숨기기',
    saved: '저장됨',
    saving: '저장 중',
    copied: '복사됨',
    operationFailed: '작업 실패',
    add: '추가',
    durationSeconds: '{{value}}초',
    durationMinutes: '{{value}}분',
  },
  capsule: {
    thinking: 'thinking',
    cancelled: '취소됨',
    error: '오류 발생',
    inserted: '{{count}}자 입력됨',
    translating: '번역 중',
  },
  qa: {
    thinking: '생각 중…',
    error: '오류가 발생했습니다. 잠시 후 다시 시도해 주세요.',
    errorRetry: '재시도',
    errorRetryHint: '{{recordHotkey}} 를 다시 눌러 질문하세요.',
    pinTooltip: '고정(자동으로 닫히지 않음)',
    unpinTooltip: '고정 해제',
    closeTooltip: '닫기',
    selectionPreview: '선택된 텍스트 기반:',
    emptyTitle: '{{recordHotkey}} 를 눌러 질문 시작',
    emptyDesc: '아무 앱에서 텍스트를 선택한 후 {{recordHotkey}} 를 한 번 눌러 녹음을 시작하고, 다시 한 번 눌러 종료 후 제출합니다. 답변이 여기에 표시되며 연속해서 후속 질문이 가능합니다.',
    recordingHint: '녹음 중… {{recordHotkey}} 를 다시 눌러 종료하고 질문',
    statusIdle: '{{recordHotkey}} 로 질문',
    statusRecording: '녹음 중',
    statusThinking: '생각 중',
    statusError: '오류',
  },
  nav: {
    overview: '개요',
    history: '기록',
    vocab: '어휘',
    style: '스타일',
    marketplace: '마켓',
    translation: '번역',
    selectionAsk: '선택 질문',
    localAsr: '모델 설정',
  },
  marketplace: {
    kicker: 'MARKETPLACE',
    title: '스타일 팩 마켓',
    desc: '커뮤니티 스타일 팩 둘러보기, 설치, 공유.',
    searchPlaceholder: '이름 / 설명 / 태그 검색…',
    sortPopular: '인기순',
    sortNew: '최신',
    uploadBtn: '업로드',
    uploadDisabledHint: '먼저 설정 → 마켓에서 GitHub 사용자명을 설정하세요',
    refreshBtn: '새로고침',
    empty: '아직 스타일 팩이 없습니다',
    emptyHint: '다른 키워드로 검색하거나 직접 업로드해 보세요',
    loadFailed: '불러오기 실패: {{err}}',
    noDescription: '(설명 없음)',
    installBtn: '설치',
    likeBtn: '좋아요',
    installed: '"{{name}}"을(를) 로컬에 설치했습니다',
    uploaded: '업로드 완료, 심사 대기 중',
    uploadTitle: '업로드할 팩 선택',
    uploadHint: '{{login}}(으)로 업로드합니다. 콘텐츠는 클라우드 심사 큐로 전송됩니다.',
    uploadNoLocal: '업로드 가능한 로컬 팩이 없습니다',
    errors: {
      detail: '상세 불러오기 실패: {{err}}',
      install: '설치 실패: {{err}}',
      like: '좋아요 실패: {{err}}',
      upload: '업로드 실패: {{err}}',
      loadLocal: '로컬 팩 불러오기 실패: {{err}}',
    },
    sortLiked: '좋아요한 팩',
    likedEmpty: '아직 좋아요한 팩이 없습니다',
    likedEmptyHint: '팩을 열고 별을 누르면 여기에 표시됩니다',
    derivativeBadge: '@{{login}}에서 파생',
    detail: {
      withdrawBtn: '게시 취소',
      withdrawConfirm: '"{{name}}"을(를) 마켓에서 내릴까요? 로컬 사본은 유지됩니다.',
      withdrawSuccess: '마켓에서 내렸습니다',
      withdrawFailed: '취소 실패: {{err}}',
    },
    myPacks: {
      buttonLabel: '내 게시물',
      buttonTitle: '{{login}}의 게시물 보기',
      buttonTitleEmpty: '먼저 설정 → 마켓에서 게시자 이름을 입력하세요',
      searchPlaceholder: '이름·태그 검색',
      notLoggedIn: '먼저 설정 → 마켓에서 게시자 이름을 입력하세요',
      emptyTitle: '아직 게시한 팩이 없습니다',
      emptyHint: '"스타일" 페이지에서 편집 후 "마켓에 게시"를 누르거나, 오른쪽 위에서 로컬 팩을 업로드하세요.',
      noMatch: '일치하는 팩이 없습니다',
      summary: '게시 {{count}}개',
      summaryPending: '게시 {{count}}개 · 심사 중 {{pending}}개',
      versionDate: 'v{{version}} · {{date}}',
      stats: '★ {{likes}} · ↓ {{downloads}}',
      actions: {
        update: '업데이트',
        withdraw: '내리기',
      },
      loadFailed: '내 게시물 불러오기 실패: {{err}}',
      loadingTitle: '불러오는 중…',
      loadingHint: '마켓에서 최신 게시물을 가져오는 중입니다.',
      loadErrorTitle: '불러오기 실패',
      loadErrorRetry: '다시 시도',
    },
    upload: {
      confirmBtn: '업로드 확정',
      updateTitle: '"{{name}}" 업데이트',
      updateHint: '업로드할 로컬 최신본을 선택하고 "업로드 확정"을 누르세요. 동명 팩이 기본 선택됩니다.',
      recommendedBadge: '권장',
    },
    state: {
      pending: '심사 중',
      approved: '게시됨',
      rejected: '거부',
      withdrawn: '내려짐',
      superseded: '신버전으로 대체',
      unknown: '알 수 없음',
    },
    oauth: {
      title: 'GitHub로 로그인',
      generating: '디바이스 코드 생성 중…',
      browserHint: '브라우저에서 {{uri}}을(를) 열고 아래 코드를 입력하세요:',
      copyBtn: '복사',
      copied: '디바이스 코드 복사됨',
      copyFailed: '복사 실패: {{err}}',
      openBrowserBtn: '브라우저 열기',
      cancelBtn: '취소',
      waiting: '브라우저에서 인증을 기다리는 중…',
      successAs: '@{{login}}(으)로 로그인',
      retryBtn: '다시 시도',
      closeBtn: '닫기',
      loginBtn: '로그인',
      loginTooltip: 'GitHub로 로그인',
      reloginTooltip: '다시 로그인 / 계정 전환(현재 @{{login}})',
    },
    modal: {
      loggedIn: '현재 로그인 ID — 설정 → 녹음 → 마켓에서 변경',
      notLoggedIn: '로그인되지 않음 — 설정 → 녹음 → 마켓에서 게시자 이름을 설정',
      notLoggedInLabel: '로그인 안 됨',
    },
  },
  shell: {
    shortcutLabel: '녹음 단축키',
    shortcutHint: '시작 / 정지',
    betaTag: 'BETA',
    betaNote: '모든 데이터는 로컬에만 저장됩니다.',
    footer: {
      account: '계정',
      feedback: '피드백',
      settings: '설정',
      help: '도움말',
      version: '버전 {{version}}',
      helpPopover: {
        tagline: '로컬 기반 음성 입력 레이어',
        releaseNotes: '릴리스 노트 보기 ↗',
        docs: '도움말 센터 ↗',
      },
    },
    providerPrompt: {
      title: '음성 공급자 설정',
      body: 'ASR 또는 LLM 공급자가 설정되지 않아 음성 입력과 정리가 일시적으로 작동하지 않습니다.',
      later: '나중에',
      openSettings: '설정 열기',
    },
    hotkeyModePrompt: {
      title: '녹음 방식 확인',
      body: '기본값이 토글로 변경되었습니다. 이전에 트리거 방식을 변경한 경우 녹음 설정에서 확인하세요.',
      later: '나중에 알림',
      openSettings: '녹음 설정 열기',
    },
  },
  onboarding: {
    welcome: 'OpenLess 에 오신 것을 환영합니다',
    intro: '로컬에서 말하고 로컬에서 입력합니다. 시작 전에 두 가지 시스템 권한이 필요합니다.',
    accessibilityTitle: '접근성',
    hotkeyTitle: '전역 단축키',
    accessibilityDesc: '전역 단축키(기본 {{trigger}}) 감지와 인식 결과를 커서 위치에 입력하기 위해 사용합니다.',
    hotkeyDesc: '전역 단축키 감지가 사용 가능한지 확인하기 위해 사용합니다.',
    micTitle: '마이크',
    micDesc: '음성 입력을 캡처하기 위해 사용합니다.',
    actionNotApplicable: '권한 불필요',
    actionGranted: '허용됨',
    actionOpenSystem: '시스템 설정 열기',
    actionGrant: '허용',
    actionRequestMic: '권한 대화상자 표시',
    accessibilityHint: '허용 후에는 **OpenLess 를 완전히 종료** 한 다음 다시 실행해야 합니다(macOS TCC 규칙).',
    footerHint: '모든 권한이 부여되면 이 가이드는 자동으로 닫힙니다. 닫히지 않으면 메뉴 막대의 OpenLess → 종료 후 앱을 다시 실행해 주세요.',
  },
  overview: {
    kicker: 'DASHBOARD',
    title: '오늘 개요',
    desc: '오늘의 받아쓰기 통계와 시스템 상태.',
    pressPrefix: '누르기',
    pressSuffix: '녹음 시작',
    asrKind: 'ASR 음성',
    llmKind: 'LLM 모델',
    asrName: 'Volcengine',
    asrSubname: 'bigmodel',
    llmName: 'OpenAI 호환',
    llmConfigured: '활성 LLM 구성됨',
    llmNotConfigured: '구성되지 않음',
    statusConfigured: '구성됨',
    statusNotConfigured: '구성되지 않음',
    statusUnknown: '읽을 수 없음',
    credentialsLoadError: '자격 증명 상태를 읽을 수 없습니다',
    metricChars: '오늘 글자 수',
    metricSegments: '{{count}} 세그먼트',
    metricDuration: '오늘 총 시간',
    metricAvg: '평균 세그먼트',
    metricAvgTrend: '오늘 평균',
    metricNoData: '데이터 없음',
    historyLoadError: '기록 로드 실패',
    metricTotal: '누적 기록',
    metricTotalTrend: '로컬 보관(상한 200)',
    weekTitle: '최근 7일',
    weekUnit: '건/일',
    recentTitle: '최근 인식',
    recentAll: '전체 보기 →',
    recentEmpty: '아직 기록이 없습니다. {{trigger}} 를 눌러 첫 녹음을 시작하세요.',
    recentLoadFailed: '최근 인식 기록을 불러올 수 없습니다. 다시 시도해 주세요.',
    historyRetry: '다시 시도',
    weekDays: ['일', '월', '화', '수', '목', '금', '토'],
  },
  history: {
    kicker: 'HISTORY',
    title: '기록',
    desc: '로컬에 저장된 인식 기록.',
    filterAll: '전체',
    summary: '총 {{total}}건 · 표시 {{shown}}',
    empty: '기록이 없습니다. {{trigger}} 를 눌러 한 번 녹음해 보세요.',
    loadFailed: '기록 로드 실패: {{err}}',
    retry: '다시 시도',
    clearFailed: '기록 비우기 실패: {{err}}',
    deleteFailed: '항목 삭제 실패: {{err}}',
    copyFailed: '복사 실패: {{err}}',
    playRecording: '녹음 재생',
    audioLoading: '로딩 중…',
    exportRecording: '녹음 내보내기',
    exportFailed: '내보내기 실패: {{err}}',
    rawLabel: '원문',
    rawEmpty: '(비어 있음)',
    selectHint: '왼쪽에서 하나를 선택하여 자세히 보기.',
    insertedTo: '입력 위치',
    chars: '{{count}}자',
    vocabHits: '핫워드 {{count}}개',
    inserted: '입력됨',
    pasteSent: '붙여넣기 시도됨',
    copiedFallback: '복사됨({{shortcut}} 필요)',
    insertFailed: '입력 실패',
    confirmClear: '전체 {{count}}건의 기록을 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.',
  },
  vocab: {
    kicker: 'VOCABULARY',
    title: '어휘',
    desc: '새 단어나 전문 용어를 추가하여 인식 정확도 향상.',
    sectionTitle: '항목',
    placeholder: '단어를 입력하고 Enter 또는 추가 클릭…',
    tip: '한영 혼용 지원 · 숫자로 시작하면 그대로 인식 · 적중 횟수 자동 카운트',
    loadFailed: '로드 실패: {{err}}',
    empty: '어휘가 없습니다. 위에 새 단어나 전문 용어를 입력하면 받아쓰기 시 우선 매칭됩니다.',
    tipDisabled: '클릭하여 비활성화',
    tipEnabled: '클릭하여 활성화',
    removeAria: '삭제',
    corrections: {
      title: '교정 규칙',
      tip: 'ASR 오인식 수정. {num} 숫자 와일드카드 지원.',
      patternPlaceholder: '오인식 표현, 예: {num}粒',
      replacementPlaceholder: '대상 표현, 예: {num}例',
      empty: '아직 교정 규칙이 없습니다.',
      invalid: '문자 그대로 바꾸기 또는 {num} 숫자 와일드카드 1개가 포함된 규칙만 지원합니다. 예: {num}粒 → {num}例.',
      tipDisabled: '이 규칙 비활성화',
      tipEnabled: '이 규칙 활성화',
      removeAria: '교정 규칙 삭제',
    },
    presets: {
      title: '시나리오 프리셋',
      tip: '다중 선택 일괄 적용 가능. 편집 및 생성 지원.',
      create: '프리셋 새로 만들기',
      apply: '선택 활성화',
      save: '프리셋 저장',
      edit: '{{name}} 편집',
      newPreset: '새 프리셋',
      namePlaceholder: '프리셋 이름',
      wordsPlaceholder: '어휘(쉼표 또는 줄바꿈으로 구분)',
    },
  },
  style: {
    kicker: 'STYLE',
    title: '출력 스타일',
    desc: '녹음의 기본 출력 스타일 선택.',
    masterToggle: '전체 활성화',
    currentDefault: '현재 기본',
    ariaSetDefault: '기본으로 설정',
    saveFailed: '저장 실패: {{error}}',
    customPromptTitle: '사용자 프롬프트',
    customPromptPlaceholder: '선택 사항입니다. 이 스타일의 기본 system prompt 끝에 추가됩니다.',
    customPromptHint: '비워 두면 현재 동작이 그대로 유지됩니다. 저장 후 이 스타일의 실시간 다듬기와 repolish 모두에 적용됩니다. Ctrl/Cmd+Enter로도 저장할 수 있습니다.',
    customPromptSave: '프롬프트 저장',
    customPromptDirty: '미저장',
    systemPromptMovedHint: '전체 system prompt 편집은 Settings -> Providers 로 이동했습니다. 이 페이지는 이제 스타일 활성화와 기본값만 다룹니다.',
    modes: {
      raw: { name: '원문', desc: '구두점과 필요한 문장 구분만 보충하고 다시 쓰거나 확장하지 않습니다.', sample: '원래 구어체 유지. "음", "그게" 같은 입버릇은 제거하지만 문장을 재구성하지 않습니다.' },
      light: { name: '가벼운 정리', desc: '입버릇 제거, 구두점 보충, 자연스럽게 보낼 수 있는 텍스트로 정리합니다.', sample: '원고를 읽는 듯한 느낌이 들지 않도록 어조와 표현 습관은 남기되, 문장이 매끄럽게 흐르도록 합니다.' },
      structured: { name: '명확한 구조', desc: '여러 주제나 단계가 있을 때 자동으로 항목별 목록으로 정리합니다.', sample: '1. 주제 1\na. 포인트\nb. 포인트\n2. 주제 2\na. 포인트\nb. 포인트' },
      formal: { name: '정식 표현', desc: '업무 커뮤니케이션과 메일에 적합. 더 전문적이고 완성도 높은 문체.', sample: '메일 시나리오에서 인사말과 맺음말을 자동 인식. 공허한 상투어는 추가하지 않습니다.' },
    },
    pack: {
      kicker: 'STYLE PACKS',
      title: '스타일 팩',
      desc: '로컬 스타일 팩 관리.',
      marketplaceBtn: '마켓',
      loadFailed: '스타일 팩 불러오기 실패: {{err}}',
      importZip: 'ZIP 가져오기',
      exportZip: 'ZIP 내보내기',
      exportShort: '내보내기',
      publishMarketplace: '마켓에 게시',
      updateMarketplace: '마켓 새 버전으로 업데이트',
      publishDisabledHint: '먼저 설정 → 마켓에서 GitHub 사용자명을 설정하세요',
      publishSuccess: '게시 완료, 마켓 심사 대기 중',
      publishFailed: '게시 실패: {{err}}',
      publishBuiltinRejected: '기본 팩은 직접 게시할 수 없습니다. 먼저 편집해서 가져오기 버전을 만드세요.',
      builtin: '기본',
      imported: '가져옴',
      active: '사용 중',
      activate: '활성화',
      edit: '편집',
      closeEditor: '닫기',
      unsaved: '저장 안 됨',
      listTitle: '로컬 팩',
      listDesc: '팩 둘러보기·전환.',
      listCount: '{{count}}개',
      addPackTileTitle: '새 팩',
      addPackTileHint: '빈 템플릿으로 시작.',
      createSuccess: '새 팩이 생성되었습니다',
      createFailed: '팩 생성 실패: {{err}}',
      save: '저장',
      revert: '되돌리기',
      saveSuccess: '스타일 팩이 저장되었습니다',
      saveFailed: '스타일 팩 저장 실패: {{err}}',
      activateSuccess: '"{{name}}"을(를) 사용 중으로 설정했습니다',
      activateFailed: '사용 중 설정 실패: {{err}}',
      importSuccess: '"{{name}}"을(를) 가져왔습니다',
      importFailed: 'ZIP 가져오기 실패: {{err}}',
      exportSuccess: '{{path}}에 내보냈습니다',
      exportFailed: 'ZIP 내보내기 실패: {{err}}',
      exportDirtyFirst: 'ZIP을 내보내기 전에 현재 팩을 저장하세요.',
      resetBuiltin: '재설정',
      resetSuccess: '"{{name}}"을(를) 재설정했습니다',
      resetFailed: '팩 재설정 실패: {{err}}',
      deleteImported: '삭제',
      deleteConfirm: '"{{name}}"을(를) 삭제할까요? 되돌릴 수 없습니다.',
      deleteSuccess: '"{{name}}"을(를) 삭제했습니다',
      deleteFailed: '팩 삭제 실패: {{err}}',
      summaryCurrentEmpty: '아직 팩이 선택되지 않았습니다',
      editorTitle: '팩 편집',
      editorDesc: '이 팩을 편집합니다.',
      metaTitle: '설치 정보',
      metaSource: '소스',
      metaBaseMode: '베이스 모드',
      metaUpdatedAt: '업데이트',
      fieldName: '이름',
      fieldAuthor: '작성자',
      fieldAuthorPlaceholder: '선택. 출처 표시용',
      fieldVersion: '버전',
      fieldTags: '태그',
      fieldTagsPlaceholder: '쉼표로 구분, 예: community, voiceover, formal',
      fieldDescription: '설명',
      fieldModel: '권장 모델(메타데이터)',
      fieldModelPlaceholder: '선택. 예: gpt-4.1 / deepseek-v3',
      fieldModelHint: '메타데이터일 뿐 실제 모델을 전환하지 않습니다.',
      fieldCompatibility: '호환 앱 버전',
      fieldCompatibilityPlaceholder: '선택. 예: >=1.3.0',
      fullPromptTitle: 'System Prompt',
      fullPromptHint: '이 팩만의 Prompt입니다.',
      promptChars: '{{count}}자',
      runtimeTitle: 'OpenLess 런타임 추가 지시',
      runtimeDesc: '읽기 전용 런타임 보조.',
      runtimeContextTitle: '컨텍스트 전제',
      runtimeContextDesc: '언어·앱 컨텍스트에서',
      runtimeContextEmpty: '현재 미리보기에는 추가되지 않습니다.',
      runtimeHotwordTitle: '핫워드 블록',
      runtimeHotwordDesc: '활성화된 핫워드에서',
      runtimeHotwordEmpty: '현재 미리보기에는 추가되지 않습니다.',
      runtimeHistoryTitle: '멀티턴 히스토리 가드',
      runtimeHistoryDesc: '실시간 멀티턴 polish 전용',
      runtimeHistoryEmpty: '이전 턴이 있을 때만 추가됩니다.',
      runtimeActive: '활성',
      runtimeInactive: '비활성',
      runtimePreviewFailed: '런타임 미리보기 생성 실패: {{err}}',
      runtimePreviewOmittedFrontApp: '미리보기에서 프런트앱 라벨이 생략되었습니다.',
      examplesTitle: '효과 예시',
      examplesDesc: '팩과 함께 내보내집니다.',
      addExample: '예시 추가',
      examplesEmpty: '아직 예시가 없습니다.',
      exampleTitlePlaceholder: '예시 {{index}} 제목',
      exampleInput: '입력',
      exampleOutput: '출력',
      examplesCount: '{{count}}개 예시',
      discardCloseConfirm: '저장하지 않은 변경 사항을 버리고 에디터를 닫을까요?',
      discardSwitchConfirm: '저장하지 않은 변경 사항을 버리고 "{{name}}"(으)로 전환할까요?',
      derivativeBadge: '@{{login}}에서 파생',
    },
  },
  translation: {
    kicker: 'TRANSLATION',
    title: '번역',
    desc: '녹음 후 대상 언어로 자동 번역하여 삽입.',
    statusEnabled: '활성화됨',
    statusDisabled: '비활성화됨',
    working: {
      title: '작업 언어',
      desc: '일상적으로 사용하는 언어를 선택하여 정리와 번역에 반영.',
    },
    target: {
      title: '번역 대상 언어',
      desc: '녹음 중 Shift 로 번역 실행. "비활성화" 시 Shift 무효.',
      disabled: '비활성화 (Shift 로 번역 발동 안 함)',
    },
    save: {
      workingFailed: '작업 언어 저장에 실패했습니다. 다시 시도하세요.',
      targetFailed: '번역 대상 언어 저장에 실패했습니다. 다시 시도하세요.',
      hotkeyRegisterFailed: '번역 단축키 등록에 실패했습니다. 설정은 저장되지 않았습니다.',
      hotkeySaveFailed: '번역 단축키 저장에 실패했습니다. 다시 시도하세요.',
    },
    howto: {
      title: '사용 방법',
      step1: '아무 입력 필드에 커서를 놓으세요.',
      step2: '{{trigger}} 를 눌러 녹음 시작.',
      step3: '녹음 중 Shift 를 한 번 눌러 번역 활성화.',
      step4: '다시 {{trigger}} 를 눌러 정지.',
      step5: '번역 결과가 커서 위치에 삽입됩니다.',
      indicatorTitle: '번역 모드 활성화 확인 방법',
      indicatorDesc: 'Shift 를 누르면 화면 하단에 파란색 "번역 중" 표시가 나타납니다.',
      fallbackTitle: '안전 폴백',
      fallbackDesc: '번역 실패 시 원본 전사가 삽입됩니다.',
    },
  },
  selectionAsk: {
    kicker: 'SELECTION ASK',
    title: '선택 질문',
    desc: '텍스트 선택 후 음성으로 질문. 다중 라운드 후속 질문 지원.',
    statusEnabled: '활성화됨',
    statusDisabled: '비활성화됨',
    hotkey: {
      title: '플로팅 창 단축키',
      desc: '패널 열기/닫기 제어. 패널 내 녹음은 {{recordHotkey}} 사용.',
      optionDisabled: '비활성화',
      chordWarning: '',
    },
    save: {
      hotkeyRegisterFailed: '선택 질문 단축키 등록에 실패했습니다. 설정은 저장되지 않았습니다.',
      hotkeySaveFailed: '선택 질문 단축키 저장에 실패했습니다. 다시 시도하세요.',
      historySaveFailed: 'Q&A 기록 설정 저장에 실패했습니다. 다시 시도하세요.',
    },
    history: {
      title: '기록 저장',
      desc: '활성화 시 Q&A 기록을 로컬에 저장. 기본 OFF.',
    },
    howto: {
      title: '사용 방법',
      step1: '{{hotkey}} 로 패널 열기.',
      step2: '아무 앱에서 텍스트 선택.',
      step3: '{{recordHotkey}} 로 녹음, 다시 눌러 제출.',
      step4: '{{recordHotkey}} 로 계속 후속 질문 가능.',
      step5: 'Esc 로 패널 닫기 및 기록 삭제.',
      windowTitle: '창 위치 + 드래그 + 고정',
      windowDesc: '패널은 드래그 가능하며 위치를 기억합니다. 고정하면 열린 상태 유지.',
      privacyTitle: '프라이버시 계약',
      privacyDesc: '선택 텍스트는 메모리에만 존재하며 패널 닫으면 삭제. 4000 자 초과 시 자동 축소.',
    },
  },
  settings: {
    kicker: 'SETTINGS',
    title: '설정',
    desc: '녹음, 공급자, 단축키, 권한 설정.',
    sections: {
      recording: '녹음',
      providers: '공급자',
      shortcuts: '단축키',
      permissions: '권한',
      language: '언어',
      advanced: '고급',
      about: '정보',
    },
    recording: {
      title: '녹음',
      desc: '전역 녹음의 단축키와 트리거 방식을 정의합니다.',
      hotkeyLabel: '녹음 단축키',
      hotkeyDescAcc: '누르면 음성 캡처 시작(전역). 접근성 권한이 필요합니다.',
      hotkeyDescNoAcc: '누르면 음성 캡처 시작(전역). 추가 권한 불필요.',
      modeLabel: '녹음 방식',
      modeDesc: '토글 방식 = 한 번 누르면 시작, 다시 누르면 종료; 눌러서 말하기 = 누르고 있는 동안만 녹음.',
      modeToggle: '토글 방식',
      modeHold: '눌러서 말하기',
      migrationNoticeTitle: '기본값이 토글 방식으로 변경됨',
      migrationNoticeDesc: '이전에 트리거 방식을 변경했다면 여기서 다시 한 번 확인해 주세요. 이번 업데이트는 단축키 방식의 기본값과 읽기 로직을 조정했습니다. "눌러서 말하기"가 더 익숙하다면 다시 전환할 수 있습니다.',
      microphoneLabel: '기본 선택 마이크',
      microphoneDesc: '우선 사용할 입력 장치를 선택합니다. 장치를 일시적으로 사용할 수 없으면 시스템 기본 마이크를 사용하고, 다시 연결되면 자동으로 우선 장치로 돌아갑니다.',
      microphoneDefault: '시스템 기본 마이크',
      microphoneDefaultDesc: '시스템 기본 입력 장치 사용',
      microphoneSystemDefault: '시스템 기본값',
      microphoneUnavailable: '사용할 수 없음',
      microphoneLoadError: '마이크 로드 실패: {{message}}',
      microphoneDialogTitle: '마이크',
      microphoneDialogDesc: '목소리를 받을 수 있는 마이크를 선택하세요. 미터가 움직이지 않으면 다른 마이크를 시도하세요.',
      microphoneMonitorError: '입력 레벨 모니터링 실패: {{message}}',
      capsuleLabel: '녹음 캡슐',
      capsuleDesc: '녹음 / 전사 중 화면 하단에 반투명 캡슐을 표시합니다.',
      muteDuringRecordingLabel: '녹음 중 음소거',
      muteDuringRecordingDesc: '녹음 중 시스템 출력을 일시적으로 음소거하여 스피커 에코를 방지합니다.',
      insertGroupTitle: '삽입 및 클립보드',
      restoreClipboardLabel: '입력 후 클립보드 복원',
      restoreClipboardDesc: '붙여넣기 성공 후 원래 클립보드 내용을 복원합니다 (Windows / Linux 만).',
      pasteShortcutLabel: '붙여넣기 단축키',
      pasteShortcutDesc: '삽입 시 시뮬레이션할 붙여넣기 단축키. 일부 터미널은 Ctrl+Shift+V 가 필요 (Windows / Linux 만).',
      pasteShortcutCtrlV: 'Ctrl+V (기본 / 대부분 앱)',
      pasteShortcutCtrlShiftV: 'Ctrl+Shift+V (kitty / alacritty / wezterm / 대부분 터미널)',
      pasteShortcutShiftInsert: 'Shift+Insert (xterm / urxvt)',
      comboRecordLabel: '단축키 녹화',
      comboRecordDesc: '클릭 후 원하는 단축키 조합(예: ⌘⇧D)을 누르세요. 토글 및 누르기 모드 모두 지원합니다.',
      comboRecordBtn: '단축키 녹화',
      comboRecordHint: '단축키 조합을 눌러 주세요…',
      comboRecorded: '녹화됨',
      comboClear: '지우기',
      comboConflict: '이 단축키 조합은 사용할 수 없습니다',
      allowNonTsfFallbackLabel: '비 TSF 폴백 허용',
      allowNonTsfFallbackDesc: 'Windows: TSF 입력이 실패하면 분할된 Unicode SendInput을 사용하고, 그래도 실패하면 텍스트를 클립보드에 복사합니다.',
      historyGroupTitle: '기록 및 컨텍스트',
      historyRetentionLabel: '기록 보관 기간(일)',
      historyRetentionDesc: '보관 기간을 초과한 기록은 새 항목 작성 시 정리됩니다. 0 = 시간 기반 정리 비활성화.',
      historyMaxEntriesLabel: '기록 개수 상한',
      historyMaxEntriesDesc: '로컬 보관 세션 상한. 빈칸 = 200. 범위 5–200.',
      polishContextWindowLabel: '대화 컨텍스트 윈도(분)',
      polishContextWindowDesc: '최근 N 분간 정리된 전사를 멀티턴 컨텍스트로 전달합니다. 0 = 비활성화.',
      recordAudioForDebugLabel: '원본 녹음 보관(디버그)',
      recordAudioForDebugDesc: '원시 마이크 오디오를 wav 로 저장하여 인식 문제 진단.',
      audioRecordingMaxEntriesLabel: '원본 녹음 보관 개수',
      audioRecordingMaxEntriesDesc: '로컬 보관 wav 파일 상한. 빈칸 = 200.',
      startupGroupTitle: '시작',
      startMinimizedLabel: '시작 시 메인 창 숨기기',
      startMinimizedDesc: '모든 시작 경로에서 메인 창을 열지 않고 메뉴 막대 / 트레이에서만 실행합니다.',
      autoUpdateCheckLabel: '자동 업데이트 확인',
      autoUpdateCheckDesc: '시작 시 및 60 분마다 자동 확인.',
      marketplaceGroupTitle: '스타일 팩 마켓플레이스',
      marketplaceBaseUrlLabel: '백엔드 URL',
      marketplaceBaseUrlDesc: '마켓플레이스 백엔드 URL. 빈칸은 기본값 사용.',
      marketplaceDevLoginLabel: 'GitHub 로그인 이름 (업로드 ID)',
      marketplaceDevLoginDesc: '업로더를 식별합니다. 빈칸 시 업로드 및 좋아요 비활성화.',
      startupAtBoot: '부팅 시 자동 시작',
      startupAtBootDesc: '로그인 시 OpenLess 자동 시작.',
      startupAtBootError: '자동 시작 전환 실패: {{message}}',
    },
    providers: {
      llmTitle: 'LLM 모델(정리)',
      llmDesc: 'OpenAI 호환 프로토콜, 다양한 공급자 전환 지원.',
      providerLabel: '공급자',
      llmProviderDesc: '선택 시 Base URL 기본값이 자동 입력됩니다.',
      credentialStorageNotice: '자격 증명은 OS 자격 증명 저장소에 보관됩니다.',
      codexOAuthNotice: 'Codex OAuth는 로컬 Codex 로그인 상태(~/.codex/auth.json)를 사용합니다. OpenLess는 API Key나 Base URL을 저장하지 않습니다.',
      asrProviderDesc: '전환 시 해당하는 자격 증명이 자동 선택됩니다.',
      asrTitle: 'ASR 음성(전사)',
      asrDesc: '구술을 실시간으로 텍스트로 전사합니다.',
      presets: {
        ark: 'ARK (Volcengine Ark)',
        deepseek: 'DeepSeek',
        siliconflow: 'SiliconFlow',
        openai: 'OpenAI',
        gemini: 'Google Gemini',
        codexOAuth: 'Codex OAuth',
        mimo: 'Xiaomi MiMo',
        cometapi: 'CometAPI',
        openrouterFree: 'OpenRouter(무료 모델)',
        alibabaCoding: 'Alibaba Cloud Coding Plan',
        codingPlanX: 'CodingPlanX',
        custom: '사용자 정의',
        asrVolcengine: 'Volcengine bigasr',
        asrBailian: 'Alibaba Bailian 실시간 ASR',
        asrSiliconflow: 'SiliconFlow SenseVoice',
        asrZhipu: 'Zhipu GLM-ASR',
        asrGroq: 'Groq Whisper-large-v3',
        asrWhisper: 'OpenAI Whisper(호환)',
        asrFoundryLocalWhisper: '로컬 Whisper(Foundry Local)',
        asrLocalQwen3: '로컬 Qwen3-ASR',
      },
      volcengineAppKeyLabel: 'APP ID',
      volcengineAccessKeyLabel: 'Access Token',
      volcengineResourceIdLabel: 'Resource ID',
      volcengineMappingNote: 'Secret Key 는 현재 입력 불필요. Resource ID 기본값은 volc.bigasr.sauc.duration.',
      localAsrActiveNotice: '현재 "{{name}}" 사용 중. "고급" 탭에서 전환 또는 비활성화할 수 있습니다.',
      localAsrTakeoverHint: '"{{name}}" 활성화 시 ASR 프로바이더가 인수됩니다.',
      asrProviderTakenOver: 'ASR 프로바이더 인수 완료',
      localAsrHint: '기기에서 실행, API 키 불필요. HuggingFace 에서 모델 다운로드.',
      foundryLocalAsrHint: '기기에서 실행, ASR API 키 불필요. 첫 사용 시 런타임과 모델 다운로드.',
      localAsrPerformanceWarning: '로컬 추론은 클라우드보다 느리며 중국어 정확도가 낮을 수 있습니다. 오프라인 또는 개인정보 보호 시나리오에 적합.',
      localAsrReady: '{{model}} 다운로드됨',
      localAsrNotReady: '{{model}} 다운로드되지 않음',
      localAsrGoDownload: '모델 설정에서 다운로드',
      localAsrManage: '모델 설정으로 이동',
      localAsrDownloadedTitle: '다운로드된 모델',
      localAsrDelete: '삭제',
      fillDefault: '기본값 입력',
      readFailed: '읽기 실패',
      apiKeyLabel: 'API 키',
      baseUrlLabel: '엔드포인트',
      modelLabel: '모델',
      thinkingModeLabel: '사고',
      thinkingModeOn: '켜짐',
      thinkingModeOff: '꺼짐',
      thinkingModeHint: '꺼짐은 채널 단위 공식 파라미터로 사고를 끄거나 최소화합니다. 켜짐은 채널 기본값으로 사고를 켭니다. prompt 주입이나 모델별 어댑터는 사용하지 않습니다.',
      bailianVocabularyIdLabel: '핫워드 Vocabulary ID(선택)',
      bailianVocabularyIdNote: 'DashScope에서 핫워드 사전을 만들었다면 vocab-... ID를 입력하세요. 비워 두면 핫워드를 전송하지 않습니다.',
      appIdLabel: 'App ID(애플리케이션 ID)',
      accessKeyLabel: 'Access Key',
      resourceIdLabel: 'Resource ID',
      toolsLabel: '연결 확인',
      toolsDesc: '위 설정을 먼저 저장한 후 현재 모델 연결성을 검증하거나 모델을 가져오세요. 실패해도 모델 ID 를 수동 입력할 수 있습니다.',
      validate: '검증',
      validating: '검증 중…',
      fetchModels: '모델 가져오기',
      loadingModels: '모델 가져오는 중…',
      modelMissing: '모델이 설정되지 않았습니다. 먼저 모델 ID 를 입력해 주세요.',
      modelsEmpty: '인증 성공이지만 사용 가능한 모델이 반환되지 않았습니다.',
      modelsLoaded: '{{count}}개의 모델을 가져왔습니다.',
      selectModel: '모델을 선택해 위 필드에 입력',
      modelSaved: '모델 {{model}} 을(를) 저장했습니다.',
      validateSuccess: '연결 확인을 통과했습니다.',
      providerHttpStatus: '공급자가 {{status}} 를 반환했습니다. API Key 권한 또는 Endpoint 를 확인해 주세요.',
      endpointMustUseHttps: 'Endpoint 는 HTTPS 를 사용해야 합니다(localhost/127.0.0.1 제외).',
      endpointInvalid: 'Endpoint 형식이 올바르지 않습니다.',
      responseTooLarge: '공급자 응답이 너무 커서 안전을 위해 검증을 중단했습니다.',
      asrInvalidJson: 'ASR 응답이 유효한 JSON 이 아닙니다.',
      asrMissingTextField: 'ASR 응답에 text 필드가 없습니다.',
      apiKeyMissing: 'API Key 가 비어 있습니다.',
      endpointMissing: 'Endpoint 가 비어 있습니다.',
      requestTimeout: '요청 시간이 초과되었습니다. 잠시 후 다시 시도하세요.',
    },
    shortcuts: {
      title: '단축키 한눈에 보기',
      descAcc: '모든 단축키는 전역에서 작동. 권한 설정에서 접근성을 활성화해야 합니다.',
      descNoAcc: '모든 단축키는 전역에서 작동. 응답이 없으면 권한 페이지에서 전역 단축키 감지 상태를 확인해 주세요.',
      startStop: '녹음 시작 / 정지',
      cancel: '이번 녹음 취소',
      confirm: '캡슐 입력 확정',
      switchStyle: '이전 스타일로 전환',
      openApp: 'OpenLess 열기',
      confirmHint: '오른쪽 ✓ 클릭',
      notSupported: '지원되지 않음',
    },
    permissions: {
      title: '권한',
      descAcc: 'OpenLess 가 정상 작동하려면 다음 시스템 권한이 필요합니다. 허용 후에는 일반적으로 앱을 완전히 종료한 후 재시작해야 적용됩니다.',
      descNoAcc: 'OpenLess 는 마이크 사용과 전역 단축키 감지 상태를 통해 네이티브 후크의 정상 동작을 판정해야 합니다.',
      micLabel: '마이크',
      micDesc: '음성 입력을 캡처하기 위해 사용합니다.',
      accLabel: '접근성',
      accDesc: '전역 단축키 감지와 인식 결과를 커서 위치에 입력하기 위해 사용합니다.',
      hotkeyLabel: '전역 단축키',
      hotkeyDescWithAdapter: '현재 어댑터: {{adapter}}. 단축키 감지가 설치되었는지 판정하기 위해 사용.',
      hotkeyDescPlain: '단축키 감지가 설치되었는지 판정하기 위해 사용.',
      networkLabel: '네트워크',
      networkDesc: '클라우드 ASR / LLM 호출에 필요. 로컬 모드에서는 비활성화 가능.',
      networkOk: '사용 가능',
      networkOffline: '사용 불가',
      checking: '확인 중…',
      granted: '허용됨',
      notApplicable: '권한 불필요',
      denied: '허용되지 않음',
      indeterminate: '미결정',
      openSystem: '시스템 설정 열기',
      grant: '허용',
      hotkeyInstalled: '설치됨',
      hotkeyStarting: '설치 중…',
      hotkeyFailed: '감지 실패',
      windowsImeLabel: 'Windows 입력기 백엔드',
      windowsImeDesc: '음성 세션 동안 OpenLess TSF 입력기로 일시적으로 전환하여 클립보드 입력 제한을 회피하기 위해 사용.',
      windowsImeInstalled: '설치됨',
      windowsImeUnavailable: '사용 불가',
      windowsIme: {
        installed: '설치됨. 음성 입력 시 OpenLess 입력기로 일시 전환됩니다.',
        notInstalled: '설치되지 않음. OpenLess 는 현재 클립보드 / WM_PASTE 폴백을 사용합니다.',
        registrationBroken: '등록이 손상되었습니다. OpenLess 입력기를 재설치하세요.',
        notWindows: 'Windows 만 사용 가능.',
      },
    },
    advanced: {
      streamingInsertTitle: '스트리밍 입력',
      streamingInsertTitleLinux: '스트리밍 입력 (실험적)',
      streamingInsertDesc:
        '실시간 글자별 삽입으로 체감 지연 감소. 조건 불충족 시 일괄 붙여넣기로 전환.',
      streamingInsertLabel: '스트리밍 입력',
      streamingInsertHintMac:
        '스트리밍 중 입력 소스를 ABC 로 임시 전환 (CJK IME 가로채기 방지). 세션 종료 시 자동 복원.',
      streamingInsertHintWindows:
        'SendInput Unicode 로 TSF / IME 를 우회. 입력 소스 전환 불필요.',
      streamingInsertHintLinux:
        'fcitx5 플러그인으로 텍스트 전송. 스트리밍 입력은 enigo + XTest 키 합성 사용.',
      streamingInsertSaveClipboardLabel: '클립보드에 저장',
      streamingInsertSaveClipboardHint: '삽입 성공 후 최종 텍스트를 클립보드에 기록하여 Cmd+V 로 다시 붙여넣을 수 있게 합니다. 끄면 클립보드를 건드리지 않습니다.',
      localAsrTitle: '로컬 ASR 모델 (실험적)',
      localAsrDesc: '전사를 클라우드에서 로컬 추론으로 전환합니다. 오프라인 / 프라이버시용에만 권장됩니다.',
      localAsrWarningShort: '로컬 추론은 느리며, 사양 부족 시 글자 누락이 발생할 수 있습니다.',
      qwen3Desc: '활성화하면 ASR 프로바이더가 인수됩니다.',
      foundryDesc: '활성화하면 ASR 프로바이더가 인수됩니다.',
      notSupportedHere: '이 플랫폼에서는 미지원 (추론 모듈 미내장).',
      enable: '활성화',
      alreadyActive: '활성',
      disableLocalLabel: '로컬 ASR 비활성화',
      disableLocalDesc: '클라우드 ASR (기본 Volcengine bigasr) 로 돌아갑니다.',
      disable: '비활성화',
      platformNotSupported: '이 플랫폼에서는 로컬 ASR 모델 통합이 아직 지원되지 않습니다.',
      confirmEnableLocalTitle: '로컬 ASR 을 활성화할까요?',
      confirmEnableLocalBody: '활성화 후 전사는 클라우드보다 느리고 정확도가 낮을 수 있습니다.',
      confirm: '활성화',
    },
    language: {
      title: '인터페이스 언어',
      desc: 'UI 표시 언어를 전환합니다. 현재 세션에 즉시 반영되며 다음 실행에도 유지됩니다.',
      label: '언어',
      labelDesc: '"시스템 따라가기"를 선택하면 OS 언어를 따릅니다.',
      followSystem: '시스템 따라가기',
      zh: '简体中文',
      zhTW: '繁體中文',
      en: 'English',
      ja: '日本語 (Beta)',
      ko: '한국어 (Beta)',
      restartHint: '일부 네이티브 메뉴(트레이 등)는 앱 재시작 후 반영될 수 있습니다.',
    },
    about: {
      tagline: '자연스럽게 말하고, 정확하게 작성하세요',
      checkUpdate: '업데이트 확인',
      checkUpdateBtn: '확인',
      checkingUpdate: '확인 중…',
      upToDate: '현재 최신 버전입니다.',
      updateError: '확인 또는 업데이트에 실패했습니다. 잠시 후 다시 시도하세요.',
      retryBtn: '다시 시도',
      openReleases: 'Releases 열기',
      source: '소스',
      docs: '문서',
      feedback: '피드백',
      qq: '커뮤니티 QQ 그룹',
      qqDesc: 'QQ 에서 그룹 번호를 검색해 가입하거나 QR 코드로 입장하세요.',
      copyQq: '그룹 번호 복사',
      privacy: '프라이버시',
      privacyDesc: '모든 데이터는 로컬에 저장됩니다. 클라우드 API 는 녹음을 보관하지 않습니다.',
      localFirst: '로컬 우선',
      betaChannelLabel: 'Beta 채널 참여',
      betaChannelDesc: '활성화 시 Beta 업데이트 수신. 불안정할 수 있으며 얼리 어답터만 권장.',
      betaChannelFetching: '최신 Beta 버전을 가져오는 중…',
      betaChannelFetchBtn: '최신 Beta 확인',
      betaChannelLatestPrefix: '최신 Beta:',
      betaChannelDownloadBtn: '다운로드 페이지 열기',
      betaChannelRefresh: '새로 고침',
      betaChannelNoBeta: '아직 게시된 Beta 릴리스가 없습니다.',
      betaChannelFetchError: 'Beta 릴리스 정보를 가져오지 못했습니다. 잠시 후 다시 시도하세요.',
      betaChannelUpToDate: '최신',
      betaChannelUpdateNow: '지금 업데이트',
      betaChannelUpdateNowTitle: '최신 Beta를 확인·다운로드하고 업데이트 대화상자를 표시합니다',
      betaChannelChecking: '확인 중…',
      updateDialog: {
        available: {
          title: '새 버전 발견',
          desc: 'OpenLess {{version}} 을(를) 발견했습니다. 지금 업데이트하시겠습니까?',
        },
        downloading: {
          title: '업데이트 다운로드 중',
          desc: 'OpenLess {{version}} 을(를) 다운로드 중입니다. 앱을 열어 두세요.',
        },
        downloaded: {
          title: '업데이트 준비 완료',
          desc: 'OpenLess {{version}} 설치가 완료되었습니다. 지금 자동 재시작하여 적용하시겠습니까?',
        },
        installing: {
          title: '업데이트 설치 중',
          desc: 'OpenLess {{version}} 을(를) 설치 중입니다. 앱을 열어 두세요.',
        },
        install: '지금 업데이트',
        downloadingLabel: '다운로드 중…',
        installingLabel: '설치 중…',
        later: '나중에 수동 재시작',
        restartNow: '지금 재시작',
        progress: '{{progress}}% · {{downloaded}} / {{total}}',
        progressUnknown: '다운로드됨 {{downloaded}}',
      },
    },
  },
  modal: {
    sections: {
      account: '계정',
      settings: '설정',
      personalize: '개인 설정',
      about: '정보',
      helpCenter: '도움말 센터',
      releaseNotes: '릴리스 노트',
    },
    account: {
      localUser: '로컬 사용자',
      localUserDesc: '로그인하지 않음 · 모든 데이터는 로컬에 저장',
      loginSync: '로그인 / 동기화',
      footer: '기본적으로 완전 로컬 실행. 로그인하면 어휘와 스타일 프리셋을 기기 간 동기화.',
    },
    personalize: {
      appearance: '모양',
      appearanceDesc: '시스템 따라가기 / 라이트 / 다크',
      appearanceSystem: '시스템 따라가기',
      appearanceLight: '라이트',
      appearanceDark: '다크',
      font: '글꼴 크기',
      fontDesc: 'UI 글꼴 크기를 전체 스케일. 즉시 반영.',
      fontSmall: '소',
      fontMedium: '중',
      fontLarge: '대',
      blur: '서리유리 강도',
      blurDesc: '창 내부 backdrop-filter 강도에 영향(macOS 시스템 서리 레이어가 작동하지 않을 때 조정).',
      startupOpen: '시작 시 열기',
      startupOverview: '개요',
      startupLast: '마지막 위치',
      startupAtBoot: '부팅 시 자동 시작',
    },
    about: {
      tagline: '자연스럽게 말하고, 정확하게 작성하세요',
      checkUpdate: '업데이트 확인',
      checkUpdateBtn: '확인',
      docs: '문서',
      docsBtn: 'openless.app/docs ↗',
      feedback: '피드백 채널',
      feedbackBtn: 'GitHub Issues ↗',
      source: '소스',
      qq: '커뮤니티 QQ 그룹',
      qqDesc: 'QQ 에서 그룹 번호를 검색해 가입하거나 QR 코드로 입장하세요.',
      copyQq: '그룹 번호 복사',
      exportErrorLog: '오류 로그 내보내기',
      exportErrorLogDesc: '현재 세션의 실행 로그를 로컬에 저장합니다. 문제 조사나 피드백 전송에 사용하세요.',
      exportErrorLogBtn: '내보내기',
      exporting: '내보내는 중…',
      exportSuccess: '저장됨',
      exportFailed: '내보내기 실패',
      privacy: '프라이버시',
      privacyDesc: '모든 인식 결과는 로컬에만 저장됩니다. 클라우드 API 는 실시간 호출에만 사용됩니다.',
      localFirst: '로컬 우선',
    },
  },
  windowChrome: {
    minimize: '최소화',
    maximize: '최대화',
    close: '닫기',
  },
  hotkey: {
    triggers: {
      rightOption: '오른쪽 Option',
      leftOption: '왼쪽 Option',
      rightControl: '오른쪽 Control',
      leftControl: '왼쪽 Control',
      rightCommand: '오른쪽 Command',
      fn: 'Fn (지구본 키)',
      rightAlt: '오른쪽 Alt',
      custom: '사용자 지정 조합…',
    },
    fallback: '전역 단축키',
    modeHoldSuffix: '(눌러서 말하기)',
    modeToggleSuffix: '(시작 / 정지)',
    usageHold: '{{trigger}} 를 누르고 말한 후 떼면 종료.',
    usageToggle: '{{trigger}} 로 녹음 시작, 다시 누르면 종료.',
    adapter: {
      macEventTap: 'macOS Event Tap',
      windowsLowLevel: 'Windows 저수준 키보드 후크',
      fcitx5: 'fcitx5 입력기 플러그인',
    },
  },
  localAsr: {
    kicker: '로컬 ASR',
    title: '모델 설정',
    desc: '기기 내 음성 인식 모델 관리.',
    qwenTitle: 'Qwen3-ASR 모델 관리',
    qwenExperimentalBadge: '실험적',
    engineUnavailable: '현재 플랫폼에는 Qwen3-ASR 추론 엔진이 포함되어 있지 않습니다. 모델은 다운로드할 수 있지만 여기서는 아직 Qwen3-ASR 을 활성화할 수 없습니다.',
    qwenUnavailableOnWindows: 'Windows 에서는 아직 Qwen3-ASR 을 지원하지 않습니다. 위의 Foundry Local Whisper 를 사용해 주세요.',
    foundryTitle: 'Windows Foundry Local Whisper',
    foundryDesc: '기기 내 음성 인식, ASR API 키 불필요. 첫 사용 시 런타임과 모델 다운로드 필요.',
    foundryAvailable: 'Windows 에서 사용 가능',
    foundryUnavailable: 'Windows 전용',
    foundryRuntimeReady: '런타임 구성 요소 다운로드됨',
    foundryRuntimeMissing: '런타임 구성 요소 미다운로드',
    foundryRuntimeSourceLabel: '런타임 구성 요소 다운로드 소스',
    foundryRuntimeSourceAuto: '자동(NuGet 우선)',
    foundryRuntimeSourceNuget: 'NuGet 공식 피드',
    foundryRuntimeSourceOrtNightly: 'Microsoft ORT-Nightly 피드',
    foundryRuntimeSourceDesc: '첫 사용 전 런타임 구성 요소 다운로드 필요.',
    foundrySelectedModel: '선택한 모델',
    foundryActiveModel: '현재 기본 alias',
    foundryLoadedModel: '로드된 모델',
    foundryNotLoaded: '로드되지 않음',
    foundryError: 'Foundry 상태',
    foundrySetDefault: '기본값으로 설정 / Windows 로컬 ASR 활성화',
    foundryEnabling: '활성화 중…',
    foundryPrepare: '준비 / 다운로드 / 로드',
    foundryPreparing: '준비 중…',
    foundryReleasing: '해제 중…',
    foundryRetryPrepare: '준비 계속 / 다시 시도',
    foundryCancelPrepare: '준비 취소',
    foundryCancelRequested: '취소 요청됨',
    foundryCancelling: '취소 중…',
    foundryCancelBestEffort: '취소 요청됨. 현재 단계 완료 후 중지. 나중에 재시도 가능.',
    foundryPrepareRuntime: '런타임 구성 요소 준비',
    foundryPrepareModel: '모델 다운로드',
    foundryPrepareLoad: '모델 로드',
    foundryPrepareModelSkipped: '모델이 이미 다운로드되어 다운로드 단계를 건너뜀',
    foundryPrepareDone: '완료',
    foundryPrepareWaiting: '대기 중',
    foundryApproxSizeMb: '약 {{mb}} MB',
    foundryLanguageLabel: '인식 언어',
    foundryLanguageAuto: '자동',
    foundryLanguageZh: '중국어 zh',
    foundryLanguageEn: '영어 en',
    foundryLanguageDesc: '중국어는 "중문", 혼합 사용은 "자동" 선택.',
    foundryModelSmall: 'Whisper Small(기본 / 균형)',
    foundryModelSmallDesc: '품질과 리소스 사용량을 균형 있게 맞춘 기본 옵션.',
    foundryModelMedium: 'Whisper Medium(더 높은 품질)',
    foundryModelMediumDesc: '더 높은 정확도. 더 큰 다운로드와 느린 추론을 감당할 수 있는 고성능 기기에 적합합니다.',
    foundryModelLarge: 'Whisper Large V3 Turbo(최고 품질)',
    foundryModelLargeDesc: '고성능 기기와 품질 우선 사용에 맞는 대형 모델 옵션.',
    foundryModelBase: 'Whisper Base(더 빠름 / 낮은 리소스)',
    foundryModelBaseDesc: '더 빠르고 리소스를 적게 사용해 가벼운 일상 받아쓰기에 적합합니다.',
    foundryModelTiny: 'Whisper Tiny(가장 빠름 / 스모크 테스트)',
    foundryModelTinyDesc: 'Foundry 경로가 작동하는지 확인하기 위한 가장 빠른 옵션.',
    mirrorLabel: '다운로드 미러',
    mirrorDesc: '공식 소스는 해외 네트워크에서 안정적; hf-mirror.com 은 중국 커뮤니티가 운영하는 미러.',
    mirrorHuggingface: 'HuggingFace 공식 (huggingface.co)',
    mirrorHfMirror: '중국 미러 (hf-mirror.com)',
    activeBadge: '사용 중',
    downloadedBadge: '다운로드됨',
    notDownloadedBadge: '다운로드되지 않음',
    download: '다운로드',
    resume: '계속 다운로드',
    cancel: '취소',
    delete: '삭제',
    setActive: '기본으로 설정',
    failed: '실패',
    cancelled: '취소됨',
    files: '파일',
    sizeLoading: '크기 조회 중…',
    sizeUnknown: '크기 알 수 없음',
    performanceWarning: '로컬 ASR 은 오프라인 또는 개인정보 보호 시나리오에 적합. 첫 사용 시 모델 다운로드 필요.',
    test: '로드하여 테스트',
    testRunning: '테스트 중…',
    testHeading: '내장 오디오 테스트',
    testExpected: '원문',
    testActual: '인식',
    testStats: '오디오 길이 {{audio}}s · 로드 {{load}}s · 추론 {{transcribe}}s · 백엔드 {{backend}}',
    testFailed: '테스트 실패',
    engineStatusLabel: '메모리에 있는 엔진',
    engineLoaded: '로드됨: {{model}}(약 1.2-3.4 GB 메모리 사용)',
    engineUnloaded: '로드되지 않음(첫 받아쓰기 시 약 3-5 초 로드 필요)',
    loadNow: '지금 로드',
    releaseNow: '지금 해제',
    keepLoadedLabel: '로드 유지 시간',
    keepLoadedDesc: '로컬 ASR 사용 후 메모리에서 해제되기까지의 시간을 결정. 1+ GB RAM 장기 점유 회피.',
    keepImmediate: '말하기 직후 해제',
    keep1min: '마지막 사용 후 1분',
    keep5min: '마지막 사용 후 5분(기본)',
    keep30min: '마지막 사용 후 30분',
    keepForever: '해제하지 않음(항상 유지)',
  },
};
