diff --git a/src/contexts/I18nContext.tsx b/src/contexts/I18nContext.tsx index c62e8188..e3296973 100644 --- a/src/contexts/I18nContext.tsx +++ b/src/contexts/I18nContext.tsx @@ -28,6 +28,13 @@ import esLaunch from '@/i18n/locales/es/launch.json' import esSettings from '@/i18n/locales/es/settings.json' import esShortcuts from '@/i18n/locales/es/shortcuts.json' import esTimeline from '@/i18n/locales/es/timeline.json' +import koCommon from '@/i18n/locales/ko/common.json' +import koDialogs from '@/i18n/locales/ko/dialogs.json' +import koEditor from '@/i18n/locales/ko/editor.json' +import koLaunch from '@/i18n/locales/ko/launch.json' +import koSettings from '@/i18n/locales/ko/settings.json' +import koShortcuts from '@/i18n/locales/ko/shortcuts.json' +import koTimeline from '@/i18n/locales/ko/timeline.json' import zhCNCommon from '@/i18n/locales/zh-CN/common.json' import zhCNDialogs from '@/i18n/locales/zh-CN/dialogs.json' import zhCNEditor from '@/i18n/locales/zh-CN/editor.json' @@ -59,6 +66,15 @@ const messages: Record = { dialogs: esDialogs, shortcuts: esShortcuts, }, + ko: { + common: koCommon, + launch: koLaunch, + editor: koEditor, + timeline: koTimeline, + settings: koSettings, + dialogs: koDialogs, + shortcuts: koShortcuts, + }, 'zh-CN': { common: zhCNCommon, launch: zhCNLaunch, diff --git a/src/i18n/config.ts b/src/i18n/config.ts index ce23fd41..e51a8e43 100644 --- a/src/i18n/config.ts +++ b/src/i18n/config.ts @@ -1,6 +1,6 @@ export const DEFAULT_LOCALE = 'en' as const -export const SUPPORTED_LOCALES = ['en', 'es', 'zh-CN'] as const +export const SUPPORTED_LOCALES = ['en', 'es', 'ko', 'zh-CN'] as const export const I18N_NAMESPACES = [ 'common', diff --git a/src/i18n/locales/ko/common.json b/src/i18n/locales/ko/common.json new file mode 100644 index 00000000..f036318e --- /dev/null +++ b/src/i18n/locales/ko/common.json @@ -0,0 +1,26 @@ +{ + "app": { + "name": "Recordly", + "editorTitle": "Recordly 편집기", + "subtitle": "화면 녹화 및 편집", + "language": "언어", + "manageRecordings": "녹화 폴더 열기" + }, + "actions": { + "cancel": "취소", + "close": "닫기", + "export": "내보내기", + "load": "불러오기", + "redo": "다시 실행", + "reset": "초기화", + "save": "저장", + "undo": "실행 취소", + "delete": "삭제", + "done": "완료" + }, + "errors": { + "invalidFileType": "잘못된 파일 형식입니다", + "failedToUploadImage": "이미지 업로드에 실패했습니다", + "fileReadError": "파일을 읽는 중 오류가 발생했습니다." + } +} diff --git a/src/i18n/locales/ko/dialogs.json b/src/i18n/locales/ko/dialogs.json new file mode 100644 index 00000000..e63fa57f --- /dev/null +++ b/src/i18n/locales/ko/dialogs.json @@ -0,0 +1,62 @@ +{ + "export": { + "pleaseTryAgain": "다시 시도해 주세요", + "compilingGifProgress": "GIF를 만드는 중... {{progress}}%", + "compilingGifWait": "GIF를 만드는 중입니다... 잠시 시간이 걸릴 수 있습니다", + "takeMoment": "잠시만 기다려 주세요...", + "exportFailed": "내보내기 실패", + "compilingGifTitle": "GIF 생성 중", + "exportingFormat": "{{format}} 내보내는 중", + "exportComplete": "내보내기 완료", + "formatReady": "{{format}} 파일이 준비되었습니다", + "showInFolder": "폴더에서 보기", + "compiling": "생성 중", + "renderingFrames": "프레임 렌더링 중", + "processing": "처리 중...", + "status": "상태", + "format": "형식", + "compilingStatus": "생성 중...", + "frames": "프레임", + "cancelExport": "내보내기 취소", + "reopenSaveDialog": "저장 대화상자 다시 열기", + "savedSuccess": "{{format}} 파일을 저장했습니다!" + }, + "addFont": { + "title": "Google 폰트 추가", + "heading": "Google 폰트 추가", + "description": "주석에 사용할 Google Fonts의 사용자 지정 글꼴을 추가합니다.", + "urlLabel": "Google Fonts 가져오기 URL", + "urlPlaceholder": "https://fonts.googleapis.com/css2?family=Roboto&display=swap", + "urlHelp": "Google Fonts에서 가져오세요: 글꼴 선택 → \"Get font\" 클릭 → @import URL 복사", + "nameLabel": "표시 이름", + "namePlaceholder": "내 사용자 지정 글꼴", + "nameHelp": "글꼴 선택기에서 표시될 이름입니다", + "adding": "추가 중...", + "addFont": "글꼴 추가", + "enterUrl": "Google Fonts 가져오기 URL을 입력해 주세요", + "invalidUrl": "올바른 Google Fonts URL을 입력해 주세요", + "enterName": "글꼴 이름을 입력해 주세요", + "extractFailed": "URL에서 글꼴 패밀리를 추출할 수 없습니다", + "addSuccess": "글꼴 \"{{name}}\"을(를) 추가했습니다", + "addFailed": "글꼴 추가에 실패했습니다", + "loadTimeout": "글꼴을 불러오는 데 너무 오래 걸립니다. URL을 확인한 뒤 다시 시도해 주세요.", + "loadFailed": "글꼴을 불러올 수 없습니다. Google Fonts URL이 올바른지 확인해 주세요." + }, + "shortcutsConfig": { + "title": "키보드 단축키", + "configurable": "변경 가능", + "fixed": "고정", + "pressEscToCancel": "Esc를 눌러 취소", + "clickToChange": "클릭해서 변경", + "pressAKey": "키를 누르세요…", + "alreadyUsedBy": "이미 {{action}}에서 사용 중입니다", + "swap": "바꾸기", + "reserved": "이 단축키는 \"{{label}}\"에 예약되어 있어 다시 지정할 수 없습니다.", + "saved": "키보드 단축키를 저장했습니다", + "resetNotice": "기본 단축키로 초기화했습니다 — 적용하려면 저장을 클릭하세요", + "instructions": "단축키를 클릭한 다음 새 키 조합을 누르세요. 취소하려면 Esc를 누르세요.", + "resetToDefaults": "기본값으로 초기화", + "cancel": "취소", + "save": "저장" + } +} diff --git a/src/i18n/locales/ko/editor.json b/src/i18n/locales/ko/editor.json new file mode 100644 index 00000000..eeb8ea61 --- /dev/null +++ b/src/i18n/locales/ko/editor.json @@ -0,0 +1,118 @@ +{ + "playback": { + "play": "재생", + "pause": "일시 정지" + }, + "annotations": { + "settings": "주석 설정", + "active": "활성", + "text": "텍스트", + "image": "이미지", + "arrow": "화살표", + "textContent": "텍스트 내용", + "textPlaceholder": "텍스트를 입력하세요...", + "fontStyle": "글꼴 스타일", + "selectStyle": "스타일 선택", + "size": "크기", + "toggleBold": "굵게 전환", + "toggleItalic": "기울임꼴 전환", + "toggleUnderline": "밑줄 전환", + "alignLeft": "왼쪽 정렬", + "alignCenter": "가운데 정렬", + "alignRight": "오른쪽 정렬", + "textColor": "텍스트 색상", + "background": "배경", + "none": "없음", + "clearBackground": "배경 지우기", + "uploadImage": "이미지 업로드", + "supportedFormats": "지원 형식: JPG, PNG, GIF, WebP", + "arrowDirection": "화살표 방향", + "strokeWidth": "선 두께: {{width}}px", + "arrowColor": "화살표 색상", + "deleteAnnotation": "주석 삭제", + "shortcutsAndTips": "단축키 및 팁", + "tipSelectAnnotation": "재생 헤드를 겹치는 주석 구간으로 이동한 뒤 항목을 선택하세요.", + "tipCycleForward": "Tab 키로 겹치는 항목을 순환할 수 있습니다.", + "tipCycleBackward": "Shift+Tab으로 이전 항목으로 이동할 수 있습니다.", + "imageUploadSuccess": "이미지를 업로드했습니다!", + "imageUploadError": "JPG, PNG, GIF 또는 WebP 이미지 파일을 업로드해 주세요." + }, + "fontStyles": { + "classic": "클래식", + "editor": "에디터", + "strong": "강조", + "typewriter": "타자기", + "deco": "장식", + "simple": "심플", + "modern": "모던", + "clean": "클린" + }, + "format": { + "mp4Video": "MP4 비디오", + "mp4Description": "고화질 비디오 파일", + "gifAnimation": "GIF 애니메이션", + "gifDescription": "공유용 애니메이션 이미지" + }, + "gifOptions": { + "frameRate": "프레임 속도", + "outputSize": "출력 크기", + "outputDimensions": "출력: {{width}} × {{height}}px", + "loopAnimation": "반복 재생", + "loopDescription": "GIF가 계속 반복 재생됩니다" + }, + "tutorial": { + "howTrimmingWorks": "트림 사용법", + "title": "트림 작동 방식", + "understanding": "비디오에서 원하지 않는 부분을 잘라내는 방법을 알아보세요.", + "descriptionP1": "트림 도구는 제거하고 싶은 구간을", + "descriptionRemove": "삭제", + "descriptionP2": "하도록 설정합니다.", + "descriptionP3": "타임라인에서 빨간 트림 구간으로 덮인 부분은 내보낼 때 잘려 나갑니다.", + "visualExample": "예시 보기", + "removed": "제거됨", + "kept": "유지됨", + "finalVideo": "최종 비디오", + "part": "파트 {{number}}", + "addTrimStep": "1. 트림 추가", + "addTrimDesc": "T 키를 누르거나 가위 아이콘을 클릭해 제거할 구간을 표시하세요.", + "adjustStep": "2. 조정", + "adjustDesc": "빨간 구간의 가장자리를 드래그해 정확히 잘라낼 범위를 지정하세요." + }, + "feedback": { + "trigger": "피드백", + "title": "피드백 및 문의", + "description": "문제가 있거나 빠진 기능이 있으면 직접 연락하거나 이슈를 등록해 주세요.", + "emailLabel": "이메일", + "xLabel": "X", + "reportIssue": "이슈 등록 / 피드백 보내기", + "openFailed": "링크를 열지 못했습니다." + }, + "keyboardShortcuts": { + "trigger": "단축키", + "title": "키보드 단축키", + "description": "타임라인과 편집기 컨트롤에 대한 빠른 참고입니다.", + "customizeTooltip": "단축키 사용자 지정", + "customize": "사용자 지정", + "panTimeline": "타임라인 이동", + "zoomTimeline": "타임라인 확대/축소", + "cycleAnnotations": "주석 순환", + "tab": "Tab" + }, + "actions": { + "saveAgain": "다시 저장", + "showInFolder": "폴더에서 보기" + }, + "project": { + "untitled": "제목 없음" + }, + "exportStatus": { + "exporting": "내보내는 중", + "renderingFile": "파일을 렌더링하고 있습니다.", + "preparing": "내보내기를 준비하는 중...", + "completePercent": "{{percent}}% 완료", + "issue": "내보내기 오류", + "complete": "내보내기 완료", + "savedSuccessfully": "파일이 성공적으로 저장되었습니다." + }, + "openRecordingsFolder": "녹화 폴더 열기" +} diff --git a/src/i18n/locales/ko/launch.json b/src/i18n/locales/ko/launch.json new file mode 100644 index 00000000..bfe0a403 --- /dev/null +++ b/src/i18n/locales/ko/launch.json @@ -0,0 +1,73 @@ +{ + "recording": { + "disableSystemAudio": "시스템 오디오 끄기", + "enableSystemAudio": "시스템 오디오 켜기", + "disableMicrophone": "마이크 끄기", + "enableMicrophone": "마이크 켜기", + "disableWebcam": "웹캠 오버레이 끄기", + "enableWebcam": "웹캠 오버레이 켜기", + "countdownDelay": "카운트다운 지연", + "noDelay": "지연 없음", + "record": "녹화", + "recordingFolder": "녹화 폴더: {{path}}", + "chooseRecordingsFolder": "녹화 폴더 선택", + "folderPath": "경로: /{{name}}/", + "openVideoFile": "비디오 파일 열기", + "openProject": "프로젝트 열기", + "hideHudFromVideo": "녹화에서 HUD 숨기기", + "showHudInVideo": "녹화에 HUD 표시", + "hideHud": "HUD 숨기기", + "closeApp": "앱 닫기", + "screens": "화면", + "windows": "창", + "noSourcesFound": "사용 가능한 소스를 찾을 수 없습니다", + "microphone": "마이크", + "turnOffMicrophone": "마이크 끄기", + "selectMicToEnable": "사용할 마이크를 선택하세요", + "noMicrophonesFound": "마이크를 찾을 수 없습니다", + "webcam": "웹캠", + "turnOffWebcam": "웹캠 끄기", + "selectWebcamToEnable": "사용할 웹캠을 선택하세요", + "noWebcamsFound": "웹캠을 찾을 수 없습니다", + "recordingsFolder": "녹화 폴더", + "language": "언어", + "paused": "일시 정지", + "rec": "녹화 중", + "resume": "계속", + "pause": "일시 정지", + "stop": "중지", + "cancel": "취소", + "more": "더 보기", + "update": { + "update": "업데이트", + "updated": "업데이트 완료", + "idleTitle": "업데이트를 확인합니다.", + "checkingTitle": "업데이트를 확인하는 중...", + "downloadingTitle": "업데이트를 다운로드하는 중...", + "errorTitle": "업데이트 확인에 실패했습니다. 클릭하여 다시 시도하세요.", + "upToDateTitle": "Recordly {{version}}은(는) 최신 버전입니다.", + "availableTitle": "Recordly {{version}}을(를) 사용할 수 있습니다.", + "availableGenericTitle": "업데이트를 사용할 수 있습니다." + } + }, + "sourceSelector": { + "loadingSources": "소스를 불러오는 중...", + "screens": "화면", + "windows": "창", + "windowsNote": "보이는 창(최소화되지 않은 창)만 녹화할 수 있습니다.", + "windowPlaceholder": "창", + "cancel": "취소", + "share": "공유" + }, + "permissions": { + "screenRecordingNeeded": "녹화를 시작하기 전에 Recordly에 화면 녹화 권한이 필요합니다. 시스템 설정을 열었습니다. 권한을 허용한 뒤 Recordly를 종료하고 다시 실행해 주세요.", + "screenRecordingMissing": "화면 녹화 권한이 아직 없습니다. 시스템 설정을 다시 열었습니다. 권한을 허용한 뒤 Recordly를 종료하고 다시 실행한 후 녹화를 시작해 주세요.", + "accessibilityNeeded": "커서 추적을 위해 Recordly에 손쉬운 사용 권한도 필요합니다. 시스템 설정을 열었습니다. 권한을 허용한 뒤 Recordly를 종료하고 다시 실행해 주세요.", + "accessibilityMissing": "손쉬운 사용 권한이 아직 없습니다. 시스템 설정을 다시 열었습니다. 권한을 허용한 뒤 Recordly를 종료하고 다시 실행한 후 녹화를 시작해 주세요.", + "selectSource": "녹화할 소스를 선택해 주세요", + "systemAudioUnavailable": "이 소스에서는 시스템 오디오를 사용할 수 없습니다. 시스템 오디오 없이 녹화를 계속합니다.", + "microphoneDenied": "마이크 접근이 거부되었습니다. 마이크 오디오 없이 녹화를 계속합니다.", + "failedToStart": "녹화 시작에 실패했습니다: {{error}}", + "failedToStartGeneric": "녹화 시작에 실패했습니다" + } +} diff --git a/src/i18n/locales/ko/settings.json b/src/i18n/locales/ko/settings.json new file mode 100644 index 00000000..edf926d0 --- /dev/null +++ b/src/i18n/locales/ko/settings.json @@ -0,0 +1,160 @@ +{ + "zoom": { + "level": "확대 레벨", + "selectRegion": "조정할 확대 구간을 선택하세요", + "deleteZoom": "확대 삭제" + }, + "trim": { + "deleteRegion": "트림 구간 삭제" + }, + "speed": { + "playbackSpeed": "재생 속도", + "selectRegion": "조정할 속도 구간을 선택하세요", + "deleteRegion": "속도 구간 삭제" + }, + "effects": { + "title": "비디오 효과", + "show": "표시", + "showCursor": "커서 표시", + "loopCursor": "커서 반복", + "cursorStyle": "커서 스타일", + "cursorStyleOptions": { + "tahoe": "Tahoe", + "dot": "Dot", + "figma": "Minimal", + "mono": "Inverted", + "lavender": "Lavender", + "parched": "Parched", + "chooper": "Chooper", + "amongus": "Among Us", + "turtle": "Turtle" + }, + "backgroundBlur": "배경 블러", + "zoomMotionBlur": "확대 모션 블러", + "connectZooms": "확대 구간 연결", + "zoomGeneralTitle": "일반", + "zoomGeneralDescription": "모든 확대 전환에 적용되는 전체 모션 설정입니다.", + "zoomInTitle": "확대 시작", + "zoomInDescription": "카메라가 확대 구간에 진입하는 방식을 제어합니다.", + "zoomOutTitle": "확대 종료", + "zoomOutDescription": "카메라가 확대 구간에서 빠져나오는 방식을 제어합니다.", + "connectedZoomTitle": "확대 구간 사이", + "connectedZoomDescription": "연결이 활성화된 경우, 연속된 확대 구간 사이의 이동을 조정합니다.", + "zoomInDuration": "확대 시작 시간", + "zoomInOverlap": "확대 시작 겹침", + "zoomOutDuration": "확대 종료 시간", + "zoomInEasing": "확대 시작 커브", + "zoomOutEasing": "확대 종료 커브", + "connectedZoomGap": "연결 확대 간격", + "connectedZoomDuration": "연결 확대 시간", + "connectedZoomEasing": "연결 이동 커브", + "zoomEasingOptions": { + "recordly": "Recordly", + "glide": "Glide", + "smooth": "Smooth", + "snappy": "Snappy", + "linear": "Linear" + }, + "cursorSize": "커서 크기", + "cursorSmoothing": "커서 보정", + "off": "끔", + "cursorMotionBlur": "커서 모션 블러", + "cursorClickBounce": "커서 클릭 바운스", + "cursorClickBounceDuration": "바운스 속도", + "cursorSway": "커서 흔들림", + "webcam": "웹캠 오버레이", + "webcamFootage": "웹캠 영상", + "webcamFootageDescription": "이 비디오에 연결된 웹캠 영상이 없습니다", + "uploadWebcamFootage": "영상 업로드", + "replaceWebcamFootage": "영상 교체", + "removeWebcamFootage": "영상 제거", + "webcamFootageAdded": "웹캠 영상을 연결했습니다", + "webcamFootageRemoved": "웹캠 영상을 제거했습니다", + "webcamSize": "웹캠 크기", + "webcamReactToZoom": "확대 시 웹캠 반응", + "webcamRoundness": "웹캠 둥글기", + "webcamShadow": "웹캠 그림자", + "shadow": "그림자", + "radius": "반경", + "roundness": "둥글기", + "padding": "여백", + "removeBackground": "배경 제거" + }, + "sections": { + "scene": "장면", + "captions": "자막", + "zoom": "확대", + "cursor": "커서", + "webcam": "웹캠", + "frame": "프레임", + "crop": "자르기" + }, + "captions": { + "enabled": "표시", + "language": "언어", + "downloading": "다운로드 중...", + "deleteModel": "모델 삭제", + "clearModel": "모델 초기화", + "downloadModel": "모델 다운로드", + "generating": "생성 중...", + "generateFull": "자막 생성", + "regenerateFull": "자막 다시 생성", + "clearFull": "자막 지우기", + "fontSettings": "글꼴 설정", + "defaultFont": "기본값", + "fontFamily": "글꼴", + "fontSize": "글꼴 크기", + "rowCount": "행 수", + "animation": "애니메이션", + "animationOff": "없음", + "animationFade": "페이드", + "animationRise": "올라오기", + "animationPop": "팝", + "bottomOffset": "하단 오프셋", + "maxWidth": "최대 너비", + "boxRadius": "박스 반경", + "backgroundOpacity": "배경 투명도", + "textColor": "텍스트 색상" + }, + "crop": { + "title": "비디오 자르기", + "instruction": "각 가장자리를 드래그해 자르기 영역을 조정하세요", + "top": "상단", + "bottom": "하단", + "left": "왼쪽", + "right": "오른쪽", + "openEditor": "자르기 편집기 열기" + }, + "background": { + "title": "배경", + "image": "이미지", + "color": "색상", + "gradient": "그라데이션", + "wallpaperPreview": "배경화면 미리보기", + "uploadCustom": "사용자 이미지 업로드", + "uploadSuccess": "사용자 이미지를 업로드했습니다!", + "uploadError": "JPG 또는 JPEG 이미지 파일을 업로드해 주세요.", + "uploadErrorDescription": "JPG 또는 JPEG 이미지 파일을 업로드해 주세요." + }, + "export": { + "title": "내보내기", + "mp4": "MP4", + "gif": "GIF", + "quality": { + "low": "낮음", + "medium": "보통", + "high": "높음", + "original": "원본" + }, + "loop": "반복", + "outputDimensions": "출력: {{dimensions}}px", + "sizePresetOriginalShort": "원본", + "sizePresetMediumShort": "중간", + "sizePresetLargeShort": "큰", + "loadProject": "프로젝트 불러오기", + "saveProject": "프로젝트 저장", + "exportVideo": "{{format}} 내보내기", + "reportBug": "버그 신고", + "starOnGithub": "GitHub에서 별표 주기" + } +} diff --git a/src/i18n/locales/ko/shortcuts.json b/src/i18n/locales/ko/shortcuts.json new file mode 100644 index 00000000..dc0303d2 --- /dev/null +++ b/src/i18n/locales/ko/shortcuts.json @@ -0,0 +1,16 @@ +{ + "actions": { + "addZoom": "확대 추가", + "addTrim": "트림 추가", + "addSpeed": "속도 추가", + "addAnnotation": "주석 추가", + "addKeyframe": "키프레임 추가", + "deleteSelected": "선택 항목 삭제", + "playPause": "재생 / 일시 정지", + "cycleForward": "주석 다음으로 순환", + "cycleBackward": "주석 이전으로 순환", + "deleteSelectedAlt": "선택 항목 삭제 (보조)", + "panTimeline": "타임라인 이동", + "zoomTimeline": "타임라인 확대/축소" + } +} diff --git a/src/i18n/locales/ko/timeline.json b/src/i18n/locales/ko/timeline.json new file mode 100644 index 00000000..3b556f9e --- /dev/null +++ b/src/i18n/locales/ko/timeline.json @@ -0,0 +1,38 @@ +{ + "zoom": { + "cannotPlace": "여기에는 확대를 배치할 수 없습니다", + "existsOrNoSpace": "이 위치에는 이미 확대가 있거나 사용할 수 있는 공간이 부족합니다.", + "suggestHandlerUnavailable": "확대 추천 기능을 사용할 수 없습니다", + "noTelemetry": "사용 가능한 커서 텔레메트리가 없습니다", + "recordFirst": "커서 기반 추천을 만들려면 먼저 화면 녹화를 진행해 주세요.", + "noUsableTelemetry": "사용 가능한 커서 텔레메트리가 없습니다", + "notEnoughMovement": "이 녹화에는 충분한 커서 이동 데이터가 포함되어 있지 않습니다.", + "noInteractionMoments": "명확한 상호작용 지점을 찾지 못했습니다", + "tryRecording": "중요한 동작 주변에서 잠시 멈추거나 클릭하는 녹화를 시도해 보세요.", + "noAutoZoomSlots": "자동 확대를 배치할 수 있는 구간이 없습니다", + "dwellPointsOverlap": "감지된 머무름 지점이 기존 확대 구간과 겹칩니다.", + "addedSuggestions": "상호작용 기반 확대 추천 {{count}}개를 추가했습니다", + "label": "확대 {{index}}", + "addZoom": "확대 추가 (Z)", + "suggestZooms": "커서 기반 확대 추천" + }, + "trim": { + "cannotPlace": "여기에는 트림을 배치할 수 없습니다", + "existsOrNoSpace": "이 위치에는 이미 트림이 있거나 사용할 수 있는 공간이 부족합니다.", + "label": "트림 {{index}}", + "addTrim": "트림 추가 (T)" + }, + "speed": { + "cannotPlace": "여기에는 속도 구간을 배치할 수 없습니다", + "existsOrNoSpace": "이 위치에는 이미 속도 구간이 있거나 사용할 수 있는 공간이 부족합니다.", + "label": "속도" + }, + "annotation": { + "label": "주석", + "image": "이미지", + "addAnnotation": "주석 추가 (A)" + }, + "addSpeed": "속도 추가 (S)", + "resizeLeft": "왼쪽 크기 조절", + "resizeRight": "오른쪽 크기 조절" +}