planche 0.8.5 → 0.8.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/app/assets/{DnjY8W6t.js → 0Fs8FEUD.js} +2 -2
  2. package/app/assets/4_c4BD6i.js +1 -0
  3. package/app/assets/{DlKZCiMg.js → 5Jrsnc1i.js} +2 -2
  4. package/app/assets/{C3bMAsUp.js → 7lSlYhqB.js} +1 -1
  5. package/app/assets/AiAiN2FW.js +2 -0
  6. package/app/assets/{BGOnv2_O.js → B2l0e8gZ.js} +1 -1
  7. package/app/assets/{DTxGpkJp.js → B3nhMsGp.js} +1 -1
  8. package/app/assets/BFDfeOJg.js +2 -0
  9. package/app/assets/BHp-ICZv.js +2 -0
  10. package/app/assets/{B8xQ2o-X.js → BLcW8KqJ.js} +1 -1
  11. package/app/assets/BNkgLUl5.js +1 -0
  12. package/app/assets/BVrYyQUV.js +1 -0
  13. package/app/assets/{Dd9Cr3e8.js → BaiI2zwt.js} +1 -1
  14. package/app/assets/{C1RY7wUM.js → BfSKVZnY.js} +1 -1
  15. package/app/assets/BgFzEiCb.css +2 -0
  16. package/app/assets/Bxw3grU1.js +959 -0
  17. package/app/assets/{BIjF9ulh.js → C3S71So3.js} +1 -1
  18. package/app/assets/C5SHWmPn.js +2 -0
  19. package/app/assets/{cc05Z2oj.js → CCwciyHS.js} +1 -1
  20. package/app/assets/{1E6FYbv2.js → CJmQYjPl.js} +1 -1
  21. package/app/assets/{Dh3YJ3G1.js → CKB3jCfp.js} +1 -1
  22. package/app/assets/{og5dTmtH.js → CMRtomUk.js} +1 -1
  23. package/app/assets/CQLuUHsS.js +2 -0
  24. package/app/assets/CRr_nYUE.js +2 -0
  25. package/app/assets/{IzH8qyLi.js → CU8MbklZ.js} +1 -1
  26. package/app/assets/{BdPEUnLq.js → Ca4g4XbM.js} +1 -1
  27. package/app/assets/CgRvgqaA.js +1 -0
  28. package/app/assets/{CfsL8_WC.js → CgWXabLX.js} +1 -1
  29. package/app/assets/{NY_tAtcY.js → ChiscGY_.js} +1 -1
  30. package/app/assets/{DbRMSZEW.js → Cr6Fx4T5.js} +1 -1
  31. package/app/assets/{Cw_LYT6k.js → CtXRSNHU.js} +1 -1
  32. package/app/assets/{Cx_chT_j.js → Cy3jxi5W.js} +1 -1
  33. package/app/assets/{BunrDTHn.js → CyNRK4kc.js} +1 -1
  34. package/app/assets/CytzrZ6l.js +1 -0
  35. package/app/assets/{qbvehL2h.js → D2srGZZJ.js} +2 -2
  36. package/app/assets/{DiaA_DOW.js → D5KYAPHx.js} +1 -1
  37. package/app/assets/{BM5G_YA7.js → D8QuNkWm.js} +1 -1
  38. package/app/assets/{B3uI9Ppb.js → D8WkLv3B.js} +2 -2
  39. package/app/assets/{RIOwEE7M.js → DGXqbK7m.js} +1 -1
  40. package/app/assets/DNpCwjdk.js +1 -0
  41. package/app/assets/{DmejZTwI.js → DQsFpqjm.js} +1 -1
  42. package/app/assets/DTqOQG1i.js +1 -0
  43. package/app/assets/{CkgLFvM5.js → DUyKev3g.js} +1 -1
  44. package/app/assets/DsllOXPq.js +1 -0
  45. package/app/assets/DwhUAD0k.js +1 -0
  46. package/app/assets/{S4Oofhu9.js → GuPQTKm6.js} +1 -1
  47. package/app/assets/{C4il2fft.js → HNvyS0OG.js} +1 -1
  48. package/app/assets/Lv_K3w8K.js +1 -0
  49. package/app/assets/{D-RWduy5.js → RCiVSH3E.js} +1 -1
  50. package/app/assets/{fCzQKDqY.js → Y9NV3E8q.js} +1 -1
  51. package/app/assets/{FnB_uI57.js → c2vgLpEV.js} +1 -1
  52. package/app/assets/{DZH-tLW-.js → c6OX2yNi.js} +1 -1
  53. package/app/assets/{ClyAuDY9.js → fDSXGLmI.js} +2 -2
  54. package/app/assets/{B5OocgEJ.js → kMxR92IL.js} +1 -1
  55. package/app/index.html +16 -14
  56. package/package.json +1 -1
  57. package/app/assets/B-Mrqvrb.css +0 -2
  58. package/app/assets/B3LyCSVJ.js +0 -1
  59. package/app/assets/BXX-BtBa.js +0 -2
  60. package/app/assets/Bpg8LzYe.js +0 -2
  61. package/app/assets/BziT-o8V.js +0 -2
  62. package/app/assets/CChaTOPr.js +0 -1
  63. package/app/assets/COIa4uoZ.js +0 -1
  64. package/app/assets/CWY0kZPK.js +0 -2
  65. package/app/assets/D7Ze5md9.js +0 -959
  66. package/app/assets/D8nrOvmh.js +0 -2
  67. package/app/assets/DFNc4ghA.js +0 -1
  68. package/app/assets/DGD5v9rw.js +0 -1
  69. package/app/assets/D_2UqK4k.js +0 -1
  70. package/app/assets/QBd1UkiI.js +0 -1
  71. package/app/assets/dxLVUFtU.js +0 -1
  72. package/app/assets/u80owQsI.js +0 -2
