From eb91f1868333c3660c40e38ff7c50f6379bef92c Mon Sep 17 00:00:00 2001 From: Dillon Date: Mon, 5 Oct 2026 16:12:49 +0800 Subject: [PATCH] fix(i18n): complete Simplified Chinese UI translations --- docs/qa-evidence/zh-cn-i18n/after.png | Bin 0 -> 49807 bytes docs/qa-evidence/zh-cn-i18n/before.png | Bin 0 -> 50071 bytes .../app/e2e/browser/settings-i18n.spec.ts | 7 + packages/app/src/i18n/resources.test.ts | 28 +- .../app/src/i18n/resources/plugin-settings.ts | 10 +- packages/app/src/i18n/resources/zh-CN.ts | 1272 +++++++++-------- 6 files changed, 705 insertions(+), 612 deletions(-) create mode 100644 docs/qa-evidence/zh-cn-i18n/after.png create mode 100644 docs/qa-evidence/zh-cn-i18n/before.png diff --git a/docs/qa-evidence/zh-cn-i18n/after.png b/docs/qa-evidence/zh-cn-i18n/after.png new file mode 100644 index 0000000000000000000000000000000000000000..a84d224c5f82aaab3f103c8d39a9724fd9416c5b GIT binary patch literal 49807 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ୟ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 TH+szU8>yzGshEAu^67s8tlsjZ literal 0 HcmV?d00001 diff --git a/docs/qa-evidence/zh-cn-i18n/before.png b/docs/qa-evidence/zh-cn-i18n/before.png new file mode 100644 index 0000000000000000000000000000000000000000..4c11f7cc826758e0c0bf1a23e3164481c962840b GIT binary patch literal 50071 zcmb@uby$?`*DgGW;-eANh>LBg0ys(ba$un2o@kMjRMjgLl213-5ruMz|dXa z8vK68e)m3({qBEW{~1x{j_bbGTIV{?bKM_a$%qkMq_~JcAc(|YK9@%z&cR>LbpCS& zJ|0s`;2{u~5#rCED7wThjh)vdbv`~>)6Vj5hjtK-ECn!;(P(-E+^~R`LQ)&eJ22B8q3ZBnAgI@*hs@wL2R{8oqJuF#h;V zPA>nW^B6&Z`y4!b<^k@rhW@e-?obGxH~;4$N<;BnmWKnbTxt9MeOSCAG4TN_YgLiF znv;{2o12lS=v>uK`vtX;f5nM-_Xko|R5-7&gl4N3-{7-r+#+yZ z>{pXt<2Ih1V^co;T3S~dfiCw^iTQwNIyvKZ``3r!mJPq-+M1g3;{{x7P7)IzFUG%p z`!ux4Aj-kX>FVD#<+W45bLsj%8^`aMrnBF-xYg8@E}`^3JWNA7$9kBnGNax+wOy;q z&G*wM$>NmjY?|MDOet>{Nf=J?BHee`jt+L@PS0K%>_(uQ)V13sc5;D`@TFu+SVJE^ z0pWtawY5$ig@lBJ_dfcSxcG;vsyd;a*7go|LL#D}{OJb0Is(z>ToYyX&Pb~`LBY{n zZJYI(H7_sW?!kQhNZh7FJYF^lb4yQqMNQUS**;BBSt)1?E9zq7?O2eP_t>pIh`QLQ z?FXwy2{oVHVNS*U<a6s!BECV085{ULkv=6HDosbm#6WFaFVaZ|{x)Ic|# z0CjTAART>{j~|o6SBi;vx!2v;)I{>ns>0tDeFuk7Dm0SjbLE(8jZ&SR`&A#mv9lAr zsqyMnsom^wFwOaj@^X)zF^R=Rt#p0|6Yp7x<|xkjnW=?^`+RDrJ1+6M)izUS$eR>m zmVo`fHnofi8kL+Jxd$1By4R$A3ZPU!l8iJ)7&Kiv*}@NSb6 z;jSYsNW+F&x2c9%Ijb0n4Ek)Lm3r>lwb1_Tk=vIi6QZMsQzVPN54I(Uj0_BD7&Q&U zepA-ew7AJ~x9s~*kG3t+>(?1i@27X+`dQtFhRrT1fl~B6>$B!Y?Xjapri1S;MJnfL zGVt{`HFdSOYs)dU8bw(<+1R+OH~B9uFhrOIsdV(`q;!a`b)DOpX#%q-cz|JqOp!bQB&aOObZ zm)<-L;6xd#w!59Dm&RrDKM>NyuCC|)?&^Rz-^fURNF(p7RN(lJ<81!n!ky>8$pilb zspLP0cq>|FT2{6MgV*(MKnfe6Iz zyFLcQ{5-jOgL;*=&Z}37nwn;4TZdl9m2q(j(IoWxY}mp=iJAA)ry&&;F}b-&e%C+G zr4F`(|E^n&<*Nil*1)ZgA0_ymES$%})eY4HM6X@xQnWNSn%g}%;4#1cLndBOO~Ljw zQ~GG6#rr=tFD9<7#WNES5EvL5YWn?KZJ11nc2ixn*}%2z7-d=5Wl|({`oL{QdQWca zHszl?_fEb`T1Ljv&dzL%|0#b@PvM_G?IgDc8#tt{uC&J;^g5}jxhgBSzq|ASliXwg zz4H0HA@LOwF50-3 zjW>xi1SBTbY;F=>sL9D;gAE}g6PS{c(od#))AYd&h?yTU6an?Uy_*WDe|p7<-<+0- zQJ$?!HQ{8sre_KE;~!n=$`6X>h^%-Sxaq(AQyc2}S`kH*t2c18= z%WZx=LncS9@WpA6PnM*0-0f6TE5l;3-K*Q%7fDEhMKhJJ2n&y2xF8<#Z?@Rn>@1{; z;iJgSMv?x|zqdx^NL=Gqb(evG{n4X4yu2dpxsUB~rJA2Lqv+^T)U$nyK7INWoY1~(ZZpuuFJlsr$j!BBYD%_+Pb~91)=)L_TG>0KP`k>>gtYWnr@h$J-b_M zJs}#B7a5s~M9!bYx7KPWbuDb|x5apW*<@x^&+PkKY!26Pp}bi7US3so28&gW2^LKf zf4ahb5S}5Jg-FY-tbF_B%N-mBc)Z*@e^0eo3e~(t!`4NPy9JvV*tGZv%*^iEwF;-B z-OV0Zb+`7|58^U1)l+Y+tgJluH%qV&DFRYu6XY=MEiIX9g+CxBe28ce_%-azY}lpG zHw!;~{Ma5Zw9_tN&Cky-F(0YJrdsLJL=h>_1?6I-8E1Z@!wY77I?=v%3*i1cDR17l=PVm}iq@z=! zz&}s?3U}?F01`|_8d_VQ?4VFruU=i>L7nLDV1;(Z-A`0>j*R=WqSn8Z!QOG6@Lbv3 zASWQA*d3V=PKb*;3i7UGLk~1Hp{Y-H4>r*Xxkz=!`E7Jh14mSRys$x|jVX)j>WhIK zt!y#j?e{|##|Aly7bvSRx;_A%@5C0zu$2GV_6fYGZvp`jKsA zOpJz?*YQU(X4XP%m2>sk$*?d|(;e)X`DD%Ugf~hnj@zK|%Ma-~GPsn{BK32+5cclw z(tRhH$M~z4($W<7yhEF^N;-F2;{-G;4GaydcK_()@)?~RC(P(YS#&2iapSLcB{gii zRT*;d^2%D?=Ce!A%jd4%W|k767h_f&Ux_af_V{Vi*)!jlzmZ)w=tHO0N8K7BuPUm-@d zx0OWPMUy_r+t94ei=araT{Dkb>b#4YjXZfB<*_}Ks;Q}&{B7VCEy8)BbLt(rS5o`_ zT+9pZv%22i-V6*3Ey+t9azTm2|NN5|tDDu_+FBHQ7Z9Xwi`m5*iU3M9d8vW{N!TG_ zwA9&2ovNPHj@$eWgB)thU!zTXj535&ax{azk(LKuhr8mKtjfwt3gv_2gO$w{??^)q zZtiRiWPJDT4oYNcsL+3_ac^U#FjnsL@Hw}93|nGo65a?%dJ(kEUHn*satadOU!7?R zkJ@gacD5caDjOc1Zje=#HB!OhCs_Zx2!(@lSV8xLX8dnthtUBy9%@>Wl96dq`XDWa zCYP476qT(+G>S~t7P^wWP7cU>)vnP?m1qv*N(}ExIo{VyA$%fykq-f}q*^itnoJkCtsj9KU^gra0ef%nu?)gWYa#-4GYn$Qj|9`Hlo?0jJllu6xnk z%=}JEX^2wC!E1dB0TkT*Zg$i4((7q@9ug86!>XmLG3La(>n*vY@Kw#0Hf0}4Nl6B& zuLV|P8HtIB6)V-wTNtv7J{tb|4=Jj=j`lOiHA@{Bg&7$c@88dpj^V*%c^+(QV5+W* zi-!+1cbjm*kNMbv#jW$ix5Gpm0=uZFsQL?K5`;rzVlv?zgOz~6AVWZ3;R^_PWvpTa zotj`VR$lDTJTq~;ZT9^6r+@$5osV}Ht;!c8ig&{d4HX)1WBN8)qd2KOH&-&xSMFn& z$H%oLW>a2m=(sO$Q7CWCi=5Q9wMpao=)|z24mFP~_aFyscZpGx+eY#gi8XwC<_{~-Viu&x8o{pP zdUCYWpBFz~&27lJJQL#BEkbE1Gq)MI918b(^9{+x_NGbwk9fyN*O8IX>=@{oHM8YU-hQjWW9}F>235MXh9qk&@+16?W8A zM!Dl66NxF|O%BbfRa4k?p`kr3?5KM|BFAexb$&!jV$p465$^gDab;;~gBazgQ9826 zzVvA4<}fr|VX%|tsM=mJ6asGr?*mgVkqKL&d*6q&oVU!!%9SRntDt#cMCsDdj7WWb zAd}jo)?aAaGxzIPvm`&@?vm{eZB5NA*m#NK^N5q<9aPl;)}5T~5Elg@UVWniE~|M1 z+U`frDEB8uYFK?&p}oC5`PnaiEL2yzGmW1jgFcf>e%e7@O3 zyGBo^6`|uBV#gqLL&UV3HpPzm`*D!>VcZg$lY$7a*w7GPb+xdUmzTtB)mxEp@1*bF zGbm~7iwliA=olCT`1$E+X>W^oJ#{;C<`9?mN0d7NBrbAONEa{mC@U(a#cgkItLT&! zMKi19c&s<2rl+H!!G!(An{s&2E$OY4!Bn$?I$<|9p0}TG54g=Y$}!&4Gwo09RV_UF z6`=cHF5rDjsH`xnMnJ@~L>ihTQiMrb^`24J_Od|o+LZqa2_?S)c6105;IH;L5s%ec z|Mj#s3gM&8X{hH3eAnzZ7apdpJ5TEKYR+t;dt`;SvK(dOKGwqp2gnQIuimn*EY_=2 zH*Mq@8qo1({v7~CBQ0$kb+o+EU8Y-0evLsU__KN)1#HKYA>)KB4WwQ}V4OrBtI+XY zhxg0rcz3M(@!tH;x;nl>^2gJcZ{MDonR(=O_(&YZfyQFlP_(>Oqm_<}C4dZ!jEyH& zIlM4RaU)1;hI2EHi~T`VLKw`$z(D>j3%xC>m-qym&bGF}MYjE%2 zWMyHtsAv-y09?j*R7tqF3JZ;`KG5dnMSlKFcp<_2Xi-xBe8lnk`a0@x)^O<6B|^g8 z`g(55VZ{v{ zCnc6pT=|0nDBof46BieEvg$vPzPvWgARfqlgAmqLr_kudvPuCwToRGP`}glJyg5&` zKTYkO>r}notOH44)OkXvz^k}ZPFZ<-8TkoyxV~YY^E_TXcR=8g2`*+3h#aV{s#Ojj zuT}~qwDEgu}C=jcw);~1#BC`(~7(yyRsXuF--<|=VL6-P1B;h&k+0_}qA6T_UN;(W%&{cGEg%$19m;NKIy%=lXd3^?RG&tOUS(E1Fxf^TzaY?4ETz*p{d z-kHhmkOYA}^eIy^%FkO(lGmHqI(O0C{X=v3fKkqDRWPDg>BT#@#utWDk-qTs5k4B& zdOX$iVK&rwfGYe9O|Md#65_N2n;Z!IKZ&{jbkqNLZZE)&IV>WAj6CxG>Cw0pd6n?` z7q>J@mfn97Fn(}@i$eOvix(A6!AJXBn_F8-r@v+L5<~67t|hTM7h`BYFLUcbVy?e` z#b#Jon318O_t94O@zH@3`l?n7Kqt}j=iLD%JId$sLi0sVZj4)6xQ~XMv^3Rp0dds9 z4s|T2ad}E=X=!q4>HRx*9uH@#2>U%#Wgtn8h?e-jN0%VuNnwF0WYx3ZWCeJd;&fSBmvh?(>*#UBe|)KwF1 zt&_D!hN>+QSGaSTgoV3wJ6A@W9}mBK_X6(hL%jiHtZ!Tr6dLPmA03Si3*-8G)#_>X2sTz$ z&KranrQG(o3Y)F`1~X~ZmwUYI>?l7a@%`|}Be@eDsTXz1LatI!+zXhQQ8d-?LvQVG zE%G+}`qiWxC&P@}&T+Jg^0VjY?CFf3w7>tv*RCh}ZnOmD)44sPQhj)YC)1 zy5uN)esE|=d}eMAmi}lh2vufuHheRaYDBZn&BMdvhYaNk8l7)B(*DdpaB#@fZTrx* zGB>wlFrS8;O_K%fcDUOmFBLI5lBp6zDc~d>`>4La@9o=rIy&s<5EMMVwP}6hz0v~^ z*EW*9#xYrzBRo-2LjZOAx>uUR7istRcU>YQA|&?%06samG4_->pn^5%y?6DjKV5H2 z(HzaunxP3A)zH)o`RbCAoUEAIbF^&jT~t^I=yR&etk`}|N~hEYu6^{VVnT=pRbikr z<%8!5Xk!k88U6N5z)@9AEow>Q_M^N6dB+q_@fHl*&*c$kaTy$6Zo}NWaeETB`pIH0 zD)i74y|%U%-0YW-U>(+&|yc9SJ^8nR#5o;ZeXbY9T)RZ-!4;`m6lafO?BPI zpV+dml?A;6v~W^a8sc#s;Qzzbx}E*~{o8^r4)g6}u!t+w2e#VU@m(hTp8WkBt+lna zz_C#Qvy+r0V=0-6>zXx^<71S8oYt@Z?6Oi7Bo=skI9dFauI}ShndO1p3A1#g-ukA{ z)PbC_-fWHeyUz&vAFwbm7&nEGg)#(1Mz5CICf&ZhltOE__J?jLQM243rO6;7y9xNS z!);{8eMDzXqgC~2*2`LnXpz-@%!dOSP3 ze|Y%z=zxUBdR&p7*K+trpIM6WP(dG1U-Gw0J}(Uy_oT@^OS$X5X<*Y3DA%oxv?@GZ zuo^zP>ZP7r!gE6 zQ}XA5SV14!)$*z33BJkux4!tZw%bdtjs?yuRPpgtpU87>a2WXXx^r@H^m!Ey#YRMU z%{1DYN*cd_5~eQZ<|Z0Sf0~x9-f1XsD|IL-Se;9!9kAKaO<^L@kZt~vdrHV(iJ4)-q-;c~mx72;b2K02|p#8y>qjyr2> z!VU|ng+^0obX0_v|IM3f&SQN7_r6ETI}Yao8G3kl2AB7c|A5Nnr8eQM01bC7)k0Le84Ki&&`kp z4l*hT0QdE|n%q~~+D~5o6DhV&_Ta{6-byJ?+#*?uz^@$IrQwLZOdeiSnj?5xqXhp0 zwElk%k!FklzEi!}%(Eqe6{%1G##$jdqrKB9oQOU)2kLT+ne+}099;n>XH#R1}3;R*mcO!~o>&EH&YxfC33>94VKJ^ZGs20#=tf zsZq$rfHS1#+bNUnMyfq$zCCOBti*z+`f}O1J=WBpm~v}l<7gqNqt8$_Ua-)1n#Zvw zSzKSh>2tXQ<6TBZzK0LRzpvzIIcZfm;i7x0uA!x+MM1th`OavD(xr0gMJvhK>Z( zeY{;a-@2bqXYZEnl+9B`HYsKHBhARJkoCz7!!GVMSxSa>=}T;ENL1A9%*_1&AH+#W zNH>*GdAu;C^GsuYO^r{Im@KG~Tie_6h)HsKls7Hn;J}{mF#687F zC$p|`29thEf#-Cqv{Cl+RN2azGW|BLOha#_WMw1$GBaaPs9b-sS+dkimo7bf8l7h8 zzSn8Ww8*4Y{=8+njaS43sBOq@?3$&d)Cq|>&xMFo>GAQ8F4Q2rOhde8Aras@%9yFC zsfYv}*T~x(HolGxXI7!H87VgRJoczmN*Lo7gDwI)UWLlbYwYNdt@<~-_YJ5cDc>`R zA5chB1XK;nNJ~dXw@lTE(a>lVTim=$0&C1Z^er+bhWhd(j$FG%Q-R{-wEw4usGm~c zF6+H}-@Q+&Bbq*5EOfiE(f9P}+xfPbA(S_@WCyw@zq)!Hv=oeit83ZpwG#b?oCsD8 zhsA!w>H2K8Akwk_Z~?!6|GtPAbpqgRWu-{~^8BsYxw+S64MY^t0?K&X8yk#F`#O&y zHRaA)g+OOZ?LBIKp@SnTGI9lrWm@Jme(lH~7Zijf{TG<^sNmpYvpy9=L&FHes>(_# z_a(1$2rqHBs@lIGD<-+i1k}fi6v+avS6D7JWxBe$T3O`)tHIr%`=J69Q&6ftel#=B zFn|>M-q+U`={(C=P0mhFNXfst&~>dFJIbei?75E?%OXeOpand3yg|sSu=&)heg>QQh^%pOg-otY|+?4~NsI;OYCB;xZDEMlA zZKABWI5P`N`2jYnK!c8cZpn{G12`C?)~{LGXU%)l^wgJ6_CC_eF(Yi;quPwHE@u%w zZ6R%lp&PF{?|`NvCR(DM|GG-vHL9oJ-+!N{H)99$N8EfeGdI!|@)c48b7wEotx@sW zd9=r(TOzWl1f2eLo6YF$C2a8-9JCiX%o}NGF$ZZ`zag*}%@o9HF_04=m^GlldIUgb zU@?>0{SKKCmH^0VxXm)iy|Tk8Mkg6CB)pg86YZ-Dy|&)@_d0# zQduU7<1Q_&3wHFTj^|c3sf#mqG&DAr!)8)TqHpYZf7X!8gr|MVAam4q#ftKEGBN>v zOz$V7D5%RdRSNbwL80}~3TY)v zlxt~W{^!C4`OZ~ZhE!V;TCjzviHh=!m=g8G5!N8A2=Gd4?}1vSI}Q6?*|!wO;ldvj z*ZPEmaB37SH0j7#_?04)5wA)QMIERh$g3_p#tPgb#)I zDl==JB-YWh4QZ7- zv;%uCEe(|};9tF{%s$LpU*BZC2Ma(@WsxuSq#_T^$IuHVJtGgHkNpyDEGK8!T6k6@ zEjG?k{wg~Qi@m-5jLky*X&;TZ${hBW#!8$5;qcNwt4dZsc_&!*;f!+H+Sof9blclx zWOJ*ltJxa7Y6PUDq?#*8Bnp+FoCz&`sc`zyb+T|*mq*N{)o&4QDoU`WRN zD-MmsA+5&t&t0mHsP9b=HExf6=!~^+{Y)i<-5NN#0wDd`wS!j94z(bia)-U<@XVaD z44{e^RWPvI!f?A) zO@YW_-2Us=?>I>r88#Lc&1#R?e=kh;Vz5g?oD8z@E^SJ#Zf;Q1HFaFey2i%?X%eho zj^FdGO&+*aMz5^@bLT1oE11A^eC!1YkK^X8TfkvptKG3fh4a05NumLtKYX|e<*1mD4;iiJzRiNgyG?*SO zOXcM3yf|J3FgmRQ;t{jZrQgR7QYmI;b7Q;Nmt>qBDufR|M^x*_pT7eZYuaVTi!QEP zC&?usDowh;Y||OtFf%&~a)HgW{@=`VqR*=?X z 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 { await page.getByRole("menuitem", { name: "简体中文 - Simplified Chinese", exact: true }).click(); await expect(page.getByText("默认发送", { exact: true }).first()).toBeVisible(); + await expect(page.getByText(/智能体运行时,Enter/).first()).toBeVisible(); + const screenshotPath = test.info().outputPath("simplified-chinese-settings.png"); + await page.screenshot({ path: screenshotPath, fullPage: true }); + await test.info().attach("simplified-chinese-settings", { + path: screenshotPath, + contentType: "image/png", + }); await page.getByRole("button", { name: "简体中文", exact: true }).click(); await page.getByRole("menuitem", { name: "English - 英语", exact: true }).click(); diff --git a/packages/app/src/i18n/resources.test.ts b/packages/app/src/i18n/resources.test.ts index 46b3428026..4e00a7ccb5 100644 --- a/packages/app/src/i18n/resources.test.ts +++ b/packages/app/src/i18n/resources.test.ts @@ -129,6 +129,32 @@ describe("translation resources", () => { expect(countMatchingEnglishStrings(zhCN)).toBeLessThan(maxFallbackStrings); }); + it("limits Chinese English matches to names, identifiers, and command examples", () => { + const englishStrings = flattenStrings(en); + const chineseStrings = flattenStrings(zhCN); + const matchingKeys = Object.entries(englishStrings) + .filter(([key, value]) => chineseStrings[key] === value) + .map(([key]) => key) + .sort(); + + expect(matchingKeys).toEqual( + [ + "sidebar.help.discord", + "sidebar.help.appName", + "desktop.daemon.status.pid", + "settings.general.language.options.en", + "settings.appearance.theme.options.zinc", + "settings.appearance.theme.options.midnight", + "settings.appearance.theme.options.claude", + "settings.appearance.theme.options.ghostty", + "settings.host.appearance.preview.workspaceName", + "settings.host.terminalProfiles.namePlaceholder", + "settings.host.terminalProfiles.commandPlaceholder", + "settings.host.terminalProfiles.argsPlaceholder", + ].sort(), + ); + }); + it("localizes the pull request empty state in every supported language", () => { for (const resource of [ar, es, fr, ja, ko, ptBR, ru, zhCN]) { expect(resource.panels.pullRequest.emptyTitle).not.toBe(en.panels.pullRequest.emptyTitle); @@ -175,7 +201,7 @@ describe("translation resources", () => { expect(ja.settings.providers.models.many).toBe("{{count}}つのモデル"); expect(ptBR.settings.providers.models.many).toBe("{{count}} modelos"); expect(ru.settings.providers.models.many).toBe("{{count}} моделей"); - expect(zhCN.settings.providers.models.many).toBe("{{count}} 个 Model"); + expect(zhCN.settings.providers.models.many).toBe("{{count}} 个模型"); }); it("preserves reviewed Korean status labels", () => { diff --git a/packages/app/src/i18n/resources/plugin-settings.ts b/packages/app/src/i18n/resources/plugin-settings.ts index 104bf6b1d0..144d35c5b4 100644 --- a/packages/app/src/i18n/resources/plugin-settings.ts +++ b/packages/app/src/i18n/resources/plugin-settings.ts @@ -396,7 +396,15 @@ export const pluginSettings = { }, }, "zh-CN": { - ...shared, + logs: { + action: "日志", + title: "日志:{{id}}", + loading: "正在加载日志…", + refresh: "刷新", + refreshing: "正在刷新…", + errorTitle: "无法加载插件日志", + empty: "暂无插件输出", + }, screens: { open: "打开", offline: "连接到此主机以打开插件设置。", diff --git a/packages/app/src/i18n/resources/zh-CN.ts b/packages/app/src/i18n/resources/zh-CN.ts index d1b5511dd6..ca364718c3 100644 --- a/packages/app/src/i18n/resources/zh-CN.ts +++ b/packages/app/src/i18n/resources/zh-CN.ts @@ -1,4 +1,4 @@ -import { en, type TranslationResources } from "./en"; +import type { TranslationResources } from "./en"; import { pluginSettings } from "./plugin-settings"; export const zhCN: TranslationResources = { @@ -62,9 +62,9 @@ export const zhCN: TranslationResources = { unableToSave: "无法保存", unableToCopy: "无法复制", nameRequired: "名称必填", - daemonUnavailable: "Daemon 不可用", - daemonClientUnavailable: "Daemon client 不可用", - daemonClientDisconnected: "Daemon client 已断开连接", + daemonUnavailable: "守护进程不可用", + daemonClientUnavailable: "守护进程客户端不可用", + daemonClientDisconnected: "守护进程客户端已断开连接", noFileFound: "未找到 {{token}} 对应的文件", unexpectedDictationError: "处理听写时发生意外错误。", }, @@ -83,19 +83,19 @@ export const zhCN: TranslationResources = { close: "关闭菜单", }, commandCenter: { - placeholder: "搜索命令、文件、工作区和 Agent...", + placeholder: "搜索命令、文件、工作区和智能体...", filePlaceholder: "搜索文件...", searchingFiles: "正在搜索文件...", noMatches: "没有匹配项", actions: "操作", files: "文件", workspaces: "工作区", - agents: "Agents", - newAgent: "新建 Agent", + agents: "智能体", + newAgent: "新建智能体", open: "打开{{name}}", openInSidePane: "在侧边面板中打开{{name}}", openInFocusedPane: "在当前窗格中打开{{name}}", - addProject: "添加 project", + addProject: "添加项目", home: "首页", groupByProject: "按项目分组", groupByStatus: "按状态分组", @@ -115,17 +115,17 @@ export const zhCN: TranslationResources = { }, composer: { placeholders: { - desktop: "给 Agent 发消息,标记 @files,或使用 /commands 和 /skills", + desktop: "给智能体发消息,标记 @files,或使用 /commands 和 /skills", mobile: "发消息,@files,/commands", fallback: "输入消息...", - terminal: "Prompt", + terminal: "提示词", }, input: { - accessibilityLabel: "给 Agent 发消息...", - terminalAccessibilityLabel: "Terminal prompt", + accessibilityLabel: "给智能体发消息...", + terminalAccessibilityLabel: "终端提示词", focusHint: "{{shortcut}} 聚焦", addAttachment: "添加附件", - interruptAgent: "中断 Agent", + interruptAgent: "中断智能体", queueMessage: "消息排队", sendAndInterrupt: "发送并中断", sendAndSteer: "发送并引导", @@ -134,8 +134,8 @@ export const zhCN: TranslationResources = { send: "发送", }, cancel: { - cancelingAgent: "正在取消 Agent", - stopAgent: "停止 Agent", + cancelingAgent: "正在取消智能体", + stopAgent: "停止智能体", interrupt: "中断", }, voice: { @@ -148,87 +148,87 @@ export const zhCN: TranslationResources = { unmuteVoice: "取消静音", muteVoice: "静音", dictation: "听写", - interruptBeforeVoice: "启动语音模式前请先中断 Agent", + interruptBeforeVoice: "启动语音模式前请先中断智能体", }, attachments: { addImage: "添加图片", pasteImage: "粘贴图片", - addFile: "Upload file", - addIssueOrPr: "添加 issue 或 PR", - addIssueOrPr_mr: "添加 issue 或 MR", + addFile: "上传文件", + addIssueOrPr: "添加议题或 PR", + addIssueOrPr_mr: "添加议题或 MR", dropImagesHere: "将图片拖放到这里", - dropFilesHere: "Drop files here", + dropFilesHere: "将文件拖到此处", editQueuedMessage: "编辑排队消息", sendQueuedMessageNow: "立即发送排队消息", openImage: "打开图片附件", removeImage: "移除图片附件", - removeFile: "Remove file attachment", + removeFile: "移除文件附件", openGithub: "打开 {{kind}} {{number}}", removeGithub: "移除 {{kind}} {{number}}", element: "元素", openBrowserElement: "打开浏览器元素附件", removeBrowserElement: "移除浏览器元素附件", - openReview: "打开 review 附件", - removeReview: "移除 review 附件", + openReview: "打开审查附件", + removeReview: "移除审查附件", }, errors: { failedToSend: "发送消息失败", - failedToCreateAgent: "创建 Agent 失败", - noHostSelected: "未选择 Host", - initialPromptRequired: "初始 prompt 必填", + failedToCreateAgent: "创建智能体失败", + noHostSelected: "未选择主机", + initialPromptRequired: "初始提示词必填", alreadyLoading: "正在加载", - uploadFailed: "Failed to upload file", + uploadFailed: "上传文件失败", noClipboardImage: "当前剪贴板中没有图片。请尝试通过键盘粘贴。", pasteImageFailed: "无法粘贴图片", - fileTooLarge: "{{fileName}} is too large (max {{size}})", + fileTooLarge: "{{fileName}} 太大(最大 {{size}})", }, clientCommands: { - archiveAgent: "归档当前 Agent", - freshDraft: "归档此 Agent 并开始新的草稿", + archiveAgent: "归档当前智能体", + freshDraft: "归档此智能体并开始新的草稿", }, github: { searching: "正在搜索...", noResults: "没有结果。", - searchPlaceholder: "搜索 issues 和 PRs...", - searchPlaceholder_mr: "搜索 issues 和 MRs...", - title: "附加 issue 或 PR", - title_mr: "附加 issue 或 MR", + searchPlaceholder: "搜索议题和 PR...", + searchPlaceholder_mr: "搜索议题和 MR...", + title: "附加议题或 PR", + title_mr: "附加议题或 MR", }, }, agentControls: { provider: { - fallback: "Provider", - select: "选择 Agent Provider", + fallback: "提供商", + select: "选择智能体提供商", }, thinking: { - title: "Thinking", + title: "思考", unknown: "未知", - extraHigh: "Extra high", - select: "选择 thinking 选项", - selectWithValue: "选择 thinking 选项({{value}})", + extraHigh: "极高", + select: "选择思考选项", + selectWithValue: "选择思考选项({{value}})", }, model: { - unknown: "未知 Model", + unknown: "未知模型", }, features: { - title: "Features", - open: "打开 Agent features", + title: "功能", + open: "打开智能体功能", on: "开启", off: "关闭", }, mode: { - title: "Mode", - searchPlaceholder: "搜索 modes...", - selectWithValue: "选择 Agent mode({{value}})", + title: "模式", + searchPlaceholder: "搜索模式...", + selectWithValue: "选择智能体模式({{value}})", }, hints: { - thinking: "Thinking mode", - model: "切换 Model", + thinking: "思考模式", + model: "切换模型", mode: "更改模式", }, }, agentStream: { - empty: "开始和这个 Agent 对话...", + empty: "开始和这个智能体对话...", scrollToBottom: "滚动到底部", historyLoadFailed: "无法加载智能体历史记录", messageCapped: "此消息已被截断({{bytes}} 字节)。", @@ -237,7 +237,7 @@ export const zhCN: TranslationResources = { approvedPlan: "已批准的计划", canceledPlan: "已取消的计划", - plan: "Plan", + plan: "计划", required: "需要权限", deny: "拒绝", accept: "接受", @@ -248,28 +248,28 @@ export const zhCN: TranslationResources = { }, agentPanel: { states: { - notFound: "未找到 Agent", - failedToLoad: "加载 Agent 失败", + notFound: "未找到智能体", + failedToLoad: "加载智能体失败", reconnecting: "正在重新连接主机", updating: "正在更新消息", - timelineSyncFailed: "无法刷新代理历史记录。", + timelineSyncFailed: "无法刷新智能体历史记录。", timelineSyncRetrying: "正在重试…", - archivingTitle: "正在归档 Agent...", - archivingSubtitle: "请稍候,我们正在归档这个 Agent。", + archivingTitle: "正在归档智能体...", + archivingSubtitle: "请稍候,我们正在归档这个智能体。", }, unavailable: { - selectedHost: "选中的 Host", - unknownHost: "无法打开此 Agent,因为此设备上未配置 {{serverLabel}}。", - addHost: "请在设置中添加 Host,或打开已配置 server 上的 Agent 后继续。", + selectedHost: "选中的主机", + unknownHost: "无法打开此智能体,因为此设备上未配置 {{serverLabel}}。", + addHost: "请在设置中添加主机,或打开已配置服务器上的智能体后继续。", preparingSession: "正在准备 {{serverLabel}} 会话...", connecting: "正在连接 {{serverLabel}}...", - showSoon: "稍后将显示此 Agent。", - showWhenOnline: "Host 在线后将显示此 Agent。", + showSoon: "稍后将显示此智能体。", + showWhenOnline: "主机在线后将显示此智能体。", reconnectingTo: "正在重新连接 {{serverLabel}}...", - showAgainWhenReachable: "Host 可访问后将再次显示此 Agent。", + showAgainWhenReachable: "主机可访问后将再次显示此智能体。", }, archived: { - callout: "此 Agent 已归档", + callout: "此智能体已归档", unarchive: "取消归档", }, }, @@ -308,8 +308,8 @@ export const zhCN: TranslationResources = { attention: "需要注意", }, archiveSheet: { - hostOffline: "Host 离线", - runningAgent: "此 Agent 仍在运行。归档会停止该 Agent。", + hostOffline: "主机离线", + runningAgent: "此智能体仍在运行。归档会停止该智能体。", archive: "归档", }, }, @@ -331,7 +331,7 @@ export const zhCN: TranslationResources = { forkInNewTab: "分叉到新标签页", forkInNewWorkspace: "分叉到新工作区", forkUnavailable: "请更新主机以使用此功能。", - forkMissingWorkspace: "此 Agent 不在工作区中。", + forkMissingWorkspace: "此智能体不在工作区中。", forkFailed: "分叉聊天失败", openFile: "打开文件", copied: "已复制", @@ -391,20 +391,20 @@ export const zhCN: TranslationResources = { }, }, importSession: { - chooseHostTitle: en.importSession.chooseHostTitle, + chooseHostTitle: "从主机导入", title: "导入会话", searchPlaceholder: "搜索会话...", scope: { host: "{{host}} 上的会话", - workspace: "此 workspace", + workspace: "此工作区", }, filters: { all: "全部", }, status: { - connectHost: "连接到 Host 以导入会话", - updateHost: "更新 Host 以导入会话。", - noProviders: "没有已启用的可导入 Provider。", + connectHost: "连接到主机以导入会话", + updateHost: "更新主机以导入会话。", + noProviders: "没有已启用的可导入提供商。", loading: "正在加载最近会话...", failedProvider: "无法加载 {{provider}} 的会话", failedImport: "无法导入所选会话。", @@ -416,7 +416,7 @@ export const zhCN: TranslationResources = { }, preview: { untitledSession: "未命名会话", - noPrompt: "没有 prompt 预览", + noPrompt: "没有提示词预览", }, empty: { noRecent: "没有可导入的最近会话。", @@ -430,30 +430,30 @@ export const zhCN: TranslationResources = { }, workspace: { route: { - loading: "正在加载 workspace", + loading: "正在加载工作区", connecting: "正在连接", hostOffline: "{{hostName}} 已离线", cannotReachHost: "无法连接 {{hostName}}", - hostStatus: "Host 状态:{{status}}", - needsHostUpgrade: "更新你的 Host 以恢复此 workspace", - manageHost: "管理 Host", + hostStatus: "主机状态:{{status}}", + needsHostUpgrade: "更新你的主机以恢复此工作区", + manageHost: "管理主机", recovery: { - archivedTitle: "Workspace 已归档", + archivedTitle: "工作区已归档", restoreDescription: - "恢复 {{workspaceName}} 以返回其中的代理。worktree 将使用分支 {{branch}}。", + "恢复 {{workspaceName}} 以返回其中的智能体。worktree 将使用分支 {{branch}}。", restoreWithoutBranchDescription: - "恢复 {{workspaceName}} 以返回其中的代理。新分支将从保存的基准分支或仓库默认分支创建。", + "恢复 {{workspaceName}} 以返回其中的智能体。新分支将从保存的基准分支或仓库默认分支创建。", unarchiveDescription: "{{workspaceName}} 已归档。取消归档以重新打开。", restoreAction: "恢复", unarchiveAction: "取消归档", - restoringTitle: "正在恢复 workspace", + restoringTitle: "正在恢复工作区", restoringAction: "正在恢复...", - unavailableTitle: "Workspace 不可用", - checkFailedTitle: "无法检查 workspace", + unavailableTitle: "工作区不可用", + checkFailedTitle: "无法检查工作区", }, }, hoverCard: { - scriptsAccessibility: "Workspace scripts", + scriptsAccessibility: "工作区脚本", copyPath: "复制路径", copyBranchName: "复制分支名称", copied: "已复制", @@ -513,7 +513,7 @@ export const zhCN: TranslationResources = { noVisibleFiles: "没有可见文件", }, states: { - unavailable: "Workspace 不可用", + unavailable: "工作区不可用", loading: "正在加载文件...", }, errors: { @@ -531,20 +531,20 @@ export const zhCN: TranslationResources = { }, setup: { descriptor: { - label: "Setup", - completed: "Setup 已完成", - failed: "Setup 失败", - workspace: "Workspace setup", + label: "初始化", + completed: "初始化已完成", + failed: "初始化失败", + workspace: "工作区初始化", blocked: "设置已阻止", }, status: { running: "正在运行", completed: "已完成", failed: "失败", - waiting: "正在等待 setup 输出", + waiting: "正在等待初始化输出", blocked: "已阻止", }, - waiting: "正在 setup workspace...", + waiting: "正在初始化工作区...", blocked: { title: "未运行设置", description: @@ -553,11 +553,11 @@ export const zhCN: TranslationResources = { runFailed: "运行工作区设置失败", }, empty: { - noCommands: "此 workspace 没有运行 setup 命令。", + noCommands: "此工作区没有运行初始化命令。", }, accessibility: { - noCommands: "此 workspace 没有运行 setup 命令", - log: "Workspace setup 日志", + noCommands: "此工作区没有运行初始化命令", + log: "工作区初始化日志", }, log: { noOutput: "没有输出", @@ -566,7 +566,7 @@ export const zhCN: TranslationResources = { browser: { unavailable: { title: "浏览器仅桌面端可用", - subtitle: "在 Electron 中打开此 workspace 以使用内置浏览器。", + subtitle: "在 Electron 中打开此工作区以使用内置浏览器。", }, session: "浏览器会话 {{browserId}}", controls: { @@ -603,22 +603,22 @@ export const zhCN: TranslationResources = { }, }, terminal: { - hostDisconnected: "Host 未连接", + hostDisconnected: "主机未连接", updateHost: "请更新主机以使用原生终端渲染器。", - unableToSubscribe: "无法订阅 Terminal", + unableToSubscribe: "无法订阅终端", }, tabs: { loading: "正在加载...", modified: "未保存的更改", - loadingAgentTitle: "正在加载 Agent 标题", + loadingAgentTitle: "正在加载智能体标题", fallback: { - newAgent: "新建 Agent", - setup: "Setup", - workspaceSetup: "Workspace setup", - terminal: "Terminal", + newAgent: "新建智能体", + setup: "初始化", + workspaceSetup: "工作区初始化", + terminal: "终端", browser: "浏览器", - agent: "Agent", - workspace: "Workspace", + agent: "智能体", + workspace: "工作区", }, switcher: { trigger: "切换标签(已打开 {{count}} 个)", @@ -628,9 +628,9 @@ export const zhCN: TranslationResources = { menu: { openFor: "打开 {{label}} 的菜单", copyResumeCommand: "复制恢复命令", - copyAgentId: "复制 Agent ID", - copyTerminalId: "复制 Terminal ID", - copyFilePath: "Copy file path", + copyAgentId: "复制智能体 ID", + copyTerminalId: "复制终端 ID", + copyFilePath: "复制文件路径", rename: "重命名", closeAbove: "关闭上方标签", closeBelow: "关闭下方标签", @@ -638,18 +638,18 @@ export const zhCN: TranslationResources = { closeRight: "关闭右侧标签", closeOthers: "关闭其他标签", moveToMain: "移至主面板", - reloadAgent: "重新加载 Agent", - reloadAgentTooltip: "重新加载 Agent 以更新 skills、MCPs 或登录状态。", + reloadAgent: "重新加载智能体", + reloadAgentTooltip: "重新加载智能体以更新技能、MCPs 或登录状态。", close: "关闭", - renameTerminal: "重命名 Terminal", - renameAgent: "重命名 Agent", + renameTerminal: "重命名终端", + renameAgent: "重命名智能体", }, actions: { newTab: "新建标签页", - newAgent: "新建 Agent", - newTerminal: "新建 Terminal", - preparingTerminal: "正在准备 Terminal 标签", - preparingTerminalTooltip: "正在准备 Terminal...", + newAgent: "新建智能体", + newTerminal: "新建终端", + preparingTerminal: "正在准备终端标签", + preparingTerminalTooltip: "正在准备终端...", newBrowser: "新建浏览器", maximizePane: "最大化窗格", restorePane: "还原窗格", @@ -660,8 +660,8 @@ export const zhCN: TranslationResources = { changes: "更改", files: "文件", pullRequest: "拉取请求", - terminalProfilesMenu: "Terminal profiles", - editTerminalProfiles: "Edit profiles", + terminalProfilesMenu: "终端配置", + editTerminalProfiles: "编辑配置", }, explorerSidebar: { open: "打开侧边面板", @@ -672,16 +672,16 @@ export const zhCN: TranslationResources = { }, toasts: { copyFailed: "复制失败", - agentIdCopiedLabel: "Agent ID", - terminalIdCopiedLabel: "Terminal ID", + agentIdCopiedLabel: "智能体 ID", + terminalIdCopiedLabel: "终端 ID", resumeCommandCopiedLabel: "恢复命令", - filePathCopiedLabel: "File path", + filePathCopiedLabel: "文件路径", resumeIdUnavailable: "恢复 ID 不可用", resumeCommandUnavailable: "恢复命令不可用", - reloadingAgent: "正在重新加载 Agent...", - reloadedAgent: "已重新加载 Agent", - failedToReloadAgent: "重新加载 Agent 失败", - failedToCloseAgent: "关闭 Agent 失败", + reloadingAgent: "正在重新加载智能体...", + reloadedAgent: "已重新加载智能体", + failedToReloadAgent: "重新加载智能体失败", + failedToCloseAgent: "关闭智能体失败", }, confirmations: { unsavedTitle: "未保存的更改", @@ -692,48 +692,47 @@ export const zhCN: TranslationResources = { close: "关闭", cancel: "取消", archive: "归档", - closeTerminalTitle: "关闭 Terminal?", - closeTerminalMessage: "此 Terminal 中任何正在运行的进程都会立即停止。", - archiveRunningAgentTitle: "归档正在运行的 Agent?", - archiveRunningAgentMessage: "此 Agent 仍在运行。归档会停止该 Agent 并关闭标签。", + closeTerminalTitle: "关闭终端?", + closeTerminalMessage: "此终端中任何正在运行的进程都会立即停止。", + archiveRunningAgentTitle: "归档正在运行的智能体?", + archiveRunningAgentMessage: "此智能体仍在运行。归档会停止该智能体并关闭标签。", closeTabsLeftTitle: "关闭左侧标签?", closeTabsRightTitle: "关闭右侧标签?", closeOtherTabsTitle: "关闭其他标签?", bulk: { - all: "这会归档 {{agents}} 个 Agent,关闭 {{terminals}} 个 Terminal,并关闭 {{tabs}} 个标签。已关闭 Terminal 中任何正在运行的进程都会立即停止。", + all: "这会归档 {{agents}} 个智能体,关闭 {{terminals}} 个终端,并关闭 {{tabs}} 个标签。已关闭终端中任何正在运行的进程都会立即停止。", agentsAndTerminals: - "这会归档 {{agents}} 个 Agent,并关闭 {{terminals}} 个 Terminal。已关闭 Terminal 中任何正在运行的进程都会立即停止。", + "这会归档 {{agents}} 个智能体,并关闭 {{terminals}} 个终端。已关闭终端中任何正在运行的进程都会立即停止。", terminalsAndTabs: - "这会关闭 {{terminals}} 个 Terminal,并关闭 {{tabs}} 个标签。已关闭 Terminal 中任何正在运行的进程都会立即停止。", - agentsAndTabs: "这会归档 {{agents}} 个 Agent,并关闭 {{tabs}} 个标签。", - terminals: - "这会关闭 {{terminals}} 个 Terminal。已关闭 Terminal 中任何正在运行的进程都会立即停止。", + "这会关闭 {{terminals}} 个终端,并关闭 {{tabs}} 个标签。已关闭终端中任何正在运行的进程都会立即停止。", + agentsAndTabs: "这会归档 {{agents}} 个智能体,并关闭 {{tabs}} 个标签。", + terminals: "这会关闭 {{terminals}} 个终端。已关闭终端中任何正在运行的进程都会立即停止。", tabs: "这会关闭 {{tabs}} 个标签。", - agents: "这会归档 {{agents}} 个 Agent。", + agents: "这会归档 {{agents}} 个智能体。", }, }, }, header: { actions: { - workspaceActions: "Workspace 操作", - newAgent: "新建 Agent", - newTerminal: "新建 Terminal", + workspaceActions: "工作区操作", + newAgent: "新建智能体", + newTerminal: "新建终端", newBrowser: "新建浏览器标签", importSession: "导入会话", - copyPath: "复制 workspace 路径", + copyPath: "复制工作区路径", copyBranchName: "复制分支名称", - showSetup: "显示 setup", + showSetup: "显示初始化", }, toasts: { - workspacePathUnavailable: "Workspace 路径尚不可用", + workspacePathUnavailable: "工作区路径尚不可用", branchNameUnavailable: "分支名称不可用", - terminalQueued: "正在准备 workspace,Terminal 准备好后会打开...", - workspacePathCopiedLabel: "Workspace 路径", + terminalQueued: "正在准备工作区,终端准备好后会打开...", + workspacePathCopiedLabel: "工作区路径", branchNameCopiedLabel: "分支名称", }, }, scripts: { - title: "Scripts", + title: "脚本", actions: { chooseUrl: "选择 URL", copyUrl: "复制 URL", @@ -744,23 +743,23 @@ export const zhCN: TranslationResources = { view: "查看终端", }, accessibility: { - trigger: "Workspace scripts", + trigger: "工作区脚本", openService: "查看 {{scriptName}} 服务", - viewTerminal: "查看 {{scriptName}} Terminal", - runScript: "运行 {{scriptName}} script", + viewTerminal: "查看 {{scriptName}} 终端", + runScript: "运行 {{scriptName}} 脚本", stopScript: "停止 {{scriptName}}", restartScript: "重启 {{scriptName}}", copyUrl: "复制 {{scriptName}} 的 URL", chooseUrl: "选择 {{scriptName}} 的 URL", - script: "{{scriptName}} script", + script: "{{scriptName}} 脚本", }, routes: { public: "反向代理", - paseo: "Memorable", + paseo: "易记地址", direct: "直接地址", }, states: { - exitCode: "exit {{code}}", + exitCode: "退出码 {{code}}", startFailed: "启动 {{scriptName}} 失败", stopFailed: "停止 {{scriptName}} 失败", }, @@ -774,24 +773,24 @@ export const zhCN: TranslationResources = { moreOptions: "更多选项", moreActions: "更多操作", commit: { - label: "Commit", - pending: "正在 commit...", - success: "已 commit", + label: "提交", + pending: "正在提交...", + success: "已提交", }, pull: { - label: "Pull", - pending: "正在 pull...", - success: "已 pull", + label: "拉取", + pending: "正在拉取...", + success: "已拉取", }, push: { - label: "Push", - pending: "正在 push...", - success: "已 push", + label: "推送", + pending: "正在推送...", + success: "已推送", }, pullAndPush: { - label: "Pull 并 push", - pending: "正在 pull 并 push...", - success: "已 pull 并 push", + label: "拉取并推送", + pending: "正在拉取并推送...", + success: "已拉取并推送", }, viewPr: "查看 PR", createPr: { @@ -803,9 +802,9 @@ export const zhCN: TranslationResources = { success_mr: "MR 已创建", }, mergeBranch: { - label: "本地 merge", - pending: "正在 merge...", - success: "已 merge", + label: "本地合并", + pending: "正在合并...", + success: "已合并", }, mergeFromBase: { label: "从 {{baseRef}} 更新", @@ -818,104 +817,104 @@ export const zhCN: TranslationResources = { success: "已归档", }, mergePr: { - squash: "Merge PR (squash)", - merge: "Merge PR (merge)", - rebase: "Merge PR (rebase)", - pending: "正在 merge PR...", - success: "PR 已 merge", - squash_mr: "Merge MR (squash)", - merge_mr: "Merge MR (merge)", - rebase_mr: "Merge MR (rebase)", - pending_mr: "正在 merge MR...", - success_mr: "MR 已 merge", + squash: "合并 PR(压缩)", + merge: "合并 PR(合并提交)", + rebase: "合并 PR(变基)", + pending: "正在合并 PR...", + success: "PR 已合并", + squash_mr: "合并 MR(压缩)", + merge_mr: "合并 MR(合并提交)", + rebase_mr: "合并 MR(变基)", + pending_mr: "正在合并 MR...", + success_mr: "MR 已合并", }, viewPr_mr: "查看 MR", autoMerge: { - enableSquash: "Auto merge (squash)", - enableMerge: "Auto merge (merge)", - enableRebase: "Auto merge (rebase)", - enabled: "Auto-merge 已启用", - enabling: "正在启用 auto-merge...", - disabling: "正在禁用 auto-merge...", - disabled: "Auto-merge 已禁用", + enableSquash: "自动合并(压缩)", + enableMerge: "自动合并(合并提交)", + enableRebase: "自动合并(变基)", + enabled: "自动合并已启用", + enabling: "正在启用自动合并...", + disabling: "正在禁用自动合并...", + disabled: "自动合并已禁用", }, unavailable: { viewPrNoForge: "当前无法查看 {{noun}},因为 {{brand}} 未连接", - pullNoRemote: "此处无法 pull,因为此分支尚未连接到 remote", - pullDirty: "有本地变更时无法 pull,请先 commit 或 stash", - pullUpToDate: "无法 pull,因为此分支已是最新", - pushNoRemote: "此处无法 push,因为此分支尚未连接到 remote", - pushBehind: "暂时无法 push,因为需要先拉取更新的变更", - pushNothing: "无法 push,因为没有新的内容可发送", - pullAndPushNoRemote: "此处无法 pull 并 push,因为此分支尚未连接到 remote", - pullAndPushDirty: "有本地变更时无法 pull 并 push,请先 commit 或 stash", - pullAndPushNoIncoming: "无法 pull 并 push,因为没有需要先 pull 的传入变更", - pullAndPushInSync: "无法 pull 并 push,因为此分支已同步", - pullAndPushNothingToPush: "无法 pull 并 push,因为 pull 之后没有新的内容可发送", + pullNoRemote: "此处无法拉取,因为此分支尚未连接到远程仓库", + pullDirty: "有本地变更时无法拉取,请先提交或暂存", + pullUpToDate: "无法拉取,因为此分支已是最新", + pushNoRemote: "此处无法推送,因为此分支尚未连接到远程仓库", + pushBehind: "暂时无法推送,因为需要先拉取更新的变更", + pushNothing: "无法推送,因为没有新的内容可发送", + pullAndPushNoRemote: "此处无法拉取并推送,因为此分支尚未连接到远程仓库", + pullAndPushDirty: "有本地变更时无法拉取并推送,请先提交或暂存", + pullAndPushNoIncoming: "无法拉取并推送,因为没有需要先拉取的传入变更", + pullAndPushInSync: "无法拉取并推送,因为此分支已同步", + pullAndPushNothingToPush: "无法拉取并推送,因为拉取之后没有新的内容可发送", createPrNoForge: "当前无法创建 {{noun}},因为 {{brand}} 未连接", - createPrNoCommits: "无法创建 PR,因为此分支还没有新的 commit", - mergeNoBase: "无法 merge,因为无法确定 base branch", - mergeDirty: "有本地变更时无法 merge,请先 commit 或 stash", - mergeNothing: "无法 merge,因为此分支没有可 merge 的新内容", - updateNoBase: "无法更新,因为无法确定 base branch", - updateDirty: "有本地变更时无法更新,请先 commit 或 stash", + createPrNoCommits: "无法创建 PR,因为此分支还没有新的提交", + mergeNoBase: "无法合并,因为无法确定基准分支", + mergeDirty: "有本地变更时无法合并,请先提交或暂存", + mergeNothing: "无法合并,因为此分支没有可合并的新内容", + updateNoBase: "无法更新,因为无法确定基准分支", + updateDirty: "有本地变更时无法更新,请先提交或暂存", updateCurrent: "无法更新,因为此分支已与 {{baseRef}} 保持最新", - mergePrNoGithub: "当前无法 merge PR,因为 GitHub 未连接", - archiveNotWorktree: "此处无法归档,因为此 workspace 不是作为 Paseo worktree 创建的", - mergePrNoForge: "当前无法 merge {{noun}},因为 {{brand}} 未连接", - mergePrMissing: "无法 merge PR,因为还没有 pull request", - mergePrDraft: "无法 merge PR,因为 pull request 仍是 draft", - mergePrMerged: "无法 merge PR,因为 pull request 已 merge", - mergePrClosed: "无法 merge PR,因为 pull request 已关闭", - mergePrConflicts: "无法 merge PR,因为 pull request 存在冲突", - mergePrQueue: "此处无法 merge PR,因为此 repository 使用 merge queue", - mergePrNotReady: "{{brand}} 报告 {{noun}} 可 merge 后才能 merge {{noun}}", - autoMergeCannotDisable: "Auto-merge 已启用,但此账号无法禁用", + mergePrNoGithub: "当前无法合并 PR,因为 GitHub 未连接", + archiveNotWorktree: "此处无法归档,因为此工作区不是作为 Paseo worktree 创建的", + mergePrNoForge: "当前无法合并 {{noun}},因为 {{brand}} 未连接", + mergePrMissing: "无法合并 PR,因为还没有拉取请求", + mergePrDraft: "无法合并 PR,因为拉取请求仍是草稿", + mergePrMerged: "无法合并 PR,因为拉取请求已合并", + mergePrClosed: "无法合并 PR,因为拉取请求已关闭", + mergePrConflicts: "无法合并 PR,因为拉取请求存在冲突", + mergePrQueue: "此处无法合并 PR,因为此仓库使用合并队列", + mergePrNotReady: "{{brand}} 报告 {{noun}} 可合并后才能合并 {{noun}}", + autoMergeCannotDisable: "自动合并已启用,但此账号无法禁用", }, toasts: { - failedCommit: "Commit 失败", - failedPull: "Pull 失败", - failedPush: "Push 失败", - failedPullAndPush: "Pull 并 push 失败", + failedCommit: "提交失败", + failedPull: "拉取失败", + failedPush: "推送失败", + failedPullAndPush: "拉取并推送失败", failedCreatePr: "创建 PR 失败", - failedMergePr: "Merge PR 失败", - failedEnableAutoMerge: "启用 auto-merge 失败", - failedDisableAutoMerge: "禁用 auto-merge 失败", - baseRefUnavailable: "Base ref 不可用", - failedMerge: "Merge 失败", - failedMergeFromBase: "从 base merge 失败", + failedMergePr: "合并 PR 失败", + failedEnableAutoMerge: "启用自动合并失败", + failedDisableAutoMerge: "禁用自动合并失败", + baseRefUnavailable: "基准引用不可用", + failedMerge: "合并失败", + failedMergeFromBase: "从基准合并失败", }, archiveWarning: { title: "归档「{{workspaceName}}」?", confirm: "归档", cancel: "取消", - uncommittedChanges: "未 commit 的变更", - uncommittedChangesWithDiff: "未 commit 的变更({{diffStat}})", + uncommittedChanges: "未提交的变更", + uncommittedChangesWithDiff: "未提交的变更({{diffStat}})", addedLine: "新增 {{count}} 行", addedLines: "新增 {{count}} 行", deletedLine: "删除 {{count}} 行", deletedLines: "删除 {{count}} 行", - unpushedCommit: "{{count}} 个未 push 的 commit", - unpushedCommits: "{{count}} 个未 push 的 commit", + unpushedCommit: "{{count}} 个未推送的提交", + unpushedCommits: "{{count}} 个未推送的提交", }, }, diff: { openChangesTab: "打开“更改”标签页", - openDiffTab: "打开 Diff 标签页", + openDiffTab: "打开差异标签页", closeChangesTab: "关闭“更改”标签页", jumpToFile: { title: "跳转到文件", }, binaryFile: "二进制文件", - tooLarge: "Diff 过大,无法显示", - previewTooLargeTitle: "此 diff 过大,无法预览", + tooLarge: "差异过大,无法显示", + previewTooLargeTitle: "此差异过大,无法预览", previewTooLargeDescription: "缩小比较范围即可在此预览", - unified: "Unified diff", - split: "Side-by-side diff", + unified: "统一差异", + split: "并排差异", switchToUnified: "切换到统一差异视图", switchToSplit: "切换到并排差异视图", - options: "Diff 选项", - inlineDiff: "内联 Diff", + options: "差异选项", + inlineDiff: "内联差异", hideWhitespace: "隐藏空白差异", showWhitespace: "显示空白差异", scrollLongLines: "滚动长行", @@ -928,15 +927,15 @@ export const zhCN: TranslationResources = { refresh: "刷新", refreshState: "刷新 git 和 {{brand}} 状态", failedRefresh: "刷新 git 状态失败。", - seeUncommittedChanges: "查看未 commit 的变更", - seeCommittedChanges: "查看已 commit 的变更", - checkingRepository: "正在检查 repository...", - notRepository: "不是 git repository", - diffMode: "Diff 模式", - uncommitted: "未 commit", - committed: "已 commit", + seeUncommittedChanges: "查看未提交的变更", + seeCommittedChanges: "查看已提交的变更", + checkingRepository: "正在检查仓库...", + notRepository: "不是 git 仓库", + diffMode: "差异模式", + uncommitted: "未提交", + committed: "已提交", branchUnknown: "未知", - base: "base", + base: "基准", newFile: "新增", deletedFile: "已删除", modifiedFile: "已修改", @@ -954,9 +953,9 @@ export const zhCN: TranslationResources = { openInEditor: { open: "打开", chooseEditor: "选择编辑器", - openIn: "在 {{target}} 中打开 workspace", + openIn: "在 {{target}} 中打开工作区", openFileIn: "在 {{target}} 中打开 {{fileName}}", - failedOpen: "打开 workspace 失败", + failedOpen: "打开工作区失败", }, pr: { actions: { @@ -972,9 +971,9 @@ export const zhCN: TranslationResources = { runningAccessible: "检查运行中", }, sections: { - checks: "Checks", + checks: "检查", pipeline: "流水线", - reviews: "Reviews", + reviews: "审查", }, empty: { noJobs: "无作业", @@ -984,7 +983,7 @@ export const zhCN: TranslationResources = { }, approvals: "{{given}} / {{required}} 批准", accessibility: { - pullRequest: "Pull request #{{number}}", + pullRequest: "拉取请求 #{{number}}", pullRequest_mr: "合并请求 !{{number}}", checkStatus: { passed: "成功", @@ -998,16 +997,16 @@ export const zhCN: TranslationResources = { }, }, states: { - draft: "Draft", - merged: "已 merge", + draft: "草稿", + merged: "已合并", closed: "已关闭", - open: "Open", + open: "开放", }, activity: { commented: "已评论", approved: "已批准", requestedChanges: "请求修改", - reviewed: "已 review", + reviewed: "已审查", }, time: { justNow: "刚刚", @@ -1016,8 +1015,8 @@ export const zhCN: TranslationResources = { discussion: "讨论主题", }, errors: { - statusLoadFailed: "无法加载 Pull Request 状态", - activityLoadFailed: "无法加载 Pull Request 活动", + statusLoadFailed: "无法加载拉取请求状态", + activityLoadFailed: "无法加载拉取请求活动", }, }, forgeSetup: { @@ -1129,14 +1128,14 @@ export const zhCN: TranslationResources = { title: "已置顶", }, host: { - noHost: "没有 Host", - switchTitle: "切换 Host", - searchPlaceholder: "搜索 Hosts...", + noHost: "没有主机", + switchTitle: "切换主机", + searchPlaceholder: "搜索主机...", }, actions: { - addProject: "添加 project", + addProject: "添加项目", newWorkspace: "新建工作区", - hosts: "Hosts", + hosts: "主机", settings: "设置", closeSidebar: "关闭侧边栏", }, @@ -1160,35 +1159,35 @@ export const zhCN: TranslationResources = { schedules: "计划", }, worktreeSetup: { - title: "设置 worktree scripts", - description: "添加 setup 命令,让新的 worktree 自动安装依赖并完成准备。", - openProjectSettings: "打开 project 设置", + title: "设置 worktree 脚本", + description: "添加初始化命令,让新的 worktree 自动安装依赖并完成准备。", + openProjectSettings: "打开项目设置", }, project: { actions: { - menu: "Project 操作", - openSettings: "打开 project 设置", + menu: "项目操作", + openSettings: "打开项目设置", openNewWindow: "在新窗口中打开", openNewWindowFailed: "无法打开新窗口", - openFolder: "Open in file manager", - openFolderFailed: "Couldn't open folder", - remove: "移除 project", + openFolder: "在文件管理器中打开", + openFolderFailed: "无法打开文件夹", + remove: "移除项目", removing: "正在移除...", }, confirmations: { - removeTitle: "移除 project?", + removeTitle: "移除项目?", removeMessage: "从侧边栏移除「{{projectName}}」?\n\n磁盘上的文件不会被更改。", removeConfirm: "移除", cancel: "取消", }, toasts: { - hostDisconnected: "Host 未连接", - removeFailed: "部分 workspace 移除失败", - updateHostToRemove: "更新 host 以移除 projects。", + hostDisconnected: "主机未连接", + removeFailed: "部分工作区移除失败", + updateHostToRemove: "更新主机以移除项目。", }, empty: { - title: "还没有 projects", - description: "添加 project 以开始", + title: "还没有项目", + description: "添加项目以开始", }, }, workspace: { @@ -1206,14 +1205,14 @@ export const zhCN: TranslationResources = { pending: "等待中: {{count}}", }, actions: { - menu: "Workspace 操作", - newWorkspace: "新建 workspace", + menu: "工作区操作", + newWorkspace: "新建工作区", showMore: "显示更多", showLess: "收起", - createWorkspaceFor: "为 {{projectName}} 新建 workspace", + createWorkspaceFor: "为 {{projectName}} 新建工作区", copyPath: "复制路径", copyBranchName: "复制分支名称", - rename: "重命名 workspace", + rename: "重命名工作区", pin: "置顶", unpin: "取消置顶", archive: "归档", @@ -1223,28 +1222,28 @@ export const zhCN: TranslationResources = { hiding: "正在隐藏...", }, confirmations: { - hideTitle: "隐藏 workspace?", + hideTitle: "隐藏工作区?", hideMessage: "从侧边栏隐藏「{{workspaceName}}」?\n\n磁盘上的文件不会被更改。", hideConfirm: "隐藏", cancel: "取消", }, rename: { - title: "重命名 workspace", + title: "重命名工作区", submit: "重命名", invalidBranchName: "无效的分支名称", }, toasts: { - workspacePathUnavailable: "Workspace 路径不可用", + workspacePathUnavailable: "工作区路径不可用", pathCopied: "路径已复制", branchNameCopied: "分支名称已复制", - hostDisconnected: "Host 未连接", - hideFailed: "隐藏 workspace 失败", + hostDisconnected: "主机未连接", + hideFailed: "隐藏工作区失败", archiveFailed: "归档工作区失败", }, }, }, newWorkspace: { - title: "新建 workspace", + title: "新建工作区", create: "创建", isolation: { local: "本地", @@ -1258,34 +1257,34 @@ export const zhCN: TranslationResources = { }, titlePlaceholder: "标题(可选)", errors: { - hostDisconnected: "Host 未连接", + hostDisconnected: "主机未连接", createWorktreeFailed: "创建 worktree 失败", - composerStateRequired: "Composer 状态必填", + composerStateRequired: "输入框状态必填", selectModel: "请选择模型", }, tooltips: { - project: "Choose the project", - host: "Choose the host", - isolation: "Choose the isolation level", + project: "选择项目", + host: "选择主机", + isolation: "选择隔离级别", startingRef: "选择起始位置", - launch: "Choose what to launch", + launch: "选择启动内容", }, refPicker: { - startingRef: "起始 ref", + startingRef: "起始引用", intoBase: "进入 {{baseRef}}", searching: "正在搜索...", - noMatchingRefs: "没有匹配的 refs。", + noMatchingRefs: "没有匹配的引用。", searchPlaceholder: "搜索分支和 PR", title: "起始位置", }, launch: { - title: "What to launch", - chat: "Chat", - terminal: "Terminal", - manageProfiles: "Manage profiles", - submit: "Launch", - promptPlaceholder: "Prompt {{name}}", - commandPlaceholder: "Run a command, or leave empty for a blank terminal", + title: "启动内容", + chat: "聊天", + terminal: "终端", + manageProfiles: "管理配置", + submit: "启动", + promptPlaceholder: "向 {{name}} 发送提示词", + commandPlaceholder: "输入要运行的命令,或留空以打开空白终端", }, }, desktop: { @@ -1297,37 +1296,52 @@ export const zhCN: TranslationResources = { }, quitting: { title: "正在退出 Paseo...", - detail: "正在停止本地 daemon。", + detail: "正在停止本地守护进程。", }, daemon: { - lifecycle: en.desktop.daemon.lifecycle, - title: "Daemon", + lifecycle: { + owned: "由当前桌面会话启动", + attached: "已连接到现有守护进程", + ownedMessage: "此守护进程由当前桌面会话启动。", + attachedMessage: "此守护进程并非由当前桌面会话启动。", + stopTitle: "停止本地守护进程?", + stopMessage: + "{{ownership}}\n主目录:{{home}}\n监管进程 PID:{{pid}}\n正在运行的智能体任务将被中断。", + stop: "停止守护进程", + stopping: "正在停止…", + stopFailed: "无法停止守护进程", + pauseAttached: "暂停自动管理守护进程?已连接的守护进程将继续运行。", + pause: "暂停管理", + workerUpdated: "工作进程已更新至 {{version}}", + supervisorRefresh: + "正在运行的监管进程仍使用原有代码。需要由启动它的程序将其停止并重新启动,以更新监管进程。", + }, + title: "守护进程", status: { title: "状态", - builtInOnly: "这里只显示内置桌面 daemon", - running: "running", - notRunning: "not running", + builtInOnly: "这里只显示内置桌面守护进程", + running: "运行中", + notRunning: "未运行", pid: "PID {{pid}}", }, management: { - title: "管理内置 daemon", - hint: "让 Paseo 启动和停止内置 daemon", - pauseTitle: "暂停内置 daemon", - pauseMessage: - "这会立即停止内置 daemon。连接到内置 daemon 的运行中 agents 和 terminals 会被停止。", + title: "管理内置守护进程", + hint: "让 Paseo 启动和停止内置守护进程", + pauseTitle: "暂停内置守护进程", + pauseMessage: "这会立即停止内置守护进程。连接到内置守护进程的运行中智能体和终端会被停止。", pauseAndStop: "暂停并停止", registrationFailed: - "内置 daemon 已启动,但 Paseo 无法保存 localhost 连接。请关闭后重新开启 daemon 管理,或手动添加 localhost。", - pausedStopFailed: "内置 daemon 管理已暂停,但 Paseo 无法停止 daemon。", - updateFailed: "无法更新内置 daemon 管理设置。", + "内置守护进程已启动,但 Paseo 无法保存 localhost 连接。请关闭后重新开启守护进程管理,或手动添加 localhost。", + pausedStopFailed: "内置守护进程管理已暂停,但 Paseo 无法停止守护进程。", + updateFailed: "无法更新内置守护进程管理设置。", }, keepRunning: { - title: "退出后保持 daemon 运行", - hint: "退出 Paseo 后 daemon 会继续运行", + title: "退出后保持守护进程运行", + hint: "退出 Paseo 后守护进程会继续运行", }, logs: { title: "日志文件", - modalTitle: "Daemon 日志", + modalTitle: "守护进程日志", unavailable: "日志路径不可用", empty: "(日志文件为空)", copied: "日志路径已复制。", @@ -1337,22 +1351,22 @@ export const zhCN: TranslationResources = { }, fullStatus: { title: "完整状态", - modalTitle: "Daemon 状态", + modalTitle: "守护进程状态", hint: "运行 `paseo daemon status` 并显示输出", view: "查看状态", copied: "状态已复制到剪贴板。", - fetchFailed: "获取 daemon 状态失败:{{message}}", + fetchFailed: "获取守护进程状态失败:{{message}}", }, advancedSettings: "高级设置", - openAdvancedSettings: "打开 daemon 高级设置", - versionMismatch: "App 和 daemon 版本不匹配。请将两者更新到相同版本,以获得最佳体验。", - loadFailed: "无法加载桌面 daemon 状态。", + openAdvancedSettings: "打开守护进程高级设置", + versionMismatch: "应用和守护进程版本不匹配。请将两者更新到相同版本,以获得最佳体验。", + loadFailed: "无法加载桌面守护进程状态。", }, updates: { status: { - checking: "正在检查 app 更新...", - installing: "正在安装 app 更新...", - upToDate: "App 已是最新版本。", + checking: "正在检查应用更新...", + installing: "正在安装应用更新...", + upToDate: "应用已是最新版本。", upToDateWithLastChecked: "已是最新版本。上次检查时间:{{time}}。", pending: "更新准备好后会通知你。", pendingWithLastChecked: "更新准备好后会通知你。上次检查时间:{{time}}。", @@ -1361,13 +1375,13 @@ export const zhCN: TranslationResources = { "发现更新:{{version}}。正在下载... 上次检查时间:{{time}}。", availableWithVersion: "更新已就绪:{{version}}", availableWithVersionAndLastChecked: "更新已就绪:{{version}}。上次检查时间:{{time}}。", - available: "有 app 更新可安装。", - availableWithLastChecked: "有 app 更新可安装。上次检查时间:{{time}}。", - installed: "App 更新已安装。需要重启。", - failed: "App 更新失败。", + available: "有应用更新可安装。", + availableWithLastChecked: "有应用更新可安装。上次检查时间:{{time}}。", + installed: "应用更新已安装。需要重启。", + failed: "应用更新失败。", idle: "尚未检查更新状态。", }, - installError: "无法安装 desktop app 更新。", + installError: "无法安装桌面应用更新。", callout: { installingTitle: "正在安装更新", failedTitle: "更新失败", @@ -1379,7 +1393,7 @@ export const zhCN: TranslationResources = { installingDescription: "正在安装并重启...", versionReady: "{{version}} 已准备好安装。", newVersionReady: "新版本已准备好安装。", - restartWarning: "升级 app 会停止正在运行的 agents,并关闭 terminal 会话。", + restartWarning: "升级应用会停止正在运行的智能体,并关闭终端会话。", }, }, settings: { @@ -1397,27 +1411,27 @@ export const zhCN: TranslationResources = { allowed: "系统已允许通知。", denied: "系统设置中已拒绝通知。", notGranted: "通知权限尚未授予。", - webOnly: "桌面通知状态仅在 web runtime 中可用。", + webOnly: "桌面通知状态仅在网页运行环境中可用。", supported: "支持桌面通知。", unsupported: "此平台不支持桌面通知。", apiUnavailable: "此环境中 Web Notification API 不可用。", - requestsWebOnly: "桌面通知请求仅在 web runtime 中可用。", + requestsWebOnly: "桌面通知请求仅在网页运行环境中可用。", requestUnavailable: "Web Notification API requestPermission() 不可用。", requestFailed: "请求通知权限失败:{{message}}", unexpectedState: "意外的通知权限状态:{{state}}", }, microphone: { - webOnly: "桌面麦克风状态仅在 web runtime 中可用。", + webOnly: "桌面麦克风状态仅在网页运行环境中可用。", navigatorUnavailable: "此环境中 Navigator 不可用。", granted: "已授予麦克风访问权限。", denied: "系统设置中已拒绝麦克风访问。", notGranted: "麦克风权限尚未授予。", unexpectedState: "意外的麦克风权限状态:{{state}}", - statusApiUnavailable: "此 runtime 中麦克风状态 API 不可用。请使用请求来检查访问权限。", + statusApiUnavailable: "此运行环境中麦克风状态 API 不可用。请使用请求来检查访问权限。", queryFailed: "查询麦克风状态失败:{{message}}", captureUnavailable: "此环境中麦克风采集不可用。", permissionApiUnavailable: "权限状态 API 不可用。请使用请求来检查访问权限。", - requestsWebOnly: "桌面麦克风请求仅在 web runtime 中可用。", + requestsWebOnly: "桌面麦克风请求仅在网页运行环境中可用。", captureApiUnavailable: "此环境中麦克风采集 API 不可用。", requestDenied: "用户或系统拒绝了麦克风权限。", noDevice: "未找到麦克风设备。", @@ -1430,7 +1444,7 @@ export const zhCN: TranslationResources = { testNotification: { title: "Paseo 通知测试", body: "如果你能看到这条通知,说明桌面通知可用。", - notDelivered: "通知未送达。请检查 System Settings > Notifications。", + notDelivered: "通知未送达。请检查系统设置 > 通知。", failed: "发送通知失败。", }, }, @@ -1450,15 +1464,15 @@ export const zhCN: TranslationResources = { errorTitle: "出现问题", errorDescription: "本地服务器启动失败。如果持续发生,请在 GitHub 报告问题并附上下方日志。", logs: { - loading: "正在加载 daemon 日志...", - unavailable: "没有可用的 daemon 日志。", - loadFailed: "无法加载 daemon 日志:{{message}}", + loading: "正在加载守护进程日志...", + unavailable: "没有可用的守护进程日志。", + loadFailed: "无法加载守护进程日志:{{message}}", }, }, openProject: { tiles: { addProject: { - title: "添加 project", + title: "添加项目", description: "打开此机器上的文件夹", }, importSession: { @@ -1466,19 +1480,19 @@ export const zhCN: TranslationResources = { description: "导入最近的外部 CLI 会话", }, setupProviders: { - title: "设置 providers", + title: "设置提供商", description: "配置 Claude Code、Codex 等", }, pairDevice: { title: "配对设备", - description: "将手机连接到此 daemon", + description: "将手机连接到此守护进程", }, }, }, projectPicker: { placeholder: "输入以搜索...", browse: "浏览…", - opening: "正在打开 project...", + opening: "正在打开项目...", searching: "正在搜索...", empty: "开始输入路径", errors: { @@ -1494,19 +1508,19 @@ export const zhCN: TranslationResources = { searchPlaceholder: "筛选分支...", empty: "没有找到分支。", title: "切换分支", - uncommittedTitle: "未 commit 的变更", - uncommittedMessage: "你有未 commit 的变更。切换分支前要先 stash 吗?", - stashAndSwitch: "Stash 并切换", - failedToStash: "Stash 变更失败", + uncommittedTitle: "未提交的变更", + uncommittedMessage: "你有未提交的变更。切换分支前要先暂存吗?", + stashAndSwitch: "暂存并切换", + failedToStash: "暂存变更失败", failedToSwitch: "切换分支失败", - restoreStashTitle: "恢复 stashed 变更?", - restoreStashMessage: "此分支有上一会话 stashed 的变更。要恢复它们吗?", + restoreStashTitle: "恢复暂存变更?", + restoreStashMessage: "此分支有上一会话暂存的变更。要恢复它们吗?", restore: "恢复", later: "稍后", - stashRestored: "Stashed 变更已恢复", + stashRestored: "暂存变更已恢复", }, agentAutocomplete: { - searchingWorkspace: "正在搜索 workspace...", + searchingWorkspace: "正在搜索工作区...", loadingCommands: "正在加载 commands...", noFiles: "没有找到文件或目录", noCommands: "没有找到 commands", @@ -1526,14 +1540,14 @@ export const zhCN: TranslationResources = { dialogFilterName: "图片", }, workspaceSetup: { - title: "创建 workspace", + title: "创建工作区", errors: { failedCreateWorktree: "创建 worktree 失败", - failedOpenProject: "打开 project 失败", + failedOpenProject: "打开项目失败", selectModel: "请选择模型", - hostDisconnected: "Host 未连接", - pendingRequired: "没有待处理的 workspace setup", - composerStateRequired: "Workspace setup composer 状态必填", + hostDisconnected: "主机未连接", + pendingRequired: "没有待处理的工作区初始化", + composerStateRequired: "工作区初始化输入框状态必填", }, }, onboarding: { @@ -1544,7 +1558,7 @@ export const zhCN: TranslationResources = { }, }, modelSelector: { - title: "选择 provider", + title: "选择提供商", selectModel: "选择模型", selectedModel: "选择模型({{model}})", loading: "正在加载...", @@ -1553,7 +1567,7 @@ export const zhCN: TranslationResources = { error: "错误", defaultModel: "默认", profiles: "配置文件", - providers: "提供方", + providers: "提供商", model: "模型", editProfiles: "编辑", editProfilesLabel: "编辑智能体配置文件", @@ -1572,9 +1586,9 @@ export const zhCN: TranslationResources = { openProviderSettings: "打开 {{provider}} 设置", }, providerCatalog: { - title: "添加 provider", - search: "搜索 providers", - noProviders: "未找到 providers", + title: "添加提供商", + search: "搜索提供商", + noProviders: "未找到提供商", actions: { add: "添加", adding: "正在添加", @@ -1584,7 +1598,7 @@ export const zhCN: TranslationResources = { installInstructionsFor: "{{provider}} 安装说明", }, errors: { - unableToInstall: "无法安装 provider", + unableToInstall: "无法安装提供商", }, }, providerSelection: { @@ -1595,12 +1609,12 @@ export const zhCN: TranslationResources = { unavailable: "不可用", unknownError: "未知错误", readiness: { - initialPromptRequired: "初始 prompt 必填", - noProviders: "所选 Host 上没有可用的 provider", + initialPromptRequired: "初始提示词必填", + noProviders: "所选主机上没有可用的提供商", modelDefaultsLoading: "模型默认值仍在加载", - noModelAvailable: "所选 provider 没有可用模型", - workspaceDirectoryNotFound: "Workspace 目录未找到", - hostDisconnected: "Host 未连接", + noModelAvailable: "所选提供商没有可用模型", + workspaceDirectoryNotFound: "工作区目录未找到", + hostDisconnected: "主机未连接", }, }, pairing: { @@ -1630,18 +1644,18 @@ export const zhCN: TranslationResources = { }, scanQr: { title: "扫描二维码", - description: "加密 relay 连接。", + description: "加密中继连接。", }, pasteLink: { title: "粘贴配对链接", - description: "加密 relay 连接。", + description: "加密中继连接。", }, }, direct: { title: "直接连接", - helper: "输入 Paseo server 的地址。", + helper: "输入 Paseo 服务器的地址。", fields: { - host: "Host", + host: "主机", port: "端口", password: "密码", optional: "可选", @@ -1663,18 +1677,18 @@ export const zhCN: TranslationResources = { connecting: "正在连接...", }, errors: { - hostRequired: "Host 必填", + hostRequired: "主机必填", invalidPort: "端口必须在 1 到 65535 之间", invalidConnection: "无效连接", failedTitle: "连接失败", failedToConnect: "无法连接到 {{endpoint}}。", noAdditionalDetails: "{{detail}}(未提供更多详情)", - timedOut: "连接超时。请检查 host/port 和网络。", - refused: "连接被拒绝。server 是否正在此地址运行?", - hostNotFound: "未找到 host。请检查主机名后重试。", - hostUnreachable: "Host 不可达。请检查网络和防火墙。", - tlsError: "TLS 错误。只有 daemon 前方有 TLS terminator 时,直接连接才使用 SSL。", - unableToConnect: "无法连接。请检查 host/port,并确认 daemon 可达。", + timedOut: "连接超时。请检查主机和端口 和网络。", + refused: "连接被拒绝。服务器是否正在此地址运行?", + hostNotFound: "未找到主机。请检查主机名后重试。", + hostUnreachable: "主机不可达。请检查网络和防火墙。", + tlsError: "TLS 错误。只有守护进程前方有 TLS 终止代理时,直接连接才使用 SSL。", + unableToConnect: "无法连接。请检查主机和端口,并确认守护进程可达。", details: "详情:{{detail}}", }, }, @@ -1703,14 +1717,14 @@ export const zhCN: TranslationResources = { }, link: { title: "粘贴配对链接", - helper: "粘贴来自 server 的配对链接。", + helper: "粘贴来自服务器的配对链接。", label: "配对链接", errors: { required: "请粘贴配对链接(.../#offer=...)", missingOffer: "链接必须包含 #offer=...", - emptyOffer: "Offer payload 为空", + emptyOffer: "配对数据为空", invalid: "无效的配对链接", - unableToPair: "无法配对 host", + unableToPair: "无法配对主机", }, alert: { failedTitle: "配对失败", @@ -1723,20 +1737,20 @@ export const zhCN: TranslationResources = { }, scan: { title: "扫描二维码", - webUnavailableTitle: "Web 上不可用", - webUnavailableBody: "Web build 不支持二维码扫描。请改用“粘贴链接”。", + webUnavailableTitle: "网页版不可用", + webUnavailableBody: "网页版不支持二维码扫描。请改用“粘贴链接”。", backToSettings: "返回设置", cameraPermissionTitle: "相机权限", - cameraPermissionBody: "允许相机访问,以扫描 daemon 提供的配对二维码。", + cameraPermissionBody: "允许相机访问,以扫描守护进程提供的配对二维码。", grantPermission: "授予权限", pairing: "正在配对...", - unableToPair: "无法配对 host", + unableToPair: "无法配对主机", errorTitle: "错误", }, device: { - loadingOffer: "正在加载配对 offer...", - failedToLoadOffer: "加载配对 offer 失败。", - relayDisabled: "Relay 未启用。启用 relay 后才能配对设备。", + loadingOffer: "正在加载配对邀请...", + failedToLoadOffer: "加载配对邀请 失败。", + relayDisabled: "中继未启用。启用中继后才能配对设备。", enableTitle: "启用中继?", enableDescription: "中继让此设备可以从任何地方连接。配对流量采用端到端加密。", relayDocs: "中继如何工作", @@ -1747,7 +1761,7 @@ export const zhCN: TranslationResources = { directConnectionHint: "不使用中继时,请通过 TCP、Tailscale 或其他 VPN 直接连接。不会生成二维码。", updateRequired: "请更新主机,以便从 Paseo Desktop 启用中继。", - unavailable: "配对 offer 不可用。", + unavailable: "配对邀请 不可用。", hint: "用手机上的 Paseo 扫描此二维码,或复制下方链接。", securityWarning: "请像保管密码一样保管此配对链接。任何获得此链接的人都可以访问此守护进程。", qrUnavailable: "二维码不可用。", @@ -1759,9 +1773,9 @@ export const zhCN: TranslationResources = { }, realtimeVoice: { actions: { - mute: "静音 realtime voice", - unmute: "取消静音 realtime voice", - stop: "停止 realtime voice 并中断 turn", + mute: "静音实时语音", + unmute: "取消静音实时语音", + stop: "停止实时语音并中断回合", }, }, rewind: { @@ -1773,7 +1787,7 @@ export const zhCN: TranslationResources = { both: "回退对话和文件", }, errors: { - failed: "回退 agent 失败", + failed: "回退智能体失败", }, }, diffViewer: { @@ -1788,7 +1802,7 @@ export const zhCN: TranslationResources = { }, downloads: { requestTokenFailed: "请求下载 token 失败。", - hostUnavailable: "下载 Host 不可用。", + hostUnavailable: "下载主机不可用。", cancelled: "下载已取消。", failed: "下载文件失败。", shareFile: "共享文件", @@ -1798,28 +1812,28 @@ export const zhCN: TranslationResources = { backdrop: "菜单背景", }, subagents: { - title: "Subagent", - pillLabelOne: "1 个 subagent", - pillLabelMany: "{{count}} 个 subagent", + title: "子智能体", + pillLabelOne: "1 个子智能体", + pillLabelMany: "{{count}} 个子智能体", pillLabelWorking: "{{count}} 个运行中", pillLabelFailed: "{{count}} 个失败", pillLabelNeedsInputOne: "1 个需要输入", pillLabelNeedsInputMany: "{{count}} 个需要输入", pillLabelReadyToReview: "{{count}} 个待查看", detachAction: "分离 {{label}}", - detachTooltip: "分离 subagent", + detachTooltip: "分离子智能体", archiveAction: "归档 {{label}}", - archiveTooltip: "归档 subagent", - archiveFinishedAction: "归档已完成的 subagent", + archiveTooltip: "归档子智能体", + archiveFinishedAction: "归档已完成的子智能体", archiveFinishedRetry: "重试 ({{failed}}/{{total}})", }, panels: { draft: { - newAgent: "新建 Agent", - creatingAgent: "正在创建 Agent", + newAgent: "新建智能体", + creatingAgent: "正在创建智能体", }, file: { - directoryMissing: "未找到 workspace 目录。", + directoryMissing: "未找到工作区目录。", loading: "正在加载文件...", noPreview: "没有可用预览", binaryPreviewUnavailable: "二进制预览不可用", @@ -1862,12 +1876,12 @@ export const zhCN: TranslationResources = { }, diff: { changesLabel: "更改", - diffLabel: "Diff", + diffLabel: "差异", changesSubtitle: "工作区差异", commitSubtitle: "提交差异", uncommittedSubtitle: "未提交的更改", baseSubtitle: "与 {{baseRef}} 比较", - directoryMissing: "未找到 workspace 目录。", + directoryMissing: "未找到工作区目录。", empty: "没有更改", loadError: "加载差异失败", capabilityMissing: "请更新主机以查看提交差异。", @@ -1876,7 +1890,7 @@ export const zhCN: TranslationResources = { toolCallDetails: { error: "错误", empty: "没有可用的更多详情", - subAgentActivity: "Sub-agent 活动", + subAgentActivity: "子智能体活动", input: "输入", output: "输出", }, @@ -1919,21 +1933,21 @@ export const zhCN: TranslationResources = { accessibilityNoData: "上下文窗口:暂无上下文数据", title: "上下文窗口", used: "已使用 {{percentage}}%", - tokens: "{{used}} / {{max}} tokens", + tokens: "{{used}} / {{max}} 个 token", sessionCost: "会话费用 {{cost}}", accessibility: "上下文窗口已使用 {{percentage}}%", }, review: { comment: { - add: "添加 review 评论", - edit: "编辑 review 评论", - delete: "删除 review 评论", - label: "Review 评论", + add: "添加审查评论", + edit: "编辑审查评论", + delete: "删除审查评论", + label: "审查评论", placeholder: "留下评论", cancel: "取消", - cancelAccessibility: "取消 review 评论", + cancelAccessibility: "取消审查评论", save: "评论", - saveAccessibility: "保存 review 评论", + saveAccessibility: "保存审查评论", }, }, settings: { @@ -1949,10 +1963,10 @@ export const zhCN: TranslationResources = { }, backToWorkspace: "返回", addHost: "添加主机", - enableBuiltInDaemon: "启用内置 daemon", + enableBuiltInDaemon: "启用内置守护进程", projects: "项目", projectList: { - hostLoadFailed: "无法从 Host {{hostName}} 加载 projects:{{message}}", + hostLoadFailed: "无法从主机 {{hostName}} 加载项目:{{message}}", editProject: "编辑 {{projectName}}", }, groupInfo: "关于 {{title}}", @@ -1971,7 +1985,45 @@ export const zhCN: TranslationResources = { diagnostics: "诊断", about: "关于", }, - layout: en.settings.layout, + layout: { + openInSidePane: { + title: "打开位置", + destinations: { + main: "主面板", + side: "侧边面板", + explorer: "资源管理器侧边栏", + }, + sources: { + explorerFiles: { + label: "点击资源管理器侧边栏中的文件", + description: "在当前工作旁打开资源管理器侧边栏中选中的文件", + }, + diffs: { + label: "点击资源管理器侧边栏或聊天中的更改", + description: "在当前工作旁打开资源管理器或智能体对话中的差异", + }, + chatFiles: { + label: "点击智能体聊天中的文件", + description: "在对话旁打开文件链接和工具调用中的文件", + }, + diffFiles: { + label: "点击差异中的文件", + description: "在差异旁打开其中选中的源文件", + }, + subagents: { + label: "点击智能体聊天中的子智能体", + description: "在父智能体旁打开子智能体", + }, + pullRequests: { + label: "点击资源管理器侧边栏中的拉取请求", + description: "在更改旁打开拉取请求详情", + }, + serviceUrls: { + label: "点击脚本的服务 URL", + }, + }, + }, + }, editor: { title: "编辑器", vimKeybindings: "Vim 键位", @@ -1995,12 +2047,12 @@ export const zhCN: TranslationResources = { hostSections: { projects: "项目", connections: "连接", - agents: "Agents", + agents: "智能体", metadata: "元数据", - workspaces: "Workspaces", - providers: "Providers", + workspaces: "工作区", + providers: "提供商", usage: "使用情况", - terminals: "Terminals", + terminals: "终端", plugins: "插件", host: "概览", }, @@ -2035,9 +2087,9 @@ export const zhCN: TranslationResources = { defaultSend: { label: "默认发送", descriptions: { - interrupt: "Agent 运行时,Enter 会中断。Command/Ctrl+Enter 会排队。", - steer: "Agent 运行时,Enter 会引导当前回合。Command/Ctrl+Enter 会排队。", - queue: "Agent 运行时,Enter 会排队。Command/Ctrl+Enter 会提交。", + interrupt: "智能体运行时,Enter 会中断。Command/Ctrl+Enter 会排队。", + steer: "智能体运行时,Enter 会引导当前回合。Command/Ctrl+Enter 会排队。", + queue: "智能体运行时,Enter 会排队。Command/Ctrl+Enter 会提交。", }, options: { interrupt: "中断", @@ -2098,19 +2150,19 @@ export const zhCN: TranslationResources = { playing: "正在播放...", playbackFailed: "播放失败:{{message}}", app: { - title: "App diagnostic", - rowTitle: "App diagnostic", - rowHint: "Collect connection, daemon, provider, desktop, and log details", - run: "Run", - running: "Running diagnostic...", - copyLabel: "diagnostic", - copyAccessibility: "Copy diagnostic", - copyFailed: "Failed to copy diagnostic", - refreshAccessibility: "Refresh diagnostic", - refreshingAccessibility: "Refreshing diagnostic", + title: "应用诊断", + rowTitle: "应用诊断", + rowHint: "收集连接、守护进程、提供商、桌面端和日志详情", + run: "运行", + running: "正在运行诊断...", + copyLabel: "诊断信息", + copyAccessibility: "复制诊断信息", + copyFailed: "复制诊断信息失败", + refreshAccessibility: "刷新诊断信息", + refreshingAccessibility: "正在刷新诊断信息", progress: { - client: "Client", - desktop: "Desktop", + client: "客户端", + desktop: "桌面端", }, }, }, @@ -2119,14 +2171,14 @@ export const zhCN: TranslationResources = { appVersion: "应用版本", whatsNewHint: "每个版本的发布说明", thisDevice: "此设备", - connectedHosts: "已连接的 Host", + connectedHosts: "已连接的主机", offline: "离线", versionDiffers: "版本与此设备不同", releaseChannel: { label: "发布通道", - description: "切换到 Beta 可更早获取更新并参与改进", - stable: "Stable", - beta: "Beta", + description: "切换到测试版可更早获取更新并参与改进", + stable: "稳定版", + beta: "测试版", }, updates: { label: "应用更新", @@ -2148,8 +2200,8 @@ export const zhCN: TranslationResources = { title: "主题", accessibilityLabel: "主题:{{value}}", options: { - light: "Light", - dark: "Dark", + light: "浅色", + dark: "深色", zinc: "Zinc", midnight: "Midnight", claude: "Claude", @@ -2190,7 +2242,7 @@ export const zhCN: TranslationResources = { contentSizeHint: "用于聊天文本和渲染后的 Markdown", contentSizeAccessibility: "内容字体大小", codeFont: "代码字体", - codeFontHint: "用于代码、diff 和终端输出。留空则使用系统默认", + codeFontHint: "用于代码、差异和终端输出。留空则使用系统默认", codeFontAccessibility: "代码字体族", codeSize: "代码字号", codeSizeHint: "用于代码、差异和终端输出", @@ -2234,19 +2286,19 @@ export const zhCN: TranslationResources = { workspaces: "项目和工作区", tabsPanes: "标签和窗格", layout: "布局", - agentInput: "Agent 输入", + agentInput: "智能体输入", }, help: { openProject: "打开项目", - newWorkspace: "新建 workspace", + newWorkspace: "新建工作区", newWorktree: "新建 worktree", archiveWorkspace: "归档工作区", newTab: "新建标签", closeCurrentTab: "关闭当前标签", - jumpToWorkspace: "跳转到 workspace", + jumpToWorkspace: "跳转到工作区", jumpToTab: "跳转到标签", - previousWorkspace: "上一个 workspace", - nextWorkspace: "下一个 workspace", + previousWorkspace: "上一个工作区", + nextWorkspace: "下一个工作区", previousTab: "上一个标签", nextTab: "下一个标签", splitPaneRight: "向右拆分窗格", @@ -2271,10 +2323,10 @@ export const zhCN: TranslationResources = { toggleFocusMode: "切换专注模式", cycleTheme: "循环切换主题", focusMessageInput: "聚焦消息输入框", - cycleAgentMode: "循环切换代理模式", + cycleAgentMode: "循环切换智能体模式", toggleVoiceMode: "切换语音模式", startStopDictation: "开始/停止听写", - interruptAgent: "中断 Agent", + interruptAgent: "中断智能体", sendMessage: "发送消息", queueMessage: "消息排队", muteUnmuteVoiceMode: "静音/取消静音语音模式", @@ -2292,7 +2344,7 @@ export const zhCN: TranslationResources = { }, commandLine: { title: "命令行", - description: "从终端控制 Agent 并运行脚本", + description: "从终端控制智能体并运行脚本", }, actions: { install: "安装", @@ -2351,9 +2403,9 @@ export const zhCN: TranslationResources = { workspaceName: "my-workspace", }, }, - notFound: "Host 未找到", + notFound: "主机未找到", badges: { - relay: "Relay", + relay: "中继", local: "本地", remoteSsh: "远程 SSH", }, @@ -2369,31 +2421,34 @@ export const zhCN: TranslationResources = { pairDevices: { title: "配对设备", rowTitle: "配对设备", - rowHint: "扫描二维码或复制链接,将手机连接到这个 Host", + rowHint: "扫描二维码或复制链接,将手机连接到这个主机", }, skills: { - ...en.settings.host.skills, - sectionTitle: "编排 skills", - title: "编排 skills", - description: "教会 Agent 通过 CLI 编排任务", + docs: "技能", + openDocs: "打开技能文档", + unavailable: "连接到此主机以管理编排技能", + unsupported: "更新此主机以管理编排技能", + sectionTitle: "编排技能", + title: "编排技能", + description: "教会智能体通过 CLI 编排任务", updateAvailable: "有更新可用", - updateTitle: "更新 Paseo skills?", - updateFallback: "将内置 skills 同步到你的机器。", - uninstallTitle: "卸载 Paseo skills?", - uninstallMessage: "会从 ~/.agents、~/.claude、~/.codex 移除所有 Paseo 编排 skills。", - choose: "选择 skills", - chooseAll: "全部 skills", - chooseAllHint: "保持安装所有内置 skills,包括以后新增的。", - chooseList: "内置 skills", - chooseEmpty: "此版本未内置 skills。", - removeTitle: "移除取消勾选的 skills?", + updateTitle: "更新 Paseo 技能?", + updateFallback: "将内置技能同步到你的机器。", + uninstallTitle: "卸载 Paseo 技能?", + uninstallMessage: "会从 ~/.agents、~/.claude、~/.codex 移除所有 Paseo 编排技能。", + choose: "选择技能", + chooseAll: "全部技能", + chooseAllHint: "保持安装所有内置技能,包括以后新增的。", + chooseList: "内置技能", + chooseEmpty: "此版本未内置技能。", + removeTitle: "移除取消勾选的技能?", removeMessage: - "将从 ~/.agents、~/.claude、~/.codex 中删除 {{skills}}。你在这些 skill 文件夹里添加的内容也会一并删除。", - saveFailed: "无法保存你的 skills 选择。", - statusFailed: "无法检查编排 skills 状态。", - updateFailed: "无法更新编排 skills。", - uninstallFailed: "无法卸载编排 skills。", - saveSelectionFailed: "无法保存编排 skills 的选择。", + "将从 ~/.agents、~/.claude、~/.codex 中删除 {{skills}}。你在这些技能文件夹里添加的内容也会一并删除。", + saveFailed: "无法保存你的技能选择。", + statusFailed: "无法检查编排技能状态。", + updateFailed: "无法更新编排技能。", + uninstallFailed: "无法卸载编排技能。", + saveSelectionFailed: "无法保存编排技能的选择。", actions: { install: "安装", installing: "正在安装...", @@ -2407,24 +2462,24 @@ export const zhCN: TranslationResources = { cancel: "取消", }, operations: { - add: "添加 skill", - update: "更新 skill", - delete: "删除 skill", + add: "添加技能", + update: "更新技能", + delete: "删除技能", }, }, orchestration: { title: "编排", - unavailable: "连接到这个 Host 以管理编排", + unavailable: "连接到这个主机以管理编排", enableTools: { - title: "启用 Paseo tools", - hint: "Agent 将能够管理 worktree、Agent 和计划", - accessibilityLabel: "注入 Paseo tools", + title: "启用 Paseo 工具", + hint: "智能体将能够管理 worktree、智能体和计划", + accessibilityLabel: "注入 Paseo 工具", }, systemPrompt: { - title: "System prompt", - hint: "为所有 Agent 添加 system prompt", - sheetTitle: "追加 system prompt", - accessibilityLabel: "追加 system prompt", + title: "系统提示词", + hint: "为所有智能体添加系统提示词", + sheetTitle: "追加系统提示词", + accessibilityLabel: "追加系统提示词", placeholder: "始终保持回复简洁。", edit: "编辑", reset: "重置", @@ -2433,63 +2488,63 @@ export const zhCN: TranslationResources = { }, }, agents: { - unavailable: "连接到这个 Host 以管理 Agent", + unavailable: "连接到这个主机以管理智能体", }, workspaces: { - unavailable: "连接到这个 Host 以管理 Workspace", + unavailable: "连接到这个主机以管理工作区", }, terminalProfiles: { - unavailable: "Connect to this host to manage terminal profiles", - sectionTitle: "Terminal profiles", - editProfile: "Edit profile", - addProfileTitle: "Add terminal profile", - editProfileTitle: "Edit terminal profile", + unavailable: "连接到此主机以管理终端配置", + sectionTitle: "终端配置", + editProfile: "编辑配置", + addProfileTitle: "添加终端配置", + editProfileTitle: "编辑终端配置", namePlaceholder: "Claude Code", commandPlaceholder: "claude", argsPlaceholder: "--dangerously-skip-permissions", - nameLabel: "Name", - commandLabel: "Command", - argsLabel: "Arguments", - nameRequired: "Name is required", - commandRequired: "Command is required", - argsHint: "Space-separated arguments passed to the command", - saving: "Saving...", - remove: "Remove", - removeConfirmTitle: "Remove profile?", - removeConfirmMessage: 'Remove "{{name}}"?', - moveUp: "Move up", - moveDown: "Move down", - save: "Save", - emptyState: "No profiles yet. Add one to launch terminals with a specific command.", + nameLabel: "名称", + commandLabel: "命令", + argsLabel: "参数", + nameRequired: "名称必填", + commandRequired: "命令必填", + argsHint: "传递给命令的参数,以空格分隔", + saving: "正在保存...", + remove: "移除", + removeConfirmTitle: "移除配置?", + removeConfirmMessage: "移除「{{name}}」?", + moveUp: "上移", + moveDown: "下移", + save: "保存", + emptyState: "暂无配置。添加配置后即可使用指定命令启动终端。", }, agentProfiles: { - sectionTitle: "Agent 配置", - unavailable: "连接到这个 Host 以管理 Agent 配置", - unsupported: "此 Host 运行的 Daemon 尚不支持 Agent 配置", - emptyState: "还没有配置。添加一个以便使用保存的 Provider 和 Model 启动 Agent。", - addProfileTitle: "添加 Agent 配置", + sectionTitle: "智能体配置", + unavailable: "连接到这个主机以管理智能体配置", + unsupported: "此主机运行的守护进程尚不支持智能体配置", + emptyState: "还没有配置。添加一个以便使用保存的提供商和模型启动智能体。", + addProfileTitle: "添加智能体配置", newProfile: "新建配置", editProfile: "编辑配置", - editProfileTitle: "编辑 Agent 配置", + editProfileTitle: "编辑智能体配置", nameLabel: "名称", namePlaceholder: "UI 工作", iconLabel: "图标", noIcon: "无", - providerLabel: "Provider", - providerPlaceholder: "选择一个 Provider", - noProviders: "此 Host 上没有可用的 Provider", - modelLabel: "Model", - noModels: "此 Provider 没有可选择的 Model", - modeLabel: "Mode", - noModes: "此 Provider 没有可选择的 Mode", - thinkingLabel: "Thinking", - noThinkingOptions: "此 Model 没有 Thinking 级别", - featuresLabel: "Features", - featureCount: "{{count}} 个 Feature", - featureCountOne: "{{count}} 个 Feature", + providerLabel: "提供商", + providerPlaceholder: "选择一个提供商", + noProviders: "此主机上没有可用的提供商", + modelLabel: "模型", + noModels: "此提供商没有可选择的模型", + modeLabel: "模式", + noModes: "此提供商没有可选择的模式", + thinkingLabel: "思考", + noThinkingOptions: "此模型没有思考级别", + featuresLabel: "功能", + featureCount: "{{count}} 个功能", + featureCountOne: "{{count}} 个功能", notesLabel: "适用场景", notesPlaceholder: "用于 UI 工作 — 组件、布局和设计 token。", - notesHint: "帮助 Agent 在启动另一个 Agent 时选择此配置。", + notesHint: "帮助智能体在启动另一个智能体时选择此配置。", save: "保存", saving: "保存中...", remove: "移除", @@ -2501,87 +2556,84 @@ export const zhCN: TranslationResources = { daemon: { rename: { editLabel: "编辑标签", - title: "重命名 Host", - placeholder: "我的 Host", + title: "重命名主机", + placeholder: "我的主机", submit: "重命名", }, restart: { - title: "重启 Daemon", - hint: "重启 Daemon 进程。应用会自动重新连接", + title: "重启守护进程", + hint: "重启守护进程。应用会自动重新连接", confirm: "重启", confirmTitle: "重启 {{name}}", - confirmMessage: "这会重启 Daemon。其上运行的 Agent 会继续运行;应用会自动重新连接。", + confirmMessage: "这会重启守护进程。其上运行的智能体会继续运行;应用会自动重新连接。", restarting: "正在重启...", unableToReconnectTitle: "无法重新连接", unableToReconnectMessage: "{{name}} 没有重新上线。请确认它已重启。", - unavailableTitle: "Host 不可用", - unavailableMessage: "这个 Host 尚未连接。请等待它上线后再重启。", - offlineTitle: "Host 离线", - offlineMessage: "这个 Host 已离线。Paseo 会自动重连,请等它恢复在线后再重启。", + unavailableTitle: "主机不可用", + unavailableMessage: "这个主机尚未连接。请等待它上线后再重启。", + offlineTitle: "主机离线", + offlineMessage: "这个主机已离线。Paseo 会自动重连,请等它恢复在线后再重启。", requestFailedTitle: "错误", - requestFailedMessage: "发送重启请求失败。Paseo 会自动重连,请在 Host 显示在线后重试。", + requestFailedMessage: "发送重启请求失败。Paseo 会自动重连,请在主机显示在线后重试。", dialogFailedMessage: "无法打开重启确认对话框。", }, update: { - desktopManagedHint: "此 Daemon 由 Paseo Desktop 管理。请在 Host 上更新 Paseo Desktop。", - title: "Update daemon", - hint: "Update the daemon to the latest version and restart it", - confirm: "Update", - confirmTitle: "Update {{name}}", - confirmMessage: - "This will update the daemon to the latest version and restart it. Running agents will be briefly interrupted.", - updating: "Updating...", - phaseStarting: "Preparing update...", - phaseDownloading: "Downloading packages...", - phaseInstalling: "Installing...", - phaseComplete: "Update complete, restarting...", - unableToReconnectTitle: "Unable to reconnect", - unableToReconnectMessage: - "{{name}} did not come back online after updating. Please verify the daemon restarted.", - unavailableTitle: "Host unavailable", - unavailableMessage: - "This host is not connected. Wait for it to come online before updating.", - offlineTitle: "Host offline", - offlineMessage: "This host is offline. Wait until it is back online before updating.", - requestFailedTitle: "Update failed", - requestFailedMessage: "Failed to update the daemon: {{error}}", - dialogFailedMessage: "Unable to open the update confirmation dialog.", + desktopManagedHint: "此守护进程由 Paseo Desktop 管理。请在主机上更新 Paseo Desktop。", + title: "更新守护进程", + hint: "将守护进程更新至最新版本并重启", + confirm: "更新", + confirmTitle: "更新 {{name}}", + confirmMessage: "这会将守护进程更新至最新版本并重启。正在运行的智能体将短暂中断。", + updating: "正在更新...", + phaseStarting: "正在准备更新...", + phaseDownloading: "正在下载软件包...", + phaseInstalling: "正在安装...", + phaseComplete: "更新完成,正在重启...", + unableToReconnectTitle: "无法重新连接", + unableToReconnectMessage: "{{name}} 更新后未重新上线。请确认守护进程已重启。", + unavailableTitle: "主机不可用", + unavailableMessage: "此主机尚未连接。请等待它上线后再更新。", + offlineTitle: "主机离线", + offlineMessage: "此主机已离线。请等待它恢复在线后再更新。", + requestFailedTitle: "更新失败", + requestFailedMessage: "更新守护进程失败:{{error}}", + dialogFailedMessage: "无法打开更新确认对话框。", }, dangerZone: "危险区域", remove: { - title: "移除 Host", + title: "移除主机", localTitle: "移除 localhost 连接", - hint: "从此设备移除这个 Host 及其已保存连接", - localHint: "从此设备移除 localhost,并停止内置 Daemon", - localConfirmTitle: "移除 localhost 连接并停止 Daemon?", + hint: "从此设备移除这个主机及其已保存连接", + localHint: "从此设备移除 localhost,并停止内置守护进程", + localConfirmTitle: "移除 localhost 连接并停止守护进程?", confirmMessage: "移除 {{name}}?这会删除其已保存连接。", localConfirmMessage: - "这会移除 localhost 连接、关闭内置 Daemon 管理,并停止托管 Daemon。远程 Host 会保持连接。", + "这会移除 localhost 连接、关闭内置守护进程管理,并停止托管守护进程。远程主机会保持连接。", errorTitle: "错误", - errorMessage: "无法移除 Host", + errorMessage: "无法移除主机", localErrorMessage: "无法移除 localhost 连接", }, }, }, providers: { - title: "Providers", - addProvider: "添加 Provider", - providerDetails: "{{name}} Provider 详情", + title: "提供商", + addProvider: "添加提供商", + providerDetails: "{{name}} 提供商详情", enableProvider: "启用 {{name}}", - unavailable: "连接到这个 Host 以查看 Providers", + unavailable: "连接到这个主机以查看提供商", loading: "正在加载...", - addErrorTitle: "无法添加 Provider", - updateErrorTitle: "无法更新 Provider", + addErrorTitle: "无法添加提供商", + updateErrorTitle: "无法更新提供商", actions: { - menu: "{{name}} actions", - remove: "Remove provider", - removing: "Removing...", + menu: "{{name}} 的操作", + remove: "移除提供商", + removing: "正在移除...", }, remove: { - confirmTitle: "Remove {{name}}?", - confirmMessage: "This deletes the provider entry from config.json. It cannot be undone.", - confirm: "Remove", - errorTitle: "Unable to remove provider", + confirmTitle: "移除 {{name}}?", + confirmMessage: "这会删除 config.json 中的提供商配置,且无法撤销。", + confirm: "移除", + errorTitle: "无法移除提供商", }, statuses: { disabled: "已禁用", @@ -2591,24 +2643,24 @@ export const zhCN: TranslationResources = { notInstalled: "未安装", }, models: { - one: "1 个 Model", - many: "{{count}} 个 Model", - addModel: "添加 Model", - addCustomTitle: "添加自定义 Model", - modelId: "Model ID", + one: "1 个模型", + many: "{{count}} 个模型", + addModel: "添加模型", + addCustomTitle: "添加自定义模型", + modelId: "模型 ID", modelIdPlaceholder: "例如 openai/gpt-5", add: "添加", adding: "正在添加...", - failedToSave: "保存 Model 失败", + failedToSave: "保存模型失败", removeModel: "移除 {{id}}", - searchPlaceholder: "搜索 Models", - loading: "正在加载 Models...", + searchPlaceholder: "搜索模型", + loading: "正在加载模型...", retry: "重试", retrying: "正在重试...", - noSearchMatches: "没有匹配搜索的 Model", - noneDetected: "未检测到 Model", + noSearchMatches: "没有匹配搜索的模型", + noneDetected: "未检测到模型", discovered: "已发现", - custom: "自定义 Models", + custom: "自定义模型", updated: "已更新 {{time}}", }, diagnostic: { @@ -2628,76 +2680,76 @@ export const zhCN: TranslationResources = { }, }, project: { - noEditableTarget: "此项目无法在这个 Host 上编辑。", - backToProjects: "返回 Projects", + noEditableTarget: "此项目无法在这个主机上编辑。", + backToProjects: "返回项目", edit: { - title: "编辑 Project", + title: "编辑项目", name: "名称", - nameLabel: "Project 名称", + nameLabel: "项目名称", icon: "图标", chooseImage: "选择图片", useAutomatic: "使用自动", imageUrl: "图片或网站 URL", save: "保存更改", - savedToast: "Project 已更新", + savedToast: "项目已更新", }, readFailures: { invalidTitle: "无法解析 paseo.json", invalidDescription: "修复磁盘上的文件,然后重新加载。", - missingTitle: "这个 Host 没有这个 Project", - missingSingleHost: "所选 Host 没有这个 Project 的记录。", + missingTitle: "这个主机没有这个项目", + missingSingleHost: "所选主机没有这个项目的记录。", transportTitle: "无法加载 paseo.json", - transportFallback: "Host 没有响应。", + transportFallback: "主机没有响应。", failedTitle: "无法加载 paseo.json", failedDescription: "重新加载以重试。", }, worktree: { - title: "Worktree 生命周期 hooks", - info: "为此 Project 创建或清理 worktree 时运行的命令", + title: "Worktree 生命周期钩子", + info: "为此项目创建或清理 worktree 时运行的命令", docs: "文档", docsTooltip: "查看命令可用的环境变量和更多细节", - setup: "Setup", - setupAccessibility: "Worktree setup 命令", + setup: "初始化", + setupAccessibility: "Worktree 初始化命令", uncommittedTitle: "提交 paseo.json 更改", uncommittedDescription: "新工作树使用所选基础分支中的设置脚本。", - teardown: "Teardown", - teardownAccessibility: "Worktree teardown 命令", + teardown: "清理", + teardownAccessibility: "Worktree 清理命令", }, scripts: { - title: "Scripts", - info: "可从此 Project 中任意 Agent 启动的长期服务和一次性命令", - empty: "还没有 scripts。", - untitled: "未命名 script", + title: "脚本", + info: "可从此项目中任意智能体启动的长期服务和一次性命令", + empty: "还没有脚本。", + untitled: "未命名脚本", port: "端口 {{port}}", - menuAccessibility: "打开 script 菜单", - removeTitle: "移除 script?", + menuAccessibility: "打开脚本菜单", + removeTitle: "移除脚本?", removeMessage: "移除 {{name}}?", - removeFallbackName: "这个 script", + removeFallbackName: "这个脚本", name: "名称", command: "命令", - nameAccessibility: "Script 名称", - commandAccessibility: "Script 命令", + nameAccessibility: "脚本名称", + commandAccessibility: "脚本命令", nameRequired: "名称必填", commandRequired: "命令必填", - newScript: "新建 script", + newScript: "新建脚本", editScript: "编辑 {{name}}", runAsService: "作为服务运行", serviceHint: "Paseo 会监管该进程,并通过 $PASEO_PORT 分配端口", actions: { - add: "添加 script", + add: "添加脚本", edit: "编辑", remove: "移除", }, }, metadata: { title: "元数据生成", - info: "注入到 Paseo 用来生成元数据的 AI prompts 中的 Project 专属指令,可用于强制执行团队约定,例如分支命名、提交风格或 PR 格式", + info: "注入到 Paseo 用来生成元数据的 AI 提示词中的项目专属指令,可用于强制执行团队约定,例如分支命名、提交风格或 PR 格式", branchName: "分支名称", branchNamePlaceholder: "分支以 feat/ 或 fix/ 开头,个人分支使用 mb/", commitMessage: "提交消息", - commitMessagePlaceholder: "使用带 scope 的 Conventional Commits", - pullRequest: "Pull requests", - pullRequestPlaceholder: "先写一段摘要,并包含 Test plan 部分", + commitMessagePlaceholder: "使用带作用域的 Conventional Commits", + pullRequest: "拉取请求", + pullRequestPlaceholder: "先写一段摘要,并包含测试计划部分", }, writeFailures: { staleTitle: "磁盘上的配置已变更", @@ -2709,7 +2761,7 @@ export const zhCN: TranslationResources = { reload: "重新加载", tryAgain: "重试", save: "保存", - saved: "Project 已保存", + saved: "项目已保存", saving: "正在保存...", cancel: "取消", },