ko.ts 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582
  1. import { SubmitKey } from "../store/config";
  2. import type { PartialLocaleType } from "./index";
  3. import { getClientConfig } from "../config/client";
  4. import { SAAS_CHAT_URL } from "@/app/constant";
  5. const SAAS_CHAT_URL_WITH_PARAM = `${SAAS_CHAT_URL}?data=chat`;
  6. const isApp = !!getClientConfig()?.isApp;
  7. const ko: PartialLocaleType = {
  8. WIP: "곧 출시 예정...",
  9. Error: {
  10. Unauthorized: isApp
  11. ? `😆 대화 중 문제가 발생했습니다, 걱정하지 마세요:
  12. \\ 1️⃣ 제로 구성으로 시작하고 싶다면, [여기를 클릭하여 즉시 대화를 시작하세요 🚀](${SAAS_CHAT_URL_WITH_PARAM})
  13. \\ 2️⃣ 자신의 OpenAI 리소스를 사용하고 싶다면, [여기를 클릭하여](/#/settings) 설정을 수정하세요 ⚙️`
  14. : `😆 대화 중 문제가 발생했습니다, 걱정하지 마세요:
  15. \ 1️⃣ 제로 구성으로 시작하고 싶다면, [여기를 클릭하여 즉시 대화를 시작하세요 🚀](${SAAS_CHAT_URL_WITH_PARAM})
  16. \ 2️⃣ 개인 배포 버전을 사용하고 있다면, [여기를 클릭하여](/#/auth) 접근 키를 입력하세요 🔑
  17. \ 3️⃣ 자신의 OpenAI 리소스를 사용하고 싶다면, [여기를 클릭하여](/#/settings) 설정을 수정하세요 ⚙️
  18. `,
  19. },
  20. Auth: {
  21. Title: "비밀번호 필요",
  22. Tips: "관리자가 비밀번호 인증을 활성화했습니다. 아래에 접근 코드를 입력하십시오.",
  23. SubTips: "또는 OpenAI 또는 Google API 키를 입력하십시오.",
  24. Input: "여기에 접근 코드를 입력하십시오.",
  25. Confirm: "확인",
  26. Later: "나중에 하기",
  27. Return: "돌아가기",
  28. SaasTips: "설정이 너무 복잡합니다. 즉시 사용하고 싶습니다.",
  29. TopTips:
  30. "🥳 NextChat AI 출시 기념 할인, 지금 OpenAI o1, GPT-4o, Claude-3.5 및 최신 대형 모델을 해제하세요",
  31. },
  32. ChatItem: {
  33. ChatItemCount: (count: number) => `${count} 개의 대화`,
  34. },
  35. Chat: {
  36. SubTitle: (count: number) => `총 ${count} 개의 대화`,
  37. EditMessage: {
  38. Title: "메시지 기록 편집",
  39. Topic: {
  40. Title: "채팅 주제",
  41. SubTitle: "현재 채팅 주제 변경",
  42. },
  43. },
  44. Actions: {
  45. ChatList: "메시지 목록 보기",
  46. CompressedHistory: "압축된 히스토리 프롬프트 보기",
  47. Export: "채팅 기록 내보내기",
  48. Copy: "복사",
  49. Stop: "정지",
  50. Retry: "다시 시도",
  51. Pin: "고정",
  52. PinToastContent: "1 개의 대화를 프롬프트에 고정했습니다.",
  53. PinToastAction: "보기",
  54. Delete: "삭제",
  55. Edit: "편집",
  56. RefreshTitle: "제목 새로고침",
  57. RefreshToast: "제목 새로고침 요청이 전송되었습니다",
  58. },
  59. Commands: {
  60. new: "새 채팅",
  61. newm: "마스크에서 새 채팅",
  62. next: "다음 채팅",
  63. prev: "이전 채팅",
  64. clear: "컨텍스트 지우기",
  65. del: "채팅 삭제",
  66. },
  67. InputActions: {
  68. Stop: "응답 중지",
  69. ToBottom: "최신으로 스크롤",
  70. Theme: {
  71. auto: "자동 테마",
  72. light: "라이트 모드",
  73. dark: "다크 모드",
  74. },
  75. Prompt: "빠른 명령",
  76. Masks: "모든 마스크",
  77. Clear: "채팅 지우기",
  78. Settings: "채팅 설정",
  79. UploadImage: "이미지 업로드",
  80. },
  81. Rename: "채팅 이름 변경",
  82. Typing: "입력 중…",
  83. Input: (submitKey: string) => {
  84. var inputHints = `${submitKey} 전송`;
  85. if (submitKey === String(SubmitKey.Enter)) {
  86. inputHints += ",Shift + Enter 줄 바꿈";
  87. }
  88. return inputHints + ",/ 자동 완성,: 명령어 입력";
  89. },
  90. Send: "전송",
  91. Config: {
  92. Reset: "기억 지우기",
  93. SaveAs: "마스크로 저장",
  94. },
  95. IsContext: "프롬프트 설정",
  96. },
  97. Export: {
  98. Title: "채팅 기록 공유",
  99. Copy: "모두 복사",
  100. Download: "파일 다운로드",
  101. Share: "ShareGPT에 공유",
  102. MessageFromYou: "사용자",
  103. MessageFromChatGPT: "ChatGPT",
  104. Format: {
  105. Title: "내보내기 형식",
  106. SubTitle: "Markdown 텍스트 또는 PNG 이미지로 내보낼 수 있습니다.",
  107. },
  108. IncludeContext: {
  109. Title: "프롬프트 컨텍스트 포함",
  110. SubTitle: "메시지에 프롬프트 컨텍스트를 표시할지 여부",
  111. },
  112. Steps: {
  113. Select: "선택",
  114. Preview: "미리보기",
  115. },
  116. Image: {
  117. Toast: "스크린샷 생성 중",
  118. Modal: "길게 누르거나 오른쪽 클릭하여 이미지를 저장하십시오.",
  119. },
  120. },
  121. Select: {
  122. Search: "메시지 검색",
  123. All: "모두 선택",
  124. Latest: "최근 몇 개",
  125. Clear: "선택 지우기",
  126. },
  127. Memory: {
  128. Title: "기록 요약",
  129. EmptyContent: "대화 내용이 너무 짧아 요약할 필요 없음",
  130. Send: "자동으로 채팅 기록을 압축하여 컨텍스트로 전송",
  131. Copy: "요약 복사",
  132. Reset: "[사용되지 않음]",
  133. ResetConfirm: "기록 요약을 지우겠습니까?",
  134. },
  135. Home: {
  136. NewChat: "새 채팅",
  137. DeleteChat: "선택한 대화를 삭제하시겠습니까?",
  138. DeleteToast: "대화가 삭제되었습니다.",
  139. Revert: "되돌리기",
  140. },
  141. Settings: {
  142. Title: "설정",
  143. SubTitle: "모든 설정 옵션",
  144. Danger: {
  145. Reset: {
  146. Title: "모든 설정 초기화",
  147. SubTitle: "모든 설정 항목을 기본값으로 초기화",
  148. Action: "지금 초기화",
  149. Confirm: "모든 설정을 초기화하시겠습니까?",
  150. },
  151. Clear: {
  152. Title: "모든 데이터 지우기",
  153. SubTitle: "모든 채팅 및 설정 데이터 지우기",
  154. Action: "지금 지우기",
  155. Confirm: "모든 채팅 및 설정 데이터를 지우시겠습니까?",
  156. },
  157. },
  158. Lang: {
  159. Name: "Language", // 주의: 새 번역을 추가하려면 이 값을 번역하지 말고 그대로 유지하세요.
  160. All: "모든 언어",
  161. },
  162. Avatar: "아바타",
  163. FontSize: {
  164. Title: "글꼴 크기",
  165. SubTitle: "채팅 내용의 글꼴 크기",
  166. },
  167. FontFamily: {
  168. Title: "채팅 폰트",
  169. SubTitle: "채팅 내용의 폰트, 비워 두면 글로벌 기본 폰트를 적용",
  170. Placeholder: "폰트 이름",
  171. },
  172. InjectSystemPrompts: {
  173. Title: "시스템 수준 프롬프트 삽입",
  174. SubTitle:
  175. "각 요청 메시지 목록의 시작 부분에 ChatGPT 시스템 프롬프트를 강제로 추가",
  176. },
  177. InputTemplate: {
  178. Title: "사용자 입력 전처리",
  179. SubTitle: "사용자의 최신 메시지가 이 템플릿에 채워집니다.",
  180. },
  181. Update: {
  182. Version: (x: string) => `현재 버전: ${x}`,
  183. IsLatest: "최신 버전입니다.",
  184. CheckUpdate: "업데이트 확인",
  185. IsChecking: "업데이트 확인 중...",
  186. FoundUpdate: (x: string) => `새 버전 발견: ${x}`,
  187. GoToUpdate: "업데이트로 이동",
  188. },
  189. SendKey: "전송 키",
  190. Theme: "테마",
  191. TightBorder: "테두리 없는 모드",
  192. SendPreviewBubble: {
  193. Title: "미리보기 버블",
  194. SubTitle: "미리보기 버블에서 Markdown 콘텐츠 미리보기",
  195. },
  196. AutoGenerateTitle: {
  197. Title: "제목 자동 생성",
  198. SubTitle: "대화 내용에 따라 적절한 제목 생성",
  199. },
  200. Sync: {
  201. CloudState: "클라우드 데이터",
  202. NotSyncYet: "아직 동기화되지 않았습니다.",
  203. Success: "동기화 성공",
  204. Fail: "동기화 실패",
  205. Config: {
  206. Modal: {
  207. Title: "클라우드 동기화 구성",
  208. Check: "사용 가능성 확인",
  209. },
  210. SyncType: {
  211. Title: "동기화 유형",
  212. SubTitle: "선호하는 동기화 서버 선택",
  213. },
  214. Proxy: {
  215. Title: "프록시 사용",
  216. SubTitle:
  217. "브라우저에서 동기화할 때 프록시를 활성화하여 교차 출처 제한을 피해야 함",
  218. },
  219. ProxyUrl: {
  220. Title: "프록시 주소",
  221. SubTitle: "이 프로젝트에서 제공하는 교차 출처 프록시만 해당",
  222. },
  223. WebDav: {
  224. Endpoint: "WebDAV 주소",
  225. UserName: "사용자 이름",
  226. Password: "비밀번호",
  227. },
  228. UpStash: {
  229. Endpoint: "UpStash Redis REST URL",
  230. UserName: "백업 이름",
  231. Password: "UpStash Redis REST Token",
  232. },
  233. },
  234. LocalState: "로컬 데이터",
  235. Overview: (overview: any) => {
  236. return `${overview.chat} 회의 대화, ${overview.message} 개의 메시지, ${overview.prompt} 개의 프롬프트, ${overview.mask} 개의 마스크`;
  237. },
  238. ImportFailed: "가져오기 실패",
  239. },
  240. Mask: {
  241. Splash: {
  242. Title: "마스크 시작 페이지",
  243. SubTitle: "새 채팅 시 마스크 시작 페이지 표시",
  244. },
  245. Builtin: {
  246. Title: "내장 마스크 숨기기",
  247. SubTitle: "모든 마스크 목록에서 내장 마스크 숨기기",
  248. },
  249. },
  250. Prompt: {
  251. Disable: {
  252. Title: "프롬프트 자동 완성 비활성화",
  253. SubTitle: "입력 상자 시작 부분에 / 를 입력하여 자동 완성 활성화",
  254. },
  255. List: "사용자 정의 프롬프트 목록",
  256. ListCount: (builtin: number, custom: number) =>
  257. `내장 ${builtin} 개, 사용자 정의 ${custom} 개`,
  258. Edit: "편집",
  259. Modal: {
  260. Title: "프롬프트 목록",
  261. Add: "새로 만들기",
  262. Search: "프롬프트 검색",
  263. },
  264. EditModal: {
  265. Title: "프롬프트 편집",
  266. },
  267. },
  268. HistoryCount: {
  269. Title: "히스토리 메시지 수",
  270. SubTitle: "각 요청에 포함된 히스토리 메시지 수",
  271. },
  272. CompressThreshold: {
  273. Title: "히스토리 메시지 길이 압축 임계값",
  274. SubTitle: "압축되지 않은 히스토리 메시지가 이 값을 초과하면 압축 수행",
  275. },
  276. Usage: {
  277. Title: "잔액 조회",
  278. SubTitle(used: any, total: any) {
  279. return `이번 달 사용된 금액: $${used},총 구독 금액: $${total}`;
  280. },
  281. IsChecking: "확인 중...",
  282. Check: "다시 확인",
  283. NoAccess: "잔액을 보려면 API 키 또는 접근 비밀번호를 입력하십시오.",
  284. },
  285. Access: {
  286. SaasStart: {
  287. Title: "NextChat AI 사용하기",
  288. Label: "(가장 비용 효율적인 솔루션)",
  289. SubTitle:
  290. "NextChat에 의해 공식적으로 유지 관리되며, 제로 구성으로 즉시 사용할 수 있으며, OpenAI o1, GPT-4o, Claude-3.5와 같은 최신 대형 모델을 지원합니다",
  291. ChatNow: "지금 채팅하기",
  292. },
  293. AccessCode: {
  294. Title: "접근 비밀번호",
  295. SubTitle: "관리자가 암호화된 접근을 활성화했습니다.",
  296. Placeholder: "접근 비밀번호를 입력하십시오.",
  297. },
  298. CustomEndpoint: {
  299. Title: "커스텀 엔드포인트",
  300. SubTitle: "커스텀 Azure 또는 OpenAI 서비스를 사용할지 여부",
  301. },
  302. Provider: {
  303. Title: "모델 서비스 제공업체",
  304. SubTitle: "다른 서비스 제공업체로 전환",
  305. },
  306. OpenAI: {
  307. ApiKey: {
  308. Title: "API 키",
  309. SubTitle: "커스텀 OpenAI 키를 사용하여 비밀번호 접근 제한 우회",
  310. Placeholder: "OpenAI API 키",
  311. },
  312. Endpoint: {
  313. Title: "엔드포인트 주소",
  314. SubTitle: "기본 주소 외에 http(s)://을 포함해야 함",
  315. },
  316. },
  317. Azure: {
  318. ApiKey: {
  319. Title: "엔드포인트 키",
  320. SubTitle: "커스텀 Azure 키를 사용하여 비밀번호 접근 제한 우회",
  321. Placeholder: "Azure API 키",
  322. },
  323. Endpoint: {
  324. Title: "엔드포인트 주소",
  325. SubTitle: "예: ",
  326. },
  327. ApiVerion: {
  328. Title: "API 버전 (azure api version)",
  329. SubTitle: "특정 부분 버전 선택",
  330. },
  331. },
  332. Anthropic: {
  333. ApiKey: {
  334. Title: "엔드포인트 키",
  335. SubTitle: "커스텀 Anthropic 키를 사용하여 비밀번호 접근 제한 우회",
  336. Placeholder: "Anthropic API 키",
  337. },
  338. Endpoint: {
  339. Title: "엔드포인트 주소",
  340. SubTitle: "예: ",
  341. },
  342. ApiVerion: {
  343. Title: "API 버전 (claude api version)",
  344. SubTitle: "특정 API 버전 입력",
  345. },
  346. },
  347. Google: {
  348. ApiKey: {
  349. Title: "API 키",
  350. SubTitle: "Google AI에서 API 키를 가져오세요.",
  351. Placeholder: "Google AI Studio API 키 입력",
  352. },
  353. Endpoint: {
  354. Title: "엔드포인트 주소",
  355. SubTitle: "예: ",
  356. },
  357. ApiVersion: {
  358. Title: "API 버전 (gemini-pro 전용)",
  359. SubTitle: "특정 API 버전 선택",
  360. },
  361. GoogleSafetySettings: {
  362. Title: "Google 안전 필터링 수준",
  363. SubTitle: "콘텐츠 필터링 수준 설정",
  364. },
  365. },
  366. Baidu: {
  367. ApiKey: {
  368. Title: "API 키",
  369. SubTitle: "커스텀 Baidu API 키 사용",
  370. Placeholder: "Baidu API 키",
  371. },
  372. SecretKey: {
  373. Title: "Secret 키",
  374. SubTitle: "커스텀 Baidu Secret 키 사용",
  375. Placeholder: "Baidu Secret 키",
  376. },
  377. Endpoint: {
  378. Title: "엔드포인트 주소",
  379. SubTitle: "커스터마이즈는 .env에서 설정",
  380. },
  381. },
  382. ByteDance: {
  383. ApiKey: {
  384. Title: "엔드포인트 키",
  385. SubTitle: "커스텀 ByteDance API 키 사용",
  386. Placeholder: "ByteDance API 키",
  387. },
  388. Endpoint: {
  389. Title: "엔드포인트 주소",
  390. SubTitle: "예: ",
  391. },
  392. },
  393. Alibaba: {
  394. ApiKey: {
  395. Title: "엔드포인트 키",
  396. SubTitle: "커스텀 Alibaba Cloud API 키 사용",
  397. Placeholder: "Alibaba Cloud API 키",
  398. },
  399. Endpoint: {
  400. Title: "엔드포인트 주소",
  401. SubTitle: "예: ",
  402. },
  403. },
  404. CustomModel: {
  405. Title: "커스텀 모델 이름",
  406. SubTitle: "커스텀 모델 옵션 추가, 영어 쉼표로 구분",
  407. },
  408. },
  409. Model: "모델 (model)",
  410. CompressModel: {
  411. Title: "압축 모델",
  412. SubTitle: "기록을 압축하는 데 사용되는 모델",
  413. },
  414. Temperature: {
  415. Title: "무작위성 (temperature)",
  416. SubTitle: "값이 클수록 응답이 더 무작위적",
  417. },
  418. TopP: {
  419. Title: "탑 P 샘플링 (top_p)",
  420. SubTitle: "무작위성과 유사하지만, 무작위성과 함께 변경하지 마십시오.",
  421. },
  422. MaxTokens: {
  423. Title: "단일 응답 제한 (max_tokens)",
  424. SubTitle: "단일 상호작용에 사용되는 최대 토큰 수",
  425. },
  426. PresencePenalty: {
  427. Title: "주제 신선도 (presence_penalty)",
  428. SubTitle: "값이 클수록 새로운 주제로 확장할 가능성이 높음",
  429. },
  430. FrequencyPenalty: {
  431. Title: "빈도 벌점 (frequency_penalty)",
  432. SubTitle: "값이 클수록 중복 단어 감소 가능성 높음",
  433. },
  434. },
  435. Store: {
  436. DefaultTopic: "새 채팅",
  437. BotHello: "무엇을 도와드릴까요?",
  438. Error: "오류가 발생했습니다. 나중에 다시 시도해 주세요.",
  439. Prompt: {
  440. History: (content: string) => "이것은 이전 채팅 요약입니다: " + content,
  441. Topic:
  442. "네 글자에서 다섯 글자로 이 문장의 간략한 주제를 반환하세요. 설명이나 문장 부호, 어미, 불필요한 텍스트, 굵은 글씨는 필요 없습니다. 주제가 없다면 '잡담'이라고만 반환하세요.",
  443. Summarize:
  444. "대화 내용을 간략히 요약하여 후속 컨텍스트 프롬프트로 사용하세요. 200자 이내로 작성하세요.",
  445. },
  446. },
  447. Copy: {
  448. Success: "클립보드에 복사되었습니다.",
  449. Failed: "복사 실패, 클립보드 권한을 부여해주세요.",
  450. },
  451. Download: {
  452. Success: "내용이 디렉토리에 다운로드되었습니다.",
  453. Failed: "다운로드 실패.",
  454. },
  455. Context: {
  456. Toast: (x: any) => ` ${x} 개의 프리셋 프롬프트 포함됨`,
  457. Edit: "현재 대화 설정",
  458. Add: "대화 추가",
  459. Clear: "컨텍스트가 지워졌습니다.",
  460. Revert: "컨텍스트 복원",
  461. },
  462. Plugin: {
  463. Name: "플러그인",
  464. },
  465. FineTuned: {
  466. Sysmessage: "당신은 보조자입니다.",
  467. },
  468. SearchChat: {
  469. Name: "검색",
  470. Page: {
  471. Title: "채팅 기록 검색",
  472. Search: "검색어 입력",
  473. NoResult: "결과를 찾을 수 없습니다",
  474. NoData: "데이터가 없습니다",
  475. Loading: "로딩 중",
  476. SubTitle: (count: number) => `${count}개의 결과를 찾았습니다`,
  477. },
  478. Item: {
  479. View: "보기",
  480. },
  481. },
  482. Mask: {
  483. Name: "마스크",
  484. Page: {
  485. Title: "프리셋 캐릭터 마스크",
  486. SubTitle: (count: number) => `${count} 개의 프리셋 캐릭터 정의`,
  487. Search: "캐릭터 마스크 검색",
  488. Create: "새로 만들기",
  489. },
  490. Item: {
  491. Info: (count: number) => ` ${count} 개의 프리셋 대화 포함`,
  492. Chat: "대화",
  493. View: "보기",
  494. Edit: "편집",
  495. Delete: "삭제",
  496. DeleteConfirm: "삭제를 확인하시겠습니까?",
  497. },
  498. EditModal: {
  499. Title: (readonly: boolean) =>
  500. `프리셋 마스크 편집 ${readonly ? "(읽기 전용)" : ""}`,
  501. Download: "프리셋 다운로드",
  502. Clone: "프리셋 복제",
  503. },
  504. Config: {
  505. Avatar: "캐릭터 아바타",
  506. Name: "캐릭터 이름",
  507. Sync: {
  508. Title: "전역 설정 사용",
  509. SubTitle: "현재 대화가 전역 모델 설정을 사용하는지 여부",
  510. Confirm:
  511. "현재 대화의 사용자 정의 설정이 자동으로 덮어쓰여질 것입니다. 전역 설정을 활성화하시겠습니까?",
  512. },
  513. HideContext: {
  514. Title: "프리셋 대화 숨기기",
  515. SubTitle: "숨기면 프리셋 대화가 채팅 화면에 나타나지 않습니다.",
  516. },
  517. Share: {
  518. Title: "이 마스크 공유하기",
  519. SubTitle: "이 마스크의 직접 링크 생성",
  520. Action: "링크 복사",
  521. },
  522. },
  523. },
  524. NewChat: {
  525. Return: "돌아가기",
  526. Skip: "바로 시작",
  527. NotShow: "다시 보지 않기",
  528. ConfirmNoShow:
  529. "비활성화하시겠습니까? 비활성화 후 언제든지 설정에서 다시 활성화할 수 있습니다.",
  530. Title: "마스크 선택",
  531. SubTitle: "지금 시작하여 마스크 뒤의 사고와 교류해보세요.",
  532. More: "모두 보기",
  533. },
  534. URLCommand: {
  535. Code: "링크에 액세스 코드가 포함되어 있습니다. 자동으로 입력하시겠습니까?",
  536. Settings:
  537. "링크에 프리셋 설정이 포함되어 있습니다. 자동으로 입력하시겠습니까?",
  538. },
  539. UI: {
  540. Confirm: "확인",
  541. Cancel: "취소",
  542. Close: "닫기",
  543. Create: "새로 만들기",
  544. Edit: "편집",
  545. Export: "내보내기",
  546. Import: "가져오기",
  547. Sync: "동기화",
  548. Config: "구성",
  549. },
  550. Exporter: {
  551. Description: {
  552. Title: "컨텍스트가 지워진 후의 메시지만 표시됩니다.",
  553. },
  554. Model: "모델",
  555. Messages: "메시지",
  556. Topic: "주제",
  557. Time: "시간",
  558. },
  559. };
  560. export default ko;