const ko = {
  menu: {
    modelManagement: '모델 관리',
    monitoringManagement: '모니터링 관리',
    systemManagement: '시스템 관리',
    resourcesAndSupport: '리소스 및 지원',
    launchModel: '모델 실행',
    runningModels: '실행 중인 모델',
    registerModel: '모델 등록',
    clusterInfo: '클러스터 정보',
    monitorCenter: '모니터링 센터',
    logCenter: '로그 센터',
    userManagement: '사용자 관리',
    apiKeyManagement: 'API Key 관리',
    securitySettings: '보안 설정',
    auditCenter: '감사 센터',
    xagent: 'Xagent AI 에이전트',
    contactUs: '문의하기',
    documentation: '문서',
    website: '공식 웹사이트',
  },
  model: {
    languageModels: '언어 모델',
    embeddingModels: '임베딩 모델',
    rerankModels: '재순위 모델',
    imageModels: '이미지 모델',
    audioModels: '오디오 모델',
    videoModels: '비디오 모델',
    customModels: '커스텀 모델',
    flexibleModels: '유연한 모델',
  },
  launchModel: {
    modelType: '모델 유형',
    modelAbility: '모델 기능',
    generate: '텍스트 생성',
    embed: '임베딩',
    rerank: '재정렬',
    chat: '대화',
    vision: '비전',
    reasoning: '추론',
    tools: '도구 사용',
    audio: '오디오 처리',
    omni: '멀티모달 (Omni)',
    hybrid: '하이브리드 기능',
    text2image: '텍스트에서 이미지',
    image2image: '이미지에서 이미지',
    inpainting: '이미지 인페인팅',
    ocr: '광학 문자 인식 (OCR)',
    audio2text: '오디오에서 텍스트',
    text2audio: '텍스트에서 오디오',
    text2audio_zero_shot: '텍스트에서 오디오(제로 샷)',
    text2audio_voice_cloning: '텍스트에서 오디오(음성 클로닝)',
    text2audio_emotion_control: '텍스트에서 오디오(감정 제어)',
    text2video: '텍스트에서 비디오',
    image2video: '이미지에서 비디오',
    firstlastframe2video: '첫 번째와 마지막 프레임에서 비디오',
    status: '상태',
    cached: '캐시됨',
    manageCachedModels: '캐시 모델 관리',
    manageVirtualEnvironments: '가상 환경 관리',
    favorite: '즐겨찾기',
    unfavorite: '즐겨찾기 해제',
    search: '모델 이름 및 설명 검색',
    searchModelType: '{{modelType}} 모델 이름 검색',
    searchInstruction: '{{hotkey}}로 검색',
    clickToLaunchModel: '마우스 클릭으로 모델 실행',
    dimensions: '차원',
    maxTokens: '최대 토큰 수',
    contextLength: '컨텍스트 길이',
    chatModel: '채팅 모델',
    generateModel: '생성 모델',
    otherModel: '기타 모델',
    confirmDeleteCustomModel:
      '커스텀 모델 {{modelName}}을(를) 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.',
    modelName: '모델 이름',
    envPath: '환경 경로',
    realPath: '실제 경로',
    copyEnvPath: '환경 경로 복사',
    viewPackages: '패키지 목록 보기',
    installedPackages: '설치된 패키지',
    packageName: '패키지 이름',
    version: '버전',
    location: '위치',
    packagesCount: '패키지 수',
    size: '크기',
    pythonVersion: 'Python 버전',
    createdAt: '생성 시간',
    noVirtualEnvironmentsForNow: '현재 가상환경이 없습니다!',
    noPackagesInstalled: '설치된 패키지가 없습니다',
    lastConfig: '마지막 설정',
    configCache: '구성 캐시',
    newCache: '새 캐시',
    noConfigCache: '현재 구성 캐시가 없습니다!',
    loadCache: '사용하기',
    deleteCache: '캐시 삭제',
    lastUpdated: '마지막 업데이트',
    defaultConfig: '기본 구성',
    confirmDeleteConfigCache: '이 구성 캐시를 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.',
    invalidConfigCache: '이 구성 캐시에 필요한 모델 엔진을 현재 사용할 수 없습니다.',
    commandLineParsing: '명령줄 인수 파싱',
    copyToCommandLine: '명령줄 명령으로 복사',
    modelEngine: '모델 엔진',
    modelFormat: '모델 형식',
    modelSize: '모델 크기',
    quantization: '양자화',
    multimodelProjector: '멀티모델 프로젝터',
    nGPU: '레플리카당 GPU 수',
    nGPUPerWorker: '워커당 GPU 수',
    nGPUDevice: '장치',
    gpuCount: 'GPU 수: {{count}}',
    nGpuLayers: 'GPU 레이어 수',
    replica: '레플리카',
    advancedConfiguration: '고급 설정',
    runtimeEnvironment: '실행 환경',
    engineParameters: '엔진 매개변수',
    engineQuantizationParameters: '양자화 매개변수',
    engineAdditionalParameters: '추가 매개변수',
    modelUid: '모델 UID',
    modelUidPlaceholder: '기본값은 모델 이름',
    requestLimits: '요청 제한',
    requestLimitsPlaceholder: '이 모델의 요청 제한 수, 기본값은 없음',
    workerIp: '워커 IP',
    workerIpPlaceholder: '분산 환경의 워커 IP 지정. 여러 개를 선택하거나 입력 후 Add.',
    workerCount: '워커 수',
    workerCountPlaceholder: '워커 수',
    GPUIdx: 'GPU 인덱스',
    GPUIdxPlaceholder: '모델이 위치할 GPU 인덱스를 지정하세요. 예: 0,1,2',
    downloadHub: '다운로드 허브',
    downloadHubPlaceholder: '다운로드 허브',
    modelPath: '모델 경로',
    modelPathPlaceholder: 'PyTorch의 경우 모델 디렉토리, GGML/GGUF의 경우 모델 파일 경로 지정',
    GGUFQuantization: 'GGUF 양자화 형식',
    GGUFQuantizationPlaceholder: 'Transformer 부분 양자화',
    GGUFModelPath: 'GGUF 모델 경로',
    GGUFModelPathPlaceholder: '.gguf로 끝나는 파일 지정',
    lightningVersions: '경량화 버전',
    lightningVersionsPlaceholder: '경량화 버전',
    lightningModelPath: '경량화 lora 모델 경로',
    lightningModelPathPlaceholder: '경량화 lora 모델 경로',
    enableThinking: '사고 활성화',
    enableMtp: 'MTP 활성화',
    speculativeDecoding: '추측 디코딩',
    draftModelQuantization: '드래프트 모델 양자화',
    draftModelQuantizationPlaceholder: '기본값은 첫 번째 사용 가능 항목',
    numSpeculativeTokens: '추측 토큰 수',
    numSpeculativeTokensPlaceholder: '엔진 기본값',
    numSpeculativeTokensPlaceholderValue: '엔진 기본값 {{value}}',
    enableMtpTip:
      '모델과 함께 작은 드래프트 모델을 실행해 라운드마다 여러 토큰을 제안하고, 모델이 한 번에 검증합니다. 출력은 동일하며 디코딩이 빨라집니다. 활성화하면 드래프트 모델 가중치를 추가로 다운로드합니다.',
    draftModelQuantizationTip:
      '드래프트 모델은 작아서 양자화해도 메모리 절약은 적고 수용률은 낮아집니다. 대상 모델이 양자화되어 있어도 양자화되지 않은 드래프트 모델을 권장합니다.',
    numSpeculativeTokensTip:
      '라운드당 드래프트 모델이 제안하는 토큰 수(보너스 토큰 포함). 비워 두면 MLX는 드래프트 모델의 학습 깊이(Gemma 4는 4)를 읽습니다. Gemma 4의 llama.cpp, vLLM, SGLang은 모델 크기별 동일한 레시피에 따라 E2B는 2, E4B와 26B-A4B는 4, 12B와 31B는 권장 범위 4~8의 하한인 4를 사용합니다.',
    parsingReasoningContent: '추론 내용 파싱',
    CPUOffload: 'CPU 오프로드',
    CPUOffloadTip:
      '모델을 CPU로 언로드합니다. 리소스가 제한된 경우 또는 GGUF 옵션을 사용할 때 권장됩니다.',
    loraConfig: 'Lora 설정',
    loraModelConfig: 'Lora 모델 설정',
    virtualEnvConfig: '가상 환경 설정',
    modelVirtualEnv: '모델 가상 환경',
    virtualEnvPackage: '가상 환경 패키지',
    envVariable: '환경 변수',
    envVariableConfig: '환경 변수 설정',
    additionalQuantizationParametersForInferenceEngine: '추론 엔진에 전달되는 추가 양자화 매개변수',
    additionalParametersForInferenceEngine: '추론 엔진에 전달되는 추가 매개변수',
    enterIntegerGreaterThanZero: '0보다 큰 정수를 입력하세요.',
    enterCommaSeparatedNumbers: '쉼표로 구분된 숫자를 입력하세요. 예: 0,1,2',
    device: '장치',
    loraLoadKwargsForImageModel: '이미지 모델의 Lora 로드 인수',
    loraFuseKwargsForImageModel: '이미지 모델의 Lora 퓨즈 인수',
    launch: '실행',
    copyJson: 'Json 복사',
    placeholderTip: '입력하세요',
    fillCompleteParametersBeforeAdding: '추가하기 전에 완전한 매개변수를 입력하세요!',
    model_format: '모델 형식',
    model_size_in_billions: '모델 크기(억 단위)',
    quantizations: '양자화',
    real_path: '실제 경로',
    path: '경로',
    ipAddress: 'IP 주소',
    copyRealPath: '실제 경로 복사',
    copyPath: '경로 복사',
    noCacheForNow: '현재 캐시가 없습니다!',
    confirmDeleteCacheFiles: '캐시 파일을 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.',
    confirmDeleteVirtualEnv: '가상 환경을 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.',
    commandLineTip: '모델 이름이 일치하는지 확인하세요.',
    featured: '추천 및 즐겨찾기',
    all: '모두',
    cancelledSuccessfully: '성공적으로 취소되었습니다!',
    mustBeUnique: '{{key}} 는 고유해야 합니다',
    launchProgress: '시작 진행 상황',
    launchCompleted: '모델 배포가 완료되었습니다',
    launchCompletedWithAutostart: '모델 배포가 완료되었으며 자동 시작에 추가되었습니다',
    saveAutostart: '시작 성공 후 자동 시작으로 설정',
    autostartSaveFailed: '모델은 시작되었지만 자동 시작 설정 저장에 실패했습니다',
    launchCanceled: '배포가 중지되었습니다',
    initializing: '초기화 중...',
    moreDetails: '자세히 보기',
  },
  runningModels: {
    searchPlaceholder: '모델 이름 또는 모델 UID 검색...',
    loadingModels: '모델을 불러오는 중...',
    fetchingModelList: '최신 실행 중인 모델 목록을 가져오는 중입니다.',
    noRunningModels: '실행 중 모델 없음',
    launchModelFirst: '모델을 실행하면 여기에 표시됩니다.',
    noModelsFound: '모델을 찾을 수 없습니다',
    tryChangingSearchKeywords: '검색 키워드를 변경해 보세요.',
    selectModel: '모델 선택',
    selectModelDescription: '왼쪽 목록에서 항목을 클릭하여 상세 정보를 확인하세요.',
    tryApi: 'API 사용해 보기',
    refresh: '새로고침',
    terminateConfirmBody:
      '현재 모델 {{name}}에는 {{replica}}개의 복제본이 있습니다. 클러스터가 바쁘거나 복제본 수가 많은 경우 종료 작업에 몇 분 정도 소요될 수 있습니다. 전체 소요 시간은 가장 느린 Worker 노드에 따라 달라집니다. 종료 버튼을 반복해서 클릭하지 마세요.',
    terminateConfirmOk: '종료',
    baseInfo: '기본 정보',
    modelType: '모델 유형',
    modelEngine: '모델 엔진',
    modelFormat: '모델 형식',
    modelSize: '모델 크기',
    quantization: '양자화',
    resources: '리소스 할당',
    workerAddress: 'Worker 노드',
    gpuIndexes: 'GPU 인덱스',
    gpuMemory: 'GPU 메모리',
    replicaDetail: '복제본 상세 정보',
    removeReplicaConfirm: '모델 {{modelUid}}의 복제본 {{replicaId}}을(를) 제거하시겠습니까?',
    autostartEnabled: '자동 시작이 설정됨',
    removeAutostartSuccess: '{{modelUid}}의 자동 시작을 제거했습니다',
    removeAutostartFailed: '자동 시작 제거에 실패했습니다',
  },
  registerModel: {
    modelName: '모델 이름',
    modelDescription: '모델 설명 (선택)',
    contextLength: '컨텍스트 길이',
    dimensions: '차원',
    maxTokens: '최대 토큰 수',
    modelPath: '모델 경로',
    modelLanguages: '모델 언어',
    languages: '언어',
    multilingual: '다국어',
    modelAbilities: '모델 기능',
    modelFamily: '모델 패밀리',
    chatTemplate: '채팅 템플릿',
    test: '테스트',
    testResult: '테스트 결과',
    noTestResults: '테스트 결과가 없습니다...',
    stopTokenIds: '중지 토큰 ID',
    stop: '중지',
    reasoningStartTag: '추론 시작 태그',
    reasoningEndTag: '추론 종료 태그',
    toolParser: '도구 파서',
    launcher: '런처',
    launcherArguments: '런처 인수 (선택)',
    registerModel: '모델 등록',
    messagesExample: '메시지 예시',
    JSONFormat: 'JSON 형식',
    modelSpecs: '모델 사양',
    modelSizeBillions: '모델 크기(억 단위)',
    quantization: '양자화',
    quantizationOptional: '양자화 (선택)',
    controlnet: 'Controlnet',
    packages: '가상환경 패키지',
    more: '더보기',
    modelFormat: '모델 형식',
    enterNumberGreaterThanZero: '0보다 큰 숫자를 입력하세요.',
    carefulQuantizationForModelRegistration:
      'GPTQ/AWQ/FP8/MLX 모델의 경우, 등록하려는 모델에 해당하는 양자화를 신중하게 입력하세요.',
    quantizationCannotBeEmpty: '양자화는 비워둘 수 없습니다.',
    enterInteger: '정수를 입력하세요.',
    enterIntegerGreaterThanZero: '0보다 큰 정수를 입력하세요.',
    showJsonView: 'API에서 사용하는 사용자 지정 JSON 구성 표시',
    hiddenJsonView: 'API에서 사용하는 사용자 지정 JSON 구성 숨기기',
    copyAll: '모두 복사',
    alphanumericWithHyphensUnderscores:
      '하이픈과 언더스코어가 적절히 배치된 영숫자. 내장 모델 이름과 일치하지 않아야 합니다.',
    chooseBuiltInOrCustomModel: '내장 모델에서 선택하거나 자신의 모델을 입력할 수 있습니다.',
    chooseOnlyBuiltInModel: '내장 모델만 선택할 수 있습니다.',
    provideModelDirectoryPath: '모델 디렉토리 경로를 제공하세요.',
    provideModelLauncher: '모델 런처를 제공하세요.',
    jsonArgumentsForLauncher: '런처에 전달되는 인수를 나타내는 JSON 형식의 사전.',
    provideModelDirectoryOrFilePath:
      'PyTorch의 경우 모델 디렉토리, GGUF의 경우 모델 파일 경로를 제공하세요.',
    ensureChatTemplatePassesTest:
      '오른쪽의 TEST 버튼을 클릭하여 이 chat_template이 테스트를 통과하는지 확인하세요. 이 테스트는 모든 경우를 다루지 않으며 가장 기본적인 경우에만 사용됩니다.',
    testFailurePreventsChatWorking:
      '테스트를 통과하지 못하면 채팅이 제대로 작동하지 않을 수 있습니다.',
    stopControlForChatModels: 'int 유형, 채팅 모델의 중지를 제어하는 데 사용',
    stopControlStringForChatModels: 'string 유형, 채팅 모델의 중지를 제어하는 데 사용',
    enterJsonFormattedDictionary: 'JSON 형식의 사전을 입력하세요.',
    autoFill: '자동 채우기',
    fillInModelPathFirst: '먼저 모델 경로를 입력하세요',
    fillInModelFamilyFirst: '먼저 모델 패밀리를 선택하세요',
  },
  monitorCenter: {
    notConfigured: '모니터링이 구성되지 않았습니다. XINFERENCE_GRAFANA_URL 환경 변수를 설정하세요.',
    tab: {
      overview: '개요',
      modelLoad: '모델 부하',
      llmSlo: 'LLM SLO',
      gpu: 'GPU',
      host: '호스트',
      security: '보안',
    },
    time: {
      '5m': '최근 5분',
      '15m': '최근 15분',
      '30m': '최근 30분',
      '1h': '최근 1시간',
      '3h': '최근 3시간',
      '6h': '최근 6시간',
      '12h': '최근 12시간',
      '24h': '최근 24시간',
      '7d': '최근 7일',
      '2d': '최근 2일',
    },
    refresh: {
      off: '끄기',
      '10s': '10초',
      '30s': '30초',
      '1m': '1분',
      '5m': '5분',
    },
    absoluteRange: '절대 시간 범위',
    applyTimeRange: '시간 범위 적용',
    invalidTimeRange: '종료 시간은 시작 시간보다 늦어야 합니다',
    manualRefresh: '대시보드 새로고침',
    config: {
      button: '모니터 설정',
      title: '모니터링 구성',
      grafanaUrl: 'Grafana URL',
      datasourceName: '데이터소스 이름',
      alertDatasourceName: '알림 데이터소스 이름',
      clusterName: '클러스터 이름',
      dashboards: '대시보드 UID',
      testConnection: '연결 테스트',
      testing: '테스트 중…',
      connectionOk: '연결 성공',
      connectionFailed: '연결 실패',
      reset: '기본값으로 초기화',
      resetConfirm: '모니터 설정을 기본값으로 초기화하시겠습니까?',
      save: '저장',
      cancel: '취소',
      saved: '저장됨',
      source: {
        db: '데이터베이스',
        env: '환경변수',
        default: '기본값',
      },
    },
  },
  logCenter: {
    notConfigured: '로그가 구성되지 않았습니다. Elasticsearch 로그 서비스를 활성화하세요.',
    allNodes: '모든 노드',
    searchPlaceholder: '로그 내용, 필드 또는 키워드 검색',
    refresh: '로그 새로고침',
    loading: '로그 로딩 중...',
    logLevel: '로그 레벨',
    nodeType: '노드 유형',
    clearFilters: '모두 지우기',
    noLogs: '일치하는 로그가 없습니다',
    totalHits: '총 {{count}}개',
    prevPage: '이전',
    nextPage: '다음',
    time: '시간',
    level: '레벨',
    node: '노드',
    message: '메시지',
    detail: {
      tableTab: '테이블',
      jsonTab: 'JSON',
      action: '작업',
      field: '필드',
      value: '값',
      filterFor: '이 값 포함',
      filterOut: '이 값 제외',
      copyJson: 'JSON 복사',
      copied: '복사됨',
      viewContext: '컨텍스트 보기',
      contextTitle: '로그 컨텍스트',
      contextError: '이 로그에 사용할 수 있는 컨텍스트가 없습니다.',
      contextFetchError: '컨텍스트를 불러오지 못했습니다.',
      loadNewer: '새 로그 불러오기',
      loadOlder: '이전 로그 불러오기',
      newerDocs: '개의 새 로그',
      olderDocs: '개의 이전 로그',
    },
  },
  clusterInfo: {
    pageDescription:
      'XInference 클러스터의 현재 상태를 확인합니다. 여기에는 슈퍼바이저 노드, 워커 노드 및 해당 하드웨어 리소스가 포함됩니다.',
    supervisor: '슈퍼바이저',
    workers: '워커',
    workerDetails: '워커 세부 정보',
    count: '수',
    cpuInfo: 'CPU 정보',
    usage: '사용률: ',
    total: '총계: ',
    cpuMemoryInfo: 'CPU 메모리 정보',
    version: '버전',
    release: '릴리스: ',
    commit: '커밋: ',
    gpuInfo: 'GPU 정보',
    gpuMemoryInfo: 'GPU 메모리 정보',
    address: '주소',
    item: '항목',
    value: '값',
    nodeType: '노드 유형',
    cpuUsage: 'CPU 사용률',
    cpuTotal: 'CPU 총계',
    memUsage: '메모리 용량',
    memTotal: '메모리 총계',
    gpuCount: 'GPU 수',
    gpuLoad: 'GPU 로드',
    gpuMemUsage: 'GPU 메모리 사용량',
    gpuMemTotal: 'GPU 메모리 총계',
    worker: '워커',
  },
  userManagement: {
    pageDescription: 'Xinference 클러스터에 접근할 수 있는 사용자를 관리합니다.',
    createUser: '사용자 생성',
    editUser: '사용자 편집',
    editPermissionsTitle: '권한 편집 - {{username}}',
    username: '사용자 이름',
    usernamePlaceholder: '예: alice',
    usernameRequired: '사용자 이름은 필수입니다',
    password: '비밀번호',
    passwordPlaceholder: '비밀번호 입력',
    passwordRequired: '비밀번호는 필수입니다',
    confirmPassword: '비밀번호 확인',
    confirmPasswordPlaceholder: '비밀번호 재입력',
    passwordMismatch: '비밀번호가 일치하지 않습니다',
    passwordTooShort: '비밀번호는 8자보다 길어야 합니다',
    newPassword: '새 비밀번호',
    changePassword: '비밀번호 변경',
    changePasswordTitle: '비밀번호 변경 - {{username}}',
    passwordChanged: '비밀번호가 변경되었습니다!',
    permissions: '권한',
    selectAll: '전체 선택',
    expandPermissions: '권한 펼치기',
    collapsePermissions: '권한 접기',
    source: '출처',
    createdAt: '생성일',
    enabled: '활성화',
    enabledStatus: '활성화됨',
    disabledStatus: '비활성화됨',
    currentUser: '현재 사용자',
    currentUserToggleHint: '자신을 비활성화할 수 없습니다',
    mustChangePwd: '비밀번호 변경 필요',
    noUsers: '사용자가 없습니다.',
    loading: '로딩 중...',
    create: '생성',
    creating: '생성 중...',
    saving: '저장 중...',
    createSuccess: '사용자가 생성되었습니다!',
    updateSuccess: '사용자가 업데이트되었습니다!',
    deleteTitle: '사용자 삭제',
    deleteDescription: '{{username}} 사용자를 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.',
    permissionGroups: {
      admin: 'admin',
      models: 'models',
      keys: 'keys',
      users: 'users',
      cache: 'cache',
      virtualenv: 'virtualenv',
      logs: 'logs',
      monitor: 'monitor',
    },
    permissionLabels: {
      admin: '관리자',
      'models:list': '모델 목록 보기',
      'models:read': '모델 정보 읽기',
      'models:write': '모델 시작/중지',
      'models:register': '모델 등록/등록 해제',
      'keys:create': 'API Key 생성',
      'keys:manage': 'API Key 관리',
      'users:manage': '사용자 관리',
      'cache:list': '캐시 보기',
      'cache:delete': '캐시 삭제',
      'virtualenv:list': '가상 환경 보기',
      'virtualenv:delete': '가상 환경 삭제',
      'logs:list': '로그 보기',
      'monitor:view': '모니터링 보기',
    },
  },
  apiKey: {
    pageDescription: 'Xinference API 액세스를 위한 API 키를 관리합니다.',
    createKey: 'API 키 생성',
    keyCreated: 'API 키가 생성되었습니다',
    saveKeyWarning: 'API 키를 지금 복사하여 저장하세요. 다시 표시되지 않습니다.',
    name: '이름',
    namePlaceholder: '예: my-app-key',
    nameRequired: '이름은 필수입니다',
    description: '설명',
    descriptionPlaceholder: '선택적 설명',
    key: '키',
    createdAt: '생성일',
    expiresAt: '만료일',
    expiresAtHint: '비워두면 만료 없음.',
    status: '상태',
    enabled: '활성화',
    active: '활성',
    disabled: '비활성',
    expired: '만료됨',
    revealKey: '키 표시',
    hideKey: '키 숨기기',
    noKeys: 'API 키가 없습니다. 하나를 만들어 시작하세요.',
    loading: '로딩 중...',
    create: '생성',
    creating: '생성 중...',
    deleteTitle: 'API 키 삭제',
    deleteDescription: '이 API 키를 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.',
    updateSuccess: 'API 키가 업데이트되었습니다!',
    saving: '저장 중...',
    owner: '소유 사용자',
    ownerPlaceholder: '비워두면 현재 사용자',
    ownerHint: '비워두면 현재 사용자에게 할당됩니다.',
    permissionType: '권한 유형',
    permissionAll: '모든 모델',
    permissionByType: '모델 유형별',
    permissionById: '모델 ID별',
    permissionMixed: '유형 + 인스턴스별(혼합)',
    modelTypes: '모델 유형',
    modelTypesPlaceholder: '모델 유형 선택',
    modelIds: '모델 ID',
    modelIdsPlaceholder: '모델 ID 선택',
    modelsLoading: '모델 목록 로딩 중...',
    usersLoading: '사용자 목록 로딩 중...',
    modelPermissions: '모델 권한',
    bannedCount: '차단 수',
    bannedList: '차단 목록',
    noBanned: '차단 기록 없음',
    view: '보기',
  },
  securitySettings: {
    pageDescription: '실패 요청 제한 정책을 설정하고 현재 차단된 IP 및 API Key를 관리합니다.',
    rateLimitConfig: '요청 제한 정책',
    rateLimitDesc: 'IP 계층과 API Key 계층의 실패 임계값, 집계 기간, 차단 시간을 설정합니다.',
    ipLayer: 'IP 계층',
    ipLayerDesc: '클라이언트 IP별 실패 요청을 집계합니다.',
    keyLayer: 'API Key 계층',
    keyLayerDesc: 'IP와 API Key 조합별 실패 요청을 집계합니다.',
    max_failures: '최대 실패 횟수',
    window_seconds: '집계 기간(초)',
    ban_seconds: '차단 시간(초)',
    notConfigured: '미설정',
    failuresAllowed: '실패 임계값',
    currentBlocks: '현재 차단',
    bannedIps: '차단된 IP',
    bannedIpsDesc: 'IP 계층 임계값을 초과하여 일시적으로 차단된 클라이언트 주소입니다.',
    bannedKeys: '차단된 API Key',
    bannedKeysDesc: 'API Key 계층 임계값을 초과하여 일시적으로 차단된 IP와 API Key 조합입니다.',
    noBannedIps: '차단된 IP가 없습니다.',
    noBannedKeys: '차단된 API Key가 없습니다.',
    ip: 'IP',
    keyId: 'Key ID',
    remaining: '남은 시간',
    refresh: '새로 고침',
    saveConfig: '정책 저장',
    saveSuccess: '보안 정책이 업데이트되었습니다.',
    unban: '차단 해제',
    unbanAll: '전체 해제',
    unbanSuccess: '차단이 해제되었습니다.',
    clearTitle: '전체 차단 해제',
    clearIpsDescription:
      '모든 IP 차단을 해제하시겠습니까? 해당 클라이언트는 즉시 다시 접근할 수 있습니다.',
    clearKeysDescription:
      '모든 API Key 차단을 해제하시겠습니까? 해당 조합은 즉시 다시 접근할 수 있습니다.',
    seconds: '{{count}}초',
    minutes: '{{count}}분',
    hours: '{{count}}시간',
  },
  auditCenter: {
    pageDescription:
      '사용자, API Key, 모델 호출 및 비정상 접근에 대한 API 접근 감사 기록을 조회합니다.',
    totalEvents: '감사 이벤트',
    successEvents: '성공 이벤트',
    riskEvents: '위험 이벤트',
    apiKeyEvents: 'API Key 이벤트',
    matchingRecords: '일치 기록',
    currentPage: '현재 페이지',
    filters: '필터',
    resetFilters: '필터 초기화',
    refresh: '새로 고침',
    loading: '로딩 중...',
    noRecords: '감사 기록이 없습니다.',
    totalHits: '{{count}}개 기록',
    prevPage: '이전',
    nextPage: '다음',
    detailTitle: '감사 상세',
    rawJson: '원본 JSON',
    copyJson: 'JSON 복사',
    time: '시간',
    category: '분류',
    identity: '신원',
    endpoint: '엔드포인트',
    apiKeyNameColumn: 'API Key 이름',
    model: '모델',
    modelIdColumn: '모델 ID',
    status: '상태',
    latency: '지연 시간',
    latencyMs: '{{value}} ms',
    user: '사용자',
    userPlaceholder: '사용자 이름',
    apiKeyName: 'API Key',
    apiKeyNamePlaceholder: 'Key 이름',
    modelId: '모델 ID',
    modelIdPlaceholder: '모델 UID',
    modelName: '모델 이름',
    modelNamePlaceholder: '모델 이름',
    modelType: '모델 유형',
    clientIp: '클라이언트 IP',
    clientIpPlaceholder: 'IP 주소',
    authType: '인증 유형',
    allStatuses: '전체 상태',
    allCategories: '전체 분류',
    allAuthTypes: '전체 인증 유형',
    allModelTypes: '전체 모델 유형',
    categoryOptions: {
      inference: '추론',
      admin: '관리',
      auth: '인증',
      unknown: '알 수 없음',
    },
    authTypeOptions: {
      api_key: 'API Key',
      jwt: 'JWT',
      none: '없음',
    },
    statusOptions: {
      success: '성공',
      error: '오류',
      denied: '거부',
      login_failed: '로그인 실패',
      model_not_found: '모델 없음',
      ip_banned: 'IP 차단',
      key_banned: 'Key 차단',
      key_expired: 'Key 만료',
      key_disabled: 'Key 비활성',
      invalid_key: '잘못된 Key',
      invalid_token: '잘못된 Token',
      insufficient_scope: '권한 부족',
      user_disabled: '사용자 비활성',
      no_credentials: '인증 정보 없음',
      unknown: '알 수 없음',
    },
    modelTypeOptions: {
      LLM: '언어 모델',
      embedding: '임베딩',
      rerank: '재순위',
      image: '이미지',
      video: '비디오',
      audio: '오디오',
    },
  },
  login: {
    welcome: '다시 오신 것을 환영합니다',
    welcomeDesc: 'LLM, 임베딩, 이미지, 멀티모달 모델을 중앙에서 관리하고 배포합니다.',
    login: '로그인',
    loginDesc: '계속하려면 계정 정보를 입력하세요',
    username: '사용자 이름',
    password: '비밀번호',
    mustChangePasswordDesc: '첫 로그인 시 계속하기 전에 비밀번호를 변경해야 합니다.',
    changePasswordUserMissing: '현재 사용자를 식별할 수 없습니다. 다시 로그인해주세요.',
    or: '또는',
    ssoLogin: 'SSO로 로그인',
  },
  setup: {
    welcome: 'Xinference에 오신 것을 환영합니다',
    welcomeDesc:
      '이 인스턴스에는 아직 계정이 없습니다. 배포 설정을 완료하려면 첫 번째 관리자 계정을 생성하세요.',
    title: '관리자 계정 설정',
    description: '계속하려면 첫 번째 관리자 계정을 생성하세요.',
    passwordTooShort: '비밀번호는 최소 {{min}}자 이상이어야 합니다',
    submit: '관리자 계정 생성',
    createSuccess: '관리자 계정이 생성되었습니다. 새 계정으로 로그인하세요.',
    createFailed: '생성에 실패했습니다. 다시 시도해주세요.',
    adminAccessNote: '이 계정은 전체 관리자 권한을 갖게 됩니다.',
    featureServingTitle: '손쉬운 모델 서빙',
    featureServingDesc: '명령어 하나로 최신 LLM, 임베딩, 멀티모달 모델을 실행할 수 있습니다.',
    featureApiTitle: 'OpenAI 호환 API',
    featureApiDesc: '기존 도구 체인과 바로 연동되는 RESTful API, RPC, CLI, Web UI를 제공합니다.',
    featureDistributedTitle: '분산 환경을 고려한 설계',
    featureDistributedDesc:
      '단일 머신이든 클러스터든 GPU와 CPU 전반에서 추론을 확장할 수 있습니다.',
  },
  common: {
    accessDenied: '접근 거부됨',
    accessDeniedDescription: '이 페이지에 접근하는 데 필요한 권한({{scope}})이 없습니다.',
    valueEmpty: '비워둘 수 없습니다',
    patternError: '형식이 올바르지 않습니다. 확인해주세요',
    loginSuccess: '로그인에 성공했습니다',
    loginOut: '로그아웃',
    loginOutSuccess: '로그아웃되었습니다',
    copySuccess: '복사되었습니다!',
    deleteSuccess: '삭제되었습니다!',
    lastUpdateTime: '마지막 업데이트 시간',
    noOptions: '데이터 없음',
    goBack: '뒤로 가기',
    add: '추가',
    delete: '삭제',
    edit: '수정',
    modify: '수정',
    from: '시작',
    to: '종료',
    clear: '지우기',
    today: '오늘',
    weekDays: {
      sun: '일',
      mon: '월',
      tue: '화',
      wed: '수',
      thu: '목',
      fri: '금',
      sat: '토',
    },
    cancel: '취소',
    confirm: '확인',
    update: '업데이트',
    deploy: '배포',
    stop: '중지',
    packUp: '접기',
    unfold: '펼치기',
    operation: '작업',
    notice: '알림',
    itemsCount: '{{count}}개',
    autoCompleteOptionsTips:
      '자주 사용하는 매개변수를 표시합니다. 사용자 지정 매개변수도 입력할 수 있습니다.',
  },
} as const;
export default ko;
