feat(i18n): add Korean (ko) translation

Adds a complete Korean locale (surfsense_web/messages/ko.json) with full
key parity with en.json, and wires ko into every place locales are
currently enumerated: next-intl routing config, the client-side locale
context/loader, and the two language-switcher UIs (main app + sidebar
user profile).
This commit is contained in:
moduvoice 2026-07-10 11:22:54 +07:00
parent 1ae927a7db
commit d3d8f10940
5 changed files with 830 additions and 5 deletions

View file

@ -25,6 +25,7 @@ export function LanguageSwitcher() {
{ code: "pt" as const, name: "Português", flag: "🇧🇷" },
{ code: "hi" as const, name: "हिन्दी", flag: "🇮🇳" },
{ code: "zh" as const, name: "简体中文", flag: "🇨🇳" },
{ code: "ko" as const, name: "한국어", flag: "🇰🇷" },
];
/**
@ -32,7 +33,7 @@ export function LanguageSwitcher() {
* Updates locale in context and localStorage
*/
const handleLanguageChange = (newLocale: string) => {
setLocale(newLocale as "en" | "es" | "pt" | "hi" | "zh");
setLocale(newLocale as "en" | "es" | "pt" | "hi" | "zh" | "ko");
};
return (

View file

@ -52,6 +52,7 @@ const LANGUAGES = [
{ code: "pt" as const, name: "Português", flag: "🇧🇷" },
{ code: "hi" as const, name: "हिन्दी", flag: "🇮🇳" },
{ code: "zh" as const, name: "简体中文", flag: "🇨🇳" },
{ code: "ko" as const, name: "한국어", flag: "🇰🇷" },
];
// Supported themes configuration
@ -157,7 +158,7 @@ export function SidebarUserProfile({
const showDownloadCta = !isDesktop && !isMobileOS && isDesktopViewport;
const useMobileSubmenus = !isDesktopViewport;
const handleLanguageChange = (newLocale: "en" | "es" | "pt" | "hi" | "zh") => {
const handleLanguageChange = (newLocale: "en" | "es" | "pt" | "hi" | "zh" | "ko") => {
setLocale(newLocale);
};

View file

@ -4,7 +4,7 @@ import type React from "react";
import { createContext, useCallback, useContext, useEffect, useMemo, useState } from "react";
import enMessages from "../messages/en.json";
type Locale = "en" | "es" | "pt" | "hi" | "zh";
type Locale = "en" | "es" | "pt" | "hi" | "zh" | "ko";
/**
* Dynamically load locale messages on demand.
@ -20,6 +20,8 @@ const loadMessages = async (locale: Locale): Promise<typeof enMessages> => {
return (await import("../messages/pt.json")).default;
case "zh":
return (await import("../messages/zh.json")).default;
case "ko":
return (await import("../messages/ko.json")).default;
default:
return enMessages;
}
@ -47,7 +49,7 @@ export function LocaleProvider({ children }: { children: React.ReactNode }) {
setMounted(true);
if (typeof window !== "undefined") {
const stored = localStorage.getItem(LOCALE_STORAGE_KEY);
if (stored && (["en", "es", "pt", "hi", "zh"] as const).includes(stored as Locale)) {
if (stored && (["en", "es", "pt", "hi", "zh", "ko"] as const).includes(stored as Locale)) {
const storedLocale = stored as Locale;
setLocaleState(storedLocale);
// Load messages for non-English locale

View file

@ -7,7 +7,7 @@ import { defineRouting } from "next-intl/routing";
*/
export const routing = defineRouting({
// A list of all locales that are supported
locales: ["en", "es", "pt", "hi", "zh"],
locales: ["en", "es", "pt", "hi", "zh", "ko"],
// Used when no locale matches
defaultLocale: "en",

View file

@ -0,0 +1,821 @@
{
"common": {
"app_name": "SurfSense",
"welcome": "환영합니다",
"save": "저장",
"cancel": "취소",
"delete": "삭제",
"edit": "편집",
"create": "생성",
"update": "업데이트",
"search": "검색",
"close": "닫기",
"confirm": "확인",
"back": "뒤로",
"next": "다음",
"submit": "제출",
"yes": "예",
"no": "아니오",
"add": "추가",
"remove": "제거",
"select": "선택",
"all": "전체",
"none": "없음",
"error": "오류",
"success": "성공",
"warning": "경고",
"info": "정보",
"required": "필수",
"optional": "선택 사항",
"retry": "다시 시도",
"owner": "소유자",
"shared": "공유됨",
"settings": "설정"
},
"auth": {
"login": "로그인",
"register": "회원가입",
"logout": "로그아웃",
"email": "이메일",
"password": "비밀번호",
"confirm_password": "비밀번호 확인",
"forgot_password": "비밀번호를 잊으셨나요?",
"show_password": "비밀번호 표시",
"hide_password": "비밀번호 숨기기",
"remember_me": "로그인 상태 유지",
"sign_in": "로그인",
"sign_up": "회원가입",
"sign_in_with": "{provider}(으)로 로그인",
"dont_have_account": "계정이 없으신가요?",
"already_have_account": "이미 계정이 있으신가요?",
"reset_password": "비밀번호 재설정",
"email_required": "이메일을 입력해주세요",
"password_required": "비밀번호를 입력해주세요",
"invalid_email": "유효하지 않은 이메일 주소입니다",
"password_too_short": "비밀번호는 8자 이상이어야 합니다",
"welcome_back": "다시 오신 것을 환영합니다",
"create_account": "계정 생성",
"login_subtitle": "계정에 접속하려면 인증 정보를 입력하세요",
"register_subtitle": "SurfSense를 시작하려면 가입하세요",
"or_continue_with": "또는 다음으로 계속하기",
"by_continuing": "계속 진행하면 다음에 동의하는 것입니다",
"terms_of_service": "서비스 약관",
"and": "및",
"privacy_policy": "개인정보 처리방침",
"full_name": "이름",
"username": "사용자 이름",
"continue": "계속",
"back_to_login": "로그인으로 돌아가기",
"login_success": "로그인에 성공했습니다",
"register_success": "계정이 성공적으로 생성되었습니다",
"continue_with_google": "Google로 계속하기",
"cloud_dev_notice": "SurfSense Cloud는 현재 개발 중입니다. 자세한 내용은",
"docs": "문서",
"cloud_dev_self_hosted": "를 참고하여 자체 호스팅 버전을 확인해보세요.",
"passwords_no_match": "비밀번호가 일치하지 않습니다",
"password_mismatch": "비밀번호 불일치",
"passwords_no_match_desc": "입력하신 비밀번호가 서로 일치하지 않습니다",
"creating_account": "계정을 생성하는 중입니다",
"creating_account_btn": "계정 생성 중",
"redirecting_login": "로그인 페이지로 이동 중입니다"
},
"workspace": {
"create_title": "워크스페이스 생성",
"create_description": "지식을 정리할 새 워크스페이스를 생성하세요",
"name_label": "이름",
"name_placeholder": "워크스페이스 이름을 입력하세요",
"description_label": "설명",
"description_placeholder": "이 워크스페이스의 용도는 무엇인가요?",
"create_button": "생성",
"creating": "생성 중",
"all_workspaces": "모든 워크스페이스",
"workspaces_count": "{count, plural, =0 {워크스페이스 없음} other {워크스페이스 #개}}",
"no_workspaces": "아직 워크스페이스가 없습니다",
"create_first_workspace": "첫 워크스페이스를 생성하여 시작해보세요",
"members_count": "{count, plural, other {멤버 #명}}",
"create_new_workspace": "새 워크스페이스 생성",
"delete_title": "워크스페이스 삭제",
"delete_confirm": "\"{name}\"을(를) 삭제하시겠습니까? 이 작업은 되돌릴 수 없으며 모든 데이터가 영구적으로 삭제됩니다.",
"leave": "나가기",
"leave_title": "워크스페이스 나가기",
"leave_confirm": "\"{name}\"에서 나가시겠습니까? 이 워크스페이스의 모든 문서와 채팅에 대한 접근 권한을 잃게 됩니다.",
"leaving": "나가는 중...",
"welcome_title": "SurfSense에 오신 것을 환영합니다",
"welcome_description": "첫 워크스페이스를 생성하여 지식을 정리하고, 소스를 연결하고, AI와 대화를 시작해보세요.",
"create_first_button": "첫 워크스페이스 생성하기"
},
"userSettings": {
"title": "사용자 설정",
"description": "계정 설정 및 API 접근을 관리하세요",
"back_to_app": "앱으로 돌아가기",
"profile_nav_label": "프로필",
"profile_nav_description": "표시 이름과 아바타를 관리하세요",
"profile_title": "프로필",
"profile_description": "개인 정보를 업데이트하세요",
"profile_avatar": "프로필 사진",
"profile_display_name": "표시 이름",
"profile_display_name_hint": "앱 전체에서 표시되는 이름입니다",
"profile_email": "이메일",
"profile_save": "변경 사항 저장",
"profile_saved": "프로필이 성공적으로 업데이트되었습니다",
"profile_save_error": "프로필 업데이트에 실패했습니다",
"api_key_nav_label": "API 액세스",
"api_key_nav_description": "API 액세스 토큰을 관리하세요",
"api_key_title": "API 액세스",
"api_key_description": "API 요청을 인증하려면 이 키를 사용하세요",
"api_key_warning_description": "API 키는 계정에 대한 전체 접근 권한을 부여합니다. 공개적으로 공유하거나 버전 관리에 커밋하지 마세요.",
"your_api_key": "내 API 키",
"copied": "복사되었습니다!",
"copy": "클립보드에 복사",
"no_api_key": "API 키를 찾을 수 없습니다",
"usage_title": "사용 방법",
"usage_description": "Authorization 헤더에 API 키를 포함하세요:"
},
"dashboard": {
"title": "대시보드",
"workspaces": "워크스페이스",
"documents": "문서",
"connectors": "커넥터",
"settings": "설정",
"chat": "채팅",
"api_keys": "API 키",
"profile": "프로필",
"loading_dashboard": "대시보드 로딩 중",
"loading_config": "설정 로딩 중",
"config_error": "설정 오류",
"failed_load_llm_config": "LLM 설정을 불러오지 못했습니다",
"error_loading_chats": "채팅을 불러오는 중 오류가 발생했습니다",
"loading_chat": "채팅 로딩 중",
"loading_document": "문서 로딩 중",
"no_recent_chats": "최근 채팅이 없습니다",
"error_loading_space": "워크스페이스를 불러오는 중 오류가 발생했습니다",
"unknown_workspace": "알 수 없는 워크스페이스",
"delete_chat": "채팅 삭제",
"delete_chat_confirm": "삭제하시겠습니까",
"delete_note": "노트 삭제",
"delete_note_confirm": "삭제하시겠습니까",
"action_cannot_undone": "이 작업은 되돌릴 수 없습니다.",
"deleting": "삭제 중",
"surfsense_dashboard": "SurfSense 대시보드",
"welcome_message": "SurfSense 대시보드에 오신 것을 환영합니다.",
"your_workspaces": "내 워크스페이스",
"shared": "공유됨",
"create_workspace": "워크스페이스 생성",
"add_new_workspace": "새 워크스페이스 추가",
"loading": "로딩 중",
"may_take_moment": "잠시 시간이 걸릴 수 있습니다",
"error": "오류",
"something_wrong": "문제가 발생했습니다",
"error_details": "오류 세부 정보",
"try_again": "다시 시도",
"go_home": "홈으로 이동",
"delete_workspace": "워크스페이스 삭제",
"delete_space_confirm": "\"{name}\"을(를) 삭제하시겠습니까? 이 작업은 되돌릴 수 없으며 이 워크스페이스의 모든 문서와 채팅이 영구적으로 삭제됩니다.",
"leave": "나가기",
"leave_title": "워크스페이스 나가기",
"leave_confirm": "\"{name}\"에서 나가시겠습니까? 이 워크스페이스의 모든 문서와 채팅에 대한 접근 권한을 잃게 됩니다.",
"leaving": "나가는 중...",
"no_spaces_found": "워크스페이스를 찾을 수 없습니다",
"create_first_space": "첫 워크스페이스를 생성하여 시작해보세요",
"created": "생성됨"
},
"navigation": {
"home": "홈",
"docs": "문서",
"pricing": "가격",
"contact": "문의",
"login": "로그인",
"register": "회원가입",
"dashboard": "대시보드",
"sign_in": "로그인",
"book_a_call": "상담 예약"
},
"nav_menu": {
"settings": "설정",
"platform": "플랫폼",
"chat": "채팅",
"manage_llms": "LLM 관리",
"sources": "소스",
"add_sources": "소스 추가",
"documents": "문서",
"upload_documents": "문서 업로드",
"add_webpages": "웹페이지 추가",
"add_youtube": "유튜브 동영상 추가",
"add_youtube_videos": "유튜브 동영상 추가",
"manage_documents": "문서 관리",
"connectors": "커넥터",
"add_connector": "커넥터 추가",
"manage_connectors": "외부 MCP 커넥터 관리",
"logs": "로그",
"all_workspaces": "모든 워크스페이스",
"team": "팀"
},
"pricing": {
"title": "SurfSense 가격",
"subtitle": "나에게 맞는 플랜을 선택하세요",
"community_name": "커뮤니티",
"enterprise_name": "엔터프라이즈",
"forever": "영구 무료",
"contact_us": "문의하기",
"feature_llms": "100개 이상의 LLM 지원",
"feature_ollama": "로컬 Ollama 또는 vLLM 설정 지원",
"feature_embeddings": "6000개 이상의 임베딩 모델",
"feature_files": "50개 이상의 파일 확장자 지원.",
"feature_podcasts": "로컬 TTS 제공업체를 이용한 팟캐스트 지원.",
"feature_sources": "15개 이상의 외부 소스와 연결.",
"feature_extension": "인증이 필요한 콘텐츠를 포함한 동적 웹페이지를 위한 크로스 브라우저 확장 프로그램",
"upcoming_mindmaps": "출시 예정: 병합 가능한 마인드맵",
"upcoming_notes": "출시 예정: 노트 관리",
"community_desc": "강력한 기능을 갖춘 오픈소스 버전",
"get_started": "시작하기",
"everything_community": "커뮤니티의 모든 기능",
"priority_support": "우선 지원",
"access_controls": "접근 제어",
"collaboration": "협업 및 다중 사용자 기능",
"video_gen": "영상 생성",
"advanced_security": "고급 보안 기능",
"enterprise_desc": "특정 요구사항이 있는 대규모 조직을 위한 플랜",
"contact_sales": "영업팀 문의"
},
"contact": {
"title": "문의",
"subtitle": "여러분의 이야기를 듣고 싶습니다.",
"we_are_here": "저희가 도와드리겠습니다",
"full_name": "이름",
"email_address": "이메일 주소",
"company": "회사",
"message": "메시지",
"optional": "선택 사항",
"name_placeholder": "홍길동",
"email_placeholder": "example@email.com",
"company_placeholder": "예시 주식회사",
"message_placeholder": "메시지를 입력하세요",
"submit": "제출",
"submitting": "제출 중...",
"name_required": "이름을 입력해주세요",
"name_too_long": "이름이 너무 깁니다",
"invalid_email": "유효하지 않은 이메일 주소입니다",
"email_too_long": "이메일이 너무 깁니다",
"company_required": "회사를 입력해주세요",
"company_too_long": "회사 이름이 너무 깁니다",
"message_sent": "메시지가 성공적으로 전송되었습니다!",
"we_will_contact": "최대한 빠르게 답변드리겠습니다.",
"send_failed": "메시지 전송에 실패했습니다",
"try_again_later": "잠시 후 다시 시도해주세요.",
"something_wrong": "문제가 발생했습니다"
},
"connectors": {
"title": "커넥터",
"subtitle": "연결된 서비스와 데이터 소스를 관리하세요.",
"add_connector": "커넥터 추가",
"your_connectors": "내 커넥터",
"view_manage": "연결된 모든 서비스를 확인하고 관리하세요.",
"no_connectors": "커넥터를 찾을 수 없습니다",
"no_connectors_desc": "아직 추가된 커넥터가 없습니다. 검색 기능을 향상시키려면 커넥터를 추가하세요.",
"add_first": "첫 커넥터 추가하기",
"name": "이름",
"type": "유형",
"last_indexed": "마지막 색인 시점",
"periodic": "주기적",
"actions": "작업",
"never": "없음",
"not_indexable": "색인 불가",
"index_date_range": "날짜 범위로 색인",
"quick_index": "빠른 색인",
"quick_index_auto": "빠른 색인 (자동 날짜 범위)",
"delete_connector": "커넥터 삭제",
"delete_confirm": "이 커넥터를 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.",
"select_date_range": "색인할 날짜 범위 선택",
"select_date_range_desc": "콘텐츠 색인을 위한 시작일과 종료일을 선택하세요. 비워두면 기본 범위가 사용됩니다.",
"start_date": "시작일",
"end_date": "종료일",
"pick_date": "날짜 선택",
"clear_dates": "날짜 초기화",
"last_30_days": "최근 30일",
"last_year": "최근 1년",
"start_indexing": "색인 시작",
"failed_load": "커넥터를 불러오지 못했습니다",
"delete_success": "커넥터가 성공적으로 삭제되었습니다",
"delete_failed": "커넥터 삭제에 실패했습니다",
"indexing_started": "커넥터 콘텐츠 색인이 시작되었습니다",
"indexing_failed": "커넥터 콘텐츠 색인에 실패했습니다"
},
"documents": {
"title": "문서",
"subtitle": "문서와 파일을 관리하세요.",
"no_rows_selected": "선택된 행이 없습니다",
"delete_success_count": "{count}개의 문서를 성공적으로 삭제했습니다",
"delete_partial_failed": "일부 문서를 삭제하지 못했습니다",
"delete_success": "문서가 성공적으로 삭제되었습니다",
"delete_error": "문서 삭제 중 오류가 발생했습니다",
"filter_by_title": "제목으로 필터링...",
"bulk_delete": "선택 항목 삭제",
"filter_types": "유형 필터링",
"columns": "열",
"confirm_delete": "삭제 확인",
"confirm_delete_desc": "{count}개의 문서를 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.",
"uploading": "업로드 중",
"upload_success": "문서가 성공적으로 업로드되었습니다",
"upload_failed": "문서 업로드에 실패했습니다",
"loading": "문서 로딩 중",
"error_loading": "문서를 불러오는 중 오류가 발생했습니다",
"retry": "다시 시도",
"no_documents": "문서를 찾을 수 없습니다",
"type": "유형",
"content_summary": "콘텐츠 요약",
"view_full": "요약 보기",
"filter_placeholder": "제목으로 필터링...",
"rows_per_page": "페이지당 행 수",
"refresh": "새로고침",
"upload_documents": "문서 업로드",
"create_shared_note": "공유 노트 생성",
"processing_documents": "문서 처리 중...",
"delete_in_progress_warning": "{count}개의 문서가 대기 중이거나 처리 중이어서 삭제할 수 없습니다.",
"delete_conflict_error": "{count}개의 문서가 처리를 시작했습니다. 잠시 후 다시 시도해주세요."
},
"add_connector": {
"title": "도구 연결하기",
"subtitle": "즐겨 사용하는 서비스와 통합하여 리서치 역량을 강화하세요.",
"messaging": "메시징",
"project_management": "프로젝트 관리",
"documentation": "문서화",
"development": "개발",
"databases": "데이터베이스",
"productivity": "생산성",
"web_crawling": "웹 크롤링",
"connect": "연결",
"coming_soon": "출시 예정",
"connected": "연결됨",
"manage": "관리",
"tavily_desc": "Tavily API를 사용하여 웹을 검색합니다",
"searxng_desc": "자체 SearxNG 메타 검색 인스턴스를 사용하여 웹 결과를 가져옵니다.",
"linkup_desc": "Linkup API를 사용하여 웹을 검색합니다",
"elasticsearch_desc": "Elasticsearch에 연결하여 문서, 로그, 메트릭을 색인하고 검색합니다.",
"baidu_desc": "Baidu AI Search API를 사용하여 중국어 웹을 검색합니다",
"slack_desc": "Slack 워크스페이스에 연결하여 메시지와 채널에 접근합니다.",
"teams_desc": "Microsoft Teams에 연결하여 팀의 대화 내용에 접근합니다.",
"discord_desc": "Discord 서버에 연결하여 메시지와 채널에 접근합니다.",
"linear_desc": "Linear에 연결하여 이슈, 댓글, 프로젝트 데이터를 검색합니다.",
"jira_desc": "Jira에 연결하여 이슈, 티켓, 프로젝트 데이터를 검색합니다.",
"clickup_desc": "ClickUp에 연결하여 작업, 댓글, 프로젝트 데이터를 검색합니다.",
"notion_desc": "Notion 워크스페이스에 연결하여 페이지와 데이터베이스에 접근합니다.",
"github_desc": "GitHub PAT를 연결하여 접근 가능한 저장소의 코드와 문서를 색인합니다.",
"confluence_desc": "Confluence에 연결하여 페이지, 댓글, 문서를 검색합니다.",
"bookstack_desc": "BookStack에 연결하여 위키 페이지와 문서를 검색합니다.",
"airtable_desc": "Airtable에 연결하여 레코드, 테이블, 데이터베이스 콘텐츠를 검색합니다.",
"luma_desc": "Luma에 연결하여 이벤트, 모임을 검색합니다.",
"circleback_desc": "Circleback에서 웹훅을 통해 회의 노트, 녹취록, 액션 아이템을 받습니다.",
"calendar_desc": "Google Calendar에 연결하여 이벤트, 회의, 일정을 검색합니다.",
"gmail_desc": "Gmail 계정에 연결하여 이메일을 검색합니다.",
"google_drive_desc": "Google Drive에 연결하여 파일과 문서를 색인하고 검색합니다.",
"zoom_desc": "Zoom에 연결하여 회의 녹화본과 녹취록에 접근합니다.",
"webcrawler_desc": "공개된 모든 웹페이지의 콘텐츠를 크롤링하고 색인합니다."
},
"upload_documents": {
"title": "문서 업로드",
"subtitle": "파일을 업로드하여 AI 기반 대화를 통해 검색하고 활용할 수 있도록 만드세요.",
"file_size_limit": "파일당 최대 크기: 500MB",
"drop_files": "파일이나 폴더를 여기에 놓으세요",
"drag_drop": "파일이나 폴더를 여기로 드래그 앤 드롭하세요",
"drag_drop_more": "파일을 더 추가하려면 놓거나 찾아보세요",
"or_browse": "또는 클릭하여 찾아보기",
"browse_files": "파일 찾아보기",
"browse_folder": "폴더 찾아보기",
"selected_files": "{count}개 파일 선택됨",
"total_size": "전체 크기",
"clear_all": "모두 지우기",
"uploading_files": "파일 업로드 중",
"uploading": "업로드 중",
"upload_button": "{count}개 파일 업로드",
"upload_initiated": "업로드 작업 시작됨",
"upload_initiated_desc": "파일 업로드가 시작되었습니다",
"upload_error": "업로드 오류",
"upload_error_desc": "파일 업로드 중 오류가 발생했습니다",
"supported_file_types": "지원되는 파일 형식",
"file_too_large": "파일이 너무 큽니다",
"file_too_large_desc": "\"{name}\"이(가) 파일당 제한 용량인 {maxMB}MB를 초과합니다.",
"no_supported_files_in_folder": "선택한 폴더에서 지원되는 파일 형식을 찾을 수 없습니다.",
"uploading_folder": "폴더 업로드 중…",
"upload_folder_button": "폴더 업로드 ({count}개 파일)",
"select_files_or_folder": "파일 또는 폴더 선택",
"tap_select_files_or_folder": "탭하여 파일 또는 폴더 선택",
"processing_mode": "처리 모드",
"basic_mode": "기본",
"basic_mode_desc": "표준 처리 (페이지당 1 크레딧)",
"premium_mode": "프리미엄",
"premium_mode_desc": "금융, 의료, 법률 문서에 최적화 (페이지당 10 크레딧)"
},
"add_webpage": {
"title": "크롤링할 웹페이지 추가",
"subtitle": "일괄 색인 및 주기적 동기화를 위해 지식 베이스에 웹페이지를 추가하세요",
"label": "크롤링할 URL 입력",
"placeholder": "URL을 입력하고 Enter를 누르세요",
"hint": "각 URL 입력 후 Enter를 눌러 여러 개를 추가할 수 있습니다",
"tips_title": "URL 크롤링 팁:",
"tip_1": "http:// 또는 https://를 포함한 전체 URL을 입력하세요",
"tip_2": "웹사이트가 크롤링을 허용하는지 확인하세요",
"tip_3": "공개 웹페이지가 가장 잘 작동합니다",
"tip_4": "크롤링은 웹사이트 크기에 따라 시간이 걸릴 수 있습니다",
"chat_tip": "색인 없이 웹페이지에서 빠른 답변을 얻고 싶으신가요? URL을 채팅에 바로 붙여넣으세요.",
"cancel": "취소",
"submit": "크롤링할 URL 제출",
"submitting": "제출 중...",
"error_no_url": "URL을 하나 이상 추가해주세요",
"error_invalid_urls": "유효하지 않은 URL이 발견되었습니다: {urls}",
"crawling_toast": "URL 크롤링",
"crawling_toast_desc": "URL 크롤링 프로세스를 시작합니다...",
"success_toast": "크롤링 성공",
"success_toast_desc": "URL이 크롤링을 위해 제출되었습니다",
"error_toast": "크롤링 오류",
"error_toast_desc": "URL 크롤링 중 오류가 발생했습니다",
"error_generic": "URL 크롤링 중 오류가 발생했습니다",
"invalid_url_toast": "유효하지 않은 URL",
"invalid_url_toast_desc": "유효한 URL을 입력해주세요",
"duplicate_url_toast": "중복된 URL",
"duplicate_url_toast_desc": "이미 추가된 URL입니다"
},
"add_youtube": {
"title": "유튜브 동영상 추가",
"subtitle": "지식 베이스에 유튜브 동영상이나 재생목록을 추가하세요",
"label": "유튜브 동영상 또는 재생목록 URL",
"placeholder": "유튜브 동영상 또는 재생목록 URL을 붙여넣으세요",
"hint": "유튜브 URL을 붙여넣으면 자동으로 추가됩니다. URL을 입력하고 Enter를 눌러도 됩니다.",
"tips_title": "유튜브 동영상 추가 팁:",
"tip_1": "표준 유튜브 URL을 사용하세요 (youtube.com/watch?v= 또는 youtu.be/)",
"tip_2": "동영상이 공개적으로 접근 가능한지 확인하세요",
"tip_3": "지원 형식: youtube.com/watch?v=VIDEO_ID 또는 youtu.be/VIDEO_ID",
"tip_4": "처리는 동영상 길이에 따라 시간이 걸릴 수 있습니다",
"tip_5": "재생목록 URL(youtube.com/playlist?list=...)을 붙여넣으면 모든 동영상이 한 번에 추가됩니다",
"chat_tip": "지식 베이스에 저장하지 않고 빠르게 요약만 원하시나요? 유튜브 링크를 채팅에 바로 붙여넣으세요.",
"preview": "미리보기",
"cancel": "취소",
"submit": "추가",
"processing": "처리 중...",
"error_no_video": "유튜브 동영상 URL을 하나 이상 추가해주세요",
"error_invalid_urls": "유효하지 않은 유튜브 URL이 발견되었습니다: {urls}",
"processing_toast": "유튜브 동영상 처리 중",
"processing_toast_desc": "유튜브 동영상 처리를 시작합니다...",
"success_toast": "처리 성공",
"success_toast_desc": "유튜브 동영상이 처리를 위해 제출되었습니다",
"error_toast": "처리 오류",
"error_toast_desc": "유튜브 동영상 처리 중 오류가 발생했습니다",
"error_generic": "유튜브 동영상 처리 중 오류가 발생했습니다",
"invalid_url_toast": "유효하지 않은 유튜브 URL",
"invalid_url_toast_desc": "유효한 유튜브 동영상 또는 재생목록 URL을 입력해주세요",
"duplicate_url_toast": "중복된 URL",
"duplicate_url_toast_desc": "이미 추가된 유튜브 동영상입니다",
"resolving_playlist": "재생목록 동영상을 확인하는 중...",
"resolving_playlist_toast": "재생목록 확인 중",
"resolving_playlist_toast_desc": "재생목록에서 동영상 목록을 가져오는 중입니다...",
"playlist_resolved_toast": "재생목록 확인 완료",
"playlist_resolved_toast_desc": "재생목록에서 {count}개의 동영상이 추가되었습니다",
"playlist_error_toast": "재생목록 오류"
},
"settings": {
"title": "설정",
"subtitle": "이 워크스페이스의 LLM 설정과 역할 할당을 관리하세요.",
"back_to_dashboard": "대시보드로 돌아가기",
"models": "모델",
"roles": "역할",
"llm_role_management": "LLM 역할 관리",
"llm_role_desc": "LLM 설정을 다양한 목적에 맞는 특정 역할에 할당하세요.",
"no_llm_configs_found": "LLM 설정을 찾을 수 없습니다. 역할을 할당하기 전에 모델 설정 탭에서 LLM 제공업체를 하나 이상 추가해주세요.",
"select_llm_config": "LLM 설정 선택",
"long_context_llm": "긴 컨텍스트 LLM",
"fast_llm": "빠른 LLM",
"strategic_llm": "전략적 LLM",
"long_context_desc": "긴 문서 요약과 복잡한 질의응답을 처리합니다",
"long_context_examples": "문서 분석, 리서치 종합, 복잡한 질의응답",
"large_context_window": "넓은 컨텍스트 윈도우",
"deep_reasoning": "심층 추론",
"complex_analysis": "복잡한 분석",
"fast_llm_desc": "빠른 응답과 실시간 상호작용에 최적화됨",
"fast_llm_examples": "빠른 검색, 간단한 질문, 즉각적인 응답",
"low_latency": "낮은 지연 시간",
"quick_responses": "빠른 응답",
"real_time_chat": "실시간 채팅",
"strategic_llm_desc": "계획 수립과 전략적 의사결정을 위한 고급 추론",
"strategic_llm_examples": "워크플로우 계획, 전략적 분석, 복잡한 문제 해결",
"strategic_thinking": "전략적 사고",
"long_term_planning": "장기 계획",
"complex_reasoning": "복잡한 추론",
"use_cases": "사용 사례",
"assign_llm_config": "LLM 설정 할당",
"unassigned": "미할당",
"assigned": "할당됨",
"model": "모델",
"base": "기본",
"all_roles_assigned": "모든 역할이 할당되어 사용 준비가 완료되었습니다! LLM 설정이 완료되었습니다.",
"save_changes": "변경 사항 저장",
"saving": "저장 중",
"reset": "재설정",
"status": "상태",
"status_ready": "준비 완료",
"status_setup": "설정 필요",
"complete_role_assignments": "모든 기능을 사용하려면 모든 역할 할당을 완료하세요. 각 역할은 워크플로우에서 서로 다른 목적을 수행합니다.",
"all_roles_saved": "모든 역할이 할당되고 저장되었습니다!",
"progress": "진행 상황",
"roles_assigned_count": "{total}개 중 {assigned}개 역할 할당됨"
},
"logs": {
"title": "작업 로그",
"subtitle": "모든 작업 실행 로그를 모니터링하고 분석하세요",
"refresh": "새로고침",
"delete_selected": "선택 항목 삭제",
"confirm_title": "정말로 진행하시겠습니까?",
"confirm_delete_desc": "이 작업은 되돌릴 수 없습니다. 선택한 로그 {count}개가 영구적으로 삭제됩니다.",
"cancel": "취소",
"delete": "삭제",
"level": "수준",
"status": "상태",
"source": "출처",
"message": "메시지",
"created_at": "생성일",
"actions": "작업",
"system": "시스템",
"filter_by_message": "메시지로 필터링...",
"filter_by": "필터링 기준",
"total_logs": "전체 로그",
"active_tasks": "활성 작업",
"success_rate": "성공률",
"recent_failures": "최근 실패",
"last_hours": "최근 {hours}시간",
"currently_running": "실행 중",
"successful": "성공",
"need_attention": "확인 필요",
"no_logs": "로그를 찾을 수 없습니다",
"loading": "로그 로딩 중...",
"error_loading": "로그를 불러오는 중 오류가 발생했습니다",
"columns": "열",
"failed_load_summary": "요약을 불러오지 못했습니다",
"retry": "다시 시도",
"view": "보기",
"toggle_columns": "열 표시 전환",
"rows_per_page": "페이지당 행 수",
"view_metadata": "메타데이터 보기",
"log_deleted_success": "로그가 성공적으로 삭제되었습니다",
"log_deleted_error": "로그 삭제에 실패했습니다",
"confirm_delete_log_title": "확인하시겠습니까?",
"confirm_delete_log_desc": "이 작업은 되돌릴 수 없습니다. 로그 항목이 영구적으로 삭제됩니다.",
"deleting": "삭제 중"
},
"onboard": {
"welcome_title": "SurfSense에 오신 것을 환영합니다",
"welcome_subtitle": "시작하려면 LLM 설정을 구성해보세요",
"step_of": "{total}단계 중 {current}단계",
"percent_complete": "{percent}% 완료",
"add_llm_provider": "LLM 제공업체 추가",
"assign_llm_roles": "LLM 역할 할당",
"setup_llm_configuration": "LLM 설정 구성",
"configure_providers_and_assign_roles": "LLM 제공업체를 추가하고 특정 역할에 할당하세요",
"assign_llm_roles_title": "LLM 역할 할당",
"complete_role_assignment": "계속하려면 LLM 설정을 특정 역할에 할당하세요",
"setup_complete": "설정 완료",
"configure_first_provider": "첫 모델 제공업체를 구성하세요",
"assign_specific_roles": "LLM 설정에 특정 역할을 할당하세요",
"all_set": "SurfSense를 사용할 준비가 모두 끝났습니다!",
"loading_config": "설정을 불러오는 중...",
"previous": "이전",
"next": "다음",
"complete_setup": "설정 완료",
"add_provider_instruction": "계속하려면 LLM 제공업체를 하나 이상 추가하세요. 다음 단계에서 여러 제공업체를 구성하고 각각에 특정 역할을 선택할 수 있습니다.",
"your_llm_configs": "내 LLM 설정",
"model": "모델",
"language": "언어",
"base": "기본",
"add_provider_title": "LLM 제공업체 추가",
"add_provider_subtitle": "시작하려면 첫 모델 제공업체를 구성하세요",
"add_provider_button": "제공업체 추가",
"add_new_llm_provider": "새 LLM 제공업체 추가",
"configure_new_provider": "AI 어시스턴트를 위한 새 언어 모델 제공업체를 구성하세요",
"config_name": "설정 이름",
"config_name_required": "설정 이름 *",
"config_name_placeholder": "예: My OpenAI GPT-4",
"provider": "제공업체",
"provider_required": "제공업체 *",
"provider_placeholder": "제공업체 선택",
"language_optional": "언어 (선택 사항)",
"language_placeholder": "언어 선택",
"custom_provider_name": "사용자 지정 제공업체 이름 *",
"custom_provider_placeholder": "예: my-custom-provider",
"model_name_required": "모델 이름 *",
"model_name_placeholder": "예: gpt-4",
"examples": "예시",
"api_key_required": "API 키 *",
"api_key_placeholder": "API 키",
"api_base_optional": "API 베이스 URL (선택 사항)",
"api_base_placeholder": "예: https://api.openai.com/v1",
"adding": "추가 중...",
"add_provider": "제공업체 추가",
"cancel": "취소",
"assign_roles_instruction": "LLM 설정을 특정 역할에 할당하세요. 각 역할은 워크플로우에서 서로 다른 목적을 수행합니다.",
"no_llm_configs_found": "LLM 설정을 찾을 수 없습니다",
"add_provider_before_roles": "역할을 할당하기 전에 이전 단계에서 LLM 제공업체를 하나 이상 추가해주세요.",
"long_context_llm_title": "긴 컨텍스트 LLM",
"long_context_llm_desc": "긴 문서 요약과 복잡한 질의응답을 처리합니다",
"long_context_llm_examples": "문서 분석, 리서치 종합, 복잡한 질의응답",
"fast_llm_title": "빠른 LLM",
"fast_llm_desc": "빠른 응답과 실시간 상호작용에 최적화됨",
"fast_llm_examples": "빠른 검색, 간단한 질문, 즉각적인 응답",
"strategic_llm_title": "전략적 LLM",
"strategic_llm_desc": "계획 수립과 전략적 의사결정을 위한 고급 추론",
"strategic_llm_examples": "워크플로우 계획, 전략적 분석, 복잡한 문제 해결",
"use_cases": "사용 사례",
"assign_llm_config": "LLM 설정 할당",
"select_llm_config": "LLM 설정 선택",
"assigned": "할당됨",
"all_roles_assigned_saved": "모든 역할이 할당되고 저장되었습니다!",
"progress": "진행 상황",
"roles_assigned": "{total}개 중 {assigned}개 역할 할당됨",
"global_configs": "전역 설정",
"your_configs": "내 설정"
},
"model_config": {
"title": "모델 설정",
"subtitle": "LLM 제공업체 설정과 API 설정을 관리하세요.",
"refresh": "새로고침",
"loading": "설정 로딩 중...",
"total_configs": "전체 설정",
"unique_providers": "고유 제공업체",
"system_status": "시스템 상태",
"active": "활성",
"your_configs": "내 설정",
"manage_configs": "LLM 제공업체를 관리하고 구성하세요",
"no_configs": "아직 설정이 없습니다",
"no_configs_desc": "자체 LLM 제공업체 설정을 추가하세요.",
"add_first_config": "첫 설정 추가",
"created": "생성됨"
},
"sidebar": {
"recents": "최근 항목",
"chats": "채팅",
"shared_chats": "공유된 채팅",
"search_chats": "채팅 검색",
"no_chats_found": "채팅을 찾을 수 없습니다",
"no_shared_chats": "공유된 채팅이 없습니다",
"shared_chat": "공유된 채팅",
"view_all_shared_chats": "공유된 모든 채팅 보기",
"view_all_chats": "모든 채팅 보기",
"show_all": "모두 보기",
"hide": "숨기기",
"no_chats": "채팅이 없습니다",
"start_new_chat_hint": "새 채팅 시작하기",
"error_loading_chats": "채팅을 불러오는 중 오류가 발생했습니다",
"chat_deleted": "채팅이 성공적으로 삭제되었습니다",
"error_deleting_chat": "채팅 삭제에 실패했습니다",
"delete": "삭제",
"try_different_search": "다른 검색어를 시도해보세요",
"updated": "업데이트됨",
"more_options": "추가 옵션",
"clear_search": "검색 지우기",
"archive": "보관",
"unarchive": "복원",
"chat_archived": "채팅이 보관되었습니다",
"chat_unarchived": "채팅이 복원되었습니다",
"chat_renamed": "채팅 이름이 변경되었습니다",
"error_renaming_chat": "채팅 이름 변경에 실패했습니다",
"rename": "이름 변경",
"rename_chat": "채팅 이름 변경",
"rename_chat_description": "이 대화의 새 이름을 입력하세요.",
"chat_title_placeholder": "채팅 제목",
"renaming": "이름 변경 중",
"no_archived_chats": "보관된 채팅이 없습니다",
"error_archiving_chat": "채팅 보관에 실패했습니다",
"new_chat": "새 채팅",
"select_workspace": "워크스페이스 선택",
"manage_members": "멤버 관리",
"workspace_settings": "워크스페이스 설정",
"logs": "로그",
"see_all_workspaces": "모든 워크스페이스 보기",
"expand_sidebar": "사이드바 펼치기",
"collapse_sidebar": "사이드바 접기",
"user_settings": "사용자 설정",
"language": "언어",
"theme": "테마",
"light": "라이트",
"dark": "다크",
"system": "시스템",
"logout": "로그아웃",
"loggingOut": "로그아웃 중...",
"learn_more": "더 알아보기",
"documentation": "문서",
"github": "GitHub",
"download_for_os": "{os}용 다운로드",
"inbox": "받은 편지함",
"search_inbox": "받은 편지함 검색",
"mark_all_read": "모두 읽음으로 표시",
"mark_as_read": "읽음으로 표시",
"mentions": "멘션",
"comments": "댓글",
"status": "상태",
"no_results_found": "결과를 찾을 수 없습니다",
"no_mentions": "멘션이 없습니다",
"no_mentions_hint": "다른 사람이 남긴 멘션이 여기에 표시됩니다",
"no_comments": "댓글이 없습니다",
"no_comments_hint": "멘션과 답글이 여기에 표시됩니다",
"no_status_updates": "상태 업데이트가 없습니다",
"no_status_updates_hint": "문서 및 커넥터 업데이트가 여기에 표시됩니다",
"filter": "필터",
"all": "전체",
"unread": "읽지 않음",
"errors_only": "오류만",
"connectors": "커넥터",
"all_connectors": "모든 커넥터",
"sources": "소스",
"all_sources": "모든 소스",
"close": "닫기",
"cancel": "취소"
},
"errors": {
"something_went_wrong": "문제가 발생했습니다",
"try_again": "다시 시도해주세요",
"not_found": "찾을 수 없음",
"unauthorized": "인증되지 않음",
"forbidden": "접근 금지",
"server_error": "서버 오류",
"network_error": "네트워크 오류"
},
"workspaceSettings": {
"title": "워크스페이스 설정",
"back_to_app": "앱으로 돌아가기",
"nav_general": "일반",
"nav_general_desc": "이름, 설명 및 기본 정보",
"nav_models": "모델",
"nav_agent_models": "채팅 모델",
"nav_agent_models_desc": "프롬프트와 인용을 포함한 모델",
"nav_system_instructions": "시스템 지침",
"nav_system_instructions_desc": "워크스페이스 전체 AI 지침",
"nav_public_links": "공개 채팅",
"nav_public_links_desc": "공개적으로 공유된 채팅 관리",
"nav_team_roles": "팀 역할",
"nav_team_roles_desc": "팀 역할 및 권한 관리",
"general_name_label": "이름",
"general_name_placeholder": "워크스페이스 이름을 입력하세요",
"general_name_description": "워크스페이스의 고유한 이름입니다.",
"general_description_label": "설명",
"general_description_placeholder": "워크스페이스 설명을 입력하세요",
"general_description_description": "이 워크스페이스가 어떤 용도로 사용되는지에 대한 간단한 설명입니다.",
"general_reset": "변경 사항 재설정",
"general_save": "변경 사항 저장",
"general_saving": "저장 중",
"general_unsaved_changes": "저장하지 않은 변경 사항이 있습니다. 적용하려면 \"변경 사항 저장\"을 클릭하세요."
},
"homepage": {
"hero_title_part1": "팀을 위한",
"hero_title_part2": "AI 워크스페이스",
"hero_description": "데이터 제한 없이 팀을 위한 개인정보 보호 중심의 오픈소스 NotebookLM 대안입니다.",
"cta_start_trial": "무료 체험 시작",
"cta_explore": "둘러보기",
"integrations_title": "통합",
"integrations_subtitle": "팀의 가장 중요한 도구들과 통합하세요",
"features_title": "팀을 위한 AI 기반 지식 허브",
"features_subtitle": "협업을 강화하고, 생산성을 높이고, 워크플로우를 간소화하도록 설계된 강력한 기능들.",
"feature_workflow_title": "간소화된 워크플로우",
"feature_workflow_desc": "모든 지식과 리소스를 하나의 지능형 워크스페이스에 집중시키세요. 필요한 것을 즉시 찾아 의사결정 속도를 높이세요.",
"feature_collaboration_title": "매끄러운 협업",
"feature_collaboration_desc": "팀 전체를 하나로 정렬시키는 실시간 협업 도구로 손쉽게 함께 작업하세요.",
"feature_customizable_title": "완벽한 커스터마이징",
"feature_customizable_desc": "100개 이상의 선도적인 LLM 중에서 선택하고 필요에 따라 모든 모델을 원활하게 호출하세요.",
"cta_transform": "팀의",
"cta_transform_bold": "탐색과 협업 방식을 혁신하세요",
"cta_unite_start": "지능형 검색으로",
"cta_unite_knowledge": "팀의 지식을",
"cta_unite_middle": "하나의 협업 공간에서",
"cta_unite_search": "통합하세요",
"cta_talk_to_us": "문의하기",
"features": {
"find_ask_act": {
"title": "찾고, 묻고, 실행하기",
"description": "회사와 개인 지식 전반에서 즉각적인 정보, 상세한 업데이트, 출처가 명시된 답변을 얻으세요."
},
"real_time_collab": {
"title": "실시간으로 함께 작업하기",
"description": "회사 문서를 실시간 편집, 동기화된 콘텐츠, 현재 접속 상태가 반영되는 다중 사용자 공간으로 전환하세요."
},
"beyond_text": {
"title": "텍스트를 넘어선 협업",
"description": "팀이 함께 댓글을 남기고, 공유하고, 다듬을 수 있는 팟캐스트와 멀티미디어를 제작하세요."
},
"context_counts": {
"title": "맥락이 중요한 곳에",
"description": "채팅과 문서에 직접 댓글을 추가하여 명확하고 즉각적인 피드백을 남기세요."
},
"citation_illustration_title": "클릭 가능한 출처 참조를 보여주는 인용 기능 일러스트",
"referenced_chunk": "참조된 청크",
"collab_illustration_label": "텍스트 편집기에서의 실시간 협업 일러스트.",
"real_time": "실시간",
"collab_part1": "협",
"collab_part2": "",
"collab_part3": "업",
"annotation_illustration_label": "주석 댓글이 있는 텍스트 편집기 일러스트.",
"add_context_with": "다음으로 맥락 추가",
"comments": "댓글",
"example_comment": "내일 이 이야기를 나눠봐요!"
}
},
"public_chat": {
"not_found_title": "이 채팅은 삭제되었습니다.",
"click_here": "여기를 클릭",
"sign_in_prompt": "하여 SurfSense에 로그인하고 나만의 채팅을 시작해보세요."
}
}