// Korean translations
window.LANG_KO = {
  // Common
  common: {
    save: "저장",
    cancel: "취소",
    confirm: "확인",
    loading: "로딩 중...",
    success: "성공",
    failed: "실패",
    delete: "삭제",
    edit: "편집",
    add: "추가",
    enable: "활성화",
    disable: "비활성화",
    enabled: "활성화됨",
    disabled: "비활성화됨",
    yes: "예",
    no: "아니오",
    on: "켜기",
    off: "끄기",
    apply: "적용",
    reset: "초기화",
    refresh: "새로고침",
    close: "닫기",
    back: "뒤로",
    next: "다음",
    previous: "이전",
    submit: "제출",
    action: "작업",
    chinese: "中文",
    traditionalChinese: "繁體中文",
    english: "English",
    spanish: "Español",
    japanese: "日本語",
    korean: "한국어",
    german: "Deutsch",
    french: "Français",
    portuguese: "Português",
    russian: "Русский",
    italian: "Italiano",
    turkish: "Türkçe",
    continue: "계속",
    copy: "복사",
    copied: "복사됨"
  },

  preview: {
    flvRequired: "FLV 스트림을 활성화하세요.",
    flvOrHlsRequired: "FLV 또는 HLS 라이브 스트림을 하나 이상 활성화하세요.",
    hlsUnsupportedEnableFlv: "이 브라우저는 HLS 미리보기를 지원하지 않습니다. FLV 스트림을 활성화하세요."
  },

  play: {
    mainFlvRequired: "메인 스트림 FLV를 활성화해야 합니다",
    browserFlvUnsupported: "이 브라우저는 FLV 재생을 지원하지 않습니다. Chrome, Edge, Firefox와 같은 최신 브라우저를 사용하세요"
  },

  // Page titles
  title: {
    encoder: "H.265/H.264 인코더",
    status: "상태",
    mainStream: "메인 스트림",
    subStream1: "서브 스트림 1",
    subStream2: "서브 스트림 2",
    subStream3: "서브 스트림 3",
    videoSettings: "영상 설정",
    audioSettings: "오디오 설정",
    advancedSettings: "고급 설정",
    osdMain: "OSD - 메인 스트림",
    osdSub1: "OSD - 서브 스트림 1",
    osdSub2: "OSD - 서브 스트림 2",
    osdSub3: "OSD - 서브 스트림 3",
    logoUpload: "로고 업로드",
    network: "네트워크 설정",
    record: "녹화 설정",
    gb28181: "GB28181",
    wifi: "WIFI 설정",
    g4: "4G/5G 설정",
    password: "비밀번호 설정",
    serial: "시리얼 전송",
    update: "업그레이드 및 백업",
    reboot: "재부팅",
    timedReboot: "예약 재부팅",
    factoryReset: "공장 초기화",
    recordFiles: "녹화 파일",
    netTest: "네트워크 테스트",
    recordSet: "녹화 설정",
    alirtcTokenPage: "AliRTC Token"
  },

  // Menu
  menu: {
    status: "상태",
    encoder: "인코더",
    mainStream: "메인 스트림",
    subStream1: "서브 스트림 1",
    subStream2: "서브 스트림 2",
    subStream3: "서브 스트림 3",
    videoSettings: "영상 설정",
    audioSettings: "오디오 설정",
    advancedSettings: "고급 설정",
    osd: "OSD",
    logoUpload: "로고 업로드",
    system: "시스템",
    network: "네트워크",
    record: "녹화",
    gb28181: "GB28181",
    wifi: "WIFI",
    g4: "4G/5G",
    password: "비밀번호",
    serial: "시리얼 전송",
    update: "업그레이드 및 백업",
    reboot: "재부팅",
    timedReboot: "예약 재부팅",
    factoryReset: "공장 초기화"
  },

  // Status page
  status: {
    // Device status
    deviceStatus: "장치 상태",
    runningTime: "가동 시간: ",
    runtimeDayWithTime: "{0}일 {1}",
    deviceTime: "장치 시간: ",
    syncTime: " (장치에 시간 동기화)",
    cpuUsage: "CPU 사용률: ",
    memoryUsage: "메모리 사용률: ",
    codecUsage: "인코딩 자원 사용률: ",
    encPpsUsage: "인코딩 자원 사용률: ",
    memoryWarning: " (부팅 후 1분이 지나도 메모리 사용률이 높으면 일부 HLS 스트림을 비활성화하거나 비트레이트를 낮추세요)",
    cpuWarning: " (CPU 사용률이 85% 이상 유지되면 일부 스트림을 비활성화하거나 서브 스트림 해상도를 낮추세요)",
    networkStatus: "네트워크 상태: ",
    inputVideo: "입력 영상: ",
    inputVideoStatus: "입력 비디오 상태: ",
    vgaAutoAdjust: " (VGA 자동 조정)",
    capturedFrames: "캡처된 영상 프레임: ",
    lostFrames: "손실된 영상 프레임: ",
    audioSampleRate: "입력 오디오 샘플레이트: ",
    inputAudioStatus: "입력 오디오 상태: ",
    capturedAudioFrames: "캡처된 오디오 프레임: ",
    bFrameMode: "고급 압축 모드: ",
    bFrameModeEnabled: "활성화",
    packetsSent: "전송된 패킷: ",
    netTestLink: " (네트워크 테스트 & 시스템 로그)",
    packetsDropped: "드롭된 패킷: ",
    canAccessInternet: "인터넷 접속 가능",
    canAccessInternetIP: "인터넷 IP 접속 가능",
    lanOnly: "LAN 전용",
    localNetwork: "로컬 네트워크",

    // Recording status
    recordStatus: "녹화 상태",
    recordType: "녹화 유형: ",
    diskStatus: "디스크 상태: ",
    diskNotExist: "미감지",
    mountStatus: "마운트 상태: ",
    notMounted: "마운트 안됨",
    mounted: "마운트됨",
    totalSpace: "총 용량: ",
    freeSpace: "여유 공간: ",
    recordingStatus: "녹화 상태: ",
    diskFull: "디스크 가득 참",
    diskSlow: "디스크 속도 부족",
    recordFileList: "녹화 파일 목록",
    notRecording: "녹화 중지",
    recording: "녹화 중",
    recordingNoVideo: " (영상 입력이 없으면 파일이 저장되지 않을 수 있습니다)",
    startRecord: "(녹화 시작)",
    stopRecord: "(녹화 중지)",
    usbTfCard: "USB/TF 카드",

    // DHCP status
    dhcpStatus: "DHCP 상태",
    ip: "IP: ",
    subnetMask: "서브넷 마스크: ",
    gateway: "게이트웨이: ",

    // WIFI status
    wifiStatus: "WIFI 상태",
    wifiDisabled: "WIFI: 비활성화됨",
    wifiState: "WIFI 상태: ",
    wifiSSID: "WIFI SSID: ",
    wifiIP: "WIFI IP: ",
    wifiMAC: "WIFI MAC: ",
    wifiRSSI: "WIFI 신호 (RSSI): ",
    wifiFreq: "WIFI 주파수: ",
    wifiConnected: "연결됨",
    wifiDisconnected: "연결 끊김",
    wifiConnecting: "연결 중 (연결이 너무 오래 걸리면 WIFI 설정을 확인하세요)",

    // 4G/5G status
    g4Status: "4G/5G 상태",
    g4Disabled: "4G/5G: 비활성화됨",
    status: "상태: ",
    imei: "IMEI: ",
    mode: "모드: ",
    signalStrength: "신호 강도: ",
    noSignal: "신호 없음",
    noSigPicOnly: "Only transmit no-signal image:",

    gpsTime: "GPS 시간: ",
    gpsLocation: "GPS 위치: ",
    gpsHeight: "GPS 고도: ",
    onlineTime: "온라인 시간: ",
    receivedBytes: "수신: ",
    sentBytes: "송신: ",
    g4Connected: "연결됨",
    g4Connecting: "연결 중",
    g4Disconnected: "연결 끊김",
    timeHour: "시간",
    timeMinute: "분",
    timeSecond: "초",

    // Streams
    mainStream: "메인 스트림",
    subStream1: "서브 스트림 1",
    subStream2: "서브 스트림 2",
    subStream3: "서브 스트림 3",
    streamDisabled: "비활성화됨 (메인 스트림 프레임레이트가 31-60fps일 때 서브 스트림이 비활성화됩니다)",
    codecType: "코덱: ",
    encodeResolution: "인코딩 해상도: ",
    videoBitrate: "영상 비트레이트: ",
    realTimeBitrate: "실시간 비트레이트: ",
    realTimeFps: "실시간 FPS: ",
    videoEncoded: "인코딩된 영상: ",
    reconnect: " (재연결)",
	    previewWebRTC: "영상 미리보기 (WebRTC)",
	    previewHTML5: "영상 미리보기 (HTML5)",
	    previewLowLatency: "영상 미리보기(저지연)",

    // URL related
    disabled: "비활성화됨",
    connected: "연결됨",
    disconnected: "연결 끊김",
    statusNormal: "정상",
    statusNoData: "데이터 없음",
    bufferPackets: "버퍼 패킷",
    bufferPacketsLabel: "버퍼 패킷: ",
    pushSpeed: "푸시 속도",
    pushSpeedLabel: "푸시 속도: ",
    pushed: "푸시됨",
    pushedLabel: "푸시됨: ",
    sendBytesLabel: "전송 데이터: ",
    memoryUsed: "사용 메모리",
    memoryUsedLabel: "사용 메모리: ",
    cacheFiles: "캐시 파일",
    cacheFilesLabel: "캐시 파일: ",
    multicastUrl: "멀티캐스트 URL: ",
    mjpgUrl: "MJPG 스트림 URL: ",
    jpgUrl: "JPG 스트림 URL: ",
    tsUrl: "TS 스트림 URL: ",
    flvUrl: "FLV 스트림 URL: ",
    hlsTsUrl: "HLS TS 스트림 URL: ",
    hlsMp4Url: "HLS MP4 스트림 URL: ",
    mp4Url: "MP4 스트림 URL: ",
    rtspUrl: "RTSP 스트림 URL: ",
    rtmpUrl: "RTMP 스트림 URL: ",
    srtListenerUrl: "SRT 리스너 URL: ",
    webrtcP2pUrl: "WebRTC P2P 스트림 URL: ",
    rtmpPushUrlAny: "RTMP(S)/RTSP 배포 URL {0}: ",
    rtmpPushUrlAny0: "RTMP(S)/RTSP 배포 URL 0: ",
    rtmpPushUrlAny1: "RTMP(S)/RTSP 배포 URL 1: ",
    rtmpPushUrlAny2: "RTMP(S)/RTSP 배포 URL 2: ",
    rtmpPushUrl: "RTMP(S) 배포 URL {0}: ",
    rtspPushUrl: "RTSP 배포 URL {0}: ",
    srtCallerUrl: "SRT 콜러 URL: ",
    hlsPushUrl: "HLS 배포 URL: ",
    icecastPushUrl: "ICECAST 배포 URL: ",
    shoutcastPushUrl: "Shoutcast 배포 URL: ",
    whipLabel: "WHIP: ",
    viewers: "시청자 수",
    viewersLabel: "시청자 수: ",

    // TRTC status
    trtcRoomId: "TRTC 룸 ID: ",
    inRoom: "룸 내",
    notInRoom: "룸 외",
    initializingServer: "서버 연결 초기화 중",
    serverDisconnected: "서버 연결 끊김",
    connectingServer: "서버에 연결 중",
    serverConnected: "서버 연결됨",
    networkUnknown: "네트워크 상태 알 수 없음",
    networkExcellent: "네트워크 우수",
    networkGood: "네트워크 양호",
    networkNormal: "네트워크 보통",
    networkPoor: "네트워크 불량",
    networkBad: "네트워크 매우 불량",
    networkNotMeet: "네트워크가 TRTC 최소 요구 사항을 충족하지 않습니다",
    errorCode: "오류 코드",
    errorCodeLabel: "오류 코드: ",
    trtcError1: "일반 오류, 로그 파일을 확인하세요",
    trtcError100: "비즈니스 로직 오류: 잘못된 호출",
    trtcError101: "비즈니스 로직 오류: 잘못된 매개변수",
    trtcError102: "현재 읽을 수 없습니다, 다시 시도하세요",
    trtcError103: "네트워크에 연결할 수 없습니다",
    trtcError200: "입장 실패",
    trtcError201: "user_sig 매개변수가 유효하지 않습니다",
    trtcError202: "룸 ID 형식이 유효하지 않습니다",
    trtcError203: "sdk_app_id가 유효하지 않습니다",
    trtcError204: "서비스를 사용할 수 없습니다. 패키지 잔여 분이 0보다 큰지, Tencent Cloud 계정이 연체되지 않았는지 확인하세요",
    trtcError205: "서버에 의해 룸에서 퇴장되었습니다",

    // WHIP status
    whipInitializing: "초기화 중",
    whipConnected: "연결됨",
    whipDisconnected: "연결 끊김",
    whipUnknown: "알 수 없는 상태",
    alirtcLabel: "AliRTC: ",
    alirtcConnecting: "연결 중",
    alirtcConnected: "연결됨",
    alirtcDisconnected: "연결 안 됨",
    alirtcUnknown: "알 수 없는 상태",
    alirtcRoomId: "AliRTC 룸 ID: ",
    alirtcRoomIdLabel: "룸 ID: ",
    alirtcUserIdLabel: "사용자 ID: ",
    alirtcUserNameLabel: "사용자 이름: ",
    alirtcVideoBitrateLabel: "비디오: ",
    alirtcAudioBitrateLabel: "오디오: ",
    alirtcRttLabel: "RTT: ",

    // GB28181
    gb28181: "GB28181: ",
    gb28181Online: "온라인",
    gb28181Offline: "오프라인"
  },

  // Reboot page
  reboot: {
    title: "재부팅",
    description: "이 버튼을 클릭하면 인코더를 재부팅합니다.",
    button: "재부팅",
    success: "재부팅 명령을 전송했습니다!",
    failed: "재부팅에 실패했습니다!",
    confirm: "장치를 재부팅하시겠습니까?"
  },

  // Factory reset page
  reset: {
    title: "공장 초기화",
    description: "이 버튼을 클릭하면 모든 인코더 설정을 공장 기본 상태로 복원합니다.",
    button: "초기화",
    success: "공장 초기화에 성공했습니다! 시스템이 자동으로 재시작됩니다. 잠시 기다려 주세요.",
    failed: "공장 초기화에 실패했습니다!",
    confirm: "공장 설정으로 복원하시겠습니까?"
  },

  // Scheduled reboot page
  timedReboot: {
    title: "예약 재부팅",
    enable: "예약 재부팅",
    enableLabel: "예약 재부팅:",
    timeLabel: "재부팅 시간:",
    enabled: "활성화",
    disabled: "비활성화",
    time: "재부팅 시간",
    weekdays: "재부팅 요일",
    everyday: "매일",
    monday: "월요일",
    tuesday: "화요일",
    wednesday: "수요일",
    thursday: "목요일",
    friday: "금요일",
    saturday: "토요일",
    sunday: "일요일",
    save: "저장",
    saveSuccess: "설정이 저장되었습니다!",
    saveFailed: "설정에 실패했습니다!",
    invalidTime: "시간 값이 유효하지 않습니다!"
  },

  // Network test page
  netTest: {
    title: "네트워크 테스트 & 시스템 로그",
    command: "명령어:",
    run: "실행",
    address: "주소:",
    result: "결과:",
    invalidAddr: "유효한 주소를 입력하세요!"
  },

  // Record files page
  recordFiles: {
    title: "파일 목록",
    fileName: "파일 이름",
    time: "시간",
    fileSize: "파일 크기",
    action: "작업",
    delete: "삭제",
    confirmDelete: "삭제하시겠습니까",
    deleteSuccess: "삭제 명령을 전송했습니다!",
    deleteFailed: "삭제에 실패했습니다!",
    noFiles: "녹화 파일이 없습니다",
    loadError: "로드에 실패했습니다"
  },

  // Password settings page
  password: {
    title: "비밀번호 설정",
    oldPassword: "현재 비밀번호",
    oldPasswordLabel: "현재 비밀번호:",
    newPassword: "새 비밀번호",
    newPasswordLabel: "새 비밀번호:",
    confirmPassword: "비밀번호 확인",
    confirmPasswordLabel: "비밀번호 확인:",
    save: "저장",
    success: "설정이 저장되었습니다!",
    failed: "비밀번호 설정에 실패했습니다. 현재 비밀번호가 올바른지 확인하세요!",
    mismatch: "새 비밀번호가 일치하지 않습니다!",
    empty: "비밀번호는 비워둘 수 없습니다!"
  },

  // Encoding common (only actually used keys)
  encoding: {
    sameAsInput: "입력 해상도와 동일",
    mp3Required: "오디오 인코딩을 MP3로 설정하세요!",
    choosePrimaryColor: "기본 색상 선택",
    toggleTheme: "테마 전환"
  },

  // OSD settings
  osd: {
    title: "OSD 설정",
    mainStream: "메인 스트림 OSD",
    subStream1: "서브 스트림 1 OSD",
    subStream2: "서브 스트림 2 OSD",
    subStream3: "서브 스트림 3 OSD",
    alpha: "투명도",
    alphaLabel: "투명도:",
    alphaRange: "[0-255]",
    alphaError: "투명도는 0~128 사이의 정수여야 합니다!",
    region: "영역",
    regionLabel: "영역:",
    region1: "영역 1",
    region2: "영역 2",
    region3: "영역 3",
    region4: "영역 4",
    type: "유형",
    typeLabel: "유형:",
    typeText: "텍스트",
    typeImage: "이미지",
    typeScroll: "스크롤 텍스트",
    typeTime: "시간",
    timeFormatLabel: "시간 형식:",
    position: "위치",
    positionLabel: "위치:",
    speed: "속도",
    speedLabel: "속도:",
    xLabel: "X:",
    yLabel: "Y:",
    textLabel: "텍스트:",
    fontSize: "글꼴 크기",
    fontSizeLabel: "글꼴 크기:",
    fontSizeRange: "[8-72]",
    backgroundColor: "배경색",
    backgroundLabel: "배경색:",
    bgTransparent: "투명",
    bgWhite: "흰색",
    bgBlack: "검은색",
    fontColor: "글꼴 색상",
    fontColorLabel: "글꼴 색상:",
    pickColor: "색상 선택",
    closeColor: "닫기",
    logoLabel: "로고:",
    success: "설정이 저장되었습니다!",
    failed: "설정에 실패했습니다!",
    xRangeError: "{0}의 X 값은 0~{1} 사이의 정수여야 합니다!",
    yRangeError: "{0}의 Y 값은 0~{1} 사이의 정수여야 합니다!",
    textEmpty: "{0}의 텍스트는 비워둘 수 없습니다!",
    fontSizeError: "{0}의 글꼴 크기는 8~72 사이의 정수여야 합니다!",
    speedRangeError: "{0}의 속도 값은 0~30 사이의 정수여야 합니다!",
    positionRangeError: "{0}의 위치 값은 0~{1} 사이의 정수여야 합니다!",
    selectLogo: "{0}의 로고를 선택하세요!",
    webrtcPreview: "비디오 미리보기"
  },

  // LOGO upload
  logo: {
    title: "로고 업로드",
    logoLabel: "로고:",
    upload: "업로드",
    hint: "500KB 미만의 PNG 이미지 또는 24비트 BMP 이미지를 업로드하세요 (0xF1F1F1은 투명),",
    hint2: "파일 이름: logo1.bmp / logo2.bmp / logo3.bmp / logo4.bmp,",
    hint3: "또는 logo1.png / logo2.png / logo3.png / logo4.png",
    noFileSelected: "업로드할 파일을 선택하세요!",
    invalidFile: "요구 사항에 맞는 이미지를 업로드하세요!",
    uploadSuccess: "업로드에 성공했습니다!",
    uploadFailed: "업로드에 실패했습니다!",
    imageSizeExceeded: "이미지 파일 크기가 제한을 초과했습니다!",
    imageResolutionExceeded: "이미지 파일 해상도가 제한을 초과했습니다!",
    storageInsufficient: "업그레이드 파일이 너무 큽니다. 저장 공간이 부족합니다!"
  },

  // WIFI settings
  wifi: {
    title: "WIFI 설정",
    mode: "모드",
    ap: "액세스 포인트",
    sta: "클라이언트 모드",
    ssid: "SSID",
    password: "비밀번호",
    security: "보안",
    channel: "채널",
    scan: "스캔",
    connect: "연결",
    disconnect: "연결 끊기",
    status: "상태",
    connected: "연결됨",
    disconnected: "연결 끊김",
    signalStrength: "신호 강도",
    basicSettings: "기본 설정",
    wifiModule: "Wifi 모듈:",
    wifiMode: "Wifi 모드:",
    staMode: "STA 모드",
    apMode: "AP 모드",
    mainConfig: "WIFI 기본 설정",
    backupConfig1: "WIFI 백업 설정 1",
    backupConfig2: "WIFI 백업 설정 2",
    apModeSettings: "AP 모드",
    wifiList: "Wifi 목록:",
    wifiEssid: "Wifi ESSID:",
    wifiPassword: "Wifi 비밀번호:",
    wifiDhcp: "Wifi DHCP:",
    wifiIp: "Wifi IP:",
    wifiNetmask: "Wifi 넷마스크:",
    wifiGateway: "Wifi 게이트웨이:",
    backupEnable1: "백업 설정 1:",
    backupEnable2: "백업 설정 2:",
    wifiBand: "Wifi 대역:",
    wifiChannel: "Wifi 채널:",
    refresh: "새로고침",
    success: "설정이 저장되었습니다!",
    failed: "설정 저장에 실패했습니다!",
    mainConfigEmpty: "WIFI 기본 설정: {0}은(는) 비워둘 수 없습니다!",
    mainConfigInvalid: "WIFI 기본 설정: {0} 형식이 유효하지 않습니다!",
    backupConfigEmpty: "WIFI {0}: {1}은(는) 비워둘 수 없습니다!",
    backupConfigInvalid: "WIFI {0}: {1} 형식이 유효하지 않습니다!",
    ipAddr: "IP 주소",
    netmask: "넷마스크",
    gateway: "게이트웨이",
    essidEmpty: "WiFi 이름은 비워둘 수 없습니다!",
    passwordTooShort: "WiFi 비밀번호는 최소 8자 이상이어야 합니다!"
  },

  // 4G/5G settings
  cellular: {
    title: "4G/5G 설정",
    enable: "활성화",
    apn: "APN",
    username: "사용자 이름",
    password: "비밀번호",
    status: "상태",
    signalStrength: "신호 강도",
    operator: "통신사",
    connected: "연결됨",
    disconnected: "연결 끊김",
    connecting: "연결 중...",
    module: "4G/5G 모듈:",
    apnLabel: "APN:",
    usernameLabel: "사용자 이름:",
    passwordLabel: "비밀번호:",
    authType: "인증 유형:",
    dnsOrder: "4G/5G DNS 우선순위:",
    authNone: "없음",
    authPap: "PAP",
    authChap: "CHAP",
    authChapPap: "CHAP+PAP",
    success: "설정이 저장되었습니다!",
    failed: "설정 저장에 실패했습니다!"
  },

  // Upgrade and backup
  updateBackup: {
    title: "시스템 업그레이드",
    uploadTitle: "펌웨어 및 설정 업로드",
    backupTitle: "펌웨어 및 설정 백업",
    systemVersion: "시스템 버전",
    systemVersionLabel: "시스템 버전: ",
    hardware: "하드웨어",
    hardwareLabel: "하드웨어: ",
    selectFile: "파일 선택",
    selectFileLabel: "파일 선택:",
    uploadHint: "업로드 파일 이름: up.rar 또는 box.ini",
    uploadWarning: "동시에 업로드하지 마세요. 업로드 중에는 전원을 끄지 마세요.",
    upload: "업로드",
    backupFirmware: "펌웨어 백업",
    backupConfig: "설정 백업",
    noFileSelected: "업로드할 파일을 선택하세요!",
    uploadSuccess: "업로드에 성공했습니다. 시스템을 재시작하세요!",
    uploadFailed: "업로드에 실패했습니다!",
    kernelUpdating: "커널 업데이트에 몇 분이 걸립니다. 시스템을 재시작하지 마세요. 완료되면 장치가 자동으로 재시작됩니다.",
    kernelUpdatingBin: "커널 업데이트에 몇 분이 걸립니다. 시스템을 재시작하지 마세요. 완료되면 장치가 자동으로 재시작됩니다!",
    imageSizeExceeded: "이미지 파일 크기가 제한을 초과했습니다!",
    imageResolutionExceeded: "이미지 파일 해상도가 제한을 초과했습니다!",
    storageInsufficient: "업그레이드 파일이 너무 큽니다. 저장 공간이 부족합니다!"
  },

  // Serial transport settings
  serial: {
    title: "시리얼 전송",
    frpTitle: "FRP 클라이언트 설정",
    serialTitle: "시리얼 포트 패스스루",
    enable: "활성화",
    disable: "비활성화",
    enableLabel: "활성화:",
    serverAddr: "서버 주소",
    serverAddrLabel: "서버 주소:",
    serverPort: "서버 포트",
    serverPortLabel: "서버 포트:",
    serverToken: "서버 토큰",
    serverTokenLabel: "서버 토큰:",
    channel: "채널",
    channel1: "채널 1",
    channel2: "채널 2",
    channel3: "채널 3",
    channel4: "채널 4",
    protocolLabel: "프로토콜:",
    localPort: "로컬 포트",
    localPortLabel: "로컬 포트:",
    remotePort: "원격 포트",
    remotePortLabel: "원격 포트:",
    serialMode: "시리얼 모드",
    serialModeLabel: "모드:",
    server: "서버",
    client: "클라이언트",
    baudRate: "보드레이트",
    baudRateLabel: "보드레이트:",
    listenPort: "리슨 포트",
    listenPortLabel: "리슨 포트:",
    save: "저장",
    success: "설정이 저장되었습니다. 장치를 재시작하세요!",
    failed: "설정에 실패했습니다!",
    emptyError: "설정은 비워둘 수 없습니다!",
    portRangeError: "TCP 리슨 포트는 1~65500 사이의 정수여야 합니다!",
    frpAddrEmpty: "FRP 서버 주소는 비워둘 수 없습니다!",
    frpPortError: "FRP 서버 포트는 1~65500 사이의 정수여야 합니다!"
  },

  // Advanced Settings
  advanced: {
    title: "고급 설정",
    // Section titles
    videoInput: "영상 입력",
    avTransmission: "영상/오디오 전송",
    recordSettings: "녹화 설정",
    hlsSettings: "HLS 설정",
    networkTransmission: "스트림 전송",
    serviceSettings: "서비스 설정",
    logSettings: "로그 설정",
    encoderParams: "인코더 매개변수",
    imageEnhancement: "이미지 보정",
    autoRestart: "자동 재시작",
    // Video Input
    edidSelect: "EDID 선택:",
    colorGamut: "색역:",
    colorRange: "색 범위:",
    bFrameMode: "Advanced compression mode:",

    interlaceMode: "인터레이스 모드:",
    noSignal: "신호 없음:",
    noSigPicOnly: "Only transmit no-signal image:",

    vgaAutoAdjust: "시작 시 VGA 자동 조정:",
    interlaceWeaving: "위빙 (필드 병합)",
    interlaceBottom: "하단 필드만",
    interlaceTop: "상단 필드만",
    interlaceBobbing: "보빙 (필드에서 프레임으로)",
    noSignalHide: "숨기기",
    noSignalImage: "Show no-signal image",
    noSignalColor: "단색 표시",
    // A/V Transmission
    videoOnly: "영상만:",
    audioOnly: "오디오만:",
    avSync: "영상/오디오 동기화:",
    audioDelay: "오디오 지연 (ms):",
    syncAuto: "자동",
    syncResample: "리샘플링",
    audioDelayHint: "음수 값은 오디오를 앞으로, 양수 값은 뒤로 이동합니다. 영상/오디오 동기화 조정에만 사용하세요.",
    // Recording Settings
    recordType: "녹화 유형:",
    cycleRecord: "순환 녹화:",
    recordSplitTime: "녹화 분할 시간 (초):",
    // HLS Settings
    hlsSplitTime: "HLS 세그먼트 시간 (초):",
    hlsBufferNum: "HLS 세그먼트 수:",
    hlsIndexUri: "HLS 글로벌 인덱스 URI:",
    // Network Transmission
    tsMuxer: "TS 멀티플렉서:",
    sliceNumber: "SLICE Number:",

    netDropThreshold: "패킷 드롭 임계값:",
    tsOnce: "전송당 TS 패킷 수:",
    rtspPackType: "RTSP 캡슐화:",
    multicastType: "멀티캐스트 유형:",
    enableSap: "SAP 활성화:",
    mtuSize: "MTU 크기:",
    ethSpeed: "Ethernet speed:",

    natAddr: "NAT mapped address:",

    udpTtl: "UDP TTL:",
    udpSockBuf: "UDP SOCKET_BUF_SIZE:",
    rtpH264PacketMode: "RTP H264 패킷화:",
    packetizeByAccessUnit: "packetize_by_access_unit",
    packetizeByNalu: "packetize_by_nalu",
    vlcCompat: "VLC 호환",
    ffmpegCompat: "FFMPEG 호환",
    esStream: "ES 스트림",
    tsStream: "TS 스트림",
    // Service Settings
    tsRtspAuth: "TS/RTSP 인증 필수:",
    httpNoAuth: "웹 인증 없이 액세스:",
    netCheck: "네트워크 상태 확인:",
    telnetService: "Telnet 서비스:",
    sambaService: "Samba 서비스:",
    onvifService: "ONVIF 서비스:",
    onvifLocation: "ONVIF Location:",
    onvifMode: "ONVIF 모드:",
    onvifModeLegacy: "Legacy XML (HTTP/ONVIF 공유 포트)",
    onvifModeProfileST: "Profile S/T (전용 ONVIF 포트)",
    onvifModeProfileSCompat: "Profile S Hikvision 호환 (전용 ONVIF 포트)",
    onvifPassword: "ONVIF password required:",

    rtspDefaultStream: "RTSP 기본 스트림:",
    vmixCompat: "VMix 호환:",
    readOnlyConfig: "Lock all settings:",

    telnetLan: "LAN 전용",
    // Log Settings
    localLog: "로컬 로그 서비스:",
    trtcLogLevel: "TRTC SDK 로그 수준:",
    alirtcLogLevel: "AliRTC SDK 로그 수준:",
    sdkLogDebug: "디버그",
    sdkLogInfo: "정보",
    sdkLogWarning: "경고",
    sdkLogError: "오류",
    sdkLogFatal: "치명적",
    sdkLogNone: "없음",
    lokiAddr: "Loki 서버 주소:",
    lokiPort: "Loki 서버 포트:",
    // Encoder Parameters
    sliceSplit: "SLICE 분할:",
    sliceBytes: "SLICE 바이트:",
    minQp: "MIN_QP:",
    maxQp: "MAX_QP:",
    deblocking: "Deblocking filter:",
    deblockingAlpha: "Deblocking alpha:",
    deblockingBeta: "Deblocking beta:",



    debreath: "디브리딩:",
    sar: "PAR:",
    cbrOnlyHint: "레이트 컨트롤 모드가 CBR로 설정된 경우에만 유효",
    // Image Enhancement
    contrastEnhance: "대비 보정:",
    sharpnessEnhance: "선명도 보정:",
    lumaSfStrength: "휘도 공간 노이즈 제거:",
    lumaTfStrength: "휘도 시간 노이즈 제거:",
    chromaSfStrength: "색차 공간 노이즈 제거:",
    chromaTfStrength: "색차 시간 노이즈 제거:",
    // Auto Restart
    kickAllOnChange: "입력 변경 시 사용자 연결 끊기:",
    noVideoReboot: "영상 없음 시 자동 재부팅:",
    noAudioReboot: "오디오 없음 시 자동 재부팅:",
    picStillRestart: "Restart on frozen video:",

    // Button
    save: "저장",
    // Messages
    success: "설정이 저장되었습니다. 장치를 재시작하세요!",
    failed: "설정에 실패했습니다!",
    emptyError: "설정은 비워둘 수 없습니다!",
    netDropError: "패킷 드롭 임계값은 50~50000 사이의 정수여야 합니다!",
    tsOnceError: "TS packets per send must be an integer between 3-128!",
    sliceError: "SLICE Number must be an integer between 1-255!",
    minQpError: "MIN_QP는 1~35 사이의 정수여야 합니다!",
    maxQpError: "MAX_QP는 MIN_QP보다 크고 최대 50이어야 합니다!",
    udpTtlError: "UDP TTL은 1~254 사이의 정수여야 합니다!",
    contrastError: "대비 보정은 0~63 사이의 정수여야 합니다!",
    sharpnessError: "선명도 보정은 0~16 사이의 정수여야 합니다!",
    lumaSfError: "휘도 공간 노이즈 제거는 0~255 사이의 정수여야 합니다!",
    lumaTfError: "휘도 시간 노이즈 제거는 0~63 사이의 정수여야 합니다!",
    chromaSfError: "색차 공간 노이즈 제거는 0~255 사이의 정수여야 합니다!",
    chromaTfError: "색차 시간 노이즈 제거는 0~32 사이의 정수여야 합니다!",
    hlsSplitError: "HLS 세그먼트 시간은 3~20 사이의 정수여야 합니다!",
    hlsBufferError: "HLS 세그먼트 수는 3~20 사이의 정수여야 합니다!",
    hlsUriError: "HLS 글로벌 인덱스 URI 형식이 유효하지 않습니다!",
    udpSockBufError: "UDP SOCKET_BUF_SIZE는 0~20971520 사이의 정수여야 합니다!",
    mtuError: "MTU 크기는 500~1500 사이의 정수여야 합니다!",
    deblockingAlphaError: "Deblocking alpha must be an integer between -6 and 6!",
    deblockingBetaError: "Deblocking beta must be an integer between -6 and 6!",


    audioCacheError: "오디오 지연은 -2000~2000 사이의 정수여야 합니다!",
    recordSplitError: "녹화 분할 시간은 60~7200 사이의 정수여야 합니다!",
    lokiPortError: "Loki 서버 포트는 1~65500 사이여야 합니다"
  },

  // Audio Encoding Settings
  audioEnc: {
    title: "오디오 설정",
    // Tabs
    tabAudio: "오디오 설정",
    tabOnvif: "ONVIF 오디오",
    // Tips
    tipAudio: "디지털 볼륨 게인을 너무 높게 설정하지 마세요. 왜곡이나 노이즈가 발생할 수 있습니다.<br>대부분의 경우 게인을 0으로 설정하세요.<br>전체 볼륨은 프론트엔드 컨트롤로 조정하세요.",
    tipOnvif: "NVR에 연결하려면 RTSP G711 인코딩을 '활성화 및 8K로 리샘플링'으로 설정하세요",
    // Audio Settings
    audioInput: "오디오 입력:",
    sampleRate: "샘플레이트:",
    codec: "코덱:",
    channel: "채널:",
    bitrate: "비트레이트:",
    digitalGain: "디지털 볼륨 게인:",
    analogGain: "아날로그 볼륨 게인:",
    denoise: "노이즈 제거:",
    denoiseStrength: "노이즈 제거 강도 (dB):",
    pteG711: "PTE 스트림 G711:",
    // Audio Input Options
    inputDigital: "디지털",
    inputAnalog: "아날로그",
    inputMixed: "혼합",
    // Sample Rate Options
    sampleSameAsInput: "입력과 동일",
    // ONVIF Audio
    rtspG711: "RTSP G711 인코딩:",
    rtspG711Resample: "활성화 및 8K로 리샘플링",
    g711Codec: "G711 코덱:",
    // Buttons and Messages
    save: "저장",
    success: "설정이 저장되었습니다!",
    failed: "설정에 실패했습니다!",
    emptyError: "설정은 비워둘 수 없습니다!",
    bitrateError: "비트레이트는 {0}~{1} 사이의 정수여야 합니다!",
    gainError: "디지털 볼륨 게인은 -50~50 사이의 정수여야 합니다!",
    denoiseError: "노이즈 제거 강도는 1~100 사이의 정수여야 합니다!",
    analogVolEmpty: "아날로그 볼륨 게인은 비워둘 수 없습니다!",
    analogVolError: "아날로그 볼륨 게인은 {0}~{1} 사이의 정수여야 합니다!"
  },

  // Recording Settings Page
  recordSet: {
    title: "녹화 설정",
    // Card Titles
    statusTitle: "녹화 상태",
    settingsTitle: "녹화 설정",
    // Status
    recordType: "녹화 유형:",
    diskStatus: "디스크 상태:",
    currentAddr: "현재 주소:",
    mountDevice: "마운트 장치:",
    mountStatus: "마운트 상태:",
    totalSpace: "총 용량:",
    freeSpace: "여유 공간:",
    recordStatus: "녹화 상태:",
    recordFiles: "녹화 파일:",
    fileList: "파일 목록",
    // Disk Status
    diskNotExist: "미감지",
    diskFull: "디스크 가득 참",
    diskSlow: "디스크 속도 부족",
    mounted: "마운트됨",
    unmounted: "마운트 안됨",
    notRecording: "녹화 중지",
    recording: "녹화 중",
    noVideoWarning: " (영상 입력이 없으면 파일이 저장되지 않을 수 있습니다)",
    // Action Links
    startRecord: "(녹화 시작)",
    stopRecord: "(녹화 중지)",
    mountDisk: "(디스크 마운트)",
    unmountDisk: "(디스크 마운트 해제)",
    deleteAll: "(모든 녹화 삭제)",
    // Settings
    storageType: "저장 유형:",
    partition: "파티션:",
    partitionInfo: "파티션 정보:",
    diskInfo: "디스크 정보:",
    formatDisk: "(디스크 포맷)",
    exampleAddr: "예시 주소:",
    storageAddr: "저장 주소:",
    username: "사용자 이름:",
    password: "비밀번호:",
    // Storage Type Options
    storageDisabled: "비활성화됨",
    storageUsb: "USB/TF 카드",
    storageNfs: "NFS",
    storageSamba: "SAMBA/CIFS",
    // Format Dialog
    formatTitle: "디스크 정보",
    formatDevice: "장치:",
    formatType: "유형:",
    formatModel: "모델:",
    formatRemovable: "이동식:",
    formatPartTable: "파티션 테이블:",
    formatCapacity: "용량:",
    formatPartitions: "파티션 정보",
    formatPartition: "파티션",
    formatAvailable: "(사용 가능)",
    formatTotal: "(전체)",
    formatConfirm: "디스크 포맷을 계속하시겠습니까?",
    formatDanger: "경고: 포맷하면 파티션이 재생성되고 모든 데이터가 손실됩니다. 계속하시겠습니까?",
    formatContinue: "계속",
    formatCancel: "취소",
    formatConfirmBtn: "확인",
    formatting: "포맷 중...",
    // Buttons and Messages
    save: "저장",
    yes: "예",
    no: "아니오",
    success: "설정이 저장되었습니다!",
    failed: "설정에 실패했습니다!",
    formatSuccess: "포맷에 성공했습니다!",
    formatFailed: "포맷에 실패했습니다!",
    deleteSuccess: "삭제 명령을 전송했습니다!",
    deleteFailed: "삭제에 실패했습니다!",
    confirmDeleteAll: "모든 녹화 파일을 삭제하시겠습니까?",
    recordingWarning: "현재 녹화 중입니다. 마운트 해제 전에 녹화를 중지하세요.",
    diskMountedWarning: "디스크가 마운트되어 있습니다. 포맷 전에 마운트를 해제하세요.",
    diskMountedSettingWarning: "디스크가 마운트되어 있습니다. 설정 변경 전에 마운트를 해제하세요.",
    partitionNotExist: "파티션이 존재하지 않습니다",
    partitionRemoved: " (제거됨)",
    // Address Validation
    addrEmpty: "저장 주소는 비워둘 수 없습니다!",
    addrNfsFormat: "주소 형식이 유효하지 않습니다. ':' 구분자가 필요합니다",
    addrIpError: "IP 주소 형식이 유효하지 않습니다",
    addrPathSlash: "경로는 '/'로 시작해야 합니다",
    addrPathInvalid: "경로에 유효하지 않은 문자가 포함되어 있습니다",
    addrSambaStart: "주소는 '\\\\'로 시작해야 합니다",
    addrSambaFormat: "주소가 유효하지 않습니다. IP와 경로는 '\\'로 구분해야 합니다",
    addrPathEmpty: "경로는 비워둘 수 없습니다",
    addrPathChars: "경로에 유효하지 않은 문자가 포함되어 있습니다. 영문자, 숫자, 밑줄, 하이픈만 허용됩니다",
    // Disk size info "{available} / {total}"
    diskSizeInfo: "{0} (사용 가능) / {1} (전체)"
  },
  // GB28181 Settings
  gb28181: {
    title: "GB28181 설정",
    basicSettings: "기본 설정",
    heartbeatSettings: "하트비트 설정",
    sipServerSettings: "SIP 서버 설정",
    authSettings: "인증 설정",
    enable: "활성화:",
    disabled: "비활성화됨",
    enabled: "활성화됨",
    localSipPort: "로컬 SIP 포트:",
    videoChannelId: "영상 채널 ID:",
    streamSelect: "스트림 선택:",
    mainStream: "메인 스트림",
    subStream1: "서브 스트림 1",
    subStream2: "서브 스트림 2",
    subStream3: "서브 스트림 3",
    regExpiry: "등록 만료:",
    heartbeatCycle: "하트비트 주기:",
    maxHeartbeatTimeout: "최대 하트비트 타임아웃:",
    sipServerId: "SIP 서버 ID:",
    sipServerDomain: "SIP 서버 도메인:",
    sipServerAddr: "SIP 서버 주소:",
    sipServerPort: "SIP 서버 포트:",
    sipUserId: "SIP 사용자 ID:",
    sipPassword: "SIP 비밀번호:",
    emptyError: "설정은 비워둘 수 없습니다!",
    localPortError: "로컬 SIP 포트는 1~65500 사이의 정수여야 합니다!",
    serverPortError: "SIP 서버 포트는 1~65500 사이의 정수여야 합니다!",
    regExpiryError: "등록 만료는 100~100000 사이의 정수여야 합니다!",
    heartbeatError: "하트비트 주기는 5~3600 사이의 정수여야 합니다!",
    maxTimeoutError: "최대 하트비트 타임아웃은 3~255 사이의 정수여야 합니다!",
    success: "설정이 저장되었습니다!",
    failed: "설정에 실패했습니다!"
  },
  // Video Source Settings
  videoSource: {
    title: "영상 소스 설정",
    videoInput: "영상 입력 설정",
    brightAdjust: "입력 밝기 조정",
    videoOutput: "영상 출력 설정",
    inputFormat: "영상 입력 형식:",
    yuv422: "YUV422",
    yuv420: "YUV420 (회전 지원)",
    rotation: "회전 각도:",
    flipMirror: "뒤집기/미러:",
    flipDisable: "비활성화됨",
    mirror: "미러",
    flip: "뒤집기",
    flipAndMirror: "미러 및 뒤집기",
    cropEnable: "영상 자르기:",
    cropLeft: "자르기 시작점 (왼쪽):",
    cropTop: "자르기 시작점 (위):",
    cropWidth: "자르기 너비:",
    cropHeight: "자르기 높이:",
    monochrome: "흑백:",
    colorMode: "입력 색상 모드:",
    unknown: "알 수 없음",
    brightEnable: "밝기 조정:",
    gain: "게인:",
    gainHint: "[10-1000], 기본값 100",
    offset: "오프셋:",
    offsetHint: "[0-100], 기본값 0",
    note: "참고:",
    brightNote1: "1. 밝기 = (원래 밝기 × 게인 / 100) + 오프셋",
    brightNote2: "2. 밝기 조정은 RGB 입력 색상 모드에서만 작동합니다",
    outputRes: "영상 출력 해상도:",
    auto: "자동",
    cscEnable: "CSC 조정:",
    luminance: "휘도:",
    contrast: "대비:",
    hue: "색조:",
    saturation: "채도:",
    cscHint: "[0-100], 기본값 50",
    rotateHint: "180°/270° 회전은 0°/90° 회전과 플립/미러 조합으로 얻을 수 있습니다.",
    emptyError: "설정은 비워둘 수 없습니다!",
    gainError: "게인은 10~1000 사이의 정수여야 합니다!",
    offsetError: "오프셋은 0~100 사이의 정수여야 합니다!",
    leftError: "왼쪽 값은 0~{0} 사이의 정수여야 합니다!",
    topError: "위쪽 값은 0~{0} 사이의 정수여야 합니다!",
    widthError: "너비 값은 400~{0} 사이의 정수여야 합니다!",
    heightError: "높이 값은 400~{0} 사이의 정수여야 합니다!",
    luminanceError: "휘도는 0~100 사이의 정수여야 합니다!",
    contrastError: "대비는 0~100 사이의 정수여야 합니다!",
    hueError: "색조는 0~100 사이의 정수여야 합니다!",
    saturationError: "채도는 0~100 사이의 정수여야 합니다!",
    success: "설정이 저장되었습니다!",
    failed: "설정에 실패했습니다!"
  },
  // Network Settings
  network: {
    title: "네트워크 설정",
    ipv4Title: "IPv4 설정",
    ipv6Status: "IPv6 상태",
    ipv6Title: "IPv6 설정",
    ipv6TypeGlobal: "글로벌 IP",
    ipv6TypeLinkLocal: "링크-로컬 IP",
    ipv6TypeUniqueLocal: "로컬 IP",
    ipv6TypeMulticast: "멀티캐스트 IP",
    ipv6TypeGeneric: "IP",
    ipv6StatusGateway: "게이트웨이",
    dnsTitle: "DNS 설정",
    ntpTitle: "NTP 설정",
    portTitle: "포트 설정",
    httpsTitle: "HTTPS 설정",
    hostnameTitle: "호스트명 설정",
    dhcp: "DHCP:",
    dhcpHint: "DHCP를 활성화하면 ONVIF 호환 검색 도구로 장치를 찾을 수 있습니다.",
    ipAddr: "IP 주소:",
    netmask: "서브넷 마스크:",
    gateway: "유선 게이트웨이:",
    macAddr: "MAC 주소:",
    defaultGateway: "기본 게이트웨이:",
    lanFirst: "유선 우선",
    wifiFirst: "WIFI 우선",
    g4First: "4G/5G 우선",
    ipv6Mode: "모드:",
    ipv6Disable: "비활성화됨",
    ipv6Auto: "자동 구성",
    ipv6Manual: "수동 구성",
    ipv6Addr: "IPv6 주소:",
    ipv6Prefix: "IPv6 프리픽스 길이:",
    ipv6Gateway: "IPv6 기본 게이트웨이:",
    dns1: "DNS1:",
    dns2: "DNS2:",
    ntpSync: "NTP 동기화:",
    ntpServer: "서버:",
    timezone: "시간대:",
    httpPort1: "HTTP 포트 1:",
    httpPort2: "HTTP 포트 2:",
    rtspPort1: "RTSP 포트 1:",
    rtspPort2: "RTSP 포트 2:",
    onvifPort: "ONVIF 포트:",
    httpsService: "HTTPS 서비스:",
    httpsPort1: "HTTPS 포트 1:",
    httpsPort2: "HTTPS 포트 2:",
    httpsPrivatePass: "HTTPS 개인키 비밀번호:",
    socks5Title: "SOCKS5 Proxy",
    socks5Enable: "SOCKS5 Proxy:",
    socks5Host: "Proxy Host:",
    socks5Port: "Proxy Port:",
    socks5User: "Username:",
    socks5Pass: "Password:",
    socks5AuthHint: "(Optional authentication, username and password must both be set)",
    privatePassHint: "(비밀번호가 없으면 비워두세요)",
    uploadCert: "인증서 업로드:",
    uploadCertHint: "(파일 이름은 private.key 또는 public.crt여야 합니다. 동시에 업로드하거나 업로드 중 전원을 끄지 마세요)",
    uploadBtn: "인증서 업로드",
    deleteCert: "인증서 삭제",
    hostname: "호스트명:",
    mdnsService: "mDNS 서비스:",
    mdnsAddr: "mDNS 접근 주소:",
    portRange: "[1-65500]",
    prefixRange: "[0-128]",
    emptyError: "설정은 비워둘 수 없습니다!",
    ipError: "IP 주소 형식이 유효하지 않습니다!",
    netmaskError: "서브넷 마스크 형식이 유효하지 않습니다!",
    gatewayError: "게이트웨이 형식이 유효하지 않습니다!",
    dns1Error: "기본 DNS 형식이 유효하지 않습니다!",
    dns2Error: "보조 DNS 형식이 유효하지 않습니다!",
    macError: "MAC 주소 형식이 유효하지 않습니다!",
    httpPort1Error: "HTTP 포트 1은 1~65500 사이의 정수여야 합니다!",
    httpPort2Error: "HTTP 포트 2는 1~65500 사이의 정수여야 합니다!",
    rtspPort1Error: "RTSP 포트 1은 1~65500 사이의 정수여야 합니다!",
    rtspPort2Error: "RTSP 포트 2는 1~65500 사이의 정수여야 합니다!",
    httpsPort1Error: "HTTPS 포트 1은 1~65500 사이의 정수여야 합니다!",
    httpsPort2Error: "HTTPS 포트 2는 1~65500 사이의 정수여야 합니다!",
    onvifPortError: "ONVIF 포트은 1~65500 사이의 정수여야 합니다!",
    httpBothDisableError: "HTTP 포트 1과 포트 2를 모두 비활성화할 수 없습니다!",
    httpsBothDisableError: "HTTPS가 활성화된 경우 포트 1과 포트 2를 모두 비활성화할 수 없습니다!",
    socks5HostError: "Invalid SOCKS5 proxy host!",
    socks5PortError: "SOCKS5 proxy port must be an integer between 1-65535!",
    socks5AuthPairError: "SOCKS5 username and password must both be set or both be empty!",
    socks5AuthLengthError: "SOCKS5 username and password must not exceed 255 characters!",
    ntpEmptyError: "NTP 서버는 비워둘 수 없습니다!",
    ntpFormatError: "NTP 서버 주소가 유효하지 않습니다!",
    hostnameEmptyError: "호스트명은 비워둘 수 없습니다!",
    hostnameFormatError: "호스트명이 유효하지 않습니다!\n\n1. 호스트명은 63자를 초과할 수 없습니다!\n2. 영문자(a-z), 숫자(0-9), 하이픈(-), 밑줄(_)만 허용됩니다!\n3. '-'와 '_'는 연속, 단독 또는 시작/끝에 사용할 수 없습니다!",
    deleteCertConfirm: "업로드된 HTTPS 인증서를 삭제하시겠습니까?",
    selectFile: "업로드할 파일을 선택하세요!",
    uploadSuccess: "업로드에 성공했습니다!",
    uploadFailed: "업로드에 실패했습니다!",
    fileSizeError: "이미지 파일 크기가 제한을 초과합니다!",
    fileResError: "이미지 해상도가 제한을 초과합니다!",
    spaceError: "업그레이드 파일이 너무 큽니다. 저장 공간이 부족합니다!",
    deleteSuccess: "삭제에 성공했습니다!",
    deleteFailed: "삭제에 실패했습니다!",
    successReboot: "설정이 저장되었습니다. 장치를 재부팅하세요!",
    failed: "설정에 실패했습니다!"
  },

  // Output Settings Page (Stream Settings)
  output: {
    // Tab names
    tabs: {
      encode: "인코딩",
      ts: "TS/멀티캐스트",
      mjpeg: "MJPEG",
      rtsp: "RTSP",
      rtmp: "RTMP",
      srt: "SRT",
      webrtc: "WebRTC",
      trtc: "TRTC",
      alirtc: "AliRTC",
      hls: "HLS",
      other: "MP4/FLV/기타"
    },

    // Encoding settings
    encode: {
      codecType: "코덱 유형:",
      frameRate: "프레임레이트:",
      sameAsInput: "입력 프레임레이트와 동일",
      auto: "자동",
      customFrameRate: "사용자 정의 프레임레이트",
      customFrameRateLabel: "사용자 정의 프레임레이트:",
      gopInterval: "GOP 간격 (프레임):",
      bitrate: "비트레이트 (kbit):",
      qualityRange: "화질 범위:",
      qualityStrict: "엄격 (높음)",
      qualityTight: "약간 엄격 (약간 높음~높음)",
      qualityNormal: "보통 (중간~높음)",
      qualityLoose: "느슨 (약간 낮음~높음)",
      qualityWide: "넓음 (낮음~높음)",
      mjpegQuality: "MJPEG 품질:",
      outputResolution: "출력 해상도:",
      h264Profile: "H.264 프로파일:",
      bitrateControl: "비트레이트 제어:",
      cbrStableRange: "CBR Stability Range:",
      cbrStableMin: "min",
      cbrStableMax: "max",
      bFramesMode: "B-Frame Mode:",
      bFramesDisable: "Disabled",
      bFramesIbp: "IBP",
      bFramesIbbp: "IBBP",
      // Tips
      tipCodec: "H.265는 H.264보다 더 나은 화질을 제공합니다. 디코더가 지원하면 H.265를 사용하세요.",
      tipVbr: "VBR 모드에서 비트레이트는 \"화질 범위\"로 조절됩니다. 화질 범위는 QP 값을 제한합니다.<br>\"약간 높음~높음\" 또는 \"높음\"을 선택하면 실제 비트레이트가 매우 높아져 설정된 비트레이트는 의미가 없습니다.<br>\"약간 낮음~높음\"일 때만 비트레이트가 참고 가치가 있습니다.",
      tipCbr: "\"강제 CBR\"은 안정적인 TS 비트레이트를 보장하기 위해 CATV 시스템에 사용됩니다. 1080P에서 \"강제 CBR\"을 사용할 때 비트레이트는 5000kbit/s 이상, 8000kbit/s 권장입니다.",
      tipGop: "입력 영상 프레임레이트가 n일 때 일반적인 값은 60, 50, 30, 25입니다.<br>GOP 간격은 일반적으로 n × 2로 설정하며 일반적인 값은 120, 100, 60, 50입니다.<br>프레임레이트가 자동으로 설정된 경우 n > 30이면 인코딩 프레임레이트는 n / 2이고, 그렇지 않으면 n과 같습니다."
    },

    // TS/Multicast settings
    ts: {
      tsUri: "TS 스트림 URL:",
      multicastIp: "멀티캐스트 IP:",
      multicastPort: "멀티캐스트 포트:",
      sapName: "SAP 이름:",
      tsVideoPid: "TS 영상 PID:",
      tsAudioPid: "TS 오디오 PID:",
      tsTransportStreamId: "TS 트랜스포트 스트림 ID:",
      tsOriginalNetworkId: "TS 원본 네트워크 ID:",
      tsPmtStartPid: "TS PMT 시작 PID:",
      tsStartPid: "TS 시작 PID:",
      tsTablesVersion: "TS 테이블 버전:",
      tsServiceId: "TS 서비스 ID:",
      tsServiceName: "TS 서비스 이름:",
      tsProviderName: "TS 제공자 이름:",
      tsPcrPeriod: "TS PCR 주기 (ms):",
      conformSystemB: "System B (DVB) 준수:",
      tsNullPacket: "TS 널 패킷:",
      noInsert: "삽입 안함",
      insert12: "삽입 (1.2배)",
      insert13: "삽입 (1.3배)",
      insert15: "삽입 (1.5배)",
      insert20: "삽입 (2배)",
      insert25: "삽입 (2.5배)",
      tsTdt: "TS TDT:",
      // Tips
      tipMulticast: "멀티캐스트 주소는 브로드캐스트 또는 유니캐스트 주소도 사용할 수 있으며 시스템이 자동 감지합니다.",
      tipVlc: "VLC에서 멀티캐스트를 재생할 수 없으면 컴퓨터에 여러 네트워크 어댑터가 있는지 확인하고 다른 어댑터로 전환해 보세요.",
      tipSap: "SAP 이름은 VLC의 재생 목록 → 로컬 네트워크 등 지원 장치에서 확인할 수 있습니다.",
      tipAdvanced: "TS 고급 설정은 일반적으로 조정이 필요하지 않습니다.",
      tipIptv: "IPTV 시스템에 연결할 때 TS 널 패킷은 1.3배로 조정하세요. 장치가 자동으로 널 패킷을 삽입하여 안정적인 비트레이트를 보장합니다.<br>이 설정은 \"강제 CBR\" 모드에만 적용됩니다."
    },

    // MJPEG settings

    mjpeg: {

      jpgUri: "JPG Image URL:",

      mjpgUri: "MJPG Stream URL:",

      // Tips

      tipJpg: "JPG is a still image; MJPG is a motion image.",

      tipMjpg: "Both can be opened directly in a browser."

    },


    // RTSP settings
    rtsp: {
      rtspUri: "RTSP 스트림 URL:",
      enableMulticast: "활성화 (멀티캐스트)",
      enableTcpOnly: "활성화 (TCP 전용)",
      multicastIp: "RTSP 멀티캐스트 IP:",
      multicastPort: "RTSP 멀티캐스트 포트:",
      // Tips
      tipEnable: "활성화를 선택하면 실제 전송 방식(UDP 또는 TCP)은 클라이언트에 의해 결정됩니다. 예를 들어 VLC에서 \"RTP over RTSP(TCP)\"를 체크하면 TCP를 사용합니다.",
      tipTcpOnly: "활성화 (TCP 전용)를 선택하면 장치가 강제로 TCP를 사용합니다.",
      tipUdp: "UDP는 네트워크 문제로 인해 가끔 패킷을 드롭할 수 있습니다. 모든 클라이언트가 지원하면 TCP를 권장합니다.",
      tipMulticast: "활성화 (멀티캐스트)를 선택하면 \"RTSP 멀티캐스트 포트\"부터 4개의 연속 포트를 사용합니다."
    },

    // RTMP settings
    rtmp: {
      rtmpUri: "RTMP 스트림 URL:",
      publishUri0: "RTMP(S)/RTSP 배포 URL 0:",
      publishUri1: "RTMP(S)/RTSP 배포 URL 1:",
      publishUri2: "RTMP(S)/RTSP 배포 URL 2:",
      mode: "RTMP 스트림 모드:",
      modeStandard: "Standard (Enhanced RTMP)",
      modeLegacy: "Legacy (CodecID 12)",
      // Tips
      tipPublish: "배포 URL 0-2는 다른 LAN 또는 공용 RTMP/RTSP 서버로 스트림을 푸시하기 위한 것으로 H.265/H.264를 지원합니다.",
      tipBuiltin: "이 장치에는 H.264/H.265 풀 재생을 지원하는 내장 RTMP 서버가 있습니다.<br>RTMP URL을 \"/live/0\"으로 설정하면 PotPlayer에서 http://장치IP/live/0 으로 재생할 수 있습니다.",
      tipMode: "RTMP 스트림 모드는 H.265에만 적용되며 FLV 스트림에도 영향을 줍니다."
    },

    // SRT settings
    srt: {
      listenerUri: "SRT 리스너 URL:",
      callerUri: "SRT 콜러 URL:",
      // Tips
      tipListener: "SRT 리스너 모드는 로컬 포트에서 리슨하고 플레이어가 스트림을 풀하기를 기다립니다.<br>예: srt://0.0.0.0:9000<br>VLC는 \"srt://장치IP:9000\"으로 재생할 수 있습니다.<br>streamid 추가 예:<br>srt://0.0.0.0:9000?streamid=channel100<br>비밀번호 추가 예 (최소 10자):<br>srt://0.0.0.0:9000?passphrase=0123456789<br>streamid와 비밀번호 모두 추가:<br>srt://0.0.0.0:9000?streamid=channel100&passphrase=0123456789",
      tipCaller: "SRT 콜러 모드는 다른 서버로 스트림을 푸시합니다. 예:<br>srt://live.example.com:9000?streamid=channel100&latency=120&maxbw=8000000",
      tipParams: "지원되는 SRT 매개변수 (자세한 내용은 SRT 프로토콜 참조):<br>streamid - 다중화를 위한 스트림 식별자<br>passphrase - 암호화 비밀번호, SRT는 10-79자 필요<br>pbkeylen - 키 길이: 16 (AES-128), 24 (AES-192), 32 (AES-256)<br>latency - 지연 시간 (ms) (20-8000ms)<br>maxbw - 최대 대역폭 (바이트/초)<br>rcvbuf - 수신 버퍼 크기<br>sndbuf - 송신 버퍼 크기<br>ipttl - IP TTL 값<br>conntimeo - 연결 타임아웃 (ms)"
    },

    // WebRTC settings
    webrtc: {
      preview: "WebRTC 미리보기:",
      whipServer: "WHIP 서버:",
      whipToken: "WHIP 베어러 토큰:",
      p2pServer: "P2P 서버:",
      p2pUuid: "P2P UUID:",
      p2pToken: "P2P 인증 토큰:",
      p2pAuthToken: "P2P 인증 토큰:",
      regenerate: "재생성",
      // Tips
      tipPreview: "주요 브라우저에서 WebRTC 미리보기는 H.264 영상과 Opus/G.711 오디오 인코딩을 지원합니다.<br>오디오를 Opus로 설정하면 더 나은 결과를 얻을 수 있습니다. Opus로 설정하지 않으면 기본적으로 G.711 8K가 됩니다.",
      tipWhip: "WHIP 스트리밍은 표준 WHIP 서버에 연결합니다. 서버에서 주소를 복사하세요.<br>베어러 토큰은 비워둘 수 있습니다.",
      tipP2p: "P2P 서버를 활성화하면 시청 URL이 상태 페이지에 표시됩니다.<br>P2P 인증 토큰은 비워둘 수 있습니다.",
      tipP2pNote: "복잡한 인트라넷 환경에서는 P2P가 연결되지 않을 수 있습니다."
    },

    // TRTC settings
    trtc: {
      roomId: "TRTC 룸 ID:",
      userId: "TRTC 사용자명:",
      roomKey: "TRTC 룸 키:",
      userSig: "TRTC UserSig:",
      sdkAppId: "TRTC SDKAppID:",
      roomIdType: "TRTC 룸 ID 유형:",
      roomIdNumber: "숫자",
      roomIdString: "문자열",
      // Short enum labels for template use
      number: "숫자",
      string: "문자열",
      // Tips
      tipTrtc: "Tencent TRTC 서버로 스트림을 푸시합니다. 서버에서 주소를 복사하세요.<br>Tencent TRTC는 현재 H.264만 지원합니다."
    },

    alirtc: {
      roomId: "AliRTC 룸 ID:",
      userId: "AliRTC 사용자 ID:",
      userName: "AliRTC 사용자 이름:",
      region: "AliRTC 지역:",
      token: "AliRTC Token:",
      tipAliRtcToken: "Alibaba Cloud RTC 서버로 스트림을 푸시하며 H.265/H.264를 지원합니다.<br>서비스 측에서 제공한 Token을 직접 입력하거나, AliRTC Token을 클릭해 별도 페이지에서 AppID/AppKey로 Token을 생성할 수 있습니다.<br>Token이 비어 있으면 장치는 시작 시 별도 페이지에 저장된 AppID/AppKey로 자동 생성을 시도합니다.<br>룸 ID, 사용자 ID 또는 사용자 이름이 변경되면 token을 다시 생성해야 할 수 있습니다."
    },

    alirtcTokenPage: {
      title: "AliRTC Token",
      roomId: "AliRTC 룸 ID:",
      userId: "AliRTC 사용자 ID:",
      userName: "AliRTC 사용자 이름:",
      appId: "AliRTC AppID:",
      appKey: "AliRTC AppKey:",
      token: "AliRTC Token:",
      generate: "Token 생성 및 저장",
      appFieldsRequired: "AliRTC AppID와 AppKey는 필수입니다.",
      identityRequired: "현재 스트림 출력 설정에서 AliRTC 룸 ID, 사용자 ID 및 사용자 이름이 필요합니다.",
      generateSuccess: "AliRTC token이 생성되어 저장되었습니다.",
      generateFailed: "AliRTC token 생성에 실패했습니다.",
      unavailable: "이 장치에서는 AliRTC를 사용할 수 없습니다."
    },

    // HLS settings
    hls: {
      hlsTsUri: "HLS TS 스트림 URL:",
      hlsMp4Uri: "HLS MP4 스트림 URL:",
      hlsPushUri: "HLS 배포 URL:",
      hlsPushUrl: "HLS 배포 URL:",
      // Tips
      tipHls: "HLS TS/MP4를 활성화하면 장치는 고급 설정의 세그먼트 시간과 세그먼트 수에 따라 메모리에 데이터를 버퍼합니다.<br>세그먼트 시간과 세그먼트 수를 모두 3으로 설정하면 메모리 사용량을 줄일 수 있습니다.",
      tipPush: "HLS 배포 URL은 YouTube 등의 서버로 푸시하기 위한 것입니다."
    },

    // MP4/FLV/Other settings
    other: {
      mp4Uri: "MP4 스트림 URL:",
      flvUri: "FLV 스트림 URL:",
      icecastUri: "ICECAST 배포 URL:",
      icecastPushUrl: "ICECAST 배포 URL:",
      shoutcastUri: "Shoutcast 배포 URL:",
      shoutcastPushUrl: "Shoutcast 배포 URL:",
      // Tips
      tipMp4: "MP4 스트림을 활성화하면 브라우저에서 직접 재생할 수 있습니다.<br>FLV 스트림은 이 장치에서 H.265/H.264를 지원하지만 VLC 및 기타 플레이어는 현재 H.264만 지원합니다.<br>ICECAST/Shoutcast는 MP3만 지원하며 오디오 서버로 푸시하기 위한 것입니다.",
      tipShoutcast: "Shoutcast는 v1과 v2를 지원합니다.<br>예:<br>http://password@shoutcast_server:8000<br>http://password@shoutcast_server:8000?sid=100<br>http://password@shoutcast_server:8000?icy-name=Stream&icy-genre=Pop<br>형식:<br>http://password@서버IP:리슨포트[?매개변수...]; 사용자명은 생략 가능 (기본값 \"source\").<br>서버의 \"리슨 포트\"를 사용하면 장치가 자동으로 소스 포트(리슨 포트 + 1)에 연결합니다.<br>지원되는 매개변수:<br>sid: Shoutcast v2 스트림 ID (기본값 1)<br>icy-name: 스트림 이름 (선택사항)<br>icy-genre: 장르 (선택사항)<br>icy-url: 웹사이트 URL (선택사항)<br>icy-pub: 공개 0/1 (선택사항)"
    },

    // Common
    common: {
      save: "저장",
      disabled: "비활성화됨",
      enabled: "활성화됨"
    },

    // Error and success messages
    messages: {
      success: "설정이 저장되었습니다!",
      failed: "설정에 실패했습니다!",
      emptyError: "설정은 비워둘 수 없습니다!",
      trtcH264Only: "TRTC가 활성화된 경우 H.264 인코딩만 지원됩니다. 자동으로 변경되었습니다.",
      mp3Required: "오디오 인코딩을 MP3로 설정하세요!",
      subStreamDisabled: "Sub-stream settings are disabled.",
      // Encoding validation
      frameRateError: "프레임레이트는 5~60 사이의 정수여야 합니다!",
      gopError: "GOP 간격은 5~300 사이의 정수여야 합니다!",
      mjpegQualityError: "MJPEG 품질은 10~99 사이의 정수여야 합니다!",
      hlsBitrateWarning: "비트레이트가 32~8000 범위 외라서 HLS TS/MP4/배포 스트림이 비활성화되었습니다.",
      trtcCodecWarning: "코덱이 H.264가 아니라서 TRTC가 비활성화되었습니다.",
      alirtcFieldsRequired: "AliRTC를 활성화하면 AppID, AppKey, 룸 ID, 사용자 ID 및 사용자 이름이 필요합니다.",
      alirtcIdentityRequired: "AliRTC를 활성화하면 룸 ID, 사용자 ID 및 사용자 이름을 비워 둘 수 없습니다.",
      hlsBitrateError: "비트레이트가 32~8000 범위 외라서 HLS TS/MP4/배포 스트림을 활성화할 수 없습니다",
      // SRT validation
      srtListenerPortError: "SRT 리스너 포트는 1~65535 사이의 정수여야 합니다!",
      srtListenerFormatError: "SRT 리스너 URL 형식이 유효하지 않습니다!",
      srtCallerFormatError: "SRT 콜러 URL 형식이 유효하지 않습니다!",
      srtPasswordLengthError: "SRT 비밀번호 길이는 10~32 사이여야 합니다!",
      srtLatencyError: "SRT 지연은 1~10000 사이의 정수여야 합니다!",
      srtBandwidthError: "SRT 대역폭은 0~102400 사이의 정수여야 합니다!",
      // RTMP validation
      rtmpFormatError: "배포 URL은 rtmp://, rtmps://, rtsp:// 또는 rtmpt://로 시작해야 합니다",
      // HLS validation
      hlsFormatError: "HLS 배포 URL 형식이 유효하지 않습니다!",
      // RTSP validation
      rtspMulticastIpError: "RTSP 멀티캐스트 IP 형식이 유효하지 않습니다!",
      rtspMulticastPortError: "RTSP 멀티캐스트 포트는 1~65535 사이의 정수여야 합니다!",
      // TS validation
      multicastIpError: "멀티캐스트 IP 형식이 유효하지 않습니다!",
      multicastPortError: "멀티캐스트 포트는 1~65535 사이의 정수여야 합니다!",
      tsTransportIdError: "TS 트랜스포트 스트림 ID는 1~65535 사이의 정수여야 합니다!",
      tsNetworkIdError: "TS 원본 네트워크 ID는 1~65535 사이의 정수여야 합니다!",
      tsPmtPidError: "TS PMT 시작 PID는 16~7936 사이의 정수여야 합니다!",
      tsStartPidError: "TS 시작 PID는 32~3840 사이의 정수여야 합니다!",
      tsPidConflict: "TS 시작 PID와 TS PMT 시작 PID는 달라야 합니다!",
      tsVersionError: "TS 테이블 버전은 0~31 사이의 정수여야 합니다!",
      tsServiceIdError: "TS 서비스 ID는 1~65535 사이의 정수여야 합니다!",
      tsVideoPidError: "TS 영상 PID는 16~8190 사이의 정수여야 합니다!",
      tsAudioPidError: "TS 오디오 PID는 16~8190 사이의 정수여야 합니다!",
      tsVideoPidConflict: "TS 영상 PID와 TS 오디오 PID는 달라야 합니다!",
      tsAudioPmtConflict: "TS 오디오 PID와 TS PMT 시작 PID는 달라야 합니다!",
      tsVideoPmtConflict: "TS 영상 PID와 TS PMT 시작 PID는 달라야 합니다!",
      // Other validation
      icecastFormatError: "Icecast 배포 URL 형식이 유효하지 않습니다!",
      shoutcastFormatError: "Shoutcast 배포 URL 형식이 유효하지 않습니다!"
    }
  }
};
