From 81b90aa6752f482f431217b2336ef31b7df2a894 Mon Sep 17 00:00:00 2001 From: ryanlee-ecosy Date: Fri, 6 Feb 2026 11:34:34 +0900 Subject: [PATCH] feat(i18n): Add Korean translation (#721) --- src/i18n/languages.ts | 19 +- src/i18n/locales/ko/translation.json | 465 +++++++++++++++++++++++++++ 2 files changed, 475 insertions(+), 9 deletions(-) create mode 100644 src/i18n/locales/ko/translation.json diff --git a/src/i18n/languages.ts b/src/i18n/languages.ts index a9e0116..487d805 100644 --- a/src/i18n/languages.ts +++ b/src/i18n/languages.ts @@ -22,13 +22,14 @@ export const LANGUAGE_METADATA: Record< fr: { name: "French", nativeName: "Français", priority: 4 }, de: { name: "German", nativeName: "Deutsch", priority: 5 }, ja: { name: "Japanese", nativeName: "日本語", priority: 6 }, - vi: { name: "Vietnamese", nativeName: "Tiếng Việt", priority: 7 }, - pl: { name: "Polish", nativeName: "Polski", priority: 8 }, - it: { name: "Italian", nativeName: "Italiano", priority: 9 }, - ru: { name: "Russian", nativeName: "Русский", priority: 10 }, - uk: { name: "Ukrainian", nativeName: "Українська", priority: 11 }, - pt: { name: "Portuguese", nativeName: "Português", priority: 12 }, - cs: { name: "Czech", nativeName: "Čeština", priority: 13 }, - tr: { name: "Turkish", nativeName: "Türkçe", priority: 14 }, - ar: { name: "Arabic", nativeName: "العربية", priority: 15, direction: "rtl" }, + ko: { name: "Korean", nativeName: "한국어", priority: 7 }, + vi: { name: "Vietnamese", nativeName: "Tiếng Việt", priority: 8 }, + pl: { name: "Polish", nativeName: "Polski", priority: 9 }, + it: { name: "Italian", nativeName: "Italiano", priority: 10 }, + ru: { name: "Russian", nativeName: "Русский", priority: 11 }, + uk: { name: "Ukrainian", nativeName: "Українська", priority: 12 }, + pt: { name: "Portuguese", nativeName: "Português", priority: 13 }, + cs: { name: "Czech", nativeName: "Čeština", priority: 14 }, + tr: { name: "Turkish", nativeName: "Türkçe", priority: 15 }, + ar: { name: "Arabic", nativeName: "العربية", priority: 16, direction: "rtl" }, }; diff --git a/src/i18n/locales/ko/translation.json b/src/i18n/locales/ko/translation.json new file mode 100644 index 0000000..f7a2b92 --- /dev/null +++ b/src/i18n/locales/ko/translation.json @@ -0,0 +1,465 @@ +{ + "tray": { + "settings": "설정...", + "checkUpdates": "업데이트 확인...", + "copyLastTranscript": "마지막 녹음 내용 복사", + "quit": "종료", + "cancel": "취소" + }, + "sidebar": { + "general": "일반", + "advanced": "고급", + "postProcessing": "후처리", + "history": "히스토리", + "debug": "디버그", + "about": "정보" + }, + "onboarding": { + "subtitle": "시작하려면 음성 인식 모델을 선택하세요", + "recommended": "추천", + "download": "다운로드", + "downloading": "다운로드 중...", + "modelCard": { + "accuracy": "정확도", + "speed": "속도" + }, + "models": { + "small": { + "name": "Whisper Small", + "description": "빠르고 상당히 정확합니다." + }, + "medium": { + "name": "Whisper Medium", + "description": "좋은 정확도, 중간 속도" + }, + "turbo": { + "name": "Whisper Turbo", + "description": "정확도와 속도의 균형." + }, + "large": { + "name": "Whisper Large", + "description": "좋은 정확도지만 느립니다." + }, + "parakeet-tdt-0.6b-v2": { + "name": "Parakeet V2", + "description": "영어 전용. 영어 사용자를 위한 최고의 모델." + }, + "parakeet-tdt-0.6b-v3": { + "name": "Parakeet V3", + "description": "빠르고 정확함" + }, + "moonshine-base": { + "name": "Moonshine Base", + "description": "매우 빠름, 영어 전용. 억양을 잘 처리합니다." + } + }, + "errors": { + "loadModels": "사용 가능한 모델을 불러오는데 실패했습니다", + "downloadModel": "모델 다운로드 실패: {{error}}" + }, + "permissions": { + "title": "권한 필요", + "description": "Handy가 제대로 작동하려면 몇 가지 권한이 필요합니다.", + "microphone": { + "title": "마이크 접근", + "description": "음성 인식을 위해 마이크 접근 권한이 필요합니다." + }, + "accessibility": { + "title": "접근성 권한", + "description": "녹음된 텍스트를 애플리케이션에 입력하기 위해 필요합니다." + }, + "grant": "권한 부여", + "granted": "승인됨", + "waiting": "대기 중...", + "allGranted": "모두 설정 완료!", + "errors": { + "checkFailed": "권한 확인에 실패했습니다. 다시 시도해주세요.", + "requestFailed": "권한 요청에 실패했습니다. 다시 시도해주세요." + } + } + }, + "modelSelector": { + "welcome": "Handy에 오신 것을 환영합니다!", + "downloadPrompt": "음성 인식을 시작하려면 아래에서 모델을 다운로드하세요.", + "availableModels": "사용 가능한 모델", + "downloadModels": "모델 다운로드", + "chooseModel": "모델 선택", + "active": "활성", + "download": "다운로드", + "downloadSize": "다운로드 크기", + "noModelsAvailable": "사용 가능한 모델이 없습니다", + "extracting": "{{modelName}} 압축 해제 중...", + "extractingMultiple": "{{count}}개 모델 압축 해제 중...", + "extractingGeneric": "압축 해제 중...", + "downloading": "다운로드 중 {{percentage}}%", + "downloadingMultiple": "{{count}}개 모델 다운로드 중...", + "modelReady": "모델 준비 완료", + "loading": "{{modelName}} 로딩 중...", + "loadingGeneric": "로딩 중...", + "modelError": "모델 오류", + "modelUnloaded": "모델 언로드됨", + "noModelDownloadRequired": "모델 없음 - 다운로드 필요", + "deleteModel": "{{modelName}} 삭제" + }, + "settings": { + "general": { + "title": "일반", + "shortcut": { + "title": "Handy 단축키", + "description": "음성-텍스트 녹음을 시작하는 키보드 단축키를 설정하세요", + "loading": "단축키 로딩 중...", + "none": "설정된 단축키 없음", + "notFound": "단축키를 찾을 수 없음", + "pressKeys": "키를 눌러주세요...", + "bindings": { + "transcribe": { + "name": "음성 텍스트 변환 단축키", + "description": "음성을 녹음하고 테스트로 변환하는 키보드 단축키입니다." + }, + "cancel": { + "name": "취소 단축키", + "description": "현재 녹음을 취소하는 키보드 단축키입니다." + } + }, + "errors": { + "restore": "원래 단축키 복원에 실패했습니다", + "set": "단축키 설정 실패: {{error}}", + "reset": "단축키를 원래 값으로 재설정하는데 실패했습니다" + } + }, + "language": { + "title": "언어", + "description": "음성 인식 언어를 선택하세요. 자동은 언어를 자동으로 감지하며, 특정 언어를 선택하면 해당 언어의 정확도가 향상될 수 있습니다.", + "descriptionUnsupported": "Parakeet 모델은 자동으로 언어를 감지합니다. 수동 선택이 필요하지 않습니다.", + "searchPlaceholder": "언어 검색...", + "noResults": "언어를 찾을 수 없습니다", + "auto": "자동" + }, + "pushToTalk": { + "label": "녹음 중 단축키 홀딩", + "description": "누르고 있으면 녹음, 놓으면 정지" + } + }, + "sound": { + "title": "사운드", + "microphone": { + "title": "마이크", + "description": "선호하는 마이크 장치를 선택하세요", + "placeholder": "마이크 선택...", + "loading": "로딩 중..." + }, + "audioFeedback": { + "label": "오디오 피드백", + "description": "녹음 시작 및 정지 시 소리 재생" + }, + "outputDevice": { + "title": "출력 장치", + "description": "피드백 사운드를 위한 오디오 출력 장치를 선택하세요", + "placeholder": "출력 장치 선택...", + "loading": "로딩 중..." + }, + "volume": { + "title": "볼륨", + "description": "오디오 피드백 사운드의 볼륨 조절" + } + }, + "advanced": { + "title": "고급", + "groups": { + "app": "앱", + "output": "출력", + "transcription": "전사", + "history": "히스토리", + "experimental": "실험적" + }, + "experimentalToggle": { + "label": "실험적 기능", + "description": "개발 중인 실험적 기능을 활성화합니다." + }, + "startHidden": { + "label": "숨김으로 시작", + "description": "창을 열지 않고 시스템 트레이에서 실행합니다." + }, + "autostart": { + "label": "시작 시 실행", + "description": "컴퓨터 로그인 시 Handy를 자동으로 시작합니다." + }, + "overlay": { + "title": "오버레이 위치", + "description": "녹음 및 전사 중 시각적 피드백 오버레이를 표시합니다. Linux에서는 '없음'을 권장합니다.", + "options": { + "none": "없음", + "bottom": "하단", + "top": "상단" + } + }, + "pasteMethod": { + "title": "붙여넣기 방법", + "description": "텍스트 삽입 방법을 선택하세요. 직접: 시스템 입력을 통해 타이핑 시뮬레이션. 없음: 붙여넣기를 건너뛰고 히스토리/클립보드만 업데이트합니다.", + "options": { + "clipboard": "클립보드 ({{modifier}}+V)", + "clipboardCtrlShiftV": "클립보드 (Ctrl+Shift+V)", + "clipboardShiftInsert": "클립보드 (Shift+Insert)", + "direct": "직접", + "none": "없음" + } + }, + "clipboardHandling": { + "title": "클립보드 처리", + "description": "클립보드 수정 안 함은 전사 후 현재 클립보드 내용을 보존합니다. 클립보드에 복사는 붙여넣기 후 전사 결과를 클립보드에 남겨둡니다.", + "options": { + "dontModify": "클립보드 수정 안 함", + "copyToClipboard": "클립보드에 복사" + } + }, + "translateToEnglish": { + "label": "영어로 번역", + "description": "텍스트로 변환시 다른 언어의 음성을 자동으로 영어로 번역합니다.", + "descriptionUnsupported": "번역은 {{model}} 모델에서 지원되지 않습니다." + }, + "modelUnload": { + "title": "모델 언로드", + "description": "모델을 지정된 시간 동안 사용하지 않으면 자동으로 GPU/CPU 메모리를 해제합니다", + "options": { + "never": "안 함", + "immediately": "즉시", + "min2": "2분 후", + "min5": "5분 후", + "min10": "10분 후", + "min15": "15분 후", + "hour1": "1시간 후", + "sec5": "5초 후 (디버그)" + } + }, + "customWords": { + "title": "사용자 정의 단어", + "description": "녹음 중 자주 잘못 들리거나 철자가 틀리는 단어를 추가하세요. 시스템이 유사한 소리의 단어를 목록과 일치하도록 자동으로 수정합니다.", + "placeholder": "단어 추가", + "add": "추가", + "remove": "{{word}} 제거" + } + }, + "postProcessing": { + "title": "후처리", + "disabledNotice": "후처리가 현재 비활성화되어 있습니다. 설정하려면 디버그 설정에서 활성화하세요.", + "api": { + "title": "API (OpenAI 호환)", + "provider": { + "title": "제공자", + "description": "OpenAI 호환 제공자를 선택하세요." + }, + "appleIntelligence": { + "title": "Apple Intelligence", + "description": "완전히 기기에서 실행됩니다. API 키나 네트워크 접근이 필요하지 않습니다.", + "requirements": "macOS Tahoe (26.0) 이상을 실행하는 Apple Silicon Mac이 필요합니다. 시스템 설정에서 Apple Intelligence가 활성화되어 있어야 합니다.", + "unavailable": "이 기기에서는 Apple Intelligence를 사용할 수 없습니다. macOS Tahoe (26.0) 이상을 실행하고 시스템 설정에서 Apple Intelligence가 활성화된 Apple Silicon Mac이 필요합니다." + }, + "baseUrl": { + "title": "기본 URL", + "description": "선택한 제공자의 API 기본 URL입니다. 사용자 정의 제공자만 편집할 수 있습니다.", + "placeholder": "https://api.openai.com/v1" + }, + "apiKey": { + "title": "API 키", + "description": "선택한 제공자의 API 키입니다.", + "placeholder": "sk-..." + }, + "model": { + "title": "모델", + "descriptionApple": "선택적 숫자 토큰 제한을 제공하거나 기본 기기 내 프리셋을 유지하세요.", + "descriptionCustom": "사용자 정의 엔드포인트에서 예상하는 모델 식별자를 제공하세요.", + "descriptionDefault": "선택한 제공자가 제공하는 모델을 선택하세요.", + "placeholderApple": "Apple Intelligence", + "placeholderWithOptions": "모델 검색 또는 선택", + "placeholderNoOptions": "모델 이름 입력", + "refreshModels": "모델 새로고침" + } + }, + "prompts": { + "title": "프롬프트", + "selectedPrompt": { + "title": "선택된 프롬프트", + "description": "텍스트 변환을 개선하기 위한 템플릿을 선택하거나 새로 만드세요. 프롬프트 텍스트 내에서 ${output}를 사용하여 캡처된 텍스트를 참조하세요." + }, + "noPrompts": "사용 가능한 프롬프트 없음", + "selectPrompt": "프롬프트 선택", + "createNew": "새 프롬프트 만들기", + "promptLabel": "프롬프트 레이블", + "promptLabelPlaceholder": "프롬프트 이름 입력", + "promptInstructions": "프롬프트 지시사항", + "promptInstructionsPlaceholder": "텍스트 변환 후 실행할 지시사항을 작성하세요. 예: 다음 텍스트의 문법과 명확성을 개선하세요: ${output}", + "promptTip": "팁: 프롬프트에서 변환된 텍스트를 삽입하려면 ${output}을 사용하세요.", + "updatePrompt": "프롬프트 업데이트", + "deletePrompt": "프롬프트 삭제", + "createPrompt": "프롬프트 만들기", + "cancel": "취소", + "selectToEdit": "세부 정보를 보고 편집하려면 위에서 프롬프트를 선택하세요.", + "createFirst": "첫 번째 후처리 프롬프트를 만들려면 위의 '새 프롬프트 만들기'를 클릭하세요." + } + }, + "history": { + "title": "히스토리", + "openFolder": "녹음 폴더 열기", + "loading": "히스토리 로딩 중...", + "empty": "아직 변환된 내용이 없습니다. 녹음을 시작하여 히스토리를 만드세요!", + "copyToClipboard": "녹음 내용을 클립보드에 복사", + "save": "변환된 텍스트 저장", + "unsave": "저장에서 제거", + "delete": "항목 삭제", + "deleteError": "항목 삭제에 실패했습니다. 다시 시도해주세요." + }, + "debug": { + "title": "디버그", + "logDirectory": { + "title": "로그 디렉토리", + "description": "로그 파일이 저장되는 위치" + }, + "logLevel": { + "title": "로그 레벨", + "description": "로깅의 상세도 설정" + }, + "updateChecks": { + "label": "업데이트 확인", + "description": "Handy의 새 버전을 자동으로 확인합니다" + }, + "soundTheme": { + "label": "사운드 테마", + "description": "녹음 시작 및 정지 피드백을 위한 사운드 테마를 선택하세요" + }, + "wordCorrectionThreshold": { + "title": "단어 수정 임계값", + "description": "사용자 정의 단어 수정의 민감도" + }, + "historyLimit": { + "title": "히스토리 제한", + "description": "보관할 최대 히스토리 항목 수", + "entries": "항목" + }, + "recordingRetention": { + "title": "녹음 자동 삭제", + "description": "공간을 절약하기 위해 오래된 녹음을 자동으로 삭제합니다", + "never": "안 함", + "preserveLimit": "최근 {{count}}개 유지", + "days3": "3일 후", + "weeks2": "2주 후", + "months3": "3개월 후", + "placeholder": "보관 기간 선택..." + }, + "alwaysOnMicrophone": { + "label": "항상 켜진 마이크", + "description": "더 빠른 응답을 위해 마이크를 활성 상태로 유지" + }, + "clamshellMicrophone": { + "title": "클램셸 마이크", + "description": "노트북 덮개가 닫혀 있을 때 사용할 마이크" + }, + "postProcessingToggle": { + "label": "후처리", + "description": "텍스트 변환 후 AI 기반 텍스트 개선 활성화" + }, + "muteWhileRecording": { + "label": "녹음 중 음소거", + "description": "녹음 중 시스템 오디오 음소거" + }, + "appendTrailingSpace": { + "label": "끝 공백 추가", + "description": "붙여넣은 텍스트 끝에 공백 추가" + }, + "keyboardImplementation": { + "title": "키보드 구현", + "description": "키보드 단축키 백엔드를 선택하세요.", + "bindingsReset": "키보드 단축키가 호환되지 않아 기본값으로 재설정되었습니다" + }, + "pasteDelay": { + "title": "붙여넣기 지연", + "description": "붙여넣기 키 입력을 보내기 전 지연 시간(밀리초). 잘못된 텍스트가 붙여넣어지면 늘리세요." + }, + "paths": { + "appData": "앱 데이터:", + "models": "모델:", + "settings": "설정:" + } + }, + "about": { + "title": "정보", + "version": { + "title": "버전", + "description": "Handy의 현재 버전" + }, + "appDataDirectory": { + "title": "앱 데이터 디렉토리", + "description": "Handy가 데이터를 저장하는 위치" + }, + "sourceCode": { + "title": "소스 코드", + "description": "소스 코드 보기 및 기여", + "button": "GitHub에서 보기" + }, + "supportDevelopment": { + "title": "개발 지원", + "description": "Handy 개발을 계속할 수 있도록 도와주세요", + "button": "후원하기" + }, + "acknowledgments": { + "title": "감사의 말", + "whisper": { + "title": "Whisper.cpp", + "description": "OpenAI의 Whisper 자동 음성 인식 모델의 고성능 추론", + "details": "Handy는 빠르고 로컬 음성-텍스트 처리를 위해 Whisper.cpp를 사용합니다. Georgi Gerganov와 기여자들의 놀라운 작업에 감사드립니다." + } + } + } + }, + "footer": { + "downloadingModel": "{{model}} 다운로드 중...", + "checkingUpdates": "업데이트 확인 중...", + "updateAvailable": "업데이트 사용 가능: {{version}}", + "updateAvailableShort": "업데이트 사용 가능", + "upToDate": "최신 상태", + "downloadUpdate": "업데이트 다운로드", + "restart": "재시작", + "updateCheckingDisabled": "업데이트 확인 비활성화됨", + "downloading": "다운로드 중... {{progress}}%", + "installing": "설치 중...", + "preparing": "준비 중...", + "checkForUpdates": "업데이트 확인" + }, + "common": { + "loading": "로딩 중...", + "save": "저장", + "cancel": "취소", + "reset": "재설정", + "add": "추가", + "remove": "제거", + "delete": "삭제", + "edit": "편집", + "create": "만들기", + "update": "업데이트", + "close": "닫기", + "open": "열기", + "default": "기본값", + "enabled": "활성화됨", + "disabled": "비활성화됨", + "on": "켜짐", + "off": "꺼짐", + "yes": "예", + "no": "아니오", + "noOptionsFound": "옵션을 찾을 수 없습니다" + }, + "accessibility": { + "permissionsRequired": "접근성 권한 필요", + "permissionsDescription": "Handy는 녹음된 텍스트를 입력하기 위해 접근성 권한이 필요합니다.", + "openSettings": "시스템 설정 열기", + "dismiss": "닫기" + }, + "errors": { + "loadDirectory": "디렉토리 로딩 오류: {{error}}" + }, + "appLanguage": { + "title": "애플리케이션 언어", + "description": "Handy 인터페이스의 언어를 변경하세요" + }, + "overlay": { + "transcribing": "텍스트로 변환 중..." + } +}