From 6ceb370abbba51428535b8fcd1031e8696ee7ede Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Sat, 5 Sep 2026 13:26:33 +0200 Subject: [PATCH] Translated using Weblate (Korean) Currently translated at 100.0% (54 of 54 strings) Translated using Weblate (Korean) Currently translated at 100.0% (474 of 474 strings) Translated using Weblate (Korean) Currently translated at 100.0% (141 of 141 strings) Translated using Weblate (Korean) Currently translated at 100.0% (1295 of 1295 strings) Translated using Weblate (Korean) Currently translated at 100.0% (145 of 145 strings) Translated using Weblate (Korean) Currently translated at 100.0% (129 of 129 strings) Translated using Weblate (Korean) Currently translated at 100.0% (60 of 60 strings) Translated using Weblate (Korean) Currently translated at 100.0% (50 of 50 strings) Translated using Weblate (Korean) Currently translated at 100.0% (10 of 10 strings) Translated using Weblate (Korean) Currently translated at 100.0% (86 of 86 strings) Translated using Weblate (Korean) Currently translated at 100.0% (100 of 100 strings) Translated using Weblate (Korean) Currently translated at 100.0% (26 of 26 strings) Translated using Weblate (Korean) Currently translated at 100.0% (108 of 108 strings) Translated using Weblate (Korean) Currently translated at 100.0% (500 of 500 strings) Translated using Weblate (Korean) Currently translated at 100.0% (500 of 500 strings) Translated using Weblate (Korean) Currently translated at 100.0% (60 of 60 strings) Translated using Weblate (Korean) Currently translated at 100.0% (1295 of 1295 strings) Translated using Weblate (Korean) Currently translated at 100.0% (86 of 86 strings) Translated using Weblate (Korean) Currently translated at 100.0% (474 of 474 strings) Translated using Weblate (Korean) Currently translated at 100.0% (240 of 240 strings) Translated using Weblate (Korean) Currently translated at 100.0% (2 of 2 strings) Translated using Weblate (Korean) Currently translated at 100.0% (50 of 50 strings) Translated using Weblate (Korean) Currently translated at 100.0% (500 of 500 strings) Translated using Weblate (Korean) Currently translated at 100.0% (6 of 6 strings) Translated using Weblate (Korean) Currently translated at 100.0% (141 of 141 strings) Translated using Weblate (Korean) Currently translated at 100.0% (23 of 23 strings) Translated using Weblate (Korean) Currently translated at 100.0% (62 of 62 strings) Translated using Weblate (Korean) Currently translated at 100.0% (46 of 46 strings) Translated using Weblate (Korean) Currently translated at 100.0% (10 of 10 strings) Translated using Weblate (Korean) Currently translated at 100.0% (129 of 129 strings) Translated using Weblate (Korean) Currently translated at 100.0% (800 of 800 strings) Translated using Weblate (Korean) Currently translated at 100.0% (185 of 185 strings) Translated using Weblate (Korean) Currently translated at 100.0% (145 of 145 strings) Translated using Weblate (Korean) Currently translated at 100.0% (74 of 74 strings) Translated using Weblate (Korean) Currently translated at 100.0% (100 of 100 strings) Translated using Weblate (Korean) Currently translated at 100.0% (10 of 10 strings) Translated using Weblate (Korean) Currently translated at 100.0% (49 of 49 strings) Translated using Weblate (Korean) Currently translated at 100.0% (54 of 54 strings) Translated using Weblate (Korean) Currently translated at 100.0% (108 of 108 strings) Translated using Weblate (Korean) Currently translated at 100.0% (67 of 67 strings) Translated using Weblate (Korean) Currently translated at 100.0% (25 of 25 strings) Translated using Weblate (Korean) Currently translated at 100.0% (26 of 26 strings) Co-authored-by: Hosted Weblate Co-authored-by: ecomen Co-authored-by: sinfancy Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/audio/ko/ Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/common/ko/ Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-auth/ko/ Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-camera/ko/ Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-dialog/ko/ Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-filter/ko/ Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-icons/ko/ Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-player/ko/ Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-cameras/ko/ Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-global/ko/ Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-groups/ko/ Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-validation/ko/ Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/objects/ko/ Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-chat/ko/ Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-classificationmodel/ko/ Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-configeditor/ko/ Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-events/ko/ Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-explore/ko/ Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-exports/ko/ Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-facelibrary/ko/ Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-live/ko/ Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-motionsearch/ko/ Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-recording/ko/ Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-replay/ko/ Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-search/ko/ Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-settings/ko/ Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-system/ko/ Translation: Frigate NVR/Config - Cameras Translation: Frigate NVR/Config - Global Translation: Frigate NVR/Config - Groups Translation: Frigate NVR/Config - Validation Translation: Frigate NVR/audio Translation: Frigate NVR/common Translation: Frigate NVR/components-auth Translation: Frigate NVR/components-camera Translation: Frigate NVR/components-dialog Translation: Frigate NVR/components-filter Translation: Frigate NVR/components-icons Translation: Frigate NVR/components-player Translation: Frigate NVR/objects Translation: Frigate NVR/views-chat Translation: Frigate NVR/views-classificationmodel Translation: Frigate NVR/views-configeditor Translation: Frigate NVR/views-events Translation: Frigate NVR/views-explore Translation: Frigate NVR/views-exports Translation: Frigate NVR/views-facelibrary Translation: Frigate NVR/views-live Translation: Frigate NVR/views-motionSearch Translation: Frigate NVR/views-recording Translation: Frigate NVR/views-replay Translation: Frigate NVR/views-search Translation: Frigate NVR/views-settings Translation: Frigate NVR/views-system --- web/public/locales/ko/audio.json | 515 +++-- web/public/locales/ko/common.json | 128 +- web/public/locales/ko/components/auth.json | 16 +- web/public/locales/ko/components/camera.json | 55 +- web/public/locales/ko/components/dialog.json | 139 +- web/public/locales/ko/components/filter.json | 119 +- web/public/locales/ko/components/icons.json | 4 +- web/public/locales/ko/components/player.json | 31 +- web/public/locales/ko/config/cameras.json | 919 +++++++- web/public/locales/ko/config/global.json | 1517 ++++++++++++- web/public/locales/ko/config/groups.json | 22 +- web/public/locales/ko/config/validation.json | 39 +- web/public/locales/ko/objects.json | 63 +- web/public/locales/ko/views/chat.json | 73 +- .../locales/ko/views/classificationModel.json | 194 +- web/public/locales/ko/views/configEditor.json | 10 +- web/public/locales/ko/views/events.json | 91 +- web/public/locales/ko/views/explore.json | 248 ++- web/public/locales/ko/views/exports.json | 110 +- web/public/locales/ko/views/faceLibrary.json | 96 +- web/public/locales/ko/views/live.json | 136 +- web/public/locales/ko/views/motionSearch.json | 77 +- web/public/locales/ko/views/recording.json | 6 +- web/public/locales/ko/views/replay.json | 61 +- web/public/locales/ko/views/search.json | 59 +- web/public/locales/ko/views/settings.json | 1881 ++++++++++++++++- web/public/locales/ko/views/system.json | 241 ++- 27 files changed, 6001 insertions(+), 849 deletions(-) diff --git a/web/public/locales/ko/audio.json b/web/public/locales/ko/audio.json index 0a08f16742..5368654505 100644 --- a/web/public/locales/ko/audio.json +++ b/web/public/locales/ko/audio.json @@ -2,16 +2,16 @@ "crying": "울음", "snoring": "코골이", "singing": "노래", - "yell": "비명", + "yell": "고함", "speech": "음성", "babbling": "옹알이", "bicycle": "자전거", "a_capella": "아카펠라", - "accelerating": "가속", + "accelerating": "가속음", "accordion": "아코디언", - "acoustic_guitar": "통기타", - "car": "차량", - "motorcycle": "원동기", + "acoustic_guitar": "어쿠스틱 기타", + "car": "승용차", + "motorcycle": "오토바이", "bus": "버스", "train": "기차", "boat": "보트", @@ -22,26 +22,26 @@ "sheep": "양", "skateboard": "스케이트보드", "door": "문", - "mouse": "마우스", + "mouse": "생쥐", "keyboard": "키보드", "sink": "싱크대", - "blender": "블렌더", + "blender": "믹서기", "clock": "시계", "scissors": "가위", - "hair_dryer": "헤어 드라이어", + "hair_dryer": "헤어드라이어", "toothbrush": "칫솔", - "vehicle": "탈 것", + "vehicle": "탈것", "animal": "동물", "bark": "짖는 소리", "goat": "염소", - "bellow": "포효", - "whoop": "환성", + "bellow": "큰 외침", + "whoop": "환호", "whispering": "속삭임", "laughter": "웃음", - "snicker": "낄낄 웃음", + "snicker": "낄낄거림", "sigh": "한숨", "choir": "합창", - "yodeling": "요들링", + "yodeling": "요들", "chant": "성가", "mantra": "만트라", "child_singing": "어린이 노래", @@ -55,271 +55,271 @@ "wheeze": "헐떡임", "gasp": "헐떡임", "pant": "거친숨", - "snort": "코골이", + "snort": "코웃음", "cough": "기침", - "throat_clearing": "목 긁는 소리", + "throat_clearing": "목 가다듬는 소리", "sneeze": "재채기", - "sniff": "훌쩍", + "sniff": "훌쩍임", "run": "달리기", - "shuffle": "임의 재생", + "shuffle": "발 끄는 소리", "footsteps": "발소리", "chewing": "씹는 소리", - "biting": "치는 소리", - "gargling": "가글", - "stomach_rumble": "배 꼬르륵", + "biting": "깨무는 소리", + "gargling": "가글 소리", + "stomach_rumble": "배 꼬르륵 소리", "burping": "트림", "camera": "카메라", "hiccup": "딸꾹질", "fart": "방귀", - "hands": "손", + "hands": "손 소리", "finger_snapping": "손가락 튕기기", "clapping": "박수", "heartbeat": "심장 박동", "heart_murmur": "심장 잡음", "cheering": "환호", - "applause": "환호", + "applause": "박수갈채", "chatter": "수다", - "crowd": "군중", + "crowd": "군중 소리", "children_playing": "놀고 있는 아이들", "pets": "반려동물", "yip": "깽깽거림", "howl": "하울링", - "bow_wow": "짖는 소리", + "bow_wow": "멍멍", "growling": "으르렁거림", "whimper_dog": "낑낑거림", - "purr": "가르릉거림", + "purr": "골골송", "meow": "야옹", "hiss": "하악질", - "caterwaul": "발정기 울음", + "caterwaul": "발정기 고양이 울음", "livestock": "가축", - "clip_clop": "딸깍딸깍", + "clip_clop": "다각다각 소리", "neigh": "말 울음소리", "cattle": "소", "moo": "음메", "cowbell": "워낭 소리", "pig": "돼지", - "oink": "꿀꿀거림", - "bleat": "메에", - "fowl": "새", + "oink": "꿀꿀", + "bleat": "매애", + "fowl": "조류", "chicken": "닭", - "cluck": "닭 울음소리", - "cock_a_doodle_doo": "꼬꼬댁", + "cluck": "꼬꼬댁", + "cock_a_doodle_doo": "꼬끼오", "turkey": "칠면조", "gobble": "칠면조 울음소리", "duck": "오리", - "quack": "오리 울음소리", + "quack": "꽥꽥", "goose": "거위", "honk": "거위 울음소리", "wild_animals": "야생 동물", - "roaring_cats": "맹수 포효", + "roaring_cats": "맹수의 포효", "roar": "포효", - "chirp": "새 울음소리", - "squawk": "지저귐", + "chirp": "새 지저귐", + "squawk": "새의 큰 울음소리", "pigeon": "비둘기", - "coo": "비둘기 울음소리", + "coo": "구구", "crow": "까마귀", - "caw": "까마귀 울음소리", + "caw": "까악까악", "owl": "부엉이", "hoot": "부엉이 울음소리", - "flapping_wings": "날갯짓", + "flapping_wings": "날갯짓 소리", "bicycle_bell": "자전거 벨", "tuning_fork": "소리굽쇠", "chime": "차임벨", - "wind_chime": "풍경", + "wind_chime": "풍경 소리", "harmonica": "하모니카", "steel_guitar": "스틸 기타", - "tapping": "두드림", - "strum": "기타 스트로크", + "tapping": "태핑", + "strum": "스트로크", "banjo": "밴조", "sitar": "시타르", "mandolin": "만돌린", - "zither": "지더", + "zither": "치터", "ukulele": "우쿨렐레", "lawn_mower": "잔디깎이", "chainsaw": "전기톱", - "medium_engine": "중형 엔진", - "heavy_engine": "대형 엔진", - "engine_knocking": "엔진 노킹", - "engine_starting": "엔진 시동", - "idling": "공회전", - "alarm": "알람", - "telephone": "전화", - "telephone_bell_ringing": "전화 소리", + "medium_engine": "중형 엔진 소리", + "heavy_engine": "대형 엔진 소리", + "engine_knocking": "엔진 노킹음", + "engine_starting": "시동 소리", + "idling": "공회전 소리", + "alarm": "경보", + "telephone": "전화벨", + "telephone_bell_ringing": "전화벨 울리는 소리", "ringtone": "벨소리", - "telephone_dialing": "전화 다이얼", + "telephone_dialing": "전화 다이얼 누르는 소리", "dial_tone": "발신음", - "cash_register": "금전 등록기", + "cash_register": "계산대 소리", "printer": "프린터", - "single-lens_reflex_camera": "카메라 셔터", - "tools": "도구들", - "hammer": "망치", - "jackhammer": "착암기", - "sawing": "톱질", - "filing": "연마", - "sanding": "사포질", - "power_tool": "전동 도구", - "drill": "드릴", - "explosion": "폭발", - "gunshot": "총소리", - "machine_gun": "기관총", - "fusillade": "연속 총성", - "artillery_fire": "포격", - "cap_gun": "화약 총", - "fireworks": "불꽃놀이", - "firecracker": "폭죽", - "car_alarm": "차량 경보", - "power_windows": "전동 창문", + "single-lens_reflex_camera": "DSLR 셔터음", + "tools": "공구 소리", + "hammer": "망치질 소리", + "jackhammer": "착암기 소리", + "sawing": "톱질 소리", + "filing": "줄질 소리", + "sanding": "사포질 소리", + "power_tool": "전동 공구 소리", + "drill": "드릴 소리", + "explosion": "폭발음", + "gunshot": "총성", + "machine_gun": "기관총 소리", + "fusillade": "일제 사격 소리", + "artillery_fire": "포격 소리", + "cap_gun": "화약총 소리", + "fireworks": "폭죽 터지는 소리", + "firecracker": "폭죽 소리", + "car_alarm": "자동차 경보음", + "power_windows": "전동 파워 윈도우 소리", "dogs": "개", - "rats": "쥐", - "insect": "벌래", + "rats": "쥐들", + "insect": "곤충", "mosquito": "모기", - "fly": "파리", + "fly": "날벌레", "frog": "개구리", "snake": "뱀", "music": "음악", "musical_instrument": "악기", "guitar": "기타", - "electric_guitar": "전기기타", + "electric_guitar": "일렉트릭 기타", "bass_guitar": "베이스 기타", "piano": "피아노", "electric_piano": "전자 피아노", "organ": "오르간", "drum_kit": "드럼 키트", "drum": "드럼", - "maraca": "마라카", + "maraca": "마라카스", "marimba": "마림바", "orchestra": "오케스트라", "trumpet": "트럼펫", - "trombone": "트럼본", + "trombone": "트롬본", "violin": "바이올린", "cello": "첼로", "flute": "플루트", - "saxophone": "섹소폰", + "saxophone": "색소폰", "clarinet": "클라리넷", "harp": "하프", "bell": "벨", - "jingle_bell": "징글 벨", + "jingle_bell": "방울 소리", "bagpipes": "백파이프", - "pop_music": "팝뮤직", - "hip_hop_music": "힙팝 뮤직", + "pop_music": "팝 음악", + "hip_hop_music": "힙합 음악", "beatboxing": "비트박스", - "rock_music": "록 뮤직", + "rock_music": "록 음악", "punk_rock": "펑크 록", - "rock_and_roll": "록엔 롤", + "rock_and_roll": "로큰롤", "rhythm_and_blues": "R&B", - "soul_music": "소울 뮤직", - "swing_music": "스윙 뮤직", - "bluegrass": "블루그레스", - "jazz": "제즈", + "soul_music": "소울 음악", + "swing_music": "스윙 음악", + "bluegrass": "블루그래스", + "jazz": "재즈", "disco": "디스코", - "classical_music": "클레식 음악", + "classical_music": "클래식 음악", "opera": "오페라", "techno": "테크노", - "electronic_dance_music": "Electronic Dance Music(EDM)", - "blues": "블루즈", - "music_for_children": "유아동 음악", + "electronic_dance_music": "EDM", + "blues": "블루스", + "music_for_children": "어린이 음악", "background_music": "배경음악(BGM)", - "soundtrack_music": "사운드트렉 음악", + "soundtrack_music": "사운드트랙", "lullaby": "자장가", - "christmas_music": "크리스마스 음악", - "steam": "증기", - "fire": "화재", + "christmas_music": "크리스마스 캐럴", + "steam": "증기 소리", + "fire": "불소리", "motorboat": "모터보트", "ship": "선박", "motor_vehicle": "자동차", - "race_car": "경주용 자동차", + "race_car": "레이싱 카", "truck": "트럭", "air_brake": "에어 브레이크", - "reversing_beeps": "후진 경보음", - "ice_cream_truck": "아이스크림 트럭", + "reversing_beeps": "후진 경고음", + "ice_cream_truck": "아이스크림 트럭 음악", "emergency_vehicle": "긴급 차량", "police_car": "경찰차", "ambulance": "구급차", "fire_engine": "소방차", - "rail_transport": "철도 운송", - "railroad_car": "철도 차량", + "rail_transport": "철도", + "railroad_car": "기차 칸", "subway": "지하철", - "aircraft": "비행기", - "aircraft_engine": "항공기 엔진", - "jet_engine": "제트 엔진", - "propeller": "프로펠러", + "aircraft": "항공기", + "aircraft_engine": "항공기 엔진 소리", + "jet_engine": "제트 엔진 소리", + "propeller": "프로펠러 소리", "helicopter": "헬리콥터", - "fixed-wing_aircraft": "고정익 항공기", - "engine": "엔진", - "light_engine": "라이트 엔진", + "fixed-wing_aircraft": "고정익 비행기", + "engine": "엔진 소리", + "light_engine": "소형 엔진 소리", "doorbell": "초인종", "ding-dong": "딩동", - "sliding_door": "슬라이딩 도어", - "knock": "노크", - "tap": "탭", - "cupboard_open_or_close": "찬장 열기 또는 닫기", - "drawer_open_or_close": "서랍 열기 또는 닫기", - "microwave_oven": "전자 레인지", + "sliding_door": "미닫이문", + "knock": "노크 소리", + "tap": "두드리는 소리", + "cupboard_open_or_close": "찬장 여닫는 소리", + "drawer_open_or_close": "서랍 여닫는 소리", + "microwave_oven": "전자레인지", "water_tap": "수도꼭지", - "bathtub": "목욕통", - "toilet_flush": "변기 물내림", - "electric_toothbrush": "전동 치솔", - "vacuum_cleaner": "진공 청소기", - "zipper": "지퍼", - "coin": "동전", - "electric_shaver": "전동 면도기", - "typing": "타이핑", + "bathtub": "욕조", + "toilet_flush": "변기 물내리는 소리", + "electric_toothbrush": "전동 칫솔", + "vacuum_cleaner": "진공청소기", + "zipper": "지퍼 여닫는 소리", + "coin": "동전 부딪치는 소리", + "electric_shaver": "전기면도기", + "typing": "타자 소리", "typewriter": "타자기", "computer_keyboard": "컴퓨터 키보드", "alarm_clock": "알람 시계", "siren": "사이렌", - "civil_defense_siren": "민방위 경보 사이렌", + "civil_defense_siren": "민방위 경보", "buzzer": "버저", - "fire_alarm": "화재 경보(기)", - "whistle": "휘슬", - "ratchet": "라쳇", - "tick": "틱", - "tick-tock": "틱톡", - "gears": "기어", - "pulleys": "도르래", - "sewing_machine": "미싱기", - "air_conditioning": "A/C", - "eruption": "분화", - "boom": "붐", - "wood": "나무", - "splinter": "가시", - "glass": "유리", - "silence": "침묵", - "sound_effect": "효과 음", - "environmental_noise": "환경 소음", + "fire_alarm": "화재경보기", + "whistle": "호루라기", + "ratchet": "라쳇 소리", + "tick": "똑딱 소리", + "tick-tock": "똑딱똑딱", + "gears": "톱니바퀴 소리", + "pulleys": "도르래 소리", + "sewing_machine": "재봉틀", + "air_conditioning": "에어컨 소리", + "eruption": "분화 소리", + "boom": "쿵 하는 소리", + "wood": "나무 부딪치는 소리", + "splinter": "나무 쪼개지는 소리", + "glass": "유리 소리", + "silence": "무음", + "sound_effect": "효과음", + "environmental_noise": "주변 환경 소음", "white_noise": "백색 소음", "pink_noise": "핑크 노이즈", - "television": "텔레비젼(TV)", - "radio": "라디오", - "splash": "스플레쉬", - "spray": "스프레이", - "pump": "펌프", - "arrow": "화살", - "electronic_tuner": "전자 튜너", - "smash": "스메쉬", - "clicking": "클릭킹", + "television": "텔레비전 소리", + "radio": "라디오 소리", + "splash": "첨벙거리는 소리", + "spray": "스프레이 분사음", + "pump": "펌프 소리", + "arrow": "화살 날아가는 소리", + "electronic_tuner": "전자 조율기", + "smash": "박살 나는 소리", + "clicking": "딸깍거리는 소리", "noise": "소음", - "mains_hum": "험 노이즈", - "outside": "외부", + "mains_hum": "전원 험 노이즈", + "outside": "실외", "reggae": "레게", "french_horn": "프렌치 호른", "traffic_noise": "교통 소음", - "rain": "비", - "raindrop": "빗물방울", - "rain_on_surface": "표면에 비", - "stream": "개울 하천", - "wedding_music": "웨딩 음악", - "harmonic": "하모닉", - "ocean": "오션", - "vibration": "진동", - "new-age_music": "뉴 에이지 음악", + "rain": "빗소리", + "raindrop": "빗방울 소리", + "rain_on_surface": "표면에 떨어지는 빗소리", + "stream": "개울물 소리", + "wedding_music": "결혼식 음악", + "harmonic": "하모닉스", + "ocean": "바다 소리", + "vibration": "진동음", + "new-age_music": "뉴에이지 음악", "tubular_bells": "튜블러 벨", "middle_eastern_music": "중동 음악", - "mechanical_fan": "기계식 팬", - "angry_music": "앵그리 뮤직", - "rattle": "방울", - "water": "물", - "waterfall": "폭포", + "mechanical_fan": "선풍기 소리", + "angry_music": "격렬한 음악", + "rattle": "덜그럭거리는 소리", + "water": "물소리", + "waterfall": "폭포 소리", "music_of_asia": "아시아 음악", "brass_instrument": "금관악기", "folk_music": "포크 음악", @@ -334,106 +334,169 @@ "flamenco": "플라멩코", "bass_drum": "베이스 드럼", "thunderstorm": "뇌우", - "thunder": "우뢰", + "thunder": "천둥", "vibraphone": "비브라폰", "synthesizer": "신디사이저", "smoke_detector": "연기 감지기", - "busy_signal": "통화 중 신호", - "shuffling_cards": "카드 섞기", - "train_whistle": "기차 경적 소리", + "busy_signal": "통화 중 신호음", + "shuffling_cards": "카드 섞는 소리", + "train_whistle": "기차 호루라기 소리", "traditional_music": "전통 음악", "independent_music": "인디 음악", "song": "노래", "theme_music": "테마 음악", - "house_music": "하우스 뮤직", - "beep": "삑", - "ping": "핑", - "dance_music": "트랜스 음악", - "whale_vocalization": "고래 울음소리", + "house_music": "하우스 음악", + "beep": "삑 소리", + "ping": "핑 소리", + "dance_music": "댄스 음악", + "whale_vocalization": "고래 소리", "music_of_bollywood": "볼리우드 음악", - "ska": "스카(Ska)", + "ska": "스카", "train_horn": "기차 경적", "wind_instrument": "관악기", - "funk": "펑키 재즈", - "glockenspiel": "카리용", - "waves": "파도", - "tabla": "판자", - "ding": "딩", - "chorus_effect": "코러스 효과", - "basketball_bounce": "농구공 튕김", + "funk": "펑크", + "glockenspiel": "글로켄슈필", + "waves": "파도 소리", + "tabla": "타블라", + "ding": "딩동 소리", + "chorus_effect": "코러스 이펙트", + "basketball_bounce": "농구공 튀기는 소리", "air_horn": "에어혼", "hi_hat": "하이햇", - "cacophony": "불협화음", + "cacophony": "불협화음 소음", "drum_machine": "드럼 머신", "drum_and_bass": "드럼 앤 베이스", "drum_roll": "드럼 롤", "echo": "에코", "heavy_metal": "헤비메탈", "progressive_rock": "프로그레시브 록", - "cricket": "크리켓(귀뚜라미)", - "music_of_latin_america": "라틴 아메리카 음악", + "cricket": "귀뚜라미", + "music_of_latin_america": "라틴 음악", "sampler": "샘플러", "hammond_organ": "해먼드 오르간", "theremin": "테레민", - "shofar": "쇼파르", - "mechanisms": "메커니즘", - "pulse": "펄스", - "liquid": "액체", - "squish": "으깨다", - "effects_unit": "이펙트 유닛", + "shofar": "쇼파르(양각 나팔)", + "mechanisms": "기계 장치", + "pulse": "펄스음", + "liquid": "액체 소리", + "squish": "질척거리는 소리", + "effects_unit": "이펙터", "christian_music": "기독교 음악", - "gospel_music": "가스펠 음악", + "gospel_music": "가스펠", "dubstep": "덥스텝", - "double_bass": "더블베이스 (콘트라베이스)", - "wind": "바람", - "wood_block": "나무 블록", + "double_bass": "콘트라베이스", + "wind": "바람 소리", + "wood_block": "우드블록", "country": "컨트리 음악", - "cutlery": "식기류", + "cutlery": "수저 부딪치는 소리", "afrobeat": "아프로비트", "trance_music": "트랜스 음악", "percussion": "타악기", "electronic_music": "전자 음악", - "hum": "험", - "zing": "징", - "boing": "보잉", - "crunch": "크런치", - "sine_wave": "사인파", - "gurgling": "꿀꺽꿀꺽", + "hum": "웅웅거리는 험 노이즈", + "zing": "핑 날아가는 소리", + "boing": "용수철 뿅 소리", + "crunch": "바삭거리는 소리", + "sine_wave": "사인파 톤", + "gurgling": "졸졸 흐르는 소리", "electronic_organ": "전자 오르간", "grunge": "그런지", - "pizzicato": "꼬집다", + "pizzicato": "피치카토", "carnatic_music": "카르나틱 음악", "cymbal": "심벌즈", "harpsichord": "하프시코드", - "plucked_string_instrument": "뜯어서 연주하는 현악기", - "happy_music": "행복한 음악", + "plucked_string_instrument": "발현악기", + "happy_music": "밝은 음악", "rustling_leaves": "바스락거리는 나뭇잎", - "wind_noise": "바람 소리", + "wind_noise": "풍절음", "tire_squeal": "타이어 마찰음", - "buzz": "버저 소리", - "foghorn": "포그혼", + "buzz": "윙윙거리는 소리", + "foghorn": "무무표지(안개 경적)", "vocal_music": "보컬 음악", - "chirp_tone": "짹짹거리는 소리", - "plop": "퐁당", - "keys_jangling": "딸랑거리는 열쇠 꾸러미", + "chirp_tone": "전자 짹짹음", + "plop": "퐁당 소리", + "keys_jangling": "열쇠 흔들리는 소리", "didgeridoo": "디저리두", - "tender_music": "Tender 음악", + "tender_music": "부드러운 음악", "electronica": "일렉트로니카", "exciting_music": "신나는 음악", - "bang": "쾅", - "slap": "슬랩", - "video_game_music": "비디오 게임 음악", - "sad_music": "Sad 음악", - "scary_music": "스카이 음악", - "squeal": "끼익거리는 소리", - "clatter": "덜그럭거리는 소리", + "bang": "쾅 소리", + "slap": "찰싹 때리는 소리", + "video_game_music": "게임 음악", + "sad_music": "슬픈 음악", + "scary_music": "공포 음악", + "squeal": "끼익 비명/마찰음", + "clatter": "달그락거리는 소리", "sidetone": "측음", - "slosh": "출렁이는 물소리", - "sonar": "소나", - "patter": "타닥거리는 소리", - "inside": "내부", + "slosh": "출렁거리는 소리", + "sonar": "소나(음파 탐지기)", + "patter": "톡톡 두드리는 소리", + "inside": "실내", "rimshot": "림샷", - "dishes": "그릇 소리", - "crack": "쾅 하는 소리", - "burst": "터지는 소리" + "dishes": "식기 달그락거리는 소리", + "crack": "쩍 갈라지는 소리", + "burst": "파열음", + "croak": "개구리 울음소리", + "gong": "징", + "steelpan": "스틸팬", + "bowed_string_instrument": "찰현악기", + "string_section": "현악 섹션", + "church_bell": "교회 종소리", + "singing_bowl": "싱잉볼", + "scratching": "스크래칭", + "psychedelic_rock": "사이케델릭 록", + "crackle": "타닥거리는 소리", + "sailboat": "돛단배", + "rowboat": "노 젓는 배", + "toot": "빵빵 소리", + "skidding": "미끄러지는 소리", + "car_passing_by": "지나가는 차 소리", + "train_wheels_squealing": "기차 바퀴 마찰음", + "dental_drill's_drill": "치과용 드릴", + "slam": "쾅 닫는 소리", + "squeak": "찍찍거리는 소리", + "chopping": "도마 칼질 소리", + "frying": "튀기는 소리", + "writing": "글씨 쓰는 소리", + "steam_whistle": "증기 호각", + "chop": "장작 패는 소리", + "chink": "짤랑거리는 소리", + "shatter": "유리 와장창 깨지는 소리", + "static": "지지직거리는 잡음", + "field_recording": "현장 녹음 소리", + "scream": "외마디 비명", + "chird": "새소리", + "change_ringing": "타종 소리", + "drip": "똑똑 떨어지는 소리", + "pour": "콸콸 붓는 소리", + "trickle": "졸졸 흐르는 소리", + "gush": "솟구치는 소리", + "fill": "물 차오르는 소리", + "stir": "휘젓는 소리", + "boiling": "보글보글 끓는 소리", + "whoosh": "쉭 지나가는 소리", + "thump": "털썩 하는 소리", + "thunk": "퍽 하는 소리", + "whack": "탁 치는 소리", + "breaking": "부서지는 소리", + "bouncing": "통통 튀는 소리", + "whip": "채찍 소리", + "flap": "펄럭이는 소리", + "scratch": "긁는 소리", + "scrape": "끼익 긁히는 소리", + "rub": "문지르는 소리", + "roll": "데굴데굴 굴러가는 소리", + "crushing": "으스러지는 소리", + "crumpling": "구겨지는 소리", + "tearing": "찢어지는 소리", + "clang": "쨍그랑 소리", + "creak": "삐걱거리는 소리", + "rustle": "바스락거리는 소리", + "whir": "붕붕거리는 소리", + "sizzle": "지글지글 소리", + "clickety_clack": "덜컹덜컹 소리", + "rumble": "우르릉거리는 소리", + "reverberation": "잔향음", + "distortion": "왜곡(디스토션)", + "throbbing": "두근거리는 맥박음" } diff --git a/web/public/locales/ko/common.json b/web/public/locales/ko/common.json index 94f0b194ec..c51fc5e5d8 100644 --- a/web/public/locales/ko/common.json +++ b/web/public/locales/ko/common.json @@ -2,39 +2,39 @@ "readTheDocumentation": "문서 읽기", "time": { "untilForTime": "{{time}}까지", - "untilForRestart": "Frigate가 재시작될 때 까지.", + "untilForRestart": "Frigate가 재시작될 때까지.", "10minutes": "10분", "12hours": "12시간", "1hour": "1시간", "24hours": "24시간", "30minutes": "30분", "5minutes": "5분", - "untilRestart": "재시작 될 때까지", + "untilRestart": "재시작될 때까지", "ago": "{{timeAgo}} 전", - "justNow": "방금", + "justNow": "방금 전", "today": "오늘", "yesterday": "어제", "last7": "최근 7일", "last14": "최근 14일", "last30": "최근 30일", "thisWeek": "이번 주", - "lastWeek": "저번 주", + "lastWeek": "지난 주", "thisMonth": "이번 달", - "lastMonth": "저번 달", + "lastMonth": "지난 달", "pm": "오후", "am": "오전", "yr": "{{time}}년", - "year_other": "{{time}} 년", - "mo": "{{time}}월", - "month_other": "{{time}} 월", + "year_other": "{{time}}년", + "mo": "{{time}}개월", + "month_other": "{{time}}개월", "d": "{{time}}일", - "day_other": "{{time}} 일", - "h": "{{time}}시", - "hour_other": "{{time}} 시", + "day_other": "{{time}}일", + "h": "{{time}}시간", + "hour_other": "{{time}}시간", "m": "{{time}}분", - "minute_other": "{{time}} 분", + "minute_other": "{{time}}분", "s": "{{time}}초", - "second_other": "{{time}} 초", + "second_other": "{{time}}초", "formattedTimestamp": { "12hour": "MMM d, h:mm:ss aaa", "24hour": "MMM d, HH:mm:ss" @@ -68,7 +68,7 @@ "12hour": "MM-dd-yy-h-mm-ss-a", "24hour": "MM-dd-yy-HH-mm-ss" }, - "never": "한 번도 없음", + "never": "안 함", "inProgress": "진행 중", "invalidStartTime": "잘못된 시작 시간", "invalidEndTime": "잘못된 종료 시간" @@ -76,25 +76,25 @@ "notFound": { "title": "404", "documentTitle": "찾을 수 없음 - Frigate", - "desc": "페이지 찾을 수 없음" + "desc": "페이지를 찾을 수 없습니다" }, "accessDenied": { "title": "접근 거부", "documentTitle": "접근 거부 - Frigate", - "desc": "이 페이지 접근 권한이 없습니다." + "desc": "이 페이지를 볼 수 있는 권한이 없습니다." }, "menu": { "user": { "account": "계정", "title": "사용자", - "current": "현재 사용자:{{user}}", + "current": "현재 사용자: {{user}}", "anonymous": "익명", "logout": "로그아웃", "setPassword": "비밀번호 설정" }, "system": "시스템", "systemMetrics": "시스템 지표", - "configuration": "설정", + "configuration": "설정 구성", "systemLogs": "시스템 로그", "settings": "설정", "configurationEditor": "설정 편집기", @@ -103,7 +103,7 @@ "en": "English (영어)", "es": "Español (스페인어)", "zhCN": "简体中文 (중국어 간체)", - "hi": "हिन्दी (힌두어)", + "hi": "हिन्दी (힌디어)", "fr": "Français (프랑스어)", "ar": "العربية (아랍어)", "pt": "Português (포르투갈어)", @@ -117,7 +117,7 @@ "sv": "Svenska (스웨덴어)", "cs": "Čeština (체코어)", "nb": "Norsk Bokmål (노르웨이어 보크몰)", - "ko": "한국어", + "ko": "한국어 (Korean)", "vi": "Tiếng Việt (베트남어)", "fa": "فارسی (페르시아어)", "pl": "Polski (폴란드어)", @@ -126,7 +126,7 @@ "el": "Ελληνικά (그리스어)", "ro": "Română (루마니아어)", "hu": "Magyar (헝가리어)", - "fi": "Suomi (Finnish)", + "fi": "Suomi (핀란드어)", "da": "Dansk (덴마크어)", "sk": "Slovenčina (슬로바키아어)", "yue": "粵語 (광둥어)", @@ -140,9 +140,12 @@ "id": "Bahasa Indonesia (인도네시아어)", "ur": "اردو (우르두어)", "withSystem": { - "label": "시스템 설정 언어 사용" + "label": "시스템 언어 설정 사용" }, - "hr": "Hrvatski (크로아티아어)" + "hr": "Hrvatski (크로아티아어)", + "zhHant": "繁體中文 (중국어 번체)", + "be": "Беларуская (벨라루스어)", + "bs": "Bosanski (보스니아어)" }, "appearance": "화면 설정", "darkMode": { @@ -150,17 +153,17 @@ "light": "라이트", "dark": "다크", "withSystem": { - "label": "시스템 설정에 따라 설정" + "label": "시스템 설정에 따라 라이트/다크 모드 전환" } }, "withSystem": "시스템", "theme": { "label": "테마", "blue": "파랑", - "green": "녹색", + "green": "초록", "nord": "노드 (Nord)", "red": "빨강", - "highcontrast": "고 대비", + "highcontrast": "고대비", "default": "기본값" }, "help": "도움말", @@ -174,17 +177,17 @@ "allCameras": "모든 카메라", "cameras": { "title": "카메라", - "count_other": "{{count}} 카메라" + "count_other": "{{count}}대 카메라" } }, "review": "다시보기", "explore": "탐색", "export": "내보내기", - "uiPlayground": "UI 실험실", + "uiPlayground": "UI 플레이그라운드", "faceLibrary": "얼굴 라이브러리", "classification": "분류", "chat": "채팅", - "actions": "작업", + "actions": "동작", "profiles": "프로필", "features": "기능" }, @@ -210,14 +213,14 @@ "back": "뒤로", "hide": "{{item}} 숨기기", "show": "{{item}} 표시", - "ID": "아이디", + "ID": "ID", "none": "없음", "all": "전체", - "other": "그 외" + "other": "기타" }, "button": { "apply": "적용", - "reset": "리셋", + "reset": "재설정", "done": "완료", "enabled": "활성화됨", "enable": "활성화", @@ -229,38 +232,38 @@ "close": "닫기", "copy": "복사", "back": "뒤로", - "history": "히스토리", + "history": "기록", "fullscreen": "전체화면", - "exitFullscreen": "전체화면 나가기", - "pictureInPicture": "화면 속 화면", - "twoWayTalk": "양방향 말하기", + "exitFullscreen": "전체화면 종료", + "pictureInPicture": "화면 속 화면 (PIP)", + "twoWayTalk": "양방향 대화", "cameraAudio": "카메라 오디오", - "on": "켜기", - "off": "끄기", - "edit": "편집", - "copyCoordinates": "코디네이트 복사", + "on": "켜짐", + "off": "꺼짐", + "edit": "수정", + "copyCoordinates": "좌표 복사", "delete": "삭제", "yes": "예", "no": "아니오", "download": "다운로드", "info": "정보", - "suspended": "일시 정지됨", + "suspended": "일시 중지됨", "unsuspended": "재개", "play": "재생", "unselect": "선택 해제", "export": "내보내기", - "deleteNow": "바로 삭제하기", + "deleteNow": "지금 삭제", "next": "다음", "add": "추가", "undo": "실행 취소", - "copiedToClipboard": "클립보드에 복사", - "continue": "계속하기", + "copiedToClipboard": "클립보드에 복사됨", + "continue": "계속", "modified": "수정됨", "overridden": "재정의됨", - "resetToGlobal": "글로벌 설정으로 재설정", - "resetToDefault": "기본값으로 재설정", + "resetToGlobal": "전역 설정으로 초기화", + "resetToDefault": "기본값으로 초기화", "saveAll": "모두 저장", - "savingAll": "모두 저장 중. …", + "savingAll": "모두 저장 중…", "undoAll": "모두 실행 취소", "applying": "적용 중…", "retry": "재시도" @@ -270,8 +273,8 @@ "save": { "title": "저장", "error": { - "title": "설정 저장 실패: {{errorMessage}}", - "noMessage": "설정 저장이 실패했습니다" + "title": "설정 변경 저장 실패: {{errorMessage}}", + "noMessage": "설정 변경 저장에 실패했습니다" }, "success": "설정 변경이 성공적으로 저장되었습니다." } @@ -279,34 +282,37 @@ "role": { "title": "역할", "admin": "관리자", - "viewer": "감시자", - "desc": "관리자는 Frigate UI에 모든 접근 권한이 있습니다. 감시자는 카메라 감시, 돌아보기, 과거 영상 조회만 가능합니다." + "viewer": "뷰어", + "desc": "관리자는 Frigate UI의 모든 기능에 대한 전체 접근 권한을 가집니다. 뷰어는 카메라 실시간 화면, 다시보기 항목, 이전 녹화 영상 조회만 가능합니다." }, "pagination": { - "label": "페이지 번호", + "label": "페이지 매김", "previous": { "title": "이전", - "label": "이전 페이지" + "label": "이전 페이지로 이동" }, "next": { "title": "다음", - "label": "다음 페이지" + "label": "다음 페이지로 이동" }, - "more": "더 많은 페이지" + "more": "페이지 더보기" }, "selectItem": "{{item}} 선택", "information": { "pixels": "{{area}}px" }, "list": { - "two": "{{0}}과 {{1}}", - "many": "{{items}} 그리고 {{last}}", + "two": "{{0}} 및 {{1}}", + "many": "{{items}} 및 {{last}}", "separatorWithSpace": ", " }, "field": { - "optional": "선택", - "internalID": "Frigate 내부 ID는 구성 및 데이터베이스에서 사용됩니다" + "optional": "선택 사항", + "internalID": "Frigate 설정 및 데이터베이스에서 사용되는 내부 ID" }, - "no_items": "내역 없음", - "validation_errors": "검증 오류" + "no_items": "항목 없음", + "validation_errors": "유효성 검사 오류", + "credentialField": { + "savedPlaceholder": "저장됨 — 현재 값을 유지하려면 비워 두세요" + } } diff --git a/web/public/locales/ko/components/auth.json b/web/public/locales/ko/components/auth.json index ad8e1fa8d1..6951d5b105 100644 --- a/web/public/locales/ko/components/auth.json +++ b/web/public/locales/ko/components/auth.json @@ -1,16 +1,16 @@ { "form": { - "user": "사용자명", + "user": "사용자 이름", "password": "비밀번호", "login": "로그인", "errors": { - "usernameRequired": "사용자명은 필수입니다", - "passwordRequired": "비밀번호는 필수입니다", - "rateLimit": "너무 많이 시도했습니다. 다음에 다시 시도하세요.", - "loginFailed": "로그인 실패", - "unknownError": "알려지지 않은 에러. 로그를 확인하세요.", - "webUnknownError": "알려지지 않은 에러. 콘솔 로그를 확인하세요." + "usernameRequired": "사용자 이름을 입력해야 합니다", + "passwordRequired": "비밀번호를 입력해야 합니다", + "rateLimit": "요청 횟수 제한을 초과했습니다. 잠시 후 다시 시도하세요.", + "loginFailed": "로그인에 실패했습니다", + "unknownError": "알 수 없는 오류가 발생했습니다. 로그를 확인하세요.", + "webUnknownError": "알 수 없는 오류가 발생했습니다. 콘솔 로그를 확인하세요." }, - "firstTimeLogin": "처음 로그인하시나요? 로그인 정보는 Frigate 로그에 있습니다." + "firstTimeLogin": "처음 로그인하시나요? 초기 로그인 정보는 Frigate 로그에 출력되어 있습니다." } } diff --git a/web/public/locales/ko/components/camera.json b/web/public/locales/ko/components/camera.json index 610fae4c85..462ee211cb 100644 --- a/web/public/locales/ko/components/camera.json +++ b/web/public/locales/ko/components/camera.json @@ -2,86 +2,89 @@ "group": { "label": "카메라 그룹", "add": "카메라 그룹 추가", - "edit": "카메라 그룹 편집", + "edit": "카메라 그룹 수정", "delete": { "label": "카메라 그룹 삭제", "confirm": { "title": "삭제 확인", - "desc": "정말로 카메라 그룹을 삭제하시겠습니까 {{name}}?" + "desc": "정말로 {{name}} 카메라 그룹을 삭제하시겠습니까?" } }, "name": { "label": "이름", "placeholder": "이름을 입력하세요…", "errorMessage": { - "mustLeastCharacters": "카메라 그룹 이름은 최소 2자 이상 써야합니다.", + "mustLeastCharacters": "카메라 그룹 이름은 최소 2자 이상이어야 합니다.", "exists": "이미 존재하는 카메라 그룹 이름입니다.", - "nameMustNotPeriod": "카메라 그룹 이름에 마침표(.)를 넣을 수 없습니다.", - "invalid": "설정 불가능한 카메라 그룹 이름." + "nameMustNotPeriod": "카메라 그룹 이름에는 마침표(.)를 포함할 수 없습니다.", + "invalid": "유효하지 않은 카메라 그룹 이름입니다." } }, "cameras": { "label": "카메라", - "desc": "이 그룹에 넣을 카메라 선택하기." + "desc": "이 그룹에 포함할 카메라를 선택하세요." }, "icon": "아이콘", - "success": "카메라 그룹 {{name}} 저장되었습니다.", + "success": "카메라 그룹({{name}})이(가) 저장되었습니다.", "camera": { "birdseye": "버드아이", "setting": { "label": "카메라 스트리밍 설정", "title": "{{cameraName}} 스트리밍 설정", - "desc": "카메라 그룹 대시보드의 실시간 스트리밍 옵션을 변경하세요. 이 설정은 기기/브라우저에 따라 다릅니다.", - "audioIsAvailable": "이 카메라는 오디오 기능을 사용할 수 있습니다", - "audioIsUnavailable": "이 카메라는 오디오 기능을 사용할 수 없습니다", + "desc": "카메라 그룹 대시보드의 실시간 스트리밍 옵션을 변경합니다. 이 설정은 기기 및 브라우저별로 개별 적용됩니다.", + "audioIsAvailable": "이 스트림에서 오디오 기능을 사용할 수 있습니다", + "audioIsUnavailable": "이 스트림에서는 오디오 기능을 사용할 수 없습니다", "audio": { "tips": { - "title": "오디오를 출력하려면 카메라가 지원하거나 go2rtc에서 설정해야합니다." + "title": "오디오를 출력하려면 카메라 자체에서 오디오를 지원하고 go2rtc에 해당 스트림이 설정되어 있어야 합니다." } }, "stream": "스트림", "placeholder": "스트림 선택", "streamMethod": { "label": "스트리밍 방식", - "placeholder": "스트리밍 방식 선택", + "placeholder": "스트리밍 방식을 선택하세요", "method": { "noStreaming": { "label": "스트리밍 없음", - "desc": "카메라 이미지는 1분에 한 번만 보여지며 라이브 스트리밍은 되지 않습니다." + "desc": "카메라 이미지가 1분에 한 번씩만 갱신되며 실시간 스트리밍은 작동하지 않습니다." }, "smartStreaming": { - "label": "스마트 스트리밍 (추천함)", - "desc": "스마트 스트리밍은 감지되는 활동이 없을 때 대역폭과 자원을 절약하기 위해 1분마다 한 번 카메라 이미지를 업데이트합니다. 활동이 감지되면, 이미지는 자동으로 라이브 스트림으로 원활하게 전환됩니다." + "label": "스마트 스트리밍 (권장)", + "desc": "대역폭과 시스템 자원을 절약하기 위해 감지된 동작이 없을 때는 1분마다 이미지를 갱신합니다. 동작이 감지되면 자동으로 매끄럽게 라이브 스트림으로 전환됩니다." }, "continuousStreaming": { - "label": "지속적인 스트리밍", + "label": "지속적 스트리밍", "desc": { - "title": "활동이 감지되지 않더라도 카메라 이미지가 대시보드에서 항상 실시간 스트림됩니다.", - "warning": "지속적인 스트리밍은 높은 대역폭 사용과 퍼포먼스 이슈를 발생할 수 있습니다. 사용에 주의해주세요." + "title": "동작이 감지되지 않더라도 대시보드에 카메라 화면이 표시될 때 항상 실시간 스트림으로 재생됩니다.", + "warning": "지속적 스트리밍은 네트워크 대역폭 사용량이 증가하고 성능 저하를 유발할 수 있으므로 주의하여 사용하세요." } } } }, "compatibilityMode": { "label": "호환 모드", - "desc": "이 옵션은 카메라 라이브 스트림 화면의 색상이 왜곡 되었거나 이미지 오른쪽에 대각선이 나타날때만 사용하세요." + "desc": "카메라 라이브 스트림 화면에 색상 왜곡이 있거나 화면 우측에 대각선 줄이 나타나는 경우에만 이 옵션을 활성화하세요." } } - } + }, + "showAll": "모든 카메라 그룹 표시", + "showLess": "간략히 표시", + "editGroups": "카메라 그룹 관리" }, "debug": { "options": { "label": "설정", "title": "옵션", - "showOptions": "옵션 보기", + "showOptions": "옵션 표시", "hideOptions": "옵션 숨기기" }, - "boundingBox": "감지 영역 상자", - "timestamp": "시간 기록", + "boundingBox": "바운딩 박스 (객체 감지 영역)", + "timestamp": "타임스탬프", "zones": "구역 (Zones)", - "mask": "마스크", - "motion": "움직임", + "mask": "마스크 (Mask)", + "motion": "움직임 감지 (Motion)", "regions": "영역 (Regions)", - "paths": "경로" + "paths": "이동 경로 (Paths)" } } diff --git a/web/public/locales/ko/components/dialog.json b/web/public/locales/ko/components/dialog.json index 9a1c9edeb9..d7dd88b47f 100644 --- a/web/public/locales/ko/components/dialog.json +++ b/web/public/locales/ko/components/dialog.json @@ -1,41 +1,44 @@ { "restart": { - "title": "Frigate을 정말로 다시 시작할까요?", + "title": "Frigate을 정말로 다시 시작하시겠습니까?", "button": "재시작", "restarting": { - "title": "Frigate이 재시작 중입니다", - "content": "이 페이지는 {{countdown}} 뒤에 새로 고침 됩니다.", - "button": "강제 재시작" + "title": "Frigate 재시작 중", + "content": "이 페이지는 {{countdown}}초 후에 자동으로 새로고침됩니다.", + "button": "지금 즉시 새로고침" }, - "description": "이 작업은 Frigate가 재시작 되는 동안 잠시 작동이 중지됩니다." + "description": "재시작하는 동안 Frigate 동작이 일시적으로 중단됩니다." }, "explore": { "plus": { "submitToPlus": { "label": "Frigate+에 등록하기", - "desc": "제외하려는 위치에서 감지된 객체는 '오감지(False Positive)'가 아닙니다. 이를 오감지로 제출하면 모델 학습에 혼선을 줄 수 있습니다." + "desc": "감지를 제외하려는 위치에 있는 객체는 오감지(False Positive)가 아닙니다. 이를 오감지로 제출하면 모델 학습에 혼선을 줄 수 있습니다." }, "review": { "question": { - "label": "Frigate +에 이 레이블 등록하기", - "ask_a": "이 것은 {{label}} 인가요?", - "ask_an": "이 것은 {{label}} 인가요?", - "ask_full": "이 것은 {{untranslatedLabel}} ({{translatedLabel}}) 인가요?" + "label": "Frigate+용 레이블 확인", + "ask_a": "이 객체가 {{label}} 맞습니까?", + "ask_an": "이 객체가 {{label}} 맞습니까?", + "ask_full": "이 객체가 {{untranslatedLabel}} ({{translatedLabel}}) 맞습니까?" }, "state": { "submitted": "제출됨" + }, + "toast": { + "error": "Frigate+ 제출에 실패했습니다. 네트워크 연결을 확인하고 다시 시도하세요." } } }, "video": { - "viewInHistory": "히스토리 보기" + "viewInHistory": "기록에서 보기" } }, "export": { "time": { - "fromTimeline": "타임라인에서 선택하기", - "lastHour_other": "지난 {{count}} 시간­", - "custom": "커스텀", + "fromTimeline": "타임라인에서 선택", + "lastHour_other": "지난 {{count}}시간", + "custom": "사용자 지정", "start": { "title": "시작 시간", "label": "시작 시간 선택" @@ -46,53 +49,105 @@ } }, "name": { - "placeholder": "내보내기 이름" + "placeholder": "내보내기 이름 지정" }, "select": "선택", "export": "내보내기", "selectOrExport": "선택 또는 내보내기", "toast": { - "success": "내보내기가 성공적으로 시작되었습니다. 내보내기 페이지에서 파일을 보실 수 있습니다.", + "success": "내보내기가 성공적으로 시작되었습니다. 내보내기 페이지에서 파일을 확인하세요.", "error": { - "failed": "내보내기 시작 실패:{{error}}", - "endTimeMustAfterStartTime": "종료 시간은 시작 시간보다 뒤에 있어야합니다", - "noVaildTimeSelected": "유효한 시간 범위가 선택되지 않았습니다" + "failed": "내보내기 대기열 등록 실패: {{error}}", + "endTimeMustAfterStartTime": "종료 시간은 시작 시간 이후여야 합니다", + "noVaildTimeSelected": "유효한 시간 범위가 선택되지 않았습니다", + "noValidTimeSelected": "유효한 시간 범위가 선택되지 않았습니다" }, - "view": "보기" + "view": "보기", + "queued": "내보내기가 대기열에 등록되었습니다. 진행 상황은 내보내기 페이지에서 확인하세요.", + "batchSuccess_other": "내보내기 {{count}}건을 시작했습니다. 케이스를 여는 중입니다.", + "batchPartial": "{{total}}건 중 {{successful}}건의 내보내기를 시작했습니다. 실패한 카메라: {{failedCameras}}", + "batchFailed": "{{total}}건의 내보내기 시작에 실패했습니다. 실패한 카메라: {{failedCameras}}", + "batchQueuedSuccess_other": "내보내기 {{count}}건을 대기열에 추가했습니다.", + "batchQueuedPartial": "{{total}}건 중 {{successful}}건의 내보내기를 대기열에 추가했습니다. 실패한 카메라: {{failedCameras}}", + "batchQueueFailed": "{{total}}건의 내보내기 대기열 등록에 실패했습니다. 실패한 카메라: {{failedCameras}}" }, "fromTimeline": { "saveExport": "내보내기 저장", - "previewExport": "내보내기 미리보기" + "previewExport": "내보내기 미리보기", + "queueingExport": "내보내기 대기열 등록 중...", + "useThisRange": "이 범위 사용" }, "case": { - "label": "유형", - "placeholder": "유형 선택" + "label": "케이스", + "placeholder": "케이스 선택", + "newCaseOption": "새 케이스 생성", + "newCaseNamePlaceholder": "새 케이스 이름", + "newCaseDescriptionPlaceholder": "케이스 설명", + "nonAdminHelp": "이 내보내기를 위한 새 케이스가 생성됩니다." + }, + "queueing": "내보내기 대기열 추가 중...", + "tabs": { + "export": "단일 카메라", + "multiCamera": "다중 카메라" + }, + "multiCamera": { + "timeRange": "시간 범위", + "selectFromTimeline": "타임라인에서 선택", + "cameraSelection": "카메라", + "cameraSelectionHelp": "해당 시간 범위에 추적된 객체가 있는 카메라가 기본 선택됩니다", + "searchOrSelectGroup": "검색 또는 카메라 그룹 선택...", + "selectAll": "모든 카메라 선택", + "clearSelection": "선택 해제", + "selectWithActivity": "추적된 객체가 있는 카메라", + "selectGroup": "그룹 선택", + "noMatchingCameras": "일치하는 카메라가 없습니다", + "selectedCount": "{{selected}} / {{total}}대 선택됨", + "checkingActivity": "카메라 활동 확인 중...", + "noCameras": "사용 가능한 카메라가 없습니다", + "detectionCount_other": "추적된 객체 {{count}}개", + "nameLabel": "내보내기 이름", + "namePlaceholder": "내보내기에 사용할 기본 이름 (선택 사항)", + "queueingButton": "내보내기 대기열 추가 중...", + "exportButton_other": "카메라 {{count}}대 내보내기" + }, + "multi": { + "title_other": "다시보기 {{count}}건 내보내기", + "description": "선택한 각 다시보기를 내보냅니다. 모든 내보내기 항목은 단일 케이스로 묶입니다.", + "descriptionNoCase": "선택한 각 다시보기를 내보냅니다.", + "caseNamePlaceholder": "다시보기 내보내기 - {{date}}", + "exportButton_other": "다시보기 {{count}}건 내보내기", + "exportingButton": "내보내는 중...", + "toast": { + "started_other": "내보내기 {{count}}건을 시작했습니다.", + "partial": "{{total}}건 중 {{successful}}건의 내보내기를 시작했습니다. 실패 항목: {{failedItems}}", + "failed": "{{total}}건의 내보내기 시작에 실패했습니다. 실패 항목: {{failedItems}}" + } } }, "streaming": { "label": "스트림", "restreaming": { - "disabled": "이 카메라는 재 스트리밍이 되지 않습니다.", + "disabled": "이 카메라는 재스트리밍이 활성화되어 있지 않습니다.", "desc": { - "title": "이 카메라를 위해 추가적인 라이브 뷰 옵션과 오디오를 go2rtc에서 설정하세요." + "title": "추가 라이브 뷰 옵션 및 오디오 기능을 사용하려면 go2rtc 설정을 진행하세요." } }, "showStats": { - "label": "스트림 통계 보기", - "desc": "이 옵션을 활성화하면 스트림 통계가 카메라 피드에 나타납니다." + "label": "스트림 통계 표시", + "desc": "카메라 피드 위에 실시간 스트림 통계 정보를 오버레이로 표시합니다." }, "debugView": "디버그 뷰" }, "search": { "saveSearch": { - "label": "검색 저장", - "desc": "저장된 검색에 이름을 지정해주세요.", - "placeholder": "검색에 이름 입력하기", - "overwrite": "{{searchName}} (이/가) 이미 존재합니다. 값을 덮어 씌웁니다.", - "success": "{{searchName}} 검색이 저장되었습니다.", + "label": "검색 조건 저장", + "desc": "저장할 검색 조건의 이름을 입력하세요.", + "placeholder": "검색 이름 입력", + "overwrite": "'{{searchName}}'이(가) 이미 존재합니다. 저장 시 기존 항목을 덮어씁니다.", + "success": "검색 조건({{searchName}})이 저장되었습니다.", "button": { "save": { - "label": "이 검색 저장하기" + "label": "이 검색 조건 저장" } } } @@ -101,26 +156,34 @@ "confirmDelete": { "title": "삭제 확인", "desc": { - "selected": "이 리뷰 항목과 관련된 모든 녹화된 영상을 삭제하시겠습니까?

다음에 이 팝업을 건너뛰려면 Shift 키를 누르고 삭제하세요." + "selected": "이 다시보기 항목과 연결된 모든 녹화 영상을 삭제하시겠습니까?

이후 확인 창을 건너뛰려면 Shift 키를 누른 상태로 클릭하세요." }, "toast": { - "success": "선택한 리뷰 항목과 관련된 동영상 파일이 성공적으로 삭제되었습니다.", + "success": "선택한 다시보기 항목과 연결된 영상이 성공적으로 삭제되었습니다.", "error": "삭제 실패: {{error}}" } }, "button": { "export": "내보내기", "markAsReviewed": "검토 완료로 표시", - "markAsUnreviewed": "검토 안 함 표시", + "markAsUnreviewed": "미검토 상태로 표시", "deleteNow": "지금 삭제" + }, + "shareTimestamp": { + "label": "타임스탬프 공유", + "title": "타임스탬프 공유", + "description": "현재 재생 위치가 포함된 URL을 공유하거나 특정 타임스탬프를 지정합니다. 이 URL은 공개 링크가 아니며 Frigate 및 해당 카메라 접근 권한이 있는 사용자만 접근할 수 있습니다.", + "custom": "사용자 지정 타임스탬프", + "button": "타임스탬프 URL 공유", + "shareTitle": "Frigate 다시보기 타임스탬프: {{camera}}" } }, "imagePicker": { "selectImage": "추적된 객체의 썸네일을 선택하세요", "unknownLabel": "저장된 트리거 이미지", "search": { - "placeholder": "레이블 또는 서브 레이블로 검색..." + "placeholder": "레이블 또는 하위 레이블로 검색..." }, - "noImages": "표시할 썸네일이 없습니다" + "noImages": "이 카메라에 등록된 썸네일이 없습니다" } } diff --git a/web/public/locales/ko/components/filter.json b/web/public/locales/ko/components/filter.json index e3f3e6ab12..7a57451705 100644 --- a/web/public/locales/ko/components/filter.json +++ b/web/public/locales/ko/components/filter.json @@ -1,7 +1,7 @@ { "filter": "필터", "labels": { - "label": "레이블", + "label": "레이블 (Labels)", "all": { "title": "모든 레이블", "short": "레이블" @@ -10,34 +10,131 @@ "count_other": "레이블 {{count}}개" }, "zones": { - "label": "구역", + "label": "구역 (Zones)", "all": { "title": "모든 구역", "short": "구역" } }, "dates": { - "selectPreset": "프리셋 선택…", + "selectPreset": "사전 설정 선택…", "all": { "title": "모든 날짜", "short": "날짜" } }, - "timeRange": "시간 구역", + "timeRange": "시간 범위", "subLabels": { - "label": "서브 레이블", - "all": "모든 서브 레이블" + "label": "하위 레이블", + "all": "모든 하위 레이블" }, - "more": "더 많은 필터", + "more": "추가 필터", "classes": { - "label": "분류", + "label": "분류 (Classes)", "all": { "title": "모든 분류" }, - "count_one": "{{count}}개 클래스", - "count_other": "{{count}}개 클래스" + "count_one": "분류 {{count}}개", + "count_other": "분류 {{count}}개" }, "reset": { - "label": "기본값으로 필터 초기화" + "label": "필터를 기본값으로 초기화" + }, + "attributes": { + "label": "분류 속성", + "all": "모든 속성" + }, + "score": "신뢰도 점수", + "estimatedSpeed": "예상 속도 ({{unit}})", + "features": { + "label": "특징", + "hasSnapshot": "스냅샷 있음", + "hasVideoClip": "비디오 클립 있음", + "submittedToFrigatePlus": { + "label": "Frigate+에 제출됨", + "tips": "먼저 스냅샷이 있는 추적 객체로 필터링해야 합니다.

스냅샷이 없는 추적 객체는 Frigate+에 제출할 수 없습니다." + } + }, + "sort": { + "label": "정렬", + "dateAsc": "날짜 (오름차순)", + "dateDesc": "날짜 (내림차순)", + "scoreAsc": "객체 점수 (오름차순)", + "scoreDesc": "객체 점수 (내림차순)", + "speedAsc": "예상 속도 (오름차순)", + "speedDesc": "예상 속도 (내림차순)", + "relevance": "관련성" + }, + "cameras": { + "label": "카메라 필터", + "all": { + "title": "모든 카메라", + "short": "카메라" + } + }, + "review": { + "showReviewed": "검토 완료된 항목 표시" + }, + "motion": { + "showMotionOnly": "움직임만 표시" + }, + "explore": { + "settings": { + "title": "설정", + "defaultView": { + "title": "기본 보기", + "desc": "선택된 필터가 없을 때 레이블별 가장 최근 추적 객체의 요약을 표시하거나 필터링되지 않은 격자(Grid)로 표시합니다.", + "summary": "요약 보기", + "unfilteredGrid": "전체 격자 보기" + }, + "gridColumns": { + "title": "격자 열 개수", + "desc": "격자 보기에서 표시할 열(Column) 개수를 선택하세요." + }, + "searchSource": { + "label": "검색 대상", + "desc": "추적된 객체의 썸네일 이미지로 검색할지 설명 텍스트로 검색할지 선택하세요.", + "options": { + "thumbnailImage": "썸네일 이미지", + "description": "설명" + } + } + }, + "date": { + "selectDateBy": { + "label": "필터링할 날짜 선택" + } + } + }, + "logSettings": { + "label": "로그 레벨 필터", + "filterBySeverity": "심각도별 로그 필터링", + "loading": { + "title": "로딩 중", + "desc": "로그 창을 맨 아래로 스크롤하면 새로운 로그가 추가될 때 자동으로 스트리밍됩니다." + }, + "disableLogStreaming": "로그 스트리밍 비활성화", + "allLogs": "모든 로그" + }, + "trackedObjectDelete": { + "title": "삭제 확인", + "desc": "이 {{objectLength}}개의 추적 객체를 삭제하면 스냅샷, 저장된 임베딩 및 연결된 모든 객체 수명주기 항목이 제거됩니다. 기록 보기의 녹화 영상은 삭제되지 않습니다.

정말로 계속 진행하시겠습니까?

이후 확인 창을 건너뛰려면 Shift 키를 누른 상태로 클릭하세요.", + "toast": { + "success": "추적 객체가 성공적으로 삭제되었습니다.", + "error": "추적 객체 삭제 실패: {{errorMessage}}" + } + }, + "zoneMask": { + "filterBy": "구역 마스크별 필터" + }, + "recognizedLicensePlates": { + "title": "인식된 차량 번호판", + "loadFailed": "인식된 번호판 목록을 불러오지 못했습니다.", + "loading": "인식된 번호판 목록 불러오는 중…", + "placeholder": "번호판 검색어 입력…", + "noLicensePlatesFound": "발견된 번호판이 없습니다.", + "selectPlatesFromList": "목록에서 하나 이상의 번호판을 선택하세요.", + "selectAll": "모두 선택", + "clearAll": "모두 지우기" } } diff --git a/web/public/locales/ko/components/icons.json b/web/public/locales/ko/components/icons.json index fb1b47c03e..84c45f6278 100644 --- a/web/public/locales/ko/components/icons.json +++ b/web/public/locales/ko/components/icons.json @@ -1,8 +1,8 @@ { "iconPicker": { - "selectIcon": "아이콘을 선택해주세요", + "selectIcon": "아이콘 선택", "search": { - "placeholder": "아이콘 검색 중…" + "placeholder": "아이콘 검색…" } } } diff --git a/web/public/locales/ko/components/player.json b/web/public/locales/ko/components/player.json index e6b1f0df06..544c46e2b6 100644 --- a/web/public/locales/ko/components/player.json +++ b/web/public/locales/ko/components/player.json @@ -2,7 +2,7 @@ "submitFrigatePlus": { "submit": "제출", "title": "이 프레임을 Frigate+에 제출하시겠습니까?", - "previewError": "스냅샷 미리보기를 불러올 수 없습니다. 현재 녹화된 영상을 사용할 수 없을 수 있습니다." + "previewError": "스냅샷 미리보기를 불러올 수 없습니다. 해당 시점의 녹화 영상을 사용할 수 없는 상태일 수 있습니다." }, "stats": { "bandwidth": { @@ -12,10 +12,10 @@ "latency": { "short": { "title": "지연", - "value": "{{seconds}} 초" + "value": "{{seconds}}초" }, - "title": "지연:", - "value": "{{seconds}} 초" + "title": "지연 시간:", + "value": "{{seconds}}초" }, "streamType": { "short": "종류", @@ -25,28 +25,29 @@ "droppedFrames": { "title": "손실 프레임:", "short": { - "title": "손실됨", - "value": "{{droppedFrames}} 프레임" + "title": "손실", + "value": "{{droppedFrames}}프레임" } }, - "decodedFrames": "복원된 프레임:", + "decodedFrames": "디코딩된 프레임:", "droppedFrameRate": "프레임 손실률:" }, - "noRecordingsFoundForThisTime": "이 시간대에는 녹화본이 없습니다", - "noPreviewFound": "미리 보기를 찾을 수 없습니다", - "noPreviewFoundFor": "{{cameraName}}에 미리보기를 찾을 수 없습니다", - "livePlayerRequiredIOSVersion": "이 라이브 스트림 방식은 iOS 17.1 이거나 높은 버전이 필요합니다.", + "noRecordingsFoundForThisTime": "해당 시간대에 저장된 녹화 영상이 없습니다", + "noPreviewFound": "미리보기를 찾을 수 없습니다", + "noPreviewFoundFor": "{{cameraName}} 카메라의 미리보기를 찾을 수 없습니다", + "livePlayerRequiredIOSVersion": "이 실시간 스트림 유형을 사용하려면 iOS 17.1 이상 버전이 필요합니다.", "streamOffline": { "title": "스트림 오프라인", - "desc": "{{cameraName}} 카메라에 감지(detect) 스트림의 프레임을 얻지 못했습니다. 에러 로그를 확인하세요" + "desc": "{{cameraName}} 카메라의 detect 스트림에서 수신된 프레임이 없습니다. 오류 로그를 확인하세요" }, "cameraDisabled": "카메라를 이용할 수 없습니다", "toast": { "success": { - "submittedFrigatePlus": "Frigate+에 프레임이 성공적으로 제출됐습니다" + "submittedFrigatePlus": "Frigate+에 프레임을 성공적으로 제출했습니다" }, "error": { - "submitFrigatePlusFailed": "Frigate+에 프레임을 보내지 못했습니다" + "submitFrigatePlusFailed": "Frigate+에 프레임을 제출하지 못했습니다" } - } + }, + "cameraOff": "카메라가 꺼져 있습니다" } diff --git a/web/public/locales/ko/config/cameras.json b/web/public/locales/ko/config/cameras.json index 2e5d533706..2aea3053bc 100644 --- a/web/public/locales/ko/config/cameras.json +++ b/web/public/locales/ko/config/cameras.json @@ -10,10 +10,10 @@ }, "enabled": { "label": "활성화됨", - "description": "활성화됨" + "description": "활성화 여부" }, "audio": { - "label": "오디오 이벤트", + "label": "오디오 감지", "description": "이 카메라의 오디오 기반 이벤트 감지 설정입니다.", "enabled": { "label": "오디오 감지 활성화", @@ -25,39 +25,932 @@ }, "min_volume": { "label": "최소 볼륨", - "description": "오디오 감지를 실행하는 데 필요한 최소 RMS 볼륨 임계값으로, 낮을수록 민감도가 높아집니다(예: 200 높음, 500 보통, 1000 낮음)." + "description": "오디오 감지를 실행하는 데 필요한 최소 RMS 볼륨 임계값입니다. 낮을수록 민감도가 높아집니다 (예: 200 높음, 500 보통, 1000 낮음)." }, "listen": { - "label": "청취 유형", - "description": "감지할 오디오 이벤트 유형 목록입니다(예: bark, fire_alarm, scream, speech, yell)." + "label": "감지 대상 소리", + "description": "감지할 오디오 이벤트 유형 목록입니다 (예: bark, fire_alarm, speech, yell)." }, "filters": { "label": "오디오 필터", - "description": "오탐지를 줄이기 위해 사용되는 신뢰도 임계값과 같은 오디오 유형별 필터 설정입니다." + "description": "오감지를 줄이기 위한 신뢰도 임계값 등 오디오 유형별 필터 설정입니다.", + "threshold": { + "label": "최소 오디오 신뢰도", + "description": "오디오 이벤트로 카운트되기 위한 최소 신뢰도 임계값입니다." + } }, "enabled_in_config": { - "label": "원래 오디오 상태" + "label": "초기 오디오 상태", + "description": "정적 설정 파일에서 오디오 감지가 기본 활성화되어 있었는지 여부를 나타냅니다." + }, + "num_threads": { + "label": "감지 스레드 수", + "description": "오디오 감지 처리에 사용할 스레드 수입니다." } }, "mqtt": { - "label": "MQTT" + "label": "MQTT", + "description": "MQTT 이미지 발행 설정입니다.", + "enabled": { + "label": "이미지 전송", + "description": "이 카메라의 객체 이미지 스냅샷을 MQTT 토픽으로 발행하도록 활성화합니다." + }, + "timestamp": { + "label": "타임스탬프 추가", + "description": "MQTT로 발행되는 이미지에 타임스탬프를 덧씌웁니다." + }, + "bounding_box": { + "label": "바운딩 박스 추가", + "description": "MQTT로 발행되는 이미지에 바운딩 박스를 그립니다." + }, + "crop": { + "label": "이미지 크롭", + "description": "MQTT로 발행되는 이미지를 감지된 객체의 바운딩 박스 크기로 잘라냅니다." + }, + "height": { + "label": "이미지 높이", + "description": "MQTT로 발행되는 이미지를 리사이즈할 높이(픽셀)입니다." + }, + "required_zones": { + "label": "필수 구역", + "description": "MQTT 이미지가 발행되기 위해 객체가 진입해야 하는 구역입니다." + }, + "quality": { + "label": "JPEG 품질", + "description": "MQTT로 발행되는 이미지의 JPEG 압축 품질입니다 (0~100)." + } }, "notifications": { "label": "알림", "enabled": { - "label": "알림 활성화" + "label": "알림 활성화", + "description": "이 카메라의 알림 기능을 활성화하거나 비활성화합니다." }, "email": { - "label": "알림 이메일", + "label": "알림 수신 이메일", "description": "푸시 알림에 사용되거나 특정 알림 제공업체에서 요구하는 이메일 주소입니다." }, "cooldown": { "label": "알림 재발송 대기 시간", - "description": "수신자에게 스팸 메일을 보내는 것을 방지하기 위해 알림 재발송 대기시간(초)을 설정합니다." + "description": "수신자에게 알림이 연속 도배되는 것을 방지하기 위한 대기 시간(초)입니다." }, "enabled_in_config": { - "label": "초기 알림 활성 상태", - "description": "초기 구성에서 알림이 활성화되었는지 여부를 나타냅니다." + "label": "초기 알림 상태", + "description": "초기 정적 구성에서 알림이 활성화되어 있었는지 여부를 나타냅니다." + }, + "description": "이 카메라의 알림을 활성화하고 제어하기 위한 설정입니다." + }, + "zones": { + "label": "구역 (Zones)", + "description": "프레임의 특정 영역을 정의하여 객체가 해당 영역 내에 있는지 여부를 판정할 수 있도록 합니다.", + "friendly_name": { + "label": "구역 별칭", + "description": "Frigate UI에 표시될 구역 이름입니다. 지정하지 않으면 구역 고유 식별자 이름이 사용됩니다." + }, + "enabled": { + "label": "활성화됨", + "description": "이 구역을 활성화하거나 비활성화합니다. 비활성화된 구역은 런타임에 무시됩니다." + }, + "enabled_in_config": { + "label": "구역의 초기 상태를 추적합니다." + }, + "filters": { + "label": "구역 필터", + "description": "이 구역 내의 객체에 적용할 필터입니다. 오탐지를 줄이거나 구역 내 진입으로 인정할 객체 조건을 제한하는 데 사용됩니다.", + "min_area": { + "label": "최소 객체 면적", + "description": "이 객체 유형에 필요한 최소 바운딩 박스 면적입니다. 픽셀 수(정수) 또는 비율(0.000001~0.99 사이의 실수)로 지정할 수 있습니다." + }, + "max_area": { + "label": "최대 객체 면적", + "description": "이 객체 유형에 허용되는 최대 바운딩 박스 면적입니다. 픽셀 수(정수) 또는 비율(0.000001~0.99 사이의 실수)로 지정할 수 있습니다." + }, + "min_ratio": { + "label": "최소 가로세로 비율", + "description": "바운딩 박스에 요구되는 최소 너비/높이 비율입니다." + }, + "max_ratio": { + "label": "최대 가로세로 비율", + "description": "바운딩 박스에 허용되는 최대 너비/높이 비율입니다." + }, + "threshold": { + "label": "신뢰도 임계값", + "description": "객체를 실제 탐지로 인정하기 위해 요구되는 평균 감지 신뢰도 임계값입니다." + }, + "min_score": { + "label": "최소 신뢰도", + "description": "객체로 카운트되기 위해 필요한 단일 프레임 최소 감지 신뢰도입니다." + }, + "mask": { + "label": "필터 마스크", + "description": "프레임 내에서 이 필터가 적용될 다각형 좌표입니다." + }, + "raw_mask": { + "label": "원시 마스크" + } + }, + "coordinates": { + "label": "좌표", + "description": "구역 영역을 정의하는 다각형 좌표입니다. 쉼표로 구분된 문자열 또는 좌표 문자열 목록일 수 있습니다. 좌표는 상대값(0~1) 또는 절대값(레거시)이어야 합니다." + }, + "distances": { + "label": "실제 거리", + "description": "속도 또는 거리 계산에 사용되는 구역 사각형 각 변의 실제 거리값(선택 사항)입니다. 설정할 경우 정확히 4개의 값이어야 합니다." + }, + "inertia": { + "label": "관성 프레임", + "description": "구역 내에 있는 것으로 인정하기 위해 객체가 연속으로 감지되어야 하는 프레임 수입니다. 순간적인 일시적 오탐을 걸러내는 데 유용합니다." + }, + "loitering_time": { + "label": "배회 감지 시간(초)", + "description": "객체가 구역 내에 머무르고 있는 것으로 간주할 시간(초)입니다. 배회 감지를 비활성화하려면 0으로 설정하세요." + }, + "speed_threshold": { + "label": "최소 이동 속도", + "description": "구역 내에 존재하는 것으로 인정되기 위해 객체에 요구되는 최소 속도(거리 설정 시 실제 단위 기준)입니다. 속도 기반 구역 트리거에 사용됩니다." + }, + "objects": { + "label": "트리거 대상 객체", + "description": "이 구역을 작동시킬 수 있는 객체 유형 목록(labelmap 기준)입니다. 비워 두면 모든 객체에 대해 작동합니다." } + }, + "audio_transcription": { + "label": "오디오 텍스트 변환 (STT)", + "description": "이벤트 및 실시간 자막 처리에 사용되는 실시간 음성 전사 설정입니다.", + "enabled": { + "label": "텍스트 변환 활성화", + "description": "수동으로 트리거된 오디오 이벤트의 텍스트 변환을 활성화하거나 비활성화합니다." + }, + "enabled_in_config": { + "label": "초기 텍스트 변환 상태" + }, + "live_enabled": { + "label": "실시간 텍스트 변환", + "description": "수신되는 오디오에 대한 실시간 스트리밍 텍스트 변환을 활성화합니다." + } + }, + "birdseye": { + "label": "버드아이 (Birdseye)", + "description": "여러 카메라 피드를 단일 레이아웃으로 합성하는 버드아이 뷰 설정입니다.", + "enabled": { + "label": "버드아이 활성화", + "description": "버드아이 뷰 기능을 활성화하거나 비활성화합니다." + }, + "mode": { + "label": "추적 모드", + "description": "카메라를 버드아이에 포함하는 기준 모드: 'objects', 'motion', 또는 'continuous'." + }, + "order": { + "label": "표시 순서", + "description": "버드아이 레이아웃 내에서 카메라 배치 순서를 제어하는 숫자입니다." + } + }, + "detect": { + "label": "객체 감지", + "description": "객체 감지를 실행하고 트래커를 초기화하는 데 사용되는 detect 역할 설정입니다.", + "enabled": { + "label": "객체 감지 활성화", + "description": "이 카메라의 객체 감지를 활성화하거나 비활성화합니다." + }, + "height": { + "label": "감지 높이", + "description": "감지 스트림에 사용할 프레임 높이(픽셀)입니다. 비워 두면 원본 스트림 해상도를 사용합니다." + }, + "width": { + "label": "감지 너비", + "description": "감지 스트림에 사용할 프레임 너비(픽셀)입니다. 비워 두면 원본 스트림 해상도를 사용합니다." + }, + "fps": { + "label": "감지 FPS", + "description": "감지를 실행할 목표 초당 프레임 수입니다. 낮을수록 CPU 사용량이 감소합니다 (권장값은 5이며, 매우 빠른 물체를 추적할 때만 최대 10까지 권장)." + }, + "min_initialized": { + "label": "최소 초기화 프레임", + "description": "추적 객체를 생성하기 전 연속 감지되어야 하는 프레임 수입니다. 값을 높이면 오탐 초기화를 줄일 수 있습니다 (기본값: fps / 2)." + }, + "max_disappeared": { + "label": "최대 사라짐 프레임", + "description": "추적 중인 객체가 시야에서 완전히 사라진 것으로 판단하기까지 감지되지 않는 프레임 수입니다." + }, + "stationary": { + "label": "정지 객체 설정", + "description": "일정 시간 정지해 있는 객체를 감지하고 관리하기 위한 설정입니다.", + "interval": { + "label": "정지 확인 주기", + "description": "정지 객체임을 재확인하기 위해 감지 검사를 실행하는 간격(프레임 단위)입니다." + }, + "threshold": { + "label": "정지 임계값", + "description": "객체를 정지 상태로 분류하기 위해 위치 이동이 없어야 하는 프레임 수입니다." + }, + "max_frames": { + "label": "최대 추적 프레임", + "description": "정지 객체를 폐기하기 전까지 추적할 최대 프레임 한도입니다.", + "default": { + "label": "기본 최대 프레임", + "description": "추적을 중단하기 전 정지 객체를 추적할 기본 최대 프레임 수입니다." + }, + "objects": { + "label": "객체별 최대 프레임", + "description": "정지 객체를 추적할 객체 유형별 최대 프레임 수 재정의 설정입니다." + } + }, + "classifier": { + "label": "시각적 분류기 활성화", + "description": "바운딩 박스가 미세하게 흔들려도 시각적 분류기를 사용해 실제로 정지된 객체인지 확인합니다." + } + }, + "annotation_offset": { + "label": "어노테이션 오프셋", + "description": "녹화 영상과 타임라인 바운딩 박스의 싱크를 맞추기 위해 감지 어노테이션을 전후로 이동할 밀리초(ms) 단위 시간입니다 (양수 또는 음수 가능)." + } + }, + "face_recognition": { + "label": "얼굴 인식", + "description": "이 카메라의 얼굴 감지 및 인식 설정입니다.", + "enabled": { + "label": "얼굴 인식 활성화", + "description": "얼굴 인식을 활성화하거나 비활성화합니다." + }, + "min_area": { + "label": "최소 얼굴 크기", + "description": "인식을 시도하기 위해 필요한 감지된 얼굴 박스의 최소 면적(픽셀)입니다." + } + }, + "ffmpeg": { + "label": "스트림 (FFmpeg)", + "description": "카메라 스트림 입력 및 바이너리 경로, 인수, 하드웨어 가속, 역할별 출력 인수를 포함한 FFmpeg 설정입니다.", + "path": { + "label": "FFmpeg 경로", + "description": "사용할 FFmpeg 바이너리 경로 또는 버전 별칭(\"7.0\" 또는 \"8.0\")입니다." + }, + "global_args": { + "label": "FFmpeg 글로벌 인수", + "description": "FFmpeg 프로세스 전역에 전달할 공통 인수입니다." + }, + "hwaccel_args": { + "label": "하드웨어 가속 인수", + "description": "FFmpeg 하드웨어 가속 인수입니다. 하드웨어 환경에 맞는 프리셋 사용을 권장합니다." + }, + "input_args": { + "label": "입력 인수", + "description": "FFmpeg 입력 스트림에 적용할 인수입니다." + }, + "output_args": { + "label": "출력 인수", + "description": "detect, record 등 서로 다른 FFmpeg 역할에 사용할 기본 출력 인수입니다.", + "detect": { + "label": "감지(detect) 출력 인수", + "description": "detect 역할 스트림에 적용할 기본 출력 인수입니다." + }, + "record": { + "label": "녹화(record) 출력 인수", + "description": "record 역할 스트림에 적용할 기본 출력 인수입니다." + } + }, + "retry_interval": { + "label": "FFmpeg 재연결 대기 시간", + "description": "카메라 스트림 연결 실패 시 재연결을 시도하기까지 대기할 시간(초)입니다 (기본값: 10)." + }, + "apple_compatibility": { + "label": "Apple 호환성", + "description": "H.265 녹화 시 Apple 기기 플레이어와의 호환성을 위해 HEVC 태깅을 활성화합니다." + }, + "gpu": { + "label": "GPU 인덱스", + "description": "하드웨어 가속에 사용할 기본 GPU 번호(인덱스)입니다." + }, + "inputs": { + "label": "카메라 입력 스트림", + "description": "이 카메라에 설정된 입력 스트림 정의(경로 및 역할) 목록입니다.", + "path": { + "label": "입력 경로", + "description": "카메라 입력 스트림 URL 또는 디바이스 경로입니다." + }, + "roles": { + "label": "입력 역할", + "description": "이 입력 스트림에 할당할 역할입니다." + }, + "global_args": { + "label": "FFmpeg 글로벌 인수", + "description": "이 입력 스트림에만 적용할 FFmpeg 글로벌 인수입니다." + }, + "hwaccel_args": { + "label": "하드웨어 가속 인수", + "description": "이 입력 스트림에만 적용할 하드웨어 가속 인수입니다." + }, + "input_args": { + "label": "입력 인수", + "description": "이 스트림에만 개별 적용할 입력 인수입니다." + } + } + }, + "live": { + "label": "실시간 재생", + "description": "웹 UI에서 실시간 스트림 선택, 해상도 및 화질을 제어하기 위한 설정입니다.", + "streams": { + "label": "실시간 스트림 이름", + "description": "실시간 재생에 사용할 restream/go2rtc 이름과 설정된 스트림 이름의 매핑입니다." + }, + "height": { + "label": "실시간 재생 높이", + "description": "웹 UI에서 jsmpeg 실시간 스트림을 렌더링할 높이(픽셀)입니다 (감지 스트림 높이 이하)." + }, + "quality": { + "label": "실시간 품질", + "description": "jsmpeg 스트림의 인코딩 품질입니다 (1 최고 품질, 31 최저 품질)." + } + }, + "lpr": { + "label": "차량 번호판 인식", + "description": "감지 임계값, 포맷, 등록된 번호판 등을 포함한 차량 번호판 인식 설정입니다.", + "enabled": { + "label": "LPR 활성화", + "description": "이 카메라에서 LPR 기능을 활성화하거나 비활성화합니다." + }, + "expire_time": { + "label": "만료 시간(초)", + "description": "시야에서 사라진 번호판이 트래커에서 만료되기까지의 시간(초)입니다 (전용 LPR 카메라 전용)." + }, + "min_area": { + "label": "최소 번호판 크기", + "description": "인식을 시도하기 위해 필요한 최소 번호판 면적(픽셀)입니다." + }, + "enhancement": { + "label": "이미지 보정 레벨", + "description": "OCR 수행 전 번호판 크롭 이미지에 적용할 보정 강도(0~10)입니다 (값이 높다고 항상 인식률이 좋아지지는 않으며, 5 초과는 야간 전용이므로 주의해야 합니다)." + } + }, + "motion": { + "label": "움직임 감지", + "description": "이 카메라의 기본 움직임 감지 설정입니다.", + "enabled": { + "label": "움직임 감지 활성화", + "description": "이 카메라의 움직임 감지를 활성화하거나 비활성화합니다." + }, + "threshold": { + "label": "움직임 임계값", + "description": "움직임 감지기가 사용하는 픽셀 차이 임계값입니다. 값이 클수록 민감도가 낮아집니다 (범위: 1~255)." + }, + "lightning_threshold": { + "label": "번개/빛 변화 임계값", + "description": "순간적인 조명 변화나 번개를 감지하여 무시하기 위한 임계값입니다 (낮을수록 민감하며 0.3~1.0 사이 값). 움직임 감지 자체를 완전히 끄는 것이 아니라 임계값을 초과할 때 추가 프레임 분석을 일시 중단하는 것이며, 이 동안에도 움직임 기반 녹화는 정상 생성됩니다." + }, + "skip_motion_threshold": { + "label": "움직임 건너뛰기 임계값", + "description": "0.0~1.0 사이로 설정 시 단일 프레임에서 이 비율 이상의 화면이 바뀌면 움직임 박스를 생성하지 않고 즉시 재보정합니다. 폭풍이나 번개 시 CPU를 절약하고 오탐을 줄일 수 있지만, PTZ 카메라 자동 추적과 같은 실제 이벤트를 놓칠 수 있습니다. 사용하지 않으려면 설정하지 마세요(None)." + }, + "improve_contrast": { + "label": "대비 향상", + "description": "움직임 분석 전 프레임 대비를 향상하여 감지 성능을 보조합니다." + }, + "contour_area": { + "label": "윤곽선 면적", + "description": "움직임 윤곽선으로 인정되기 위한 최소 픽셀 면적입니다." + }, + "delta_alpha": { + "label": "델타 알파", + "description": "움직임 계산 시 프레임 차분화에 사용할 알파 블렌딩 계수입니다." + }, + "frame_alpha": { + "label": "프레임 알파", + "description": "움직임 전처리용 프레임 블렌딩에 사용할 알파 값입니다." + }, + "frame_height": { + "label": "프레임 높이", + "description": "움직임 연산 시 프레임을 리사이즈할 높이(픽셀)입니다." + }, + "mask": { + "label": "마스크 좌표", + "description": "움직임 감지 영역을 포함하거나 제외하기 위해 다각형을 정의하는 정렬된 x,y 좌표입니다." + }, + "mqtt_off_delay": { + "label": "MQTT 꺼짐 지연", + "description": "마지막 움직임이 감지된 후 MQTT에 'off' 상태를 발행하기까지 대기할 시간(초)입니다." + }, + "enabled_in_config": { + "label": "초기 움직임 상태", + "description": "초기 정적 설정 파일에서 움직임 감지가 활성화되어 있었는지 여부를 나타냅니다." + }, + "raw_mask": { + "label": "원시 마스크" + } + }, + "objects": { + "label": "객체", + "description": "추적할 레이블 목록과 객체별 필터를 포함한 기본 객체 추적 설정입니다.", + "track": { + "label": "추적 대상 객체", + "description": "이 카메라에서 추적할 객체 레이블 목록입니다." + }, + "filters": { + "label": "객체 필터", + "description": "오탐지를 줄이기 위해 감지된 객체에 적용할 필터 설정(면적, 비율, 신뢰도)입니다.", + "min_area": { + "label": "최소 객체 면적", + "description": "이 객체 유형에 필요한 최소 바운딩 박스 면적입니다. 픽셀 수(정수) 또는 비율(0.000001~0.99 사이의 실수)로 지정할 수 있습니다." + }, + "max_area": { + "label": "최대 객체 면적", + "description": "이 객체 유형에 허용되는 최대 바운딩 박스 면적입니다. 픽셀 수(정수) 또는 비율(0.000001~0.99 사이의 실수)로 지정할 수 있습니다." + }, + "min_ratio": { + "label": "최소 가로세로 비율", + "description": "바운딩 박스에 요구되는 최소 너비/높이 비율입니다." + }, + "max_ratio": { + "label": "최대 가로세로 비율", + "description": "바운딩 박스에 허용되는 최대 너비/높이 비율입니다." + }, + "threshold": { + "label": "신뢰도 임계값", + "description": "객체를 실제 탐지로 인정하기 위해 요구되는 평균 감지 신뢰도 임계값입니다." + }, + "min_score": { + "label": "최소 신뢰도", + "description": "객체로 카운트되기 위해 필요한 단일 프레임 최소 감지 신뢰도입니다." + }, + "mask": { + "label": "필터 마스크", + "description": "프레임 내에서 이 필터가 적용될 다각형 좌표입니다." + }, + "raw_mask": { + "label": "원시 마스크" + } + }, + "mask": { + "label": "객체 마스크", + "description": "지정된 영역에서 객체 감지를 방지하기 위한 마스크 다각형입니다." + }, + "raw_mask": { + "label": "원시 마스크" + }, + "genai": { + "label": "생성형 AI (GenAI) 객체 설정", + "description": "추적된 객체를 설명하고 분석용 프레임을 전송하기 위한 GenAI 옵션입니다.", + "enabled": { + "label": "GenAI 활성화", + "description": "기본적으로 추적된 객체에 대한 GenAI 설명 생성을 활성화합니다." + }, + "use_snapshot": { + "label": "스냅샷 사용", + "description": "GenAI 설명 생성 시 썸네일 대신 객체 스냅샷을 사용합니다." + }, + "prompt": { + "label": "캡션 프롬프트", + "description": "GenAI로 설명을 생성할 때 사용할 기본 프롬프트 템플릿입니다." + }, + "object_prompts": { + "label": "객체별 프롬프트", + "description": "특정 레이블에 대한 GenAI 결과를 맞춤화하기 위한 객체별 개별 프롬프트입니다." + }, + "objects": { + "label": "GenAI 대상 객체", + "description": "기본적으로 GenAI로 전송할 객체 레이블 목록입니다." + }, + "required_zones": { + "label": "필수 구역", + "description": "GenAI 설명 생성 대상이 되기 위해 객체가 반드시 진입해야 하는 구역입니다." + }, + "debug_save_thumbnails": { + "label": "썸네일 저장", + "description": "디버깅 및 검토를 위해 GenAI로 전송된 썸네일을 저장합니다." + }, + "send_triggers": { + "label": "GenAI 전송 트리거", + "description": "프레임을 GenAI로 전송할 시점(추적 종료 시, 주요 업데이트 후 등)을 정의합니다.", + "tracked_object_end": { + "label": "종료 시 전송", + "description": "추적 객체의 동작이 종료되었을 때 GenAI에 요청을 보냅니다." + }, + "after_significant_updates": { + "label": "조기 GenAI 트리거", + "description": "추적 객체에 지정된 횟수만큼 주요 변화가 발생한 후 조기에 GenAI 요청을 보냅니다." + } + }, + "enabled_in_config": { + "label": "초기 GenAI 상태", + "description": "초기 정적 설정에서 GenAI가 활성화되었는지 여부를 나타냅니다." + } + } + }, + "record": { + "label": "녹화", + "description": "이 카메라의 녹화 및 보관 주기 설정입니다.", + "enabled": { + "label": "녹화 활성화", + "description": "이 카메라의 녹화를 활성화하거나 비활성화합니다." + }, + "expire_interval": { + "label": "녹화 파일 정리 주기", + "description": "만료된 녹화 세그먼트를 삭제하는 정리 작업 간격(분)입니다." + }, + "continuous": { + "label": "상시 녹화 보관", + "description": "객체 추적이나 움직임 여부와 상관없이 녹화본을 보관할 일수입니다. 알림이나 감지 이벤트만 보관하려면 0으로 설정하세요.", + "days": { + "label": "보관 일수", + "description": "녹화본 보관 일수입니다." + } + }, + "motion": { + "label": "움직임 녹화 보관", + "description": "추적 객체가 없더라도 움직임에 의해 트리거된 녹화본을 보관할 일수입니다. 알림이나 감지 이벤트만 보관하려면 0으로 설정하세요.", + "days": { + "label": "보관 일수", + "description": "녹화본 보관 일수입니다." + } + }, + "detections": { + "label": "감지 녹화 보관", + "description": "이벤트 전/후 버퍼 캡처 시간을 포함한 감지 이벤트의 녹화 보관 설정입니다.", + "pre_capture": { + "label": "사전 캡처 시간", + "description": "감지 이벤트 시작 전 녹화에 포함할 시간(초)입니다." + }, + "post_capture": { + "label": "사후 캡처 시간", + "description": "감지 이벤트 종료 후 녹화에 포함할 시간(초)입니다." + }, + "retain": { + "label": "이벤트 보관", + "description": "감지 이벤트 녹화본의 보관 설정입니다.", + "days": { + "label": "보관 일수", + "description": "감지 이벤트 녹화본을 보관할 일수입니다." + }, + "mode": { + "label": "보관 모드", + "description": "보관 모드: all(모든 구간 저장), motion(움직임이 있는 구간 저장), active_objects(활동 중인 객체가 있는 구간 저장)." + } + } + }, + "alerts": { + "label": "알림 녹화 보관", + "description": "이벤트 전/후 버퍼 캡처 시간을 포함한 알림 이벤트의 녹화 보관 설정입니다.", + "pre_capture": { + "label": "사전 캡처 시간", + "description": "알림 이벤트 시작 전 녹화에 포함할 시간(초)입니다." + }, + "post_capture": { + "label": "사후 캡처 시간", + "description": "알림 이벤트 종료 후 녹화에 포함할 시간(초)입니다." + }, + "retain": { + "label": "이벤트 보관", + "description": "알림 이벤트 녹화본의 보관 설정입니다.", + "days": { + "label": "보관 일수", + "description": "알림 이벤트 녹화본을 보관할 일수입니다." + }, + "mode": { + "label": "보관 모드", + "description": "보관 모드: all(모든 구간 저장), motion(움직임이 있는 구간 저장), active_objects(활동 중인 객체가 있는 구간 저장)." + } + } + }, + "export": { + "label": "내보내기 설정", + "description": "타임랩스 및 하드웨어 가속 등 녹화본 내보내기 시 적용할 설정입니다.", + "hwaccel_args": { + "label": "내보내기 하드웨어 가속 인수", + "description": "내보내기 및 트랜스코딩 작업에 사용할 하드웨어 가속 인수입니다." + }, + "max_concurrent": { + "label": "최대 동시 내보내기 수", + "description": "동시에 처리할 수 있는 최대 내보내기 작업 수입니다." + }, + "chapters": { + "label": "내보낸 녹화 영상에 삽입할 챕터 메타데이터" + } + }, + "preview": { + "label": "미리보기 설정", + "description": "UI에 표시되는 녹화 미리보기의 화질을 제어하는 설정입니다.", + "quality": { + "label": "미리보기 화질", + "description": "미리보기 화질 레벨 (very_low, low, medium, high, very_high)." + } + }, + "enabled_in_config": { + "label": "초기 녹화 상태", + "description": "초기 정적 구성에서 녹화가 활성화되어 있었는지 여부를 나타냅니다." + } + }, + "review": { + "label": "다시보기", + "description": "UI 및 저장소에서 사용하는 알림, 감지 및 GenAI 요약을 제어하는 설정입니다.", + "alerts": { + "label": "알림 설정", + "description": "어떤 추적 객체가 알림을 생성하고 알림을 어떻게 보관할지 결정하는 설정입니다.", + "enabled": { + "label": "알림 활성화", + "description": "이 카메라의 알림 생성을 활성화하거나 비활성화합니다." + }, + "labels": { + "label": "알림 대상 레이블", + "description": "알림을 트리거할 객체 레이블 목록입니다 (예: car, person)." + }, + "required_zones": { + "label": "필수 구역", + "description": "알림으로 분류되기 위해 객체가 진입해야 하는 구역입니다. 모든 구역을 허용하려면 비워 두세요." + }, + "enabled_in_config": { + "label": "초기 알림 상태", + "description": "정적 설정에서 알림이 원래 활성화되어 있었는지 여부를 추적합니다." + }, + "cutoff_time": { + "label": "알림 종료 대기 시간", + "description": "알림 유발 활동이 멈춘 후 알림을 공식 종료하기까지 대기할 시간(초)입니다." + } + }, + "detections": { + "label": "감지 이벤트 설정", + "description": "어떤 추적 객체가 일반 감지(알림 제외) 이벤트를 생성하고 어떻게 보관할지 결정하는 설정입니다.", + "enabled": { + "label": "감지 이벤트 활성화", + "description": "이 카메라의 감지 이벤트를 활성화하거나 비활성화합니다." + }, + "labels": { + "label": "감지 대상 레이블", + "description": "일반 감지 이벤트로 인정할 객체 레이블 목록입니다." + }, + "required_zones": { + "label": "필수 구역", + "description": "감지 이벤트로 처리되기 위해 객체가 진입해야 하는 구역입니다. 모든 구역을 허용하려면 비워 두세요." + }, + "cutoff_time": { + "label": "감지 종료 대기 시간", + "description": "감지 유발 활동이 멈춘 후 이벤트를 공식 종료하기까지 대기할 시간(초)입니다." + }, + "enabled_in_config": { + "label": "초기 감지 상태", + "description": "정적 설정에서 감지 이벤트가 원래 활성화되어 있었는지 여부를 추적합니다." + } + }, + "genai": { + "label": "GenAI 다시보기 설정", + "description": "다시보기 항목의 설명과 요약을 생성하기 위한 생성형 AI 사용을 제어합니다.", + "enabled": { + "label": "GenAI 설명 활성화", + "description": "다시보기 항목에 대한 GenAI 기반 설명 및 요약 생성을 활성화하거나 비활성화합니다." + }, + "alerts": { + "label": "알림에 GenAI 활성화", + "description": "알림 항목에 대해 GenAI로 설명을 생성합니다." + }, + "detections": { + "label": "감지에 GenAI 활성화", + "description": "감지 항목에 대해 GenAI로 설명을 생성합니다." + }, + "image_source": { + "label": "다시보기 이미지 소스", + "description": "GenAI로 전송할 이미지 소스 ('preview' 또는 'recordings'). 'recordings'는 화질이 더 높지만 토큰 사용량이 증가합니다." + }, + "additional_concerns": { + "label": "추가 주의 사항", + "description": "이 카메라의 활동을 평가할 때 GenAI가 고려해야 할 추가 주의 사항이나 참고 사항 목록입니다." + }, + "debug_save_thumbnails": { + "label": "썸네일 저장", + "description": "디버깅 및 검토를 위해 GenAI 제공업체로 전송된 썸네일을 저장합니다." + }, + "enabled_in_config": { + "label": "초기 GenAI 상태", + "description": "정적 설정에서 GenAI 다시보기가 원래 활성화되어 있었는지 여부를 추적합니다." + }, + "preferred_language": { + "label": "선호 언어", + "description": "GenAI가 생성할 응답에 요청할 선호 언어입니다." + }, + "activity_context_prompt": { + "label": "활동 맥락 프롬프트", + "description": "GenAI 요약에 맥락을 제공하기 위해 어떤 활동이 의심스럽거나 정상적인지 설명하는 커스텀 프롬프트입니다." + } + } + }, + "semantic_search": { + "label": "시맨틱(의미 기반) 검색", + "description": "유사한 항목을 찾기 위해 객체 임베딩을 구축하고 쿼리하는 시맨틱 검색 설정입니다.", + "triggers": { + "label": "트리거", + "description": "카메라별 시맨틱 검색 트리거를 위한 동작 및 매칭 기준입니다.", + "friendly_name": { + "label": "트리거 별칭", + "description": "UI에 표시될 이 트리거의 친숙한 이름(선택 사항)입니다." + }, + "enabled": { + "label": "트리거 활성화", + "description": "이 시맨틱 검색 트리거를 활성화하거나 비활성화합니다." + }, + "type": { + "label": "트리거 유형", + "description": "트리거 유형: 'thumbnail'(이미지 비교) 또는 'description'(텍스트 비교)." + }, + "data": { + "label": "트리거 내용", + "description": "추적 객체와 매칭할 텍스트 문구 또는 썸네일 ID입니다." + }, + "threshold": { + "label": "트리거 임계값", + "description": "이 트리거를 작동시키기 위해 요구되는 최소 유사도 점수(0~1)입니다." + }, + "actions": { + "label": "트리거 동작", + "description": "트리거가 매칭되었을 때 실행할 동작 목록입니다 (notification, sub_label, attribute)." + } + } + }, + "snapshots": { + "label": "스냅샷", + "description": "이 카메라에서 API로 생성되는 추적 객체 스냅샷 설정입니다.", + "enabled": { + "label": "스냅샷 활성화", + "description": "이 카메라의 스냅샷 저장을 활성화하거나 비활성화합니다." + }, + "timestamp": { + "label": "타임스탬프 오버레이", + "description": "API 스냅샷에 타임스탬프를 덧씌워 표시합니다." + }, + "bounding_box": { + "label": "바운딩 박스 오버레이", + "description": "API 스냅샷에 추적 객체의 바운딩 박스를 그립니다." + }, + "crop": { + "label": "스냅샷 크롭", + "description": "API 스냅샷을 감지된 객체의 바운딩 박스 크기로 잘라냅니다." + }, + "required_zones": { + "label": "필수 구역", + "description": "스냅샷을 저장하기 위해 객체가 반드시 진입해야 하는 구역입니다." + }, + "height": { + "label": "스냅샷 높이", + "description": "API 스냅샷을 리사이즈할 높이(픽셀)입니다. 비워 두면 원본 크기를 유지합니다." + }, + "retain": { + "label": "스냅샷 보관", + "description": "기본 보관 일수 및 객체별 재정의를 포함한 스냅샷 보관 설정입니다.", + "default": { + "label": "기본 보관 일수", + "description": "스냅샷을 보관할 기본 일수입니다." + }, + "objects": { + "label": "객체별 보관 일수", + "description": "스냅샷 보관 일수를 객체 유형별로 개별 재정의합니다." + } + }, + "quality": { + "label": "스냅샷 화질", + "description": "저장할 스냅샷의 인코딩 품질입니다 (0~100)." + } + }, + "timestamp_style": { + "label": "타임스탬프 스타일", + "description": "스냅샷 및 디버그 뷰에 적용되는 타임스탬프 텍스트 스타일 옵션입니다.", + "position": { + "label": "타임스탬프 위치", + "description": "이미지 내 타임스탬프 위치 (tl: 좌상단, tr: 우상단, bl: 좌하단, br: 우하단)." + }, + "format": { + "label": "타임스탬프 형식", + "description": "타임스탬프 표시에 사용할 날짜/시간 형식 문자열입니다 (Python datetime 포맷 코드)." + }, + "color": { + "label": "타임스탬프 색상", + "description": "타임스탬프 텍스트의 RGB 색상값입니다 (모든 값은 0~255).", + "red": { + "label": "빨강 (Red)", + "description": "타임스탬프 색상의 빨간색 성분 (0-255)." + }, + "green": { + "label": "초록 (Green)", + "description": "타임스탬프 색상의 초록색 성분 (0-255)." + }, + "blue": { + "label": "파랑 (Blue)", + "description": "타임스탬프 색상의 파란색 성분 (0-255)." + } + }, + "thickness": { + "label": "타임스탬프 두께", + "description": "타임스탬프 글자의 선 두께입니다." + }, + "effect": { + "label": "타임스탬프 효과", + "description": "타임스탬프 텍스트에 적용할 시각 효과입니다 (none, solid, shadow)." + } + }, + "best_image_timeout": { + "label": "최적 이미지 대기 시간", + "description": "가장 높은 신뢰도 점수를 가진 최적 이미지를 선별하기 위해 대기할 시간입니다." + }, + "onvif": { + "label": "ONVIF", + "description": "이 카메라의 ONVIF 연결 및 PTZ 자동 추적 설정입니다.", + "host": { + "label": "ONVIF 호스트", + "description": "이 카메라의 ONVIF 서비스 호스트 주소(및 선택적 프로토콜 스키마)입니다." + }, + "port": { + "label": "ONVIF 포트", + "description": "ONVIF 서비스 포트 번호입니다." + }, + "user": { + "label": "ONVIF 사용자 이름", + "description": "ONVIF 인증에 사용할 사용자 이름입니다 (일부 기기는 관리자 계정이 필요함)." + }, + "password": { + "label": "ONVIF 비밀번호", + "description": "ONVIF 인증 비밀번호입니다." + }, + "tls_insecure": { + "label": "TLS 검증 비활성화", + "description": "ONVIF 통신 시 TLS 인증서 검증을 건너뛰고 Digest 인증을 끕니다 (안전하지 않으므로 신뢰할 수 있는 네트워크에서만 사용하세요)." + }, + "profile": { + "label": "ONVIF 프로필", + "description": "PTZ 제어에 사용할 특정 ONVIF 미디어 프로필의 토큰 또는 이름입니다. 지정하지 않으면 유효한 PTZ 구성이 있는 첫 번째 프로필이 자동 선택됩니다." + }, + "autotracking": { + "label": "자동 추적 (Autotracking)", + "description": "PTZ 카메라를 움직여 움직이는 객체를 프레임 중앙에 자동으로 추적하고 유지합니다.", + "enabled": { + "label": "자동 추적 활성화", + "description": "감지된 객체에 대한 PTZ 카메라의 자동 추적을 활성화하거나 비활성화합니다." + }, + "calibrate_on_startup": { + "label": "시작 시 모터 캘리브레이션", + "description": "추적 정확도를 향상하기 위해 부팅 시 PTZ 모터 속도를 측정합니다. 보정 완료 후 Frigate가 movement_weights 값을 자동으로 업데이트합니다." + }, + "zooming": { + "label": "줌 모드", + "description": "줌 동작 제어: disabled(팬/틸트만 사용), absolute(가장 안정적인 호환성), relative(팬/틸트/줌 동시 작동)." + }, + "zoom_factor": { + "label": "줌 배율", + "description": "추적 중인 객체의 확대 수준을 제어합니다. 값이 낮으면 주변 시야를 넓게 유지하고, 높으면 대상을 가깝게 확대하지만 추적을 놓칠 위험이 있습니다 (0.1~0.75 사이 값)." + }, + "track": { + "label": "추적 대상 객체", + "description": "자동 추적을 작동시킬 객체 유형 목록입니다." + }, + "required_zones": { + "label": "필수 구역", + "description": "자동 추적이 시작되기 위해 객체가 먼저 진입해야 하는 구역입니다." + }, + "return_preset": { + "label": "복귀 프리셋", + "description": "추적이 끝난 후 카메라가 돌아갈 펌웨어상의 ONVIF 프리셋 이름입니다." + }, + "timeout": { + "label": "복귀 대기 시간", + "description": "객체를 놓친 후 카메라가 프리셋 위치로 복귀하기까지 대기할 시간(초)입니다." + }, + "movement_weights": { + "label": "이동 가중치", + "description": "카메라 캘리브레이션을 통해 자동 생성된 보정값입니다. 수동으로 수정하지 마세요." + }, + "enabled_in_config": { + "label": "초기 자동 추적 상태", + "description": "설정에서 자동 추적이 활성화되어 있었는지 여부를 추적하는 내부 필드입니다." + } + }, + "ignore_time_mismatch": { + "label": "시간 불일치 무시", + "description": "ONVIF 통신 시 카메라와 Frigate 서버 간의 시간 동기화 차이를 무시합니다." + } + }, + "type": { + "label": "카메라 유형", + "description": "카메라 유형" + }, + "ui": { + "label": "카메라 UI", + "description": "UI에서 이 카메라의 표시 순서와 가시성을 제어합니다. 순서는 기본 대시보드에 영향을 미칩니다. 더 세부적인 설정은 카메라 그룹을 사용하세요.", + "order": { + "label": "UI 순서", + "description": "기본 대시보드 및 목록에서 카메라를 정렬하는 데 사용되는 숫자 순서입니다 (큰 숫자일수록 뒤에 표시됨)." + }, + "dashboard": { + "label": "실시간 대시보드에 표시", + "description": "기본 '모든 카메라' 실시간 대시보드에 이 카메라를 표시할지 여부를 전환합니다. 비활성화해도 카메라 그룹이나 설정 등 UI의 다른 곳에서는 계속 접근할 수 있습니다." + }, + "review": { + "label": "다시보기에 표시", + "description": "다시보기 페이지(카메라 필터, 모션 검토 및 기록 뷰 포함)에서 이 카메라를 표시할지 여부를 전환합니다." + } + }, + "webui_url": { + "label": "카메라 관리 URL", + "description": "시스템 페이지에서 카메라 웹 관리 페이지로 바로 연결되는 URL입니다" + }, + "profiles": { + "label": "프로필", + "description": "런타임 중에 활성화할 수 있는 부분 재정의를 포함한 명명된 설정 프로필입니다." + }, + "enabled_in_config": { + "label": "초기 카메라 상태", + "description": "카메라의 원래 구성 상태를 추적합니다." } } diff --git a/web/public/locales/ko/config/global.json b/web/public/locales/ko/config/global.json index 95fa0b1a6d..58e5e5b412 100644 --- a/web/public/locales/ko/config/global.json +++ b/web/public/locales/ko/config/global.json @@ -1,32 +1,33 @@ { "version": { "label": "현재 설정 버전", - "description": "마이그레이션 및 데이터 형식 변경 확인을 위한 현재 설정의 버전 정보(숫자 또는 문자열)입니다." + "description": "마이그레이션 또는 형식 변경을 감지하기 위한 현재 활성 설정의 버전(숫자 또는 문자열)입니다." }, "safe_mode": { "label": "안전 모드", - "description": "활성화하면 문제 해결을 위해 기능이 제한된 안전 모드로 Frigate를 시작합니다." + "description": "활성화하면 문제 해결을 위해 기능을 축소한 안전 모드로 Frigate를 시작합니다." }, "environment_vars": { "label": "환경 변수", - "description": "Home Assistant OS에서 Frigate 프로세스에 설정할 환경 변수의 키/값 쌍입니다. HAOS가 아닌 사용자는 대신 Docker 환경 변수 설정을 사용해야 합니다." + "description": "Home Assistant OS에서 Frigate 프로세스에 적용할 환경 변수의 키/값 쌍입니다. 비-HAOS 사용자는 Docker 환경 변수 설정을 사용해야 합니다." }, "logger": { "label": "로깅", - "description": "기본 로그 상세 수준 및 구성 요소별 로그 수준 재정의를 제어합니다.", + "description": "기본 로그 상세도 및 구성 요소별 로그 수준 재정의를 제어합니다.", "default": { "label": "로그 수준", - "description": "기본 전역 로그 상세 수준(debug, info, warning, error)입니다." + "description": "전역 기본 로그 수준(debug, info, warning, error)입니다." }, "logs": { "label": "프로세스별 로그 수준", - "description": "특정 모듈의 상세 수준을 높이거나 낮추기 위한 구성 요소별 로그 수준 재정의입니다." + "description": "특정 모듈의 로그 상세도를 높이거나 낮추기 위한 구성 요소별 로그 수준 재정의입니다." } }, "audio": { - "label": "오디오 이벤트", + "label": "오디오 감지", "enabled": { - "label": "오디오 감지 활성화" + "label": "오디오 감지 활성화", + "description": "모든 카메라의 오디오 이벤트 감지를 활성화하거나 비활성화합니다. 카메라별로 재정의할 수 있습니다." }, "max_not_heard": { "label": "종료 타임아웃", @@ -34,19 +35,29 @@ }, "min_volume": { "label": "최소 볼륨", - "description": "오디오 감지를 실행하는 데 필요한 최소 RMS 볼륨 임계값으로, 낮을수록 민감도가 높아집니다(예: 200 높음, 500 보통, 1000 낮음)." + "description": "오디오 감지를 실행하는 데 필요한 최소 RMS 볼륨 임계값입니다. 낮을수록 민감도가 높아집니다 (예: 200 높음, 500 보통, 1000 낮음)." }, "listen": { - "label": "청취 유형", - "description": "감지할 오디오 이벤트 유형 목록입니다(예: bark, fire_alarm, scream, speech, yell)." + "label": "감지 대상 소리", + "description": "감지할 오디오 이벤트 유형 목록입니다 (예: bark, fire_alarm, speech, yell)." }, "filters": { "label": "오디오 필터", - "description": "오탐지를 줄이기 위해 사용되는 신뢰도 임계값과 같은 오디오 유형별 필터 설정입니다." + "description": "오감지를 줄이기 위한 신뢰도 임계값 등 오디오 유형별 필터 설정입니다.", + "threshold": { + "label": "최소 오디오 신뢰도", + "description": "오디오 이벤트로 카운트되기 위한 최소 신뢰도 임계값입니다." + } }, "enabled_in_config": { - "label": "원래 오디오 상태" - } + "label": "초기 오디오 상태", + "description": "정적 설정 파일에서 오디오 감지가 기본 활성화되어 있었는지 여부를 나타냅니다." + }, + "num_threads": { + "label": "감지 스레드 수", + "description": "오디오 감지 처리에 사용할 스레드 수입니다." + }, + "description": "모든 카메라에 대한 오디오 기반 이벤트 감지 설정입니다. 카메라별로 재정의할 수 있습니다." }, "auth": { "label": "인증", @@ -56,7 +67,7 @@ "description": "Frigate UI에 대한 기본 인증을 활성화합니다." }, "reset_admin_password": { - "label": "관리자 비밀번호 재설정", + "label": "관리자 비밀번호 초기화", "description": "true로 설정하면 시작 시 관리자 비밀번호를 재설정하고 새 비밀번호를 로그에 출력합니다." }, "cookie_name": { @@ -64,41 +75,41 @@ "description": "자체 인증용 JWT 토큰을 저장할 쿠키 이름입니다." }, "cookie_secure": { - "label": "보안 쿠키 설정", - "description": "인증 쿠키에 보안 플래그를 설정합니다. TLS를 사용하는 경우 'True'로 설정해야 합니다." + "label": "보안 쿠키 플래그", + "description": "인증 쿠키에 보안 플래그를 설정합니다. TLS 사용 시 true여야 합니다." }, "session_length": { - "label": "세션 길이", - "description": "JWT 기반 세션의 유지 시간(초)입니다." + "label": "세션 유지 시간", + "description": "JWT 기반 세션의 지속 시간(초)입니다." }, "refresh_time": { "label": "세션 갱신 주기", - "description": "세션 만료까지 남은 시간이 몇 초 남지 않을 경우, 세션 시간을 다시 최대로 연장합니다." + "description": "세션 만료까지 남은 시간이 이 값(초) 이내일 때 세션을 전체 시간으로 다시 갱신합니다." }, "failed_login_rate_limit": { "label": "로그인 실패 제한", - "description": "무차별 대입 공격을 줄이기 위해 로그인 시도 실패 횟수를 제한하는 규칙을 적용합니다." + "description": "무차별 대입 공격을 완화하기 위한 로그인 실패 속도 제한 규칙입니다." }, "trusted_proxies": { "label": "신뢰할 수 있는 프록시", - "description": "속도 제한을 위해 클라이언트 IP를 결정할 때 사용되는 신뢰할 수 있는 프록시 IP 목록입니다." + "description": "속도 제한을 위해 클라이언트 IP를 결정할 때 참조하는 신뢰할 수 있는 프록시 IP 목록입니다." }, "hash_iterations": { "label": "해시 반복 횟수", - "description": "사용자 암호를 해싱할 때 사용할 PBKDF2-SHA256 반복 횟수입니다." + "description": "사용자 비밀번호를 해싱할 때 사용할 PBKDF2-SHA256 반복 횟수입니다." }, "roles": { - "label": "역할 할당", - "description": "역할별로 접근 가능한 카메라 목록을 매핑합니다. 목록이 비어 있으면 해당 역할에 모든 카메라 접근 권한을 부여합니다." + "label": "역할 매핑", + "description": "역할별로 접근 가능한 카메라 목록을 매핑합니다. 빈 목록은 해당 역할에 모든 카메라 접근을 허용함을 의미합니다." }, "admin_first_time_login": { - "label": "관리자 초기 로그인 설정", - "description": "활성화 시, 관리자 비밀번호 초기화 후 로그인 방법 안내 링크가 로그인 페이지에 표시됩니다. " + "label": "관리자 초기 로그인 플래그", + "description": "true일 경우 관리자 비밀번호 재설정 후 로그인 페이지에 접속 안내 링크를 표시합니다. " } }, "database": { "label": "데이터베이스", - "description": "추적된 객체 및 녹화 메타데이터를 저장하는 SQLite 데이터베이스 설정입니다.", + "description": "추적 객체 및 녹화 메타데이터를 저장하는 Frigate의 SQLite 데이터베이스 설정입니다.", "path": { "label": "데이터베이스 경로", "description": "Frigate SQLite 데이터베이스 파일이 저장될 파일 시스템 경로입니다." @@ -106,14 +117,14 @@ }, "go2rtc": { "label": "go2rtc", - "description": "라이브 스트림 중계 및 번역에 사용되는 통합 go2rtc 리스트리밍 서비스 설정입니다." + "description": "실시간 스트림 중계 및 트랜스코딩에 사용되는 통합 go2rtc 재스트리밍 서비스 설정입니다." }, "mqtt": { "label": "MQTT", - "description": "MQTT 브로커에 원격 측정 데이터, 스냅샷 및 이벤트 세부 정보를 연결하고 게시하기 위한 설정입니다.", + "description": "MQTT 브로커에 텔레메트리 데이터, 스냅샷 및 이벤트 세부 정보를 전송하기 위한 연결 설정입니다.", "enabled": { "label": "MQTT 활성화", - "description": "상태, 이벤트 및 스냅샷에 대한 MQTT 통합을 활성화 또는 비활성화합니다." + "description": "상태, 이벤트 및 스냅샷에 대한 MQTT 통합을 활성화하거나 비활성화합니다." }, "host": { "label": "MQTT 호스트", @@ -121,35 +132,35 @@ }, "port": { "label": "MQTT 포트", - "description": "MQTT 브로커의 포트 번호입니다 (일반적인 포트는 1883입니다)." + "description": "MQTT 브로커 포트 번호입니다 (일반 텍스트의 경우 기본값 1883)." }, "topic_prefix": { "label": "토픽 접두사", - "description": "Frigate의 모든 MQTT 메시지에 사용할 접두사입니다. 여러 대의 Frigate를 실행하는 경우 각각 고유한 이름을 사용해야 합니다." + "description": "Frigate의 모든 토픽에 사용할 기본 접두사입니다. 다중 인스턴스 실행 시 고유해야 합니다." }, "client_id": { "label": "클라이언트 ID", - "description": "MQTT 브로커 연결 시 사용하는 클라이언트 식별자입니다. 인스턴스마다 고유한 이름을 사용해야 합니다." + "description": "MQTT 브로커 연결 시 사용할 클라이언트 식별자입니다. 인스턴스별로 고유해야 합니다." }, "stats_interval": { - "label": "통계 간격", - "description": "시스템 및 카메라 통계 정보를 MQTT로 전송하는 간격(초)입니다." + "label": "통계 전송 간격", + "description": "시스템 및 카메라 통계를 MQTT로 발행하는 주기(초)입니다." }, "user": { "label": "MQTT 사용자 이름", - "description": "MQTT 사용자 이름(선택 사항)입니다. 환경 변수나 비밀 값(Secrets)을 통해 입력할 수 있습니다." + "description": "선택적 MQTT 사용자 이름입니다. 환경 변수나 Secret을 통해 전달할 수 있습니다." }, "password": { "label": "MQTT 비밀번호", - "description": "MQTT 비밀번호(선택 사항)입니다. 환경 변수나 비밀 값(Secrets)을 통해 입력할 수 있습니다." + "description": "선택적 MQTT 비밀번호입니다. 환경 변수나 Secret을 통해 전달할 수 있습니다." }, "tls_ca_certs": { "label": "TLS CA 인증서", - "description": "브로커와의 TLS 연결에 사용할 CA 인증서 경로(자체 서명 인증서의 경우)." + "description": "브로커와의 TLS 연결에 사용할 CA 인증서 경로(자체 서명 인증서 등)입니다." }, "tls_client_cert": { "label": "클라이언트 인증서", - "description": "TLS 상호 인증을 위한 클라이언트 인증서 경로입니다. 클라이언트 인증서를 사용할 때는 사용자 이름/암호를 설정하지 마십시오." + "description": "TLS 상호 인증(mTLS)을 위한 클라이언트 인증서 경로입니다. 사용 시 사용자 이름/비밀번호를 설정하지 마세요." }, "tls_client_key": { "label": "클라이언트 키", @@ -157,43 +168,1447 @@ }, "tls_insecure": { "label": "TLS 비보안 모드", - "description": "호스트 이름 확인을 건너뛰어 안전하지 않은 TLS 연결을 허용합니다(권장하지 않음)." + "description": "호스트 이름 확인을 건너뛰어 안전하지 않은 TLS 연결을 허용합니다 (권장되지 않음)." }, "qos": { "label": "MQTT QoS", - "description": "MQTT 메시지 전송 및 구독에 대한 서비스 품질(QoS) 등급입니다 (0, 1, 2 중 선택)." + "description": "MQTT 발행/구독에 사용할 서비스 품질(QoS) 등급 (0, 1, 2)입니다." } }, "notifications": { "label": "알림", - "description": "모든 카메라에 대한 알림을 활성화하고 제어하는 설정입니다. 카메라별로 설정을 재정의할 수 있습니다.", + "description": "모든 카메라에 대한 알림을 활성화하고 제어하기 위한 설정입니다. 카메라별로 재정의할 수 있습니다.", "enabled": { "label": "알림 활성화", - "description": "모든 카메라에 대한 알림을 활성화 또는 비활성화할 수 있으며, 카메라별로 설정을 재정의할 수 있습니다." + "description": "모든 카메라의 알림을 활성화하거나 비활성화합니다. 카메라별로 재정의할 수 있습니다." }, "email": { - "label": "알림 이메일", + "label": "알림 수신 이메일", "description": "푸시 알림에 사용되거나 특정 알림 제공업체에서 요구하는 이메일 주소입니다." }, "cooldown": { "label": "알림 재발송 대기 시간", - "description": "수신자에게 스팸 메일을 보내는 것을 방지하기 위해 알림 재발송 대기시간(초)을 설정합니다." + "description": "수신자에게 알림이 연속 도배되는 것을 방지하기 위한 대기 시간(초)입니다." }, "enabled_in_config": { - "label": "초기 알림 활성 상태", - "description": "초기 구성에서 알림이 활성화되었는지 여부를 나타냅니다." + "label": "초기 알림 상태", + "description": "초기 정적 구성에서 알림이 활성화되어 있었는지 여부를 나타냅니다." } }, "networking": { "label": "네트워킹", - "description": "Frigate 엔드포인트에 대한 IPv6 활성화와 같은 네트워크 관련 설정입니다.", + "description": "Frigate 엔드포인트의 IPv6 활성화 등 네트워크 관련 설정입니다.", "ipv6": { "label": "IPv6 구성", - "description": "Frigate 네트워크 서비스에 대한 IPv6 관련 설정입니다.", + "description": "Frigate 네트워크 서비스의 IPv6 관련 설정입니다.", "enabled": { "label": "IPv6 활성화", - "description": "Frigate 서비스(API 및 UI)에 IPv6 지원이 필요한 경우 활성화하십시오." + "description": "지원 가능한 Frigate 서비스(API 및 UI)에 IPv6 지원을 활성화합니다." } + }, + "listen": { + "label": "리스닝 포트 구성", + "description": "내부 및 외부 리스닝 포트 설정입니다. 고급 사용자용 기능이며, 일반적인 환경에서는 Docker Compose의 포트 설정을 변경하는 것을 권장합니다.", + "internal": { + "label": "내부 포트", + "description": "Frigate의 내부 리스닝 포트입니다 (기본값: 5000)." + }, + "external": { + "label": "외부 포트", + "description": "Frigate의 외부 리스닝 포트입니다 (기본값: 8971)." + } + } + }, + "audio_transcription": { + "label": "오디오 텍스트 변환 (STT)", + "description": "이벤트 및 실시간 자막 처리에 사용되는 실시간 음성 전사 설정입니다.", + "live_enabled": { + "label": "실시간 텍스트 변환", + "description": "수신되는 오디오에 대한 실시간 스트리밍 텍스트 변환을 활성화합니다." + }, + "enabled": { + "label": "오디오 텍스트 변환 활성화", + "description": "모든 카메라의 자동 오디오 텍스트 변환을 활성화하거나 비활성화합니다. 카메라별로 재정의할 수 있습니다." + }, + "language": { + "label": "변환 언어", + "description": "텍스트 변환/번역에 사용할 언어 코드입니다 (예: 한국어는 'ko', 영어는 'en')." + }, + "device": { + "label": "변환 디바이스", + "description": "텍스트 변환 모델을 실행할 디바이스 키(CPU/GPU)입니다. 현재 NVIDIA CUDA GPU만 지원됩니다." + }, + "model_size": { + "label": "모델 크기", + "description": "오프라인 오디오 이벤트 텍스트 변환에 사용할 모델 크기입니다." + } + }, + "birdseye": { + "label": "버드아이 (Birdseye)", + "description": "여러 카메라 피드를 단일 레이아웃으로 합성하는 버드아이 뷰 설정입니다.", + "enabled": { + "label": "버드아이 활성화", + "description": "버드아이 뷰 기능을 활성화하거나 비활성화합니다." + }, + "mode": { + "label": "추적 모드", + "description": "카메라를 버드아이에 포함하는 기준 모드: 'objects', 'motion', 또는 'continuous'." + }, + "order": { + "label": "표시 순서", + "description": "버드아이 레이아웃 내에서 카메라 배치 순서를 제어하는 숫자입니다." + }, + "restream": { + "label": "RTSP 재스트리밍", + "description": "버드아이 출력을 RTSP 피드로 재스트리밍합니다. 활성화하면 버드아이가 백그라운드에서 상시 실행됩니다." + }, + "width": { + "label": "너비", + "description": "합성된 버드아이 프레임의 출력 너비(픽셀)입니다." + }, + "height": { + "label": "높이", + "description": "합성된 버드아이 프레임의 출력 높이(픽셀)입니다." + }, + "quality": { + "label": "인코딩 품질", + "description": "버드아이 mpeg1 피드의 인코딩 품질입니다 (1 최고 품질, 31 최저 품질)." + }, + "inactivity_threshold": { + "label": "비활성 대기 시간", + "description": "카메라에 움직임이나 객체가 감지되지 않을 때 버드아이에서 숨기기까지 대기할 시간(초)입니다." + }, + "layout": { + "label": "레이아웃", + "description": "버드아이 합성 화면의 레이아웃 옵션입니다.", + "scaling_factor": { + "label": "크기 조절 비율", + "description": "레이아웃 계산 시 사용하는 크기 조정 비율입니다 (범위: 1.0 ~ 5.0)." + }, + "max_cameras": { + "label": "최대 카메라 수", + "description": "버드아이에 한 번에 표시할 최대 카메라 수입니다. 가장 최근 활동이 발생한 카메라를 우선 표시합니다." + } + }, + "idle_heartbeat_fps": { + "label": "유휴 하트비트 FPS", + "description": "유휴 상태일 때 마지막으로 합성된 버드아이 프레임을 재전송할 초당 프레임 수입니다 (0은 비활성화)." + } + }, + "detect": { + "label": "객체 감지", + "description": "객체 감지를 실행하고 트래커를 초기화하는 데 사용되는 detect 역할 설정입니다.", + "enabled": { + "label": "객체 감지 활성화", + "description": "모든 카메라의 객체 감지를 활성화하거나 비활성화합니다. 카메라별로 재정의할 수 있습니다." + }, + "height": { + "label": "감지 높이", + "description": "감지 스트림에 사용할 프레임 높이(픽셀)입니다. 비워 두면 원본 스트림 해상도를 사용합니다." + }, + "width": { + "label": "감지 너비", + "description": "감지 스트림에 사용할 프레임 너비(픽셀)입니다. 비워 두면 원본 스트림 해상도를 사용합니다." + }, + "fps": { + "label": "감지 FPS", + "description": "감지를 실행할 목표 초당 프레임 수입니다. 낮을수록 CPU 사용량이 감소합니다 (권장값은 5이며, 매우 빠른 물체를 추적할 때만 최대 10까지 권장)." + }, + "min_initialized": { + "label": "최소 초기화 프레임", + "description": "추적 객체를 생성하기 전 연속 감지되어야 하는 프레임 수입니다. 값을 높이면 오탐 초기화를 줄일 수 있습니다 (기본값: fps / 2)." + }, + "max_disappeared": { + "label": "최대 사라짐 프레임", + "description": "추적 중인 객체가 시야에서 완전히 사라진 것으로 판단하기까지 감지되지 않는 프레임 수입니다." + }, + "stationary": { + "label": "정지 객체 설정", + "description": "일정 시간 정지해 있는 객체를 감지하고 관리하기 위한 설정입니다.", + "interval": { + "label": "정지 확인 주기", + "description": "정지 객체임을 재확인하기 위해 감지 검사를 실행하는 간격(프레임 단위)입니다." + }, + "threshold": { + "label": "정지 임계값", + "description": "객체를 정지 상태로 분류하기 위해 위치 이동이 없어야 하는 프레임 수입니다." + }, + "max_frames": { + "label": "최대 추적 프레임", + "description": "정지 객체를 폐기하기 전까지 추적할 최대 프레임 한도입니다.", + "default": { + "label": "기본 최대 프레임", + "description": "추적을 중단하기 전 정지 객체를 추적할 기본 최대 프레임 수입니다." + }, + "objects": { + "label": "객체별 최대 프레임", + "description": "정지 객체를 추적할 객체 유형별 최대 프레임 수 재정의 설정입니다." + } + }, + "classifier": { + "label": "시각적 분류기 활성화", + "description": "바운딩 박스가 미세하게 흔들려도 시각적 분류기를 사용해 실제로 정지된 객체인지 확인합니다." + } + }, + "annotation_offset": { + "label": "어노테이션 오프셋", + "description": "녹화 영상과 타임라인 바운딩 박스의 싱크를 맞추기 위해 감지 어노테이션을 전후로 이동할 밀리초(ms) 단위 시간입니다 (양수 또는 음수 가능)." + } + }, + "face_recognition": { + "label": "얼굴 인식", + "enabled": { + "label": "얼굴 인식 활성화", + "description": "모든 카메라의 얼굴 인식을 활성화하거나 비활성화합니다. 카메라별로 재정의할 수 있습니다." + }, + "min_area": { + "label": "최소 얼굴 크기", + "description": "인식을 시도하기 위해 필요한 감지된 얼굴 박스의 최소 면적(픽셀)입니다." + }, + "description": "모든 카메라에 대한 얼굴 감지 및 인식 설정입니다. 카메라별로 재정의할 수 있습니다.", + "model_size": { + "label": "모델 크기", + "description": "얼굴 임베딩에 사용할 모델 크기(small/large)입니다. 큰 모델은 GPU가 필요할 수 있습니다." + }, + "unknown_score": { + "label": "미확인 점수 임계값", + "description": "얼굴이 일치 후보로 인정받기 위한 거리 임계값입니다 (값이 클수록 엄격함)." + }, + "detection_threshold": { + "label": "감지 임계값", + "description": "얼굴 감지가 유효하다고 판단하기 위한 최소 감지 신뢰도입니다." + }, + "recognition_threshold": { + "label": "인식 임계값", + "description": "두 얼굴이 일치한다고 판단하기 위한 얼굴 임베딩 거리 임계값입니다." + }, + "min_faces": { + "label": "최소 얼굴 수", + "description": "사람에게 인식된 하위 레이블을 부여하기 전 요구되는 최소 얼굴 인식 횟수입니다." + }, + "save_attempts": { + "label": "시도 기록 저장 수", + "description": "최근 얼굴 인식 UI에 유지할 얼굴 인식 시도 횟수입니다." + }, + "blur_confidence_filter": { + "label": "흐림 신뢰도 필터", + "description": "저품질 얼굴의 오탐을 줄이기 위해 이미지 흐림 정도에 따라 신뢰도 점수를 조정합니다." + }, + "device": { + "label": "디바이스", + "description": "특정 디바이스를 지정하기 위한 재정의 옵션입니다. 자세한 내용은 https://onnxruntime.ai/docs/execution-providers/를 참고하세요" + } + }, + "ffmpeg": { + "path": { + "label": "FFmpeg 경로", + "description": "사용할 FFmpeg 바이너리 경로 또는 버전 별칭(\"7.0\" 또는 \"8.0\")입니다." + }, + "global_args": { + "label": "FFmpeg 글로벌 인수", + "description": "FFmpeg 프로세스 전역에 전달할 공통 인수입니다." + }, + "hwaccel_args": { + "label": "하드웨어 가속 인수", + "description": "FFmpeg 하드웨어 가속 인수입니다. 하드웨어 환경에 맞는 프리셋 사용을 권장합니다." + }, + "input_args": { + "label": "입력 인수", + "description": "FFmpeg 입력 스트림에 적용할 인수입니다." + }, + "output_args": { + "label": "출력 인수", + "description": "detect, record 등 서로 다른 FFmpeg 역할에 사용할 기본 출력 인수입니다.", + "detect": { + "label": "감지(detect) 출력 인수", + "description": "detect 역할 스트림에 적용할 기본 출력 인수입니다." + }, + "record": { + "label": "녹화(record) 출력 인수", + "description": "record 역할 스트림에 적용할 기본 출력 인수입니다." + } + }, + "retry_interval": { + "label": "FFmpeg 재연결 대기 시간", + "description": "카메라 스트림 연결 실패 시 재연결을 시도하기까지 대기할 시간(초)입니다 (기본값: 10)." + }, + "apple_compatibility": { + "label": "Apple 호환성", + "description": "H.265 녹화 시 Apple 기기 플레이어와의 호환성을 위해 HEVC 태깅을 활성화합니다." + }, + "gpu": { + "label": "GPU 인덱스", + "description": "하드웨어 가속에 사용할 기본 GPU 번호(인덱스)입니다." + }, + "inputs": { + "label": "카메라 입력 스트림", + "description": "이 카메라에 설정된 입력 스트림 정의(경로 및 역할) 목록입니다.", + "path": { + "label": "입력 경로", + "description": "카메라 입력 스트림 URL 또는 디바이스 경로입니다." + }, + "roles": { + "label": "입력 역할", + "description": "이 입력 스트림에 할당할 역할입니다." + }, + "global_args": { + "label": "FFmpeg 글로벌 인수", + "description": "이 입력 스트림에만 적용할 FFmpeg 글로벌 인수입니다." + }, + "hwaccel_args": { + "label": "하드웨어 가속 인수", + "description": "이 입력 스트림에만 적용할 하드웨어 가속 인수입니다." + }, + "input_args": { + "label": "입력 인수", + "description": "이 스트림에만 개별 적용할 입력 인수입니다." + } + }, + "label": "FFmpeg", + "description": "바이너리 경로, 인수, 하드웨어 가속 옵션 및 역할별 출력 인수를 포함한 FFmpeg 설정입니다." + }, + "live": { + "label": "실시간 재생", + "streams": { + "label": "실시간 스트림 이름", + "description": "실시간 재생에 사용할 restream/go2rtc 이름과 설정된 스트림 이름의 매핑입니다." + }, + "height": { + "label": "실시간 재생 높이", + "description": "웹 UI에서 jsmpeg 실시간 스트림을 렌더링할 높이(픽셀)입니다 (감지 스트림 높이 이하)." + }, + "quality": { + "label": "실시간 품질", + "description": "jsmpeg 스트림의 인코딩 품질입니다 (1 최고 품질, 31 최저 품질)." + }, + "description": "jsmpeg 실시간 스트림의 해상도 및 품질을 제어하는 설정입니다. go2rtc를 사용하는 재스트리밍 카메라에는 영향을 미치지 않습니다." + }, + "lpr": { + "label": "차량 번호판 인식", + "description": "감지 임계값, 포맷, 등록된 번호판 등을 포함한 차량 번호판 인식 설정입니다.", + "enabled": { + "label": "LPR 활성화", + "description": "모든 카메라의 번호판 인식을 활성화하거나 비활성화합니다. 카메라별로 재정의할 수 있습니다." + }, + "expire_time": { + "label": "만료 시간(초)", + "description": "시야에서 사라진 번호판이 트래커에서 만료되기까지의 시간(초)입니다 (전용 LPR 카메라 전용)." + }, + "min_area": { + "label": "최소 번호판 크기", + "description": "인식을 시도하기 위해 필요한 최소 번호판 면적(픽셀)입니다." + }, + "enhancement": { + "label": "이미지 보정 레벨", + "description": "OCR 수행 전 번호판 크롭 이미지에 적용할 보정 강도(0~10)입니다 (값이 높다고 항상 인식률이 좋아지지는 않으며, 5 초과는 야간 전용이므로 주의해야 합니다)." + }, + "model_size": { + "label": "모델 크기", + "description": "텍스트 감지/인식에 사용할 모델 크기입니다. 대부분 'small' 사용을 권장합니다." + }, + "detection_threshold": { + "label": "감지 임계값", + "description": "번호판 의심 영역에 OCR을 시작하기 위한 감지 신뢰도 임계값입니다." + }, + "recognition_threshold": { + "label": "인식 임계값", + "description": "인식된 번호판 텍스트를 하위 레이블로 등록하기 위해 요구되는 신뢰도 임계값입니다." + }, + "min_plate_length": { + "label": "최소 번호판 길이", + "description": "인식된 번호판이 유효하다고 인정되기 위해 포함해야 하는 최소 문자 수입니다." + }, + "format": { + "label": "번호판 정규식 포맷", + "description": "인식된 번호판 문자열을 예상 형식과 비교 검증하기 위한 선택적 정규표현식입니다." + }, + "match_distance": { + "label": "일치 오차 허용치", + "description": "감지된 번호판과 등록된 번호판을 비교할 때 허용할 수 있는 불일치 문자 수입니다." + }, + "known_plates": { + "label": "등록된 번호판", + "description": "특별히 추적하거나 알림을 보낼 번호판 문자열 또는 정규식 목록입니다." + }, + "debug_save_plates": { + "label": "디버그 번호판 저장", + "description": "LPR 성능 디버깅을 위해 번호판 크롭 이미지를 저장합니다." + }, + "device": { + "label": "디바이스", + "description": "특정 디바이스를 지정하기 위한 재정의 옵션입니다. 자세한 내용은 https://onnxruntime.ai/docs/execution-providers/를 참고하세요" + }, + "replace_rules": { + "label": "치환 규칙", + "description": "매칭 전 감지된 번호판 문자열을 정규화하는 데 사용되는 정규식 치환 규칙입니다.", + "pattern": { + "label": "정규식 패턴" + }, + "replacement": { + "label": "치환 문자열" + } + } + }, + "motion": { + "label": "움직임 감지", + "enabled": { + "label": "움직임 감지 활성화", + "description": "모든 카메라의 움직임 감지를 활성화하거나 비활성화합니다. 카메라별로 재정의할 수 있습니다." + }, + "threshold": { + "label": "움직임 임계값", + "description": "움직임 감지기가 사용하는 픽셀 차이 임계값입니다. 값이 클수록 민감도가 낮아집니다 (범위: 1~255)." + }, + "lightning_threshold": { + "label": "번개/빛 변화 임계값", + "description": "순간적인 조명 변화나 번개를 감지하여 무시하기 위한 임계값입니다 (낮을수록 민감하며 0.3~1.0 사이 값). 움직임 감지 자체를 완전히 끄는 것이 아니라 임계값을 초과할 때 추가 프레임 분석을 일시 중단하는 것이며, 이 동안에도 움직임 기반 녹화는 정상 생성됩니다." + }, + "skip_motion_threshold": { + "label": "움직임 건너뛰기 임계값", + "description": "0.0~1.0 사이로 설정 시 단일 프레임에서 이 비율 이상의 화면이 바뀌면 움직임 박스를 생성하지 않고 즉시 재보정합니다. 폭풍이나 번개 시 CPU를 절약하고 오탐을 줄일 수 있지만, PTZ 카메라 자동 추적과 같은 실제 이벤트를 놓칠 수 있습니다. 사용하지 않으려면 설정하지 마세요(None)." + }, + "improve_contrast": { + "label": "대비 향상", + "description": "움직임 분석 전 프레임 대비를 향상하여 감지 성능을 보조합니다." + }, + "contour_area": { + "label": "윤곽선 면적", + "description": "움직임 윤곽선으로 인정되기 위한 최소 픽셀 면적입니다." + }, + "delta_alpha": { + "label": "델타 알파", + "description": "움직임 계산 시 프레임 차분화에 사용할 알파 블렌딩 계수입니다." + }, + "frame_alpha": { + "label": "프레임 알파", + "description": "움직임 전처리용 프레임 블렌딩에 사용할 알파 값입니다." + }, + "frame_height": { + "label": "프레임 높이", + "description": "움직임 연산 시 프레임을 리사이즈할 높이(픽셀)입니다." + }, + "mask": { + "label": "마스크 좌표", + "description": "움직임 감지 영역을 포함하거나 제외하기 위해 다각형을 정의하는 정렬된 x,y 좌표입니다." + }, + "mqtt_off_delay": { + "label": "MQTT 꺼짐 지연", + "description": "마지막 움직임이 감지된 후 MQTT에 'off' 상태를 발행하기까지 대기할 시간(초)입니다." + }, + "enabled_in_config": { + "label": "초기 움직임 상태", + "description": "초기 정적 설정 파일에서 움직임 감지가 활성화되어 있었는지 여부를 나타냅니다." + }, + "raw_mask": { + "label": "원시 마스크" + }, + "description": "카메라별로 재정의하지 않는 한 모든 카메라에 공통 적용되는 기본 움직임 감지 설정입니다." + }, + "objects": { + "label": "객체", + "description": "추적할 레이블 목록과 객체별 필터를 포함한 기본 객체 추적 설정입니다.", + "track": { + "label": "추적 대상 객체", + "description": "모든 카메라에서 추적할 객체 레이블 목록입니다. 카메라별로 재정의할 수 있습니다." + }, + "filters": { + "label": "객체 필터", + "description": "오탐지를 줄이기 위해 감지된 객체에 적용할 필터 설정(면적, 비율, 신뢰도)입니다.", + "min_area": { + "label": "최소 객체 면적", + "description": "이 객체 유형에 필요한 최소 바운딩 박스 면적입니다. 픽셀 수(정수) 또는 비율(0.000001~0.99 사이의 실수)로 지정할 수 있습니다." + }, + "max_area": { + "label": "최대 객체 면적", + "description": "이 객체 유형에 허용되는 최대 바운딩 박스 면적입니다. 픽셀 수(정수) 또는 비율(0.000001~0.99 사이의 실수)로 지정할 수 있습니다." + }, + "min_ratio": { + "label": "최소 가로세로 비율", + "description": "바운딩 박스에 요구되는 최소 너비/높이 비율입니다." + }, + "max_ratio": { + "label": "최대 가로세로 비율", + "description": "바운딩 박스에 허용되는 최대 너비/높이 비율입니다." + }, + "threshold": { + "label": "신뢰도 임계값", + "description": "객체를 실제 탐지로 인정하기 위해 요구되는 평균 감지 신뢰도 임계값입니다." + }, + "min_score": { + "label": "최소 신뢰도", + "description": "객체로 카운트되기 위해 필요한 단일 프레임 최소 감지 신뢰도입니다." + }, + "mask": { + "label": "필터 마스크", + "description": "프레임 내에서 이 필터가 적용될 다각형 좌표입니다." + }, + "raw_mask": { + "label": "원시 마스크" + } + }, + "mask": { + "label": "객체 마스크", + "description": "지정된 영역에서 객체 감지를 방지하기 위한 마스크 다각형입니다." + }, + "raw_mask": { + "label": "원시 마스크" + }, + "genai": { + "label": "생성형 AI (GenAI) 객체 설정", + "description": "추적된 객체를 설명하고 분석용 프레임을 전송하기 위한 GenAI 옵션입니다.", + "enabled": { + "label": "GenAI 활성화", + "description": "기본적으로 추적된 객체에 대한 GenAI 설명 생성을 활성화합니다." + }, + "use_snapshot": { + "label": "스냅샷 사용", + "description": "GenAI 설명 생성 시 썸네일 대신 객체 스냅샷을 사용합니다." + }, + "prompt": { + "label": "캡션 프롬프트", + "description": "GenAI로 설명을 생성할 때 사용할 기본 프롬프트 템플릿입니다." + }, + "object_prompts": { + "label": "객체별 프롬프트", + "description": "특정 레이블에 대한 GenAI 결과를 맞춤화하기 위한 객체별 개별 프롬프트입니다." + }, + "objects": { + "label": "GenAI 대상 객체", + "description": "기본적으로 GenAI로 전송할 객체 레이블 목록입니다." + }, + "required_zones": { + "label": "필수 구역", + "description": "GenAI 설명 생성 대상이 되기 위해 객체가 반드시 진입해야 하는 구역입니다." + }, + "debug_save_thumbnails": { + "label": "썸네일 저장", + "description": "디버깅 및 검토를 위해 GenAI로 전송된 썸네일을 저장합니다." + }, + "send_triggers": { + "label": "GenAI 전송 트리거", + "description": "프레임을 GenAI로 전송할 시점(추적 종료 시, 주요 업데이트 후 등)을 정의합니다.", + "tracked_object_end": { + "label": "종료 시 전송", + "description": "추적 객체의 동작이 종료되었을 때 GenAI에 요청을 보냅니다." + }, + "after_significant_updates": { + "label": "조기 GenAI 트리거", + "description": "추적 객체에 지정된 횟수만큼 주요 변화가 발생한 후 조기에 GenAI 요청을 보냅니다." + } + }, + "enabled_in_config": { + "label": "초기 GenAI 상태", + "description": "초기 정적 설정에서 GenAI가 활성화되었는지 여부를 나타냅니다." + } + }, + "filters_attribute": { + "label": "속성 필터", + "description": "오탐지를 줄이기 위해 감지된 속성에 적용할 필터 설정(면적, 비율, 신뢰도)입니다.", + "min_area": { + "label": "최소 속성 면적", + "description": "이 속성에 필요한 최소 바운딩 박스 면적입니다. 픽셀 수(정수) 또는 비율(0.000001~0.99 사이의 실수)로 지정할 수 있습니다." + }, + "max_area": { + "label": "최대 속성 면적", + "description": "이 속성에 허용되는 최대 바운딩 박스 면적입니다. 픽셀 수(정수) 또는 비율(0.000001~0.99 사이의 실수)로 지정할 수 있습니다." + }, + "min_ratio": { + "label": "최소 가로세로 비율", + "description": "바운딩 박스에 요구되는 최소 너비/높이 비율입니다." + }, + "max_ratio": { + "label": "최대 가로세로 비율", + "description": "바운딩 박스에 허용되는 최대 너비/높이 비율입니다." + }, + "threshold": { + "label": "신뢰도 임계값", + "description": "속성을 실제 탐지로 인정하기 위해 요구되는 평균 감지 신뢰도 임계값입니다." + }, + "min_score": { + "label": "최소 신뢰도", + "description": "이 속성을 상위 객체와 연결하기 위해 필요한 단일 프레임 최소 감지 신뢰도입니다." + }, + "mask": { + "label": "필터 마스크", + "description": "프레임 내에서 이 필터가 적용될 다각형 좌표입니다." + }, + "raw_mask": { + "label": "원시 마스크" + } + } + }, + "record": { + "label": "녹화", + "enabled": { + "label": "녹화 활성화", + "description": "모든 카메라의 녹화를 활성화하거나 비활성화합니다. 카메라별로 재정의할 수 있습니다." + }, + "expire_interval": { + "label": "녹화 파일 정리 주기", + "description": "만료된 녹화 세그먼트를 삭제하는 정리 작업 간격(분)입니다." + }, + "continuous": { + "label": "상시 녹화 보관", + "description": "객체 추적이나 움직임 여부와 상관없이 녹화본을 보관할 일수입니다. 알림이나 감지 이벤트만 보관하려면 0으로 설정하세요.", + "days": { + "label": "보관 일수", + "description": "녹화본 보관 일수입니다." + } + }, + "motion": { + "label": "움직임 녹화 보관", + "description": "추적 객체가 없더라도 움직임에 의해 트리거된 녹화본을 보관할 일수입니다. 알림이나 감지 이벤트만 보관하려면 0으로 설정하세요.", + "days": { + "label": "보관 일수", + "description": "녹화본 보관 일수입니다." + } + }, + "detections": { + "label": "감지 녹화 보관", + "description": "이벤트 전/후 버퍼 캡처 시간을 포함한 감지 이벤트의 녹화 보관 설정입니다.", + "pre_capture": { + "label": "사전 캡처 시간", + "description": "감지 이벤트 시작 전 녹화에 포함할 시간(초)입니다." + }, + "post_capture": { + "label": "사후 캡처 시간", + "description": "감지 이벤트 종료 후 녹화에 포함할 시간(초)입니다." + }, + "retain": { + "label": "이벤트 보관", + "description": "감지 이벤트 녹화본의 보관 설정입니다.", + "days": { + "label": "보관 일수", + "description": "감지 이벤트 녹화본을 보관할 일수입니다." + }, + "mode": { + "label": "보관 모드", + "description": "보관 모드: all(모든 구간 저장), motion(움직임이 있는 구간 저장), active_objects(활동 중인 객체가 있는 구간 저장)." + } + } + }, + "alerts": { + "label": "알림 녹화 보관", + "description": "이벤트 전/후 버퍼 캡처 시간을 포함한 알림 이벤트의 녹화 보관 설정입니다.", + "pre_capture": { + "label": "사전 캡처 시간", + "description": "알림 이벤트 시작 전 녹화에 포함할 시간(초)입니다." + }, + "post_capture": { + "label": "사후 캡처 시간", + "description": "알림 이벤트 종료 후 녹화에 포함할 시간(초)입니다." + }, + "retain": { + "label": "이벤트 보관", + "description": "알림 이벤트 녹화본의 보관 설정입니다.", + "days": { + "label": "보관 일수", + "description": "알림 이벤트 녹화본을 보관할 일수입니다." + }, + "mode": { + "label": "보관 모드", + "description": "보관 모드: all(모든 구간 저장), motion(움직임이 있는 구간 저장), active_objects(활동 중인 객체가 있는 구간 저장)." + } + } + }, + "export": { + "label": "내보내기 설정", + "description": "타임랩스 및 하드웨어 가속 등 녹화본 내보내기 시 적용할 설정입니다.", + "hwaccel_args": { + "label": "내보내기 하드웨어 가속 인수", + "description": "내보내기 및 트랜스코딩 작업에 사용할 하드웨어 가속 인수입니다." + }, + "max_concurrent": { + "label": "최대 동시 내보내기 수", + "description": "동시에 처리할 수 있는 최대 내보내기 작업 수입니다." + }, + "chapters": { + "label": "내보낸 녹화 영상에 삽입할 챕터 메타데이터" + } + }, + "preview": { + "label": "미리보기 설정", + "description": "UI에 표시되는 녹화 미리보기의 화질을 제어하는 설정입니다.", + "quality": { + "label": "미리보기 화질", + "description": "미리보기 화질 레벨 (very_low, low, medium, high, very_high)." + } + }, + "enabled_in_config": { + "label": "초기 녹화 상태", + "description": "초기 정적 구성에서 녹화가 활성화되어 있었는지 여부를 나타냅니다." + }, + "description": "카메라별로 재정의하지 않는 한 모든 카메라에 적용되는 녹화 및 보관 설정입니다." + }, + "review": { + "label": "다시보기", + "alerts": { + "label": "알림 설정", + "description": "어떤 추적 객체가 알림을 생성하고 알림을 어떻게 보관할지 결정하는 설정입니다.", + "enabled": { + "label": "알림 활성화", + "description": "모든 카메라의 알림 생성을 활성화하거나 비활성화합니다. 카메라별로 재정의할 수 있습니다." + }, + "labels": { + "label": "알림 대상 레이블", + "description": "알림을 트리거할 객체 레이블 목록입니다 (예: car, person)." + }, + "required_zones": { + "label": "필수 구역", + "description": "알림으로 분류되기 위해 객체가 진입해야 하는 구역입니다. 모든 구역을 허용하려면 비워 두세요." + }, + "enabled_in_config": { + "label": "초기 알림 상태", + "description": "정적 설정에서 알림이 원래 활성화되어 있었는지 여부를 추적합니다." + }, + "cutoff_time": { + "label": "알림 종료 대기 시간", + "description": "알림 유발 활동이 멈춘 후 알림을 공식 종료하기까지 대기할 시간(초)입니다." + } + }, + "detections": { + "label": "감지 이벤트 설정", + "description": "어떤 추적 객체가 일반 감지(알림 제외) 이벤트를 생성하고 어떻게 보관할지 결정하는 설정입니다.", + "enabled": { + "label": "감지 이벤트 활성화", + "description": "모든 카메라의 감지 이벤트를 활성화하거나 비활성화합니다. 카메라별로 재정의할 수 있습니다." + }, + "labels": { + "label": "감지 대상 레이블", + "description": "일반 감지 이벤트로 인정할 객체 레이블 목록입니다." + }, + "required_zones": { + "label": "필수 구역", + "description": "감지 이벤트로 처리되기 위해 객체가 진입해야 하는 구역입니다. 모든 구역을 허용하려면 비워 두세요." + }, + "cutoff_time": { + "label": "감지 종료 대기 시간", + "description": "감지 유발 활동이 멈춘 후 이벤트를 공식 종료하기까지 대기할 시간(초)입니다." + }, + "enabled_in_config": { + "label": "초기 감지 상태", + "description": "정적 설정에서 감지 이벤트가 원래 활성화되어 있었는지 여부를 추적합니다." + } + }, + "genai": { + "label": "GenAI 다시보기 설정", + "description": "다시보기 항목의 설명과 요약을 생성하기 위한 생성형 AI 사용을 제어합니다.", + "enabled": { + "label": "GenAI 설명 활성화", + "description": "다시보기 항목에 대한 GenAI 기반 설명 및 요약 생성을 활성화하거나 비활성화합니다." + }, + "alerts": { + "label": "알림에 GenAI 활성화", + "description": "알림 항목에 대해 GenAI로 설명을 생성합니다." + }, + "detections": { + "label": "감지에 GenAI 활성화", + "description": "감지 항목에 대해 GenAI로 설명을 생성합니다." + }, + "image_source": { + "label": "다시보기 이미지 소스", + "description": "GenAI로 전송할 이미지 소스 ('preview' 또는 'recordings'). 'recordings'는 화질이 더 높지만 토큰 사용량이 증가합니다." + }, + "additional_concerns": { + "label": "추가 주의 사항", + "description": "이 카메라의 활동을 평가할 때 GenAI가 고려해야 할 추가 주의 사항이나 참고 사항 목록입니다." + }, + "debug_save_thumbnails": { + "label": "썸네일 저장", + "description": "디버깅 및 검토를 위해 GenAI 제공업체로 전송된 썸네일을 저장합니다." + }, + "enabled_in_config": { + "label": "초기 GenAI 상태", + "description": "정적 설정에서 GenAI 다시보기가 원래 활성화되어 있었는지 여부를 추적합니다." + }, + "preferred_language": { + "label": "선호 언어", + "description": "GenAI가 생성할 응답에 요청할 선호 언어입니다." + }, + "activity_context_prompt": { + "label": "활동 맥락 프롬프트", + "description": "GenAI 요약에 맥락을 제공하기 위해 어떤 활동이 의심스럽거나 정상적인지 설명하는 커스텀 프롬프트입니다." + } + }, + "description": "UI 및 저장소에서 사용하는 알림, 감지 및 GenAI 요약을 제어하는 설정입니다." + }, + "semantic_search": { + "label": "시맨틱(의미 기반) 검색", + "triggers": { + "label": "트리거", + "description": "카메라별 시맨틱 검색 트리거를 위한 동작 및 매칭 기준입니다.", + "friendly_name": { + "label": "트리거 별칭", + "description": "UI에 표시될 이 트리거의 친숙한 이름(선택 사항)입니다." + }, + "enabled": { + "label": "트리거 활성화", + "description": "이 시맨틱 검색 트리거를 활성화하거나 비활성화합니다." + }, + "type": { + "label": "트리거 유형", + "description": "트리거 유형: 'thumbnail'(이미지 비교) 또는 'description'(텍스트 비교)." + }, + "data": { + "label": "트리거 내용", + "description": "추적 객체와 매칭할 텍스트 문구 또는 썸네일 ID입니다." + }, + "threshold": { + "label": "트리거 임계값", + "description": "이 트리거를 작동시키기 위해 요구되는 최소 유사도 점수(0~1)입니다." + }, + "actions": { + "label": "트리거 동작", + "description": "트리거가 매칭되었을 때 실행할 동작 목록입니다 (notification, sub_label, attribute)." + } + }, + "description": "유사한 항목을 찾기 위해 객체 임베딩을 구축하고 쿼리하는 시맨틱 검색 설정입니다.", + "enabled": { + "label": "시맨틱 검색 활성화", + "description": "시맨틱 검색 기능을 활성화하거나 비활성화합니다." + }, + "reindex": { + "label": "시작 시 재색인", + "description": "시작 시 과거 추적 객체 전체를 임베딩 데이터베이스로 다시 색인하도록 트리거합니다." + }, + "model": { + "label": "시맨틱 검색 모델 또는 GenAI 제공업체 이름", + "description": "시맨틱 검색에 사용할 임베딩 모델(예: 'jinav1') 또는 embeddings 역할을 가진 GenAI 제공업체 이름입니다." + }, + "model_size": { + "label": "모델 크기", + "description": "모델 크기 선택입니다 ('small'은 CPU에서 실행 가능하며, 'large'는 일반적으로 GPU가 필요함)." + }, + "device": { + "label": "디바이스", + "description": "특정 디바이스를 지정하기 위한 재정의 옵션입니다. 자세한 내용은 https://onnxruntime.ai/docs/execution-providers/를 참고하세요" + } + }, + "snapshots": { + "label": "스냅샷", + "enabled": { + "label": "스냅샷 활성화", + "description": "모든 카메라의 스냅샷 저장을 활성화하거나 비활성화합니다. 카메라별로 재정의할 수 있습니다." + }, + "timestamp": { + "label": "타임스탬프 오버레이", + "description": "API 스냅샷에 타임스탬프를 덧씌워 표시합니다." + }, + "bounding_box": { + "label": "바운딩 박스 오버레이", + "description": "API 스냅샷에 추적 객체의 바운딩 박스를 그립니다." + }, + "crop": { + "label": "스냅샷 크롭", + "description": "API 스냅샷을 감지된 객체의 바운딩 박스 크기로 잘라냅니다." + }, + "required_zones": { + "label": "필수 구역", + "description": "스냅샷을 저장하기 위해 객체가 반드시 진입해야 하는 구역입니다." + }, + "height": { + "label": "스냅샷 높이", + "description": "API 스냅샷을 리사이즈할 높이(픽셀)입니다. 비워 두면 원본 크기를 유지합니다." + }, + "retain": { + "label": "스냅샷 보관", + "description": "기본 보관 일수 및 객체별 재정의를 포함한 스냅샷 보관 설정입니다.", + "default": { + "label": "기본 보관 일수", + "description": "스냅샷을 보관할 기본 일수입니다." + }, + "objects": { + "label": "객체별 보관 일수", + "description": "스냅샷 보관 일수를 객체 유형별로 개별 재정의합니다." + } + }, + "quality": { + "label": "스냅샷 화질", + "description": "저장할 스냅샷의 인코딩 품질입니다 (0~100)." + }, + "description": "모든 카메라에서 API로 생성되는 추적 객체 스냅샷 설정입니다. 카메라별로 재정의할 수 있습니다." + }, + "timestamp_style": { + "label": "타임스탬프 스타일", + "position": { + "label": "타임스탬프 위치", + "description": "이미지 내 타임스탬프 위치 (tl: 좌상단, tr: 우상단, bl: 좌하단, br: 우하단)." + }, + "format": { + "label": "타임스탬프 형식", + "description": "타임스탬프 표시에 사용할 날짜/시간 형식 문자열입니다 (Python datetime 포맷 코드)." + }, + "color": { + "label": "타임스탬프 색상", + "description": "타임스탬프 텍스트의 RGB 색상값입니다 (모든 값은 0~255).", + "red": { + "label": "빨강 (Red)", + "description": "타임스탬프 색상의 빨간색 성분 (0-255)." + }, + "green": { + "label": "초록 (Green)", + "description": "타임스탬프 색상의 초록색 성분 (0-255)." + }, + "blue": { + "label": "파랑 (Blue)", + "description": "타임스탬프 색상의 파란색 성분 (0-255)." + } + }, + "thickness": { + "label": "타임스탬프 두께", + "description": "타임스탬프 글자의 선 두께입니다." + }, + "effect": { + "label": "타임스탬프 효과", + "description": "타임스탬프 텍스트에 적용할 시각 효과입니다 (none, solid, shadow)." + }, + "description": "디버그 뷰 및 스냅샷 피드에 적용되는 타임스탬프 텍스트 스타일 옵션입니다." + }, + "onvif": { + "label": "ONVIF", + "description": "이 카메라의 ONVIF 연결 및 PTZ 자동 추적 설정입니다.", + "host": { + "label": "ONVIF 호스트", + "description": "이 카메라의 ONVIF 서비스 호스트 주소(및 선택적 프로토콜 스키마)입니다." + }, + "port": { + "label": "ONVIF 포트", + "description": "ONVIF 서비스 포트 번호입니다." + }, + "user": { + "label": "ONVIF 사용자 이름", + "description": "ONVIF 인증에 사용할 사용자 이름입니다 (일부 기기는 관리자 계정이 필요함)." + }, + "password": { + "label": "ONVIF 비밀번호", + "description": "ONVIF 인증 비밀번호입니다." + }, + "tls_insecure": { + "label": "TLS 검증 비활성화", + "description": "ONVIF 통신 시 TLS 인증서 검증을 건너뛰고 Digest 인증을 끕니다 (안전하지 않으므로 신뢰할 수 있는 네트워크에서만 사용하세요)." + }, + "profile": { + "label": "ONVIF 프로필", + "description": "PTZ 제어에 사용할 특정 ONVIF 미디어 프로필의 토큰 또는 이름입니다. 지정하지 않으면 유효한 PTZ 구성이 있는 첫 번째 프로필이 자동 선택됩니다." + }, + "autotracking": { + "label": "자동 추적 (Autotracking)", + "description": "PTZ 카메라를 움직여 움직이는 객체를 프레임 중앙에 자동으로 추적하고 유지합니다.", + "enabled": { + "label": "자동 추적 활성화", + "description": "감지된 객체에 대한 PTZ 카메라의 자동 추적을 활성화하거나 비활성화합니다." + }, + "calibrate_on_startup": { + "label": "시작 시 모터 캘리브레이션", + "description": "추적 정확도를 향상하기 위해 부팅 시 PTZ 모터 속도를 측정합니다. 보정 완료 후 Frigate가 movement_weights 값을 자동으로 업데이트합니다." + }, + "zooming": { + "label": "줌 모드", + "description": "줌 동작 제어: disabled(팬/틸트만 사용), absolute(가장 안정적인 호환성), relative(팬/틸트/줌 동시 작동)." + }, + "zoom_factor": { + "label": "줌 배율", + "description": "추적 중인 객체의 확대 수준을 제어합니다. 값이 낮으면 주변 시야를 넓게 유지하고, 높으면 대상을 가깝게 확대하지만 추적을 놓칠 위험이 있습니다 (0.1~0.75 사이 값)." + }, + "track": { + "label": "추적 대상 객체", + "description": "자동 추적을 작동시킬 객체 유형 목록입니다." + }, + "required_zones": { + "label": "필수 구역", + "description": "자동 추적이 시작되기 위해 객체가 먼저 진입해야 하는 구역입니다." + }, + "return_preset": { + "label": "복귀 프리셋", + "description": "추적이 끝난 후 카메라가 돌아갈 펌웨어상의 ONVIF 프리셋 이름입니다." + }, + "timeout": { + "label": "복귀 대기 시간", + "description": "객체를 놓친 후 카메라가 프리셋 위치로 복귀하기까지 대기할 시간(초)입니다." + }, + "movement_weights": { + "label": "이동 가중치", + "description": "카메라 캘리브레이션을 통해 자동 생성된 보정값입니다. 수동으로 수정하지 마세요." + }, + "enabled_in_config": { + "label": "초기 자동 추적 상태", + "description": "설정에서 자동 추적이 활성화되어 있었는지 여부를 추적하는 내부 필드입니다." + } + }, + "ignore_time_mismatch": { + "label": "시간 불일치 무시", + "description": "ONVIF 통신 시 카메라와 Frigate 서버 간의 시간 동기화 차이를 무시합니다." + } + }, + "profiles": { + "label": "프로필", + "description": "친숙한 이름을 가진 프로필 정의입니다. 카메라 프로필은 여기에 정의된 이름을 참조해야 합니다.", + "friendly_name": { + "label": "별칭", + "description": "UI에 표시될 이 프로필의 표시 이름입니다." + } + }, + "proxy": { + "label": "프록시", + "description": "인증된 사용자 헤더를 전달하는 역방향 프록시(Reverse Proxy) 뒤에 Frigate를 연동하기 위한 설정입니다.", + "header_map": { + "label": "헤더 매핑", + "description": "프록시 기반 인증을 위해 수신된 프록시 헤더를 Frigate의 사용자 및 역할 필드에 매핑합니다.", + "user": { + "label": "사용자 헤더", + "description": "업스트림 프록시가 제공하는 인증된 사용자 이름이 포함된 헤더입니다." + }, + "role": { + "label": "역할 헤더", + "description": "업스트림 프록시가 제공하는 인증된 사용자의 역할 또는 그룹 정보가 포함된 헤더입니다." + }, + "role_map": { + "label": "역할 매핑", + "description": "업스트림 그룹 값을 Frigate 역할에 매핑합니다 (예: 관리자 그룹을 admin 역할에 매핑)." + } + }, + "logout_url": { + "label": "로그아웃 URL", + "description": "프록시를 통해 로그아웃할 때 사용자를 리다이렉트할 URL입니다." + }, + "auth_secret": { + "label": "프록시 시크릿", + "description": "신뢰할 수 있는 프록시인지 검증하기 위해 X-Proxy-Secret 헤더와 비교할 선택적 Secret 값입니다." + }, + "default_role": { + "label": "기본 역할", + "description": "일치하는 역할 매핑이 없을 때 프록시 인증 사용자에게 할당할 기본 역할입니다." + }, + "separator": { + "label": "구분자 문자", + "description": "프록시 헤더에 제공된 다중 값을 분리하는 데 사용되는 구분 기호입니다." + } + }, + "telemetry": { + "label": "원격 측정 (Telemetry)", + "description": "GPU 및 네트워크 대역폭 모니터링을 포함한 시스템 텔레메트리 및 통계 옵션입니다.", + "network_interfaces": { + "label": "네트워크 인터페이스", + "description": "대역폭 통계를 모니터링할 네트워크 인터페이스 이름 접두사 목록입니다." + }, + "stats": { + "label": "시스템 통계", + "description": "다양한 시스템 및 GPU 통계 수집을 활성화하거나 비활성화하는 옵션입니다.", + "amd_gpu_stats": { + "label": "AMD GPU 통계", + "description": "AMD GPU가 장착된 경우 통계 수집을 활성화합니다." + }, + "intel_gpu_stats": { + "label": "Intel GPU 통계", + "description": "Intel GPU가 장착된 경우 통계 수집을 활성화합니다." + }, + "network_bandwidth": { + "label": "네트워크 대역폭", + "description": "카메라 FFmpeg 프로세스 및 감지기에 대한 프로세스별 네트워크 대역폭 모니터링을 활성화합니다 (권한 필요)." + }, + "intel_gpu_device": { + "label": "Intel GPU 디바이스", + "description": "여러 대의 GPU가 있을 때 통계를 특정 장치에 고정하기 위한 PCI 버스 주소 또는 DRM 디바이스 경로(예: /dev/dri/card1)입니다." + } + }, + "version_check": { + "label": "버전 확인", + "description": "최신 Frigate 버전이 출시되었는지 확인하는 아웃바운드 검사를 활성화합니다." + } + }, + "tls": { + "label": "TLS", + "description": "Frigate 웹 엔드포인트(포트 8971)에 대한 TLS 보안 설정입니다.", + "enabled": { + "label": "TLS 활성화", + "description": "설정된 TLS 포트에서 Frigate 웹 UI 및 API에 대한 TLS 연결을 활성화합니다." + } + }, + "ui": { + "label": "UI", + "description": "시간대, 시간/날짜 형식, 단위 등 사용자 인터페이스 기본 설정입니다.", + "timezone": { + "label": "시간대", + "description": "UI 전반에 표시할 시간대입니다 (설정하지 않으면 브라우저 로컬 시간 사용)." + }, + "time_format": { + "label": "시간 표기 형식", + "description": "UI에서 사용할 시간 표기 형식입니다 (browser, 12hour, 또는 24hour)." + }, + "unit_system": { + "label": "단위 체계", + "description": "UI 및 MQTT에 표시할 단위 체계입니다 (metric: 미터법, imperial: 야드파운드법)." + } + }, + "detectors": { + "label": "감지기 하드웨어", + "description": "객체 감지기(CPU, GPU, ONNX 백엔드) 및 감지기별 모델 설정입니다.", + "type": { + "label": "유형" + }, + "model": { + "label": "감지기 전용 모델 설정", + "description": "감지기별 모델 설정 옵션(경로, 입력 크기 등)입니다.", + "path": { + "label": "커스텀 감지 모델 경로", + "description": "사용자 지정 감지 모델 파일의 경로(또는 Frigate+ 모델용 plus://)입니다." + }, + "labelmap_path": { + "label": "커스텀 감지기 레이블 맵", + "description": "감지기용 숫자 클래스를 문자열 레이블로 매핑하는 labelmap 파일 경로입니다." + }, + "width": { + "label": "모델 입력 너비", + "description": "모델 입력 텐서의 너비(픽셀)입니다." + }, + "height": { + "label": "모델 입력 높이", + "description": "모델 입력 텐서의 높이(픽셀)입니다." + }, + "labelmap": { + "label": "레이블 맵 사용자 정의", + "description": "표준 레이블 맵에 병합할 재정의 또는 리매핑 항목입니다." + }, + "attributes_map": { + "label": "객체 레이블과 속성 레이블 매핑", + "description": "메타데이터를 첨부하기 위한 객체 레이블과 속성 레이블 간의 매핑입니다 (예: 'car' -> ['license_plate'])." + }, + "input_tensor": { + "label": "모델 입력 텐서 형태", + "description": "모델이 요구하는 텐서 형식입니다: 'nhwc' 또는 'nchw'." + }, + "input_pixel_format": { + "label": "모델 입력 색상 포맷", + "description": "모델이 요구하는 픽셀 색상 공간입니다: 'rgb', 'bgr', 또는 'yuv'." + }, + "input_dtype": { + "label": "모델 입력 데이터 타입", + "description": "모델 입력 텐서의 데이터 타입입니다 (예: 'float32')." + }, + "model_type": { + "label": "객체 감지 모델 유형", + "description": "일부 감지기에서 최적화에 사용하는 감지기 아키텍처 유형(ssd, yolox, yolonas, yolo-generic, rfdetr, dfine)입니다." + } + }, + "model_path": { + "label": "감지기 전용 모델 경로", + "description": "선택한 감지기에서 요구하는 감지 모델 바이너리의 파일 경로입니다." + }, + "axengine": { + "label": "AXEngine NPU", + "description": "AXEngine 런타임을 통해 컴파일된 .axmodel 파일을 실행하는 AXERA AX650N/AX8850N NPU 감지기입니다." + }, + "cpu": { + "label": "CPU", + "description": "하드웨어 가속 없이 호스트 CPU에서 TensorFlow Lite 모델을 실행하는 CPU TFLite 감지기입니다 (권장되지 않음).", + "num_threads": { + "label": "감지 스레드 수", + "description": "CPU 기반 추론 처리에 사용할 스레드 수입니다." + } + }, + "deepstack": { + "label": "DeepStack", + "description": "원격 DeepStack HTTP API로 이미지를 전송하여 추론하는 DeepStack/CodeProject.AI 감지기입니다 (권장되지 않음).", + "api_url": { + "label": "DeepStack API URL", + "description": "DeepStack API의 엔드포인트 URL입니다." + }, + "api_timeout": { + "label": "DeepStack API 제한 시간(초)", + "description": "DeepStack API 요청에 허용되는 최대 시간입니다." + }, + "api_key": { + "label": "DeepStack API 키", + "description": "인증이 필요한 DeepStack 서비스에 전달할 선택적 API 키입니다." + } + }, + "edgetpu": { + "label": "EdgeTPU", + "description": "EdgeTPU 델리게이트를 사용하여 Coral EdgeTPU용으로 컴파일된 TensorFlow Lite 모델을 실행하는 감지기입니다.", + "device": { + "label": "디바이스 유형", + "description": "EdgeTPU 추론에 사용할 디바이스입니다 (예: 'usb', 'pci')." + } + }, + "hailo8l": { + "label": "Hailo-8/Hailo-8L", + "description": "Hailo 하드웨어 추론을 위해 HEF 모델과 HailoRT SDK를 사용하는 Hailo-8/Hailo-8L 감지기입니다.", + "device": { + "label": "디바이스 유형", + "description": "Hailo 추론에 사용할 디바이스입니다 (예: 'PCIe', 'M.2')." + } + }, + "memryx": { + "label": "MemryX", + "description": "MemryX 가속기에서 컴파일된 DFP 모델을 실행하는 MemryX MX3 감지기입니다.", + "device": { + "label": "디바이스 경로", + "description": "MemryX 추론에 사용할 디바이스 경로입니다 (예: 'PCIe')." + } + }, + "onnx": { + "label": "ONNX", + "description": "ONNX 모델을 실행하는 감지기입니다. 사용 가능한 가속 백엔드(CUDA/ROCm/OpenVINO)가 있을 경우 자동으로 활용합니다.", + "device": { + "label": "디바이스 유형", + "description": "ONNX 추론에 사용할 디바이스입니다 (예: 'AUTO', 'CPU', 'GPU')." + } + }, + "openvino": { + "label": "OpenVINO", + "description": "AMD 및 Intel CPU, Intel GPU 및 Intel VPU 하드웨어를 지원하는 OpenVINO 감지기입니다.", + "device": { + "label": "디바이스 유형", + "description": "OpenVINO 추론에 사용할 디바이스입니다 (예: 'CPU', 'GPU', 'NPU')." + } + }, + "rknn": { + "label": "RKNN", + "description": "Rockchip NPU용 RKNN 감지기입니다. Rockchip 하드웨어에서 컴파일된 RKNN 모델을 실행합니다.", + "num_cores": { + "label": "사용할 NPU 코어 수.", + "description": "추론에 사용할 NPU 코어 수입니다 (0은 자동)." + } + }, + "synaptics": { + "label": "Synaptics", + "description": "Synaptics 하드웨어에서 Synap SDK를 사용하여 .synap 형식의 모델을 실행하는 Synaptics NPU 감지기입니다." + }, + "teflon_tfl": { + "label": "Teflon", + "description": "지원되는 GPU에서 추론을 가속하기 위해 Mesa Teflon 델리게이트 라이브러리를 사용하는 TFLite 감지기입니다." + }, + "tensorrt": { + "label": "TensorRT", + "description": "직렬화된 TensorRT 엔진을 사용하여 Nvidia Jetson 기기에서 가속 추론을 수행하는 TensorRT 감지기입니다.", + "device": { + "label": "GPU 디바이스 인덱스", + "description": "추론에 사용할 GPU 디바이스 인덱스입니다." + } + }, + "zmq": { + "label": "ZMQ IPC", + "description": "ZeroMQ IPC 엔드포인트를 통해 외부 프로세스로 추론을 위임하는 ZMQ IPC 감지기입니다.", + "endpoint": { + "label": "ZMQ IPC 엔드포인트", + "description": "연결할 ZMQ 엔드포인트 주소입니다." + }, + "request_timeout_ms": { + "label": "ZMQ 요청 제한 시간(밀리초)", + "description": "ZMQ 요청의 만료 시간(ms)입니다." + }, + "linger_ms": { + "label": "ZMQ 소켓 린거(밀리초)", + "description": "소켓 종료 시 대기할 린거 기간(ms)입니다." + } + } + }, + "model": { + "label": "감지 모델", + "description": "커스텀 객체 감지 모델 및 입력 형태를 구성하기 위한 설정입니다.", + "path": { + "label": "커스텀 감지 모델 경로", + "description": "사용자 지정 감지 모델 파일의 경로(또는 Frigate+ 모델용 plus://)입니다." + }, + "labelmap_path": { + "label": "커스텀 감지기 레이블 맵", + "description": "감지기용 숫자 클래스를 문자열 레이블로 매핑하는 labelmap 파일 경로입니다." + }, + "width": { + "label": "모델 입력 너비", + "description": "모델 입력 텐서의 너비(픽셀)입니다." + }, + "height": { + "label": "모델 입력 높이", + "description": "모델 입력 텐서의 높이(픽셀)입니다." + }, + "labelmap": { + "label": "레이블 맵 사용자 정의", + "description": "표준 레이블 맵에 병합할 재정의 또는 리매핑 항목입니다." + }, + "attributes_map": { + "label": "객체 레이블과 속성 레이블 매핑", + "description": "메타데이터를 첨부하기 위한 객체 레이블과 속성 레이블 간의 매핑입니다 (예: 'car' -> ['license_plate'])." + }, + "input_tensor": { + "label": "모델 입력 텐서 형태", + "description": "모델이 요구하는 텐서 형식입니다: 'nhwc' 또는 'nchw'." + }, + "input_pixel_format": { + "label": "모델 입력 색상 포맷", + "description": "모델이 요구하는 픽셀 색상 공간입니다: 'rgb', 'bgr', 또는 'yuv'." + }, + "input_dtype": { + "label": "모델 입력 데이터 타입", + "description": "모델 입력 텐서의 데이터 타입입니다 (예: 'float32')." + }, + "model_type": { + "label": "객체 감지 모델 유형", + "description": "일부 감지기에서 최적화에 사용하는 감지기 아키텍처 유형(ssd, yolox, yolonas, yolo-generic, rfdetr, dfine)입니다." + } + }, + "genai": { + "label": "생성형 AI (GenAI) 구성", + "description": "객체 설명 및 다시보기 요약 생성에 사용되는 통합 생성형 AI 제공업체 설정입니다.", + "api_key": { + "label": "API 키", + "description": "제공업체에서 요구하는 API 키입니다 (환경 변수로도 설정 가능)." + }, + "base_url": { + "label": "기본 URL", + "description": "자체 호스팅 또는 호환 제공업체(예: Ollama 인스턴스)의 기본 URL입니다." + }, + "model": { + "label": "모델", + "description": "설명 또는 요약 생성에 사용할 제공업체의 모델 이름입니다." + }, + "provider": { + "label": "제공업체", + "description": "사용할 GenAI 제공업체입니다 (예: ollama, gemini, openai)." + }, + "roles": { + "label": "역할", + "description": "GenAI 역할 분담(chat, descriptions, embeddings)입니다. 역할당 하나의 제공업체가 매핑됩니다." + }, + "provider_options": { + "label": "제공업체 옵션", + "description": "GenAI 클라이언트에 전달할 추가 제공업체별 옵션입니다." + }, + "runtime_options": { + "label": "런타임 옵션", + "description": "각 추론 호출마다 제공업체에 전달되는 런타임 옵션입니다." + } + }, + "classification": { + "label": "객체 분류", + "description": "객체 레이블 세분화 또는 상태 분류에 사용되는 분류 모델 설정입니다.", + "bird": { + "label": "조류 분류 설정", + "description": "조류(새) 분류 모델 전용 설정입니다.", + "enabled": { + "label": "조류 분류 활성화", + "description": "조류 분류 기능을 활성화하거나 비활성화합니다." + }, + "threshold": { + "label": "최소 점수", + "description": "조류 분류 결과를 인정하기 위해 필요한 최소 분류 점수입니다." + } + }, + "custom": { + "label": "커스텀 분류 모델", + "description": "객체 또는 상태 감지에 사용하는 커스텀 분류 모델 설정입니다.", + "enabled": { + "label": "모델 활성화", + "description": "커스텀 분류 모델을 활성화하거나 비활성화합니다." + }, + "name": { + "label": "모델 이름", + "description": "사용할 커스텀 분류 모델의 식별자입니다." + }, + "threshold": { + "label": "점수 임계값", + "description": "분류 상태를 변경하는 데 사용되는 점수 임계값입니다." + }, + "save_attempts": { + "label": "시도 기록 저장 수", + "description": "최근 분류 UI에 저장해 둘 분류 시도 횟수입니다." + }, + "object_config": { + "objects": { + "label": "분류 대상 객체", + "description": "객체 분류를 수행할 객체 유형 목록입니다." + }, + "classification_type": { + "label": "분류 유형", + "description": "적용할 분류 유형: 'sub_label'(하위 레이블 추가) 또는 기타 지원 유형." + } + }, + "state_config": { + "cameras": { + "label": "분류 대상 카메라", + "description": "상태 분류를 실행하기 위한 카메라별 크롭 영역 및 설정입니다.", + "crop": { + "label": "분류 크롭 좌표", + "description": "이 카메라에서 분류를 실행할 크롭 영역 좌표입니다." + } + }, + "motion": { + "label": "움직임 시 실행", + "description": "true일 경우 지정된 크롭 영역 내에서 움직임이 감지될 때 분류를 실행합니다." + }, + "interval": { + "label": "분류 주기", + "description": "상태 분류를 주기적으로 실행할 간격(초)입니다." + } + } + } + }, + "camera_groups": { + "label": "카메라 그룹", + "description": "UI에서 카메라를 체계적으로 구성하기 위한 명명된 카메라 그룹 설정입니다.", + "cameras": { + "label": "카메라 목록", + "description": "이 그룹에 포함된 카메라 이름 배열입니다." + }, + "icon": { + "label": "그룹 아이콘", + "description": "UI에서 카메라 그룹을 나타내는 데 사용되는 아이콘입니다." + }, + "order": { + "label": "정렬 순서", + "description": "UI에서 카메라 그룹을 정렬하는 데 사용되는 숫자 순서입니다 (큰 숫자일수록 뒤에 표시됨)." + } + }, + "active_profile": { + "label": "활성 프로필", + "description": "현재 활성화된 프로필 이름입니다. 런타임 전용이며 YAML에 저장되지 않습니다." + }, + "camera_mqtt": { + "label": "MQTT", + "description": "MQTT 이미지 발행 설정입니다.", + "enabled": { + "label": "이미지 전송", + "description": "이 카메라의 객체 이미지 스냅샷을 MQTT 토픽으로 발행하도록 활성화합니다." + }, + "timestamp": { + "label": "타임스탬프 추가", + "description": "MQTT로 발행되는 이미지에 타임스탬프를 덧씌웁니다." + }, + "bounding_box": { + "label": "바운딩 박스 추가", + "description": "MQTT로 발행되는 이미지에 바운딩 박스를 그립니다." + }, + "crop": { + "label": "이미지 크롭", + "description": "MQTT로 발행되는 이미지를 감지된 객체의 바운딩 박스 크기로 잘라냅니다." + }, + "height": { + "label": "이미지 높이", + "description": "MQTT로 발행되는 이미지를 리사이즈할 높이(픽셀)입니다." + }, + "required_zones": { + "label": "필수 구역", + "description": "MQTT 이미지가 발행되기 위해 객체가 진입해야 하는 구역입니다." + }, + "quality": { + "label": "JPEG 품질", + "description": "MQTT로 발행되는 이미지의 JPEG 압축 품질입니다 (0~100)." + } + }, + "camera_ui": { + "label": "카메라 UI", + "description": "UI에서 이 카메라의 표시 순서와 가시성을 제어합니다. 순서는 기본 대시보드에 영향을 미칩니다. 더 세부적인 설정은 카메라 그룹을 사용하세요.", + "order": { + "label": "UI 순서", + "description": "기본 대시보드 및 목록에서 카메라를 정렬하는 데 사용되는 숫자 순서입니다 (큰 숫자일수록 뒤에 표시됨)." + }, + "dashboard": { + "label": "실시간 대시보드에 표시", + "description": "기본 '모든 카메라' 실시간 대시보드에 이 카메라를 표시할지 여부를 전환합니다. 비활성화해도 카메라 그룹이나 설정 등 UI의 다른 곳에서는 계속 접근할 수 있습니다." + }, + "review": { + "label": "다시보기에 표시", + "description": "다시보기 페이지(카메라 필터, 모션 검토 및 기록 뷰 포함)에서 이 카메라를 표시할지 여부를 전환합니다." } } } diff --git a/web/public/locales/ko/config/groups.json b/web/public/locales/ko/config/groups.json index 4578c83cf7..cb042946c1 100644 --- a/web/public/locales/ko/config/groups.json +++ b/web/public/locales/ko/config/groups.json @@ -1,8 +1,8 @@ { "audio": { "global": { - "detection": "전체 감지", - "sensitivity": "전체 민감도" + "detection": "전역 감지", + "sensitivity": "전역 민감도" }, "cameras": { "detection": "감지", @@ -51,7 +51,23 @@ "filtering": "전역 필터링" }, "cameras": { - "tracking": "추적" + "tracking": "추적", + "filtering": "필터링" + } + }, + "record": { + "global": { + "retention": "전역 보관", + "events": "전역 이벤트" + }, + "cameras": { + "retention": "보관", + "events": "이벤트" + } + }, + "ffmpeg": { + "cameras": { + "cameraFfmpeg": "카메라별 FFmpeg 인수" } } } diff --git a/web/public/locales/ko/config/validation.json b/web/public/locales/ko/config/validation.json index 3e0a5a2b14..875b43b6eb 100644 --- a/web/public/locales/ko/config/validation.json +++ b/web/public/locales/ko/config/validation.json @@ -1,32 +1,35 @@ { - "minimum": "최소 {{limit}} 이상", - "maximum": "최대 {{limit}} 이하", - "exclusiveMinimum": "최소 {{limit}} 초과", - "exclusiveMaximum": "최대 {{limit}} 미만", - "minLength": "{{limit}}자 이상이어야 합니다", - "maxLength": "{{limit}}자 이하여야 합니다", - "minItems": "{{limit}}개 이상이어야 합니다", - "maxItems": "{{limit}}개 이하여야 합니다", - "pattern": "잘못된 형식", - "required": "이 항목은 필수 입력 사항입니다", - "type": "잘못된 유형입니다", + "minimum": "{{limit}} 이상이어야 합니다", + "maximum": "{{limit}} 이하여야 합니다", + "exclusiveMinimum": "{{limit}} 초과여야 합니다", + "exclusiveMaximum": "{{limit}} 미만이어야 합니다", + "minLength": "최소 {{limit}}자 이상이어야 합니다", + "maxLength": "최대 {{limit}}자 이하여야 합니다", + "minItems": "최소 {{limit}}개 항목이 있어야 합니다", + "maxItems": "최대 {{limit}}개 항목까지 가능합니다", + "pattern": "잘못된 형식입니다", + "required": "이 항목은 필수입니다", + "type": "유효하지 않은 값 형식입니다", "enum": "허용된 값 중 하나여야 합니다", - "const": "값이 예상된 상수와 일치하지 않습니다", + "const": "예상된 상수 값과 일치하지 않습니다", "uniqueItems": "모든 항목은 고유해야 합니다", - "format": "잘못된 형식", + "format": "유효하지 않은 형식입니다", "additionalProperties": "알 수 없는 속성은 허용되지 않습니다", - "oneOf": "허용된 형식 중 하나와 일치해야 합니다", - "anyOf": "허용된 형식 중 최소 하나와 일치해야 합니다", + "oneOf": "허용된 스키마 중 정확히 하나와 일치해야 합니다", + "anyOf": "허용된 스키마 중 최소 하나와 일치해야 합니다", "proxy": { "header_map": { - "roleHeaderRequired": "역할 매핑이 설정된 경우 역할 헤더(Role header)가 필수입니다." + "roleHeaderRequired": "역할 매핑이 구성된 경우 역할 헤더가 필수입니다." } }, "ffmpeg": { "inputs": { "rolesUnique": "각 역할은 하나의 입력 스트림에만 할당할 수 있습니다.", - "detectRequired": "최소 하나의 입력 스트림에 'detect' 역할이 할당되어야 합니다.", - "hwaccelDetectOnly": "하드웨어 가속 설정은 'detect' 스트림에서만 가능합니다." + "detectRequired": "최소 하나의 입력 스트림에 'detect' 역할을 지정해야 합니다.", + "hwaccelDetectOnly": "하드웨어 가속 인수(hwaccel_args)는 detect 역할을 가진 입력 스트림에서만 정의할 수 있습니다." } + }, + "detect": { + "dimensionMustBeEven": "짝수여야 합니다." } } diff --git a/web/public/locales/ko/objects.json b/web/public/locales/ko/objects.json index bda2d2a728..211669da4f 100644 --- a/web/public/locales/ko/objects.json +++ b/web/public/locales/ko/objects.json @@ -1,8 +1,8 @@ { "person": "사람", "bicycle": "자전거", - "car": "차량", - "motorcycle": "원동기", + "car": "승용차", + "motorcycle": "오토바이", "airplane": "비행기", "bus": "버스", "train": "기차", @@ -24,31 +24,31 @@ "zebra": "얼룩말", "giraffe": "기린", "hat": "모자", - "backpack": "백팩", + "backpack": "배낭", "umbrella": "우산", "shoe": "신발", "eye_glasses": "안경", "handbag": "핸드백", - "tie": "타이", - "suitcase": "슈트케이스", - "frisbee": "프리스비", + "tie": "넥타이", + "suitcase": "여행 가방", + "frisbee": "프리스비(원반)", "skis": "스키", "snowboard": "스노우보드", - "sports_ball": "스포츠 볼", + "sports_ball": "공", "kite": "연", "baseball_bat": "야구 방망이", - "baseball_glove": "야구 글로브", + "baseball_glove": "야구 글러브", "skateboard": "스케이트보드", "surfboard": "서핑보드", "tennis_racket": "테니스 라켓", "bottle": "병", - "plate": "번호판", + "plate": "접시", "wine_glass": "와인잔", "cup": "컵", "fork": "포크", "knife": "칼", "spoon": "숟가락", - "bowl": "보울", + "bowl": "그릇", "banana": "바나나", "apple": "사과", "sandwich": "샌드위치", @@ -67,29 +67,29 @@ "dining_table": "식탁", "window": "창문", "desk": "책상", - "toilet": "화장실", + "toilet": "변기", "door": "문", "tv": "TV", - "laptop": "랩탑", - "mouse": "마우스", - "remote": "리모콘", + "laptop": "노트북", + "mouse": "생쥐", + "remote": "리모컨", "keyboard": "키보드", - "cell_phone": "휴대폰", + "cell_phone": "휴대전화", "microwave": "전자레인지", "oven": "오븐", - "toaster": "토스터기", + "toaster": "토스터", "sink": "싱크대", "refrigerator": "냉장고", - "blender": "블렌더", + "blender": "믹서기", "book": "책", "clock": "시계", "vase": "꽃병", "scissors": "가위", - "teddy_bear": "테디베어", - "hair_dryer": "헤어 드라이어", + "teddy_bear": "곰 인형", + "hair_dryer": "헤어드라이어", "toothbrush": "칫솔", - "hair_brush": "빗", - "vehicle": "탈 것", + "hair_brush": "헤어브러시", + "vehicle": "탈것", "squirrel": "다람쥐", "deer": "사슴", "animal": "동물", @@ -98,17 +98,17 @@ "goat": "염소", "rabbit": "토끼", "raccoon": "라쿤", - "robot_lawnmower": "로봇 잔디깎기", + "robot_lawnmower": "로봇 잔디깎이", "waste_bin": "쓰레기통", - "on_demand": "수동", + "on_demand": "수동 감지", "face": "얼굴", "license_plate": "차량 번호판", - "package": "패키지", + "package": "택배 상자", "bbq_grill": "바베큐 그릴", "amazon": "Amazon", "usps": "USPS", "ups": "UPS", - "fedex": "FedEx", + "fedex": "페덱스", "dhl": "DHL", "an_post": "An Post", "purolator": "Purolator", @@ -116,5 +116,16 @@ "nzpost": "NZPost", "postnord": "PostNord", "gls": "GLS", - "dpd": "DPD" + "dpd": "DPD", + "canada_post": "Canada Post", + "royal_mail": "Royal Mail", + "school_bus": "스쿨버스", + "skunk": "스컹크", + "kangaroo": "캥거루", + "baby": "아기", + "baby_stroller": "유모차", + "rickshaw": "인력거", + "rodent": "설치류", + "possum": "주머니쥐", + "garbage_truck": "청소차" } diff --git a/web/public/locales/ko/views/chat.json b/web/public/locales/ko/views/chat.json index 0967ef424b..25a4abcd8e 100644 --- a/web/public/locales/ko/views/chat.json +++ b/web/public/locales/ko/views/chat.json @@ -1 +1,72 @@ -{} +{ + "documentTitle": "채팅 - Frigate", + "title": "Frigate 채팅", + "subtitle": "카메라 관리 및 인사이트 분석을 돕는 AI 어시스턴트입니다", + "placeholder": "무엇이든 물어보세요...", + "error": "문제가 발생했습니다. 다시 시도해 주세요.", + "processing": "처리 중입니다...", + "toolsUsed": "사용된 도구: {{tools}}", + "showTools": "도구 보기 ({{count}}개)", + "hideTools": "도구 숨기기", + "call": "호출", + "result": "결과", + "arguments": "인수:", + "response": "응답:", + "attachment_chip_label": "{{camera}}의 {{label}}", + "attachment_chip_remove": "첨부 파일 삭제", + "open_in_explore": "탐색에서 열기", + "attach_event_aria": "{{eventId}} 이벤트 첨부", + "attachment_picker_paste_label": "또는 이벤트 ID를 붙여넣으세요", + "attachment_picker_attach": "첨부하기", + "attachment_picker_placeholder": "이벤트를 첨부해 주세요", + "quick_reply_find_similar": "유사한 감지 기록 찾기", + "quick_reply_tell_me_more": "자세한 설명 요청", + "quick_reply_when_else": "다른 시간대 감지 확인", + "quick_reply_find_similar_text": "이와 유사한 감지 기록을 찾아주세요.", + "quick_reply_tell_me_more_text": "이 내용에 대해 더 자세히 알려주세요.", + "quick_reply_when_else_text": "이 대상이 다른 때에 또 감지된 적이 있나요?", + "anchor": "참조", + "similarity_score": "유사도", + "no_similar_objects_found": "유사한 객체를 찾을 수 없습니다.", + "semantic_search_required": "유사한 객체를 찾으려면 시맨틱 검색(Semantic search) 기능이 활성화되어 있어야 합니다.", + "send": "전송", + "suggested_requests": "다음과 같이 질문해 보세요:", + "starting_requests": { + "show_recent_events": "최근 이벤트 표시", + "show_camera_status": "카메라 상태 확인", + "recap": "부재 중 발생한 이벤트 요약", + "watch_camera": "카메라 활동 감시" + }, + "starting_requests_prompts": { + "show_recent_events": "최근 1시간 동안 발생한 이벤트를 보여주세요", + "show_camera_status": "현재 카메라 상태는 어떤가요?", + "recap": "제가 자리를 비운 사이에 어떤 일이 있었나요?", + "watch_camera": "현관문을 주시하고 누군가 나타나면 저에게 알려주세요" + }, + "new_chat": "새 채팅", + "settings": { + "title": "채팅 설정", + "show_stats": { + "title": "통계 표시", + "desc": "채팅 응답의 토큰 생성 속도 및 컨텍스트 크기를 표시합니다.", + "while_generating": "생성 중에만 표시", + "always": "항상 표시" + }, + "auto_scroll": { + "title": "자동 스크롤", + "desc": "새 메시지가 도착하면 화면을 자동으로 아래로 이동합니다." + } + }, + "stats": { + "context": "{{tokens}} 토큰", + "tokens_per_second": "{{rate}} t/s" + }, + "reasoning": { + "active": "추론 중입니다…", + "show": "추론 과정 보기", + "hide": "추론 과정 숨기기" + }, + "thinking": { + "toggle": "생각 과정 전환" + } +} diff --git a/web/public/locales/ko/views/classificationModel.json b/web/public/locales/ko/views/classificationModel.json index 832c3723f5..eb516540bd 100644 --- a/web/public/locales/ko/views/classificationModel.json +++ b/web/public/locales/ko/views/classificationModel.json @@ -1,7 +1,7 @@ { "documentTitle": "분류 모델 - Frigate", "details": { - "scoreInfo": "점수는 해당 객체에 대한 모든 탐지 결과의 평균 분류 신뢰도를 나타냅니다.", + "scoreInfo": "점수는 이 객체에 대해 감지된 모든 결과의 평균 분류 신뢰도를 나타냅니다.", "none": "없음", "unknown": "알 수 없음" }, @@ -10,26 +10,196 @@ "renameCategory": "클래스 이름 변경", "deleteCategory": "클래스 삭제", "deleteImages": "이미지 삭제", - "trainModel": "모델 훈련", + "trainModel": "모델 학습", "addClassification": "분류 추가", "deleteModels": "모델 삭제", - "editModel": "모델 편집" + "editModel": "모델 수정" }, "tooltip": { - "trainingInProgress": "모델이 현재 학습 중입니다", - "noNewImages": "훈련할 새 이미지가 없습니다. 먼저 데이터셋에서 더 많은 이미지를 분류하세요.", - "noChanges": "마지막 훈련 이후 데이터셋에 변경 사항이 없습니다.", - "modelNotReady": "모델이 훈련 준비가 되지 않았습니다" + "trainingInProgress": "모델 학습이 진행 중입니다", + "noNewImages": "학습할 새 이미지가 없습니다. 데이터셋에서 이미지를 먼저 분류하세요.", + "noChanges": "마지막 학습 이후 데이터셋에 변경 사항이 없습니다.", + "modelNotReady": "모델이 학습할 준비가 되지 않았습니다" }, "toast": { "success": { - "deletedModel_other": "{{count}}개 모델을 성공적으로 삭제했습니다", - "categorizedImage": "이미지 분류 성공", - "reclassifiedImage": "이미지 재분류 성공", - "trainedModel": "모델 훈련 완료." + "deletedModel_other": "모델 {{count}}개를 성공적으로 삭제했습니다", + "categorizedImage": "이미지를 성공적으로 분류했습니다", + "reclassifiedImage": "이미지를 성공적으로 재분류했습니다", + "trainedModel": "모델 학습을 성공적으로 완료했습니다.", + "trainingModel": "모델 학습을 성공적으로 시작했습니다.", + "updatedModel": "모델 설정을 성공적으로 업데이트했습니다", + "renamedCategory": "클래스 이름을 '{{name}}'(으)로 성공적으로 변경했습니다", + "deletedCategory_other": "클래스 {{count}}개를 삭제했습니다", + "deletedImage_other": "이미지 {{count}}장을 삭제했습니다" + }, + "error": { + "deleteImageFailed": "삭제 실패: {{errorMessage}}", + "deleteCategoryFailed": "클래스 삭제 실패: {{errorMessage}}", + "deleteModelFailed": "모델 삭제 실패: {{errorMessage}}", + "categorizeFailed": "이미지 분류 실패: {{errorMessage}}", + "trainingFailed": "모델 학습에 실패했습니다. 자세한 내용은 Frigate 로그를 확인하세요.", + "trainingFailedToStart": "모델 학습 시작 실패: {{errorMessage}}", + "updateModelFailed": "모델 업데이트 실패: {{errorMessage}}", + "renameCategoryFailed": "클래스 이름 변경 실패: {{errorMessage}}", + "reclassifyFailed": "이미지 재분류 실패: {{errorMessage}}" } }, "train": { - "titleShort": "최근" + "titleShort": "최근", + "title": "최근 분류", + "aria": "최근 분류 선택" + }, + "disabled": "비활성화됨", + "deleteCategory": { + "title": "클래스 삭제", + "desc": "정말로 '{{name}}' 클래스를 삭제하시겠습니까? 연결된 모든 이미지가 영구적으로 삭제되며 모델을 다시 학습해야 합니다.", + "minClassesTitle": "클래스를 삭제할 수 없음", + "minClassesDesc": "분류 모델은 최소 2개 이상의 클래스가 필요합니다. 이 클래스를 삭제하기 전에 다른 클래스를 추가하세요." + }, + "deleteModel": { + "title": "분류 모델 삭제", + "single": "정말로 '{{name}}' 모델을 삭제하시겠습니까? 이미지 및 학습 데이터를 포함한 모든 연결된 데이터가 영구적으로 삭제됩니다. 이 작업은 되돌릴 수 없습니다.", + "desc_other": "정말로 모델 {{count}}개를 삭제하시겠습니까? 이미지 및 학습 데이터를 포함한 모든 연결된 데이터가 영구적으로 삭제됩니다. 이 작업은 되돌릴 수 없습니다." + }, + "edit": { + "title": "분류 모델 수정", + "descriptionState": "이 상태 분류 모델의 클래스를 수정합니다. 변경 사항을 적용하려면 모델을 다시 학습해야 합니다.", + "descriptionObject": "이 객체 분류 모델의 객체 유형 및 분류 유형을 수정합니다.", + "enabled": "활성화됨", + "enabledDesc": "이 모델을 실행합니다. 비활성화하면 모델 실행이 중단되고 더 이상 분류 작업을 수행하지 않습니다.", + "saveAttempts": "시도 기록 저장 수", + "saveAttemptsDesc": "최근 분류 UI에 유지할 분류 시도 이미지의 개수입니다.", + "motion": "움직임 감지 시 실행", + "motionDesc": "설정된 크롭 영역 내에서 움직임이 감지될 때 분류를 실행합니다.", + "interval": "주기", + "intervalDesc": "주기적 분류 실행 간격(초)입니다. 움직임 감지 시에만 실행하려면 비워 두세요.", + "intervalPlaceholder": "주기 없음", + "stateClassesInfo": "모델이 업데이트되었습니다. 클래스 변경 사항을 적용하려면 모델을 다시 학습하세요.", + "errors": { + "saveAttemptsInvalid": "시도 기록 저장 수는 0 이상의 정수여야 합니다", + "intervalInvalid": "주기는 0보다 큰 정수여야 합니다" + } + }, + "deleteDatasetImages": { + "title": "데이터셋 이미지 삭제", + "desc_other": "정말로 {{dataset}}에서 이미지 {{count}}장을 삭제하시겠습니까? 이 작업은 되돌릴 수 없으며 모델을 다시 학습해야 합니다." + }, + "deleteTrainImages": { + "title": "학습 이미지 삭제", + "desc_other": "정말로 이미지 {{count}}장을 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다." + }, + "renameCategory": { + "title": "클래스 이름 변경", + "desc": "'{{name}}'의 새 이름을 입력하세요. 이름 변경 사항을 적용하려면 모델을 다시 학습해야 합니다." + }, + "description": { + "invalidName": "유효하지 않은 이름입니다. 이름에는 문자, 숫자, 공백, 아포스트로피('), 밑줄(_), 하이픈(-)만 포함할 수 있습니다." + }, + "categories": "클래스", + "createCategory": { + "new": "새 클래스 만들기" + }, + "categorizeImageAs": "이미지를 다음으로 분류:", + "categorizeImage": "이미지 분류", + "reclassifyImageAs": "이미지를 다음으로 재분류:", + "reclassifyImage": "이미지 재분류", + "menu": { + "objects": "객체", + "states": "상태" + }, + "noModels": { + "object": { + "title": "객체 분류 모델 없음", + "description": "감지된 객체를 분류하기 위한 커스텀 모델을 생성하세요.", + "buttonText": "객체 모델 생성" + }, + "state": { + "title": "상태 분류 모델 없음", + "description": "특정 카메라 영역의 상태 변화를 모니터링하고 분류하기 위한 커스텀 모델을 생성하세요.", + "buttonText": "상태 모델 생성" + } + }, + "wizard": { + "title": "새 분류 생성", + "steps": { + "nameAndDefine": "이름 및 정의", + "stateArea": "상태 영역", + "chooseExamples": "예시 선택" + }, + "step1": { + "description": "상태 모델은 고정된 카메라 영역의 변화(예: 문 열림/닫힘)를 모니터링합니다. 객체 모델은 감지된 객체에 세부 분류(예: 특정 동물, 배달원 등)를 추가합니다.", + "name": "이름", + "namePlaceholder": "모델 이름 입력...", + "type": "유형", + "typeState": "상태", + "typeObject": "객체", + "objectLabel": "객체 레이블", + "objectLabelPlaceholder": "객체 유형 선택...", + "classificationType": "분류 유형", + "classificationTypeTip": "분류 유형 자세히 알아보기", + "classificationTypeDesc": "하위 레이블은 객체 레이블에 추가 텍스트를 부여합니다 (예: 'Person: UPS'). 속성은 객체 메타데이터에 별도로 저장되는 검색 가능한 메타데이터입니다.", + "classificationSubLabel": "하위 레이블", + "classificationAttribute": "속성", + "classes": "클래스", + "states": "상태", + "classesTip": "클래스 자세히 알아보기", + "classesStateDesc": "카메라 영역이 가질 수 있는 서로 다른 상태를 정의합니다. 예를 들어 차고 문의 경우 'open'과 'closed'입니다.", + "classesObjectDesc": "감지된 객체를 분류할 서로 다른 범주를 정의합니다. 예를 들어 사람 분류의 경우 'delivery_person', 'resident', 'stranger'입니다.", + "classPlaceholder": "클래스 이름 입력...", + "errors": { + "nameRequired": "모델 이름은 필수입니다", + "nameLength": "모델 이름은 64자 이하여야 합니다", + "nameOnlyNumbers": "모델 이름은 숫자로만 구성될 수 없습니다", + "classRequired": "최소 1개 이상의 클래스가 필요합니다", + "classesUnique": "클래스 이름은 중복될 수 없습니다", + "noneNotAllowed": "'none' 클래스는 사용할 수 없습니다", + "stateRequiresTwoClasses": "상태 모델은 최소 2개 이상의 클래스가 필요합니다", + "objectLabelRequired": "객체 레이블을 선택하세요", + "objectTypeRequired": "분류 유형을 선택하세요" + } + }, + "step2": { + "description": "카메라를 선택하고 각 카메라별로 모니터링할 영역을 지정하세요. 모델이 해당 영역의 상태를 분류합니다.", + "cameras": "카메라", + "selectCamera": "카메라 선택", + "noCameras": "+ 버튼을 눌러 카메라를 추가하세요", + "selectCameraPrompt": "목록에서 카메라를 선택하여 모니터링 영역을 설정하세요" + }, + "step3": { + "selectImagesPrompt": "다음과 일치하는 모든 이미지를 선택하세요: {{className}}", + "selectImagesDescription": "이미지를 클릭하여 선택하세요. 이 클래스에 대한 선택을 마쳤으면 계속을 클릭하세요.", + "allImagesRequired_other": "모든 이미지를 분류해 주세요. 남은 이미지: {{count}}장.", + "generating": { + "title": "샘플 이미지 생성 중", + "description": "Frigate이 녹화 영상에서 대표 이미지를 추출하고 있습니다. 잠시만 기다려 주세요..." + }, + "training": { + "title": "모델 학습 중", + "description": "백그라운드에서 모델을 학습하고 있습니다. 이 대화 상자를 닫아도 되며, 학습이 완료되는 즉시 모델이 실행됩니다." + }, + "retryGenerate": "생성 재시도", + "noImages": "생성된 샘플 이미지가 없습니다", + "classifying": "분류 및 학습 진행 중...", + "trainingStarted": "학습이 성공적으로 시작되었습니다", + "modelCreated": "모델이 성공적으로 생성되었습니다. '최근 분류' 보기에서 누락된 상태의 이미지를 추가한 후 모델을 학습시키세요.", + "errors": { + "noCameras": "설정된 카메라가 없습니다", + "noObjectLabel": "선택된 객체 레이블이 없습니다", + "generateFailed": "예시 생성 실패: {{error}}", + "generationFailed": "생성에 실패했습니다. 다시 시도해 주세요.", + "classifyFailed": "이미지 분류 실패: {{error}}" + }, + "generateSuccess": "샘플 이미지를 성공적으로 생성했습니다", + "refreshExamples": "새로운 예시 생성", + "refreshConfirm": { + "title": "새로운 예시를 생성하시겠습니까?", + "description": "새 이미지 세트가 생성되며 이전 클래스를 포함한 모든 선택 항목이 지워집니다. 모든 클래스에 대해 예시를 다시 선택해야 합니다." + }, + "missingStatesWarning": { + "title": "클래스 예시 누락", + "description": "모든 클래스에 예시가 존재하는 것은 아닙니다. 새로운 예시를 생성하여 누락된 클래스를 찾거나, 계속 진행한 후 '최근 분류' 보기에서 나중에 이미지를 추가하세요." + } + } } } diff --git a/web/public/locales/ko/views/configEditor.json b/web/public/locales/ko/views/configEditor.json index bb8a84c2a6..4edf018132 100644 --- a/web/public/locales/ko/views/configEditor.json +++ b/web/public/locales/ko/views/configEditor.json @@ -2,17 +2,17 @@ "documentTitle": "설정 편집기 - Frigate", "configEditor": "설정 편집기", "safeConfigEditor": "설정 편집기 (안전 모드)", - "safeModeDescription": "설정 오류로 인해 Frigate가 안전 모드로 전환되었습니다.", + "safeModeDescription": "설정 유효성 검사 오류로 인해 Frigate가 안전 모드로 실행 중입니다.", "copyConfig": "설정 복사", - "saveAndRestart": "저장 & 재시작", + "saveAndRestart": "저장 및 재시작", "saveOnly": "저장만 하기", - "confirm": "저장 없이 나갈까요?", + "confirm": "저장하지 않고 종료하시겠습니까?", "toast": { "success": { - "copyToClipboard": "설정이 클립보드에 저장되었습니다." + "copyToClipboard": "설정이 클립보드에 복사되었습니다." }, "error": { - "savingError": "설정 저장 오류" + "savingError": "설정 저장 중 오류가 발생했습니다" } } } diff --git a/web/public/locales/ko/views/events.json b/web/public/locales/ko/views/events.json index 3e357be850..018abb8675 100644 --- a/web/public/locales/ko/views/events.json +++ b/web/public/locales/ko/views/events.json @@ -1,18 +1,18 @@ { - "alerts": "경보", - "detections": "대상 감지", + "alerts": "알림", + "detections": "감지", "motion": { - "label": "움직임 감지", - "only": "움직임 감지만" + "label": "움직임", + "only": "움직임만" }, "allCameras": "모든 카메라", "empty": { - "alert": "다시 볼 '경보' 영상이 없습니다", - "detection": "다시 볼 '대상 감지' 영상이 없습니다", - "motion": "움직임 감지 데이터가 없습니다", + "alert": "검토할 알림이 없습니다", + "detection": "검토할 감지 내역이 없습니다", + "motion": "움직임 데이터가 없습니다", "recordingsDisabled": { - "title": "녹화가 활성화되어야 합니다", - "description": "다시 보기 항목은 해당 카메라에서 녹화가 활성화된 경우에만 카메라에 대해 생성할 수 있습니다." + "title": "녹화가 활성화되어 있어야 합니다", + "description": "해당 카메라의 녹화 기능이 활성화되어 있어야 다시보기 항목이 생성될 수 있습니다." } }, "timeline": { @@ -22,39 +22,76 @@ "events": { "label": "이벤트", "aria": "이벤트 선택", - "noFoundForTimePeriod": "이 시간대에 이벤트가 없습니다." + "noFoundForTimePeriod": "해당 기간에 발생한 이벤트가 없습니다." }, "detail": { - "noDataFound": "다시 볼 상세 데이터가 없습니다", - "aria": "상세 보기", - "trackedObject_one": "추적 대상", - "trackedObject_other": "추적 대상", - "noObjectDetailData": "상세 보기 데이터가 없습니다.", - "label": "세부 정보" + "noDataFound": "검토할 세부 정보 데이터가 없습니다", + "aria": "세부 정보 보기 전환", + "trackedObject_one": "객체 {{count}}개", + "trackedObject_other": "객체 {{count}}개", + "noObjectDetailData": "사용 가능한 객체 세부 정보가 없습니다.", + "label": "세부 정보", + "settings": "세부 정보 보기 설정", + "alwaysExpandActive": { + "title": "활성 항목 항상 펼치기", + "desc": "사용 가능한 경우 활성 다시보기 항목의 객체 세부 정보를 항상 펼쳐서 표시합니다." + } }, "objectTrack": { - "trackedPoint": "추적 포인트", - "clickToSeek": "이 시점으로 이동" + "trackedPoint": "추적 지점", + "clickToSeek": "이 시간대로 이동하려면 클릭하세요" }, - "documentTitle": "다시 보기 - Frigate", + "documentTitle": "다시보기 - Frigate", "recordings": { - "documentTitle": "녹화 - Frigate" + "documentTitle": "녹화 - Frigate", + "invalidSharedLink": "파싱 오류로 인해 타임스탬프 녹화 링크를 열 수 없습니다.", + "invalidSharedCamera": "알 수 없거나 권한이 없는 카메라이므로 타임스탬프 녹화 링크를 열 수 없습니다." }, "calendarFilter": { "last24Hours": "최근 24시간" }, - "markAsReviewed": "'다시 봤음'으로 표시", - "markTheseItemsAsReviewed": "이 영상들을 '다시 봤음'으로 표시", + "markAsReviewed": "검토 완료로 표시", + "markTheseItemsAsReviewed": "이 항목들을 검토 완료로 표시", "newReviewItems": { - "label": "새로운 '다시 보기' 영상 보기", - "button": "새로운 '다시 보기' 영상" + "label": "새로운 다시보기 항목 보기", + "button": "검토할 새 항목" }, - "selected_one": "{{count}} 선택됨", - "selected_other": "{{count}} 선택됨", + "selected_one": "{{count}}개 선택됨", + "selected_other": "{{count}}개 선택됨", "camera": "카메라", "detected": "감지됨", "suspiciousActivity": "수상한 행동", "threateningActivity": "위협적인 행동", "zoomIn": "확대", - "zoomOut": "축소" + "zoomOut": "축소", + "select_all": "전체", + "normalActivity": "정상 활동", + "needsReview": "검토 필요", + "securityConcern": "보안 주의", + "motionSearch": { + "menuItem": "움직임 검색", + "openMenu": "카메라 옵션" + }, + "motionPreviews": { + "menuItem": "움직임 미리보기 보기", + "title": "움직임 미리보기: {{camera}}", + "mobileSettingsTitle": "움직임 미리보기 설정", + "mobileSettingsDesc": "재생 속도, 어둡기(Dim), 자르기(Crop)를 조절하고 움직임 전용 클립을 검토할 날짜를 선택하세요.", + "dim": "어둡기", + "dimAria": "어둡기 강도 조절", + "dimDesc": "배경 어둡기를 높여 움직임 영역의 가시성을 높입니다.", + "speed": "재생 속도", + "speedAria": "미리보기 재생 속도 선택", + "speedDesc": "미리보기 클립의 재생 속도를 선택하세요.", + "back": "뒤로", + "empty": "사용 가능한 미리보기가 없습니다", + "noPreview": "미리보기를 사용할 수 없습니다", + "seekAria": "{{camera}} 플레이어를 {{time}} 위치로 이동", + "filter": "필터", + "filterDesc": "선택한 영역에 움직임이 있는 클립만 표시합니다.", + "filterClear": "초기화", + "crop": "필터 영역으로 확대", + "cropAria": "미리보기를 필터 영역으로 자르기 전환", + "cropDesc": "전체 화면 대신 선택한 필터 영역으로 미리보기를 확대합니다." + } } diff --git a/web/public/locales/ko/views/explore.json b/web/public/locales/ko/views/explore.json index 5b9c9d5872..52785d00ee 100644 --- a/web/public/locales/ko/views/explore.json +++ b/web/public/locales/ko/views/explore.json @@ -1,39 +1,263 @@ { "documentTitle": "탐색 - Frigate", "generativeAI": "생성형 AI", - "exploreMore": "{{label}} 더 많은 감지 대상 탐색하기", + "exploreMore": "더 많은 {{label}} 객체 탐색", "exploreIsUnavailable": { - "title": "탐색을 사용할 수 없습니다", + "title": "탐색 기능을 사용할 수 없음", "embeddingsReindexing": { - "context": "추적된 객체의 임베딩 색인 재구성이 완료된 후 '탐색' 기능을 사용할 수 있습니다.", + "context": "추적 객체 임베딩 재색인이 완료된 후 탐색 기능을 사용할 수 있습니다.", "startingUp": "시작 중…", - "estimatedTime": "예상 남은시간:", + "estimatedTime": "예상 남은 시간:", "finishingShortly": "곧 완료됩니다", "step": { - "thumbnailsEmbedded": "처리된 썸네일: ", - "descriptionsEmbedded": "처리된 설명: ", - "trackedObjectsProcessed": "처리된 추적 감지: " + "thumbnailsEmbedded": "임베딩된 썸네일: ", + "descriptionsEmbedded": "임베딩된 설명: ", + "trackedObjectsProcessed": "처리된 추적 객체: " } }, "downloadingModels": { - "context": "Frigate가 시맨틱 검색 기능을 지원하기 위해 필요한 임베딩 모델을 다운로드하고 있습니다. 네트워크 연결 속도에 따라 몇 분 정도 소요될 수 있습니다.", + "context": "Frigate이 시맨틱 검색 기능을 지원하기 위해 필요한 임베딩 모델을 다운로드하고 있습니다. 네트워크 연결 속도에 따라 몇 분 정도 걸릴 수 있습니다.", "setup": { "visionModel": "비전 모델", "visionModelFeatureExtractor": "비전 모델 특징 추출기", - "textModel": "Text model", + "textModel": "텍스트 모델", "textTokenizer": "텍스트 토크나이저" }, "tips": { - "context": "모델이 다운로드된 후 추적 객체의 임베딩을 색인 재구성하는 것이 좋습니다." + "context": "모델 다운로드가 완료되면 추적 객체의 임베딩을 다시 색인하는 것이 좋습니다." }, "error": "오류가 발생했습니다. Frigate 로그를 확인하세요." } }, "details": { - "timestamp": "시간 기록" + "timestamp": "타임스탬프", + "item": { + "title": "다시보기 항목 세부 정보", + "desc": "다시보기 항목 세부 정보", + "button": { + "share": "이 다시보기 항목 공유", + "viewInExplore": "탐색에서 보기" + }, + "tips": { + "mismatch_other": "사용할 수 없는 객체 {{count}}개가 감지되어 이 다시보기 항목에 포함되었습니다. 해당 객체는 알림 또는 감지 기준을 충족하지 못했거나 이미 정리/삭제되었습니다.", + "hasMissingObjects": "다음 레이블에 대해 Frigate이 추적 객체를 저장하도록 하려면 설정을 조정하세요: {{objects}}" + }, + "toast": { + "success": { + "regenerate": "{{provider}}에 새로운 설명을 요청했습니다. 제공업체의 처리 속도에 따라 새 설명을 다시 생성하는 데 시간이 걸릴 수 있습니다.", + "updatedSublabel": "하위 레이블을 성공적으로 업데이트했습니다.", + "updatedLPR": "차량 번호판을 성공적으로 업데이트했습니다.", + "updatedAttributes": "속성을 성공적으로 업데이트했습니다.", + "audioTranscription": "오디오 텍스트 변환을 성공적으로 요청했습니다. Frigate 서버 성능에 따라 변환이 완료되기까지 시간이 걸릴 수 있습니다." + }, + "error": { + "regenerate": "{{provider}}에 새 설명 요청 실패: {{errorMessage}}", + "updatedSublabelFailed": "하위 레이블 업데이트 실패: {{errorMessage}}", + "updatedLPRFailed": "차량 번호판 업데이트 실패: {{errorMessage}}", + "updatedAttributesFailed": "속성 업데이트 실패: {{errorMessage}}", + "audioTranscription": "오디오 텍스트 변환 요청 실패: {{errorMessage}}" + } + } + }, + "label": "레이블", + "editSubLabel": { + "title": "하위 레이블 수정", + "desc": "이 {{label}}의 새 하위 레이블 입력", + "descNoLabel": "이 추적 객체의 새 하위 레이블 입력" + }, + "editLPR": { + "title": "차량 번호판 수정", + "desc": "이 {{label}}의 새 번호판 번호 입력", + "descNoLabel": "이 추적 객체의 새 번호판 번호 입력" + }, + "editAttributes": { + "title": "속성 수정", + "desc": "이 {{label}}의 분류 속성 선택" + }, + "snapshotScore": { + "label": "스냅샷 점수" + }, + "topScore": { + "label": "최고 점수", + "info": "최고 점수는 추적 객체의 가장 높은 중간값(median) 점수이므로 검색 결과 썸네일에 표시된 점수와 다를 수 있습니다." + }, + "score": { + "label": "신뢰도 점수" + }, + "recognizedLicensePlate": "인식된 차량 번호판", + "attributes": "분류 속성", + "estimatedSpeed": "예상 속도", + "objects": "객체", + "camera": "카메라", + "zones": "구역", + "button": { + "findSimilar": "유사 항목 찾기", + "regenerate": { + "title": "다시 생성", + "label": "추적 객체 설명 다시 생성" + } + }, + "description": { + "label": "설명", + "placeholder": "추적된 객체에 대한 설명", + "aiTips": "Frigate은 추적 객체의 수명주기가 완전히 끝날 때까지 생성형 AI 제공업체에 설명을 요청하지 않습니다." + }, + "expandRegenerationMenu": "설명 재생성 메뉴 펼치기", + "regenerateFromSnapshot": "스냅샷 기반으로 다시 생성", + "regenerateFromThumbnails": "썸네일 기반으로 다시 생성", + "tips": { + "descriptionSaved": "설명을 성공적으로 저장했습니다", + "saveDescriptionFailed": "설명 업데이트 실패: {{errorMessage}}" + }, + "title": { + "label": "제목" + }, + "scoreInfo": "점수 정보" }, "trackedObjectDetails": "추적 객체 세부 정보", "type": { - "details": "세부 정보" + "details": "세부 정보", + "snapshot": "스냅샷", + "thumbnail": "썸네일", + "video": "동영상", + "tracking_details": "추적 세부 정보" + }, + "trackingDetails": { + "title": "추적 세부 정보", + "noImageFound": "이 타임스탬프의 이미지를 찾을 수 없습니다.", + "createObjectMask": "객체 마스크 생성", + "adjustAnnotationSettings": "어노테이션 설정 조정", + "scrollViewTips": "이 객체 수명주기의 주요 순간을 보려면 클릭하세요.", + "autoTrackingTips": "자동 추적 카메라의 경우 바운딩 박스 위치가 부정확할 수 있습니다.", + "count": "{{second}}개 중 {{first}}", + "trackedPoint": "추적 지점", + "lifecycleItemDesc": { + "visible": "{{label}} 감지됨", + "entered_zone": "{{label}}이(가) {{zones}}에 진입함", + "active": "{{label}}이(가) 활동 상태로 전환됨", + "stationary": "{{label}}이(가) 정지 상태로 전환됨", + "attribute": { + "faceOrLicense_plate": "{{label}}의 {{attribute}} 감지됨", + "other": "{{label}}이(가) {{attribute}}(으)로 인식됨" + }, + "gone": "{{label}}이(가) 사라짐", + "heard": "{{label}} 소리 감지됨", + "external": "{{label}} 감지됨", + "header": { + "zones": "구역", + "ratio": "비율", + "area": "면적", + "score": "점수", + "computedScore": "계산된 점수", + "topScore": "최고 점수", + "toggleAdvancedScores": "고급 점수 전환" + } + }, + "annotationSettings": { + "title": "어노테이션 설정", + "showAllZones": { + "title": "모든 구역 표시", + "desc": "객체가 특정 구역에 진입한 프레임에서 항상 모든 구역을 표시합니다." + }, + "offset": { + "label": "어노테이션 오프셋", + "desc": "이 데이터는 카메라의 감지(detect) 피드에서 생성되지만 녹화(record) 피드의 영상 위에 덧씌워집니다. 두 스트림이 완벽히 동기화되지 않을 수 있어 바운딩 박스와 녹화 영상이 정확히 일치하지 않을 수 있습니다. 이 설정을 사용하여 어노테이션을 시간상 앞뒤로 이동해 녹화 영상과의 싱크를 맞출 수 있습니다.", + "millisecondsToOffset": "감지 어노테이션을 오프셋할 밀리초(ms) 단위 시간입니다. 기본값: 0", + "tips": "영상 재생이 박스 및 이동 경로 지점보다 앞서면 값을 낮추고, 영상 재생이 뒤처지면 값을 높이세요. 음수 값도 가능합니다.", + "toast": { + "success": "{{camera}} 카메라의 어노테이션 오프셋이 설정 파일에 저장되었습니다." + } + } + }, + "carousel": { + "previous": "이전 슬라이드", + "next": "다음 슬라이드" + } + }, + "itemMenu": { + "downloadVideo": { + "label": "동영상 다운로드", + "aria": "동영상 다운로드" + }, + "downloadSnapshot": { + "label": "스냅샷 다운로드", + "aria": "스냅샷 다운로드" + }, + "downloadCleanSnapshot": { + "label": "클린 스냅샷(박스 제외) 다운로드", + "aria": "클린 스냅샷 다운로드" + }, + "viewTrackingDetails": { + "label": "추적 세부 정보 보기", + "aria": "추적 세부 정보 표시" + }, + "findSimilar": { + "label": "유사 항목 찾기", + "aria": "유사한 추적 객체 찾기" + }, + "addTrigger": { + "label": "트리거 추가", + "aria": "이 추적 객체에 대한 트리거 추가" + }, + "audioTranscription": { + "label": "음성 변환", + "aria": "오디오 텍스트 변환 요청" + }, + "submitToPlus": { + "label": "Frigate+에 제출", + "aria": "Frigate Plus에 제출" + }, + "viewInHistory": { + "label": "기록에서 보기", + "aria": "기록에서 보기" + }, + "deleteTrackedObject": { + "label": "이 추적 객체 삭제" + }, + "showObjectDetails": { + "label": "객체 이동 경로 표시" + }, + "hideObjectDetails": { + "label": "객체 이동 경로 숨기기" + }, + "debugReplay": { + "label": "디버그 리플레이", + "aria": "디버그 리플레이 보기에서 이 추적 객체 보기" + }, + "more": { + "aria": "더보기" + } + }, + "dialog": { + "confirmDelete": { + "title": "삭제 확인", + "desc": "이 추적 객체를 삭제하면 스냅샷, 저장된 임베딩 및 연결된 모든 추적 세부 정보 항목이 제거됩니다. 기록 보기의 녹화 영상은 삭제되지 않습니다.

정말로 계속 진행하시겠습니까?" + }, + "toast": { + "error": "이 추적 객체 삭제 중 오류 발생: {{errorMessage}}" + } + }, + "noTrackedObjects": "추적된 객체를 찾을 수 없음", + "fetchingTrackedObjectsFailed": "추적 객체 불러오기 오류: {{errorMessage}}", + "trackedObjectsCount_other": "추적된 객체 {{count}}개 ", + "searchResult": { + "tooltip": "{{type}} 기준 {{confidence}}% 일치", + "previousTrackedObject": "이전 추적 객체", + "nextTrackedObject": "다음 추적 객체", + "deleteTrackedObject": { + "toast": { + "success": "추적 객체가 성공적으로 삭제되었습니다.", + "error": "추적 객체 삭제 실패: {{errorMessage}}" + } + } + }, + "aiAnalysis": { + "title": "AI 분석" + }, + "concerns": { + "label": "주의 사항" + }, + "objectLifecycle": { + "noImageFound": "이 추적 객체에 대한 이미지를 찾을 수 없습니다." } } diff --git a/web/public/locales/ko/views/exports.json b/web/public/locales/ko/views/exports.json index 588cdd800a..c597b49785 100644 --- a/web/public/locales/ko/views/exports.json +++ b/web/public/locales/ko/views/exports.json @@ -1,11 +1,11 @@ { "documentTitle": "내보내기 - Frigate", "search": "검색", - "noExports": "내보내기가 없습니다", + "noExports": "내보내기 항목을 찾을 수 없음", "deleteExport": { "label": "내보내기 삭제" }, - "deleteExport.desc": "{{exportName}}을 지우시겠습니까?", + "deleteExport.desc": "정말로 {{exportName}} 항목을 삭제하시겠습니까?", "editExport": { "title": "내보내기 이름 변경", "desc": "이 내보내기의 새 이름을 입력하세요.", @@ -13,24 +13,116 @@ }, "toast": { "error": { - "renameExportFailed": "내보내기 이름 변경에 실패했습니다: {{errorMessage}}", - "assignCaseFailed": "케이스 할당 업데이트 실패: {{errorMessage}}" + "renameExportFailed": "내보내기 이름 변경 실패: {{errorMessage}}", + "assignCaseFailed": "케이스 지정 업데이트 실패: {{errorMessage}}", + "caseSaveFailed": "케이스 저장 실패: {{errorMessage}}", + "caseDeleteFailed": "케이스 삭제 실패: {{errorMessage}}" } }, "headings": { - "uncategorizedExports": "분류되지 않은 내보내기", + "uncategorizedExports": "미분류 내보내기", "cases": "케이스" }, "tooltip": { "shareExport": "내보내기 공유", "downloadVideo": "동영상 다운로드", - "editName": "이름 편집", + "editName": "이름 수정", "deleteExport": "내보내기 삭제", - "assignToCase": "케이스에 추가" + "assignToCase": "케이스에 추가", + "removeFromCase": "케이스에서 지우기" }, "caseDialog": { "title": "케이스에 추가", - "description": "기존 케이스를 선택하거나 새 케이스를 만드세요.", - "selectLabel": "케이스" + "description": "기존 케이스를 선택하거나 새 케이스를 생성하세요.", + "selectLabel": "케이스", + "newCaseOption": "새 케이스 생성", + "nameLabel": "케이스 이름", + "descriptionLabel": "설명" + }, + "selected_one": "{{count}}개 선택됨", + "selected_other": "{{count}}개 선택됨", + "toolbar": { + "newCase": "새 케이스", + "addExport": "내보내기 추가", + "editCase": "케이스 수정", + "deleteCase": "케이스 지우기" + }, + "deleteCase": { + "label": "케이스 삭제", + "desc": "정말로 {{caseName}} 케이스를 삭제하시겠습니까?", + "descKeepExports": "내보내기 파일들은 미분류 내보내기로 계속 유지됩니다.", + "descDeleteExports": "이 케이스에 포함된 모든 내보내기 파일이 영구적으로 삭제됩니다.", + "deleteExports": "내보내기 파일도 함께 삭제" + }, + "caseCard": { + "emptyCase": "아직 내보내기 항목이 없습니다" + }, + "jobCard": { + "defaultName": "{{camera}} 내보내기", + "queued": "대기 중", + "running": "실행 중", + "preparing": "준비 중", + "copying": "복사 중", + "encoding": "인코딩 중", + "encodingRetry": "인코딩 재시도 중", + "finalizing": "마무리 중" + }, + "caseView": { + "noDescription": "설명 없음", + "createdAt": "{{value}} 생성됨", + "exportCount_one": "내보내기 1건", + "exportCount_other": "내보내기 {{count}}건", + "cameraCount_one": "카메라 1대", + "cameraCount_other": "카메라 {{count}}대", + "showMore": "더보기", + "showLess": "간략히 보기", + "emptyTitle": "이 케이스가 비어 있습니다", + "emptyDescription": "케이스를 정리하려면 기존의 미분류 내보내기 항목을 추가하세요.", + "emptyDescriptionNoExports": "추가할 수 있는 미분류 내보내기 항목이 아직 없습니다." + }, + "caseEditor": { + "createTitle": "케이스 생성", + "editTitle": "케이스 수정", + "namePlaceholder": "케이스 이름", + "descriptionPlaceholder": "이 케이스에 대한 메모나 컨텍스트 추가" + }, + "addExportDialog": { + "title": "{{caseName}}에 내보내기 추가", + "searchPlaceholder": "미분류 내보내기 검색", + "empty": "검색 결과와 일치하는 미분류 내보내기가 없습니다.", + "addButton_one": "내보내기 1건 추가", + "addButton_other": "내보내기 {{count}}건 추가", + "adding": "추가 중..." + }, + "bulkActions": { + "addToCase": "케이스에 추가", + "moveToCase": "케이스로 이동", + "removeFromCase": "케이스에서 제거", + "delete": "삭제", + "deleteNow": "지금 삭제" + }, + "bulkDelete": { + "title": "내보내기 일괄 삭제", + "desc_one": "정말로 내보내기 {{count}}건을 삭제하시겠습니까?", + "desc_other": "정말로 내보내기 {{count}}건을 삭제하시겠습니까?" + }, + "bulkRemoveFromCase": { + "title": "케이스에서 제거", + "desc_one": "이 케이스에서 내보내기 {{count}}건을 제거하시겠습니까?", + "desc_other": "이 케이스에서 내보내기 {{count}}건을 제거하시겠습니까?", + "descKeepExports": "내보내기 파일이 미분류 상태로 이동됩니다.", + "descDeleteExports": "내보내기 파일이 영구적으로 삭제됩니다.", + "deleteExports": "대신 내보내기 파일 영구 삭제" + }, + "bulkToast": { + "success": { + "delete": "내보내기 항목을 성공적으로 삭제했습니다", + "reassign": "케이스 지정을 성공적으로 업데이트했습니다", + "remove": "케이스에서 내보내기 항목을 성공적으로 제거했습니다" + }, + "error": { + "deleteFailed": "내보내기 삭제 실패: {{errorMessage}}", + "reassignFailed": "케이스 지정 업데이트 실패: {{errorMessage}}" + } } } diff --git a/web/public/locales/ko/views/faceLibrary.json b/web/public/locales/ko/views/faceLibrary.json index a99cb3875d..89dff4b8f3 100644 --- a/web/public/locales/ko/views/faceLibrary.json +++ b/web/public/locales/ko/views/faceLibrary.json @@ -1,92 +1,104 @@ { "description": { - "placeholder": "이 모음집의 이름을 입력해주세요", - "addFace": "안면인식 라이브러리에서 첫 사진을 업로드해 새로운 컬렉션을 만들어보세요.", - "invalidName": "잘못된 이름입니다. 이름은 문자, 숫자, 공백, 따옴표 ('), 밑줄 (_), 그리고 붙임표 (-)만 포함이 가능합니다.", - "nameCannotContainHash": "이름에 #을 포함할 수 없습니다." + "placeholder": "이 컬렉션의 이름 입력", + "addFace": "첫 번째 이미지를 업로드하여 얼굴 라이브러리에 새 컬렉션을 추가하세요.", + "invalidName": "유효하지 않은 이름입니다. 이름에는 문자, 숫자, 공백, 아포스트로피('), 밑줄(_), 하이픈(-)만 포함할 수 있습니다.", + "nameCannotContainHash": "이름에는 # 기호를 포함할 수 없습니다." }, "details": { "person": "사람", "subLabelScore": "보조 레이블 신뢰도", "face": "얼굴 상세정보", - "timestamp": "시간 기록", + "timestamp": "타임스탬프", "unknown": "알 수 없음", - "scoreInfo": "점수는 각 이미지에서 얼굴의 크기를 가중치로 적용하여 모든 얼굴 점수의 평균을 낸 값입니다." + "scoreInfo": "점수는 각 이미지에서 얼굴이 차지하는 크기로 가중치를 부여한 모든 얼굴 점수의 가중 평균입니다." }, "selectItem": "{{item}} 선택", "documentTitle": "얼굴 라이브러리 - Frigate", "uploadFaceImage": { - "title": "얼굴 사진 올리기", - "desc": "얼굴을 스캔하고 {{pageToggle}}에 포함하기 위해 이미지를 업로드하세요" + "title": "얼굴 이미지 업로드", + "desc": "얼굴을 스캔하여 {{pageToggle}}에 추가할 이미지를 업로드하세요" }, - "collections": "모음집", + "collections": "컬렉션", "createFaceLibrary": { "title": "모음집 만들기", "desc": "새로운 모음집 만들기", - "new": "새 얼굴 만들기", - "nextSteps": "강력한 기반을 구축하려면:
  • 최근 인식 탭을 사용하여 감지된 각 사람의 이미지를 선택하고 학습하세요.
  • 최상의 결과를 위해 정면 이미지에 집중하고, 각도가 있는 얼굴이 촬영된 이미지는 학습에 사용하지 마세요.
  • " + "new": "새 얼굴 등록", + "nextSteps": "정확도를 높이기 위한 권장 사항:
  • '최근 인식' 탭을 사용하여 감지된 인물별 이미지를 선택하고 학습시키세요.
  • 최상의 결과를 위해 정면을 바라보는 사진 위주로 등록하고, 각도가 틀어진 얼굴 이미지는 피하세요.
  • " }, "steps": { "faceName": "얼굴 이름 입력", - "uploadFace": "얼굴 사진 올리기", + "uploadFace": "얼굴 이미지 업로드", "nextSteps": "다음 단계", "description": { - "uploadFace": "정면을 향한 {{name}}의 얼굴이 보이는 이미지를 업로드하세요. 이미지를 얼굴만 자를 필요는 없습니다." + "uploadFace": "{{name}}의 얼굴이 정면에서 보이는 이미지를 업로드하세요. 얼굴 부분만 따로 크롭하지 않아도 됩니다." } }, "train": { "title": "최근 인식", "aria": "최근 인식 선택", - "titleShort": "최근" + "titleShort": "최근", + "empty": "최근 얼굴 인식 시도 내역이 없습니다", + "emptyNoLibrary": { + "title": "얼굴 업로드", + "description": "얼굴 인식 기능이 작동하려면 라이브러리에 최소 한 개 이상의 얼굴을 등록해야 합니다." + } }, "selectFace": "얼굴 선택", "deleteFaceLibrary": { - "title": "이름 삭제" + "title": "이름 삭제", + "desc": "정말로 '{{name}}' 컬렉션을 삭제하시겠습니까? 연결된 모든 얼굴이 영구적으로 삭제됩니다." }, "deleteFaceAttempts": { - "title": "얼굴 삭제" + "title": "얼굴 삭제", + "desc_other": "정말로 얼굴 {{count}}개를 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다." }, "renameFace": { - "title": "얼굴 이름 바꾸기", - "desc": "{{name}}의 새 이름을 입력하세요" + "title": "얼굴 이름 변경", + "desc": "'{{name}}'의 새 이름을 입력하세요" }, "button": { "deleteFaceAttempts": "얼굴 삭제", "addFace": "얼굴 추가", - "renameFace": "얼굴 이름 바꾸기", + "renameFace": "얼굴 이름 변경", "deleteFace": "얼굴 삭제", - "uploadImage": "이미지 올리기", - "reprocessFace": "얼굴 재조정" + "uploadImage": "이미지 업로드", + "reprocessFace": "얼굴 재처리" }, "imageEntry": { "validation": { - "selectImage": "이미지 파일을 선택해주세요." + "selectImage": "이미지 파일을 선택해 주세요." }, - "dropActive": "여기에 이미지 놓기…", - "dropInstructions": "이미지를 끌어다 놓거나 여기에 붙여넣으세요. 선택할 수도 있습니다.", - "maxSize": "최대 용량: {{size}}MB" + "dropActive": "여기에 이미지를 놓으세요…", + "dropInstructions": "이미지를 여기로 드래그 앤 드롭하거나 붙여넣기, 또는 클릭하여 선택하세요", + "maxSize": "최대 크기: {{size}}MB" }, - "nofaces": "얼굴을 찾을 수 없습니다", + "nofaces": "사용 가능한 얼굴 없음", "pixels": "{{area}}px", - "trainFaceAs": "얼굴을 다음과 같이 훈련하기:", - "trainFace": "얼굴 훈련하기", + "trainFaceAs": "다음으로 얼굴 학습:", + "trainFace": "얼굴 학습", "toast": { "success": { - "uploadedImage": "이미지 업로드에 성공했습니다.", - "addFaceLibrary": "{{name}} 을 성공적으로 얼굴 라이브러리에 추가했습니다!", - "deletedFace_other": "{{count}} 얼굴을 성공적으로 삭제했습니다.", - "renamedFace": "얼굴 이름을 {{name}} 으로 성공적으로 바꿨습니다", - "trainedFace": "얼굴 훈련을 성공적으로 마쳤습니다.", - "updatedFaceScore": "{{name}} 얼굴 점수 업데이트 성공 {{score}}." + "uploadedImage": "이미지를 성공적으로 업로드했습니다.", + "addFaceLibrary": "'{{name}}'이(가) 얼굴 라이브러리에 성공적으로 추가되었습니다!", + "deletedFace_other": "얼굴 {{count}}개를 성공적으로 삭제했습니다.", + "renamedFace": "얼굴 이름을 '{{name}}'(으)로 성공적으로 변경했습니다", + "trainedFace": "얼굴 학습을 성공적으로 완료했습니다.", + "updatedFaceScore": "얼굴 점수를 '{{name}}' ({{score}})(으)로 성공적으로 업데이트했습니다.", + "deletedName_other": "얼굴 {{count}}개를 성공적으로 삭제했습니다.", + "reclassifiedFace": "얼굴 재분류를 성공적으로 완료했습니다." }, "error": { - "uploadingImageFailed": "이미지 업로드 실패:{{errorMessage}}", - "addFaceLibraryFailed": "얼굴 이름 설정 실패:{{errorMessage}}", - "deleteFaceFailed": "삭제 실패:{{errorMessage}}", - "deleteNameFailed": "이름 삭제 실패:{{errorMessage}}", - "renameFaceFailed": "이름 바꾸기 실패:{{errorMessage}}", - "trainFailed": "훈련 실패:{{errorMessage}}", - "updateFaceScoreFailed": "얼굴 신뢰도 업데이트 실패:{{errorMessage}}" + "uploadingImageFailed": "이미지 업로드 실패: {{errorMessage}}", + "addFaceLibraryFailed": "얼굴 이름 설정 실패: {{errorMessage}}", + "deleteFaceFailed": "삭제 실패: {{errorMessage}}", + "deleteNameFailed": "이름 삭제 실패: {{errorMessage}}", + "renameFaceFailed": "얼굴 이름 변경 실패: {{errorMessage}}", + "trainFailed": "학습 실패: {{errorMessage}}", + "updateFaceScoreFailed": "얼굴 점수 업데이트 실패: {{errorMessage}}", + "reclassifyFailed": "얼굴 재분류 실패: {{errorMessage}}" } - } + }, + "reclassifyFaceAs": "다음으로 얼굴 재분류:", + "reclassifyFace": "얼굴 재분류" } diff --git a/web/public/locales/ko/views/live.json b/web/public/locales/ko/views/live.json index c2b05d04ea..0a9d969313 100644 --- a/web/public/locales/ko/views/live.json +++ b/web/public/locales/ko/views/live.json @@ -1,22 +1,24 @@ { - "documentTitle": "실시간 보기 - Frigate", - "documentTitle.withCamera": "{{camera}} - 실시간 보기 - Frigate", + "documentTitle": { + "default": "실시간 - Frigate" + }, + "documentTitle.withCamera": "{{camera}} - 실시간 - Frigate", "lowBandwidthMode": "저대역폭 모드", "twoWayTalk": { - "enable": "양방향 말하기 활성화", - "disable": "양방향 말하기 비활성화" + "enable": "양방향 대화 켜기", + "disable": "양방향 대화 끄기" }, "cameraAudio": { - "enable": "카메라 오디오 활성화", - "disable": "카메라 오디오 비활성화" + "enable": "카메라 오디오 켜기", + "disable": "카메라 오디오 끄기" }, "ptz": { "move": { "clickMove": { - "label": "클릭해서 카메라 중앙 배치", - "enable": "클릭해서 움직이기 기능 활성화", - "disable": "클릭해서 움직이기 기능 비활성화", - "enableWithZoom": "클릭하여 이동 / 드래그하여 확대 활성화" + "label": "화면을 클릭하여 카메라 중앙 맞추기", + "enable": "클릭 이동 활성화", + "disable": "클릭 이동 비활성화", + "enableWithZoom": "클릭 이동 / 드래그 줌 활성화" }, "left": { "label": "PTZ 카메라 왼쪽으로 이동" @@ -41,158 +43,162 @@ }, "focus": { "in": { - "label": "PTZ 카메라 포커스 인" + "label": "PTZ 카메라 초점 당기기" }, "out": { - "label": "PTZ 카메라 포커스 아웃" + "label": "PTZ 카메라 초점 밀기" } }, "frame": { "center": { - "label": "클릭해서 PTZ 카메라 중앙 배치" + "label": "화면을 클릭하여 PTZ 카메라 중앙 맞추기" } }, "presets": "PTZ 카메라 프리셋" }, "camera": { "enable": "카메라 활성화", - "disable": "카메라 비활성화" + "disable": "카메라 비활성화", + "turnOn": "카메라 켜기", + "turnOff": "카메라 끄기" }, "muteCameras": { "enable": "모든 카메라 음소거", "disable": "모든 카메라 음소거 해제" }, "detect": { - "enable": "감지 활성화", - "disable": "감지 비활성화" + "enable": "감지(Detect) 켜기", + "disable": "감지(Detect) 끄기" }, "recording": { - "enable": "녹화 활성화", - "disable": "녹화 비활성화" + "enable": "녹화 켜기", + "disable": "녹화 끄기", + "disabledInConfig": "이 카메라의 녹화를 활성화하려면 먼저 설정에서 켜야 합니다." }, "snapshots": { - "enable": "스냅샷 활성화", - "disable": "스냅샷 비활성화" + "enable": "스냅샷 켜기", + "disable": "스냅샷 끄기" }, "audioDetect": { - "enable": "오디오 감지 활성화", - "disable": "오디오 감지 비활성화" + "enable": "오디오 감지 켜기", + "disable": "오디오 감지 끄기" }, "transcription": { - "enable": "실시간 오디오 자막 활성화", - "disable": "실시간 오디오 자막 비활성화" + "enable": "실시간 음성 전사 켜기", + "disable": "실시간 음성 전사 끄기" }, "autotracking": { - "enable": "자동 추적 활성화", - "disable": "자동 추적 비활성화" + "enable": "자동 추적 켜기", + "disable": "자동 추적 끄기" }, "streamStats": { "enable": "스트림 통계 보기", "disable": "스트림 통계 숨기기" }, "manualRecording": { - "title": "수동 녹화", - "tips": "이 카메라의 녹화 보관 설정에 따라 인스턴트 스냅샷을 다운로드하거나 수동 녹화를 시작할 수 있습니다.", + "title": "수동 감지/녹화", + "tips": "즉시 스냅샷을 다운로드하거나 이 카메라의 녹화 보관 설정을 기반으로 수동 이벤트를 시작합니다.", "playInBackground": { "label": "백그라운드에서 재생", - "desc": "이 옵션을 활성화하면 플레이어가 숨겨져도 계속 스트리밍됩니다." + "desc": "플레이어가 화면에서 가려져 있을 때도 스트리밍을 계속 유지합니다." }, "showStats": { - "label": "통계 보기", - "desc": "이 옵션을 활성화하면 카메라 피드에 스트림 통계가 나타납니다." + "label": "통계 표시", + "desc": "카메라 피드 위에 실시간 스트림 통계 정보를 오버레이로 표시합니다." }, - "debugView": "디버그 보기", + "debugView": "디버그 뷰", "start": "수동 녹화 시작", - "started": "수동 녹화 시작되었습니다.", - "failedToStart": "수동 녹화 시작이 실패했습니다.", - "recordDisabledTips": "이 카메라 설정에서 녹화가 비활성화 되었거나 제한되어 있어 스냅샷만 저장됩니다.", + "started": "수동 녹화를 시작했습니다.", + "failedToStart": "수동 녹화 시작에 실패했습니다.", + "recordDisabledTips": "이 카메라는 설정에서 녹화가 비활성화되었거나 제한되어 있어 스냅샷만 저장됩니다.", "end": "수동 녹화 종료", - "ended": "수동 녹화가 종료되었습니다.", - "failedToEnd": "수동 녹화 종료가 실패했습니다." + "ended": "수동 녹화를 종료했습니다.", + "failedToEnd": "수동 녹화 종료에 실패했습니다." }, "streamingSettings": "스트리밍 설정", "notifications": "알림", "audio": "오디오", "suspend": { - "forTime": "일시정지 시간: " + "forTime": "일시 중지 시간: " }, "stream": { "title": "스트림", "audio": { - "available": "이 스트림에서 오디오를 사용할 수 있습니다", - "unavailable": "이 스트림에서 오디오를 사용할 수 없습니다", + "available": "이 스트림에서 오디오 기능을 사용할 수 있습니다", + "unavailable": "이 스트림에서는 오디오 기능을 사용할 수 없습니다", "tips": { - "title": "이 스트림에서 오디오를 사용하려면 카메라에서 오디오를 출력하고 go2rtc에서 설정해야 합니다." + "title": "오디오를 출력하려면 카메라에서 오디오를 지원하고 go2rtc에 해당 스트림이 설정되어 있어야 합니다." } }, "debug": { - "picker": "디버그 모드에선 스트림 모드를 선택할 수 없습니다. 디버그 뷰에서는 항상 감지(Detect) 역할로 설정한 스트림을 사용합니다." + "picker": "디버그 모드에서는 스트림을 선택할 수 없습니다. 디버그 뷰는 항상 detect 역할이 할당된 스트림을 사용합니다." }, "twoWayTalk": { - "tips": "양방향 말하기 기능을 사용하려면 기기에서 기능을 지원해야하며 WebRTC를 설정해야합니다.", - "available": "이 기기는 양방향 말하기 기능을 사용할 수 있습니다", - "unavailable": "이 기기는 양방향 말하기 기능을 사용할 수 없습니다" + "tips": "기기에서 해당 기능을 지원해야 하며 양방향 대화를 위해 WebRTC가 설정되어 있어야 합니다.", + "available": "이 스트림에서 양방향 대화를 사용할 수 있습니다", + "unavailable": "이 스트림에서는 양방향 대화를 사용할 수 없습니다" }, "lowBandwidth": { - "tips": "버퍼링 또는 스트림 오류로 실시간 화면을 저대역폭 모드로 변경되었습니다.", - "resetStream": "스트림 리셋" + "tips": "버퍼링 또는 스트림 오류로 인해 실시간 화면이 저대역폭 모드로 전환되었습니다.", + "resetStream": "스트림 초기화" }, "playInBackground": { "label": "백그라운드에서 재생", - "tips": "이 옵션을 활성화하면 플레이어가 숨겨져도 스트리밍이 지속됩니다." + "tips": "플레이어가 화면에서 가려져 있을 때도 스트리밍을 계속 유지합니다." } }, "cameraSettings": { "title": "{{camera}} 설정", "cameraEnabled": "카메라 활성화", - "objectDetection": "대상 감지", + "objectDetection": "객체 감지", "recording": "녹화", "snapshots": "스냅샷", "audioDetection": "오디오 감지", - "transcription": "오디오 자막", - "autotracking": "자동 추적" + "transcription": "오디오 텍스트 변환", + "autotracking": "자동 추적", + "camera": "카메라" }, "history": { - "label": "이전 영상 보기" + "label": "과거 녹화 영상 보기" }, "effectiveRetainMode": { "modes": { "all": "전체", - "motion": "움직임 감지", - "active_objects": "활성 대상" + "motion": "움직임", + "active_objects": "활동 중인 객체" }, "notAllTips": "{{source}} 녹화 보관 설정이 mode: {{effectiveRetainMode}}로 되어 있어, 이 수동 녹화는 {{effectiveRetainModeName}}이(가) 있는 구간만 저장됩니다." }, "editLayout": { "label": "레이아웃 편집", "group": { - "label": "카메라 그룹 편집" + "label": "카메라 그룹 수정" }, "exitEdit": "편집 종료" }, "noCameras": { "title": "설정된 카메라 없음", - "description": "카메라를 연결해 시작하세요.", + "description": "Frigate에 카메라를 연결하여 시작하세요.", "buttonText": "카메라 추가", "restricted": { - "title": "연결된 카메라 없음", - "description": "이 그룹의 카메라를 볼 권한이 없습니다." + "title": "사용 가능한 카메라 없음", + "description": "이 그룹의 카메라를 볼 수 있는 권한이 없습니다." }, "default": { "title": "설정된 카메라 없음", - "description": "카메라를 연결하여 Frigate을 시작하세요.", + "description": "Frigate에 카메라를 연결하여 시작하세요.", "buttonText": "카메라 추가" }, "group": { - "title": "그룹에 카메라 없음", - "description": "이 그룹에 할당되거나 활성화된 카메라가 없습니다.", + "title": "그룹 내 카메라 없음", + "description": "이 카메라 그룹에 할당되거나 활성화된 카메라가 없습니다.", "buttonText": "그룹 관리" } }, "snapshot": { - "takeSnapshot": "인스턴트 스냅샷 다운로드", - "noVideoSource": "스냅샷 찍을 비디오 소스가 없습니다.", - "captureFailed": "스냅샷 캡쳐를 하지 못했습니다.", - "downloadStarted": "스냅샷 다운로드가 시작됐습니다." + "takeSnapshot": "즉시 스냅샷 다운로드", + "noVideoSource": "스냅샷을 캡처할 비디오 소스가 없습니다.", + "captureFailed": "스냅샷 캡처에 실패했습니다.", + "downloadStarted": "스냅샷 다운로드가 시작되었습니다." } } diff --git a/web/public/locales/ko/views/motionSearch.json b/web/public/locales/ko/views/motionSearch.json index 0967ef424b..600525203a 100644 --- a/web/public/locales/ko/views/motionSearch.json +++ b/web/public/locales/ko/views/motionSearch.json @@ -1 +1,76 @@ -{} +{ + "documentTitle": "움직임 검색 - Frigate", + "title": "움직임 검색", + "description": "다각형을 그려 관심 영역(ROI)을 지정하고, 해당 영역 내에서 움직임 변화를 검색할 시간 범위를 지정하세요.", + "selectCamera": "움직임 검색을 불러오는 중입니다", + "startSearch": "검색 시작", + "searchStarted": "검색이 시작되었습니다", + "searchCancelled": "검색이 취소되었습니다", + "cancelSearch": "취소", + "searching": "검색 진행 중입니다.", + "scanning": "{{time}} 스캔 중", + "searchComplete": "검색 완료", + "noResultsYet": "선택한 영역의 움직임 변화를 찾으려면 검색을 실행하세요", + "noChangesFound": "선택한 영역에서 감지된 픽셀 변화가 없습니다", + "changesFound_other": "움직임 변화 {{count}}건 발견", + "framesProcessed": "{{count}}개 프레임 처리됨", + "jumpToTime": "이 시간대로 이동", + "results": "결과", + "showSegmentHeatmap": "히트맵", + "newSearch": "새 검색", + "clearResults": "결과 지우기", + "clearROI": "다각형 지우기", + "polygonControls": { + "points_other": "점 {{count}}개", + "undo": "마지막 점 취소", + "reset": "다각형 초기화", + "drawMode": "그리기", + "moveMode": "이동" + }, + "motionHeatmapLabel": "움직임 히트맵", + "dialog": { + "title": "움직임 검색", + "cameraLabel": "카메라", + "previewAlt": "{{camera}} 카메라 미리보기" + }, + "timeRange": { + "title": "검색 범위", + "start": "시작 시간", + "end": "종료 시간" + }, + "settings": { + "title": "검색 설정", + "parallelMode": "병렬 모드", + "parallelModeDesc": "여러 녹화 구간을 동시에 스캔합니다 (더 빠르지만 디코딩 자원을 더 많이 소모함)", + "threshold": "민감도 임계값", + "thresholdDesc": "값이 낮을수록 더 미세한 변화를 감지합니다 (1-255)", + "minArea": "최소 변화 면적", + "minAreaDesc": "단일 움직임 영역의 최소 크기(관심 영역 대비 백분율)", + "maxResults": "최대 결과 수", + "maxResultsDesc": "일치하는 타임스탬프가 이 개수에 도달하면 검색을 중단합니다" + }, + "errors": { + "noCamera": "카메라를 선택해 주세요", + "noROI": "관심 영역(ROI)을 그려 주세요", + "noTimeRange": "시간 범위를 선택해 주세요", + "invalidTimeRange": "종료 시간은 시작 시간 이후여야 합니다", + "searchFailed": "검색 실패: {{message}}", + "polygonTooSmall": "다각형은 최소 3개 이상의 점이 필요합니다", + "unknown": "알 수 없는 오류" + }, + "changePercentage": "{{percentage}}% 변화됨", + "metrics": { + "title": "검색 지표", + "segmentsScanned": "스캔한 세그먼트", + "segmentsProcessed": "처리됨", + "segmentsSkippedInactive": "건너뜀 (활동 없음)", + "segmentsSkippedHeatmap": "건너뜀 (ROI 겹침 없음)", + "fallbackFullRange": "전체 범위 폴백 스캔", + "framesDecoded": "디코딩된 프레임", + "wallTime": "검색 소요 시간", + "segmentErrors": "세그먼트 오류", + "seconds": "{{seconds}}초", + "minutesSeconds": "{{minutes}}분 {{seconds}}초", + "scanSummary": "{{segments}}개 세그먼트 · {{time}}" + } +} diff --git a/web/public/locales/ko/views/recording.json b/web/public/locales/ko/views/recording.json index 2aa9934de5..01b0f74d7a 100644 --- a/web/public/locales/ko/views/recording.json +++ b/web/public/locales/ko/views/recording.json @@ -1,12 +1,12 @@ { "filter": "필터", "export": "내보내기", - "calendar": "날짜", + "calendar": "달력", "filters": "필터", "toast": { "error": { - "noValidTimeSelected": "올바른 시간 범위를 선택하세요", - "endTimeMustAfterStartTime": "종료 시간은 시작 시간보다 뒤에 있어야합니다" + "noValidTimeSelected": "유효한 시간 범위가 선택되지 않았습니다", + "endTimeMustAfterStartTime": "종료 시간은 시작 시간 이후여야 합니다" } } } diff --git a/web/public/locales/ko/views/replay.json b/web/public/locales/ko/views/replay.json index 0967ef424b..e19bb60b2e 100644 --- a/web/public/locales/ko/views/replay.json +++ b/web/public/locales/ko/views/replay.json @@ -1 +1,60 @@ -{} +{ + "title": "디버그 리플레이", + "description": "디버깅을 위해 카메라 녹화본을 다시 재생합니다. 객체 목록에는 감지된 객체의 시간 지연 요약이 표시되며, 메시지 탭에는 리플레이 영상에 대한 Frigate 내부 메시지 스트림이 표시됩니다.", + "websocket_messages": "메시지", + "dialog": { + "title": "디버그 리플레이 시작", + "description": "객체 감지 및 추적 문제 디버깅을 위해 지난 녹화본을 반복 재생하는 임시 리플레이 카메라를 생성합니다. 리플레이 카메라는 원본 카메라와 동일한 감지 설정을 가집니다. 시작할 시간 범위를 선택하세요.", + "camera": "원본 카메라", + "timeRange": "시간 범위", + "preset": { + "1m": "최근 1분", + "5m": "최근 5분", + "timeline": "타임라인에서 선택", + "custom": "사용자 정의" + }, + "startButton": "리플레이 시작", + "selectFromTimeline": "선택", + "starting": "리플레이 시작 중...", + "startLabel": "시작", + "endLabel": "종료", + "toast": { + "error": "디버그 리플레이 시작 실패: {{error}}", + "alreadyActive": "이미 활성화된 리플레이 세션이 있습니다", + "noRecordings": "선택한 시간 범위에서 녹화본을 찾을 수 없습니다", + "stopError": "디버그 리플레이 중지 실패: {{error}}", + "goToReplay": "리플레이로 이동" + } + }, + "page": { + "noSession": "활성화된 디버그 리플레이 세션 없음", + "noSessionDesc": "기록(History) 보기 툴바에서 작업(Actions) 버튼을 클릭하고 '디버그 리플레이'를 선택하여 시작하세요.", + "goToRecordings": "기록으로 이동", + "preparingClip": "클립 준비 중…", + "preparingClipDesc": "Frigate이 선택한 시간 범위의 녹화본을 이어 붙이는 중입니다. 긴 시간 범위의 경우 약 1분 정도 소요될 수 있습니다.", + "startingCamera": "디버그 리플레이 시작 중…", + "startError": { + "title": "디버그 리플레이 시작 실패", + "back": "기록으로 돌아가기" + }, + "sourceCamera": "원본 카메라", + "replayCamera": "리플레이 카메라", + "initializingReplay": "디버그 리플레이 초기화 중...", + "stoppingReplay": "디버그 리플레이 중지 중...", + "stopReplay": "리플레이 중지", + "confirmStop": { + "title": "디버그 리플레이를 중지하시겠습니까?", + "description": "세션이 중지되고 모든 임시 데이터가 정리됩니다. 계속하시겠습니까?", + "confirm": "리플레이 중지", + "cancel": "취소" + }, + "activity": "활동", + "objects": "객체 목록", + "audioDetections": "오디오 감지", + "noActivity": "감지된 활동 없음", + "activeTracking": "활성 추적 중", + "noActiveTracking": "활성 추적 없음", + "configuration": "설정", + "configurationDesc": "디버그 리플레이 카메라의 움직임 감지 및 객체 추적 설정을 미세 조정합니다. Frigate 설정 파일에는 변경 사항이 저장되지 않습니다." + } +} diff --git a/web/public/locales/ko/views/search.json b/web/public/locales/ko/views/search.json index efb5c93870..71b3a750b4 100644 --- a/web/public/locales/ko/views/search.json +++ b/web/public/locales/ko/views/search.json @@ -1,14 +1,14 @@ { "search": "검색", - "savedSearches": "저장된 검색들", + "savedSearches": "저장된 검색 조건", "button": { - "clear": "검색 초기화", - "save": "검색 저장", + "clear": "검색어 지우기", + "save": "검색 조건 저장", "filterInformation": "필터 정보", - "delete": "저장된 검색 삭제", - "filterActive": "필터 활성화됨" + "delete": "저장된 검색 조건 삭제", + "filterActive": "필터 적용됨" }, - "searchFor": "{{inputValue}} 검색", + "searchFor": "'{{inputValue}}' 검색", "trackedObjectId": "추적 객체 ID", "filter": { "label": { @@ -22,7 +22,52 @@ "before": "이전", "after": "이후", "min_score": "최소 점수", - "max_score": "최대 점수" + "max_score": "최대 점수", + "min_speed": "최소 속도", + "max_speed": "최대 속도", + "recognized_license_plate": "인식된 차량 번호판", + "has_clip": "비디오 클립 있음", + "has_snapshot": "스냅샷 있음" + }, + "searchType": { + "thumbnail": "썸네일", + "description": "설명" + }, + "toast": { + "error": { + "beforeDateBeLaterAfter": "'이전(before)' 날짜는 '이후(after)' 날짜보다 뒤여야 합니다.", + "afterDatebeEarlierBefore": "'이후(after)' 날짜는 '이전(before)' 날짜보다 앞서야 합니다.", + "minScoreMustBeLessOrEqualMaxScore": "'최소 점수'는 '최대 점수'보다 작거나 같아야 합니다.", + "maxScoreMustBeGreaterOrEqualMinScore": "'최대 점수'는 '최소 점수'보다 크거나 같아야 합니다.", + "minSpeedMustBeLessOrEqualMaxSpeed": "'최소 속도'는 '최대 속도'보다 작거나 같아야 합니다.", + "maxSpeedMustBeGreaterOrEqualMinSpeed": "'최대 속도'는 '최소 속도'보다 크거나 같아야 합니다." + } + }, + "tips": { + "title": "텍스트 필터 사용 방법", + "desc": { + "text": "필터를 사용하면 검색 결과를 좁힐 수 있습니다. 입력창에서 다음과 같이 사용하세요:", + "step1": "필터 키 이름 뒤에 콜론을 입력합니다 (예: \"cameras:\").", + "step2": "추천 목록에서 값을 선택하거나 직접 입력합니다.", + "step3": "필터 사이에 공백을 두어 여러 개의 필터를 연속으로 사용할 수 있습니다.", + "step4": "날짜 필터(before:, after:)는 {{DateFormat}} 형식을 사용합니다.", + "step5": "시간 범위 필터는 {{exampleTime}} 형식을 사용합니다.", + "step6": "필터 옆의 'x'를 클릭하여 필터를 제거합니다.", + "exampleLabel": "예시:" + } + }, + "header": { + "currentFilterType": "필터 값", + "noFilters": "필터", + "activeFilters": "적용된 필터" } + }, + "similaritySearch": { + "title": "유사도 검색", + "active": "유사도 검색 활성 상태", + "clear": "유사도 검색 초기화" + }, + "placeholder": { + "search": "검색…" } } diff --git a/web/public/locales/ko/views/settings.json b/web/public/locales/ko/views/settings.json index 220cceb8f2..05e2aa98c8 100644 --- a/web/public/locales/ko/views/settings.json +++ b/web/public/locales/ko/views/settings.json @@ -3,118 +3,330 @@ "dialog": { "form": { "threshold": { - "title": "임계치" + "title": "임계값", + "desc": "이 트리거의 유사도 임계값을 설정합니다. 임계값이 높을수록 더 정확하게 일치해야 트리거가 작동합니다.", + "error": { + "min": "임계값은 최소 0 이상이어야 합니다", + "max": "임계값은 최대 1 이하여야 합니다" + } }, "name": { - "title": "이름" + "title": "이름", + "placeholder": "트리거 이름 지정", + "description": "이 트리거를 식별할 고유한 이름 또는 설명을 입력하세요", + "error": { + "minLength": "최소 2자 이상이어야 합니다.", + "invalidCharacters": "영문자, 숫자, 밑줄(_), 하이픈(-)만 포함할 수 있습니다.", + "alreadyExists": "이 카메라에 동일한 이름의 트리거가 이미 존재합니다." + } }, "type": { - "title": "종류", - "placeholder": "트리거 종류 선택" + "title": "유형", + "placeholder": "트리거 유형 선택", + "description": "추적 객체의 설명이 유사할 때 트리거", + "thumbnail": "추적 객체의 썸네일이 유사할 때 트리거" + }, + "enabled": { + "description": "이 트리거 활성화 또는 비활성화" + }, + "content": { + "title": "내용", + "imagePlaceholder": "썸네일 선택", + "textPlaceholder": "텍스트 내용 입력", + "imageDesc": "최근 100개의 썸네일만 표시됩니다. 원하는 썸네일이 없는 경우 탐색 페이지에서 이전 객체를 찾아 해당 메뉴에서 트리거를 설정하세요.", + "textDesc": "유사한 추적 객체 설명이 감지될 때 동작을 실행할 텍스트를 입력하세요.", + "error": { + "required": "내용은 필수 입력 항목입니다." + } + }, + "actions": { + "title": "동작", + "desc": "기본적으로 Frigate은 모든 트리거에 대해 MQTT 메시지를 발행합니다. 하위 레이블은 객체 레이블에 트리거 이름을 추가합니다. 속성은 추적 객체 메타데이터에 별도로 저장되는 검색 가능한 메타데이터입니다.", + "error": { + "min": "최소 하나 이상의 동작을 선택해야 합니다." + } } }, "createTrigger": { - "title": "트리거 생성" + "title": "트리거 생성", + "desc": "{{camera}} 카메라를 위한 트리거 생성" + }, + "editTrigger": { + "title": "트리거 수정", + "desc": "{{camera}} 카메라의 트리거 설정 수정" + }, + "deleteTrigger": { + "title": "트리거 삭제", + "desc": "정말로 {{triggerName}} 트리거를 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다." } }, "actions": { - "notification": "알림 전송" + "notification": "알림 전송", + "sub_label": "하위 레이블 추가", + "attribute": "속성 추가" + }, + "documentTitle": "트리거", + "semanticSearch": { + "title": "시맨틱 검색이 비활성화됨", + "desc": "트리거 기능을 사용하려면 시맨틱 검색이 활성화되어 있어야 합니다." + }, + "management": { + "title": "트리거", + "desc": "{{camera}} 카메라의 트리거를 관리합니다. 선택한 추적 객체와 유사한 썸네일일 때 작동시키려면 '썸네일' 유형을, 입력한 텍스트와 유사한 설명일 때 작동시키려면 '설명' 유형을 사용하세요." + }, + "addTrigger": "트리거 추가", + "table": { + "name": "이름", + "type": "유형", + "content": "내용", + "threshold": "임계값", + "actions": "동작", + "noTriggers": "이 카메라에 설정된 트리거가 없습니다.", + "edit": "수정", + "deleteTrigger": "트리거 삭제", + "lastTriggered": "마지막 트리거 시점" + }, + "type": { + "thumbnail": "썸네일", + "description": "설명" + }, + "wizard": { + "title": "트리거 생성", + "step1": { + "description": "트리거의 기본 설정을 구성합니다." + }, + "step2": { + "description": "이 동작을 작동시킬 콘텐츠를 설정합니다." + }, + "step3": { + "description": "이 트리거의 임계값 및 동작을 구성합니다." + }, + "steps": { + "nameAndType": "이름 및 유형", + "configureData": "데이터 구성", + "thresholdAndActions": "임계값 및 동작" + } + }, + "toast": { + "success": { + "createTrigger": "{{name}} 트리거가 성공적으로 생성되었습니다.", + "updateTrigger": "{{name}} 트리거가 성공적으로 업데이트되었습니다.", + "deleteTrigger": "{{name}} 트리거가 성공적으로 삭제되었습니다." + }, + "error": { + "createTriggerFailed": "트리거 생성 실패: {{errorMessage}}", + "updateTriggerFailed": "트리거 업데이트 실패: {{errorMessage}}", + "deleteTriggerFailed": "트리거 삭제 실패: {{errorMessage}}" + } } }, "documentTitle": { "default": "설정 - Frigate", "authentication": "인증 설정 - Frigate", "camera": "카메라 설정 - Frigate", - "enrichments": "데이터 보강 설정 - Frigate", - "masksAndZones": "마스크와 구역 편집기 - Frigate", - "motionTuner": "움직임 감지 조정 - Frigate", + "enrichments": "확장 기능 설정 - Frigate", + "masksAndZones": "마스크 및 구역 편집기 - Frigate", + "motionTuner": "움직임 튜너 - Frigate", "object": "디버그 - Frigate", "general": "UI 설정 - Frigate", "frigatePlus": "Frigate+ 설정 - Frigate", "notifications": "알림 설정 - Frigate", "cameraManagement": "카메라 관리 - Frigate", "cameraReview": "카메라 다시보기 설정 - Frigate", - "globalConfig": "전체 설정 - Frigate", + "globalConfig": "전역 설정 - Frigate", "cameraConfig": "카메라 설정 - Frigate", "maintenance": "유지 관리 - Frigate", - "profiles": "프로필 - Frigate" + "profiles": "프로필 - Frigate", + "detectorsAndModel": "감지기 및 모델 - Frigate" }, "users": { "table": { - "actions": "액션" + "actions": "작업", + "username": "사용자 이름", + "role": "역할", + "noUsers": "사용자를 찾을 수 없습니다.", + "changeRole": "사용자 역할 변경", + "password": "비밀번호 재설정", + "deleteUser": "사용자 삭제" + }, + "title": "사용자", + "management": { + "title": "사용자 관리", + "desc": "이 Frigate 인스턴스의 사용자 계정을 관리합니다." + }, + "addUser": "사용자 추가", + "updatePassword": "비밀번호 재설정", + "toast": { + "success": { + "createUser": "{{user}} 사용자가 성공적으로 생성되었습니다", + "deleteUser": "{{user}} 사용자가 성공적으로 삭제되었습니다", + "updatePassword": "비밀번호가 성공적으로 업데이트되었습니다.", + "roleUpdated": "{{user}}의 역할이 업데이트되었습니다" + }, + "error": { + "setPasswordFailed": "비밀번호 저장 실패: {{errorMessage}}", + "createUserFailed": "사용자 생성 실패: {{errorMessage}}", + "deleteUserFailed": "사용자 삭제 실패: {{errorMessage}}", + "roleUpdateFailed": "역할 업데이트 실패: {{errorMessage}}" + } + }, + "dialog": { + "form": { + "user": { + "title": "사용자 이름", + "desc": "영문자, 숫자, 마침표(.), 밑줄(_)만 허용됩니다.", + "placeholder": "사용자 이름 입력" + }, + "password": { + "title": "비밀번호", + "placeholder": "비밀번호 입력", + "show": "비밀번호 보기", + "hide": "비밀번호 숨기기", + "confirm": { + "title": "비밀번호 확인", + "placeholder": "비밀번호 확인" + }, + "strength": { + "title": "비밀번호 보안 수준: ", + "weak": "취약", + "medium": "보통", + "strong": "안전", + "veryStrong": "매우 안전" + }, + "requirements": { + "title": "비밀번호 요구 조건:", + "length": "최소 12자 이상" + }, + "match": "비밀번호가 일치합니다", + "notMatch": "비밀번호가 일치하지 않습니다" + }, + "newPassword": { + "title": "새 비밀번호", + "placeholder": "새 비밀번호 입력", + "confirm": { + "placeholder": "새 비밀번호 재입력" + } + }, + "currentPassword": { + "title": "현재 비밀번호", + "placeholder": "현재 비밀번호 입력" + }, + "usernameIsRequired": "사용자 이름은 필수입니다", + "passwordIsRequired": "비밀번호는 필수입니다" + }, + "createUser": { + "title": "새 사용자 생성", + "desc": "새 사용자 계정을 추가하고 Frigate UI 접근 권한을 위한 역할을 지정합니다.", + "usernameOnlyInclude": "사용자 이름은 영문자, 숫자, 마침표(.), 밑줄(_)만 포함할 수 있습니다", + "confirmPassword": "비밀번호를 확인해 주세요" + }, + "deleteUser": { + "title": "사용자 삭제", + "desc": "이 작업은 되돌릴 수 없습니다. 사용자 계정과 관련된 모든 데이터가 영구적으로 삭제됩니다.", + "warn": "정말로 {{username}} 사용자를 삭제하시겠습니까?" + }, + "passwordSetting": { + "cannotBeEmpty": "비밀번호는 비워 둘 수 없습니다", + "doNotMatch": "비밀번호가 일치하지 않습니다", + "currentPasswordRequired": "현재 비밀번호가 필요합니다", + "incorrectCurrentPassword": "현재 비밀번호가 올바르지 않습니다", + "passwordVerificationFailed": "비밀번호 검증에 실패했습니다", + "updatePassword": "{{username}}의 비밀번호 변경", + "setPassword": "비밀번호 설정", + "desc": "계정을 보호하기 위해 강력한 비밀번호를 생성하세요.", + "multiDeviceWarning": "로그인된 다른 모든 기기에서는 {{refresh_time}} 이내에 다시 로그인해야 합니다.", + "multiDeviceAdmin": "JWT Secret을 교체하여 모든 사용자가 즉시 다시 인증하도록 강제할 수도 있습니다." + }, + "changeRole": { + "title": "사용자 역할 변경", + "select": "역할 선택", + "desc": "{{username}}의 권한 업데이트", + "roleInfo": { + "intro": "이 사용자에게 적절한 역할을 선택하세요:", + "admin": "관리자 (Admin)", + "adminDesc": "모든 기능에 대한 전체 접근 권한을 갖습니다.", + "viewer": "조회자 (Viewer)", + "viewerDesc": "실시간 대시보드, 다시보기, 탐색 및 내보내기로만 접근이 제한됩니다.", + "customDesc": "지정된 카메라에만 접근할 수 있는 사용자 지정 역할입니다." + } + } } }, "menu": { "ui": "UI", - "enrichments": "데이터 보강", + "enrichments": "확장 기능", "cameras": "카메라 설정", "masksAndZones": "마스크 / 구역", - "motionTuner": "움직임 감지 조정", + "motionTuner": "움직임 튜너", "triggers": "트리거", "debug": "디버그", "users": "사용자", "roles": "역할", "notifications": "알림", "frigateplus": "Frigate+", - "cameraManagement": "관리", + "cameraManagement": "카메라 관리", "cameraReview": "다시보기", "general": "일반", - "globalConfig": "전체 설정", + "globalConfig": "전역 설정", "system": "시스템", - "integrations": "연동", + "integrations": "연동 기능", "profileSettings": "프로필 설정", "globalDetect": "객체 감지", "globalRecording": "녹화", "globalSnapshots": "스냅샷", "globalFfmpeg": "FFmpeg", - "globalMotion": "동적 감지", + "globalMotion": "움직임 감지", "globalObjects": "객체", - "globalReview": "리뷰", - "globalAudioEvents": "오디오 이벤트", + "globalReview": "다시보기", + "globalAudioEvents": "오디오 감지", "globalLivePlayback": "실시간 재생", "globalTimestampStyle": "타임스탬프 스타일", "systemDatabase": "데이터베이스", "systemTls": "TLS", "systemAuthentication": "인증", - "systemNetworking": "네트워크", + "systemNetworking": "네트워킹", "systemProxy": "프록시", "systemUi": "UI", - "systemLogging": "로그", + "systemLogging": "로깅", "systemEnvironmentVariables": "환경 변수", - "systemTelemetry": "시스템 통계", - "systemBirdseye": "전체 상황 보기", + "systemTelemetry": "원격 측정", + "systemBirdseye": "버드아이", "systemFfmpeg": "FFmpeg", "systemDetectorHardware": "감지기 하드웨어", "systemDetectionModel": "감지 모델", "systemMqtt": "MQTT", - "integrationSemanticSearch": "의미론적 검색", + "integrationSemanticSearch": "시맨틱 검색", "integrationGenerativeAi": "생성형 AI", "integrationFaceRecognition": "얼굴 인식", - "integrationLpr": "번호판 인식", + "integrationLpr": "차량 번호판 인식", "integrationObjectClassification": "객체 분류", - "integrationAudioTranscription": "오디오 전사", + "integrationAudioTranscription": "오디오 텍스트 변환", "cameraDetect": "객체 감지", - "cameraFfmpeg": "FFmpeg", + "cameraFfmpeg": "스트림 (FFmpeg)", "cameraRecording": "녹화", "cameraSnapshots": "스냅샷", - "cameraMotion": "동적 감지", + "cameraMotion": "움직임 감지", "cameraObjects": "객체", - "cameraConfigReview": "리뷰", - "cameraAudioEvents": "오디오 이벤트", - "cameraAudioTranscription": "오디오 전사", + "cameraConfigReview": "다시보기", + "cameraAudioEvents": "오디오 감지", + "cameraAudioTranscription": "오디오 텍스트 변환", "cameraNotifications": "알림", "cameraLivePlayback": "실시간 재생", - "cameraBirdseye": "전체 상황", + "cameraBirdseye": "버드아이", "cameraFaceRecognition": "얼굴 인식", - "cameraLpr": "번호판 인식", + "cameraLpr": "차량 번호판 인식", "cameraMqttConfig": "MQTT", "cameraOnvif": "ONVIF", "cameraUi": "카메라 UI", "cameraTimestampStyle": "타임스탬프 스타일", "cameraMqtt": "카메라 MQTT", "mediaSync": "미디어 동기화", - "regionGrid": "영역 격자", - "profiles": "프로필" + "regionGrid": "영역 그리드", + "profiles": "프로필", + "uiSettings": "UI 설정", + "systemDetectorsAndModel": "감지기 및 모델", + "systemGo2rtcStreams": "go2rtc 스트림", + "maintenance": "유지 관리" }, "dialog": { "unsavedChanges": { @@ -127,104 +339,1623 @@ "noCamera": "카메라 없음" }, "general": { - "title": "프로필 설정", + "title": "UI 설정", "liveDashboard": { "title": "실시간 대시보드", "automaticLiveView": { - "label": "실시간 화면 자동 전환", - "desc": "활동이 감지되면 해당 카메라의 실시간 화면으로 자동 전환합니다. 이 옵션을 비활성화하면 실시간 대시보드의 정지된 카메라 이미지가 1분마다 한 번씩만 업데이트됩니다." + "label": "자동 실시간 보기", + "desc": "활동이 감지되면 해당 카메라의 실시간 보기로 자동 전환합니다. 이 옵션을 끄면 실시간 대시보드의 정적 카메라 이미지가 1분에 한 번만 업데이트됩니다." }, "playAlertVideos": { - "label": "알림 영상 재생", - "desc": "기본적으로 실시간 대시보드의 최근 알림은 작은 반복 재생 영상으로 표시됩니다. 이 옵션을 비활성화하면 현재 기기나 브라우저에서 최근 알림을 정지된 이미지로만 보여줍니다." + "label": "알림 동영상 자동 재생", + "desc": "기본적으로 실시간 대시보드의 최근 알림은 작은 반복 동영상으로 재생됩니다. 이 기기/브라우저에서 최근 알림을 정적 이미지로만 보려면 이 옵션을 비활성화하세요." }, "displayCameraNames": { "label": "카메라 이름 항상 표시", - "desc": "다중 카메라 실시간 대시보드에서 카메라 이름을 항상 칩 형태로 표시합니다." + "desc": "다중 카메라 실시간 뷰 대시보드에서 카메라 이름을 칩 형태로 항상 표시합니다." }, "liveFallbackTimeout": { - "label": "실시간 재생 대기 시간", - "desc": "카메라의 고화질 실시간 스트리밍을 사용할 수 없을 때, 지정된 시간이 지나면 저대역폭 모드로 전환합니다. 기본값: 3초." + "label": "실시간 플레이어 폴백 제한 시간", + "desc": "카메라의 고화질 실시간 스트림을 사용할 수 없을 때, 저대역폭 모드로 전환하기까지 대기할 시간(초)입니다. 기본값: 3." } }, "storedLayouts": { "title": "저장된 레이아웃", - "desc": "카메라 그룹의 화면 배치는 드래그하거나 크기를 조정할 수 있습니다. 변경된 위치는 브라우저의 로컬 저장소에 저장됩니다.", - "clearAll": "레이아웃 지우기" + "desc": "카메라 그룹 내 카메라 배치를 드래그하거나 크기를 조정할 수 있습니다. 배치 위치는 브라우저의 로컬 저장소에 저장됩니다.", + "clearAll": "모든 레이아웃 초기화" }, "cameraGroupStreaming": { "title": "카메라 그룹 스트리밍 설정", - "desc": "각각의 카메라 그룹의 스트리밍 설정은 브라우저의 로컬 저장소에 저장됩니다.", - "clearAll": "스트리밍 설정 모두 지우기" + "desc": "각 카메라 그룹의 스트리밍 설정은 브라우저의 로컬 저장소에 저장됩니다.", + "clearAll": "모든 스트리밍 설정 초기화" }, "recordingsViewer": { - "title": "녹화 영상 보기", + "title": "녹화 영상 뷰어", "defaultPlaybackRate": { - "label": "기본으로 설정된 다시보기 배속", - "desc": "다시보기 영상 재생할 때 기본 배속을 설정합니다." + "label": "기본 재생 배속", + "desc": "녹화 영상 재생 시 적용할 기본 재생 속도입니다." } }, "calendar": { - "title": "캘린더", + "title": "달력", "firstWeekday": { - "label": "주 첫째날", - "desc": "다시보기 캘린더에서 주가 시작되는 첫째날을 설정합니다.", + "label": "한 주의 시작 요일", + "desc": "다시보기 달력에서 한 주를 시작할 요일을 지정합니다.", "sunday": "일요일", "monday": "월요일" } }, "toast": { "success": { - "clearStoredLayout": "{{cameraName}}의 레이아웃을 지웠습니다", - "clearStreamingSettings": "모든 카메라 그룹 스트리밍 설정을 지웠습니다." + "clearStoredLayout": "{{cameraName}}의 저장된 레이아웃을 초기화했습니다", + "clearStreamingSettings": "모든 카메라 그룹의 스트리밍 설정을 초기화했습니다." }, "error": { - "clearStoredLayoutFailed": "레이아웃 지우기에 실패했습니다:{{errorMessage}}", - "clearStreamingSettingsFailed": "카메라 스트리밍 설정 지우기에 실패했습니다:{{errorMessage}}" + "clearStoredLayoutFailed": "저장된 레이아웃 초기화 실패: {{errorMessage}}", + "clearStreamingSettingsFailed": "스트리밍 설정 초기화 실패: {{errorMessage}}" } } }, "enrichments": { - "title": "데이터 보강 설정", - "unsavedChanges": "변경된 데이터 보강 설정을 저장하지 않았습니다", + "title": "확장 기능 설정", + "unsavedChanges": "저장되지 않은 확장 기능 설정 변경 사항", "birdClassification": { "title": "조류 분류", - "desc": "조류 분류 기능은 양자화된 TensorFlow 모델을 사용하여 알려진 새를 식별합니다. 알려진 새가 인식되면 해당 새의 일반적인 이름이 하위 분류로 추가됩니다. 이 정보는 사용자 인터페이스, 필터 및 알림에 포함됩니다." + "desc": "조류 분류는 양자화된 TensorFlow 모델을 사용하여 알려진 조류를 식별합니다. 식별된 조류는 하위 레이블(sub_label)로 일반 이름이 추가되며, 이 정보는 UI, 필터 및 알림에 포함됩니다." }, "semanticSearch": { "reindexNow": { - "label": "색인 재구성 시작", - "desc": "색인을 재구성하면 모든 추적된 객체의 임베딩을 다시 생성합니다. 이 작업은 백그라운드에서 실행되며, 추적된 객체의 수에 따라 CPU 점유율이 최대치에 도달하거나 상당한 시간이 소요될 수 있습니다.", - "confirmTitle": "색인 재구성 확인", - "confirmDesc": "정말로 모든 추적된 객체의 임베딩 색인을 재구성하시겠습니까? 이 작업은 백그라운드에서 실행되지만, CPU 점유율이 최대치에 도달하거나 상당한 시간이 소요될 수 있습니다. 진행 상황은 '탐색' 페이지에서 확인하실 수 있습니다.", - "confirmButton": "색인 재구성", - "success": "색인 재구성이 정상적으로 시작되었습니다.", - "alreadyInProgress": "색인 재구성이 이미 진행 중입니다.", - "error": "색인 재구성을 시작하지 못했습니다: {{errorMessage}}" + "label": "지금 재색인", + "desc": "재색인을 실행하면 모든 추적 객체의 임베딩을 다시 생성합니다. 이 작업은 백그라운드에서 실행되며 추적 객체 수에 따라 CPU 사용량이 최대치에 도달하고 상당한 시간이 걸릴 수 있습니다.", + "confirmTitle": "재색인 확인", + "confirmDesc": "모든 추적 객체 임베딩을 다시 색인하시겠습니까? 백그라운드에서 실행되지만 CPU 점유율이 높아지고 많은 시간이 소요될 수 있습니다. 진행 상황은 '탐색' 페이지에서 확인할 수 있습니다.", + "confirmButton": "재색인", + "success": "재색인이 성공적으로 시작되었습니다.", + "alreadyInProgress": "이미 재색인이 진행 중입니다.", + "error": "재색인 시작 실패: {{errorMessage}}" + }, + "title": "시맨틱 검색", + "desc": "Frigate의 시맨틱 검색을 사용하면 이미지 자체, 사용자 지정 텍스트 설명 또는 자동 생성된 설명을 활용하여 다시보기 항목 내의 추적 객체를 찾을 수 있습니다.", + "modelSize": { + "label": "모델 크기", + "desc": "시맨틱 검색 임베딩에 사용할 모델 크기입니다.", + "small": { + "title": "소형", + "desc": "small은 양자화된 모델을 사용하여 RAM을 적게 차지하고 CPU에서 더 빠르게 실행되며, 임베딩 품질 저하도 거의 없습니다." + }, + "large": { + "title": "대형", + "desc": "large는 전체 Jina 모델을 사용하며 환경이 지원될 경우 GPU에서 자동으로 실행됩니다." + } } + }, + "faceRecognition": { + "title": "얼굴 인식", + "desc": "얼굴 인식을 통해 사람에게 이름을 지정할 수 있으며, 얼굴이 인식되면 Frigate가 해당 인물의 이름을 하위 레이블로 부여합니다. 이 정보는 UI, 필터 및 알림에 반영됩니다.", + "modelSize": { + "label": "모델 크기", + "desc": "얼굴 인식에 사용할 모델 크기입니다.", + "small": { + "title": "소형", + "desc": "small은 대부분의 CPU에서 효율적으로 구동되는 FaceNet 얼굴 임베딩 모델을 사용합니다." + }, + "large": { + "title": "large", + "desc": "large는 ArcFace 얼굴 임베딩 모델을 사용하며 환경이 지원될 경우 GPU에서 자동으로 구동됩니다." + } + } + }, + "licensePlateRecognition": { + "title": "차량 번호판 인식", + "desc": "Frigate은 차량 번호판을 인식하여 감지된 문자를 recognized_license_plate 필드에 자동 기록하거나, 'car' 유형의 객체에 등록된 이름을 하위 레이블로 추가할 수 있습니다. 진입로에 들어오거나 도로를 지나가는 차량의 번호판을 판독하는 데 유용합니다." + }, + "restart_required": "재시작 필요 (확장 기능 설정 변경됨)", + "toast": { + "success": "확장 기능 설정이 저장되었습니다. 변경 사항을 적용하려면 Frigate를 재시작하세요.", + "error": "설정 변경 사항 저장 실패: {{errorMessage}}" } }, "saveAllPreview": { "title": "저장할 변경 사항", "triggerLabel": "대기 중인 변경 사항 검토", - "empty": "대기 중인 변경 사항 없음.", + "empty": "대기 중인 변경 사항이 없습니다.", "scope": { "label": "적용 범위", - "global": "전체", + "global": "전역", "camera": "카메라: {{cameraName}}" }, "field": { - "label": "항목" + "label": "필드" }, "value": { "label": "새 값", "reset": "초기화" + }, + "profile": { + "label": "프로필" } }, "button": { - "overriddenGlobal": "전역 재정의됨", + "overriddenGlobal": "재정의됨 (전역)", "overriddenGlobalTooltip": "이 카메라는 이 섹션의 전역 설정을 재정의합니다", - "overriddenBaseConfig": "기본 설정 재정의됨", - "overriddenBaseConfigTooltip": "{{profile}} 프로필은 이 섹션의 구성 설정을 재정의합니다" + "overriddenBaseConfig": "재정의됨 (기본 설정)", + "overriddenBaseConfigTooltip": "{{profile}} 프로필이 이 섹션의 설정을 재정의합니다", + "overriddenGlobalHeading_other": "이 카메라는 전역 설정의 필드 {{count}}개를 재정의합니다:", + "overriddenGlobalNoDeltas": "이 카메라는 전역 설정을 재정의하도록 설정되었으나, 기본값과 다른 필드가 없습니다.", + "overriddenBaseConfigHeading_other": "{{profile}} 프로필이 기본 설정의 필드 {{count}}개를 재정의합니다:", + "overriddenBaseConfigNoDeltas": "{{profile}} 프로필이 이 섹션을 재정의하도록 설정되었으나, 기본 설정과 다른 필드가 없습니다.", + "overriddenInCameras": { + "label_other": "카메라 {{count}}대에서 재정의됨", + "tooltip_other": "카메라 {{count}}대가 이 섹션의 값을 재정의합니다. 세부 정보를 보려면 클릭하세요.", + "heading_other": "이 전역 섹션에는 카메라 {{count}}대에서 재정의된 필드가 포함되어 있습니다.", + "othersField_other": "기타 {{count}}개", + "profilePrefix": "{{profile}} 프로필: {{fields}}" + } + }, + "menuDot": { + "overrideGlobal": "이 섹션은 전역 구성을 재정의합니다", + "overrideProfile": "이 섹션은 {{profile}} 프로필에 의해 재정의됩니다", + "unsaved": "이 섹션에 저장되지 않은 변경 사항이 있습니다" + }, + "cameraWizard": { + "title": "카메라 추가", + "description": "아래 단계에 따라 Frigate에 새 카메라를 추가하세요.", + "steps": { + "nameAndConnection": "이름 및 연결", + "probeOrSnapshot": "탐색 또는 스냅샷", + "streamConfiguration": "스트림 구성", + "validationAndTesting": "검증 및 테스트" + }, + "save": { + "success": "새 카메라 {{cameraName}}을(를) 성공적으로 저장했습니다.", + "failure": "{{cameraName}} 저장 중 오류가 발생했습니다." + }, + "testResultLabels": { + "resolution": "해상도", + "video": "비디오", + "audio": "오디오", + "fps": "FPS" + }, + "commonErrors": { + "noUrl": "올바른 스트림 URL을 입력해 주세요", + "testFailed": "스트림 테스트 실패: {{error}}" + }, + "step1": { + "description": "카메라 정보를 입력하고 카메라를 자동 탐색하거나 제조사 브랜드를 수동으로 선택하세요.", + "cameraName": "카메라 이름", + "cameraNamePlaceholder": "예: front_door 또는 Back Yard Overview", + "host": "호스트/IP 주소", + "port": "포트", + "username": "사용자 이름", + "usernamePlaceholder": "선택 사항", + "password": "비밀번호", + "passwordPlaceholder": "선택 사항", + "selectTransport": "전송 프로토콜 선택", + "cameraBrand": "카메라 브랜드", + "selectBrand": "URL 템플릿에 적용할 카메라 브랜드 선택", + "customUrl": "사용자 지정 스트림 URL", + "brandInformation": "브랜드 정보", + "brandUrlFormat": "RTSP URL 형식이 다음과 같은 카메라용: {{exampleUrl}}", + "customUrlPlaceholder": "rtsp://username:password@host:port/path", + "connectionSettings": "연결 설정", + "detectionMethod": "스트림 탐색 방식", + "onvifPort": "ONVIF 포트", + "probeMode": "카메라 자동 탐색", + "manualMode": "수동 선택", + "detectionMethodDescription": "ONVIF를 지원하는 경우 카메라를 탐색하여 스트림 URL을 자동으로 찾거나, 카메라 브랜드를 수동 선택하여 사전 정의된 URL을 사용할 수 있습니다. 커스텀 RTSP URL을 입력하려면 수동 방식을 선택하고 '기타(Other)'를 선택하세요.", + "onvifPortDescription": "ONVIF를 지원하는 카메라의 경우 주로 80 또는 8080 포트를 사용합니다.", + "useDigestAuth": "다이제스트(Digest) 인증 사용", + "useDigestAuthDescription": "ONVIF에 HTTP 다이제스트 인증을 사용합니다. 일부 카메라는 표준 관리자 계정 대신 전용 ONVIF 사용자 이름/비밀번호가 필요할 수 있습니다.", + "errors": { + "brandOrCustomUrlRequired": "호스트/IP와 함께 카메라 브랜드를 선택하거나 '기타(Other)'를 선택하고 커스텀 URL을 입력하세요", + "nameRequired": "카메라 이름은 필수입니다", + "nameLength": "카메라 이름은 64자 이하여야 합니다", + "invalidCharacters": "카메라 이름에 유효하지 않은 문자가 포함되어 있습니다", + "nameExists": "이미 존재하는 카메라 이름입니다", + "customUrlRtspRequired": "사용자 지정 URL은 반드시 \"rtsp://\" 또는 \"rtsps://\"로 시작해야 합니다. RTSP가 아닌 카메라 스트림은 수동 구성이 필요합니다." + } + }, + "step2": { + "description": "선택한 감지 방식에 따라 카메라에서 사용 가능한 스트림을 탐색하거나 수동 설정을 구성합니다.", + "testSuccess": "연결 테스트 성공!", + "testFailed": "연결 테스트에 실패했습니다. 입력값을 확인하고 다시 시도하세요.", + "testFailedTitle": "테스트 실패", + "streamDetails": "스트림 세부 정보", + "probing": "카메라 탐색 중...", + "retry": "재시도", + "testing": { + "probingMetadata": "카메라 메타데이터 탐색 중...", + "fetchingSnapshot": "카메라 스냅샷 가져오는 중..." + }, + "probeFailed": "카메라 탐색 실패: {{error}}", + "probingDevice": "기기 탐색 중...", + "probeSuccessful": "탐색 성공", + "probeError": "탐색 오류", + "probeNoSuccess": "탐색 실패", + "deviceInfo": "기기 정보", + "manufacturer": "제조사", + "model": "모델", + "firmware": "펌웨어", + "profiles": "프로필", + "ptzSupport": "PTZ 지원", + "autotrackingSupport": "자동 추적 지원", + "presets": "프리셋", + "rtspCandidates": "RTSP 후보 목록", + "rtspCandidatesDescription": "카메라 탐색을 통해 발견된 RTSP URL 목록입니다. 연결을 테스트하여 스트림 메타데이터를 확인하세요.", + "noRtspCandidates": "카메라에서 RTSP URL을 찾을 수 없습니다. 자격 증명이 올바르지 않거나, 카메라가 ONVIF 또는 URL 추출 방식을 지원하지 않을 수 있습니다. 이전 단계로 돌아가 RTSP URL을 직접 수동 입력하세요.", + "candidateStreamTitle": "후보 스트림 {{number}}", + "useCandidate": "사용", + "uriCopy": "복사", + "uriCopied": "URI가 클립보드에 복사되었습니다", + "testConnection": "연결 테스트", + "toggleUriView": "클릭하여 전체 URI 보기 전환", + "connected": "연결됨", + "notConnected": "연결되지 않음", + "errors": { + "hostRequired": "호스트/IP 주소는 필수입니다" + } + }, + "step3": { + "description": "스트림 역할을 구성하고 카메라에 추가 스트림을 연결합니다.", + "streamsTitle": "카메라 스트림", + "addStream": "스트림 추가", + "addAnotherStream": "다른 스트림 추가", + "streamTitle": "스트림 {{number}}", + "streamUrl": "스트림 URL", + "streamUrlPlaceholder": "rtsp://username:password@host:port/path", + "selectStream": "스트림 선택", + "searchCandidates": "후보 검색...", + "noStreamFound": "스트림을 찾을 수 없음", + "url": "URL", + "resolution": "해상도", + "selectResolution": "해상도 선택", + "quality": "화질", + "selectQuality": "화질 선택", + "roles": "역할", + "roleLabels": { + "detect": "객체 감지", + "record": "녹화", + "audio": "오디오" + }, + "testStream": "연결 테스트", + "testSuccess": "스트림 테스트 성공!", + "testFailed": "스트림 테스트 실패", + "testFailedTitle": "테스트 실패", + "connected": "연결됨", + "notConnected": "연결되지 않음", + "featuresTitle": "기능", + "go2rtc": "카메라 연결 부하 감소", + "detectRoleWarning": "계속 진행하려면 최소 하나의 스트림에 \"detect\" 역할이 할당되어야 합니다.", + "rolesPopover": { + "title": "스트림 역할", + "detect": "객체 감지를 위한 메인 피드입니다.", + "record": "설정에 따라 영상 세그먼트를 저장합니다.", + "audio": "오디오 기반 감지를 위한 피드입니다." + }, + "featuresPopover": { + "title": "스트림 기능", + "description": "go2rtc 재스트리밍을 사용하여 카메라에 가해지는 동시 연결 수를 줄입니다." + } + }, + "step4": { + "description": "새 카메라를 저장하기 전 최종 유효성 검사 및 분석을 진행합니다. 저장하기 전에 각 스트림을 연결해 보세요.", + "validationTitle": "스트림 검증", + "connectAllStreams": "모든 스트림 연결", + "reconnectionSuccess": "재연결 성공.", + "reconnectionPartial": "일부 스트림 재연결에 실패했습니다.", + "streamUnavailable": "스트림 미리보기를 사용할 수 없음", + "reload": "새로고침", + "connecting": "연결 중...", + "streamTitle": "스트림 {{number}}", + "valid": "유효함", + "failed": "실패", + "notTested": "테스트되지 않음", + "connectStream": "연결", + "connectingStream": "연결 중", + "disconnectStream": "연결 해제", + "estimatedBandwidth": "예상 대역폭", + "roles": "역할", + "ffmpegModule": "스트림 호환성 모드 사용", + "ffmpegModuleDescription": "여러 번 시도해도 스트림이 로드되지 않는 경우 이 기능을 켜보세요. 활성화하면 Frigate가 go2rtc와 함께 FFmpeg 모듈을 사용하므로 일부 카메라 스트림과의 호환성이 향상될 수 있습니다.", + "none": "없음", + "error": "오류", + "streamValidated": "스트림 {{number}} 검증 성공", + "streamValidationFailed": "스트림 {{number}} 검증 실패", + "saveAndApply": "새 카메라 저장", + "saveError": "유효하지 않은 구성입니다. 설정을 확인해 주세요.", + "issues": { + "title": "스트림 검증", + "videoCodecGood": "비디오 코덱: {{codec}}.", + "audioCodecGood": "오디오 코덱: {{codec}}.", + "resolutionHigh": "{{resolution}} 해상도는 리소스 사용량을 증가시킬 수 있습니다.", + "resolutionLow": "{{resolution}} 해상도는 작은 객체를 안정적으로 감지하기에 너무 낮을 수 있습니다.", + "resolutionUnknown": "이 스트림의 해상도를 탐색할 수 없습니다. 설정 또는 구성 파일에서 감지 해상도를 직접 지정해야 합니다.", + "noAudioWarning": "이 스트림에서 오디오가 감지되지 않아 녹화 영상에 소리가 포함되지 않습니다.", + "audioCodecRecordError": "녹화 영상에 오디오를 포함하려면 AAC 오디오 코덱이 필요합니다.", + "audioCodecRequired": "오디오 감지를 지원하려면 오디오 스트림이 필요합니다.", + "restreamingWarning": "녹화 스트림에 대해 카메라 연결 부하 감소(재스트리밍)를 활성화하면 CPU 사용량이 약간 증가할 수 있습니다.", + "brands": { + "reolink-rtsp": "Reolink RTSP는 권장되지 않습니다. 카메라 펌웨어 설정에서 HTTP를 활성화하고 마법사를 다시 시작하세요.", + "reolink-http": "Reolink HTTP 스트림은 호환성을 위해 FFmpeg를 사용하는 것이 좋습니다. 이 스트림에 '스트림 호환성 모드 사용'을 활성화하세요." + }, + "dahua": { + "substreamWarning": "보조 스트림(Substream 1)이 낮은 해상도로 고정되어 있습니다. 대다수의 Dahua / Amcrest / EmpireTech 카메라는 카메라 내부 설정에서 추가 서브스트림을 켤 수 있습니다. 가능한 경우 해당 스트림을 확인하고 활용하는 것을 권장합니다." + }, + "hikvision": { + "substreamWarning": "보조 스트림(Substream 1)이 낮은 해상도로 고정되어 있습니다. 대다수의 Hikvision 카메라는 카메라 내부 설정에서 추가 서브스트림을 켤 수 있습니다. 가능한 경우 해당 스트림을 확인하고 활용하는 것을 권장합니다." + } + } + } + }, + "cameraManagement": { + "title": "카메라 관리", + "description": "카메라를 추가, 수정, 삭제하고 각 카메라의 동작 상태를 제어하며, 프로필 및 카메라 유형별 재정의를 구성합니다. 스트림, 감지, 움직임 및 기타 세부 설정을 변경하려면 '카메라 설정' 아래의 해당 섹션을 선택하세요.", + "addCamera": "새 카메라 추가", + "deleteCamera": "카메라 삭제", + "deleteCameraDialog": { + "title": "카메라 삭제", + "description": "카메라를 삭제하면 해당 카메라의 모든 녹화 영상, 추적 객체 및 설정이 영구적으로 제거됩니다. 이 카메라와 연결된 go2rtc 스트림은 직접 수동 삭제해야 할 수 있습니다.", + "selectPlaceholder": "카메라 선택…", + "confirmTitle": "정말 삭제하시겠습니까?", + "confirmWarning": "{{cameraName}} 삭제 작업은 되돌릴 수 없습니다.", + "deleteExports": "이 카메라의 내보내기 파일도 함께 삭제", + "confirmButton": "영구 삭제", + "success": "{{cameraName}} 카메라가 성공적으로 삭제되었습니다", + "error": "{{cameraName}} 카메라 삭제 실패" + }, + "editCamera": "카메라 수정:", + "selectCamera": "카메라 선택", + "backToSettings": "카메라 설정으로 돌아가기", + "streams": { + "title": "카메라 상태 및 세부 정보", + "label": "카메라 상태", + "description": "각 카메라의 동작 상태를 설정합니다.

    켜짐 (On): 스트림이 정상적으로 처리됩니다.
    꺼짐 (Off): 처리를 일시 중단합니다. Frigate 재시작 시 유지되지 않습니다.
    비활성화 (Disabled): 처리를 중지하고 설정 파일에 저장합니다. 다시 활성화하려면 재시작이 필요합니다.

    참고: 비활성화해도 go2rtc 재스트림에는 영향을 주지 않습니다.

    핸들을 드래그하여 실시간 대시보드 및 카메라 드롭다운 목록에 표시되는 순서를 변경할 수 있습니다.", + "disabledSubheading": "설정에서 비활성화됨", + "status": { + "on": "켜짐", + "off": "꺼짐", + "disabled": "비활성화됨" + }, + "enableSuccess": "{{cameraName}} 활성화됨. 적용하려면 Frigate를 재시작하세요.", + "disableSuccess": "{{cameraName}}이(가) 비활성화되어 설정에 저장되었습니다.", + "reorderHandle": "드래그하여 순서 변경", + "saving": "저장 중…", + "saved": "저장됨", + "details": { + "edit": "카메라 세부 정보 수정", + "title": "카메라 세부 정보 수정", + "description": "Frigate UI 전반에 표시되는 표시 이름, 외부 URL 및 가시성을 업데이트합니다.", + "friendlyNameLabel": "표시 이름 (별칭)", + "friendlyNameHelp": "Frigate UI 전반에 표시될 카메라의 별칭입니다. 비워 두면 카메라 ID가 사용됩니다.", + "webuiUrlLabel": "카메라 웹 UI URL", + "webuiUrlHelp": "디버그 뷰에서 카메라 자체 웹 관리 페이지로 바로 연결되는 URL입니다. 링크를 비활성화하려면 비워 두세요.", + "webuiUrlInvalid": "유효한 URL이어야 합니다 (예: https://example.com).", + "dashboardLabel": "실시간 대시보드에 표시", + "dashboardHelp": "기본 '모든 카메라' 실시간 대시보드에 이 카메라를 표시합니다. 카메라 그룹 등 UI의 다른 곳에서는 계속 사용할 수 있습니다.", + "reviewLabel": "다시보기에 표시", + "reviewHelp": "다시보기 페이지의 카메라 필터, 움직임 검토 및 기록 뷰에 이 카메라를 표시합니다." + } + }, + "cameraConfig": { + "add": "카메라 추가", + "edit": "카메라 수정", + "description": "스트림 입력 및 역할을 포함한 카메라 설정을 구성합니다.", + "name": "카메라 이름", + "nameRequired": "카메라 이름은 필수입니다", + "nameLength": "카메라 이름은 64자 미만이어야 합니다.", + "namePlaceholder": "예: front_door 또는 Back Yard Overview", + "enabled": "활성화됨", + "ffmpeg": { + "inputs": "입력 스트림", + "path": "스트림 경로", + "pathRequired": "스트림 경로는 필수입니다", + "pathPlaceholder": "rtsp://...", + "roles": "역할", + "rolesRequired": "최소 하나 이상의 역할을 할당해야 합니다", + "rolesUnique": "각 역할(audio, detect, record)은 하나의 스트림에만 할당할 수 있습니다", + "addInput": "입력 스트림 추가", + "removeInput": "입력 스트림 제거", + "inputsRequired": "최소 하나 이상의 입력 스트림이 필요합니다" + }, + "go2rtcStreams": "go2rtc 스트림", + "streamUrls": "스트림 URL", + "addUrl": "URL 추가", + "addGo2rtcStream": "go2rtc 스트림 추가", + "toast": { + "success": "{{cameraName}} 카메라가 성공적으로 저장되었습니다" + } + }, + "profiles": { + "title": "프로필별 카메라 재정의", + "selectLabel": "프로필 선택", + "description": "프로필이 활성화될 때 켜거나 끌 카메라를 설정합니다. \"상속(Inherit)\"으로 설정된 카메라는 기본 상태를 유지합니다.", + "inherit": "상속", + "on": "켜짐", + "off": "꺼짐" + }, + "cameraType": { + "title": "카메라 유형", + "label": "카메라 유형", + "description": "각 카메라의 유형을 설정합니다. 전용 LPR 카메라는 먼 거리의 차량 번호판을 포착하기 위해 강력한 광학 줌을 갖춘 단일 목적 카메라입니다. 번호판에 초점이 맞춰진 전용 카메라가 아니라면 일반 카메라 유형을 사용해야 합니다.", + "normal": "일반", + "dedicatedLpr": "전용 LPR", + "saveSuccess": "{{cameraName}}의 카메라 유형을 업데이트했습니다. 변경 사항을 적용하려면 Frigate를 재시작하세요." + }, + "clone": { + "sectionTitle": "설정 복제", + "sectionDescription": "한 카메라의 구성을 다른 카메라나 새 카메라로 복사합니다.", + "button": "설정 복제", + "title": "카메라 설정 복제", + "description": "카메라 구성을 하나 이상의 다른 카메라나 새 카메라에 복사합니다. 식별 정보(이름, 별칭, 웹 UI URL, 표시 순서)는 복사되지 않습니다.", + "source": { + "label": "원본 카메라", + "placeholder": "원본 카메라 선택", + "required": "원본 카메라를 선택하세요" + }, + "target": { + "legend": "대상", + "newRadio": "새 카메라", + "newNameLabel": "카메라 이름", + "newNamePlaceholder": "예: back_door 또는 Back Door", + "newNameRequired": "카메라 이름은 필수입니다", + "newNameInvalid": "유효하지 않은 카메라 이름입니다", + "newNameCollision": "동일한 이름의 카메라가 이미 존재합니다", + "newStreamsForced": "새 카메라에는 스트림 정보가 항상 복사됩니다.", + "existingCamerasRadio": "기존 카메라", + "allCameras": "모든 카메라", + "existingPlaceholder": "하나 이상의 카메라를 선택하세요", + "existingDisabled": "복사할 대상 카메라가 없습니다" + }, + "categories": { + "legend": "복제할 설정", + "description": "원본 카메라에서 복사할 설정 항목을 선택하세요.", + "selectAll": "전체 선택", + "selectNone": "전체 해제", + "resetDefaults": "기본값으로 초기화", + "general": "일반", + "spatial": "공간 설정", + "streams": "스트림", + "spatialWarningTitle": "해상도 불일치", + "spatialWarning": "원본 카메라 {{srcCamera}}의 감지 해상도({{srcWidth}}×{{srcHeight}})가 다음 카메라와 다릅니다: {{cameras}}. 해당 카메라에서 다각형 좌표가 일치하지 않을 수 있습니다. 기본적으로 비활성화되어 있으며, 있는 그대로 복사하려면 직접 활성화하세요.", + "restartHint": "재시작 필요", + "items": { + "record": "녹화", + "snapshots": "스냅샷", + "review": "다시보기", + "motion": "움직임 감지", + "objects": "객체", + "audio": "오디오 감지", + "audio_transcription": "오디오 텍스트 변환", + "notifications": "알림", + "birdseye": "버드아이", + "mqtt": "MQTT", + "timestamp_style": "타임스탬프 스타일", + "onvif": "ONVIF", + "lpr": "차량 번호판 인식", + "face_recognition": "얼굴 인식", + "semantic_search": "시맨틱 검색", + "genai": "생성형 AI", + "type": "카메라 유형 (일반 / 전용 LPR)", + "profiles": "프로필", + "detect": "감지 해상도", + "zones": "구역", + "motion_mask": "움직임 마스크", + "object_masks": "객체 마스크", + "ffmpeg_live": "스트림 URL 및 역할" + } + }, + "footer": { + "changeCount_other": "{{count}}개의 변경 사항이 적용됩니다", + "restartNeeded": "일부 변경 사항은 재시작이 필요합니다.", + "liveOnly": "모든 변경 사항이 재시작 없이 즉시 적용됩니다.", + "submit": "복제", + "submitting": "복제 중…" + }, + "toast": { + "success": "{{cameraName}}에 설정이 복사되었습니다", + "successWithRestart": "{{cameraName}}에 설정이 복사되었습니다. 모든 변경 사항을 적용하려면 Frigate를 재시작하세요.", + "successMulti_other": "카메라 {{count}}대에 설정이 복사되었습니다", + "successMultiWithRestart_other": "카메라 {{count}}대에 설정이 복사되었습니다. 모든 변경 사항을 적용하려면 Frigate를 재시작하세요.", + "partialFailure": "{{successCount}}개 섹션 적용됨; '{{failedSection}}' 실패: {{errorMessage}}", + "partialFailureMulti": "카메라 {{successCount}}대에 복사됨; 실패 항목({{failed}}): {{errorMessage}}", + "newCameraPartialFailure": "{{cameraName}} 카메라가 생성되었으나 일부 설정을 복사하지 못했습니다: {{errorMessage}}", + "sourceMissing": "원본 카메라가 더 이상 존재하지 않습니다", + "submitError": "카메라 복제 실패: {{errorMessage}}" + } + } + }, + "cameraReview": { + "title": "카메라 다시보기 설정", + "object_descriptions": { + "title": "생성형 AI 객체 설명", + "desc": "Frigate가 재시작될 때까지 이 카메라의 생성형 AI 객체 설명 생성을 일시적으로 켜거나 끕니다. 비활성화하면 이 카메라의 추적 객체에 대해 AI 설명을 요청하지 않습니다." + }, + "review_descriptions": { + "title": "생성형 AI 다시보기 설명", + "desc": "Frigate가 재시작될 때까지 이 카메라의 생성형 AI 다시보기 설명 생성을 일시적으로 켜거나 끕니다. 비활성화하면 이 카메라의 다시보기 항목에 대해 AI 설명을 요청하지 않습니다." + }, + "review": { + "title": "다시보기", + "desc": "Frigate가 재시작될 때까지 이 카메라의 알림 및 감지 이벤트 생성을 일시적으로 켜거나 끕니다. 비활성화하면 새 다시보기 항목이 생성되지 않습니다. ", + "alerts": "알림 ", + "detections": "감지 " + }, + "reviewClassification": { + "title": "다시보기 분류", + "desc": "Frigate은 다시보기 항목을 '알림'과 '감지'로 분류합니다. 기본적으로 모든 사람(person) 및 차량(car) 객체는 알림으로 간주됩니다. 필수 구역을 설정하여 다시보기 항목의 분류를 세분화할 수 있습니다.", + "noDefinedZones": "이 카메라에 정의된 구역이 없습니다.", + "objectAlertsTips": "{{cameraName}}의 모든 {{alertsLabels}} 객체가 알림으로 표시됩니다.", + "zoneObjectAlertsTips": "{{cameraName}}의 {{zone}}에서 감지된 모든 {{alertsLabels}} 객체가 알림으로 표시됩니다.", + "objectDetectionsTips": "{{cameraName}}에서 분류되지 않은 모든 {{detectionsLabels}} 객체는 구역에 상관없이 감지로 표시됩니다.", + "zoneObjectDetectionsTips": { + "text": "{{cameraName}}의 {{zone}}에서 분류되지 않은 모든 {{detectionsLabels}} 객체가 감지로 표시됩니다.", + "notSelectDetections": "{{cameraName}}의 {{zone}}에서 감지되었으나 알림으로 분류되지 않은 모든 {{detectionsLabels}} 객체는 구역에 상관없이 감지로 표시됩니다.", + "regardlessOfZoneObjectDetectionsTips": "{{cameraName}}에서 분류되지 않은 모든 {{detectionsLabels}} 객체는 구역에 상관없이 감지로 표시됩니다." + }, + "unsavedChanges": "{{camera}}의 저장되지 않은 다시보기 분류 설정", + "selectAlertsZones": "알림 대상 구역 선택", + "selectDetectionsZones": "감지 대상 구역 선택", + "limitDetections": "특정 구역으로 감지 제한", + "toast": { + "success": "다시보기 분류 설정이 저장되었습니다. 변경 사항을 적용하려면 Frigate를 재시작하세요." + } + } + }, + "masksAndZones": { + "filter": { + "all": "모든 마스크 및 구역" + }, + "restart_required": "재시작 필요 (마스크/구역 변경됨)", + "disabledInConfig": "설정 파일에서 비활성화된 항목입니다", + "addDisabledProfile": "먼저 기본 구성에 추가한 후 프로필에서 재정의하세요", + "profileBase": "(기본)", + "profileOverride": "(재정의)", + "toast": { + "success": { + "copyCoordinates": "{{polyName}}의 좌표를 클립보드에 복사했습니다." + }, + "error": { + "copyCoordinatesFailed": "좌표를 클립보드에 복사하지 못했습니다." + } + }, + "motionMaskLabel": "움직임 마스크 {{number}}", + "objectMaskLabel": "객체 마스크 {{number}}", + "form": { + "id": { + "error": { + "mustNotBeEmpty": "ID는 비워 둘 수 없습니다.", + "alreadyExists": "이 카메라에 동일한 ID의 마스크가 이미 존재합니다." + } + }, + "name": { + "error": { + "mustNotBeEmpty": "이름은 비워 둘 수 없습니다." + } + }, + "zoneName": { + "error": { + "mustBeAtLeastTwoCharacters": "구역 이름은 2자 이상이어야 합니다.", + "mustNotBeSameWithCamera": "구역 이름은 카메라 이름과 같을 수 없습니다.", + "alreadyExists": "이 카메라에 동일한 이름의 구역이 이미 존재합니다.", + "mustNotContainPeriod": "구역 이름에는 마침표를 포함할 수 없습니다.", + "hasIllegalCharacter": "구역 이름에 올바르지 않은 문자가 포함되어 있습니다.", + "mustHaveAtLeastOneLetter": "구역 이름에는 최소 하나 이상의 문자가 포함되어야 합니다." + } + }, + "distance": { + "error": { + "text": "거리는 0.1 이상이어야 합니다.", + "mustBeFilled": "속도 추정을 사용하려면 모든 거리 입력란을 채워야 합니다." + } + }, + "inertia": { + "error": { + "mustBeAboveZero": "관성은 0보다 커야 합니다." + } + }, + "loiteringTime": { + "error": { + "mustBeGreaterOrEqualZero": "배회 시간은 0 이상이어야 합니다." + } + }, + "speed": { + "error": { + "mustBeGreaterOrEqualTo": "속도 임계값은 0.1 이상이어야 합니다." + } + }, + "polygonDrawing": { + "type": { + "zone": "구역", + "motion_mask": "움직임 마스크", + "object_mask": "객체 마스크" + }, + "removeLastPoint": "마지막 점 삭제", + "reset": { + "label": "모든 점 초기화" + }, + "snapPoints": { + "true": "점 맞춤 켜기", + "false": "점 맞춤 끄기" + }, + "delete": { + "title": "삭제 확인", + "desc": "정말로 {{type}} {{name}}을(를) 삭제하시겠습니까?", + "success": "{{name}}이(가) 삭제되었습니다." + }, + "revertOverride": { + "title": "기본 설정으로 되돌리기", + "desc": "{{type}} {{name}}의 프로필 재정의를 제거하고 기본 설정으로 되돌립니다." + }, + "error": { + "mustBeFinished": "저장하기 전에 다각형 그리기를 완료해야 합니다." + } + } + }, + "zones": { + "label": "구역", + "documentTitle": "구역 수정 - Frigate", + "desc": { + "title": "구역을 지정하면 프레임의 특정 영역을 정의하여 객체가 해당 구역 내에 있는지 여부를 판정할 수 있습니다.", + "documentation": "공식 문서" + }, + "add": "구역 추가", + "edit": "구역 수정", + "point_other": "점 {{count}}개", + "clickDrawPolygon": "이미지를 클릭하여 다각형을 그리세요.", + "name": { + "title": "이름", + "inputPlaceHolder": "이름 입력…", + "tips": "이름은 2자 이상이어야 하며, 최소 하나의 문자를 포함해야 하고, 카메라 이름이나 이 카메라의 다른 구역 이름과 중복될 수 없습니다." + }, + "enabled": { + "title": "활성화됨", + "description": "설정 파일에서 이 구역이 활성화되어 있는지 여부입니다. 비활성화된 경우 MQTT로 켤 수 없으며 런타임에서 무시됩니다." + }, + "inertia": { + "title": "관성 프레임", + "desc": "객체가 구역 내에 진입한 것으로 인정하기 위해 연속 감지되어야 하는 프레임 수입니다. 기본값: 3" + }, + "loiteringTime": { + "title": "배회 감지 시간", + "desc": "구역을 활성화하기 위해 객체가 구역 내에 머물러야 하는 최소 시간(초)을 설정합니다. 기본값: 0" + }, + "objects": { + "title": "대상 객체", + "desc": "이 구역에 적용할 객체 목록입니다." + }, + "allObjects": "모든 객체", + "speedEstimation": { + "title": "속도 추정", + "desc": "이 구역 내 객체의 이동 속도 추정을 활성화합니다. 구역은 정확히 4개의 점이어야 합니다.", + "lineADistance": "A선 거리 ({{unit}})", + "lineBDistance": "B선 거리 ({{unit}})", + "lineCDistance": "C선 거리 ({{unit}})", + "lineDDistance": "D선 거리 ({{unit}})" + }, + "speedThreshold": { + "title": "속도 임계값 ({{unit}})", + "desc": "객체가 이 구역에 존재하는 것으로 간주되기 위한 최소 속도를 지정합니다.", + "toast": { + "error": { + "pointLengthError": "이 구역의 속도 추정이 비활성화되었습니다. 속도 추정을 사용하는 구역은 정확히 4개의 점이어야 합니다.", + "loiteringTimeError": "배회 시간이 0보다 큰 구역은 속도 추정과 함께 사용할 수 없습니다." + } + } + }, + "toast": { + "success": "구역({{zoneName}})이 저장되었습니다." + } + }, + "motionMasks": { + "label": "움직임 마스크", + "documentTitle": "움직임 마스크 수정 - Frigate", + "desc": { + "title": "움직임 마스크는 불필요한 유형의 움직임으로 인한 감지 트리거를 방지하는 데 사용됩니다. 마스크를 과도하게 설정하면 객체 추적이 어려워질 수 있습니다.", + "documentation": "공식 문서" + }, + "add": "새 움직임 마스크", + "edit": "움직임 마스크 수정", + "defaultName": "움직임 마스크 {{number}}", + "context": { + "title": "움직임 마스크는 불필요한 유형의 움직임(예: 나뭇가지 흔들림, 카메라 타임스탬프)으로 인한 감지 트리거를 방지하는 데 사용됩니다. 마스크는 매우 신중하게 사용해야 하며, 과도한 마스킹은 객체 추적을 어렵게 만듭니다." + }, + "point_other": "점 {{count}}개", + "clickDrawPolygon": "이미지를 클릭하여 다각형을 그리세요.", + "name": { + "title": "이름", + "description": "이 움직임 마스크의 선택적 별칭입니다.", + "placeholder": "이름 입력..." + }, + "polygonAreaTooLarge": { + "title": "움직임 마스크가 카메라 화면의 {{polygonArea}}%를 덮고 있습니다. 너무 큰 움직임 마스크는 권장되지 않습니다.", + "tips": "움직임 마스크는 객체 감지 자체를 차단하지 않습니다. 대신 필수 구역을 사용하는 것이 좋습니다." + }, + "toast": { + "success": { + "title": "{{polygonName}}이(가) 저장되었습니다.", + "noName": "움직임 마스크가 저장되었습니다." + } + } + }, + "objectMasks": { + "label": "객체 마스크", + "documentTitle": "객체 마스크 수정 - Frigate", + "desc": { + "title": "객체 필터 마스크는 특정 위치에서 발생하는 특정 객체 유형의 오탐지를 걸러내는 데 사용됩니다.", + "documentation": "공식 문서" + }, + "add": "객체 마스크 추가", + "edit": "객체 마스크 수정", + "context": "객체 필터 마스크는 특정 위치에서 발생하는 특정 객체 유형의 오탐지를 걸러내는 데 사용됩니다.", + "point_other": "점 {{count}}개", + "clickDrawPolygon": "이미지를 클릭하여 다각형을 그리세요.", + "name": { + "title": "이름", + "description": "이 객체 마스크의 선택적 별칭입니다.", + "placeholder": "이름 입력..." + }, + "objects": { + "title": "대상 객체", + "desc": "이 객체 마스크를 적용할 객체 유형입니다.", + "allObjectTypes": "모든 객체 유형" + }, + "toast": { + "success": { + "title": "{{polygonName}}이(가) 저장되었습니다.", + "noName": "객체 마스크가 저장되었습니다." + } + } + }, + "masks": { + "enabled": { + "title": "활성화됨", + "description": "설정 파일에서 이 마스크가 활성화되어 있는지 여부입니다. 비활성화된 경우 MQTT로 켤 수 없으며 런타임에서 무시됩니다." + } + } + }, + "motionDetectionTuner": { + "title": "움직임 감지 튜너", + "unsavedChanges": "저장되지 않은 움직임 튜너 변경 사항 ({{camera}})", + "desc": { + "title": "Frigate은 객체 감지를 실행할 가치가 있는 변화가 화면에 있는지 확인하기 위한 1차 검사로 움직임 감지를 사용합니다.", + "documentation": "움직임 튜닝 가이드 읽기" + }, + "Threshold": { + "title": "임계값", + "desc": "움직임으로 간주되기 위해 필요한 픽셀 밝기 변화량을 결정합니다. 기본값: 30" + }, + "contourArea": { + "title": "윤곽선 면적", + "desc": "변화된 픽셀 그룹을 움직임으로 인정할 최소 윤곽선 면적입니다. 기본값: 10" + }, + "improveContrast": { + "title": "대비 향상", + "desc": "어두운 환경에서 대비를 개선합니다. 기본값: 켜짐" + }, + "toast": { + "success": "움직임 설정이 저장되었습니다." + } + }, + "debug": { + "title": "디버그", + "detectorDesc": "Frigate은 감지기({{detectors}})를 사용하여 카메라 비디오 스트림에서 객체를 감지합니다.", + "desc": "디버그 뷰는 추적 중인 객체와 관련 통계를 실시간으로 보여줍니다. 객체 목록에는 감지된 객체의 시차 요약 정보가 표시됩니다.", + "openCameraWebUI": "{{camera}} 웹 UI 열기", + "debugging": "디버깅 중", + "objectList": "객체 목록", + "noObjects": "객체 없음", + "audio": { + "title": "오디오", + "noAudioDetections": "감지된 오디오 없음", + "score": "점수", + "currentRMS": "현재 RMS", + "currentdbFS": "현재 dbFS" + }, + "boundingBoxes": { + "title": "바운딩 박스", + "desc": "추적 객체 주위에 바운딩 박스를 표시합니다", + "colors": { + "label": "객체 바운딩 박스 색상", + "info": "
  • 시작 시 각 객체 레이블마다 고유한 색상이 지정됩니다
  • 얇은 짙은 파란색 선은 현재 시점에 객체가 감지되지 않고 있음을 나타냅니다
  • 얇은 회색 선은 객체가 정지된 상태로 감지됨을 나타냅니다
  • 두꺼운 선은 해당 객체가 자동 추적(활성화된 경우)의 대상임을 나타냅니다
  • " + } + }, + "timestamp": { + "title": "타임스탬프", + "desc": "화면에 타임스탬프를 덧씌웁니다" + }, + "zones": { + "title": "구역", + "desc": "정의된 모든 구역의 외곽선을 표시합니다" + }, + "mask": { + "title": "움직임 마스크", + "desc": "움직임 마스크 다각형을 표시합니다" + }, + "motion": { + "title": "움직임 박스", + "desc": "움직임이 감지된 영역 주변에 박스를 표시합니다", + "tips": "

    움직임 박스


    현재 움직임이 감지되고 있는 화면 영역에 빨간색 박스가 오버레이됩니다

    " + }, + "regions": { + "title": "영역 (Regions)", + "desc": "객체 감지기로 전송되는 관심 영역 박스를 표시합니다", + "tips": "

    영역 박스


    객체 감지기로 전송 중인 프레임 내 관심 영역에 밝은 녹색 박스가 오버레이됩니다.

    " + }, + "paths": { + "title": "이동 경로", + "desc": "추적 객체 경로의 주요 지점을 표시합니다", + "tips": "

    경로


    선과 원은 추적 객체가 수명주기 동안 이동한 주요 지점을 나타냅니다.

    " + }, + "objectShapeFilterDrawing": { + "title": "객체 형태 필터 그리기", + "desc": "이미지 위에 직사각형을 그려 면적과 비율 정보를 확인합니다", + "tips": "이 옵션을 활성화하고 카메라 이미지에 직사각형을 그리면 면적과 가로세로 비율이 표시됩니다. 이 수치를 설정 파일의 객체 형태 필터 매개변수로 활용할 수 있습니다.", + "score": "점수", + "ratio": "비율", + "area": "면적" + } + }, + "timestampPosition": { + "tl": "좌측 상단", + "tr": "우측 상단", + "bl": "좌측 하단", + "br": "우측 하단" + }, + "roles": { + "management": { + "title": "조회자(Viewer) 역할 관리", + "desc": "이 Frigate 인스턴스에 대한 사용자 정의 뷰어 역할과 카메라 접근 권한을 관리합니다." + }, + "addRole": "역할 추가", + "table": { + "role": "역할", + "cameras": "카메라", + "actions": "작업", + "noRoles": "사용자 정의 역할이 없습니다.", + "editCameras": "카메라 수정", + "deleteRole": "역할 삭제" + }, + "toast": { + "success": { + "createRole": "{{role}} 역할이 성공적으로 생성되었습니다", + "updateCameras": "{{role}} 역할의 카메라가 업데이트되었습니다", + "deleteRole": "{{role}} 역할이 성공적으로 삭제되었습니다", + "userRolesUpdated_other": "이 역할에 할당된 사용자 {{count}}명의 역할이 모든 카메라에 접근 가능한 'viewer'로 변경되었습니다." + }, + "error": { + "createRoleFailed": "역할 생성 실패: {{errorMessage}}", + "updateCamerasFailed": "카메라 업데이트 실패: {{errorMessage}}", + "deleteRoleFailed": "역할 삭제 실패: {{errorMessage}}", + "userUpdateFailed": "사용자 역할 업데이트 실패: {{errorMessage}}" + } + }, + "dialog": { + "createRole": { + "title": "새 역할 생성", + "desc": "새 역할을 추가하고 카메라 접근 권한을 지정합니다." + }, + "editCameras": { + "title": "역할 카메라 수정", + "desc": "{{role}} 역할의 카메라 접근 권한을 업데이트합니다." + }, + "deleteRole": { + "title": "역할 삭제", + "desc": "이 작업은 되돌릴 수 없습니다. 역할이 영구적으로 삭제되며, 이 역할을 가진 사용자는 모든 카메라에 접근 가능한 'viewer' 역할로 자동 전환됩니다.", + "warn": "정말로 {{role}} 역할을 삭제하시겠습니까?", + "deleting": "삭제 중..." + }, + "form": { + "role": { + "title": "역할 이름", + "placeholder": "역할 이름 입력", + "desc": "영문자, 숫자, 마침표(.), 밑줄(_)만 허용됩니다.", + "roleIsRequired": "역할 이름은 필수입니다", + "roleOnlyInclude": "역할 이름은 영문자, 숫자, 마침표(.), 밑줄(_)만 포함할 수 있습니다", + "roleExists": "동일한 이름의 역할이 이미 존재합니다." + }, + "cameras": { + "title": "카메라", + "desc": "이 역할이 접근할 수 있는 카메라를 선택하세요. 최소 하나 이상의 카메라를 선택해야 합니다.", + "required": "최소 하나 이상의 카메라를 선택해야 합니다." + } + } + } + }, + "notification": { + "title": "알림", + "notificationSettings": { + "title": "알림 설정", + "desc": "Frigate이 브라우저에서 실행 중이거나 PWA로 설치된 경우 기기로 푸시 알림을 기본 전송할 수 있습니다." + }, + "notificationUnavailable": { + "title": "알림을 사용할 수 없음", + "desc": "웹 푸시 알림을 사용하려면 보안 컨텍스트(https://…)가 필요합니다. 이는 브라우저 자체의 제한 사항입니다. 알림을 사용하려면 Frigate에 보안 연결로 접속하세요.", + "descPwa": "iOS의 경우 Frigate이 홈 화면에 추가되어 있어야만 웹 푸시 알림을 사용할 수 있습니다. 공유 메뉴를 열고 홈 화면에 추가를 선택한 다음, 새로 생성된 아이콘으로 Frigate을 실행하여 기기를 알림에 등록하세요." + }, + "globalSettings": { + "title": "전역 설정", + "desc": "등록된 모든 기기에서 특정 카메라의 알림을 일시 중지합니다." + }, + "email": { + "title": "이메일", + "placeholder": "예: example@email.com", + "desc": "유효한 이메일 입력이 필요하며, 푸시 서비스에 문제가 발생할 경우 알림을 보내는 데 사용됩니다." + }, + "cameras": { + "title": "카메라", + "noCameras": "사용 가능한 카메라 없음", + "desc": "알림을 활성화할 카메라를 선택하세요." + }, + "deviceSpecific": "기기별 설정", + "registerDevice": "현재 기기 등록", + "unregisterDevice": "현재 기기 등록 해제", + "sendTestNotification": "테스트 알림 전송", + "unsavedRegistrations": "저장되지 않은 알림 등록 정보", + "unsavedChanges": "저장되지 않은 알림 변경 사항", + "active": "알림 활성 상태", + "suspended": "{{time}} 동안 알림 일시 중지됨", + "suspendTime": { + "suspend": "일시 중지", + "5minutes": "5분간 일시 중지", + "10minutes": "10분간 일시 중지", + "30minutes": "30분간 일시 중지", + "1hour": "1시간 동안 일시 중지", + "12hours": "12시간 동안 일시 중지", + "24hours": "24시간 동안 일시 중지", + "untilRestart": "재시작 전까지 일시 중지" + }, + "cancelSuspension": "일시 중지 해제", + "toast": { + "success": { + "registered": "알림 등록에 성공했습니다. 테스트 알림을 포함한 알림을 수신하려면 먼저 Frigate를 재시작해야 합니다.", + "settingSaved": "알림 설정이 저장되었습니다." + }, + "error": { + "registerFailed": "알림 등록 저장 실패." + } + } + }, + "frigatePlus": { + "title": "Frigate+ 설정", + "description": "Frigate+는 사용자의 데이터를 기반으로 학습된 맞춤형 객체 감지 모델을 비롯하여 Frigate 인스턴스를 위한 추가 기능과 역량을 제공하는 구독 서비스입니다. 여기에서 Frigate+ 모델 설정을 관리할 수 있습니다.", + "cardTitles": { + "api": "API", + "currentModel": "현재 모델", + "otherModels": "기타 모델", + "configuration": "구성" + }, + "apiKey": { + "title": "Frigate+ API 키", + "validated": "Frigate+ API 키가 확인 및 검증되었습니다", + "notValidated": "Frigate+ API 키가 감지되지 않았거나 유효하지 않습니다", + "desc": "Frigate+ API 키를 통해 Frigate+ 서비스와의 연동을 활성화합니다.", + "plusLink": "Frigate+ 자세히 알아보기" + }, + "snapshotConfig": { + "title": "스냅샷 구성", + "desc": "Frigate+에 데이터를 제출하려면 설정에서 스냅샷이 활성화되어 있어야 합니다.", + "cleanCopyWarning": "일부 카메라에서 스냅샷이 비활성화되어 있습니다", + "table": { + "camera": "카메라", + "snapshots": "스냅샷" + } + }, + "modelInfo": { + "title": "모델 정보", + "modelType": "모델 유형", + "trainDate": "학습 날짜", + "baseModel": "기본 모델", + "plusModelType": { + "baseModel": "기본 모델", + "userModel": "파인 튜닝 모델" + }, + "supportedDetectors": "지원되는 감지기", + "cameras": "카메라", + "loading": "모델 정보 불러오는 중…", + "error": "모델 정보를 불러오지 못했습니다", + "noModelLoaded": "현재 로드된 Frigate+ 모델이 없습니다.", + "availableModels": "사용 가능한 Frigate+ 모델", + "loadingAvailableModels": "사용 가능한 모델 불러오는 중…", + "selectModel": "모델 선택", + "noModelsAvailable": "사용 가능한 모델 없음", + "filter": { + "ariaLabel": "유형별 모델 필터링", + "baseModels": "기본 모델", + "fineTunedModels": "파인 튜닝 모델" + }, + "modelSelect": "Frigate+에서 사용 가능한 모델을 여기에서 선택할 수 있습니다. 현재 감지기 구성과 호환되는 모델만 선택할 수 있습니다." + }, + "changeInDetectorsAndModel": "모델 변경", + "unsavedChanges": "저장되지 않은 Frigate+ 설정 변경 사항", + "restart_required": "재시작 필요 (Frigate+ 모델 변경됨)", + "toast": { + "success": "Frigate+ 설정이 저장되었습니다. 변경 사항을 적용하려면 Frigate를 재시작하세요.", + "error": "설정 변경 사항 저장 실패: {{errorMessage}}" + } + }, + "detectorsAndModel": { + "title": "감지기 및 모델", + "description": "객체 감지를 실행하는 감지기 백엔드와 감지기가 사용하는 모델을 구성합니다. 감지기와 모델이 항상 일치하도록 변경 사항은 함께 저장됩니다.", + "cardTitles": { + "detector": "감지기 하드웨어", + "model": "감지 모델" + }, + "tabs": { + "plus": "Frigate+", + "custom": "커스텀 모델" + }, + "mismatch": { + "warning": "현재 Frigate+ 모델 \"{{model}}\"은(는) {{required}} 감지기가 필요합니다. 저장하기 전에 아래에서 호환되는 모델을 선택하거나 커스텀 모델로 전환하세요." + }, + "plusModel": { + "requiresDetector": "필요 감지기: {{detector}}", + "noModelSelected": "Frigate+ 모델 선택" + }, + "toast": { + "saveSuccess": "감지기 및 모델 설정이 저장되었습니다. 변경 사항을 적용하려면 Frigate를 재시작하세요.", + "saveError": "감지기 및 모델 설정 저장 실패" + }, + "unsavedChanges": "저장되지 않은 감지기 및 모델 변경 사항", + "restartRequired": "재시작 필요 (감지기 또는 모델 변경됨)" + }, + "maintenance": { + "title": "유지 관리", + "sync": { + "title": "미디어 동기화", + "desc": "Frigate은 보관 구성 설정에 따라 정기적으로 미디어를 정리합니다. 시스템 동작 중 참조가 끊긴 고아 파일이 일부 발생하는 것은 정상입니다. 데이터베이스에서 더 이상 참조하지 않는 디스크 상의 고아 미디어 파일을 정리하려면 이 기능을 사용하세요.", + "started": "미디어 동기화가 시작되었습니다.", + "alreadyRunning": "동기화 작업이 이미 실행 중입니다", + "error": "동기화 시작 실패", + "currentStatus": "상태", + "jobId": "작업 ID", + "startTime": "시작 시간", + "endTime": "종료 시간", + "statusLabel": "상태", + "results": "결과", + "errorLabel": "오류", + "mediaTypes": "미디어 유형", + "allMedia": "모든 미디어", + "dryRun": "시뮬레이션 (Dry Run)", + "dryRunEnabled": "파일이 실제로 삭제되지 않습니다", + "dryRunDisabled": "파일이 실제로 삭제됩니다", + "force": "강제 실행", + "forceDesc": "안전 임계값을 무시하고 50% 이상의 파일이 삭제되더라도 동기화를 완료합니다.", + "verbose": "상세 로그 (Verbose)", + "verboseDesc": "검토를 위해 고아 파일 전체 목록을 디스크에 기록합니다.", + "running": "동기화 실행 중...", + "start": "동기화 시작", + "inProgress": "동기화가 진행 중입니다. 이 페이지는 비활성화됩니다.", + "status": { + "queued": "대기 중", + "running": "실행 중", + "completed": "완료됨", + "failed": "실패함", + "notRunning": "실행 중이 아님" + }, + "resultsFields": { + "filesChecked": "확인된 파일", + "orphansFound": "발견된 고아 파일", + "orphansDeleted": "삭제된 고아 파일", + "aborted": "중단됨. 삭제량이 안전 임계값을 초과합니다.", + "error": "오류", + "totals": "합계" + }, + "event_snapshots": "추적 객체 스냅샷", + "event_thumbnails": "추적 객체 썸네일", + "review_thumbnails": "다시보기 썸네일", + "previews": "미리보기", + "exports": "내보내기", + "recordings": "녹화 파일" + }, + "regionGrid": { + "title": "영역 그리드", + "desc": "영역 그리드는 각 카메라의 화각에서 다양한 크기의 객체가 주로 나타나는 위치를 학습하는 최적화 기능입니다. Frigate은 이 데이터를 사용하여 감지 영역을 효율적으로 산출합니다. 그리드는 추적 객체 데이터를 기반으로 시간이 지남에 따라 자동 구축됩니다.", + "clear": "영역 그리드 초기화", + "clearConfirmTitle": "영역 그리드 초기화", + "clearConfirmDesc": "감지기 모델 크기를 변경했거나 카메라의 물리적 위치를 변경하여 객체 추적 문제가 발생하는 경우가 아니라면 영역 그리드 초기화는 권장되지 않습니다. 그리드는 객체가 추적되면서 점진적으로 자동 재구축됩니다. 변경 사항을 적용하려면 Frigate를 재시작해야 합니다.", + "clearSuccess": "영역 그리드가 성공적으로 초기화되었습니다", + "clearError": "영역 그리드 초기화 실패", + "restartRequired": "영역 그리드 변경 사항을 적용하려면 재시작이 필요합니다" + } + }, + "configForm": { + "global": { + "title": "전역 설정", + "description": "카메라별 설정에서 재정의하지 않는 한 모든 카메라에 적용되는 설정입니다." + }, + "camera": { + "title": "카메라 설정", + "description": "이 카메라에만 적용되며 전역 설정을 재정의하는 설정입니다.", + "noCameras": "사용 가능한 카메라 없음" + }, + "advancedSettingsCount": "고급 설정 ({{count}})", + "advancedCount": "고급 ({{count}})", + "showAdvanced": "고급 설정 표시", + "tabs": { + "sharedDefaults": "공통 기본값", + "system": "시스템", + "integrations": "연동 기능" + }, + "additionalProperties": { + "keyLabel": "키", + "valueLabel": "값", + "keyPlaceholder": "새 키", + "remove": "제거", + "providerNameLabel": "제공업체 이름", + "providerNamePlaceholder": "예: openai", + "variableNameLabel": "변수 이름", + "variableNamePlaceholder": "예: MY_VARIABLE", + "loggerNameLabel": "로거 이름", + "loggerNamePlaceholder": "예: frigate.record", + "keyPatternError": "영문자, 숫자, 하이픈(-), 밑줄(_)만 사용하세요 (공백 불가)" + }, + "knownPlates": { + "namePlaceholder": "예: 아내 차량", + "platePlaceholder": "번호판 번호 또는 정규식" + }, + "liveStreams": { + "streamNameLabel": "스트림 이름", + "streamNamePlaceholder": "예: 메인 HD 스트림", + "go2rtcStreamLabel": "go2rtc 스트림", + "go2rtcStreamPlaceholder": "go2rtc 스트림 선택", + "go2rtcStreamSearch": "스트림 이름 검색 또는 직접 입력…", + "noGo2rtcStreams": "설정된 go2rtc 스트림 없음", + "availableStreams": "사용 가능한 스트림", + "useCustom": "\"{{value}}\" 사용", + "addStream": "스트림 추가" + }, + "timezone": { + "defaultOption": "브라우저 시간대 사용" + }, + "roleMap": { + "empty": "역할 매핑 없음", + "roleLabel": "역할", + "groupsLabel": "그룹", + "addMapping": "역할 매핑 추가", + "remove": "제거" + }, + "ffmpegArgs": { + "preset": "프리셋", + "manual": "수동 인수", + "inherit": "카메라 설정에서 상속", + "none": "없음", + "useGlobalSetting": "전역 설정에서 상속", + "selectPreset": "프리셋 선택", + "manualPlaceholder": "FFmpeg 인수 입력", + "presetLabels": { + "preset-rpi-64-h264": "Raspberry Pi (H.264)", + "preset-rpi-64-h265": "Raspberry Pi (H.265)", + "preset-vaapi": "VAAPI (Intel/AMD GPU)", + "preset-intel-qsv-h264": "Intel QuickSync (H.264)", + "preset-intel-qsv-h265": "Intel QuickSync (H.265)", + "preset-nvidia": "NVIDIA GPU", + "preset-jetson-h264": "NVIDIA Jetson (H.264)", + "preset-jetson-h265": "NVIDIA Jetson (H.265)", + "preset-rkmpp": "Rockchip RKMPP", + "preset-http-jpeg-generic": "HTTP JPEG (범용)", + "preset-http-mjpeg-generic": "HTTP MJPEG (범용)", + "preset-http-reolink": "HTTP - Reolink 카메라", + "preset-rtmp-generic": "RTMP (범용)", + "preset-rtsp-generic": "RTSP (범용)", + "preset-rtsp-restream": "RTSP - go2rtc 재스트리밍", + "preset-rtsp-restream-low-latency": "RTSP - go2rtc 재스트리밍 (저지연)", + "preset-rtsp-udp": "RTSP - UDP", + "preset-rtsp-blue-iris": "RTSP - Blue Iris", + "preset-record-generic": "녹화 (범용, 오디오 제외)", + "preset-record-generic-audio-copy": "녹화 (범용 + 오디오 원본 복사)", + "preset-record-generic-audio-aac": "녹화 (범용 + 오디오 AAC 변환)", + "preset-record-mjpeg": "녹화 - MJPEG 카메라", + "preset-record-jpeg": "녹화 - JPEG 카메라", + "preset-record-ubiquiti": "녹화 - Ubiquiti 카메라" + } + }, + "cameraInputs": { + "itemTitle": "스트림 {{index}}", + "sourceMode": { + "restream": "재스트리밍 (go2rtc)", + "manual": "수동 입력 경로", + "go2rtcStreamLabel": "go2rtc 스트림", + "go2rtcStreamPlaceholder": "go2rtc 스트림 선택", + "noGo2rtcStreams": "설정된 go2rtc 스트림 없음", + "go2rtcStreamSearch": "스트림 검색...", + "availableStreams": "사용 가능한 스트림", + "noMatchingStreams": "일치하는 스트림 없음" + } + }, + "restartRequiredField": "재시작 필요", + "restartRequiredFooter": "구성 변경됨 - 재시작 필요", + "sections": { + "detect": "감지", + "record": "녹화", + "snapshots": "스냅샷", + "motion": "움직임", + "objects": "객체", + "review": "다시보기", + "audio": "오디오", + "notifications": "알림", + "live": "실시간 뷰", + "timestamp_style": "타임스탬프", + "mqtt": "MQTT", + "database": "데이터베이스", + "telemetry": "원격 측정", + "auth": "인증", + "tls": "TLS", + "proxy": "프록시", + "go2rtc": "go2rtc", + "ffmpeg": "FFmpeg", + "detectors": "감지기", + "model": "모델", + "semantic_search": "시맨틱 검색", + "genai": "생성형 AI", + "face_recognition": "얼굴 인식", + "lpr": "차량 번호판 인식", + "birdseye": "버드아이", + "masksAndZones": "마스크 / 구역" + }, + "detect": { + "title": "감지 설정" + }, + "detectors": { + "title": "감지기 설정", + "singleType": "{{type}} 유형의 감지기는 하나만 허용됩니다.", + "keyRequired": "감지기 이름은 필수입니다.", + "keyDuplicate": "감지기 이름이 이미 존재합니다.", + "noSchema": "사용 가능한 감지기 스키마가 없습니다.", + "none": "구성된 감지기 인스턴스가 없습니다.", + "add": "감지기 추가", + "addCustomKey": "커스텀 키 추가" + }, + "record": { + "title": "녹화 설정" + }, + "snapshots": { + "title": "스냅샷 설정" + }, + "motion": { + "title": "움직임 설정" + }, + "objects": { + "title": "객체 설정" + }, + "audioLabels": { + "summary": "선택된 오디오 레이블 {{count}}개", + "empty": "사용 가능한 오디오 레이블 없음" + }, + "objectLabels": { + "summary": "선택된 객체 유형 {{count}}개", + "empty": "사용 가능한 객체 레이블 없음" + }, + "reviewLabels": { + "summary": "선택된 레이블 {{count}}개", + "empty": "사용 가능한 레이블 없음" + }, + "filters": { + "objectFieldLabel": "{{label}}의 {{field}}" + }, + "zoneNames": { + "summary": "{{count}}개 선택됨", + "empty": "사용 가능한 구역 없음" + }, + "inputRoles": { + "summary": "선택된 역할 {{count}}개", + "empty": "사용 가능한 역할 없음", + "options": { + "detect": "감지", + "record": "녹화", + "audio": "오디오" + } + }, + "genaiRoles": { + "options": { + "embeddings": "임베딩", + "descriptions": "설명", + "chat": "채팅" + } + }, + "semanticSearchModel": { + "placeholder": "모델 선택…", + "builtIn": "내장 모델", + "genaiProviders": "GenAI 제공업체" + }, + "semanticSearchModelSize": { + "notApplicable": "GenAI 제공업체에는 적용되지 않음" + }, + "review": { + "title": "다시보기 설정" + }, + "audio": { + "title": "오디오 설정" + }, + "notifications": { + "title": "알림 설정" + }, + "live": { + "title": "실시간 뷰 설정" + }, + "timestamp_style": { + "title": "타임스탬프 설정" + }, + "searchPlaceholder": "검색...", + "addCustomLabel": "사용자 정의 레이블 추가...", + "genaiModel": { + "placeholder": "모델 선택 또는 직접 입력…", + "search": "모델 검색 또는 직접 입력…", + "noModels": "사용 가능한 모델 없음", + "available": "사용 가능한 모델", + "useCustom": "\"{{value}}\" 사용", + "refresh": "모델 새로고침", + "probeFailed": "모델 탐색 실패", + "fetchedModels": "모델 목록을 성공적으로 가져왔습니다" + }, + "ptzPresets": { + "placeholder": "프리셋 선택 또는 직접 입력...", + "search": "프리셋 검색 또는 직접 입력...", + "noPresets": "사용 가능한 프리셋 없음", + "available": "카메라 프리셋", + "useCustom": "\"{{value}}\" 사용" + }, + "defaultRole": { + "admin": "관리자", + "viewer": "조회자" + } + }, + "globalConfig": { + "title": "전역 설정", + "description": "재정의하지 않는 한 모든 카메라에 공통으로 적용되는 전역 설정을 구성합니다.", + "toast": { + "success": "전역 설정을 성공적으로 저장했습니다", + "error": "전역 설정 저장 실패", + "validationError": "유효성 검사 실패" + } + }, + "cameraConfig": { + "title": "카메라 설정", + "description": "개별 카메라의 설정을 구성합니다. 전역 기본값보다 우선 적용됩니다.", + "overriddenBadge": "재정의됨", + "resetToGlobal": "전역 기본값으로 초기화", + "toast": { + "success": "카메라 설정을 성공적으로 저장했습니다", + "error": "카메라 설정 저장 실패" + } + }, + "toast": { + "success": "설정을 성공적으로 저장했습니다", + "applied": "설정이 성공적으로 적용되었습니다", + "successRestartRequired": "설정을 성공적으로 저장했습니다. 변경 사항을 적용하려면 Frigate를 재시작하세요.", + "error": "설정 저장 실패", + "validationError": "유효성 검사 실패: {{message}}", + "resetSuccess": "전역 기본값으로 초기화되었습니다", + "resetError": "설정 초기화 실패", + "saveAllSuccess_other": "모든 {{count}}개 섹션을 성공적으로 저장했습니다.", + "saveAllSuccessRestartRequired_other": "모든 {{count}}개 섹션을 성공적으로 저장했습니다. 변경 사항을 적용하려면 Frigate를 재시작하세요.", + "saveAllPartial_other": "총 {{totalCount}}개 중 {{successCount}}개 섹션 저장 완료. {{failCount}}개 실패.", + "saveAllFailure": "모든 섹션 저장 실패." + }, + "profiles": { + "title": "프로필", + "activeProfile": "활성 프로필", + "noActiveProfile": "활성화된 프로필 없음", + "active": "활성", + "activated": "'{{profile}}' 프로필 활성화됨", + "activateFailed": "프로필 설정 실패", + "deactivated": "프로필 비활성화됨", + "noProfiles": "정의된 프로필이 없습니다.", + "noOverrides": "재정의 없음", + "cameraCount_other": "카메라 {{count}}대", + "columnCamera": "카메라", + "columnOverrides": "프로필 재정의", + "baseConfig": "기본 설정", + "addProfile": "프로필 추가", + "newProfile": "새 프로필", + "profileNamePlaceholder": "예: 재실 모드, 외출 모드, 야간 모드", + "friendlyNameLabel": "프로필 이름", + "profileIdLabel": "프로필 ID", + "profileIdDescription": "설정 파일 및 자동화에서 사용하는 내부 식별자", + "nameInvalid": "소문자, 숫자, 밑줄(_)만 허용됩니다", + "nameDuplicate": "동일한 이름의 프로필이 이미 존재합니다", + "error": { + "mustBeAtLeastTwoCharacters": "최소 2자 이상이어야 합니다", + "mustNotContainPeriod": "마침표를 포함할 수 없습니다", + "alreadyExists": "동일한 ID의 프로필이 이미 존재합니다" + }, + "renameProfile": "프로필 이름 변경", + "renameSuccess": "프로필 이름을 '{{profile}}'(으)로 변경했습니다", + "deleteProfile": "프로필 삭제", + "deleteProfileConfirm": "모든 카메라에서 \"{{profile}}\" 프로필을 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.", + "deleteSuccess": "'{{profile}}' 프로필 삭제됨", + "createSuccess": "'{{profile}}' 프로필 생성됨", + "removeOverride": "프로필 재정의 제거", + "deleteSection": "섹션 재정의 삭제", + "deleteSectionConfirm": "{{camera}}의 {{profile}} 프로필에 대한 {{section}} 재정의를 제거하시겠습니까?", + "deleteSectionSuccess": "{{profile}}의 {{section}} 재정의가 제거되었습니다", + "enableSwitch": "프로필 활성화", + "enabledDescription": "프로필이 활성화되었습니다. 아래에서 새 프로필을 생성하고, 카메라 설정 섹션으로 이동하여 설정을 수정한 후 저장하세요.", + "disabledDescription": "프로필을 사용하면 필요에 따라 활성화할 수 있는 명명된 카메라 설정 재정의 세트(예: 경비, 외출, 야간)를 정의할 수 있습니다." + }, + "unsavedChanges": "저장되지 않은 변경 사항이 있습니다", + "confirmReset": "초기화 확인", + "resetToDefaultDescription": "이 섹션의 모든 설정을 기본값으로 초기화합니다. 이 작업은 되돌릴 수 없습니다.", + "resetToGlobalDescription": "이 섹션의 설정을 전역 기본값으로 되돌립니다. 이 작업은 되돌릴 수 없습니다.", + "go2rtcStreams": { + "title": "go2rtc 스트림", + "description": "카메라 재스트리밍을 위한 go2rtc 스트림 구성을 관리합니다. 각 스트림은 이름과 하나 이상의 소스 URL을 갖습니다.", + "addStream": "스트림 추가", + "addStreamDesc": "새 스트림의 이름을 입력하세요. 이 이름은 카메라 구성에서 스트림을 참조할 때 사용됩니다.", + "addUrl": "URL 추가", + "sourceNumber": "소스 {{index}}", + "streamName": "스트림 이름", + "streamNamePlaceholder": "예: front_door", + "streamUrlPlaceholder": "예: rtsp://user:pass@192.168.1.100/stream", + "deleteStream": "스트림 삭제", + "deleteStreamConfirm": "정말로 \"{{streamName}}\" 스트림을 삭제하시겠습니까? 이 스트림을 참조하는 카메라의 연결이 끊어질 수 있습니다.", + "noStreams": "설정된 go2rtc 스트림이 없습니다. 시작하려면 스트림을 추가하세요.", + "validation": { + "nameRequired": "스트림 이름은 필수입니다", + "nameDuplicate": "동일한 이름의 스트림이 이미 존재합니다", + "nameInvalid": "스트림 이름은 영문자, 숫자, 밑줄(_), 하이픈(-)만 포함할 수 있습니다", + "urlRequired": "최소 하나 이상의 URL이 필요합니다" + }, + "renameStream": "스트림 이름 변경", + "renameStreamDesc": "이 스트림의 새 이름을 입력하세요. 스트림 이름을 변경하면 해당 이름을 참조하는 카메라나 다른 스트림의 동작이 중단될 수 있습니다.", + "newStreamName": "새 스트림 이름", + "ffmpeg": { + "useFfmpegModule": "호환 모드 사용 (FFmpeg)", + "video": "비디오", + "audio": "오디오", + "hardware": "하드웨어 가속", + "videoCopy": "복사", + "videoH264": "H.264로 트랜스코딩", + "videoH265": "H.265로 트랜스코딩", + "videoExclude": "제외", + "audioCopy": "복사", + "audioAac": "AAC로 트랜스코딩", + "audioOpus": "Opus로 트랜스코딩", + "audioPcmu": "PCM μ-law로 트랜스코딩", + "audioPcma": "PCM A-law로 트랜스코딩", + "audioPcm": "PCM으로 트랜스코딩", + "audioMp3": "MP3로 트랜스코딩", + "audioExclude": "제외", + "hardwareNone": "하드웨어 가속 없음", + "hardwareAuto": "자동 (권장)", + "hardwareVaapi": "VAAPI", + "hardwareCuda": "CUDA", + "hardwareV4l2m2m": "V4L2 M2M", + "hardwareDxva2": "DXVA2", + "hardwareVideotoolbox": "VideoToolbox", + "addVideoCodec": "비디오 코덱 추가", + "addAudioCodec": "오디오 코덱 추가", + "removeCodec": "코덱 제거" + } + }, + "birdseye": { + "trackingMode": { + "objects": "객체", + "motion": "움직임", + "continuous": "상시" + }, + "cameraOrder": { + "label": "카메라 순서", + "description": "카메라를 드래그하여 버드아이 레이아웃 내 표시 순서를 설정하세요.", + "reorderHandle": "드래그하여 순서 변경", + "saving": "저장 중…", + "saved": "저장됨" + } + }, + "retainMode": { + "all": "전체", + "motion": "움직임", + "active_objects": "활동 중인 객체" + }, + "previewQuality": { + "very_high": "매우 높음", + "high": "높음", + "medium": "보통", + "low": "낮음", + "very_low": "매우 낮음" + }, + "ui": { + "timeFormat": { + "browser": "브라우저 설정", + "12hour": "12시간제", + "24hour": "24시간제" + }, + "unitSystem": { + "metric": "미터법 (Metric)", + "imperial": "야드파운드법 (Imperial)" + } + }, + "review": { + "imageSource": { + "recordings": "녹화 영상", + "previews": "미리보기" + } + }, + "logger": { + "logLevel": { + "debug": "Debug", + "info": "Info", + "warning": "경고", + "error": "Error", + "critical": "심각" + } + }, + "onvif": { + "profileAuto": "자동", + "profileLoading": "프로필 불러오는 중...", + "autotracking": { + "zooming": { + "disabled": "비활성화됨", + "absolute": "절대 좌표 (Absolute)", + "relative": "상대 좌표 (Relative)" + } + } + }, + "modelSize": { + "small": "작음 (Small)", + "large": "큼 (Large)" + }, + "configMessages": { + "review": { + "recordDisabled": "녹화가 비활성화되어 있어 다시보기 항목이 생성되지 않습니다.", + "detectDisabled": "객체 감지가 비활성화되어 있습니다. 다시보기 항목은 알림 및 감지를 분류하기 위해 감지된 객체가 필요합니다.", + "allNonAlertDetections": "알림이 아닌 모든 활동은 일반 감지 이벤트로 포함됩니다.", + "genaiImageSourceRecordingsRecordDisabled": "이미지 소스가 '녹화 영상(recordings)'으로 설정되어 있지만 녹화가 비활성화되어 있습니다. Frigate이 미리보기 이미지로 대체합니다." + }, + "audio": { + "noAudioRole": "audio 역할이 정의된 스트림이 없습니다. 오디오 감지가 작동하려면 스트림에 audio 역할을 지정해야 합니다." + }, + "audioTranscription": { + "audioDetectionDisabled": "이 카메라에 오디오 감지가 활성화되어 있지 않습니다. 오디오 텍스트 변환을 사용하려면 오디오 감지가 켜져 있어야 합니다." + }, + "detect": { + "fpsGreaterThanFive": "감지 FPS를 5보다 높게 설정하는 것은 권장되지 않습니다. 높은 값은 성능 문제를 일으킬 수 있으며 감지 품질에 실질적인 이점이 없습니다.", + "disabled": "객체 감지가 비활성화되었습니다. 스냅샷, 다시보기 항목 및 얼굴 인식, 번호판 인식, 생성형 AI와 같은 확장 기능이 작동하지 않습니다.", + "resolutionShouldBeMultipleOfFour": "최상의 결과를 위해 감지 너비와 높이는 4의 배수여야 합니다. 4의 배수가 아닌 다른 짝수 값은 감지 스트림에 시각적 왜곡이나 아티팩트를 유발할 수 있습니다.", + "aspectRatioMismatch": "입력한 너비와 높이가 현재 감지 해상도의 가로세로 비율과 일치하지 않습니다. 이미지가 늘어나거나 왜곡될 수 있습니다.", + "maxFramesSet": "max_frames 값을 설정하면 기본 동작이 재정의되어 정지 객체 추적이 비활성화됩니다. 극히 드문 상황에서만 필요하므로 주의해서 사용하세요.", + "squareResolution": "정사각형 감지 해상도는 일반적이지 않습니다. 감지 너비와 높이는 객체 감지 모델의 크기가 아니라 카메라의 화면 비율(예: 16:9)과 일치해야 합니다. 가로세로 비율이 맞지 않으면 이미지가 왜곡되어 감지 정확도가 떨어질 수 있습니다.", + "resolutionHigh": "이 감지 해상도는 권장값보다 높아 감지 정확도 개선 없이 자원 소모만 크게 증가시킬 수 있습니다. 대부분의 카메라에는 1080p 이하의 감지 해상도를 권장합니다.", + "globalResolutionMultipleCameras": "여러 대의 카메라가 구성된 상태에서 전역 감지 해상도가 설정되어 있습니다. 모든 카메라의 해상도와 화면 비율이 동일하지 않다면, 각 카메라의 기본 화면 비율에 맞게 카메라별로 감지 너비와 높이를 지정해야 합니다." + }, + "model": { + "optimizedFor320": "Frigate은 대부분의 환경에 가장 적합한 320x320 모델에 최적화되어 있습니다. 640x640 모델은 처리 속도가 느리며 특수한 시나리오에서만 유용합니다.", + "inputDimensionsNotDetectResolution": "모델 입력 너비와 높이는 카메라의 감지 해상도가 아니라 객체 감지 모델 자체의 입력 크기입니다. 사용 중인 모델의 크기(일반적으로 320x320 또는 640x640과 같은 정사각형 형태)와 일치해야 합니다." + }, + "ffmpeg": { + "hwaccelManualNotRecommended": "수동 하드웨어 가속 인수는 권장되지 않습니다. 특수한 요구 사항이 없다면 하드웨어 환경에 맞는 프리셋을 선택하세요.", + "inputsMissingGo2rtcStream": "아래 입력 스트림 중 더 이상 존재하지 않는 go2rtc 재스트림을 가리키는 항목이 있습니다. 기존 재스트림을 선택하거나 카메라 URL을 직접 수동 입력하세요. 그렇지 않으면 카메라 연결에 실패합니다." + }, + "objects": { + "genaiNoDescriptionsProvider": "설명을 생성하려면 'descriptions' 역할이 지정된 GenAI 제공업체를 구성해야 합니다." + }, + "faceRecognition": { + "globalDisabled": "이 카메라에서 얼굴 인식 기능을 사용하려면 먼저 전역 확장 기능에서 얼굴 인식을 활성화해야 합니다.", + "personNotTracked": "얼굴 인식을 사용하려면 'person' 객체가 추적되어야 합니다. 이 카메라의 객체 설정에서 'person'을 활성화하세요.", + "modelSizeLarge": "'large' 모델은 원활한 동작을 위해 GPU 또는 NPU가 필요합니다. CPU 전용 시스템에서는 'small' 모델을 사용하세요." + }, + "lpr": { + "globalDisabled": "이 카메라에서 차량 번호판 인식 기능을 사용하려면 먼저 전역 확장 기능에서 번호판 인식을 활성화해야 합니다.", + "vehicleNotTracked": "차량 번호판 인식을 사용하려면 차량 객체가 추적되어야 합니다. 이 카메라의 객체 설정에서 'car' 또는 다른 차량 유형을 활성화하세요.", + "modelSizeLarge": "'large' 모델은 여러 줄로 된 번호판 형식에 최적화되어 있습니다. 사용 지역에 여러 줄 번호판이 사용되지 않는 한, 'small' 모델이 'large'보다 성능이 훨씬 우수하므로 'small' 사용을 권장합니다." + }, + "record": { + "noRecordRole": "record 역할이 지정된 스트림이 없습니다. 녹화 기능이 작동하지 않습니다." + }, + "birdseye": { + "objectsModeDetectDisabled": "버드아이가 '객체(objects)' 모드로 설정되어 있지만 이 카메라에서 객체 감지가 비활성화되어 있습니다. 해당 카메라는 버드아이에 표시되지 않습니다." + }, + "snapshots": { + "detectDisabled": "객체 감지가 비활성화되어 있습니다. 스냅샷은 추적된 객체로부터 생성되므로 스냅샷이 생성되지 않습니다." + }, + "detectors": { + "mixedTypes": "모든 감지기는 동일한 유형이어야 합니다. 다른 유형을 사용하려면 기존 감지기를 삭제하세요.", + "mixedTypesSuggestion": "모든 감지기는 동일한 유형이어야 합니다. 기존 감지기를 제거하거나 {{type}}을(를) 선택하세요." + }, + "semanticSearch": { + "jinav2SmallModelSize": "Jina V2 모델의 'small' 크기는 RAM 소모량과 추론 비용이 높습니다. 외장 GPU 환경에서 'large' 모델을 사용하는 것을 권장합니다." + }, + "onvif": { + "autotrackingNoZones": "자동 추적에는 최소 하나 이상의 구역이 필요합니다. '마스크 / 구역'에서 이 카메라에 구역을 정의한 다음, 아래에서 필수 구역으로 지정하세요." + } } } diff --git a/web/public/locales/ko/views/system.json b/web/public/locales/ko/views/system.json index 0631370644..d895b76c10 100644 --- a/web/public/locales/ko/views/system.json +++ b/web/public/locales/ko/views/system.json @@ -1,198 +1,247 @@ { "documentTitle": { "cameras": "카메라 통계 - Frigate", - "storage": "저장소 통계 - Frigate", - "general": "기본 통계 - Frigate", - "enrichments": "데이터 보강 통계 - Frigate", + "storage": "저장 공간 통계 - Frigate", + "general": "일반 통계 - Frigate", + "enrichments": "확장 기능 통계 - Frigate", "logs": { - "frigate": "Frigate 로그 -Frigate", + "frigate": "Frigate 로그 - Frigate", "go2rtc": "Go2RTC 로그 - Frigate", "nginx": "Nginx 로그 - Frigate", - "websocket": "메세지 로그 - Frigate" + "websocket": "메시지 로그 - Frigate" } }, "title": "시스템", - "metrics": "시스템 통계", + "metrics": "시스템 지표", "logs": { "download": { - "label": "다운로드 로그" + "label": "로그 다운로드" }, "copy": { - "label": "클립보드에 복사하기", - "success": "클립보드에 로그가 복사되었습니다", - "error": "클립보드에 로그를 저장할 수 없습니다" + "label": "클립보드에 복사", + "success": "로그를 클립보드에 복사했습니다", + "error": "로그를 클립보드에 복사할 수 없습니다" }, "type": { - "label": "타입", - "timestamp": "시간 기록", + "label": "유형", + "timestamp": "타임스탬프", "tag": "태그", "message": "메시지" }, - "tips": "서버에서 로그 스트리밍 중", + "tips": "서버에서 로그가 실시간 스트리밍 중입니다", "toast": { "error": { "fetchingLogsFailed": "로그 가져오기 오류: {{errorMessage}}", - "whileStreamingLogs": "스크리밍 로그 중 오류: {{errorMessage}}" + "whileStreamingLogs": "로그 스트리밍 중 오류 발생: {{errorMessage}}" } }, "websocket": { - "label": "메세지", - "pause": "일시중지", - "resume": "재개", - "clear": "비우기", + "label": "메시지", + "pause": "일시 중지", + "resume": "다시 시작", + "clear": "지우기", "filter": { - "all": "전체 항목", - "topics": "항목", + "all": "모든 토픽", + "topics": "토픽", "events": "이벤트", - "reviews": "리뷰", + "reviews": "다시보기", "classification": "분류", "face_recognition": "얼굴 인식", - "lpr": "번호판 인식", + "lpr": "차량 번호판 인식 (LPR)", "system": "시스템", "camera": "카메라", "all_cameras": "모든 카메라", - "cameras_count_one": "{{count}} 카메라", - "cameras_count_other": "{{count}} 카메라" + "cameras_count_one": "카메라 {{count}}대", + "cameras_count_other": "카메라 {{count}}대", + "camera_activity": "카메라 활동" }, - "empty": "수신된 메시지 없음", - "count_one": "{{count}} 메세지", - "count_other": "{{count}} 메세지" + "empty": "수집된 메시지가 아직 없습니다", + "count_one": "메시지 {{count}}개", + "count_other": "메시지 {{count}}개", + "expanded": { + "payload": "페이로드" + } } }, "general": { - "title": "기본", + "title": "일반", "detector": { "title": "감지기", - "inferenceSpeed": "감지 추론 속도", + "inferenceSpeed": "감지기 추론 속도", "temperature": "감지기 온도", - "cpuUsage": "감지기 CPU 사용률", - "memoryUsage": "감지기 메모리 사용률", - "cpuUsageInformation": "감지 모델로 데이터를 입력/출력하기 위한 전처리 과정에서 사용되는 CPU 사용량입니다. GPU나 가속기를 사용하는 경우에도 추론 자체의 사용량은 포함되지 않습니다." + "cpuUsage": "감지기 CPU 사용량", + "memoryUsage": "감지기 메모리 사용량", + "cpuUsageInformation": "감지 모델과의 입출력 데이터를 준비하는 데 사용된 CPU 리소스입니다. GPU 또는 전용 가속기를 사용하더라도 추론 연산 자체의 사용량은 측정되지 않습니다." }, "hardwareInfo": { "title": "하드웨어 정보", - "gpuUsage": "GPU 사용률", + "gpuUsage": "GPU 사용량", "gpuMemory": "GPU 메모리", "gpuEncoder": "GPU 인코더", "gpuDecoder": "GPU 디코더", "gpuInfo": { "vainfoOutput": { - "title": "Vainfo 출력", + "title": "Vainfo 출력 결과", "processOutput": "프로세스 출력:", "processError": "프로세스 오류:", - "returnCode": "리턴 코드:{{code}}" + "returnCode": "반환 코드: {{code}}" }, "nvidiaSMIOutput": { - "title": "Nvidia SMI 출력", - "name": "이름:{{name}}", - "driver": "드라이버:{{driver}}", - "cudaComputerCapability": "CUDA Compute Capability:{{cuda_compute}}", - "vbios": "VBios Info: {{vbios}}" + "title": "Nvidia SMI 출력 결과", + "name": "이름: {{name}}", + "driver": "드라이버: {{driver}}", + "cudaComputerCapability": "CUDA 연산 능력: {{cuda_compute}}", + "vbios": "VBIOS 정보: {{vbios}}" }, "copyInfo": { "label": "GPU 정보 복사" }, "toast": { - "success": "GPU 정보가 클립보드에 복사되었습니다" + "success": "GPU 정보를 클립보드에 복사했습니다" }, "closeInfo": { "label": "GPU 정보 닫기" } }, - "npuUsage": "NPU 사용률", - "npuMemory": "NPU 메모리" + "npuUsage": "NPU 사용량", + "npuMemory": "NPU 메모리", + "gpuCompute": "GPU 연산 / 인코딩", + "gpuTemperature": "GPU 온도", + "npuTemperature": "NPU 온도" }, "otherProcesses": { - "title": "다른 프로세스들", - "processCpuUsage": "사용중인 CPU 사용률", - "processMemoryUsage": "사용중인 메모리 사용률" + "title": "기타 프로세스", + "processCpuUsage": "프로세스 CPU 사용량", + "processMemoryUsage": "프로세스 메모리 사용량", + "series": { + "go2rtc": "go2rtc", + "recording": "녹화", + "review_segment": "다시보기 세그먼트", + "embeddings": "임베딩", + "audio_detector": "오디오 감지기" + } } }, "storage": { - "title": "스토리지", - "overview": "전체 현황", + "title": "저장 공간", + "overview": "개요", "recordings": { - "title": "녹화", - "tips": "이 값은 Frigate 데이터베이스의 녹화 영상이 사용 중인 전체 저장 공간입니다. Frigate는 디스크 내 다른 파일들의 저장 공간은 추적하지 않습니다.", - "earliestRecording": "가장 오래된 녹화 영상:" + "title": "녹화 파일", + "tips": "이 수치는 Frigate 데이터베이스에 기록된 녹화 파일이 사용하는 총 저장 공간을 나타냅니다. Frigate은 디스크 상의 모든 파일에 대한 사용량을 추적하지는 않습니다.", + "earliestRecording": "가장 오래된 녹화 시점:" }, "cameraStorage": { - "title": "카메라 저장소", + "title": "카메라별 저장 공간", "camera": "카메라", - "unusedStorageInformation": "미사용 저장소 정보", - "storageUsed": "용량", - "percentageOfTotalUsed": "전체 대비 비율", + "unusedStorageInformation": "여유 공간 정보", + "storageUsed": "저장 공간", + "percentageOfTotalUsed": "전체 대비 사용 비율", "bandwidth": "대역폭", "unused": { - "title": "미사용", - "tips": "드라이브에 Frigate 녹화 영상 외에 다른 파일이 저장되어 있는 경우, 이 값은 Frigate에서 실제 사용 가능한 여유 공간을 정확히 나타내지 않을 수 있습니다. Frigate는 녹화 영상 외의 저장 공간 사용량을 추적하지 않습니다." + "title": "여유 공간", + "tips": "드라이브에 Frigate 녹화본 외에 다른 파일이 저장되어 있는 경우 이 수치가 Frigate에서 사용 가능한 실제 여유 공간과 정확히 일치하지 않을 수 있습니다. Frigate은 자체 녹화본 외부의 저장 공간 사용량을 추적하지 않습니다." } }, "shm": { - "title": "SHM (공유 메모리) 할당량", - "warning": "현재 SHM 사이즈가 {{total}}MB로 너무 적습니다. 최소 {{min_shm}}MB 이상 올려주세요." + "title": "공유 메모리 (SHM) 할당", + "warning": "현재 공유 메모리 크기({{total}}MB)가 너무 작습니다. 최소 {{min_shm}}MB 이상으로 늘려주세요.", + "frameLifetime": { + "title": "프레임 유지 시간", + "description": "각 카메라는 공유 메모리에 {{frames}}개의 프레임 슬롯을 가집니다. 가장 빠른 카메라의 프레임 속도를 기준으로, 각 프레임은 덮어쓰기 전까지 약 {{lifetime}}초 동안 유지됩니다." + } } }, "cameras": { "title": "카메라", - "overview": "전체 현황", + "overview": "개요", "info": { - "aspectRatio": "종횡비", - "fetching": "카메라 데이터 수집 중", + "aspectRatio": "화면비", + "fetching": "카메라 데이터 가져오는 중", "stream": "스트림 {{idx}}", - "streamDataFromFFPROBE": "스트림 데이터는 ffprobe에서 받습니다.", + "streamDataFromFFPROBE": "스트림 데이터는 ffprobe를 통해 가져옵니다.", "video": "비디오:", "codec": "코덱:", "resolution": "해상도:", "fps": "FPS:", "unknown": "알 수 없음", "audio": "오디오:", - "error": "오류:{{error}}", - "cameraProbeInfo": "{{camera}} 카메라 장치 정보", + "error": "오류: {{error}}", + "cameraProbeInfo": "{{camera}} 카메라 탐색 정보", "tips": { - "title": "카메라 장치 정보" + "title": "카메라 탐색 정보" + }, + "keyframes": { + "title": "키프레임 분석", + "analyzing": "키프레임 분석 중... {{seconds}}초 남음", + "stillAnalyzing": "키프레임을 계속 분석하고 있습니다...", + "recordStream": "녹화 스트림:", + "keyframeCount": "감지된 키프레임 수:", + "observedDuration": "측정 기간:", + "gap": "키프레임 간격 (최소 / 평균 / 최대):", + "segmentLength": "녹화 세그먼트 길이:", + "ok": "키프레임이 약 {{seconds}}초마다 배치되어 녹화 및 재생에 적합합니다.", + "warning": "키프레임 간격이 불규칙하거나 멉니다(최대 간격 약 {{seconds}}초). 스마트 코덱(H.264+/H.265+)일 가능성이 높으며 권장되지 않습니다.", + "error": "키프레임 간격(약 {{seconds}}초)이 녹화 세그먼트 길이({{segmentTime}}초)를 초과합니다. 일부 세그먼트에 키프레임이 없어 재생에 문제가 발생할 수 있습니다. 카메라에서 스마트/+ 코덱을 끄거나 키프레임 간격을 줄이세요.", + "unknown": "키프레임 간격을 확인할 수 없습니다.", + "recordDisabled": "이 카메라의 녹화 기능이 비활성화되어 있습니다." } }, - "framesAndDetections": "프레임 / 감지 (Detections)", + "framesAndDetections": "프레임 / 감지", "label": { "camera": "카메라", "detect": "감지", "skipped": "건너뜀", "ffmpeg": "FFmpeg", - "capture": "캡쳐", - "overallFramesPerSecond": "전체 초당 프레임", - "overallDetectionsPerSecond": "전체 초당 감지", - "overallSkippedDetectionsPerSecond": "전체 초당 건너뛴 감지", + "capture": "캡처", + "overallFramesPerSecond": "전체 초당 프레임 수", + "overallDetectionsPerSecond": "전체 초당 감지 수", + "overallSkippedDetectionsPerSecond": "전체 초당 건너뛴 감지 수", "cameraFfmpeg": "{{camName}} FFmpeg", - "cameraCapture": "{{camName}} 캡쳐", + "cameraCapture": "{{camName}} 캡처", "cameraDetect": "{{camName}} 감지", - "cameraFramesPerSecond": "{{camName}} 초당 프레임", - "cameraDetectionsPerSecond": "{{camName}} 초당 감지", - "cameraSkippedDetectionsPerSecond": "{{camName}} 초당 건너뛴 감지" + "cameraFramesPerSecond": "{{camName}} 초당 프레임 수", + "cameraDetectionsPerSecond": "{{camName}} 초당 감지 수", + "cameraSkippedDetectionsPerSecond": "{{camName}} 초당 건너뛴 감지 수", + "cameraGpu": "{{camName}} GPU" }, "toast": { "success": { - "copyToClipboard": "데이터 정보가 클립보드에 복사되었습니다." + "copyToClipboard": "탐색 데이터를 클립보드에 복사했습니다." }, "error": { - "unableToProbeCamera": "카메라 정보 알 수 없음: {{errorMessage}}" + "unableToProbeCamera": "카메라를 탐색할 수 없음: {{errorMessage}}" } + }, + "noCameras": { + "title": "발견된 카메라 없음" + }, + "connectionQuality": { + "title": "연결 상태", + "excellent": "매우 좋음", + "fair": "보통", + "poor": "불안정", + "unusable": "사용 불가", + "fps": "FPS", + "expectedFps": "예상 FPS", + "reconnectsLastHour": "재연결 횟수 (최근 1시간)", + "stallsLastHour": "지연/끊김 횟수 (최근 1시간)" } }, - "lastRefreshed": "마지막 새로고침: ", + "lastRefreshed": "마지막 갱신: ", "stats": { - "ffmpegHighCpuUsage": "{{camera}} FFmpeg CPU 사용량이 높습니다 ({{ffmpegAvg}}%)", - "detectHighCpuUsage": "{{camera}} 감지 CPU 사용량이 높습니다 ({{detectAvg}}%)", - "healthy": "시스템 정상", - "reindexingEmbeddings": "검색 데이터 재정리 중 ({{processed}}% 완료)", - "cameraIsOffline": "{{camera}} 오프라인입니다", - "detectIsSlow": "{{detect}} (이/가) 느립니다 ({{speed}} ms)", - "detectIsVerySlow": "{{detect}} (이/가) 매우 느립니다 ({{speed}} ms)", - "shmTooLow": "/dev/shm 할당량을 ({{total}} MB) 최소 {{min}} MB 이상 증가시켜야합니다." + "ffmpegHighCpuUsage": "{{camera}} 카메라의 FFmpeg CPU 사용량이 높습니다 ({{ffmpegAvg}}%)", + "detectHighCpuUsage": "{{camera}} 카메라의 감지(detect) CPU 사용량이 높습니다 ({{detectAvg}}%)", + "healthy": "시스템 상태가 양호합니다", + "reindexingEmbeddings": "임베딩 재색인 중 ({{processed}}% 완료)", + "cameraIsOffline": "{{camera}} 카메라가 오프라인 상태입니다", + "detectIsSlow": "{{detect}} 처리가 느립니다 ({{speed}}ms)", + "detectIsVerySlow": "{{detect}} 처리가 매우 느립니다 ({{speed}}ms)", + "shmTooLow": "/dev/shm 할당량({{total}}MB)을 최소 {{min}}MB 이상으로 늘려야 합니다.", + "debugReplayActive": "디버그 리플레이 세션이 실행 중입니다" }, "enrichments": { - "title": "데이터 보강", - "infPerSecond": "초당 추론 속도", + "title": "확장 기능", + "infPerSecond": "초당 추론 횟수", "embeddings": { "image_embedding": "이미지 임베딩", "text_embedding": "텍스트 임베딩", @@ -203,8 +252,18 @@ "face_recognition_speed": "얼굴 인식 속도", "plate_recognition_speed": "번호판 인식 속도", "text_embedding_speed": "텍스트 임베딩 속도", - "yolov9_plate_detection_speed": "YOLOv9 플레이트 감지 속도", - "yolov9_plate_detection": "YOLOv9 플레이트 감지" - } + "yolov9_plate_detection_speed": "YOLOv9 번호판 감지 속도", + "yolov9_plate_detection": "YOLOv9 번호판 감지", + "review_description": "다시보기 설명", + "review_description_speed": "다시보기 설명 생성 속도", + "review_description_events_per_second": "다시보기 설명", + "object_description": "객체 설명", + "object_description_speed": "객체 설명 생성 속도", + "object_description_events_per_second": "객체 설명", + "classification": "{{name}} 분류", + "classification_speed": "{{name}} 분류 속도", + "classification_events_per_second": "{{name}} 초당 분류 이벤트 수" + }, + "averageInf": "평균 추론 시간" } }