Files
openless/openless-all/app/src/i18n/ko.ts
T
TRIPandsim 006cb78a93 feat(capsule): 录音胶囊样式可选(流光 Siri / Openless 默认)+ 修复 beta 构建破坏 (#887)
* feat(capsule): 录音胶囊样式可选——流光 Siri 风格 / Openless 默认风格

设置 → 录音与输入新增「胶囊样式」下拉(保留显示开关):
- UserPreferences.capsule_style('siri' 默认 / 'classic')随 capsule:state
  payload 下发,切换后下一次录音即生效
- Capsule.tsx 双样式分支:siri 保留 SiriGL 光效舞台;classic 恢复 1.3.14
  经典毛玻璃药丸(音量条 + 取消/确认按钮 + thinking 扫光 + 翻译徽章),
  取消/确认改走 lib/ipc/dictation.ts,退出动画时长按样式区分
- 预览支持 ?style=classic;i18n 五语言新增胶囊样式文案

* fix(settings): 选区润色行适配重构后的 ShortcutRecorder props

beta HEAD 在快捷键录入交互重构(e12c8dcc)合并后遗留的构建破坏:
SelectionPolishSection 仍传已删除的 alignRecordButton / modifierPresets,
tsc 直接报错。改为新 API(value 可空 + onReset 恢复默认快捷键,
等价于旧「启用」按钮),恢复 beta 可构建状态。

* fix(capsule): 评审修复——经典药丸按钮可点 + 音频线程零偏好锁

- 经典样式(Openless 默认)下胶囊窗口长期 set_ignore_cursor_events(true)
  (纯光效舞台时代遗留),✕/✓ 按钮实际不可点。现在主线程闭包按
  「classic && visible && 非选区润色 && 录音/转写/润色中」关闭鼠标穿透,
  终态 toast / 隐藏 / Siri / 选区润色保持穿透;值不变时不重复调用
  set_ignore_cursor_events
- emit_capsule 在音频回调线程 ~30Hz 被调,原先直接读 prefs(整份克隆 +
  偏好锁被 set() 跨磁盘 I/O 持有)。改为 Inner 上 AtomicU8 样式缓存,
  主线程闭包每帧从 prefs 同步(与 show_capsule 同源读取),音频线程零开销
- 恢复「录音胶囊」行的 desc 文案(beta 原有,重构时被误删)
- Capsule.tsx 退出动画注释同步为按样式区分的常量名

* docs(capsule): 注明入场帧 payload 可能滞后一帧样式(防误改回音频线程读 prefs)

---------

Co-authored-by: sim <sim@local>
2026-08-03 14:17:52 +08:00

1377 lines
76 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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}}초',
durationMillis: '{{value}}ms',
durationMinutes: '{{value}}분',
},
capsule: {
thinking: 'thinking',
using: 'using',
cancelled: '취소됨',
error: '오류 발생',
inserted: '{{count}}자 입력됨',
translating: '번역 중',
selectionPolish: {
polishing: '다듬는 중...',
replaced: '교체됨',
noSelection: '선택된 내용 없음',
failed: '다듬기 실패, 다시 시도하세요',
},
},
selectionPolishPreview: {
title: '선택 영역 다듬기 미리보기',
subtitle: '편집 가능합니다. 확인을 클릭한 뒤에만 원래 선택 영역을 교체합니다.',
cancel: '취소',
resultLabel: '다듬기 결과',
sourcePrefix: '원문: ',
applyError: '적용하지 못했습니다: ',
confirmReplace: '확인 후 교체',
},
qa: {
title: '질문',
headerHint: '언제든 질문하세요',
thinking: '생각 중…',
error: '오류가 발생했습니다. 잠시 후 다시 시도해 주세요.',
errorRetry: '재시도',
errorRetryHint: '다시 시도해 주세요.',
pinTooltip: '고정(자동으로 닫히지 않음)',
unpinTooltip: '고정 해제',
closeTooltip: '닫기',
micLabel: '음성으로 질문',
micStop: '녹음 종료',
selectionPreview: '선택된 텍스트 기반:',
linuxSelectionToolsMissing: 'Linux 선택 영역을 읽으려면 wl-paste, xclip 또는 xsel 중 하나를 설치하세요.',
emptyTitle: '무엇을 도와드릴까요?',
emptyDesc: '텍스트를 선택해 질문하거나 아래에 직접 입력하세요. 답변이 여기에 표시되며 계속 이어서 질문할 수 있습니다.',
recordingHint: '녹음 중… {{recordHotkey}} 를 다시 눌러 종료하고 질문',
mobileRecordLabel: '녹음 버튼',
mobileRecordStart: '녹음 시작',
mobileRecordStop: '종료하고 제출',
composerPlaceholder: '질문을 입력하세요. Enter로 보내기',
composerSend: '보내기',
statusIdle: '{{recordHotkey}} 로 질문',
statusRecording: '녹음 중',
statusThinking: '생각 중',
statusError: '오류',
jumpToLatest: '최신으로 이동',
},
lessComputer: {
title: 'Less Computer',
subtitle: '컴퓨터로 무엇을 할까요?',
you: '나',
working: '조작 중…',
tool: '{{name}} 사용',
compaction: '컨텍스트가 압축되었습니다',
done: '완료',
cost: '${{cost}}',
error: '실패했습니다. 다시 시도하세요.',
closeTooltip: '닫기',
jumpToLatest: '최신으로 이동',
inputPlaceholder: '명령을 입력하고 Enter로 전송',
send: '전송',
approvalTitle: '차단된 명령을 실행할까요?',
approvalRerunWarning: '주의: 승인하면 이미 수정된 작업 공간에서 다시 실행되어 멱등하지 않은 작업에 부작용이 생길 수 있습니다.',
approve: '허용',
deny: '거부',
approved: '허용됨',
denied: '거부됨',
},
nav: {
overview: '개요',
history: '기록',
vocab: '어휘',
style: '스타일',
marketplace: '마켓',
translation: '번역',
selectionAsk: '선택 질문',
polishMode: '다듬기 모드',
group: {
style: '스타일',
tools: '도구',
},
localAsr: '모델 설정',
more: '더보기',
},
marketplace: {
kicker: 'MARKETPLACE',
title: '스타일 팩 마켓',
desc: '커뮤니티 스타일 팩 둘러보기, 설치, 공유.',
searchPlaceholder: '이름 / 설명 / 태그 검색…',
sortPopular: '인기순',
sortNew: '최신',
uploadBtn: '업로드',
uploadDisabledHint: '먼저 설정 → 마켓에서 GitHub 사용자명을 설정하세요',
refreshBtn: '새로고침',
empty: '아직 스타일 팩이 없습니다',
emptyHint: '다른 키워드로 검색하거나 직접 업로드해 보세요',
loadFailed: '불러오기 실패: {{err}}',
noDescription: '(설명 없음)',
installBtn: '설치',
installingBtn: '설치 중…',
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: '모든 데이터는 로컬에만 저장됩니다.',
navHint: {
overview: '상태 개요: 사용량 통계, 제공자 및 권한 상태',
history: '받아쓰기 기록: 과거 전사 검색·재생·복사',
vocab: '어휘: 고유명사 인식률을 높이는 사용자 지정 핫워드',
style: '스타일: 출력 스타일과 사용자 지정 프롬프트 관리',
translation: '번역: Shift를 누른 채 말하면 대상 언어로 삽입',
selectionAsk: '선택 질문: 텍스트를 선택한 뒤 음성으로 질문',
settings: '환경설정: 단축키, 제공자, 개인정보 및 업데이트',
},
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: '시스템 설정 열기',
actionRestart: '접근성 권한 재설정 후 OpenLess 재시작',
actionGrant: '허용',
actionRequestMic: '권한 대화상자 표시',
accessibilityHint: '허용 후에는 **OpenLess 를 완전히 종료** 한 다음 다시 실행해야 합니다(macOS TCC 규칙).',
footerHint: '모든 권한이 부여되면 이 가이드는 자동으로 닫힙니다. 닫히지 않으면 메뉴 막대의 OpenLess → 종료 후 앱을 다시 실행해 주세요.',
androidContinue: '앱으로 계속',
androidFooterHint: '받아쓰기에는 마이크 권한이 필요합니다. 위의 권한 요청을 탭하거나, 앱으로 먼저 들어가 개요 페이지에서 나중에 허용할 수 있습니다.',
androidTitle: 'OpenLess 설정',
androidIntro: '모바일 권한과 서비스 설정을 단계별로 완료합니다.',
androidStepCounter: '{{current}} / {{total}} 단계',
androidBack: '이전',
androidNext: '다음',
androidFinish: '완료하고 시작',
androidSteps: {
microphoneTitle: '마이크 권한',
microphoneDesc: 'Android 시스템 권한 카드를 표시하고 OpenLess 녹음을 허용합니다.',
accessibilityTitle: '접근성 서비스',
accessibilityDesc: '인식 결과를 현재 입력란에 붙여넣고 입력 환경 감지를 보조합니다.',
overlayPermissionTitle: '플로팅 창 권한',
overlayPermissionDesc: '다른 앱 위에 녹음 제어 버튼을 표시할 수 있게 합니다.',
overlayConfigTitle: '플로팅 창 설정',
overlayConfigDesc: '표시 시점, 활성화 방식, 스와이프 동작, 버튼 크기를 설정합니다.',
asrTitle: 'ASR 클라우드 서비스',
asrDesc: '음성 인식 서비스의 공급자, 키, 엔드포인트, 모델을 설정합니다.',
llmTitle: 'LLM 서비스',
llmDesc: '문장 다듬기, 번역, Q&A에 사용할 언어 모델 서비스를 설정합니다.',
},
},
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일',
activityTitle: '연간 활동',
activityCount: '{{count}}회 받아쓰기',
weekUnit: '건/일',
recentTitle: '최근 인식',
recentAll: '전체 보기 →',
recentEmpty: '아직 기록이 없습니다. {{trigger}} 를 눌러 첫 녹음을 시작하세요.',
recentLoadFailed: '최근 인식 기록을 불러올 수 없습니다. 다시 시도해 주세요.',
historyRetry: '다시 시도',
weekDays: ['일', '월', '화', '수', '목', '금', '토'],
inAppDictation: {
title: '앱 내 받아쓰기',
start: '녹음 시작',
stop: '녹음 중지',
idle: '탭하여 녹음 시작',
recording: '녹음 중…',
processing: '처리 중…',
},
androidMicBanner: {
title: '마이크 권한이 필요합니다',
desc: '마이크를 허용하면 앱 내 받아쓰기와 음성 입력을 사용할 수 있습니다.',
grant: '권한 요청',
openSettings: '설정 열기',
},
},
history: {
exportError: '녹음을 내보내지 못했습니다. 다시 시도해 주세요.',
kicker: 'HISTORY',
title: '기록',
desc: '로컬에 저장된 인식 기록.',
filterAll: '전체',
summary: '총 {{total}}건 · 표시 {{shown}}',
searchPlaceholder: '기록 검색…({{shortcut}})',
searchNoMatch: '“{{query}}”과(와) 일치하는 항목이 없습니다.',
empty: '기록이 없습니다. {{trigger}} 를 눌러 한 번 녹음해 보세요.',
loadFailed: '기록 로드 실패: {{err}}',
retry: '다시 시도',
clearFailed: '기록 비우기 실패: {{err}}',
deleteFailed: '항목 삭제 실패: {{err}}',
copyFailed: '복사 실패: {{err}}',
playRecording: '녹음 재생',
audioLoading: '로딩 중…',
audioDecodeFailed: '오디오 디코딩 실패: {{err}}',
exportRecording: '녹음 내보내기',
exportFailed: '내보내기 실패: {{err}}',
retranscribe: '다시 인식',
retranscribing: '인식 중…',
retranscribeFailed: '다시 인식 실패: {{err}}',
rawLabel: '원문',
rawEmpty: '(비어 있음)',
selectHint: '왼쪽에서 하나를 선택하여 자세히 보기.',
recorded: '녹음 {{duration}}',
stepAsr: '인식',
stepAsrHint: '키를 뗀 후 인식 결과를 기다린 시간. 스트리밍 인식은 녹음 중에 변환하므로 보통 녹음 시간보다 훨씬 짧습니다.',
stepPolish: '다듬기',
stepInsert: '삽입',
chars: '{{count}}자',
vocabHits: '핫워드 {{count}}개',
inserted: '입력됨',
pasteSent: '붙여넣기 시도됨',
copiedFallback: '복사됨({{shortcut}} 필요)',
insertFailed: '입력 실패',
confirmClear: '전체 {{count}}건의 기록을 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.',
backToList: '목록으로',
},
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: {
selectionListTitle: '선택 영역 다듬기 스타일',
selectionListDesc: 'ASR 없이 선택한 글에 사용: 문법, 명확성, 형식 다듬기. 스타일과 프롬프트를 따로 고를 수 있습니다.',
dictationTab: '녹음 / ASR 스타일',
selectionTab: '선택 영역 다듬기',
current: '현재',
useForSelection: '선택 영역에 사용',
writtenPolish: '서면 다듬기',
selectionPromptTitle: '선택 영역 다듬기 프롬프트(ASR 없음)',
selectionPromptHint: '사용자가 선택한 서면 텍스트용. ASR을 거치지 않으며, 받아쓰기로 취급하지 않고 그 안의 질문에도 답하지 않습니다.',
selectionPromptEditorDesc: '선택 영역 다듬기 프롬프트를 편집 중입니다. 입력은 사용자가 선택한 서면 텍스트이며 ASR을 거치지 않습니다.',
dictationPromptEditorDesc: '녹음 / ASR 스타일 프롬프트를 편집 중입니다. 입력은 음성 인식 후 받아쓰기 텍스트입니다.',
dictationPromptTitle: '녹음 / ASR 프롬프트',
dictationPromptHint: '녹음 후 받아쓰기한 ASR 텍스트용. 구어 정리, ASR 오타 수정, 고유명사 복원 규칙을 여기에 작성하세요.',
selectionPromptFallback: '서면 다듬기 프롬프트가 아직 설정되지 않았습니다. 안전한 기본값을 사용합니다.',
selectionActivated: '선택 영역 다듬기에 "{{name}}"을(를) 설정했습니다',
selectionActivateFailed: '선택 영역 다듬기 스타일 전환 실패: {{err}}',
selectionChars: '{{count}}자',
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: {
selectionPolish: {
title: '선택 영역 다듬기',
hotkey: '실행 단축키',
hotkeyDesc: '녹화 후 즉시 적용됩니다. 녹음, 질문 등 다른 전역 단축키와 충돌하면 거부됩니다.',
delivery: '결과 처리 방식',
hint: '텍스트를 선택한 뒤 실행합니다. 마이크나 ASR이 필요 없으며 현재 스타일 팩과 전용 선택 프롬프트를 사용합니다.',
directReplace: '직접 교체',
directReplaceHint: '모델 완료 후 원래 선택 영역을 안전하게 교체합니다.',
previewConfirm: '미리보기 후 확인',
previewConfirmHint: '편집 가능한 창에서 결과를 확인한 뒤 원래 선택 영역을 교체합니다.',
},
kicker: 'SETTINGS',
title: '설정',
desc: '녹음, 공급자, 단축키, 권한 설정.',
dataStorage: {
title: '데이터 저장',
desc: '이 기기에 보관되는 대화 기록과 컨텍스트.',
},
codingConsole: {
title: 'Claude 콘솔',
desc: '로컬 Claude Code 와 MCP(computer use) 상태를 감지하고, 가드레일 아래에서 Claude 를 헤드리스로 실행하여 출력과 비용을 스트리밍으로 확인합니다.',
guardNote: '복구 가능한 작업은 기본 허용; rm -rf / sudo / 강제 푸시 등 고위험 명령은 차단; 작업 디렉터리가 git 저장소이면 실행 전 스냅샷을 만들어 되돌릴 수 있습니다.',
status: '상태',
detect: '감지',
detecting: '감지 중…',
installed: 'Claude 감지됨',
notInstalled: 'claude 를 찾을 수 없음',
notInstalledHint: '먼저 Claude Code 를 설치하세요(docs.anthropic.com/claude-code 참고). 또는 아래에 실행 파일 전체 경로를 입력하세요.',
mcpServers: 'MCP 서버 {{count}}개 구성됨',
computerUsePresent: '데스크톱 제어(computer use) MCP 구성됨',
computerUseAbsent: '데스크톱 제어 MCP 없음(복사/붙여넣기 같은 가벼운 작업은 Bash 로 가능, 불필요)',
exePath: '실행 파일',
workdir: '작업 디렉터리',
workdirDesc: '선택 사항. Claude 가 이 디렉터리에서 실행됩니다. git 저장소이면 실행 전 스냅샷으로 되돌릴 수 있습니다.',
workdirPlaceholder: '비우면 임시 디렉터리에서 실행',
permissionMode: '권한 모드',
mode: {
acceptEdits: '허용(복구 가능)',
plan: '읽기 전용 / 계획',
default: '기본(매번 확인)',
bypassPermissions: '완전 허용(위험)',
},
promptPlaceholder: 'Claude 에게 작업 지시, 예: 현재 디렉터리 파일 목록',
run: '실행',
running: '실행 중…',
cancel: '취소',
clear: '지우기',
riskWarn: '고위험 의도 감지: {{reason}}. 가드레일이 실행 시 고위험 명령을 차단합니다.',
toolUse: '도구 {{name}}',
done: '완료',
doneCost: '완료 · 비용 ${{cost}}',
cancelled: '취소됨',
outputPlaceholder: '출력이 여기에 스트리밍됩니다…',
},
codingAgent: {
title: 'Less Computer',
desc: '키를 누르고 말하면 Claude가 PC를 조작합니다. macOS 전용.',
enable: 'Less Computer 켜기',
comingSoonNote: '설정은 즉시 저장됩니다. 단축키 트리거와 실행 흐름은 이후 버전에서 제공됩니다.',
hotkeyHint: '켜면 아래 단축키를 누른 채 말하고, 놓으면 Claude 결과가 캡슐에 표시됩니다.',
voiceHotkey: '누르고 말하기 키',
voiceHotkeyDesc: '누르고 말하고 놓으면 실행. Ctrl/Option/Fn 단일 키 지원. 기능 설명은 「고급」 설정 페이지 참조.',
provider: 'Agent 백엔드',
opencodeReady: 'OpenCode v{{version}} 감지됨.',
opencodeMissing: 'opencode 명령을 찾을 수 없습니다. 먼저 설치(npm i -g opencode-ai)하고 opencode auth login으로 로그인하세요.',
panelHotkey: '패널 키(음성 Agent)',
panelHotkeyDesc: '녹음 → ASR → Claude → 패널에 스트리밍. 기본 Cmd/Ctrl+Shift+Enter.',
quickHotkey: '빠른 가져오기 키',
quickHotkeyDesc: '선택한 텍스트 → Claude → 결과를 커서 위치로. 패널 없이 더 빠름.',
model: '모델',
modelPlaceholder: '기본: sonnet',
modelDefault: '기본(자동 sonnet)',
modelHint: 'Haiku = 가장 빠름 · Sonnet = 균형 · Opus = 최강',
exe: '실행 파일 경로',
},
debug: {
title: '디버그 도구',
desc: '인식 문제를 진단할 때 사용합니다. 평소에는 꺼두어도 됩니다.',
},
marketplace: {
title: '확장 마켓',
desc: '스타일 마켓 업로드 신원. 스타일 둘러보기와 설치는 「스타일」 페이지에서 합니다.',
github: {
signIn: 'GitHub로 로그인',
signedIn: 'GitHub로 로그인됨',
signedOut: '로그인하면 스타일 업로드와 좋아요를 할 수 있습니다.',
signOut: '로그아웃',
starting: '로그인을 시작하는 중…',
codeHint: '열린 GitHub 페이지에서 이 코드를 입력하세요:',
openGithub: 'GitHub 열기',
waiting: 'GitHub를 열었습니다. 승인하면 로그인됩니다…',
failed: '로그인 실패, 다시 시도하세요',
},
},
recording: {
title: '녹음 및 입력',
desc: '전역 녹음의 단축키와 트리거 방식을 정의합니다.',
hotkeyLabel: '녹음 단축키',
hotkeyDescAcc: '누르면 음성 캡처 시작(전역). 접근성 권한이 필요합니다.',
hotkeyDescNoAcc: '누르면 음성 캡처 시작(전역). 추가 권한 불필요.',
modeLabel: '녹음 방식',
modeDesc: '토글 방식 = 한 번 누르면 시작, 다시 누르면 종료; 눌러서 말하기 = 누르고 있는 동안만 녹음.',
modeToggle: '토글 방식',
modeHold: '눌러서 말하기',
modeAuto: '자동',
migrationNoticeTitle: '기본값이 토글 방식으로 변경됨',
migrationNoticeDesc: '이전에 트리거 방식을 변경했다면 여기서 다시 한 번 확인해 주세요. 이번 업데이트는 단축키 방식의 기본값과 읽기 로직을 조정했습니다. "눌러서 말하기"가 더 익숙하다면 다시 전환할 수 있습니다.',
microphoneLabel: '기본 선택 마이크',
microphoneDesc: '우선 사용할 입력 장치를 선택합니다. 장치를 일시적으로 사용할 수 없으면 시스템 기본 마이크를 사용하고, 다시 연결되면 자동으로 우선 장치로 돌아갑니다.',
microphoneDefault: '시스템 기본 마이크',
microphoneDefaultDesc: '시스템 기본 입력 장치 사용',
microphoneSystemDefault: '시스템 기본값',
microphoneUnavailable: '사용할 수 없음',
microphoneLoadError: '마이크 로드 실패: {{message}}',
microphoneDialogTitle: '마이크',
microphoneDialogDesc: '목소리를 받을 수 있는 마이크를 선택하세요. 미터가 움직이지 않으면 다른 마이크를 시도하세요.',
microphoneMonitorError: '입력 레벨 모니터링 실패: {{message}}',
capsuleLabel: '녹음 캡슐',
capsuleDesc: '녹음 / 전사 중 화면 하단에 반투명 캡슐을 표시합니다.',
capsuleStyleLabel: '캡슐 스타일',
capsuleStyleSiri: '시리 광선 스타일',
capsuleStyleClassic: 'Openless 기본 스타일',
muteDuringRecordingLabel: '녹음 중 음소거',
muteDuringRecordingDesc: '녹음 중 시스템 출력을 일시적으로 음소거하여 스피커 에코를 방지합니다.',
audioCueLabel: '녹음 시작음',
audioCueDesc: '단축키로 녹음을 시작할 때 합성된 짧은 알림음을 재생합니다. 캡슐이 숨겨져 있어도 재생됩니다.',
audioCuePreview: '미리듣기',
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: '단축키 녹화',
comboResetBtn: '초기화',
comboMenuToggle: '더보기',
comboDisableHint: '핵심 단축키는 비활성화할 수 없습니다 (녹음에는 단축키가 필수입니다)',
comboRecordHint: '단축키 조합을 눌러 주세요…',
comboNeedKey: '조합 키(예: ⌘⇧J)를 설정하세요. 단일 보조 키는 사용할 수 없습니다',
comboRecorded: '녹화됨',
comboClear: '지우기',
comboConflict: '이 단축키 조합은 사용할 수 없습니다',
allowNonTsfFallbackLabel: '비 TSF 폴백 허용',
allowNonTsfFallbackDesc: 'Windows: TSF 입력이 실패하면 분할된 Unicode SendInput을 사용하고, 그래도 실패하면 텍스트를 클립보드에 복사합니다.',
windowsInsertionModeLabel: 'Windows 삽입 방식',
windowsInsertionModeDesc: '받아쓰기 결과를 커서 위치에 삽입하는 방법. 클립보드 붙여넣기는 위의 「붙여넣기 단축키」를 사용하며 줄바꿈을 유지합니다.',
windowsInsertionModeTsf: 'TSF 입력기(기본)',
windowsInsertionModeSendInput: 'SendInput 키 입력 시뮬레이션',
windowsInsertionModePaste: '클립보드 붙여넣기(Ctrl+V 등)',
windowsSendInputNewlineModeLabel: 'SendInput 줄바꿈 시뮬레이션',
windowsSendInputNewlineModeDesc: 'SendInput 모드에서 줄바꿈을 어떤 키로 보낼지. 채팅 입력창은 Shift+Enter, 메모장 / VS Code 등은 Enter.',
windowsSendInputNewlineModeEnter: 'Enter(대부분 편집기)',
windowsSendInputNewlineModeShiftEnter: 'Shift+Enter(채팅 입력창)',
windowsSendInputNewlineModeCrLf: 'CR+LF Unicode',
windowsShowOpenlessInKeyboardListLabel: '키보드 목록에 OpenLess 표시',
windowsShowOpenlessInKeyboardListDesc: '끄면 Win+Space로 OpenLess에 전환되지 않습니다. SendInput 삽입에는 영향 없습니다. 다시 켜면 목록에 복원됩니다.',
windowsShowOpenlessInKeyboardListError: '키보드 목록을 업데이트할 수 없습니다: OpenLess TSF IME가 설치되지 않았거나 시스템이 변경을 거부했습니다.',
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',
atlascloud: 'Atlas Cloud',
openai: 'OpenAI',
gemini: 'Google Gemini',
codexOAuth: 'Codex OAuth',
mimo: 'Xiaomi MiMo',
cometapi: 'CometAPI',
openrouterFree: 'OpenRouter(무료 모델)',
alibabaCoding: 'Alibaba Cloud Coding Plan',
codingPlanX: 'CodingPlanX',
minimax: 'MiniMax (M3)',
stepfun: 'StepFun',
custom: '사용자 정의',
asrVolcengine: 'Volcengine bigasr',
asrBailian: 'Alibaba Bailian 실시간 ASR',
asrBailianQwen3: 'Bailian Qwen3 실시간 ASR',
asrBailianFunAsrFlash: 'Bailian Fun-ASR-Flash (녹음 파일)',
asrSiliconflow: 'SiliconFlow SenseVoice',
asrStepfun: 'StepFun StepAudio ASR',
asrZhipu: 'Zhipu GLM-ASR',
asrGroq: 'Groq Whisper-large-v3',
asrWhisper: 'OpenAI Whisper(호환)',
asrOpenrouter: 'OpenRouter Whisper',
asrXiaomiMimo: 'Xiaomi MiMo ASR',
asrElevenLabs: 'ElevenLabs Scribe',
asrSherpaOnnxLocal: '로컬 sherpa-onnx(실험적)',
asrFoundryLocalWhisper: '로컬 Whisper(Foundry Local)',
asrLocalQwen3: '로컬 Qwen3-ASR',
asrAppleSpeech: 'Apple 음성 (macOS)',
},
elevenLabsUploadNotice: 'ElevenLabs는 녹음 오디오를 설정된 엔드포인트에 업로드해 일괄 전사합니다.',
volcengineAppKeyLabel: 'APP ID',
volcengineAccessKeyLabel: 'Access Token',
volcengineApiKeyLabel: 'API Key',
volcengineResourceIdLabel: 'Resource ID',
volcengineAuthModeLabel: '인증 모드',
volcengineAuthModeAppIdToken: '레거시 앱 (APP ID + Access Token)',
volcengineAuthModeApiKey: 'Ark API Key',
volcengineMappingNote: 'Secret Key 는 현재 입력 불필요. Resource ID 기본값은 volc.seedasr.sauc.duration.',
volcengineApiKeyNote: 'Volcengine Ark 음성 모델 API 키로 인증하며 APP ID는 필요하지 않습니다. Resource ID 기본값은 volc.seedasr.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: '모델',
customModelLabel: '사용자 정의 모델…',
presetListLabel: '프리셋으로 돌아가기',
temperatureLabel: 'Temperature',
temperaturePlaceholder: '비워 두면 보내지 않음. 범위 0~2(양 끝 포함), 예: 0.3',
extraHeadersLabel: '추가 Headers',
extraHeadersPlaceholder: '{"custom-head":"..."}',
thinkingModeLabel: '사고',
thinkingModeOn: '켜짐',
thinkingModeOff: '꺼짐',
thinkingModeHint: '꺼짐은 채널 단위 공식 파라미터로 사고를 끄거나 최소화합니다. 켜짐은 채널 기본값으로 사고를 켭니다. prompt 주입이나 모델별 어댑터는 사용하지 않습니다.',
bailianVocabularyIdLabel: '핫워드 Vocabulary ID(선택)',
bailianVocabularyIdNote: 'DashScope에서 핫워드 사전을 만들었다면 vocab-... ID를 입력하세요. 비워 두면 핫워드를 전송하지 않습니다.',
bailianModelRealtimeHint: '실시간 모델 · 말하는 동안 바로 전사.',
bailianModelSyncFileHint: '동기 녹음 모델 · 말을 마친 뒤 전체 전사(한 클립 ≤ 5분).',
bailianModelAsyncFileHint: '비동기 파일 모델 · 녹음을 업로드한 뒤 전사 작업 완료를 기다립니다.',
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: '연결 확인을 통과했습니다.',
validateFailed: '연결 확인에 실패했습니다.',
providerHttpStatus: '공급자가 {{status}} 를 반환했습니다. API Key 권한 또는 Endpoint 를 확인해 주세요.',
endpointMustUseHttps: 'HTTP Endpoint 를 사용할 수 있지만, API Key 와 음성 내용이 전송 중 유출될 수 있습니다.',
endpointInvalid: 'Endpoint 형식이 올바르지 않습니다.',
bailianEndpointSchemeInvalid: 'Bailian 실시간 ASR은 DashScope WebSocket 게이트웨이를 사용합니다. 엔드포인트는 wss://로 시작해야 합니다(기본값: wss://dashscope.aliyuncs.com/api-ws/v1/inference/). https:// 호환 모드 주소는 여기서 사용할 수 없습니다.',
qwen3EndpointSchemeInvalid: 'Qwen3 실시간 ASR은 DashScope Realtime WebSocket 게이트웨이를 사용합니다. 엔드포인트는 wss://로 시작해야 합니다(기본값: wss://dashscope.aliyuncs.com/api-ws/v1/realtime). https:// 주소는 여기서 사용할 수 없습니다.',
responseTooLarge: '공급자 응답이 너무 커서 안전을 위해 검증을 중단했습니다.',
asrInvalidJson: 'ASR 응답이 유효한 JSON 이 아닙니다.',
asrMissingTextField: 'ASR 응답에 text 필드가 없습니다.',
apiKeyMissing: 'API Key 가 비어 있습니다.',
endpointMissing: 'Endpoint 가 비어 있습니다.',
requestTimeout: '요청 시간이 초과되었습니다. 잠시 후 다시 시도하세요.',
},
shortcuts: {
title: '단축키 한눈에 보기',
descAcc: '모든 단축키는 전역에서 작동. 권한 설정에서 접근성을 활성화해야 합니다.',
descNoAcc: '모든 단축키는 전역에서 작동. 응답이 없으면 권한 페이지에서 전역 단축키 감지 상태를 확인해 주세요.',
startStop: '녹음 시작 / 정지',
cancel: '이번 녹음 취소',
confirm: '캡슐 입력 확정',
switchStyle: '이전 스타일로 전환',
openApp: 'OpenLess 열기',
agentPolish: '선택 텍스트 다듬기',
agentPolishDesc: '텍스트 선택 → 키 → Claude 다듬기 → 선택 영역 교체.',
agentVoice: 'Less Computer',
agentVoiceDesc: '사용자 지정 키를 누른 채 말하기 → Claude 작업 실행 → 결과 캡슐 표시.',
agentVoiceHint: '「고급 → Less Computer」에서 누르고 말하기 키를 설정하세요.',
agentVoiceTrigger: 'Less Computer 누르고 말하기 키',
enable: '활성화',
disable: '비활성화',
confirmHint: '오른쪽 ✓ 클릭',
notSupported: '지원되지 않음',
androidReadOnly: 'Android에서는 전역 단축키를 사용할 수 없습니다. 개요 페이지의 녹음 버튼을 사용하세요.',
},
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: '시스템 설정 열기',
restart: '재설정 후 재시작',
grant: '허용',
rerunAndroidSetup: '설정 마법사 다시 실행',
hotkeyInstalled: '설치됨',
hotkeyStarting: '설치 중…',
hotkeyFailed: '감지 실패',
windowsImeLabel: 'Windows 입력기 백엔드',
windowsImeDesc: '음성 세션 동안 OpenLess TSF 입력기로 일시적으로 전환하여 클립보드 입력 제한을 회피하기 위해 사용.',
windowsImeInstalled: '설치됨',
windowsImeUnavailable: '사용 불가',
androidImeLabel: '입력기 (IME)',
androidImeSelected: '선택됨',
androidImeEnabled: '활성화됨',
androidImeDisabled: '비활성',
androidOverlayLabel: '플로팅 오버레이',
androidAccessibilityLabel: '접근성 서비스',
androidAccessibilityImpact: '켜면 키보드를 전환하지 않고 현재 입력칸에 결과를 출력합니다. 끄면 클립보드에 복사되며 직접 붙여넣어야 합니다.',
androidInsertStrategyLabel: '텍스트 삽입 방식',
androidOverlayTriggerLabel: '오버레이 표시',
androidOverlayActivationModeLabel: '오버레이 활성화',
androidOverlayLeftSwipeActionLabel: '왼쪽 스와이프 동작',
androidOverlayCancelSwipeDirectionLabel: '취소 스와이프 방향',
androidOverlaySizeLabel: '오버레이 크기',
androidOverlaySizeHint: '플로팅 버튼 지름을 조정하고 현재 위치를 유지합니다.',
androidInsertStrategy: { accessibility: '입력칸에 자동 출력', clipboard: '클립보드만' },
androidInsertStrategyHint: { accessibility: '접근성 서비스가 필요합니다. 사용할 수 없으면 클립보드에 복사합니다.', clipboard: '접근성 권한이 필요 없으며 직접 붙여넣습니다.' },
androidOverlayTrigger: { background: '백그라운드', keyboard: '키보드 표시 시', always: '항상' },
androidOverlayTriggerHint: { background: '단순', keyboard: '이 모드는 보류되었습니다. 기존 설정은 백그라운드로 되돌립니다.', always: '항상 표시' },
androidOverlayTriggerDisabled: { keyboard: '키보드 표시 감지는 보류되었습니다. 이후 오버레이 제스처로 대체합니다.' },
androidOverlayActivationMode: { tap: '탭으로 활성화', long_press: '길게 눌러 활성화' },
androidOverlayActivationModeHint: { tap: '첫 탭은 대기 상태로 전환하고, 두 번째 탭은 일반 받아쓰기를 시작합니다.', long_press: '누르고 있는 동안 대기 상태가 되며, 손을 떼면 현재 녹음 또는 QA 턴을 종료합니다.' },
androidOverlayLeftSwipeAction: { translation: '번역 받아쓰기', style_pack: '스타일 팩 전환' },
androidOverlayLeftSwipeActionHint: { translation: '대기 상태에서 왼쪽으로 밀면 번역 받아쓰기를 시작합니다.', style_pack: '대기 상태에서 왼쪽으로 밀면 이전 스타일 팩으로 전환합니다.' },
androidOverlayCancelSwipeDirection: { up: '위로 스와이프', down: '아래로 스와이프' },
androidOverlayCancelSwipeDirectionHint: { up: '녹음 중 위로 밀면 전사와 삽입 없이 취소합니다.', down: '녹음 중 아래로 밀면 전사와 삽입 없이 취소합니다.' },
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 프로바이더가 인수됩니다.',
sherpaDesc: '활성화하면 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: '일부 네이티브 메뉴(트레이 등)는 앱 재시작 후 반영될 수 있습니다.',
},
theme: {
title: '모양',
label: '테마',
activityHeatmapLabel: '개요 페이지에 연간 활동 표시',
system: '시스템 따르기',
light: '라이트',
dark: '다크',
},
remoteInput: {
title: '원격 입력',
enableLabel: '원격 입력 활성화',
enableDesc: '휴대폰/태블릿 브라우저를 PC에 연결해 녹음하고, 음성을 PC 커서 위치에 실시간으로 입력합니다(HTTPS 필요, 첫 접속 시 인증서를 신뢰해야 함)',
portLabel: '수신 포트',
defaultModeLabel: '기본 녹음 방식',
modeToggle: '탭하여 전환',
modeHold: '눌러서 말하기',
urlLabel: '접속 URL',
pinLabel: '페어링 코드',
regeneratePin: '재생성',
portInUse: '포트 {{port}}이(가) 사용 중입니다. 변경하세요',
startError: '원격 입력 서비스 시작에 실패했습니다: {{reason}}',
securityHint: '같은 LAN에서만 접속 가능하며 페어링 코드 입력이 필요합니다. 사용하지 않을 때는 끄는 것을 권장합니다.',
certHint: '첫 접속 시 브라우저가 인증서를 신뢰할 수 없다고 경고합니다. 안내에 따라 "계속 진행"을 선택하세요.',
certTrustWarning:
'이 인증서는 이 PC의 원격 입력 서비스 전용입니다(다른 인증서를 발급할 수 없음). 출처를 알 수 없는 인증서는 신뢰하지 마세요. 더 이상 사용하지 않으면 휴대폰 설정에서 제거할 수 있습니다.',
},
about: {
tagline: '자연스럽게 말하고, 정확하게 작성하세요',
checkUpdate: '업데이트 확인',
checkUpdateBtn: '확인',
checkStableUpdateBtn: '정식판 확인',
checkBetaUpdateBtn: 'Beta 확인',
checkingUpdate: '확인 중…',
upToDate: '현재 최신 버전입니다.',
updateError: '확인 또는 업데이트에 실패했습니다. 잠시 후 다시 시도하세요.',
retryBtn: '다시 시도',
openReleases: 'Releases 열기',
source: '소스',
docs: '문서',
feedback: '피드백',
qq: '커뮤니티 QQ 그룹',
qqDesc: 'QQ 에서 그룹 번호를 검색해 가입하거나 QR 코드로 입장하세요.',
copyQq: '그룹 번호 복사',
privacy: '프라이버시',
privacyDesc: '녹음은 전사를 위해 설정한 클라우드 공급자에게 전송될 수 있습니다.',
localFirst: '로컬 우선',
linksTitle: '문서 링크',
betaChannelLabel: 'Beta 채널 참여',
betaChannelToggleLabel: 'Beta 채널 사용',
betaChannelDesc: '켜면 백그라운드 자동 업데이트가 Beta를 따릅니다. 끄면 정식판으로 돌아갑니다. 아래 버튼으로 언제든 Beta를 수동 확인할 수 있습니다.',
autoUpdateSectionTitle: '자동 업데이트',
autoUpdateCheckLabelAndroid: '자동 확인 및 다운로드',
autoUpdateCheckDescAndroid: '시작 시 및 60분마다 확인합니다. 업데이트가 있으면 자동 다운로드 후 시스템 설치 프로그램을 엽니다. 채널은 위 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: '지금 업데이트',
androidInstall: '다운로드 후 설치 프로그램 열기',
androidInstalled: {
title: '시스템 설치 프로그램이 열렸습니다',
desc: '안내에 따라 설치를 완료하세요. 설치 후 OpenLess를 다시 열면 {{version}}을 사용할 수 있습니다.',
},
downloadingLabel: '다운로드 중…',
installingLabel: '설치 중…',
later: '나중에 수동 재시작',
restartNow: '지금 재시작',
progress: '{{progress}}% · {{downloaded}} / {{total}}',
progressUnknown: '다운로드됨 {{downloaded}}',
installError: {
title: '업데이트 실패',
desc: '자동 업데이트를 완료하지 못했습니다: {{error}}. 다운로드 페이지에서 최신 버전을 직접 받아 설치할 수 있습니다.',
},
manualDownload: '수동 다운로드',
},
},
},
modal: {
sections: {
general: '일반',
services: '서비스',
privacy: '프라이버시',
advanced: '고급',
personalize: '개인 설정',
about: '정보',
helpCenter: '도움말 센터',
releaseNotes: '릴리스 노트',
},
personalize: {
font: '글꼴 크기',
fontDesc: 'UI 글꼴 크기를 전체 스케일. 즉시 반영.',
fontSmall: '소',
fontMedium: '중',
fontLarge: '대',
blur: '서리유리 강도',
blurDesc: '창 내부 backdrop-filter 강도에 영향(macOS 시스템 서리 레이어가 작동하지 않을 때 조정).',
},
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: '인식 결과는 로컬에 저장되며 설정한 클라우드 공급자가 전사를 위해 녹음을 수신할 수 있습니다.',
localFirst: '로컬 우선',
},
},
windowChrome: {
minimize: '최소화',
maximize: '최대화',
close: '닫기',
},
hotkey: {
triggers: {
rightOption: '오른쪽 Option',
leftOption: '왼쪽 Option',
rightControl: '오른쪽 Control',
leftControl: '왼쪽 Control',
rightCommand: '오른쪽 Command',
leftCommand: '왼쪽 Command',
leftShift: '왼쪽 Shift',
rightShift: '오른쪽 Shift',
fn: 'Fn (지구본 키)',
rightAlt: '오른쪽 Alt',
mediaPlayPause: '⏯ 미디어 재생/일시정지',
custom: '사용자 지정 조합…',
},
fallback: '전역 단축키',
modeHoldSuffix: '(눌러서 말하기)',
modeToggleSuffix: '(시작 / 정지)',
modeAutoSuffix: '(자동 인식)',
usageHold: '{{trigger}} 를 누르고 말한 후 떼면 종료.',
usageToggle: '{{trigger}} 로 녹음 시작, 다시 누르면 종료.',
usageAuto: '{{trigger}} 를 짧게 누르면 시작 / 정지, 길게 누르면 말한 뒤 떼면 종료.',
adapter: {
macEventTap: 'macOS Event Tap',
windowsLowLevel: 'Windows 저수준 키보드 후크',
fcitx5: 'fcitx5 입력기 플러그인',
unavailable: '사용 불가',
},
},
localAsr: {
kicker: '로컬 ASR',
title: '모델 설정',
desc: '기기 내 음성 인식 모델 관리.',
storageTitle: '모델 저장 위치',
storageBaseDir: '선택한 상위 폴더',
storageModelsRoot: '실제 모델 폴더',
storageDefault: '시스템 기본 폴더',
storageChoose: '폴더 변경',
storageReset: '기본값으로 복원',
storageReveal: '모델 폴더 열기',
storageDesc: '사용자 지정 저장소는 선택한 폴더 아래에 OpenLess/models 를 만들고 기존 모델을 이동합니다. 이동 전에 다운로드를 취소하고 로드된 모델을 해제합니다.',
storageChooseTitle: '로컬 모델 저장 상위 폴더 선택',
storageChangeConfirm: '기존 로컬 모델을 {{path}}/OpenLess/models 로 이동합니다. 먼저 다운로드를 취소하고 로드된 모델을 해제합니다. 계속할까요?',
storageResetConfirm: '기존 로컬 모델을 시스템 기본 폴더로 되돌립니다. 현재 폴더: {{path}}. 계속할까요?',
modelDir: '모델 폴더',
revealDir: '폴더 열기',
deleteConfirm: '{{name}} 로컬 모델 파일을 삭제할까요? 되돌릴 수 없습니다.',
appleSpeechTitle: 'Apple 음성 인식(macOS)',
appleSpeechDesc: 'macOS 기본 음성 인식을 사용해 로컬에서 음성을 텍스트로 변환합니다. 모델 다운로드, API 키, 네트워크가 모두 필요 없습니다. 클라우드 ASR이 불안정할 때 자격 증명이 필요 없는 로컬 폴백입니다. 처음 사용할 때 음성 인식 권한 요청이 표시됩니다.',
appleSpeechUse: 'Apple 음성 사용',
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 경로가 작동하는지 확인하기 위한 가장 빠른 옵션.',
sherpaTitle: 'Windows sherpa-onnx Local(실험적)',
sherpaDesc: 'Windows는 sherpa-onnx로 기기 내 오프라인 일괄 인식을 수행하며 ASR API 키가 필요 없습니다.',
sherpaRuntimeReady: '모델 로드됨',
sherpaRuntimeMissing: '모델 로드되지 않음',
sherpaSetDefault: '기본값으로 설정 / sherpa-onnx 활성화',
sherpaPrepare: '로컬 파일 확인 / 로드',
sherpaPreparing: '로드 중…',
sherpaPrepareLocalFiles: '로컬 모델 파일 확인',
sherpaModelDir: '모델 디렉터리',
sherpaRevealDir: '모델 디렉터리 열기',
sherpaError: 'sherpa-onnx 상태',
sherpaLanguageJa: '일본어 ja',
sherpaLanguageKo: '한국어 ko',
sherpaLanguageYue: '광둥어 yue',
sherpaModelSenseVoice: 'SenseVoice Small(기본 / 중국어 우선)',
sherpaModelSenseVoiceDesc: '중국어 및 중영 혼합 받아쓰기에 적합한 기본 실험 모델.',
sherpaModelParaformer: 'Paraformer 중국어',
sherpaModelParaformerDesc: '중국어 중심 실험 모델.',
sherpaModelWhisper: 'Whisper Small 다국어',
sherpaModelWhisperDesc: 'Whisper 계열 동작에 맞춘 다국어 실험 폴백 모델.',
sherpaModelWhisperLargeV3: 'Whisper Large V3 (다국어)',
sherpaModelWhisperLargeV3Desc: '오픈소스 다국어 모델 중 품질이 가장 좋은 Whisper 계열. 고품질이지만 용량이 큽니다.',
sherpaModelQwen3: 'Qwen3-ASR 0.6B INT8',
sherpaModelQwen3Desc: '변환된 sherpa-onnx Qwen3-ASR 모델로 다국어 인식과 더 강한 긴 문맥 처리를 지원합니다.',
modelSelectTitle: '모델 선택',
modelSelectDesc: '다운로드된 모델 중 현재 인식 모델을 고릅니다. 추가는 아래 「다운로드 및 관리」에서.',
modelSelectPlaceholder: '다운로드된 모델 선택…',
modelSelectEmpty: '다운로드된 모델이 없습니다. 「다운로드 및 관리」에서 받으세요.',
groupDownload: '다운로드 및 관리',
groupOther: '기타',
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: '해제하지 않음(항상 유지)',
},
};