fix(webui): complete i18n audit

This commit is contained in:
chengyongru
2026-08-03 17:53:33 +08:00
committed by chengyongru
parent df11fd92a6
commit 2b63715282
22 changed files with 1535 additions and 994 deletions
+113 -69
View File
@@ -38,6 +38,15 @@
},
"meta": {
"description": "nanobot 웹 UI — nanobot 작업공간과 대화하세요."
},
"pairing": {
"title": "채팅 사용자 연결",
"description": "채팅에 표시된 연결 코드를 입력하세요.",
"code": "연결 코드",
"matched": "{{channel}} 일치. 연결 중...",
"expiresInline": "코드 만료: {{expires}}.",
"queueCount": "{{count}}개 대기 중",
"noMatch": "이 코드와 일치하는 대기 중인 요청이 없습니다."
}
},
"sidebar": {
@@ -162,10 +171,10 @@
"model": "이 프리셋에서 사용할 모델을 선택하세요.",
"configPath": "현재 게이트웨이가 사용하는 설정 파일입니다.",
"selectedPreset": "이름 있는 프리셋은 여기서 읽기 전용입니다. config.json에서 편집하세요.",
"presetModel": "Default로 전환하면 WebUI에서 모델과 제공자를 편집할 수 있습니다.",
"presetModel": "기본값으로 전환하면 WebUI에서 모델과 제공자를 편집할 수 있습니다.",
"density": "이 브라우저에만 저장됩니다.",
"activityMode": "기본으로 표시할 agent 활동 세부 수준을 선택합니다.",
"fileEditDisplay": "파일 편집 활동을 줄 수 또는 diff로 표시할지 선택합니다.",
"activityMode": "기본으로 표시할 에이전트 활동 세부 수준을 선택합니다.",
"fileEditDisplay": "파일 편집 활동을 줄 수 또는 변경 사항으로 표시할지 선택합니다.",
"codeWrap": "작은 화면에서도 긴 코드 줄을 읽기 쉽게 유지합니다.",
"maxResults": "각 web_search 호출에서 반환되는 결과 수입니다.",
"timeout": "검색 제공자 요청이 타임아웃되기 전의 초입니다.",
@@ -178,8 +187,8 @@
"defaultImageSize": "지원하는 제공자에 보낼 크기 힌트입니다.",
"maxImagesPerTurn": "한 번의 generate_image 요청에서 생성할 수 있는 이미지 상한입니다.",
"timezone": "일정과 시간 인식 답변에 사용됩니다.",
"localServiceAccess": "Full Access shell 명령이 localhost 서비스에 접근할 수 있게 합니다.",
"webuiDefaultAccess": "프로젝트별 권한이 없는 Web 채팅에 사용됩니다.",
"localServiceAccess": "전체 접근 권한 shell 명령이 localhost 서비스에 접근할 수 있게 합니다.",
"webuiDefaultAccess": "프로젝트별 권한이 없는 채팅에 사용됩니다.",
"securityManagedControls": "웹 가져오기는 항상 로컬, 사설, 메타데이터 서비스를 보호합니다. 핵심 채널 보안은 config.json에서 관리됩니다.",
"currentModel": "새 응답에 사용됩니다.",
"selectedModelProvider": "선택한 모델에 의해 설정됩니다.",
@@ -189,12 +198,12 @@
"cliAppsFilter": "앱, 카테고리 또는 기능으로 검색합니다.",
"logs": "네이티브 엔진 로그 폴더를 엽니다.",
"diagnostics": "지원용 작은 런타임 보고서를 내보냅니다.",
"localServiceAccessNative": "Full Access shell 명령이 이 Mac의 서비스에 접근할 수 있게 합니다.",
"localServiceAccessNative": "전체 접근 권한 shell 명령이 이 Mac의 서비스에 접근할 수 있게 합니다.",
"webuiDefaultAccessNative": "프로젝트별 권한이 없는 네이티브 채팅에 사용됩니다.",
"contextWindow": "이 모델 구성의 기본 컨텍스트 예산을 선택합니다.",
"transcription": "마이크 입력을 보내기 전에 텍스트로 변환합니다. 채널 음성 메시지도 같은 설정을 사용합니다.",
"transcriptionProvider": "Providers에 저장된 해당 제공자의 인증 정보를 사용합니다.",
"transcriptionProviderStatus": "API 키는 transcription 설정이 아니라 providers 아래에 유지됩니다.",
"transcriptionProvider": "제공자 설정에 저장된 해당 제공자의 인증 정보를 사용합니다.",
"transcriptionProviderStatus": "API 키는 음성 변환 설정이 아니라 제공자 설정에 유지됩니다.",
"transcriptionModel": "제공자가 사용자 지정 모델 ID를 요구하지 않으면 해석된 기본값을 사용하세요.",
"transcriptionLanguage": "en, zh, ja, ko 같은 선택적 ISO-639 힌트입니다."
},
@@ -215,8 +224,8 @@
"expanded": "펼침",
"default": "기본값",
"summary": "요약",
"diff": "Diff",
"collapsedDiff": "접힌 diff",
"diff": "변경 사항",
"collapsedDiff": "접힌 변경 사항",
"on": "켜짐",
"off": "꺼짐",
"defaultPermission": "기본 권한",
@@ -224,7 +233,10 @@
"configured": "구성됨",
"notConfigured": "미구성",
"pending": "대기 중",
"restartingEngine": "재시작 중"
"restartingEngine": "재시작 중",
"checking": "확인 중",
"running": "실행 중",
"needsSetup": "설정 필요"
},
"status": {
"loading": "설정을 불러오는 중...",
@@ -252,30 +264,31 @@
"deleting": "삭제 중...",
"edit": "편집",
"cancel": "취소",
"dismiss": "닫기",
"open": "열기",
"export": "내보내기",
"opening": "여는 중...",
"exporting": "내보내는 중..."
},
"byok": {
"description": "직접 provider 키를 가져옵니다. Nanobot은 현재 config에서 값을 읽고, 설정된 provider만 모델 프리셋에서 사용할 수 있습니다.",
"description": "직접 제공자 키를 사용합니다. Nanobot은 현재 구성에서 값을 읽고, 설정된 제공자만 모델 프리셋에서 사용할 수 있습니다.",
"configured": "설정됨",
"notConfigured": "설정 안 됨",
"configuredSection": "설정됨",
"notConfiguredSection": "설정 안 됨",
"showMore": "{{count}}개 더 보기",
"showLess": "접기",
"apiKey": "API key",
"apiBase": "API base",
"apiKeyPlaceholder": "API key 입력",
"apiKey": "API ",
"apiBase": "API 기본 주소",
"apiKeyPlaceholder": "API 입력",
"apiKeyConfiguredPlaceholder": "비워 두면 현재 key 유지",
"configuredKeyHint": "설정된 key",
"apiBasePlaceholder": "provider 기본값 사용",
"apiKeyRequired": "이 provider를 설정하려면 API key가 필요합니다.",
"showApiKey": "API key 표시",
"hideApiKey": "API key 숨기기",
"noConfiguredProviders": "설정된 provider가 없습니다",
"configureFirst": "먼저 BYOK에서 provider를 설정하세요.",
"apiBasePlaceholder": "제공자 기본값 사용",
"apiKeyRequired": "이 제공자를 설정하려면 API 가 필요합니다.",
"showApiKey": "API 표시",
"hideApiKey": "API 숨기기",
"noConfiguredProviders": "설정된 제공자가 없습니다",
"configureFirst": "먼저 BYOK에서 제공자를 설정하세요.",
"openByok": "BYOK 열기",
"tabs": {
"ariaLabel": "BYOK 자격 증명 유형",
@@ -283,20 +296,20 @@
"webSearch": "웹 검색"
},
"webSearch": {
"provider": "검색 provider",
"providerHelp": "web search 도구가 사용할 백엔드를 선택합니다.",
"selectProvider": "provider 선택",
"provider": "검색 제공자",
"providerHelp": "웹 검색 도구가 사용할 백엔드를 선택합니다.",
"selectProvider": "제공자 선택",
"credentials": "자격 증명",
"noCredentialRequired": "key 필요 없음",
"noCredentialHelp": "DuckDuckGo는 API key를 저장하지 않고 사용할 수 있습니다.",
"noCredentialHelp": "DuckDuckGo는 API 를 저장하지 않고 사용할 수 있습니다.",
"apiKeyHelp": "config에 저장되며 저장 후에는 마스킹되어 표시됩니다.",
"baseUrl": "Base URL",
"baseUrl": "기본 URL",
"baseUrlHelp": "SearXNG에는 자체 인스턴스 URL이 필요합니다.",
"baseUrlPlaceholder": "https://search.example.com",
"apiKeyRequired": "이 검색 provider에는 API key가 필요합니다.",
"baseUrlRequired": "SearXNG에는 Base URL이 필요합니다.",
"apiKeyRequired": "이 검색 제공자에는 API 가 필요합니다.",
"baseUrlRequired": "SearXNG에는 기본 URL이 필요합니다.",
"missingCredential": "저장하기 전에 필요한 자격 증명을 입력하세요.",
"saveHint": "변경 사항은 새 web search 요청에 적용됩니다."
"saveHint": "변경 사항은 새 웹 검색 요청에 적용됩니다."
}
},
"overview": {
@@ -310,13 +323,13 @@
"workspace": "작업공간"
},
"usage": {
"title": "Token 활동",
"shortTitle": "Token Usage",
"title": "토큰 활동",
"shortTitle": "토큰 사용량",
"subtitle": "최근 12개월 동안 제공자가 보고한 사용량입니다.",
"empty": "새 모델 응답 이후 token 활동이 표시됩니다.",
"totalTokens": "누적 Token 수",
"peakTokens": "최고 Token 수",
"thirtyDayTokens": "30일 Token 수",
"empty": "새 모델 응답 이후 토큰 활동이 표시됩니다.",
"totalTokens": "누적 토큰 수",
"peakTokens": "최고 토큰 수",
"thirtyDayTokens": "30일 토큰 수",
"currentStreak": "현재 연속 일수",
"longestStreak": "최장 연속 일수",
"daysValue": "{{count}}일",
@@ -325,7 +338,7 @@
"requests": "요청",
"estimated": "추정",
"includesEstimates": "추정 포함",
"cellTitle": "{{date}}: {{tokens}} tokens, 요청 {{requests}}회",
"cellTitle": "{{date}}: {{tokens}} 토큰, 요청 {{requests}}회",
"sources": {
"user": "채팅",
"api": "API",
@@ -358,9 +371,19 @@
"selectProvider": "제공자 선택",
"selectAspect": "비율 선택",
"selectSize": "크기 선택",
"selectModel": "이미지 모델 선택",
"searchOrTypeModel": "모델 ID 검색 또는 입력",
"typeModelId": "이 제공자가 지원하는 모델 ID를 입력하세요.",
"configureProvider": "제공자 구성",
"missingCredential": "이미지 생성을 활성화하기 전에 이 제공자를 구성하세요."
},
"capabilities": {
"providerSupport": "제공자 지원",
"providerInstallOnSave": "이 제공자를 저장하면 필요한 지원이 자동으로 설치됩니다.",
"searchSupport": "검색 제공자 지원",
"searchInstallOnSave": "저장하면 Olostep 지원이 자동으로 설치됩니다.",
"installing": "지원 설치 중..."
},
"models": {
"selectModel": "모델 선택",
"addConfiguration": "구성 추가",
@@ -383,7 +406,7 @@
"advancedOptions": "고급 옵션",
"advancedSummary": "컨텍스트 {{context}} · 최대 {{max}} 토큰",
"maxTokens": "최대 출력 토큰",
"temperature": "Temperature",
"temperature": "온도",
"reasoningEffort": "추론 강도",
"convertTitle": "현재 모델 설정 변환",
"convertHelp": "기존 기본 및 대체 모델을 프리셋으로 변환하여 여기서 순서를 관리합니다.",
@@ -473,9 +496,9 @@
"serverUrl": "URL",
"transport": "전송 방식",
"command": "명령",
"args": "Args JSON",
"headers": "Headers JSON",
"env": "Env JSON",
"args": "인자 JSON",
"headers": "헤더 JSON",
"env": "환경 변수 JSON",
"timeout": "도구 제한 시간",
"advancedOptions": "고급 옵션",
"hideAdvanced": "고급 숨기기",
@@ -503,6 +526,7 @@
"statusMissingCredentials": "키 필요",
"statusMissingDependency": "의존성 필요",
"statusComingSoon": "곧 제공",
"comingSoon": "곧 제공",
"statusNotInstalled": "비활성",
"toolScope": "도구",
"allTools": "전체",
@@ -565,6 +589,8 @@
"advanced": "고급",
"checkAndEnable": "확인 후 활성화",
"checkConnection": "연결 확인",
"connectionChecks": "연결 확인",
"open": "열기",
"checkedAndEnabled": "확인 후 활성화했습니다.",
"checking": "확인 중...",
"checkOnly": "확인만",
@@ -660,6 +686,8 @@
"protected": "보호됨",
"editTitle": "자동화 편집",
"save": "저장",
"commandCopied": "복사됨",
"copyCommand": "복사",
"deleteTitle": "자동화 삭제",
"deleteDescription": "{{name}}을 cron 저장소에서 삭제합니다. 이전 채팅 메시지는 세션에 남습니다.",
"cancel": "취소",
@@ -719,6 +747,7 @@
"fields": {
"name": "이름",
"message": "메시지",
"command": "명령",
"scheduleType": "일정 유형",
"every": "간격",
"unit": "단위",
@@ -753,7 +782,7 @@
"signInAgain": "다시 로그인",
"signOut": "로그아웃",
"signedInAs": "{{account}}로 로그인됨",
"signInHelp": "이 기기에서 로그인합니다. API key는 config에 저장되지 않습니다.",
"signInHelp": "이 기기에서 로그인합니다. API 키는 구성에 저장되지 않습니다.",
"remoteSignInHelp": "로그인을 선택하여 사용자 컴퓨터에서 xAI를 연 다음, 로그인 후 표시되는 인증 코드를 붙여 넣으세요.",
"codexRemoteSignInHelp": "이 브라우저에서 로그인한 다음 전체 localhost 콜백 URL을 nanobot에 붙여 넣으세요.",
"signInRequired": "로그인이 필요합니다",
@@ -877,34 +906,34 @@
"actions": "{{title}} 주제 작업",
"newInProject": "{{project}}에서 새 주제 시작",
"activity": {
"running": "Agent running",
"complete": "Agent finished",
"updated": "New activity"
"running": "에이전트 실행 중",
"complete": "에이전트 완료",
"updated": "새 활동"
},
"pin": "Pin",
"unpin": "Unpin",
"rename": "Rename",
"pin": "고정",
"unpin": "고정 해제",
"rename": "이름 변경",
"renameTitle": "주제 이름 변경",
"renameDescription": "이 주제에 사용할 사이드바 이름을 선택하세요.",
"renamePlaceholder": "주제 이름",
"renameProjectTitle": "Rename project",
"renameProjectDescription": "Choose a local sidebar name for this project.",
"renameProjectPlaceholder": "Project name",
"renameSave": "Save",
"archive": "Archive",
"unarchive": "Unarchive",
"showArchived": "Show archived",
"hideArchived": "Hide archived",
"renameProjectTitle": "프로젝트 이름 변경",
"renameProjectDescription": "이 프로젝트에 사용할 사이드바 이름을 선택하세요.",
"renameProjectPlaceholder": "프로젝트 이름",
"renameSave": "저장",
"archive": "보관",
"unarchive": "보관 해제",
"showArchived": "보관된 항목 표시",
"hideArchived": "보관된 항목 숨기기",
"delete": "삭제",
"newChat": "새 주제",
"groups": {
"pinned": "Pinned",
"pinned": "고정됨",
"all": "주제",
"projects": "Projects",
"today": "Today",
"yesterday": "Yesterday",
"earlier": "Earlier",
"archived": "Archived"
"projects": "프로젝트",
"today": "오늘",
"yesterday": "어제",
"earlier": "이전",
"archived": "보관됨"
}
},
"deleteConfirm": {
@@ -1109,7 +1138,7 @@
},
"stop": {
"title": "현재 작업 중지",
"description": "이 채팅에서 실행 중인 agent 턴을 취소합니다."
"description": "이 채팅에서 실행 중인 에이전트 턴을 취소합니다."
},
"restart": {
"title": "nanobot 재시작",
@@ -1117,7 +1146,7 @@
},
"status": {
"title": "상태 보기",
"description": "런타임, provider, channel 상태를 표시합니다."
"description": "런타임, 제공자, 채널 상태를 표시합니다."
},
"model": {
"title": "모델",
@@ -1195,7 +1224,9 @@
"cliBadge": "CLI",
"mcpBadge": "MCP",
"cliDescription": "@{{name}}을 로컬 CLI 앱으로 사용",
"mcpDescription": "@{{name}}을 MCP 서버로 사용"
"mcpDescription": "@{{name}}을 MCP 서버로 사용",
"cliTitle": "CLI 앱: {{name}}",
"mcpTitle": "MCP 서버: {{name}}"
},
"workspace": {
"accessAria": "작업공간 접근 모드",
@@ -1215,7 +1246,8 @@
"title": "프롬프트",
"search": "프롬프트 검색",
"noResults": "일치하는 프롬프트가 없습니다.",
"jumpTo": "프롬프트로 이동: {{label}}"
"jumpTo": "프롬프트로 이동: {{label}}",
"railAria": "사용자 프롬프트 탐색"
}
},
"message": {
@@ -1239,19 +1271,27 @@
"agentActivityLiveSummary": "진행 중… · {{reasoning}}단계 · 도구 호출 {{tools}}회",
"agentActivityLiveToolsOnly": "진행 중… · 도구 호출 {{tools}}회",
"imageAttachment": "이미지 첨부",
"videoAttachment": "동영상 첨부",
"fileAttachment": "파일 첨부",
"attachmentUnavailable": "첨부 파일을 사용할 수 없음",
"dataTable": "데이터 표",
"fileEditPreparing": "파일 편집 준비 중…",
"openLink": "링크 열기: {{label}}",
"openAttachment": "{{name}} 열기",
"skill": "스킬: {{name}}",
"askAboutSelection": "이 내용에 대해 질문하기",
"forkFromHere": "분기",
"copyReply": "복사",
"copiedReply": "복사됨",
"turnLatencyTitle": "응답 시간(엔드투엔드)",
"fileEditViewDiff": "Diff 보기",
"fileEditViewLargeDiff": "큰 diff 보기",
"fileEditViewDiff": "변경 사항 보기",
"fileEditViewLargeDiff": "큰 변경 사항 보기",
"fileEditDiffLineCount": "{{count}}줄",
"fileEditUnchangedLinesHidden": "변경되지 않은 {{count}}줄 숨김",
"fileEditShowMoreLines": "{{count}}줄 더 보기",
"fileEditShowFewerLines": "줄 줄이기",
"fileEditOpenFile": "파일 열기",
"fileEditDiffTruncated": "Diff가 잘렸습니다. 전체 변경은 파일을 열어 확인하세요.",
"fileEditDiffTruncated": "변경 사항이 잘렸습니다. 전체 변경은 파일을 열어 확인하세요.",
"activityThinkingFor": "{{duration}} 동안 생각 중",
"activityThought": "생각함",
"activityThoughtFor": "{{duration}} 동안 생각함",
@@ -1279,6 +1319,7 @@
},
"filePreview": {
"aria": "파일 미리보기",
"breadcrumb": "파일 경로",
"close": "파일 미리보기 닫기",
"loading": "미리보기 로딩 중...",
"failed": "이 파일을 미리 볼 수 없습니다.",
@@ -1293,7 +1334,10 @@
"copied": "복사됨"
},
"common": {
"dismiss": "닫기"
"dismiss": "닫기",
"close": "닫기",
"current": "현재",
"cancel": "취소"
},
"errors": {
"messageTooBig": {