Files
SnapOtter/packages/shared/src/i18n/ko.ts
T
SnapOtter d38621d7b9 feat: add multi-language support for 20 locales
Add complete i18n infrastructure with 21 supported languages:
English, Simplified Chinese, Traditional Chinese, Japanese, Korean,
Spanish, French, Italian, Brazilian Portuguese, German, Dutch, Swedish,
Russian, Polish, Ukrainian, Arabic (RTL), Turkish, Hindi, Vietnamese,
Indonesian, and Thai.

- I18nProvider context with three-tier locale detection
  (user preference > navigator.languages > instance default > English)
- ~1500 translation keys per locale with TypeScript-enforced completeness
- Dynamic code-splitting: only the active locale is loaded at runtime
- Language selectors in footer, login page, settings, and mobile sidebar
- Arabic RTL support with CSS logical properties across all components
- Tool names, descriptions, and categories translated via i18n helpers
- Public API endpoint GET /api/v1/config/locale for instance default
- Multi-script font stack (CJK, Arabic, Devanagari, Thai, Cyrillic)
- format() and plural() helpers for interpolation and pluralization
- API error translation mapping (translateApiError)
- 36 Playwright e2e tests verifying all 21 locales load correctly
- 25 unit tests for format, plural, locale detection, and completeness
- Updated translations.md docs and CLAUDE.md conventions
2026-05-15 17:02:49 +08:00

1917 lines
73 KiB
TypeScript

