@openrails/contentkit-ui 0.103.1 → 0.103.2
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.
- package/dist/components/admin/content-manager.d.ts +1 -1
- package/dist/components/admin/content-manager.js +346 -304
- package/dist/components/admin/content-manager.js.map +1 -1
- package/dist/components/admin/page-review.js +106 -97
- package/dist/components/admin/page-review.js.map +1 -1
- package/dist/components/admin/reader-content-editor.d.ts +6 -0
- package/dist/components/admin/reader-content-editor.js +709 -0
- package/dist/components/admin/reader-content-editor.js.map +1 -0
- package/dist/components/admin/reader-manifest.js +120 -105
- package/dist/components/admin/reader-manifest.js.map +1 -1
- package/dist/components/content/editor-save.d.ts +32 -0
- package/dist/components/content/editor-save.js +51 -0
- package/dist/components/content/editor-save.js.map +1 -0
- package/dist/components/content/editors.d.ts +17 -2
- package/dist/components/content/editors.js +359 -328
- package/dist/components/content/editors.js.map +1 -1
- package/dist/components/content/offer-fields.d.ts +1 -1
- package/dist/components/content/offer-fields.js +86 -64
- package/dist/components/content/offer-fields.js.map +1 -1
- package/dist/components/groups/memberships.d.ts +11 -1
- package/dist/components/groups/memberships.js +1 -1
- package/dist/components/groups/memberships.js.map +1 -1
- package/dist/components/media-folder-editor.d.ts +4 -0
- package/dist/components/media-folder-editor.js +177 -167
- package/dist/components/media-folder-editor.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/locales/admin/de.js +25 -0
- package/dist/locales/admin/de.js.map +1 -1
- package/dist/locales/admin/en.d.ts +25 -0
- package/dist/locales/admin/en.js +25 -0
- package/dist/locales/admin/en.js.map +1 -1
- package/dist/locales/admin/es.js +25 -0
- package/dist/locales/admin/es.js.map +1 -1
- package/dist/locales/admin/ja.js +25 -0
- package/dist/locales/admin/ja.js.map +1 -1
- package/dist/locales/admin/ko.js +25 -0
- package/dist/locales/admin/ko.js.map +1 -1
- package/dist/locales/admin/zh.js +25 -0
- package/dist/locales/admin/zh.js.map +1 -1
- package/dist/locales/en.d.ts +25 -0
- package/dist/react/page-review.d.ts +1 -1
- package/dist/react/page-review.js +6 -5
- package/dist/react/page-review.js.map +1 -1
- package/dist/react/use-draft.d.ts +8 -0
- package/dist/react/use-draft.js +35 -0
- package/dist/react/use-draft.js.map +1 -0
- package/dist/styles.css +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ko.js","names":[],"sources":["../../../src/locales/admin/ko.ts"],"sourcesContent":["import type { admin as en } from \"./en.js\";\n\nexport const admin: typeof en = {\n contentAdmin: {\n groups: \"그룹\",\n modelFailed: \"콘텐츠 모델을 불러올 수 없습니다.\",\n title: \"콘텐츠 관리\",\n navigation: \"관리 섹션\",\n kind: \"콘텐츠 종류\",\n empty: \"설정된 관리 섹션이 없습니다.\",\n unavailable: \"이 관리 화면에서는 해당 보기를 사용할 수 없습니다.\",\n back: \"관리 화면으로 돌아가기\",\n },\n admin: {\n noAccessTitle: \"접근 권한 없음\",\n noAccess: \"이 기능을 사용할 권한이 없습니다.\",\n pages: \"페이지\",\n previous: \"이전\",\n next: \"다음\",\n page: \"{page}페이지\",\n typeToConfirm: \"확인하려면 {word}을(를) 입력하세요\",\n deleteWord: \"삭제\",\n },\n standing: {\n title: \"댓글\",\n noAccess: \"댓글을 관리할 권한이 없습니다.\",\n ban: \"사이트 전체 댓글 금지\",\n notBanned: \"금지되지 않았습니다. 댓글을 쓸 수 있습니다.\",\n banLoadFailed: \"금지 정보를 불러오지 못했습니다.\",\n comments: \"최근 댓글\",\n noComments: \"댓글이 없습니다.\",\n },\n editor: {\n placeholder: \"내용을 입력하세요…\",\n uploading: \"이미지 업로드 중…\",\n toolbar: \"서식\",\n bold: \"굵게\",\n italic: \"기울임꼴\",\n underline: \"밑줄\",\n strike: \"취소선\",\n heading2: \"제목\",\n heading3: \"소제목\",\n bulletList: \"글머리 기호 목록\",\n orderedList: \"번호 매기기 목록\",\n quote: \"인용\",\n link: \"링크\",\n image: \"이미지 삽입\",\n undo: \"실행 취소\",\n redo: \"다시 실행\",\n linkUrl: \"링크 주소\",\n applyLink: \"적용\",\n removeLink: \"링크 제거\",\n },\n pollManager: {\n noAccess: \"투표를 관리할 권한이 없습니다.\",\n back: \"모든 투표\",\n title: \"투표\",\n new: \"새 투표\",\n search: \"질문 검색\",\n allLanguages: \"모든 언어\",\n state: \"상태\",\n allStates: \"모든 상태\",\n live: \"진행 중\",\n scheduled: \"예약됨\",\n closed: \"종료됨\",\n inactive: \"비활성\",\n month: \"월\",\n date: \"일\",\n clear: \"필터 지우기\",\n loadFailed: \"투표를 불러오지 못했습니다.\",\n empty: \"일치하는 투표가 없습니다.\",\n goesLive: \"{date}에 공개\",\n wentLive: \"{date}부터 진행 중\",\n },\n contentManager: {\n noAccess: \"게시물을 관리할 권한이 없습니다.\",\n back: \"모든 게시물\",\n title: \"게시물\",\n new: \"새 게시물\",\n items: \"게시물\",\n deleted: \"삭제됨\",\n search: \"게시물 검색\",\n language: \"언어\",\n status: \"상태\",\n allStatuses: \"모든 상태\",\n loadFailed: \"게시물을 불러오지 못했습니다.\",\n empty: \"일치하는 게시물이 없습니다.\",\n noDeleted: \"삭제된 게시물이 없습니다.\",\n draft: \"임시 저장\",\n scheduled: \"예약됨\",\n published: \"게시됨\",\n publishedNotice: \"게시했습니다.\",\n held: \"검토 중\",\n rejected: \"거부됨\",\n view: \"보기\",\n deleteTitle: \"“{title}”을(를) 삭제할까요?\",\n deleteBody: \"사이트에서 내려갑니다. 삭제됨에서 복원할 수 있습니다.\",\n delete: \"게시물 삭제\",\n editTitle: \"게시물 편집\",\n newTitle: \"새 게시물\",\n rejectedBecause: \"검토에서 이 게시물이 거부되었습니다: {reason}\",\n heldBecause: \"검토 중: {reason}\",\n rejectedNote: \"검토에서 이 게시물이 거부되었습니다.\",\n heldNote: \"관리자가 승인할 때까지 검토 중입니다.\",\n itemTitle: \"제목\",\n slug: \"슬러그\",\n slugAuto: \"제목에서 생성\",\n publishAt: \"공개 시각(선택)\",\n description: \"요약\",\n body: \"본문\",\n bodyPlaceholder: \"게시물을 작성하세요…\",\n imagesAfterCreate: \"임시 저장본을 만들면 표지와 이미지를 추가할 수 있습니다.\",\n createDraft: \"임시 저장본 만들기\",\n publish: \"게시\",\n unpublish: \"게시 취소\",\n unpublishedNotice: \"임시 저장으로 되돌렸습니다.\",\n titleRequired: \"제목을 입력하세요.\",\n cover: \"표지\",\n noCover: \"표지 없음\",\n addCover: \"표지 추가\",\n },\n mediaPanel: {\n noAccess: \"이 항목의 미디어를 편집할 수 없습니다.\",\n loadFailed: \"미디어를 불러오지 못했습니다.\",\n title: \"동영상\",\n ready: \"준비됨\",\n processing: \"처리 중\",\n failed: \"실패\",\n empty: \"아직 동영상이 없습니다\",\n regenerate: \"다시 처리\",\n failedFile: \"{name} 처리 실패: {reason}\",\n source: \"동영상 파일\",\n noSource: \"업로드된 동영상이 없습니다.\",\n replace: \"동영상 교체\",\n upload: \"동영상 업로드\",\n phase_hashing: \"파일 확인 중…\",\n phase_uploading: \"업로드 중…\",\n phase_completing: \"업로드 마무리 중…\",\n phase_processing: \"처리 중…\",\n poster: \"포스터\",\n choosePoster: \"포스터 선택\",\n subtitles: \"자막\",\n noSubtitles: \"자막이 없습니다.\",\n forced: \"강제\",\n subtitleFile: \"자막 파일(.vtt, .srt)\",\n language: \"언어\",\n label: \"레이블\",\n labelPlaceholder: \"플레이어에 표시됩니다\",\n forcedLabel: \"강제 자막(표지판과 외국어 대사만)\",\n addSubtitle: \"자막 추가\",\n removeSubtitleTitle: \"자막 “{name}”을(를) 제거할까요?\",\n },\n uploadQueue: {\n drop: \"여기에 파일을 놓거나\",\n add: \"파일 추가\",\n unfinished: \"완료되지 않은 업로드\",\n unfinishedHint: \"같은 파일을 다시 추가하면 멈춘 곳부터 이어집니다.\",\n forget: \"삭제\",\n summary: \"{total}개 중 {done}개 업로드됨\",\n pauseAll: \"모두 일시정지\",\n resumeAll: \"모두 재개\",\n resumed: \"재개됨\",\n queued: \"대기 중\",\n creating: \"생성 중\",\n uploading: \"업로드 중\",\n committing: \"저장 중\",\n done: \"업로드됨\",\n failed: \"실패\",\n paused: \"일시정지됨\",\n pause: \"일시정지\",\n resume: \"재개\",\n },\n moderationRules: {\n words: \"금지어\",\n ips: \"IP 차단\",\n word: \"금지할 단어\",\n wordPlaceholder: \"여러 개는 쉼표로 구분하세요\",\n ban: \"금지\",\n rejectNew: \"포함된 댓글 거부(가리지 않고)\",\n wordsHint: \"새 댓글과 답변에서 가림 단어는 별표로 표시되고, 거부 단어가 있으면 댓글이 막힙니다. 기존 댓글은 바뀌지 않습니다.\",\n loadFailed: \"규칙을 불러오지 못했습니다.\",\n noWords: \"금지어가 없습니다.\",\n filter: \"단어 찾기\",\n rejects: \"거부\",\n masks: \"가림\",\n maskWord: \"“{word}” 가림으로 변경\",\n rejectWord: \"“{word}” 포함 댓글 거부\",\n mask: \"가림으로 변경\",\n reject: \"거부로 변경\",\n unbanWord: \"“{word}” 금지 해제\",\n unban: \"해제\",\n network: \"주소 또는 네트워크\",\n reason: \"사유(선택)\",\n until: \"종료(선택)\",\n noIPBans: \"IP 차단이 없습니다.\",\n liftNetwork: \"{network} 차단 해제\",\n },\n pageReview: {\n title: \"페이지 검토\",\n summary: \"{total}페이지 중 {selected}페이지 포함 · {flagged}페이지 표시됨\",\n help: \"자동 선택을 검토하거나 읽는 순서를 변경하세요. 원본 파일은 유지됩니다.\",\n chapterGuard: \"장 경계가 유지됩니다. 페이지 순서나 포함 여부는 장을 함께 조정하는 편집기에서 변경하세요.\",\n empty: \"아직 페이지 원본 파일이 없습니다.\",\n loadFailed: \"페이지 선택을 불러오지 못했습니다.\",\n refresh: \"새로고침\",\n order: \"페이지 순서\",\n original: \"원본:\",\n canonical: \"페이지:\",\n included: \"포함됨\",\n excluded: \"제외됨\",\n flagged: \"검토 필요\",\n source: \"원본 열기\",\n confidence: \"신뢰도: {confidence}\",\n choice: \"{name} 페이지 선택\",\n automatic: \"자동 선택 사용\",\n include: \"포함\",\n exclude: \"제외\",\n conflict: \"다른 곳에서 페이지 선택이 변경되었습니다. 최신 선택을 검토한 뒤 다시 시도하세요.\",\n saved: \"페이지 선택을 저장했습니다.\",\n },\n readerManifest: {\n title: \"리더 매니페스트\",\n pending: \"이 버전은 게시 중입니다. 완료되면 매니페스트를 편집할 수 있습니다.\",\n loadFailed: \"리더 플랜을 불러오지 못했습니다.\",\n summary: \"읽는 순서대로 {pages}페이지, 오디오 {files}개.\",\n anchors: \"스크롤 앵커\",\n addAnchor: \"앵커 추가\",\n foreground: \"오디오 큐\",\n addCue: \"큐 추가\",\n match: \"오디오를 페이지에 맞추기\",\n background: \"배경 트랙\",\n addTrack: \"트랙 추가\",\n revert: \"되돌리기\",\n saved: \"매니페스트를 저장했습니다.\",\n autoAdvance: \"자동 넘김(초, 선택)\",\n anchorNamed: \"앵커 {id}\",\n pageNamed: \"페이지 {name}\",\n anchorId: \"앵커 {n} ID\",\n anchorPage: \"앵커 {n} 페이지\",\n offset: \"앵커 {n} 위치(%)\",\n duration: \"앵커 {n} 길이(초)\",\n durationPlaceholder: \"초\",\n removeAnchor: \"앵커 {n} 삭제\",\n cueFile: \"큐 {n} 오디오\",\n cueAt: \"큐 {n} 재생 위치\",\n removeCue: \"큐 {n} 삭제\",\n trackFile: \"트랙 {n} 오디오\",\n trackFrom: \"트랙 {n} 시작\",\n trackTo: \"트랙 {n} 끝\",\n start: \"처음\",\n end: \"끝\",\n loopN: \"트랙 {n} 반복\",\n loop: \"반복\",\n layer: \"트랙 {n} 레이어\",\n layerPlaceholder: \"레이어\",\n removeTrack: \"트랙 {n} 삭제\",\n matched: \"오디오 {count}개를 페이지나 앵커에 맞췄습니다.\",\n matchedNone: \"페이지나 앵커와 맞는 오디오 파일 이름이 없어 바꾸지 않았습니다.\",\n pagesWithoutAudio: \"오디오가 없는 페이지: {names}\",\n audioWithoutPlace: \"맞는 페이지나 앵커가 없는 오디오: {names}\",\n at_anchors: \"앵커 {n}\",\n at_background: \"트랙 {n}\",\n at_foreground: \"큐 {n}\",\n at_defaults: \"자동 넘김\",\n problem_id: \"{where}: ID가 비었거나 중복됩니다.\",\n problem_offset: \"{where}: 위치는 0~100입니다.\",\n problem_duration: \"{where}: 길이는 양수 초입니다.\",\n problem_seconds: \"{where}: 양수 초로 입력하세요.\",\n problem_page: \"{where}: 이 버전에 없는 페이지입니다.\",\n problem_anchor: \"{where}: 선언되지 않은 앵커입니다.\",\n problem_file: \"{where}: 이 버전에 없는 오디오입니다.\",\n problem_target: \"{where}: 페이지나 앵커를 고르세요.\",\n },\n stats: {\n title: \"통계\",\n kind: \"콘텐츠\",\n activity: \"일별 조회수\",\n days: \"기간\",\n lastDays: \"최근 {count}일\",\n date: \"날짜\",\n views: \"조회수\",\n viewers: \"시청자\",\n users: \"로그인 사용자\",\n total: \"합계\",\n noActivity: \"이 기간에는 조회가 없습니다.\",\n top: \"인기 콘텐츠\",\n metric: \"정렬 기준\",\n metric_views: \"조회수\",\n metric_comments: \"댓글 수\",\n period: \"기간\",\n period_7d: \"7일\",\n period_30d: \"30일\",\n period_90d: \"90일\",\n period_365d: \"1년\",\n period_all: \"전체 기간\",\n noTop: \"이 기간에 순위가 없습니다.\",\n unavailable: \"이 사이트에서는 조회 통계를 사용할 수 없습니다.\",\n loadFailed: \"통계를 불러오지 못했습니다.\",\n noAccess: \"콘텐츠 통계를 볼 권한이 없습니다.\",\n },\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ko.js","names":[],"sources":["../../../src/locales/admin/ko.ts"],"sourcesContent":["import type { admin as en } from \"./en.js\";\n\nexport const admin: typeof en = {\n readerEditor: {\n new: \"새 갤러리\",\n untitled: \"제목 없는 갤러리\",\n saveDraft: \"초안 저장\",\n schedule: \"예약\",\n details: \"갤러리 정보\",\n files: \"갤러리 파일\",\n fileHelp: \"ZIP 또는 개별 이미지를 추가하세요. 페이지를 드래그해 정렬하고 별표로 표지를 선택하세요.\",\n entities: \"작가, 시리즈 및 태그\",\n additionalText: \"추가 텍스트와 URL\",\n useCover: \"표지로 사용\",\n useCoverFor: \"{name}을(를) 표지로 사용\",\n firstPageCover: \"다른 페이지나 표지를 선택하지 않으면 첫 페이지가 표지가 됩니다.\",\n publication: \"게시 설정\",\n versions: \"버전 및 챕터\",\n readerTools: \"오디오 및 읽기 지점\",\n filesNotReady: \"게시하기 전에 페이지 업로드와 처리를 완료하세요.\",\n filesFailed: \"확인이 필요한 파일이 있습니다. 실패한 업로드를 다시 시도하거나 제거하세요.\",\n processing: \"파일을 업로드하거나 처리하고 있습니다. 정보를 계속 편집할 수 있습니다.\",\n addPages: \"게시하기 전에 페이지를 하나 이상 추가하세요.\",\n fixSection: \"게시하기 전에 {section}을(를) 확인하고 저장하세요.\",\n accessRequired: \"저장하기 전에 접근 설정을 완료하세요.\",\n changedDuringSave: \"저장 중에 새 변경 사항이 생겼습니다. 게시하기 전에 저장하세요.\",\n versionDraft: \"이 버전은 아직 초안입니다. 게시하기 전에 초안 설정을 해제하세요.\",\n },\n contentAdmin: {\n groups: \"그룹\",\n modelFailed: \"콘텐츠 모델을 불러올 수 없습니다.\",\n title: \"콘텐츠 관리\",\n navigation: \"관리 섹션\",\n kind: \"콘텐츠 종류\",\n empty: \"설정된 관리 섹션이 없습니다.\",\n unavailable: \"이 관리 화면에서는 해당 보기를 사용할 수 없습니다.\",\n back: \"관리 화면으로 돌아가기\",\n },\n admin: {\n noAccessTitle: \"접근 권한 없음\",\n noAccess: \"이 기능을 사용할 권한이 없습니다.\",\n pages: \"페이지\",\n previous: \"이전\",\n next: \"다음\",\n page: \"{page}페이지\",\n typeToConfirm: \"확인하려면 {word}을(를) 입력하세요\",\n deleteWord: \"삭제\",\n },\n standing: {\n title: \"댓글\",\n noAccess: \"댓글을 관리할 권한이 없습니다.\",\n ban: \"사이트 전체 댓글 금지\",\n notBanned: \"금지되지 않았습니다. 댓글을 쓸 수 있습니다.\",\n banLoadFailed: \"금지 정보를 불러오지 못했습니다.\",\n comments: \"최근 댓글\",\n noComments: \"댓글이 없습니다.\",\n },\n editor: {\n placeholder: \"내용을 입력하세요…\",\n uploading: \"이미지 업로드 중…\",\n toolbar: \"서식\",\n bold: \"굵게\",\n italic: \"기울임꼴\",\n underline: \"밑줄\",\n strike: \"취소선\",\n heading2: \"제목\",\n heading3: \"소제목\",\n bulletList: \"글머리 기호 목록\",\n orderedList: \"번호 매기기 목록\",\n quote: \"인용\",\n link: \"링크\",\n image: \"이미지 삽입\",\n undo: \"실행 취소\",\n redo: \"다시 실행\",\n linkUrl: \"링크 주소\",\n applyLink: \"적용\",\n removeLink: \"링크 제거\",\n },\n pollManager: {\n noAccess: \"투표를 관리할 권한이 없습니다.\",\n back: \"모든 투표\",\n title: \"투표\",\n new: \"새 투표\",\n search: \"질문 검색\",\n allLanguages: \"모든 언어\",\n state: \"상태\",\n allStates: \"모든 상태\",\n live: \"진행 중\",\n scheduled: \"예약됨\",\n closed: \"종료됨\",\n inactive: \"비활성\",\n month: \"월\",\n date: \"일\",\n clear: \"필터 지우기\",\n loadFailed: \"투표를 불러오지 못했습니다.\",\n empty: \"일치하는 투표가 없습니다.\",\n goesLive: \"{date}에 공개\",\n wentLive: \"{date}부터 진행 중\",\n },\n contentManager: {\n noAccess: \"게시물을 관리할 권한이 없습니다.\",\n back: \"모든 게시물\",\n title: \"게시물\",\n new: \"새 게시물\",\n items: \"게시물\",\n deleted: \"삭제됨\",\n search: \"게시물 검색\",\n language: \"언어\",\n status: \"상태\",\n allStatuses: \"모든 상태\",\n loadFailed: \"게시물을 불러오지 못했습니다.\",\n empty: \"일치하는 게시물이 없습니다.\",\n noDeleted: \"삭제된 게시물이 없습니다.\",\n draft: \"임시 저장\",\n scheduled: \"예약됨\",\n published: \"게시됨\",\n publishedNotice: \"게시했습니다.\",\n held: \"검토 중\",\n rejected: \"거부됨\",\n view: \"보기\",\n deleteTitle: \"“{title}”을(를) 삭제할까요?\",\n deleteBody: \"사이트에서 내려갑니다. 삭제됨에서 복원할 수 있습니다.\",\n delete: \"게시물 삭제\",\n editTitle: \"게시물 편집\",\n newTitle: \"새 게시물\",\n rejectedBecause: \"검토에서 이 게시물이 거부되었습니다: {reason}\",\n heldBecause: \"검토 중: {reason}\",\n rejectedNote: \"검토에서 이 게시물이 거부되었습니다.\",\n heldNote: \"관리자가 승인할 때까지 검토 중입니다.\",\n itemTitle: \"제목\",\n slug: \"슬러그\",\n slugAuto: \"제목에서 생성\",\n publishAt: \"공개 시각(선택)\",\n description: \"요약\",\n body: \"본문\",\n bodyPlaceholder: \"게시물을 작성하세요…\",\n imagesAfterCreate: \"임시 저장본을 만들면 표지와 이미지를 추가할 수 있습니다.\",\n createDraft: \"임시 저장본 만들기\",\n publish: \"게시\",\n unpublish: \"게시 취소\",\n unpublishedNotice: \"임시 저장으로 되돌렸습니다.\",\n titleRequired: \"제목을 입력하세요.\",\n cover: \"표지\",\n noCover: \"표지 없음\",\n addCover: \"표지 추가\",\n },\n mediaPanel: {\n noAccess: \"이 항목의 미디어를 편집할 수 없습니다.\",\n loadFailed: \"미디어를 불러오지 못했습니다.\",\n title: \"동영상\",\n ready: \"준비됨\",\n processing: \"처리 중\",\n failed: \"실패\",\n empty: \"아직 동영상이 없습니다\",\n regenerate: \"다시 처리\",\n failedFile: \"{name} 처리 실패: {reason}\",\n source: \"동영상 파일\",\n noSource: \"업로드된 동영상이 없습니다.\",\n replace: \"동영상 교체\",\n upload: \"동영상 업로드\",\n phase_hashing: \"파일 확인 중…\",\n phase_uploading: \"업로드 중…\",\n phase_completing: \"업로드 마무리 중…\",\n phase_processing: \"처리 중…\",\n poster: \"포스터\",\n choosePoster: \"포스터 선택\",\n subtitles: \"자막\",\n noSubtitles: \"자막이 없습니다.\",\n forced: \"강제\",\n subtitleFile: \"자막 파일(.vtt, .srt)\",\n language: \"언어\",\n label: \"레이블\",\n labelPlaceholder: \"플레이어에 표시됩니다\",\n forcedLabel: \"강제 자막(표지판과 외국어 대사만)\",\n addSubtitle: \"자막 추가\",\n removeSubtitleTitle: \"자막 “{name}”을(를) 제거할까요?\",\n },\n uploadQueue: {\n drop: \"여기에 파일을 놓거나\",\n add: \"파일 추가\",\n unfinished: \"완료되지 않은 업로드\",\n unfinishedHint: \"같은 파일을 다시 추가하면 멈춘 곳부터 이어집니다.\",\n forget: \"삭제\",\n summary: \"{total}개 중 {done}개 업로드됨\",\n pauseAll: \"모두 일시정지\",\n resumeAll: \"모두 재개\",\n resumed: \"재개됨\",\n queued: \"대기 중\",\n creating: \"생성 중\",\n uploading: \"업로드 중\",\n committing: \"저장 중\",\n done: \"업로드됨\",\n failed: \"실패\",\n paused: \"일시정지됨\",\n pause: \"일시정지\",\n resume: \"재개\",\n },\n moderationRules: {\n words: \"금지어\",\n ips: \"IP 차단\",\n word: \"금지할 단어\",\n wordPlaceholder: \"여러 개는 쉼표로 구분하세요\",\n ban: \"금지\",\n rejectNew: \"포함된 댓글 거부(가리지 않고)\",\n wordsHint: \"새 댓글과 답변에서 가림 단어는 별표로 표시되고, 거부 단어가 있으면 댓글이 막힙니다. 기존 댓글은 바뀌지 않습니다.\",\n loadFailed: \"규칙을 불러오지 못했습니다.\",\n noWords: \"금지어가 없습니다.\",\n filter: \"단어 찾기\",\n rejects: \"거부\",\n masks: \"가림\",\n maskWord: \"“{word}” 가림으로 변경\",\n rejectWord: \"“{word}” 포함 댓글 거부\",\n mask: \"가림으로 변경\",\n reject: \"거부로 변경\",\n unbanWord: \"“{word}” 금지 해제\",\n unban: \"해제\",\n network: \"주소 또는 네트워크\",\n reason: \"사유(선택)\",\n until: \"종료(선택)\",\n noIPBans: \"IP 차단이 없습니다.\",\n liftNetwork: \"{network} 차단 해제\",\n },\n pageReview: {\n title: \"페이지 검토\",\n summary: \"{total}페이지 중 {selected}페이지 포함 · {flagged}페이지 표시됨\",\n help: \"자동 선택을 검토하거나 읽는 순서를 변경하세요. 원본 파일은 유지됩니다.\",\n chapterGuard: \"장 경계가 유지됩니다. 페이지 순서나 포함 여부는 장을 함께 조정하는 편집기에서 변경하세요.\",\n empty: \"아직 페이지 원본 파일이 없습니다.\",\n loadFailed: \"페이지 선택을 불러오지 못했습니다.\",\n refresh: \"새로고침\",\n order: \"페이지 순서\",\n original: \"원본:\",\n canonical: \"페이지:\",\n included: \"포함됨\",\n excluded: \"제외됨\",\n flagged: \"검토 필요\",\n source: \"원본 열기\",\n confidence: \"신뢰도: {confidence}\",\n choice: \"{name} 페이지 선택\",\n automatic: \"자동 선택 사용\",\n include: \"포함\",\n exclude: \"제외\",\n conflict: \"다른 곳에서 페이지 선택이 변경되었습니다. 최신 선택을 검토한 뒤 다시 시도하세요.\",\n saved: \"페이지 선택을 저장했습니다.\",\n },\n readerManifest: {\n title: \"리더 매니페스트\",\n pending: \"이 버전은 게시 중입니다. 완료되면 매니페스트를 편집할 수 있습니다.\",\n loadFailed: \"리더 플랜을 불러오지 못했습니다.\",\n summary: \"읽는 순서대로 {pages}페이지, 오디오 {files}개.\",\n anchors: \"스크롤 앵커\",\n addAnchor: \"앵커 추가\",\n foreground: \"오디오 큐\",\n addCue: \"큐 추가\",\n match: \"오디오를 페이지에 맞추기\",\n background: \"배경 트랙\",\n addTrack: \"트랙 추가\",\n revert: \"되돌리기\",\n saved: \"매니페스트를 저장했습니다.\",\n autoAdvance: \"자동 넘김(초, 선택)\",\n anchorNamed: \"앵커 {id}\",\n pageNamed: \"페이지 {name}\",\n anchorId: \"앵커 {n} ID\",\n anchorPage: \"앵커 {n} 페이지\",\n offset: \"앵커 {n} 위치(%)\",\n duration: \"앵커 {n} 길이(초)\",\n durationPlaceholder: \"초\",\n removeAnchor: \"앵커 {n} 삭제\",\n cueFile: \"큐 {n} 오디오\",\n cueAt: \"큐 {n} 재생 위치\",\n removeCue: \"큐 {n} 삭제\",\n trackFile: \"트랙 {n} 오디오\",\n trackFrom: \"트랙 {n} 시작\",\n trackTo: \"트랙 {n} 끝\",\n start: \"처음\",\n end: \"끝\",\n loopN: \"트랙 {n} 반복\",\n loop: \"반복\",\n layer: \"트랙 {n} 레이어\",\n layerPlaceholder: \"레이어\",\n removeTrack: \"트랙 {n} 삭제\",\n matched: \"오디오 {count}개를 페이지나 앵커에 맞췄습니다.\",\n matchedNone: \"페이지나 앵커와 맞는 오디오 파일 이름이 없어 바꾸지 않았습니다.\",\n pagesWithoutAudio: \"오디오가 없는 페이지: {names}\",\n audioWithoutPlace: \"맞는 페이지나 앵커가 없는 오디오: {names}\",\n at_anchors: \"앵커 {n}\",\n at_background: \"트랙 {n}\",\n at_foreground: \"큐 {n}\",\n at_defaults: \"자동 넘김\",\n problem_id: \"{where}: ID가 비었거나 중복됩니다.\",\n problem_offset: \"{where}: 위치는 0~100입니다.\",\n problem_duration: \"{where}: 길이는 양수 초입니다.\",\n problem_seconds: \"{where}: 양수 초로 입력하세요.\",\n problem_page: \"{where}: 이 버전에 없는 페이지입니다.\",\n problem_anchor: \"{where}: 선언되지 않은 앵커입니다.\",\n problem_file: \"{where}: 이 버전에 없는 오디오입니다.\",\n problem_target: \"{where}: 페이지나 앵커를 고르세요.\",\n },\n stats: {\n title: \"통계\",\n kind: \"콘텐츠\",\n activity: \"일별 조회수\",\n days: \"기간\",\n lastDays: \"최근 {count}일\",\n date: \"날짜\",\n views: \"조회수\",\n viewers: \"시청자\",\n users: \"로그인 사용자\",\n total: \"합계\",\n noActivity: \"이 기간에는 조회가 없습니다.\",\n top: \"인기 콘텐츠\",\n metric: \"정렬 기준\",\n metric_views: \"조회수\",\n metric_comments: \"댓글 수\",\n period: \"기간\",\n period_7d: \"7일\",\n period_30d: \"30일\",\n period_90d: \"90일\",\n period_365d: \"1년\",\n period_all: \"전체 기간\",\n noTop: \"이 기간에 순위가 없습니다.\",\n unavailable: \"이 사이트에서는 조회 통계를 사용할 수 없습니다.\",\n loadFailed: \"통계를 불러오지 못했습니다.\",\n noAccess: \"콘텐츠 통계를 볼 권한이 없습니다.\",\n },\n};\n"],"mappings":"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"}
|
package/dist/locales/admin/zh.js
CHANGED
|
@@ -1,5 +1,30 @@
|
|
|
1
1
|
//#region src/locales/admin/zh.ts
|
|
2
2
|
var e = {
|
|
3
|
+
readerEditor: {
|
|
4
|
+
new: "新建画廊",
|
|
5
|
+
untitled: "未命名画廊",
|
|
6
|
+
saveDraft: "保存草稿",
|
|
7
|
+
schedule: "定时发布",
|
|
8
|
+
details: "画廊详情",
|
|
9
|
+
files: "画廊文件",
|
|
10
|
+
fileHelp: "添加 ZIP 或单独的图片。拖动页面调整顺序,点击星标选择封面。",
|
|
11
|
+
entities: "作者、系列和标签",
|
|
12
|
+
additionalText: "其他文本与网址",
|
|
13
|
+
useCover: "设为封面",
|
|
14
|
+
useCoverFor: "将 {name} 设为封面",
|
|
15
|
+
firstPageCover: "未另行选择或上传封面时,将使用第一页。",
|
|
16
|
+
publication: "发布设置",
|
|
17
|
+
versions: "版本与章节",
|
|
18
|
+
readerTools: "音频与阅读锚点",
|
|
19
|
+
filesNotReady: "请先完成页面上传和处理,再发布。",
|
|
20
|
+
filesFailed: "部分文件需要处理。发布前请重试或移除上传失败的文件。",
|
|
21
|
+
processing: "正在上传或处理文件,你可以继续编辑详情。",
|
|
22
|
+
addPages: "发布前请至少添加一页。",
|
|
23
|
+
fixSection: "发布前请检查并保存{section}。",
|
|
24
|
+
accessRequired: "保存前请完善访问设置。",
|
|
25
|
+
changedDuringSave: "保存期间有新的修改。请先保存再发布。",
|
|
26
|
+
versionDraft: "此版本仍是草稿。发布前请关闭草稿设置。"
|
|
27
|
+
},
|
|
3
28
|
contentAdmin: {
|
|
4
29
|
groups: "群组",
|
|
5
30
|
modelFailed: "无法加载内容模型。",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zh.js","names":[],"sources":["../../../src/locales/admin/zh.ts"],"sourcesContent":["import type { admin as en } from \"./en.js\";\n\nexport const admin: typeof en = {\n contentAdmin: {\n groups: \"群组\",\n modelFailed: \"无法加载内容模型。\",\n title: \"内容管理\",\n navigation: \"管理栏目\",\n kind: \"内容类型\",\n empty: \"尚未配置管理栏目。\",\n unavailable: \"此管理工作台不提供此视图。\",\n back: \"返回管理\",\n },\n admin: {\n noAccessTitle: \"无权访问\",\n noAccess: \"你没有使用此功能的权限。\",\n pages: \"分页\",\n previous: \"上一页\",\n next: \"下一页\",\n page: \"第 {page} 页\",\n typeToConfirm: \"输入“{word}”以确认\",\n deleteWord: \"删除\",\n },\n standing: {\n title: \"评论\",\n noAccess: \"你没有管理评论的权限。\",\n ban: \"全站评论封禁\",\n notBanned: \"未被封禁,可以评论。\",\n banLoadFailed: \"无法加载封禁信息。\",\n comments: \"最近的评论\",\n noComments: \"没有评论。\",\n },\n editor: {\n placeholder: \"写点什么…\",\n uploading: \"正在上传图片…\",\n toolbar: \"格式\",\n bold: \"粗体\",\n italic: \"斜体\",\n underline: \"下划线\",\n strike: \"删除线\",\n heading2: \"标题\",\n heading3: \"小标题\",\n bulletList: \"项目符号列表\",\n orderedList: \"编号列表\",\n quote: \"引用\",\n link: \"链接\",\n image: \"插入图片\",\n undo: \"撤销\",\n redo: \"重做\",\n linkUrl: \"链接地址\",\n applyLink: \"应用\",\n removeLink: \"移除链接\",\n },\n pollManager: {\n noAccess: \"你没有管理投票的权限。\",\n back: \"所有投票\",\n title: \"投票\",\n new: \"新建投票\",\n search: \"搜索问题\",\n allLanguages: \"所有语言\",\n state: \"状态\",\n allStates: \"所有状态\",\n live: \"进行中\",\n scheduled: \"已排期\",\n closed: \"已结束\",\n inactive: \"未启用\",\n month: \"月份\",\n date: \"日期\",\n clear: \"清除筛选\",\n loadFailed: \"无法加载投票。\",\n empty: \"没有匹配的投票。\",\n goesLive: \"{date} 上线\",\n wentLive: \"自 {date} 起进行中\",\n },\n contentManager: {\n noAccess: \"你没有管理文章的权限。\",\n back: \"所有文章\",\n title: \"文章\",\n new: \"新建文章\",\n items: \"文章\",\n deleted: \"已删除\",\n search: \"搜索文章\",\n language: \"语言\",\n status: \"状态\",\n allStatuses: \"所有状态\",\n loadFailed: \"无法加载文章。\",\n empty: \"没有匹配的文章。\",\n noDeleted: \"没有已删除的文章。\",\n draft: \"草稿\",\n scheduled: \"已排期\",\n published: \"已发布\",\n publishedNotice: \"已发布。\",\n held: \"审核中\",\n rejected: \"已拒绝\",\n view: \"查看\",\n deleteTitle: \"删除“{title}”?\",\n deleteBody: \"它将从网站下线。你可以在“已删除”中恢复。\",\n delete: \"删除文章\",\n editTitle: \"编辑文章\",\n newTitle: \"新建文章\",\n rejectedBecause: \"审核拒绝了这篇文章:{reason}\",\n heldBecause: \"审核中:{reason}\",\n rejectedNote: \"审核拒绝了这篇文章。\",\n heldNote: \"审核中,等待管理员批准。\",\n itemTitle: \"标题\",\n slug: \"短链接\",\n slugAuto: \"根据标题生成\",\n publishAt: \"上线时间(可选)\",\n description: \"摘要\",\n body: \"正文\",\n bodyPlaceholder: \"撰写文章…\",\n imagesAfterCreate: \"创建草稿后即可添加封面和图片。\",\n createDraft: \"创建草稿\",\n publish: \"发布\",\n unpublish: \"撤回发布\",\n unpublishedNotice: \"已改回草稿。\",\n titleRequired: \"请输入标题。\",\n cover: \"封面\",\n noCover: \"无封面\",\n addCover: \"添加封面\",\n },\n mediaPanel: {\n noAccess: \"你无法编辑此项目的媒体。\",\n loadFailed: \"无法加载媒体。\",\n title: \"视频\",\n ready: \"就绪\",\n processing: \"处理中\",\n failed: \"失败\",\n empty: \"还没有视频\",\n regenerate: \"重新处理\",\n failedFile: \"{name} 处理失败:{reason}\",\n source: \"视频文件\",\n noSource: \"尚未上传视频。\",\n replace: \"替换视频\",\n upload: \"上传视频\",\n phase_hashing: \"正在检查文件…\",\n phase_uploading: \"正在上传…\",\n phase_completing: \"正在完成上传…\",\n phase_processing: \"正在处理…\",\n poster: \"封面\",\n choosePoster: \"选择封面\",\n subtitles: \"字幕\",\n noSubtitles: \"没有字幕。\",\n forced: \"强制\",\n subtitleFile: \"字幕文件(.vtt、.srt)\",\n language: \"语言\",\n label: \"标签\",\n labelPlaceholder: \"在播放器中显示\",\n forcedLabel: \"强制字幕(仅标识和外语对白)\",\n addSubtitle: \"添加字幕\",\n removeSubtitleTitle: \"移除字幕“{name}”?\",\n },\n uploadQueue: {\n drop: \"将文件拖到这里,或\",\n add: \"添加文件\",\n unfinished: \"未完成的上传\",\n unfinishedHint: \"再次添加同一文件即可从中断处继续。\",\n forget: \"忘记\",\n summary: \"已上传 {done}/{total}\",\n pauseAll: \"全部暂停\",\n resumeAll: \"全部继续\",\n resumed: \"已继续\",\n queued: \"等待中\",\n creating: \"正在创建\",\n uploading: \"正在上传\",\n committing: \"正在保存\",\n done: \"已上传\",\n failed: \"失败\",\n paused: \"已暂停\",\n pause: \"暂停\",\n resume: \"继续\",\n },\n moderationRules: {\n words: \"屏蔽词\",\n ips: \"IP 封禁\",\n word: \"要屏蔽的词\",\n wordPlaceholder: \"多个词用逗号分隔\",\n ban: \"屏蔽\",\n rejectNew: \"拒绝包含它们的评论(而不是打码)\",\n wordsHint: \"新评论和回答中,打码的词显示为星号;拒绝的词会阻止评论发布。已有评论不变。\",\n loadFailed: \"无法加载规则。\",\n noWords: \"没有屏蔽词。\",\n filter: \"查找词\",\n rejects: \"拒绝\",\n masks: \"打码\",\n maskWord: \"改为对“{word}”打码\",\n rejectWord: \"拒绝含“{word}”的评论\",\n mask: \"改为打码\",\n reject: \"改为拒绝\",\n unbanWord: \"解除屏蔽“{word}”\",\n unban: \"解除\",\n network: \"地址或网段\",\n reason: \"原因(可选)\",\n until: \"结束时间(可选)\",\n noIPBans: \"没有 IP 封禁。\",\n liftNetwork: \"解除 {network} 的封禁\",\n },\n pageReview: {\n title: \"页面审查\",\n summary: \"共{total}页,已包含{selected}页 · {flagged}页已标记\",\n help: \"检查自动选择或调整阅读顺序。原始文件会保留。\",\n chapterGuard: \"章节边界会保留。请使用能够同时调整章节的编辑器来更改页面顺序或是否包含页面。\",\n empty: \"暂无页面源文件。\",\n loadFailed: \"无法加载页面选择。\",\n refresh: \"刷新\",\n order: \"页面顺序\",\n original: \"原始文件:\",\n canonical: \"页面:\",\n included: \"已包含\",\n excluded: \"已排除\",\n flagged: \"已标记\",\n source: \"打开原始文件\",\n confidence: \"置信度:{confidence}\",\n choice: \"{name}的页面选择\",\n automatic: \"使用自动选择\",\n include: \"包含\",\n exclude: \"排除\",\n conflict: \"页面选择已在别处更改。请查看最新选择后重试。\",\n saved: \"页面选择已保存。\",\n },\n readerManifest: {\n title: \"阅读器清单\",\n pending: \"此版本正在发布;发布后即可编辑其清单。\",\n loadFailed: \"无法加载阅读计划。\",\n summary: \"按阅读顺序共 {pages} 页、{files} 个音频文件。\",\n anchors: \"滚动锚点\",\n addAnchor: \"添加锚点\",\n foreground: \"音频提示\",\n addCue: \"添加提示\",\n match: \"按文件名匹配音频与页面\",\n background: \"背景音轨\",\n addTrack: \"添加音轨\",\n revert: \"撤销更改\",\n saved: \"清单已保存。\",\n autoAdvance: \"自动翻页(秒,可选)\",\n anchorNamed: \"锚点 {id}\",\n pageNamed: \"第 {name} 页\",\n anchorId: \"锚点 {n} 的 ID\",\n anchorPage: \"锚点 {n} 的页面\",\n offset: \"锚点 {n} 的位置(%)\",\n duration: \"锚点 {n} 的时长(秒)\",\n durationPlaceholder: \"秒\",\n removeAnchor: \"删除锚点 {n}\",\n cueFile: \"提示 {n} 的音频\",\n cueAt: \"提示 {n} 的播放位置\",\n removeCue: \"删除提示 {n}\",\n trackFile: \"音轨 {n} 的音频\",\n trackFrom: \"音轨 {n} 起点\",\n trackTo: \"音轨 {n} 终点\",\n start: \"开头\",\n end: \"结尾\",\n loopN: \"循环音轨 {n}\",\n loop: \"循环\",\n layer: \"音轨 {n} 的图层\",\n layerPlaceholder: \"图层\",\n removeTrack: \"删除音轨 {n}\",\n matched: \"已将 {count} 个音频匹配到页面或锚点。\",\n matchedNone: \"没有音频文件名与页面或锚点匹配;未作更改。\",\n pagesWithoutAudio: \"没有音频的页面:{names}\",\n audioWithoutPlace: \"没有匹配页面或锚点的音频:{names}\",\n at_anchors: \"锚点 {n}\",\n at_background: \"音轨 {n}\",\n at_foreground: \"提示 {n}\",\n at_defaults: \"自动翻页\",\n problem_id: \"{where}:ID 为空或重复。\",\n problem_offset: \"{where}:位置应在 0 到 100 之间。\",\n problem_duration: \"{where}:时长应为正的秒数。\",\n problem_seconds: \"{where}:应为正的秒数。\",\n problem_page: \"{where}:指定了此版本没有的页面。\",\n problem_anchor: \"{where}:指定了未声明的锚点。\",\n problem_file: \"{where}:指定了此版本没有的音频。\",\n problem_target: \"{where}:请选择页面或锚点。\",\n },\n stats: {\n title: \"统计\",\n kind: \"内容\",\n activity: \"每日浏览量\",\n days: \"天数\",\n lastDays: \"最近 {count} 天\",\n date: \"日期\",\n views: \"浏览量\",\n viewers: \"观众\",\n users: \"已登录\",\n total: \"总计\",\n noActivity: \"此期间没有浏览。\",\n top: \"热门内容\",\n metric: \"排序依据\",\n metric_views: \"浏览量\",\n metric_comments: \"评论数\",\n period: \"时间段\",\n period_7d: \"7 天\",\n period_30d: \"30 天\",\n period_90d: \"90 天\",\n period_365d: \"1 年\",\n period_all: \"全部时间\",\n noTop: \"此期间没有排名。\",\n unavailable: \"本站不提供浏览统计。\",\n loadFailed: \"无法加载统计数据。\",\n noAccess: \"你无权查看内容统计。\",\n },\n};\n"],"mappings":";AAEA,IAAa,IAAmB;CAC9B,cAAc;EACZ,QAAQ;EACR,aAAa;EACb,OAAO;EACP,YAAY;EACZ,MAAM;EACN,OAAO;EACP,aAAa;EACb,MAAM;CACR;CACA,OAAO;EACL,eAAe;EACf,UAAU;EACV,OAAO;EACP,UAAU;EACV,MAAM;EACN,MAAM;EACN,eAAe;EACf,YAAY;CACd;CACA,UAAU;EACR,OAAO;EACP,UAAU;EACV,KAAK;EACL,WAAW;EACX,eAAe;EACf,UAAU;EACV,YAAY;CACd;CACA,QAAQ;EACN,aAAa;EACb,WAAW;EACX,SAAS;EACT,MAAM;EACN,QAAQ;EACR,WAAW;EACX,QAAQ;EACR,UAAU;EACV,UAAU;EACV,YAAY;EACZ,aAAa;EACb,OAAO;EACP,MAAM;EACN,OAAO;EACP,MAAM;EACN,MAAM;EACN,SAAS;EACT,WAAW;EACX,YAAY;CACd;CACA,aAAa;EACX,UAAU;EACV,MAAM;EACN,OAAO;EACP,KAAK;EACL,QAAQ;EACR,cAAc;EACd,OAAO;EACP,WAAW;EACX,MAAM;EACN,WAAW;EACX,QAAQ;EACR,UAAU;EACV,OAAO;EACP,MAAM;EACN,OAAO;EACP,YAAY;EACZ,OAAO;EACP,UAAU;EACV,UAAU;CACZ;CACA,gBAAgB;EACd,UAAU;EACV,MAAM;EACN,OAAO;EACP,KAAK;EACL,OAAO;EACP,SAAS;EACT,QAAQ;EACR,UAAU;EACV,QAAQ;EACR,aAAa;EACb,YAAY;EACZ,OAAO;EACP,WAAW;EACX,OAAO;EACP,WAAW;EACX,WAAW;EACX,iBAAiB;EACjB,MAAM;EACN,UAAU;EACV,MAAM;EACN,aAAa;EACb,YAAY;EACZ,QAAQ;EACR,WAAW;EACX,UAAU;EACV,iBAAiB;EACjB,aAAa;EACb,cAAc;EACd,UAAU;EACV,WAAW;EACX,MAAM;EACN,UAAU;EACV,WAAW;EACX,aAAa;EACb,MAAM;EACN,iBAAiB;EACjB,mBAAmB;EACnB,aAAa;EACb,SAAS;EACT,WAAW;EACX,mBAAmB;EACnB,eAAe;EACf,OAAO;EACP,SAAS;EACT,UAAU;CACZ;CACA,YAAY;EACV,UAAU;EACV,YAAY;EACZ,OAAO;EACP,OAAO;EACP,YAAY;EACZ,QAAQ;EACR,OAAO;EACP,YAAY;EACZ,YAAY;EACZ,QAAQ;EACR,UAAU;EACV,SAAS;EACT,QAAQ;EACR,eAAe;EACf,iBAAiB;EACjB,kBAAkB;EAClB,kBAAkB;EAClB,QAAQ;EACR,cAAc;EACd,WAAW;EACX,aAAa;EACb,QAAQ;EACR,cAAc;EACd,UAAU;EACV,OAAO;EACP,kBAAkB;EAClB,aAAa;EACb,aAAa;EACb,qBAAqB;CACvB;CACA,aAAa;EACX,MAAM;EACN,KAAK;EACL,YAAY;EACZ,gBAAgB;EAChB,QAAQ;EACR,SAAS;EACT,UAAU;EACV,WAAW;EACX,SAAS;EACT,QAAQ;EACR,UAAU;EACV,WAAW;EACX,YAAY;EACZ,MAAM;EACN,QAAQ;EACR,QAAQ;EACR,OAAO;EACP,QAAQ;CACV;CACA,iBAAiB;EACf,OAAO;EACP,KAAK;EACL,MAAM;EACN,iBAAiB;EACjB,KAAK;EACL,WAAW;EACX,WAAW;EACX,YAAY;EACZ,SAAS;EACT,QAAQ;EACR,SAAS;EACT,OAAO;EACP,UAAU;EACV,YAAY;EACZ,MAAM;EACN,QAAQ;EACR,WAAW;EACX,OAAO;EACP,SAAS;EACT,QAAQ;EACR,OAAO;EACP,UAAU;EACV,aAAa;CACf;CACA,YAAY;EACV,OAAO;EACP,SAAS;EACT,MAAM;EACN,cAAc;EACd,OAAO;EACP,YAAY;EACZ,SAAS;EACT,OAAO;EACP,UAAU;EACV,WAAW;EACX,UAAU;EACV,UAAU;EACV,SAAS;EACT,QAAQ;EACR,YAAY;EACZ,QAAQ;EACR,WAAW;EACX,SAAS;EACT,SAAS;EACT,UAAU;EACV,OAAO;CACT;CACA,gBAAgB;EACd,OAAO;EACP,SAAS;EACT,YAAY;EACZ,SAAS;EACT,SAAS;EACT,WAAW;EACX,YAAY;EACZ,QAAQ;EACR,OAAO;EACP,YAAY;EACZ,UAAU;EACV,QAAQ;EACR,OAAO;EACP,aAAa;EACb,aAAa;EACb,WAAW;EACX,UAAU;EACV,YAAY;EACZ,QAAQ;EACR,UAAU;EACV,qBAAqB;EACrB,cAAc;EACd,SAAS;EACT,OAAO;EACP,WAAW;EACX,WAAW;EACX,WAAW;EACX,SAAS;EACT,OAAO;EACP,KAAK;EACL,OAAO;EACP,MAAM;EACN,OAAO;EACP,kBAAkB;EAClB,aAAa;EACb,SAAS;EACT,aAAa;EACb,mBAAmB;EACnB,mBAAmB;EACnB,YAAY;EACZ,eAAe;EACf,eAAe;EACf,aAAa;EACb,YAAY;EACZ,gBAAgB;EAChB,kBAAkB;EAClB,iBAAiB;EACjB,cAAc;EACd,gBAAgB;EAChB,cAAc;EACd,gBAAgB;CAClB;CACA,OAAO;EACL,OAAO;EACP,MAAM;EACN,UAAU;EACV,MAAM;EACN,UAAU;EACV,MAAM;EACN,OAAO;EACP,SAAS;EACT,OAAO;EACP,OAAO;EACP,YAAY;EACZ,KAAK;EACL,QAAQ;EACR,cAAc;EACd,iBAAiB;EACjB,QAAQ;EACR,WAAW;EACX,YAAY;EACZ,YAAY;EACZ,aAAa;EACb,YAAY;EACZ,OAAO;EACP,aAAa;EACb,YAAY;EACZ,UAAU;CACZ;AACF"}
|
|
1
|
+
{"version":3,"file":"zh.js","names":[],"sources":["../../../src/locales/admin/zh.ts"],"sourcesContent":["import type { admin as en } from \"./en.js\";\n\nexport const admin: typeof en = {\n readerEditor: {\n new: \"新建画廊\",\n untitled: \"未命名画廊\",\n saveDraft: \"保存草稿\",\n schedule: \"定时发布\",\n details: \"画廊详情\",\n files: \"画廊文件\",\n fileHelp: \"添加 ZIP 或单独的图片。拖动页面调整顺序,点击星标选择封面。\",\n entities: \"作者、系列和标签\",\n additionalText: \"其他文本与网址\",\n useCover: \"设为封面\",\n useCoverFor: \"将 {name} 设为封面\",\n firstPageCover: \"未另行选择或上传封面时,将使用第一页。\",\n publication: \"发布设置\",\n versions: \"版本与章节\",\n readerTools: \"音频与阅读锚点\",\n filesNotReady: \"请先完成页面上传和处理,再发布。\",\n filesFailed: \"部分文件需要处理。发布前请重试或移除上传失败的文件。\",\n processing: \"正在上传或处理文件,你可以继续编辑详情。\",\n addPages: \"发布前请至少添加一页。\",\n fixSection: \"发布前请检查并保存{section}。\",\n accessRequired: \"保存前请完善访问设置。\",\n changedDuringSave: \"保存期间有新的修改。请先保存再发布。\",\n versionDraft: \"此版本仍是草稿。发布前请关闭草稿设置。\",\n },\n contentAdmin: {\n groups: \"群组\",\n modelFailed: \"无法加载内容模型。\",\n title: \"内容管理\",\n navigation: \"管理栏目\",\n kind: \"内容类型\",\n empty: \"尚未配置管理栏目。\",\n unavailable: \"此管理工作台不提供此视图。\",\n back: \"返回管理\",\n },\n admin: {\n noAccessTitle: \"无权访问\",\n noAccess: \"你没有使用此功能的权限。\",\n pages: \"分页\",\n previous: \"上一页\",\n next: \"下一页\",\n page: \"第 {page} 页\",\n typeToConfirm: \"输入“{word}”以确认\",\n deleteWord: \"删除\",\n },\n standing: {\n title: \"评论\",\n noAccess: \"你没有管理评论的权限。\",\n ban: \"全站评论封禁\",\n notBanned: \"未被封禁,可以评论。\",\n banLoadFailed: \"无法加载封禁信息。\",\n comments: \"最近的评论\",\n noComments: \"没有评论。\",\n },\n editor: {\n placeholder: \"写点什么…\",\n uploading: \"正在上传图片…\",\n toolbar: \"格式\",\n bold: \"粗体\",\n italic: \"斜体\",\n underline: \"下划线\",\n strike: \"删除线\",\n heading2: \"标题\",\n heading3: \"小标题\",\n bulletList: \"项目符号列表\",\n orderedList: \"编号列表\",\n quote: \"引用\",\n link: \"链接\",\n image: \"插入图片\",\n undo: \"撤销\",\n redo: \"重做\",\n linkUrl: \"链接地址\",\n applyLink: \"应用\",\n removeLink: \"移除链接\",\n },\n pollManager: {\n noAccess: \"你没有管理投票的权限。\",\n back: \"所有投票\",\n title: \"投票\",\n new: \"新建投票\",\n search: \"搜索问题\",\n allLanguages: \"所有语言\",\n state: \"状态\",\n allStates: \"所有状态\",\n live: \"进行中\",\n scheduled: \"已排期\",\n closed: \"已结束\",\n inactive: \"未启用\",\n month: \"月份\",\n date: \"日期\",\n clear: \"清除筛选\",\n loadFailed: \"无法加载投票。\",\n empty: \"没有匹配的投票。\",\n goesLive: \"{date} 上线\",\n wentLive: \"自 {date} 起进行中\",\n },\n contentManager: {\n noAccess: \"你没有管理文章的权限。\",\n back: \"所有文章\",\n title: \"文章\",\n new: \"新建文章\",\n items: \"文章\",\n deleted: \"已删除\",\n search: \"搜索文章\",\n language: \"语言\",\n status: \"状态\",\n allStatuses: \"所有状态\",\n loadFailed: \"无法加载文章。\",\n empty: \"没有匹配的文章。\",\n noDeleted: \"没有已删除的文章。\",\n draft: \"草稿\",\n scheduled: \"已排期\",\n published: \"已发布\",\n publishedNotice: \"已发布。\",\n held: \"审核中\",\n rejected: \"已拒绝\",\n view: \"查看\",\n deleteTitle: \"删除“{title}”?\",\n deleteBody: \"它将从网站下线。你可以在“已删除”中恢复。\",\n delete: \"删除文章\",\n editTitle: \"编辑文章\",\n newTitle: \"新建文章\",\n rejectedBecause: \"审核拒绝了这篇文章:{reason}\",\n heldBecause: \"审核中:{reason}\",\n rejectedNote: \"审核拒绝了这篇文章。\",\n heldNote: \"审核中,等待管理员批准。\",\n itemTitle: \"标题\",\n slug: \"短链接\",\n slugAuto: \"根据标题生成\",\n publishAt: \"上线时间(可选)\",\n description: \"摘要\",\n body: \"正文\",\n bodyPlaceholder: \"撰写文章…\",\n imagesAfterCreate: \"创建草稿后即可添加封面和图片。\",\n createDraft: \"创建草稿\",\n publish: \"发布\",\n unpublish: \"撤回发布\",\n unpublishedNotice: \"已改回草稿。\",\n titleRequired: \"请输入标题。\",\n cover: \"封面\",\n noCover: \"无封面\",\n addCover: \"添加封面\",\n },\n mediaPanel: {\n noAccess: \"你无法编辑此项目的媒体。\",\n loadFailed: \"无法加载媒体。\",\n title: \"视频\",\n ready: \"就绪\",\n processing: \"处理中\",\n failed: \"失败\",\n empty: \"还没有视频\",\n regenerate: \"重新处理\",\n failedFile: \"{name} 处理失败:{reason}\",\n source: \"视频文件\",\n noSource: \"尚未上传视频。\",\n replace: \"替换视频\",\n upload: \"上传视频\",\n phase_hashing: \"正在检查文件…\",\n phase_uploading: \"正在上传…\",\n phase_completing: \"正在完成上传…\",\n phase_processing: \"正在处理…\",\n poster: \"封面\",\n choosePoster: \"选择封面\",\n subtitles: \"字幕\",\n noSubtitles: \"没有字幕。\",\n forced: \"强制\",\n subtitleFile: \"字幕文件(.vtt、.srt)\",\n language: \"语言\",\n label: \"标签\",\n labelPlaceholder: \"在播放器中显示\",\n forcedLabel: \"强制字幕(仅标识和外语对白)\",\n addSubtitle: \"添加字幕\",\n removeSubtitleTitle: \"移除字幕“{name}”?\",\n },\n uploadQueue: {\n drop: \"将文件拖到这里,或\",\n add: \"添加文件\",\n unfinished: \"未完成的上传\",\n unfinishedHint: \"再次添加同一文件即可从中断处继续。\",\n forget: \"忘记\",\n summary: \"已上传 {done}/{total}\",\n pauseAll: \"全部暂停\",\n resumeAll: \"全部继续\",\n resumed: \"已继续\",\n queued: \"等待中\",\n creating: \"正在创建\",\n uploading: \"正在上传\",\n committing: \"正在保存\",\n done: \"已上传\",\n failed: \"失败\",\n paused: \"已暂停\",\n pause: \"暂停\",\n resume: \"继续\",\n },\n moderationRules: {\n words: \"屏蔽词\",\n ips: \"IP 封禁\",\n word: \"要屏蔽的词\",\n wordPlaceholder: \"多个词用逗号分隔\",\n ban: \"屏蔽\",\n rejectNew: \"拒绝包含它们的评论(而不是打码)\",\n wordsHint: \"新评论和回答中,打码的词显示为星号;拒绝的词会阻止评论发布。已有评论不变。\",\n loadFailed: \"无法加载规则。\",\n noWords: \"没有屏蔽词。\",\n filter: \"查找词\",\n rejects: \"拒绝\",\n masks: \"打码\",\n maskWord: \"改为对“{word}”打码\",\n rejectWord: \"拒绝含“{word}”的评论\",\n mask: \"改为打码\",\n reject: \"改为拒绝\",\n unbanWord: \"解除屏蔽“{word}”\",\n unban: \"解除\",\n network: \"地址或网段\",\n reason: \"原因(可选)\",\n until: \"结束时间(可选)\",\n noIPBans: \"没有 IP 封禁。\",\n liftNetwork: \"解除 {network} 的封禁\",\n },\n pageReview: {\n title: \"页面审查\",\n summary: \"共{total}页,已包含{selected}页 · {flagged}页已标记\",\n help: \"检查自动选择或调整阅读顺序。原始文件会保留。\",\n chapterGuard: \"章节边界会保留。请使用能够同时调整章节的编辑器来更改页面顺序或是否包含页面。\",\n empty: \"暂无页面源文件。\",\n loadFailed: \"无法加载页面选择。\",\n refresh: \"刷新\",\n order: \"页面顺序\",\n original: \"原始文件:\",\n canonical: \"页面:\",\n included: \"已包含\",\n excluded: \"已排除\",\n flagged: \"已标记\",\n source: \"打开原始文件\",\n confidence: \"置信度:{confidence}\",\n choice: \"{name}的页面选择\",\n automatic: \"使用自动选择\",\n include: \"包含\",\n exclude: \"排除\",\n conflict: \"页面选择已在别处更改。请查看最新选择后重试。\",\n saved: \"页面选择已保存。\",\n },\n readerManifest: {\n title: \"阅读器清单\",\n pending: \"此版本正在发布;发布后即可编辑其清单。\",\n loadFailed: \"无法加载阅读计划。\",\n summary: \"按阅读顺序共 {pages} 页、{files} 个音频文件。\",\n anchors: \"滚动锚点\",\n addAnchor: \"添加锚点\",\n foreground: \"音频提示\",\n addCue: \"添加提示\",\n match: \"按文件名匹配音频与页面\",\n background: \"背景音轨\",\n addTrack: \"添加音轨\",\n revert: \"撤销更改\",\n saved: \"清单已保存。\",\n autoAdvance: \"自动翻页(秒,可选)\",\n anchorNamed: \"锚点 {id}\",\n pageNamed: \"第 {name} 页\",\n anchorId: \"锚点 {n} 的 ID\",\n anchorPage: \"锚点 {n} 的页面\",\n offset: \"锚点 {n} 的位置(%)\",\n duration: \"锚点 {n} 的时长(秒)\",\n durationPlaceholder: \"秒\",\n removeAnchor: \"删除锚点 {n}\",\n cueFile: \"提示 {n} 的音频\",\n cueAt: \"提示 {n} 的播放位置\",\n removeCue: \"删除提示 {n}\",\n trackFile: \"音轨 {n} 的音频\",\n trackFrom: \"音轨 {n} 起点\",\n trackTo: \"音轨 {n} 终点\",\n start: \"开头\",\n end: \"结尾\",\n loopN: \"循环音轨 {n}\",\n loop: \"循环\",\n layer: \"音轨 {n} 的图层\",\n layerPlaceholder: \"图层\",\n removeTrack: \"删除音轨 {n}\",\n matched: \"已将 {count} 个音频匹配到页面或锚点。\",\n matchedNone: \"没有音频文件名与页面或锚点匹配;未作更改。\",\n pagesWithoutAudio: \"没有音频的页面:{names}\",\n audioWithoutPlace: \"没有匹配页面或锚点的音频:{names}\",\n at_anchors: \"锚点 {n}\",\n at_background: \"音轨 {n}\",\n at_foreground: \"提示 {n}\",\n at_defaults: \"自动翻页\",\n problem_id: \"{where}:ID 为空或重复。\",\n problem_offset: \"{where}:位置应在 0 到 100 之间。\",\n problem_duration: \"{where}:时长应为正的秒数。\",\n problem_seconds: \"{where}:应为正的秒数。\",\n problem_page: \"{where}:指定了此版本没有的页面。\",\n problem_anchor: \"{where}:指定了未声明的锚点。\",\n problem_file: \"{where}:指定了此版本没有的音频。\",\n problem_target: \"{where}:请选择页面或锚点。\",\n },\n stats: {\n title: \"统计\",\n kind: \"内容\",\n activity: \"每日浏览量\",\n days: \"天数\",\n lastDays: \"最近 {count} 天\",\n date: \"日期\",\n views: \"浏览量\",\n viewers: \"观众\",\n users: \"已登录\",\n total: \"总计\",\n noActivity: \"此期间没有浏览。\",\n top: \"热门内容\",\n metric: \"排序依据\",\n metric_views: \"浏览量\",\n metric_comments: \"评论数\",\n period: \"时间段\",\n period_7d: \"7 天\",\n period_30d: \"30 天\",\n period_90d: \"90 天\",\n period_365d: \"1 年\",\n period_all: \"全部时间\",\n noTop: \"此期间没有排名。\",\n unavailable: \"本站不提供浏览统计。\",\n loadFailed: \"无法加载统计数据。\",\n noAccess: \"你无权查看内容统计。\",\n },\n};\n"],"mappings":"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"}
|
package/dist/locales/en.d.ts
CHANGED
|
@@ -610,6 +610,31 @@ export declare const en: {
|
|
|
610
610
|
loadFailed: string;
|
|
611
611
|
count: string;
|
|
612
612
|
};
|
|
613
|
+
readerEditor: {
|
|
614
|
+
new: string;
|
|
615
|
+
untitled: string;
|
|
616
|
+
saveDraft: string;
|
|
617
|
+
schedule: string;
|
|
618
|
+
details: string;
|
|
619
|
+
files: string;
|
|
620
|
+
fileHelp: string;
|
|
621
|
+
entities: string;
|
|
622
|
+
additionalText: string;
|
|
623
|
+
useCover: string;
|
|
624
|
+
useCoverFor: string;
|
|
625
|
+
firstPageCover: string;
|
|
626
|
+
publication: string;
|
|
627
|
+
versions: string;
|
|
628
|
+
readerTools: string;
|
|
629
|
+
filesNotReady: string;
|
|
630
|
+
filesFailed: string;
|
|
631
|
+
processing: string;
|
|
632
|
+
addPages: string;
|
|
633
|
+
fixSection: string;
|
|
634
|
+
accessRequired: string;
|
|
635
|
+
changedDuringSave: string;
|
|
636
|
+
versionDraft: string;
|
|
637
|
+
};
|
|
613
638
|
contentAdmin: {
|
|
614
639
|
groups: string;
|
|
615
640
|
modelFailed: string;
|
|
@@ -9,6 +9,6 @@ export interface UsePageReview {
|
|
|
9
9
|
update: (patch: PageReviewPatch) => Promise<PageReview>;
|
|
10
10
|
}
|
|
11
11
|
/** A version's retained page sources and reversible review choices. */
|
|
12
|
-
export declare function usePageReview(content: string, version: string, o?: {
|
|
12
|
+
export declare function usePageReview(content: string | null | undefined, version: string | null | undefined, o?: {
|
|
13
13
|
client?: ContentKitClient;
|
|
14
14
|
}): UsePageReview;
|
|
@@ -3,14 +3,15 @@ import { keyOf as t, useContentScope as n, useResource as r } from "./use-resour
|
|
|
3
3
|
import { useCallback as i } from "react";
|
|
4
4
|
//#region src/react/page-review.ts
|
|
5
5
|
function a(a, o, s = {}) {
|
|
6
|
-
let { client: c, store: l, scope: u } = n(s.client), d = t("page-review", u, a, o), f = r(l, d, {
|
|
6
|
+
let { client: c, store: l, scope: u } = n(s.client), d = a && o ? t("page-review", u, a, o) : null, f = r(l, d, {
|
|
7
7
|
type: "page-review",
|
|
8
|
-
id: o,
|
|
9
|
-
scope: a
|
|
8
|
+
id: o ?? void 0,
|
|
9
|
+
scope: a ?? void 0
|
|
10
10
|
}, (e) => c.versions.pages(a, o, e)), { reload: p } = f, m = i(async (t) => {
|
|
11
|
+
if (!a || !o) throw Error("contentkit-ui: no reader version");
|
|
11
12
|
try {
|
|
12
13
|
let e = await c.versions.updatePages(a, o, t);
|
|
13
|
-
return l.set(d, e), e;
|
|
14
|
+
return d && l.set(d, e), e;
|
|
14
15
|
} catch (t) {
|
|
15
16
|
throw e(t).status === 409 && p(), t;
|
|
16
17
|
}
|
|
@@ -24,7 +25,7 @@ function a(a, o, s = {}) {
|
|
|
24
25
|
]);
|
|
25
26
|
return {
|
|
26
27
|
review: f.data ?? null,
|
|
27
|
-
loading: f.loading || !f.loaded,
|
|
28
|
+
loading: !!d && (f.loading || !f.loaded),
|
|
28
29
|
error: f.error,
|
|
29
30
|
reload: f.reload,
|
|
30
31
|
update: m
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page-review.js","names":[],"sources":["../../src/react/page-review.ts"],"sourcesContent":["import { useCallback } from \"react\";\nimport type { ContentKitClient } from \"../client/client.js\";\nimport { toContentKitError, type ContentKitError } from \"../client/errors.js\";\nimport type { PageReview, PageReviewPatch } from \"../client/generated/wire.js\";\nimport { keyOf, useContentScope, useResource } from \"./use-resource.js\";\n\nexport interface UsePageReview {\n review: PageReview | null;\n loading: boolean;\n error?: ContentKitError;\n reload: () => void;\n update: (patch: PageReviewPatch) => Promise<PageReview>;\n}\n\n/** A version's retained page sources and reversible review choices. */\nexport function usePageReview(content: string, version: string, o: { client?: ContentKitClient } = {}): UsePageReview {\n const { client, store, scope } = useContentScope(o.client);\n const key = keyOf(\"page-review\", scope, content, version);\n const r = useResource<PageReview>(store, key, { type: \"page-review\", id: version, scope: content }, (signal) => client.versions.pages(content
|
|
1
|
+
{"version":3,"file":"page-review.js","names":[],"sources":["../../src/react/page-review.ts"],"sourcesContent":["import { useCallback } from \"react\";\nimport type { ContentKitClient } from \"../client/client.js\";\nimport { toContentKitError, type ContentKitError } from \"../client/errors.js\";\nimport type { PageReview, PageReviewPatch } from \"../client/generated/wire.js\";\nimport { keyOf, useContentScope, useResource } from \"./use-resource.js\";\n\nexport interface UsePageReview {\n review: PageReview | null;\n loading: boolean;\n error?: ContentKitError;\n reload: () => void;\n update: (patch: PageReviewPatch) => Promise<PageReview>;\n}\n\n/** A version's retained page sources and reversible review choices. */\nexport function usePageReview(content: string | null | undefined, version: string | null | undefined, o: { client?: ContentKitClient } = {}): UsePageReview {\n const { client, store, scope } = useContentScope(o.client);\n const key = content && version ? keyOf(\"page-review\", scope, content, version) : null;\n const r = useResource<PageReview>(store, key, { type: \"page-review\", id: version ?? undefined, scope: content ?? undefined }, (signal) => client.versions.pages(content!, version!, signal));\n const { reload } = r;\n const update = useCallback(async (patch: PageReviewPatch) => {\n if(!content||!version)throw new Error(\"contentkit-ui: no reader version\");\n try {\n const next = await client.versions.updatePages(content, version, patch);\n if(key)store.set(key, next);\n return next;\n } catch (error) {\n if (toContentKitError(error).status === 409) reload();\n throw error;\n }\n }, [client, content, version, store, key, reload]);\n return { review: r.data ?? null, loading: !!key && (r.loading || !r.loaded), error: r.error, reload: r.reload, update };\n}\n"],"mappings":";;;;AAeA,SAAgB,EAAc,GAAoC,GAAoC,IAAmC,CAAC,GAAkB;CAC1J,IAAM,EAAE,WAAQ,UAAO,aAAU,EAAgB,EAAE,MAAM,GACnD,IAAM,KAAW,IAAU,EAAM,eAAe,GAAO,GAAS,CAAO,IAAI,MAC3E,IAAI,EAAwB,GAAO,GAAK;EAAE,MAAM;EAAe,IAAI,KAAW,KAAA;EAAW,OAAO,KAAW,KAAA;CAAU,IAAI,MAAW,EAAO,SAAS,MAAM,GAAU,GAAU,CAAM,CAAC,GACrL,EAAE,cAAW,GACb,IAAS,EAAY,OAAO,MAA2B;EAC3D,IAAG,CAAC,KAAS,CAAC,GAAQ,MAAU,MAAM,kCAAkC;EACxE,IAAI;GACF,IAAM,IAAO,MAAM,EAAO,SAAS,YAAY,GAAS,GAAS,CAAK;GAEtE,OADG,KAAI,EAAM,IAAI,GAAK,CAAI,GACnB;EACT,SAAS,GAAO;GAEd,MADI,EAAkB,CAAK,CAAC,CAAC,WAAW,OAAK,EAAO,GAC9C;EACR;CACF,GAAG;EAAC;EAAQ;EAAS;EAAS;EAAO;EAAK;CAAM,CAAC;CACjD,OAAO;EAAE,QAAQ,EAAE,QAAQ;EAAM,SAAS,CAAC,CAAC,MAAQ,EAAE,WAAW,CAAC,EAAE;EAAS,OAAO,EAAE;EAAO,QAAQ,EAAE;EAAQ;CAAO;AACxH"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { useEffect as e, useRef as t, useState as n } from "react";
|
|
2
|
+
//#region src/react/use-draft.ts
|
|
3
|
+
function r(r) {
|
|
4
|
+
let [i, a] = n(r), o = t({
|
|
5
|
+
value: r,
|
|
6
|
+
dirty: /* @__PURE__ */ new Set(),
|
|
7
|
+
edits: /* @__PURE__ */ new Map()
|
|
8
|
+
});
|
|
9
|
+
return e(() => {
|
|
10
|
+
let e = { ...r };
|
|
11
|
+
for (let t of o.current.dirty) e[t] = o.current.value[t];
|
|
12
|
+
o.current.value = e, a(e);
|
|
13
|
+
}, [r]), {
|
|
14
|
+
value: i,
|
|
15
|
+
edit: (e) => {
|
|
16
|
+
let t = o.current, n = typeof e == "function" ? e(t.value) : e;
|
|
17
|
+
for (let e of /* @__PURE__ */ new Set([...Object.keys(t.value), ...Object.keys(n)])) Object.is(t.value[e], n[e]) || (t.dirty.add(e), t.edits.set(e, (t.edits.get(e) ?? 0) + 1));
|
|
18
|
+
t.value = n, a(n);
|
|
19
|
+
},
|
|
20
|
+
checkpoint: () => {
|
|
21
|
+
let e = new Map(o.current.edits);
|
|
22
|
+
return (t) => {
|
|
23
|
+
let n = o.current, r = { ...t };
|
|
24
|
+
for (let i of /* @__PURE__ */ new Set([...Object.keys(n.value), ...Object.keys(t)])) n.edits.get(i) === e.get(i) ? n.dirty.delete(i) : r[i] = n.value[i];
|
|
25
|
+
return n.value = r, a(r), n.dirty.size === 0;
|
|
26
|
+
};
|
|
27
|
+
},
|
|
28
|
+
get: () => o.current.value,
|
|
29
|
+
dirty: [...o.current.dirty]
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
//#endregion
|
|
33
|
+
export { r as useDraft };
|
|
34
|
+
|
|
35
|
+
//# sourceMappingURL=use-draft.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-draft.js","names":[],"sources":["../../src/react/use-draft.ts"],"sourcesContent":["import { useEffect, useRef, useState, type SetStateAction } from \"react\";\n\n// A fresh record rebases clean fields; only an explicit save/discard settles edits.\n// Per-field counters also protect edits made while that operation is pending.\nexport function useDraft<T extends object>(seed: T) {\n const [value, setValue] = useState(seed);\n const draft = useRef({ value: seed, dirty: new Set<keyof T>(), edits: new Map<keyof T, number>() });\n useEffect(() => {\n const next = { ...seed };\n for (const key of draft.current.dirty) next[key] = draft.current.value[key];\n draft.current.value = next;\n setValue(next);\n }, [seed]);\n const edit = (update: SetStateAction<T>) => {\n const d = draft.current;\n const next = typeof update === \"function\" ? (update as (value: T) => T)(d.value) : update;\n for (const key of new Set([...Object.keys(d.value), ...Object.keys(next)] as (keyof T)[])) {\n if (!Object.is(d.value[key], next[key])) {\n d.dirty.add(key);\n d.edits.set(key, (d.edits.get(key) ?? 0) + 1);\n }\n }\n d.value = next;\n setValue(next);\n };\n const checkpoint = () => {\n const edits = new Map(draft.current.edits);\n return (canonical: T) => {\n const d = draft.current;\n const next = { ...canonical };\n for (const key of new Set([...Object.keys(d.value), ...Object.keys(canonical)] as (keyof T)[])) {\n if (d.edits.get(key) !== edits.get(key)) next[key] = d.value[key];\n else d.dirty.delete(key);\n }\n d.value = next;\n setValue(next);\n return d.dirty.size === 0;\n };\n };\n return { value, edit, checkpoint, get: () => draft.current.value, dirty: [...draft.current.dirty] };\n}\n"],"mappings":";;AAIA,SAAgB,EAA2B,GAAS;CAClD,IAAM,CAAC,GAAO,KAAY,EAAS,CAAI,GACjC,IAAQ,EAAO;EAAE,OAAO;EAAM,uBAAO,IAAI,IAAa;EAAG,uBAAO,IAAI,IAAqB;CAAE,CAAC;CAiClG,OAhCA,QAAgB;EACd,IAAM,IAAO,EAAE,GAAG,EAAK;EACvB,KAAK,IAAM,KAAO,EAAM,QAAQ,OAAO,EAAK,KAAO,EAAM,QAAQ,MAAM;EAEvE,AADA,EAAM,QAAQ,QAAQ,GACtB,EAAS,CAAI;CACf,GAAG,CAAC,CAAI,CAAC,GA2BF;EAAE;EAAO,OA1BF,MAA8B;GAC1C,IAAM,IAAI,EAAM,SACV,IAAO,OAAO,KAAW,aAAc,EAA2B,EAAE,KAAK,IAAI;GACnF,KAAK,IAAM,qBAAO,IAAI,IAAI,CAAC,GAAG,OAAO,KAAK,EAAE,KAAK,GAAG,GAAG,OAAO,KAAK,CAAI,CAAC,CAAgB,GACtF,AAAK,OAAO,GAAG,EAAE,MAAM,IAAM,EAAK,EAAI,MACpC,EAAE,MAAM,IAAI,CAAG,GACf,EAAE,MAAM,IAAI,IAAM,EAAE,MAAM,IAAI,CAAG,KAAK,KAAK,CAAC;GAIhD,AADA,EAAE,QAAQ,GACV,EAAS,CAAI;EACf;EAesB,kBAdG;GACvB,IAAM,IAAQ,IAAI,IAAI,EAAM,QAAQ,KAAK;GACzC,QAAQ,MAAiB;IACvB,IAAM,IAAI,EAAM,SACV,IAAO,EAAE,GAAG,EAAU;IAC5B,KAAK,IAAM,qBAAO,IAAI,IAAI,CAAC,GAAG,OAAO,KAAK,EAAE,KAAK,GAAG,GAAG,OAAO,KAAK,CAAS,CAAC,CAAgB,GAC3F,AAAI,EAAE,MAAM,IAAI,CAAG,MAAM,EAAM,IAAI,CAAG,IACjC,EAAE,MAAM,OAAO,CAAG,IADkB,EAAK,KAAO,EAAE,MAAM;IAK/D,OAFA,EAAE,QAAQ,GACV,EAAS,CAAI,GACN,EAAE,MAAM,SAAS;GAC1B;EACF;EACkC,WAAW,EAAM,QAAQ;EAAO,OAAO,CAAC,GAAG,EAAM,QAAQ,KAAK;CAAE;AACpG"}
|