Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions src/contexts/I18nContext.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand Down Expand Up @@ -59,6 +66,15 @@ const messages: Record<AppLocale, LocaleBundle> = {
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,
Expand Down
2 changes: 1 addition & 1 deletion src/i18n/config.ts
Original file line number Diff line number Diff line change
@@ -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
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Find all hard-coded locale label maps that need 'ko' entry
rg -n -C3 'LOCALE_LABELS|labels.*Record.*string.*string' --type=ts --type=tsx -g '!*.json'

Repository: webadderall/Recordly

Length of output: 91


🏁 Script executed:

#!/bin/bash
# Search for locale label maps without specifying invalid file type
rg -n 'LOCALE_LABELS|labels.*Record.*string' -A 5 src/

Repository: webadderall/Recordly

Length of output: 1201


🏁 Script executed:

#!/bin/bash
# Find the specific files mentioned in the review
fd -e ts -e tsx 'VideoEditor|LaunchWindow' src/

Repository: webadderall/Recordly

Length of output: 146


Add ko entry to hard-coded locale label maps.

Adding 'ko' to SUPPORTED_LOCALES requires updating the corresponding label maps in UI components. Without this, Korean will display as the fallback code instead of "한국어":

  • src/components/video-editor/VideoEditor.tsx (lines 286-290): labels object needs ko: "한국어"
  • src/components/launch/LaunchWindow.tsx (lines 57-61): LOCALE_LABELS object needs ko: "한국어"
Example fixes
// VideoEditor.tsx (lines 286-290)
 const labels: Record<string, string> = {
   en: "EN",
   es: "ES",
+  ko: "한국어",
   "zh-CN": "中文",
 };
// LaunchWindow.tsx (lines 57-61)
 const LOCALE_LABELS: Record<string, string> = {
   en: "EN",
   es: "ES",
+  ko: "한국어",
   "zh-CN": "中文",
 };
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/i18n/config.ts` at line 3, SUPPORTED_LOCALES now includes 'ko' but the UI
label maps are missing a Korean entry; update the labels object in the
VideoEditor component (look for the variable named labels in VideoEditor.tsx)
and the LOCALE_LABELS object in the LaunchWindow component (LOCALE_LABELS in
LaunchWindow.tsx) to add ko: "한국어" so Korean displays correctly instead of the
locale code.


export const I18N_NAMESPACES = [
'common',
Expand Down
26 changes: 26 additions & 0 deletions src/i18n/locales/ko/common.json
Original file line number Diff line number Diff line change
@@ -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": "파일을 읽는 중 오류가 발생했습니다."
}
}
62 changes: 62 additions & 0 deletions src/i18n/locales/ko/dialogs.json
Original file line number Diff line number Diff line change
@@ -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": "이미 <strong>{{action}}</strong>에서 사용 중입니다",
"swap": "바꾸기",
"reserved": "이 단축키는 \"{{label}}\"에 예약되어 있어 다시 지정할 수 없습니다.",
"saved": "키보드 단축키를 저장했습니다",
"resetNotice": "기본 단축키로 초기화했습니다 — 적용하려면 저장을 클릭하세요",
"instructions": "단축키를 클릭한 다음 새 키 조합을 누르세요. 취소하려면 Esc를 누르세요.",
"resetToDefaults": "기본값으로 초기화",
"cancel": "취소",
"save": "저장"
}
}
118 changes: 118 additions & 0 deletions src/i18n/locales/ko/editor.json
Original file line number Diff line number Diff line change
@@ -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": "녹화 폴더 열기"
}
73 changes: 73 additions & 0 deletions src/i18n/locales/ko/launch.json
Original file line number Diff line number Diff line change
@@ -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": "녹화 시작에 실패했습니다"
}
}
Loading