import type { TranslationKeys } from "./en.js";
export const ko: TranslationKeys = {
common: {
upload: "컴퓨터에서 업로드",
process: "처리",
download: "다운로드",
cancel: "취소",
save: "저장",
delete: "삭제",
settings: "설정",
search: "도구 검색...",
dropFiles: "여기에 파일을 놓거나 업로드 버튼을 클릭하세요",
loading: "로딩 중...",
error: "오류가 발생했습니다",
confirm: "확인",
close: "닫기",
back: "뒤로",
next: "다음",
clear: "지우기",
copy: "복사",
copied: "복사되었습니다!",
noResults: "결과를 찾을 수 없습니다",
showLess: "접기",
showMore: "{count}개 더 보기",
experimental: "실험적",
enabled: "활성화됨",
disabled: "비활성화됨",
rename: "이름 변경",
edit: "편집",
actions: "작업",
create: "생성",
or: "또는",
goHome: "홈으로",
somethingWentWrong: "문제가 발생했습니다",
unexpectedError: "예기치 않은 오류가 발생했습니다.",
retry: "재시도",
privacyPolicy: "개인정보 처리방침",
},
categories: {
essentials: "기본 도구",
optimization: "최적화",
adjustments: "조정",
watermark: "워터마크 및 오버레이",
utilities: "유틸리티",
layout: "레이아웃 및 구도",
format: "포맷 및 변환",
ai: "AI 도구",
},
tools: {
resize: {
name: "리사이즈",
description: "픽셀, 퍼센트 또는 소셜 미디어 프리셋으로 리사이즈",
},
crop: { name: "크롭", description: "자유 크롭, 비율 프리셋, 도형 크롭" },
rotate: { name: "회전 및 뒤집기", description: "이미지 회전, 뒤집기 및 기울기 보정" },
convert: { name: "변환", description: "이미지 포맷 간 변환" },
compress: { name: "압축", description: "품질 또는 목표 크기로 파일 크기 축소" },
"optimize-for-web": {
name: "웹 최적화",
description: "포맷 변환, 품질 조절, 실시간 미리보기로 웹용 이미지 최적화",
},
"strip-metadata": {
name: "메타데이터 제거",
description: "EXIF, GPS 및 카메라 정보 제거",
},
"edit-metadata": {
name: "메타데이터 편집",
description: "EXIF, IPTC, XMP, GPS, 키워드 및 날짜 편집",
},
"bulk-rename": { name: "일괄 이름 변경", description: "패턴으로 여러 파일 일괄 이름 변경" },
"image-to-pdf": {
name: "이미지를 PDF로",
description: "여러 이미지를 PDF 문서로 합치기",
},
"pdf-to-image": { name: "PDF를 이미지로", description: "PDF 페이지를 이미지로 변환" },
favicon: {
name: "Favicon 생성기",
description: "모든 Favicon 및 앱 아이콘 크기 생성",
},
"adjust-colors": {
name: "색상 조정",
description: "밝기, 대비, 노출, 채도, 색온도, 선명도 및 효과",
},
sharpening: {
name: "선명하게",
description: "적응형, 언샵 마스크, 하이패스 샤프닝(프리셋 포함)",
},
"replace-color": {
name: "색상 교체 및 반전",
description: "특정 색상 교체 또는 반전",
},
"color-blindness": {
name: "색각 시뮬레이션",
description: "다양한 색각 이상에서 이미지가 어떻게 보이는지 시뮬레이션",
},
"remove-background": {
name: "배경 제거",
description: "AI 기반 배경 제거",
},
upscale: { name: "이미지 업스케일", description: "AI 초해상도 향상" },
"erase-object": { name: "객체 지우기", description: "AI로 원하지 않는 객체 제거" },
ocr: {
name: "OCR / 텍스트 추출",
description: "AI로 이미지에서 높은 정확도로 텍스트 추출",
},
"blur-faces": {
name: "얼굴/개인정보 블러",
description: "얼굴과 민감한 정보를 자동 감지하여 블러 처리",
},
"enhance-faces": {
name: "얼굴 향상",
description: "AI로 얼굴 복원 및 향상",
},
"smart-crop": {
name: "스마트 크롭",
description: "피사체, 얼굴 또는 트림 기반 스마트 크롭",
},
"image-enhancement": {
name: "이미지 향상",
description: "원클릭으로 노출, 대비, 색상, 선명도를 스마트 보정",
},
"noise-removal": {
name: "노이즈 제거",
description: "AI 기반 노이즈 및 입자 제거",
},
"red-eye-removal": {
name: "적목 보정",
description: "AI 기반 플래시 사진의 적목 감지 및 보정",
},
"restore-photo": {
name: "사진 복원",
description: "AI로 오래된 사진의 긁힘, 찢어짐 및 손상 복원",
},
"content-aware-resize": {
name: "콘텐츠 인식 리사이즈",
description: "중요한 콘텐츠를 보호하면서 지능적으로 리사이즈",
},
"ai-canvas-expand": {
name: "AI 캔버스 확장",
description: "AI 채우기로 캔버스 확장",
},
colorize: {
name: "AI 컬러화",
description: "AI 딥러닝 모델로 흑백 사진을 풀 컬러로 변환",
},
"passport-photo": {
name: "증명사진",
description: "얼굴 자동 감지로 정부 규격에 맞는 여권, 비자, 신분증 사진 생성",
},
"transparency-fixer": {
name: "PNG 투명도 수정",
description: "가짜 투명 PNG를 원클릭으로 수정",
},
"watermark-text": { name: "텍스트 워터마크", description: "텍스트 워터마크 오버레이 추가" },
"watermark-image": { name: "이미지 워터마크", description: "로고를 워터마크로 오버레이" },
"text-overlay": { name: "텍스트 오버레이", description: "이미지에 스타일 텍스트 추가" },
compose: { name: "이미지 합성", description: "위치와 불투명도로 이미지를 레이어 합성" },
"meme-generator": {
name: "Meme 생성기",
description:
"인기 템플릿이나 나만의 이미지로 Meme을 만드세요. 클래식 Impact 스타일 텍스트에 글꼴, 색상, 위치를 커스터마이징할 수 있습니다.",
},
info: { name: "이미지 정보", description: "모든 메타데이터와 이미지 속성 보기" },
compare: { name: "이미지 비교", description: "두 이미지를 나란히 비교" },
"find-duplicates": {
name: "중복 찾기",
description: "중복 및 유사 이미지 감지",
},
"color-palette": {
name: "컬러 팔레트",
description: "이미지에서 주요 색상 추출",
},
"qr-generate": {
name: "QR 코드 생성기",
description: "맞춤 색상, 패턴, 로고가 포함된 QR 코드 생성",
},
"barcode-read": {
name: "바코드 리더",
description: "이미지에서 QR 코드, 바코드 및 2D 코드 스캔",
},
collage: {
name: "콜라주 / 그리드",
description: "25가지 이상의 템플릿으로 이미지를 아름다운 그리드 콜라주로 합성",
},
stitch: {
name: "이미지 결합",
description: "이미지를 나란히, 세로로 또는 그리드로 결합",
},
split: {
name: "이미지 분할",
description: "그리드 또는 픽셀 크기로 이미지 분할(실시간 미리보기 지원)",
},
border: {
name: "테두리 및 프레임",
description: "테두리, 패딩, 둥근 모서리, 그림자를 원클릭 프리셋으로 추가",
},
beautify: {
name: "스크린샷 꾸미기",
description: "스크린샷에 그라데이션 배경, 기기 프레임, 그림자, 소셜 미디어 크기 추가",
},
"svg-to-raster": {
name: "SVG를 래스터로",
description: "SVG를 PNG, JPEG, WebP, AVIF, TIFF, GIF, HEIF로 맞춤 스케일 및 DPI로 변환",
},
vectorize: {
name: "이미지를 SVG로",
description: "이미지를 스케일러블 벡터 그래픽으로 변환",
},
"gif-tools": {
name: "GIF 도구",
description: "애니메이션 GIF의 리사이즈, 최적화, 속도 변경, 역재생, 프레임 추출, 회전",
},
"image-to-base64": {
name: "이미지를 Base64로",
description: "이미지를 Base64 문자열로 변환하여 HTML, CSS 등에 임베드",
},
pipeline: { name: "Pipeline 빌더", description: "여러 도구를 워크플로로 연결" },
},
toolSettings: {
compress: {
compressionMode: "압축 모드",
targetSize: "목표 크기",
quality: "품질",
smallestFile: "최소 파일",
bestQuality: "최고 품질",
submit: "압축",
submitBatch: "압축 ({count}개 파일)",
progressLabel: "압축 중",
original: "원본: {size} KB",
processed: "처리 후: {size} KB",
saved: "절감: {percent}%",
},
resize: {
customSize: "맞춤 크기",
scale: "스케일",
presets: "프리셋",
contentAware: "콘텐츠 인식",
widthPx: "너비 (px)",
heightPx: "높이 (px)",
fitMode: "맞춤 모드",
cropToFit: "크롭하여 맞춤",
fitInside: "내부에 맞춤",
stretch: "늘리기",
limitToOriginalSize: "원본 크기로 제한",
limitToOriginalSizeHint: "이미지가 이미 목표보다 작은 경우 확대하지 않고 원본 유지",
scalePercent: "스케일 (%)",
resizeToSquare: "정사각형으로 리사이즈",
protectFaces: "얼굴 보호",
smoothing: "스무딩",
edgeSensitivity: "엣지 감도",
submit: "리사이즈",
submitBatch: "리사이즈 ({count}개 파일)",
progressLabel: "리사이즈 중",
},
crop: {
aspectRatio: "종횡비",
custom: "맞춤",
positionAndSize: "위치 및 크기",
ruleOfThirds: "삼분할법",
leftOffsetPx: "왼쪽 오프셋 (px)",
topOffsetPx: "상단 오프셋 (px)",
submit: "크롭",
submitBatch: "크롭 ({count}개 파일)",
progressLabel: "크롭 중",
},
rotate: {
rotate: "회전",
angle: "각도",
straighten: "기울기 보정",
flip: "뒤집기",
horizontal: "수평",
vertical: "수직",
resetAllChanges: "모든 변경 초기화",
submit: "적용",
submitBatch: "적용 ({count}개 파일)",
progressLabel: "적용 중",
},
convert: {
targetFormat: "대상 포맷",
sourceFormat: "원본 포맷",
quality: "품질",
submit: "변환",
submitBatch: "변환 ({count}개 파일)",
progressLabel: "변환 중",
},
"optimize-for-web": {
outputFormat: "출력 포맷",
quality: "품질",
smallestFile: "최소 파일",
bestQuality: "최고 품질",
maxDimensions: "최대 크기",
maxWidth: "최대 너비",
maxHeight: "최대 높이",
stripMetadata: "메타데이터 제거",
sizeComparison: "크기 비교",
optimized: "최적화 후:",
smaller: "{percent}% 축소",
larger: "{percent}% 증가",
submit: "처리 후 다운로드",
submitBatch: "처리 후 다운로드 ({count}개 파일)",
progressLabel: "최적화 중",
},
"strip-metadata": {
currentMetadata: "현재 메타데이터",
readingMetadata: "메타데이터 읽는 중...",
noMetadataFound: "이 이미지에서 메타데이터를 찾을 수 없습니다.",
removeAllMetadata: "모든 메타데이터 제거",
selectSpecific: "또는 특정 메타데이터 선택:",
stripExif: "EXIF 제거 (카메라 정보, 날짜, 노출)",
stripGps: "GPS 제거 (위치 데이터)",
stripIcc: "ICC 제거 (색상 프로파일)",
stripXmp: "XMP 제거 (확장 메타데이터)",
locationFound: "위치 정보 발견",
locationWarning:
"이 이미지에 정확한 위치 정보가 포함되어 있습니다. 공유 전에 GPS 데이터 제거를 권장합니다.",
metadataSections: "메타데이터 섹션 {count}개 발견",
metadataSectionsPlural: "메타데이터 섹션 {count}개 발견",
metadataRemoved: "제거된 메타데이터: {size} KB",
submit: "메타데이터 제거",
progressLabel: "메타데이터 제거 중",
},
"edit-metadata": {
readingMetadata: "메타데이터 읽는 중...",
couldNotReadMetadata: "메타데이터를 읽을 수 없습니다. 필드가 빈 상태로 시작됩니다.",
basicInfo: "기본 정보",
description: "설명",
artist: "아티스트",
copyright: "저작권",
software: "소프트웨어",
iptc: "IPTC",
title: "제목",
headline: "헤드라인",
city: "도시",
stateProvince: "시/도",
country: "국가",
dateAndTime: "날짜 및 시간",
editDates: "날짜 편집",
shiftAllDates: "모든 날짜 일괄 이동",
dateModified: "수정일",
dateTaken: "촬영일",
shiftHint: "모든 날짜 필드를 오프셋만큼 이동 (시간대 보정에 유용)",
direction: "방향",
forward: "+ 앞으로",
backward: "- 뒤로",
hoursMinutes: "시:분",
locationGps: "위치 (GPS)",
locationDataFound: "위치 데이터 발견",
noGpsData: "GPS 데이터 없음. 아래에서 좌표를 추가하세요.",
latitude: "위도",
longitude: "경도",
altitudeMeters: "고도 (미터)",
removeAllGpsData: "모든 GPS 데이터 제거",
keywords: "키워드",
addKeywordPlaceholder: "키워드를 입력하고 Enter를 누르세요",
addToExisting: "기존에 추가",
replaceAll: "모두 교체",
allMetadata: "모든 메타데이터",
templates: "템플릿",
templateNamePlaceholder: "템플릿 이름",
uploadPrompt: "메타데이터를 편집하려면 이미지를 업로드하세요.",
changes: "{count}개 변경:",
modified: "{count}개 수정됨",
removed: "{count}개 제거됨",
gpsCleared: "GPS 삭제됨",
gpsAdded: "GPS 추가됨",
datesShifted: "날짜 이동됨",
submit: "메타데이터 적용",
progressLabel: "메타데이터 기록 중",
},
"bulk-rename": {
pattern: "패턴",
patternHint: "변수: {{index}}, {{padded}}, {{original}}",
startIndex: "시작 인덱스",
preview: "미리보기",
andMore: "...외 {count}개 더",
renaming: "이름 변경 중...",
submit: "{count}개 파일 이름 변경",
zipDownloaded: "ZIP 다운로드 완료",
},
"image-to-pdf": {
imageCount: "{count}개의 이미지가 {mode}(으)로 변환됩니다",
imageCountPlural: "{count}개의 이미지가 {mode}(으)로 변환됩니다",
singlePdfMode: "단일 PDF, 페이지당 이미지 1개",
separatePdfMode: "개별 PDF, 이미지당 1개",
combineAllImages: "모든 이미지를 하나의 PDF로 합치기",
pageSize: "페이지 크기",
orientation: "방향",
portrait: "세로",
landscape: "가로",
margin: "여백",
targetSizeLabel: "목표 파일 크기 (선택)",
targetSizePlaceholder: "예: 2",
targetSizeHint: "비워두면 최고 품질",
targetSizeMet: "목표 달성",
targetSizeNotMet: "목표에 도달할 수 없습니다. 최저 품질로 압축되었습니다.",
targetSizeTooSmall: "목표는 최소 50KB여야 합니다",
jpegQualityLabel: "사용된 JPEG 품질",
noImage: "이미지 없음",
submitCollate: "PDF 생성 ({count}페이지)",
submitSeparate: "PDF {count}개 생성",
downloadPdf: "PDF 다운로드",
downloadZip: "ZIP 다운로드",
progressLabel: "PDF 생성 중",
uploadingImages: "이미지 업로드 중...",
processingPages: "{count}페이지 처리 중...",
},
"pdf-to-image": {
dropPdf: "여기에 PDF를 놓거나 클릭하여 선택",
readingPdf: "PDF 읽는 중...",
pageCount: "{count}페이지",
pageCountPlural: "{count}페이지",
outputFormat: "출력 포맷",
quality: "품질",
resolutionDpi: "해상도 (DPI)",
dpiScreen: "화면용",
dpiStandard: "표준",
dpiPrint: "인쇄",
dpiHighQuality: "고품질",
colorMode: "색상 모드",
colorModeColor: "컬러",
colorModeGrayscale: "그레이스케일",
colorModeBw: "흑백",
pages: "페이지",
allPages: "모든 페이지",
pagesHint: "예: 1-3, 5, 8-10 (문서 총 {count}페이지)",
converting: "변환 중...",
submit: "{count}페이지 변환",
submitPlural: "{count}페이지 변환",
downloadAllZip: "전체 다운로드 (ZIP)",
},
favicon: {
uploadHint:
"정사각형 이미지(512x512 이상 권장)를 업로드하여 모든 Favicon 및 앱 아이콘 크기를 생성하세요.",
multipleHint: "{count}개의 이미지 각각이 ZIP 내 별도 폴더에 저장됩니다.",
generatedSizes: "생성 크기 (이미지당)",
plusManifest: "+ manifest.json + HTML 스니펫",
submit: "Favicon 생성 ({count}개 이미지)",
submitPlural: "Favicon 생성 ({count}개 이미지)",
downloadZip: "Favicon ZIP 다운로드",
progressLabel: "Favicon 생성 중",
},
"adjust-colors": {
light: "라이트",
brightness: "밝기",
contrast: "대비",
exposure: "노출",
color: "색상",
saturation: "채도",
temperature: "색온도",
temperatureHint: "차가운 / 따뜻한",
tint: "틴트",
tintHint: "녹색 / 자홍",
hue: "색조",
detail: "디테일",
sharpness: "선명도",
effects: "효과",
none: "없음",
grayscale: "그레이스케일",
sepia: "세피아",
invert: "반전",
colorChannels: "색상 채널",
channelModified: "수정됨",
red: "빨강",
green: "초록",
blue: "파랑",
resetAll: "모두 초기화",
submit: "적용",
submitBatch: "적용 ({count}개 파일)",
progressLabel: "색상 조정 중",
},
sharpening: {
method: "방법",
adaptive: "적응형",
unsharpMask: "언샵 마스크",
highPass: "하이패스",
presets: "프리셋",
textureAmount: "텍스처 양",
amount: "양",
strength: "강도",
noiseReduction: "노이즈 감소",
off: "끔",
lightDenoise: "약함",
mediumDenoise: "보통",
strongDenoise: "강함",
advancedControls: "고급 설정",
radius: "반경",
flatProtection: "평탄 영역 보호",
detailThreshold: "디테일 임계값",
haloLimitLight: "할로 제한 (밝은 부분)",
haloLimitDark: "할로 제한 (어두운 부분)",
threshold: "임계값",
kernelSize: "커널 크기",
submit: "선명하게",
submitBatch: "선명하게 ({count}개 파일)",
progressLabel: "샤프닝 중",
},
"replace-color": {
sourceColor: "원본 색상 (교체 대상)",
targetColor: "대상 색상 (교체할 색상)",
makeTransparent: "투명으로 교체",
tolerance: "허용 범위",
exactMatch: "정확히 일치",
wideRange: "넓은 범위",
submit: "색상 교체",
submitBatch: "색상 교체 ({count}개 파일)",
progressLabel: "색상 교체 중",
},
"color-blindness": {
simulationType: "시뮬레이션 유형",
redGreen: "적록 색각 이상",
blueYellow: "청황 색각 이상",
monochromatic: "전색맹",
submit: "시뮬레이션",
submitBatch: "시뮬레이션 ({count}개 파일)",
progressLabel: "색각 시뮬레이션 중",
},
"remove-background": {
subject: "피사체",
people: "인물",
products: "제품",
general: "일반",
passportIdPhoto: "증명사진",
quality: "품질",
fast: "빠름",
hd: "HD",
max: "최고",
ultra: "울트라",
background: "배경",
transparent: "투명",
bgColor: "색상",
gradient: "그라데이션",
image: "이미지",
gradientDirection: "방향",
chooseBackgroundImage: "배경 이미지 선택",
effectsSection: "효과",
effectsActive: "활성",
blurBackground: "배경 블러",
intensity: "강도",
addShadow: "그림자 추가",
opacity: "불투명도",
rendering: "렌더링 중...",
submit: "배경 제거",
submitBatch: "배경 제거 ({count}개 파일)",
progressLabel: "배경 제거 중",
},
upscale: {
scaleFactor: "확대 배율",
quality: "품질",
enhanceFaces: "얼굴 향상",
noiseReduction: "노이즈 감소",
noiseReductionHint:
"입자와 노이즈를 스무딩합니다. 값이 높을수록 노이즈 제거가 강하지만 디테일이 부드러워질 수 있습니다.",
outputFormat: "출력 포맷",
submit: "{scale}배 확대",
submitBatch: "{scale}배 확대 ({count}개 파일)",
progressLabel: "이미지 업스케일 중",
progressLabelBatch: "{count}개 이미지 업스케일 중",
},
"erase-object": {
brushSize: "브러시 크기",
fine: "가늘게",
wide: "굵게",
undo: "실행 취소",
clear: "지우기",
outputFormat: "출력 포맷",
quality: "품질",
paintHint: "제거할 객체 위를 칠하세요. Ctrl+Z로 실행 취소할 수 있습니다.",
submit: "객체 지우기",
submitBatch: "모두 지우기 ({count})",
progressLabel: "객체 지우는 중",
},
ocr: {
quality: "품질",
enhanceBeforeScanning: "스캔 전 향상",
enhanceHint:
"스캔 전에 자동으로 기울기 보정, 대비 향상, 노이즈 제거, 업스케일을 수행하여 인식 정확도를 높입니다.",
language: "언어",
autoDetect: "자동 감지",
extractedText: "추출된 텍스트",
noTextDetected: "이 이미지에서 텍스트가 감지되지 않았습니다",
characters: "{count}자",
submit: "텍스트 추출",
submitBatch: "텍스트 추출 ({count}개 파일)",
progressLabel: "텍스트 추출 중",
},
"blur-faces": {
blurRadius: "블러 반경",
blurLight: "약하게",
blurHeavy: "강하게",
detectionSensitivity: "감지 감도",
moreFaces: "더 많은 얼굴",
fewerFaces: "더 적은 얼굴",
submit: "얼굴 블러",
progressLabel: "얼굴 블러 중",
},
"enhance-faces": {
quality: "품질",
enhancementStrength: "향상 강도",
onlyCenterFace: "중앙 얼굴만",
detectionSensitivity: "감지 감도",
submit: "얼굴 향상",
submitBatch: "얼굴 향상 ({count}개 파일)",
progressLabel: "얼굴 향상 중",
},
"smart-crop": {
subjectFocus: "피사체 포커스",
faceFocus: "얼굴 포커스",
autoTrim: "자동 트림",
customSize: "맞춤 크기",
socialPresets: "소셜 미디어 프리셋",
detectionStrategy: "감지 전략",
detectionStrategyHint:
"어텐션은 시각적으로 가장 두드러진 영역을 찾습니다. 엔트로피는 디테일과 정보가 가장 풍부한 영역을 찾습니다.",
attention: "어텐션",
entropy: "엔트로피",
padding: "패딩",
paddingHint: "포커스 영역 주변 여분의 공간",
outputQuality: "출력 품질",
outputQualityHint: "JPEG 및 WebP 출력용. PNG는 항상 무손실입니다.",
subjectDescription: "현저성 분석으로 가장 흥미로운 영역을 감지하고 목표 크기로 크롭합니다.",
framing: "프레이밍",
facePadding: "얼굴 여백",
facePaddingHint: "감지된 얼굴 주변의 여분의 공간",
fewerFalsePositives: "오탐지 줄이기",
faceDescription:
"AI 얼굴 감지로 얼굴을 적절하게 프레이밍합니다. 얼굴이 감지되지 않으면 피사체 포커스로 전환됩니다.",
trimTolerance: "허용치",
trimDescription:
"테두리 픽셀이 엣지 색상과 얼마나 다를 수 있는지. 값이 높을수록 더 적극적으로 트림합니다.",
padToSquare: "정사각형으로 패딩",
targetSizePx: "목표 크기 (px)",
padColor: "패딩 색상",
trimHint:
"피사체 주변의 단색 테두리를 제거합니다. '정사각형으로 패딩'을 활성화하면 전자상거래용 이미지에 적합합니다.",
submitSubject: "스마트 크롭",
submitFace: "얼굴 크롭",
submitTrim: "테두리 트림",
},
imageEnhancement: {
enhancementMode: "향상 모드",
auto: "자동",
portrait: "인물",
landscape: "풍경",
lowLight: "저조도",
food: "음식",
document: "문서",
intensity: "강도",
deepEnhance: "딥 향상 (AI)",
deepEnhanceDescription: "AI로 노이즈 및 아티팩트 제거",
deepEnhanceRequires: "업스케일 및 향상 번들 필요",
analyzingImage: "이미지 분석 중...",
detectedIssues: "감지된 문제",
imageLooksGood: "이미지가 좋아 보입니다. 강도 슬라이더로 미세 조정하세요.",
issueUnderexposed: "노출 부족",
issueOverexposed: "과다 노출",
issueLowContrast: "낮은 대비",
issueColorCast: "색상 편향",
issueDesaturated: "채도 부족",
issueSoftFocus: "소프트 포커스",
issueNoisy: "노이즈 많음",
submit: "향상",
submitDeep: "딥 향상",
submitBatch: "향상 ({count}개 파일)",
submitDeepBatch: "딥 향상 ({count}개 파일)",
progressLabel: "이미지 향상 중",
progressLabelBatch: "{count}개 이미지 향상 중",
},
"noise-removal": {
denoisingTier: "노이즈 제거 레벨",
quick: "빠름",
balanced: "균형",
quality: "고품질",
maximum: "최고",
quickDesc: "빠르고 가벼운",
balancedDesc: "좋은 품질, 적당한 속도",
qualityDesc: "AI 기반, 느림",
maximumDesc: "최고의 AI 모델, 가장 느림",
strength: "강도",
subtle: "약하게",
aggressive: "강하게",
detailPreservation: "디테일 보존",
smooth: "부드럽게",
sharp: "선명하게",
colorNoise: "컬러 노이즈",
heavy: "강함",
outputFormat: "출력 포맷",
gifAiWarning:
"GIF 파일의 AI 노이즈 제거는 첫 번째 프레임만 처리합니다. 애니메이션 GIF에는 빠름 또는 균형 레벨을 사용하세요.",
submit: "노이즈 제거",
submitBatch: "노이즈 제거 ({count}개 파일)",
progressLabel: "노이즈 제거 중",
progressLabelBatch: "{count}개 이미지 노이즈 제거 중",
},
"red-eye-removal": {
sensitivity: "감도",
strict: "엄격",
aggressive: "적극적",
correctionStrength: "보정 강도",
subtle: "약하게",
dark: "어둡게",
outputFormat: "출력 포맷",
quality: "품질",
submit: "적목 보정",
submitBatch: "적목 보정 ({count}개 파일)",
progressLabel: "적목 보정 중",
progressLabelBatch: "{count}개 이미지 적목 보정 중",
},
"restore-photo": {
scratchRemoval: "긁힘 복원",
scratchRemovalDesc: "긁힘, 찢어짐, 얼룩 감지 및 복원",
faceEnhancement: "얼굴 향상",
faceEnhancementDesc: "CodeFormer AI로 열화된 얼굴 복원",
faceFidelity: "얼굴 충실도",
enhanced: "향상",
faithful: "충실",
noiseReduction: "노이즈 감소",
noiseReductionDesc: "오래된 사진의 입자 및 노이즈 제거",
denoiseStrength: "노이즈 제거 강도",
autoColorize: "자동 컬러화",
autoColorizeDesc: "DDColor AI로 흑백 사진 컬러화",
colorizeStrength: "컬러화 강도",
vivid: "선명하게",
submit: "사진 복원",
submitBatch: "사진 복원 ({count})",
progressLabel: "사진 복원 중",
progressLabelBatch: "{count}개 사진 복원 중",
},
"content-aware-resize": {
widthPx: "너비 (px)",
heightPx: "높이 (px)",
resizeToSquare: "정사각형으로 리사이즈",
protectFaces: "얼굴 보호",
protectFacesHint: "얼굴 감지를 사용하여 얼굴 영역을 감지하고 심 제거로부터 보호",
smoothing: "스무딩",
edgeSensitivity: "엣지 감도",
submit: "리사이즈",
submitBatch: "리사이즈 ({count}개 파일)",
progressLabel: "콘텐츠 인식 리사이즈 중",
},
"ai-canvas-expand": {
quality: "품질",
fast: "빠름",
balanced: "균형",
highQuality: "고품질",
fastDesc: "빠른 미리보기, 적은 AI 처리",
balancedDesc: "좋은 품질, 적당한 속도",
highQualityDesc: "최고의 결과, 느림",
extendToAspectRatio: "종횡비로 확장",
extendByPixels: "확장 픽셀 수",
top: "위",
right: "오른쪽",
bottom: "아래",
left: "왼쪽",
newSize: "새 크기: {width} x {height}",
submit: "캔버스 확장",
submitBatch: "확장 ({count}개 파일)",
progressLabel: "캔버스 확장 중",
},
colorize: {
aiModel: "AI 모델",
fast: "빠름",
fastDesc: "빠른 결과",
balanced: "균형",
balancedDesc: "최선의 사용 가능 모델",
best: "최고",
bestDesc: "최고 품질",
colorIntensity: "색상 강도",
grayscaleLabel: "그레이스케일",
subtleLabel: "은은하게",
naturalLabel: "자연스럽게",
vividLabel: "선명하게",
intensityHint: "낮은 값일수록 더 차분한 빈티지 스타일 색상을 생성합니다.",
strength: "컬러화 강도",
submit: "컬러화",
submitBatch: "컬러화 ({count}개 파일)",
progressLabel: "컬러화 중",
progressLabelBatch: "{count}개 이미지 컬러화 중",
},
"passport-photo": {
country: "국가",
searchCountries: "국가 검색...",
noCountriesFound: "국가를 찾을 수 없습니다",
customDimensions: "맞춤 크기",
documentType: "문서 유형",
dimensionsMm: "크기 (mm)",
dpi: "DPI",
pixelsPerInch: "인치당 픽셀",
backgroundColor: "배경색",
maxFileSize: "최대 파일 크기",
noLimit: "제한 없음",
customKb: "맞춤 KB...",
uploadPortrait: "초상 사진 업로드",
uploadHint: "왼쪽 패널에 이미지를 드롭하거나 업로드하여 증명사진을 미리보기",
analyzingPhoto: "사진 분석 중",
detectingLandmarks: "얼굴 특징 감지 및 배경 제거 중...",
generatePassportPhoto: "증명사진 생성",
generating: "생성 중...",
downloadPhoto: "사진 다운로드",
faceCentered: "얼굴 중앙 배치",
headLevel: "머리 수평",
lookingStraight: "정면 응시",
faceSize: "얼굴 크기",
whatYouSee: "보이는 그대로 다운로드됩니다",
dragToAdjust: "드래그하여 조정",
scrollToZoom: "스크롤하여 확대/축소",
photoGenerated: "사진이 생성되었습니다. 왼쪽 패널에서 다운로드하세요.",
},
"transparency-fixer": {
description: "가짜 투명 배경의 PNG를 업로드하면 원클릭으로 수정해 드립니다.",
removeWatermark: "워터마크 제거",
removeWatermarkHelp: "반투명 워터마크 감지 및 제거",
requiresEraser: "객체 지우기 번들 필요",
advanced: "고급",
defringe: "디프린지",
outputFormat: "출력 포맷",
submit: "투명도 수정",
submitBatch: "투명도 수정 ({count}개 파일)",
progressLabel: "투명도 수정 중",
},
"watermark-text": {
watermarkText: "워터마크 텍스트",
fontSize: "글꼴 크기",
color: "색상",
opacity: "불투명도",
position: "위치",
rotation: "회전",
center: "중앙",
topLeft: "왼쪽 상단",
topRight: "오른쪽 상단",
bottomLeft: "왼쪽 하단",
bottomRight: "오른쪽 하단",
tiled: "타일",
submit: "워터마크 추가",
submitBatch: "워터마크 추가 ({count}개 파일)",
progressLabel: "워터마크 추가 중",
},
"watermark-image": {
uploadWatermark: "워터마크 이미지 업로드",
position: "위치",
opacity: "불투명도",
scale: "스케일",
submit: "워터마크 적용",
submitBatch: "워터마크 적용 ({count}개 파일)",
},
"text-overlay": {
text: "텍스트",
fontSize: "글꼴 크기",
color: "색상",
position: "위치",
top: "위",
center: "중앙",
bottom: "아래",
backgroundBox: "배경 박스",
backgroundColor: "배경색",
shadow: "그림자",
submit: "텍스트 추가",
submitBatch: "텍스트 추가 ({count}개 파일)",
progressLabel: "텍스트 오버레이 추가 중",
},
compose: {
uploadOverlay: "오버레이 이미지 업로드",
xPosition: "X 위치",
yPosition: "Y 위치",
opacity: "불투명도",
blendMode: "블렌드 모드",
submit: "합성",
},
"meme-generator": {
selectTemplate: "갤러리에서 템플릿을 선택하거나 나만의 이미지를 업로드하여 시작하세요.",
chooseLayout: "커스텀 이미지의 텍스트 레이아웃을 선택하세요.",
textContent: "텍스트 내용",
textStyle: "텍스트 스타일",
font: "글꼴",
fontSize: "글꼴 크기",
textColor: "텍스트 색상",
strokeColor: "외곽선 색상",
allCaps: "전체 대문자",
generate: "Meme 생성",
generating: "생성 중...",
downloadMeme: "Meme 다운로드",
backToGallery: "갤러리로 돌아가기",
},
info: {
loadingInfo: "정보 로딩 중...",
filename: "파일명",
fileSize: "파일 크기",
dimensions: "크기",
format: "포맷",
channels: "채널",
colorSpace: "색상 공간",
density: "밀도",
bitDepth: "비트 심도",
progressive: "프로그레시브",
pages: "페이지 수",
hasAlpha: "Alpha 채널",
hasProfile: "프로파일",
hasExif: "EXIF",
hasIcc: "ICC",
hasXmp: "XMP",
},
compare: {
uploadSecondImage: "두 번째 이미지 업로드",
similarity: "유사도: {percent}%",
submit: "비교",
downloadDiff: "차이 이미지 다운로드",
},
"find-duplicates": {
preset: "프리셋",
exact: "정확히 일치",
similar: "유사",
loose: "느슨하게",
exactDesc: "픽셀 단위로 동일한 복사본, 다른 포맷의 같은 이미지.",
similarDesc: "리사이즈, 재압축 또는 가볍게 편집된 복사본.",
looseDesc: "시각적으로 관련된 이미지, 가벼운 크롭, 다른 노출.",
threshold: "임계값",
submit: "중복 스캔",
scanning: "스캔 중...",
},
"color-palette": {
submit: "팔레트 추출",
extracting: "추출 중...",
dominantColors: "주요 색상",
clickToCopy: "클릭하여 복사",
},
"qr-generate": {
contentType: "콘텐츠 유형",
url: "URL",
text: "텍스트",
wifi: "WiFi",
vcard: "vCard",
email: "이메일",
phone: "전화",
sms: "SMS",
styling: "스타일링",
dotStyle: "도트 스타일",
cornerSquareStyle: "코너 사각 스타일",
cornerDotStyle: "코너 도트 스타일",
foregroundColor: "전경색",
bgColor: "배경색",
logo: "로고",
downloadFormat: "다운로드 포맷",
submit: "QR 코드 생성",
download: "QR 코드 다운로드",
},
"barcode-read": {
submit: "바코드 스캔",
submitBatch: "스캔 ({count}개 파일)",
scanning: "스캔 중...",
noBarcodesFound: "바코드를 찾을 수 없습니다",
barcodesFound: "바코드 {count}개 발견",
barcodesFoundPlural: "바코드 {count}개 발견",
},
collage: {
template: "템플릿",
aspectRatio: "종횡비",
gap: "간격",
cornerRadius: "모서리 반경",
backgroundColor: "배경색",
outputFormat: "출력 포맷",
quality: "품질",
submit: "콜라주 만들기",
downloadCollage: "콜라주 다운로드",
},
stitch: {
direction: "방향",
horizontal: "가로",
vertical: "세로",
grid: "그리드",
gridColumns: "그리드 열 수",
resizeMode: "리사이즈 모드",
fit: "맞춤",
original: "원본",
stretchMode: "늘리기",
cropMode: "크롭",
alignment: "정렬",
start: "시작",
center: "중앙",
end: "끝",
gap: "간격",
border: "테두리",
cornerRadius: "모서리 반경",
backgroundColor: "배경색",
outputFormat: "출력 포맷",
quality: "품질",
submit: "이미지 결합",
},
split: {
modeGrid: "그리드",
modeTileSize: "타일 크기",
presets: "프리셋",
columns: "열 수",
rows: "행 수",
tileWidth: "타일 너비",
tileHeight: "타일 높이",
outputFormat: "출력 포맷",
quality: "품질",
submit: "이미지 분할",
downloadAll: "전체 다운로드 (ZIP)",
},
border: {
presets: "프리셋",
borderWidth: "테두리 너비",
borderColor: "테두리 색상",
padding: "패딩",
paddingColor: "패딩 색상",
cornerRadius: "모서리 반경",
shadow: "그림자",
shadowBlur: "그림자 블러",
shadowOffsetX: "그림자 오프셋 X",
shadowOffsetY: "그림자 오프셋 Y",
shadowColor: "그림자 색상",
shadowOpacity: "그림자 불투명도",
submit: "테두리 추가",
submitBatch: "테두리 추가 ({count}개 파일)",
progressLabel: "테두리 추가 중",
},
beautify: {
preset: "프리셋",
backgroundType: "배경 유형",
solidColor: "단색",
linearGradient: "선형 그라데이션",
radialGradient: "방사형 그라데이션",
customImage: "커스텀 이미지",
gradientAngle: "그라데이션 각도",
padding: "패딩",
borderRadius: "모서리 반경",
shadowPreset: "그림자 프리셋",
deviceFrame: "디바이스 프레임",
submit: "꾸미기",
submitBatch: "꾸미기 ({count}개 파일)",
progressLabel: "스크린샷 꾸미는 중",
},
"svg-to-raster": {
outputFormat: "출력 포맷",
sizing: "크기 설정",
scaleMode: "스케일",
customMode: "맞춤",
scalePresets: "스케일 프리셋",
dpiPresets: "DPI 프리셋",
customWidth: "너비 (px)",
customHeight: "높이 (px)",
background: "배경",
bgTransparent: "투명",
bgColor: "색상",
quality: "품질",
submit: "SVG 변환",
submitBatch: "변환 ({count}개 파일)",
progressLabel: "SVG 변환 중",
},
vectorize: {
preset: "프리셋",
logo: "로고",
illustration: "일러스트",
photo: "사진",
sketch: "스케치",
customPreset: "맞춤",
colorMode: "색상 모드",
bw: "흑백",
colorModeColor: "컬러",
threshold: "임계값",
colorPrecision: "색상 정밀도",
layerDifference: "레이어 차이",
filterSpeckle: "스펙클 필터",
pathMode: "패스 모드",
cornerThreshold: "코너 임계값",
invertColors: "색상 반전",
submit: "벡터화",
submitBatch: "벡터화 ({count}개 파일)",
progressLabel: "벡터화 중",
},
"gif-tools": {
mode: "모드",
resize: "리사이즈",
optimize: "최적화",
speed: "속도",
reverse: "역재생",
extract: "추출",
rotateMode: "회전",
pixel: "픽셀",
percentage: "퍼센트",
colors: "색상 수",
dither: "디더링",
effort: "처리 강도",
speedFactor: "속도 배율",
loopControl: "루프 제어",
infinite: "무한",
once: "한 번",
customLoop: "맞춤",
loopCount: "루프 횟수",
extractSingle: "단일",
extractRange: "범위",
extractAll: "전체",
frameNumber: "프레임 번호",
frameStart: "시작 프레임",
frameEnd: "끝 프레임",
extractFormat: "포맷",
submit: "GIF 처리",
submitBatch: "처리 ({count}개 파일)",
progressLabel: "GIF 처리 중",
},
"image-to-base64": {
outputFormat: "출력 포맷",
keepOriginal: "원본 포맷 유지",
quality: "품질",
maxWidth: "최대 너비",
maxHeight: "최대 높이",
submit: "Base64로 변환",
submitBatch: "변환 ({count}개 파일)",
copyBase64: "Base64 복사",
copyDataUri: "Data URI 복사",
copyImgTag: "<img> 태그 복사",
copyCssUrl: "CSS url() 복사",
},
"enhance-faces-standalone": {
model: "모델",
fast: "빠름",
balanced: "균형",
best: "최고",
},
},
urlImport: {
title: "URL에서 가져오기",
placeholder: "이미지 URL을 붙여넣기, 한 줄에 하나씩...",
importButton: "URL 가져오기",
addButton: "{count}개 파일 추가",
adding: "추가 중...",
retryButton: "재시도",
cancelButton: "취소",
readyCount: "{count}개 준비 완료",
failedStatus: "실패",
},
comparison: {
original: "원본",
processed: "처리 후",
before: "이전",
after: "이후",
savings: "절감",
},
toolPage: {
emptyPrompt: "이미지를 드롭하거나 업로드하여 시작하세요",
filesCount: "파일 ({count})",
addMore: "+ 더 추가",
clearAll: "모두 지우기",
acceptDescription: "{exts} 파일만 지원",
notFound: "도구를 찾을 수 없습니다",
configureAndGenerate: "설정을 구성하고 생성하세요.",
processingFailed: "이 파일의 처리에 실패했습니다",
conversionComplete: "변환 완료",
cannotPreviewDownload:
"{type} 파일은 브라우저에서 미리볼 수 없습니다. 다운로드 버튼으로 파일을 저장하세요.",
generatingPreview: "미리보기 생성 중...",
cannotPreviewWillProcess:
"{ext} 파일은 브라우저에서 미리볼 수 없습니다. 도구는 이 파일을 정상적으로 처리합니다.",
previousImage: "이전 이미지",
nextImage: "다음 이미지",
imageCounter: "{current} / {total}",
settingsLabel: "설정",
downloadAllZip: "전체 다운로드 (ZIP)",
hideSettings: "설정 숨기기",
imageArea: "이미지 영역",
},
homePage: {
generatingPreview: "미리보기 생성 중...",
loadingPreview: "미리보기 로딩 중...",
changeFile: "파일 변경",
quickActions: "빠른 실행",
allTools: "모든 도구",
},
fullscreenGrid: {
searchPlaceholder: "도구 검색...",
hideDetails: "세부사항 숨기기",
showDetails: "세부사항 보기",
switchToSidebar: "사이드바 뷰로 전환",
sidebarButton: "사이드바",
noToolsFound: "도구를 찾을 수 없습니다",
tryDifferent: "다른 검색어를 시도해 보세요",
},
editor: {
menu: {
file: {
label: "파일",
new: "새로 만들기",
open: "열기",
save: "저장",
exportAs: "내보내기...",
quickExportPng: "PNG로 빠른 내보내기",
close: "닫기",
},
edit: {
label: "편집",
undo: "실행 취소",
redo: "다시 실행",
cut: "잘라내기",
copy: "복사",
copyMerged: "병합 복사",
paste: "붙여넣기",
pasteInPlace: "같은 위치에 붙여넣기",
delete: "삭제",
freeTransform: "자유 변형",
transform: {
label: "변형",
scale: "크기 조절",
rotate: "회전",
skew: "기울이기",
flipHorizontal: "수평 뒤집기",
flipVertical: "수직 뒤집기",
},
},
image: {
label: "이미지",
imageSize: "이미지 크기...",
canvasSize: "캔버스 크기...",
rotation: {
label: "이미지 회전",
cw90: "시계 방향 90도",
ccw90: "반시계 방향 90도",
r180: "180도",
flipHorizontal: "수평 뒤집기",
flipVertical: "수직 뒤집기",
},
trim: "트림",
adjustments: {
label: "조정",
brightnessContrast: "밝기/대비",
hueSaturation: "색조/채도",
colorBalance: "색상 균형",
levels: "레벨",
curves: "곡선",
},
},
layer: {
label: "레이어",
newLayer: "새 레이어",
duplicateLayer: "레이어 복제",
deleteLayer: "레이어 삭제",
arrange: {
label: "정렬",
bringToFront: "맨 앞으로",
bringForward: "앞으로",
sendBackward: "뒤로",
sendToBack: "맨 뒤로",
},
mergeDown: "아래 레이어와 병합",
flattenImage: "이미지 병합",
},
select: {
label: "선택",
all: "모두 선택",
deselect: "선택 해제",
inverse: "선택 반전",
colorRange: "색상 범위...",
},
filter: {
label: "필터",
blur: {
label: "블러",
gaussian: "가우시안 블러",
motion: "모션 블러",
radial: "방사형 블러",
surface: "표면 블러",
},
sharpen: {
label: "선명하게",
sharpen: "선명하게",
unsharpMask: "언샵 마스크",
},
noise: {
label: "노이즈",
addNoise: "노이즈 추가",
reduceNoise: "노이즈 감소",
},
pixelate: {
label: "픽셀화",
pixelate: "픽셀화",
mosaic: "모자이크",
},
stylize: {
label: "스타일화",
emboss: "엠보스",
solarize: "솔라리제이션",
posterize: "포스터화",
},
grayscale: "그레이스케일",
sepia: "세피아",
invert: "반전",
},
view: {
label: "보기",
zoomIn: "확대",
zoomOut: "축소",
fitOnScreen: "화면에 맞추기",
actualPixels: "실제 크기",
rulers: "눈금자",
grid: "그리드",
guides: "안내선",
snap: "스냅",
panels: "패널",
},
},
menuBar: {
backTitle: "SnapOtter로 돌아가기",
},
welcome: {
ariaLabel: "이미지 드롭 영역",
heading: "이미지 에디터",
dropDescription: "여기에 이미지를 드롭하여 시작하세요",
openImageButton: "이미지 열기",
newDocumentButton: "새 문서",
pasteHint: "또는 클립보드에서 붙여넣기 (Ctrl+V)",
},
mobile: {
heading: "데스크톱 환경 권장",
description:
"이미지 에디터는 데스크톱 화면에서 최적으로 동작합니다. 전체 편집 경험을 위해 더 큰 디스플레이의 기기를 사용해 주세요.",
},
errors: {
serverDecodeFailed: "서버 디코딩 실패",
},
},
settings: {
heading: "설정",
nav: {
general: "일반",
systemSettings: "시스템 설정",
security: "보안",
people: "멤버",
teams: "팀",
roles: "역할",
auditLog: "감사 로그",
apiKeys: "API 키",
aiFeatures: "AI 기능",
tools: "도구",
productAnalytics: "제품 분석",
about: "정보",
},
general: {
heading: "일반",
description: "사용자 환경설정 및 표시 설정.",
loading: "로딩 중...",
logOut: "로그아웃",
defaultToolViewLabel: "기본 도구 뷰",
defaultToolViewDescription: "홈페이지에서 도구가 표시되는 방식",
sidebarOption: "사이드바",
fullscreenGridOption: "전체화면 그리드",
appVersionLabel: "앱 버전",
appVersionDescription: "SnapOtter 현재 버전",
saveButton: "설정 저장",
saveSuccess: "설정이 저장되었습니다.",
saveFailed: "설정 저장에 실패했습니다.",
},
system: {
heading: "시스템 설정",
description: "서버 측 구성 및 제한.",
fileUploadLimitLabel: "파일 업로드 제한 (MB)",
fileUploadLimitDescription: "업로드당 최대 파일 크기",
defaultThemeLabel: "기본 테마",
defaultThemeDescription: "새 세션에 적용되는 테마",
lightOption: "라이트",
darkOption: "다크",
systemOption: "시스템 설정에 따름",
languageLabel: "언어",
languageDescription: "인터페이스 언어",
loginAttemptLimitLabel: "로그인 시도 제한",
loginAttemptLimitDescription: "잠금 전 분당 최대 로그인 실패 횟수",
fileManagementHeading: "파일 관리",
maxFileAgeLabel: "최대 파일 보관 시간 (시간)",
maxFileAgeDescription: "처리된 파일이 자동 정리 전까지 보관되는 시간",
startupCleanupLabel: "시작 시 정리",
startupCleanupDescription: "서버 시작 시 오래된 임시 파일 정리",
saveButton: "설정 저장",
saveSuccess: "설정이 저장되었습니다.",
saveFailed: "설정 저장에 실패했습니다.",
limitsAndResources: "제한 및 리소스",
maxFileSize: "최대 파일 크기",
maxBatchSize: "최대 배치 크기",
concurrentJobs: "동시 작업 수",
workerThreads: "워커 스레드 수",
maxPipelineSteps: "최대 Pipeline 단계 수",
processingTimeout: "처리 타임아웃",
rateLimitPerMin: "요청 제한 (요청/분)",
unlimited: "무제한",
auto: "자동",
envOverride: "환경 변수로 설정됨",
maxCanvasPixels: "최대 캔버스 픽셀",
maxSvgSize: "최대 SVG 크기",
maxSplitGrid: "최대 분할 그리드",
maxPdfPages: "최대 PDF 페이지 수",
sessionDuration: "세션 기간",
},
security: {
heading: "보안",
description: "비밀번호 및 인증 설정.",
changePasswordHeading: "비밀번호 변경",
currentPasswordPlaceholder: "현재 비밀번호",
newPasswordPlaceholder: "새 비밀번호",
confirmPasswordPlaceholder: "새 비밀번호 확인",
passwordsMismatch: "비밀번호가 일치하지 않습니다",
passwordTooShort: "비밀번호는 4자 이상이어야 합니다",
changeSuccess: "비밀번호가 변경되었습니다",
changeFailed: "비밀번호 변경에 실패했습니다",
currentPasswordIncorrect: "현재 비밀번호가 올바르지 않습니다",
changePasswordButton: "비밀번호 변경",
loginAttemptLimitNote: "로그인 시도 제한은 시스템 설정에서 구성할 수 있습니다.",
},
people: {
heading: "멤버",
description: "워크스페이스 멤버 및 권한 관리",
userCount: "사용자 {count}명",
userCountPlural: "사용자 {count}명",
searchPlaceholder: "멤버 검색...",
addMembersButton: "멤버 추가",
newMemberHeading: "새 멤버",
usernamePlaceholder: "사용자명",
passwordPlaceholder: "비밀번호",
roleUserOption: "사용자",
roleEditorOption: "편집자",
roleAdminOption: "관리자",
roleUserDescription: "기본 도구 접근",
roleEditorDescription: "모든 파일 및 Pipeline",
roleAdminDescription: "전체 접근",
noDescription: "설명 없음",
defaultTeamOption: "기본",
createButton: "생성",
cancelButton: "취소",
createSuccess: "사용자가 생성되었습니다",
createFailed: "사용자 생성에 실패했습니다",
userLimitReached: "사용자 한도에 도달했습니다 (최대 {max}명)",
deleteConfirm: '사용자 "{username}"을(를) 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.',
deleteSuccess: '사용자 "{username}"이(가) 삭제되었습니다',
deleteFailed: "사용자 삭제에 실패했습니다",
editHeading: "{username} 편집",
updateSuccess: "사용자가 업데이트되었습니다",
updateFailed: "사용자 업데이트에 실패했습니다",
cannotRemoveOwnAdmin: "자신의 관리자 역할은 제거할 수 없습니다",
resetPasswordHeading: "{username}의 비밀번호 재설정",
newPasswordLabel: "새 비밀번호 (8자 이상)",
resetPasswordButton: "비밀번호 재설정",
resetPasswordWarning: "이 사용자의 모든 세션과 API 키가 무효화됩니다.",
resetSuccess: "비밀번호가 재설정되었습니다",
resetFailed: "비밀번호 재설정에 실패했습니다",
tableHeaderUser: "사용자",
tableHeaderRole: "역할",
tableHeaderTeam: "팀",
noSearchResults: "검색과 일치하는 멤버가 없습니다.",
noUsersFound: "사용자를 찾을 수 없습니다.",
authBadgeLocalOidc: "로컬 + OIDC",
authBadgeOidc: "OIDC",
editRoleTeamAction: "역할/팀 편집",
resetPasswordAction: "비밀번호 재설정",
deleteUserAction: "사용자 삭제",
saveButton: "저장",
},
teams: {
heading: "팀",
description: "멤버를 팀으로 구성하여 효율적으로 관리하세요.",
createButton: "새 팀 만들기",
newTeamHeading: "새 팀",
teamNamePlaceholder: "팀 이름",
createSubmitButton: "생성",
cancelButton: "취소",
createSuccess: "팀이 생성되었습니다",
createFailed: "팀 생성에 실패했습니다",
duplicateTeamError: "같은 이름의 팀이 이미 존재합니다",
renameSuccess: "팀 이름이 변경되었습니다",
renameFailed: "팀 이름 변경에 실패했습니다",
deleteConfirm: '팀 "{name}"을(를) 삭제하시겠습니까? 멤버는 배정 해제됩니다.',
deleteSuccess: '팀 "{name}"이(가) 삭제되었습니다',
deleteFailed: "팀 삭제에 실패했습니다",
cannotDeleteDefault: "기본 팀이나 멤버가 있는 팀은 삭제할 수 없습니다",
tableHeaderTeamName: "팀 이름",
tableHeaderMembers: "멤버",
emptyState: "팀을 찾을 수 없습니다.",
renameSaveButton: "저장",
renameCancelButton: "취소",
renameAction: "이름 변경",
deleteAction: "삭제",
totalMembers: "총 멤버 수",
nameRequired: "팀 이름은 필수입니다",
nameTooLong: "팀 이름은 50자 이내여야 합니다",
duplicateName: "같은 이름의 팀이 이미 존재합니다",
},
roles: {
heading: "역할",
description: "역할과 권한을 관리합니다. 기본 제공 역할은 수정할 수 없습니다.",
createButton: "커스텀 역할 만들기",
newRoleHeading: "새 역할",
roleNamePlaceholder: "역할 이름",
descriptionPlaceholder: "설명 (선택)",
permissionsLabel: "권한",
createSubmitButton: "생성",
cancelButton: "취소",
createSuccess: "역할이 생성되었습니다",
createFailed: "역할 생성에 실패했습니다",
duplicateRoleError: "같은 이름의 역할이 이미 존재합니다",
editHeading: "역할 편집: {name}",
editSaveButton: "저장",
editCancelButton: "취소",
updateSuccess: "역할이 업데이트되었습니다",
updateFailed: "역할 업데이트에 실패했습니다",
deleteConfirm:
'역할 "{name}"을(를) 삭제하시겠습니까? {count}명의 사용자를 재배정해야 합니다.',
deleteConfirmSimple: '역할 "{name}"을(를) 삭제하시겠습니까?',
deleteSuccess: '역할 "{name}"이(가) 삭제되었습니다',
deleteFailed: "역할 삭제에 실패했습니다",
emptyState: "역할을 찾을 수 없습니다.",
builtInBadge: "기본 제공",
userCountBadge: "{count}명",
editRoleTitle: "역할 편집",
deleteRoleTitle: "역할 삭제",
permGroup: {
tools: "도구",
files: "파일",
apiKeys: "API 키",
pipelines: "Pipeline",
settings: "설정",
users: "사용자",
teams: "팀",
system: "시스템",
},
},
auditLog: {
heading: "감사 로그",
allActionsFilter: "모든 작업",
emptyState: "감사 로그 항목이 없습니다.",
tableHeaderTime: "시간",
tableHeaderUser: "사용자",
tableHeaderAction: "작업",
tableHeaderTarget: "대상",
paginationInfo: "{page}/{totalPages}페이지 (총 {total}개 항목)",
previousButton: "이전",
nextButton: "다음",
justNow: "방금",
minutesAgo: "{mins}분 전",
hoursAgo: "{hrs}시간 전",
daysAgo: "{days}일 전",
},
apiKeys: {
heading: "API 키",
description: "SnapOtter에 프로그래밍 방식으로 접근하기 위한 API 키를 관리하세요.",
keyNamePlaceholder: "키 이름 (선택)",
generateButton: "API 키 생성",
removeScopingLabel: "권한 범위 해제",
restrictPermissionsLabel: "권한 제한 (선택)",
expiresLabel: "만료:",
clearButton: "지우기",
copyTitle: "복사",
keyWarning: "이 키를 안전하게 보관하세요. 다시 표시되지 않습니다.",
existingKeysHeading: "기존 키",
createdPrefix: "{date}에 생성됨",
scopedPrefix: "범위:",
expiresPrefix: "{date}에 만료",
deleteKeyTitle: "키 삭제",
deleteConfirm: "이 API 키를 삭제하시겠습니까? 이 키를 사용하는 모든 연동이 중단됩니다.",
emptyState: "아직 API 키가 없습니다. 하나를 생성하여 시작하세요.",
},
tools: {
heading: "도구",
description:
"개별 도구를 활성화하거나 비활성화합니다. 비활성화된 도구는 모든 사용자에게 숨겨집니다.",
restartBanner: "변경 사항을 적용하려면 재시작이 필요합니다.",
searchPlaceholder: "도구 검색...",
noSearchResults: "검색과 일치하는 도구가 없습니다.",
loadFailedError:
"도구 설정 로드에 실패했습니다. 데이터 손실을 방지하기 위해 저장이 비활성화되었습니다.",
saveButton: "도구 설정 저장",
disabledCount: "{count}개 도구 비활성화됨",
},
experimental: {
label: "실험적 도구 활성화",
description: "아직 개발 중인 도구를 표시합니다. 불안정할 수 있습니다.",
},
fileManagement: {
title: "파일 관리",
maxAge: "최대 파일 보관 시간 (시간)",
maxAgeDescription: "처리된 파일이 자동 정리 전까지 보관되는 시간",
startupCleanup: "시작 시 정리",
startupCleanupDescription: "서버 시작 시 오래된 임시 파일 정리",
},
analytics: {
heading: "제품 분석",
description: "익명 사용 데이터를 공유하여 SnapOtter 개선에 도움을 주세요.",
privacyNote: "이미지는 절대 기기 밖으로 나가지 않습니다.",
disabledByAdmin: "서버 관리자가 제품 분석을 비활성화했습니다.",
enabledLabel: "분석 활성화됨",
disabledLabel: "분석 비활성화됨",
learnMore: "자세히 알아보기",
},
aiFeatures: {
title: "AI Features",
description: "Manage AI model bundles for advanced image processing.",
installAll: "Install All",
diskUsage: "Disk usage:",
installed: "Installed",
notInstalled: "Not installed",
queued: "Queued",
install: "Install",
repair: "Repair",
uninstall: "Uninstall",
installing: "Installing...",
},
about: {
heading: "정보",
appName: "SnapOtter",
appDescription:
"셀프 호스팅, 개인정보 우선의 이미지 처리 도구 모음으로 51개의 도구를 제공합니다. 리사이즈, 압축, 변환, 워터마크 추가 등 이미지 워크플로를 클라우드에 데이터를 보내지 않고 자동화할 수 있습니다.",
versionLabel: "버전:",
linksHeading: "링크",
githubLink: "GitHub 저장소",
docsLink: "문서",
apiRefLink: "API 레퍼런스 (Swagger)",
},
},
auth: {
login: "로그인",
logout: "로그아웃",
username: "사용자명",
password: "비밀번호",
loginButton: "로그인",
loggingIn: "로그인 중...",
invalidCredentials: "사용자명 또는 비밀번호가 올바르지 않습니다",
connectionError: "연결 오류",
signInWith: "{provider}(으)로 로그인",
signInWithSso: "SSO로 로그인",
or: "또는",
methodLocal: "로컬",
methodOidc: "OIDC",
methodBoth: "로컬 + OIDC",
oidcAuthFailed: "인증에 실패했습니다. 다시 시도해 주세요.",
oidcProviderUnreachable: "ID 제공자에 연결할 수 없습니다. 나중에 다시 시도해 주세요.",
oidcSessionExpired: "로그인 세션이 만료되었습니다. 다시 시도해 주세요.",
oidcUserNotAuthorized:
"귀하의 계정은 이 애플리케이션에 접근할 권한이 없습니다. 관리자에게 문의하세요.",
oidcUserLimitReached: "사용자 한도에 도달했습니다. 관리자에게 문의하세요.",
oidcGenericError: "인증 오류. 다시 시도해 주세요.",
passwordManagedByProvider: "비밀번호는 ID 제공자에서 관리됩니다.",
enterUsername: "사용자명 입력",
enterPassword: "비밀번호 입력",
heroTitle: "당신의 이미지는, 당신의 것입니다.",
heroSubtitle: "필요한 모든 이미지 도구가 여기에.",
rotatingPhrases: [
"가입도 필요 없고, 계정도 필요 없어요.",
"클라우드 업로드? 절대 없습니다.",
"100% 로컬 처리.",
"무료. 영원히 무료.",
"제한 없음. 숨겨진 상한 없음.",
"완전히 오프라인으로 작동해요.",
"무제한 일괄 처리.",
"51개의 이미지 도구.",
"15개 AI 모델. 당신의 하드웨어에서.",
"Sharp 기반의 초고속 처리.",
"에어갭 환경에서도 사용 가능.",
"Docker 컨테이너 하나면 충분해요.",
"오픈 소스. 언제나.",
"모든 픽셀이 당신의 하드웨어에 머물러요.",
"당신의 서버. 당신의 규칙.",
"docker pull 한 줄이면 배포 끝.",
"셀프 호스팅의 새로운 기준.",
"리사이즈, 압축, 변환. 모두 로컬에서.",
"무료 이미지 에디터. 워터마크 없음.",
"일괄 이미지 처리. 무제한으로.",
"배경 제거도 오프라인으로.",
"셀프 호스팅 Canva 대안.",
"API 키가 필요 없어요.",
"설계 단계부터 GDPR 준수.",
"인터넷 없이도 작동해요.",
],
},
changePassword: {
title: "비밀번호를 변경하세요",
description:
"계속하려면 새 비밀번호를 설정해야 합니다. 8자 이상으로 대문자, 소문자, 숫자를 포함해야 합니다.",
usernameLabel: "사용자명",
currentPasswordLabel: "현재 비밀번호",
currentPasswordPlaceholder: "현재 비밀번호 입력",
newPasswordLabel: "새 비밀번호",
generateButton: "강력한 비밀번호 생성",
newPasswordPlaceholder: "8자 이상",
confirmPasswordLabel: "새 비밀번호 확인",
confirmPasswordPlaceholder: "새 비밀번호 다시 입력",
passwordsMismatch: "비밀번호가 일치하지 않습니다",
failedError: "비밀번호 변경에 실패했습니다",
connectionError: "연결 오류",
changingButton: "변경 중...",
changeButton: "비밀번호 변경",
sidebarTitle: "거의 다 됐어요",
sidebarDescription: "강력한 비밀번호를 설정하여 계정을 보호하면 바로 시작할 수 있습니다.",
},
automate: {
title: "자동화",
invalidPipelineFile: "유효한 SnapOtter Pipeline 파일이 아닙니다",
newerVersion: "이 Pipeline은 더 최신 버전의 SnapOtter에서 생성되었습니다",
missingName: "Pipeline 파일에 이름이 없습니다",
noSteps: "Pipeline 파일에 단계가 없습니다",
importFailed: "가져오기 실패",
couldNotRead: "Pipeline 파일을 읽을 수 없습니다",
fileCount: "{count}개 파일",
fileCountPlural: "{count}개 파일",
importFromLibrary: "라이브러리에서 가져오기",
addButton: "+ 추가",
libraryButton: "라이브러리",
clearButton: "지우기",
processingFailed: "이 파일의 처리에 실패했습니다",
processingMultiple: "{count}개 파일 처리 중...",
processingPipeline: "Pipeline 처리 중...",
processButton: "처리",
processButtonMultiple: "처리 ({count})",
processAllButton: "모두 처리 ({count})",
addTool: "도구 추가",
toolPalette: "도구 팔레트",
clickToAdd: "클릭하여 Pipeline에 추가",
savedLabel: "저장됨",
importButton: "가져오기",
noSavedPipelines: "저장된 Pipeline이 없습니다",
stepCount: "({count}단계)",
stepCountPlural: "({count}단계)",
exportPipeline: "Pipeline 내보내기",
deletePipeline: "Pipeline 삭제",
moreCount: "+{count}개 더",
pipelineBuilder: "Pipeline 빌더",
addToolsPrompt: "팔레트에서 도구를 추가하여 시작하세요",
stepsConfigured: "{count}단계 구성됨",
stepsConfiguredPlural: "{count}단계 구성됨",
noFilesLoaded: "로드된 파일 없음",
downloadZip: "ZIP 다운로드",
saveButton: "저장",
pipelineNamePlaceholder: "Pipeline 이름",
descriptionPlaceholder: "설명",
savingIndicator: "...",
cancelButton: "취소",
preview: "미리보기",
previousImage: "이전 이미지",
nextImage: "다음 이미지",
imageCounter: "{current} / {total}",
imageArea: "이미지 영역",
templateSocialMedia: "소셜 미디어 준비",
templatePrivacyClean: "개인정보 정리",
templateWebOptimization: "웹 최적화",
templateProfilePicture: "프로필 사진",
templateWatermarkBatch: "일괄 워터마크",
createNew: "새 자동화 만들기",
savedAutomations: "저장된 자동화",
templates: "템플릿",
addStep: "단계 추가",
removeStep: "제거",
moveUp: "위로 이동",
moveDown: "아래로 이동",
savePipeline: "Pipeline 저장",
runPipeline: "처리",
pipelineName: "Pipeline 이름",
pipelineDescription: "설명 (선택)",
noStepsPrompt: "단계를 추가하여 자동화를 구성하세요",
step: "단계",
},
nav: {
tools: "도구",
reader: "리더",
automate: "자동화",
editor: "에디터",
files: "파일",
help: "도움말",
settings: "설정",
grid: "그리드",
},
files: {
recentTab: "최근",
uploadTab: "업로드",
fileDetailsAriaLabel: "파일 상세",
fileDetailsHeading: "파일 상세",
},
dropzone: {
unsupportedFileType: "이 도구에서 지원하지 않는 파일 형식입니다",
urlFetchFailed: "URL에서 이미지를 가져올 수 없습니다",
ariaLabel: "파일 드롭 영역",
dropPrompt: "여기에 이미지를 드롭하세요",
browseOrPaste: "아무 곳이나 클릭하여 파일 탐색, 또는 클립보드에서 붙여넣기",
uploadButton: "업로드",
defaultFormats: "PNG, JPG, WebP, HEIC, RAW, PSD 외 65가지 이상의 포맷",
orSeparator: "또는",
urlPlaceholder: "이미지 URL 붙여넣기...",
urlLoadingIndicator: "...",
addUrlButton: "추가",
importMultipleUrls: "여러 URL 가져오기...",
filesSelected: "{count}개 파일 선택됨",
},
reviewPanel: {
processedResultAlt: "처리 결과",
sizeLabel: "크기: {size}",
typeLabel: "유형: {type}",
processedLabel: "처리 시간: {time}",
undoButton: "실행 취소",
downloadButton: "다운로드",
openInEditor: "에디터에서 열기",
reviewHeading: "리뷰",
continueEditing: "편집 계속하기",
},
features: {
notEnabledTitle: "기능이 활성화되지 않았습니다",
notEnabledDescription:
"이 기능이 활성화되지 않았습니다. 관리자에게 설정에서 활성화를 요청하세요.",
requiresDownload: "이 기능은 추가 다운로드가 필요합니다 (약 {size})",
retryButton: "재시도",
queued: "설치 대기 중...",
enableButton: "{name} 활성화",
lessThanMinute: "1분 미만",
oneMinuteLeft: "약 1분",
minutesLeft: "약 {mins}분",
progressMessages: [
"거의 다 됐어요... 아마도...",
"좋은 건 기다림이 필요한 법이에요...",
"라면 끓이는 것보다는 빠를 거예요...",
"당신의 인내심, 정말 대단해요...",
"보이는 것보다 열심히 일하는 중이에요...",
"지금부터가 진짜예요, 믿어 주세요...",
"무대 뒤에서 중요한 작업 중...",
"이게 보인다면, 잘 돌아가고 있는 거예요...",
"대단한 걸 준비하는 중이에요...",
"기다린 보람이 있을 거예요, 약속해요...",
"긴장감도 경험의 일부예요...",
"컴퓨터에 새로운 기술을 가르치는 중...",
"슈퍼파워를 세팅 중이에요...",
"나중에 이미지가 고마워할 거예요...",
"로딩 중... 근데 좀 있어 보이게...",
"커피 한 잔 타기에 딱 좋은 타이밍이에요...",
"로마도 하루 만에 세워지진 않았어요...",
"쉿... 천재가 일하는 중이에요...",
"당신의 사진이 곧 올 결과를 부러워하는 중...",
"드림팀을 구성하는 중이에요...",
"대단한 걸 풀어내는 중...",
"시작할까 말까 고민 중... 농담이에요...",
"반전: 진짜로 뭔가 하고 있는 중이에요...",
"크리에이티브 엔진을 워밍업 중...",
"상상력을 로딩 중...",
"화면보호기 아니에요, 진짜로...",
"위대한 예술에는 설치 시간이 필요해요...",
"미래의 당신이 지금의 당신에게 감사할 거예요...",
"아주 스마트한 파일을 가져오는 중...",
"조금만 기다려 주세요, 좋은 건 아직이에요...",
],
},
help: {
heading: "도움말",
gettingStarted: {
heading: "시작하기",
description:
"사이드바에서 도구를 선택하거나 검색하세요. 페이지에 이미지를 드래그하거나 업로드 영역을 클릭하여 이미지를 업로드하세요. 설정을 조정한 후 결과를 다운로드하세요.",
},
keyboardShortcuts: {
heading: "키보드 단축키",
focusSearchBar: "검색바로 포커스",
goToTools: "도구로 이동",
toggleTheme: "테마 전환",
goToResize: "리사이즈로 이동",
goToCrop: "크롭으로 이동",
goToCompress: "압축으로 이동",
goToConvert: "변환으로 이동",
goToRemoveBackground: "배경 제거로 이동",
goToWatermarkText: "텍스트 워터마크로 이동",
goToStripMetadata: "메타데이터 제거로 이동",
goToImageInfo: "이미지 정보로 이동",
},
resources: {
heading: "리소스",
githubLink: "GitHub 저장소",
reportIssueLink: "문제 보고",
docsLink: "문서",
apiRefLink: "API 레퍼런스 (Swagger)",
},
versionLabel: "SnapOtter v{version}",
},
errors: {
generic: "오류가 발생했습니다",
offline: "오프라인 상태입니다",
reconnecting: "서버에 재연결 중...",
connected: "연결됨",
processingFailed: "이 파일의 처리에 실패했습니다",
timeout: "요청 시간이 초과되었습니다. 서버가 과부하일 수 있습니다. 다시 시도해 주세요.",
networkError: "네트워크 오류. 연결을 확인하세요.",
invalidCredentials: "사용자명 또는 비밀번호가 올바르지 않습니다",
connectionError: "연결 오류",
},
analytics: {
consentTitle: "SnapOtter 개선에 도움을 주세요",
consentDescription:
"익명 사용 데이터는 버그 수정과 정말 필요한 도구 개발에 도움이 됩니다. 이미지와 파일은 항상 사용자의 기기에 머물러요.",
consentChangeable: "설정에서 언제든 끌 수 있어요.",
acceptButton: "네, 좋아요",
declineButton: "지금은 괜찮아요",
settingsTitle: "제품 분석",
settingsDescription: "익명 사용 데이터를 공유하여 SnapOtter 개선에 도움을 주세요.",
settingsPrivacy: "이미지는 절대 기기 밖으로 나가지 않습니다.",
settingsDisabledByAdmin: "서버 관리자가 제품 분석을 비활성화했습니다.",
learnMore: "자세히 알아보기",
},
sidebar: {
tools: "도구",
grid: "그리드",
automate: "자동화",
editor: "에디터",
files: "파일",
help: "도움말",
settings: "설정",
},
toolCard: {
addToFavourites: "즐겨찾기에 추가",
},
appLayout: {
mobileNavTools: "도구",
mobileNavAutomate: "자동화",
mobileNavEditor: "에디터",
mobileNavFiles: "파일",
mobileNavSettings: "설정",
},
} as const;
export default ko;