@@ -1 +1 @@
1
- import{n as e}from"./XzPc-eVf.js";import{l as t,m as n,t as r}from"./CKOS5Y-e.js";import{a as i,i as a,n as o,r as s,t as c}from"./D_2UqK4k.js";import{n as l}from"./BBSxV90W.js";import{c as u,l as d}from"./D7Ze5md9.js";import{a as f,i as p,n as m,o as h,r as g,t as _}from"./DxuXBECK.js";import{t as v}from"./NY_tAtcY.js";var y=t();function b(){let t=e(e=>e.activeDialog),b=e(e=>e.closeDialog),x=l(),S=x.update,{t:C}=n();return(0,y.jsx)(_,{open:t===`query-settings`,onOpenChange:e=>{e||b()},children:(0,y.jsxs)(m,{className:`sm:max-w-[560px]`,children:[(0,y.jsxs)(f,{children:[(0,y.jsx)(h,{children:C(`settings.query.title`)}),(0,y.jsx)(g,{children:C(`settings.query.description`)})]}),(0,y.jsxs)(`div`,{className:`grid gap-2`,children:[(0,y.jsx)(v,{id:`s-dryrun`,checked:x.previewAffectedRows,onChange:e=>S({previewAffectedRows:e}),pro:!0,label:`Dry run`,hint:`Before an UPDATE or DELETE runs, read its WHERE (joins included) as a SELECT and show how many rows it would change, with a sample of them, to confirm.`}),(0,y.jsxs)(`div`,{className:`grid grid-cols-[1fr_140px] items-center gap-3 rounded-md border p-3`,children:[(0,y.jsxs)(`div`,{className:`grid gap-0.5`,children:[(0,y.jsx)(u,{htmlFor:`s-limit`,className:`text-sm font-medium`,children:`Result row limit`}),(0,y.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`LIMIT appended to SELECTs that have none. 0 disables.`})]}),(0,y.jsx)(d,{id:`s-limit`,type:`number`,min:0,step:100,value:x.resultRowLimit,onChange:e=>S({resultRowLimit:Math.max(0,Number(e.target.value)||0)})})]}),(0,y.jsxs)(`div`,{className:`grid grid-cols-[1fr_200px] items-center gap-3 rounded-md border p-3`,children:[(0,y.jsxs)(`div`,{className:`grid gap-0.5`,children:[(0,y.jsx)(`span`,{className:`text-sm font-medium`,children:`F9 / Run button executes`}),(0,y.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`Ctrl+Enter always runs the statement at the cursor; Ctrl+Shift+Enter the whole script.`})]}),(0,y.jsxs)(c,{value:x.executeScope,onValueChange:e=>S({executeScope:e}),children:[(0,y.jsx)(a,{children:(0,y.jsx)(i,{})}),(0,y.jsxs)(o,{children:[(0,y.jsx)(s,{value:`script`,children:`Whole script`}),(0,y.jsx)(s,{value:`statement`,children:`Statement at cursor`})]})]})]})]}),(0,y.jsx)(p,{children:(0,y.jsx)(r,{onClick:b,children:C(`settings.done`)})})]})})}export{b as QuerySettingsDialog};
1
+ import{n as e}from"./XzPc-eVf.js";import{l as t,m as n,t as r}from"./CKOS5Y-e.js";import{a as i,i as a,n as o,r as s,t as c}from"./DsllOXPq.js";import{n as l}from"./BBSxV90W.js";import{c as u,l as d}from"./Bxw3grU1.js";import{a as f,i as p,n as m,o as h,r as g,t as _}from"./DxuXBECK.js";import{t as v}from"./ChiscGY_.js";var y=t();function b(){let t=e(e=>e.activeDialog),b=e(e=>e.closeDialog),x=l(),S=x.update,{t:C}=n();return(0,y.jsx)(_,{open:t===`query-settings`,onOpenChange:e=>{e||b()},children:(0,y.jsxs)(m,{className:`sm:max-w-[560px]`,children:[(0,y.jsxs)(f,{children:[(0,y.jsx)(h,{children:C(`settings.query.title`)}),(0,y.jsx)(g,{children:C(`settings.query.description`)})]}),(0,y.jsxs)(`div`,{className:`grid gap-2`,children:[(0,y.jsx)(v,{id:`s-dryrun`,checked:x.previewAffectedRows,onChange:e=>S({previewAffectedRows:e}),pro:!0,label:`Dry run`,hint:`Before an UPDATE or DELETE runs, read its WHERE (joins included) as a SELECT and show how many rows it would change, with a sample of them, to confirm.`}),(0,y.jsxs)(`div`,{className:`grid grid-cols-[1fr_140px] items-center gap-3 rounded-md border p-3`,children:[(0,y.jsxs)(`div`,{className:`grid gap-0.5`,children:[(0,y.jsx)(u,{htmlFor:`s-limit`,className:`text-sm font-medium`,children:`Result row limit`}),(0,y.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`LIMIT appended to SELECTs that have none. 0 disables.`})]}),(0,y.jsx)(d,{id:`s-limit`,type:`number`,min:0,step:100,value:x.resultRowLimit,onChange:e=>S({resultRowLimit:Math.max(0,Number(e.target.value)||0)})})]}),(0,y.jsxs)(`div`,{className:`grid grid-cols-[1fr_200px] items-center gap-3 rounded-md border p-3`,children:[(0,y.jsxs)(`div`,{className:`grid gap-0.5`,children:[(0,y.jsx)(`span`,{className:`text-sm font-medium`,children:`F9 / Run button executes`}),(0,y.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`Ctrl+Enter always runs the statement at the cursor; Ctrl+Shift+Enter the whole script.`})]}),(0,y.jsxs)(c,{value:x.executeScope,onValueChange:e=>S({executeScope:e}),children:[(0,y.jsx)(a,{children:(0,y.jsx)(i,{})}),(0,y.jsxs)(o,{children:[(0,y.jsx)(s,{value:`script`,children:`Whole script`}),(0,y.jsx)(s,{value:`statement`,children:`Statement at cursor`})]})]})]})]}),(0,y.jsx)(p,{children:(0,y.jsx)(r,{onClick:b,children:C(`settings.done`)})})]})})}export{b as QuerySettingsDialog};
@@ -0,0 +1,2 @@
1
+ var e={reconnecting:`다시 연결하는 중…`,dropSqlite:`놓으면 SQLite 파일이 열립니다`,dropSqliteHint:`WebAssembly로 브라우저 안에서 열리며 파일은 컴퓨터 밖으로 나가지 않습니다. -wal 파일이 있으면 함께 놓으세요.`,dropFailedTitle:`놓은 파일을 열 수 없습니다`,dropNotSqlite:`{{name}}은(는) SQLite 데이터베이스 파일이 아닙니다.`,crashTitle:`문제가 발생했습니다`,crashBody:`예상치 못한 오류가 발생했습니다. 새로고침하면 연결과 탭이 복원되며, 저장하지 않은 그리드 편집은 사라집니다.`,crashReload:`새로고침`},t={auto:`시스템 언어 ({{name}})`,en:`English`,ko:`한국어`,zh:`中文(简体)`,ja:`日本語`,de:`Deutsch`,fr:`Français`},n={title:`안전`,description:`실수로 데이터를 잃지 않도록 보호합니다. 읽기 전용, 환경 색상, 트랜잭션 모드는 연결별로 설정합니다.`,language:`언어`,languageHint:`즉시 적용됩니다. "시스템 언어"는 브라우저 설정을 따릅니다.`,resetDefaults:`기본값으로 재설정`,done:`완료`,analytics:`익명 사용 통계 보내기`,analyticsHint:`익명 사용 이벤트(엔진, 기능, 문장 종류)를 Google Analytics로 보냅니다. SQL 본문, 호스트명, 테이블·사용자 이름은 절대 보내지 않습니다.`,analyticsUnavailableHint:`이 빌드에서는 비활성입니다 (측정 ID 미설정).`,persistHistory:`새로고침 후에도 쿼리 히스토리 유지`,persistHistoryHint:`문장 텍스트가 이 브라우저에 저장됩니다(비밀번호 리터럴은 마스킹, 열려 있는 에디터 탭 자체는 항상 보존). 끄면 히스토리와 버전은 탭을 닫을 때까지만 유지됩니다.`,ai:{intro:`실패한 문장이나 느린 플랜의 이유를 모델에게 물어볼 수 있습니다. 질문은 이 앱에서 조립되어 로컬 에이전트가 아래 provider로 보냅니다 — SQL과 스키마는 planche.dev로 전혀 가지 않습니다.`,provider:`Provider`,openaiCompatible:`OpenAI 호환`,model:`모델`,baseUrl:`Base URL`,baseUrlHint:`비워 두면 provider 기본 엔드포인트를 씁니다. OpenAI 호환 서버면 무엇이든 됩니다 — Azure, OpenRouter, 로컬 Ollama.`,key:`API 키`,keyHint:`로컬 에이전트에 전달되어 거기서 쓰입니다. 이 브라우저에 저장되지 않고 planche.dev로도 보내지 않습니다.`,remember:`이 기계에 키를 기억`,rememberHint:`{{path}}에 본인만 읽을 수 있게 저장합니다. 체크하지 않으면 키는 실행 중인 에이전트 안에만 있고 종료하면 사라집니다.`,save:`저장`,forget:`키 삭제`,saved:`저장했습니다.`,none:`설정된 키가 없습니다.`,configuredSession:`이번 에이전트 세션에만 유효한 키가 설정되어 있습니다.`,configuredFile:`{{path}}에 키가 저장되어 있습니다.`,configuredEnv:`이 에이전트의 AI 설정은 환경변수에서 오므로 여기서 바꿀 수 없습니다.`,unreachable:`에이전트에 연결할 수 없어 AI 설정을 바꿀 수 없습니다.`,title:`AI 설명`,description:`실패나 플랜을 어느 모델이 설명하고, 누구의 키로 값을 치를지.`,cli:`로컬 CLI (키 없음)`,cliCommand:`명령`,cliHint:`이 기계에 이미 설치되고 로그인된 에이전트 CLI를 실행하므로 입력할 키가 없습니다. 실패와 플랜 설명에 쓰이며, AI 패널은 도구를 호출할 수 있는 provider가 필요합니다.`,cliNone:`이 기계에서 에이전트 CLI를 찾지 못했습니다. Claude Code나 Codex를 설치하거나 다른 provider를 고르세요.`,profile:`Anthropic (이 기계의 로그인)`,profileHint:"이 기계가 이미 로그인해 둔 자격증명을 씁니다 — `ant auth login` 이후 SDK가 알아서 찾습니다. 붙여 넣을 것이 없고, 로컬 CLI와 달리 진짜 API라서 AI 패널도 동작합니다.",profileNone:"이 기계에서 Anthropic 자격증명을 찾지 못했습니다. `ant auth login`을 실행하거나 키를 직접 입력하세요.",configuredChoice:`{{provider}} 사용 중 — 키는 보관하지 않으며, 선택은 {{path}}에 저장됩니다.`},query:{title:`쿼리`,description:`문장을 어떻게 실행할지: F9가 무엇을 돌리고, 몇 행을 받아오고, 무엇을 먼저 미리 보는지.`},general:{title:`일반`,description:`언어, 새로고침을 넘겨 남는 것, 그리고 이 기계를 떠나는 것.`}},r={settings:{safety:`안전…`,language:`언어`,title:`설정`,theme:`테마`,query:`쿼리…`,general:`일반…`,ai:`AI…`},help:{gettingStarted:`시작하기`,about:`Planche 정보`,title:`도움말`,documentation:`문서`,learn:`SQL 배우기`,terms:`이용약관`,license:`라이선스`,support:`문의하기`,mcp:`AI 에이전트 연결 (MCP)…`,privacy:`개인정보처리방침`},connection:{title:`연결`,connect:`연결`,disconnect:`연결 해제`,readOnly:`읽기 전용`,manualTransactions:`수동 트랜잭션`,saveDatabaseFile:`데이터베이스 파일 저장`,saveDatabaseFileBlocked:`데이터베이스 파일 저장 (-wal 파일을 먼저 불러오세요)`,exit:`종료`,sync:`연결 동기화`},query:{title:`쿼리`,execute:`실행`,executeStatementAtCursor:`커서 위치의 문장 실행`,executeWholeScript:`전체 스크립트 실행`,newQueryTab:`새 쿼리 탭`,findReplace:`찾기 및 바꾸기`,localHistory:`로컬 히스토리…`,explainPlan:`실행 계획 보기`,explainAnalyze:`실행 계획 측정 (문장을 실제로 실행)`,structure:`쿼리 구조`},edit:{title:`편집`,undo:`실행 취소`,redo:`다시 실행`,cut:`잘라내기`,copy:`복사`,paste:`붙여넣기`,selectAll:`모두 선택`},database:{title:`데이터베이스`,create:`데이터베이스 생성`,alter:`데이터베이스 변경`,drop:`데이터베이스 삭제`,copy:`데이터베이스 복사`,compare:`스키마 비교…`,truncate:`데이터베이스 비우기`,compareData:`데이터 비교…`,groupBy:`그룹 집계…`},table:{title:`테이블`,create:`테이블 생성`,alter:`테이블 변경`,drop:`테이블 삭제`,rename:`테이블 이름 변경`,truncate:`테이블 비우기`,duplicateStructure:`테이블 구조 복제`},export:{title:`내보내기`,csv:`CSV로 다운로드`,tsv:`TSV로 내려받기`,schemaHtml:`스키마를 HTML로`,links:`컬럼 링크 내보내기…`,importLinks:`컬럼 링크 가져오기…`},tools:{title:`도구`,userManager:`사용자 관리`,processList:`프로세스 목록`,variables:`변수`,status:`상태`,flush:`플러시`,quickCommand:`빠른 명령`,viewErd:`ERD 보기`,scratchpad:`스크래치패드 (브라우저 SQLite)`,federated:`Federated 쿼리 (연결 간 조인)…`,federatedTab:`Federated {{n}}`,ai:`AI 어시스턴트`},messages:{databaseFileSaved:`데이터베이스 파일을 저장했습니다`,databaseExported:`데이터베이스를 다운로드로 내보냈습니다`,databaseExportedWithReason:`데이터베이스를 다운로드로 내보냈습니다 — {{reason}}`,errorSavingDatabase:`데이터베이스 저장 오류: {{message}}`,noDatabaseSelected:`선택된 데이터베이스가 없습니다`,noTableSelected:`선택된 테이블이 없습니다`,noActiveConnection:`활성 연결이 없습니다`,databaseDropped:`데이터베이스 "{{database}}"을(를) 삭제했습니다`,errorDroppingDatabase:`데이터베이스 삭제 오류: {{message}}`,noTablesInDatabase:`데이터베이스 "{{database}}"에 테이블이 없습니다`,databaseTruncated_other:`"{{database}}"의 테이블 {{count}}개를 모두 비웠습니다`,errorTruncatingDatabase:`데이터베이스 비우기 오류: {{message}}`,tableDropped:`테이블 "{{table}}"을(를) 삭제했습니다`,errorDroppingTable:`테이블 삭제 오류: {{message}}`,tableTruncated:`테이블 "{{table}}"을(를) 비웠습니다`,errorTruncatingTable:`테이블 비우기 오류: {{message}}`,renameTablePrompt:`테이블 "{{table}}"의 새 이름:`,tableRenamed:`테이블 "{{table}}"의 이름을 "{{newName}}"(으)로 변경했습니다`,errorRenamingTable:`테이블 이름 변경 오류: {{message}}`,truncateDatabaseTitle:`"{{name}}"의 모든 테이블을 비우시겠습니까?`,truncateDatabaseDescription:`"{{name}}"의 테이블 {{count}}개에 있는 모든 행이 삭제됩니다. 테이블 구조는 유지됩니다. 이 작업은 되돌릴 수 없습니다.`,truncateDatabaseConfirm:`모든 테이블 비우기`,renameTableTitle:`테이블 이름 변경`,renameTableConfirm:`이름 변경`,noLinksToExport:`내보낼 컬럼 링크가 없습니다.`,linksExported:`컬럼 링크 {{count}}개를 내보냈습니다.`,linksImported:`컬럼 링크 {{count}}개를 가져왔습니다.`,linksImportedPartial:`컬럼 링크 {{count}}개를 가져왔습니다. 일치하는 프로필이 없음: {{profiles}}`,linksImportFailed:`컬럼 링크를 가져오지 못했습니다: {{reason}}`}},i={title:`Planche 정보`,tagline:`MySQL, MariaDB, PostgreSQL, SQLite용 데이터베이스 클라이언트.`,version:`버전`,website:`웹사이트`,licenses:`라이선스`,licensesLink:`서드파티 고지`,disclaimer:`Planche는 어떠한 보증도 없이 "있는 그대로" 제공됩니다. 사용 중 발생하는 손해나 데이터 손실에 대해 저작자는 책임지지 않습니다. 파괴적인 구문을 실행하기 전에 데이터를 백업하세요.`,rights:`All rights reserved.`,legal:`약관`,terms:`이용약관`,privacy:`개인정보`,refund:`환불`},a=JSON.parse('{"dialog":{"title":"데이터베이스에 연결","firstQueryTab":"쿼리 1","colHostName":"호스트 이름","colTarget":"대상","colDbms":"DBMS","noSaved":"저장된 연결이 없습니다","unnamed":"(이름 없음)","pickOnConnect":"(연결 시 선택)","noFile":"(파일 없음)","selectPrompt":"연결을 선택하거나 새로 추가하세요","addNew":"새로 추가","delete":"삭제","testConnection":"연결 테스트","connect":"연결","close":"닫기","unknownError":"알 수 없는 오류","browserTestHint":"브라우저 내 SQLite 연결은 연결 버튼을 누를 때 로컬 파일을 엽니다.","testSuccess":"연결 성공","restoredUnsaved":"{{file}}: 캐시된 사본에서 저장되지 않은 변경 사항을 복원했습니다","restoredUnsavedDiskChanged":"{{file}}: 캐시된 사본에서 저장되지 않은 변경 사항을 복원했습니다 — 그 사이 디스크의 파일이 변경되었습니다","walPending":"{{file}}은(는) WAL 모드입니다: 최근 변경 사항이 -wal 파일에 남아 있을 수 있습니다. 위의 \\"-wal 파일 불러오기\\"로 반영할 수 있습니다.","walApplied":"{{file}}을(를) -wal 변경 사항을 적용하여 열었습니다","connectFailedTitle":"연결 실패","testSuccessDescription":"서버가 접속 정보를 확인했습니다.","testFailedTitle":"연결 테스트 실패","privacy":"여기에 입력한 어떤 정보도 planche.dev 서버로 전송되거나 저장되지 않습니다. 연결 프로필은 오직 이 브라우저의 로컬 저장소에만 저장되며, 쿼리는 로컬 에이전트에서 데이터베이스로 직접 전달됩니다.","hostKeyTitle":"알 수 없는 SSH 호스트 키","hostKeyDescription":"{{host}}:{{port}}이(가) 지문 {{fingerprint}}의 {{type}} 키를 제시했습니다. 서버 관리자에게 받은 지문과 비교하세요. 잘못된 키를 수락하면 공격자가 트래픽을 읽을 수 있습니다.","hostKeyAccept":"이 호스트 신뢰","gatewayTitle":"게이트웨이 프로필","gatewayAdd":"추가","gatewayAdded":"게이트웨이 프로필 {{name}}을(를) 추가했습니다.","gatewayReadOnly":"읽기 전용","gatewayWritable":"쓰기 가능","gatewayProfileHint":"이 연결은 게이트웨이가 보관하는 \\"{{name}}\\" 프로필을 사용합니다. 여기서 설정할 것은 없습니다.","gatewayLoadFailed":"게이트웨이 프로필을 불러오지 못했습니다: {{error}}","export":"내보내기…","exportWithoutSecrets":"비밀번호 제외","exportWithSecrets":"비밀번호와 키 포함","import":"가져오기…","exported":"\\"{{name}}\\" 연결을 내보냈습니다.","imported":"\\"{{name}}\\" 연결을 가져왔습니다.","importFailedTitle":"연결을 가져오지 못했습니다"},"form":{"hostName":"호스트 이름","hostNamePlaceholder":"내 연결","dataSource":"데이터 소스","openVia":"여는 방식","viaBrowser":"브라우저 (로컬 파일)","viaAgent":"로컬 에이전트","viaBrowserHint":"설치가 필요 없습니다. 다른 프로그램이 사용하지 않는 파일에 적합합니다: 브라우저는 메모리 사본으로 작업하며 파일을 잠글 수 없으므로, 열려 있는 동안 다른 곳에서 수정한 내용은 보이지 않고 저장 시 덮어씁니다.","viaAgentHint":"npx planche를 통해 SQLite로 직접 파일을 엽니다 — 제대로 된 잠금과 WAL을 지원하므로 같은 데이터베이스를 사용하는 다른 프로그램과 함께 써도 안전합니다.","databaseFile":"데이터베이스 파일","changeFile":"파일 변경","filePickerHint":"연결 버튼을 누르면 파일 선택 창이 열립니다 (팁: ⌘⇧. 는 숨김 파일 표시, ⌘⇧G 로 경로를 직접 입력할 수 있습니다).","fileRememberedHint":"선택한 파일은 기억되므로(Chromium) 다시 연결할 때는 권한만 요청합니다. 변경 사항을 파일에 쓰려면 연결 > 데이터베이스 파일 저장을 사용하세요.","authToken":"인증 토큰","authTokenPlaceholder":"비워 두면 페어링된 에이전트 토큰을 사용합니다","filePathPlaceholder":"/path/to/database.sqlite 또는 :memory:","createIfMissing":"없으면 생성","createIfMissingHint":"경로는 터널링 서버 호스트 기준으로 해석됩니다","host":"호스트","port":"포트","database":"데이터베이스","serviceName":"서비스 이름","user":"사용자","password":"비밀번호","savePassword":"비밀번호 저장","savePasswordHint":"끄면 비밀번호는 이 브라우저 세션 동안만 유지되며 디스크에 기록되지 않습니다.","charset":"문자셋","autoConnection":"자동 연결","safety":"안전","environment":"환경","environmentHint":"탭과 작업 공간에 색을 입힙니다","readOnly":"읽기 전용","readOnlyHint":"데이터나 스키마를 변경하는 구문을 거부합니다","transactions":"트랜잭션","txAuto":"자동 커밋","txManual":"수동 — 툴바에서 커밋 / 롤백","ssh":"SSH","sshTunnel":"SSH 터널","sshTunnelHint":"SSH 점프 호스트를 거쳐 데이터베이스에 접속합니다 (로컬 에이전트가 터널을 엽니다)","sshHost":"SSH 호스트","sshPort":"SSH 포트","sshUser":"SSH 사용자","sshAuth":"SSH 인증","sshAuthKey":"개인 키","sshAuthPassword":"비밀번호","sshAuthAgent":"ssh-agent","sshAuthAgentHint":"npx planche를 실행 중인 컴퓨터의 ssh-agent에 로드된 키를 사용합니다 (SSH_AUTH_SOCK).","sshPassword":"SSH 비밀번호","sshKey":"개인 키","sshKeyPick":"키 파일 선택…","sshKeyLoaded":"키 불러옴","sshKeyHint":"비우면 에이전트 컴퓨터의 ~/.ssh/config IdentityFile(또는 ~/.ssh/id_*)을 사용합니다. 선택한 키는 이 프로필과 함께 저장됩니다","sshPassphrase":"패스프레이즈","sshPassphrasePlaceholder":"키에 패스프레이즈가 없으면 비워 두세요","sshSecretsHint":"SSH 비밀번호, 개인 키, 패스프레이즈는 위의 \\"비밀번호 저장\\" 설정을 따릅니다. 알 수 없는 호스트 키는 첫 연결 전에 확인할 수 있게 표시되며 에이전트 컴퓨터의 ~/.planche/known_hosts에 저장됩니다.","sshHostPlaceholder":"bastion.example.com 또는 ~/.ssh/config의 Host 별칭","sshUserPlaceholder":"비우면 ~/.ssh/config의 User 사용","sshTargetHint":"DB 호스트/포트는 점프 호스트에서 해석됩니다 — localhost나 로컬 포트 포워드가 아니라 DB의 실제 주소(예: RDS 엔드포인트)를 넣으세요.","connectionString":"연결 문자열","connectionStringApplied":"아래 필드에 반영되었습니다. 문자열 자체는 저장되지 않고 필드만 저장됩니다.","connectionStringInvalid":"PostgreSQL URI가 아닙니다 (postgresql://user:password@host/database 형식).","neonHint":"Neon 콘솔(Connect > Connection string)의 URI를 붙여넣으면 아래 필드가 채워집니다.","supabaseHint":"Supabase(Connect > Session pooler 또는 Direct connection)의 URI를 붙여넣으면 아래 필드가 채워집니다.","supabasePoolerWarning":"6543 포트는 트랜잭션 모드 풀러입니다. 문장마다 다른 백엔드에서 실행될 수 있어 스키마 전환, 임시 테이블, prepared statement, 수동 트랜잭션이 동작하지 않습니다. 세션 풀러(5432 포트)나 직접 연결을 사용하세요.","managedTlsHint":"이 서비스는 항상 TLS로 연결되며, 로컬 에이전트에서 서비스로 직접 접속합니다 (SSH 터널 없음).","d1AccountId":"Account ID","d1DatabaseId":"Database ID","d1ApiToken":"API 토큰","d1Hint":"Account ID: Cloudflare 대시보드 계정 홈 오른쪽. Database ID: Storage & Databases > D1 > 데이터베이스. 토큰: My Profile > API Tokens > Create Token에서 \\"D1 Edit\\" 권한(읽기 전용은 \\"D1 Read\\"). 로컬 에이전트가 이 토큰으로 Cloudflare API를 호출합니다.","d1LimitsHint":"D1은 요청마다 독립적으로 실행되고 자동 커밋되므로 수동 트랜잭션을 쓸 수 없습니다. 데이터베이스는 \\"main\\" 스키마 하나로 표시됩니다.","doDevUrl":"wrangler dev URL","doHint":"Worker 프로젝트에서 `wrangler dev`를 실행하고 출력된 URL을 넣으세요(기본 포트 8787). 로컬 에이전트가 해당 세션의 Durable Object를 읽으며, 동시에 실행 중인 다른 `wrangler dev` 세션도 함께 보입니다.","doLimitsHint":"로컬 개발 전용입니다. 배포된 Durable Object는 Worker 안에서만 접근할 수 있어 Cloudflare가 조회 API를 제공하지 않습니다. 각 오브젝트는 \\"<네임스페이스>/<오브젝트>\\" 이름의 데이터베이스로 표시되고, 요청마다 자동 커밋되므로 수동 트랜잭션은 쓸 수 없습니다.","tls":"TLS","tlsEnable":"연결 암호화","tlsVerify":"서버 인증서 검증","tlsVerifyHint":"끄면 자체 서명 인증서도 허용됩니다(암호화는 되지만 서버 신원은 확인하지 않음). SSH 터널에서는 사용할 수 없습니다.","d1DevUrl":"로컬 개발 URL","d1DevUrlHint":"비워두면 Cloudflare 계정으로 접속합니다. 입력하면 이 컴퓨터에서 `wrangler dev`가 띄운 데이터베이스를 직접 읽습니다 — 계정도 API 토큰도 필요 없고 아래 계정 항목은 무시됩니다. 개발 서버에 D1이 하나뿐이면 Database ID는 비워두세요.","d1PickDatabase":"데이터베이스 선택"},"agent":{"copy":"복사","looking":"Planche 에이전트를 찾는 중…","online":"에이전트 <b>v{{version}}</b>이(가) <mono>{{url}}</mono>에서 실행 중입니다","outdated":"에이전트 v{{version}}은(는) 프로토콜 {{protocol}}을(를) 사용하지만 이 앱에는 더 새로운 버전이 필요합니다. <cmd/> 로 다시 시작하세요","unauthorized":"에이전트 <b>v{{version}}</b>이(가) <mono>{{url}}</mono>에서 실행 중이지만 이 앱과 페어링되어 있지 않습니다(토큰은 시작할 때마다 바뀝니다). 에이전트 터미널에 출력된 링크를 열거나, 설정에서 토큰을 붙여 넣으세요.","offline":"<mono>{{url}}</mono>에 에이전트가 없습니다. 터미널에서 실행하세요 — 페어링된 상태로 이 앱이 열립니다.","close":"닫기","configure":"설정","checkAgain":"다시 확인","urlLabel":"에이전트 URL","urlPlaceholder":"http://127.0.0.1:8888 (기본값)","tokenLabel":"토큰","tokenPlaceholder":"에이전트가 출력한 값","reset":"초기화","save":"저장","remoteWarning":"이 에이전트는 내 컴퓨터에 있지 않습니다({{host}}): 모든 연결의 비밀번호와 SSH 키가 그곳으로 전송됩니다.","remoteRefusedTitle":"원격 에이전트를 사용할 수 없습니다","remoteRefused":"에이전트는 이 컴퓨터(127.0.0.1 또는 localhost)에서 실행되어야 합니다. 다른 컴퓨터의 에이전트를 쓰려면 `ssh -L 8888:127.0.0.1:8888 user@host`로 포트를 포워딩하고 URL은 http://127.0.0.1:8888 그대로 두세요.","gateway":"게이트웨이 \\"{{name}}\\": 서버 측 프로필 {{count}}개. 자격 증명은 게이트웨이에만 있으며 아래에서 프로필을 고르세요."},"tab":{"noConnections":"열린 연결이 없습니다. 연결 버튼을 눌러 시작하세요.","theSqliteFile":"SQLite 파일","reopened":"{{file}}을(를) 다시 열었습니다","reopenFailed":"파일을 다시 열 수 없습니다: {{message}}","reopenPrompt":"<b>{{file}}</b>을(를) 읽으려면 브라우저 권한이 다시 필요합니다.","reopenFile":"파일 다시 열기","closeConnection":"연결 닫기","reconnected":"{{file}}을(를) 다시 연결했습니다","accessNotGranted":"파일 접근 권한이 허용되지 않았습니다. 저장 시 다운로드로 내보냅니다.","detachedPrompt":"<b>{{file}}</b>의 캐시된 사본으로 작업 중입니다. 변경 사항을 파일에 직접 저장하려면 파일을 다시 연결하세요.","reconnectFile":"파일 다시 연결","detachedHide":"숨기기 (저장 시 필요하면 파일을 요청합니다)","walFramesApplied_one":"{{file}}-wal 에서 WAL 프레임 {{count}}개를 적용했습니다","walFramesApplied_other":"{{file}}-wal 에서 WAL 프레임 {{count}}개를 적용했습니다","walNoChanges":"-wal 파일에 커밋된 변경 사항이 없습니다","walLoadFailed":"-wal 파일을 불러올 수 없습니다: {{message}}","walPrompt":"<b>{{file}}</b>은(는) WAL 모드입니다: <mono>{{file}}-wal</mono> 파일을 불러오기 전에는 최신 데이터가 보이지 않을 수 있으며, 그때까지 저장이 비활성화됩니다. 옆에 그런 파일이 없다면(데이터베이스가 정상적으로 닫힌 경우) 없음을 확인해 주세요. 다른 프로그램이 이 데이터베이스를 아직 사용 중이라면 로컬 에이전트(<mono>npx planche</mono>)를 통해 여세요: 브라우저는 파일을 안전하게 공유할 수 없습니다.","loadWal":"-wal 파일 불러오기","noWalHint":"확인했습니다: 데이터베이스 옆에 -wal 파일이 없습니다","noWal":"-wal 파일 없음","dismiss":"닫기","walHide":"숨기기 (저장은 계속 비활성화됩니다)","readOnlyBadge":"읽기 전용"}}'),o={connect:`연결 (Alt+N)`,disconnect:`연결 해제`,newQueryTab:`새 쿼리 탭 (Alt+T)`,execute:`실행 (F9)`,executeStatement:`커서 위치 / 선택 영역의 문장 실행 (Ctrl+Enter)`,commit:`커밋`,commitHint:`열린 트랜잭션을 커밋합니다`,noOpenTransaction:`열린 트랜잭션이 없습니다`,rollback:`롤백`,rollbackHint:`열린 트랜잭션을 취소합니다`,readOnlyBadge:`읽기 전용`,readOnlyHint:`이 연결은 데이터나 스키마를 변경하는 문장을 거부합니다`,userManager:`사용자 관리 (Alt+U)`,quickCommand:`빠른 명령`,processList:`프로세스 목록`,variables:`변수`,status:`상태`,flush:`플러시`,fullscreen:`전체 화면`},s={readOnly:`읽기 전용`,txOpen:`트랜잭션 열림`,manualTx:`수동 트랜잭션`},c={title:`빠른 명령`,description:`실행할 명령을 검색합니다...`,inputPlaceholder:`명령을 입력하거나 검색하세요...`,empty:`일치하는 명령이 없습니다.`,groups:{connection:`연결`,query:`쿼리`,database:`데이터베이스`,table:`테이블`,tools:`도구`},commands:{connect:`연결`,disconnect:`연결 해제`,executeQuery:`쿼리 실행`,newQueryTab:`새 쿼리 탭`,createDatabase:`데이터베이스 생성`,dropDatabase:`데이터베이스 삭제`,createTable:`테이블 생성`,alterTable:`테이블 변경`,dropTable:`테이블 삭제`,processList:`프로세스 목록`,serverVariables:`서버 변수`,serverStatus:`서버 상태`,flush:`Flush`,userManager:`사용자 관리`}},l={title:`Planche에 오신 것을 환영합니다`,intro:`브라우저에서 실행되는 SQL 클라이언트입니다. 데이터베이스에는 내 컴퓨터에서 실행되는 작은 에이전트를 통해 접속하므로, 인증 정보와 데이터가 컴퓨터 밖으로 나가지 않습니다.`,skip:`건너뛰기`,skipTitle:`이 화면을 숨깁니다 (도움말 > 시작하기에서 다시 열 수 있습니다)`,copy:`복사`,copied:`복사됨`,sampleOpenFailed:`샘플 데이터베이스를 열 수 없습니다: {{message}}`,steps:{agent:{title:`로컬 에이전트 실행`,body:`터미널에서 아래 중 하나를 실행합니다. 에이전트가 시작되고 이 페이지와 페어링됩니다.`},connection:{title:`연결 추가`,body:`사용할 데이터베이스를 선택하면 알맞은 기본값이 채워진 연결 폼이 열립니다.`},sample:{title:`사용할 데이터베이스가 없다면 샘플을 사용해 보세요`,body:`샘플 웹숍 데이터베이스(테이블 24개, 약 5만 행, 뷰와 트리거 포함)를 브라우저에 불러와 에디터, 그리드, 스키마 트리를 사용해 볼 수 있습니다.`,loading:`샘플 불러오는 중…`,button:`샘플 데이터베이스 사용해 보기`}},terms:{title:`시작하기 전에`,local:`모든 작업은 로컬에서 실행됩니다. 접속 정보, 쿼리, 결과는 사용자의 컴퓨터에만 남고 저희에게 전송되지 않습니다.`,asIs:`Planche는 있는 그대로 제공되며 어떠한 보증도 하지 않습니다. 안전장치(위험 작업 확인, 읽기 전용 모드)는 편의 기능이지 보장이 아닙니다.`,dataLoss:`Planche를 통해 실행되는 모든 구문의 책임은 사용자에게 있습니다. 데이터를 변경하거나 삭제하기 전에 반드시 백업하세요.`,agree:`이용약관을 읽었으며 이에 동의합니다.`,accepted:`이용약관에 동의하셨습니다.`,readFull:`약관 전문 보기`}},u={treeLabel:`스키마`,unreachableHint:`이 연결이 바인딩된 데이터베이스가 아닙니다. 탐색하려면 해당 데이터베이스용 프로필을 만드십시오`,objectType:{table:`테이블`,view:`뷰`,procedure:`프로시저`,function:`함수`,trigger:`트리거`,event:`이벤트`},menu:{showCreate:`{{type}} 생성문 보기`,alter:`{{type}} 수정`,drop:`{{type}} 삭제`,create:`{{type}} 생성`,refresh:`새로 고침`,unreachable:`이 데이터베이스를 탐색하려면 해당 데이터베이스에 바인딩된 프로필로 연결하십시오`,openDatabase:`데이터베이스 열기`,createSchema:`스키마 생성…`,createTable:`테이블 생성`,dropDatabase:`데이터베이스 삭제`,openSchema:`스키마 열기`,dropSchema:`스키마 삭제`,newQueryTab:`새 쿼리 탭`,generateSql:`SQL 생성`,openTable:`테이블 열기`,alterTable:`테이블 수정`,showCreateTable:`테이블 생성문 보기`,duplicateStructure:`구조 복제`,copyTable:`다른 위치로 테이블 복사…`,compare:`{{type}} 비교…`,truncateTable:`테이블 비우기 (TRUNCATE)`,dropTable:`테이블 삭제`,exportCsv:`CSV로 내보내기`,exportTsv:`TSV로 내보내기…`,openView:`뷰 열기`,alterView:`뷰 수정`,showCreateView:`뷰 생성문 보기`,dropView:`뷰 삭제`,compareData:`데이터 비교…`,groupBy:`그룹 집계…`},actions:{createStatementUnavailable:`-- {{type}} {{name}}의 CREATE 문을 가져올 수 없습니다`,getCreateFailed:`CREATE {{type}} 조회에 실패했습니다: {{message}}`,createTabTitle:`{{type}} 생성`,createSchemaTabTitle:`스키마 생성`,generateSqlFailed:`SQL을 생성하지 못했습니다: {{message}}`,dropTableTitle:`테이블 "{{name}}"을(를) 삭제하시겠습니까?`,dropTableDescription:`{{from}}테이블과 그 안의 모든 행이 영구적으로 삭제됩니다. 이 작업은 되돌릴 수 없습니다.`,dropTableConfirm:`테이블 삭제`,dropObjectTitle:`{{type}} "{{name}}"을(를) 삭제하시겠습니까?`,dropObjectDescription:`{{from}}{{type}} 정의가 제거됩니다. 이 작업은 되돌릴 수 없습니다.`,dropObjectConfirm:`{{type}} 삭제`,fromDatabase:`데이터베이스 "{{database}}"에서 `,dropped:`{{type}} {{name}}을(를) 삭제했습니다`,dropFailed:`{{type}} 삭제에 실패했습니다`,dropDatabaseTitle:`데이터베이스 "{{name}}"을(를) 삭제하시겠습니까?`,dropDatabaseDescription:`데이터베이스와 그 안의 모든 테이블 및 데이터가 영구적으로 삭제됩니다. 이 작업은 되돌릴 수 없습니다.`,dropDatabaseConfirm:`데이터베이스 삭제`,droppedDatabase:`데이터베이스 {{name}}을(를) 삭제했습니다`,dropDatabaseFailed:`데이터베이스 삭제에 실패했습니다`,dropSchemaTitle:`스키마 "{{name}}"을(를) 삭제하시겠습니까?`,dropSchemaDescription:`스키마와 그 안의 모든 테이블 및 데이터가 영구적으로 삭제됩니다. 이 작업은 되돌릴 수 없습니다.`,dropSchemaConfirm:`스키마 삭제`,droppedSchema:`스키마 {{name}}을(를) 삭제했습니다`,dropSchemaFailed:`스키마 삭제에 실패했습니다`,truncateTitle:`테이블 "{{name}}"을(를) 비우시겠습니까?`,truncateDescription:`"{{name}}"의 모든 행이 삭제됩니다. 테이블 구조는 유지됩니다. 이 작업은 되돌릴 수 없습니다.`,truncateConfirm:`테이블 비우기`,truncated:`{{name}}을(를) 비웠습니다`,truncateFailed:`테이블 비우기에 실패했습니다`},tree:{loadDatabasesFailed:`데이터베이스 목록을 불러오지 못했습니다: {{message}}`}},d={editor:{destructiveMarker:`파괴적 구문: {{action}} {{names}}`,readOnlyMarker:`읽기 전용 연결입니다. 이 구문은 데이터 또는 스키마를 변경합니다`,actionExecute:`실행 (설정에 따라)`,actionExecuteStatement:`커서 위치 / 선택 영역의 구문 실행`,actionExecuteScript:`전체 스크립트 실행`,actionExplainPlan:`실행 계획 보기`,actionQueryStructure:`쿼리 구조`},tabs:{newQuery:`새 쿼리`,queryTitle:`쿼리 {{n}}`,erdViewer:`ERD 뷰어`,close:`닫기`,closeOthers:`다른 탭 닫기`,closeLeft:`왼쪽 탭 닫기`,closeRight:`오른쪽 탭 닫기`,closeAll:`모두 닫기`},executor:{noActiveConnection:`활성 연결이 없습니다`,uncommittedTitle:`커밋되지 않은 트랜잭션`,uncommittedDescription:`이 연결에 열린 트랜잭션이 있습니다. 연결을 끊으면 변경 사항이 롤백됩니다.`,uncommittedConfirm:`롤백 후 연결 끊기`,unsavedTitle:`저장되지 않은 변경 사항`,unsavedDescription:`{{file}}에 파일로 저장되지 않은 변경 사항이 있습니다. 연결을 끊으면 변경 사항이 사라집니다 (유지하려면 먼저 연결 > 데이터베이스 파일 저장을 사용하십시오).`,theSqliteDatabase:`SQLite 데이터베이스`,unsavedConfirm:`변경 사항 버리고 연결 끊기`}},f=JSON.parse('{"tabs":{"message":"메시지","info":"정보","history":"히스토리","result":"결과","resultN":"결과 {{n}}","plan":"실행 계획","structure":"구조","structureN":"구조 {{n}}"},"message":{"executing":"쿼리를 실행하는 중...","error":"오류: {{message}}","total":" (총 {{ms}}ms)","ready":"준비됨.","log":"실행 로그","statementN":"구문 {{n}}","limitedBadge":"제한 도달","insertId":"insert id {{id}}","failed":"실패","failedStatement":"실패한 구문","summary":"성공 {{ok}} · 실패 {{failed}} · 총 {{ms}}","copy":"복사","copied":"복사됨","showSql":"SQL 보기","hideSql":"SQL 숨기기"},"hints":{"title":"힌트","unknownColumn":"{{name}} 컬럼이 없습니다. {{suggestions}}을(를) 찾으셨나요?","unknownTable":"{{name}} 테이블이 없습니다. {{suggestions}}을(를) 찾으셨나요?","syntaxSwap":"{{engine}}에서는 {{found}} 대신 {{expected}}를 씁니다.","doubleQuotedLiteral":"{{engine}}는 \\"{{value}}\\"를 문자열이 아니라 컬럼 이름으로 읽습니다. 문자열은 \'{{value}}\'로 씁니다."},"ai":{"title":"AI 설명","explain":"AI로 설명 보기","thinking":"실패를 읽는 중…","by":"{{model}}","applyFix":"수정문을 새 탭에서 열기","failed":"설명하지 못했습니다: {{message}}","noFailure":"설명할 실패한 문장이 없습니다.","noPack":"planche.dev에서 프롬프트를 받아오지 못했습니다.","badShape":"모델이 예상한 형식으로 답하지 않았습니다.","noPlan":"설명할 플랜이 아직 없습니다.","explainPlan":"이 플랜 설명 보기"},"info":{"empty":"쿼리 정보가 없습니다.","resultN":"결과 {{n}}","metadata":"쿼리 메타데이터","executionTime":"실행 시간","notAvailable":"해당 없음","affectedRows":"영향받은 행","fields":"필드","fieldDetails":"필드 상세","colName":"이름","colType":"타입","colTable":"테이블","resultSets":"결과 집합","rowsReturned":"반환된 행","insertId":"마지막 Insert ID","lastQuery":"마지막 실행 구문","copy":"복사","copied":"복사됨","colOrigin":"원본 이름","primaryKey":"기본 키","rowsAndFields":"{{rows}}행 × {{fields}}필드","noFields":"이 구문은 컬럼을 반환하지 않았습니다."},"rowForm":{"colColumn":"컬럼","colValue":"값","insertTitle":"행 추가","editTitle":"행 편집","loading":"컬럼 정보를 불러오는 중...","preview":"실행될 구문","nothingToWrite":"변경할 내용이 없습니다","insert":"삽입","update":"수정","stageInsert":"대기 행으로 추가","stageEdit":"그리드에 반영","stageHint":"실행하지 않고 그리드에만 값을 넣어 두고, 나중에 다른 편집과 함께 커밋합니다.","inserted":"{{table}}에 행을 삽입했습니다","updated":"{{table}}의 행을 수정했습니다","confirmInsertTitle":"{{table}}에 행을 삽입할까요?","confirmUpdateTitle":"{{table}}의 행을 수정할까요?","inTransaction":"열린 트랜잭션 안에서 실행됩니다","pickDate":"날짜 선택","now":"현재 시각","formatJson":"정렬","binaryUnsupported":"바이너리 컬럼은 여기서 편집할 수 없습니다. NULL/DEFAULT로 두거나 SQL로 설정하세요.","generateUuid":"UUID 생성","defaultValue":"기본값","clickToChange":"클릭하여 변경","empty":"(비어 있음)","autoHint":"서버가 자동 생성","mode":{"keep":"유지","auto":"자동","value":"값"},"invalid":{"integer":"정수를 입력하세요","unsigned":"이 컬럼은 음수를 허용하지 않습니다","number":"숫자를 입력하세요","json":"올바르지 않은 JSON","date":"YYYY-MM-DD 형식으로 입력하세요","datetime":"YYYY-MM-DD HH:MM:SS 형식으로 입력하세요","time":"HH:MM:SS 형식으로 입력하세요","length":"최대 {{max}}자"}},"history":{"copied":"클립보드에 복사되었습니다","searchPlaceholder":"히스토리 검색...","all":"전체","success":"성공","failed":"실패","thisTab":"현재 탭만","noMatch":"일치하는 항목이 없습니다.","count":"{{count}}건","clear":"지우기","clearTitle":"쿼리 히스토리를 지울까요?","clearDescription":"이 연결의 {{count}}건이 모두 삭제됩니다. 되돌릴 수 없습니다.","clearConfirm":"히스토리 지우기","insert":"편집기에 삽입","inserted":"편집기에 삽입했습니다","copy":"복사","rows":"{{count}}행","affected":"{{count}}행 변경","today":"오늘","yesterday":"어제","empty":"쿼리 히스토리가 없습니다."},"json":{"arrayLength":"Array[{{count}}]","keys_one":"키 {{count}}개","keys_other":"키 {{count}}개","invalid":"잘못된 JSON입니다","clickToView":"클릭하여 JSON 보기","expandAll":"모두 펼치기","collapseAll":"모두 접기","edit":"편집","view":"보기","copied":"복사됨","copy":"복사","shortcutHint":"{{mod}}+Enter 저장 · Esc 취소","cancel":"취소","save":"저장"},"text":{"clickToView":"클릭하여 텍스트 보기","size":"{{chars}}자 · {{lines}}줄","wrap":"줄바꿈"},"grid":{"readOnlyConnection":"읽기 전용 연결","readOnlyWal":"읽기 전용: -wal 파일이 로드되지 않음","readOnlyNoPk":"읽기 전용: 테이블에 기본 키가 없음","commitTitle":"{{table}}에 변경 사항 {{count}}건을 커밋하시겠습니까?","commitDescription":"다음 구문이 실행됩니다.","commitConfirm":"커밋","rowPrefix":"{{row}}행:","cancelled":"취소됨","commitFailed":"커밋 실패: {{message}}","executedInTransaction":"열린 트랜잭션 안에서 변경 사항 {{count}}건을 실행했습니다. 영구 반영하려면 툴바의 커밋을 누르십시오 (다시 불러오면 롤백됩니다)","committed":"{{table}}에 변경 사항 {{count}}건을 커밋했습니다","noData":"표시할 데이터가 없습니다.","commit":"커밋","discard":"취소","addRow":"행 추가","removeNewRow":"이 새 행 취소","addRowForm":"폼으로 추가","addRowFormHint":"컬럼별 입력란이 있는 폼을 엽니다 (INSERT로 커밋)","editRowForm":"이 행을 폼으로 편집","addRowHint":"새 행을 추가합니다 (INSERT로 커밋됨)","delete":"삭제","deleteCount":"삭제 ({{count}})","deleteHint":"선택한 행을 삭제합니다 (DELETE로 커밋됨). 행 번호 열에서 행을 선택하십시오.","field":"필드","searchPlaceholder":"검색...","orderBy":"정렬 기준","none":"없음","refresh":"새로 고침","dismiss":"닫기","clearSelection":"선택 해제","columns":"컬럼","showAllColumns":"전체 선택","hideAllColumns":"전체 해제","resetWidths":"너비 초기화","selectAll":"모든 행 선택","emptyTable":"이 테이블에는 행이 없습니다.","noRows":"반환된 행이 없습니다.","addARow":"행 추가","markedForDeletion":"삭제 예정 — 클릭하면 복원됩니다","newRow":"새 행","clickToSelect":"클릭하여 선택, Shift/Ctrl로 여러 행 선택","rows":"행: {{count}}","rowsWithNew":"행: {{count}} (+{{added}})","sortedBy":"정렬: {{column}} {{direction}}","pageRange":"{{from}}–{{to}}행","firstPage":"첫 페이지","prevPage":"이전 페이지","nextPage":"다음 페이지","lastPage":"마지막 페이지","pagingBlocked":"페이지를 넘기기 전에 변경사항을 커밋하거나 취소하세요","selected":"{{count}}개 선택됨","cellsModified":"셀 {{count}}개 수정됨","newCount":"새 행 {{count}}개","toDelete":"삭제 예정 {{count}}개","searchMode":"검색 방식","contains":"포함","equals":"일치","followLink":"{{table}}에서 {{column}} = 값 열기","linkColumn":"\\"{{column}}\\"을(를) 다른 테이블로 링크…","editLink":"\\"{{column}}\\" 링크 편집…","removeLink":"링크 제거","copyValue":"값 복사","filterByValue":"필터: {{column}} = 이 값","clearFilter":"필터 해제","copyColumnName":"컬럼 이름 복사","editCell":"셀 편집","setNull":"NULL로 설정","setEmpty":"빈 문자열로 설정","restoreRow":"행 복원","hideColumn":"\\"{{column}}\\" 컬럼 숨기기","copyRowsTsv_other":"행 {{count}}개를 TSV로 복사 (헤더 포함)","copyRowsCsv_other":"행 {{count}}개를 CSV로 복사","copyRowsJson_other":"행 {{count}}개를 JSON으로 복사","copyRowsInsert_other":"행 {{count}}개를 INSERT 문으로 복사","deleteRowsPending_other":"행 {{count}}개 삭제 (커밋 전까지 대기)","sendRowsToScratchpad_other":"행 {{count}}개를 스크래치패드로 보내기","sendAllToScratchpad":"불러온 행 {{count}}개 모두 스크래치패드로 보내기","sentToScratchpad":"행 {{count}}개를 스크래치패드 테이블 {{table}}에 복사했습니다.","changesSince":"지난 로드 이후: 변경 {{changed}} · 새 행 {{added}} · 사라짐 {{gone}}","changesToggle":"지난 로드 대비 변경 강조 켜기/끄기","changesDismiss":"변경 표시 지우기","previousValue":"이전 값: {{value}}","groupByValue":"{{column}} 기준으로 그룹 집계"},"link":{"title":"컬럼을 다른 테이블로 링크","source":"컬럼","hint":"이 컬럼의 값이 링크가 됩니다. 클릭하면 대상 테이블이 일치하는 행으로 필터되어 열립니다. 실제 외래키는 자동으로 링크됩니다.","targetDatabase":"대상 데이터베이스","targetTable":"대상 테이블","targetColumn":"대상 컬럼","pickTable":"테이블 선택","pickColumn":"컬럼 선택","remove":"링크 제거","cancel":"취소","save":"링크 저장","targetConnection":"대상 연결","targetNotConnected":"링크된 연결이 열려 있지 않습니다. 먼저 연결하세요."},"running":{"label":"쿼리 실행 중…","elapsed":"{{seconds}}초","stop":"중단","stopping":"중단 중…","cannotCancel":"이 엔진은 실행 중인 문장을 중단할 수 없습니다.","agentOutdated":"로컬 에이전트가 구버전이라 쿼리를 중단할 수 없습니다. `npx planche@latest`(또는 `planche upgrade`)로 갱신한 뒤 다시 연결하세요.","cancelFailed":"에이전트에 연결할 수 없어 쿼리를 중단하지 못했습니다.","abandoned":"요청 대기를 중단했습니다. 이 엔진에는 자체 취소 기능이 없어 쿼리는 서버에서 끝까지 실행될 수 있습니다."},"plan":{"empty":"실행 계획 보기(Ctrl+Shift+E)를 누르면 커서 위치의 문장을 엔진이 어떻게 처리할지 보여줍니다.","unreadable":"계획을 트리로 읽지 못해 엔진 출력을 그대로 표시합니다.","estimated":"예상치","analyzed":"실측치","estimatedHint":"옵티마이저의 예상값입니다. 문장은 실행되지 않았습니다.","analyzedHint":"문장을 실제로 실행했습니다. 행 수와 시간은 실측값입니다.","totalCost":"가장 높은 노드 비용","totalTime":"가장 느린 노드","rows":"예상 행 수","actualRows":"실제 행 수","cost":"비용","time":"시간","showRaw":"원본 출력","showTree":"계획 트리","selectNode":"노드를 선택하면 엔진이 보고한 내용을 볼 수 있습니다.","noDetails":"이 노드에 대해 엔진이 보고한 추가 정보가 없습니다.","warnings":{"fullScan":"전체 스캔","noIndex":"인덱스 없음","estimateOff":"예상 빗나감","temporary":"임시 테이블","filesort":"정렬"},"hints":{"fullScan":"테이블의 모든 행을 읽습니다. 필터 컬럼에 인덱스가 있으면 피할 수 있습니다.","noIndex":"이 접근에 쓸 수 있는 인덱스를 찾지 못했습니다.","estimateOff":"옵티마이저가 예상한 행 수가 크게 빗나갔습니다. 테이블 통계를 갱신하면 대개 해결됩니다.","temporary":"다음 단계로 넘어가기 전에 행을 임시 테이블에 담습니다.","filesort":"인덱스 없이 정렬합니다. ORDER BY에 맞는 인덱스가 있으면 정렬이 사라집니다."}},"structure":{"empty":"쿼리 구조 보기(Ctrl+Shift+G)를 실행하면 커서 위치 문장의 행이 어디서 오는지 볼 수 있습니다.","notQuery":"SELECT 문만 구조 그래프를 그릴 수 있습니다.","unsupported":"{{engine}} 문장은 구조 그래프로 읽을 수 없습니다.","parseError":"문장을 해석하지 못했습니다: {{message}}","columns_other":"{{count}}개 컬럼","columnsUnknown":"컬럼 수 모름","fit":"전체 맞춤","reveal":"에디터에서 이 부분 선택","notDrawn":"그리지 않음: {{what}}","kindTable":"테이블","kindCte":"CTE","kindCteRef":"참조","kindDerived":"서브쿼리","kindScalar":"스칼라","kindSetop":"집합","kindResult":"결과","fullscreen":"전체 화면","exitFullscreen":"전체화면 종료"}}'),p={defaultDescription:`이 작업은 되돌릴 수 없습니다.`,typeToConfirm:`확인하려면 <name/>을(를) 입력하십시오`,cancel:`취소`,confirm:`확인`,ok:`확인`},m={dialog:{createTitle:`테이블 생성`,alterTitle:`테이블 변경`,duplicateTitle:`테이블 구조 복제`,create:`생성`,alter:`변경`,cancel:`취소`,tableName:`테이블 이름`,tableNamePlaceholder:`테이블 이름을 입력하세요...`,loading:`테이블 스키마를 불러오는 중...`,tabSchema:`스키마`,tabIndexes:`인덱스`,tabProperties:`속성`,applying:`적용 중…`,cannotAlterColumns:`{{engine}}는 이미 있는 컬럼의 정의를 바꿀 수 없습니다({{columns}}). 컬럼 추가·삭제·이름 변경과 인덱스 변경은 됩니다. 컬럼 정의를 바꾸려면 테이블을 다시 만들어야 합니다.`},schema:{colField:`필드 이름`,colType:`데이터 타입`,colLength:`길이`,colDefault:`기본값`,colPk:`PK`,colNotNull:`Not Null`,colUnsigned:`Unsigned`,colAutoIncrement:`Auto Incr`,colZerofill:`Zerofill`,colComment:`설명`,empty:`정의된 컬럼이 없습니다. "컬럼 추가"를 클릭하여 추가하세요.`,add:`컬럼 추가`,remove:`컬럼 제거`},indexes:{colName:`인덱스 이름`,colType:`인덱스 유형`,colColumns:`컬럼`,empty:`정의된 인덱스가 없습니다. "인덱스 추가"를 클릭하여 추가하세요.`,add:`인덱스 추가`,remove:`인덱스 제거`},index:{addTitle:`인덱스 추가`,editTitle:`인덱스 편집`,name:`인덱스 이름`,namePlaceholder:`인덱스 이름을 입력하세요`,type:`인덱스 유형`,columns:`컬럼`,noColumns:`사용할 수 있는 컬럼이 없습니다. 먼저 스키마 탭에서 컬럼을 정의하세요.`,unnamed:`(이름 없음)`,cancel:`취소`,ok:`확인`},properties:{engine:`엔진`,charset:`문자셋`,collation:`콜레이션`,autoIncrement:`Auto Increment`,autoIncrementPlaceholder:`기본값`,comment:`설명`},info:{engine:`엔진`,version:`버전`,rowFormat:`행 형식`,rows:`행 수`,avgRowLength:`평균 행 길이`,dataLength:`데이터 크기`,createTime:`생성 시각`,updateTime:`수정 시각`,collation:`콜레이션`,comment:`설명`},copy:{title:`테이블 복사`,source:`원본`,targetConnection:`대상 연결`,targetDatabase:`대상 데이터베이스`,targetTable:`대상 테이블 이름`,what:`복사 범위`,structureAndData:`구조 및 데이터`,structureOnly:`구조만`,ifExists:`대상 테이블이 이미 있으면`,abort:`중단 (기본값)`,dropAndRecreate:`삭제 후 다시 생성 (이름 재입력 확인)`,preview:`대상에 실행할 CREATE TABLE (편집 가능)`,crossEngineHint:`대상이 {{engine}}입니다. 아래 타입을 검토하세요. MySQL 전용 속성은 제거되었습니다.`,readOnly:`읽기 전용`,loading:`불러오는 중…`,progressCreate:`테이블 생성 중…`,progressCount:`행 수 확인 중…`,progressRows:`{{total}}행 중 {{copied}}행 복사됨`,progressDone:`완료`,doneTitle:`테이블 복사 완료`,doneRows:`{{table}}에 {{count}}행을 복사했습니다.`,doneStructure:`{{table}} 구조를 생성했습니다.`,noColumns:`원본 테이블에 컬럼이 없습니다.`,exists:`대상에 {{table}} 테이블이 이미 있습니다. 다른 이름을 쓰거나 "삭제 후 다시 생성"을 선택하세요.`,dropTitle:`기존 테이블 {{table}}을(를) 삭제할까요?`,dropDescription:`복사 전에 대상 테이블과 모든 행이 삭제됩니다. 되돌릴 수 없습니다.`,dropConfirm:`삭제 후 복사`,cancelled:`복사가 취소되었습니다.`,stop:`중지`,cancel:`취소`,copy:`복사`}},h={copy:{title:`데이터베이스 복사`,source:`원본 데이터베이스`,target:`대상 데이터베이스 이름`,targetPlaceholder:`대상 데이터베이스 이름을 입력하세요`,options:`옵션`,structureAndData:`구조 및 데이터`,structureOnly:`구조만`,cancel:`취소`,copy:`복사`,creating:`{{database}} 생성 중…`,copying:`{{table}} 복사 중 ({{index}}/{{total}})…`},diff:{title:`스키마 비교`,source:`원본`,target:`대상`,pickConnection:`연결`,pickDatabase:`데이터베이스`,crossEngineHint:`엔진이 다릅니다. 타입 이름이 방언마다 달라 대부분의 컬럼이 타입 변경으로 표시됩니다.`,sameSide:`원본과 대상이 같은 데이터베이스입니다.`,summary:`변경 {{changed}}, 대상에 없음 {{missingTarget}}, 대상에만 있음 {{missingSource}}, 동일 {{identical}}`,showIdentical:`동일한 테이블 표시`,identicalAll:`테이블이 동일합니다.`,column:`컬럼`,index:`인덱스`,object:`객체`,selectTable:`차이를 볼 테이블을 선택하세요.`,missingInTarget:`{{table}}이(가) 대상에 없습니다. 스크립트가 생성합니다.`,missingInSource:`{{table}}이(가) 대상에만 있습니다. 스크립트가 삭제합니다 (DROP 포함을 켜지 않으면 주석 처리).`,includeDrops:`DROP 문을 실제 SQL로 포함 (기본: 주석 처리)`,tabTitle:`동기화 {{database}}`,close:`닫기`,compare:`비교`,comparing:`비교 중…`,openScript:`스크립트를 편집기에서 열기`,noDefinition:`CREATE 문을 가져올 수 없음`},create:{title:`데이터베이스 생성`,name:`데이터베이스 이름`,namePlaceholder:`데이터베이스 이름을 입력하세요`,charset:`문자셋`,collation:`콜레이션`,cancel:`취소`,create:`생성`},csv:{title:`{{format}}로 내려받기`,target:`대상`,targetQueryResult:`현재 쿼리 결과`,targetTableData:`테이블 데이터`,tableName:`테이블 이름`,tableNamePlaceholder:`테이블 이름을 입력하세요`,delimiter:`구분자`,delimiterComma:`쉼표 (,)`,delimiterTab:`탭 (\\t)`,delimiterSemicolon:`세미콜론 (;)`,delimiterPipe:`파이프 (|)`,includeHeaders:`헤더 포함`,cancel:`취소`,download:`다운로드`,downloading:`다운로드 중...`,progress:`{{total}}행 중 {{loaded}}행 기록`,progressUnknown:`{{loaded}}행 기록`,stop:`중지`,done:`{{table}}의 {{count}}행을 {{format}}로 내보냈습니다.`,database:`데이터베이스`,databasePlaceholder:`데이터베이스 선택`},html:{title:`스키마를 HTML로 내보내기`,database:`데이터베이스`,selectDatabase:`데이터베이스를 선택하세요`,tables:`포함할 테이블`,selectAll:`전체 선택`,deselectAll:`전체 해제`,noTables:`사용할 수 있는 테이블이 없습니다.`,include:`포함 항목`,includeColumns:`컬럼`,includeIndexes:`인덱스`,includeProperties:`속성`,cancel:`취소`,generate:`생성`,generating:`생성 중...`,sectionColumns:`컬럼`,sectionIndexes:`인덱스`,sectionProperties:`속성`,docTitle:`스키마: {{database}}`,heading:`데이터베이스: {{database}}`,summary:`테이블: {{count}}개 | 생성 시각: {{date}}`,footer:`Planche 2026으로 생성됨`},dataDiff:{title:`데이터 비교`,pickTable:`테이블`,hint:`원본 테이블의 기본키로 행을 매칭하고 값을 텍스트로 비교합니다. 한쪽당 최대 {{cap}}행을 읽으므로 큰 테이블은 먼저 필터로 줄이세요.`,sameSide:`원본과 대상이 같은 테이블입니다.`,noPrimaryKey:`{{table}}에 기본키가 없어 행을 매칭할 수 없습니다.`,keyMissingInTarget:`대상 테이블에 키 컬럼이 없습니다: {{columns}}`,summary:`키: {{key}} — 대상에 없음 {{added}}, 다름 {{changed}}, 대상에만 있음 {{removed}}, 동일 {{identical}}`,capped:`양쪽 모두 처음 {{cap}}행만 비교했습니다.`,ignoredColumns:`비교에서 제외된 컬럼(한쪽에만 있음): {{columns}}`,added_other:`대상에 없음 {{count}}`,changed_other:`다름 {{count}}`,removed_other:`대상에만 있음 {{count}}`,none:`이 그룹에는 없습니다.`,more:`… {{count}}개 더 있음`,includeDeletes:`DELETE 문을 실제 SQL로 포함 (기본: 주석 처리)`,tabTitle:`데이터 동기화 {{table}}`,loading:`행 불러오는 중 — 원본: {{source}}, 대상: {{target}}`},schema:{createTitle:`스키마 생성`,name:`스키마 이름`,namePlaceholder:`스키마 이름을 입력하세요`,create:`생성`,cancel:`취소`},groupBy:{title:`그룹 집계`,description:`{{table}}의 행을 선택한 컬럼으로 묶어 셉니다.`,columns:`그룹 기준`,aggregate:`추가 집계`,countOnly:`건수만`,column:`컬럼`,minCount:`그룹당 최소 행 수`,useFilter:`그리드의 현재 필터 적용`,noIndexWarning:`선택한 컬럼 중 인덱스의 선두 컬럼이 없어 테이블 전체를 읽고 정렬합니다. 큰 테이블에서는 오래 걸릴 수 있습니다.`,preview:`쿼리`,pickColumn:`그룹 기준 컬럼을 하나 이상 선택하세요.`,openInTab:`새 탭에서 열기`,run:`실행`,tabTitle:`{{table}} 그룹 집계`,indexed:`인덱스 선두 컬럼`,connection:`연결`,database:`데이터베이스`,table:`테이블`}},g={manager:{title:`사용자 관리`,addUser:`사용자 추가`,removeUser:`사용자 제거`,noUsers:`불러온 사용자가 없습니다`,grantScope:`권한 범위`,apply:`적용`,close:`닫기`,removed:`사용자 '{{user}}'@'{{host}}'을(를) 제거했습니다`,selectUserFirst:`먼저 사용자를 선택하세요`,applied:`변경 사항을 적용했습니다`,noChanges:`적용할 권한 변경이 없습니다.`},add:{title:`사용자 추가`,username:`사용자 이름`,usernamePlaceholder:`사용자 이름을 입력하세요`,host:`호스트`,password:`비밀번호`,passwordPlaceholder:`비밀번호를 입력하세요`,confirmPassword:`비밀번호 확인`,confirmPasswordPlaceholder:`비밀번호를 다시 입력하세요`,plugin:`인증 플러그인`,cancel:`취소`,add:`추가`,usernameRequired:`사용자 이름을 입력해야 합니다`,passwordMismatch:`비밀번호가 일치하지 않습니다`,added:`사용자 '{{user}}'@'{{host}}'을(를) 추가했습니다`},privileges:{globalTitle:`전역 권한`,databaseTitle:`데이터베이스 권한`,tableTitle:`테이블 권한`,checkAll:`전체 선택`,uncheckAll:`전체 해제`,categoryData:`데이터`,categoryStructure:`구조`,categoryAdministration:`관리`},grantTree:{globalPrivileges:`전역 권한`}},_={close:`닫기`,noActiveConnection:`활성 연결이 없습니다`,variableName:`변수 이름`,value:`값`,scope:{session:`세션`,global:`전역`},findReplace:{findPlaceholder:`찾기`,replacePlaceholder:`바꾸기`,found:`{{count}}개 찾음`,noResults:`결과 없음`,previous:`이전`,next:`다음`,close:`닫기`,replace:`바꾸기`,all:`모두`,caseSensitive:`대소문자 구분`,regex:`정규식`,wholeWord:`단어 단위`},flush:{title:`Flush`,executed:`실행됨: {{command}}`,executeError:`{{command}} 실행 중 오류: {{message}}`},localHistory:{title:`로컬 히스토리`,description:`이 연결의 편집기 텍스트 버전입니다. 실행할 때, 타이핑이 멈췄을 때, 탭을 닫을 때 저장됩니다.`,empty:`저장된 버전이 아직 없습니다.`,noMatch:`검색과 일치하는 버전이 없습니다.`,notPersisted:`설정 > 안전에서 “새로고침 후에도 쿼리 히스토리 유지”가 꺼져 있어 버전이 이번 세션에만 보관됩니다.`,searchPlaceholder:`버전 검색`,scopeTab:`이 탭`,scopeAll:`전체 탭`,compareCurrent:`현재와 비교`,comparePrevious:`이전과 비교`,diffAgainstCurrent:`현재 편집기 내용과 비교`,diffAgainstPrevious:`{{time}} 버전과 비교`,noPrevious:`비교할 이전 버전이 없습니다`,restored:`로컬 히스토리에서 편집기 내용을 복원했습니다`,restore:`이 버전 복원`,openInNewTab:`새 탭에서 열기`,openedInTab:`새 탭에서 버전을 열었습니다`,delete:`이 버전 삭제`,clearAll:`히스토리 지우기`,chars:`{{count}}자`,reason:{execute:`실행 전`,edit:`편집 중`,replaced:`덮어쓰기 전`,restore:`복원 전`,close:`닫기 전`}},processList:{title:`프로세스 목록`,refresh:`새로 고침`,autoRefresh:`자동 새로 고침`,empty:`표시할 프로세스가 없습니다`,kill:`종료`,killProcess:`프로세스 종료`,selectToKill:`종료할 프로세스를 선택하세요`,killed:`프로세스 {{id}}을(를) 종료했습니다`,killError:`프로세스 종료 중 오류: {{message}}`,loadError:`프로세스 목록을 불러오는 중 오류: {{message}}`,updatedAt:`{{time}} 갱신`,filterPlaceholder:`사용자, 호스트, DB, SQL로 필터...`,hideIdle:`유휴 숨기기`,noMatch:`필터에 맞는 프로세스가 없습니다`,self:`나`,selfHint:`Planche 자신의 세션입니다`,statementOf:`#{{id}}의 실행 구문`,noStatement:`실행 중인 구문 없음`,copy:`복사`,copied:`복사됨`,killConfirmTitle:`프로세스 {{id}}을(를) 종료할까요?`,killConfirmDescription:`{{user}}@{{host}} 세션이 끊기고 실행 중인 구문이 중단됩니다. 열린 트랜잭션은 롤백됩니다.`,stats:{total:`전체`,active:`활성`,idle:`유휴`,longest:`최장 실행`},columns:{id:`Id`,user:`사용자`,host:`호스트`,db:`db`,command:`명령`,time:`시간`,state:`상태`,info:`정보`,action:`작업`}},status:{title:`서버 상태`,filterPlaceholder:`상태 변수 필터...`,empty:`표시할 상태 변수가 없습니다`,loadError:`상태를 불러오는 중 오류: {{message}}`},variables:{title:`서버 변수`,filterPlaceholder:`변수 필터...`,empty:`표시할 변수가 없습니다`,loadError:`변수를 불러오는 중 오류: {{message}}`}},v={empty:{title:`ERD를 보려면 Prisma 스키마 파일(.prisma)을 여세요`,description:`모델, enum, 관계가 자동으로 분석됩니다`,openFile:`.prisma 파일 열기`,dropHint:`또는 파일을 이 영역으로 드래그 앤 드롭하세요`},entity:{enumBadge:`ENUM`,modelBadge:`MODEL`,columns:{value:`값`,comment:`설명`,type:`타입`,column:`컬럼`},linkBadge:`링크`,externalTitle:`{{location}}의 링크된 테이블 (실제 외래키가 아닌 컬럼 링크)`,nullable:`NULL을 허용하는 컬럼`},toolbar:{refresh:`새로 고침`,zoomIn:`확대`,zoomOut:`축소`,resetView:`보기 초기화`,center:`가운데로`,fitAll:`전체 맞춤`,spreadAll:`겹침 정리`,resetLayout:`레이아웃 초기화`,legendOneToMany:`1:N (FK)`,tables:`테이블:`,relations:`관계:`,columns:`컬럼:`,fullscreen:`전체화면`,exitFullscreen:`전체화면 종료`},viewer:{noServerConnection:`활성 서버 연결이 없습니다`,loading:`{{database}}에서 스키마를 불러오는 중...`,loadFailed:`ERD를 불러오지 못했습니다`,noDatabase:`선택된 데이터베이스가 없습니다.`,selectDatabaseHint:`스키마 트리에서 데이터베이스를 선택한 뒤 ERD 보기를 여세요.`}},y={runAnyway:`그래도 실행`,query:{rowsReturned:`{{count}}개 행 반환됨`,rowsAffected:`{{count}}개 행 영향받음`,rowsReturnedLimited:`{{count}}개 행 반환됨 ({{limit}}개로 제한됨; 더 가져오려면 LIMIT을 추가하세요)`,notConnected:`연결되지 않았습니다`,fileNotOpen:`SQLite 파일이 아직 열려 있지 않습니다 — 위의 "파일 다시 열기"를 클릭해 접근 권한을 다시 부여하세요.`,failed:`쿼리 실패`,nothingToExecute:`실행할 내용이 없습니다`,dryRunMismatch:`미리보기는 {{predicted}}행을 예상했지만 실제로는 {{actual}}행이 바뀌었습니다. 미리보기를 읽은 뒤 데이터가 바뀌었을 수 있고, 그렇지 않다면 미리보기가 이 문장과 맞지 않은 것입니다.`},destructive:{title_one:`파괴적인 구문을 실행하시겠습니까?`,title_other:`파괴적인 구문 {{count}}개를 실행하시겠습니까?`,description:`다음 구문은 데이터를 영구적으로 변경하거나 삭제합니다. 되돌릴 수 없습니다.`,unknownTarget:`(알 수 없음)`,deleteAll:`{{target}}의 모든 행 DELETE`,updateAll:`{{target}}의 모든 행 UPDATE`,alterDrop:`{{target}}의 DROP COLUMN/PARTITION`},readOnly:{refused:`"{{label}}" 연결은 읽기 전용입니다. {{count}}개 구문이 데이터 또는 스키마를 변경합니다.`,title:`"{{label}}"은(는) 읽기 전용입니다`,description:`이 구문들은 데이터 또는 스키마를 변경합니다. 그래도 이 연결에서 실행하시겠습니까?`},transaction:{startFailed:`트랜잭션을 시작할 수 없습니다`,started:`트랜잭션이 시작되었습니다 — 완료되면 Commit 또는 Rollback 하세요`,implicitCommit:`{{kind}} 구문으로 인해 열린 트랜잭션이 암시적으로 COMMIT 되었습니다`,committed:`트랜잭션이 커밋되었습니다`,rolledBack:`트랜잭션이 롤백되었습니다`,commandFailed:`{{name}} 실패`,commandFailedWith:`{{name}} 실패: {{message}}`},save:{notBrowserSqlite:`브라우저 SQLite 연결이 아닙니다.`,inMemory:`인메모리 데이터베이스입니다: 다운로드로만 내보낼 수 있습니다.`,noFileSystemAccess:`이 브라우저에는 File System Access API가 없습니다 (Chrome/Edge 전용): 데이터베이스를 제자리에 쓰는 대신 다운로드로 내보냅니다.`,noWritableHandle:`파일이 쓰기 가능한 핸들 없이 열렸습니다: 다운로드로 내보냅니다.`},agent:{devProxyUrl:`{{url}} (개발 프록시 경유)`,notPlanche:`응답은 있었지만 Planche 에이전트가 아닙니다`,unreachable:"{{url}}에서 Planche 에이전트에 연결할 수 없습니다 — `npx planche`를 실행하세요 ({{message}})",httpError:`HTTP 오류: {{status}} {{statusText}}`,emptyResponse:`터널링 서버가 빈 응답을 반환했습니다`,reconnected:`{{name}}에 다시 연결했습니다 — 에이전트가 연결을 끊었었습니다 (재시작 또는 유휴 시간 초과).`},sample:{profileName:`샘플 쇼핑몰 (브라우저 내)`,downloadFailed:`샘플 데이터베이스를 다운로드할 수 없습니다 ({{status}})`,tabTitle:`쿼리 1`},sqliteFile:{tooSmall:`파일이 너무 작아 SQLite 데이터베이스가 아닙니다.`,notSqlite:`SQLite 데이터베이스가 아닙니다 (또는 SQLCipher 등으로 암호화된 파일입니다). 16바이트 헤더가 "SQLite format 3"이 아닙니다.`,badPageSize:`손상된 SQLite 헤더: 잘못된 페이지 크기 {{size}}.`,unreadable:`SQLite가 파일을 읽을 수 없습니다: {{message}}`,pickerDescription:`SQLite 데이터베이스`,walNotLoaded:`이 데이터베이스는 WAL 모드이며 -wal 파일이 로드되지 않았습니다. 저장하기 전에 -wal 파일을 로드하거나, 배너에서 -wal 파일이 없음을 확인하세요.`,changedOnDisk:`{{name}} 파일이 로드된 후 디스크에서 변경되었습니다 (다른 프로그램이 썼습니다). 저장하면 그 변경 사항을 덮어쓰게 됩니다 — 파일을 다시 열고 편집을 다시 하거나, 터널링 서버를 사용하세요.`,walHasChanges:`{{name}}-wal에 새로운 변경 사항이 있습니다; 저장하기 전에 로드하세요.`,walChangedOnDisk:`{{name}}-wal 파일이 로드된 후 다른 프로그램에 의해 기록되었습니다; 저장하기 전에 파일을 다시 여세요.`,writeDenied:`{{name}}에 대한 쓰기 권한이 부여되지 않았습니다. 브라우저 프롬프트에서 허용하거나, 대신 다운로드로 내보내세요.`},environment:{none:`없음`,green:`녹색 (개발)`,blue:`파랑`,yellow:`노랑 (스테이징)`,orange:`주황`,red:`빨강 (운영)`,purple:`보라`},scratchpad:{profileName:`스크래치패드`,namePromptTitle:`스크래치패드 테이블 이름`,namePromptDescription:`스크래치패드에 {{table}} 테이블이 이미 있습니다. 다른 이름을 입력하세요.`,nameTaken:`{{table}} 테이블이 이미 있습니다.`},federated:{pulling:`{{connection}}에서 {{table}} 가져오는 중…`,capped:`{{table}}: 처음 {{limit}}행만 가져왔습니다.`,templateLine1:`열려 있는 연결의 테이블을 "연결 이름".database.table 로 참조하세요. 실행 전에 이 스크래치패드로 복사됩니다.`,templateLine2:`테이블당 최대 {{limit}}행. 쿼리 자체는 브라우저의 SQLite에서 실행됩니다.`,templateConnections:`열린 연결: {{names}}`,templateNone:`아직 열린 다른 연결이 없습니다. 연결한 뒤 여기서 참조하세요.`,done:`원격 테이블 {{tables}}개에서 {{rows}}행을 스크래치패드로 가져왔습니다.`,pullingProgress:`{{connection}}에서 {{table}} 가져오는 중: {{loaded}} / {{total}}행…`},paged:{noColumns:`{{table}}에 컬럼이 없습니다.`,cancelled:`취소되었습니다.`}},b={title:`이용약관`,version:`버전 {{version}}`,englishOnly:`약관 전문은 영어로 제공됩니다. 시작 화면의 요약은 사용 중인 언어로 표시됩니다.`,privacyLink:`개인정보처리방침`,refundLink:`환불 정책`,online:`planche.dev에서 읽기`,updated:`최종 수정 {{date}}`},x={title:`{{kind}} 실행 시 {{count}}행이 영향받습니다`,titleUnknown:`{{kind}} — 영향 행 수를 알 수 없음`,description:`지금 이 문장이 건드릴 행을 SELECT로 미리 읽은 것입니다. 아직 아무것도 쓰지 않았습니다.`,previewFailed:`미리보기 쿼리가 실패했습니다: {{error}}
2
+ 그래도 문장을 실행할 수는 있습니다.`,noRows:`일치하는 행이 없습니다 — 이 문장은 아무것도 바꾸지 않습니다.`,truncated:`{{count}}행 중 처음 {{shown}}행만 표시합니다.`,previewQuery:`미리보기 쿼리`,run:`{{kind}} 실행 ({{count}}행)`,runAnyway:`그래도 실행`},S={badge:`PRO`,tooltip:`Pro 라이선스가 필요합니다.`,noticeTitle:`Pro 기능`,notice:`PRO 표시가 있는 기능은 Pro 라이선스가 필요합니다.`,licenseTitle:`Planche Pro`,licenseDescription:`구매 메일에 담긴 라이선스 키를 붙여 넣으세요. 이 컴퓨터에서 확인하며 아무 데도 전송하지 않습니다.`,blocked:`{{feature}}에는 Pro 라이선스가 필요합니다.`,keyLabel:`라이선스 키`,activate:`활성화`,remove:`라이선스 삭제`,active:`Pro가 활성화되어 있습니다.`,licensedTo:`{{email}} 님의 라이선스`,validUntil:`{{date}}까지 유효`,expiredOn:`{{date}}에 만료되었습니다. Pro 기능을 계속 쓰려면 갱신하세요.`,invalidKey:`Planche 라이선스 키가 아닙니다.`,notConfigured:`이 빌드는 라이선스 키를 확인할 수 없습니다. 제보해 주세요.`,noWebcrypto:`이 브라우저는 라이선스 키를 확인할 수 없습니다.`,pricing:`가격 보기`,features:{ssh_tunnel:`SSH 터널`,compare_schemas:`스키마 비교`,compare_data:`데이터 비교`,copy_table:`테이블 복사`,dry_run:`Dry run`,federated:`페더레이티드 쿼리`,scratchpad:`스크래치패드`,column_link:`컬럼 링크`,sync:`연결 동기화`,ai_explain:`AI 설명`},included:`Pro에 포함된 기능`,haveKey:`이미 라이선스 키가 있나요?`,perMonth:`/ 월`,priceNote:`1년에 한 번 {{annual}} 청구. 월간 결제는 {{monthly}}입니다.`,featureDetails:{sync:`브라우저에서 암호화한 프로필을 모든 컴퓨터에서`,ssh_tunnel:`점프 호스트 뒤의 데이터베이스에 비밀번호·키·ssh-agent로 접속`,compare_schemas:`열려 있는 두 연결을 비교하고 ALTER 스크립트 받기`,compare_data:`두 테이블의 행을 비교하고 INSERT·UPDATE 스크립트 받기`,copy_table:`다른 연결로, 다른 엔진으로 테이블을 다시 만들기`,dry_run:`UPDATE·DELETE가 몇 행을 어떻게 바꾸는지 실행 전에 확인`,federated:`서로 다른 연결에 있는 테이블을 조인`,scratchpad:`작업용 데이터를 담는 로컬 SQLite 데이터베이스`,column_link:`그리드에서 따라갈 수 있는 가상 외래키`,ai_explain:`실패한 문장이나 느린 플랜의 이유를 모델에게 묻는다 — 스키마까지 붙여서`}},C={npxNote:`Node.js 22 이상이 필요합니다. 영구적으로 설치되는 것은 없고, npx가 npm 레지스트리에서 바로 받아 실행합니다.`,installNote:`Node.js가 없어도 됩니다. 관리자 권한 없이 홈 디렉터리 안에만 설치되며, 이후에는 planche 명령으로 언제든 실행합니다.`},w={unsupported:`{{engine}}은(는) 실행 계획을 제공하지 않습니다.`,oneStatement:`실행 계획은 한 번에 한 문장만 분석합니다. 분석할 문장에 커서를 두거나 선택하세요.`},T={title:`AI 어시스턴트`,intro:`쿼리를 만들어 달라고 하거나 할 일을 시키세요 — 스키마를 읽고, 탭에 SQL을 쓰고, 실행합니다. 지금 열려 있는 연결에서만 동작하며, 대화는 연결마다 따로 남습니다.`,privacy:`도구가 읽은 것은 샘플 행을 포함해 사용자의 provider로 전송됩니다. planche.dev로는 아무것도 가지 않습니다.`,placeholder:`예: 데모 데이터베이스에서 월별 매출 쿼리 만들어줘`,send:`보내기`,stop:`중지`,clear:`새 대화`,working:`작업 중…`,tabTitle:`AI 쿼리`,approvalTitle:`쓰기 작업입니다. 실행할까요?`,approve:`실행`,reject:`건너뛰기`,rejected:`사용자가 실행을 거부했습니다.`,notConfigured:`에이전트에 AI 키가 없습니다. 설정 ▸ AI에서 추가하세요.`,needsAgent:`이 로컬 에이전트는 아직 도구를 실행할 수 없습니다. 업데이트 후 다시 페어링하세요.`,failed:`실패`,empty:`아직 물어본 것이 없습니다.`,steps:`{{count}}단계`,tooManySteps:`{{count}}단계까지 진행했지만 답에 이르지 못했습니다.`,collapse:`접기`,planWarningTitle:`이 쿼리는 풀스캔입니다. 그래도 실행할까요?`,interrupted:`새로고침으로 중단됨.`,external:`Planche 밖에서 요청한 작업입니다`},E={title:`AI 에이전트 연결 (MCP)`,description:`MCP를 지원하는 AI 에이전트에서 Planche의 도구를 쓸 수 있게 합니다.`,readsLabel:`읽기`,reads:`열려 있는 데이터베이스를 읽고, 그 결과가 상대 프로그램으로 갑니다.`,writesLabel:`쓰기`,writes:`데이터를 바꾸는 문장은 승인을 받아야 합니다. DROP·TRUNCATE는 못 합니다.`,needsLabel:`조건`,needs:`AI 패널이 열려 있어야 합니다.`,tokenLabel:`토큰`,token:`하나를 여러 프로그램이 같이 씁니다. 폐기하면 전부 끊깁니다.`,command:`Claude Code에 추가`,json:`직접 설정하기`,stored:`{{path}}에 저장됩니다.`,revoke:`토큰 폐기`,revoked:`폐기했습니다. 새로 발급하려면 이 창을 다시 여세요.`},D={title:`연결 동기화`,description:`연결 프로필을 이 브라우저에서 암호화해 planche.dev에 보관합니다. 다른 컴퓨터에서 그대로 쓸 수 있습니다.`,stored:`서버에는 암호화된 덩어리 하나만 저장됩니다. 호스트·사용자·비밀번호·SSH 키를 읽을 수 없습니다.`,unavailable:`동기화는 planche.dev에서만 동작합니다. 지금 이 Planche는 로컬 에이전트가 서빙하고 있고, 에이전트는 외부로 나가지 못하게 막혀 있습니다.`,signIn:`GitHub으로 로그인`,signedInAs:`{{email}}로 로그인됨`,signOut:`로그아웃`,createTitle:`패스프레이즈 정하기`,createHint:`이 패스프레이즈가 프로필을 암호화합니다. 서버로 전송되지 않으므로, 잃어버리면 저장된 사본은 복구할 수 없습니다 — 프로필이 남아 있는 컴퓨터에서 다시 만드는 수밖에 없습니다.`,passphrase:`패스프레이즈`,confirm:`패스프레이즈 확인`,mismatch:`두 패스프레이즈가 다릅니다.`,tooShort:`{{count}}자 이상 입력하세요.`,enable:`동기화 켜기`,unlockTitle:`프로필 잠금 해제`,unlockHint:`동기화를 켤 때 정한 패스프레이즈를 입력하세요.`,unlock:`잠금 해제`,wrongPassphrase:`패스프레이즈가 틀렸거나 저장된 사본이 손상되었습니다.`,syncNow:`지금 동기화`,lastSynced:`마지막 동기화 {{when}}`,neverSynced:`아직 동기화하지 않음`,profiles_one:`프로필 {{count}}개`,profiles_other:`프로필 {{count}}개`,changePassphrase:`패스프레이즈 변경`,deleteVault:`서버에서 삭제`,deleteVaultConfirm:`planche.dev에 저장된 암호화 사본을 지울까요? 이 컴퓨터의 프로필은 그대로 남습니다.`,offline:`planche.dev에 연결할 수 없습니다.`,working:`처리 중…`,serverError:`planche.dev가 요청을 끝내지 못했습니다. 잠시 후 다시 시도하세요.`,signInShort:`로그인`,needsPro:`로그인되었습니다. 프로필 동기화에는 Pro 라이선스가 필요하며, 라이선스가 생기면 바로 동작합니다.`,deleteAccount:`계정 삭제`,deleteAccountConfirm:`계정을 삭제할까요? 저장된 사본과 로그인 정보가 함께 지워집니다. 이 컴퓨터의 프로필은 그대로 남습니다.`,notDeployed:`이 사이트에는 연결 동기화가 아직 켜져 있지 않습니다.`},O={app:e,language:t,settings:n,menu:r,about:i,connection:a,toolbar:o,footer:s,palette:c,welcome:l,schema:u,query:d,result:f,confirm:p,table:m,database:h,user:g,command:_,erd:v,services:y,terms:b,dryRun:x,pro:S,install:C,explain:w,ai:T,mcp:E,sync:D};export{i as about,T as ai,e as app,_ as command,p as confirm,a as connection,h as database,O as default,x as dryRun,v as erd,w as explain,s as footer,C as install,t as language,E as mcp,r as menu,c as palette,S as pro,d as query,f as result,u as schema,y as services,n as settings,D as sync,m as table,b as terms,o as toolbar,g as user,l as welcome};
@@ -1 +1 @@
1
- import{a as e,n as t}from"./XzPc-eVf.js";import{l as n,m as r,t as i}from"./CKOS5Y-e.js";import{r as a,t as o}from"./ClyAuDY9.js";import{a as s,i as c,n as l,r as u,t as d}from"./D_2UqK4k.js";import{n as f}from"./BBSxV90W.js";import{a as p,i as m,n as h,o as g,r as _,t as v}from"./DxuXBECK.js";import{t as y}from"./NY_tAtcY.js";var b=n();function x(){let n=t(e=>e.activeDialog),x=t(e=>e.closeDialog),S=f(),{t:C}=r();return(0,b.jsx)(v,{open:n===`general-settings`,onOpenChange:e=>{e||x()},children:(0,b.jsxs)(h,{className:`sm:max-w-[560px]`,children:[(0,b.jsxs)(p,{children:[(0,b.jsx)(g,{children:C(`settings.general.title`)}),(0,b.jsx)(_,{children:C(`settings.general.description`)})]}),(0,b.jsxs)(`div`,{className:`grid gap-2`,children:[(0,b.jsx)(y,{id:`s-history`,checked:S.persistQueryHistory,onChange:e=>S.setPersistQueryHistory(e),label:C(`settings.persistHistory`),hint:C(`settings.persistHistoryHint`)}),(0,b.jsxs)(`div`,{className:`grid grid-cols-[1fr_200px] items-center gap-3 rounded-md border p-3`,children:[(0,b.jsxs)(`div`,{className:`grid gap-0.5`,children:[(0,b.jsx)(`span`,{className:`text-sm font-medium`,children:C(`settings.language`)}),(0,b.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:C(`settings.languageHint`)})]}),(0,b.jsxs)(d,{value:S.locale,onValueChange:e=>S.setLocale(e),children:[(0,b.jsx)(c,{children:(0,b.jsx)(s,{})}),(0,b.jsxs)(l,{children:[(0,b.jsx)(u,{value:`auto`,children:C(`language.auto`,{name:C(`language.${a()}`)})}),o.map(e=>(0,b.jsx)(u,{value:e,children:C(`language.${e}`)},e))]})]})]}),(0,b.jsx)(y,{id:`s-analytics`,checked:S.analyticsEnabled,onChange:S.setAnalyticsEnabled,label:C(`settings.analytics`),hint:e()?C(`settings.analyticsHint`):C(`settings.analyticsUnavailableHint`)})]}),(0,b.jsx)(m,{children:(0,b.jsx)(i,{onClick:x,children:C(`settings.done`)})})]})})}export{x as GeneralSettingsDialog};
1
+ import{a as e,n as t}from"./XzPc-eVf.js";import{l as n,m as r,t as i}from"./CKOS5Y-e.js";import{r as a,t as o}from"./fDSXGLmI.js";import{a as s,i as c,n as l,r as u,t as d}from"./DsllOXPq.js";import{n as f}from"./BBSxV90W.js";import{a as p,i as m,n as h,o as g,r as _,t as v}from"./DxuXBECK.js";import{t as y}from"./ChiscGY_.js";var b=n();function x(){let n=t(e=>e.activeDialog),x=t(e=>e.closeDialog),S=f(),{t:C}=r();return(0,b.jsx)(v,{open:n===`general-settings`,onOpenChange:e=>{e||x()},children:(0,b.jsxs)(h,{className:`sm:max-w-[560px]`,children:[(0,b.jsxs)(p,{children:[(0,b.jsx)(g,{children:C(`settings.general.title`)}),(0,b.jsx)(_,{children:C(`settings.general.description`)})]}),(0,b.jsxs)(`div`,{className:`grid gap-2`,children:[(0,b.jsx)(y,{id:`s-history`,checked:S.persistQueryHistory,onChange:e=>S.setPersistQueryHistory(e),label:C(`settings.persistHistory`),hint:C(`settings.persistHistoryHint`)}),(0,b.jsxs)(`div`,{className:`grid grid-cols-[1fr_200px] items-center gap-3 rounded-md border p-3`,children:[(0,b.jsxs)(`div`,{className:`grid gap-0.5`,children:[(0,b.jsx)(`span`,{className:`text-sm font-medium`,children:C(`settings.language`)}),(0,b.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:C(`settings.languageHint`)})]}),(0,b.jsxs)(d,{value:S.locale,onValueChange:e=>S.setLocale(e),children:[(0,b.jsx)(c,{children:(0,b.jsx)(s,{})}),(0,b.jsxs)(l,{children:[(0,b.jsx)(u,{value:`auto`,children:C(`language.auto`,{name:C(`language.${a()}`)})}),o.map(e=>(0,b.jsx)(u,{value:e,children:C(`language.${e}`)},e))]})]})]}),(0,b.jsx)(y,{id:`s-analytics`,checked:S.analyticsEnabled,onChange:S.setAnalyticsEnabled,label:C(`settings.analytics`),hint:e()?C(`settings.analyticsHint`):C(`settings.analyticsUnavailableHint`)})]}),(0,b.jsx)(m,{children:(0,b.jsx)(i,{onClick:x,children:C(`settings.done`)})})]})})}export{x as GeneralSettingsDialog};
@@ -1 +1 @@
1
- import{r as e}from"./hePW80VL.js";import{h as t,n,t as r}from"./XzPc-eVf.js";import{l as i,m as a,t as o}from"./CKOS5Y-e.js";import{a as s,i as c,n as l,r as u,t as d}from"./D_2UqK4k.js";import{t as ee}from"./DTxGpkJp.js";import{a as f}from"./Cw_LYT6k.js";import{n as p}from"./DbRMSZEW.js";import{t as te}from"./DlKZCiMg.js";import{H as ne,U as re,c as m,j as h,l as g}from"./D7Ze5md9.js";import{a as ie,i as ae,n as oe,o as se,t as ce}from"./DxuXBECK.js";var _=e(t(),1),v=i(),y=e=>e instanceof Error?e.message:String(e),b=e=>e.hostName||e.host||e.file||e.id,le=`w-full rounded border bg-background px-2 py-1 text-xs font-mono outline-none focus:ring-1 focus:ring-primary disabled:opacity-50 min-h-[160px] resize-y`;function x(){let{t:e}=a(),t=n(e=>e.activeDialog),i=n(e=>e.closeDialog),x=n(e=>e.showMessage),S=r(`copy-table`),C=ee(e=>e.activeConnections),w=t===`copy-table`,T=S?.connectionId??``,E=String(S?.metadata?.database??``),D=S?.nodeText??``,O=C.find(e=>e.id===T),ue=C.filter(e=>e.serverConnectionId),[k,de]=(0,_.useState)(T),[A,j]=(0,_.useState)([]),[M,N]=(0,_.useState)(``),[P,F]=(0,_.useState)(D),[I,L]=(0,_.useState)(`structure_data`),[R,z]=(0,_.useState)(`abort`),[B,V]=(0,_.useState)(``),[H,U]=(0,_.useState)(null),[W,G]=(0,_.useState)(null),[K,q]=(0,_.useState)(null),[J,Y]=(0,_.useState)(!1),X=(0,_.useRef)(null),Z=C.find(e=>e.id===k),Q=Z?p(k):null,fe=!!O&&!!Z&&p(T).id===Q?.id;(0,_.useEffect)(()=>{if(!w||!Z?.serverConnectionId)return;let e=!1,t=p(k),n=f(Z.serverConnectionId);return(async()=>{j([]);try{let r=await t.introspect.listDatabases(n);if(e)return;j(r);let i=k===T,a=i||r.includes(E)?E:r[0]??``;N(a),F(e=>i&&a===E&&e===D?`${D}_copy`:e)}catch(t){e||q(y(t))}})(),()=>{e=!0}},[w,k]),(0,_.useEffect)(()=>{if(!w||!Z||!M||!P.trim()||!O)return;let e=!1;return(async()=>{U(null);try{let t=await ne({connectionId:T,database:E,table:D},{connectionId:k,database:M,table:P.trim()});e||V(p(k).ddl.createTable(t))}catch(t){e||U(y(t))}})(),()=>{e=!0}},[w,k,M,P]);function $(e){if(!e){if(J){X.current?.abort();return}i()}}async function pe(){if(!M||!P.trim()||!B.trim())return;Y(!0),q(null),G({phase:`create`,copied:0,total:null});let t=new AbortController;X.current=t;try{let n=await re({source:{connectionId:T,database:E,table:D},target:{connectionId:k,database:M,table:P.trim()},mode:I,onConflict:R,createSql:B},G,t.signal);i(),await x({title:e(`table.copy.doneTitle`),description:I===`structure_data`?e(`table.copy.doneRows`,{count:n.rows,table:P.trim()}):e(`table.copy.doneStructure`,{table:P.trim()}),tone:`success`})}catch(e){e instanceof te||q(y(e)),G(null)}finally{Y(!1),X.current=null}}let me=W?.phase===`copy`&&W.total?Math.min(100,Math.round(W.copied/W.total*100)):null,he=W?W.phase===`create`?e(`table.copy.progressCreate`):W.phase===`count`?e(`table.copy.progressCount`):W.phase===`copy`?e(`table.copy.progressRows`,{copied:W.copied,total:W.total??`?`}):e(`table.copy.progressDone`):``;return(0,v.jsx)(ce,{open:w,onOpenChange:$,children:(0,v.jsxs)(oe,{className:`sm:max-w-[640px]`,children:[(0,v.jsx)(ie,{children:(0,v.jsx)(se,{children:e(`table.copy.title`)})}),(0,v.jsxs)(`div`,{className:`space-y-4`,children:[(0,v.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,v.jsx)(m,{children:e(`table.copy.source`)}),(0,v.jsx)(g,{value:O?`${b(O)} / ${E} / ${D}`:``,disabled:!0})]}),(0,v.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,v.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,v.jsx)(m,{htmlFor:`copy-target-conn`,children:e(`table.copy.targetConnection`)}),(0,v.jsxs)(d,{value:k,onValueChange:de,disabled:J,children:[(0,v.jsx)(c,{id:`copy-target-conn`,className:`w-full`,children:(0,v.jsx)(s,{})}),(0,v.jsx)(l,{children:ue.map(t=>(0,v.jsxs)(u,{value:t.id,children:[b(t),t.readOnly?` (${e(`table.copy.readOnly`)})`:``]},t.id))})]})]}),(0,v.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,v.jsx)(m,{htmlFor:`copy-target-db`,children:e(`table.copy.targetDatabase`)}),(0,v.jsxs)(d,{value:M,onValueChange:N,disabled:J||A.length===0,children:[(0,v.jsx)(c,{id:`copy-target-db`,className:`w-full`,children:(0,v.jsx)(s,{placeholder:e(`table.copy.loading`)})}),(0,v.jsx)(l,{children:A.map(e=>(0,v.jsx)(u,{value:e,children:e},e))})]})]})]}),(0,v.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,v.jsx)(m,{htmlFor:`copy-target-table`,children:e(`table.copy.targetTable`)}),(0,v.jsx)(g,{id:`copy-target-table`,value:P,onChange:e=>F(e.target.value),disabled:J,spellCheck:!1})]}),(0,v.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,v.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,v.jsx)(m,{children:e(`table.copy.what`)}),(0,v.jsxs)(`div`,{className:`space-y-1`,children:[(0,v.jsxs)(`label`,{className:`flex items-center gap-2 text-sm cursor-pointer`,children:[(0,v.jsx)(`input`,{type:`radio`,name:`copy-mode`,checked:I===`structure_data`,onChange:()=>L(`structure_data`),disabled:J}),e(`table.copy.structureAndData`)]}),(0,v.jsxs)(`label`,{className:`flex items-center gap-2 text-sm cursor-pointer`,children:[(0,v.jsx)(`input`,{type:`radio`,name:`copy-mode`,checked:I===`structure_only`,onChange:()=>L(`structure_only`),disabled:J}),e(`table.copy.structureOnly`)]})]})]}),(0,v.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,v.jsx)(m,{children:e(`table.copy.ifExists`)}),(0,v.jsxs)(`div`,{className:`space-y-1`,children:[(0,v.jsxs)(`label`,{className:`flex items-center gap-2 text-sm cursor-pointer`,children:[(0,v.jsx)(`input`,{type:`radio`,name:`copy-conflict`,checked:R===`abort`,onChange:()=>z(`abort`),disabled:J}),e(`table.copy.abort`)]}),(0,v.jsxs)(`label`,{className:`flex items-center gap-2 text-sm cursor-pointer text-destructive`,children:[(0,v.jsx)(`input`,{type:`radio`,name:`copy-conflict`,checked:R===`drop`,onChange:()=>z(`drop`),disabled:J}),e(`table.copy.dropAndRecreate`)]})]})]})]}),(0,v.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,v.jsx)(m,{htmlFor:`copy-ddl`,children:e(`table.copy.preview`)}),!fe&&Q&&(0,v.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:e(`table.copy.crossEngineHint`,{engine:Q.label})}),(0,v.jsx)(`textarea`,{id:`copy-ddl`,className:le,value:B,onChange:e=>V(e.target.value),disabled:J,spellCheck:!1}),H&&(0,v.jsx)(`p`,{className:`text-xs text-destructive`,children:H})]}),W&&(0,v.jsxs)(`div`,{className:`space-y-1`,children:[(0,v.jsx)(h,{value:me??(W.phase===`done`?100:0)}),(0,v.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:he})]}),K&&(0,v.jsx)(`p`,{className:`text-sm text-destructive whitespace-pre-wrap`,children:K})]}),(0,v.jsxs)(ae,{children:[(0,v.jsx)(o,{variant:`outline`,onClick:()=>$(!1),children:e(J?`table.copy.stop`:`table.copy.cancel`)}),(0,v.jsx)(o,{onClick:()=>{pe()},disabled:J||!M||!P.trim()||!B.trim()||!!H,children:e(`table.copy.copy`)})]})]})})}export{x as CopyTableDialog};
1
+ import{r as e}from"./hePW80VL.js";import{h as t,n,t as r}from"./XzPc-eVf.js";import{l as i,m as a,t as o}from"./CKOS5Y-e.js";import{a as s,i as c,n as l,r as u,t as d}from"./DsllOXPq.js";import{t as ee}from"./B3nhMsGp.js";import{a as f}from"./CtXRSNHU.js";import{n as p}from"./Cr6Fx4T5.js";import{t as te}from"./5Jrsnc1i.js";import{M as m,U as ne,W as re,c as h,l as g}from"./Bxw3grU1.js";import{a as ie,i as ae,n as oe,o as se,t as ce}from"./DxuXBECK.js";var _=e(t(),1),v=i(),y=e=>e instanceof Error?e.message:String(e),b=e=>e.hostName||e.host||e.file||e.id,le=`w-full rounded border bg-background px-2 py-1 text-xs font-mono outline-none focus:ring-1 focus:ring-primary disabled:opacity-50 min-h-[160px] resize-y`;function x(){let{t:e}=a(),t=n(e=>e.activeDialog),i=n(e=>e.closeDialog),x=n(e=>e.showMessage),S=r(`copy-table`),C=ee(e=>e.activeConnections),w=t===`copy-table`,T=S?.connectionId??``,E=String(S?.metadata?.database??``),D=S?.nodeText??``,O=C.find(e=>e.id===T),ue=C.filter(e=>e.serverConnectionId),[k,de]=(0,_.useState)(T),[A,j]=(0,_.useState)([]),[M,N]=(0,_.useState)(``),[P,F]=(0,_.useState)(D),[I,L]=(0,_.useState)(`structure_data`),[R,z]=(0,_.useState)(`abort`),[B,V]=(0,_.useState)(``),[H,U]=(0,_.useState)(null),[W,G]=(0,_.useState)(null),[K,q]=(0,_.useState)(null),[J,Y]=(0,_.useState)(!1),X=(0,_.useRef)(null),Z=C.find(e=>e.id===k),Q=Z?p(k):null,fe=!!O&&!!Z&&p(T).id===Q?.id;(0,_.useEffect)(()=>{if(!w||!Z?.serverConnectionId)return;let e=!1,t=p(k),n=f(Z.serverConnectionId);return(async()=>{j([]);try{let r=await t.introspect.listDatabases(n);if(e)return;j(r);let i=k===T,a=i||r.includes(E)?E:r[0]??``;N(a),F(e=>i&&a===E&&e===D?`${D}_copy`:e)}catch(t){e||q(y(t))}})(),()=>{e=!0}},[w,k]),(0,_.useEffect)(()=>{if(!w||!Z||!M||!P.trim()||!O)return;let e=!1;return(async()=>{U(null);try{let t=await ne({connectionId:T,database:E,table:D},{connectionId:k,database:M,table:P.trim()});e||V(p(k).ddl.createTable(t))}catch(t){e||U(y(t))}})(),()=>{e=!0}},[w,k,M,P]);function $(e){if(!e){if(J){X.current?.abort();return}i()}}async function pe(){if(!M||!P.trim()||!B.trim())return;Y(!0),q(null),G({phase:`create`,copied:0,total:null});let t=new AbortController;X.current=t;try{let n=await re({source:{connectionId:T,database:E,table:D},target:{connectionId:k,database:M,table:P.trim()},mode:I,onConflict:R,createSql:B},G,t.signal);i(),await x({title:e(`table.copy.doneTitle`),description:I===`structure_data`?e(`table.copy.doneRows`,{count:n.rows,table:P.trim()}):e(`table.copy.doneStructure`,{table:P.trim()}),tone:`success`})}catch(e){e instanceof te||q(y(e)),G(null)}finally{Y(!1),X.current=null}}let me=W?.phase===`copy`&&W.total?Math.min(100,Math.round(W.copied/W.total*100)):null,he=W?W.phase===`create`?e(`table.copy.progressCreate`):W.phase===`count`?e(`table.copy.progressCount`):W.phase===`copy`?e(`table.copy.progressRows`,{copied:W.copied,total:W.total??`?`}):e(`table.copy.progressDone`):``;return(0,v.jsx)(ce,{open:w,onOpenChange:$,children:(0,v.jsxs)(oe,{className:`sm:max-w-[640px]`,children:[(0,v.jsx)(ie,{children:(0,v.jsx)(se,{children:e(`table.copy.title`)})}),(0,v.jsxs)(`div`,{className:`space-y-4`,children:[(0,v.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,v.jsx)(h,{children:e(`table.copy.source`)}),(0,v.jsx)(g,{value:O?`${b(O)} / ${E} / ${D}`:``,disabled:!0})]}),(0,v.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,v.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,v.jsx)(h,{htmlFor:`copy-target-conn`,children:e(`table.copy.targetConnection`)}),(0,v.jsxs)(d,{value:k,onValueChange:de,disabled:J,children:[(0,v.jsx)(c,{id:`copy-target-conn`,className:`w-full`,children:(0,v.jsx)(s,{})}),(0,v.jsx)(l,{children:ue.map(t=>(0,v.jsxs)(u,{value:t.id,children:[b(t),t.readOnly?` (${e(`table.copy.readOnly`)})`:``]},t.id))})]})]}),(0,v.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,v.jsx)(h,{htmlFor:`copy-target-db`,children:e(`table.copy.targetDatabase`)}),(0,v.jsxs)(d,{value:M,onValueChange:N,disabled:J||A.length===0,children:[(0,v.jsx)(c,{id:`copy-target-db`,className:`w-full`,children:(0,v.jsx)(s,{placeholder:e(`table.copy.loading`)})}),(0,v.jsx)(l,{children:A.map(e=>(0,v.jsx)(u,{value:e,children:e},e))})]})]})]}),(0,v.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,v.jsx)(h,{htmlFor:`copy-target-table`,children:e(`table.copy.targetTable`)}),(0,v.jsx)(g,{id:`copy-target-table`,value:P,onChange:e=>F(e.target.value),disabled:J,spellCheck:!1})]}),(0,v.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,v.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,v.jsx)(h,{children:e(`table.copy.what`)}),(0,v.jsxs)(`div`,{className:`space-y-1`,children:[(0,v.jsxs)(`label`,{className:`flex items-center gap-2 text-sm cursor-pointer`,children:[(0,v.jsx)(`input`,{type:`radio`,name:`copy-mode`,checked:I===`structure_data`,onChange:()=>L(`structure_data`),disabled:J}),e(`table.copy.structureAndData`)]}),(0,v.jsxs)(`label`,{className:`flex items-center gap-2 text-sm cursor-pointer`,children:[(0,v.jsx)(`input`,{type:`radio`,name:`copy-mode`,checked:I===`structure_only`,onChange:()=>L(`structure_only`),disabled:J}),e(`table.copy.structureOnly`)]})]})]}),(0,v.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,v.jsx)(h,{children:e(`table.copy.ifExists`)}),(0,v.jsxs)(`div`,{className:`space-y-1`,children:[(0,v.jsxs)(`label`,{className:`flex items-center gap-2 text-sm cursor-pointer`,children:[(0,v.jsx)(`input`,{type:`radio`,name:`copy-conflict`,checked:R===`abort`,onChange:()=>z(`abort`),disabled:J}),e(`table.copy.abort`)]}),(0,v.jsxs)(`label`,{className:`flex items-center gap-2 text-sm cursor-pointer text-destructive`,children:[(0,v.jsx)(`input`,{type:`radio`,name:`copy-conflict`,checked:R===`drop`,onChange:()=>z(`drop`),disabled:J}),e(`table.copy.dropAndRecreate`)]})]})]})]}),(0,v.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,v.jsx)(h,{htmlFor:`copy-ddl`,children:e(`table.copy.preview`)}),!fe&&Q&&(0,v.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:e(`table.copy.crossEngineHint`,{engine:Q.label})}),(0,v.jsx)(`textarea`,{id:`copy-ddl`,className:le,value:B,onChange:e=>V(e.target.value),disabled:J,spellCheck:!1}),H&&(0,v.jsx)(`p`,{className:`text-xs text-destructive`,children:H})]}),W&&(0,v.jsxs)(`div`,{className:`space-y-1`,children:[(0,v.jsx)(m,{value:me??(W.phase===`done`?100:0)}),(0,v.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:he})]}),K&&(0,v.jsx)(`p`,{className:`text-sm text-destructive whitespace-pre-wrap`,children:K})]}),(0,v.jsxs)(ae,{children:[(0,v.jsx)(o,{variant:`outline`,onClick:()=>$(!1),children:e(J?`table.copy.stop`:`table.copy.cancel`)}),(0,v.jsx)(o,{onClick:()=>{pe()},disabled:J||!M||!P.trim()||!B.trim()||!!H,children:e(`table.copy.copy`)})]})]})})}export{x as CopyTableDialog};
@@ -1 +1 @@
1
- import{r as e}from"./hePW80VL.js";import{h as t,n,t as r}from"./XzPc-eVf.js";import{l as i,m as a,t as o}from"./CKOS5Y-e.js";import{t as s}from"./DTxGpkJp.js";import{n as c}from"./DbRMSZEW.js";import{l,m as u}from"./DlKZCiMg.js";import{c as d,l as f,rt as p}from"./D7Ze5md9.js";import{a as m,i as h,n as g,o as _,t as v}from"./DxuXBECK.js";var y=e(t(),1),b=i();function x(){let{t:e}=a(),{activeDialog:t,closeDialog:i}=n(),x=r(`create-schema`),S=t===`create-schema`,[C,w]=(0,y.useState)(``),[T,E]=(0,y.useState)(!1),[D,O]=(0,y.useState)(null);function k(e){e||(i(),w(``),O(null))}async function A(){let e=x?.connectionId??s.getState().activeConnectionId,t=C.trim();if(!(!e||!t)){O(null),E(!0);try{await l(e,c(e).getQuery(`CREATE_SCHEMA`,t)),await u(e),k(!1)}catch(e){O(e instanceof Error?e.message:String(e))}finally{E(!1)}}}return(0,b.jsx)(v,{open:S,onOpenChange:k,children:(0,b.jsxs)(g,{className:`sm:max-w-[420px]`,children:[(0,b.jsx)(m,{children:(0,b.jsx)(_,{children:e(`database.schema.createTitle`)})}),(0,b.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,b.jsx)(d,{htmlFor:`schema-name`,children:e(`database.schema.name`)}),(0,b.jsx)(f,{id:`schema-name`,value:C,autoFocus:!0,placeholder:e(`database.schema.namePlaceholder`),onChange:e=>w(e.target.value),onKeyDown:e=>{e.key===`Enter`&&!p(e)&&A()}})]}),D&&(0,b.jsx)(`p`,{className:`text-xs text-destructive leading-relaxed`,children:D}),(0,b.jsxs)(h,{children:[(0,b.jsx)(o,{variant:`outline`,onClick:()=>k(!1),children:e(`database.schema.cancel`)}),(0,b.jsx)(o,{onClick:()=>void A(),disabled:!C.trim()||T,children:e(`database.schema.create`)})]})]})})}export{x as CreateSchemaDialog};
1
+ import{r as e}from"./hePW80VL.js";import{h as t,n,t as r}from"./XzPc-eVf.js";import{l as i,m as a,t as o}from"./CKOS5Y-e.js";import{t as s}from"./B3nhMsGp.js";import{n as c}from"./Cr6Fx4T5.js";import{l,m as u}from"./5Jrsnc1i.js";import{c as d,it as f,l as p}from"./Bxw3grU1.js";import{a as m,i as h,n as g,o as _,t as v}from"./DxuXBECK.js";var y=e(t(),1),b=i();function x(){let{t:e}=a(),{activeDialog:t,closeDialog:i}=n(),x=r(`create-schema`),S=t===`create-schema`,[C,w]=(0,y.useState)(``),[T,E]=(0,y.useState)(!1),[D,O]=(0,y.useState)(null);function k(e){e||(i(),w(``),O(null))}async function A(){let e=x?.connectionId??s.getState().activeConnectionId,t=C.trim();if(!(!e||!t)){O(null),E(!0);try{await l(e,c(e).getQuery(`CREATE_SCHEMA`,t)),await u(e),k(!1)}catch(e){O(e instanceof Error?e.message:String(e))}finally{E(!1)}}}return(0,b.jsx)(v,{open:S,onOpenChange:k,children:(0,b.jsxs)(g,{className:`sm:max-w-[420px]`,children:[(0,b.jsx)(m,{children:(0,b.jsx)(_,{children:e(`database.schema.createTitle`)})}),(0,b.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,b.jsx)(d,{htmlFor:`schema-name`,children:e(`database.schema.name`)}),(0,b.jsx)(p,{id:`schema-name`,value:C,autoFocus:!0,placeholder:e(`database.schema.namePlaceholder`),onChange:e=>w(e.target.value),onKeyDown:e=>{e.key===`Enter`&&!f(e)&&A()}})]}),D&&(0,b.jsx)(`p`,{className:`text-xs text-destructive leading-relaxed`,children:D}),(0,b.jsxs)(h,{children:[(0,b.jsx)(o,{variant:`outline`,onClick:()=>k(!1),children:e(`database.schema.cancel`)}),(0,b.jsx)(o,{onClick:()=>void A(),disabled:!C.trim()||T,children:e(`database.schema.create`)})]})]})})}export{x as CreateSchemaDialog};
@@ -1,4 +1,4 @@
1
- import{r as e}from"./hePW80VL.js";import{h as t,n}from"./XzPc-eVf.js";import{l as r,m as i,t as a}from"./CKOS5Y-e.js";import{a as o,i as s,n as c,r as l,t as u}from"./D_2UqK4k.js";import{t as d}from"./DTxGpkJp.js";import{n as f}from"./CChaTOPr.js";import{S as p,a as m}from"./Cw_LYT6k.js";import{n as h}from"./DbRMSZEW.js";import{o as g,r as _}from"./BM5G_YA7.js";import{c as v,ct as y}from"./D7Ze5md9.js";import{a as b,i as x,n as S,o as C,t as w}from"./DxuXBECK.js";import{t as T}from"./CnYBZPf9.js";var E=e(t(),1),D=r();function O(e){return e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`).replace(/'/g,`&#39;`)}function k(){let{t:e}=i(),{activeDialog:t,closeDialog:r}=n(),{activeConnectionId:k,activeConnections:A}=d(),{trees:j}=p(),M=f(),N=t===`export-html`,P=(0,E.useMemo)(()=>k?_(j[k]??[]):[],[k,j]),F=(0,E.useMemo)(()=>{if(!k)return``;let e=M.activeTabId[k];return(M.tabs[k]??[]).find(t=>t.id===e)?.database||``},[k,M.activeTabId,M.tabs]),[I,L]=(0,E.useState)(``),R=(0,E.useMemo)(()=>!k||!I?[]:g(j[k]??[],I),[k,I,j]),[z,B]=(0,E.useState)([]),[V,H]=(0,E.useState)(!0),[U,W]=(0,E.useState)(!0),[G,K]=(0,E.useState)(!0),[q,J]=(0,E.useState)(!1);(0,E.useEffect)(()=>{N&&F&&L(F)},[N,F]);function Y(e){e||(r(),L(``),B([]),H(!0),W(!0),K(!0))}function X(e){B(t=>t.includes(e)?t.filter(t=>t!==e):[...t,e])}function Z(){B(R.length===z.length?[]:[...R])}async function Q(){if(z.length===0||!k)return;let t=A.find(e=>e.id===k);if(!t?.serverConnectionId)return;J(!0);let{introspect:n}=h(k),i=m(t.serverConnectionId),a=(e,t,n)=>{let r=`<h3>${O(e)}</h3>\n<table border="1" cellpadding="4" cellspacing="0">\n`;r+=`<tr>${t.map(e=>`<th>${O(e)}</th>`).join(``)}</tr>\n`;for(let e of n)r+=`<tr>${e.map(e=>`<td>${O(e==null?`NULL`:String(e))}</td>`).join(``)}</tr>\n`;return r+`</table>
1
+ import{r as e}from"./hePW80VL.js";import{h as t,n}from"./XzPc-eVf.js";import{l as r,m as i,t as a}from"./CKOS5Y-e.js";import{a as o,i as s,n as c,r as l,t as u}from"./DsllOXPq.js";import{t as d}from"./B3nhMsGp.js";import{n as f}from"./BNkgLUl5.js";import{S as p,a as m}from"./CtXRSNHU.js";import{n as h}from"./Cr6Fx4T5.js";import{o as g,r as _}from"./D8QuNkWm.js";import{c as v,lt as y}from"./Bxw3grU1.js";import{a as b,i as x,n as S,o as C,t as w}from"./DxuXBECK.js";import{t as T}from"./CnYBZPf9.js";var E=e(t(),1),D=r();function O(e){return e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`).replace(/'/g,`&#39;`)}function k(){let{t:e}=i(),{activeDialog:t,closeDialog:r}=n(),{activeConnectionId:k,activeConnections:A}=d(),{trees:j}=p(),M=f(),N=t===`export-html`,P=(0,E.useMemo)(()=>k?_(j[k]??[]):[],[k,j]),F=(0,E.useMemo)(()=>{if(!k)return``;let e=M.activeTabId[k];return(M.tabs[k]??[]).find(t=>t.id===e)?.database||``},[k,M.activeTabId,M.tabs]),[I,L]=(0,E.useState)(``),R=(0,E.useMemo)(()=>!k||!I?[]:g(j[k]??[],I),[k,I,j]),[z,B]=(0,E.useState)([]),[V,H]=(0,E.useState)(!0),[U,W]=(0,E.useState)(!0),[G,K]=(0,E.useState)(!0),[q,J]=(0,E.useState)(!1);(0,E.useEffect)(()=>{N&&F&&L(F)},[N,F]);function Y(e){e||(r(),L(``),B([]),H(!0),W(!0),K(!0))}function X(e){B(t=>t.includes(e)?t.filter(t=>t!==e):[...t,e])}function Z(){B(R.length===z.length?[]:[...R])}async function Q(){if(z.length===0||!k)return;let t=A.find(e=>e.id===k);if(!t?.serverConnectionId)return;J(!0);let{introspect:n}=h(k),i=m(t.serverConnectionId),a=(e,t,n)=>{let r=`<h3>${O(e)}</h3>\n<table border="1" cellpadding="4" cellspacing="0">\n`;r+=`<tr>${t.map(e=>`<th>${O(e)}</th>`).join(``)}</tr>\n`;for(let e of n)r+=`<tr>${e.map(e=>`<td>${O(e==null?`NULL`:String(e))}</td>`).join(``)}</tr>\n`;return r+`</table>
2
2
  `};try{let t=[];for(let r of z){let o=`<h2>${O(r)}</h2>\n`;if(V){let t=await n.listColumns(i,I,r);t.length>0&&(o+=a(e(`database.html.sectionColumns`),[`Field`,`Type`,`Null`,`Key`,`Default`,`Extra`,`Comment`],t.map(e=>[e.name,e.type,e.nullable?`YES`:`NO`,e.key,e.defaultValue,e.extra,e.comment])))}if(U){let t=await n.listIndexes(i,I,r);t.length>0&&(o+=a(e(`database.html.sectionIndexes`),[`Key_name`,`Type`,`Columns`],t.map(e=>[e.name,e.type,e.columns.join(`, `)])))}if(G){let t=await n.getTableInfo(i,I,r);t&&(o+=a(e(`database.html.sectionProperties`),[`Name`,`Engine`,`Collation`,`Rows`,`Data_length`,`Create_time`,`Update_time`,`Comment`],[[t.name,t.engine,t.collation,t.rows,t.dataLength,t.createTime,t.updateTime,t.comment]]))}t.push(o)}let r=`<!DOCTYPE html>
3
3
  <html lang="en">
4
4
  <head>
@@ -0,0 +1,2 @@
1
+ var e={reconnecting:`Reconnexion…`,dropSqlite:`Déposez pour ouvrir le fichier SQLite`,dropSqliteHint:`Ouvert dans votre navigateur via WebAssembly — le fichier reste sur votre ordinateur. Déposez le fichier -wal avec lui s'il existe.`,dropFailedTitle:`Impossible d'ouvrir le fichier déposé`,dropNotSqlite:`{{name}} n'est pas un fichier de base de données SQLite.`,crashTitle:`Un problème est survenu`,crashBody:`L'application a rencontré une erreur inattendue. Recharger restaure les connexions et les onglets ; les modifications de grille non enregistrées sont perdues.`,crashReload:`Recharger`},t={auto:`Langue du système ({{name}})`,en:`English`,ko:`한국어`,zh:`中文(简体)`,ja:`日本語`,de:`Deutsch`,fr:`Français`},n={title:`Sécurité`,description:`Garde-fous contre la perte accidentelle de données. Le mode lecture seule, la couleur d'environnement et le mode de transaction se règlent par connexion.`,language:`Langue`,languageHint:`S'applique immédiatement. « Langue du système » suit votre navigateur.`,resetDefaults:`Rétablir les valeurs par défaut`,done:`Terminé`,analytics:`Partager des statistiques d'utilisation anonymes`,analyticsHint:`Envoie des événements d'utilisation anonymes (moteur, fonctionnalité, type d'instruction) à Google Analytics. Jamais le texte SQL, les noms d'hôte, de table ou d'utilisateur.`,analyticsUnavailableHint:`Inactif dans cette version (aucun identifiant de mesure configuré).`,persistHistory:`Conserver l'historique des requêtes après rechargement`,persistHistoryHint:`Le texte des instructions est stocké dans ce navigateur (les mots de passe littéraux sont masqués ; les onglets d'éditeur ouverts sont toujours conservés). Désactivé : l'historique et les instantanés ne vivent que jusqu'à la fermeture de l'onglet.`,ai:{intro:`Planche peut demander à un modèle pourquoi une instruction a échoué ou un plan est lent. La question est assemblée ici dans l'app et envoyée par votre agent local au fournisseur ci-dessous — ni votre SQL ni votre schéma n'atteint planche.dev.`,provider:`Fournisseur`,openaiCompatible:`Compatible OpenAI`,model:`Modèle`,baseUrl:`URL de base`,baseUrlHint:`Laissez vide pour le point d'accès du fournisseur. Tout serveur compatible OpenAI convient — Azure, OpenRouter, un Ollama local.`,key:`Clé API`,keyHint:`Transmise à l'agent local et utilisée là-bas. Elle n'est jamais conservée dans ce navigateur ni envoyée à planche.dev.`,remember:`Mémoriser cette clé sur cette machine`,rememberHint:`L'écrit dans {{path}}, lisible par vous seul. Sans cela, la clé ne vit que dans l'agent en cours et disparaît à son arrêt.`,save:`Enregistrer`,forget:`Oublier la clé`,saved:`Enregistré.`,none:`Aucune clé définie.`,configuredSession:`Une clé est définie pour cette session d'agent seulement.`,configuredFile:`Une clé est stockée dans {{path}}.`,configuredEnv:`Les réglages IA de cet agent viennent de son environnement et ne sont pas modifiables ici.`,unreachable:`L'agent est injoignable, les réglages IA ne peuvent pas être modifiés.`,title:`Explications IA`,description:`Quel modèle explique un échec ou un plan, et avec la clé de qui.`,cli:`CLI locale (sans clé)`,cliCommand:`Commande`,cliHint:`Exécute une CLI d'agent déjà installée et connectée sur cette machine : aucune clé à saisir. Elle explique les échecs et les plans ; le panneau IA a besoin d'un provider capable d'appeler des outils.`,cliNone:`Aucune CLI d'agent trouvée sur cette machine. Installez Claude Code ou Codex, ou choisissez un autre provider.`,profile:`Anthropic (connexion de cette machine)`,profileHint:"Utilise les identifiants avec lesquels cette machine est déjà connectée — après `ant auth login`, le SDK les trouve seul. Rien à coller, et contrairement à une CLI locale c'est la vraie API, donc le panneau IA fonctionne aussi.",profileNone:"Aucun identifiant Anthropic trouvé sur cette machine. Lancez `ant auth login`, ou renseignez une clé.",configuredChoice:`{{provider}} utilisé — aucune clé conservée ; le choix est enregistré dans {{path}}.`},query:{title:`Requête`,description:`Comment une instruction s'exécute : ce que lance F9, combien de lignes reviennent, ce qui est prévisualisé.`},general:{title:`Général`,description:`La langue, ce qui survit à un rechargement, et ce qui quitte cette machine.`}},r={settings:{safety:`Sécurité…`,language:`Langue`,title:`Paramètres`,theme:`Thème`,query:`Requête…`,general:`Général…`,ai:`IA…`},help:{gettingStarted:`Premiers pas`,about:`À propos de Planche`,title:`Aide`,documentation:`Documentation`,learn:`Apprendre le SQL`,terms:`Conditions d’utilisation`,license:`Licence`,support:`Contacter le support`,mcp:`Connecter un agent IA (MCP)…`,privacy:`Confidentialité`},connection:{title:`Connexion`,connect:`Se connecter`,disconnect:`Se déconnecter`,readOnly:`Lecture seule`,manualTransactions:`Transactions manuelles`,saveDatabaseFile:`Enregistrer le fichier de base de données`,saveDatabaseFileBlocked:`Enregistrer le fichier de base de données (charger d'abord le -wal)`,exit:`Quitter`,sync:`Synchronisation des connexions`},query:{title:`Requête`,execute:`Exécuter`,executeStatementAtCursor:`Exécuter l'instruction au curseur`,executeWholeScript:`Exécuter tout le script`,newQueryTab:`Nouvel onglet de requête`,findReplace:`Rechercher et remplacer`,localHistory:`Historique local…`,explainPlan:`Afficher le plan d'exécution`,explainAnalyze:`Mesurer le plan d'exécution (exécute l'instruction)`,structure:`Structure de la requête`},edit:{title:`Édition`,undo:`Annuler`,redo:`Rétablir`,cut:`Couper`,copy:`Copier`,paste:`Coller`,selectAll:`Tout sélectionner`},database:{title:`Base de données`,create:`Créer une base de données`,alter:`Modifier la base de données`,drop:`Supprimer la base de données`,copy:`Copier la base de données`,compare:`Comparer les schémas…`,truncate:`Tronquer la base de données`,compareData:`Comparer les données…`,groupBy:`Grouper et compter…`},table:{title:`Table`,create:`Créer une table`,alter:`Modifier la table`,drop:`Supprimer la table`,rename:`Renommer la table`,truncate:`Tronquer la table`,duplicateStructure:`Dupliquer la structure de la table`},export:{title:`Exporter`,csv:`Télécharger en CSV`,tsv:`Télécharger en TSV`,schemaHtml:`Schéma en HTML`,links:`Exporter les liens de colonnes…`,importLinks:`Importer les liens de colonnes…`},tools:{title:`Outils`,userManager:`Gestion des utilisateurs`,processList:`Liste des processus`,variables:`Variables`,status:`État`,flush:`Flush`,quickCommand:`Commande rapide`,viewErd:`Afficher l'ERD`,scratchpad:`Bloc-notes (SQLite dans le navigateur)`,federated:`Requête fédérée (jointure entre connexions)…`,federatedTab:`Fédérée {{n}}`,ai:`Assistant IA`},messages:{databaseFileSaved:`Fichier de base de données enregistré`,databaseExported:`Base de données exportée en téléchargement`,databaseExportedWithReason:`Base de données exportée en téléchargement — {{reason}}`,errorSavingDatabase:`Erreur lors de l'enregistrement de la base de données : {{message}}`,noDatabaseSelected:`Aucune base de données sélectionnée`,noTableSelected:`Aucune table sélectionnée`,noActiveConnection:`Aucune connexion active`,databaseDropped:`Base de données « {{database}} » supprimée`,errorDroppingDatabase:`Erreur lors de la suppression de la base de données : {{message}}`,noTablesInDatabase:`Aucune table trouvée dans la base de données « {{database}} »`,databaseTruncated_one:`{{count}} table de « {{database}} » tronquée`,databaseTruncated_other:`Les {{count}} tables de « {{database}} » ont été tronquées`,errorTruncatingDatabase:`Erreur lors du tronquage de la base de données : {{message}}`,tableDropped:`Table « {{table}} » supprimée`,errorDroppingTable:`Erreur lors de la suppression de la table : {{message}}`,tableTruncated:`Table « {{table}} » tronquée`,errorTruncatingTable:`Erreur lors du tronquage de la table : {{message}}`,renameTablePrompt:`Renommer la table « {{table}} » en :`,tableRenamed:`Table « {{table}} » renommée en « {{newName}} »`,errorRenamingTable:`Erreur lors du renommage de la table : {{message}}`,truncateDatabaseTitle:`Vider toutes les tables de "{{name}}" ?`,truncateDatabaseDescription:`Toutes les lignes des {{count}} table(s) de "{{name}}" seront supprimées. La structure des tables est conservée. Cette action est irréversible.`,truncateDatabaseConfirm:`Vider toutes les tables`,renameTableTitle:`Renommer la table`,renameTableConfirm:`Renommer`,noLinksToExport:`Aucun lien de colonne à exporter.`,linksExported:`{{count}} liens de colonnes exportés.`,linksImported:`{{count}} liens de colonnes importés.`,linksImportedPartial:`{{count}} liens de colonnes importés ; aucun profil correspondant pour : {{profiles}}`,linksImportFailed:`Impossible d'importer les liens de colonnes : {{reason}}`}},i={title:`À propos de Planche`,tagline:`Un client de base de données pour MySQL, MariaDB, PostgreSQL et SQLite.`,version:`Version`,website:`Site web`,licenses:`Licences`,licensesLink:`Mentions des tiers`,disclaimer:`Planche est fourni « tel quel », sans garantie d'aucune sorte. Les auteurs ne sauraient être tenus responsables des dommages ou pertes de données découlant de son utilisation. Sauvegardez vos données avant d'exécuter des instructions destructrices.`,rights:`Tous droits réservés.`,legal:`Mentions légales`,terms:`Conditions`,privacy:`Confidentialité`,refund:`Remboursement`},a=JSON.parse(`{"dialog":{"title":"Se connecter à une base de données","firstQueryTab":"Requête 1","colHostName":"Nom de l'hôte","colTarget":"Cible","colDbms":"SGBD","noSaved":"Aucune connexion enregistrée","unnamed":"(sans nom)","pickOnConnect":"(choisir à la connexion)","noFile":"(aucun fichier)","selectPrompt":"Sélectionnez une connexion ou ajoutez-en une nouvelle","addNew":"Ajouter","delete":"Supprimer","testConnection":"Tester la connexion","connect":"Se connecter","close":"Fermer","unknownError":"Erreur inconnue","browserTestHint":"Les connexions SQLite dans le navigateur ouvrent un fichier local lorsque vous cliquez sur Se connecter.","testSuccess":"Connexion réussie","restoredUnsaved":"{{file}} : modifications non enregistrées restaurées depuis la copie en cache","restoredUnsavedDiskChanged":"{{file}} : modifications non enregistrées restaurées depuis la copie en cache — attention, le fichier sur le disque a changé depuis","walPending":"{{file}} est en mode WAL : des modifications récentes peuvent encore se trouver dans son fichier -wal. Utilisez « Charger le fichier -wal » ci-dessus pour les inclure.","walApplied":"{{file}} ouvert avec ses modifications -wal appliquées","connectFailedTitle":"Échec de la connexion","testSuccessDescription":"Le serveur a accepté les identifiants.","testFailedTitle":"Échec du test de connexion","privacy":"Rien de ce que vous saisissez ici n'est envoyé ni stocké sur les serveurs de planche.dev. Les profils de connexion restent uniquement dans le stockage local de ce navigateur ; les requêtes vont directement de l'agent local à votre base de données.","hostKeyTitle":"Clé d'hôte SSH inconnue","hostKeyDescription":"{{host}}:{{port}} a présenté une clé {{type}} d'empreinte {{fingerprint}}. Comparez-la avec l'empreinte fournie par l'administrateur du serveur ; accepter une mauvaise clé permet à un attaquant de lire votre trafic.","hostKeyAccept":"Faire confiance à cet hôte","gatewayTitle":"Profils de la passerelle","gatewayAdd":"Ajouter","gatewayAdded":"Profil de passerelle {{name}} ajouté.","gatewayReadOnly":"lecture seule","gatewayWritable":"modifiable","gatewayProfileHint":"Cette connexion utilise le profil « {{name}} » détenu par la passerelle ; rien à configurer ici.","gatewayLoadFailed":"Impossible de charger les profils de la passerelle : {{error}}","export":"Exporter…","exportWithoutSecrets":"Sans mot de passe","exportWithSecrets":"Avec mot de passe et clés","import":"Importer…","exported":"Connexion « {{name}} » exportée.","imported":"Connexion « {{name}} » importée.","importFailedTitle":"Impossible d'importer la connexion"},"form":{"hostName":"Nom de l'hôte","hostNamePlaceholder":"Ma connexion","dataSource":"Source de données","openVia":"Ouvrir via","viaBrowser":"Navigateur (fichier local)","viaAgent":"Agent local","viaBrowserHint":"Rien à installer. Idéal pour les fichiers qu'aucun autre programme n'utilise : le navigateur travaille sur une copie en mémoire et ne peut pas verrouiller le fichier ; les modifications faites ailleurs pendant qu'il est ouvert ne sont pas vues et Enregistrer les écrase.","viaAgentHint":"Ouvre le fichier avec SQLite lui-même via npx planche — verrouillage et WAL corrects, sûr même si d'autres programmes utilisent la même base de données.","databaseFile":"Fichier de base de données","changeFile":"Changer de fichier","filePickerHint":"Un sélecteur de fichier s'ouvre lorsque vous cliquez sur Se connecter (astuce : ⌘⇧. affiche les fichiers cachés, ⌘⇧G permet de saisir un chemin).","fileRememberedHint":"Le fichier choisi est mémorisé (Chromium), la reconnexion ne demande donc que l'autorisation. Utilisez Connexion > Enregistrer le fichier de base de données pour écrire les modifications.","authToken":"Jeton d'authentification","authTokenPlaceholder":"Laisser vide pour utiliser le jeton de l'agent appairé","filePathPlaceholder":"/chemin/vers/database.sqlite ou :memory:","createIfMissing":"Créer si absent","createIfMissingHint":"Le chemin est résolu sur l'hôte du serveur de tunnel","host":"Hôte","port":"Port","database":"Base de données","serviceName":"Nom du service","user":"Utilisateur","password":"Mot de passe","savePassword":"Enregistrer le mot de passe","savePasswordHint":"Désactivé : le mot de passe n'est conservé que pour cette session du navigateur et n'est jamais écrit sur le disque.","charset":"Jeu de caractères","autoConnection":"Connexion automatique","safety":"Sécurité","environment":"Environnement","environmentHint":"colore l'onglet et l'espace de travail","readOnly":"Lecture seule","readOnlyHint":"Refuser les instructions qui modifient les données ou le schéma","transactions":"Transactions","txAuto":"Auto-commit","txManual":"Manuel — Commit / Rollback depuis la barre d'outils","ssh":"SSH","sshTunnel":"Tunnel SSH","sshTunnelHint":"Atteindre la base via un hôte de rebond SSH (le tunnel est ouvert par l'agent local)","sshHost":"Hôte SSH","sshPort":"Port SSH","sshUser":"Utilisateur SSH","sshAuth":"Auth SSH","sshAuthKey":"Clé privée","sshAuthPassword":"Mot de passe","sshAuthAgent":"ssh-agent","sshAuthAgentHint":"Utilise les clés chargées dans le ssh-agent de la machine qui exécute npx planche (SSH_AUTH_SOCK).","sshPassword":"Mot de passe SSH","sshKey":"Clé privée","sshKeyPick":"Choisir un fichier de clé…","sshKeyLoaded":"Clé chargée","sshKeyHint":"Laisser vide pour utiliser l'IdentityFile de ~/.ssh/config (ou ~/.ssh/id_*) sur la machine de l'agent ; une clé choisie est enregistrée avec ce profil","sshPassphrase":"Phrase secrète","sshPassphrasePlaceholder":"Laisser vide si la clé n'en a pas","sshSecretsHint":"Le mot de passe SSH, la clé privée et la phrase de passe suivent le réglage « Enregistrer le mot de passe » ci-dessus. Les clés d'hôte inconnues sont affichées pour vérification avant la première connexion et enregistrées dans ~/.planche/known_hosts sur la machine de l'agent.","sshHostPlaceholder":"bastion.example.com ou un alias Host de ~/.ssh/config","sshUserPlaceholder":"Laisser vide pour utiliser ~/.ssh/config","sshTargetHint":"L'hôte et le port de la base sont résolus sur l'hôte de rebond — indiquez l'adresse réelle de la base (ex. le point de terminaison RDS), pas localhost ni une redirection de port locale.","connectionString":"Chaîne de connexion","connectionStringApplied":"Reportée dans les champs ci-dessous. La chaîne elle-même n'est pas enregistrée, seuls les champs le sont.","connectionStringInvalid":"Ce n'est pas un URI PostgreSQL (attendu : postgresql://user:password@host/database).","neonHint":"Collez l'URI de la console Neon (Connect > Connection string) ; les champs ci-dessous sont remplis à partir de celui-ci.","supabaseHint":"Collez l'URI de Supabase (Connect > Session pooler ou Direct connection) ; les champs ci-dessous sont remplis à partir de celui-ci.","supabasePoolerWarning":"Le port 6543 est le pooler en mode transaction : chaque instruction peut s'exécuter sur un backend différent, donc le changement de schéma, les tables temporaires, les prepared statements et les transactions manuelles ne fonctionnent pas. Utilisez le pooler de session (port 5432) ou la connexion directe.","managedTlsHint":"TLS est toujours activé pour ce service ; la connexion va directement de l'agent local au service (pas de tunnel SSH).","d1AccountId":"Account ID","d1DatabaseId":"Database ID","d1ApiToken":"Jeton API","d1Hint":"Account ID : tableau de bord Cloudflare, à droite de l'accueil du compte. Database ID : Storage & Databases > D1 > votre base. Jeton : My Profile > API Tokens > Create Token avec la permission « D1 Edit » (ou « D1 Read » en lecture seule). L'agent local appelle l'API Cloudflare avec ce jeton.","d1LimitsHint":"D1 exécute chaque requête isolément avec validation automatique : les transactions manuelles sont indisponibles ; la base apparaît comme l'unique schéma « main ».","doDevUrl":"URL wrangler dev","doHint":"Lancez \`wrangler dev\` dans votre projet Worker et collez l'URL affichée (port 8787 par défaut). L'agent local lit les Durable Objects de cette session, y compris ceux des autres sessions \`wrangler dev\` en cours d'exécution.","doLimitsHint":"Développement local uniquement : les Durable Objects déployés ne sont accessibles que depuis un Worker, Cloudflare ne propose donc aucune API pour les interroger. Chaque objet apparaît comme une base nommée « <espace de noms>/<objet> » ; chaque requête est validée automatiquement, les transactions manuelles sont donc indisponibles.","tls":"TLS","tlsEnable":"Chiffrer la connexion","tlsVerify":"Vérifier le certificat du serveur","tlsVerifyHint":"Désactivé : les certificats auto-signés sont acceptés (chiffré, mais le serveur n'est pas authentifié). Indisponible via un tunnel SSH.","d1DevUrl":"URL de dev locale","d1DevUrlHint":"Laissez vide pour passer par un compte Cloudflare. Renseignée, Planche lit la base que \`wrangler dev\` exécute sur cette machine — sans compte ni jeton d’API, et les champs de compte ci-dessous sont ignorés. Laissez le Database ID vide si le serveur de dev n’en expose qu’une.","d1PickDatabase":"Choisir une base"},"agent":{"copy":"Copier","looking":"Recherche de l'agent Planche…","online":"L'agent <b>v{{version}}</b> est en cours d'exécution sur <mono>{{url}}</mono>","outdated":"L'agent v{{version}} utilise le protocole {{protocol}}, mais cette application en requiert un plus récent. Redémarrez-le avec <cmd/>","unauthorized":"L'agent <b>v{{version}}</b> est en cours d'exécution sur <mono>{{url}}</mono>, mais cette application n'est pas appairée avec lui (le jeton change à chaque démarrage). Ouvrez le lien affiché dans le terminal de l'agent, ou collez le jeton sous Configurer.","offline":"Aucun agent à <mono>{{url}}</mono>. Lancez-le dans un terminal — il ouvre cette application déjà appariée.","close":"Fermer","configure":"Configurer","checkAgain":"Vérifier à nouveau","urlLabel":"URL de l'agent","urlPlaceholder":"http://127.0.0.1:8888 (par défaut)","tokenLabel":"Jeton","tokenPlaceholder":"Affiché par l'agent","reset":"Réinitialiser","save":"Enregistrer","remoteWarning":"Cet agent n'est pas sur votre ordinateur ({{host}}) : chaque connexion y envoie ses mots de passe et clés SSH.","remoteRefusedTitle":"Agent distant refusé","remoteRefused":"L'agent doit tourner sur cet ordinateur (127.0.0.1 ou localhost). Pour un agent sur une autre machine, redirigez son port avec \`ssh -L 8888:127.0.0.1:8888 user@host\` et gardez l'URL http://127.0.0.1:8888.","gateway":"Passerelle « {{name}} » : {{count}} profils côté serveur. Les identifiants restent sur la passerelle ; choisissez un profil ci-dessous."},"tab":{"noConnections":"Aucune connexion ouverte. Cliquez sur Se connecter pour commencer.","theSqliteFile":"le fichier SQLite","reopened":"{{file}} rouvert","reopenFailed":"Impossible de rouvrir le fichier : {{message}}","reopenPrompt":"Le navigateur a de nouveau besoin de votre autorisation pour lire <b>{{file}}</b>.","reopenFile":"Rouvrir le fichier","closeConnection":"Fermer la connexion","reconnected":"{{file}} reconnecté","accessNotGranted":"L'accès au fichier n'a pas été accordé ; Enregistrer exportera un téléchargement à la place.","detachedPrompt":"Travail sur une copie en cache de <b>{{file}}</b>. Reconnectez le fichier pour enregistrer les modifications sur place.","reconnectFile":"Reconnecter le fichier","detachedHide":"Masquer (Enregistrer demandera le fichier si nécessaire)","walFramesApplied_one":"{{count}} trame WAL appliquée depuis {{file}}-wal","walFramesApplied_other":"{{count}} trames WAL appliquées depuis {{file}}-wal","walNoChanges":"Le fichier -wal ne contenait aucune modification validée","walLoadFailed":"Impossible de charger le fichier -wal : {{message}}","walPrompt":"<b>{{file}}</b> est en mode WAL : il peut ne pas afficher les données les plus récentes tant que son fichier <mono>{{file}}-wal</mono> n'est pas chargé, et l'enregistrement est désactivé jusque-là. Si aucun fichier de ce type n'existe à côté (la base de données a été fermée proprement), confirmez-le plutôt. Si un autre programme utilise encore cette base de données, ouvrez-la plutôt via l'agent local (<mono>npx planche</mono>) : le navigateur ne peut pas partager le fichier en toute sécurité.","loadWal":"Charger le fichier -wal","noWalHint":"J'ai vérifié : il n'y a pas de fichier -wal à côté de la base de données","noWal":"Pas de fichier -wal","dismiss":"Ignorer","walHide":"Masquer (l'enregistrement reste désactivé)","readOnlyBadge":"lecture seule"}}`),o={connect:`Se connecter (Alt+N)`,disconnect:`Se déconnecter`,newQueryTab:`Nouvel onglet de requête (Alt+T)`,execute:`Exécuter (F9)`,executeStatement:`Exécuter l'instruction au curseur / la sélection (Ctrl+Enter)`,commit:`Commit`,commitHint:`Valider la transaction ouverte`,noOpenTransaction:`Aucune transaction ouverte`,rollback:`Rollback`,rollbackHint:`Annuler la transaction ouverte`,readOnlyBadge:`lecture seule`,readOnlyHint:`Cette connexion refuse les instructions qui modifient les données ou le schéma`,userManager:`Gestion des utilisateurs (Alt+U)`,quickCommand:`Commande rapide`,processList:`Liste des processus`,variables:`Variables`,status:`État`,flush:`Flush`,fullscreen:`Plein écran`},s={readOnly:`lecture seule`,txOpen:`tx ouverte`,manualTx:`tx manuelle`},c={title:`Commande rapide`,description:`Rechercher une commande à exécuter...`,inputPlaceholder:`Saisissez une commande ou recherchez...`,empty:`Aucune commande trouvée.`,groups:{connection:`Connexion`,query:`Requête`,database:`Base de données`,table:`Table`,tools:`Outils`},commands:{connect:`Se connecter`,disconnect:`Se déconnecter`,executeQuery:`Exécuter la requête`,newQueryTab:`Nouvel onglet de requête`,createDatabase:`Créer une base de données`,dropDatabase:`Supprimer la base de données`,createTable:`Créer une table`,alterTable:`Modifier la table`,dropTable:`Supprimer la table`,processList:`Liste des processus`,serverVariables:`Variables du serveur`,serverStatus:`État du serveur`,flush:`Flush`,userManager:`Gestion des utilisateurs`}},l={title:`Bienvenue dans Planche`,intro:`Un client SQL qui s'exécute dans votre navigateur. Vos bases de données sont accessibles via un petit agent sur votre machine : identifiants et données ne quittent jamais votre ordinateur.`,skip:`Passer`,skipTitle:`Masquer cet écran (Aide > Premiers pas le fait réapparaître)`,copy:`Copier`,copied:`Copié`,sampleOpenFailed:`Impossible d'ouvrir la base de données d'exemple : {{message}}`,steps:{agent:{title:`Lancer l'agent local`,body:`Lancez l’une de ces commandes dans un terminal. Elle démarre l’agent et l’apparie avec cette page.`},connection:{title:`Ajouter une connexion`,body:`Choisissez votre base de données pour ouvrir le formulaire de connexion avec les bons réglages par défaut.`},sample:{title:`Pas de base de données sous la main ? Essayez l'exemple`,body:`Chargez une base de données d'exemple de boutique en ligne (24 tables, ~50 k lignes, vues et déclencheurs) dans le navigateur pour essayer l'éditeur, la grille et l'arborescence du schéma.`,loading:`Chargement de l'exemple…`,button:`Essayer la base de données d'exemple`}},terms:{title:`Avant de commencer`,local:`Tout s’exécute localement : identifiants, requêtes et résultats restent sur votre machine et ne nous sont jamais envoyés.`,asIs:`Planche est fourni en l’état, sans garantie. Les garde-fous (confirmation des opérations destructives, mode lecture seule) sont des commodités, pas des garanties.`,dataLoss:`Vous êtes responsable de chaque instruction exécutée via Planche. Sauvegardez vos données avant toute opération destructive.`,agree:`J’ai lu et j’accepte les conditions d’utilisation.`,accepted:`Vous avez accepté les conditions d’utilisation.`,readFull:`Lire les conditions complètes`}},u={treeLabel:`Schéma`,unreachableHint:`Ce n'est pas la base de données à laquelle cette connexion est liée ; créez un profil pour elle afin de la parcourir`,objectType:{table:`Table`,view:`Vue`,procedure:`Procédure`,function:`Fonction`,trigger:`Déclencheur`,event:`Événement`},menu:{showCreate:`Afficher CREATE {{type}}`,alter:`Modifier {{type}}`,drop:`Supprimer {{type}}`,create:`Créer {{type}}`,refresh:`Actualiser`,unreachable:`Connectez-vous avec un profil lié à cette base de données pour la parcourir`,openDatabase:`Ouvrir la base de données`,createSchema:`Créer un schéma…`,createTable:`Créer une table`,dropDatabase:`Supprimer la base de données`,openSchema:`Ouvrir le schéma`,dropSchema:`Supprimer le schéma`,newQueryTab:`Nouvel onglet de requête`,generateSql:`Générer du SQL`,openTable:`Ouvrir la table`,alterTable:`Modifier la table`,showCreateTable:`Afficher CREATE TABLE`,duplicateStructure:`Dupliquer la structure`,copyTable:`Copier la table vers…`,compare:`Comparer {{type}}…`,truncateTable:`Tronquer la table`,dropTable:`Supprimer la table`,exportCsv:`Exporter en CSV`,exportTsv:`Exporter en TSV…`,openView:`Ouvrir la vue`,alterView:`Modifier la vue`,showCreateView:`Afficher CREATE VIEW`,dropView:`Supprimer la vue`,compareData:`Comparer les données…`,groupBy:`Grouper et compter…`},actions:{createStatementUnavailable:`-- Impossible de récupérer l'instruction CREATE pour {{type}} {{name}}`,getCreateFailed:`Échec de la récupération de CREATE {{type}} : {{message}}`,createTabTitle:`Créer {{type}}`,createSchemaTabTitle:`Créer un schéma`,generateSqlFailed:`Impossible de générer le SQL : {{message}}`,dropTableTitle:`Supprimer la table « {{name}} » ?`,dropTableDescription:`Cela supprime définitivement la table et toutes ses lignes{{from}}. Cette action est irréversible.`,dropTableConfirm:`Supprimer la table`,dropObjectTitle:`Supprimer {{type}} « {{name}} » ?`,dropObjectDescription:`La définition de {{type}} sera supprimée{{from}}. Cette action est irréversible.`,dropObjectConfirm:`Supprimer {{type}}`,fromDatabase:` de la base de données « {{database}} »`,dropped:`{{type}} {{name}} supprimé`,dropFailed:`Échec de la suppression de {{type}}`,dropDatabaseTitle:`Supprimer la base de données « {{name}} » ?`,dropDatabaseDescription:`Cela supprime définitivement la base de données avec toutes ses tables et données. Cette action est irréversible.`,dropDatabaseConfirm:`Supprimer la base de données`,droppedDatabase:`Base de données {{name}} supprimée`,dropDatabaseFailed:`Échec de la suppression de la base de données`,dropSchemaTitle:`Supprimer le schéma « {{name}} » ?`,dropSchemaDescription:`Cela supprime définitivement le schéma avec toutes ses tables et données. Cette action est irréversible.`,dropSchemaConfirm:`Supprimer le schéma`,droppedSchema:`Schéma {{name}} supprimé`,dropSchemaFailed:`Échec de la suppression du schéma`,truncateTitle:`Tronquer la table « {{name}} » ?`,truncateDescription:`Toutes les lignes de « {{name}} » seront supprimées. La structure de la table est conservée. Cette action est irréversible.`,truncateConfirm:`Tronquer la table`,truncated:`{{name}} tronquée`,truncateFailed:`Échec du tronquage`},tree:{loadDatabasesFailed:`Échec du chargement des bases de données : {{message}}`}},d={editor:{destructiveMarker:`Destructeur : {{action}} {{names}}`,readOnlyMarker:`La connexion est en lecture seule ; cette instruction modifie les données ou le schéma`,actionExecute:`Exécuter (selon les paramètres)`,actionExecuteStatement:`Exécuter l'instruction au curseur / la sélection`,actionExecuteScript:`Exécuter tout le script`,actionExplainPlan:`Afficher le plan d'exécution`,actionQueryStructure:`Structure de la requête`},tabs:{newQuery:`Nouvelle requête`,queryTitle:`Requête {{n}}`,erdViewer:`Visionneuse ERD`,close:`Fermer`,closeOthers:`Fermer les autres`,closeLeft:`Fermer les onglets à gauche`,closeRight:`Fermer les onglets à droite`,closeAll:`Tout fermer`},executor:{noActiveConnection:`Aucune connexion active`,uncommittedTitle:`Transaction non validée`,uncommittedDescription:`Cette connexion a une transaction ouverte. La déconnexion annulera ses modifications.`,uncommittedConfirm:`Annuler (rollback) et se déconnecter`,unsavedTitle:`Modifications non enregistrées`,unsavedDescription:`{{file}} contient des modifications qui n'ont pas été enregistrées dans son fichier. La déconnexion les abandonne (utilisez d'abord Connexion > Enregistrer le fichier de base de données pour les conserver).`,theSqliteDatabase:`La base de données SQLite`,unsavedConfirm:`Abandonner et se déconnecter`}},f=JSON.parse(`{"tabs":{"message":"Message","info":"Infos","history":"Historique","result":"Résultat","resultN":"Résultat {{n}}","plan":"Plan","structure":"Structure","structureN":"Structure {{n}}"},"message":{"executing":"Exécution de la requête...","error":"Erreur : {{message}}","total":" (Total : {{ms}} ms)","ready":"Prêt.","log":"Journal d'exécution","statementN":"Instruction {{n}}","limitedBadge":"limite atteinte","insertId":"insert id {{id}}","failed":"Échec","failedStatement":"Instruction en échec","summary":"{{ok}} réussies · {{failed}} échouées · {{ms}} au total","copy":"Copier","copied":"Copié","showSql":"Afficher le SQL","hideSql":"Masquer le SQL"},"hints":{"title":"Indice","unknownColumn":"Aucune colonne nommée {{name}}. Vouliez-vous dire {{suggestions}} ?","unknownTable":"Aucune table nommée {{name}}. Vouliez-vous dire {{suggestions}} ?","syntaxSwap":"{{engine}} écrit {{expected}} et non {{found}}.","doubleQuotedLiteral":"{{engine}} lit \\"{{value}}\\" comme un nom de colonne, pas comme du texte. Pour une chaîne, écrivez '{{value}}'."},"ai":{"title":"Explication IA","explain":"Expliquer avec l'IA","thinking":"Lecture de l'échec…","by":"par {{model}}","applyFix":"Ouvrir la correction dans un nouvel onglet","failed":"Impossible d'expliquer : {{message}}","noFailure":"Aucune instruction en échec à expliquer.","noPack":"Le prompt n'a pas pu être récupéré depuis planche.dev.","badShape":"Le modèle n'a pas répondu dans le format attendu.","noPlan":"Il n'y a pas encore de plan à expliquer.","explainPlan":"Expliquer ce plan"},"info":{"empty":"Aucune information de requête disponible.","resultN":"Résultat {{n}}","metadata":"Métadonnées de la requête","executionTime":"Temps d'exécution","notAvailable":"N/D","affectedRows":"Lignes affectées","fields":"Champs","fieldDetails":"Détails des champs","colName":"Nom","colType":"Type","colTable":"Table","resultSets":"Jeux de résultats","rowsReturned":"Lignes renvoyées","insertId":"Dernier ID inséré","lastQuery":"Dernière instruction exécutée","copy":"Copier","copied":"Copié","colOrigin":"Origine","primaryKey":"Clé primaire","rowsAndFields":"{{rows}} lignes × {{fields}} champs","noFields":"Cette instruction n'a renvoyé aucune colonne."},"rowForm":{"colColumn":"Colonne","colValue":"Valeur","insertTitle":"Insérer une ligne","editTitle":"Modifier la ligne","loading":"Chargement des colonnes...","preview":"Instruction","nothingToWrite":"Rien à écrire","insert":"Insérer","update":"Mettre à jour","stageInsert":"Ajouter comme ligne en attente","stageEdit":"Appliquer à la grille","stageHint":"Place les valeurs dans la grille sans rien exécuter ; validez plus tard avec les autres modifications.","inserted":"Ligne insérée dans {{table}}","updated":"Ligne mise à jour dans {{table}}","confirmInsertTitle":"Insérer une ligne dans {{table}} ?","confirmUpdateTitle":"Mettre à jour une ligne de {{table}} ?","inTransaction":"S'exécute dans la transaction ouverte","pickDate":"Choisir une date","now":"Maintenant","formatJson":"Formater","binaryUnsupported":"Les colonnes binaires ne sont pas modifiables ici ; laissez NULL/DEFAULT ou utilisez du SQL.","generateUuid":"Générer un UUID","defaultValue":"Valeur par défaut","clickToChange":"Cliquer pour modifier","empty":"(vide)","autoHint":"Généré par le serveur","mode":{"keep":"Conserver","auto":"Auto","value":"Valeur"},"invalid":{"integer":"Saisissez un entier","unsigned":"Cette colonne n'accepte pas les nombres négatifs","number":"Saisissez un nombre","json":"JSON invalide","date":"Utilisez YYYY-MM-DD","datetime":"Utilisez YYYY-MM-DD HH:MM:SS","time":"Utilisez HH:MM:SS","length":"{{max}} caractères maximum"}},"history":{"copied":"Copié dans le presse-papiers","searchPlaceholder":"Rechercher dans l'historique...","all":"Tous","success":"Réussies","failed":"Échouées","thisTab":"Cet onglet seulement","noMatch":"Aucune entrée ne correspond.","count":"{{count}} entrées","clear":"Effacer","clearTitle":"Effacer l'historique des requêtes ?","clearDescription":"Les {{count}} entrées de cette connexion seront supprimées. Cette action est irréversible.","clearConfirm":"Effacer l'historique","insert":"Insérer dans l'éditeur","inserted":"Inséré dans l'éditeur","copy":"Copier","rows":"{{count}} lignes","affected":"{{count}} affectées","today":"Aujourd'hui","yesterday":"Hier","empty":"Aucun historique de requêtes."},"json":{"arrayLength":"Array[{{count}}]","keys_one":"{{count}} clé","keys_other":"{{count}} clés","invalid":"JSON invalide","clickToView":"Cliquer pour afficher le JSON","expandAll":"Tout déplier","collapseAll":"Tout replier","edit":"Modifier","view":"Afficher","copied":"Copié","copy":"Copier","shortcutHint":"{{mod}}+Enter pour enregistrer · Esc pour annuler","cancel":"Annuler","save":"Enregistrer"},"text":{"clickToView":"Cliquer pour afficher le texte","size":"{{chars}} caractères · {{lines}} lignes","wrap":"Retour à la ligne"},"grid":{"readOnlyConnection":"Connexion en lecture seule","readOnlyWal":"Lecture seule : fichier -wal non chargé","readOnlyNoPk":"Lecture seule : la table n'a pas de clé primaire","commitTitle":"Valider {{count}} modification(s) dans {{table}} ?","commitDescription":"Les instructions suivantes seront exécutées.","commitConfirm":"Commit","rowPrefix":"Ligne {{row}} :","cancelled":"annulé","commitFailed":"Échec du commit : {{message}}","executedInTransaction":"{{count}} modification(s) exécutée(s) dans la transaction ouverte — cliquez sur Commit dans la barre d'outils pour les rendre permanentes (un rechargement les annule)","committed":"{{count}} modification(s) validée(s) dans {{table}}","noData":"Aucune donnée à afficher.","commit":"Commit","discard":"Abandonner","addRow":"Ajouter une ligne","removeNewRow":"Annuler cette nouvelle ligne","addRowForm":"Ajouter via un formulaire","addRowFormHint":"Ouvre un formulaire avec un champ par colonne (validé en INSERT)","editRowForm":"Modifier cette ligne dans un formulaire","addRowHint":"Ajouter une nouvelle ligne (validée par INSERT)","delete":"Supprimer","deleteCount":"Supprimer ({{count}})","deleteHint":"Supprimer les lignes sélectionnées (validé par DELETE). Sélectionnez les lignes avec la colonne des numéros de ligne.","field":"Champ","searchPlaceholder":"Rechercher...","orderBy":"Trier par","none":"Aucun","refresh":"Actualiser","dismiss":"Ignorer","clearSelection":"Effacer la sélection","columns":"Colonnes","showAllColumns":"Tout afficher","hideAllColumns":"Tout masquer","resetWidths":"Réinit. largeurs","selectAll":"Sélectionner toutes les lignes","emptyTable":"Cette table ne contient aucune ligne.","noRows":"Aucune ligne renvoyée.","addARow":"Ajouter une ligne","markedForDeletion":"Marquée pour suppression — cliquez pour restaurer","newRow":"Nouvelle ligne","clickToSelect":"Cliquez pour sélectionner ; Maj/Ctrl pour une sélection multiple","rows":"Lignes : {{count}}","rowsWithNew":"Lignes : {{count}} (+{{added}})","sortedBy":"Trié par : {{column}} {{direction}}","pageRange":"Lignes {{from}}–{{to}}","firstPage":"Première page","prevPage":"Page précédente","nextPage":"Page suivante","lastPage":"Dernière page","pagingBlocked":"Validez ou annulez vos modifications avant de changer de page","selected":"{{count}} sélectionnée(s)","cellsModified":"{{count}} cellule(s) modifiée(s)","newCount":"{{count}} nouvelle(s)","toDelete":"{{count}} à supprimer","searchMode":"Mode de correspondance","contains":"contient","equals":"égal à","followLink":"Ouvrir {{table}} où {{column}} = valeur","linkColumn":"Lier « {{column}} » à une autre table…","editLink":"Modifier le lien de « {{column}} »…","removeLink":"Supprimer le lien","copyValue":"Copier la valeur","filterByValue":"Filtrer : {{column}} = cette valeur","clearFilter":"Effacer le filtre","copyColumnName":"Copier le nom de la colonne","editCell":"Modifier la cellule","setNull":"Mettre à NULL","setEmpty":"Mettre une chaîne vide","restoreRow":"Restaurer la ligne","hideColumn":"Masquer la colonne « {{column}} »","copyRowsTsv_one":"Copier la ligne en TSV (avec en-tête)","copyRowsTsv_other":"Copier {{count}} lignes en TSV (avec en-tête)","copyRowsCsv_one":"Copier la ligne en CSV","copyRowsCsv_other":"Copier {{count}} lignes en CSV","copyRowsJson_one":"Copier la ligne en JSON","copyRowsJson_other":"Copier {{count}} lignes en JSON","copyRowsInsert_one":"Copier la ligne en INSERT","copyRowsInsert_other":"Copier {{count}} lignes en INSERT","deleteRowsPending_one":"Supprimer la ligne (en attente du Commit)","deleteRowsPending_other":"Supprimer {{count}} lignes (en attente du Commit)","sendRowsToScratchpad_one":"Envoyer la ligne au bloc-notes","sendRowsToScratchpad_other":"Envoyer {{count}} lignes au bloc-notes","sendAllToScratchpad":"Envoyer les {{count}} lignes chargées au bloc-notes","sentToScratchpad":"{{count}} lignes copiées dans la table {{table}} du bloc-notes.","changesSince":"Depuis le dernier chargement : {{changed}} modifiées · {{added}} nouvelles · {{gone}} disparues","changesToggle":"Afficher/masquer ce qui a changé depuis le chargement précédent","changesDismiss":"Oublier ces changements","previousValue":"Valeur précédente : {{value}}","groupByValue":"Grouper et compter par {{column}}"},"link":{"title":"Lier la colonne à une autre table","source":"Colonne","hint":"Les valeurs de cette colonne deviennent des liens : un clic ouvre la table cible filtrée sur les lignes correspondantes. Les vraies clés étrangères sont liées automatiquement.","targetDatabase":"Base cible","targetTable":"Table cible","targetColumn":"Colonne cible","pickTable":"Choisir une table","pickColumn":"Choisir une colonne","remove":"Supprimer le lien","cancel":"Annuler","save":"Enregistrer le lien","targetConnection":"Connexion cible","targetNotConnected":"La connexion liée n'est pas ouverte. Connectez-la d'abord."},"running":{"label":"Requête en cours…","elapsed":"{{seconds}} s","stop":"Arrêter","stopping":"Arrêt…","cannotCancel":"Ce moteur ne peut pas interrompre une instruction en cours.","agentOutdated":"L'agent local est trop ancien pour arrêter une requête. Mettez-le à jour avec \`npx planche@latest\` (ou \`planche upgrade\`) puis reconnectez-vous.","cancelFailed":"L'agent est injoignable ; la requête n'a pas été arrêtée.","abandoned":"L'attente de la requête a été interrompue. Ce moteur n'a pas d'annulation propre : la requête peut aller à son terme côté serveur."},"plan":{"empty":"Lancez « Afficher le plan d'exécution » (Ctrl+Maj+E) pour voir comment le moteur traitera l'instruction sous le curseur.","unreadable":"Le plan n'a pas pu être lu sous forme d'arbre ; la sortie du moteur est affichée telle quelle.","estimated":"Estimé","analyzed":"Mesuré","estimatedHint":"Estimations de l'optimiseur. L'instruction n'a pas été exécutée.","analyzedHint":"L'instruction a été exécutée ; les nombres de lignes et les temps sont réels.","totalCost":"Coût de nœud le plus élevé","totalTime":"Nœud le plus lent","rows":"Lignes estimées","actualRows":"Lignes réelles","cost":"Coût","time":"Temps","showRaw":"Sortie brute","showTree":"Arbre du plan","selectNode":"Sélectionnez un nœud pour voir ce que le moteur en a rapporté.","noDetails":"Le moteur n'a rien rapporté d'autre sur ce nœud.","warnings":{"fullScan":"Balayage complet","noIndex":"Aucun index","estimateOff":"Estimation erronée","temporary":"Table temporaire","filesort":"Tri"},"hints":{"fullScan":"Toutes les lignes de la table sont lues. Un index sur les colonnes filtrées l'éviterait.","noIndex":"Le moteur n'a trouvé aucun index utilisable pour cet accès.","estimateOff":"L'optimiseur attendait un nombre de lignes très différent. Rafraîchir les statistiques corrige souvent le plan.","temporary":"Les lignes sont matérialisées dans une table temporaire avant l'étape suivante.","filesort":"Tri effectué hors index. Un index correspondant à l'ORDER BY supprimerait ce tri."}},"structure":{"empty":"Afficher la structure (Ctrl+Maj+G) montre d'où viennent les lignes de l'instruction au curseur.","notQuery":"Seules les instructions SELECT ont un graphe de structure.","unsupported":"Les instructions {{engine}} ne peuvent pas être lues comme un graphe de structure.","parseError":"L'instruction n'a pas pu être analysée : {{message}}","columns_one":"{{count}} colonne","columns_other":"{{count}} colonnes","columnsUnknown":"largeur inconnue","fit":"Ajuster","reveal":"Sélectionner dans l'éditeur","notDrawn":"Non dessiné : {{what}}","kindTable":"TABLE","kindCte":"CTE","kindCteRef":"RÉF","kindDerived":"SOUS-REQUÊTE","kindScalar":"SCALAIRE","kindSetop":"ENSEMBLE","kindResult":"RÉSULTAT","fullscreen":"Plein écran","exitFullscreen":"Quitter le plein écran"}}`),p={defaultDescription:`Cette action est irréversible.`,typeToConfirm:`Saisissez <name/> pour confirmer`,cancel:`Annuler`,confirm:`Confirmer`,ok:`OK`},m={dialog:{createTitle:`Créer une table`,alterTitle:`Modifier la table`,duplicateTitle:`Dupliquer la structure de la table`,create:`Créer`,alter:`Modifier`,cancel:`Annuler`,tableName:`Nom de la table`,tableNamePlaceholder:`Saisissez le nom de la table...`,loading:`Chargement du schéma de la table...`,tabSchema:`Schéma`,tabIndexes:`Index`,tabProperties:`Propriétés`,applying:`Application…`,cannotAlterColumns:`{{engine}} ne peut pas modifier une colonne existante ({{columns}}). Ajouter, supprimer et renommer des colonnes ainsi que modifier les index fonctionnent ; pour changer une définition de colonne, recréez la table.`},schema:{colField:`Nom du champ`,colType:`Type de données`,colLength:`Longueur`,colDefault:`Par défaut`,colPk:`PK`,colNotNull:`Not Null`,colUnsigned:`Unsigned`,colAutoIncrement:`Auto Incr`,colZerofill:`Zerofill`,colComment:`Commentaire`,empty:`Aucune colonne définie. Cliquez sur « Ajouter une colonne » pour en ajouter une.`,add:`Ajouter une colonne`,remove:`Supprimer la colonne`},indexes:{colName:`Nom de l'index`,colType:`Type d'index`,colColumns:`Colonnes`,empty:`Aucun index défini. Cliquez sur « Ajouter un index » pour en ajouter un.`,add:`Ajouter un index`,remove:`Supprimer l'index`},index:{addTitle:`Ajouter un index`,editTitle:`Modifier l'index`,name:`Nom de l'index`,namePlaceholder:`Saisissez le nom de l'index`,type:`Type d'index`,columns:`Colonnes`,noColumns:`Aucune colonne disponible. Définissez d'abord des colonnes dans l'onglet Schéma.`,unnamed:`(sans nom)`,cancel:`Annuler`,ok:`OK`},properties:{engine:`Moteur`,charset:`Jeu de caractères`,collation:`Collation`,autoIncrement:`Auto-incrément`,autoIncrementPlaceholder:`Par défaut`,comment:`Commentaire`},info:{engine:`Moteur`,version:`Version`,rowFormat:`Format des lignes`,rows:`Lignes`,avgRowLength:`Longueur moyenne des lignes`,dataLength:`Taille des données`,createTime:`Date de création`,updateTime:`Date de mise à jour`,collation:`Collation`,comment:`Commentaire`},copy:{title:`Copier la table`,source:`Source`,targetConnection:`Connexion cible`,targetDatabase:`Base cible`,targetTable:`Nom de la table cible`,what:`Copier`,structureAndData:`Structure et données`,structureOnly:`Structure seule`,ifExists:`Si la table cible existe`,abort:`Abandonner (par défaut)`,dropAndRecreate:`Supprimer et recréer (le nom devra être ressaisi)`,preview:`CREATE TABLE sur la cible (modifiable)`,crossEngineHint:`La cible est {{engine}} : vérifiez les types ci-dessous, les attributs propres à MySQL ont été retirés.`,readOnly:`lecture seule`,loading:`Chargement…`,progressCreate:`Création de la table…`,progressCount:`Comptage des lignes…`,progressRows:`{{copied}} lignes copiées sur {{total}}`,progressDone:`Terminé`,doneTitle:`Table copiée`,doneRows:`{{count}} lignes copiées dans {{table}}.`,doneStructure:`Structure de {{table}} créée.`,noColumns:`La table source n'a aucune colonne.`,exists:`La table {{table}} existe déjà dans la cible. Choisissez un autre nom ou « Supprimer et recréer ».`,dropTitle:`Supprimer la table existante {{table}} ?`,dropDescription:`La table cible et toutes ses lignes seront supprimées avant la copie. Cette action est irréversible.`,dropConfirm:`Supprimer et copier`,cancelled:`Copie annulée.`,stop:`Arrêter`,cancel:`Annuler`,copy:`Copier`}},h={copy:{title:`Copier la base de données`,source:`Base de données source`,target:`Nom de la base de données cible`,targetPlaceholder:`Saisissez le nom de la base de données cible`,options:`Options`,structureAndData:`Structure et données`,structureOnly:`Structure uniquement`,cancel:`Annuler`,copy:`Copier`,creating:`Création de {{database}}…`,copying:`Copie de {{table}} ({{index}} sur {{total}})…`},diff:{title:`Comparer les schémas`,source:`Source`,target:`Cible`,pickConnection:`Connexion`,pickDatabase:`Base de données`,crossEngineHint:`Moteurs différents : les noms de types varient selon le dialecte, la plupart des colonnes apparaîtront comme modifiées.`,sameSide:`La source et la cible sont la même base.`,summary:`{{changed}} modifiées, {{missingTarget}} absentes de la cible, {{missingSource}} uniquement dans la cible, {{identical}} identiques`,showIdentical:`Afficher les tables identiques`,identicalAll:`Les tables sont identiques.`,column:`Colonne`,index:`Index`,object:`Objet`,selectTable:`Sélectionnez une table pour voir ses différences.`,missingInTarget:`{{table}} n'existe pas dans la cible ; le script la crée.`,missingInSource:`{{table}} n'existe que dans la cible ; le script la supprime (en commentaire sauf si les DROP sont inclus).`,includeDrops:`Inclure les instructions DROP en SQL exécutable (par défaut : en commentaire)`,tabTitle:`Sync {{database}}`,close:`Fermer`,compare:`Comparer`,comparing:`Comparaison…`,openScript:`Ouvrir le script dans l'éditeur`,noDefinition:`Aucune instruction CREATE disponible`},create:{title:`Créer une base de données`,name:`Nom de la base de données`,namePlaceholder:`Saisissez le nom de la base de données`,charset:`Jeu de caractères`,collation:`Collation`,cancel:`Annuler`,create:`Créer`},csv:{title:`Télécharger en {{format}}`,target:`Cible`,targetQueryResult:`Résultat de la requête actuelle`,targetTableData:`Données de la table`,tableName:`Nom de la table`,tableNamePlaceholder:`Saisissez le nom de la table`,delimiter:`Délimiteur`,delimiterComma:`Virgule (,)`,delimiterTab:`Tabulation (\\t)`,delimiterSemicolon:`Point-virgule (;)`,delimiterPipe:`Barre verticale (|)`,includeHeaders:`Inclure les en-têtes`,cancel:`Annuler`,download:`Télécharger`,downloading:`Téléchargement...`,progress:`{{loaded}} lignes sur {{total}} écrites`,progressUnknown:`{{loaded}} lignes écrites`,stop:`Arrêter`,done:`{{count}} lignes de {{table}} exportées en {{format}}.`,database:`Base de données`,databasePlaceholder:`Choisir une base`},html:{title:`Schéma en HTML`,database:`Base de données`,selectDatabase:`Sélectionner une base de données`,tables:`Tables à inclure`,selectAll:`Tout sélectionner`,deselectAll:`Tout désélectionner`,noTables:`Aucune table disponible.`,include:`Inclure`,includeColumns:`Colonnes`,includeIndexes:`Index`,includeProperties:`Propriétés`,cancel:`Annuler`,generate:`Générer`,generating:`Génération...`,sectionColumns:`Colonnes`,sectionIndexes:`Index`,sectionProperties:`Propriétés`,docTitle:`Schéma : {{database}}`,heading:`Base de données : {{database}}`,summary:`Tables : {{count}} | Généré le : {{date}}`,footer:`Généré par Planche 2026`},dataDiff:{title:`Comparer les données`,pickTable:`Table`,hint:`Les lignes sont associées par la clé primaire de la table source et comparées en texte. Jusqu'à {{cap}} lignes par côté sont chargées ; filtrez d'abord les grandes tables.`,sameSide:`La source et la cible sont la même table.`,noPrimaryKey:`{{table}} n'a pas de clé primaire ; la comparaison en a besoin pour associer les lignes.`,keyMissingInTarget:`La table cible n'a pas la ou les colonnes clés : {{columns}}`,summary:`Clé : {{key}} — {{added}} absentes de la cible, {{changed}} différentes, {{removed}} uniquement dans la cible, {{identical}} identiques`,capped:`Seules les {{cap}} premières lignes de chaque côté ont été comparées.`,ignoredColumns:`Colonnes ignorées (un seul côté) : {{columns}}`,added_one:`{{count}} absente de la cible`,added_other:`{{count}} absentes de la cible`,changed_one:`{{count}} différente`,changed_other:`{{count}} différentes`,removed_one:`{{count}} uniquement dans la cible`,removed_other:`{{count}} uniquement dans la cible`,none:`Rien dans ce groupe.`,more:`… {{count}} de plus non listées`,includeDeletes:`Inclure les instructions DELETE en SQL exécutable (par défaut : en commentaire)`,tabTitle:`Sync données {{table}}`,loading:`Chargement des lignes — source : {{source}}, cible : {{target}}`},schema:{createTitle:`Créer un schéma`,name:`Nom du schéma`,namePlaceholder:`Saisir le nom du schéma`,create:`Créer`,cancel:`Annuler`},groupBy:{title:`Grouper et compter`,description:`Compter les lignes de {{table}} selon les colonnes choisies.`,columns:`Grouper par`,aggregate:`Agrégat supplémentaire`,countOnly:`Nombre seulement`,column:`Colonne`,minCount:`Lignes minimum par groupe`,useFilter:`Appliquer le filtre actuel de la grille`,noIndexWarning:`Aucune colonne choisie n'est en tête d'un index : la base doit lire et trier toute la table. Cela peut être long sur une grande table.`,preview:`Requête`,pickColumn:`Choisissez au moins une colonne de regroupement.`,openInTab:`Ouvrir dans un nouvel onglet`,run:`Exécuter`,tabTitle:`Grouper {{table}}`,indexed:`En tête d'un index`,connection:`Connexion`,database:`Base de données`,table:`Table`}},g={manager:{title:`Gestion des utilisateurs`,addUser:`Ajouter un utilisateur`,removeUser:`Supprimer l'utilisateur`,noUsers:`Aucun utilisateur chargé`,grantScope:`Portée des privilèges`,apply:`Appliquer`,close:`Fermer`,removed:`Utilisateur '{{user}}'@'{{host}}' supprimé`,selectUserFirst:`Veuillez d'abord sélectionner un utilisateur`,applied:`Modifications appliquées`,noChanges:`Aucune modification de privilèges à appliquer.`},add:{title:`Ajouter un utilisateur`,username:`Nom d'utilisateur`,usernamePlaceholder:`Saisissez le nom d'utilisateur`,host:`Hôte`,password:`Mot de passe`,passwordPlaceholder:`Saisissez le mot de passe`,confirmPassword:`Confirmer le mot de passe`,confirmPasswordPlaceholder:`Confirmez le mot de passe`,plugin:`Plugin`,cancel:`Annuler`,add:`Ajouter`,usernameRequired:`Le nom d'utilisateur est requis`,passwordMismatch:`Les mots de passe ne correspondent pas`,added:`Utilisateur '{{user}}'@'{{host}}' ajouté`},privileges:{globalTitle:`Privilèges globaux`,databaseTitle:`Privilèges sur la base de données`,tableTitle:`Privilèges sur la table`,checkAll:`Tout cocher`,uncheckAll:`Tout décocher`,categoryData:`Données`,categoryStructure:`Structure`,categoryAdministration:`Administration`},grantTree:{globalPrivileges:`Privilèges globaux`}},_={close:`Fermer`,noActiveConnection:`Aucune connexion active`,variableName:`Nom de la variable`,value:`Valeur`,scope:{session:`Session`,global:`Global`},findReplace:{findPlaceholder:`Rechercher`,replacePlaceholder:`Remplacer`,found:`{{count}} trouvé(s)`,noResults:`Aucun résultat`,previous:`Précédent`,next:`Suivant`,close:`Fermer`,replace:`Remplacer`,all:`Tout`,caseSensitive:`Respecter la casse`,regex:`Regex`,wholeWord:`Mot entier`},flush:{title:`Flush`,executed:`Exécuté : {{command}}`,executeError:`Erreur lors de l'exécution de {{command}} : {{message}}`},localHistory:{title:`Historique local`,description:`Versions du texte de l'éditeur pour cette connexion : à chaque exécution, après une pause de saisie et à la fermeture d'un onglet.`,empty:`Aucune version enregistrée pour l'instant.`,noMatch:`Aucune version ne correspond à cette recherche.`,notPersisted:`« Conserver l'historique des requêtes après rechargement » est désactivé dans Paramètres > Sécurité ; les versions ne sont conservées que pour cette session.`,searchPlaceholder:`Rechercher des versions`,scopeTab:`Cet onglet`,scopeAll:`Tous les onglets`,compareCurrent:`avec l'actuel`,comparePrevious:`avec la précédente`,diffAgainstCurrent:`Comparé au texte actuel de l'éditeur`,diffAgainstPrevious:`Comparé à la version du {{time}}`,noPrevious:`Aucune version antérieure de cet onglet à comparer`,restored:`Contenu de l'éditeur restauré depuis l'historique local`,restore:`Restaurer cette version`,openInNewTab:`Ouvrir dans un nouvel onglet`,openedInTab:`Version ouverte dans un nouvel onglet`,delete:`Supprimer cette version`,clearAll:`Effacer l'historique`,chars:`{{count}} caractères`,reason:{execute:`avant l'exécution`,edit:`pendant la modification`,replaced:`avant l'écrasement`,restore:`avant la restauration`,close:`avant la fermeture`}},processList:{title:`Liste des processus`,refresh:`Actualiser`,autoRefresh:`Actualisation auto`,empty:`Aucun processus à afficher`,kill:`Tuer`,killProcess:`Tuer le processus`,selectToKill:`Veuillez sélectionner un processus à tuer`,killed:`Processus {{id}} tué`,killError:`Erreur lors de l'arrêt du processus : {{message}}`,loadError:`Erreur lors du chargement de la liste des processus : {{message}}`,updatedAt:`mis à jour à {{time}}`,filterPlaceholder:`Filtrer par utilisateur, hôte, base, SQL...`,hideIdle:`Masquer les inactifs`,noMatch:`Aucun processus ne correspond au filtre`,self:`moi`,selfHint:`Il s'agit de la session de Planche`,statementOf:`Instruction de #{{id}}`,noStatement:`Aucune instruction`,copy:`Copier`,copied:`Copié`,killConfirmTitle:`Terminer le processus {{id}} ?`,killConfirmDescription:`La session de {{user}}@{{host}} sera fermée et l'instruction en cours interrompue. Une transaction ouverte sera annulée.`,stats:{total:`Total`,active:`Actifs`,idle:`Inactifs`,longest:`Plus longue exécution`},columns:{id:`Id`,user:`Utilisateur`,host:`Hôte`,db:`db`,command:`Commande`,time:`Temps`,state:`État`,info:`Infos`,action:`Action`}},status:{title:`État du serveur`,filterPlaceholder:`Filtrer les variables d'état...`,empty:`Aucune variable d'état à afficher`,loadError:`Erreur lors du chargement de l'état : {{message}}`},variables:{title:`Variables du serveur`,filterPlaceholder:`Filtrer les variables...`,empty:`Aucune variable à afficher`,loadError:`Erreur lors du chargement des variables : {{message}}`}},v={empty:{title:`Ouvrez un fichier de schéma Prisma (.prisma) pour afficher l'ERD`,description:`Les modèles, énumérations et relations seront analysés automatiquement`,openFile:`Ouvrir un fichier .prisma`,dropHint:`ou glissez-déposez un fichier dans cette zone`},entity:{enumBadge:`ENUM`,modelBadge:`MODEL`,columns:{value:`Valeur`,comment:`Commentaire`,type:`Type`,column:`Colonne`},linkBadge:`LIEN`,externalTitle:`Table liée sur {{location}} (lien de colonne, pas une vraie clé étrangère)`,nullable:`Colonne acceptant NULL`},toolbar:{refresh:`Actualiser`,zoomIn:`Zoom avant`,zoomOut:`Zoom arrière`,resetView:`Réinitialiser la vue`,center:`Centrer`,fitAll:`Tout ajuster`,spreadAll:`Désempiler`,resetLayout:`Réinitialiser la disposition`,legendOneToMany:`1:N (FK)`,tables:`Tables :`,relations:`Relations :`,columns:`Colonnes :`,fullscreen:`Plein écran`,exitFullscreen:`Quitter le plein écran`},viewer:{noServerConnection:`Aucune connexion serveur active`,loading:`Chargement du schéma depuis {{database}}...`,loadFailed:`Échec du chargement de l'ERD`,noDatabase:`Aucune base de données sélectionnée.`,selectDatabaseHint:`Sélectionnez une base de données dans l'arborescence du schéma, puis ouvrez Afficher l'ERD.`}},y={runAnyway:`Exécuter quand même`,query:{rowsReturned:`{{count}} ligne(s) renvoyée(s)`,rowsAffected:`{{count}} ligne(s) affectée(s)`,rowsReturnedLimited:`{{count}} ligne(s) renvoyée(s) (limité à {{limit}} ; ajoutez LIMIT pour en récupérer davantage)`,notConnected:`Non connecté`,fileNotOpen:`Le fichier SQLite n'est pas encore ouvert — cliquez sur « Rouvrir le fichier » ci-dessus pour accorder à nouveau l'accès.`,failed:`Échec de la requête`,nothingToExecute:`Rien à exécuter`,dryRunMismatch:`L'aperçu prévoyait {{predicted}} lignes, {{actual}} ont été modifiées. Les données ont pu changer depuis l'aperçu ; sinon, l'aperçu ne correspondait pas à cette instruction.`},destructive:{title_one:`Exécuter l'instruction destructrice ?`,title_other:`Exécuter {{count}} instructions destructrices ?`,description:`Les instructions suivantes modifieront ou supprimeront définitivement des données. Cette action est irréversible.`,unknownTarget:`(inconnu)`,deleteAll:`DELETE de toutes les lignes de {{target}}`,updateAll:`UPDATE de toutes les lignes de {{target}}`,alterDrop:`DROP COLUMN/PARTITION sur {{target}}`},readOnly:{refused:`La connexion « {{label}} » est en lecture seule. {{count}} instruction(s) modifieraient les données ou le schéma.`,title:`« {{label}} » est en lecture seule`,description:`Ces instructions modifient les données ou le schéma. Les exécuter quand même sur cette connexion ?`},transaction:{startFailed:`Impossible de démarrer la transaction`,started:`Transaction démarrée — Commit ou Rollback une fois terminé`,implicitCommit:`{{kind}} a provoqué un COMMIT implicite de la transaction ouverte`,committed:`Transaction validée`,rolledBack:`Transaction annulée`,commandFailed:`Échec de {{name}}`,commandFailedWith:`Échec de {{name}} : {{message}}`},save:{notBrowserSqlite:`Ce n'est pas une connexion SQLite dans le navigateur.`,inMemory:`Base de données en mémoire : elle ne peut être exportée qu'en téléchargement.`,noFileSystemAccess:`Ce navigateur ne dispose pas de l'API File System Access (Chrome/Edge uniquement) : la base de données est exportée en téléchargement au lieu d'être écrite sur place.`,noWritableHandle:`Le fichier a été ouvert sans descripteur en écriture : il est exporté en téléchargement.`},agent:{devProxyUrl:`{{url}} (via le proxy de dev)`,notPlanche:`Quelque chose a répondu, mais ce n'est pas un agent Planche`,unreachable:"Agent Planche injoignable sur {{url}} — exécutez `npx planche` ({{message}})",httpError:`Erreur HTTP : {{status}} {{statusText}}`,emptyResponse:`Le serveur de tunnel a renvoyé une réponse vide`,reconnected:`Reconnecté à {{name}} — l'agent avait abandonné la connexion (redémarrage ou délai d'inactivité).`},sample:{profileName:`Boutique d'exemple (dans le navigateur)`,downloadFailed:`Impossible de télécharger la base de données d'exemple ({{status}})`,tabTitle:`Requête 1`},sqliteFile:{tooSmall:`Le fichier est trop petit pour être une base de données SQLite.`,notSqlite:`Ce n'est pas une base de données SQLite (ou elle est chiffrée, p. ex. SQLCipher). L'en-tête de 16 octets ne contient pas « SQLite format 3 ».`,badPageSize:`En-tête SQLite corrompu : taille de page invalide {{size}}.`,unreadable:`SQLite n'a pas pu lire le fichier : {{message}}`,pickerDescription:`Base de données SQLite`,walNotLoaded:`Cette base de données est en mode WAL et son fichier -wal n'a pas été chargé. Chargez-le, ou confirmez dans la bannière qu'aucun fichier -wal n'existe, avant d'enregistrer.`,changedOnDisk:`{{name}} a changé sur le disque après son chargement (un autre programme y a écrit). Enregistrer écraserait ces modifications — rouvrez le fichier et refaites vos modifications, ou utilisez le serveur de tunnel.`,walHasChanges:`{{name}}-wal contient de nouvelles modifications ; chargez-le avant d'enregistrer.`,walChangedOnDisk:`{{name}}-wal a été écrit par un autre programme après son chargement ; rouvrez le fichier avant d'enregistrer.`,writeDenied:`L'accès en écriture à {{name}} n'a pas été accordé. Autorisez-le dans l'invite du navigateur, ou exportez en téléchargement à la place.`},environment:{none:`Aucun`,green:`Vert (dev)`,blue:`Bleu`,yellow:`Jaune (staging)`,orange:`Orange`,red:`Rouge (production)`,purple:`Violet`},scratchpad:{profileName:`Bloc-notes`,namePromptTitle:`Nom de la table du bloc-notes`,namePromptDescription:`Une table nommée {{table}} existe déjà dans le bloc-notes. Choisissez un autre nom.`,nameTaken:`La table {{table}} existe déjà.`},federated:{pulling:`Récupération de {{table}} depuis {{connection}}…`,capped:`{{table}} : seules les {{limit}} premières lignes ont été récupérées.`,templateLine1:`Référencez une table de n'importe quelle connexion ouverte comme "Nom de connexion".database.table ; elle est copiée dans ce bloc-notes avant l'exécution.`,templateLine2:`Les tables sont limitées à {{limit}} lignes. La requête elle-même s'exécute dans SQLite (dans votre navigateur).`,templateConnections:`Connexions ouvertes : {{names}}`,templateNone:`Aucune autre connexion n'est ouverte. Connectez-en une, puis référencez-la ici.`,done:`{{rows}} lignes récupérées depuis {{tables}} tables distantes vers le bloc-notes.`,pullingProgress:`Récupération de {{table}} depuis {{connection}} : {{loaded}} / {{total}} lignes…`},paged:{noColumns:`{{table}} n'a aucune colonne.`,cancelled:`Annulé.`}},b={title:`Conditions d’utilisation`,version:`Version {{version}}`,englishOnly:`Les conditions sont fournies en anglais. Le résumé de l’écran d’accueil est disponible dans votre langue.`,privacyLink:`Politique de confidentialité`,refundLink:`Politique de remboursement`,online:`Lire sur planche.dev`,updated:`Dernière mise à jour : {{date}}`},x={title:`{{kind}} toucherait {{count}} lignes`,titleUnknown:`{{kind}} — lignes affectées inconnues`,description:`Voici les lignes que l'instruction toucherait maintenant, lues avec un SELECT. Rien n'a encore été écrit.`,previewFailed:`La requête d'aperçu a échoué : {{error}}
2
+ Vous pouvez quand même exécuter l'instruction.`,noRows:`Aucune ligne ne correspond — l'instruction ne changerait rien.`,truncated:`Affichage des {{shown}} premières lignes sur {{count}}.`,previewQuery:`Requête d'aperçu`,run:`Exécuter {{kind}} ({{count}} lignes)`,runAnyway:`Exécuter quand même`},S={badge:`PRO`,tooltip:`Nécessite une licence Pro.`,noticeTitle:`Fonctionnalités Pro`,notice:`Les fonctions marquées PRO nécessitent une licence Pro.`,licenseTitle:`Planche Pro`,licenseDescription:`Collez la clé de licence reçue par e-mail. Elle est vérifiée sur cet ordinateur ; rien n’est envoyé nulle part.`,blocked:`{{feature}} nécessite une licence Pro.`,keyLabel:`Clé de licence`,activate:`Activer`,remove:`Retirer la licence`,active:`Pro est actif.`,licensedTo:`Sous licence de {{email}}`,validUntil:`Valable jusqu’au {{date}}`,expiredOn:`Cette licence a expiré le {{date}}. Renouvelez-la pour continuer à utiliser Pro.`,invalidKey:`Ce n’est pas une clé de licence Planche.`,notConfigured:`Cette version ne peut pas vérifier les clés de licence. Merci de le signaler.`,noWebcrypto:`Ce navigateur ne peut pas vérifier les clés de licence.`,pricing:`Voir les tarifs`,features:{ssh_tunnel:`Tunnels SSH`,compare_schemas:`Comparaison de schémas`,compare_data:`Comparaison de données`,copy_table:`Copie de table`,dry_run:`Dry run`,federated:`Requêtes fédérées`,scratchpad:`Bloc-notes`,column_link:`Liens de colonnes`,sync:`Synchronisation des connexions`,ai_explain:`Explications IA`},included:`Inclus dans Pro`,haveKey:`Vous avez déjà une clé de licence ?`,perMonth:`/ mois`,priceNote:`{{annual}} une fois par an. Au mois, c’est {{monthly}}.`,featureDetails:{sync:`Vos profils sur chaque ordinateur, chiffrés dans le navigateur avant d’en sortir`,ssh_tunnel:`Atteindre une base derrière un rebond avec un mot de passe, une clé ou ssh-agent`,compare_schemas:`Comparer deux connexions ouvertes et obtenir le script ALTER`,compare_data:`Comparer les lignes de deux tables et obtenir le script INSERT et UPDATE`,copy_table:`Reconstruire une table sur une autre connexion, ou un autre moteur`,dry_run:`Voir combien de lignes un UPDATE ou un DELETE modifie, et lesquelles, avant exécution`,federated:`Joindre des tables situées dans des connexions différentes`,scratchpad:`Une base SQLite locale pour vos données de travail`,column_link:`Des clés étrangères virtuelles à suivre depuis la grille`,ai_explain:`Demander à un modèle pourquoi une instruction a échoué ou un plan est lent — avec votre schéma`}},C={npxNote:`Nécessite Node.js 22 ou plus récent. Rien n’est installé durablement : npx exécute l’agent directement depuis le registre npm.`,installNote:`Pas besoin de Node.js. L’installation se fait dans votre dossier personnel sans droits d’administrateur ; ensuite la commande planche le démarre à tout moment.`},w={unsupported:`{{engine}} ne fournit pas de plan d'exécution.`,oneStatement:`Le plan porte sur une seule instruction. Placez le curseur dans l'instruction ou sélectionnez-la.`},T={title:`Assistant IA`,intro:`Demande une requête ou dis quoi faire — il lit le schéma, écrit du SQL dans un onglet et l'exécute. Il travaille sur la connexion ouverte, et chacune garde sa propre conversation.`,privacy:`Ce que lisent les outils — y compris des lignes d'exemple — est envoyé à votre provider. Rien n'atteint planche.dev.`,placeholder:`ex. construire une requête de chiffre d'affaires mensuel sur la base de démo`,send:`Envoyer`,stop:`Arrêter`,clear:`Nouvelle conversation`,working:`En cours…`,tabTitle:`Requête IA`,approvalTitle:`Cette étape écrit. L'exécuter ?`,approve:`Exécuter`,reject:`Passer`,rejected:`L'utilisateur a refusé l'exécution.`,notConfigured:`Aucune clé IA n'est définie sur l'agent. Ajoutez-en une dans Paramètres ▸ IA.`,needsAgent:`Cet agent local ne sait pas encore exécuter d'outils. Mettez-le à jour et réappairez.`,failed:`Échec`,empty:`Rien demandé pour l'instant.`,steps:`{{count}} étapes`,tooManySteps:`Arrêté après {{count}} étapes sans réponse.`,collapse:`Réduire`,planWarningTitle:`Cette requête fait un balayage complet. L’exécuter quand même ?`,interrupted:`Interrompu par un rechargement.`,external:`Demandé depuis l'extérieur de Planche`},E={title:`Connecter un agent IA (MCP)`,description:`Laisser un agent IA compatible MCP utiliser les outils de Planche.`,readsLabel:`Lecture`,reads:`Il lit la base ouverte, et les résultats partent vers ce programme.`,writesLabel:`Écriture`,writes:`Une instruction qui écrit demande votre accord. DROP et TRUNCATE, il ne peut pas.`,needsLabel:`Requis`,needs:`Le panneau IA doit être ouvert.`,tokenLabel:`Jeton`,token:`Un seul jeton, partagé par tous les programmes. Le révoquer les coupe tous.`,command:`Ajouter à Claude Code`,json:`Configurer à la main`,stored:`Stocké dans {{path}}.`,revoke:`Révoquer le jeton`,revoked:`Révoqué. Rouvrez ceci pour en émettre un nouveau.`},D={title:`Synchronisation des connexions`,description:`Vos profils de connexion, chiffrés dans ce navigateur et conservés sur planche.dev pour que vos autres ordinateurs les retrouvent.`,stored:`Le service ne conserve qu’un bloc chiffré. Il ne peut lire ni vos hôtes, ni vos utilisateurs, ni vos mots de passe, ni vos clés SSH.`,unavailable:`La synchronisation ne fonctionne que sur planche.dev. Cette copie de Planche est servie par votre agent local, à qui l’accès à Internet est interdit.`,signIn:`Se connecter avec GitHub`,signedInAs:`Connecté en tant que {{email}}`,signOut:`Se déconnecter`,createTitle:`Choisir une phrase secrète`,createHint:`Cette phrase secrète chiffre vos profils. Elle n’atteint jamais le serveur : si vous la perdez, la copie conservée est irrécupérable et devra être recréée depuis un ordinateur qui a encore vos profils.`,passphrase:`Phrase secrète`,confirm:`Confirmer la phrase secrète`,mismatch:`Les deux phrases secrètes diffèrent.`,tooShort:`Au moins {{count}} caractères.`,enable:`Activer la synchronisation`,unlockTitle:`Déverrouiller vos profils`,unlockHint:`Saisissez la phrase secrète choisie lors de l’activation.`,unlock:`Déverrouiller`,wrongPassphrase:`Phrase secrète incorrecte, ou copie conservée endommagée.`,syncNow:`Synchroniser maintenant`,lastSynced:`Dernière synchronisation {{when}}`,neverSynced:`Pas encore synchronisé`,profiles_one:`{{count}} profil`,profiles_other:`{{count}} profils`,changePassphrase:`Changer la phrase secrète`,deleteVault:`Supprimer du serveur`,deleteVaultConfirm:`Supprimer la copie chiffrée de planche.dev ? Les profils de cet ordinateur ne sont pas touchés.`,offline:`planche.dev est injoignable.`,working:`En cours…`,serverError:`planche.dev n’a pas pu terminer l’opération. Réessayez dans un instant.`,signInShort:`Se connecter`,needsPro:`Vous êtes connecté. La synchronisation des profils nécessite une licence Pro et fonctionnera dès que vous en aurez une.`,deleteAccount:`Supprimer le compte`,deleteAccountConfirm:`Supprimer votre compte ? La copie conservée et votre connexion disparaissent avec lui. Les profils de cet ordinateur ne sont pas touchés.`,notDeployed:`La synchronisation des connexions n’est pas encore activée sur ce site.`},O={app:e,language:t,settings:n,menu:r,about:i,connection:a,toolbar:o,footer:s,palette:c,welcome:l,schema:u,query:d,result:f,confirm:p,table:m,database:h,user:g,command:_,erd:v,services:y,terms:b,dryRun:x,pro:S,install:C,explain:w,ai:T,mcp:E,sync:D};export{i as about,T as ai,e as app,_ as command,p as confirm,a as connection,h as database,O as default,x as dryRun,v as erd,w as explain,s as footer,C as install,t as language,E as mcp,r as menu,c as palette,S as pro,d as query,f as result,u as schema,y as services,n as settings,D as sync,m as table,b as terms,o as toolbar,g as user,l as welcome};