Merge pull request #400 from zanllp/feature/add-traditional-chinese-i18n

Add Traditional Chinese i18n support
pull/401/head
zanllp 2023-09-08 04:12:22 +08:00 committed by GitHub
commit 41d8249cd7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
38 changed files with 864 additions and 680 deletions

View File

@ -12,7 +12,7 @@ Promise.resolve().then(async () => {
<link rel="icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Infinite Image Browsing</title>
<script type="module" crossorigin src="/infinite_image_browsing/fe-static/assets/index-1537dba6.js"></script>
<script type="module" crossorigin src="/infinite_image_browsing/fe-static/assets/index-f215d50e.js"></script>
<link rel="stylesheet" href="/infinite_image_browsing/fe-static/assets/index-04bf0fce.css">
</head>

4
vue/dist/assets/FileItem-b3f4270c.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
import{d as t,o as a,m as r,c1 as n}from"./index-1537dba6.js";const p=t({__name:"ImgSliPagePane",props:{paneIdx:{},tabIdx:{},left:{},right:{}},setup(o){return(e,s)=>(a(),r(n,{left:e.left,right:e.right},null,8,["left","right"]))}});export{p as default};
import{d as t,o as a,m as r,c1 as n}from"./index-f215d50e.js";const p=t({__name:"ImgSliPagePane",props:{paneIdx:{},tabIdx:{},left:{},right:{}},setup(o){return(e,s)=>(a(),r(n,{left:e.left,right:e.right},null,8,["left","right"]))}});export{p as default};

View File

@ -1 +1 @@
import{d as q,l as Q,ax as W,o as r,y as h,c as l,n as a,r as e,s as y,p as b,t as X,v as S,x as j,m as M,L as H,C as m,N as T,Q as J,R as K,X as Y}from"./index-1537dba6.js";import{L as Z,R as ee,f as te,S as ie}from"./fullScreenContextMenu-bb0fc66b.js";import{g as se,F as le}from"./FileItem-dbdcf20b.js";import{g as ne}from"./db-925e828e.js";import{c as ae,u as oe}from"./hook-3618bdfa.js";import"./shortcut-ec395f0e.js";const re={class:"hint"},de={key:1,class:"preview-switch"},ce=q({__name:"MatchedImageGrid",props:{tabIdx:{},paneIdx:{},selectedTagIds:{},id:{}},setup(V){const u=V,p=ae(c=>ne(u.selectedTagIds,c)),{queue:D,images:i,onContextMenuClickU:g,stackViewEl:F,previewIdx:n,previewing:f,onPreviewVisibleChange:z,previewImgMove:v,canPreview:I,itemSize:w,gridItems:$,showGenInfo:o,imageGenInfo:k,q:B,multiSelectedIdxs:G,onFileItemClick:N,scroller:x,showMenuIdx:d,onFileDragStart:R,onFileDragEnd:E,cellWidth:P,onScroll:C}=oe(p);return Q(()=>u.selectedTagIds,async()=>{await p.reset(),await W(),x.value.scrollToItem(0),C()},{immediate:!0}),(c,t)=>{const U=J,A=K,L=ie;return r(),h("div",{class:"container",ref_key:"stackViewEl",ref:F},[l(L,{size:"large",spinning:!e(D).isIdle},{default:a(()=>[l(A,{visible:e(o),"onUpdate:visible":t[1]||(t[1]=s=>y(o)?o.value=s:null),width:"70vw","mask-closable":"",onOk:t[2]||(t[2]=s=>o.value=!1)},{cancelText:a(()=>[]),default:a(()=>[l(U,{active:"",loading:!e(B).isIdle},{default:a(()=>[b("div",{style:{width:"100%","word-break":"break-all","white-space":"pre-line","max-height":"70vh",overflow:"auto"},onDblclick:t[0]||(t[0]=s=>e(X)(e(k)))},[b("div",re,S(c.$t("doubleClickToCopy")),1),j(" "+S(e(k)),1)],32)]),_:1},8,["loading"])]),_:1},8,["visible"]),e(i)?(r(),M(e(se),{key:0,ref_key:"scroller",ref:x,class:"file-list",items:e(i),"item-size":e(w).first,"key-field":"fullpath","item-secondary-size":e(w).second,gridItems:e($),onScroll:e(C)},{default:a(({item:s,index:_})=>[l(le,{idx:_,file:s,"cell-width":e(P),"show-menu-idx":e(d),"onUpdate:showMenuIdx":t[3]||(t[3]=O=>y(d)?d.value=O:null),onDragstart:e(R),onDragend:e(E),onFileItemClick:e(N),"full-screen-preview-image-url":e(i)[e(n)]?e(H)(e(i)[e(n)]):"",selected:e(G).includes(_),onContextMenuClick:e(g),onPreviewVisibleChange:e(z)},null,8,["idx","file","cell-width","show-menu-idx","onDragstart","onDragend","onFileItemClick","full-screen-preview-image-url","selected","onContextMenuClick","onPreviewVisibleChange"])]),_:1},8,["items","item-size","item-secondary-size","gridItems","onScroll"])):m("",!0),e(f)?(r(),h("div",de,[l(e(Z),{onClick:t[4]||(t[4]=s=>e(v)("prev")),class:T({disable:!e(I)("prev")})},null,8,["class"]),l(e(ee),{onClick:t[5]||(t[5]=s=>e(v)("next")),class:T({disable:!e(I)("next")})},null,8,["class"])])):m("",!0)]),_:1},8,["spinning"]),e(f)&&e(i)&&e(i)[e(n)]?(r(),M(te,{key:0,file:e(i)[e(n)],idx:e(n),onContextMenuClick:e(g)},null,8,["file","idx","onContextMenuClick"])):m("",!0)],512)}}});const Ie=Y(ce,[["__scopeId","data-v-6cc08968"]]);export{Ie as default};
import{d as q,l as Q,ax as W,o as r,y as h,c as l,n as a,r as e,s as y,p as b,t as X,v as S,x as j,m as M,L as H,C as m,N as T,Q as J,R as K,X as Y}from"./index-f215d50e.js";import{L as Z,R as ee,f as te,S as ie}from"./fullScreenContextMenu-dd0c585e.js";import{g as se,F as le}from"./FileItem-b3f4270c.js";import{g as ne}from"./db-6009d510.js";import{c as ae,u as oe}from"./hook-d93216f4.js";import"./shortcut-a2335978.js";const re={class:"hint"},de={key:1,class:"preview-switch"},ce=q({__name:"MatchedImageGrid",props:{tabIdx:{},paneIdx:{},selectedTagIds:{},id:{}},setup(V){const u=V,p=ae(c=>ne(u.selectedTagIds,c)),{queue:D,images:i,onContextMenuClickU:g,stackViewEl:F,previewIdx:n,previewing:f,onPreviewVisibleChange:z,previewImgMove:v,canPreview:I,itemSize:w,gridItems:$,showGenInfo:o,imageGenInfo:k,q:B,multiSelectedIdxs:G,onFileItemClick:N,scroller:x,showMenuIdx:d,onFileDragStart:R,onFileDragEnd:E,cellWidth:P,onScroll:C}=oe(p);return Q(()=>u.selectedTagIds,async()=>{await p.reset(),await W(),x.value.scrollToItem(0),C()},{immediate:!0}),(c,t)=>{const U=J,A=K,L=ie;return r(),h("div",{class:"container",ref_key:"stackViewEl",ref:F},[l(L,{size:"large",spinning:!e(D).isIdle},{default:a(()=>[l(A,{visible:e(o),"onUpdate:visible":t[1]||(t[1]=s=>y(o)?o.value=s:null),width:"70vw","mask-closable":"",onOk:t[2]||(t[2]=s=>o.value=!1)},{cancelText:a(()=>[]),default:a(()=>[l(U,{active:"",loading:!e(B).isIdle},{default:a(()=>[b("div",{style:{width:"100%","word-break":"break-all","white-space":"pre-line","max-height":"70vh",overflow:"auto"},onDblclick:t[0]||(t[0]=s=>e(X)(e(k)))},[b("div",re,S(c.$t("doubleClickToCopy")),1),j(" "+S(e(k)),1)],32)]),_:1},8,["loading"])]),_:1},8,["visible"]),e(i)?(r(),M(e(se),{key:0,ref_key:"scroller",ref:x,class:"file-list",items:e(i),"item-size":e(w).first,"key-field":"fullpath","item-secondary-size":e(w).second,gridItems:e($),onScroll:e(C)},{default:a(({item:s,index:_})=>[l(le,{idx:_,file:s,"cell-width":e(P),"show-menu-idx":e(d),"onUpdate:showMenuIdx":t[3]||(t[3]=O=>y(d)?d.value=O:null),onDragstart:e(R),onDragend:e(E),onFileItemClick:e(N),"full-screen-preview-image-url":e(i)[e(n)]?e(H)(e(i)[e(n)]):"",selected:e(G).includes(_),onContextMenuClick:e(g),onPreviewVisibleChange:e(z)},null,8,["idx","file","cell-width","show-menu-idx","onDragstart","onDragend","onFileItemClick","full-screen-preview-image-url","selected","onContextMenuClick","onPreviewVisibleChange"])]),_:1},8,["items","item-size","item-secondary-size","gridItems","onScroll"])):m("",!0),e(f)?(r(),h("div",de,[l(e(Z),{onClick:t[4]||(t[4]=s=>e(v)("prev")),class:T({disable:!e(I)("prev")})},null,8,["class"]),l(e(ee),{onClick:t[5]||(t[5]=s=>e(v)("next")),class:T({disable:!e(I)("next")})},null,8,["class"])])):m("",!0)]),_:1},8,["spinning"]),e(f)&&e(i)&&e(i)[e(n)]?(r(),M(te,{key:0,file:e(i)[e(n)],idx:e(n),onContextMenuClick:e(g)},null,8,["file","idx","onContextMenuClick"])):m("",!0)],512)}}});const Ie=Y(ce,[["__scopeId","data-v-6cc08968"]]);export{Ie as default};

View File

@ -1 +0,0 @@
import{d as Y,$ as V,aw as Z,bQ as ee,bP as F,o as l,y as k,c as o,r as e,bT as te,m,n as r,x as w,v,C as f,s as U,p as A,t as ae,L as ne,N as E,ax as se,ar as ie,ai as le,U as oe,V as re,Q as de,R as ue,X as ce}from"./index-1537dba6.js";import{L as pe,R as me,f as ve,S as fe}from"./fullScreenContextMenu-bb0fc66b.js";/* empty css */import{g as ge,F as ke}from"./FileItem-dbdcf20b.js";import{b as T,c as we,f as Ie,u as ye}from"./db-925e828e.js";import{c as xe,u as be}from"./hook-3618bdfa.js";import"./shortcut-ec395f0e.js";const Ce={key:0,class:"search-bar"},he={class:"hint"},_e={key:1,class:"preview-switch"},Se=Y({__name:"SubstrSearch",setup(Me){const c=V(""),I=xe(n=>Ie(c.value,n)),{queue:d,images:i,onContextMenuClickU:y,stackViewEl:R,previewIdx:u,previewing:x,onPreviewVisibleChange:N,previewImgMove:b,canPreview:C,itemSize:h,gridItems:P,showGenInfo:p,imageGenInfo:_,q:L,multiSelectedIdxs:q,onFileItemClick:G,scroller:S,showMenuIdx:g,onFileDragStart:K,onFileDragEnd:O,cellWidth:Q,onScroll:M}=be(I),a=V();Z(async()=>{a.value=await T(),a.value.img_count&&a.value.expired&&z()});const z=ee(()=>d.pushAction(async()=>(await ye(),a.value=await T(),a.value)).res),D=async()=>{await I.reset({refetch:!0}),await se(),M(),S.value.scrollToItem(0),i.value.length||ie.info(le("fuzzy-search-noResults"))};return F("returnToIIB",async()=>{const n=await d.pushAction(we).res;a.value.expired=n.expired}),F("searchIndexExpired",()=>a.value&&(a.value.expired=!0)),(n,t)=>{const H=oe,$=re,W=de,X=ue,j=fe;return l(),k("div",{class:"container",ref_key:"stackViewEl",ref:R},[a.value?(l(),k("div",Ce,[o(H,{value:c.value,"onUpdate:value":t[0]||(t[0]=s=>c.value=s),placeholder:n.$t("fuzzy-search-placeholder"),disabled:!e(d).isIdle,onKeydown:te(D,["enter"])},null,8,["value","placeholder","disabled","onKeydown"]),a.value.expired||!a.value.img_count?(l(),m($,{key:0,onClick:e(z),loading:!e(d).isIdle,type:"primary"},{default:r(()=>[w(v(a.value.img_count===0?n.$t("generateIndexHint"):n.$t("UpdateIndex")),1)]),_:1},8,["onClick","loading"])):(l(),m($,{key:1,type:"primary",onClick:D,loading:!e(d).isIdle,disabled:!c.value},{default:r(()=>[w(v(n.$t("search")),1)]),_:1},8,["loading","disabled"]))])):f("",!0),o(j,{size:"large",spinning:!e(d).isIdle},{default:r(()=>[o(X,{visible:e(p),"onUpdate:visible":t[2]||(t[2]=s=>U(p)?p.value=s:null),width:"70vw","mask-closable":"",onOk:t[3]||(t[3]=s=>p.value=!1)},{cancelText:r(()=>[]),default:r(()=>[o(W,{active:"",loading:!e(L).isIdle},{default:r(()=>[A("div",{style:{width:"100%","word-break":"break-all","white-space":"pre-line","max-height":"70vh",overflow:"auto"},onDblclick:t[1]||(t[1]=s=>e(ae)(e(_)))},[A("div",he,v(n.$t("doubleClickToCopy")),1),w(" "+v(e(_)),1)],32)]),_:1},8,["loading"])]),_:1},8,["visible"]),e(i)?(l(),m(e(ge),{key:0,ref_key:"scroller",ref:S,class:"file-list",items:e(i),"item-size":e(h).first,"key-field":"fullpath","item-secondary-size":e(h).second,gridItems:e(P),onScroll:e(M)},{default:r(({item:s,index:B})=>[o(ke,{idx:B,file:s,"show-menu-idx":e(g),"onUpdate:showMenuIdx":t[4]||(t[4]=J=>U(g)?g.value=J:null),onFileItemClick:e(G),"full-screen-preview-image-url":e(i)[e(u)]?e(ne)(e(i)[e(u)]):"","cell-width":e(Q),selected:e(q).includes(B),onContextMenuClick:e(y),onDragstart:e(K),onDragend:e(O),onPreviewVisibleChange:e(N)},null,8,["idx","file","show-menu-idx","onFileItemClick","full-screen-preview-image-url","cell-width","selected","onContextMenuClick","onDragstart","onDragend","onPreviewVisibleChange"])]),_:1},8,["items","item-size","item-secondary-size","gridItems","onScroll"])):f("",!0),e(x)?(l(),k("div",_e,[o(e(pe),{onClick:t[5]||(t[5]=s=>e(b)("prev")),class:E({disable:!e(C)("prev")})},null,8,["class"]),o(e(me),{onClick:t[6]||(t[6]=s=>e(b)("next")),class:E({disable:!e(C)("next")})},null,8,["class"])])):f("",!0)]),_:1},8,["spinning"]),e(x)&&e(i)&&e(i)[e(u)]?(l(),m(ve,{key:1,file:e(i)[e(u)],idx:e(u),onContextMenuClick:e(y)},null,8,["file","idx","onContextMenuClick"])):f("",!0)],512)}}});const Ae=ce(Se,[["__scopeId","data-v-d4ab92e4"]]);export{Ae as default};

View File

@ -0,0 +1 @@
import{d as Y,$ as V,aw as Z,bQ as ee,bP as F,o as i,y as w,c as o,r as e,bT as ae,m,n as r,x as k,v,C as f,s as U,p as A,t as te,L as ne,N as E,ax as le,ar as se,ai as ie,U as oe,V as re,Q as de,R as ue,X as ce}from"./index-f215d50e.js";import{L as pe,R as me,f as ve,S as fe}from"./fullScreenContextMenu-dd0c585e.js";/* empty css */import{g as ge,F as we}from"./FileItem-b3f4270c.js";import{b as T,c as ke,f as Ie,u as ye}from"./db-6009d510.js";import{c as xe,u as Ce}from"./hook-d93216f4.js";import"./shortcut-a2335978.js";const be={key:0,class:"search-bar"},he={class:"hint"},_e={key:1,class:"preview-switch"},Se=Y({__name:"SubstrSearch",setup(Me){const c=V(""),I=xe(n=>Ie(c.value,n)),{queue:d,images:s,onContextMenuClickU:y,stackViewEl:R,previewIdx:u,previewing:x,onPreviewVisibleChange:N,previewImgMove:C,canPreview:b,itemSize:h,gridItems:P,showGenInfo:p,imageGenInfo:_,q:L,multiSelectedIdxs:q,onFileItemClick:G,scroller:S,showMenuIdx:g,onFileDragStart:K,onFileDragEnd:O,cellWidth:Q,onScroll:M}=Ce(I),t=V();Z(async()=>{t.value=await T(),t.value.img_count&&t.value.expired&&z()});const z=ee(()=>d.pushAction(async()=>(await ye(),t.value=await T(),t.value)).res),D=async()=>{await I.reset({refetch:!0}),await le(),M(),S.value.scrollToItem(0),s.value.length||se.info(ie("fuzzy-search-noResults"))};return F("returnToIIB",async()=>{const n=await d.pushAction(ke).res;t.value.expired=n.expired}),F("searchIndexExpired",()=>t.value&&(t.value.expired=!0)),(n,a)=>{const H=oe,$=re,W=de,X=ue,j=fe;return i(),w("div",{class:"container",ref_key:"stackViewEl",ref:R},[t.value?(i(),w("div",be,[o(H,{value:c.value,"onUpdate:value":a[0]||(a[0]=l=>c.value=l),placeholder:n.$t("fuzzy-search-placeholder"),disabled:!e(d).isIdle,onKeydown:ae(D,["enter"]),"allow-clear":""},null,8,["value","placeholder","disabled","onKeydown"]),t.value.expired||!t.value.img_count?(i(),m($,{key:0,onClick:e(z),loading:!e(d).isIdle,type:"primary"},{default:r(()=>[k(v(t.value.img_count===0?n.$t("generateIndexHint"):n.$t("UpdateIndex")),1)]),_:1},8,["onClick","loading"])):(i(),m($,{key:1,type:"primary",onClick:D,loading:!e(d).isIdle,disabled:!c.value},{default:r(()=>[k(v(n.$t("search")),1)]),_:1},8,["loading","disabled"]))])):f("",!0),o(j,{size:"large",spinning:!e(d).isIdle},{default:r(()=>[o(X,{visible:e(p),"onUpdate:visible":a[2]||(a[2]=l=>U(p)?p.value=l:null),width:"70vw","mask-closable":"",onOk:a[3]||(a[3]=l=>p.value=!1)},{cancelText:r(()=>[]),default:r(()=>[o(W,{active:"",loading:!e(L).isIdle},{default:r(()=>[A("div",{style:{width:"100%","word-break":"break-all","white-space":"pre-line","max-height":"70vh",overflow:"auto"},onDblclick:a[1]||(a[1]=l=>e(te)(e(_)))},[A("div",he,v(n.$t("doubleClickToCopy")),1),k(" "+v(e(_)),1)],32)]),_:1},8,["loading"])]),_:1},8,["visible"]),e(s)?(i(),m(e(ge),{key:0,ref_key:"scroller",ref:S,class:"file-list",items:e(s),"item-size":e(h).first,"key-field":"fullpath","item-secondary-size":e(h).second,gridItems:e(P),onScroll:e(M)},{default:r(({item:l,index:B})=>[o(we,{idx:B,file:l,"show-menu-idx":e(g),"onUpdate:showMenuIdx":a[4]||(a[4]=J=>U(g)?g.value=J:null),onFileItemClick:e(G),"full-screen-preview-image-url":e(s)[e(u)]?e(ne)(e(s)[e(u)]):"","cell-width":e(Q),selected:e(q).includes(B),onContextMenuClick:e(y),onDragstart:e(K),onDragend:e(O),onPreviewVisibleChange:e(N)},null,8,["idx","file","show-menu-idx","onFileItemClick","full-screen-preview-image-url","cell-width","selected","onContextMenuClick","onDragstart","onDragend","onPreviewVisibleChange"])]),_:1},8,["items","item-size","item-secondary-size","gridItems","onScroll"])):f("",!0),e(x)?(i(),w("div",_e,[o(e(pe),{onClick:a[5]||(a[5]=l=>e(C)("prev")),class:E({disable:!e(b)("prev")})},null,8,["class"]),o(e(me),{onClick:a[6]||(a[6]=l=>e(C)("next")),class:E({disable:!e(b)("next")})},null,8,["class"])])):f("",!0)]),_:1},8,["spinning"]),e(x)&&e(s)&&e(s)[e(u)]?(i(),m(ve,{key:1,file:e(s)[e(u)],idx:e(u),onContextMenuClick:e(y)},null,8,["file","idx","onContextMenuClick"])):f("",!0)],512)}}});const Ae=ce(Se,[["__scopeId","data-v-ea1c4eca"]]);export{Ae as default};

View File

@ -0,0 +1 @@
.search-bar[data-v-ea1c4eca]{padding:8px;display:flex}.preview-switch[data-v-ea1c4eca]{position:fixed;top:0;bottom:0;left:0;right:0;display:flex;align-items:center;justify-content:space-between;z-index:11111;pointer-events:none}.preview-switch>*[data-v-ea1c4eca]{color:#fff;margin:16px;font-size:4em;pointer-events:all;cursor:pointer}.preview-switch>*.disable[data-v-ea1c4eca]{opacity:0;pointer-events:none;cursor:none}.container[data-v-ea1c4eca]{background:var(--zp-secondary-background)}.container .file-list[data-v-ea1c4eca]{list-style:none;padding:8px;height:100%;overflow:auto;height:var(--pane-max-height);width:100%}

View File

@ -1 +0,0 @@
.search-bar[data-v-d4ab92e4]{padding:8px;display:flex}.preview-switch[data-v-d4ab92e4]{position:fixed;top:0;bottom:0;left:0;right:0;display:flex;align-items:center;justify-content:space-between;z-index:11111;pointer-events:none}.preview-switch>*[data-v-d4ab92e4]{color:#fff;margin:16px;font-size:4em;pointer-events:all;cursor:pointer}.preview-switch>*.disable[data-v-d4ab92e4]{opacity:0;pointer-events:none;cursor:none}.container[data-v-d4ab92e4]{background:var(--zp-secondary-background)}.container .file-list[data-v-d4ab92e4]{list-style:none;padding:8px;height:100%;overflow:auto;height:var(--pane-max-height);width:100%}

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
import{d as v,c2 as C,bO as I,o as i,y as _,p as f,c,n as r,x as h,v as d,r as e,m as F,L as x,c3 as z,c4 as B,V as $,X as R}from"./index-1537dba6.js";import{u as S,b as V,k as E,F as A,g as L}from"./FileItem-dbdcf20b.js";import"./db-925e828e.js";import"./shortcut-ec395f0e.js";const T={class:"actions-panel actions"},N={key:0,class:"file-list"},U={class:"hint"},H=v({__name:"batchDownload",props:{tabIdx:{},paneIdx:{},id:{}},setup(O){const{stackViewEl:w}=S().toRefs(),{itemSize:p,gridItems:k,cellWidth:b}=V(),l=E(),{selectdFiles:n}=C(l),u=I(),y=async t=>{const s=z(t);s&&l.addFiles(s.nodes)},D=async()=>{u.pushAction(async()=>{const t=await B.value.post("/zip",{paths:n.value.map(o=>o.fullpath)},{responseType:"blob"}),s=window.URL.createObjectURL(new Blob([t.data])),a=document.createElement("a");a.href=s,a.setAttribute("download",`iib_${new Date().toLocaleString()}.zip`),document.body.appendChild(a),a.click()})},g=t=>{n.value.splice(t,1)};return(t,s)=>{const a=$;return i(),_("div",{class:"container",ref_key:"stackViewEl",ref:w,onDrop:y},[f("div",T,[c(a,{onClick:s[0]||(s[0]=o=>e(l).selectdFiles=[])},{default:r(()=>[h(d(t.$t("clear")),1)]),_:1}),c(a,{onClick:D,type:"primary",loading:!e(u).isIdle},{default:r(()=>[h(d(t.$t("zipDownload")),1)]),_:1},8,["loading"])]),e(n).length?(i(),F(e(L),{key:1,ref:"scroller",class:"file-list",items:e(n).slice(),"item-size":e(p).first,"key-field":"fullpath","item-secondary-size":e(p).second,gridItems:e(k)},{default:r(({item:o,index:m})=>[c(A,{idx:m,file:o,"cell-width":e(b),"enable-close-icon":"",onCloseIconClick:j=>g(m),"full-screen-preview-image-url":e(x)(o),"enable-right-click-menu":!1},null,8,["idx","file","cell-width","onCloseIconClick","full-screen-preview-image-url"])]),_:1},8,["items","item-size","item-secondary-size","gridItems"])):(i(),_("div",N,[f("p",U,d(t.$t("batchDownloaDDragAndDropHint")),1)]))],544)}}});const G=R(H,[["__scopeId","data-v-aab31da2"]]);export{G as default};
import{d as v,c2 as C,bO as I,o as i,y as _,p as f,c,n as r,x as h,v as d,r as e,m as F,L as x,c3 as z,c4 as B,V as $,X as R}from"./index-f215d50e.js";import{u as S,b as V,k as E,F as A,g as L}from"./FileItem-b3f4270c.js";import"./db-6009d510.js";import"./shortcut-a2335978.js";const T={class:"actions-panel actions"},N={key:0,class:"file-list"},U={class:"hint"},H=v({__name:"batchDownload",props:{tabIdx:{},paneIdx:{},id:{}},setup(O){const{stackViewEl:w}=S().toRefs(),{itemSize:p,gridItems:k,cellWidth:b}=V(),l=E(),{selectdFiles:n}=C(l),u=I(),y=async t=>{const s=z(t);s&&l.addFiles(s.nodes)},D=async()=>{u.pushAction(async()=>{const t=await B.value.post("/zip",{paths:n.value.map(o=>o.fullpath)},{responseType:"blob"}),s=window.URL.createObjectURL(new Blob([t.data])),a=document.createElement("a");a.href=s,a.setAttribute("download",`iib_${new Date().toLocaleString()}.zip`),document.body.appendChild(a),a.click()})},g=t=>{n.value.splice(t,1)};return(t,s)=>{const a=$;return i(),_("div",{class:"container",ref_key:"stackViewEl",ref:w,onDrop:y},[f("div",T,[c(a,{onClick:s[0]||(s[0]=o=>e(l).selectdFiles=[])},{default:r(()=>[h(d(t.$t("clear")),1)]),_:1}),c(a,{onClick:D,type:"primary",loading:!e(u).isIdle},{default:r(()=>[h(d(t.$t("zipDownload")),1)]),_:1},8,["loading"])]),e(n).length?(i(),F(e(L),{key:1,ref:"scroller",class:"file-list",items:e(n).slice(),"item-size":e(p).first,"key-field":"fullpath","item-secondary-size":e(p).second,gridItems:e(k)},{default:r(({item:o,index:m})=>[c(A,{idx:m,file:o,"cell-width":e(b),"enable-close-icon":"",onCloseIconClick:j=>g(m),"full-screen-preview-image-url":e(x)(o),"enable-right-click-menu":!1},null,8,["idx","file","cell-width","onCloseIconClick","full-screen-preview-image-url"])]),_:1},8,["items","item-size","item-secondary-size","gridItems"])):(i(),_("div",N,[f("p",U,d(t.$t("batchDownloaDDragAndDropHint")),1)]))],544)}}});const G=R(H,[["__scopeId","data-v-aab31da2"]]);export{G as default};

View File

@ -1 +1 @@
import{c4 as t}from"./index-1537dba6.js";const c=async()=>(await t.value.get("/db/basic_info")).data,r=async()=>(await t.value.get("/db/expired_dirs")).data,d=async()=>{await t.value.post("/db/update_image_data",{},{timeout:1/0})},g=async(a,s)=>(await t.value.post("/db/match_images_by_tags",{...a,cursor:s})).data,u=async a=>(await t.value.post("/db/add_custom_tag",a)).data,p=async a=>(await t.value.post("/db/toggle_custom_tag_to_img",a)).data,i=async a=>{await t.value.post("/db/remove_custom_tag",a)},m=async(a,s)=>(await t.value.get("/db/search_by_substr",{params:{substr:a,cursor:s}})).data,e="/db/scanned_paths",_=async a=>{await t.value.post(e,{path:a})},b=async a=>{await t.value.delete(e,{data:{path:a}})},y=async a=>(await t.value.post("/db/get_image_tags",{paths:a})).data;export{_ as a,c as b,r as c,u as d,i as e,m as f,g,y as h,b as r,p as t,d as u};
import{c4 as t}from"./index-f215d50e.js";const c=async()=>(await t.value.get("/db/basic_info")).data,r=async()=>(await t.value.get("/db/expired_dirs")).data,d=async()=>{await t.value.post("/db/update_image_data",{},{timeout:1/0})},g=async(a,s)=>(await t.value.post("/db/match_images_by_tags",{...a,cursor:s})).data,u=async a=>(await t.value.post("/db/add_custom_tag",a)).data,p=async a=>(await t.value.post("/db/toggle_custom_tag_to_img",a)).data,i=async a=>{await t.value.post("/db/remove_custom_tag",a)},m=async(a,s)=>(await t.value.get("/db/search_by_substr",{params:{substr:a,cursor:s}})).data,e="/db/scanned_paths",_=async a=>{await t.value.post(e,{path:a})},b=async a=>{await t.value.delete(e,{data:{path:a}})},y=async a=>(await t.value.post("/db/get_image_tags",{paths:a})).data;export{_ as a,c as b,r as c,u as d,i as e,m as f,g,y as h,b as r,p as t,d as u};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
import{bn as A,$ as g,bU as q,bV as x,am as k,aj as D,bO as j,bd as z}from"./index-1537dba6.js";import{u as G,b as N,f as O,c as Q,d as U,e as H,h as L}from"./FileItem-dbdcf20b.js";let T=0;const V=()=>++T,W=(r,l,{dataUpdateStrategy:c="replace"}={})=>{const s=A([""]),u=g(!1),t=g(),a=g(!1);let f=g(-1);const v=new Set,b=e=>{var n;c==="replace"?t.value=e:c==="merge"&&(k((Array.isArray(t.value)||typeof t.value>"u")&&Array.isArray(e),"数据更新策略为合并时仅可用于值为数组的情况"),t.value=[...(n=t==null?void 0:t.value)!==null&&n!==void 0?n:[],...e])},d=e=>x(void 0,void 0,void 0,function*(){if(a.value||u.value&&typeof e>"u")return!1;a.value=!0;const n=V();f.value=n;try{let o;if(typeof e=="number"){if(o=s[e],typeof o!="string")return!1}else o=s[s.length-1];const p=yield r(o);if(v.has(n))return v.delete(n),!1;b(l(p));const i=p.cursor;if((e===s.length-1||typeof e!="number")&&(u.value=!i.has_next,i.has_next)){const I=i.next_cursor||i.next;k(typeof I=="string"),s.push(I)}}finally{f.value===n&&(a.value=!1)}return!0}),h=()=>{v.add(f.value),a.value=!1},w=(e=!1)=>x(void 0,void 0,void 0,function*(){const{refetch:n,force:o}=typeof e=="object"?e:{refetch:e};o&&h(),k(!a.value),s.splice(0,s.length,""),a.value=!1,t.value=void 0,u.value=!1,n&&(yield d())}),m=()=>({next:()=>x(void 0,void 0,void 0,function*(){if(a.value)throw new Error("不允许同时迭代");return{done:!(yield d()),value:t.value}})});return q({abort:h,load:u,next:d,res:t,loading:a,cursorStack:s,reset:w,[Symbol.asyncIterator]:m,iter:{[Symbol.asyncIterator]:m}})},J=r=>A(W(r,l=>l.files,{dataUpdateStrategy:"merge"})),K=r=>{const l=A(new Set),c=D(()=>(r.res??[]).filter(y=>!l.has(y.fullpath))),s=j(),{stackViewEl:u,multiSelectedIdxs:t,stack:a,scroller:f}=G({images:c}).toRefs(),{itemSize:v,gridItems:b,cellWidth:d,onScroll:h}=N({fetchNext:()=>r.next()}),{showMenuIdx:w}=O(),{onFileDragStart:m,onFileDragEnd:e}=Q(),{showGenInfo:n,imageGenInfo:o,q:p,onContextMenuClick:i,onFileItemClick:I}=U({openNext:z}),{previewIdx:C,previewing:F,onPreviewVisibleChange:_,previewImgMove:E,canPreview:M}=H(),P=async(y,S,R)=>{a.value=[{curr:"",files:c.value}],await i(y,S,R)};return L("removeFiles",async({paths:y})=>{y.forEach(S=>l.add(S))}),{images:c,scroller:f,queue:s,iter:r,onContextMenuClickU:P,stackViewEl:u,previewIdx:C,previewing:F,onPreviewVisibleChange:_,previewImgMove:E,canPreview:M,itemSize:v,gridItems:b,showGenInfo:n,imageGenInfo:o,q:p,onContextMenuClick:i,onFileItemClick:I,showMenuIdx:w,multiSelectedIdxs:t,onFileDragStart:m,onFileDragEnd:e,cellWidth:d,onScroll:h}};export{J as c,K as u};
import{bn as A,$ as g,bU as q,bV as x,am as k,aj as D,bO as j,bd as z}from"./index-f215d50e.js";import{u as G,b as N,f as O,c as Q,d as U,e as H,h as L}from"./FileItem-b3f4270c.js";let T=0;const V=()=>++T,W=(r,l,{dataUpdateStrategy:c="replace"}={})=>{const s=A([""]),u=g(!1),t=g(),a=g(!1);let f=g(-1);const v=new Set,b=e=>{var n;c==="replace"?t.value=e:c==="merge"&&(k((Array.isArray(t.value)||typeof t.value>"u")&&Array.isArray(e),"数据更新策略为合并时仅可用于值为数组的情况"),t.value=[...(n=t==null?void 0:t.value)!==null&&n!==void 0?n:[],...e])},d=e=>x(void 0,void 0,void 0,function*(){if(a.value||u.value&&typeof e>"u")return!1;a.value=!0;const n=V();f.value=n;try{let o;if(typeof e=="number"){if(o=s[e],typeof o!="string")return!1}else o=s[s.length-1];const p=yield r(o);if(v.has(n))return v.delete(n),!1;b(l(p));const i=p.cursor;if((e===s.length-1||typeof e!="number")&&(u.value=!i.has_next,i.has_next)){const I=i.next_cursor||i.next;k(typeof I=="string"),s.push(I)}}finally{f.value===n&&(a.value=!1)}return!0}),h=()=>{v.add(f.value),a.value=!1},w=(e=!1)=>x(void 0,void 0,void 0,function*(){const{refetch:n,force:o}=typeof e=="object"?e:{refetch:e};o&&h(),k(!a.value),s.splice(0,s.length,""),a.value=!1,t.value=void 0,u.value=!1,n&&(yield d())}),m=()=>({next:()=>x(void 0,void 0,void 0,function*(){if(a.value)throw new Error("不允许同时迭代");return{done:!(yield d()),value:t.value}})});return q({abort:h,load:u,next:d,res:t,loading:a,cursorStack:s,reset:w,[Symbol.asyncIterator]:m,iter:{[Symbol.asyncIterator]:m}})},J=r=>A(W(r,l=>l.files,{dataUpdateStrategy:"merge"})),K=r=>{const l=A(new Set),c=D(()=>(r.res??[]).filter(y=>!l.has(y.fullpath))),s=j(),{stackViewEl:u,multiSelectedIdxs:t,stack:a,scroller:f}=G({images:c}).toRefs(),{itemSize:v,gridItems:b,cellWidth:d,onScroll:h}=N({fetchNext:()=>r.next()}),{showMenuIdx:w}=O(),{onFileDragStart:m,onFileDragEnd:e}=Q(),{showGenInfo:n,imageGenInfo:o,q:p,onContextMenuClick:i,onFileItemClick:I}=U({openNext:z}),{previewIdx:C,previewing:F,onPreviewVisibleChange:_,previewImgMove:E,canPreview:M}=H(),P=async(y,S,R)=>{a.value=[{curr:"",files:c.value}],await i(y,S,R)};return L("removeFiles",async({paths:y})=>{y.forEach(S=>l.add(S))}),{images:c,scroller:f,queue:s,iter:r,onContextMenuClickU:P,stackViewEl:u,previewIdx:C,previewing:F,onPreviewVisibleChange:_,previewImgMove:E,canPreview:M,itemSize:v,gridItems:b,showGenInfo:n,imageGenInfo:o,q:p,onContextMenuClick:i,onFileItemClick:I,showMenuIdx:w,multiSelectedIdxs:t,onFileDragStart:m,onFileDragEnd:e,cellWidth:d,onScroll:h}};export{J as c,K as u};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
.ant-breadcrumb{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";color:#00000073;font-size:14px}.ant-breadcrumb .anticon{font-size:14px}.ant-breadcrumb a{color:#00000073;transition:color .3s}.ant-breadcrumb a:hover{color:#de632f}.ant-breadcrumb>span:last-child{color:#000000d9}.ant-breadcrumb>span:last-child a{color:#000000d9}.ant-breadcrumb>span:last-child .ant-breadcrumb-separator{display:none}.ant-breadcrumb-separator{margin:0 8px;color:#00000073}.ant-breadcrumb-link>.anticon+span,.ant-breadcrumb-link>.anticon+a{margin-left:4px}.ant-breadcrumb-overlay-link>.anticon{margin-left:4px}.ant-breadcrumb-rtl{direction:rtl}.ant-breadcrumb-rtl:before{display:table;content:""}.ant-breadcrumb-rtl:after{display:table;clear:both;content:""}.ant-breadcrumb-rtl>span{float:right}.ant-breadcrumb-rtl .ant-breadcrumb-link>.anticon+span,.ant-breadcrumb-rtl .ant-breadcrumb-link>.anticon+a{margin-right:4px;margin-left:0}.ant-breadcrumb-rtl .ant-breadcrumb-overlay-link>.anticon{margin-right:4px;margin-left:0}.nprogress{pointer-events:none}.nprogress .bar{background:#29d;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}.nprogress .peg{display:block;position:absolute;right:0px;width:100px;height:100%;box-shadow:0 0 10px #29d,0 0 5px #29d;opacity:1;-webkit-transform:rotate(3deg) translate(0px,-4px);-ms-transform:rotate(3deg) translate(0px,-4px);transform:rotate(3deg) translateY(-4px)}.nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}.nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border:solid 2px transparent;border-top-color:#29d;border-left-color:#29d;border-radius:50%;-webkit-animation:nprogress-spinner .4s linear infinite;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent .nprogress .spinner,.nprogress-custom-parent .nprogress .bar{position:absolute}@-webkit-keyframes nprogress-spinner{0%{-webkit-transform:rotate(0deg)}to{-webkit-transform:rotate(360deg)}}@keyframes nprogress-spinner{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.preview-switch[data-v-e5dabb69]{position:fixed;top:0;bottom:0;left:0;right:0;display:flex;align-items:center;justify-content:space-between;z-index:11111;pointer-events:none}.preview-switch>*[data-v-e5dabb69]{color:#fff;margin:16px;font-size:4em;pointer-events:all;cursor:pointer}.preview-switch>*.disable[data-v-e5dabb69]{opacity:0;pointer-events:none;cursor:none}.breadcrumb[data-v-e5dabb69]{display:flex;align-items:center}.breadcrumb>*[data-v-e5dabb69]{margin-right:4px}.container[data-v-e5dabb69]{background:var(--zp-secondary-background);height:var(--pane-max-height)}.location-bar[data-v-e5dabb69]{padding:4px 16px;background:var(--zp-primary-background);border-bottom:1px solid var(--zp-border);display:flex;align-items:center;justify-content:space-between}.location-bar .actions[data-v-e5dabb69]{display:flex;align-items:center;flex-shrink:0}.location-bar a.opt[data-v-e5dabb69]{margin-left:8px}.view[data-v-e5dabb69]{padding:8px;height:calc(100vh - 48px)}.view .file-list[data-v-e5dabb69]{list-style:none;padding:8px;height:100%;overflow:auto}.hint[data-v-e5dabb69]{padding:4px;border:4px;background:var(--zp-secondary-background);border:1px solid var(--zp-border)}
.ant-breadcrumb{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";color:#00000073;font-size:14px}.ant-breadcrumb .anticon{font-size:14px}.ant-breadcrumb a{color:#00000073;transition:color .3s}.ant-breadcrumb a:hover{color:#de632f}.ant-breadcrumb>span:last-child{color:#000000d9}.ant-breadcrumb>span:last-child a{color:#000000d9}.ant-breadcrumb>span:last-child .ant-breadcrumb-separator{display:none}.ant-breadcrumb-separator{margin:0 8px;color:#00000073}.ant-breadcrumb-link>.anticon+span,.ant-breadcrumb-link>.anticon+a{margin-left:4px}.ant-breadcrumb-overlay-link>.anticon{margin-left:4px}.ant-breadcrumb-rtl{direction:rtl}.ant-breadcrumb-rtl:before{display:table;content:""}.ant-breadcrumb-rtl:after{display:table;clear:both;content:""}.ant-breadcrumb-rtl>span{float:right}.ant-breadcrumb-rtl .ant-breadcrumb-link>.anticon+span,.ant-breadcrumb-rtl .ant-breadcrumb-link>.anticon+a{margin-right:4px;margin-left:0}.ant-breadcrumb-rtl .ant-breadcrumb-overlay-link>.anticon{margin-right:4px;margin-left:0}.nprogress{pointer-events:none}.nprogress .bar{background:#29d;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}.nprogress .peg{display:block;position:absolute;right:0px;width:100px;height:100%;box-shadow:0 0 10px #29d,0 0 5px #29d;opacity:1;-webkit-transform:rotate(3deg) translate(0px,-4px);-ms-transform:rotate(3deg) translate(0px,-4px);transform:rotate(3deg) translateY(-4px)}.nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}.nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border:solid 2px transparent;border-top-color:#29d;border-left-color:#29d;border-radius:50%;-webkit-animation:nprogress-spinner .4s linear infinite;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent .nprogress .spinner,.nprogress-custom-parent .nprogress .bar{position:absolute}@-webkit-keyframes nprogress-spinner{0%{-webkit-transform:rotate(0deg)}to{-webkit-transform:rotate(360deg)}}@keyframes nprogress-spinner{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.preview-switch[data-v-0f674aa0]{position:fixed;top:0;bottom:0;left:0;right:0;display:flex;align-items:center;justify-content:space-between;z-index:11111;pointer-events:none}.preview-switch>*[data-v-0f674aa0]{color:#fff;margin:16px;font-size:4em;pointer-events:all;cursor:pointer}.preview-switch>*.disable[data-v-0f674aa0]{opacity:0;pointer-events:none;cursor:none}.breadcrumb[data-v-0f674aa0]{display:flex;align-items:center}.breadcrumb>*[data-v-0f674aa0]{margin-right:4px}.container[data-v-0f674aa0]{background:var(--zp-secondary-background);height:var(--pane-max-height)}.location-bar[data-v-0f674aa0]{padding:4px 16px;background:var(--zp-primary-background);border-bottom:1px solid var(--zp-border);display:flex;align-items:center;justify-content:space-between}.location-bar .actions[data-v-0f674aa0]{display:flex;align-items:center;flex-shrink:0}.location-bar a.opt[data-v-0f674aa0]{margin-left:8px}.view[data-v-0f674aa0]{padding:8px;height:calc(100vh - 48px)}.view .file-list[data-v-0f674aa0]{list-style:none;padding:8px;height:100%;overflow:auto}.hint[data-v-0f674aa0]{padding:4px;border:4px;background:var(--zp-secondary-background);border:1px solid var(--zp-border)}

1
vue/dist/assets/stackView-fac43933.js vendored Normal file

File diff suppressed because one or more lines are too long

2
vue/dist/index.html vendored
View File

@ -7,7 +7,7 @@
<link rel="icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Infinite Image Browsing</title>
<script type="module" crossorigin src="/infinite_image_browsing/fe-static/assets/index-1537dba6.js"></script>
<script type="module" crossorigin src="/infinite_image_browsing/fe-static/assets/index-f215d50e.js"></script>
<link rel="stylesheet" href="/infinite_image_browsing/fe-static/assets/index-04bf0fce.css">
</head>

View File

@ -99,7 +99,7 @@ const taggleLikeTag = () => {
</a-dropdown>
</div>
<!-- :key="fullScreenPreviewImageUrl ? undefined : file.fullpath"
这么复杂是因为再全屏预览时可能因为直接删除导致fullpath变化然后整个预览直接退出-->
这么复杂是因为再全屏查看时可能因为直接删除导致fullpath变化然后整个预览直接退出-->
<div style="position: relative;" :key="file.fullpath" :class="`idx-${idx}`" v-if="isImageFile(file.name)">
<a-image :src="imageSrc" :fallback="fallbackImage" :preview="{

View File

@ -1,597 +0,0 @@
import { createI18n } from 'vue-i18n'
const zh = {
//! MissingTranslations: "像这样标记缺失的翻译" ← i just translated it with google translate ♥
errorOccurred: '发生了个错误',
useThumbnailPreview: '使用缩略图预览',
smallerIntervalMeansMoreNetworkTraffic: '越小对网络压力越大',
gridThumbnailWidth: '网格缩略图宽度',
largeGridThumbnailWidth: '大尺寸网格缩略图宽度',
start: '开始',
tip: '提示',
startedAt: '开始于:',
sortByDateAscending: '修改日期升序',
sortByDateDescending: '修改日期降序',
sortByCreatedDateAscending: '创建日期升序',
sortByCreatedDateDescending: '创建日期降序',
sortByNameAscending: '名称升序',
sortByNameDescending: '名称降序',
sortBySizeAscending: '大小升序',
sortBySizeDescending: '大小降序',
inputAddressAndPressEnter: '输入地址回车',
go: '前往',
unknownError: '未知错误',
loadingNextFolder: '即将加载下一个文件夹的文件',
moveFailedCheckPath: '移动失败,检查你的路径输入',
detailList: '详情列表',
previewGrid: '预览网格',
largePreviewGrid: '大尺寸预览网格',
sortBy: '按照',
moveSelectedFilesTo: '下列文件 移动 / 复制 至',
confirm: '确定',
download: '下载',
local: '本地',
sendImageFailed: '发送图像失败请携带console的错误消息找开发者',
confirmDelete: '确认删除?',
deleteSuccess: '删除成功',
doubleClickToCopy: '双击复制',
root: '根',
drive: '盘',
refresh: '刷新',
quickMove: '快速移动',
more: '更多',
viewMode: '查看模式',
sortingMethod: '排序方法',
copyPath: '复制路径',
deleteSelected: '删除',
previewInNewWindow: '在新窗口预览',
copySourceFilePreviewLink: '复制源文件预览链接',
viewGenerationInfo: '查看生成信息(prompt等)',
sendToTxt2img: '发送到文生图',
sendToImg2img: '发送到图生图',
sendToInpaint: '发送到局部重绘',
sendToControlNet: '发送到ControlNet',
sendToBatchDownload: '发送到批量下载',
sendToExtraFeatures: '发送到附加功能',
loadNextPage: '加载下一页',
localFile: '本地文件',
globalSettings: '全局设置',
welcome: '欢迎',
openInNewWindow: '在新页面打开',
restoreLastRecord: '还原上次记录',
launch: '启动',
walkMode: '使用 Walk 模式浏览图片',
launchFromQuickMove: '从快速移动启动',
recent: '最近',
emptyStartPage: '空启动页',
t2i: '文生图',
i2i: '图生图',
saveButtonSavesTo: '保存',
extra: '附加',
gridImage: '宫格图',
'i2i-grid': '图生图网格',
image: '图像',
't2i-grid': '文生图宫格',
workingFolder: '工作文件夹',
lang: '语言',
langChangeReload: '重新加载: 一些变化可能需要在重新加载后生效',
hypernetworks: '超网络模型',
openOnTheRight: '在右边打开',
openInNewTab: '在新标签打开',
openWithWalkMode: '使用 Walk 模式打开',
longPressOpenContextMenu: '支持使用长按打开右键菜单',
searchResults: '搜索结果',
imgSearch: '图像搜索',
onlyFoldersAndImages: '只显示文件夹和图像',
send2savedDir: '发送到保存的文件夹',
unknownSavedDir: '找不到保存的文件夹配置文件中的outdir_save字段',
Model: '模型',
Sampler: '采样器',
lora: 'LoRA',
size: '尺寸',
pos: '正面提示',
generateIndexHint: '生成索引用于搜索图像',
UpdateIndex: '更新索引',
needGenerateIdx: '你需要先点击按钮生成索引用于搜索图像\n这个过程可能需要消耗几分钟',
search: '搜索',
custom: '自定义',
add: '新增',
cancel: '取消',
submit: '提交',
existInOtherType: '已存在于其他类型',
alreadyExists: '已存在',
toggleTag: '切换标签选中 (收藏)',
addCompleted: '添加完成',
removeCompleted: '删除完成',
addedTagToImage: '已添加标签 "{tag}" 到本图片',
removedTagFromImage: '已从本图片上移除 "{tag}" 标签',
openContextMenu: '打开上下文菜单',
copyPrompt: '复制提示',
copyPositivePrompt: '复制正向提示',
refreshCompleted: '刷新完成',
'walk-mode-move-message': '在walk模式下仅允许使用“快速移动”移动位置',
long_loading:
'已经连续加载超过5秒这可能在一会后恢复如果一直发生这种问题请查看FAQ自行解决或者提issue',
manualExitFullScreen: '你删除了最后一张图片,也许需要你手动退出全屏预览',
copied: '已复制!',
'index.expired': '索引过期,正在自动更新',
'auto.refreshed': '自动刷新完成!',
exactMatch: '完全匹配',
anyMatch: '匹配任意',
exclude: '排除掉',
selectExactMatchTag: '选择完全匹配的 Tag',
selectAnyMatchTag: '可选,选择匹配其中一个或多个的 Tag',
selectExcludeTag: '可选,选择需要排除掉的 Tag',
faq: '常见问题',
autoUpdate: '检测到发生改变自动更新',
'fuzzy-search': '模糊搜索',
'fuzzy-search-placeholder': '输入图像信息或者文件名的一部分来进行搜索',
'fuzzy-search-noResults': '什么都没找到',
openWithLocalFileBrowser: '使用本地文件浏览器打开',
addToSearchScanPathAndQuickMove: '添加到搜索扫描路径和快速移动',
removeFromSearchScanPathAndQuickMove: '从搜索扫描路径和快速移动中移除',
serverKeyRequired: '服务器配置了密匙,你必须提供相同的密匙才能继续使用',
shortcutKey: '快捷键(仅允许在全屏预览下使用)',
shortcutKeyDescription: '点击输入框按下你想使用的按键支持与Shift和Ctrl进行组合',
fullscreenRestriction: '受技术限制,当前拓展不允许删除打开全屏预览时的首张图片。',
clear: '清除',
toggleTagSelection: '切换 "{tag}" 标签选中',
changlog: '更新日志',
accessControlModeTips:
'为确保数据安全,您当前正以访问控制模式运行,仅能访问授权文件夹。您可以通过编辑本拓展根目录的下.env文件来调整访问权限设置 (IIB_ACCESS_CONTROL) .如果不存在.env文件, 你可以将.env.example文件复制并重命名为.env',
dontShowAgain: '不再显示',
defaultSortingMethod: '默认排序方法',
defaultViewMode: '默认查看模式',
showPreviewImage: '显示预览图',
copy: '复制',
edit: '编辑',
document: '文档',
multiSelectTips: '您可以按住 Shift、Ctrl 或 Cmd 键,然后单击文件来进行多选删除/移动操作',
copyLocationUrlSuccessMsg: '复制完成,你可以通过复制的链接直接打开当前文件夹',
share: '分享',
dragImageHere: '拖拽图像到这里',
imgCompare: '图像对比',
close: '关闭',
fullscreenview: '全屏查看',
fileName: '文件名',
resolution: '分辨率',
fileSize: '文件大小',
selectAll: '全选',
'tauriLaunchConf.readSdWebuiConfigTitle': '读取Stable Diffusion Webui的配置',
'tauriLaunchConf.readSdWebuiConfigDescription':
'如果你已经安装sd-webui且在sd-webui内安装了本拓展推荐直接使用这个将直接读取配置并且数据共享',
'tauriLaunchConf.selectSdWebuiFolder': '点击选择SD-webui的文件夹',
'tauriLaunchConf.skipThisConfigTitle': '跳过本次配置',
'tauriLaunchConf.skipThisConfigDescription': '所有功能仍将可用,你可以在设置页重置',
'tauriLaunchConf.skipButton': '跳过',
'tauriLaunchConfMessages.configNotFound': '找不到对应配置,检查选择的文件夹是否正确',
'tauriLaunchConfMessages.folderNotFound': '找不到对应文件夹,检查选择的文件夹是否正确',
'tauriLaunchConfMessages.configCompletedMessage': '配置完成,即将重启',
'tauriLaunchConfMessages.firstTimeUserTitle': '看起来你好像是第一次使用, 需要进行一些配置',
inputTargetFolderPath: '输入目标文件夹的绝对路径',
pathDoesNotExist: '路径不存在',
confirmToAddToQuickMove:
'确定添加?如果文件夹过大将会消耗过多时间建立索引。(如果不需要了你可以在文件夹右上角的更多里面移除)',
clientSpecificSettings: '客户端特有的设置',
initiateSoftwareStartupConfig: '初始化软件启动配置',
gridCellWidth: '网格单元宽度 (px)',
defaultGridCellWidth: '默认网格单元宽度 (px)',
thumbnailResolution: '缩略图分辨率 (px)',
livePreview: '实时预览',
other: '其他',
ImageBrowsingSettings: '图像浏览设置',
majorUpdateCustomCellSizeTips: `重大更新:你可以自定义网格图像的大小了,在全局设置页或者右上角的“更多”里面进行调整`,
desktop: '桌面',
move: '移动',
inputFolderName: '输入文件夹名',
createFolder: '创建文件夹',
sendToThirdPartyExtension: '发送到第三方拓展',
lyco: 'LyCORIS',
batchDownloaDDragAndDropHint:
'使用拖拽或者右键菜单中的“发送到批量下载”将其他页面的图片添加到这里,支持多选',
zipDownload: '打包成zip下载',
archive: '归档',
batchDownload: '批量下载',
remove: '移除',
secretKeyRequiredWarnMsg: `为了安全考虑,你必须为本拓展单独配置Secret Key,具体参考本拓展根目录下的.env.example文件内的IIB_SECRET_KEY。
gradio-auth`,
secretKeyMustBeConfigured: '必须配置Secret Key',
deleteOneOnlySkipConfirm: '删除单个文件时不进行确认',
resetOnGlobalSettingsPage: '你可以在全局设置页重置',
privacyAndSecurity: '安全与隐私',
dragToResizePanel: '按住并拖动来调整面板的大小',
clickToToggleMaximizeMinimize: '单击切换最大化/最小化',
dragToMovePanel: '按住并拖动来移动面板',
imageCompareTips: '拖拽文件时也会出现这个面板,可以不需要打开 “图像对比” 功能'
}
const en: Record<keyof typeof zh, string> = {
//! MissingTranslations: "Mark missing translations like this""shortcutKey": "Keyboard Shortcuts",
//! MissingTranslations
imageCompareTips: 'When dragging files, this panel will also appear, so you don\'t need to open the "Image Comparison" feature separately.',
dragToResizePanel: 'Drag to resize the panel',
clickToToggleMaximizeMinimize: 'Click to toggle maximize/minimize',
dragToMovePanel: 'Drag to move the panel',
privacyAndSecurity: 'Security & Privacy',
deleteOneOnlySkipConfirm: 'Do not confirm when deleting a single file',
resetOnGlobalSettingsPage: 'You can reset on the global settings page',
secretKeyMustBeConfigured: 'Secret Key must be configured',
secretKeyRequiredWarnMsg: `For security reasons, you must separately configure Secret Key for this extension, refer to the IIB_SECRET_KEY in the .env.example file under the root directory of this extension.
This error only appears when gradio-auth is configured.`,
remove: 'Remove',
batchDownload: 'Batch Download',
archive: 'Archive',
zipDownload: 'Download as ZIP',
batchDownloaDDragAndDropHint:
"Use drag and drop or the 'Send to Batch Download' option in the right-click menu to add images from other pages here. Multiple selections are supported.",
lyco: 'LyCORIS',
sendToThirdPartyExtension: 'Send to third-party extension',
createFolder: 'Create Folder',
inputFolderName: 'Input Folder Name',
desktop: 'Desktop',
move: 'Move',
majorUpdateCustomCellSizeTips: `Major Update: You can now customize the size of the grid image. Adjust it in the global settings page or in the "More" menu in the upper right corner.`,
ImageBrowsingSettings: 'Image Browsing Settings',
other: 'Other',
livePreview: 'Live Preview',
gridCellWidth: 'Grid Cell Width (px)',
defaultGridCellWidth: 'Default Grid Cell Width (px)',
thumbnailResolution: 'Thumbnail Resolution (px)',
inputTargetFolderPath: 'Enter the absolute path of the target folder',
pathDoesNotExist: 'Path does not exist',
confirmToAddToQuickMove:
"Are you sure you want to add? This may take a lot of time to index if the folder is large. (You can remove it from 'More' in the top right corner of the folder if you no longer need it.)",
clientSpecificSettings: 'Client-specific settings',
initiateSoftwareStartupConfig: 'Initiate software startup configuration',
'tauriLaunchConf.readSdWebuiConfigTitle': 'Read Stable Diffusion Webui Config',
'tauriLaunchConf.readSdWebuiConfigDescription':
'If you have installed sd-webui and this extension, it is recommended to use this option to directly read the configuration and share data.',
'tauriLaunchConf.selectSdWebuiFolder': 'Click to select the SD-webui folder',
'tauriLaunchConf.skipThisConfigTitle': 'Skip This Configuration',
'tauriLaunchConf.skipThisConfigDescription':
'All features will still be available and you can reset them in the settings page.',
'tauriLaunchConf.skipButton': 'Skip',
'tauriLaunchConfMessages.configNotFound':
'Cannot find the corresponding configuration. Please check if the selected folder is correct.',
'tauriLaunchConfMessages.folderNotFound':
'Cannot find the corresponding folder. Please check if the selected folder is correct.',
'tauriLaunchConfMessages.configCompletedMessage':
'Configuration completed. The application will restart shortly.',
'tauriLaunchConfMessages.firstTimeUserTitle':
'It looks like this is your first time using the application. Some configuration is required.',
selectAll: 'Select All',
close: 'Close',
fileName: 'File Name',
resolution: 'Resolution',
fileSize: 'File Size',
fullscreenview: 'Fullscreen View',
imgCompare: 'Image Comparison',
share: 'Share',
dragImageHere: 'Drag image here',
copyLocationUrlSuccessMsg:
'Copy completed, you can directly open the current folder through the copied link',
multiSelectTips:
'You can hold down the Shift, Ctrl, or Cmd key and then click on files to perform batch delete/move operations',
document: 'Document',
copy: 'Copy',
edit: 'Edit',
defaultSortingMethod: 'Default Sorting Method',
defaultViewMode: 'Default View Mode',
showPreviewImage: 'Show Preview Image',
dontShowAgain: "Don't show again",
accessControlModeTips:
'To ensure data security, you are currently running in access control mode, which only allows access to authorized folders. You can adjust the access permissions settings (IIB_ACCESS_CONTROL) by editing the .env file in the root directory of this extension. If the .env file does not exist, you can copy the .env.example file and rename it to .env.',
changlog: 'Change log',
clear: 'Clear',
toggleTagSelection: 'Toggle Selection of Tag "{tag}"',
fullscreenRestriction:
'Due to technical limitations, the first image cannot be deleted when opening the fullscreen preview.',
shortcutKey: 'Keyboard Shortcuts (Only Available in full-screen preview mode)',
shortcutKeyDescription:
'Click on the input box and press the shortcut key you want to use, supporting combinations with Shift and Ctrl.',
serverKeyRequired:
'The server has configured a key. You must provide the same key to continue using it.',
removeFromSearchScanPathAndQuickMove: 'Remove from Search Scan Path and Quick Move',
addToSearchScanPathAndQuickMove: 'Add to Search Scan Path and Quick Move',
openWithLocalFileBrowser: 'Open with Local File Browser',
'fuzzy-search-noResults': 'Nothing was found',
'fuzzy-search-placeholder': 'Enter a part of the image information or filename to search',
'fuzzy-search': 'Fuzzy search',
autoUpdate: 'Detected changes, automatically updating',
faq: 'FAQ',
selectExactMatchTag: 'Select Exact Match Tags',
selectAnyMatchTag: 'Optional, Select Any Match Tags',
selectExcludeTag: 'Optional, Select Exclude Tags',
exactMatch: 'Exact Match',
anyMatch: 'Match Any',
exclude: 'Exclude',
'auto.refreshed': 'Auto refresh completed!',
copied: 'Copied!',
'index.expired': 'Index expired, updating automatically',
manualExitFullScreen:
'You have deleted the last image and may need to manually exit full-screen preview',
long_loading:
'Loading has been taking more than 5 seconds, it may recover shortly. If this issue persists, please check the FAQ for a solution or open an issue.',
'walk-mode-move-message': "Moving position is only allowed using 'Quick Move' in walk mode",
refreshCompleted: 'Refresh completed',
//! MissingTranslations
addedTagToImage: 'Tag "{tag}" has been added to this image',
removedTagFromImage: 'Tag "{tag}" has been removed from this image',
openContextMenu: 'Open context menu',
copyPrompt: 'Copy prompt',
copyPositivePrompt: 'Copy positive prompt',
toggleTag: 'Toggle Tag Selection (Favorite)',
addCompleted: 'Add completed',
removeCompleted: 'Remove Completed',
existInOtherType: 'Already exists in other type',
alreadyExists: 'Already exists',
cancel: 'Cancel',
submit: 'Submit',
add: 'Add',
custom: 'Custom',
needGenerateIdx:
'You need to click the button to generate an index for searching images. \n This process may take a few minutes to complete.',
search: 'Search',
UpdateIndex: 'Update index',
generateIndexHint: 'Generate index for search image',
Model: 'Model',
Sampler: 'Sampler',
lora: 'LoRA',
size: 'Size',
pos: 'Positive Prompt',
unknownSavedDir: `Cannot find the saved folder (outdir_save field in the config)`,
errorOccurred: 'An error occurred',
useThumbnailPreview: 'Use thumbnail preview',
smallerIntervalMeansMoreNetworkTraffic: 'Smaller interval means more network traffic',
gridThumbnailWidth: 'Grid thumbnail width',
largeGridThumbnailWidth: 'Large grid thumbnail width',
start: 'Start',
tip: 'Tip',
startedAt: 'Started at: ',
sortByDateAscending: 'Updated date ascending',
sortByDateDescending: 'UPdated date descending',
sortByCreatedDateAscending: 'Created date ascending',
sortByCreatedDateDescending: 'Created date descending',
sortByNameAscending: 'Name ascending',
sortByNameDescending: 'Name descending',
sortBySizeAscending: 'Size ascending',
sortBySizeDescending: 'Size descending',
inputAddressAndPressEnter: 'Input address and press Enter',
go: 'Go',
unknownError: 'Unknown error',
loadingNextFolder: 'Loading files from the next folder',
moveFailedCheckPath: 'Move failed. Check your path input.',
detailList: 'Detail list',
previewGrid: 'Preview grid',
largePreviewGrid: 'Large preview grid',
sortBy: 'Sort by',
moveSelectedFilesTo: 'Move / Copy selected files to',
confirm: 'Confirm',
download: 'Download',
local: 'Local',
sendImageFailed:
'Failed to send image. Please contact the developer with the error message from the console.',
confirmDelete: 'Are you sure you want to delete?',
deleteSuccess: 'Deleted successfully',
doubleClickToCopy: 'Double-click to copy',
root: 'Root',
drive: ' drive',
refresh: 'Refresh',
quickMove: 'Quick move',
more: 'More',
viewMode: 'View mode',
sortingMethod: 'Sorting method',
copyPath: 'Copy path',
deleteSelected: 'Delete',
previewInNewWindow: 'Open in new window',
copySourceFilePreviewLink: 'Copy source file preview link',
viewGenerationInfo: 'View generation information (prompt, etc.)',
sendToTxt2img: 'Send to txt2img',
sendToImg2img: 'Send to img2img',
sendToInpaint: 'Send to Inpaint',
sendToBatchDownload: 'Send to BatchDownload',
sendToExtraFeatures: 'Send to Extra',
sendToControlNet: 'Send to ControlNet',
loadNextPage: 'Load next page',
localFile: 'Local file',
globalSettings: 'Global settings',
welcome: 'Welcome',
openInNewWindow: 'Open in new tab',
restoreLastRecord: 'Restore last record',
launch: 'Launch',
walkMode: 'Use Walk mode to browse images',
launchFromQuickMove: 'Launch from Quick Move',
recent: 'Recent',
emptyStartPage: 'Empty start page',
t2i: 'txt2img',
i2i: 'img2img',
saveButtonSavesTo: 'save',
extra: 'extras',
gridImage: 'Grid image',
'i2i-grid': 'img2img grid',
image: 'Image',
't2i-grid': 'txt2img grid',
workingFolder: 'working folder',
lang: 'Language',
langChangeReload: 'Reload: Some changes may require a reload to take effect',
hypernetworks: 'hypernetworks',
openOnTheRight: 'Open on the right',
openInNewTab: 'Open in a new tab',
openWithWalkMode: 'Open with Walk Mode',
longPressOpenContextMenu: 'Support long press to open right-click menu',
searchResults: 'Search Results',
imgSearch: 'Image Search',
onlyFoldersAndImages: 'Only show folders and images',
send2savedDir: 'Send to saved folder'
}
const de: Partial<Record<keyof typeof zh, string>> = {
//! MissingTranslations: "Markiere fehlende Übersetzungen auf diese Weise"
serverKeyRequired:
'Für die weitere Nutzung ist die Eingabe eines Schlüssels erforderlich, der vom Server konfiguriert wurde.',
removeFromSearchScanPathAndQuickMove: 'Schnellzugriff entfernen',
addToSearchScanPathAndQuickMove: 'Schnellzugriff hinzufügen',
openWithLocalFileBrowser: 'Im lokalen Dateimanager öffnen',
'fuzzy-search-noResults': 'Es wurde nichts gefunden',
'fuzzy-search-placeholder':
'Geben Sie einen Teil der Bildinformationen oder des Dateinamens ein, um passende Ergebnisse zu finden',
'fuzzy-search': 'Schnellsuche',
autoUpdate: 'Erkannte Änderungen, automatische Aktualisierung wird ausgeführt',
faq: 'FAQ',
selectExactMatchTag: 'Wähle Tags für exakte Übereinstimmung aus',
selectAnyMatchTag: '(Optional) Wähle Tags für beliebige Übereinstimmung aus',
selectExcludeTag: '(Optional) Wähle Tags zum Ausschliessen aus',
exactMatch: 'Exakte Übereinstimmung',
anyMatch: 'Beliebige Übereinstimmung',
exclude: 'Ausschliessen',
'auto.refreshed': 'Automatische Aktualisierung erfolgreich durchgeführt!',
copied: 'In die Zwischenablage kopiert!',
'index.expired': 'Index abgelaufen, automatische Aktualisierung wird durchgeführt',
manualExitFullScreen:
'Du hast das letzte Bild gelöscht und musst möglicherweise manuell den Vollbild-Vorschaumodus beenden',
long_loading:
'Ladezeit beträgt mehr als 5 Sekunden. Es könnte sich in Kürze wieder normalisieren. Falls das Problem bestehen bleibt, überprüfen Sie bitte die FAQ für Lösungen oder reichen Sie eine Fehlermeldung ein.',
'walk-mode-move-message':
"Im Walk-Modus ist das Verschieben des Verzeichnisses nur über 'Schnellzugriff' gestattet",
refreshCompleted: 'Aktualisierung erfolgreich abgeschlossen',
addedTagToImage: 'Schlagwort wurde erfolgreich diesem Bild hinzugefügt',
removedTagFromImage: 'Schlagwort wurde von diesem Bild entfernt',
openContextMenu: 'Öffne das Kontextmenü',
copyPrompt: 'Kopiere Prompt-Konfiguration',
toggleTag: '(Favorite) Schlagwort hinzufügen/entfernen',
addCompleted: 'Hinzufügen abgeschlossen',
removeCompleted: 'Entfernen abgeschlossen',
existInOtherType: 'Bereits in anderem Typ vorhanden',
alreadyExists: 'Bereits vorhanden',
cancel: 'Abbrechen',
submit: 'Bestätigen',
add: 'Hinzufügen',
custom: 'Benutzerdefiniert',
needGenerateIdx:
'Klicken Sie auf die Schaltfläche, um einen Index zur Bildersuche zu generieren. \n Dieser Vorgang kann einige Minuten in Anspruch nehmen.',
search: 'Suchen',
UpdateIndex: 'Index aktualisieren',
generateIndexHint: 'Index für die Bildersuche generieren',
Model: 'Modell',
Sampler: 'Sampler',
lora: 'LoRA',
size: 'Grösse',
pos: 'Positiver Prompt',
unknownSavedDir:
'Das Speicherverzeichnis konnte nicht gefunden werden (Einstellung für das Speicherverzeichnis in der Konfiguration)',
errorOccurred: 'Ein Fehler ist aufgetreten',
useThumbnailPreview: 'Verwende Miniaturansichtsvorschau',
smallerIntervalMeansMoreNetworkTraffic: 'Kürzeres Intervall bedeutet erhöhten Netzwerkverkehr',
gridThumbnailWidth: 'Breite der Miniatur-Rasteransicht',
largeGridThumbnailWidth: 'Breite der grossen Miniatur-Rasteransicht',
start: 'Start',
tip: 'Hinweis',
startedAt: 'Startzeit:' + ' ',
sortByDateAscending: 'Datum aufsteigend',
sortByDateDescending: 'Datum absteigend',
sortByCreatedDateAscending: 'Erstellungsdatum aufsteigend',
sortByCreatedDateDescending: 'Erstellungsdatum absteigend',
sortByNameAscending: 'Name aufsteigend',
sortByNameDescending: 'Name absteigend',
sortBySizeAscending: 'Grösse aufsteigend',
sortBySizeDescending: 'Grösse absteigend',
inputAddressAndPressEnter: 'Geben Sie die Adresse ein und drücken Sie Enter',
go: 'Los',
unknownError: 'Unbekannter Fehler aufgetreten',
loadingNextFolder: 'Lade Dateien aus dem nächsten Verzeichnis',
moveFailedCheckPath: 'Fehler beim Verschieben. Überprüfen Sie den eingegebenen Pfad.\n',
detailList: 'Detailübersicht',
previewGrid: 'Vorschau-Rasteransicht',
largePreviewGrid: 'Grosses Vorschau-Rasteransicht',
sortBy: 'Sortieren nach',
moveSelectedFilesTo: 'Ausgewählte Dateien verschieben nach',
confirm: 'Bestätigen',
download: 'Herunterladen',
local: 'Lokal',
sendImageFailed:
'Fehler beim Senden des Bildes. Bitte kontaktieren Sie den Entwickler mit der Fehlermeldung aus der Konsole.',
confirmDelete: 'Sind Sie sicher, dass Sie dies löschen möchten?',
deleteSuccess: 'Erfolgreich gelöscht',
doubleClickToCopy: 'Doppelklick zum Kopieren',
root: 'Root',
drive: ' Laufwerk',
refresh: 'Aktualisieren',
quickMove: 'Schnellzugriff',
more: 'Mehr',
viewMode: 'Ansichtsmodus',
sortingMethod: 'Sortiermethode',
copyPath: 'Pfad kopieren',
deleteSelected: 'Löschen',
previewInNewWindow: 'In neuem Fenster öffnen',
copySourceFilePreviewLink: 'Kopiere Dateilink aus dem Verzeichnis',
viewGenerationInfo: 'Anzeige von Generierungsinformationen (Prompt, etc.)',
sendToTxt2img: 'Senden an Text-zu-Bild',
sendToImg2img: 'Senden an Bild-zu-Bild',
sendToInpaint: 'Senden an Inpaint',
sendToExtraFeatures: 'Senden an Extras',
sendToControlNet: 'Senden an ControlNet',
loadNextPage: 'Nächste Seite laden',
localFile: 'Lokale Datei',
globalSettings: 'Globale Einstellungen',
welcome: 'Willkommen',
openInNewWindow: 'In neuem Fenster öffnen',
restoreLastRecord: 'Letztes Verzeichnis wiederherstellen',
launch: 'Ausführen',
walkMode: 'Verwende den Walk-Modus, um Bilder zu durchsuchen',
launchFromQuickMove: 'Ausführen aus Schnellzugriff',
recent: 'Kürzlich',
emptyStartPage: 'Leere Startseite',
t2i: 'Text-zu-Bild',
i2i: 'Bild-zu-Bild',
saveButtonSavesTo: 'Speichern',
extra: 'Extras',
gridImage: 'Rasterbild',
'i2i-grid': 'Bild-zu-Bild Raster',
image: 'Bild',
't2i-grid': 'Text-zu-Bild Raster',
workingFolder: 'Arbeitsordner',
lang: 'Sprache',
langChangeReload: 'Neuladen: Einige Änderungen erfordern ein Neuladen, um wirksam zu werden',
hypernetworks: 'Hypernetzwerke',
openOnTheRight: 'Rechts öffnen',
openInNewTab: 'In neuem Tab öffnen',
openWithWalkMode: 'Im Walk-Modus öffnen',
longPressOpenContextMenu: 'Langes Rechtsklicken zur Öffnung des Kontextmenüs unterstützen',
searchResults: 'Suchergebnisse',
imgSearch: 'Bildsuche',
onlyFoldersAndImages: 'Nur Ordner und Bilder anzeigen',
send2savedDir: 'In den gespeicherten Ordner senden'
}
declare module 'vue' {
export interface ComponentCustomProperties {
$t(key: keyof typeof zh, ...args: []): string
}
}
export const getPreferredLang = () => {
const lang = navigator.language.toLowerCase()
if (lang.startsWith('zh')) {
return 'zh'
}
switch (lang) {
case 'de':
case 'de-de':
return 'de'
default:
return 'en'
}
}
export const i18n = createI18n({
locale: getPreferredLang(),
fallbackLocale: 'en',
messages: {
zh,
en,
de
},
legacy: false
})
export const { t, locale } = i18n.global

130
vue/src/i18n/de.ts Normal file
View File

@ -0,0 +1,130 @@
import type { IIBI18nMap } from '.'
export const de: Partial<IIBI18nMap> = {
serverKeyRequired:
'Für die weitere Nutzung ist die Eingabe eines Schlüssels erforderlich, der vom Server konfiguriert wurde.',
removeFromSearchScanPathAndQuickMove: 'Schnellzugriff entfernen',
addToSearchScanPathAndQuickMove: 'Schnellzugriff hinzufügen',
openWithLocalFileBrowser: 'Im lokalen Dateimanager öffnen',
'fuzzy-search-noResults': 'Es wurde nichts gefunden',
'fuzzy-search-placeholder':
'Geben Sie einen Teil der Bildinformationen oder des Dateinamens ein, um passende Ergebnisse zu finden',
'fuzzy-search': 'Schnellsuche',
autoUpdate: 'Erkannte Änderungen, automatische Aktualisierung wird ausgeführt',
faq: 'FAQ',
selectExactMatchTag: 'Wähle Tags für exakte Übereinstimmung aus',
selectAnyMatchTag: '(Optional) Wähle Tags für beliebige Übereinstimmung aus',
selectExcludeTag: '(Optional) Wähle Tags zum Ausschliessen aus',
exactMatch: 'Exakte Übereinstimmung',
anyMatch: 'Beliebige Übereinstimmung',
exclude: 'Ausschliessen',
'auto.refreshed': 'Automatische Aktualisierung erfolgreich durchgeführt!',
copied: 'In die Zwischenablage kopiert!',
'index.expired': 'Index abgelaufen, automatische Aktualisierung wird durchgeführt',
manualExitFullScreen:
'Du hast das letzte Bild gelöscht und musst möglicherweise manuell den Vollbild-Vorschaumodus beenden',
'walk-mode-move-message':
"Im Walk-Modus ist das Verschieben des Verzeichnisses nur über 'Schnellzugriff' gestattet",
refreshCompleted: 'Aktualisierung erfolgreich abgeschlossen',
addedTagToImage: 'Schlagwort wurde erfolgreich diesem Bild hinzugefügt',
removedTagFromImage: 'Schlagwort wurde von diesem Bild entfernt',
openContextMenu: 'Öffne das Kontextmenü',
copyPrompt: 'Kopiere Prompt-Konfiguration',
toggleTag: '(Favorite) Schlagwort hinzufügen/entfernen',
addCompleted: 'Hinzufügen abgeschlossen',
removeCompleted: 'Entfernen abgeschlossen',
existInOtherType: 'Bereits in anderem Typ vorhanden',
alreadyExists: 'Bereits vorhanden',
cancel: 'Abbrechen',
submit: 'Bestätigen',
add: 'Hinzufügen',
custom: 'Benutzerdefiniert',
needGenerateIdx:
'Klicken Sie auf die Schaltfläche, um einen Index zur Bildersuche zu generieren. \n Dieser Vorgang kann einige Minuten in Anspruch nehmen.',
search: 'Suchen',
UpdateIndex: 'Index aktualisieren',
generateIndexHint: 'Index für die Bildersuche generieren',
Model: 'Modell',
Sampler: 'Sampler',
lora: 'LoRA',
size: 'Grösse',
pos: 'Positiver Prompt',
unknownSavedDir:
'Das Speicherverzeichnis konnte nicht gefunden werden (Einstellung für das Speicherverzeichnis in der Konfiguration)',
errorOccurred: 'Ein Fehler ist aufgetreten',
useThumbnailPreview: 'Verwende Miniaturansichtsvorschau',
gridThumbnailWidth: 'Breite der Miniatur-Rasteransicht',
start: 'Start',
tip: 'Hinweis',
sortByDateAscending: 'Datum aufsteigend',
sortByDateDescending: 'Datum absteigend',
sortByCreatedDateAscending: 'Erstellungsdatum aufsteigend',
sortByCreatedDateDescending: 'Erstellungsdatum absteigend',
sortByNameAscending: 'Name aufsteigend',
sortByNameDescending: 'Name absteigend',
sortBySizeAscending: 'Grösse aufsteigend',
sortBySizeDescending: 'Grösse absteigend',
inputAddressAndPressEnter: 'Geben Sie die Adresse ein und drücken Sie Enter',
go: 'Los',
unknownError: 'Unbekannter Fehler aufgetreten',
loadingNextFolder: 'Lade Dateien aus dem nächsten Verzeichnis',
moveFailedCheckPath: 'Fehler beim Verschieben. Überprüfen Sie den eingegebenen Pfad.\n',
detailList: 'Detailübersicht',
previewGrid: 'Vorschau-Rasteransicht',
moveSelectedFilesTo: 'Ausgewählte Dateien verschieben nach',
confirm: 'Bestätigen',
download: 'Herunterladen',
local: 'Lokal',
sendImageFailed:
'Fehler beim Senden des Bildes. Bitte kontaktieren Sie den Entwickler mit der Fehlermeldung aus der Konsole.',
confirmDelete: 'Sind Sie sicher, dass Sie dies löschen möchten?',
deleteSuccess: 'Erfolgreich gelöscht',
doubleClickToCopy: 'Doppelklick zum Kopieren',
root: 'Root',
drive: ' Laufwerk',
refresh: 'Aktualisieren',
quickMove: 'Schnellzugriff',
more: 'Mehr',
viewMode: 'Ansichtsmodus',
sortingMethod: 'Sortiermethode',
copyPath: 'Pfad kopieren',
deleteSelected: 'Löschen',
previewInNewWindow: 'In neuem Fenster öffnen',
copySourceFilePreviewLink: 'Kopiere Dateilink aus dem Verzeichnis',
viewGenerationInfo: 'Anzeige von Generierungsinformationen (Prompt, etc.)',
sendToTxt2img: 'Senden an Text-zu-Bild',
sendToImg2img: 'Senden an Bild-zu-Bild',
sendToInpaint: 'Senden an Inpaint',
sendToExtraFeatures: 'Senden an Extras',
sendToControlNet: 'Senden an ControlNet',
loadNextPage: 'Nächste Seite laden',
localFile: 'Lokale Datei',
globalSettings: 'Globale Einstellungen',
welcome: 'Willkommen',
openInNewWindow: 'In neuem Fenster öffnen',
restoreLastRecord: 'Letztes Verzeichnis wiederherstellen',
launch: 'Ausführen',
walkMode: 'Verwende den Walk-Modus, um Bilder zu durchsuchen',
launchFromQuickMove: 'Ausführen aus Schnellzugriff',
recent: 'Kürzlich',
emptyStartPage: 'Leere Startseite',
t2i: 'Text-zu-Bild',
i2i: 'Bild-zu-Bild',
saveButtonSavesTo: 'Speichern',
extra: 'Extras',
gridImage: 'Rasterbild',
'i2i-grid': 'Bild-zu-Bild Raster',
image: 'Bild',
't2i-grid': 'Text-zu-Bild Raster',
workingFolder: 'Arbeitsordner',
lang: 'Sprache',
langChangeReload: 'Neuladen: Einige Änderungen erfordern ein Neuladen, um wirksam zu werden',
openOnTheRight: 'Rechts öffnen',
openInNewTab: 'In neuem Tab öffnen',
openWithWalkMode: 'Im Walk-Modus öffnen',
longPressOpenContextMenu: 'Langes Rechtsklicken zur Öffnung des Kontextmenüs unterstützen',
searchResults: 'Suchergebnisse',
imgSearch: 'Bildsuche',
onlyFoldersAndImages: 'Nur Ordner und Bilder anzeigen',
send2savedDir: 'In den gespeicherten Ordner senden'
}

212
vue/src/i18n/en.ts Normal file
View File

@ -0,0 +1,212 @@
import type { IIBI18nMap } from '.'
export const en: IIBI18nMap = {
imageCompareTips: 'When dragging files, this panel will also appear, so you don\'t need to open the "Image Comparison" feature separately.',
dragToResizePanel: 'Drag to resize the panel',
clickToToggleMaximizeMinimize: 'Click to toggle maximize/minimize',
dragToMovePanel: 'Drag to move the panel',
privacyAndSecurity: 'Security & Privacy',
deleteOneOnlySkipConfirm: 'Do not confirm when deleting a single file',
resetOnGlobalSettingsPage: 'You can reset on the global settings page',
secretKeyMustBeConfigured: 'Secret Key must be configured',
secretKeyRequiredWarnMsg: `For security reasons, you must separately configure Secret Key for this extension, refer to the IIB_SECRET_KEY in the .env.example file under the root directory of this extension.
This error only appears when gradio-auth is configured.`,
remove: 'Remove',
batchDownload: 'Batch Download',
archive: 'Archive',
zipDownload: 'Download as ZIP',
batchDownloaDDragAndDropHint:
"Use drag and drop or the 'Send to Batch Download' option in the right-click menu to add images from other pages here. Multiple selections are supported.",
lyco: 'LyCORIS',
sendToThirdPartyExtension: 'Send to third-party extension',
createFolder: 'Create Folder',
inputFolderName: 'Input Folder Name',
desktop: 'Desktop',
move: 'Move',
majorUpdateCustomCellSizeTips: `Major Update: You can now customize the size of the grid image. Adjust it in the global settings page or in the "More" menu in the upper right corner.`,
ImageBrowsingSettings: 'Image Browsing Settings',
other: 'Other',
livePreview: 'Live Preview',
gridCellWidth: 'Grid Cell Width (px)',
defaultGridCellWidth: 'Default Grid Cell Width (px)',
thumbnailResolution: 'Thumbnail Resolution (px)',
inputTargetFolderPath: 'Enter the absolute path of the target folder',
pathDoesNotExist: 'Path does not exist',
confirmToAddToQuickMove:
"Are you sure you want to add? This may take a lot of time to index if the folder is large. (You can remove it from 'More' in the top right corner of the folder if you no longer need it.)",
clientSpecificSettings: 'Client-specific settings',
initiateSoftwareStartupConfig: 'Initiate software startup configuration',
'tauriLaunchConf.readSdWebuiConfigTitle': 'Read Stable Diffusion Webui Config',
'tauriLaunchConf.readSdWebuiConfigDescription':
'If you have installed sd-webui and this extension, it is recommended to use this option to directly read the configuration and share data.',
'tauriLaunchConf.selectSdWebuiFolder': 'Click to select the SD-webui folder',
'tauriLaunchConf.skipThisConfigTitle': 'Skip This Configuration',
'tauriLaunchConf.skipThisConfigDescription':
'All features will still be available and you can reset them in the settings page.',
'tauriLaunchConf.skipButton': 'Skip',
'tauriLaunchConfMessages.configNotFound':
'Cannot find the corresponding configuration. Please check if the selected folder is correct.',
'tauriLaunchConfMessages.folderNotFound':
'Cannot find the corresponding folder. Please check if the selected folder is correct.',
'tauriLaunchConfMessages.configCompletedMessage':
'Configuration completed. The application will restart shortly.',
'tauriLaunchConfMessages.firstTimeUserTitle':
'It looks like this is your first time using the application. Some configuration is required.',
selectAll: 'Select All',
close: 'Close',
fileName: 'File Name',
resolution: 'Resolution',
fileSize: 'File Size',
fullscreenview: 'Fullscreen View',
imgCompare: 'Image Comparison',
share: 'Share',
dragImageHere: 'Drag image here',
copyLocationUrlSuccessMsg:
'Copy completed, you can directly open the current folder through the copied link',
multiSelectTips:
'You can hold down the Shift, Ctrl, or Cmd key and then click on files to perform batch delete/move operations',
document: 'Document',
copy: 'Copy',
edit: 'Edit',
defaultSortingMethod: 'Default Sorting Method',
defaultViewMode: 'Default View Mode',
showPreviewImage: 'Show Preview Image',
dontShowAgain: "Don't show again",
accessControlModeTips:
'To ensure data security, you are currently running in access control mode, which only allows access to authorized folders. You can adjust the access permissions settings (IIB_ACCESS_CONTROL) by editing the .env file in the root directory of this extension. If the .env file does not exist, you can copy the .env.example file and rename it to .env.',
changlog: 'Change log',
clear: 'Clear',
toggleTagSelection: 'Toggle Selection of Tag "{tag}"',
fullscreenRestriction:
'Due to technical limitations, the first image cannot be deleted when opening the Full-screen view.',
shortcutKey: 'Keyboard Shortcuts (Only Available in Full-screen view mode)',
shortcutKeyDescription:
'Click on the input box and press the shortcut key you want to use, supporting combinations with Shift and Ctrl.',
serverKeyRequired:
'The server has configured a key. You must provide the same key to continue using it.',
removeFromSearchScanPathAndQuickMove: 'Remove from Search Scan Path and Quick Move',
addToSearchScanPathAndQuickMove: 'Add to Search Scan Path and Quick Move',
openWithLocalFileBrowser: 'Open with Local File Browser',
'fuzzy-search-noResults': 'Nothing was found',
'fuzzy-search-placeholder': 'Enter a part of the image information or filename to search',
'fuzzy-search': 'Fuzzy search',
autoUpdate: 'Detected changes, automatically updating',
faq: 'FAQ',
selectExactMatchTag: 'Select Exact Match Tags',
selectAnyMatchTag: 'Optional, Select Any Match Tags',
selectExcludeTag: 'Optional, Select Exclude Tags',
exactMatch: 'Exact Match',
anyMatch: 'Match Any',
exclude: 'Exclude',
'auto.refreshed': 'Auto refresh completed!',
copied: 'Copied!',
'index.expired': 'Index expired, updating automatically',
manualExitFullScreen:
'You have deleted the last image and may need to manually exit Full-screen view',
'walk-mode-move-message': "Moving position is only allowed using 'Quick Move' in walk mode",
refreshCompleted: 'Refresh completed',
//! MissingTranslations
addedTagToImage: 'Tag "{tag}" has been added to this image',
removedTagFromImage: 'Tag "{tag}" has been removed from this image',
openContextMenu: 'Open context menu',
copyPrompt: 'Copy prompt',
copyPositivePrompt: 'Copy positive prompt',
toggleTag: 'Toggle Tag Selection (Favorite)',
addCompleted: 'Add completed',
removeCompleted: 'Remove Completed',
existInOtherType: 'Already exists in other type',
alreadyExists: 'Already exists',
cancel: 'Cancel',
submit: 'Submit',
add: 'Add',
custom: 'Custom',
needGenerateIdx:
'You need to click the button to generate an index for searching images. \n This process may take a few minutes to complete.',
search: 'Search',
UpdateIndex: 'Update index',
generateIndexHint: 'Generate index for search image',
Model: 'Model',
Sampler: 'Sampler',
lora: 'LoRA',
size: 'Size',
pos: 'Positive Prompt',
unknownSavedDir: `Cannot find the saved folder (outdir_save field in the config)`,
errorOccurred: 'An error occurred',
useThumbnailPreview: 'Use thumbnail preview',
gridThumbnailWidth: 'Grid thumbnail width',
start: 'Start',
tip: 'Tip',
sortByDateAscending: 'Updated date ascending',
sortByDateDescending: 'UPdated date descending',
sortByCreatedDateAscending: 'Created date ascending',
sortByCreatedDateDescending: 'Created date descending',
sortByNameAscending: 'Name ascending',
sortByNameDescending: 'Name descending',
sortBySizeAscending: 'Size ascending',
sortBySizeDescending: 'Size descending',
inputAddressAndPressEnter: 'Input address and press Enter',
go: 'Go',
unknownError: 'Unknown error',
loadingNextFolder: 'Loading files from the next folder',
moveFailedCheckPath: 'Move failed. Check your path input.',
detailList: 'Detail list',
previewGrid: 'Preview grid',
moveSelectedFilesTo: 'Move / Copy selected files to',
confirm: 'Confirm',
download: 'Download',
local: 'Local',
sendImageFailed:
'Failed to send image. Please contact the developer with the error message from the console.',
confirmDelete: 'Are you sure you want to delete?',
deleteSuccess: 'Deleted successfully',
doubleClickToCopy: 'Double-click to copy',
root: 'Root',
drive: ' drive',
refresh: 'Refresh',
quickMove: 'Quick move',
more: 'More',
viewMode: 'View mode',
sortingMethod: 'Sorting method',
copyPath: 'Copy path',
deleteSelected: 'Delete',
previewInNewWindow: 'Open in new window',
copySourceFilePreviewLink: 'Copy source file preview link',
viewGenerationInfo: 'View generation information (prompt, etc.)',
sendToTxt2img: 'Send to txt2img',
sendToImg2img: 'Send to img2img',
sendToInpaint: 'Send to Inpaint',
sendToBatchDownload: 'Send to BatchDownload',
sendToExtraFeatures: 'Send to Extra',
sendToControlNet: 'Send to ControlNet',
loadNextPage: 'Load next page',
localFile: 'Local file',
globalSettings: 'Global settings',
welcome: 'Welcome',
openInNewWindow: 'Open in new tab',
restoreLastRecord: 'Restore last record',
launch: 'Launch',
walkMode: 'Use Walk mode to browse images',
launchFromQuickMove: 'Launch from Quick Move',
recent: 'Recent',
emptyStartPage: 'Empty start page',
t2i: 'txt2img',
i2i: 'img2img',
saveButtonSavesTo: 'save',
extra: 'extras',
gridImage: 'Grid image',
'i2i-grid': 'img2img grid',
image: 'Image',
't2i-grid': 'txt2img grid',
workingFolder: 'working folder',
lang: 'Language',
langChangeReload: 'Reload: Some changes may require a reload to take effect',
openOnTheRight: 'Open on the right',
openInNewTab: 'Open in a new tab',
openWithWalkMode: 'Open with Walk Mode',
longPressOpenContextMenu: 'Support long press to open right-click menu',
searchResults: 'Search Results',
imgSearch: 'Image Search',
onlyFoldersAndImages: 'Only show folders and images',
send2savedDir: 'Send to saved folder'
}

42
vue/src/i18n/index.ts Normal file
View File

@ -0,0 +1,42 @@
import { createI18n } from 'vue-i18n'
import { zhHans } from './zh-hans'
import { en } from './en'
import { de } from './de'
import { zhHant } from './zh-hant'
declare module 'vue' {
export interface ComponentCustomProperties {
$t(key: keyof IIBI18nMap, ...args: []): string
}
}
export const getPreferredLang = () => {
const lang = navigator.language.toLowerCase()
if (lang.startsWith('zh')) {
return /hk|tw|mo/.test(lang) ? 'zhHant' : 'zhHans'
}
switch (lang) {
case 'de':
case 'de-de':
return 'de'
default:
return 'en'
}
}
export const i18n = createI18n({
locale: getPreferredLang(),
fallbackLocale: 'en',
messages: {
zhHans,
zhHant,
zh: zhHans,
en,
de
},
legacy: false
})
export const { t, locale } = i18n.global
export type IIBI18nMap = typeof zhHans

195
vue/src/i18n/zh-hans.ts Normal file
View File

@ -0,0 +1,195 @@
export const zhHans = {
errorOccurred: '发生了个错误',
useThumbnailPreview: '使用缩略图预览',
gridThumbnailWidth: '网格缩略图宽度',
start: '开始',
tip: '提示',
sortByDateAscending: '修改日期升序',
sortByDateDescending: '修改日期降序',
sortByCreatedDateAscending: '创建日期升序',
sortByCreatedDateDescending: '创建日期降序',
sortByNameAscending: '名称升序',
sortByNameDescending: '名称降序',
sortBySizeAscending: '大小升序',
sortBySizeDescending: '大小降序',
inputAddressAndPressEnter: '输入地址回车',
go: '前往',
unknownError: '未知错误',
loadingNextFolder: '即将加载下一个文件夹的文件',
moveFailedCheckPath: '移动失败,检查你的路径输入',
detailList: '详情列表',
previewGrid: '预览网格',
moveSelectedFilesTo: '下列文件 移动 / 复制 至',
confirm: '确定',
download: '下载',
local: '本地',
sendImageFailed: '发送图像失败请携带console的错误消息找开发者',
confirmDelete: '确认删除?',
deleteSuccess: '删除成功',
doubleClickToCopy: '双击复制',
root: '根',
drive: '盘',
refresh: '刷新',
quickMove: '快速移动',
more: '更多',
viewMode: '查看模式',
sortingMethod: '排序方法',
copyPath: '复制路径',
deleteSelected: '删除',
previewInNewWindow: '在新窗口预览',
copySourceFilePreviewLink: '复制源文件预览链接',
viewGenerationInfo: '查看生成信息(prompt等)',
sendToTxt2img: '发送到文生图',
sendToImg2img: '发送到图生图',
sendToInpaint: '发送到局部重绘',
sendToControlNet: '发送到ControlNet',
sendToBatchDownload: '发送到批量下载',
sendToExtraFeatures: '发送到附加功能',
loadNextPage: '加载下一页',
localFile: '本地文件',
globalSettings: '全局设置',
welcome: '欢迎',
openInNewWindow: '在新页面打开',
restoreLastRecord: '还原上次记录',
launch: '启动',
walkMode: '使用 Walk 模式浏览图片',
launchFromQuickMove: '从快速移动启动',
recent: '最近',
emptyStartPage: '空启动页',
t2i: '文生图',
i2i: '图生图',
saveButtonSavesTo: '保存 (save)',
extra: '附加 (extra)',
gridImage: '宫格图',
'i2i-grid': '图生图网格',
image: '图像',
't2i-grid': '文生图宫格',
workingFolder: '工作文件夹',
lang: '语言',
langChangeReload: '重新加载: 一些变化可能需要在重新加载后生效',
openOnTheRight: '在右边打开',
openInNewTab: '在新标签打开',
openWithWalkMode: '使用 Walk 模式打开',
longPressOpenContextMenu: '支持使用长按打开右键菜单',
searchResults: '搜索结果',
imgSearch: '图像搜索',
onlyFoldersAndImages: '只显示文件夹和图像',
send2savedDir: '发送到保存的文件夹',
unknownSavedDir: '找不到保存的文件夹配置文件中的outdir_save字段',
Model: '模型',
Sampler: '采样器',
lora: 'LoRA',
size: '尺寸',
pos: '正面提示',
generateIndexHint: '生成索引用于搜索图像',
UpdateIndex: '更新索引',
needGenerateIdx: '你需要先点击按钮生成索引用于搜索图像\n这个过程可能需要消耗几分钟',
search: '搜索',
custom: '自定义',
add: '新增',
cancel: '取消',
submit: '提交',
existInOtherType: '已存在于其他类型',
alreadyExists: '已存在',
toggleTag: '切换标签选中 (收藏)',
addCompleted: '添加完成',
removeCompleted: '删除完成',
addedTagToImage: '已添加标签 "{tag}" 到本图片',
removedTagFromImage: '已从本图片上移除 "{tag}" 标签',
openContextMenu: '打开上下文菜单',
copyPrompt: '复制提示',
copyPositivePrompt: '复制正向提示',
refreshCompleted: '刷新完成',
'walk-mode-move-message': '在walk模式下仅允许使用“快速移动”移动位置',
manualExitFullScreen: '你删除了最后一张图片,也许需要你手动退出全屏查看',
copied: '已复制!',
'index.expired': '索引过期,正在自动更新',
'auto.refreshed': '自动刷新完成!',
exactMatch: '完全匹配',
anyMatch: '匹配任意',
exclude: '排除掉',
selectExactMatchTag: '选择完全匹配的 Tag',
selectAnyMatchTag: '可选,选择匹配其中一个或多个的 Tag',
selectExcludeTag: '可选,选择需要排除掉的 Tag',
faq: '常见问题',
autoUpdate: '检测到发生改变自动更新',
'fuzzy-search': '模糊搜索',
'fuzzy-search-placeholder': '输入图像信息或者文件名的一部分来进行搜索',
'fuzzy-search-noResults': '什么都没找到',
openWithLocalFileBrowser: '使用本地文件浏览器打开',
addToSearchScanPathAndQuickMove: '添加到搜索扫描路径和快速移动',
removeFromSearchScanPathAndQuickMove: '从搜索扫描路径和快速移动中移除',
serverKeyRequired: '服务器配置了密匙,你必须提供相同的密匙才能继续使用',
shortcutKey: '快捷键(仅允许在全屏查看下使用)',
shortcutKeyDescription: '点击输入框按下你想使用的按键支持与Shift和Ctrl进行组合',
fullscreenRestriction: '受技术限制,当前拓展不允许删除打开全屏查看时的首张图片。',
clear: '清除',
toggleTagSelection: '切换 "{tag}" 标签选中',
changlog: '更新日志',
accessControlModeTips:
'为确保数据安全,您当前正以访问控制模式运行,仅能访问授权文件夹。您可以通过编辑本拓展根目录的下.env文件来调整访问权限设置 (IIB_ACCESS_CONTROL) .如果不存在.env文件, 你可以将.env.example文件复制并重命名为.env',
dontShowAgain: '不再显示',
defaultSortingMethod: '默认排序方法',
defaultViewMode: '默认查看模式',
showPreviewImage: '显示预览图',
copy: '复制',
edit: '编辑',
document: '文档',
multiSelectTips: '您可以按住 Shift、Ctrl 或 Cmd 键,然后单击文件来进行多选删除/移动操作',
copyLocationUrlSuccessMsg: '复制完成,你可以通过复制的链接直接打开当前文件夹',
share: '分享',
dragImageHere: '拖拽图像到这里',
imgCompare: '图像对比',
close: '关闭',
fullscreenview: '全屏查看',
fileName: '文件名',
resolution: '分辨率',
fileSize: '文件大小',
selectAll: '全选',
'tauriLaunchConf.readSdWebuiConfigTitle': '读取Stable Diffusion Webui的配置',
'tauriLaunchConf.readSdWebuiConfigDescription':
'如果你已经安装sd-webui且在sd-webui内安装了本拓展推荐直接使用这个将直接读取配置并且数据共享',
'tauriLaunchConf.selectSdWebuiFolder': '点击选择SD-webui的文件夹',
'tauriLaunchConf.skipThisConfigTitle': '跳过本次配置',
'tauriLaunchConf.skipThisConfigDescription': '所有功能仍将可用,你可以在设置页重置',
'tauriLaunchConf.skipButton': '跳过',
'tauriLaunchConfMessages.configNotFound': '找不到对应配置,检查选择的文件夹是否正确',
'tauriLaunchConfMessages.folderNotFound': '找不到对应文件夹,检查选择的文件夹是否正确',
'tauriLaunchConfMessages.configCompletedMessage': '配置完成,即将重启',
'tauriLaunchConfMessages.firstTimeUserTitle': '看起来你好像是第一次使用, 需要进行一些配置',
inputTargetFolderPath: '输入目标文件夹的绝对路径',
pathDoesNotExist: '路径不存在',
confirmToAddToQuickMove:
'确定添加?如果文件夹过大将会消耗过多时间建立索引。(如果不需要了你可以在文件夹右上角的更多里面移除)',
clientSpecificSettings: '客户端特有的设置',
initiateSoftwareStartupConfig: '初始化软件启动配置',
gridCellWidth: '网格单元宽度 (px)',
defaultGridCellWidth: '默认网格单元宽度 (px)',
thumbnailResolution: '缩略图分辨率 (px)',
livePreview: '实时预览',
other: '其他',
ImageBrowsingSettings: '图像浏览设置',
majorUpdateCustomCellSizeTips: `重大更新:你可以自定义网格图像的大小了,在全局设置页或者右上角的“更多”里面进行调整`,
desktop: '桌面',
move: '移动',
inputFolderName: '输入文件夹名',
createFolder: '创建文件夹',
sendToThirdPartyExtension: '发送到第三方拓展',
lyco: 'LyCORIS',
batchDownloaDDragAndDropHint:
'使用拖拽或者右键菜单中的“发送到批量下载”将其他页面的图片添加到这里,支持多选',
zipDownload: '打包成zip下载',
archive: '归档',
batchDownload: '批量下载',
remove: '移除',
secretKeyRequiredWarnMsg: `为了安全考虑,你必须为本拓展单独配置Secret Key,具体参考本拓展根目录下的.env.example文件内的IIB_SECRET_KEY。
gradio-auth`,
secretKeyMustBeConfigured: '必须配置Secret Key',
deleteOneOnlySkipConfirm: '删除单个文件时不进行确认',
resetOnGlobalSettingsPage: '你可以在全局设置页重置',
privacyAndSecurity: '安全与隐私',
dragToResizePanel: '按住并拖动来调整面板的大小',
clickToToggleMaximizeMinimize: '单击切换最大化/最小化',
dragToMovePanel: '按住并拖动来移动面板',
imageCompareTips: '拖拽文件时也会出现这个面板,可以不需要打开 “图像对比” 功能'
}

199
vue/src/i18n/zh-hant.ts Normal file
View File

@ -0,0 +1,199 @@
import type { IIBI18nMap } from '.'
export const zhHant: IIBI18nMap = {
errorOccurred: '發生了個錯誤',
useThumbnailPreview: '使用縮圖預覽',
gridThumbnailWidth: '網格縮圖寬度',
start: '開始',
tip: '提示',
sortByDateAscending: '修改日期昇序',
sortByDateDescending: '修改日期降序',
sortByCreatedDateAscending: '創建日期昇序',
sortByCreatedDateDescending: '創建日期降序',
sortByNameAscending: '名稱昇序',
sortByNameDescending: '名稱降序',
sortBySizeAscending: '大小昇序',
sortBySizeDescending: '大小降序',
inputAddressAndPressEnter: '輸入地址回車',
go: '前往',
unknownError: '未知錯誤',
loadingNextFolder: '即將載入下一個文件夾的文件',
moveFailedCheckPath: '移動失敗,檢查你的路徑輸入',
detailList: '詳情列表',
previewGrid: '預覽網格',
moveSelectedFilesTo: '下列文件 移動 / 複製 至',
confirm: '確定',
download: '下載',
local: '本地',
sendImageFailed: '發送圖像失敗,請攜帶console的錯誤訊息找開發者',
confirmDelete: '確認刪除?',
deleteSuccess: '刪除成功',
doubleClickToCopy: '雙擊複製',
root: '根',
drive: '磁碟',
refresh: '重新整理',
quickMove: '快速移動',
more: '更多',
viewMode: '檢視模式',
sortingMethod: '排序方法',
copyPath: '複製路徑',
deleteSelected: '刪除',
previewInNewWindow: '在新窗口預覽',
copySourceFilePreviewLink: '複製源文件預覽連結',
viewGenerationInfo: '檢視生成信息(提示等)',
sendToTxt2img: '发送到文生圖',
sendToImg2img: '發送到圖生圖',
sendToInpaint: '發送到局部重繪',
sendToControlNet: '發送到ControlNet',
sendToBatchDownload: '發送到批量下載',
sendToExtraFeatures: '發送到附加功能',
loadNextPage: '載入下一頁',
localFile: '本地檔案',
globalSettings: '全域設定',
welcome: '歡迎',
openInNewWindow: '在新頁面打開',
restoreLastRecord: '還原上次記錄',
launch: '啟動',
walkMode: '使用 Walk 模式瀏覽圖片',
launchFromQuickMove: '從快速移動啟動',
recent: '最近',
emptyStartPage: '空啟動頁',
t2i: '文生圖',
i2i: '圖生圖',
saveButtonSavesTo: '儲存 (save)',
extra: '附加 (extra)',
gridImage: '網格式圖',
'i2i-grid': '圖生圖網格',
image: '圖片',
't2i-grid': '文生圖網格',
workingFolder: '工作文件夾',
lang: '語言',
langChangeReload: '重新載入: 一些變化可能需要在重新載入後生效',
openOnTheRight: '在右邊打開',
openInNewTab: '在新分頁打開',
openWithWalkMode: '使用 Walk 模式打開',
longPressOpenContextMenu: '支持使用長按打開右鍵功能表',
searchResults: '搜尋結果',
imgSearch: '圖片搜尋',
onlyFoldersAndImages: '只顯示文件夾和圖片',
send2savedDir: '發送到儲存的文件夾',
unknownSavedDir: '找不到儲存的文件夾(配置文件中的outdir_save欄位)',
Model: '模型',
Sampler: '採樣器',
lora: 'LoRA',
size: '尺寸',
pos: '正面提示',
generateIndexHint: '生成索引用於搜尋圖片',
UpdateIndex: '更新索引',
needGenerateIdx: '你需要先點擊按鈕生成索引用於搜尋圖片\n這個過程可能需要消耗幾分鐘',
search: '搜尋',
custom: '自定義',
add: '新增',
cancel: '取消',
submit: '提交',
existInOtherType: '已存在於其他類型',
alreadyExists: '已存在',
toggleTag: '切換標籤選中 (收藏)',
addCompleted: '新增完成',
removeCompleted: '移除完成',
addedTagToImage: '已添加標籤 "{tag}" 到本圖片',
removedTagFromImage: '已從本圖片上移除 "{tag}" 標籤',
openContextMenu: '打開上下文功能表',
copyPrompt: '複製提示',
copyPositivePrompt: '複製正向提示',
refreshCompleted: '重新整理完成',
'walk-mode-move-message': '在walk模式下僅允許使用“快速移動”移動位置',
manualExitFullScreen: '你刪除了最後一張圖片,也許需要你手動退出全螢幕檢視',
copied: '已複製!',
'index.expired': '索引過期,正在自動更新',
'auto.refreshed': '自動重新整理完成!',
exactMatch: '完全匹配',
anyMatch: '匹配任意',
exclude: '排除掉',
selectExactMatchTag: '選擇完全匹配的 Tag',
selectAnyMatchTag: '可選,選擇匹配其中一個或多個的 Tag',
selectExcludeTag: '可選,選擇需要排除掉的 Tag',
faq: '常見問題',
autoUpdate: '檢測到發生改變自動更新',
'fuzzy-search': '模糊搜尋',
'fuzzy-search-placeholder': '輸入圖片信息或者文件名的一部分來進行搜尋',
'fuzzy-search-noResults': '什麼都沒找到',
openWithLocalFileBrowser: '使用本地檔案瀏覽器打開',
addToSearchScanPathAndQuickMove: '加入搜尋掃描路徑和快速移動',
removeFromSearchScanPathAndQuickMove: '從搜尋掃描路徑和快速移動中移除',
serverKeyRequired: '伺服器配置了密鑰,你必须提供相同的密鑰才能繼續使用',
shortcutKey: '快速鍵(僅允許在全螢幕檢視下使用)',
shortcutKeyDescription: '點擊輸入框按下你想使用的按鍵,支持與Shift和Ctrl進行組合',
fullscreenRestriction: '受技術限制,目前拓展不允許刪除打開全螢幕檢視時的首張圖片。',
clear: '清除',
toggleTagSelection: '切換 "{tag}" 標籤選中',
changlog: '更新紀錄',
accessControlModeTips:
'為確保數據安全,您目前正以訪問控制模式運行,僅能訪問授權文件夾。您可以通過編輯本拓展根目錄的下.env文件來調整訪問權限設置 (IIB_ACCESS_CONTROL) .如果不存在.env文件, 你可以將.env.example文件複製並重命名為.env',
dontShowAgain: '不再顯示',
defaultSortingMethod: '默認排序方法',
defaultViewMode: '默認檢視模式',
showPreviewImage: '顯示預覽圖',
copy: '複製',
edit: '編輯',
document: '文件',
multiSelectTips: '您可以按住Shift、Ctrl或 Cmd鍵,然後單擊文件來進行多選刪除/移動操作',
copyLocationUrlSuccessMsg: '複製完成,你可以通過複製的url直接打開目前文件夾',
share: '分享',
dragImageHere: '拖拽圖片到這裡',
imgCompare: '圖片對比',
close: '關閉',
fullscreenview: '全屏查看',
fileName: '文件名稱',
resolution: '解析度',
fileSize: '文件大小',
selectAll: '全選',
'tauriLaunchConf.readSdWebuiConfigTitle': '讀取Stable Diffusion Webui的配置',
'tauriLaunchConf.readSdWebuiConfigDescription':
'如果你已經安裝sd-webui,且在sd-webui內安裝了本拓展,推薦直接使用這個,將直接讀取配置並且數據共享',
'tauriLaunchConf.selectSdWebuiFolder': '點擊選擇SD-webui的文件夾',
'tauriLaunchConf.skipThisConfigTitle': '跳過本次配置',
'tauriLaunchConf.skipThisConfigDescription': '所有功能仍將可用,你可以在設置頁重置',
'tauriLaunchConf.skipButton': '跳過',
'tauriLaunchConfMessages.configNotFound': '找不到對應配置,檢查選擇的文件夾是否正確',
'tauriLaunchConfMessages.folderNotFound': '找不到對應文件夾,檢查選擇的文件夾是否正確',
'tauriLaunchConfMessages.configCompletedMessage': '配置完成,即將重啟',
'tauriLaunchConfMessages.firstTimeUserTitle': '看起來你好像是第一次使用,需要進行一些配置',
inputTargetFolderPath: '輸入目標文件夾的絕對路徑',
pathDoesNotExist: '路徑不存在',
confirmToAddToQuickMove:
'確定添加?如果文件夾過大將會消耗過多時間建立索引。(如果不需要了你可以在文件夾右上角的更多裡面移除)',
clientSpecificSettings: '客戶端特有的設置',
initiateSoftwareStartupConfig: '初始化軟件啟動配置',
gridCellWidth: '網格單元寬度 (px)',
defaultGridCellWidth: '默認網格單元寬度 (px)',
thumbnailResolution: '縮圖解析度 (px)',
livePreview: '實時預覽',
other: '其他',
ImageBrowsingSettings: '圖片瀏覽設置',
majorUpdateCustomCellSizeTips:
'重大更新:你可以自定義網格圖像的大小了,在全域設置頁或者右上角的“更多”裡面進行調整',
desktop: '桌面',
move: '移動',
inputFolderName: '輸入文件夾名稱',
createFolder: '新增文件夾',
sendToThirdPartyExtension: '發送到第三方拓展',
lyco: 'LyCORIS',
batchDownloaDDragAndDropHint:
'使用拖拽或者右鍵功能表中的“發送到批量下載”將其他頁面的圖片添加到這裡,支持多選',
zipDownload: '打包成zip下載',
archive: '歸檔',
batchDownload: '批量下載',
remove: '移除',
secretKeyRequiredWarnMsg:
'為了安全考慮,你必須為本拓展單獨配置Secret Key,具體參考本拓展根目錄下的.env.example文件內的IIB_SECRET_KEY。 這項警告只會在配置了gradio-auth時出現',
secretKeyMustBeConfigured: '必須配置Secret Key',
deleteOneOnlySkipConfirm: '刪除單個文件時不進行確認',
resetOnGlobalSettingsPage: '你可以在全域設置頁重置',
privacyAndSecurity: '安全與隱私',
dragToResizePanel: '按住並拖動來調整面板的大小',
clickToToggleMaximizeMinimize: '單擊切換最大化/最小化',
dragToMovePanel: '按住並拖動來移動面板',
imageCompareTips: '拖拽文件時也會出現這個面板,可以不需要打開 “圖片對比” 功能'
}

View File

@ -79,7 +79,7 @@ useGlobalEventListen('searchIndexExpired', () => info.value && (info.value.expir
<div class="container" ref="stackViewEl">
<div class="search-bar" v-if="info">
<a-input v-model:value="substr" :placeholder="$t('fuzzy-search-placeholder')" :disabled="!queue.isIdle"
@keydown.enter="query" />
@keydown.enter="query" allow-clear />
<AButton @click="onUpdateBtnClick" :loading="!queue.isIdle" type="primary" v-if="info.expired || !info.img_count">
{{ info.img_count === 0 ? $t('generateIndexHint') : $t('UpdateIndex') }}</AButton>
<AButton v-else type="primary" @click="query" :loading="!queue.isIdle" :disabled="!substr">{{

View File

@ -28,7 +28,7 @@ export const sortMethods = Object.values(SortMethod) as SortMethod[]
export const sortMethodConv: SearchSelectConv<SortMethod> = {
value: (v) => v,
text: (v) => t('sortBy') + ' ' + sortMethodMap()[v].toLocaleLowerCase()
text: (v) => sortMethodMap()[v].toLocaleLowerCase()
}
type FileList = FileNodeInfo[]

View File

@ -25,7 +25,7 @@ import * as Path from '@/util/path'
import type Progress from 'nprogress'
// @ts-ignore
import NProgress from 'multi-nprogress'
import { Button, Checkbox, Modal, message, notification } from 'ant-design-vue'
import { Button, Checkbox, Modal, message } from 'ant-design-vue'
import type { MenuInfo } from 'ant-design-vue/lib/menu/src/interface'
import { t } from '@/i18n'
import { DatabaseOutlined } from '@/icon'
@ -149,7 +149,7 @@ export interface Page {
curr: string
}
/**
*
*
* @param props
* @returns
*/
@ -178,7 +178,7 @@ export function usePreview () {
if (props.value.walkModePath) {
if (!canPreview('next') && canLoadNext) {
message.info(t('loadingNextFolder'))
eventEmitter.value.emit('loadNextDir', true) // 如果在全屏预览时外面scroller可能还停留在很久之前使用全屏预览的索引
eventEmitter.value.emit('loadNextDir', true) // 如果在全屏查看时外面scroller可能还停留在很久之前使用全屏查看的索引
}
}
}
@ -523,8 +523,10 @@ export function useLocation () {
isLocationEditing.value = false
}
useWatchDocument('click', () => {
isLocationEditing.value = false
useWatchDocument('click', (e) => {
if (!(e.target as HTMLElement)?.className.includes('ant-input')) {
isLocationEditing.value = false
}
})
const share = () => {
@ -881,13 +883,8 @@ export function useFileItemActions (
spinning.value = true
await setImgPath(file.fullpath) // 设置图像路径
imgTransferBus.postMessage({ ...preset, event: 'click_hidden_button', btnEleId: 'iib_hidden_img_update_trigger' }) // 触发图像组件更新
const warnId = setTimeout(
() => notification.warn({ message: t('long_loading'), duration: 20 }),
5000
)
// ok(await genInfoCompleted(), 'genInfoCompleted timeout') // 等待消息生成完成
await genInfoCompleted() // 等待消息生成完成
clearTimeout(warnId)
imgTransferBus.postMessage({ ...preset, event: 'click_hidden_button', btnEleId: `iib_hidden_tab_${tab}` }) // 触发粘贴
} catch (error) {
console.error(error)

View File

@ -118,7 +118,7 @@ watch(
</div>
<div class="breadcrumb" :style="{ flex: isLocationEditing ? 1 : '' }" v-else>
<AInput v-if="isLocationEditing" style="flex: 1" v-model:value="locInputValue" @click.stop
@press-enter="onLocEditEnter"></AInput>
@press-enter="onLocEditEnter" allow-clear></AInput>
<a-breadcrumb style="flex: 1" v-else>
<a-breadcrumb-item v-for="(item, idx) in stack" :key="idx">
<a @click.prevent="back(idx)">{{ item.curr === '/' ? $t('root') : item.curr.replace(/:\/$/, $t('drive'))

View File

@ -18,7 +18,12 @@ const langChanged = ref(false)
const reload = async () => {
window.location.reload()
}
const langs: { text: string, value: string }[] = [{ value: 'en', text: 'English' }, { value: 'zh', text: '中文' }, { value: 'de', text: 'Deutsch' }]
const langs: { text: string, value: string }[] = [
{ value: 'en', text: 'English' },
{ value: 'zhHans', text: '简体中文' },
{ value: 'zhHant', text: '繁體中文' },
{ value: 'de', text: 'Deutsch' }
]
const onShortcutKeyDown = (e: KeyboardEvent, key: keyof Shortcut) => {
const keysStr = getShortcutStrFromEvent(e)
if (keysStr) {
@ -35,11 +40,11 @@ const oninitTauriLaunchConf = async () => {
<template>
<div class="panel">
<a-select v-if="false" />
<a-form>
<h2 style="margin-top: 0;">{{ t('ImageBrowsingSettings') }}</h2>
<ImageSetting/>
<h2>{{ t('other') }}</h2>
<h2 style="margin-top: 0;">{{ t('ImageBrowsingSettings') }}</h2>
<ImageSetting />
<h2>{{ t('other') }}</h2>
<a-form-item :label="$t('onlyFoldersAndImages')">
<a-switch v-model:checked="globalStore.onlyFoldersAndImages" />
</a-form-item>
@ -58,7 +63,7 @@ const oninitTauriLaunchConf = async () => {
t('langChangeReload')
}}</a-button>
</a-form-item>
<a-form-item :label="$t(key + 'SkipConfirm')" v-for="_,key in globalStore.ignoredConfirmActions" :key="key">
<a-form-item :label="$t(key + 'SkipConfirm')" v-for="_, key in globalStore.ignoredConfirmActions" :key="key">
<ACheckbox v-model:checked="globalStore.ignoredConfirmActions[key]"></ACheckbox>
</a-form-item>
<h2>{{ t('shortcutKey') }}</h2>