From 1a4eedf868cf450e47b2ab50cd5333773192b1ef Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 11 Apr 2026 10:16:58 +1000 Subject: [PATCH 01/38] Update actions/upload-artifact digest to 043fb46 (#4402) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/iso-build.yaml | 2 +- .github/workflows/python-build.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/iso-build.yaml b/.github/workflows/iso-build.yaml index 73ab243f..dfaed9b8 100644 --- a/.github/workflows/iso-build.yaml +++ b/.github/workflows/iso-build.yaml @@ -33,7 +33,7 @@ jobs: - run: pacman-key --init - run: pacman --noconfirm -Sy archlinux-keyring - run: ./build_iso.sh - - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7 + - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 with: name: Arch Live ISO path: /tmp/archlive/out/*.iso diff --git a/.github/workflows/python-build.yml b/.github/workflows/python-build.yml index c7778604..e8fd87fa 100644 --- a/.github/workflows/python-build.yml +++ b/.github/workflows/python-build.yml @@ -33,7 +33,7 @@ jobs: archinstall --script guided -v archinstall --script only_hd -v archinstall --script minimal -v - - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7 + - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 with: name: archinstall path: dist/* From 934407414e201b271acb6be8fd7b285b8b0eab24 Mon Sep 17 00:00:00 2001 From: codefiles <11915375+codefiles@users.noreply.github.com> Date: Fri, 10 Apr 2026 20:17:29 -0400 Subject: [PATCH 02/38] Add constant for mirrorlist (#4403) --- archinstall/lib/installer.py | 11 +++++++---- archinstall/lib/mirror/mirror_handler.py | 3 ++- archinstall/lib/pathnames.py | 1 + 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/archinstall/lib/installer.py b/archinstall/lib/installer.py index 463901fe..ff56e2e1 100644 --- a/archinstall/lib/installer.py +++ b/archinstall/lib/installer.py @@ -53,7 +53,7 @@ from archinstall.lib.output import debug, error, info, log, logger, warn from archinstall.lib.packages.packages import installed_package from archinstall.lib.pacman.config import PacmanConfig from archinstall.lib.pacman.pacman import Pacman -from archinstall.lib.pathnames import PACMAN_CONF +from archinstall.lib.pathnames import MIRRORLIST, PACMAN_CONF from archinstall.lib.plugins import plugins from archinstall.lib.translationhandler import tr @@ -565,9 +565,12 @@ class Installer: if result := plugin.on_mirrors(mirror_config): mirror_config = result - root = self.target if on_target else Path('/') - mirrorlist_config = root / 'etc/pacman.d/mirrorlist' - pacman_config = root / PACMAN_CONF.relative_to_root() + if on_target: + mirrorlist_config = self.target / MIRRORLIST.relative_to_root() + pacman_config = self.target / PACMAN_CONF.relative_to_root() + else: + mirrorlist_config = MIRRORLIST + pacman_config = PACMAN_CONF repositories_config = mirror_config.repositories_config() if repositories_config: diff --git a/archinstall/lib/mirror/mirror_handler.py b/archinstall/lib/mirror/mirror_handler.py index 66e9d8c8..aab85fce 100644 --- a/archinstall/lib/mirror/mirror_handler.py +++ b/archinstall/lib/mirror/mirror_handler.py @@ -6,12 +6,13 @@ from archinstall.lib.models import MirrorRegion from archinstall.lib.models.mirrors import MirrorStatusEntryV3, MirrorStatusListV3 from archinstall.lib.networking import fetch_data_from_url from archinstall.lib.output import debug, info +from archinstall.lib.pathnames import MIRRORLIST class MirrorListHandler: def __init__( self, - local_mirrorlist: Path = Path('/etc/pacman.d/mirrorlist'), + local_mirrorlist: Path = MIRRORLIST, offline: bool = False, verbose: bool = False, ) -> None: diff --git a/archinstall/lib/pathnames.py b/archinstall/lib/pathnames.py index 7af5be6f..542719e1 100644 --- a/archinstall/lib/pathnames.py +++ b/archinstall/lib/pathnames.py @@ -4,4 +4,5 @@ from typing import Final from archinstall.lib.linux_path import LPath ARCHISO_MOUNTPOINT: Final = Path('/run/archiso/airootfs') +MIRRORLIST: Final = LPath('/etc/pacman.d/mirrorlist') PACMAN_CONF: Final = LPath('/etc/pacman.conf') From 60bcded7439a7e76970d7a621ea1abc74d18a719 Mon Sep 17 00:00:00 2001 From: Softer Date: Sat, 11 Apr 2026 10:48:26 +0300 Subject: [PATCH 03/38] Replace tab with spaces in preview package lists (#4409) --- archinstall/default_profiles/profile.py | 2 +- archinstall/lib/hardware.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/archinstall/default_profiles/profile.py b/archinstall/default_profiles/profile.py index b54ce389..cc56186f 100644 --- a/archinstall/default_profiles/profile.py +++ b/archinstall/default_profiles/profile.py @@ -212,6 +212,6 @@ class Profile: text = tr('Installed packages') + ':\n' for pkg in sorted(packages): - text += f'\t- {pkg}\n' + text += f' - {pkg}\n' return text diff --git a/archinstall/lib/hardware.py b/archinstall/lib/hardware.py index ae790feb..09b3eb5f 100644 --- a/archinstall/lib/hardware.py +++ b/archinstall/lib/hardware.py @@ -73,7 +73,7 @@ class GfxDriver(Enum): text = tr('Installed packages') + ':\n' for p in sorted(pkg_names): - text += f'\t- {p}\n' + text += f' - {p}\n' return text From 51600ecd2afeb2734d09ee4084210b13a9570b95 Mon Sep 17 00:00:00 2001 From: Koutheir Attouchi Date: Sat, 11 Apr 2026 04:14:14 -0400 Subject: [PATCH 04/38] Update Arabic translation (#4410) --- archinstall/locales/ar/LC_MESSAGES/base.mo | Bin 55514 -> 72870 bytes archinstall/locales/ar/LC_MESSAGES/base.po | 744 +++++++++------------ 2 files changed, 332 insertions(+), 412 deletions(-) diff --git a/archinstall/locales/ar/LC_MESSAGES/base.mo b/archinstall/locales/ar/LC_MESSAGES/base.mo index 0ccaa92143fd67be69d2cb02568e1e27c2e40a3a..c6311ff334a3dde51b7adb90289612b83fda3ac6 100644 GIT binary patch literal 72870 zcmd4434mNhwf}!3$TG;jFUn<~KxVSA2!ROM36K!75D*c1W;#ieneK6Vh7b@XBq2jY zLfoG`MF?35O9&7^eeTQvp^-#=*gcSihO`?4rH20Z5AC^~I7@MOhC(Pu|R(YfH~z*mDWKRt>r0mpz>fh)k_ z;7`GW!NbmoqKm;(!4tsi!PkQC1rGuL05*Y5XGT#0JQURPH-jqgJD|!x>#Qi63oZfY zfIkCgg5x0KK=552*Ms{Lej3~x{BQ6w@EhRE!IRI9BAOEo14Z8m@NjT~55Eo+J>B4; z;7#B`;3{xm@P2R~@KGQBFHq%v0aSaw2CCfWK$ZJfa0+cCGgTV5XMlT+cjJBxsPb+HmHus@`2K!Sbgc#@=a2gE zM?mraOQ7hhfOKK>18^GnstJz2U7+~0929?7f}(G=4{rfS68;RR{`)g1`dS!Vmx3MO zwcumm+2Em*9N(vb;@=xUwf|Nhey0zw1=aqiK(+g8{`s##ii)Di=sI8$D7xPOUI0D< zN-lm2GIXPTE_C%x0##1|JPLdxsP?=Y6x|PiqUQ(T@!)Sjr8{_v>;G0z<&6hnQS>HI zj4};>%XF>jt{=z>egA*@~qT|3$P~kg4(eXH_@;?XCwbAY< zW0gA@yZ~GVN)A5_4ghhlhivFqK-r(zfcs{7{wFqni?*h*Q?*{h*E8yke zGobXt*>wIwuot`@`~_G5+v!Z@|01aVuXubO+>`JN;BH_v-KE<>t8&AR-nm1;zi*gRcPhp6&YmFmOM@uLYIA z0GbK-IhFoG3aL+#ggshJ!8Oc|QI+Q01-wRnA)Q5b$a6 zH1NwHDlGadsQhEDpijVyz)|2*@I-Jccn0`AQ2ajdO2^j|J)Q?1N&GDE2(Sn?gUdnH z^9VQ${2n+Q-21gozRv;0pX)&J^?FeJUka*yZwFQ0-5wtU#pf@A>gTV6qWk-x#>LM) z{=q;0C#Z6ou5$8w5U74R3_KJ(+T%#@WrQb#qT?b^^iaKR*Sp}7JaquYc zqoCyQyP(oP3#xs82Sxvp*Shwd4ywM3LCM$aLGiZ-RC^YJHhw_K*+Zbp`3;B&N3Y1a zbnRdl;a*VX|H#Mx4ODygZF6*-0IHtzK=FAxsQzjL)z94?ZvZ7nw}5KLN^my#9#Hvz z1?It*wL>#FAEc`2GvKk{&<fbG(%KHL175pJ6IcS~d@=pOTAUqd*CAbb0 zKRyMjp65W7{|`{@IAp$y9|np~<9&E0sPme3*08^H^~`@!SEUxK3d0EAlUE&!FT4b<}$py+uJ z6yHAuHi1=871XcfoKK{Q!weNeNF=$3U7E z{U1ousN;I~yb7Yaqmc_4W8j^j*#gObA+ zK$RE66wxsP6dhwh_2*1bqUn#e*vEc~JDf0IEO#?y>1+ z*Z#vn@h1jF=NwRavkMfxcYqp4@9^RO0bfJ-C!qTE#5cM1a1W^dUk?rkKMRflUjRpd zXT90+X&xwg-V06!?*UO6(Q}~2*JZajzTE(xNO&E1H24MZZ18zd?LBU>vuADuFCe@c z91lJVz7}l0)yc^cP;&G*D85(0i@`mXIQnORyAl2XSOo6}KL#GW)TR3-sD3sy;^yU*;JXO_1QcK1cn4z){5g0$IQ^~o4!|;~e%bp@$^plLhk>65_W^$dA_CE` zK)N{US{X&RfWHLE8Wr!t_67e2-UDu3g^dZ$d7G=}=iuRl_ajo}o(xJaj{zAn(S<(z z36Ea_W8$lz===-#D)5!>aOIo_Dt?y7g`mdSd%F3kL&501uAIX_m2(c*3{C*0 zFS@{!!S{fo`y*fsKI_9TzuSdR1=YTb!CBxvKKy%7`7iuWCl4j?2EyyX@!)aqbN<3S zC^>o<+yox-ey7(y28zGWfzn%hA`A*24yqlm_IMen{#*d6T`PR}1K=wNe+1O{`2wi^ z_&TWme)$Jnxy@i4K_l1)UI`uyei^(F{4pqchu!PerQM+Tv=vl&KLo|!gYI+l^r@i2 z7lQkN*ZTMpIFImK!Rx?3fM@FYYRCU~fui$XQ2Ez`qT{2W`2P)1{QNU`JQ&~ao{tBW zehw%;lsw)Eo<;aUQ1bAs$6tb{5&k2nem{PVllKSKAH?4E@9SSPG#p85P^I92HKP?42!ByZg@E_o*ieK-_ zc^DKuPlIZ26+9OFEqF0_;0A|RgHs4^0M(!W2fiOHY;<~huLs=vdpfA{-UJ>4z7ISK zeA`P*h5Zk=7A>>eh3^5 zeghQ!`#
~Qd8!ncF!w@1L&fX{)Fvy&fj^V}6+FX7GLBE@fZ`sM>5swLX(QCI(a z!7+qC0jht7Y;on}z_Eni4qgO)6I8wNW2`m6$>8naGaeT_?)1rNSqAP${C(g7;AT+$^l`8i{5^Oyc*4gW zo)7jDz6un5&w?j_zXc^1hf>K+;JM(<;8w5%p7}|~$2H(pgg*+Z++#lF^!?f3Y{FgO z9Pkrh3?BVySI>E%=$zuiSAZuH&V##yE5QB1m7w@@4>%Ki+{f?z8JGV^@KoZPLD4@G zJO#WKRDbt_!@zZ*^vT~rmRf%kyVf}(5bH(dWe1iq2*XTUaa!Z%&Mb)ee$c~I^A7AQXb0z4Mn>s!uFYzCEX z9e4=%D0nLP8BqCt2eyEFecQ#K1)fYe2R4KKU@N#8RJlI{4+f)(H-R^T zqW{m}Qt*VTYxjEaTEZU(k5~M69G@qF=MruQPXX@%jXsaR1I4#je%Hy%tHHwwPXdnv zUk{3|TR?_f^Z`)i%=@0xyDL2&{XfnQUI)IK=jVRk$we7dd2a(>18xM50RPv=zw8H2 zzK#OVAbuFA=Q&VvawE70_-=52@cp3ZeaPcyL8bc{GBPjX% zJ{W_41J46r`HXx1T2TFUCwL%uKPWkS0u(>L3!0pQG2s(`IEF#fUIKhJ^U-$S7K|65=T{u6u^7(eUsoexUx+d#GZZJ^q5A1FS43p^J*^e2wr zmw}@Q-ws{^eh3^3?)_6|-(C#PAiNa37W_7N6?pb@PLI6&;9kFW<;(-m zB>WB^{%>$1;Xi?sz%jpZxD=dB`12kQ{;eDTSAi!JzYyF5d_UL%t^rR3zYcy3d;yd^ zJpDT-uU`SD5dImc^k@8^n>X7)wdZC~{kj$$3H}5e1s?u;$B&CZjjK0-O8w6Jbf3;fqwxH0AKeB40!l%LrgAagEI*~22KO_+I@)eWe%uvZUo1J%fS7>&w&?#6;S1!@bV$1 ze`b2@2B#ALR#0;FT~K=FxIKoL-THd)R>IHw@Pa*um>vEHQ1nmQYlzt|*Mdh8?gACx z4{BWA2NuDn!85_3dk?Ys^%_w0-349+-UEvMzk+#ikES8f8^BKR3h?`&=zsM-L#%)1 zfd#@(ffs@&yu$IL6O^2P5PUoMaZvqt`MyI;U%vp3Biypz5F6*+pvL3<;053pz;}ZC z?(gVa4K5`74e%Q9k^_cBOTbN_${BIs5E~z5a1!Br!JEM6!8d{(2RVA40oN)XJYop? z;NT&qFV-J2#N_awpycm0hYm5j{S#m-;ZqMAVtVIF@C3qlffs;}fo&(UAU4-{MW{9l^-UHHH`@8sM$b}F54>78DH{#@=JCf^1mdfcr z-5$pEgpgESLm)!E+TX+6>rb*XpZn`9Hl60Uc&WT;!h;q_qj)0Y}~xn=l>meHqSQk><%CI9`F&u z`uhUc&+HDK63?)=zeCCM4u5|L_YVbHUSjHkbInasLmW{u*!sVaad! zyN8<#NjsfqKj12HgV|1a=nu3!7`n?TKzb9~qm^Uwbf);K#Kd?olR z@OZ8daQ%%-fA4Y-eS`4ZxW93Hcqjq$<$mXS`n_b=e*xL(J# zj;qA=b*{5A_56->cV`M(!SfFheh&OOSNI#7x&IE47ZNUT{V&(&2wzQ^mva9Y*Lbe| ziTg{)3@#*YJ$Nd3zmG424-(G)brOD_>or7Pnt5;(<+u9q44(gr`*(rg21kIu@Xs{& zoXEABYa;Ql1xJwgXi$H{iF=j1jXuM@{=Urh7?iXFB3<0;?-{NQ+`r9-&nM5#_Jp-1aiR>(eNl^Y;&UJjSQfvz5fXitBO(`1=p;_viV4g0JxD+POc9OMe$TKtVCKxF-4V zN4P(i^e-p8r!K-j@Xsa_e=*^)g!cl6a_R5w9`6HBBRtcGUr+i!bH4|1@8LRv`&W5d zjw0O0l_&04P=9Cod|Sa`q?^U{BkteGwU2)`&ZE*l&vgZ9HiMTFzc;uqI2;UrQ@QEo zy2jVr&GS>a|2`<&?9)EsorLvwIL{6NAGQ#>5?s!+S8`p!{ngQeiZ4SB>Z;5Kjr$9kN*;JS8|QwdO2yvfVXn#?`j9p8p2)NtI9U+Te)`Q zI+gJ5K8;|sr)ias`zC4h_eby*T%Y7xKzJJ0*SRJT{tT$U<9yzY+_!T76Q1qE{cpgl z{Ifq2{xH`ch?_v%{$Tj~2sa0ColN{G#J|9G9@jTQ0`MHdp9QY~S94v%{T`%W4i4iw zojCnnK->ZT{wfz0{m_TsN_Z>RQo^@!%^~d+!XvmIAsqX34}mjz_G+$!cozP~5uVJm zANzEQ{|@)li4T9*`e*+|#9Msiy~Lg9<45|m_wuZZxUq!$z>!>c5%)U6Q+=BMCNBK7 zar3`iHxl=IuH*cJL%IJc*Q>ccM%>}xp5*^7_pj$(e~)v0k^5N|!XM53*Zi}868C=Y z*K!>}zOVXtpEMfc!@u_t|3~<>q}v33leo`=v$&eMe>2zdJbQ-lDy}EEp5;1%_`ATD zalMcG_ksW9x}Qsbqdk7m1t|z&^$MqAg%Sd-4Xn##j+|u2i@JL{bH$E0*WR8lmleOL)YlWw&-HXH%=P4>ZRDM~Ft=zM z`DW%j^Xz-d|FUK7{RM``kdg9J}j>_Apd4Z}d6wAH2&dyj@sXJe6DMLeh z-e)LBO>w3HZP%&Txjm(>xOaX&?ktphhtaZ*xa=w{74vavu06|LpDT3c+B#`@yP92& z=Tdp0S9RuZ$hY@#G_NV1RG?ZF)sZh3dh#9d^|{Wzyi1#li}{6dxv%Z|QfFURK5mMd zCgkT9sKPzzE9ZNN+m&sdHNQ}f`QQ4XeLnqGjN41axrKRsJvp^vbQJS99Uju9kk+LJ zxlHB0eB3Nv%q?{0hpL(LdwaXfqlXWlSLmJJ*Vfuz>KdNwX`kO&DE8f8cb@md3uQ8w zqxiUZQmLma*V|ht&WmrlnZAjmxVa-gH`mwMJ2Z+oDqvSxj50)Eh4>^>uc{ZTWb(1#^^9q+fDf-JSW?C~k=- z6w2zo;jmn_$D`vBadU_*$KAOeBqrY(ca#vEYxf=>yeO+(^c6a5A9YLmO032|$ z9^BNGyWyI^obqWSZ%){;YpdB-xrL(fA|-!h%7Bpr+n>-rYA{-7CWCSGO`}Jib#oM( z7{X&X=VKNk?LpPubaRx7@7Nd(v?y-Nl?&}PVu@6W@vdVSdXnJwzH)D=t8imJ9?Ou4 zFVUEZky1S_=kpA*-qvVrTdAiv8r#vK3lVdf;;uqZPpPLit|#AJDi?Z7J&S7N(IHUf zhEvPL{NdVzM(vrl+Z(oHsRAhA2W%*^?&<5kpm3C-(K^&yU8UFEwd&m54SC zp;>|+DaSJX>3TZXBtIXk5(f3Xx>qM_nDnY&6INqLr2iZOo!vzNNW zQ|bscDossx6v_+Y&K$J%9v6-6?(Xyi(Gy5ysC$0Cv%4mOd39bN9a$6ElYc`W(_1<2 zk?!qgE=Ek~Y)N`gU$HfwiAcA!s4$x*#SWw+!z$z1!d%hj&p;$Il_wrfmdk~CMK>PZ zv|uIWQi-ccViQL+wy&d5;$Qet?Dg$au*4+9AhixDFDkaj&C_O09~zBAMx${|(7iNc zel(7MrTQ5(<9d7MLQFB&U7k-1dlz-*r7WXyedQJfqVcn4TyolYYp>)W8lNk+=Q}yq z4!iPo1GhFZ83c>!Qv0FnQ)}Rr7nOVST_IU_u3TPN>ggctEU;KpohLZN72}+E03S^c zq|tT8+BOZYL33dMEo>juP8&2^vCvc4Uan%km&PrqHBUlQ7h?0xuYDxem$Ce6lPt*h z6!V=Xhm4qd^H5{STOaZ9H{E=EZQjmOdk*t1Uu#-k=!{WkR20!{l0?mZbr5TWtvqn&&kUB^hjYoI%VB~b>d$B9g zREdHvN8?Lf-3+y|jP_jTyiyM{8`71v2Wvx&?ELkG{KC4}WHf}Vvda9tp<0}MiT*Z| zul7Mtm)X}SE5?jc5|IjaiBVhZqZOrYMhE}IQ)XU@+1x-hGHf!v>XO4d8QBZ+i$;eC zbmsV;d`|4JX9+{nXs^yN`}?}{JuT9;Ztf}fb(AvdEiDQy%Hm^TQDt;U*W?g74O!%? zy=ReI7^Us1PlSvOOw`xYLrJVg(4A%0B_(DBda8piVEuB_&9ulTNt)pGdHTRj*kspw ziGJpZ><({2&^a!c6~_?g#V?vLZKl^AWnMdS#
LU43Eas+=})s_2F~`S^=TAZT*g&gBn>Bhq*c@8}tmAiY!fQ;=#gC8JF+ak?fY!?BP0{6gMc&CYPjBu_G{L&}8RF z6YU8VHqbwrIJ0mjV#)>+ShkOh&xum==+WTaNR1SevqZAf!LidhvbBVfkd#}~bA_tVv}2qF z5%=|U`hxMq_Vi{L;H;V&U6M?bZl#wM%=A%4grwW2Om{xozBVjFFYs}*clKd`oHMF* zLw)ZTX&IVd*ijM3+FGW=dkV&A1_LwSbCq3x!3+_`77b zs{;`zEL+=bNWb-g63v5qJ3|_72!O>V&97U#1D;Hs&D|=LC35>e{FIhgC#I6lR z1)o@7H|vnOg=kXhU71uUI!|Vam9h4Bf>8UVy4k2ThKJ2MgX&iki!t8aO%t{+%UR&+DdGi zm505AVxf(W)JSd1Q?v{m%;2^{XQ3BkUOsITqp?#bBpYDH0cEG&(wrEIP70g}u0`JCIFHR-Ei`^s)G1HD$XfPIl!6gyN=BmdtQ_^y)E7!9CO@Jzr+f?RDYeaeStuy&+mz2&%JfytE zA2&e~ZA*VVVX_m*?Pi^_@-l*GfHrzr6D`cQ#ce%o7iy|6_o0ADjDIUXw{(MSf%f@q zGZ*^0(ot5n1>hoWA`e)#LQ7XSTSC4TgbPzgWO;W`;^83@8q=1hDd|0PD47-O*7U9P zdUm^FK6xuY>cMZu+#j<3~3XmMwH1iyGR;% zxWer$LAuXYTA=w!^OrK5PZ`;TR9#RzikgOHKr@^c)jtltlhjWmx8^od*)%= zU>R2Pm`%zueZrG4YFu2+77A%B9JWh*n5s+j*q!T)FLx(lrsj$)n9QtfhT5UgREat& zQ2r$XdK$O6ExE8`@6OZ&9hd0*kea!%P}Hm~D_=8`rVXt}d}*mWuJ&0UR3)Y+N=4}v zS2HO$j7)6IM5ydMQAk^4|FNbJC&WxYIrb;x2^Wr^4tM>wD!rST^+dv4P93qs+(U6a z3x>}wYBobXCGD0*3iBGrc9JbmSqF9`Mob+vr>sNSFDSug$7daR*=82+EkRZWE7!@C zGeI7}zSnJ}Y1KD4qvK5aw&lVVAAwwD&x zJlHmQ{-{ZN4)K-^WPF@o!h4^vT+7nQzWJDRpISYk89+>wyF(i;~(X!^o9GT1;h zmx;f3gEl$=B?wq8tDMiHr$w0A(;n7Z}cV<1bs=#o+k4!n3ZXD z*T(yzr0!gD9qDq@e^{t4qRIxbl23aQ+9=DmubA+Nd$%=^?`2u++SqAjvDW8QQ@#aT zlSLZlWwC_UjNLsBJUSDL;mp>Z_s?Kea$E^3mQ@5>!Okw$Qh=310jB_`D>|`?rkNWo zJ&F}wx*)n#C+o(}96x0W_A#!Lc4l+Bkz&&M%hDuV3zoGA#LJS9ISg&fnJN!0+E~_l zoHfMUf>cJ=Jf;CHv}|t{jqazH#OkwJljgNL(gvwkyD7WA!a!NgD4gz$Qck{>`npF) zJ{a7Bp59;(xkZd-%?2K+tWyW&7o1^~NZ+fMbDb>wIu_{!Pm!r_7;XTp3%1ZOE$!gl z$Pu!KaW}cimma4adW=Zc!L1PIy_XaGAh;9dN#8c zADe1-$9>{7*PMKAK@x9cw-ZCESQ{nTv`RVAG=2Ue4kse)!RGTPecN>uICiIM<~bLI zy3$Kiv_q+^nOc!rVTrkhjfL9rC14oK`tth9IjX}m-21!qwDI)PLh4GzhHpaVTR3Op z4#hE$CFRZ^k6P=|c{!|-)^PZ_o#9c8QG_`T*wtq%V;jlt#Yn~w(1`{O3waqm%aDC) z3*PUbaBZonC-`K~H-4Fu(nXB#?dd#ietqmj;~0HG8Fm)NO4cEqxZK`@55-Nb6p@W% zKAqmf41x{XV}}T)_mn#N+Ixw0Hnd0Ex|49YXyn@8xLxG=+M&c7@&=B6%YZfA+I!(`nTx0+7r)l^TcEr8qHAcCg+Kte36Un4th}g+>vc|%Q5b5=ueF|7pff|mLTJ!a%oI| zHb^)yUfX!>og8{ZSTe;7&6blMMp3L%CJrS3B82zpGw{$}GvzjL!pGiEu)wsyohe_Y z^KWtweY_rl(ZV9jY2umYHABWHO_^{h$Iji^ElP!M8|rcdCy8ujZnJ(GXHBSUcqr8I z-8nx;r&*Ft7Rk=O$vpI<*Uoe#HOqf{qs|M47&hVUz?czv%1t+)l6m4@Z(-ci@ocH2 zSrVHyja!rofAU&QTVBp%y)Sg$98;`I;GHAzxw_ z$IWz12qE@Et#xH50X5~i?oSJ-JvLCwQ}vKDfHeF0COB2^2~Q0g=gbMw_L@*V9}_03 zC5+lYL~w=&&yg=A@um21ms}<3Ih>HY)?cHd(@o@%MjguTT)~g_OthvqY{;?+UK)?0 z_lva}q5~%r(a?!izcucdMK{RYG$p8!FuaSo3Xg?fKxAw1`TQzXgeShyM6F7)8sssL zJxX{!)+fzH=$Ps}n~WsCFXA_+Rkn!HWYf3_KE0gcZuiHmzg?22sS#nm?S4;dKoc6R z4;uGuSmXP~>m+?n?jyJT6RNI@u2UW9(^~O&n-K2pw)BWbpgELXuV5BxThuz!YzH01 z^TgFXiSs$OPP8YBxggJ*+m2{<2m0K)Gf{Z-ABzN3z0;6Zlyf1M@efOM!pbNJvkEXH z&F$FR)}?o@qEK}n-* z>@;LXZ4&cr%H8HYhp3`tt}{v265d}HZl4vN4MFJ-hpC0miXi|uOV3j^x9i{PGiY! zcFBciY4FK#xJOf|y|mQ9c03kdmJ_JH>^n-eA=g9BXYCgxY=hvC^IKxJV52ze`o!sk z`L(TMd+uTOh>gXFFmLUmVlr>1QG7HrY}#bhW+u{n)oB_9vw1Acs7wk;cQTDGmuP~Dr%)|~2D7Q|tm4m&@#md>7q&7*} z+ixT?lOJt{fQHQtkts)nG?b2awMMhXj+5SYav04bo2hVrz5^b3Z&3%E&FWvyeYDR{ zj(xB{={Arp=UjXXGLyU&&Kn{ukYtZBqE+%v6_zAcoA9_YDX8_l)Y=tP;X?dY!)i<3 zPGT!aY09!%Qf|2^r@+3i(dpMVCLu~>{wA7|ab_ZajI7pl3q9ma&h_}CKK_dWWUbjg zm7iO(LJx>Dne#w9m@nQHyWFbVbv>;M(^{BM(rrWS&-QiZn2)4^5f@ga8sOJ+=Bbw= zy!~KJNsH4f5!m8vTOc>)15#Q$`M{g!$rf00^vJXs@|h^KvKxqK$0k>FvU?KD40q@v zygHlH+o$Xts#T)2QU4X(!HFG7Q`@<8px2Oy9~IOt6^BopG-bGU7VV!a&N`!&2wNwX z3mmr2agfrvMJWc-=Js`J_8AQsDp%esTgRf3yK(r@1DyWgy?k|wy()E$@09ZPbA*(3 z+=!QY?TA-bj>CXB);WPya9!vdLt7YD{`$T5)?Ma{5maYlN@5Nmff!VJ#E~>2E(`dG|2&AjyIyfoFJ|+_?j)k(! zFK@8eq{d`#>w;+Z%yGe~K<|a~pFMUm5oalrzCNRXYANJequK72F1V!9wc(~uMs$>d zi?Q4qPmykDbCI4~`Hu55Ip^|D!~C#zaUZ=&q*n_VW612Hy^_XJOua}Q^R}_R;V`?n zpr{>vkFgH3gtvg%K?x_Py#q!@0L+}tdmyvv)4EsX!&pmA>ZT@3mwh8o`7+@F349jq z{Y!HAVhg8QlcDSQYK2bo4y&oQoye*rELYp`(epOQ(8j3>3-J>)NRbr7vXfmM9Wc_^ z3)7qoA9IbdMh)L8GBHJ%Y|FxAf?bQ6Y8wuaP6mB$(w2X!5sMvjW7;#L!3=leXWa1tszu zJ~lyNm+R|F0}lDQ*l-LheZ@uN5xKO-%B-()EK--b@3o{ap(Tz++Xv(gL1`s7Klf^W zMhR&@F1(iIPO+7vIb&x`n=)r~Bw}TEXKE7q)f{qqFv)5()q`_W%wzTYmlj(-jP$(!qX@aA)K9^=@ z_bnyOHuh?Ql#Y(H+z8RQ?=JrrFyK^+vHorVp9kLGhnsOR6mAG_5lyFoZcN zfi>zj=iIB0dcy?@JKa=gssZN-BY;mL=tY2d$erW=xuy)l}O~n0m~d%;^nirvW*f!9Kfv`)6R=Rnz1dv&U&^jRd88 zR%#p8nDgxD8!sI#dO8>p=}IdZ$ysaBK4z0Tx&vu0t$hcke11~{i4l1jWi7|9w@!GQ zYtCTAlrvtG!P0PsKrgn}S`j4H2MjV>eTc%qjq)Ayj_%5`muJh#|6Y{sGi)RIT=#({ z<#F#vQBfe-eV6K577wO`@*UTj^@iDs)68c)g_DYE*v_zA3Mnl@9 zU~5NPHMZ$(+o1mC3N)*GM-$3?xoUz}J&@f;_7PXduZbhs+^~3Xe_3`Ss+m}%gts%@ zlq2`yr+N8ZISn4H0N<|=pEkO2{X=R*^%pk=VNBin$&W3 znoi`+GmXe@R~8F$0wic?#~;;nc?%})6-`omF*0|XP(=1Ma$%TQG;KM zx`a2oI`uJ;QD?M{IJ@<9K84#RW1o-M839#>XZHdU8b9<6MwE@@OUdESziY`a4* zrPTG%dK+aft89uZ8!L}hp02JCF`Fw}plTUy*$7G1erVNKO{_faNg@7$ z%6b|^%1yLyMdhiuLb;(-8cC8+G6@#bwtiUV8L+JKc;(^BX1+>Hu@8}Sb4=NrD^EBk z!a~QWTY0<|k~UQCh%LWo`D$_Bl2q1IHmTmqyB{TeL_p1kwLp}rGeIb>R&2B++5jUpM*~9`TxIu`);&Yk&fTh zQ2IDhBWZwhNR1y<3{>e!eFJrSzQZ7m;fEH041}PfGW@ zKGQUiVQQMbD&@Rgo_SH&gaEqfgNeyhdF(#2%>bp3PznqZFFp3DZ5QwKRG9B2eNjfU zkR{P3tI-?lq!>);Q!Dd#7_kWB5*xNC(Z`8>Jg(da5lojF12jVt5;v!A)}gVf5Y#5~ zBxRwYWn)l2bW(I{gw9#2xw&#Lx0NS|TwK|Zxg`TR?^BbOS*@#>f9n%4QNiYi(OYSv zY#C%^CP1k-eoSmK)n&7}`0bR;4W_Bm94eq!mY*CRWW9UF*5s*@r_x6Jdlrx zIzrJtQC*BPrIN5mhRmbAzAkd}2BYW;rdAaH&D6D)vA`4`T0WGFZdR zhuKuUHDe>G5L0qND?O}9g^oeV$v(p77#&wPYFb$@4YGvdWG{*^tgRi7l1(Ow$Yk7p zl=!d<=pP4}7pMOebUW4laUVqwCSw(~9>cB1#$k5WHqqKBgF+^W3=%l@1dU@7PwY>1 zV2#BhZY|gRxtihP<_2z;&`l3l?uk$&HYxHL0oq)>-KHRno-RB}NEToQx=2 zFw`{FL+i#6GfyV!IfJrGmUa zCL-VMcs#?v-`t{tj-6Sm-H&-AcXXjR(V zDo^r2ryg5c>^Zq*_J~v7$|6Rr@XHmXcKN`5PSR`Lf<{N}x(Q-{3{^8`X(~bYL^MTa zzD+GM8n;U9QZ;Y9#0+bk&e$8o!Eu{aUuC1+(vX$tU@5&jDL7Ftut#lFJ(l09&>Bc< zM*?c{tq6kqNIXoJ1U(fc+bZh72PwhZsfjHbF|CkLMYv|zSLDsBa- z@Xwb-dzc?2Z#9W9hhdUqFgKgw%jSqwZW(GFBMz<_$ipO&r{ykHWqk^jR!y?3^F9G+ zeW@#VO$xMv(cI9_;Jlx7#ZEaHwo|BiGk3boz(SLlx@F^IG+{l4jRf6uTK(84DS9HN z@3m^A(GM~^JXvL;sLg0XyDl9j*(@@QY|Tv#%aj%MRP9G7tW@-|W}V>AaHA@vgJh89 zmy7P50Wx|Qg{aaj`lzKsj#imcv@DO*kX=VZ9r4+Wh~R^i6nsOdscp8Ut|Xh6kYLO< zwa-zXFUFbeTA*g=#c5fIFUOIM1#I&pt$5^GpQc@<$IGq_Z)-!68CVM}LDO8AC4tLgu z8l+)lh;5CCU#YsQcU9I_@1(o5fK4A)Ho_n}K@(R$GN&h-WC@tb5(5o17j$m4;-6x0 zLF|^wLu!lNs53leGLvlp+RqkHP>r?XGm@Ss7(!-~Q7Zlg@3b0So5Wctw^8WYSS*GL zsk)F_0SHGdwDWbA_!SH7$vBpuowZcxz9mqF=n5>~-UEiA5x zP6ns9<|INHlTTh^Oen-=bVS8js}2%V=atF|1|h;A^`%w?Zd+SjBx&_ZglAx z@#{AFek*q@u@sb1B?|AP@ms2QR&Qf1C6%GygorCnw%yM^z&*{YHpN)ZAXlW9xu@b# zC%WZE2KaJkS1{U)m5;Jn)KL;0R8_$O)^a~s9%*43Cor0%}e$v5M*+^;Z2dFRPvBe^c!jeinGo_Wx1AeWQJ|KGo9ha&Qgv43PVoyj~ zKdeI~%VmvjR11;5hpQ`NTcc_@Sz*$wN-aE5z0$~bIIq<2=8`?u11)djfz-f*fK)??* zQD0W>u^-Q{@q+B3*73*v{O# z79~=htj7aI10}dN2~@}xRV&4568%(%*AZ5;hW-ksQG`09qA>5JjDrC{$j_s&z^|jN z(b>rY)5kAiNbW7-K#0^0imvkLOR21;SU74P+M4;wlTf4J)EhD%(KYmvdlM6OGgE6_ zxzyAuyDhA9QN8sImLSPCd5Vr+y1k*q?4TvDI8XVRAtt#oI~NXYNZm{_-pqnngBrB? zIQB)L6rQA*px#q?_d*~qh>4UFCy4W&#VECb{QCRFmShH(=#o9f&aKT#-kszIleIIk z_Z*wmQk%@B)G|w{V3`GV=nQtTNgG+3^{~Z^Z9Z&cD74mT*|a><0V~OhVH@VoH3Vf7 zqPEsoZ{b)mBQVq&=;yJmjvLjxoW79-y>oQX06IysZEG3V_gPXz2)nO{(37Dx#>z(Q zP01U`Rq8+|C5xbhwKe6`ORt7>m=fq1?O&x#fy2RoNM|<9mTvWrB-Z<%(!8|Rtqj!J z2qONBgxB?tvJ__OBxhpVrMcCC_C#a5(NGE13@C{Kgu$LI$(rY?aSvr#tzl?AM&^4Z z)EOm}EMX-8u&vgQn)ZxW-OghghDUvqHG{kuYkzPiW_!|jw4)0cI>-5ZQ&AX-c@o$- zpd)u}MNBlICZl>=N-!j(UnGHkwTvFEE-^Dpp4+q$_6cA5N~#`-;i@&*GoxQAytpKN z>jtVD0gTP;Q4_1h=4U!N(|`u7N={+aHZv$WS4rY^PEG-cp2UlhW*u08j>~WBxwXud zpR}xsX;$lPqAtJxpCPD5fSKMjTd>w~DT3AA%^?>Nf2i`tQDv`j>|IT)Ba5uV~KktaSh5Cvps#C3DHsy zF=_OZIf)D-XQ@3%`(U-_#ClIBs>5bW>RYXywK5B~$=ZoJNh>$(QyP4CVzRJ~WA5|h zdJ+<&AQ=x*!{TeELZekf!%zEe)6v(BZ^1-P>)6^Ngu?l*}zwG6OQh> zDqumNn})7{6lmJWfATCKb}|cOXN zGSubJbtmi+#`rz{T9uLv5y@V5WbK?h`L`Sf7ai;7Z25zCIa1~{f&FNZdV2@v!Yu1j zvw}WIXV{E_O4U zl!&Y$Qm4{)l$H#SQVow%Oj!hjoNTDmxtGZmoPPE|62FOovwWyy$>0JpfG621|KFhm zbJRrKuhUQpni-rQ9T}{w9xb);l-nwtl9--YW2)#aUa-tn69E&L1=2AdQ_vbSJ4DawmqWrKU}9r&u`w(NE|TM<-2 zV)sO4+0c|fn8}#F(bU5Ff;3Nr1?+m1^#c*o`IsiCWI>X;^{p5`7HMtc^{OMx%JRHW zLr|JJpdX6ik4Ze$UvkAbV1V$9DW6IK^zo$GGMC z!=5utoSI2~N{f>gFS0FDcoCrUCAKEpfSRV!rHhS^^(V|7`88>c5PmA_#Wuu$Tjxdg zOU-$2buBJ|Z~#B)X++=u%9rT0nGo@zW6Udsz%!;&wPcjYLP@;UDiOg_d6`4~Chc%) zC6N!}saaK7Z$JK(%rN=@tQRfDolVNiQ6(H%#d$>On?wRebCn%JcMQdM>cT33*$#0Zr?T%K{9=ih%gfCUJD^7&Th1`OeVSfG{aak zHKF)61hbX|ruv-5qo34fjS9M=D&47GA!;%0-fXNAsmwz(YiL%Qrc942ZVR7`a;Cwi z75oP;YRuz}$WJ)$Y6sobFX>)B)!EzykEz$Jf3Nq%dom|$CA9Ji|Kf-55n`ACrR9)l z>2s-^0mq_H&8MrZr~Ph6+IUuv8f5D$nupo-Qo^*a((+yQU_|;Jx?gq2l}BJ9v{(mF z3;XwObPrmltqN++5xU~d5U;LijjPM0c<4W96M@_=fi{lP`C}p5A$!1HwR5Z)3wVQr z<|b0spbb^GAx5hhQG@a2#kYaJlXgPScsHwh?nO8jdDp3GlIram)cL@oZO%v4=pptD zHTQ!ilzs$-;TOT?FcS6abH*&SUdGtN&B`+rl4W5qDiIXMyVC0z3ccioZwc8Lcpz7n@BSgA4ZF&BsT^a)R{>r=?H5D%MSnJcPPf- zo*{X7zb5TBOCD7cdop#6!bFYa-JfrWoC3<4Q!ek^5Wq4)#o4C1Zig%!&#gZ4KpZ zWMYybaJ z6q-I_t@4tcG&e=))7EfL^UVWT0kFiJOWq?}l>y_2FM^;2ChF7;(xp6P;;E7K z2`P)*G;x`$vL+am9qPxe#XLDx>?y|8yFui$x(9iWa#PLf7s*J*t#XPXIY^To}V*smg%henidYxz)0 z<`jb(K@$)`_ltJ7vXL?zNIaab$CcB}BZ7#4Br(&l9m)?|rBpa95lT>@8yN$^+ixw9DTm;P6GEhS zVQvy|T9Lq8@lC{$1b+fU({~S?F^0GymS|7X1){cb9e$=7?)7bl?+z&V^ z8B}XuXkBHk^hdgal+CZlk0D~5(RM}RAfTgls+5|&u{ykh8bGwPVVlNsoAM%SPS=_f z5J40=h%){4qnp)LM6;Or!2J<-z2hxP8mG_H22Xv}9D90QHlr6kvS+#Y8Yf_*qlK5U&v*Z4Oj#ofjxH_%>ES#br8r^4dN zg>murOH4;c`c7#>;Sgk2NCAS%RnOU;F5lZ2;)Cm1*b4sdvWY#0; z?n$F5(}<?>ZkBbv2IJWb())RZn>gqyf0dwZcSctmg9giLei%- zy;t{8B}iM^ucT_hYm=7VoPs7zeVTgB43uCb)3aLIpaPf4zcWEiNvj&S31N~you02~ zaB3=LtFx9LjdS9B5u6DPY!sE^uiq8&o94VSYHxR|=;fLjxPJR) zDv|Enso~dQiOBpstR{GT_U2}RXZlcztZhu`jnE^N!aC57)hd2tbtSdkNyBvhdn5i2 zPjki}(}*m0_?Ef?N$w{3#ad{}{$?#a%sPHV6LwI-R;e7lZD5pXOw^Fe!wqsi!7doD zA?aQ4bV265n3_BqPgzH}vN;lLOI9w^^?oQhSxJr&sxEYZdry92NI(887mlBag*xU%^iO#M)x-frgGQwX86#o72< zLNlaTiLp=tu2T~ndsw;eYdzLN`27Edv(;$QZ9AFPEHKNy>%sSxWLJu#IuI@=V}*?C6z^Rpt0TqMx>@ zeqadNl4jtIbyJzdQ7?ALK4(2E`S-3+@BQ`uc?h*;{d+%dW%L>Kj<39sL~3{p5*@}w4hvbqX=~`7bj&0tT9Sv(JK%p`SYr!0t34Ls z#;wd`O~&Z7y1WzZSBU+vRCj83c>`0NO`67qD(DYG|)GNpqrLSnmEC-s~vJ^)=nSW@k3Woz4TJEO`RGg106_K zcU=~34!EOB&HndWhEkbU0t{k3fuDH3Q5Pr)bBIXwno~Kig@W;_LO+6 zZ7Ln;XI9(He}1%Wgan+1l?}tuSsZ=Q2M3w2gCNN*2&*;L+~R~{vRmFf_Jda?L%t^R zwXRa>S?3?IN-0&%Tt<0lD%1~CS3fOXTzSMb*g3!DY=|J$mVM=5LU*Pum* z{T{S#!Y@KsWY<%HjSnUz>q8igz=^9iLrK6kRugBb)4ZI$khxR4Wye^uJwPT*3SBQF z*QpYnzOZe`HTrxEh*KAE6q}|;-H_N^k5H^+#2B? zQHPb3d?z4%tH}tL)nzXCqzrWryN6QJVukISBoC7%8rc}f39rbbVd?9vEqOpPxhY^V zt3T~3hw}xE>V++yUX5e9OzFFl> zhnCgMx??x4>2L=TjS$hq)*>yeU`<2kn#EPOm8$s$y28dBTQ(*anv!r#5O~!8^fu+x zWYx-5{L=X=li2L%UfkZ(z_*Jf+2-6B%uyAyCJKq587BM5F*_VB3A{E9=}(>*Z;kuu zEM^6<{v>6_Ri{sB+(yaFhRGH|jEMLzvNC#O`@QbWQ@Cy3cQKRIjM`m!Btxj;HILgX zP7+m+e0$4%8P?_lb){QR*?etB4Cs;NT4yl#V4SRvDYi!IWh$-{AkpDmQ1DGt z54|W49CC_CZF1~M*DGFVWc-@wW@^duMp-HNVaCa7^k@i@M@KX;hBW5I;yUS0oL3ow zlP;}Y(29|zr^7MKwMNk~{IW)f_t>o%*?s`AlLqwgb1TApP9 zj0`%+MqYYela|AU>Wa#PnHp^yGaW}^hA{3AWIr1ZBWt+s$`OR~M+K!x^0x7G{{KnYzal0oJ_1b}s# zj04#O@EG$}CX!gYt1GbMYCBiFY5D5%rVR0(x<)JrS}!Pf+F=GbN2^G_+?Mu1bxAqa znLe%ut;ZNMOb-0(*EtMB)0xEB$jF$55h=Yov@*lsN=Xjnxbk)Q;Z{4^j#UI%5+OD& zDEX;fnPu=YjVp9AU7R*gj!Ab0K_oHqYrp3WtJ1H5dota)3~lE8Ln!T0tkYx~%m^K7 z(68K-NiCLPjD576f1oO3F6$@fv+|l`HJ!B7a#Uq3>g9!o((KmNzLCu&Vhu#2pE7k^ zUtQ>j#3+|B=9HJp$AQjtXY-{q;|9=AB5Z|pAIF%8_m$pt5@b}GHk56UmW{T-)KmF> z=`ny5W=6yqVZ`UEWvd(>$yeu7`yYj)bGkuZLviMd4b|Cb$B_Wn?QoFw9mV+xy5_)6 z$b&dHesjhVDqmK$W<4Id5fPwYsRAw}e033-X~{)skBhJVvOyGaS2LPqK=`xyF74pn zvxKe2eXWs_)9ZEPH*lv~JF|%&nJL|B66bBudsUb>TJb@C`XZmV%1 zsC0cx+EwkOIa9U!6ujaWPsGTRePpbiPTz&rE2A<2lxe4t$VZ3U`j z+XI;52me${rjX2WHESi!-qGp8WaxJBA{-C1V{Ta*#ak$`m4Mpl20>;L$|N4Hw#huy z!qPebW~*02KAx*MTZAR{Phv;e&sy==&;G9a+;+}#N+jDr-=Ym$>j?3f#lM?GBn+FG z$7JBU&-R4RI=$3VICzmICXu4;36I)E^Zit^O=_y?7k;xXvp1^Ls?er<&(Lj_W4?!s z&KEOaQie0EKJYG8`&CY5jr(?~UwB*1sbAYhKkEp1%8a4LCKi%(d152s>XJZc-Ly*j zOHzaQ&JUeRcp$O|v@IFrjzy|J_>7E|YO6PR5`kB7a9Da%>BXAC)D#4pi}PQZ z12w#}mB>Z)5F8BpY^TVR%$Od;^Y7)|dp5-io-!?It-=ll z_9^=n_JlI&G>TZ-%w9k@(x$yl8SW2PIWM48&gj-`98p4ewJ-cWlf6hFX{hrrQqHb_ ztq-f6dbUU;Y!p?oVMKBmNWM`>(JE))+KF?C4X0T3uCx-!%Z4J!ZplL`AB#`U@lp%R za#On$l)Sj=S09O&PIAy+Sk81DXSid@q0+1sbnoWs?dlSn+aw$5s)_dv_DRcd1 zn|VS0{0S2cP4%7ac|0XXNdai)N%W+atO#X9O7k74&HWT(m9qNPsvikcok&>lL?;aL zeuAJ+Eg8i6^o)U;Hw9^7ICD+;shb9(w2aG43aSp51W|T$1+Ur`$fP^OF#n?$t`f}` zHK#+R>OH?Aa%&6SlUv8J0mAL|Rya3_XuYKDgAao03TVt6@~f`Y@X1KAnxAe^m=%%! zB>K2ZFP(M8S!c9PoHQlfi=gxLExz@LrZeM)N=NipmpiqEewAoz$HpAdx3C7qthNzN zHhWJc4B?sur}aCFyrtxHLPO7qR@Oj70CtWTI? zRauQ)D)YlWKdAGWG+qmK6W4)5Y1dPCOzrY>@MivEA70s|SPlGxIN#Jb^X$u<{gQa!ar}m}wH4KT{<4Wq*WLl6h z>ee)-E1myRy-4>oI@TcR(bUbjm15MSEPsJ1EV*Q58M4qHU`8+#t721qthg+gGoRW?$Xh5_}Ru>`ujnxJ^ZFTzeUY&$Cg_QrQt7$ zNa^{6&=*UlquHDII-|5hR9in#d5!-cbAnDo&=4ANoVf)1!j`YK_D$8POXHTa9I?CA zfh&R;nbA#RsTr$?6?{caVS8IvO*({SfcSZd)h}N14XsVHN^u*%2j9jIRr7n#`dN1S znc`mmtH1n2@GyQcH?LFZ{+FHfGs*l&uYS?GFW1?*hz$HHe7Uc?yVTRmFF^DA;hp{m zfi;;y6d!nzrqt~k39Rm_E8Iz%OoXLC^(J4_@MmoXW{Zd0n*}Py*6tB`FgnSLWDR-% zLobi)XhQ9UWt?M!mRWHl(!G}gb0LE78bbq{1@UZ6mRLUiTk!Ps+ce!J4ui}}Hi9de zua8S}2D4}O%yA0#t0V?D3Wj~&%o@ds>(;VLX3EMB7g*JOEwIM4~zsN<#rIqy(U~?L~o=#0nC)lZ{ zSRW=d5lBo-*U>sXL1Cd+!;kf-H8z7VUgQJCxTr1-t{i)xHLIxhDAv7#=uUE;83oqTm0p2O2Z-RIkUozq)(s_!! z>MPJ$I;Q1&7nXV!@B{Y6+`N2`Hrgmw;^t=y*$L`#)}MOfcVgHZe37LT7IrkwoKon5qyN%JRYr>=f0OixhA*ScyA*a6CEA97 zOQHH;JJF6+a(WZ>|sSs2eO(U3|u8B59KTbF);I zfY=Cg4*R>(&oCsLLbkE3%|My2oY>>qXm3S9Ace9GwE}@mKGLDBY$QxCUZ`NFpG*wN zsEuosTxN@qyyhY8uU}rl5V6D`L%m{xmebw?%!l!nbT#?a45LH&Pyg(pHHGo2Y%s3GR3fvecKQ6j6ndo-R z3P!KB0dE^cx#el2dPN&mIj@;0&K|NDq*|8;HAgjS`Q|~=1+LvIE`~jMq)a~!hnQ;| z+!EUt8wM#LVVVd_)u1)3&cUX*8Uap*67d+-^cs#6gxJ_p&8z^F(T_~2yzJO)+*OId zQYW(EPKJz|HDl7uL7GvUfx6|!QU6*)GAj^~k~xeJTcIejG%+tsBVoR8y~LaAp}Ksa zOx4yqdB$wEgm_i9iieed?Ppd~F2W-F8nL#S=%Tp1sN9?H>S$?Woa|7$To2T3d(rWZ zyK9YXtXlORwc zYRo~(N?)Dy>-FJXI9~q0;?7>TiWrE(TklgWRYU>e3FuRR(xVhnAczJcphFZ9N;X`i zkXN8UpbH2^d6{*~lklD6pY>ig3rIl}k+OU3@r*s5IUdj2^s;O>LjVrE*|_NoP0Iwm zr5|Kz@jEt-2dlC+Wv!adGH&5Zcu#+}yAol_mrP1=im_@XW#TNy5y*0xa@9ik3U~;< ztgYekjvxzkKv?E6R~Wt-sQ|4XmN^ zF@A@Di$^;vfUG5*y!PDT&gvivu$|TLZ#)^lB7bjhUu{|F42R5-y}YgJ^pPs2(FA~}r$lOXI9-jz4mNxXX9 zw#bORl}adeD2aL$i1v|SBe|s=4BI7|lbn6T=-40o^U8}tgLhvV(@h**O;=NMvf(3K z3qX+R6$76(=*;oLpu}1Xme>1)hGE)JyyWSe$d}a%LDVsw&3CO$jA!FbJ7AIV;Uj@a zt@uBPOX22q=;=i!=e067kzYf4>}J0IK_h8VHV$|WB-81PGQ9sDRvQDXLa*iqxmPA> zSY;QCMa#Ni%k0rgTkPsRuOnm5rWWt$;;^{4NEgBtmZFdLcWOBW4@VYsZe3B8!o@Li Xk?bU(sMYMhXGobdaxNDQf%7EYb1u2+J{w*Ac)$18XKYSSj@gvJy=uiF;mPD@z z8i1v-7>+=1Ohl>Rc=W@0Scdl-OGuQWV4bJHFt(%In1@p1BPcgs#BTT{#$nz1h7pRX z$h(bYSQDMt7G2mGD>N{S033?)yvf)e)3E{XH{K;t9Ur2!EU2NbKrNIP)JGrejDFZ1 zeK7&0qLV7A(R5 ze9dw%$_q|d`45nJYJ7q6Ag?H0@se19d=N@Y>tQ*J!Vv6?(vaaO4VZ#bfyH(bvh3Di zGt9#tcn9S{P3Q)>Fd98`0Hs3Ru`~|0^2sQ(KMkc~c8tNr*c;zR>4EaRBnT^`RLI`M zDu_iIW%Ng`H5OwZJb|Ooj~UYnC!q|*PArG#QD*rUC@-|NFpO9ni84gnP_93L^4uF% zK9Gskn)e&cNOa^xD#oJ|+hH-@HViwWRBRh|$E#Qyt3(?{ICetGCnFCuvathRKzU9n z3S+Swmd7k)p&47TiLC!iB&19JLRnscY19DEEJfePsRLBf+zcX!%B0N0V0;U^<5jD?3jHtV>tPr+N4Y=Vax}{Gr*)wJtC5&PfmCDzvMCw6QOZ9< zdB9_oAqt?DGKMv=K1L(&G?Gy6&q0RWIE*YH<0q_%;hpsAibLsAD~Q~#CKD3LTtPv>JZAV#E1t>#Q zva6mm{ZaM{`#2Kv!f7a7n~qYE^_Yx#C^Zl6rdv`2E0J%6zSs@r`WMj$C!thiD%Qeu zlp)H&0eBCmU@Wzv0d^yogxqierN(ZQ2R^_O=-WdZfYQ|!QC?gJ6R-)&+*piBxDiL7 z{7M-OBT?qk84SnUC=K=QB|R_WPeN*58|A_EJtvqjD9ft@N(B>8CQmZToOlJL!ns%j z-@{UP7i;2Ul!}G2|H>+9h?TJu2I6Q8<^9GC64K&qjK$qp1;0aiL9ssi#bGE9YKs2Y z9qZu`Y>64z6i;Gpe29%Pq^~aTg3ZX!MY-<~+U0>?kdPPtjM74XW{iwo9h6Dd3mFY# z9I{CoZz2oC_z|V$Q7;-s3mkw<7b6?1<295D{DF0_UO(L<@yM-4Qa}1%YFa=+ef$#3 zqF;aARiP*kYJu{i!Po@nqqHE`I`2Xm!hhf-l!+l-JsHd6GL+|TL4Q1m0eC8b{tqPa z5d|^?w@~tbpggeD0A7j#SOzCzG`@r~soul}coi9Ljbr*R0j8KfJs z9vhKAVJ8tu;vP=LFy1y3mm~KWCU*_P!ARqbqu2sV4Q1EF4)_wDM47zJxmad@3`z?( zqckWNr3c5XYC%7Y6~Cf!H)GTuZ#95P*-gjLB;#SmPH z()Br52~SzNrqln@1HV`o{E5}bmz%*1$0%eP7>}?eCa^Z+F&k}o6S;-oYS^PnizwUAB$4q3~Yth@D=oD^GHDZ3KCsN+(9O=(SZKkgR8L?ww|lk`6vt}KNV$J zWubKOZj=hXZ{@FJY4T67IF^{FmuFd&26RH%H^!lj_ZzcG(7VQK7=)$g>tCrhlpDrj zBxa$!=p>fKs~C>Ak@;zO)2!y0g3^OKQ7Ui{L+~)l^Dm)1_ZC)=_3uptQXt>rs#xE$ zJ2oXh0p)?4Eq7ym@_8sjaUJFUZ?Pi&7s@0JT%bQfbx|tb8Dnv%CjCM(E zCXt4>aSIO2&~xH9Y)C$aMJo@QjMCN1a6CRn*=mQgm}Mh6k8$`L4#sv%^uMGWm`wgN zWWgA1mgDTy|HD+NYe1b!<0^KL~+ozF`7rkN? zWTR{#8_@?(qpa8WP+ImG_QCsBd25;>_jkt#9E=Sx1M6ZwR>Uu?^S@vS`KqsbzNU7g z1&J5r29z;=55utdCjH{-D3dA*N8%im^KMMSU#;??oApQQEu2ibKQlQR=V2o}iZZvp z!33wD78twq_qi&{g$|V2{RYaI9znVB7BJ=k28OVNMoAv4<6kHZwe8XW;n8jn{a=TIITT2jZbz9MhcFy3pj7Za zo<-li`t$iA$~ynW(!NjsUMRI+ua>PC!}(88CSSk-{o;C9oO~S0Q1m)L|4Ua4r$C%- zUAP)+lh4I?{2R(LtaDI17;WTV#in=wrAKaA<&Uu{`3kxEx@IU1NwD%Wusiv+b`rHn z+(hY`VtKl&s$*mFov{q2VJlpOeeop9Tq$!%m-j&_Uy8%fjRUbozW&X(0-KQk)Y9io zT|s+u5*duBXOZ8BQXYOpZ?XL_n*1J=hJA$& z^gXJ-1>0~C`5VaGV*MBB@Ahcy%n1j^$pzR6YaY{+Yl3Ay${7BEr_ngBhu|G-P4+Q1 z#KtG|x*v{>$uCD4s*@-~`w;8O`VVSxS%I#OUwS)gYs#(22bI3?E8WC5yq2Wd(ql(uo8Ls)P_RX zhxC64iRKifU@w#xpTwc~A^KsROL|g9;UMxm@iqJlx8nNCdS7Vqk)C8DP-gqy{wpS8-_P}L!6Ueed>fbEM=l}tH&zfcNYH+Ll(SqfXF2v^RU(F{OPrzX zXQBb=!o!P1cVdcF@B`kn(!IGZg7j#jfapU0KK@9wB5lLhOx{0@MA2gxC#5UL;!t8B zX_>VfNEaS^tn>)W{O`{#TSToZ0xI366mZn1tU1bRkR#l>rakE$#B3?#7)ALWEM=WvV#(HF#FL(k!*Mw#5zz#z((d_M zkv8m{>?s!za>#~K^jJwocEuO0^HOt@^a&h?Rj>~s$7P}vkxdM=u3t}@9oqPUNTp0x zMKKxwToMr!BoMbrFUGRO3L=Gk2w@|AjHpk#3=u}i!4B;Che$N%CJ}|lX3|~BOe9{m z%6&+ewl1hBWfIbgrB+;ccBg-GIkB8zL}kpIq+jckS| z$8yFw*16wES0c?;VAzN9*Nenz>m*5ICh2a(1gq@tl=UHo6ohNC0Eq_@@ zKdZblc_-5{n4bB6zlACZ(J9w#^VLXH}o+hm=;MZOJbFDsvkZ^=a*Ev>S*Nsl3Y7i$o!i2<^U{1=JI)FeO1)VkSSe__yj}+Oz;;-ryp2q1?!qJud zulPDX#j`{*>3W15+wdR}PkK9M6T3*y!~HlF8xm`Xe4-ICfbv5qM>C>4aYVkS%cO*3 zvBvZF75=V8bl`@y#0AoW@FmY#ep``_B(liQ!pG=?P4GpOBM~QHX}s^xm}O0!)xQo&_aJs!Wn=IkR{9l7p%?eQi}i@! z!~*iO>?G1j49B+C!!MDRBb_Kt*;?FzCvgc;mAFW3q3ku3<9Cg*4Qo;U5Wlm^gxQoC zetsRtr>4$GvW-r$rB0nWAvMLOPPg@S-ib;s=94xfX}a3cYOu3>^n6ooX?<1M+f*r; znmTiG>gYsHoo~}lMYUbze4$-eQ*Dl^Alq z-RYXz*!ia4)X_6$%ub!2*xII^#`RLOyKGcFyVg+oU7M@lyHo(0)pLV~i{CWmD zZ}pgBs#U$ZsULgSbZ+Q9*;E02S2(Zrt?8xO_KS4B(eIe4?j&4x-W|}&%h_Y_i>5j{ zqscVNMmNG zHpAzrS|chu`;N#n)yz?g)UIZI)y&Zsozus-O*J+#TwP53#xH5~Oxx(OW0PjgP~RnW zRB_48)T-o;YRb5gs@V7h=X>K9m}=cbf0aEk(P>VKGu5)mmDGom=cx%(>Xb=Jv`w9! znml20(hOSv^^{N5pDE$$Ny<*|2`?w9AE{*S)GF%f)MaYjw1KL_^fc$4=@aSLnei$n zt(uBXYvDYf_N}+NJ*TO&{mU-||=k>YarZVRbRjcPGs9LXNsBQLh>h^*coy*gE zd8=BP%T%?+byd~HiM~@(8MDzdlblL zYMb4bf>p|I#q~xx?sV5aSH3I9b<~|z&#*<<+>6}{$rjisKj_YMXSp+Mt{is;rA`&J zazd#hx2W`$bBpGk=BgO)q6Mmx%JXp@aqU%Y*47GJ%5x96m$>#Cu3fI9JT%?4*TyR{ z-0AA{+Grnn#hP_>oPE~yG@pCQw)OGxt~}RP!@bmD2pK`cb4uDhfEmC4>6TXvDHE`z*O2Kk^XU)|i@+3#7$?R7TD8Dy%wJ=N5eJ;Ak}J=)V# ziaQrW(9I zP(9cmq^2C0rM4XGr4}B{EMMeR?yS}fCL^Pga}(9696yzi7o$$(1w1!*KF+JykLjJ~ z%5|@@)?T;1(p<)IpX-3@P0yr|Cb$Ge12@v7dqGHmo?Q_xxwn|H@6o(p_Vzfsr!e+ozo7l_EJ6teS?@x$9Ptz)m5GW zx?9jmH9A&VH9pbG`TFr>FID#BC6#dMYc+g>uj=r2q<-i8x6jp(TDX@o0()$(<xB)@)*qBK^%XrX&en;G7l-LYqYp#8m?RG_w$%BhA10`-m;R|UeJ^(?OjJ<$mmBNM z-NMqSkJhW7K59|oC^K<&YeV(gP%&5*)lt`;!qsB+zbbpBgG#?LOx?WFRek@-8a3^o zp{n1ft5wEl5stfo=3Ld`ZztDWtE4Jls~GS<_SEjzQq^16=B{xyRE=GmRqmf*>U&pN z6}KYOdDdObR4uRfQ_HVMs?*oU5!IYs{vPI4N?I@TZti?Tr9X{vj=DL-WEd)zbnWs? zfw}Y5KW^1fLvObXW_w{OWif;EZ9NC{l69Qt%9G}lu(kH&)a~0rCFFrw?o3tVt1)WK z*Db=I&3JaAMKWye#n!FX6hb$%~G#CuB^Y1rSFBR7w<)@?0Z#96h89kz4oPb zuh-MHD0RP2U8!Q>?M#zJOmV(8|KY>A{C>2*HS(UFS*mjFev}u4KP|7Sf8Q`dKispl z*e`ceGX_LwbLoyFvWqX$uWt0isF3IO6@l5sm z&jq#FTs*ruogzEZ9(v?IZL%Nd)qFPdnI@jGT_0dpE+_q$BXe11&;M5(#Dw@ym#aCC z!}Z8HA6HkOKYmfg{kl#K`)!-b|GkSd_jl8)0-rX|z%ZMc%hsSe{$AR&mG;atYwJ{J zE{CZ3XMI)PleUf>zGkp$`Hyt9^3N(2sHOfy(7tECnbfI2tEy#x)?n3cA|loNzb>gB z|J+{28ce1m-(zJyZKhg2jc|^AI>yU!-ZU>cLcGlw$6;@CqQmB6Hgfd!F(U$9Cm8d5 zsoHUV+AMXa7i9RDEltO%VrKmihHxdnXXFA;M_XHuV@`2%-v4@XVsZ1;|MO&Lw%v3- z*8Iei-%HPa2s~?`bd~29mZw4N5Blvzy1<=fDBCyXiydWQ7dW>2niU-xzUD5+s*>g` z$CrL)L&pX`bBp6_X*1MuqqJFVl&8BrTg9^~8tnUBZ<6V0l zpZIfMN`QH!+`pZ1ZS|8U*Hlfu@hKP>Xcm}`fFLt6*v3X@{fzTW5xoOBh6b6hlrM5l zy3w;YIerc@3mi|&o9{Uyg3U^fxL|X5(cR3kC)n&AlqvI+?|6a1qRR2CY{!j?Wq#AxP*x_HvEcx$eS_HfD spWR#ZuJlS~vwy!>9#f{;K01F1J)ifV?qhGDf{u=1W|M-nFf-EpZ#VenA^-pY diff --git a/archinstall/locales/ar/LC_MESSAGES/base.po b/archinstall/locales/ar/LC_MESSAGES/base.po index 24671221..48380b73 100644 --- a/archinstall/locales/ar/LC_MESSAGES/base.po +++ b/archinstall/locales/ar/LC_MESSAGES/base.po @@ -26,19 +26,19 @@ msgid "Do you really want to abort?" msgstr "هل تُريدُ حقًا إجهاضَ العَملِيَّة؟" msgid "And one more time for verification: " -msgstr "ومرة أخرى للتحقق: " +msgstr "ومرة أخرى للتّحقّق: " msgid "Would you like to use swap on zram?" msgstr "هل تريد استخدام swap أو zram؟" msgid "Desired hostname for the installation: " -msgstr "اسم المضيف المُراد للتثبيت: " +msgstr "اسم الحاسوب المُراد للتّثبيت:" msgid "Username for required superuser with sudo privileges: " msgstr "اسم المتستخدم لأجل المستخدم الخارِق المطلوب مع امتيازات sudo: " msgid "Any additional users to install (leave blank for no users): " -msgstr "أي مستخدمين إضافيين للتثبيت (اتركه فارغًا لعدم وجود مستخدمين): " +msgstr "أيّ مستخدمين إضافيّين للتّثبيت (اتركه فارغًا لعدم وجود مستخدمين): " msgid "Should this user be a superuser (sudoer)?" msgstr "هل يجب أن يكون هذا المستخدم خارقا (sudoer)؟" @@ -59,29 +59,29 @@ msgid "Only packages such as base, base-devel, linux, linux-firmware, efibootmgr msgstr "فقط الحزم مثل base وbase-devel وlinux وlinux-firmware وefibootmgr و حِزم مِلف اختيارية سوف تُثَبَّت." msgid "Note: base-devel is no longer installed by default. Add it here if you need build tools." -msgstr "" +msgstr "ملاحظة: لم يعد base-devel مثبتًا بشكل أصلي. أضفه هنا إذا كنت بحاجة إلى أدوات البناء." msgid "If you desire a web browser, such as firefox or chromium, you may specify it in the following prompt." -msgstr "إذا كنت ترغب في متصفح الويب ، مثل Firefox أو chromium، فيمكنك تحديده في موضِع الكتابة التالي." +msgstr "إذا كنت ترغب في متصفح Web، مثل Firefox أو Chromium، فيمكنك تحديده في موضِع الكتابة التالي." msgid "Write additional packages to install (space separated, leave blank to skip): " msgstr "اكتب حزمًا إضافية لتثبيتها (تُفصَل بالمسافات، اتركها فارغة للتخطي): " msgid "Copy ISO network configuration to installation" -msgstr "انسخ إعداد شبكة الـISO للتثبيت" +msgstr "انسخ إعداد شبكة ISO للتّثبيت" msgid "Use NetworkManager (necessary for configuring internet graphically in GNOME and KDE)" -msgstr "استخدم مُدير الشبكة (ضروري لإعداد الإنترنت باستخدام واجهة رسومية في جنوم و كيدي)" +msgstr "استخدم NetworkManager (ضروري لإعداد الإنترنت باستخدام واجهة رسومية في جنوم و كيدي)" msgid "Select one network interface to configure" -msgstr "حدِّد واجهة شبكة واحدة للإعداد" +msgstr "حدِّد ربط شبكة واحد للإعداد" msgid "Select which mode to configure for \"{}\" or skip to use default mode \"{}\"" -msgstr "حدد الوضع المراد تهيئته لـ\"{}\" أو تخطى لاستخدام الوضع الافتراضي \"{}\"" +msgstr "حدّد الوضع المراد تهيئته لـ\"{}\" أو تخطى لاستخدام الوضع الأصلي \"{}\"" #, python-brace-format msgid "Enter the IP and subnet for {} (example: 192.168.0.5/24): " -msgstr "أدخِل الIP مع تجزئة الشبكة لـ{} (على سبيل المثال: 192.168.0.5/24): " +msgstr "أدخِل الـ IP و تجزئة الشّبكة لـ {} (مثالا: 192.168.0.5/24): " msgid "Enter your gateway (router) IP address or leave blank for none: " msgstr "أدخل عنوان IP الخاص بالبوابة (جهاز التوجيه) أو اتركه فارغاً لعدم وجود عنوان IP: " @@ -90,20 +90,20 @@ msgid "Enter your DNS servers (space separated, blank for none): " msgstr "أدخل خوادم DNS الخاصة بك (يجب أن تكون مفصولة بمسافات، أو فارغة في حالة عدم وجود خوادم): " msgid "Select which filesystem your main partition should use" -msgstr "حدد نظام الملفات الذي يجب أن يستخدمه القسم الرئيسي الخاص بك" +msgstr "حدّد نظام الملفّات الذي يجب أن يستخدمه التّقسيم الرّئيسي الخاص بك" msgid "Current partition layout" -msgstr "تخطيط القسم الحالي" +msgstr "تخطيط التّقسيم الحالي" msgid "" "Select what to do with\n" "{}" msgstr "" -"حدد ما يجب القيام به باستخدام\n" +"حدّد ما يجب القيام به باستخدام\n" "{}" msgid "Enter a desired filesystem type for the partition" -msgstr "إدخال نوع نظام الملفات المطلوب للقسم" +msgstr "إدخال نوع نظام الملفّات المطلوب للتّقسيم" msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): " msgstr "أدخل نقطة البداية (بوحدات مجزأة: s، GB، %، إلخ؛ default: {}): " @@ -121,7 +121,7 @@ msgid "" msgstr "" "{}\n" "\n" -"حدد حسب الفهرس الأقسام المراد حذفها" +"حدّد حسب الفهرس الأقسام المراد حذفها" msgid "" "{}\n" @@ -130,13 +130,13 @@ msgid "" msgstr "" "{}\n" "\n" -"اختر حسب الفهرس القسم الذي تريد تحميله حيث" +"اختر حسب الفهرس التّقسيم الذي تريد تثبيته حيث" msgid " * Partition mount-points are relative to inside the installation, the boot would be /boot as an example." -msgstr " * نقاط تحميل القسم هي نسبية داخل التثبيت، سيكون الإقلاع /boot كمثال. " +msgstr " * نقاط تثبيت التّقسيم هي نسبية داخل التثبيت، سيكون الإقلاع /boot كمثال. " msgid "Select where to mount partition (leave blank to remove mountpoint): " -msgstr "حدد مكان تحميل القسم (اتركه فارغاً لإزالة نقطة التحميل): " +msgstr "حدّد مكان تثبيت التّقسيم (اتركه فارغاً لإزالة نقطة التثبيت): " msgid "" "{}\n" @@ -145,7 +145,7 @@ msgid "" msgstr "" "{}\n" "\n" -"حدد القسم المراد إخفاءه للتهيئة" +"حدّد التّقسيم المراد إخفاءه للتهيئة" msgid "" "{}\n" @@ -154,7 +154,7 @@ msgid "" msgstr "" "{}\n" "\n" -"حدد القسم المراد وضع علامة على أنه مشفر" +"حدّد التّقسيم المراد وضع علامة على أنه مشفّر" msgid "" "{}\n" @@ -163,7 +163,7 @@ msgid "" msgstr "" "{}\n" "\n" -"حدد القسم المراد وضع علامة على أنه قابل للإقلاع" +"حدّد التّقسيم المراد وضع علامة على أنه قابل للإقلاع" msgid "" "{}\n" @@ -172,25 +172,25 @@ msgid "" msgstr "" "{}\n" "\n" -"حدد القسم المراد وضع علامة على أنه قابل للتمهيد" +"حدّد التّقسيم المراد وضع علامة على أنه قابل للتّمهيد" msgid "Enter a desired filesystem type for the partition: " -msgstr "أدخل نوع نظام الملفات المطلوب للقسم: " +msgstr "أدخل نوع نظام الملفّات المطلوب للتّقسيم: " msgid "Archinstall language" -msgstr "لغات Archinstall" +msgstr "لغة Archinstall" msgid "Wipe all selected drives and use a best-effort default partition layout" -msgstr "امسح جميع محركات الأقراص المحددة واستخدم تخطيط القسم الافتراضي الأفضل من حيث الجهد" +msgstr "امسح جميع محرّكات الأقراص المحدّدة واستخدم أفضل جهد ممكن لتخطيط التّقسيم الأصلي" msgid "Select what to do with each individual drive (followed by partition usage)" -msgstr "حدد ما يجب فعله بكل محرك أقراص على حدة (متبوعًا باستخدام القسم)" +msgstr "حدّد ما يجب فعله بكلّ محرّك أقراص على حدة (متبوعًا باستخدام التّقسيم)" msgid "Select what you wish to do with the selected block devices" -msgstr "حدد ما ترغب في القيام به مع أجهزة الكتلة المحددة" +msgstr "حدّد ما ترغب في القيام به مع أجهزة الكتلة المحدّدة" msgid "This is a list of pre-programmed profiles, they might make it easier to install things like desktop environments" -msgstr "هذه قائمة بالملفات الشخصية المبرمجة مسبقاً، قد تسهل تثبيت أشياء مثل بيئات سطح المكتب" +msgstr "هذه قائمة بالملفّات الشخصية المبرمجة مسبقاً، قد تسهل تثبيت أشياء مثل بيئات سطح المكتب" msgid "Select keyboard layout" msgstr "تحديد تخطيط لوحة المفاتيح" @@ -199,7 +199,7 @@ msgid "Select one of the regions to download packages from" msgstr "اختر إحدى المناطق لتنزيل الحزم منها" msgid "Select one or more hard drives to use and configure" -msgstr "حدد محرك أقراص ثابت واحد أو أكثر لاستخدامه وإعداده" +msgstr "حدّد محرّك أقراص ثابت واحد أو أكثر لاستخدامه وإعداده" msgid "For the best compatibility with your AMD hardware, you may want to use either the all open-source or AMD / ATI options." msgstr "للحصول على أفضل توافق مع أجهزة AMD الخاصة بك، قد ترغب في استخدام إما خيارات جميع المصادر المفتوحة المصدر أو AMD / ATI." @@ -217,34 +217,34 @@ msgid "" msgstr "" "\n" "\n" -"حدد برنامج تشغيل رسومات أو اتركه فارغاً لتثبيت جميع برامج التشغيل مفتوحة المصدر" +"حدّد برنامج تشغيل رسومات أو اتركه فارغاً لتثبيت جميع برامج التشغيل مفتوحة المصدر" msgid "All open-source (default)" -msgstr "جميعها مفتوحة المصدر (افتراضي)" +msgstr "جميعها مفتوحة المصدر (أصلي)" msgid "Choose which kernels to use or leave blank for default \"{}\"" -msgstr "اختر النواة التي تريد استخدامها أو اتركها فارغة للإعداد الافتراضي \"{}\"" +msgstr "اختر النواة التي تريد استخدامها أو اتركها فارغة للإعداد الأصلي \"{}\"" msgid "Choose which locale language to use" -msgstr "اختر اللغة المحلية التي تريد استخدامها" +msgstr "اختر اللّغة المحلية التي تريد استخدامها" msgid "Choose which locale encoding to use" -msgstr "اختر ترميز الإعدادات المحلية المراد استخدامها" +msgstr "اختر ترميز اللّغة الذي تريد استخدامه" msgid "Select one of the values shown below: " msgstr "اختر إحدى القيم الموضحة أدناه: " msgid "Select one or more of the options below: " -msgstr "حدد واحداً أو أكثر من الخيارات أدناه: " +msgstr "حدّد واحداً أو أكثر من الخيارات أدناه: " msgid "Adding partition...." -msgstr "إضافة قسم...." +msgstr "إضافة تقسيم...." msgid "You need to enter a valid fs-type in order to continue. See `man parted` for valid fs-type's." msgstr "تحتاج إلى إدخال نوع fs صالح من أجل المتابعة. انظر 'man parted' لمعرفة نوع fs صالح." msgid "Error: Listing profiles on URL \"{}\" resulted in:" -msgstr "خطأ: نتج عن إدراج ملفات التعريف على عنوان URL \"{}\":" +msgstr "خطأ: نتج عن إدراج ملفّات التعريف على عنوان URL \"{}\":" msgid "Error: Could not decode \"{}\" result as JSON:" msgstr "خطأ: تعذر فك تشفير نتيجة \"{}\" كنتيجة JSON:" @@ -262,13 +262,13 @@ msgid "Locale encoding" msgstr "ترميز الإعدادات المحلية" msgid "Drive(s)" -msgstr "محرك (أو محركات)" +msgstr "محرّك (أو محرّكات)" msgid "Disk layout" msgstr "تخطيط القرص" msgid "Encryption password" -msgstr "كلمة سر التشفير" +msgstr "كلمة سر التّشفير" msgid "Swap" msgstr "ذاكرة التبديل(Swap)" @@ -298,7 +298,7 @@ msgid "Additional packages" msgstr "الباقات الإضافية" msgid "Network configuration" -msgstr "ضبط الشبكة" +msgstr "ضبط الشّبكة" msgid "Automatic time sync (NTP)" msgstr "المزامنة التلقائية للوقت (NTP)" @@ -313,12 +313,12 @@ msgid "" "Do you wish to continue?" msgstr "" "قررت تخطي اختيار القرص الصلب\n" -"وستستخدم أي إعداد لمحرك الأقراص مثبت على {} (تجريبي)\n" +"وستستخدم أيّ إعداد لمحرّك الأقراص مثبت على {} (تجريبي)\n" "تحذير: لن يتحقق برنامج Archinstall من ملاءمة هذا الإعداد\n" "هل ترغب في المتابعة؟" msgid "Re-using partition instance: {}" -msgstr "إعادة استخدام مثيل القسم: {}" +msgstr "إعادة استخدام مثيل التّقسيم: {}" msgid "Create a new partition" msgstr "أنشئ قسماً جديداً" @@ -333,16 +333,16 @@ msgid "Assign mount-point for a partition" msgstr "تعيين نقطة تثبيت لقسم" msgid "Mark/Unmark a partition to be formatted (wipes data)" -msgstr "وضع علامة/إلغاء وضع علامة على قسم ليتم تهيئته (مسح البيانات)" +msgstr "وضع علامة/إلغاء وضع علامة على تقسيم ليتم تهيئته (مسح البيانات)" msgid "Mark/Unmark a partition as encrypted" -msgstr "وضع علامة/إلغاء وضع علامة على قسم على أنه مشفر" +msgstr "وضع علامة/إلغاء وضع علامة على تقسيم على أنه مشفّر" msgid "Mark/Unmark a partition as bootable (automatic for /boot)" -msgstr "تحديد/إلغاء تحديد قسم على أنه قابل للإقلاع (تلقائي ل /boot)" +msgstr "تحديد/إلغاء تحديد تقسيم على أنه قابل للإقلاع (تلقائي ل /boot)" msgid "Set desired filesystem for a partition" -msgstr "تعيين نظام الملفات المطلوب للقسم" +msgstr "تعيين نظام الملفّات المطلوب للتّقسيم" msgid "Abort" msgstr "إلغاء" @@ -360,7 +360,7 @@ msgid "Set/Modify the below options" msgstr "تعيين/تعديل الخيارات التالية" msgid "Install" -msgstr "التثبيت" +msgstr "التّثبيت" msgid "" "Use ESC to skip\n" @@ -368,7 +368,7 @@ msgid "" msgstr "استخدم ESC لتخطي\n" msgid "Suggest partition layout" -msgstr "اقتراح تخطيط التقسيم" +msgstr "اقتراح تخطيط التّقسيم" msgid "Enter a password: " msgstr "أدخل كلمة مرور: " @@ -380,7 +380,7 @@ msgid "Enter disk encryption password (leave blank for no encryption): " msgstr "أدخل كلمة مرور تشفير القرص (اتركها فارغة لعدم وجود تشفير): " msgid "Create a required super-user with sudo privileges: " -msgstr "أدخل كلمة مرور تشفير القرص (اتركها فارغة لعدم استخدام التشفير): " +msgstr "أدخل كلمة مرور تشفير القرص (اتركها فارغة لعدم استخدام التّشفير): " msgid "Enter root password (leave blank to disable root): " msgstr "أدخل كلمة مرور الجذر (اتركها فارغة لتعطيل الجذر): " @@ -392,7 +392,7 @@ msgid "Verifying that additional packages exist (this might take a few seconds)" msgstr "التحقق من وجود حزم إضافية (قد يستغرق ذلك بضع ثوانٍ)" msgid "Would you like to use automatic time synchronization (NTP) with the default time servers?\n" -msgstr "هل ترغب في استخدام المزامنة التلقائية للوقت (NTP) مع خوادم الوقت الافتراضية؟\n" +msgstr "هل ترغب في استخدام المزامنة التلقائية للوقت (NTP) مع خوادم الوقت الأصلية؟\n" msgid "" "Hardware time and other post-configuration steps might be required in order for NTP to work.\n" @@ -412,7 +412,7 @@ msgid "" " Choose an object from the list, and select one of the available actions for it to execute" msgstr "" "\n" -" اختر غرضًا من القائمة، وحدد أحد الإجراءات المتاحة لتنفيذه" +" اختر غرضًا من القائمة، وحدّد أحد الإجراءات المتاحة لتنفيذه" msgid "Cancel" msgstr "إلغاء" @@ -489,7 +489,7 @@ msgid "No network configuration" msgstr "لا يوجد إعداد للشبكة" msgid "Set desired subvolumes on a btrfs partition" -msgstr "تعيين وحدات التخزين الفرعية المطلوبة على قسم btrfs" +msgstr "تعيين وحدات التخزين الفرعيّة المطلوبة على تقسيم btrfs" msgid "" "{}\n" @@ -498,10 +498,10 @@ msgid "" msgstr "" "{}\n" "\n" -"حدد القسم الذي تريد تعيين وحدات التخزين الفرعية عليه" +"حدّد التّقسيم الذي تريد تعيين وحدات التخزين الفرعيّة عليه" msgid "Manage btrfs subvolumes for current partition" -msgstr "إدارة وحدات تخزين btrfs الفرعية للقسم الحالي" +msgstr "إدارة وحدات تخزين btrfs الفرعيّة للتّقسيم الحالي" msgid "No configuration" msgstr "لا يوجد إعدادات" @@ -565,53 +565,53 @@ msgid "" " Fill the desired values for a new subvolume \n" msgstr "" "\n" -" املأ القيم المطلوبة لوحدة التخزين الفرعية الجديدة \n" +" املأ القيم المطلوبة لوحدة التّخزين الفرعيّة الجديدة \n" msgid "Subvolume name " -msgstr "اسم وحدة التخزين الفرعية " +msgstr "اسم وحدة التّخزين الفرعيّة " msgid "Subvolume mountpoint" -msgstr "نقطة تحميل وحدة التخزين الفرعية" +msgstr "نقطة تثبيت وحدة التّخزين الفرعيّة" msgid "Subvolume options" -msgstr "خيارات وحدة التخزين الفرعية" +msgstr "خيارات وحدة التّخزين الفرعيّة" msgid "Save" msgstr "حفظ" msgid "Subvolume name :" -msgstr "اسم وحدة التخزين الفرعية :" +msgstr "اسم وحدة التّخزين الفرعيّة :" msgid "Select a mount point :" -msgstr "حدد نقطة التثبيت :" +msgstr "حدّد نقطة التّثبيت :" msgid "Select the desired subvolume options " -msgstr "حدد خيارات وحدة التخزين الفرعية المطلوبة " +msgstr "حدّد خيارات وحدة التّخزين الفرعيّة المطلوبة " msgid "Define users with sudo privilege, by username: " msgstr "تحديد المستخدمين الذين لديهم امتياز sudo، حسب اسم المستخدم: " #, python-brace-format msgid "[!] A log file has been created here: {}" -msgstr "[!] تم إنشاء ملف سجل هنا: {}" +msgstr "[!] تم إنشاء ملفّ سجل هنا: {}" msgid "Would you like to use BTRFS subvolumes with a default structure?" -msgstr "هل ترغب في استخدام وحدات التخزين الفرعية BTRFS ذات البنية الافتراضية؟" +msgstr "هل ترغب في استخدام وحدات التخزين الفرعيّة BTRFS ذات البنية الأصلية؟" msgid "Would you like to use BTRFS compression?" msgstr "هل ترغب في استخدام ضغط BTRFS؟" msgid "Would you like to create a separate partition for /home?" -msgstr "هل ترغب في إنشاء قسم منفصل لـ /home؟" +msgstr "هل ترغب في إنشاء تقسيم منفصل لـ /home؟" msgid "The selected drives do not have the minimum capacity required for an automatic suggestion\n" -msgstr "لا تحتوي محركات الأقراص المحددة على الحد الأدنى من السعة المطلوبة للاقتراح التلقائي\n" +msgstr "لا تحتوي محرّكات الأقراص المحدّدة على الحد الأدنى من السعة المطلوبة للاقتراح التلقائي\n" msgid "Minimum capacity for /home partition: {}GB\n" -msgstr "الحد الأدنى لسعة القسم /home: {} جيجابايت\n" +msgstr "الحد الأدنى لسعة التّقسيم /home: {} جيجابايت\n" msgid "Minimum capacity for Arch Linux partition: {}GB" -msgstr "الحد الأدنى لسعة قسم Arch Linux: {} جيجابايت" +msgstr "الحد الأدنى لسعة تقسيم Arch Linux: {} جيجابايت" msgid "Continue" msgstr "متابعة" @@ -623,34 +623,34 @@ msgid "no" msgstr "لا" msgid "set: {}" -msgstr "حدد: {}" +msgstr "حدّد: {}" msgid "Manual configuration setting must be a list" msgstr "يجب أن يكون إعداد التكوين اليدوي قائمة" msgid "No iface specified for manual configuration" -msgstr "لا يوجد وجه (iface) محدد للتكوين اليدوي" +msgstr "لا يوجد وجه (iface) محدّد للتكوين اليدوي" msgid "Manual nic configuration with no auto DHCP requires an IP address" msgstr "يتطلب تكوين nic اليدوي مع عدم وجود DHCP التلقائي عنوان IP" msgid "Add interface" -msgstr "إضافة واجهة" +msgstr "إضافة ربط" msgid "Edit interface" -msgstr "تعديل الواجهة" +msgstr "تعديل الرّبط" msgid "Delete interface" -msgstr "حذف الواجهة" +msgstr "حذف الرّبط" msgid "Select interface to add" -msgstr "حدد واجهة لإضافتها" +msgstr "حدّد ربطًا لإضافته" msgid "Manual configuration" msgstr "ضبط يدوي" msgid "Mark/Unmark a partition as compressed (btrfs only)" -msgstr "وضع علامة/إلغاء وضع علامة على قسم كقسم مضغوط (btrfs فقط)" +msgstr "وضع علامة/إلغاء وضع علامة على تقسيم كقسم مضغوط (btrfs فقط)" msgid "The password you are using seems to be weak, are you sure you want to use it?" msgstr "يبدو أن كلمة المرور التي تستخدمها ضعيفة، هل أنت متأكد من أنك تريد استخدامها؟" @@ -659,7 +659,7 @@ msgid "Provides a selection of desktop environments and tiling window managers, msgstr "يوفر مجموعة مختارة من بيئات سطح المكتب ومديري نوافذ التجانب، مثل gnome و kde و sway" msgid "Select your desired desktop environment" -msgstr "حدد بيئة سطح المكتب التي تريدها" +msgstr "حدّد بيئة سطح المكتب التي تريدها" msgid "A very basic installation that allows you to customize Arch Linux as you see fit." msgstr "تثبيت أساسي جداً يسمح لك بتخصيص آرتش لينكس (Arch Linux) كما تراه مناسباً." @@ -668,7 +668,7 @@ msgid "Provides a selection of various server packages to install and enable, e. msgstr "يوفر مجموعة مختارة من حزم الخوادم المختلفة لتثبيتها وتمكينها، مثل httpd و nginx و mariadb" msgid "Choose which servers to install, if none then a minimal installation will be done" -msgstr "اختر الخوادم التي سيتم تثبيتها، إذا لم يكن هناك أي خوادم، فسيتم إجراء الحد الأدنى من التثبيت" +msgstr "اختر الخوادم التي سيتم تثبيتها، إذا لم يكن هناك أيّ خوادم، فسيتم إجراء الحد الأدنى من التّثبيت" msgid "Installs a minimal system as well as xorg and graphics drivers." msgstr "تثبيت الحد الأدنى من النظام بالإضافة إلى إكسورج (xorg) وبرامج تشغيل الرسومات." @@ -677,16 +677,16 @@ msgid "Press Enter to continue." msgstr "اضغط على Enter للمتابعة." msgid "Would you like to chroot into the newly created installation and perform post-installation configuration?" -msgstr "هل ترغب في الانتقال (chroot) إلى التثبيت الذي تم إنشاؤه حديثاً وإجراء تهيئة ما بعد التثبيت؟" +msgstr "هل ترغب في الانتقال (chroot) إلى التّثبيت الذي تم إنشاؤه حديثاً وإجراء تهيئة ما بعد التثبيت؟" msgid "Are you sure you want to reset this setting?" msgstr "هل أنت متأكد من رغبتك في إعادة ضبط هذا الإعداد؟" msgid "Select one or more hard drives to use and configure\n" -msgstr "حدد محرك أقراص صلب واحد أو أكثر لاستخدامه وضبطه\n" +msgstr "حدّد محرّك أقراص صلب واحد أو أكثر لاستخدامه وضبطه\n" msgid "Any modifications to the existing setting will reset the disk layout!" -msgstr "أي تعديلات على الإعداد الحالي سيعيد ضبط تخطيط القرص!" +msgstr "أيّ تعديلات على الإعداد الحالي سيعيد ضبط تخطيط القرص!" msgid "If you reset the harddrive selection this will also reset the current disk layout. Are you sure?" msgstr "إذا قمت بإعادة تعيين اختيار القرص الصلب، فسيؤدي ذلك أيضًا إلى إعادة تعيين تخطيط القرص الحالي. هل أنت متأكد؟" @@ -705,7 +705,7 @@ msgid "No audio server" msgstr "لا يوجد خادم صوت" msgid "(default)" -msgstr "(افتراضي)" +msgstr "(أصلي)" msgid "Use ESC to skip" msgstr "استخدم زر الهروب ESC للتخطي" @@ -737,16 +737,16 @@ msgid "Value: " msgstr "القيمة: " msgid "You can skip selecting a drive and partitioning and use whatever drive-setup is mounted at /mnt (experimental)" -msgstr "يمكنك تخطي تحديد محرك أقراص وتقسيمه واستخدام أي إعدادات محرك أقراص مثبتة على /mnt (تجريبي)" +msgstr "يمكنك تخطي تحديد محرّك أقراص وتقسيمه واستخدام أيّ إعدادات محرّك أقراص مثبتة على /mnt (تجريبي)" msgid "Select one of the disks or skip and use /mnt as default" -msgstr "حدد أحد الأقراص أو تخطى واستخدم /mnt كافتراضي" +msgstr "حدّد أحد الأقراص أو تخطى واستخدم /mnt كأصلي" msgid "Select which partitions to mark for formatting:" -msgstr "حدد الأقسام التي تريد وضع علامة عليها للتهيئة:" +msgstr "حدّد الأقسام التي تريد وضع علامة عليها للتهيئة:" msgid "Use HSM to unlock encrypted drive" -msgstr "استخدام HSM لإلغاء قفل محرك الأقراص المشفر" +msgstr "استخدام HSM لإلغاء قفل محرّك الأقراص المشفر" msgid "Device" msgstr "جهاز" @@ -773,7 +773,7 @@ msgid "Should \"{}\" be a superuser (sudo)?" msgstr "هل يجب أن يكون \"{}\" مستخدمًا خارقًا (sudo)؟" msgid "Select which partitions to encrypt" -msgstr "حدد الأقسام المراد تشفيرها" +msgstr "حدّد الأقسام المراد تشفيرها" msgid "very weak" msgstr "ضعيف جداً" @@ -797,10 +797,10 @@ msgid "Delete subvolume" msgstr "حذف الحجم الفرعي" msgid "Configured {} interfaces" -msgstr "تهيئة {} الواجهات" +msgstr "هُيِّئَت {} روابط" msgid "This option enables the number of parallel downloads that can occur during installation" -msgstr "يتيح هذا الخيار عدد التنزيلات المتوازية التي يمكن أن تحدث أثناء التثبيت" +msgstr "يتيح هذا الخيار عدد التنزيلات المتوازية التي يمكن أن تحدث أثناء التّثبيت" msgid "" "Enter the number of parallel downloads to be enabled.\n" @@ -818,7 +818,7 @@ msgid " - Minimum value : 1 ( Allows 1 parallel download, allows 2 downloads a msgstr " - الحد الأدنى للقيمة: 1 (يسمح بتنزيل متوازي واحد، ويسمح بتنزيلين في المرة الواحدة)" msgid " - Disable/Default : 0 ( Disables parallel downloading, allows only 1 download at a time )" -msgstr " - تعطيل/افتراضي: 0 (تعطيل التنزيل المتوازي، يسمح بتنزيل واحد فقط في كل مرة)" +msgstr " - تعطيل/أصلي: 0 (تعطيل التنزيل المتوازي، يسمح بتنزيل واحد فقط في كل مرة)" #, python-brace-format msgid "Invalid input! Try again with a valid input [1 to {max_downloads}, or 0 to disable]" @@ -837,11 +837,11 @@ msgid "TAB to select" msgstr "TAB لتحديد" msgid "[Default value: 0] > " -msgstr "[القيمة الافتراضية: 0] > " +msgstr "[القيمة الأصلية: 0] > " msgid "To be able to use this translation, please install a font manually that supports the language." msgstr "" -"لتتمكن من استخدام هذه الترجمة، يرجى تثبيت الخط يدوياً الذي يدعم اللغة.\n" +"لتتمكن من استخدام هذه الترجمة، يرجى تثبيت الخط يدوياً الذي يدعم اللّغة.\n" "To be able to use this translation, please install a font manually that supports the language." msgid "The font should be stored as {}" @@ -855,14 +855,14 @@ msgstr "تحديد وضع التنفيذ" #, python-brace-format msgid "Unable to fetch profile from specified url: {}" -msgstr "تعذر جلب ملف التعريف من عنوان url المحدد: {}" +msgstr "تعذر جلب ملفّ التعريف من عنوان url المحدّد: {}" #, python-brace-format msgid "Profiles must have unique name, but profile definitions with duplicate name found: {}" -msgstr "يجب أن يكون لملفات التعريف (profile) اسم فريد، ولكن تم العثور على تعريفات ملفات التعريف (profile) ذات أسماء مكررة: {}" +msgstr "يجب أن يكون لملفّات التعريف (profile) اسم فريد، ولكن تم العثور على تعريفات ملفّات التعريف (profile) ذات أسماء مكررة: {}" msgid "Select one or more devices to use and configure" -msgstr "حدد جهازاً واحداً أو أكثر لاستخدامه وإعداده" +msgstr "حدّد جهازاً واحداً أو أكثر لاستخدامه وإعداده" msgid "If you reset the device selection this will also reset the current disk layout. Are you sure?" msgstr "إذا قمت بإعادة تعيين تحديد الجهاز فسيؤدي ذلك أيضاً إلى إعادة تعيين تخطيط القرص الحالي. هل أنت متأكد؟" @@ -871,21 +871,21 @@ msgid "Existing Partitions" msgstr "الأقسام الموجودة" msgid "Select a partitioning option" -msgstr "حدد خيار التقسيم" +msgstr "حدّد خيار التّقسيم" msgid "Enter the root directory of the mounted devices: " msgstr "أدخل دليل الجذر للأجهزة المثبتة: " #, python-brace-format msgid "Minimum capacity for /home partition: {}GiB\n" -msgstr "الحد الأدنى لسعة القسم /home: {} جيجا بايت GiB \n" +msgstr "الحد الأدنى لسعة التّقسيم /home: {} جيجا بايت GiB \n" #, python-brace-format msgid "Minimum capacity for Arch Linux partition: {}GiB" -msgstr "الحد الأدنى لسعة قسم آرش لينكس (Arch Linux): {} جيجا بايت (GiB)" +msgstr "الحد الأدنى لسعة تقسيم آرش لينكس (Arch Linux): {} جيجا بايت (GiB)" msgid "This is a list of pre-programmed profiles_bck, they might make it easier to install things like desktop environments" -msgstr "هذه قائمة بالملفات الشخصية المبرمجة مسبقاً_bck، قد تسهل تثبيت أشياء مثل بيئات سطح المكتب" +msgstr "هذه قائمة بالملفّات الشخصية المبرمجة مسبقاً_bck، قد تسهل تثبيت أشياء مثل بيئات سطح المكتب" msgid "Current profile selection" msgstr "اختيار الملف الشخصي الحالي" @@ -894,7 +894,7 @@ msgid "Remove all newly added partitions" msgstr "إزالة جميع الأقسام المضافة حديثاً" msgid "Assign mountpoint" -msgstr "تعيين نقطة التحميل" +msgstr "تعيين نقطة التثبيت" msgid "Mark/Unmark to be formatted (wipes data)" msgstr "وضع او إلغاء علامة تحديد التهيئة (مسح البيانات)" @@ -903,31 +903,31 @@ msgid "Mark/Unmark as bootable" msgstr "وضع او إلغاء علامة قابل للإقلاع" msgid "Change filesystem" -msgstr "تغيير نظام الملفات" +msgstr "تغيير نظام الملفّات" msgid "Mark/Unmark as compressed" msgstr "وضع او إلغاء علامة كمضغوط" msgid "Set subvolumes" -msgstr "تعيين المجلدات الفرعية" +msgstr "تعيين المجلدات الفرعيّة" msgid "Delete partition" -msgstr "حذف القسم" +msgstr "حذف التّقسيم" msgid "Partition" msgstr "تقسيم" msgid "This partition is currently encrypted, to format it a filesystem has to be specified" -msgstr "هذا القسم مشفر حالياً، ولتهيئة نظام الملفات يجب تحديد نظام الملفات" +msgstr "هذا التّقسيم مشفّر حالياً، ولتهيئة نظام الملفّات يجب تحديد نظام الملفّات" msgid "Partition mount-points are relative to inside the installation, the boot would be /boot as an example." -msgstr "نقاط تحميل القسم تكون نسبية داخل التثبيت، سيكون الإقلاع /boot كمثال." +msgstr "نقاط تثبيت التّقسيم تكون نسبية داخل التثبيت، سيكون الإقلاع /boot كمثال." msgid "If mountpoint /boot is set, then the partition will also be marked as bootable." -msgstr "إذا تم تعيين نقطة التثبيت /boot، فسيتم وضع علامة على القسم أيضًا على أنه قابل للإقلاع." +msgstr "إذا تم تعيين نقطة التّثبيت /boot، فسيتم وضع علامة على التّقسيم أيضًا على أنه قابل للإقلاع." msgid "Mountpoint: " -msgstr " نقطة التثبيت: " +msgstr "نقطة التّثبيت: " msgid "Current free sectors on device {}:" msgstr "القطاعات الخالية الحالية على الجهاز {}:" @@ -936,51 +936,51 @@ msgid "Total sectors: {}" msgstr "إجمالي القطاعات: {}" msgid "Enter the start sector (default: {}): " -msgstr "أدخل قطاع البداية (افتراضي: {}): " +msgstr "أدخل قطاع البداية (أصلي: {}): " msgid "Enter the end sector of the partition (percentage or block number, default: {}): " -msgstr "أدخل قطاع نهاية القسم (النسبة المئوية أو رقم الكتلة، الافتراضي: {}): " +msgstr "أدخل قطاع نهاية التّقسيم (النسبة المئوية أو رقم الكتلة، الأصلي: {}): " msgid "This will remove all newly added partitions, continue?" msgstr "سيؤدي ذلك إلى إزالة جميع الأقسام المضافة حديثاً، متابعة؟" #, python-brace-format msgid "Partition management: {}" -msgstr "إدارة التقسيم: {}" +msgstr "إدارة التّقسيم: {}" #, python-brace-format msgid "Total length: {}" msgstr "الطول الإجمالي: {}" msgid "Encryption type" -msgstr "نوع التشفير" +msgstr "نوع التّشفير" msgid "Iteration time" -msgstr "" +msgstr "مُدّة التّكرار" msgid "Enter iteration time for LUKS encryption (in milliseconds)" -msgstr "" +msgstr "أدخل مدّة التّكرار لتشفير LUKS (بالملّي ثانية)" msgid "Higher values increase security but slow down boot time" -msgstr "" +msgstr "تزيد القِيَمُ الأعلى من مستوى الأمان ولكنّها تبطئ وقت بدء التّشغيل" msgid "Default: 10000ms, Recommended range: 1000-60000" -msgstr "" +msgstr "الأصلي: 10000 ملّي ثانية، النّطاق المُستَحسَن: من 1000 إلى 60000" msgid "Iteration time cannot be empty" -msgstr "" +msgstr "مُدّة التّكرار لا تكون فارغة" msgid "Iteration time must be at least 100ms" -msgstr "" +msgstr "مُدّة التّكرار ينبغي ألّا تقلّ عن 100 ملّي ثانية" msgid "Iteration time must be at most 120000ms" -msgstr "" +msgstr "مُدّة التّكرار ينبغي ألّا تتجاوز 120000 ملّي ثانية" msgid "Please enter a valid number" -msgstr "" +msgstr "الرّجاء إدخال رقم صحيح" msgid "Partitions" -msgstr "التقسيمات" +msgstr "التّقسيمات" msgid "No HSM devices available" msgstr "لا توجد أجهزة HSM متوفرة" @@ -989,25 +989,25 @@ msgid "Partitions to be encrypted" msgstr "الأقسام المراد تشفيرها" msgid "Select disk encryption option" -msgstr "حدد خيار تشفير القرص" +msgstr "حدّد خيار تشفير القرص" msgid "Select a FIDO2 device to use for HSM" msgstr "اختر جهاز FIDO2 لاستخدامه في HSM" msgid "Use a best-effort default partition layout" -msgstr "استخدم أفضل تخطيط افتراضي للتقسيم الافتراضي" +msgstr "استخدم أفضل جهد ممكن لتخطيط التّقسيم الإصلي" msgid "Manual Partitioning" -msgstr "التقسيم اليدوي" +msgstr "التّقسيم اليدوي" msgid "Pre-mounted configuration" msgstr "تهيئة مثبتة مسبقاً" msgid "Unknown" -msgstr "غير معروف" +msgstr "مجهول" msgid "Partition encryption" -msgstr "تشفير التقسيم" +msgstr "تشفير التّقسيم" #, python-brace-format msgid " ! Formatting {} in " @@ -1026,13 +1026,13 @@ msgid "Password" msgstr "كلمة المرور" msgid "All settings will be reset, are you sure?" -msgstr "ستتم إعادة ضبط جميع الإعدادات، هل أنت متأكد؟" +msgstr "ستتم إعادة ضبط جميع الإعدادات، هل أنت متأكّد؟" msgid "Back" msgstr "رجوع" msgid "Please chose which greeter to install for the chosen profiles: {}" -msgstr "يرجى اختيار المُرحِّب الذي سيتم تثبيته للملفات الشخصية المختارة: {}" +msgstr "يرجى اختيار المُرحِّب الذي سيتم تثبيته للملفّات الشّخصية المختارة: {}" #, python-brace-format msgid "Environment type: {}" @@ -1045,7 +1045,7 @@ msgid "Installed packages" msgstr "الحزم المثبّتة" msgid "Add profile" -msgstr "إضافة ملف شخصي" +msgstr "إضافة ملفّ شخصي" msgid "Edit profile" msgstr "تعديل الملف الشخصي" @@ -1063,10 +1063,10 @@ msgid "Packages to be install with this profile (space separated, leave blank to msgstr "اكتب حزمًا إضافية لتثبيتها (تُفصَل بالمسافات، اتركها فارغة للتخطي): " msgid "Services to be enabled with this profile (space separated, leave blank to skip): " -msgstr "الخدمات التي سيتم تمكينها مع ملف التعريف هذا (مفصولة بمسافة، اتركها فارغة للتخطي): " +msgstr "الخدمات التي سيتم تمكينها مع ملفّ التعريف هذا (مفصولة بمسافة، اتركها فارغة للتخطي): " msgid "Should this profile be enabled for installation?" -msgstr "هل يجب تمكين ملف التعريف هذا للتثبيت؟" +msgstr "هل يجب تمكين ملفّ التعريف هذا للتثبيت؟" msgid "Create your own" msgstr "اصنع بنفسك" @@ -1076,7 +1076,7 @@ msgid "" "Select a graphics driver or leave blank to install all open-source drivers" msgstr "" "\n" -"حدد برنامج تشغيل رسومات أو اتركه فارغاً لتثبيت جميع برامج التشغيل مفتوحة المصدر" +"حدّد برنامج تشغيل رسومات أو اتركه فارغاً لتثبيت جميع برامج التشغيل مفتوحة المصدر" msgid "Sway needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)" msgstr "يحتاج Sway إلى الوصول إلى مقعدك (مجموعة من الأجهزة مثل لوحة المفاتيح والماوس وغيرها)" @@ -1088,7 +1088,7 @@ msgid "" msgstr "" "\n" "\n" -"حدد خياراً لمنح Sway إمكانية الوصول إلى أجهزتك" +"حدّد خياراً لمنح Sway إمكانية الوصول إلى أجهزتك" msgid "Graphics driver" msgstr "مشغل الرسومات" @@ -1100,28 +1100,28 @@ msgid "Please chose which greeter to install" msgstr "يرجى اختيار المُرحِّب الذي سيتم تثبيته" msgid "This is a list of pre-programmed default_profiles" -msgstr "هذه قائمة بالملفات الافتراضية المبرمجة مسبقًا" +msgstr "هذه قائمة بالملفّات الأصلية المبرمجة مسبقًا" msgid "Disk configuration" msgstr "ضبط القرص" msgid "Profiles" -msgstr "الملفات الشخصية" +msgstr "الملفّات الشخصية" msgid "Finding possible directories to save configuration files ..." -msgstr "البحث عن الدلائل المحتملة لحفظ ملفات الإعدادات ..." +msgstr "البحث عن الدلائل المحتملة لحفظ ملفّات الإعدادات ..." msgid "Select directory (or directories) for saving configuration files" -msgstr "تحديد مجلد (أو مجلدات) لحفظ ملفات التكوين" +msgstr "تحديد مجلد (أو مجلدات) لحفظ ملفّات التكوين" msgid "Add a custom mirror" -msgstr "إضافة مرآة مخصصة" +msgstr "إضافة مرآة مخصّصة" msgid "Change custom mirror" -msgstr "تغيير المرآة المخصصة" +msgstr "تغيير المرآة المخصّصة" msgid "Delete custom mirror" -msgstr "حذف المرآة المخصصة" +msgstr "حذف المرآة المخصّصة" msgid "Enter name (leave blank to skip): " msgstr "أدخل الاسم (اترك الاسم فارغاً للتخطي): " @@ -1130,16 +1130,16 @@ msgid "Enter url (leave blank to skip): " msgstr "أدخل عنوان url (اتركه فارغاً للتخطي): " msgid "Select signature check option" -msgstr "حدد خيار التحقق من التوقيع" +msgstr "حدّد خيار التحقق من التوقيع" msgid "Select signature option" -msgstr "حدد خيار التوقيع" +msgstr "حدّد خيار التوقيع" msgid "Custom mirrors" -msgstr "مرايا مخصصة" +msgstr "مرايا مخصّصة" msgid "Defined" -msgstr "محدد" +msgstr "محدّد" msgid "Save user configuration (including disk layout)" msgstr "حفظ إعدادات المستخدم (بما في ذلك تخطيط القرص)" @@ -1156,12 +1156,12 @@ msgid "" "\n" "{}" msgstr "" -"هل تريد حفظ ملف (ملفات) الضبط {} في الموقع التالي؟\n" +"هل تريد حفظ ملفّ (ملفّات) الضبط {} في الموقع التالي؟\n" "\n" "{}" msgid "Saving {} configuration files to {}" -msgstr "حفظ {} ملفات الإعدادات إلى {}" +msgstr "حفظ {} ملفّات الإعدادات إلى {}" msgid "Mirrors" msgstr "المرايا" @@ -1179,7 +1179,7 @@ msgid "Locales" msgstr "المحلية (Locales)" msgid "Use NetworkManager (necessary to configure internet graphically in GNOME and KDE)" -msgstr "استخدم مُدير الشبكة NetworkManager (ضروري لإعداد الإنترنت باستخدام واجهة رسومية في جنوم و كيدي)" +msgstr "استخدم NetworkManager (ضروري لإعداد الإنترنت باستخدام واجهة رسومية في جنوم و كيدي)" msgid "Total: {} / {}" msgstr "الإجمالي: {} / {}" @@ -1191,10 +1191,10 @@ msgid "If no unit is provided, the value is interpreted as sectors" msgstr "إذا لم يتم توفير أي وحدة، يتم تفسير القيمة على أنها قطاعات" msgid "Enter start (default: sector {}): " -msgstr "أدخل البداية (افتراضي: القطاع {}): " +msgstr "أدخل البداية (أصلي: القطاع {}): " msgid "Enter end (default: {}): " -msgstr "أدخل النهاية (افتراضي: {}): " +msgstr "أدخل النهاية (أصلي: {}): " msgid "Unable to determine fido2 devices. Is libfido2 installed?" msgstr "غير قادر على تحديد أجهزة fido2. هل تم تثبيت libfido2؟" @@ -1232,7 +1232,7 @@ msgid " - Maximum recommended value : {} ( Allows {} parallel downloads at a tim msgstr " - الحد الأقصى للقيمة الموصى بها: {} (يسمح بـ {} تنزيلات متوازية في المرة الواحدة)" msgid " - Disable/Default : 0 ( Disables parallel downloading, allows only 1 download at a time )\n" -msgstr " - تعطيل/افتراضي: 0 (تعطيل التنزيل المتوازي، يسمح بتنزيل واحد فقط في كل مرة)\n" +msgstr " - تعطيل/أصلي: 0 (تعطيل التنزيل المتوازي، يسمح بتنزيل واحد فقط في كل مرة)\n" msgid "Invalid input! Try again with a valid input [or 0 to disable]" msgstr "إدخال غير صالح! حاول مرة أخرى باستخدام إدخال صحيح [أو 0 لتعطيل]" @@ -1247,7 +1247,7 @@ msgid "" msgstr "" "\n" "\n" -"حدد خيارًا لمنح Hyprland إمكانية الوصول إلى أجهزتك" +"حدّد خيارًا لمنح Hyprland إمكانية الوصول إلى أجهزتك" msgid "All entered values can be suffixed with a unit: %, B, KB, KiB, MB, MiB..." msgstr "يمكن إرفاق جميع القيم المدخلة بوحدة: ٪، ب، كيلوبايت، كيلوبايت، كيلوبايت، ميغابايت، ميغابايت، ميغابايت..." @@ -1265,13 +1265,13 @@ msgid "Time syncronization not completing, while you wait - check the docs for w msgstr "عدم اكتمال مزامنة الوقت، أثناء الانتظار - راجع المستندات لمعرفة الحلول البديلة: https://archinstall.readthedocs.io/" msgid "Skipping waiting for automatic time sync (this can cause issues if time is out of sync during installation)" -msgstr "تخطي انتظار المزامنة التلقائية للوقت (قد يتسبب ذلك في حدوث مشكلات إذا كان الوقت غير متزامن أثناء التثبيت)" +msgstr "تخطي انتظار المزامنة التلقائية للوقت (قد يتسبب ذلك في حدوث مشكلات إذا كان الوقت غير متزامن أثناء التّثبيت)" msgid "Waiting for Arch Linux keyring sync (archlinux-keyring-wkd-sync) to complete." msgstr "في انتظار اكتمال مزامنة حلقة مفاتيح أرش لينكس (archlinux-keyring-wkd-sync)." msgid "Selected profiles: " -msgstr "ملفات تعريف مختارة: " +msgstr "ملفّات تعريف مختارة: " msgid "Time synchronization not completing, while you wait - check the docs for workarounds: https://archinstall.readthedocs.io/" msgstr "عدم اكتمال مزامنة الوقت، أثناء انتظارك - راجع المستندات لمعرفة الحلول: https://archinstall.readthedocs.io/" @@ -1299,13 +1299,13 @@ msgid "LVM configuration type" msgstr "نوع إعداد LVM" msgid "LVM disk encryption with more than 2 partitions is currently not supported" -msgstr "تشفير قرص LVM بأكثر من قسمين غير مدعوم حاليًا" +msgstr "تشفير قرص LVM بأكثر من تقسيمين غير مدعوم حاليًا" msgid "Use NetworkManager (necessary to configure internet graphically in GNOME and KDE Plasma)" -msgstr "استخدم مُدير الشبكة NetworkManager (ضروري لإعداد الإنترنت باستخدام واجهة رسومية في جنوم و كيدي)" +msgstr "استخدم NetworkManager (ضروري لإعداد الإنترنت فالواجهات الرّسوميّة GNOME و KDE Plasma)" msgid "Select a LVM option" -msgstr "حدد خيار LVM" +msgstr "حدّد خيار LVM" msgid "Partitioning" msgstr "تقسيم" @@ -1314,7 +1314,7 @@ msgid "Logical Volume Management (LVM)" msgstr "إدارة الحجم المنطقي (LVM)" msgid "Physical volumes" -msgstr "أحجام فيزيائية" +msgstr "أحجام فيزيائيّة" msgid "Volumes" msgstr "أحجام" @@ -1326,10 +1326,10 @@ msgid "LVM volumes to be encrypted" msgstr "أقسام LVM المراد تشفيرها" msgid "Select which LVM volumes to encrypt" -msgstr "حدد أقسام LVM المراد تشفيرها" +msgstr "حدّد أقسام LVM المراد تشفيرها" msgid "Default layout" -msgstr "التخطيط الافتراضي" +msgstr "التّخطيط الأصلي" msgid "No Encryption" msgstr "لا تشفير" @@ -1353,19 +1353,19 @@ msgid "Archinstall help" msgstr "مساعدة Archinstall" msgid " (default)" -msgstr " (افتراضي)" +msgstr " (أصلي)" msgid "Press Ctrl+h for help" msgstr "اضغط على Ctrl+h للحصول على المساعدة" msgid "Choose an option to give Sway access to your hardware" -msgstr "حدد خياراً لمنح Sway إمكانية الوصول إلى أجهزتك" +msgstr "حدّد خياراً لمنح Sway إمكانية الوصول إلى أجهزتك" msgid "Seat access" msgstr "الوصول إلى المقعد" msgid "Mountpoint" -msgstr "نقطة الضمّ:" +msgstr "نقطة التّثبيت" msgid "HSM" msgstr "HSM" @@ -1374,25 +1374,25 @@ msgid "Enter disk encryption password (leave blank for no encryption)" msgstr "أدخل كلمة مرور تشفير القرص (اتركها فارغة لعدم وجود تشفير):" msgid "Disk encryption password" -msgstr "كلمة سر التشفير" +msgstr "كلمة سر التّشفير" msgid "Partition - New" msgstr "تقسيم - جديد" msgid "Filesystem" -msgstr "نظام الملفات" +msgstr "نظام الملفّات" msgid "Invalid size" msgstr "الحجم غير صالح" msgid "Start (default: sector {}): " -msgstr "البداية (افتراضي: القطاع {}): " +msgstr "البداية (أصلي: القطاع {}): " msgid "End (default: {}): " -msgstr "النهاية (افتراضي: {}): " +msgstr "النهاية (أصلي: {}): " msgid "Subvolume name" -msgstr "اسم وحدة التخزين الفرعية" +msgstr "اسم وحدة التّخزين الفرعيّة" msgid "Disk configuration type" msgstr "نوع ضبط القرص" @@ -1401,7 +1401,7 @@ msgid "Root mount directory" msgstr "دليل جذر الضم" msgid "Select language" -msgstr "حدد لغة" +msgstr "حدّد لغة" msgid "Write additional packages to install (space separated, leave blank to skip)" msgstr "اكتب حزمًا إضافية لتثبيتها (تُفصَل بالمسافات، اتركها فارغة للتخطي):" @@ -1447,7 +1447,7 @@ msgid "DNS servers" msgstr "خوادم DNS" msgid "Configure interfaces" -msgstr "تهيئة الواجهات" +msgstr "تهيئة الروابط" msgid "Kernel" msgstr "النواة" @@ -1487,7 +1487,7 @@ msgstr "أدخل دليلا للتكوين (التكوينات) المراد ح #, python-brace-format msgid "Do you want to save the configuration file(s) to {}?" -msgstr "هل تريد حفظ ملف (ملفات) الضبط إلى {} ؟" +msgstr "هل تريد حفظ ملفّ (ملفّات) الضبط إلى {} ؟" msgid "Enabled" msgstr "مفعّل" @@ -1505,10 +1505,10 @@ msgid "Url" msgstr "عنوان URL" msgid "Select signature check" -msgstr "حدد خيار التحقق من التوقيع" +msgstr "حدّد خيار التحقق من التوقيع" msgid "Select execution mode" -msgstr "حدد وضع التنفيذ" +msgstr "حدّد وضع التنفيذ" msgid "Press ? for help" msgstr "اضغط ؟ للمساعدة" @@ -1518,24 +1518,22 @@ msgid "Choose an option to give Hyprland access to your hardware" msgstr "" "\n" "\n" -"حدد خيارًا لمنح Hyprland إمكانية الوصول إلى أجهزتك" +"حدّد خيارًا لمنح Hyprland إمكانية الوصول إلى أجهزتك" -#, fuzzy msgid "Additional repositories" -msgstr "المستودعات الاختيارية" +msgstr "المستودعات الإضافيّة" msgid "NTP" -msgstr "" +msgstr "NTP (بروتوكول وقت الشّبكة)" msgid "Swap on zram" -msgstr "" +msgstr "مُبادَلة على zram" msgid "Name" -msgstr "" +msgstr "الإسم" -#, fuzzy msgid "Signature check" -msgstr "حدد خيار التحقق من التوقيع" +msgstr "التّحقّق من التّوقيع" #, fuzzy, python-brace-format msgid "Selected free space segment on device {}:" @@ -1547,474 +1545,409 @@ msgstr "الإجمالي: {} / {}" #, fuzzy, python-brace-format msgid "Size (default: {}): " -msgstr "النهاية (افتراضي: {}): " +msgstr "النهاية (أصلي: {}): " -#, fuzzy msgid "HSM device" -msgstr "جهاز" +msgstr "جهاز HSM" msgid "Some packages could not be found in the repository" -msgstr "" +msgstr "لم يتمّ العثور على بعض الحزم في المستودع" -#, fuzzy msgid "User" -msgstr "اسم المستخدم" +msgstr "مستخدم" msgid "The specified configuration will be applied" -msgstr "" +msgstr "سيتم تطبيق التّكوين المُحدّد" msgid "Wipe" -msgstr "" +msgstr "طمس" -#, fuzzy msgid "Mark/Unmark as XBOOTLDR" -msgstr "وضع او إلغاء علامة قابل للإقلاع" +msgstr "وضع او إلغاء علامة قابل للإقلاع (XBOOTLDR)" -#, fuzzy msgid "Loading packages..." -msgstr "الباقات الإضافية" +msgstr "تحميل الحزم جارٍ" msgid "Select any packages from the below list that should be installed additionally" -msgstr "" +msgstr "اختر أيّ حزم إضافيّة، من القائمة أدناه، ترغب بتثبيتها" -#, fuzzy msgid "Add a custom repository" -msgstr "إضافة مرآة مخصصة" +msgstr "إضافة مستودع مخصّص" -#, fuzzy msgid "Change custom repository" -msgstr "تغيير المرآة المخصصة" +msgstr "تغيير المستودع المخصّص" -#, fuzzy msgid "Delete custom repository" -msgstr "حذف المرآة المخصصة" +msgstr "حذف المستودع المخصّص" -#, fuzzy msgid "Repository name" -msgstr "اسم المرآة" +msgstr "اسم المستودع" -#, fuzzy msgid "Add a custom server" -msgstr "إضافة مرآة مخصصة" +msgstr "إضافة خادم مخصّص" -#, fuzzy msgid "Change custom server" -msgstr "تغيير المرآة المخصصة" +msgstr "تغيير الخادم المخصّص" -#, fuzzy msgid "Delete custom server" -msgstr "حذف المرآة المخصصة" +msgstr "حذف الخادم المخصّص" msgid "Server url" -msgstr "" +msgstr "عنوان الخادم (URL)" -#, fuzzy msgid "Select regions" -msgstr "حدد خيار التوقيع" +msgstr "اختر المناطق" -#, fuzzy msgid "Add custom servers" -msgstr "إضافة مرآة مخصصة" +msgstr "إضافة خوادم مخصّصة" -#, fuzzy msgid "Add custom repository" -msgstr "إضافة مرآة مخصصة" +msgstr "إضافة مستودع مخصّص" -#, fuzzy msgid "Loading mirror regions..." -msgstr "مناطق المرايا" +msgstr "تحميل مناطق المرايا…" -#, fuzzy msgid "Mirrors and repositories" -msgstr "المستودعات الاختيارية" +msgstr "المرايا والمستودعات" -#, fuzzy msgid "Selected mirror regions" -msgstr "مناطق المرايا" +msgstr "مناطق المرايا المختارة" -#, fuzzy msgid "Custom servers" -msgstr "مرايا مخصصة" +msgstr "خوادم مخصّصة" -#, fuzzy msgid "Custom repositories" -msgstr "المستودعات الاختيارية" +msgstr "مستودعات مخصّصة" msgid "Only ASCII characters are supported" -msgstr "" +msgstr "يتم دعم أحرف ASCII فقط" msgid "Show help" -msgstr "" +msgstr "إظهار المساعدة" msgid "Exit help" -msgstr "" +msgstr "خروج من المساعدة" msgid "Preview scroll up" -msgstr "" +msgstr "مرّر المُعايَنة للأعلى" msgid "Preview scroll down" -msgstr "" +msgstr "مرّر المُعايَنة للأسفل" msgid "Move up" -msgstr "" +msgstr "اصعد لفوق" msgid "Move down" -msgstr "" +msgstr "انزل لأسفل" msgid "Move right" -msgstr "" +msgstr "تحرّك يمينًا" msgid "Move left" -msgstr "" +msgstr "تحرّك يسارًا" msgid "Jump to entry" -msgstr "" +msgstr "انتقل إلى الصّفحة" msgid "Skip selection (if available)" -msgstr "" +msgstr "تخطّي الاختيار (إن وُجَد)" msgid "Reset selection (if available)" -msgstr "" +msgstr "إعادة ضبط الاختيار (إن وُجَد)" -#, fuzzy msgid "Select on single select" -msgstr "حدد خيار التحقق من التوقيع" +msgstr "حدّد باستخدام التّحديد الفردي" -#, fuzzy msgid "Select on multi select" -msgstr "حدِّد منطقة زمنية" +msgstr "حدّد باستخدام التّحديد المتعدّد" msgid "Reset" -msgstr "" +msgstr "إعادة ضبط" -#, fuzzy msgid "Skip selection menu" -msgstr "حدد وضع التنفيذ" +msgstr "تخطي قائمة الاختيار" msgid "Start search mode" -msgstr "" +msgstr "ابدأ وضع البحث" msgid "Exit search mode" -msgstr "" +msgstr "أنهي وضع البحث" -#, fuzzy msgid "labwc needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)" -msgstr "يحتاج Sway إلى الوصول إلى مقعدك (مجموعة من الأجهزة مثل لوحة المفاتيح والماوس وغيرها)" +msgstr "يحتاج labwc للوصول إلى مقعدك (مجموعة أجهزة مثل لوحة المفاتيح، والفأرة وغيرها)" -#, fuzzy msgid "Choose an option to give labwc access to your hardware" -msgstr "حدد خياراً لمنح Sway إمكانية الوصول إلى أجهزتك" +msgstr "حدّد خيارًا لمنح labwc إمكانية الوصول إلى أجهزتك" -#, fuzzy msgid "niri needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)" -msgstr "يحتاج Sway إلى الوصول إلى مقعدك (مجموعة من الأجهزة مثل لوحة المفاتيح والماوس وغيرها)" +msgstr "يحتاج niri للوصول إلى مقعدك (مجموعة أجهزة مثل لوحة المفاتيح، والفأرة وغيرها)" -#, fuzzy msgid "Choose an option to give niri access to your hardware" -msgstr "حدد خياراً لمنح Sway إمكانية الوصول إلى أجهزتك" +msgstr "حدّد خيارًا لمنح niri إمكانية الوصول إلى أجهزتك" -#, fuzzy msgid "Mark/Unmark as ESP" -msgstr "وضع او إلغاء علامة قابل للإقلاع" +msgstr "وضع او إلغاء علامة ESP" msgid "Package group:" -msgstr "" +msgstr "مجموعة الحزم:" -#, fuzzy msgid "Exit archinstall" -msgstr "مساعدة Archinstall" +msgstr "الخروج من Archinstall" -#, fuzzy msgid "Reboot system" -msgstr "نظام الملفات" +msgstr "أعد تشغيل النظام" -#, fuzzy msgid "chroot into installation for post-installation configurations" -msgstr "هل ترغب في الانتقال (chroot) إلى التثبيت الذي تم إنشاؤه حديثاً وإجراء تهيئة ما بعد التثبيت؟" +msgstr "قم بتغيير بيئة التّثبيت (chroot) لإجراءات ما بعد التّثبيت" msgid "Installation completed" -msgstr "" +msgstr "انتهى التّثبيت" -#, fuzzy msgid "What would you like to do next?" -msgstr "هل ترغب في الاستمرار؟" +msgstr "ماذا تريد أن تفعل بعد ذلك؟" -#, fuzzy, python-brace-format +#, python-brace-format msgid "Select which mode to configure for \"{}\"" -msgstr "حدد الوضع المراد تهيئته لـ\"{}\" أو تخطى لاستخدام الوضع الافتراضي \"{}\"" +msgstr "حدّد الوضع الذي تريد ضبطه لـ \"{}\"" -#, fuzzy msgid "Incorrect credentials file decryption password" -msgstr "كلمة سر التشفير" +msgstr "كلمة مرور فك تشفير ملفّ بيانات الاعتماد غير صحيحة" -#, fuzzy msgid "Incorrect password" -msgstr "كلمة مرور الجذر" +msgstr "كلمة مرور خاطئة" -#, fuzzy msgid "Credentials file decryption password" -msgstr "كلمة سر التشفير" +msgstr "كلمة مرور فك تشفير ملفّ بيانات الاعتماد" -#, fuzzy msgid "Do you want to encrypt the user_credentials.json file?" -msgstr "هل تريد حفظ ملف (ملفات) الضبط إلى {} ؟" +msgstr "هل تريد تشفير الملف user_credentials.json؟" -#, fuzzy msgid "Credentials file encryption password" -msgstr "كلمة سر التشفير" +msgstr "كلمة مرور تشفير ملفّ بيانات الاعتماد" -#, fuzzy, python-brace-format +#, python-brace-format msgid "Repositories: {}" -msgstr "اسم المرآة" +msgstr "المستودعات: {}" -#, fuzzy msgid "New version available" -msgstr "لا توجد أجهزة HSM متوفرة" +msgstr "يتوفر إصدار جديد" -#, fuzzy msgid "Passwordless login" -msgstr "كلمة المرور" +msgstr "تسجيل دخول بدون كلمة مرور" msgid "Second factor login" -msgstr "" +msgstr "تسجيل الدّخول باستخدام عامل ثانٍ" msgid "Bluetooth" -msgstr "" +msgstr "Bluetooth" -#, fuzzy msgid "Would you like to configure Bluetooth?" -msgstr "هل ترغب في الاستمرار؟" +msgstr "هل ترغب في ضبط إعدادات Bluetooth؟" msgid "Print service" -msgstr "" +msgstr "خدمة الطّباعة" -#, fuzzy msgid "Would you like to configure the print service?" -msgstr "هل ترغب في الاستمرار؟" +msgstr "هل ترغب في ضبط إعدادات خدمة الطباعة؟" -#, fuzzy msgid "Power management" -msgstr "إدارة التقسيم: {}" +msgstr "إدارة الطّاقة" msgid "Authentication" -msgstr "" +msgstr "المُصادَقة" msgid "Applications" -msgstr "" +msgstr "التّطبيقات" msgid "U2F login method: " -msgstr "" +msgstr "طريقة تسجيل الدّخول U2F: " msgid "Passwordless sudo: " -msgstr "" +msgstr "sudo دون كلمة مرور: " #, python-brace-format msgid "Btrfs snapshot type: {}" -msgstr "" +msgstr "نوع لقطة Btrfs: {}" msgid "Syncing the system..." -msgstr "" +msgstr "مزامنة النّظام…" msgid "Value cannot be empty" -msgstr "" +msgstr "لا ينبغي أن تكون القيمة فارغة" msgid "Snapshot type" -msgstr "" +msgstr "نوع اللّقطة" -#, fuzzy, python-brace-format +#, python-brace-format msgid "Snapshot type: {}" -msgstr "نوع البيئة: {}" +msgstr "نوع اللّقطة: {}" msgid "U2F login setup" -msgstr "" +msgstr "إعداد تسجيل الدّخول إلى U2F" msgid "No U2F devices found" -msgstr "" +msgstr "لم يتمّ العثور على أجهزة U2F" msgid "U2F Login Method" -msgstr "" +msgstr "طريقة تسجيل الدّخول U2F" -#, fuzzy msgid "Enable passwordless sudo?" -msgstr "أدخل كلمة مرور: " +msgstr "تفعيل sudo دون كلمة مرور؟" -#, fuzzy, python-brace-format +#, python-brace-format msgid "Setting up U2F device for user: {}" -msgstr "اختر جهاز FIDO2 لاستخدامه في HSM" +msgstr "إعداد جهاز U2F للمستخدم: {}" msgid "You may need to enter the PIN and then touch your U2F device to register it" -msgstr "" +msgstr "قد تحتاج إلى إدخال رمز PIN ثم لمس جهازك U2F لتسجيله" msgid "Starting device modifications in " -msgstr "" +msgstr "بدء تعديلات الجهاز في " -#, fuzzy msgid "No network connection found" -msgstr "لا يوجد إعداد للشبكة" +msgstr "لم يتم العثور على اتصال بالشبكة" -#, fuzzy msgid "Would you like to connect to a Wifi?" -msgstr "هل ترغب في الاستمرار؟" +msgstr "هل ترغب في الاتصال بشبكة WiFi؟" -#, fuzzy msgid "No wifi interface found" -msgstr "تهيئة الواجهات" +msgstr "لم يتم العثور على ربط WiFi" -#, fuzzy msgid "Select wifi network to connect to" -msgstr "حدِّد واجهة شبكة واحدة للإعداد" +msgstr "اختر شبكة WiFi للإتصال بها" msgid "Scanning wifi networks..." -msgstr "" +msgstr "مسح شبكات الـ WiFi" -#, fuzzy msgid "No wifi networks found" -msgstr "لا يوجد إعداد للشبكة" +msgstr "لم يتم العثور على شبكات WiFi" msgid "Failed setting up wifi" -msgstr "" +msgstr "فشل إعداد شبكة الـ WiFi" -#, fuzzy msgid "Enter wifi password" -msgstr "أدخل كلمة مرور: " +msgstr "أدخل كلمة مرور الـ WiFi" msgid "Ok" -msgstr "" +msgstr "حسنًا" msgid "Removable" -msgstr "" +msgstr "قابِل للنّقل" msgid "Install to removable location" -msgstr "" +msgstr "ثبِّت في مكان قابل للنّقل" msgid "Will install to /EFI/BOOT/ (removable location)" -msgstr "" +msgstr "سوف يتمّ التّثبيت في /EFI/BOOT/ (مكان قابل للنّقل)" msgid "Will install to standard location with NVRAM entry" -msgstr "" +msgstr "سيتم التّثبيت في الموقع القياسي مع عنصر NVRAM" msgid "Would you like to install the bootloader to the default removable media search location?" -msgstr "" +msgstr "هل ترغب في تثبيت برنامج الإقلاع في الموقع الأصلي للبحث عن الوسائط القابلة للنّقل؟" msgid "This installs the bootloader to /EFI/BOOT/BOOTX64.EFI (or similar) which is useful for:" -msgstr "" +msgstr "يُثَبَّتُ برنامج الإقلاع في /EFI/BOOT/BOOTX64.EFI (أو ما شابه ذلك)، وهو أمر مفيد لـ:" msgid "USB drives or other portable external media." -msgstr "" +msgstr "محرّكات أقراص USB أو وسائط تخزين خارجيّة محمولة أخرى." msgid "Systems where you want the disk to be bootable on any computer." -msgstr "" +msgstr "الأنظمة أين يكون القرص قابلاً للتّشغيل على أيّ حاسوب." msgid "Firmware that does not properly support NVRAM boot entries." -msgstr "" +msgstr "البرامج الثابتة التي لا تدعم بشكل صحيح إدخالات تمهيد NVRAM" msgid "Will install to /EFI/BOOT/ (removable location, safe default)" -msgstr "" +msgstr "سيتمّ التّثبيت في /EFI/BOOT/ (موقع قابل للنّقل، إعداد أصلي آمن)" msgid "Will install to custom location with NVRAM entry" -msgstr "" +msgstr "سيتم التّثبيت في موقع مخصّص مع إدخال NVRAM" msgid "Firmware that does not properly support NVRAM boot entries like most MSI motherboards," -msgstr "" +msgstr "البرامج الثّابتة التي لا تدعم بشكل صحيح إدخالات تمهيد NVRAM مثل معظم لوحات الأمّ من MSI،" msgid "most Apple Macs, many laptops..." -msgstr "" +msgstr "معظم أجهزة Mac من Apple، والعديد من الحواسيب المحمولة…" -#, fuzzy msgid "Language" -msgstr "لغة الإعدادات المحلية" +msgstr "اللّغة" msgid "Compression algorithm" -msgstr "" +msgstr "خوارزميّة الضّغط" -#, fuzzy msgid "Only packages such as base, sudo, linux, linux-firmware, efibootmgr and optional profile packages are installed." -msgstr "فقط الحزم مثل base وbase-devel وlinux وlinux-firmware وefibootmgr و حِزم مِلف اختيارية سوف تُثَبَّت." +msgstr "يتم تثبيت حزم مثل base و sudo و linux و linux-firmware و efibootmgr وحزم الملفّات الشّخصية الاختياريّة فقط." -#, fuzzy msgid "Select zram compression algorithm:" -msgstr "حدد نقطة التثبيت :" +msgstr "حدّد خوارزميّة ضغط zram:" msgid "Use Network Manager (default backend)" -msgstr "" +msgstr "استخدم Network Manager (الخادم الخلفي الأصلي)" msgid "Use Network Manager (iwd backend)" -msgstr "" +msgstr "استخدم Network Manager (الخادم الخلفي iwd)" msgid "Firewall" -msgstr "" +msgstr "جدار الحماية" -#, fuzzy msgid "Select audio configuration" -msgstr "حفظ إعدادات المستخدم" +msgstr "حدّد إعدادات الصوت" -#, fuzzy msgid "Enter credentials file decryption password" -msgstr "كلمة سر التشفير" +msgstr "أدخل كلمة مرور فك تشفير ملفّ بيانات الاعتماد" -#, fuzzy msgid "Enter root password" -msgstr "أدخل كلمة مرور: " +msgstr "أدخل كلمة مرور root" msgid "Select bootloader to install" -msgstr "" +msgstr "اختر برنامج الإقلاع المُراد تثبيته" -#, fuzzy msgid "Configuration preview" -msgstr "الإعداد " +msgstr "معاينة الإعدادات" -#, fuzzy msgid "Enter a directory for the configuration(s) to be saved" -msgstr "أدخل مجلداً للإعدادات التي سيتم حفظها: " +msgstr "أدخل مجلدًا لحفظ الإعدادات المراد حفظها" -#, fuzzy msgid "Select encryption type" -msgstr "نوع التشفير" +msgstr "حدّد نوع التّشفير" -#, fuzzy msgid "Select disks for the installation" -msgstr "اسم المضيف المُراد للتثبيت: " +msgstr "حدّد الأقراص للتّثبيت" -#, fuzzy msgid "Enter a mountpoint" -msgstr "حدد نقطة التثبيت :" +msgstr "حدّد نقطة تثبيت" -#, fuzzy, python-brace-format +#, python-brace-format msgid "Enter a size (default: {}): " -msgstr "أدخل النهاية (افتراضي: {}): " +msgstr "أدخل المساحة (أصلي: {}): " -#, fuzzy msgid "Enter subvolume name" -msgstr "اسم وحدة التخزين الفرعية" +msgstr "اسم وحدة التّخزين الفرعيّة" -#, fuzzy msgid "Enter subvolume mountpoint" -msgstr "نقطة تحميل وحدة التخزين الفرعية" +msgstr "نقطة تثبيت وحدة التّخزين الفرعيّة" -#, fuzzy msgid "Select a disk configuration" msgstr "ضبط القرص" -#, fuzzy msgid "Enter root mount directory" -msgstr "دليل جذر الضم" +msgstr "أدخل الدليل الجذر لنقاط التثبيت" msgid "You will use whatever drive-setup is mounted at the specified directory" -msgstr "" +msgstr "ستستخدم أيّ إعداد محرّك أقراص مثبَّت في الدّليل المحدّد" msgid "WARNING: Archinstall won't check the suitability of this setup" -msgstr "" +msgstr "تحذير: لن يتحقّق برنامج Archinstall من مدى ملاءمة هذا الإعداد" -#, fuzzy msgid "Select main filesystem" -msgstr "تغيير نظام الملفات" +msgstr "اختر نظام الملفّات الرّئيسي" msgid "Enter a hostname" -msgstr "" +msgstr "أدخل اسم الحاسوب" -#, fuzzy msgid "Select timezone" -msgstr "حدِّد منطقة زمنية" +msgstr "حدِّد المنطقة الزّمنية" #, fuzzy msgid "Enter the number of parallel downloads to be enabled" @@ -2025,74 +1958,61 @@ msgstr "" #, python-brace-format msgid "Value must be between 1 and {}" -msgstr "" +msgstr "يجب أن تكون القيمة بين 1 و {}" -#, fuzzy msgid "Select which kernel(s) to install" -msgstr "يرجى اختيار المُرحِّب الذي سيتم تثبيته" +msgstr "حدّد النّوى التي تريد تثبيتها" -#, fuzzy msgid "Enter a respository name" -msgstr "اسم المرآة" +msgstr "أدخل اسم المستودع" -#, fuzzy msgid "Enter the repository url" -msgstr "تغيير المرآة المخصصة" +msgstr "أدخل عنوان URL للمستودع" msgid "Enter server url" -msgstr "" +msgstr "أدخل عنوان الخادم (URL)" -#, fuzzy msgid "Select mirror regions to be enabled" -msgstr "مناطق المرايا" +msgstr "حدّد مناطق المرايا المراد تفعيلها" -#, fuzzy msgid "Select optional repositories to be enabled" -msgstr "اختر المستودعات الإضافية الاختيارية التي تريد تمكينها" +msgstr "اختر المستودعات الاختيارية التي تريد تمكينها" -#, fuzzy msgid "Select an interface" -msgstr "حذف الواجهة" +msgstr "حدّد الرّبط" -#, fuzzy msgid "Choose network configuration" -msgstr "لا يوجد إعداد للشبكة" +msgstr "اختر إعدادات الشّبكة" -#, fuzzy msgid "No packages found" -msgstr "تهيئة الواجهات" +msgstr "لم يتم العثور على أيّ حزم" -#, fuzzy msgid "Select which greeter to install" -msgstr "يرجى اختيار المُرحِّب الذي سيتم تثبيته" +msgstr "اختر المُرحِّب الذي سيتم تثبيته" -#, fuzzy msgid "Select a profile type" -msgstr "ملفات تعريف مختارة: " +msgstr "حدد نوع الملف الشخصي" -#, fuzzy msgid "Enter new password" -msgstr "أدخل كلمة مرور: " +msgstr "أدخل كلمة مرور جديدة" msgid "Enter a username" -msgstr "" +msgstr "أدخل اسم المستخدم" -#, fuzzy msgid "Enter a password" -msgstr "أدخل كلمة مرور: " +msgstr "أدخل كلمة مرور" -#, fuzzy msgid "The password did not match, please try again" -msgstr "كلمة المرور التأكيدية غير متطابقة، يرجى المحاولة مرة أخرى" +msgstr "كلمة المرور التأكيدية غير متطابقة، ترجى المحاولة مرة أخرى" msgid "Password strength: Weak" -msgstr "" +msgstr "قوة كلمة المرور: ضعيفة" msgid "Password strength: Moderate" -msgstr "" +msgstr "قوة كلمة المرور: متوسطة" msgid "Password strength: Strong" -msgstr "" +msgstr "قوة كلمة المرور: قوية" msgid "The selected desktop profile requires a regular user to log in via the greeter" -msgstr "" +msgstr "يتطلب ملفّ تعريف سطح المكتب المحدّد من المستخدم العادي تسجيل الدخول عبر لوحة الترحيب" From d6de03ab761e262abdcbfbbcc4a87122e64b6f35 Mon Sep 17 00:00:00 2001 From: codefiles <11915375+codefiles@users.noreply.github.com> Date: Sat, 11 Apr 2026 08:51:43 -0400 Subject: [PATCH 05/38] Use auto() for eligible StrEnum members (#4411) --- archinstall/lib/models/application.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/archinstall/lib/models/application.py b/archinstall/lib/models/application.py index d32042ff..f0d6424e 100644 --- a/archinstall/lib/models/application.py +++ b/archinstall/lib/models/application.py @@ -5,7 +5,7 @@ from typing import Any, NotRequired, Self, TypedDict class PowerManagement(StrEnum): POWER_PROFILES_DAEMON = 'power-profiles-daemon' - TUNED = 'tuned' + TUNED = auto() class PowerManagementConfigSerialization(TypedDict): @@ -31,7 +31,7 @@ class PrintServiceConfigSerialization(TypedDict): class Firewall(StrEnum): - UFW = 'ufw' + UFW = auto() FWD = 'firewalld' @@ -40,11 +40,11 @@ class FirewallConfigSerialization(TypedDict): class ZramAlgorithm(StrEnum): - ZSTD = 'zstd' + ZSTD = auto() LZO_RLE = 'lzo-rle' - LZO = 'lzo' - LZ4 = 'lz4' - LZ4HC = 'lz4hc' + LZO = auto() + LZ4 = auto() + LZ4HC = auto() class ApplicationSerialization(TypedDict): From 9a2d546882020c3c476055b9972386e2d4891191 Mon Sep 17 00:00:00 2001 From: Softer Date: Sun, 12 Apr 2026 07:24:46 +0300 Subject: [PATCH 06/38] Add translation support for TUI help groups and binding descriptions (#4363) * Add translation support for TUI help groups and binding descriptions Help group names shown via F1 (General, Navigation, Selection, Search) and key binding descriptions in the Textual footer (Down, Up, Cancel, Confirm, etc.) were hardcoded in English and never went through the translation system. * ruff_format_check and mypy fixes * Refactor _translate_bindings to accept BindingsMap instead of Any Add TApp.translate_bindings() to avoid exporting private functions across modules. * Revert deprecated curses help.py change * Move TApp import to module level in global_menu * Change translate_bindings from staticmethod to member method --- archinstall/lib/global_menu.py | 3 + archinstall/locales/base.pot | 117 +++++++++++++++++++++ archinstall/locales/uk/LC_MESSAGES/base.mo | Bin 81144 -> 83294 bytes archinstall/locales/uk/LC_MESSAGES/base.po | 117 +++++++++++++++++++++ archinstall/tui/ui/components.py | 40 ++++++- 5 files changed, 275 insertions(+), 2 deletions(-) diff --git a/archinstall/lib/global_menu.py b/archinstall/lib/global_menu.py index cae51df2..bbd530a8 100644 --- a/archinstall/lib/global_menu.py +++ b/archinstall/lib/global_menu.py @@ -28,6 +28,7 @@ from archinstall.lib.output import FormattedOutput from archinstall.lib.packages.packages import list_available_packages, select_additional_packages from archinstall.lib.pacman.config import PacmanConfig from archinstall.lib.translationhandler import Language, tr, translation_handler +from archinstall.tui.ui.components import tui from archinstall.tui.ui.menu_item import MenuItem, MenuItemGroup @@ -275,6 +276,8 @@ class GlobalMenu(AbstractMenu[None]): if o.key is not None: self._item_group.find_by_key(o.key).text = o.text + tui.translate_bindings() + async def _locale_selection(self, preset: LocaleConfiguration) -> LocaleConfiguration | None: locale_config = await LocaleMenu(preset).show() return locale_config diff --git a/archinstall/locales/base.pot b/archinstall/locales/base.pot index df0915c7..27fa4eee 100644 --- a/archinstall/locales/base.pot +++ b/archinstall/locales/base.pot @@ -1709,6 +1709,123 @@ msgstr "" msgid "Exit search mode" msgstr "" +msgid "General" +msgstr "" + +msgid "Navigation" +msgstr "" + +msgid "Selection" +msgstr "" + +msgid "Search" +msgstr "" + +msgid "Down" +msgstr "" + +msgid "Up" +msgstr "" + +msgid "Confirm" +msgstr "" + +msgid "Focus right" +msgstr "" + +msgid "Focus left" +msgstr "" + +msgid "Toggle" +msgstr "" + +msgid "Show/Hide help" +msgstr "" + +msgid "Quit" +msgstr "" + +msgid "First" +msgstr "" + +msgid "Last" +msgstr "" + +msgid "Select" +msgstr "" + +msgid "Page Up" +msgstr "" + +msgid "Page Down" +msgstr "" + +msgid "Page up" +msgstr "" + +msgid "Page down" +msgstr "" + +msgid "Page Left" +msgstr "" + +msgid "Page Right" +msgstr "" + +msgid "Cursor up" +msgstr "" + +msgid "Cursor down" +msgstr "" + +msgid "Cursor right" +msgstr "" + +msgid "Cursor left" +msgstr "" + +msgid "Top" +msgstr "" + +msgid "Bottom" +msgstr "" + +msgid "Home" +msgstr "" + +msgid "End" +msgstr "" + +msgid "Toggle option" +msgstr "" + +msgid "Scroll Up" +msgstr "" + +msgid "Scroll Down" +msgstr "" + +msgid "Scroll Left" +msgstr "" + +msgid "Scroll Right" +msgstr "" + +msgid "Scroll Home" +msgstr "" + +msgid "Scroll End" +msgstr "" + +msgid "Focus Next" +msgstr "" + +msgid "Focus Previous" +msgstr "" + +msgid "Copy selected text" +msgstr "" + msgid "" "labwc needs access to your seat (collection of hardware devices i.e. " "keyboard, mouse, etc)" diff --git a/archinstall/locales/uk/LC_MESSAGES/base.mo b/archinstall/locales/uk/LC_MESSAGES/base.mo index 6d6f7558c3ab8f462977b451520a1f1dd39445a3..ad1301397a91623ff58a2cd270dab383c6b78a3b 100644 GIT binary patch delta 15768 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 delta 13692 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 None: + """Translate binding descriptions from source to target. + + Uses source (original, immutable class-level cache) to avoid + double-translation on repeated calls (e.g. language switch). + """ + if source is None: + return + for key, bindings in source.key_to_bindings.items(): + target.key_to_bindings[key] = [replace(b, description=tr(b.description)) if b.description else b for b in bindings] + + class BaseScreen(Screen[Result[ValueT]]): BINDINGS: ClassVar = [ Binding('escape', 'cancel_operation', 'Cancel', show=True), @@ -97,6 +109,7 @@ class LoadingScreen(BaseScreen[ValueT]): yield Footer() def on_mount(self) -> None: + _translate_bindings(self._merged_bindings, self._bindings) if self._data_callback: self._exec_callback() else: @@ -129,6 +142,10 @@ class _OptionList(OptionList): Binding('k', 'cursor_up', 'Up', show=False), ] + @override + def on_mount(self) -> None: + _translate_bindings(self._merged_bindings, self._bindings) + class OptionListScreen(BaseScreen[ValueT]): """ @@ -271,6 +288,7 @@ class OptionListScreen(BaseScreen[ValueT]): yield Footer() def on_mount(self) -> None: + _translate_bindings(self._merged_bindings, self._bindings) self._update_options(self._options) self.query_one(OptionList).focus() @@ -356,6 +374,10 @@ class _SelectionList(SelectionList[ValueT]): Binding('space', 'select', 'Toggle', show=True), ] + @override + def on_mount(self) -> None: + _translate_bindings(self._merged_bindings, self._bindings) + class SelectListScreen(BaseScreen[ValueT]): """ @@ -500,6 +522,7 @@ class SelectListScreen(BaseScreen[ValueT]): self._handle_search_action() def on_mount(self) -> None: + _translate_bindings(self._merged_bindings, self._bindings) self._update_options(self._options) self.query_one(SelectionList).focus() @@ -670,6 +693,7 @@ class ConfirmationScreen(BaseScreen[ValueT]): yield Footer() def on_mount(self) -> None: + _translate_bindings(self._merged_bindings, self._bindings) self._update_selection() def action_focus_right(self) -> None: @@ -825,6 +849,7 @@ class InputScreen(BaseScreen[str]): yield Footer() def on_mount(self) -> None: + _translate_bindings(self._merged_bindings, self._bindings) input_field = self.query_one('#main_input', Input) input_field.focus() @@ -872,6 +897,10 @@ class _DataTable(DataTable[ValueT]): Binding('enter', 'select_cursor', 'Confirm', show=True), ] + @override + def on_mount(self) -> None: + _translate_bindings(self._merged_bindings, self._bindings) + class TableSelectionScreen(BaseScreen[ValueT]): BINDINGS: ClassVar = [ @@ -992,6 +1021,7 @@ class TableSelectionScreen(BaseScreen[ValueT]): yield Footer() def on_mount(self) -> None: + _translate_bindings(self._merged_bindings, self._bindings) self._display_header(True) data_table = self.query_one(DataTable) data_table.cell_padding = 2 @@ -1245,6 +1275,7 @@ class _AppInstance(App[ValueT]): _ = self.screen.mount(HelpPanel()) def on_mount(self) -> None: + _translate_bindings(self._merged_bindings, self._bindings) self._run_worker() @work @@ -1291,5 +1322,10 @@ class TApp: assert TApp.app TApp.app.exit(result) + def translate_bindings(self) -> None: + """Re-translate app-level binding descriptions after language change.""" + if TApp.app is not None: + _translate_bindings(TApp.app._merged_bindings, TApp.app._bindings) + tui = TApp() From bf9b9cb7c17c87595676a52210803a2ebb02af48 Mon Sep 17 00:00:00 2001 From: codefiles <11915375+codefiles@users.noreply.github.com> Date: Sun, 12 Apr 2026 00:48:51 -0400 Subject: [PATCH 07/38] Remove invalid container PATH lookup (#4413) --- archinstall/lib/boot.py | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/archinstall/lib/boot.py b/archinstall/lib/boot.py index f9cc1198..b1e8c888 100644 --- a/archinstall/lib/boot.py +++ b/archinstall/lib/boot.py @@ -4,7 +4,7 @@ from pathlib import Path from types import TracebackType from typing import ClassVar, Self -from archinstall.lib.command import SysCommand, SysCommandWorker, locate_binary +from archinstall.lib.command import SysCommand, SysCommandWorker from archinstall.lib.exceptions import SysCallError from archinstall.lib.output import error @@ -105,17 +105,7 @@ class Boot: return self.session.is_alive() def SysCommand(self, cmd: list[str], *args, **kwargs) -> SysCommand: # type: ignore[no-untyped-def] - if cmd[0][0] != '/' and cmd[0][:2] != './': - # This check is also done in SysCommand & SysCommandWorker. - # However, that check is done for `machinectl` and not for our chroot command. - # So this wrapper for SysCommand will do this additionally. - - cmd[0] = locate_binary(cmd[0]) - return SysCommand(['systemd-run', f'--machine={self.container_name}', '--pty', *cmd], *args, **kwargs) def SysCommandWorker(self, cmd: list[str], *args, **kwargs) -> SysCommandWorker: # type: ignore[no-untyped-def] - if cmd[0][0] != '/' and cmd[0][:2] != './': - cmd[0] = locate_binary(cmd[0]) - return SysCommandWorker(['systemd-run', f'--machine={self.container_name}', '--pty', *cmd], *args, **kwargs) From 80da3f14a1d401fe7e47005ae4eec99379152e6a Mon Sep 17 00:00:00 2001 From: Softer Date: Mon, 13 Apr 2026 11:37:51 +0300 Subject: [PATCH 08/38] Add Pacman settings submenu with Color and ParallelDownloads (#4404) * Add Pacman settings submenu with Color and ParallelDownloads Replace the standalone Parallel Downloads menu item with a Pacman submenu containing ParallelDownloads (default 5) and Color (default on). Settings are applied to both live and target system pacman.conf. Hidden behind --advanced flag. Backward compatible with old configs using "parallel_downloads" key. * Skip _apply_to_live when user exits Pacman menu without changes * Use TypedDict for PacmanConfiguration serialization * Show Pacman menu by default, keep ParallelDownloads behind --advanced --- archinstall/lib/args.py | 11 +- archinstall/lib/general/__init__.py | 2 - archinstall/lib/general/general_menu.py | 50 --------- archinstall/lib/global_menu.py | 32 ++++-- archinstall/lib/installer.py | 5 + archinstall/lib/models/pacman.py | 42 ++++++++ archinstall/lib/pacman/config.py | 21 +++- archinstall/lib/pacman/pacman_menu.py | 117 +++++++++++++++++++++ archinstall/locales/base.pot | 46 ++++++++ archinstall/locales/uk/LC_MESSAGES/base.mo | Bin 83294 -> 83620 bytes archinstall/locales/uk/LC_MESSAGES/base.po | 56 ++++++++++ archinstall/scripts/guided.py | 5 +- tests/test_args.py | 3 +- 13 files changed, 319 insertions(+), 71 deletions(-) create mode 100644 archinstall/lib/models/pacman.py create mode 100644 archinstall/lib/pacman/pacman_menu.py diff --git a/archinstall/lib/args.py b/archinstall/lib/args.py index c61bc5a1..20ff37cf 100644 --- a/archinstall/lib/args.py +++ b/archinstall/lib/args.py @@ -22,6 +22,7 @@ from archinstall.lib.models.locale import LocaleConfiguration from archinstall.lib.models.mirrors import MirrorConfiguration from archinstall.lib.models.network import NetworkConfiguration from archinstall.lib.models.packages import Repository +from archinstall.lib.models.pacman import PacmanConfiguration from archinstall.lib.models.profile import ProfileConfiguration from archinstall.lib.models.users import Password, User, UserSerialization from archinstall.lib.output import debug, error, logger, warn @@ -73,7 +74,7 @@ class ArchConfig: kernels: list[str] = field(default_factory=lambda: ['linux']) ntp: bool = True packages: list[str] = field(default_factory=list) - parallel_downloads: int = 0 + pacman_config: PacmanConfiguration = field(default_factory=PacmanConfiguration.default) timezone: str = 'UTC' services: list[str] = field(default_factory=list) custom_commands: list[str] = field(default_factory=list) @@ -104,7 +105,7 @@ class ArchConfig: 'kernels': self.kernels, 'ntp': self.ntp, 'packages': self.packages, - 'parallel_downloads': self.parallel_downloads, + 'pacman_config': self.pacman_config.json(), 'swap': self.swap, 'timezone': self.timezone, 'services': self.services, @@ -209,8 +210,10 @@ class ArchConfig: if packages := args_config.get('packages', []): arch_config.packages = packages - if parallel_downloads := args_config.get('parallel_downloads', 0): - arch_config.parallel_downloads = parallel_downloads + if pacman_config := args_config.get('pacman_config', None): + arch_config.pacman_config = PacmanConfiguration.parse_arg(pacman_config) + elif parallel_downloads := args_config.get('parallel_downloads', 0): + arch_config.pacman_config = PacmanConfiguration(parallel_downloads=int(parallel_downloads)) swap_arg = args_config.get('swap') if swap_arg is not None: diff --git a/archinstall/lib/general/__init__.py b/archinstall/lib/general/__init__.py index 21add834..7c082d84 100644 --- a/archinstall/lib/general/__init__.py +++ b/archinstall/lib/general/__init__.py @@ -1,5 +1,4 @@ from archinstall.lib.general.general_menu import ( - add_number_of_parallel_downloads, select_archinstall_language, select_hostname, select_ntp, @@ -8,7 +7,6 @@ from archinstall.lib.general.general_menu import ( from archinstall.lib.general.system_menu import select_driver, select_kernel, select_swap __all__ = [ - 'add_number_of_parallel_downloads', 'select_archinstall_language', 'select_driver', 'select_hostname', diff --git a/archinstall/lib/general/general_menu.py b/archinstall/lib/general/general_menu.py index b6cf9a75..ad85c14b 100644 --- a/archinstall/lib/general/general_menu.py +++ b/archinstall/lib/general/general_menu.py @@ -3,7 +3,6 @@ from enum import Enum from archinstall.lib.locale.utils import list_timezones from archinstall.lib.menu.helpers import Confirmation, Input, Selection from archinstall.lib.output import warn -from archinstall.lib.pathnames import PACMAN_CONF from archinstall.lib.translationhandler import Language, tr from archinstall.tui.ui.menu_item import MenuItem, MenuItemGroup from archinstall.tui.ui.result import ResultType @@ -126,55 +125,6 @@ async def select_archinstall_language(languages: list[Language], preset: Languag raise ValueError('Language selection not handled') -async def add_number_of_parallel_downloads(preset: int = 1) -> int | None: - max_recommended = 5 - - header = tr('This option enables the number of parallel downloads that can occur during package downloads') + '\n' - header += tr(' - Maximum recommended value : {} ( Allows {} parallel downloads at a time )').format(max_recommended, max_recommended) + '\n\n' - header += tr('Enter the number of parallel downloads to be enabled') - - def validator(s: str) -> str | None: - try: - value = int(s) - - if 1 <= value <= max_recommended: - return None - - return tr('Value must be between 1 and {}').format(max_recommended) - except Exception: - return tr('Please enter a valid number') - - result = await Input( - header=header, - allow_skip=True, - allow_reset=True, - validator_callback=validator, - default_value=str(preset), - ).show() - - downloads = 1 - - match result.type_: - case ResultType.Skip: - return preset - case ResultType.Reset: - return downloads - case ResultType.Selection: - downloads = int(result.get_value()) - - with PACMAN_CONF.open() as f: - pacman_conf = f.read().split('\n') - - with PACMAN_CONF.open('w') as fwrite: - for line in pacman_conf: - if 'ParallelDownloads' in line: - fwrite.write(f'ParallelDownloads = {downloads}\n') - else: - fwrite.write(f'{line}\n') - - return downloads - - async def select_post_installation(elapsed_time: float | None = None) -> PostInstallationAction: header = 'Installation completed' if elapsed_time is not None: diff --git a/archinstall/lib/global_menu.py b/archinstall/lib/global_menu.py index bbd530a8..6e4b6720 100644 --- a/archinstall/lib/global_menu.py +++ b/archinstall/lib/global_menu.py @@ -7,7 +7,7 @@ from archinstall.lib.authentication.authentication_menu import AuthenticationMen from archinstall.lib.bootloader.bootloader_menu import BootloaderMenu from archinstall.lib.configuration import save_config from archinstall.lib.disk.disk_menu import DiskLayoutConfigurationMenu -from archinstall.lib.general.general_menu import add_number_of_parallel_downloads, select_hostname, select_ntp, select_timezone +from archinstall.lib.general.general_menu import select_hostname, select_ntp, select_timezone from archinstall.lib.general.system_menu import select_kernel, select_swap from archinstall.lib.hardware import SysInfo from archinstall.lib.locale.locale_menu import LocaleMenu @@ -22,11 +22,13 @@ from archinstall.lib.models.locale import LocaleConfiguration from archinstall.lib.models.mirrors import MirrorConfiguration from archinstall.lib.models.network import NetworkConfiguration, NicType from archinstall.lib.models.packages import Repository +from archinstall.lib.models.pacman import PacmanConfiguration from archinstall.lib.models.profile import ProfileConfiguration from archinstall.lib.network.network_menu import select_network from archinstall.lib.output import FormattedOutput from archinstall.lib.packages.packages import list_available_packages, select_additional_packages from archinstall.lib.pacman.config import PacmanConfig +from archinstall.lib.pacman.pacman_menu import PacmanMenu from archinstall.lib.translationhandler import Language, tr, translation_handler from archinstall.tui.ui.components import tui from archinstall.tui.ui.menu_item import MenuItem, MenuItemGroup @@ -38,11 +40,13 @@ class GlobalMenu(AbstractMenu[None]): arch_config: ArchConfig, mirror_list_handler: MirrorListHandler | None = None, skip_boot: bool = False, + advanced: bool = False, title: str | None = None, ) -> None: self._arch_config = arch_config self._mirror_list_handler = mirror_list_handler self._skip_boot = skip_boot + self._advanced = advanced self._uefi = SysInfo.has_uefi() menu_options = self._get_menu_options() @@ -138,11 +142,11 @@ class GlobalMenu(AbstractMenu[None]): key='network_config', ), MenuItem( - text=tr('Parallel Downloads'), - action=add_number_of_parallel_downloads, - value=1, - preview_action=self._prev_parallel_dw, - key='parallel_downloads', + text=tr('Pacman'), + action=self._pacman_configuration, + value=PacmanConfiguration.default(), + preview_action=self._prev_pacman_config, + key='pacman_config', ), MenuItem( text=tr('Additional packages'), @@ -413,10 +417,18 @@ class GlobalMenu(AbstractMenu[None]): return f'{tr("Hostname")}: {item.value}' return None - def _prev_parallel_dw(self, item: MenuItem) -> str | None: - if item.value is not None: - return f'{tr("Parallel Downloads")}: {item.value}' - return None + async def _pacman_configuration(self, preset: PacmanConfiguration) -> PacmanConfiguration | None: + return await PacmanMenu(preset, advanced=self._advanced).show() + + def _prev_pacman_config(self, item: MenuItem) -> str | None: + if not item.value: + return None + config: PacmanConfiguration = item.value + output = '' + if self._advanced: + output += '{}: {}\n'.format(tr('Parallel Downloads'), config.parallel_downloads) + output += '{}: {}'.format(tr('Color'), config.color) + return output def _prev_kernel(self, item: MenuItem) -> str | None: if item.value: diff --git a/archinstall/lib/installer.py b/archinstall/lib/installer.py index ff56e2e1..43077c63 100644 --- a/archinstall/lib/installer.py +++ b/archinstall/lib/installer.py @@ -48,6 +48,7 @@ from archinstall.lib.models.locale import LocaleConfiguration from archinstall.lib.models.mirrors import MirrorConfiguration from archinstall.lib.models.network import Nic from archinstall.lib.models.packages import Repository +from archinstall.lib.models.pacman import PacmanConfiguration from archinstall.lib.models.users import User from archinstall.lib.output import debug, error, info, log, logger, warn from archinstall.lib.packages.packages import installed_package @@ -886,6 +887,7 @@ class Installer: mkinitcpio: bool = True, hostname: str | None = None, locale_config: LocaleConfiguration | None = LocaleConfiguration.default(), + pacman_config: PacmanConfiguration | None = None, ) -> None: if self._disk_config.lvm_config: lvm = 'lvm2' @@ -932,6 +934,9 @@ class Installer: pacman_conf.persist() + if pacman_config: + pacman_conf.configure(pacman_config) + # Periodic TRIM may improve the performance and longevity of SSDs whilst # having no adverse effect on other devices. Most distributions enable # periodic TRIM by default. diff --git a/archinstall/lib/models/pacman.py b/archinstall/lib/models/pacman.py new file mode 100644 index 00000000..5d271ea9 --- /dev/null +++ b/archinstall/lib/models/pacman.py @@ -0,0 +1,42 @@ +from dataclasses import dataclass +from typing import Self, TypedDict + +from archinstall.lib.translationhandler import tr + + +class PacmanConfigSerialization(TypedDict): + parallel_downloads: int + color: bool + + +@dataclass +class PacmanConfiguration: + parallel_downloads: int = 5 + color: bool = True + + @classmethod + def default(cls) -> Self: + return cls() + + def json(self) -> PacmanConfigSerialization: + return { + 'parallel_downloads': self.parallel_downloads, + 'color': self.color, + } + + def preview(self) -> str: + color_str = str(self.color) + output = '{}: {}\n'.format(tr('Parallel Downloads'), self.parallel_downloads) + output += '{}: {}'.format(tr('Color'), color_str) + return output + + @classmethod + def parse_arg(cls, args: PacmanConfigSerialization) -> Self: + config = cls.default() + + if 'parallel_downloads' in args: + config.parallel_downloads = int(args['parallel_downloads']) + if 'color' in args: + config.color = bool(args['color']) + + return config diff --git a/archinstall/lib/pacman/config.py b/archinstall/lib/pacman/config.py index 1d361542..5785b319 100644 --- a/archinstall/lib/pacman/config.py +++ b/archinstall/lib/pacman/config.py @@ -2,6 +2,7 @@ import re from pathlib import Path from archinstall.lib.models.packages import Repository +from archinstall.lib.models.pacman import PacmanConfiguration from archinstall.lib.pathnames import PACMAN_CONF @@ -50,5 +51,23 @@ class PacmanConfig: f.writelines(content) def persist(self) -> None: - if self._repositories and self._config_remote_path: + if self._config_remote_path: PACMAN_CONF.copy(self._config_remote_path, preserve_metadata=True) + + def configure(self, pacman_config: PacmanConfiguration) -> None: + """Apply PacmanConfiguration (Color, ParallelDownloads) to the target system's pacman.conf.""" + if not self._config_remote_path or not self._config_remote_path.exists(): + return + + content = self._config_remote_path.read_text().splitlines() + result = [] + + for line in content: + if re.match(r'^#?\s*ParallelDownloads', line): + result.append(f'ParallelDownloads = {pacman_config.parallel_downloads}') + elif re.match(r'^#?\s*Color\s*$', line): + result.append('Color' if pacman_config.color else '#Color') + else: + result.append(line) + + self._config_remote_path.write_text('\n'.join(result) + '\n') diff --git a/archinstall/lib/pacman/pacman_menu.py b/archinstall/lib/pacman/pacman_menu.py new file mode 100644 index 00000000..010c3f6d --- /dev/null +++ b/archinstall/lib/pacman/pacman_menu.py @@ -0,0 +1,117 @@ +from typing import override + +from archinstall.lib.menu.abstract_menu import AbstractSubMenu +from archinstall.lib.menu.helpers import Confirmation, Input +from archinstall.lib.models.pacman import PacmanConfiguration +from archinstall.lib.pathnames import PACMAN_CONF +from archinstall.lib.translationhandler import tr +from archinstall.tui.ui.menu_item import MenuItem, MenuItemGroup +from archinstall.tui.ui.result import ResultType + + +class PacmanMenu(AbstractSubMenu[PacmanConfiguration]): + def __init__( + self, + pacman_conf: PacmanConfiguration, + advanced: bool = False, + ): + self._pacman_conf = pacman_conf + self._advanced = advanced + menu_options = self._define_menu_options() + + self._item_group = MenuItemGroup(menu_options, sort_items=False, checkmarks=True) + super().__init__( + self._item_group, + config=self._pacman_conf, + allow_reset=True, + ) + + def _define_menu_options(self) -> list[MenuItem]: + return [ + MenuItem( + text=tr('Parallel Downloads'), + action=select_parallel_downloads, + value=self._pacman_conf.parallel_downloads, + preview_action=lambda item: str(item.get_value()), + key='parallel_downloads', + enabled=self._advanced, + ), + MenuItem( + text=tr('Color'), + action=select_color, + value=self._pacman_conf.color, + preview_action=lambda item: str(item.get_value()), + key='color', + ), + ] + + @override + async def show(self) -> PacmanConfiguration | None: + config = await super().show() + + if config is None: + return PacmanConfiguration.default() + + _apply_to_live(config.parallel_downloads) + + return config + + +def _apply_to_live(parallel_downloads: int) -> None: + """Apply ParallelDownloads to live system pacman.conf for faster installation.""" + with PACMAN_CONF.open() as f: + pacman_conf = f.read().split('\n') + + with PACMAN_CONF.open('w') as fwrite: + for line in pacman_conf: + if 'ParallelDownloads' in line: + fwrite.write(f'ParallelDownloads = {parallel_downloads}\n') + else: + fwrite.write(f'{line}\n') + + +async def select_parallel_downloads(preset: int = 5) -> int | None: + max_recommended = 10 + + header = tr('Enter the number of parallel downloads (1-{})').format(max_recommended) + + def validator(s: str) -> str | None: + try: + value = int(s) + if 1 <= value <= max_recommended: + return None + return tr('Value must be between 1 and {}').format(max_recommended) + except Exception: + return tr('Please enter a valid number') + + result = await Input( + header=header, + allow_skip=True, + allow_reset=True, + validator_callback=validator, + default_value=str(preset), + ).show() + + match result.type_: + case ResultType.Skip: + return preset + case ResultType.Reset: + return 5 + case ResultType.Selection: + return int(result.get_value()) + + +async def select_color(preset: bool = True) -> bool | None: + result = await Confirmation( + header=tr('Enable colored output for pacman'), + preset=preset, + allow_skip=True, + ).show() + + match result.type_: + case ResultType.Skip: + return preset + case ResultType.Reset: + return True + case ResultType.Selection: + return result.get_value() diff --git a/archinstall/locales/base.pot b/archinstall/locales/base.pot index 27fa4eee..9d61ca77 100644 --- a/archinstall/locales/base.pot +++ b/archinstall/locales/base.pot @@ -830,6 +830,19 @@ msgstr "" msgid "Parallel Downloads" msgstr "" +msgid "Pacman" +msgstr "" + +msgid "Color" +msgstr "" + +#, python-brace-format +msgid "Enter the number of parallel downloads (1-{})" +msgstr "" + +msgid "Enable colored output for pacman" +msgstr "" + msgid "ESC to skip" msgstr "" @@ -2184,3 +2197,36 @@ msgstr "" #, python-brace-format msgid "Environment type: {} {}" msgstr "" + +msgid "Input cannot be empty" +msgstr "" + +msgid "Recommended" +msgstr "" + +msgid "Package" +msgstr "" + +msgid "Curated selection of KDE Plasma packages" +msgstr "" + +msgid "Dependencies" +msgstr "" + +msgid "Package group" +msgstr "" + +msgid "Extensive KDE Plasma installation" +msgstr "" + +msgid "Packages in group" +msgstr "" + +msgid "Minimal KDE Plasma installation" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "Select a flavor of KDE Plasma to install" +msgstr "" diff --git a/archinstall/locales/uk/LC_MESSAGES/base.mo b/archinstall/locales/uk/LC_MESSAGES/base.mo index ad1301397a91623ff58a2cd270dab383c6b78a3b..1cb241b953ad7bfa04c89f0cc971028c6c9b569b 100644 GIT binary patch delta 14285 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 diff --git a/archinstall/locales/uk/LC_MESSAGES/base.po b/archinstall/locales/uk/LC_MESSAGES/base.po index 5ad4bcb3..04695709 100644 --- a/archinstall/locales/uk/LC_MESSAGES/base.po +++ b/archinstall/locales/uk/LC_MESSAGES/base.po @@ -823,6 +823,19 @@ msgstr "Некоректне введення! Повторіть спробу msgid "Parallel Downloads" msgstr "Паралельні Завантаження" +msgid "Pacman" +msgstr "Pacman" + +msgid "Color" +msgstr "Колір" + +#, python-brace-format +msgid "Enter the number of parallel downloads (1-{})" +msgstr "Введіть кількість паралельних завантажень (1-{})" + +msgid "Enable colored output for pacman" +msgstr "Увімкнути кольоровий вивід для pacman" + msgid "ESC to skip" msgstr "ESC, щоб пропустити" @@ -2119,3 +2132,46 @@ msgstr "Надійність пароля: Сильна" msgid "The selected desktop profile requires a regular user to log in via the greeter" msgstr "Обраний профіль робочого столу вимагає входу звичайного користувача через менеджер входу" + +#, fuzzy, python-brace-format +msgid "Environment type: {} {}" +msgstr "Тип середовища: {}" + +#, fuzzy +msgid "Input cannot be empty" +msgstr "Значення не може бути пустим" + +msgid "Recommended" +msgstr "" + +#, fuzzy +msgid "Package" +msgstr "Група пакетів:" + +msgid "Curated selection of KDE Plasma packages" +msgstr "" + +msgid "Dependencies" +msgstr "" + +#, fuzzy +msgid "Package group" +msgstr "Група пакетів:" + +msgid "Extensive KDE Plasma installation" +msgstr "" + +#, fuzzy +msgid "Packages in group" +msgstr "Група пакетів:" + +msgid "Minimal KDE Plasma installation" +msgstr "" + +#, fuzzy +msgid "Description" +msgstr "Шифрування диска" + +#, fuzzy +msgid "Select a flavor of KDE Plasma to install" +msgstr "Оберіть завантажувач для встановлення" diff --git a/archinstall/scripts/guided.py b/archinstall/scripts/guided.py index 5683ab9e..601ca7bc 100644 --- a/archinstall/scripts/guided.py +++ b/archinstall/scripts/guided.py @@ -39,12 +39,10 @@ def show_menu( arch_config_handler.config, mirror_list_handler, arch_config_handler.args.skip_boot, + advanced=arch_config_handler.args.advanced, title=title_text, ) - if not arch_config_handler.args.advanced: - global_menu.set_enabled('parallel_downloads', False) - result: ArchConfig | None = tui.run(global_menu) if result is None: sys.exit(0) @@ -106,6 +104,7 @@ def perform_installation( mkinitcpio=run_mkinitcpio, hostname=arch_config_handler.config.hostname, locale_config=locale_config, + pacman_config=config.pacman_config, ) if mirror_config := config.mirror_config: diff --git a/tests/test_args.py b/tests/test_args.py index 1b052ec0..4cbad41b 100644 --- a/tests/test_args.py +++ b/tests/test_args.py @@ -22,6 +22,7 @@ from archinstall.lib.models.locale import LocaleConfiguration from archinstall.lib.models.mirrors import CustomRepository, CustomServer, MirrorConfiguration, MirrorRegion, SignCheck, SignOption from archinstall.lib.models.network import NetworkConfiguration, Nic, NicType from archinstall.lib.models.packages import Repository +from archinstall.lib.models.pacman import PacmanConfiguration from archinstall.lib.models.profile import ProfileConfiguration from archinstall.lib.models.users import Password, User from archinstall.lib.profile.profiles_handler import profile_handler @@ -234,7 +235,7 @@ def test_config_file_parsing( kernels=['linux-zen'], ntp=True, packages=['firefox'], - parallel_downloads=66, + pacman_config=PacmanConfiguration(parallel_downloads=66), swap=ZramConfiguration(enabled=False), timezone='UTC', services=['service_1', 'service_2'], From 5553cb9eae3e619145b03e66dcde5a2b0b94e366 Mon Sep 17 00:00:00 2001 From: Matteo <130925283+vanmatten@users.noreply.github.com> Date: Mon, 13 Apr 2026 10:38:24 +0200 Subject: [PATCH 09/38] locale: Update Italian translation (#4415) -Translated new strings -Fixed a couple of old translations --- archinstall/locales/it/LC_MESSAGES/base.mo | Bin 61975 -> 64821 bytes archinstall/locales/it/LC_MESSAGES/base.po | 268 +++++++++++++++++---- 2 files changed, 217 insertions(+), 51 deletions(-) diff --git a/archinstall/locales/it/LC_MESSAGES/base.mo b/archinstall/locales/it/LC_MESSAGES/base.mo index 4936e3592559e594d574ee9562fca9c9542ff352..79d934d42a09dd31cd159321dea69366608193a5 100644 GIT binary patch delta 16328 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 G4*EZ<-uE8> diff --git a/archinstall/locales/it/LC_MESSAGES/base.po b/archinstall/locales/it/LC_MESSAGES/base.po index f1e416a9..55585263 100644 --- a/archinstall/locales/it/LC_MESSAGES/base.po +++ b/archinstall/locales/it/LC_MESSAGES/base.po @@ -2,14 +2,14 @@ msgid "" msgstr "" "Project-Id-Version: \n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2026-01-20 19:23+0100\n" +"PO-Revision-Date: 2026-04-12 10:26+0200\n" "Last-Translator: Van Matten\n" "Language-Team: Alessio Cuccovillo , Van Matten\n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 3.8\n" +"X-Generator: Poedit 3.9\n" "X-Poedit-Basepath: ../..\n" "X-Poedit-SearchPath-0: base.pot\n" @@ -1028,7 +1028,7 @@ msgid "Back" msgstr "Indietro" msgid "Please chose which greeter to install for the chosen profiles: {}" -msgstr "Scegli quale messaggio di benvenuto installare per i profili scelti: {}" +msgstr "Scegli quale greeter installare per i profili scelti: {}" #, python-brace-format msgid "Environment type: {}" @@ -1090,10 +1090,10 @@ msgid "Graphics driver" msgstr "Driver grafici" msgid "Greeter" -msgstr "Programma di benvenuto" +msgstr "Greeter" msgid "Please chose which greeter to install" -msgstr "Scegli quale programma di benvenuto installare" +msgstr "Scegli quale greeter installare" msgid "This is a list of pre-programmed default_profiles" msgstr "Questo è un elenco di default_profiles preprogrammati" @@ -1243,7 +1243,7 @@ msgid "" msgstr "" "\n" "\n" -"Scegli un’opzione per concedere a Hyprland l'accesso al tuo hardware a Hyprland" +"Scegli un’opzione per concedere a Hyprland l'accesso al tuo hardware" msgid "All entered values can be suffixed with a unit: %, B, KB, KiB, MB, MiB..." msgstr "Tutti i valori immessi possono avere come suffisso un’unità: %, B, KB, KiB, MB, MiB…" @@ -1561,7 +1561,7 @@ msgid "Loading packages..." msgstr "Caricamento pacchetti in corso..." msgid "Select any packages from the below list that should be installed additionally" -msgstr "Seleziona dalla lista sotto i pacchetti da installare" +msgstr "Seleziona dalla lista sotto i pacchetti aggiuntivi da installare" msgid "Add a custom repository" msgstr "Aggiungi una repository personalizzata" @@ -1621,10 +1621,10 @@ msgid "Exit help" msgstr "Chiudi aiuto" msgid "Preview scroll up" -msgstr "Anteprima scorrimento vero l'alto" +msgstr "Anteprima scorrimento su" msgid "Preview scroll down" -msgstr "Anteprima scorrimento vero il basso" +msgstr "Anteprima scorrimento giù" msgid "Move up" msgstr "Muovi su" @@ -1665,6 +1665,123 @@ msgstr "Avvia modalità ricerca" msgid "Exit search mode" msgstr "Chiudi modalità ricerca" +msgid "General" +msgstr "Generale" + +msgid "Navigation" +msgstr "Navigazione" + +msgid "Selection" +msgstr "Selezione" + +msgid "Search" +msgstr "Cerca" + +msgid "Down" +msgstr "In fondo" + +msgid "Up" +msgstr "Su" + +msgid "Confirm" +msgstr "Conferma" + +msgid "Focus right" +msgstr "Vai a destra" + +msgid "Focus left" +msgstr "Vai a sinistra" + +msgid "Toggle" +msgstr "Attiva/disattiva" + +msgid "Show/Hide help" +msgstr "Mostra/nascondi aiuto" + +msgid "Quit" +msgstr "Esci" + +msgid "First" +msgstr "Primo" + +msgid "Last" +msgstr "Ultimo" + +msgid "Select" +msgstr "Seleziona" + +msgid "Page Up" +msgstr "Pagina su" + +msgid "Page Down" +msgstr "Pagina su" + +msgid "Page up" +msgstr "Pagina su" + +msgid "Page down" +msgstr "Pagina giù" + +msgid "Page Left" +msgstr "Pagina a sinistra" + +msgid "Page Right" +msgstr "Pagina a destra" + +msgid "Cursor up" +msgstr "Cursore su" + +msgid "Cursor down" +msgstr "Cursore giù" + +msgid "Cursor right" +msgstr "Cursore a destra" + +msgid "Cursor left" +msgstr "Cursore a sinistra" + +msgid "Top" +msgstr "In cima" + +msgid "Bottom" +msgstr "In fondo" + +msgid "Home" +msgstr "Inizio" + +msgid "End" +msgstr "Fine" + +msgid "Toggle option" +msgstr "Opzioni di attivazione" + +msgid "Scroll Up" +msgstr "Scorri Su" + +msgid "Scroll Down" +msgstr "Scorri giù" + +msgid "Scroll Left" +msgstr "Scorri a sinistra" + +msgid "Scroll Right" +msgstr "Scorri a destra" + +msgid "Scroll Home" +msgstr "Scorri all'inizio" + +msgid "Scroll End" +msgstr "Scorri alla fine" + +msgid "Focus Next" +msgstr "Vai al successivo" + +msgid "Focus Previous" +msgstr "Vai al precedente" + +msgid "Copy selected text" +msgstr "Copia il testo selezionato" + msgid "labwc needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)" msgstr "labwc ha bisogno dell’accesso al tuo posto (insieme di dispositivi hardware, ad esempio tastiera, mouse, ecc.)" @@ -1883,39 +2000,24 @@ msgstr "Usa NetworkManager (backend iwd)" msgid "Firewall" msgstr "Firewall" -msgid "Enter credentials file decryption password" -msgstr "Inserici la password di decrittazione del file delle credenziali" - -msgid "Configuration preview" -msgstr "Anteprima della configurazione" - -msgid "Enter a directory for the configuration(s) to be saved" -msgstr "Inserisci una cartella in cui salvare le configurazioni" - -msgid "Enter a respository name" -msgstr "Inserisci il nome di un repository" - -msgid "Enter the repository url" -msgstr "Inserisci l'URL della repository" - -msgid "Enter server url" -msgstr "Inserisci l'URL del server" - -msgid "Select mirror regions to be enabled" -msgstr "Seleziona quali regioni dei mirror abilitare" - -msgid "Select optional repositories to be enabled" -msgstr "Seleziona quali repository aggiuntive opzionali abilitare" - msgid "Select audio configuration" msgstr "Seleziona la configurazione audio" +msgid "Enter credentials file decryption password" +msgstr "Inserici la password di decrittazione del file delle credenziali" + msgid "Enter root password" msgstr "Inserisci la password di root" msgid "Select bootloader to install" msgstr "Seleziona il bootloader da installare" +msgid "Configuration preview" +msgstr "Anteprima della configurazione" + +msgid "Enter a directory for the configuration(s) to be saved" +msgstr "Inserisci una cartella in cui salvare le configurazioni" + msgid "Select encryption type" msgstr "Seleziona il tipo di crittografia" @@ -1956,9 +2058,6 @@ msgstr "Inserisci un nome dell'host" msgid "Select timezone" msgstr "Seleziona il fuso orario" -msgid "No packages found" -msgstr "Nessun pacchetto trovato" - msgid "Enter the number of parallel downloads to be enabled" msgstr "Inserisci il numero di download in parallelo da abilitare" @@ -1966,6 +2065,39 @@ msgstr "Inserisci il numero di download in parallelo da abilitare" msgid "Value must be between 1 and {}" msgstr "Il valore deve essere tra 1 e {}" +msgid "Select which kernel(s) to install" +msgstr "Scegli quali kernel installare" + +msgid "Enter a respository name" +msgstr "Inserisci il nome di un repository" + +msgid "Enter the repository url" +msgstr "Inserisci l'URL della repository" + +msgid "Enter server url" +msgstr "Inserisci l'URL del server" + +msgid "Select mirror regions to be enabled" +msgstr "Seleziona quali regioni dei mirror abilitare" + +msgid "Select optional repositories to be enabled" +msgstr "Seleziona quali repository aggiuntive opzionali abilitare" + +msgid "Select an interface" +msgstr "Seleziona un'interfaccia" + +msgid "Choose network configuration" +msgstr "Scegli la configurazione di rete" + +msgid "No packages found" +msgstr "Nessun pacchetto trovato" + +msgid "Select which greeter to install" +msgstr "Seleziona quale greeter installare" + +msgid "Select a profile type" +msgstr "Seleziona un tipo di profilo" + msgid "Enter new password" msgstr "Inserisci una nuova password" @@ -1975,20 +2107,54 @@ msgstr "Inserisci un nome utente" msgid "Enter a password" msgstr "Inserisci una password" -msgid "Select an interface" -msgstr "Seleziona un'interfaccia" - -msgid "Choose network configuration" -msgstr "Scegli la configurazione di rete" - -msgid "Select which kernel(s) to install" -msgstr "Scegli quali kernel installare" - -msgid "Select which greeter to install" -msgstr "Seleziona quale schermata di benvenuto installare" - -msgid "Select a profile type" -msgstr "Seleziona un tipo di profilo" - msgid "The password did not match, please try again" msgstr "La password non corrisponde, prova ancora" + +msgid "Password strength: Weak" +msgstr "Complessità password: Bassa" + +msgid "Password strength: Moderate" +msgstr "Complessità password: Media" + +msgid "Password strength: Strong" +msgstr "Complessità password: Alta" + +msgid "The selected desktop profile requires a regular user to log in via the greeter" +msgstr "Il profilo desktop selezionato richiede un utente regolare per accedere via greeter" + +#, python-brace-format +msgid "Environment type: {} {}" +msgstr "Tipo di ambiente: {} {}" + +msgid "Recommended" +msgstr "Raccomandato" + +msgid "Package" +msgstr "Pacchetto" + +msgid "Curated selection of KDE Plasma packages" +msgstr "Selezione curata di pacchetti di KDE Plasma" + +msgid "Dependencies" +msgstr "Dipendenze" + +msgid "Package group" +msgstr "Gruppo di pacchetti" + +msgid "Extensive KDE Plasma installation" +msgstr "Installazione di KDE Plasma estesa" + +msgid "Packages in group" +msgstr "Pacchetti nel gruppo" + +msgid "Minimal KDE Plasma installation" +msgstr "Installazione di KDE Plasma minimale" + +msgid "Description" +msgstr "Descrizione" + +msgid "Select a flavor of KDE Plasma to install" +msgstr "Seleziona la configurazione di KDE Plasma da installare" + +msgid "Input cannot be empty" +msgstr "Il campo non può essere vuoto" From 335a7b792c38ec1f4d08dc3c89dea19abd2d2034 Mon Sep 17 00:00:00 2001 From: codefiles <11915375+codefiles@users.noreply.github.com> Date: Mon, 13 Apr 2026 04:41:59 -0400 Subject: [PATCH 10/38] Refactor FilesystemType (#4417) * Use UPPER_CASE for FilesystemType member names * Use StrEnum for FilesystemType * Use FilesystemType member values --- archinstall/lib/disk/device_handler.py | 18 ++++----- archinstall/lib/disk/disk_menu.py | 16 ++++---- archinstall/lib/disk/filesystem.py | 8 ++-- archinstall/lib/disk/partitioning_menu.py | 12 +++--- archinstall/lib/global_menu.py | 4 +- archinstall/lib/installer.py | 14 +++---- archinstall/lib/models/device.py | 49 +++++++++++++---------- docs/examples/python.rst | 2 +- examples/full_automated_installation.py | 2 +- 9 files changed, 65 insertions(+), 60 deletions(-) diff --git a/archinstall/lib/disk/device_handler.py b/archinstall/lib/disk/device_handler.py index b54d45ad..1c7c5923 100644 --- a/archinstall/lib/disk/device_handler.py +++ b/archinstall/lib/disk/device_handler.py @@ -99,7 +99,7 @@ class DeviceHandler: fs_type = self._determine_fs_type(partition, lsblk_info) subvol_infos = [] - if fs_type == FilesystemType.Btrfs: + if fs_type == FilesystemType.BTRFS: subvol_infos = self.get_btrfs_info(partition.path, lsblk_info) partition_infos.append( @@ -147,8 +147,8 @@ class DeviceHandler: ) -> FilesystemType | None: try: if partition.fileSystem: - if partition.fileSystem.type == FilesystemType.LinuxSwap.parted_value: - return FilesystemType.LinuxSwap + if partition.fileSystem.type == FilesystemType.LINUX_SWAP.parted_value: + return FilesystemType.LINUX_SWAP return FilesystemType(partition.fileSystem.type) elif lsblk_info is not None: return FilesystemType(lsblk_info.fstype) if lsblk_info.fstype else None @@ -241,20 +241,20 @@ class DeviceHandler: options = [] match fs_type: - case FilesystemType.Btrfs | FilesystemType.Xfs: + case FilesystemType.BTRFS | FilesystemType.XFS: # Force overwrite options.append('-f') - case FilesystemType.F2fs: + case FilesystemType.F2FS: options.append('-f') options.extend(('-O', 'extra_attr')) - case FilesystemType.Ext2 | FilesystemType.Ext3 | FilesystemType.Ext4: + case FilesystemType.EXT2 | FilesystemType.EXT3 | FilesystemType.EXT4: # Force create options.append('-F') - case FilesystemType.Fat12 | FilesystemType.Fat16 | FilesystemType.Fat32: + case FilesystemType.FAT12 | FilesystemType.FAT16 | FilesystemType.FAT32: mkfs_type = 'fat' # Set FAT size options.extend(('-F', fs_type.value.removeprefix(mkfs_type))) - case FilesystemType.LinuxSwap: + case FilesystemType.LINUX_SWAP: command = 'mkswap' case _: raise UnknownFilesystemFormat(f'Filetype "{fs_type.value}" is not supported') @@ -505,7 +505,7 @@ class DeviceHandler: debug(f'Unmounting: {partition.path}') # un-mount for existing encrypted partitions - if partition.fs_type == FilesystemType.Crypto_luks: + if partition.fs_type == FilesystemType.CRYPTO_LUKS: Luks2(partition.path).lock() else: umount(partition.path, recursive=True) diff --git a/archinstall/lib/disk/disk_menu.py b/archinstall/lib/disk/disk_menu.py index 35f11331..245d096d 100644 --- a/archinstall/lib/disk/disk_menu.py +++ b/archinstall/lib/disk/disk_menu.py @@ -508,17 +508,17 @@ def _boot_partition(sector_size: SectorSize, using_gpt: bool) -> PartitionModifi start=start, length=size, mountpoint=Path('/boot'), - fs_type=FilesystemType.Fat32, + fs_type=FilesystemType.FAT32, flags=flags, ) async def select_main_filesystem_format() -> FilesystemType: items = [ - MenuItem('btrfs', value=FilesystemType.Btrfs), - MenuItem('ext4', value=FilesystemType.Ext4), - MenuItem('xfs', value=FilesystemType.Xfs), - MenuItem('f2fs', value=FilesystemType.F2fs), + MenuItem(FilesystemType.BTRFS.value, value=FilesystemType.BTRFS), + MenuItem(FilesystemType.EXT4.value, value=FilesystemType.EXT4), + MenuItem(FilesystemType.XFS.value, value=FilesystemType.XFS), + MenuItem(FilesystemType.F2FS.value, value=FilesystemType.F2FS), ] group = MenuItemGroup(items, sort_items=False) @@ -601,7 +601,7 @@ async def suggest_single_disk_layout( available_space = total_size min_size_to_allow_home_part = Size(64, Unit.GiB, sector_size) - if filesystem_type == FilesystemType.Btrfs: + if filesystem_type == FilesystemType.BTRFS: prompt = tr('Would you like to use BTRFS subvolumes with a default structure?') + '\n' result = await Confirmation( @@ -734,7 +734,7 @@ async def suggest_multi_disk_layout( _ = await Notify(text).show() return [] - if filesystem_type == FilesystemType.Btrfs: + if filesystem_type == FilesystemType.BTRFS: mount_options = await select_mount_options() device_paths = ', '.join(str(d.device_info.path) for d in devices) @@ -817,7 +817,7 @@ async def suggest_lvm_layout( if not filesystem_type: filesystem_type = await select_main_filesystem_format() - if filesystem_type == FilesystemType.Btrfs: + if filesystem_type == FilesystemType.BTRFS: prompt = tr('Would you like to use BTRFS subvolumes with a default structure?') + '\n' result = await Confirmation(header=prompt, allow_skip=False, preset=True).show() diff --git a/archinstall/lib/disk/filesystem.py b/archinstall/lib/disk/filesystem.py index 28786530..67636491 100644 --- a/archinstall/lib/disk/filesystem.py +++ b/archinstall/lib/disk/filesystem.py @@ -70,7 +70,7 @@ class FilesystemHandler: self._format_partitions(mod.partitions) for part_mod in mod.partitions: - if part_mod.fs_type == FilesystemType.Btrfs and part_mod.is_create_or_modify(): + if part_mod.fs_type == FilesystemType.BTRFS and part_mod.is_create_or_modify(): device_handler.create_btrfs_volumes(part_mod, enc_conf=self._enc_config) def _format_partitions( @@ -113,7 +113,7 @@ class FilesystemHandler: # verify that all partitions have a path set (which implies that they have been created) lambda x: x.dev_path is None: ValueError('When formatting, all partitions must have a path set'), # crypto luks is not a valid file system type - lambda x: x.fs_type is FilesystemType.Crypto_luks: ValueError('Crypto luks cannot be set as a filesystem type'), + lambda x: x.fs_type is FilesystemType.CRYPTO_LUKS: ValueError('Crypto luks cannot be set as a filesystem type'), # file system type must be set lambda x: x.fs_type is None: ValueError('File system type must be set for modification'), } @@ -230,7 +230,7 @@ class FilesystemHandler: # find the mapper device yet device_handler.format(vol.fs_type, path) - if vol.fs_type == FilesystemType.Btrfs: + if vol.fs_type == FilesystemType.BTRFS: device_handler.create_lvm_btrfs_subvolumes(path, vol.btrfs_subvols, vol.mount_options) def _lvm_create_pvs( @@ -318,7 +318,7 @@ class FilesystemHandler: # from arch wiki: # If a logical volume will be formatted with ext4, leave at least 256 MiB # free space in the volume group to allow using e2scrub - if any([vol.fs_type == FilesystemType.Ext4 for vol in vol_gp.volumes]): + if any([vol.fs_type == FilesystemType.EXT4 for vol in vol_gp.volumes]): largest_vol = max(vol_gp.volumes, key=lambda x: x.length) lvm_vol_reduce( diff --git a/archinstall/lib/disk/partitioning_menu.py b/archinstall/lib/disk/partitioning_menu.py index feb97c6c..b0ae7c11 100644 --- a/archinstall/lib/disk/partitioning_menu.py +++ b/archinstall/lib/disk/partitioning_menu.py @@ -255,7 +255,7 @@ class PartitioningList(ListManager[DiskSegment]): ] # non btrfs partitions shouldn't get btrfs options - if selection.segment.fs_type != FilesystemType.Btrfs: + if selection.segment.fs_type != FilesystemType.BTRFS: not_filter += [ self._actions['btrfs_mark_compressed'], self._actions['btrfs_mark_nodatacow'], @@ -332,7 +332,7 @@ class PartitioningList(ListManager[DiskSegment]): partition.flags = [] partition.set_flag(PartitionFlag.SWAP) # btrfs subvolumes will define mountpoints - if fs_type == FilesystemType.Btrfs: + if fs_type == FilesystemType.BTRFS: partition.mountpoint = None case 'btrfs_mark_compressed': self._toggle_mount_option(partition, BtrfsMountOption.compress) @@ -399,12 +399,12 @@ class PartitioningList(ListManager[DiskSegment]): # If we mark a partition for formatting, but the format is CRYPTO LUKS, there's no point in formatting it really # without asking the user which inner-filesystem they want to use. Since the flag 'encrypted' = True is already set, # it's safe to change the filesystem for this partition. - if partition.fs_type == FilesystemType.Crypto_luks: + if partition.fs_type == FilesystemType.CRYPTO_LUKS: prompt = tr('This partition is currently encrypted, to format it a filesystem has to be specified') + '\n' fs_type = await self._prompt_partition_fs_type(prompt) partition.fs_type = fs_type - if fs_type == FilesystemType.Btrfs: + if fs_type == FilesystemType.BTRFS: partition.mountpoint = None async def _prompt_mountpoint(self) -> Path: @@ -417,7 +417,7 @@ class PartitioningList(ListManager[DiskSegment]): return mountpoint async def _prompt_partition_fs_type(self, prompt: str | None = None) -> FilesystemType: - fs_types = filter(lambda fs: fs != FilesystemType.Crypto_luks, FilesystemType) + fs_types = filter(lambda fs: fs != FilesystemType.CRYPTO_LUKS, FilesystemType) items = [MenuItem(fs.value, value=fs) for fs in fs_types] group = MenuItemGroup(items, sort_items=False) @@ -522,7 +522,7 @@ class PartitioningList(ListManager[DiskSegment]): fs_type = await self._prompt_partition_fs_type() mountpoint = None - if fs_type not in (FilesystemType.Btrfs, FilesystemType.LinuxSwap): + if fs_type not in (FilesystemType.BTRFS, FilesystemType.LINUX_SWAP): mountpoint = await self._prompt_mountpoint() partition = PartitionModification( diff --git a/archinstall/lib/global_menu.py b/archinstall/lib/global_menu.py index 6e4b6720..2baef93d 100644 --- a/archinstall/lib/global_menu.py +++ b/archinstall/lib/global_menu.py @@ -486,11 +486,11 @@ class GlobalMenu(AbstractMenu[None]): if efi_partition is None: return 'EFI system partition (ESP) not found' - if efi_partition.fs_type not in [FilesystemType.Fat12, FilesystemType.Fat16, FilesystemType.Fat32]: + if efi_partition.fs_type not in [FilesystemType.FAT12, FilesystemType.FAT16, FilesystemType.FAT32]: return 'ESP must be formatted as a FAT filesystem' if bootloader == Bootloader.Limine: - if boot_partition.fs_type not in [FilesystemType.Fat12, FilesystemType.Fat16, FilesystemType.Fat32]: + if boot_partition.fs_type not in [FilesystemType.FAT12, FilesystemType.FAT16, FilesystemType.FAT32]: return 'Limine does not support booting with a non-FAT boot partition' elif bootloader == Bootloader.Refind: diff --git a/archinstall/lib/installer.py b/archinstall/lib/installer.py index 43077c63..17b4d0d0 100644 --- a/archinstall/lib/installer.py +++ b/archinstall/lib/installer.py @@ -369,7 +369,7 @@ class Installer: if part_mod.mountpoint: target = self.target / part_mod.relative_mountpoint mount(part_mod.dev_path, target, options=part_mod.mount_options) - elif part_mod.fs_type == FilesystemType.Btrfs: + elif part_mod.fs_type == FilesystemType.BTRFS: # Only mount BTRFS subvolumes that have mountpoints specified subvols_with_mountpoints = [sv for sv in part_mod.btrfs_subvols if sv.mountpoint is not None] if subvols_with_mountpoints: @@ -382,12 +382,12 @@ class Installer: swapon(part_mod.dev_path) def _mount_lvm_vol(self, volume: LvmVolume) -> None: - if volume.fs_type != FilesystemType.Btrfs: + if volume.fs_type != FilesystemType.BTRFS: if volume.mountpoint and volume.dev_path: target = self.target / volume.relative_mountpoint mount(volume.dev_path, target, options=volume.mount_options) - if volume.fs_type == FilesystemType.Btrfs and volume.dev_path: + if volume.fs_type == FilesystemType.BTRFS and volume.dev_path: # Only mount BTRFS subvolumes that have mountpoints specified subvols_with_mountpoints = [sv for sv in volume.btrfs_subvols if sv.mountpoint is not None] if subvols_with_mountpoints: @@ -397,7 +397,7 @@ class Installer: if not luks_handler.mapper_dev: return None - if part_mod.fs_type == FilesystemType.Btrfs and part_mod.btrfs_subvols: + if part_mod.fs_type == FilesystemType.BTRFS and part_mod.btrfs_subvols: # Only mount BTRFS subvolumes that have mountpoints specified subvols_with_mountpoints = [sv for sv in part_mod.btrfs_subvols if sv.mountpoint is not None] if subvols_with_mountpoints: @@ -407,12 +407,12 @@ class Installer: mount(luks_handler.mapper_dev, target, options=part_mod.mount_options) def _mount_luks_volume(self, volume: LvmVolume, luks_handler: Luks2) -> None: - if volume.fs_type != FilesystemType.Btrfs: + if volume.fs_type != FilesystemType.BTRFS: if volume.mountpoint and luks_handler.mapper_dev: target = self.target / volume.relative_mountpoint mount(luks_handler.mapper_dev, target, options=volume.mount_options) - if volume.fs_type == FilesystemType.Btrfs and luks_handler.mapper_dev: + if volume.fs_type == FilesystemType.BTRFS and luks_handler.mapper_dev: # Only mount BTRFS subvolumes that have mountpoints specified subvols_with_mountpoints = [sv for sv in volume.btrfs_subvols if sv.mountpoint is not None] if subvols_with_mountpoints: @@ -867,7 +867,7 @@ class Installer: self._base_packages.append(pkg) # https://github.com/archlinux/archinstall/issues/1837 - if fs_type == FilesystemType.Btrfs: + if fs_type == FilesystemType.BTRFS: self._disable_fstrim = True def _prepare_encrypt(self, before: str = 'filesystems') -> None: diff --git a/archinstall/lib/models/device.py b/archinstall/lib/models/device.py index be82e687..d7474aa5 100644 --- a/archinstall/lib/models/device.py +++ b/archinstall/lib/models/device.py @@ -2,7 +2,7 @@ import builtins import math import uuid from dataclasses import dataclass, field -from enum import Enum +from enum import Enum, StrEnum, auto from pathlib import Path from typing import NotRequired, Self, TypedDict, override from uuid import UUID @@ -131,9 +131,14 @@ class DiskLayoutConfiguration: for partition in entry.get('partitions', []): flags = [flag for f in partition.get('flags', []) if (flag := PartitionFlag.from_string(f))] + if fs_type := partition.get('fs_type'): + fs_type = FilesystemType(fs_type) + else: + fs_type = None + device_partition = PartitionModification( status=ModificationStatus(partition['status']), - fs_type=FilesystemType(partition['fs_type']) if partition.get('fs_type') else None, + fs_type=fs_type, start=Size.parse_args(partition['start']), length=Size.parse_args(partition['size']), mount_options=partition['mount_options'], @@ -200,7 +205,7 @@ class DiskLayoutConfiguration: def has_default_btrfs_vols(self) -> bool: for mod in self.device_modifications: for part in mod.partitions: - if not (part.is_create_or_modify() and part.fs_type == FilesystemType.Btrfs): + if not (part.is_create_or_modify() and part.fs_type == FilesystemType.BTRFS): continue if any(subvol.is_default_root() for subvol in part.btrfs_subvols): @@ -777,38 +782,38 @@ class PartitionGUID(Enum): return uuid.UUID(self.value).bytes -class FilesystemType(Enum): - Btrfs = 'btrfs' - Ext2 = 'ext2' - Ext3 = 'ext3' - Ext4 = 'ext4' - F2fs = 'f2fs' - Fat12 = 'fat12' - Fat16 = 'fat16' - Fat32 = 'fat32' - Ntfs = 'ntfs' - Xfs = 'xfs' - LinuxSwap = 'linux-swap' +class FilesystemType(StrEnum): + BTRFS = auto() + EXT2 = auto() + EXT3 = auto() + EXT4 = auto() + F2FS = auto() + FAT12 = auto() + FAT16 = auto() + FAT32 = auto() + NTFS = auto() + XFS = auto() + LINUX_SWAP = 'linux-swap' # this is not a FS known to parted, so be careful # with the usage from this enum - Crypto_luks = 'crypto_LUKS' + CRYPTO_LUKS = 'crypto_LUKS' def is_crypto(self) -> bool: - return self == FilesystemType.Crypto_luks + return self == FilesystemType.CRYPTO_LUKS @property def parted_value(self) -> str: - return self.value + '(v1)' if self == FilesystemType.LinuxSwap else self.value + return self.value + '(v1)' if self == FilesystemType.LINUX_SWAP else self.value @property def installation_pkg(self) -> str | None: match self: - case FilesystemType.Btrfs: + case FilesystemType.BTRFS: return 'btrfs-progs' - case FilesystemType.Xfs: + case FilesystemType.XFS: return 'xfsprogs' - case FilesystemType.F2fs: + case FilesystemType.F2FS: return 'f2fs-tools' case _: return None @@ -953,7 +958,7 @@ class PartitionModification: return False def is_swap(self) -> bool: - return self.fs_type == FilesystemType.LinuxSwap + return self.fs_type == FilesystemType.LINUX_SWAP def is_modify(self) -> bool: return self.status == ModificationStatus.Modify diff --git a/docs/examples/python.rst b/docs/examples/python.rst index 020ea57a..84fb57c0 100644 --- a/docs/examples/python.rst +++ b/docs/examples/python.rst @@ -65,7 +65,7 @@ After running ``python -m archinstall test_installer`` it should print something partition=, name='primary', type=, - fs_type=, + fs_type=, path='/dev/nvme0n1p1', start=Size(value=2048, unit=, sector_size=SectorSize(value=512, unit=)), length=Size(value=535822336, unit=, sector_size=SectorSize(value=512, unit=)), diff --git a/examples/full_automated_installation.py b/examples/full_automated_installation.py index 84920605..a137db91 100644 --- a/examples/full_automated_installation.py +++ b/examples/full_automated_installation.py @@ -42,7 +42,7 @@ boot_partition = PartitionModification( start=Size(1, Unit.MiB, device.device_info.sector_size), length=Size(512, Unit.MiB, device.device_info.sector_size), mountpoint=Path('/boot'), - fs_type=FilesystemType.Fat32, + fs_type=FilesystemType.FAT32, flags=[PartitionFlag.BOOT], ) device_modification.add_partition(boot_partition) From 5dd94e80d2584f8f232c43b02100edd662f1cc93 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 13 Apr 2026 18:48:17 +1000 Subject: [PATCH 11/38] Update astral-sh/ruff-action action to v4 (#4416) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/ruff-format.yaml | 2 +- .github/workflows/ruff-lint.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ruff-format.yaml b/.github/workflows/ruff-format.yaml index 7e8abbde..1a70721e 100644 --- a/.github/workflows/ruff-format.yaml +++ b/.github/workflows/ruff-format.yaml @@ -5,5 +5,5 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - - uses: astral-sh/ruff-action@4919ec5cf1f49eff0871dbcea0da843445b837e6 # v3.6.1 + - uses: astral-sh/ruff-action@0ce1b0bf8b818ef400413f810f8a11cdbda0034b # v4.0.0 - run: ruff format --diff diff --git a/.github/workflows/ruff-lint.yaml b/.github/workflows/ruff-lint.yaml index fa620172..09ca4166 100644 --- a/.github/workflows/ruff-lint.yaml +++ b/.github/workflows/ruff-lint.yaml @@ -5,4 +5,4 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - - uses: astral-sh/ruff-action@4919ec5cf1f49eff0871dbcea0da843445b837e6 # v3.6.1 + - uses: astral-sh/ruff-action@0ce1b0bf8b818ef400413f810f8a11cdbda0034b # v4.0.0 From a52bfc3446cb50be17dcda7be72f70a46af047c1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 13 Apr 2026 18:49:04 +1000 Subject: [PATCH 12/38] Update dependency mypy to v1.20.1 (#4419) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 2b5bfaae..2845458b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,7 +33,7 @@ Source = "https://github.com/archlinux/archinstall" [project.optional-dependencies] log = ["systemd_python==235"] dev = [ - "mypy==1.20.0", + "mypy==1.20.1", "flake8==7.3.0", "pre-commit==4.5.1", "ruff==0.15.10", From 2b27e565ae1059323c34c30cdbfd9c31ab510816 Mon Sep 17 00:00:00 2001 From: codefiles <11915375+codefiles@users.noreply.github.com> Date: Tue, 14 Apr 2026 01:37:14 -0400 Subject: [PATCH 13/38] Refactor ModificationStatus (#4422) * Use UPPER_CASE for ModificationStatus member names * Use StrEnum for ModificationStatus * Replace LvmVolumeStatus with ModificationStatus --- archinstall/lib/disk/device_handler.py | 4 +- archinstall/lib/disk/disk_menu.py | 15 ++++--- archinstall/lib/disk/partitioning_menu.py | 12 +++--- archinstall/lib/models/__init__.py | 2 - archinstall/lib/models/device.py | 51 ++++++++++------------- examples/full_automated_installation.py | 6 +-- 6 files changed, 40 insertions(+), 50 deletions(-) diff --git a/archinstall/lib/disk/device_handler.py b/archinstall/lib/disk/device_handler.py index 1c7c5923..7ac05a31 100644 --- a/archinstall/lib/disk/device_handler.py +++ b/archinstall/lib/disk/device_handler.py @@ -342,7 +342,7 @@ class DeviceHandler: ) -> None: # when we require a delete and the partition to be (re)created # already exists then we have to delete it first - if requires_delete and part_mod.status in [ModificationStatus.Modify, ModificationStatus.Delete]: + if requires_delete and part_mod.status in [ModificationStatus.MODIFY, ModificationStatus.DELETE]: info(f'Delete existing partition: {part_mod.safe_dev_path}') part_info = self.find_partition(part_mod.safe_dev_path) @@ -351,7 +351,7 @@ class DeviceHandler: disk.deletePartition(part_info.partition) - if part_mod.status == ModificationStatus.Delete: + if part_mod.status == ModificationStatus.DELETE: return start_sector = part_mod.start.convert( diff --git a/archinstall/lib/disk/disk_menu.py b/archinstall/lib/disk/disk_menu.py index 245d096d..9cc7271a 100644 --- a/archinstall/lib/disk/disk_menu.py +++ b/archinstall/lib/disk/disk_menu.py @@ -23,7 +23,6 @@ from archinstall.lib.models.device import ( LvmLayoutType, LvmVolume, LvmVolumeGroup, - LvmVolumeStatus, ModificationStatus, PartitionFlag, PartitionModification, @@ -503,7 +502,7 @@ def _boot_partition(sector_size: SectorSize, using_gpt: bool) -> PartitionModifi # boot partition return PartitionModification( - status=ModificationStatus.Create, + status=ModificationStatus.CREATE, type=PartitionType.Primary, start=start, length=size, @@ -655,7 +654,7 @@ async def suggest_single_disk_layout( root_length = available_space - root_start root_partition = PartitionModification( - status=ModificationStatus.Create, + status=ModificationStatus.CREATE, type=PartitionType.Primary, start=root_start, length=root_length, @@ -680,7 +679,7 @@ async def suggest_single_disk_layout( flags.append(PartitionFlag.LINUX_HOME) home_partition = PartitionModification( - status=ModificationStatus.Create, + status=ModificationStatus.CREATE, type=PartitionType.Primary, start=home_start, length=home_length, @@ -765,7 +764,7 @@ async def suggest_multi_disk_layout( # add root partition to the root device root_partition = PartitionModification( - status=ModificationStatus.Create, + status=ModificationStatus.CREATE, type=PartitionType.Primary, start=root_start, length=root_length, @@ -787,7 +786,7 @@ async def suggest_multi_disk_layout( # add home partition to home device home_partition = PartitionModification( - status=ModificationStatus.Create, + status=ModificationStatus.CREATE, type=PartitionType.Primary, start=home_start, length=home_length, @@ -851,7 +850,7 @@ async def suggest_lvm_layout( lvm_vol_group = LvmVolumeGroup(vg_grp_name, pvs=other_part) root_vol = LvmVolume( - status=LvmVolumeStatus.Create, + status=ModificationStatus.CREATE, name='root', fs_type=filesystem_type, length=root_vol_size, @@ -864,7 +863,7 @@ async def suggest_lvm_layout( if home_volume: home_vol = LvmVolume( - status=LvmVolumeStatus.Create, + status=ModificationStatus.CREATE, name='home', fs_type=filesystem_type, length=home_vol_size, diff --git a/archinstall/lib/disk/partitioning_menu.py b/archinstall/lib/disk/partitioning_menu.py index b0ae7c11..d5c6f064 100644 --- a/archinstall/lib/disk/partitioning_menu.py +++ b/archinstall/lib/disk/partitioning_menu.py @@ -57,7 +57,7 @@ class DiskSegment: return self.segment.table_data() part_mod = PartitionModification( - status=ModificationStatus.Create, + status=ModificationStatus.CREATE, type=PartitionType._Unknown, start=self.segment.start, length=self.segment.length, @@ -209,7 +209,7 @@ class PartitioningList(ListManager[DiskSegment]): @override def selected_action_display(self, selection: DiskSegment) -> str: if isinstance(selection.segment, PartitionModification): - if selection.segment.status == ModificationStatus.Create: + if selection.segment.status == ModificationStatus.CREATE: return tr('Partition - New') elif selection.segment.is_delete() and selection.segment.dev_path: title = tr('Partition') + '\n\n' @@ -357,7 +357,7 @@ class PartitioningList(ListManager[DiskSegment]): data: list[DiskSegment], ) -> list[DiskSegment]: if entry.is_exists_or_modify(): - entry.status = ModificationStatus.Delete + entry.status = ModificationStatus.DELETE part_mods = self.get_part_mods(data) else: part_mods = [d.segment for d in data if isinstance(d.segment, PartitionModification) and d.segment != entry] @@ -391,10 +391,10 @@ class PartitioningList(ListManager[DiskSegment]): async def _prompt_formatting(self, partition: PartitionModification) -> None: # an existing partition can toggle between Exist or Modify if partition.is_modify(): - partition.status = ModificationStatus.Exist + partition.status = ModificationStatus.EXIST return elif partition.exists(): - partition.status = ModificationStatus.Modify + partition.status = ModificationStatus.MODIFY # If we mark a partition for formatting, but the format is CRYPTO LUKS, there's no point in formatting it really # without asking the user which inner-filesystem they want to use. Since the flag 'encrypted' = True is already set, @@ -526,7 +526,7 @@ class PartitioningList(ListManager[DiskSegment]): mountpoint = await self._prompt_mountpoint() partition = PartitionModification( - status=ModificationStatus.Create, + status=ModificationStatus.CREATE, type=PartitionType.Primary, start=free_space.start, length=length, diff --git a/archinstall/lib/models/__init__.py b/archinstall/lib/models/__init__.py index 7428dd3e..5f808c96 100644 --- a/archinstall/lib/models/__init__.py +++ b/archinstall/lib/models/__init__.py @@ -15,7 +15,6 @@ from archinstall.lib.models.device import ( LvmLayoutType, LvmVolume, LvmVolumeGroup, - LvmVolumeStatus, ModificationStatus, PartitionFlag, PartitionModification, @@ -57,7 +56,6 @@ __all__ = [ 'LvmLayoutType', 'LvmVolume', 'LvmVolumeGroup', - 'LvmVolumeStatus', 'MirrorConfiguration', 'MirrorRegion', 'ModificationStatus', diff --git a/archinstall/lib/models/device.py b/archinstall/lib/models/device.py index d7474aa5..897a32bc 100644 --- a/archinstall/lib/models/device.py +++ b/archinstall/lib/models/device.py @@ -164,15 +164,15 @@ class DiskLayoutConfiguration: continue first = non_delete_partitions[0] - if first.status == ModificationStatus.Create and not first.start.is_valid_start(): + if first.status == ModificationStatus.CREATE and not first.start.is_valid_start(): raise ValueError('First partition must start at no less than 1 MiB') for i, current_partition in enumerate(non_delete_partitions[1:], start=1): previous_partition = non_delete_partitions[i - 1] - if current_partition.status == ModificationStatus.Create and current_partition.start < previous_partition.end: + if current_partition.status == ModificationStatus.CREATE and current_partition.start < previous_partition.end: raise ValueError('Partitions overlap') - create_partitions = [part_mod for part_mod in non_delete_partitions if part_mod.status == ModificationStatus.Create] + create_partitions = [part_mod for part_mod in non_delete_partitions if part_mod.status == ModificationStatus.CREATE] if not create_partitions: continue @@ -819,11 +819,11 @@ class FilesystemType(StrEnum): return None -class ModificationStatus(Enum): - Exist = 'existing' - Modify = 'modify' - Delete = 'delete' - Create = 'create' +class ModificationStatus(StrEnum): + EXIST = 'existing' + MODIFY = auto() + DELETE = auto() + CREATE = auto() class _PartitionModificationSerialization(TypedDict): @@ -868,7 +868,7 @@ class PartitionModification: if self.is_exists_or_modify() and not self.dev_path: raise ValueError('If partition marked as existing a path must be set') - if self.fs_type is None and self.status == ModificationStatus.Modify: + if self.fs_type is None and self.status == ModificationStatus.MODIFY: raise ValueError('FS type must not be empty on modifications with status type modify') @override @@ -911,7 +911,7 @@ class PartitionModification: subvol_mods = [] return cls( - status=ModificationStatus.Exist, + status=ModificationStatus.EXIST, type=partition_info.type, start=partition_info.start, length=partition_info.length, @@ -961,23 +961,23 @@ class PartitionModification: return self.fs_type == FilesystemType.LINUX_SWAP def is_modify(self) -> bool: - return self.status == ModificationStatus.Modify + return self.status == ModificationStatus.MODIFY def is_delete(self) -> bool: - return self.status == ModificationStatus.Delete + return self.status == ModificationStatus.DELETE def exists(self) -> bool: - return self.status == ModificationStatus.Exist + return self.status == ModificationStatus.EXIST def is_exists_or_modify(self) -> bool: return self.status in [ - ModificationStatus.Exist, - ModificationStatus.Delete, - ModificationStatus.Modify, + ModificationStatus.EXIST, + ModificationStatus.DELETE, + ModificationStatus.MODIFY, ] def is_create_or_modify(self) -> bool: - return self.status in [ModificationStatus.Create, ModificationStatus.Modify] + return self.status in [ModificationStatus.CREATE, ModificationStatus.MODIFY] @property def mapper_name(self) -> str | None: @@ -1088,13 +1088,6 @@ class LvmVolumeGroup: return lv in self.volumes -class LvmVolumeStatus(Enum): - Exist = 'existing' - Modify = 'modify' - Delete = 'delete' - Create = 'create' - - class _LvmVolumeSerialization(TypedDict): obj_id: str status: str @@ -1108,7 +1101,7 @@ class _LvmVolumeSerialization(TypedDict): @dataclass class LvmVolume: - status: LvmVolumeStatus + status: ModificationStatus name: str fs_type: FilesystemType length: Size @@ -1177,7 +1170,7 @@ class LvmVolume: @classmethod def parse_arg(cls, arg: _LvmVolumeSerialization) -> Self: volume = cls( - status=LvmVolumeStatus(arg['status']), + status=ModificationStatus(arg['status']), name=arg['name'], fs_type=FilesystemType(arg['fs_type']), length=Size.parse_args(arg['length']), @@ -1215,13 +1208,13 @@ class LvmVolume: return part_mod def is_modify(self) -> bool: - return self.status == LvmVolumeStatus.Modify + return self.status == ModificationStatus.MODIFY def exists(self) -> bool: - return self.status == LvmVolumeStatus.Exist + return self.status == ModificationStatus.EXIST def is_exists_or_modify(self) -> bool: - return self.status in [LvmVolumeStatus.Exist, LvmVolumeStatus.Modify] + return self.status in [ModificationStatus.EXIST, ModificationStatus.MODIFY] def is_root(self) -> bool: if self.mountpoint is not None: diff --git a/examples/full_automated_installation.py b/examples/full_automated_installation.py index a137db91..cd74962a 100644 --- a/examples/full_automated_installation.py +++ b/examples/full_automated_installation.py @@ -37,7 +37,7 @@ device_modification = DeviceModification(device, wipe=True) # create a new boot partition boot_partition = PartitionModification( - status=ModificationStatus.Create, + status=ModificationStatus.CREATE, type=PartitionType.Primary, start=Size(1, Unit.MiB, device.device_info.sector_size), length=Size(512, Unit.MiB, device.device_info.sector_size), @@ -49,7 +49,7 @@ device_modification.add_partition(boot_partition) # create a root partition root_partition = PartitionModification( - status=ModificationStatus.Create, + status=ModificationStatus.CREATE, type=PartitionType.Primary, start=Size(513, Unit.MiB, device.device_info.sector_size), length=Size(20, Unit.GiB, device.device_info.sector_size), @@ -64,7 +64,7 @@ length_home = device.device_info.total_size - start_home # create a new home partition home_partition = PartitionModification( - status=ModificationStatus.Create, + status=ModificationStatus.CREATE, type=PartitionType.Primary, start=start_home, length=length_home, From 728bb450c744d0663d04e89ff8bcca714fc4a60d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 14 Apr 2026 15:37:56 +1000 Subject: [PATCH 14/38] Update pre-commit hook pre-commit/mirrors-mypy to v1.20.1 (#4423) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index df30a04e..5be827a1 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -31,7 +31,7 @@ repos: args: [--config=.flake8] fail_fast: true - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.20.0 + rev: v1.20.1 hooks: - id: mypy args: [ From 88366ba57524f1402ce9d686a4ea081cb79b27e6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 14 Apr 2026 15:38:14 +1000 Subject: [PATCH 15/38] Update dependency pydantic to v2.13.0 (#4424) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 2845458b..b6cc22d5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -19,7 +19,7 @@ classifiers = [ ] dependencies = [ "pyparted>=3.13.0", - "pydantic==2.12.5", + "pydantic==2.13.0", "cryptography>=45.0.7", "textual>=5.3.0", "markdown-it-py[linkify]>=4.0.0", From 113cc7fd945bea2e9d216549a93cbcdb4df05bbe Mon Sep 17 00:00:00 2001 From: correctmost <134317971+correctmost@users.noreply.github.com> Date: Tue, 14 Apr 2026 01:39:08 -0400 Subject: [PATCH 16/38] Fix urllib.parse import to avoid warnings with ty and Pyright (#4425) --- archinstall/lib/mirror/mirror_handler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/archinstall/lib/mirror/mirror_handler.py b/archinstall/lib/mirror/mirror_handler.py index aab85fce..ef0ba1a9 100644 --- a/archinstall/lib/mirror/mirror_handler.py +++ b/archinstall/lib/mirror/mirror_handler.py @@ -1,5 +1,5 @@ import time -import urllib +import urllib.parse from pathlib import Path from archinstall.lib.models import MirrorRegion From c0d3c14b6e27632aae3899cf1972763f39bd4aee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ian=20Dieb=20H=2E=20Rebou=C3=A7as?= <131741243+din-grogu@users.noreply.github.com> Date: Tue, 14 Apr 2026 04:39:23 -0300 Subject: [PATCH 17/38] Update Brazilian Portuguese translation (#4426) Co-authored-by: Ian Dieb --- archinstall/locales/pt_BR/LC_MESSAGES/base.po | 239 ++++++++++++++++-- 1 file changed, 220 insertions(+), 19 deletions(-) diff --git a/archinstall/locales/pt_BR/LC_MESSAGES/base.po b/archinstall/locales/pt_BR/LC_MESSAGES/base.po index 83d5d191..c507724c 100644 --- a/archinstall/locales/pt_BR/LC_MESSAGES/base.po +++ b/archinstall/locales/pt_BR/LC_MESSAGES/base.po @@ -28,7 +28,7 @@ msgid " Please submit this issue (and file) to https://github.com/archlinux/a msgstr " Por favor, envie este problema (e o arquivo) para: https://github.com/archlinux/archinstall/issues" msgid "Do you really want to abort?" -msgstr "Tem certeza de que deseja abortar?" +msgstr "Tem certeza que deseja abortar?" msgid "And one more time for verification: " msgstr "Digite novamente para confirmação: " @@ -195,7 +195,7 @@ msgid "Select what you wish to do with the selected block devices" msgstr "Selecione o que deseja fazer com os dispositivos de bloco selecionados" msgid "This is a list of pre-programmed profiles, they might make it easier to install things like desktop environments" -msgstr "Esta é uma lista de perfis pré-programados, que podem por exemplo facilitar a instalação de ambientes gráficos" +msgstr "Esta é uma lista de perfis pré-programados, que podem, por exemplo, facilitar a instalação de ambientes gráficos" msgid "Select keyboard layout" msgstr "Selecione o layout de teclado" @@ -207,10 +207,10 @@ msgid "Select one or more hard drives to use and configure" msgstr "Selecione um ou mais discos rígidos para usar e configurar" msgid "For the best compatibility with your AMD hardware, you may want to use either the all open-source or AMD / ATI options." -msgstr "Para melhor compatibilidade com seu hardware AMD, recomenda-se usar a opção totalmente open source ou as opções AMD / ATI." +msgstr "Para melhor compatibilidade com seu hardware AMD, recomenda-se usar a opção totalmente open-source ou as opções AMD / ATI." msgid "For the best compatibility with your Intel hardware, you may want to use either the all open-source or Intel options.\n" -msgstr "Para melhor compatibilidade com seu hardware Intel, recomenda-se usar a opção totalmente open source ou as opções Intel.\n" +msgstr "Para melhor compatibilidade com seu hardware Intel, recomenda-se usar a opção totalmente open-source ou as opções Intel.\n" msgid "For the best compatibility with your Nvidia hardware, you may want to use the Nvidia proprietary driver.\n" msgstr "Para melhor compatibilidade com seu hardware Nvidia, recomenda-se usar o driver proprietário da Nvidia.\n" @@ -222,13 +222,13 @@ msgid "" msgstr "" "\n" "\n" -"Selecione um driver de vídeo ou deixe em branco para instalar os drivers completamente open-source" +"Selecione um driver de vídeo ou deixe em branco para instalar os drivers open-source" msgid "All open-source (default)" msgstr "Tudo open-source (padrão)" msgid "Choose which kernels to use or leave blank for default \"{}\"" -msgstr "Escolhe quais kernels usar ou deixe em branco para o kernel padrão \"{}\"" +msgstr "Escolha quais kernels usar ou deixe em branco para o kernel padrão \"{}\"" msgid "Choose which locale language to use" msgstr "Escolha qual idioma de localização usar" @@ -249,7 +249,7 @@ msgid "You need to enter a valid fs-type in order to continue. See `man parted` msgstr "Você precisa definir um tipo de sistema de arquivo válido. Consulte o `man parted` para verificar os tipos de sistemas de arquivo válido." msgid "Error: Listing profiles on URL \"{}\" resulted in:" -msgstr "Erro: Listando os perfis em URL \"{}\" resulta em:" +msgstr "Erro: Listando os perfis em URL \"{}\" resultou em:" msgid "Error: Could not decode \"{}\" result as JSON:" msgstr "Erro: Não foi possível decodificar \"{}\" como JSON:" @@ -309,7 +309,7 @@ msgid "Automatic time sync (NTP)" msgstr "Sincronização automática de tempo (NTP)" msgid "Install ({} config(s) missing)" -msgstr "Instalar ({} configuração(s) em falta)" +msgstr "Instalar ({} a(s) configuração(ões) em falta)" msgid "" "You decided to skip harddrive selection\n" @@ -387,7 +387,7 @@ msgid "Enter disk encryption password (leave blank for no encryption): " msgstr "Digite a senha de encriptação do disco (deixe em branco para não encriptar): " msgid "Create a required super-user with sudo privileges: " -msgstr "Criar um superusuário requerido com privilégios de sudo: " +msgstr "Criar um superusuário necessário com privilégios de sudo: " msgid "Enter root password (leave blank to disable root): " msgstr "Digite uma senha de root (deixe em branco para desativar root): " @@ -446,7 +446,7 @@ msgid "Copy to new key:" msgstr "Copiar para nova chave:" msgid "Unknown nic type: {}. Possible values are {}" -msgstr "Tipo de NIC desconhecido: {}. Possíveis valores são {}" +msgstr "Tipo de NIC desconhecido: {}. Valores possíveis são {}" msgid "" "\n" @@ -456,7 +456,7 @@ msgstr "" "Esta é a configuração escolhida escolhida por você:" msgid "Pacman is already running, waiting maximum 10 minutes for it to terminate." -msgstr "O Pacman já está em execução, aguarde no máximo até 10 minutos para terminar." +msgstr "O Pacman já está em execução, esperando até o máximo de 10 minutos para terminar." msgid "Pre-existing pacman lock never exited. Please clean up any existing pacman sessions before using archinstall." msgstr "A trava pré-existente do Pacman não terminou. Por favor, limpe as sessões de pacman existentes antes de usar o archinstall." @@ -550,13 +550,13 @@ msgid "Missing configurations:\n" msgstr "Configurações em falta:\n" msgid "Either root-password or at least 1 superuser must be specified" -msgstr "Deve se especificar uma senha de root ou pelo menos 1 superusuário" +msgstr "Deve-se especificar uma senha de root ou pelo menos 1 superusuário" msgid "Manage superuser accounts: " msgstr "Administrar contas de superusuário: " msgid "Manage ordinary user accounts: " -msgstr "Administrar contas de usuário padrão: " +msgstr "Administrar contas de usuário comuns: " msgid " Subvolume :{:16}" msgstr " Subvolume :{:16}" @@ -743,7 +743,7 @@ msgid "Value: " msgstr "Valor: " msgid "You can skip selecting a drive and partitioning and use whatever drive-setup is mounted at /mnt (experimental)" -msgstr "Você pode ignorar a seleção de unidade e particionar seja lá o que estiver montado em /mnt (experimental)" +msgstr "Você pode ignorar a seleção de unidade e particionar o que já estiver montado em /mnt (experimental)" msgid "Select one of the disks or skip and use /mnt as default" msgstr "Selecione um dos discos ou ignore e use /mnt como padrão" @@ -833,8 +833,21 @@ msgstr "Entrada inválida! Tente novamente com uma entrada válida [1 para {max_ msgid "Parallel Downloads" msgstr "Downloads Paralelos" +msgid "Pacman" +msgstr "Pacman" + +msgid "Color" +msgstr "Cor" + +#, fuzzy, python-brace-format +msgid "Enter the number of parallel downloads (1-{})" +msgstr "Insira o número de downloads paralelos (1-{})" + +msgid "Enable colored output for pacman" +msgstr "Ative a saída colorida para o pacman" + msgid "ESC to skip" -msgstr "ESC para sair" +msgstr "ESC para pular" msgid "CTRL+C to reset" msgstr "CTRL+C para reiniciar" @@ -1674,6 +1687,139 @@ msgstr "Iniciar modo de busca" msgid "Exit search mode" msgstr "Sair do modo de busca" +msgid "General" +msgstr "Geral" + +#, fuzzy +msgid "Navigation" +msgstr "Salvar configuração" + +#, fuzzy +msgid "Selection" +msgstr "Selecionar regiões" + +msgid "Search" +msgstr "Buscar" + +msgid "Down" +msgstr "Abaixo" + +msgid "Up" +msgstr "Acima" + +#, fuzzy +msgid "Confirm" +msgstr "Confirmar" + +#, fuzzy +msgid "Focus right" +msgstr "Focar à direita" + +#, fuzzy +msgid "Focus left" +msgstr "Focar à esquerda" + +msgid "Toggle" +msgstr "Alternar" + +#, fuzzy +msgid "Show/Hide help" +msgstr "Mostrar/Esconder ajuda" + +msgid "Quit" +msgstr "Sair" + +msgid "First" +msgstr "Primeiro" + +msgid "Last" +msgstr "Último" + +#, fuzzy +msgid "Select" +msgstr "Selecionar" + +msgid "Page Up" +msgstr "Página acima" + +msgid "Page Down" +msgstr "Página abaixo" + +#, fuzzy +msgid "Page up" +msgstr "Página acima" + +#, fuzzy +msgid "Page down" +msgstr "Página abaixo" + +msgid "Page Left" +msgstr "Página à esquerda" + +#, fuzzy +msgid "Page Right" +msgstr "Página à direita" + +msgid "Cursor up" +msgstr "Cursor acima" + +#, fuzzy +msgid "Cursor down" +msgstr "Cursor abaixo" + +#, fuzzy +msgid "Cursor right" +msgstr "Cursor à direita" + +#, fuzzy +msgid "Cursor left" +msgstr "Cursor à esquerda" + +msgid "Top" +msgstr "Topo" + +msgid "Bottom" +msgstr "Rodapé" + +msgid "Home" +msgstr "Início" + +#, fuzzy +msgid "End" +msgstr "Final" + +#, fuzzy +msgid "Toggle option" +msgstr "Alternar opção" + +msgid "Scroll Up" +msgstr "Rolar visualização para cima" + +#, fuzzy +msgid "Scroll Down" +msgstr "Rolar visualização para baixo" + +msgid "Scroll Left" +msgstr "Rolar visualização para a esquerda" + +msgid "Scroll Right" +msgstr "Rolar visualização para a direita" + +msgid "Scroll Home" +msgstr "Rolar visualização até o começo" + +msgid "Scroll End" +msgstr "Rolar visualização até o final" + +msgid "Focus Next" +msgstr "Focar no próximo" + +msgid "Focus Previous" +msgstr "Focar no anterior" + +msgid "Copy selected text" +msgstr "Copiar o texto selecionado" + msgid "labwc needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)" msgstr "labwc precisa de acesso ao seu seat (conjunto de dispositivos de hardware, como teclado, mouse etc.)" @@ -1866,7 +2012,7 @@ msgid "Will install to custom location with NVRAM entry" msgstr "Será instalado em um local personalizado com entrada NVRAM" msgid "Firmware that does not properly support NVRAM boot entries like most MSI motherboards," -msgstr "Firmware que não oferece suporte adequado a entradas de boot na NVRAM," +msgstr "Firmware que não oferece suporte adequado a entradas de boot na NVRAM, como a maioria das placas-mãe MSI," msgid "most Apple Macs, many laptops..." msgstr "a maioria dos Macs da Apple, muitos laptops..." @@ -1875,7 +2021,7 @@ msgid "Language" msgstr "Idioma" msgid "Compression algorithm" -msgstr "Algorítimo de compressão" +msgstr "Algoritmo de compressão" msgid "Only packages such as base, sudo, linux, linux-firmware, efibootmgr and optional profile packages are installed." msgstr "Apenas pacotes como base, base-devel, linux, linux-firmware, efibootmgr e pacotes opcionais de perfil são instalados." @@ -1884,10 +2030,10 @@ msgid "Select zram compression algorithm:" msgstr "Selecione o algoritmo de compressão zram:" msgid "Use Network Manager (default backend)" -msgstr "Use o Network Manager (default backend)" +msgstr "Use o Network Manager (backend padrão)" msgid "Use Network Manager (iwd backend)" -msgstr "Use o Network Manager (iwd backend)" +msgstr "Use o Network Manager (backend com iwd)" msgid "Firewall" msgstr "Firewall" @@ -2002,5 +2148,60 @@ msgstr "Digite uma senha" msgid "The password did not match, please try again" msgstr "A senha não corresponde. Tente novamente" +msgid "Password strength: Weak" +msgstr "Nível de segurança da senha: Fraca" + +msgid "Password strength: Moderate" +msgstr "Nível de segurança da senha: Moderada" + +msgid "Password strength: Strong" +msgstr "Nível de segurança da senha: Forte" + +msgid "The selected desktop profile requires a regular user to log in via the greeter" +msgstr "O perfil de desktop selecionado requer um usuário regular para fazer o login pelo greeter" + +#, fuzzy, python-brace-format +msgid "Environment type: {} {}" +msgstr "Tipo de ambiente: {}" + +#, fuzzy +msgid "Input cannot be empty" +msgstr "Valor não pode estar vazio" + +msgid "Recommended" +msgstr "Recomendado" + +#, fuzzy +msgid "Package" +msgstr "Pacote" + +msgid "Curated selection of KDE Plasma packages" +msgstr "Coleção selecionada de pacotes do KDE Plasma" + +msgid "Dependencies" +msgstr "Dependências" + +#, fuzzy +msgid "Package group" +msgstr "Grupo de pacotes:" + +msgid "Extensive KDE Plasma installation" +msgstr "Instalação extensiva do KDE Plasma" + +#, fuzzy +msgid "Packages in group" +msgstr "Pacotes no grupo" + +msgid "Minimal KDE Plasma installation" +msgstr "Instalação mínima do KDE Plasma" + +#, fuzzy +msgid "Description" +msgstr "Descrição" + +#, fuzzy +msgid "Select a flavor of KDE Plasma to install" +msgstr "Selecione uma versão do KDE Plasma para instalar" + #~ msgid "When picking a directory to save configuration files to, by default we will ignore the following folders: " #~ msgstr "Ao selecionar um diretório para salvar arquivos de configuração, por padrão nós ignoramos as seguintes pastas: " From c1771cf6156f7ea36e63e74181fa244dbab79c59 Mon Sep 17 00:00:00 2001 From: tom <92334622+tom-jm69@users.noreply.github.com> Date: Tue, 14 Apr 2026 09:40:15 +0200 Subject: [PATCH 18/38] locale(german): extend and fix translation (#4421) * chore(locale): Fix and improve German translation strings * chore(locale): edit incorrect translations --- archinstall/locales/de/LC_MESSAGES/base.mo | Bin 56407 -> 66586 bytes archinstall/locales/de/LC_MESSAGES/base.po | 293 +++++++++++++++------ archinstall/locales/messages.mo | Bin 0 -> 66587 bytes 3 files changed, 213 insertions(+), 80 deletions(-) create mode 100644 archinstall/locales/messages.mo diff --git a/archinstall/locales/de/LC_MESSAGES/base.mo b/archinstall/locales/de/LC_MESSAGES/base.mo index 8aef1ad23a8ca6afe4ebbffbc14da954bc92ff14..5e3d2fc330e21c64dad25af8d6b303c3b02a5969 100644 GIT binary patch delta 21201 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 literal 0 HcmV?d00001 From 30f50d97192f93b2fb11cccfd56ff8d608218f1e Mon Sep 17 00:00:00 2001 From: codefiles <11915375+codefiles@users.noreply.github.com> Date: Tue, 14 Apr 2026 20:16:34 -0400 Subject: [PATCH 19/38] Revert pydantic update due to upstream bug (#4427) --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index b6cc22d5..2845458b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -19,7 +19,7 @@ classifiers = [ ] dependencies = [ "pyparted>=3.13.0", - "pydantic==2.13.0", + "pydantic==2.12.5", "cryptography>=45.0.7", "textual>=5.3.0", "markdown-it-py[linkify]>=4.0.0", From 8b3be842ca816868c9c5dc929a863f8c4193793b Mon Sep 17 00:00:00 2001 From: Anton Hvornum Date: Wed, 15 Apr 2026 20:47:13 +0200 Subject: [PATCH 20/38] Bumping version to: 4.2 (#4433) --- PKGBUILD | 2 +- archinstall/locales/ar/LC_MESSAGES/base.po | 192 ++++++++++++ archinstall/locales/ca/LC_MESSAGES/base.po | 189 +++++++++++ archinstall/locales/cs/LC_MESSAGES/base.po | 190 +++++++++++ archinstall/locales/de/LC_MESSAGES/base.po | 2 + archinstall/locales/el/LC_MESSAGES/base.po | 178 +++++++++++ archinstall/locales/en/LC_MESSAGES/base.po | 167 ++++++++++ archinstall/locales/es/LC_MESSAGES/base.mo | Bin 62694 -> 63147 bytes archinstall/locales/es/LC_MESSAGES/base.po | 189 +++++++++++ archinstall/locales/et/LC_MESSAGES/base.po | 178 +++++++++++ archinstall/locales/fi/LC_MESSAGES/base.po | 187 +++++++++++ archinstall/locales/fr/LC_MESSAGES/base.po | 192 ++++++++++++ archinstall/locales/ga/LC_MESSAGES/base.po | 178 +++++++++++ archinstall/locales/gl/LC_MESSAGES/base.po | 204 ++++++++++++ archinstall/locales/he/LC_MESSAGES/base.po | 179 +++++++++++ archinstall/locales/ku/LC_MESSAGES/base.po | 348 +++++++++++++++++++++ pyproject.toml | 2 +- 17 files changed, 2575 insertions(+), 2 deletions(-) diff --git a/PKGBUILD b/PKGBUILD index 3103386e..cdb00823 100644 --- a/PKGBUILD +++ b/PKGBUILD @@ -5,7 +5,7 @@ # Contributor: demostanis worlds pkgname=archinstall -pkgver=4.1 +pkgver=4.2 pkgrel=1 pkgdesc="Just another guided/automated Arch Linux installer with a twist" arch=(any) diff --git a/archinstall/locales/ar/LC_MESSAGES/base.po b/archinstall/locales/ar/LC_MESSAGES/base.po index 48380b73..1139e147 100644 --- a/archinstall/locales/ar/LC_MESSAGES/base.po +++ b/archinstall/locales/ar/LC_MESSAGES/base.po @@ -827,6 +827,22 @@ msgstr "إدخال غير صالح! حاول مرة أخرى بإدخال صال msgid "Parallel Downloads" msgstr "التنزيلات الموازية" +msgid "Pacman" +msgstr "" + +msgid "Color" +msgstr "" + +#, fuzzy, python-brace-format +msgid "Enter the number of parallel downloads (1-{})" +msgstr "" +"أدخل عدد التنزيلات المتوازية المراد تمكينها.\n" +"\n" +"ملاحظة:\n" + +msgid "Enable colored output for pacman" +msgstr "" + msgid "ESC to skip" msgstr "زر الهروب ESC للتخطي" @@ -1673,6 +1689,139 @@ msgstr "ابدأ وضع البحث" msgid "Exit search mode" msgstr "أنهي وضع البحث" +msgid "General" +msgstr "" + +#, fuzzy +msgid "Navigation" +msgstr "حفظ الإعدادات" + +#, fuzzy +msgid "Selection" +msgstr "اختر المناطق" + +msgid "Search" +msgstr "" + +msgid "Down" +msgstr "" + +msgid "Up" +msgstr "" + +#, fuzzy +msgid "Confirm" +msgstr "تأكيد وخروج" + +#, fuzzy +msgid "Focus right" +msgstr "تحرّك يمينًا" + +#, fuzzy +msgid "Focus left" +msgstr "تحرّك يسارًا" + +msgid "Toggle" +msgstr "" + +#, fuzzy +msgid "Show/Hide help" +msgstr "إظهار المساعدة" + +msgid "Quit" +msgstr "" + +msgid "First" +msgstr "" + +msgid "Last" +msgstr "" + +#, fuzzy +msgid "Select" +msgstr "اختر المناطق" + +msgid "Page Up" +msgstr "" + +msgid "Page Down" +msgstr "" + +#, fuzzy +msgid "Page up" +msgstr "مجموعة الحزم:" + +#, fuzzy +msgid "Page down" +msgstr "انزل لأسفل" + +msgid "Page Left" +msgstr "" + +#, fuzzy +msgid "Page Right" +msgstr "تحرّك يمينًا" + +msgid "Cursor up" +msgstr "" + +#, fuzzy +msgid "Cursor down" +msgstr "انزل لأسفل" + +#, fuzzy +msgid "Cursor right" +msgstr "تحرّك يمينًا" + +#, fuzzy +msgid "Cursor left" +msgstr "تحرّك يسارًا" + +msgid "Top" +msgstr "" + +msgid "Bottom" +msgstr "" + +msgid "Home" +msgstr "" + +#, fuzzy +msgid "End" +msgstr "مفعّل" + +#, fuzzy +msgid "Toggle option" +msgstr "خيارات وحدة التّخزين الفرعيّة" + +msgid "Scroll Up" +msgstr "" + +#, fuzzy +msgid "Scroll Down" +msgstr "مرّر المُعايَنة للأسفل" + +msgid "Scroll Left" +msgstr "" + +msgid "Scroll Right" +msgstr "" + +msgid "Scroll Home" +msgstr "" + +msgid "Scroll End" +msgstr "" + +msgid "Focus Next" +msgstr "" + +msgid "Focus Previous" +msgstr "" + +msgid "Copy selected text" +msgstr "" + msgid "labwc needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)" msgstr "يحتاج labwc للوصول إلى مقعدك (مجموعة أجهزة مثل لوحة المفاتيح، والفأرة وغيرها)" @@ -2016,3 +2165,46 @@ msgstr "قوة كلمة المرور: قوية" msgid "The selected desktop profile requires a regular user to log in via the greeter" msgstr "يتطلب ملفّ تعريف سطح المكتب المحدّد من المستخدم العادي تسجيل الدخول عبر لوحة الترحيب" + +#, fuzzy, python-brace-format +msgid "Environment type: {} {}" +msgstr "نوع البيئة: {}" + +#, fuzzy +msgid "Input cannot be empty" +msgstr "لا ينبغي أن تكون القيمة فارغة" + +msgid "Recommended" +msgstr "" + +#, fuzzy +msgid "Package" +msgstr "مجموعة الحزم:" + +msgid "Curated selection of KDE Plasma packages" +msgstr "" + +msgid "Dependencies" +msgstr "" + +#, fuzzy +msgid "Package group" +msgstr "مجموعة الحزم:" + +msgid "Extensive KDE Plasma installation" +msgstr "" + +#, fuzzy +msgid "Packages in group" +msgstr "مجموعة الحزم:" + +msgid "Minimal KDE Plasma installation" +msgstr "" + +#, fuzzy +msgid "Description" +msgstr "تشفير القرص " + +#, fuzzy +msgid "Select a flavor of KDE Plasma to install" +msgstr "اختر برنامج الإقلاع المُراد تثبيته" diff --git a/archinstall/locales/ca/LC_MESSAGES/base.po b/archinstall/locales/ca/LC_MESSAGES/base.po index 5e1fad97..c2513191 100644 --- a/archinstall/locales/ca/LC_MESSAGES/base.po +++ b/archinstall/locales/ca/LC_MESSAGES/base.po @@ -823,6 +823,19 @@ msgstr "Entrada no vàlida! Intenteu-ho novament amb una entrada vàlida [1 a {m msgid "Parallel Downloads" msgstr "Descàrregues paral·leles" +msgid "Pacman" +msgstr "" + +msgid "Color" +msgstr "" + +#, fuzzy, python-brace-format +msgid "Enter the number of parallel downloads (1-{})" +msgstr "Introduïu el número de descàrregues paral·leles permeses" + +msgid "Enable colored output for pacman" +msgstr "" + msgid "ESC to skip" msgstr "ESC per a ometre" @@ -1663,6 +1676,139 @@ msgstr "Iniciar el mode de cerca" msgid "Exit search mode" msgstr "Sortir del mode de cerca" +msgid "General" +msgstr "" + +#, fuzzy +msgid "Navigation" +msgstr "Guardar configuració" + +#, fuzzy +msgid "Selection" +msgstr "Seleccioneu regions" + +msgid "Search" +msgstr "" + +msgid "Down" +msgstr "" + +msgid "Up" +msgstr "" + +#, fuzzy +msgid "Confirm" +msgstr "Confirmar i sortir" + +#, fuzzy +msgid "Focus right" +msgstr "Mou a la dreta" + +#, fuzzy +msgid "Focus left" +msgstr "Mou a l'esquerra" + +msgid "Toggle" +msgstr "" + +#, fuzzy +msgid "Show/Hide help" +msgstr "Mostrar l'ajuda" + +msgid "Quit" +msgstr "" + +msgid "First" +msgstr "" + +msgid "Last" +msgstr "" + +#, fuzzy +msgid "Select" +msgstr "Seleccioneu regions" + +msgid "Page Up" +msgstr "" + +msgid "Page Down" +msgstr "" + +#, fuzzy +msgid "Page up" +msgstr "Group de paquets:" + +#, fuzzy +msgid "Page down" +msgstr "Mou avall" + +msgid "Page Left" +msgstr "" + +#, fuzzy +msgid "Page Right" +msgstr "Mou a la dreta" + +msgid "Cursor up" +msgstr "" + +#, fuzzy +msgid "Cursor down" +msgstr "Mou avall" + +#, fuzzy +msgid "Cursor right" +msgstr "Mou a la dreta" + +#, fuzzy +msgid "Cursor left" +msgstr "Mou a l'esquerra" + +msgid "Top" +msgstr "" + +msgid "Bottom" +msgstr "" + +msgid "Home" +msgstr "" + +#, fuzzy +msgid "End" +msgstr "Activat" + +#, fuzzy +msgid "Toggle option" +msgstr "Opcions del subvolum" + +msgid "Scroll Up" +msgstr "" + +#, fuzzy +msgid "Scroll Down" +msgstr "Previsualització avall" + +msgid "Scroll Left" +msgstr "" + +msgid "Scroll Right" +msgstr "" + +msgid "Scroll Home" +msgstr "" + +msgid "Scroll End" +msgstr "" + +msgid "Focus Next" +msgstr "" + +msgid "Focus Previous" +msgstr "" + +msgid "Copy selected text" +msgstr "" + msgid "labwc needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)" msgstr "labwc necessita accés al vostre seient (gestor de dispositius de maquinari, com ara teclat, ratolí, etc)" @@ -2002,3 +2148,46 @@ msgstr "Seguretat de la contrasenya: alta" msgid "The selected desktop profile requires a regular user to log in via the greeter" msgstr "El perfil d'escriptori seleccionat necessita de l'inici de sessió d'un usuari mitjançant el gestor" + +#, fuzzy, python-brace-format +msgid "Environment type: {} {}" +msgstr "Tipus d'entorn: {}" + +#, fuzzy +msgid "Input cannot be empty" +msgstr "El valor no pot ser buit" + +msgid "Recommended" +msgstr "" + +#, fuzzy +msgid "Package" +msgstr "Group de paquets:" + +msgid "Curated selection of KDE Plasma packages" +msgstr "" + +msgid "Dependencies" +msgstr "" + +#, fuzzy +msgid "Package group" +msgstr "Group de paquets:" + +msgid "Extensive KDE Plasma installation" +msgstr "" + +#, fuzzy +msgid "Packages in group" +msgstr "Group de paquets:" + +msgid "Minimal KDE Plasma installation" +msgstr "" + +#, fuzzy +msgid "Description" +msgstr "Xifrat de disc" + +#, fuzzy +msgid "Select a flavor of KDE Plasma to install" +msgstr "Selecció del bootloader a instal·lar" diff --git a/archinstall/locales/cs/LC_MESSAGES/base.po b/archinstall/locales/cs/LC_MESSAGES/base.po index ce33aff2..2816bfba 100644 --- a/archinstall/locales/cs/LC_MESSAGES/base.po +++ b/archinstall/locales/cs/LC_MESSAGES/base.po @@ -815,6 +815,19 @@ msgstr "Neplatný vstup! Zkuste to, prosím, znovu s platným vstupem [1 až {ma msgid "Parallel Downloads" msgstr "Paralelní stahování" +msgid "Pacman" +msgstr "" + +msgid "Color" +msgstr "" + +#, fuzzy, python-brace-format +msgid "Enter the number of parallel downloads (1-{})" +msgstr "Zadejte povolený počet paralelních stahování, která mají být povolena" + +msgid "Enable colored output for pacman" +msgstr "" + msgid "ESC to skip" msgstr "Pomocí ESC přeskočíte" @@ -1655,6 +1668,139 @@ msgstr "Spustit režim vyhledávání" msgid "Exit search mode" msgstr "Opustit režim vyhledávání" +msgid "General" +msgstr "" + +#, fuzzy +msgid "Navigation" +msgstr "Uložit konfiguraci" + +#, fuzzy +msgid "Selection" +msgstr "Zvolte regiony" + +msgid "Search" +msgstr "" + +msgid "Down" +msgstr "" + +msgid "Up" +msgstr "" + +#, fuzzy +msgid "Confirm" +msgstr "Potvrdit a ukončit" + +#, fuzzy +msgid "Focus right" +msgstr "Posunout doprava" + +#, fuzzy +msgid "Focus left" +msgstr "Posunout doleva" + +msgid "Toggle" +msgstr "" + +#, fuzzy +msgid "Show/Hide help" +msgstr "Zobrazit nápovědu" + +msgid "Quit" +msgstr "" + +msgid "First" +msgstr "" + +msgid "Last" +msgstr "" + +#, fuzzy +msgid "Select" +msgstr "Zvolte regiony" + +msgid "Page Up" +msgstr "" + +msgid "Page Down" +msgstr "" + +#, fuzzy +msgid "Page up" +msgstr "Skupina balíčků:" + +#, fuzzy +msgid "Page down" +msgstr "Posunout dolů" + +msgid "Page Left" +msgstr "" + +#, fuzzy +msgid "Page Right" +msgstr "Posunout doprava" + +msgid "Cursor up" +msgstr "" + +#, fuzzy +msgid "Cursor down" +msgstr "Posunout dolů" + +#, fuzzy +msgid "Cursor right" +msgstr "Posunout doprava" + +#, fuzzy +msgid "Cursor left" +msgstr "Posunout doleva" + +msgid "Top" +msgstr "" + +msgid "Bottom" +msgstr "" + +msgid "Home" +msgstr "" + +#, fuzzy +msgid "End" +msgstr "Povoleno" + +#, fuzzy +msgid "Toggle option" +msgstr "Přepínače podsvazku" + +msgid "Scroll Up" +msgstr "" + +#, fuzzy +msgid "Scroll Down" +msgstr "Posunout náhled dolů" + +msgid "Scroll Left" +msgstr "" + +msgid "Scroll Right" +msgstr "" + +msgid "Scroll Home" +msgstr "" + +msgid "Scroll End" +msgstr "" + +msgid "Focus Next" +msgstr "" + +msgid "Focus Previous" +msgstr "" + +msgid "Copy selected text" +msgstr "" + msgid "labwc needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)" msgstr "labwc vyžaduje přístup k vašemu sezení (soubor zařízení jako např. klávesnice, myš, atd.)" @@ -1900,6 +2046,7 @@ msgstr "Zvolte disky pro instalaci" msgid "Enter a mountpoint" msgstr "Zadejte přípojný bod" +#, python-brace-format msgid "Enter a size (default: {}): " msgstr "Zadejte velikost (výchozí: {}): " @@ -1994,3 +2141,46 @@ msgstr "Síla hesla: Silné" msgid "The selected desktop profile requires a regular user to log in via the greeter" msgstr "Zvolený profil plochy vyžaduje, aby se normální uživatel přihlásil prostřednictvím přihlašovací obrazovky" + +#, fuzzy, python-brace-format +msgid "Environment type: {} {}" +msgstr "Typ prostředí: {}" + +#, fuzzy +msgid "Input cannot be empty" +msgstr "Hodnota nesmí být prázdná" + +msgid "Recommended" +msgstr "" + +#, fuzzy +msgid "Package" +msgstr "Skupina balíčků:" + +msgid "Curated selection of KDE Plasma packages" +msgstr "" + +msgid "Dependencies" +msgstr "" + +#, fuzzy +msgid "Package group" +msgstr "Skupina balíčků:" + +msgid "Extensive KDE Plasma installation" +msgstr "" + +#, fuzzy +msgid "Packages in group" +msgstr "Skupina balíčků:" + +msgid "Minimal KDE Plasma installation" +msgstr "" + +#, fuzzy +msgid "Description" +msgstr "Šifrování disku" + +#, fuzzy +msgid "Select a flavor of KDE Plasma to install" +msgstr "Zvolte zavaděč k instalaci" diff --git a/archinstall/locales/de/LC_MESSAGES/base.po b/archinstall/locales/de/LC_MESSAGES/base.po index 15358594..48795bd2 100644 --- a/archinstall/locales/de/LC_MESSAGES/base.po +++ b/archinstall/locales/de/LC_MESSAGES/base.po @@ -2040,6 +2040,7 @@ msgstr "Festplatten für die Installation auswählen" msgid "Enter a mountpoint" msgstr "Wählen Sie einen Einhängeort aus:" +#, python-brace-format msgid "Enter a size (default: {}): " msgstr "Größe eingeben (Standard: {}): " @@ -2134,6 +2135,7 @@ msgstr "Passwortstärke: Stark" msgid "The selected desktop profile requires a regular user to log in via the greeter" msgstr "Das ausgewählte Desktop-Profil erfordert einen regulären Benutzer zur Anmeldung über den Greeter" +#, python-brace-format msgid "Environment type: {} {}" msgstr "Umgebungstyp: {} {}" diff --git a/archinstall/locales/el/LC_MESSAGES/base.po b/archinstall/locales/el/LC_MESSAGES/base.po index 98de4446..6b76b7cb 100644 --- a/archinstall/locales/el/LC_MESSAGES/base.po +++ b/archinstall/locales/el/LC_MESSAGES/base.po @@ -823,6 +823,22 @@ msgstr "Μη έγκυρη είσοδος! Προσπαθήστε ξανά με msgid "Parallel Downloads" msgstr "Παράλληλες Λήψεις" +msgid "Pacman" +msgstr "" + +msgid "Color" +msgstr "" + +#, fuzzy, python-brace-format +msgid "Enter the number of parallel downloads (1-{})" +msgstr "" +"Εισάγετε τον αριθμό των παράλληλων λήψεων προς ενεργοποίηση.\n" +" (Εισάγετε μία τιμή από 1 μέχρι {})\n" +"Σημείωση:" + +msgid "Enable colored output for pacman" +msgstr "" + #, fuzzy msgid "ESC to skip" msgstr "Χρησιμοποιήστε ESC για παράλειψη" @@ -1791,6 +1807,128 @@ msgstr "" msgid "Exit search mode" msgstr "" +msgid "General" +msgstr "" + +#, fuzzy +msgid "Navigation" +msgstr "Αποθήκευση διαμόρφωσης" + +#, fuzzy +msgid "Selection" +msgstr "Επιλέξτε διεπαφή προς προσθήκη" + +msgid "Search" +msgstr "" + +msgid "Down" +msgstr "" + +msgid "Up" +msgstr "" + +#, fuzzy +msgid "Confirm" +msgstr "Επιβεβαίωση και έξοδος" + +msgid "Focus right" +msgstr "" + +msgid "Focus left" +msgstr "" + +msgid "Toggle" +msgstr "" + +msgid "Show/Hide help" +msgstr "" + +msgid "Quit" +msgstr "" + +msgid "First" +msgstr "" + +msgid "Last" +msgstr "" + +#, fuzzy +msgid "Select" +msgstr "Επιλέξτε διεπαφή προς προσθήκη" + +msgid "Page Up" +msgstr "" + +msgid "Page Down" +msgstr "" + +msgid "Page up" +msgstr "" + +msgid "Page down" +msgstr "" + +msgid "Page Left" +msgstr "" + +msgid "Page Right" +msgstr "" + +msgid "Cursor up" +msgstr "" + +msgid "Cursor down" +msgstr "" + +msgid "Cursor right" +msgstr "" + +msgid "Cursor left" +msgstr "" + +msgid "Top" +msgstr "" + +msgid "Bottom" +msgstr "" + +msgid "Home" +msgstr "" + +msgid "End" +msgstr "" + +#, fuzzy +msgid "Toggle option" +msgstr "Επιλογές υποόγκου" + +msgid "Scroll Up" +msgstr "" + +msgid "Scroll Down" +msgstr "" + +msgid "Scroll Left" +msgstr "" + +msgid "Scroll Right" +msgstr "" + +msgid "Scroll Home" +msgstr "" + +msgid "Scroll End" +msgstr "" + +msgid "Focus Next" +msgstr "" + +msgid "Focus Previous" +msgstr "" + +msgid "Copy selected text" +msgstr "" + msgid "labwc needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)" msgstr "" @@ -2192,3 +2330,43 @@ msgstr "" msgid "The selected desktop profile requires a regular user to log in via the greeter" msgstr "" + +#, fuzzy, python-brace-format +msgid "Environment type: {} {}" +msgstr "Καμία διαμόρφωση" + +msgid "Input cannot be empty" +msgstr "" + +msgid "Recommended" +msgstr "" + +msgid "Package" +msgstr "" + +msgid "Curated selection of KDE Plasma packages" +msgstr "" + +msgid "Dependencies" +msgstr "" + +#, fuzzy +msgid "Package group" +msgstr "Διαμορφωμένες {} διεπαφές" + +msgid "Extensive KDE Plasma installation" +msgstr "" + +msgid "Packages in group" +msgstr "" + +msgid "Minimal KDE Plasma installation" +msgstr "" + +#, fuzzy +msgid "Description" +msgstr "Κρυπτογράφηση δίσκου" + +#, fuzzy +msgid "Select a flavor of KDE Plasma to install" +msgstr "Επιλέξτε ποιες διαμερίσεις να κρυπτογραφηθούν." diff --git a/archinstall/locales/en/LC_MESSAGES/base.po b/archinstall/locales/en/LC_MESSAGES/base.po index d430dbbd..79489d88 100644 --- a/archinstall/locales/en/LC_MESSAGES/base.po +++ b/archinstall/locales/en/LC_MESSAGES/base.po @@ -774,6 +774,19 @@ msgstr "" msgid "Parallel Downloads" msgstr "" +msgid "Pacman" +msgstr "" + +msgid "Color" +msgstr "" + +#, python-brace-format +msgid "Enter the number of parallel downloads (1-{})" +msgstr "" + +msgid "Enable colored output for pacman" +msgstr "" + msgid "ESC to skip" msgstr "" @@ -1598,6 +1611,123 @@ msgstr "" msgid "Exit search mode" msgstr "" +msgid "General" +msgstr "" + +msgid "Navigation" +msgstr "" + +msgid "Selection" +msgstr "" + +msgid "Search" +msgstr "" + +msgid "Down" +msgstr "" + +msgid "Up" +msgstr "" + +msgid "Confirm" +msgstr "" + +msgid "Focus right" +msgstr "" + +msgid "Focus left" +msgstr "" + +msgid "Toggle" +msgstr "" + +msgid "Show/Hide help" +msgstr "" + +msgid "Quit" +msgstr "" + +msgid "First" +msgstr "" + +msgid "Last" +msgstr "" + +msgid "Select" +msgstr "" + +msgid "Page Up" +msgstr "" + +msgid "Page Down" +msgstr "" + +msgid "Page up" +msgstr "" + +msgid "Page down" +msgstr "" + +msgid "Page Left" +msgstr "" + +msgid "Page Right" +msgstr "" + +msgid "Cursor up" +msgstr "" + +msgid "Cursor down" +msgstr "" + +msgid "Cursor right" +msgstr "" + +msgid "Cursor left" +msgstr "" + +msgid "Top" +msgstr "" + +msgid "Bottom" +msgstr "" + +msgid "Home" +msgstr "" + +msgid "End" +msgstr "" + +msgid "Toggle option" +msgstr "" + +msgid "Scroll Up" +msgstr "" + +msgid "Scroll Down" +msgstr "" + +msgid "Scroll Left" +msgstr "" + +msgid "Scroll Right" +msgstr "" + +msgid "Scroll Home" +msgstr "" + +msgid "Scroll End" +msgstr "" + +msgid "Focus Next" +msgstr "" + +msgid "Focus Previous" +msgstr "" + +msgid "Copy selected text" +msgstr "" + msgid "labwc needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)" msgstr "" @@ -1937,3 +2067,40 @@ msgstr "" msgid "The selected desktop profile requires a regular user to log in via the greeter" msgstr "" + +#, python-brace-format +msgid "Environment type: {} {}" +msgstr "" + +msgid "Input cannot be empty" +msgstr "" + +msgid "Recommended" +msgstr "" + +msgid "Package" +msgstr "" + +msgid "Curated selection of KDE Plasma packages" +msgstr "" + +msgid "Dependencies" +msgstr "" + +msgid "Package group" +msgstr "" + +msgid "Extensive KDE Plasma installation" +msgstr "" + +msgid "Packages in group" +msgstr "" + +msgid "Minimal KDE Plasma installation" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "Select a flavor of KDE Plasma to install" +msgstr "" diff --git a/archinstall/locales/es/LC_MESSAGES/base.mo b/archinstall/locales/es/LC_MESSAGES/base.mo index 7b3df0b11649d27e0f4025abb65099e3793c4f4b..3c3993f7ee87559f7726ebb709f40d6dd7842c61 100644 GIT binary patch delta 12765 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 diff --git a/archinstall/locales/es/LC_MESSAGES/base.po b/archinstall/locales/es/LC_MESSAGES/base.po index 9c57554f..1a1a0d5f 100644 --- a/archinstall/locales/es/LC_MESSAGES/base.po +++ b/archinstall/locales/es/LC_MESSAGES/base.po @@ -826,6 +826,19 @@ msgstr "¡Entrada no válida! Intente nuevamente con una entrada válida [1 a {m msgid "Parallel Downloads" msgstr "Descargas paralelas" +msgid "Pacman" +msgstr "" + +msgid "Color" +msgstr "" + +#, fuzzy, python-brace-format +msgid "Enter the number of parallel downloads (1-{})" +msgstr "Ingrese el número de descargas paralelas que desea habilitar" + +msgid "Enable colored output for pacman" +msgstr "" + msgid "ESC to skip" msgstr "ESC para omitir" @@ -1667,6 +1680,139 @@ msgstr "Iniciar modo de búsqueda" msgid "Exit search mode" msgstr "Salir del modo de búsqueda" +msgid "General" +msgstr "" + +#, fuzzy +msgid "Navigation" +msgstr "Guardar configuración" + +#, fuzzy +msgid "Selection" +msgstr "Seleccione regiones" + +msgid "Search" +msgstr "" + +msgid "Down" +msgstr "" + +msgid "Up" +msgstr "" + +#, fuzzy +msgid "Confirm" +msgstr "Confirmar y salir" + +#, fuzzy +msgid "Focus right" +msgstr "Mover a la derecha" + +#, fuzzy +msgid "Focus left" +msgstr "Mover a la izquierda" + +msgid "Toggle" +msgstr "" + +#, fuzzy +msgid "Show/Hide help" +msgstr "Mostrar ayuda" + +msgid "Quit" +msgstr "" + +msgid "First" +msgstr "" + +msgid "Last" +msgstr "" + +#, fuzzy +msgid "Select" +msgstr "Seleccione regiones" + +msgid "Page Up" +msgstr "" + +msgid "Page Down" +msgstr "" + +#, fuzzy +msgid "Page up" +msgstr "Grupo de paquetes:" + +#, fuzzy +msgid "Page down" +msgstr "Bajar" + +msgid "Page Left" +msgstr "" + +#, fuzzy +msgid "Page Right" +msgstr "Mover a la derecha" + +msgid "Cursor up" +msgstr "" + +#, fuzzy +msgid "Cursor down" +msgstr "Bajar" + +#, fuzzy +msgid "Cursor right" +msgstr "Mover a la derecha" + +#, fuzzy +msgid "Cursor left" +msgstr "Mover a la izquierda" + +msgid "Top" +msgstr "" + +msgid "Bottom" +msgstr "" + +msgid "Home" +msgstr "" + +#, fuzzy +msgid "End" +msgstr "Habilitado" + +#, fuzzy +msgid "Toggle option" +msgstr "Opciones del subvolumen" + +msgid "Scroll Up" +msgstr "" + +#, fuzzy +msgid "Scroll Down" +msgstr "Bajar en vista previa" + +msgid "Scroll Left" +msgstr "" + +msgid "Scroll Right" +msgstr "" + +msgid "Scroll Home" +msgstr "" + +msgid "Scroll End" +msgstr "" + +msgid "Focus Next" +msgstr "" + +msgid "Focus Previous" +msgstr "" + +msgid "Copy selected text" +msgstr "" + msgid "labwc needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)" msgstr "labwc necesita acceso a su asiento (colección de dispositivos de hardware, es decir, teclado, ratón, etc.)" @@ -2007,6 +2153,49 @@ msgstr "Seguridad de la contraseña: Fuerte" msgid "The selected desktop profile requires a regular user to log in via the greeter" msgstr "El perfil de escritorio seleccionado requiere que un usuario estándar inicie sesión a través de la pantalla de bienvenida" +#, fuzzy, python-brace-format +msgid "Environment type: {} {}" +msgstr "Tipo de entorno: {}" + +#, fuzzy +msgid "Input cannot be empty" +msgstr "El valor no puede estár vacío" + +msgid "Recommended" +msgstr "" + +#, fuzzy +msgid "Package" +msgstr "Grupo de paquetes:" + +msgid "Curated selection of KDE Plasma packages" +msgstr "" + +msgid "Dependencies" +msgstr "" + +#, fuzzy +msgid "Package group" +msgstr "Grupo de paquetes:" + +msgid "Extensive KDE Plasma installation" +msgstr "" + +#, fuzzy +msgid "Packages in group" +msgstr "Grupo de paquetes:" + +msgid "Minimal KDE Plasma installation" +msgstr "" + +#, fuzzy +msgid "Description" +msgstr "Cifrado de disco" + +#, fuzzy +msgid "Select a flavor of KDE Plasma to install" +msgstr "Seleccione el gestor de arranque que desea instalar" + #~ msgid "Add :" #~ msgstr "Añadir :" diff --git a/archinstall/locales/et/LC_MESSAGES/base.po b/archinstall/locales/et/LC_MESSAGES/base.po index 9732feea..4807b949 100644 --- a/archinstall/locales/et/LC_MESSAGES/base.po +++ b/archinstall/locales/et/LC_MESSAGES/base.po @@ -838,6 +838,22 @@ msgstr "Vale sisestus! Proovige uuesti kehtiva sisendiga [1 {max_downloads} või msgid "Parallel Downloads" msgstr "Paralleelsed allalaadimised" +msgid "Pacman" +msgstr "" + +msgid "Color" +msgstr "" + +#, fuzzy, python-brace-format +msgid "Enter the number of parallel downloads (1-{})" +msgstr "" +"Sisestage lubatavate paralleelsete allalaadimiste arv.\n" +" (Sisestage väärtus vahemikus 1 kuni {max_downloads})\n" +"note:" + +msgid "Enable colored output for pacman" +msgstr "" + msgid "ESC to skip" msgstr "ESC vahelejätmiseks" @@ -1774,6 +1790,128 @@ msgstr "" msgid "Exit search mode" msgstr "" +msgid "General" +msgstr "" + +#, fuzzy +msgid "Navigation" +msgstr "Salvesta konfiguratsioon" + +#, fuzzy +msgid "Selection" +msgstr "Valige allkirja valik" + +msgid "Search" +msgstr "" + +msgid "Down" +msgstr "" + +msgid "Up" +msgstr "" + +#, fuzzy +msgid "Confirm" +msgstr "Kinnita ja lahku" + +msgid "Focus right" +msgstr "" + +msgid "Focus left" +msgstr "" + +msgid "Toggle" +msgstr "" + +msgid "Show/Hide help" +msgstr "" + +msgid "Quit" +msgstr "" + +msgid "First" +msgstr "" + +msgid "Last" +msgstr "" + +#, fuzzy +msgid "Select" +msgstr "Valige allkirja valik" + +msgid "Page Up" +msgstr "" + +msgid "Page Down" +msgstr "" + +msgid "Page up" +msgstr "" + +msgid "Page down" +msgstr "" + +msgid "Page Left" +msgstr "" + +msgid "Page Right" +msgstr "" + +msgid "Cursor up" +msgstr "" + +msgid "Cursor down" +msgstr "" + +msgid "Cursor right" +msgstr "" + +msgid "Cursor left" +msgstr "" + +msgid "Top" +msgstr "" + +msgid "Bottom" +msgstr "" + +msgid "Home" +msgstr "" + +msgid "End" +msgstr "" + +#, fuzzy +msgid "Toggle option" +msgstr "Alamhulga valikud" + +msgid "Scroll Up" +msgstr "" + +msgid "Scroll Down" +msgstr "" + +msgid "Scroll Left" +msgstr "" + +msgid "Scroll Right" +msgstr "" + +msgid "Scroll Home" +msgstr "" + +msgid "Scroll End" +msgstr "" + +msgid "Focus Next" +msgstr "" + +msgid "Focus Previous" +msgstr "" + +msgid "Copy selected text" +msgstr "" + #, fuzzy msgid "labwc needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)" msgstr "Sway vajab juurdepääsu teie seatile (riistvaraseadmete kogum, st klaviatuur, hiir jne." @@ -2180,3 +2318,43 @@ msgstr "" msgid "The selected desktop profile requires a regular user to log in via the greeter" msgstr "" + +#, fuzzy, python-brace-format +msgid "Environment type: {} {}" +msgstr "Keskkonna tüüp: {}" + +msgid "Input cannot be empty" +msgstr "" + +msgid "Recommended" +msgstr "" + +msgid "Package" +msgstr "" + +msgid "Curated selection of KDE Plasma packages" +msgstr "" + +msgid "Dependencies" +msgstr "" + +#, fuzzy +msgid "Package group" +msgstr "Konfigureeritud {} liidesed" + +msgid "Extensive KDE Plasma installation" +msgstr "" + +msgid "Packages in group" +msgstr "" + +msgid "Minimal KDE Plasma installation" +msgstr "" + +#, fuzzy +msgid "Description" +msgstr "Ketta krüpteerimine" + +#, fuzzy +msgid "Select a flavor of KDE Plasma to install" +msgstr "Palun valige millist tervitajat installida" diff --git a/archinstall/locales/fi/LC_MESSAGES/base.po b/archinstall/locales/fi/LC_MESSAGES/base.po index 8f97a983..0dbc443f 100644 --- a/archinstall/locales/fi/LC_MESSAGES/base.po +++ b/archinstall/locales/fi/LC_MESSAGES/base.po @@ -824,6 +824,22 @@ msgstr "Virheellinen arvo! Yritä uudelleen kelvollisella arvolla [1 - {max_down msgid "Parallel Downloads" msgstr "Rinnakkaiset lataukset" +msgid "Pacman" +msgstr "" + +msgid "Color" +msgstr "" + +#, fuzzy, python-brace-format +msgid "Enter the number of parallel downloads (1-{})" +msgstr "" +"Anna rinnakkaisten latausten määrä.\n" +"\n" +"Huomaa:\n" + +msgid "Enable colored output for pacman" +msgstr "" + msgid "ESC to skip" msgstr "Ohita painamalla ESC" @@ -1744,6 +1760,137 @@ msgstr "" msgid "Exit search mode" msgstr "" +msgid "General" +msgstr "" + +#, fuzzy +msgid "Navigation" +msgstr "Tallenna määritykset" + +#, fuzzy +msgid "Selection" +msgstr "Valitse allekirjoituksen asetus" + +msgid "Search" +msgstr "" + +msgid "Down" +msgstr "" + +msgid "Up" +msgstr "" + +#, fuzzy +msgid "Confirm" +msgstr "Vahvista ja poistu" + +#, fuzzy +msgid "Focus right" +msgstr "Liiku oikealle" + +#, fuzzy +msgid "Focus left" +msgstr "Liiku vasemmalle" + +msgid "Toggle" +msgstr "" + +#, fuzzy +msgid "Show/Hide help" +msgstr "Näytä apua" + +msgid "Quit" +msgstr "" + +msgid "First" +msgstr "" + +msgid "Last" +msgstr "" + +#, fuzzy +msgid "Select" +msgstr "Valitse allekirjoituksen asetus" + +msgid "Page Up" +msgstr "" + +msgid "Page Down" +msgstr "" + +msgid "Page up" +msgstr "" + +#, fuzzy +msgid "Page down" +msgstr "Liikku alas" + +msgid "Page Left" +msgstr "" + +#, fuzzy +msgid "Page Right" +msgstr "Liiku oikealle" + +msgid "Cursor up" +msgstr "" + +#, fuzzy +msgid "Cursor down" +msgstr "Liikku alas" + +#, fuzzy +msgid "Cursor right" +msgstr "Liiku oikealle" + +#, fuzzy +msgid "Cursor left" +msgstr "Liiku vasemmalle" + +msgid "Top" +msgstr "" + +msgid "Bottom" +msgstr "" + +msgid "Home" +msgstr "" + +#, fuzzy +msgid "End" +msgstr "Käytössä" + +#, fuzzy +msgid "Toggle option" +msgstr "Alitaltion valinnat" + +msgid "Scroll Up" +msgstr "" + +msgid "Scroll Down" +msgstr "" + +msgid "Scroll Left" +msgstr "" + +msgid "Scroll Right" +msgstr "" + +msgid "Scroll Home" +msgstr "" + +msgid "Scroll End" +msgstr "" + +msgid "Focus Next" +msgstr "" + +msgid "Focus Previous" +msgstr "" + +msgid "Copy selected text" +msgstr "" + #, fuzzy msgid "labwc needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)" msgstr "Sway tarvitsee pääsyn istuntoon (kokoelma laitteistoja, kuten näppäimistö, hiiri jne.)" @@ -2150,3 +2297,43 @@ msgstr "" msgid "The selected desktop profile requires a regular user to log in via the greeter" msgstr "" + +#, fuzzy, python-brace-format +msgid "Environment type: {} {}" +msgstr "Ympäristötyyppi: {}" + +msgid "Input cannot be empty" +msgstr "" + +msgid "Recommended" +msgstr "" + +msgid "Package" +msgstr "" + +msgid "Curated selection of KDE Plasma packages" +msgstr "" + +msgid "Dependencies" +msgstr "" + +#, fuzzy +msgid "Package group" +msgstr "Määritetty {} liittymää" + +msgid "Extensive KDE Plasma installation" +msgstr "" + +msgid "Packages in group" +msgstr "" + +msgid "Minimal KDE Plasma installation" +msgstr "" + +#, fuzzy +msgid "Description" +msgstr "Levyn salaus" + +#, fuzzy +msgid "Select a flavor of KDE Plasma to install" +msgstr "Valitse asennettava käyttöliittymä" diff --git a/archinstall/locales/fr/LC_MESSAGES/base.po b/archinstall/locales/fr/LC_MESSAGES/base.po index 6a1a7eed..71335dac 100644 --- a/archinstall/locales/fr/LC_MESSAGES/base.po +++ b/archinstall/locales/fr/LC_MESSAGES/base.po @@ -823,6 +823,22 @@ msgstr "Entrée invalide ! Réessayer avec une entrée valide [1 pour {max_downl msgid "Parallel Downloads" msgstr "Téléchargements parallèles" +msgid "Pacman" +msgstr "" + +msgid "Color" +msgstr "" + +#, fuzzy, python-brace-format +msgid "Enter the number of parallel downloads (1-{})" +msgstr "" +"Saisir le nombre de téléchargements parallèles à activer.\n" +"\n" +"Note :\n" + +msgid "Enable colored output for pacman" +msgstr "" + msgid "ESC to skip" msgstr "ESC pour ignorer" @@ -1663,6 +1679,139 @@ msgstr "Démarrer le mode de recherche" msgid "Exit search mode" msgstr "Quitter le mode de recherche" +msgid "General" +msgstr "" + +#, fuzzy +msgid "Navigation" +msgstr "Enregistrer la configuration" + +#, fuzzy +msgid "Selection" +msgstr "Sélectionner des régions" + +msgid "Search" +msgstr "" + +msgid "Down" +msgstr "" + +msgid "Up" +msgstr "" + +#, fuzzy +msgid "Confirm" +msgstr "Confirmer et quitter" + +#, fuzzy +msgid "Focus right" +msgstr "Déplacer vers la droite" + +#, fuzzy +msgid "Focus left" +msgstr "Déplacer vers la gauche" + +msgid "Toggle" +msgstr "" + +#, fuzzy +msgid "Show/Hide help" +msgstr "Afficher de l'aide" + +msgid "Quit" +msgstr "" + +msgid "First" +msgstr "" + +msgid "Last" +msgstr "" + +#, fuzzy +msgid "Select" +msgstr "Sélectionner des régions" + +msgid "Page Up" +msgstr "" + +msgid "Page Down" +msgstr "" + +#, fuzzy +msgid "Page up" +msgstr "Groupe de paquets :" + +#, fuzzy +msgid "Page down" +msgstr "Déplacer vers le bas" + +msgid "Page Left" +msgstr "" + +#, fuzzy +msgid "Page Right" +msgstr "Déplacer vers la droite" + +msgid "Cursor up" +msgstr "" + +#, fuzzy +msgid "Cursor down" +msgstr "Déplacer vers le bas" + +#, fuzzy +msgid "Cursor right" +msgstr "Déplacer vers la droite" + +#, fuzzy +msgid "Cursor left" +msgstr "Déplacer vers la gauche" + +msgid "Top" +msgstr "" + +msgid "Bottom" +msgstr "" + +msgid "Home" +msgstr "" + +#, fuzzy +msgid "End" +msgstr "Activé" + +#, fuzzy +msgid "Toggle option" +msgstr "Options de sous-volume" + +msgid "Scroll Up" +msgstr "" + +#, fuzzy +msgid "Scroll Down" +msgstr "Faire défiler l’aperçu vers le bas" + +msgid "Scroll Left" +msgstr "" + +msgid "Scroll Right" +msgstr "" + +msgid "Scroll Home" +msgstr "" + +msgid "Scroll End" +msgstr "" + +msgid "Focus Next" +msgstr "" + +msgid "Focus Previous" +msgstr "" + +msgid "Copy selected text" +msgstr "" + msgid "labwc needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)" msgstr "labwc a besoin d’accéder à votre siège (ensemble d’appareils matériels, c’est-à-dire clavier, souris, etc.)" @@ -2060,6 +2209,49 @@ msgstr "" msgid "The selected desktop profile requires a regular user to log in via the greeter" msgstr "" +#, fuzzy, python-brace-format +msgid "Environment type: {} {}" +msgstr "Type d'environnement : {}" + +#, fuzzy +msgid "Input cannot be empty" +msgstr "La valeur ne peut pas être vide" + +msgid "Recommended" +msgstr "" + +#, fuzzy +msgid "Package" +msgstr "Groupe de paquets :" + +msgid "Curated selection of KDE Plasma packages" +msgstr "" + +msgid "Dependencies" +msgstr "" + +#, fuzzy +msgid "Package group" +msgstr "Groupe de paquets :" + +msgid "Extensive KDE Plasma installation" +msgstr "" + +#, fuzzy +msgid "Packages in group" +msgstr "Groupe de paquets :" + +msgid "Minimal KDE Plasma installation" +msgstr "" + +#, fuzzy +msgid "Description" +msgstr "Chiffrement du disque" + +#, fuzzy +msgid "Select a flavor of KDE Plasma to install" +msgstr "Veuillez choisir le greeter (interface de connexion) à installer" + #, python-brace-format #~ msgid "Edit {origkey} :" #~ msgstr "Modifier {origkey} :" diff --git a/archinstall/locales/ga/LC_MESSAGES/base.po b/archinstall/locales/ga/LC_MESSAGES/base.po index a1a77de1..fd9bacfd 100644 --- a/archinstall/locales/ga/LC_MESSAGES/base.po +++ b/archinstall/locales/ga/LC_MESSAGES/base.po @@ -823,6 +823,22 @@ msgstr "Ionchur neamhbhailí! Bain triail eile as le hionchur bailí [1 go {max_ msgid "Parallel Downloads" msgstr "Comhuaineach íosluchtuithe" +msgid "Pacman" +msgstr "" + +msgid "Color" +msgstr "" + +#, fuzzy, python-brace-format +msgid "Enter the number of parallel downloads (1-{})" +msgstr "" +"Cuir isteach líon na n-íoslódálacha comhthreomhara atá le cumasú.\n" +"\n" +"Nóta:\n" + +msgid "Enable colored output for pacman" +msgstr "" + msgid "ESC to skip" msgstr "ESC a scipeáil" @@ -1731,6 +1747,128 @@ msgstr "" msgid "Exit search mode" msgstr "" +msgid "General" +msgstr "" + +#, fuzzy +msgid "Navigation" +msgstr "Sábháil cumraíocht" + +#, fuzzy +msgid "Selection" +msgstr "Roghnaigh an rogha sínithe" + +msgid "Search" +msgstr "" + +msgid "Down" +msgstr "" + +msgid "Up" +msgstr "" + +#, fuzzy +msgid "Confirm" +msgstr "Deimhnigh agus scoir" + +msgid "Focus right" +msgstr "" + +msgid "Focus left" +msgstr "" + +msgid "Toggle" +msgstr "" + +msgid "Show/Hide help" +msgstr "" + +msgid "Quit" +msgstr "" + +msgid "First" +msgstr "" + +msgid "Last" +msgstr "" + +#, fuzzy +msgid "Select" +msgstr "Roghnaigh an rogha sínithe" + +msgid "Page Up" +msgstr "" + +msgid "Page Down" +msgstr "" + +msgid "Page up" +msgstr "" + +msgid "Page down" +msgstr "" + +msgid "Page Left" +msgstr "" + +msgid "Page Right" +msgstr "" + +msgid "Cursor up" +msgstr "" + +msgid "Cursor down" +msgstr "" + +msgid "Cursor right" +msgstr "" + +msgid "Cursor left" +msgstr "" + +msgid "Top" +msgstr "" + +msgid "Bottom" +msgstr "" + +msgid "Home" +msgstr "" + +msgid "End" +msgstr "" + +#, fuzzy +msgid "Toggle option" +msgstr "Roghanna subvolume" + +msgid "Scroll Up" +msgstr "" + +msgid "Scroll Down" +msgstr "" + +msgid "Scroll Left" +msgstr "" + +msgid "Scroll Right" +msgstr "" + +msgid "Scroll Home" +msgstr "" + +msgid "Scroll End" +msgstr "" + +msgid "Focus Next" +msgstr "" + +msgid "Focus Previous" +msgstr "" + +msgid "Copy selected text" +msgstr "" + #, fuzzy msgid "labwc needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)" msgstr "Teastaíonn rochtain ó Sway ar do shuíochán (bailiúchán de ghléasanna crua-earraí i.e. méarchlár, luch, srl)" @@ -2137,3 +2275,43 @@ msgstr "" msgid "The selected desktop profile requires a regular user to log in via the greeter" msgstr "" + +#, fuzzy, python-brace-format +msgid "Environment type: {} {}" +msgstr "Cineál timpeallachta: {}" + +msgid "Input cannot be empty" +msgstr "" + +msgid "Recommended" +msgstr "" + +msgid "Package" +msgstr "" + +msgid "Curated selection of KDE Plasma packages" +msgstr "" + +msgid "Dependencies" +msgstr "" + +#, fuzzy +msgid "Package group" +msgstr "Comhéadain {} cumraithe" + +msgid "Extensive KDE Plasma installation" +msgstr "" + +msgid "Packages in group" +msgstr "" + +msgid "Minimal KDE Plasma installation" +msgstr "" + +#, fuzzy +msgid "Description" +msgstr "Criptiú diosca" + +#, fuzzy +msgid "Select a flavor of KDE Plasma to install" +msgstr "Roghnaigh cé acu beannaitheoir atá le suiteáil" diff --git a/archinstall/locales/gl/LC_MESSAGES/base.po b/archinstall/locales/gl/LC_MESSAGES/base.po index 20adf597..746e3fc6 100644 --- a/archinstall/locales/gl/LC_MESSAGES/base.po +++ b/archinstall/locales/gl/LC_MESSAGES/base.po @@ -826,6 +826,22 @@ msgstr "¡Entrada no válida! Intente nuevamente con unha entrada válida [1 a { msgid "Parallel Downloads" msgstr "Descargas paralelas" +msgid "Pacman" +msgstr "" + +msgid "Color" +msgstr "" + +#, fuzzy, python-brace-format +msgid "Enter the number of parallel downloads (1-{})" +msgstr "" +"Ingrese el número de descargas paralelas que se habilitarán.\n" +"\n" +"Nota:\n" + +msgid "Enable colored output for pacman" +msgstr "" + msgid "ESC to skip" msgstr "ESC para omitir" @@ -1667,6 +1683,139 @@ msgstr "Iniciar modo de búsqueda" msgid "Exit search mode" msgstr "Salir do modo de búsqueda" +msgid "General" +msgstr "" + +#, fuzzy +msgid "Navigation" +msgstr "Guardar configuración" + +#, fuzzy +msgid "Selection" +msgstr "Seleccione regiones" + +msgid "Search" +msgstr "" + +msgid "Down" +msgstr "" + +msgid "Up" +msgstr "" + +#, fuzzy +msgid "Confirm" +msgstr "Confirmar e salir" + +#, fuzzy +msgid "Focus right" +msgstr "Mover a la dereita" + +#, fuzzy +msgid "Focus left" +msgstr "Mover a la esquerda" + +msgid "Toggle" +msgstr "" + +#, fuzzy +msgid "Show/Hide help" +msgstr "Mostrar axuda" + +msgid "Quit" +msgstr "" + +msgid "First" +msgstr "" + +msgid "Last" +msgstr "" + +#, fuzzy +msgid "Select" +msgstr "Seleccione regiones" + +msgid "Page Up" +msgstr "" + +msgid "Page Down" +msgstr "" + +#, fuzzy +msgid "Page up" +msgstr "Grupo de paquetes:" + +#, fuzzy +msgid "Page down" +msgstr "Bajar" + +msgid "Page Left" +msgstr "" + +#, fuzzy +msgid "Page Right" +msgstr "Mover a la dereita" + +msgid "Cursor up" +msgstr "" + +#, fuzzy +msgid "Cursor down" +msgstr "Bajar" + +#, fuzzy +msgid "Cursor right" +msgstr "Mover a la dereita" + +#, fuzzy +msgid "Cursor left" +msgstr "Mover a la esquerda" + +msgid "Top" +msgstr "" + +msgid "Bottom" +msgstr "" + +msgid "Home" +msgstr "" + +#, fuzzy +msgid "End" +msgstr "Habilitado" + +#, fuzzy +msgid "Toggle option" +msgstr "Opciones do subvolumen" + +msgid "Scroll Up" +msgstr "" + +#, fuzzy +msgid "Scroll Down" +msgstr "Bajar en vista previa" + +msgid "Scroll Left" +msgstr "" + +msgid "Scroll Right" +msgstr "" + +msgid "Scroll Home" +msgstr "" + +msgid "Scroll End" +msgstr "" + +msgid "Focus Next" +msgstr "" + +msgid "Focus Previous" +msgstr "" + +msgid "Copy selected text" +msgstr "" + msgid "labwc needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)" msgstr "labwc necesita acceso a o seu asiento (colección de dispositivos de hardware, es decir, teclado, ratón, etc.)" @@ -2027,6 +2176,61 @@ msgstr "Ingrese unha contraseña: " msgid "The password did not match, please try again" msgstr "A contraseña de confirmación no coincide, por favor intente nuevamente" +msgid "Password strength: Weak" +msgstr "" + +msgid "Password strength: Moderate" +msgstr "" + +msgid "Password strength: Strong" +msgstr "" + +msgid "The selected desktop profile requires a regular user to log in via the greeter" +msgstr "" + +#, fuzzy, python-brace-format +msgid "Environment type: {} {}" +msgstr "Tipo de entorno: {}" + +#, fuzzy +msgid "Input cannot be empty" +msgstr "O valor no pode estár vacío" + +msgid "Recommended" +msgstr "" + +#, fuzzy +msgid "Package" +msgstr "Grupo de paquetes:" + +msgid "Curated selection of KDE Plasma packages" +msgstr "" + +msgid "Dependencies" +msgstr "" + +#, fuzzy +msgid "Package group" +msgstr "Grupo de paquetes:" + +msgid "Extensive KDE Plasma installation" +msgstr "" + +#, fuzzy +msgid "Packages in group" +msgstr "Grupo de paquetes:" + +msgid "Minimal KDE Plasma installation" +msgstr "" + +#, fuzzy +msgid "Description" +msgstr "Cifrado de disco" + +#, fuzzy +msgid "Select a flavor of KDE Plasma to install" +msgstr "Por favor, elixa qué xestor de inicio de sesión instalar" + #~ msgid "Add :" #~ msgstr "Añadir :" diff --git a/archinstall/locales/he/LC_MESSAGES/base.po b/archinstall/locales/he/LC_MESSAGES/base.po index 99ac38f9..6442a1fc 100644 --- a/archinstall/locales/he/LC_MESSAGES/base.po +++ b/archinstall/locales/he/LC_MESSAGES/base.po @@ -830,6 +830,22 @@ msgstr "קלט שגוי! נא לנסות שוב עם קלט תקין [1 עד {ma msgid "Parallel Downloads" msgstr "הורדות במקביל" +msgid "Pacman" +msgstr "" + +msgid "Color" +msgstr "" + +#, fuzzy, python-brace-format +msgid "Enter the number of parallel downloads (1-{})" +msgstr "" +"נא למלא את מספר ההורדות המקביליות להפעלה.‬\n" +"\n" +"‫הערה:‬\n" + +msgid "Enable colored output for pacman" +msgstr "" + msgid "ESC to skip" msgstr "‫ESC לדילוג" @@ -1691,6 +1707,129 @@ msgstr "" msgid "Exit search mode" msgstr "" +msgid "General" +msgstr "" + +#, fuzzy +msgid "Navigation" +msgstr "שמירת הגדרה" + +#, fuzzy +msgid "Selection" +msgstr "בחירת אפשרות חתימות" + +msgid "Search" +msgstr "" + +msgid "Down" +msgstr "" + +msgid "Up" +msgstr "" + +#, fuzzy +msgid "Confirm" +msgstr "אישור ויציאה" + +msgid "Focus right" +msgstr "" + +msgid "Focus left" +msgstr "" + +msgid "Toggle" +msgstr "" + +msgid "Show/Hide help" +msgstr "" + +msgid "Quit" +msgstr "" + +msgid "First" +msgstr "" + +msgid "Last" +msgstr "" + +#, fuzzy +msgid "Select" +msgstr "בחירת אפשרות חתימות" + +msgid "Page Up" +msgstr "" + +msgid "Page Down" +msgstr "" + +msgid "Page up" +msgstr "" + +msgid "Page down" +msgstr "" + +msgid "Page Left" +msgstr "" + +msgid "Page Right" +msgstr "" + +msgid "Cursor up" +msgstr "" + +msgid "Cursor down" +msgstr "" + +msgid "Cursor right" +msgstr "" + +msgid "Cursor left" +msgstr "" + +msgid "Top" +msgstr "" + +msgid "Bottom" +msgstr "" + +msgid "Home" +msgstr "" + +#, fuzzy +msgid "End" +msgstr "פעיל" + +#, fuzzy +msgid "Toggle option" +msgstr "אפשרויות תת־כרך" + +msgid "Scroll Up" +msgstr "" + +msgid "Scroll Down" +msgstr "" + +msgid "Scroll Left" +msgstr "" + +msgid "Scroll Right" +msgstr "" + +msgid "Scroll Home" +msgstr "" + +msgid "Scroll End" +msgstr "" + +msgid "Focus Next" +msgstr "" + +msgid "Focus Previous" +msgstr "" + +msgid "Copy selected text" +msgstr "" + #, fuzzy msgid "labwc needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)" msgstr "‫Sway צריך גישה למושב (אוסף של התקני חומרה כמו למשל מקלדת, עכבר וכו׳) שלך" @@ -2090,3 +2229,43 @@ msgstr "" msgid "The selected desktop profile requires a regular user to log in via the greeter" msgstr "" + +#, fuzzy, python-brace-format +msgid "Environment type: {} {}" +msgstr "סוג סביבה: {}" + +msgid "Input cannot be empty" +msgstr "" + +msgid "Recommended" +msgstr "" + +msgid "Package" +msgstr "" + +msgid "Curated selection of KDE Plasma packages" +msgstr "" + +msgid "Dependencies" +msgstr "" + +#, fuzzy +msgid "Package group" +msgstr "הגדרת מנשקים" + +msgid "Extensive KDE Plasma installation" +msgstr "" + +msgid "Packages in group" +msgstr "" + +msgid "Minimal KDE Plasma installation" +msgstr "" + +#, fuzzy +msgid "Description" +msgstr "הצפנת כונן" + +#, fuzzy +msgid "Select a flavor of KDE Plasma to install" +msgstr "נא לבחור איזו מערכת קבלת פנים להתקין" diff --git a/archinstall/locales/ku/LC_MESSAGES/base.po b/archinstall/locales/ku/LC_MESSAGES/base.po index f6f6bf2c..eeae0ddc 100644 --- a/archinstall/locales/ku/LC_MESSAGES/base.po +++ b/archinstall/locales/ku/LC_MESSAGES/base.po @@ -823,6 +823,22 @@ msgstr "Têketineke nederbasdar! Bi têketineke derbasdar re dîsa hewl bide [1 msgid "Parallel Downloads" msgstr "Daxistinên parallel" +msgid "Pacman" +msgstr "" + +msgid "Color" +msgstr "" + +#, fuzzy, python-brace-format +msgid "Enter the number of parallel downloads (1-{})" +msgstr "" +"Jimara daxistinên paralel ên ku werin çalakkirin têxîne.\n" +"\n" +"Nîşe:\n" + +msgid "Enable colored output for pacman" +msgstr "" + msgid "ESC to skip" msgstr "ESC bo derbas bikî" @@ -1663,6 +1679,139 @@ msgstr "Awaya lêgerînê dest pê bike" msgid "Exit search mode" msgstr "Awaya lêgerînê bi dawî bike" +msgid "General" +msgstr "" + +#, fuzzy +msgid "Navigation" +msgstr "Rêkxisitinê tomar bike" + +#, fuzzy +msgid "Selection" +msgstr "Herêman hilbijêre" + +msgid "Search" +msgstr "" + +msgid "Down" +msgstr "" + +msgid "Up" +msgstr "" + +#, fuzzy +msgid "Confirm" +msgstr "Biperjîne û derkeve" + +#, fuzzy +msgid "Focus right" +msgstr "Bilivîne rastê" + +#, fuzzy +msgid "Focus left" +msgstr "Bilivîne çepê" + +msgid "Toggle" +msgstr "" + +#, fuzzy +msgid "Show/Hide help" +msgstr "Alîkariyê nîşan bide" + +msgid "Quit" +msgstr "" + +msgid "First" +msgstr "" + +msgid "Last" +msgstr "" + +#, fuzzy +msgid "Select" +msgstr "Herêman hilbijêre" + +msgid "Page Up" +msgstr "" + +msgid "Page Down" +msgstr "" + +#, fuzzy +msgid "Page up" +msgstr "Koma pakêtê:" + +#, fuzzy +msgid "Page down" +msgstr "Bilivîne jêrê" + +msgid "Page Left" +msgstr "" + +#, fuzzy +msgid "Page Right" +msgstr "Bilivîne rastê" + +msgid "Cursor up" +msgstr "" + +#, fuzzy +msgid "Cursor down" +msgstr "Bilivîne jêrê" + +#, fuzzy +msgid "Cursor right" +msgstr "Bilivîne rastê" + +#, fuzzy +msgid "Cursor left" +msgstr "Bilivîne çepê" + +msgid "Top" +msgstr "" + +msgid "Bottom" +msgstr "" + +msgid "Home" +msgstr "" + +#, fuzzy +msgid "End" +msgstr "Çalakkirî" + +#, fuzzy +msgid "Toggle option" +msgstr "Vebijêrkên binpeldankê" + +msgid "Scroll Up" +msgstr "" + +#, fuzzy +msgid "Scroll Down" +msgstr "Pêşdîtina şemitandina jêr" + +msgid "Scroll Left" +msgstr "" + +msgid "Scroll Right" +msgstr "" + +msgid "Scroll Home" +msgstr "" + +msgid "Scroll End" +msgstr "" + +msgid "Focus Next" +msgstr "" + +msgid "Focus Previous" +msgstr "" + +msgid "Copy selected text" +msgstr "" + msgid "labwc needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)" msgstr "labwc gihîştina cihê te pêwîst dike (komek ji reqalavan b.m. kilîtdank, mişk, hwd)" @@ -1885,3 +2034,202 @@ msgstr "" msgid "Use Network Manager (iwd backend)" msgstr "" + +msgid "Firewall" +msgstr "" + +#, fuzzy +msgid "Select audio configuration" +msgstr "Rêkxisitinê bikarhêner tomar bike" + +#, fuzzy +msgid "Enter credentials file decryption password" +msgstr "Borînpeyva şîfrekirina pelê bawernameyan" + +#, fuzzy +msgid "Enter root password" +msgstr "Borînpeyvekê têxîne: " + +msgid "Select bootloader to install" +msgstr "" + +#, fuzzy +msgid "Configuration preview" +msgstr "Rêkxistin" + +#, fuzzy +msgid "Enter a directory for the configuration(s) to be saved" +msgstr "Ji bo rêkxisitin ku werin tomarkirin pelrêçekê têxîne: " + +#, fuzzy +msgid "Select encryption type" +msgstr "Cûreyê şîfrekirinê" + +#, fuzzy +msgid "Select disks for the installation" +msgstr "Navê mêvandarê xwestî ji bo sazkirinê: " + +#, fuzzy +msgid "Enter a mountpoint" +msgstr "Xaleke siwarkirinê hilbijêre:" + +#, fuzzy, python-brace-format +msgid "Enter a size (default: {}): " +msgstr "Dawî têxîne (kesane: {}): " + +#, fuzzy +msgid "Enter subvolume name" +msgstr "Navê binpeldankê" + +#, fuzzy +msgid "Enter subvolume mountpoint" +msgstr "Xala siwarkirinê ya binpeldankê" + +#, fuzzy +msgid "Select a disk configuration" +msgstr "Rêkxisitina dîskê" + +#, fuzzy +msgid "Enter root mount directory" +msgstr "Pelrêça siwarkirina root" + +msgid "You will use whatever drive-setup is mounted at the specified directory" +msgstr "" + +msgid "WARNING: Archinstall won't check the suitability of this setup" +msgstr "" + +#, fuzzy +msgid "Select main filesystem" +msgstr "Pergala pelê biguherîne" + +msgid "Enter a hostname" +msgstr "" + +#, fuzzy +msgid "Select timezone" +msgstr "Herêmeke demê hilbijêre" + +#, fuzzy +msgid "Enter the number of parallel downloads to be enabled" +msgstr "" +"Jimara daxistinên paralel ên ku werin çalakkirin têxîne.\n" +"\n" +"Nîşe:\n" + +#, python-brace-format +msgid "Value must be between 1 and {}" +msgstr "" + +#, fuzzy +msgid "Select which kernel(s) to install" +msgstr "Tika ka kîjan silavkar divê were sazkirin hilbijêre" + +#, fuzzy +msgid "Enter a respository name" +msgstr "Navê depoyê" + +#, fuzzy +msgid "Enter the repository url" +msgstr "Depoya kesane biguherîne" + +#, fuzzy +msgid "Enter server url" +msgstr "Girêdana rajekar" + +#, fuzzy +msgid "Select mirror regions to be enabled" +msgstr "Herêmên eynikê ên hilbijartî" + +#, fuzzy +msgid "Select optional repositories to be enabled" +msgstr "Ka kîjan depoyên vebijêrkî divê çalak bibe hilbijêre" + +#, fuzzy +msgid "Select an interface" +msgstr "Navrûyê jê bibe" + +#, fuzzy +msgid "Choose network configuration" +msgstr "Rêkxisitina torê tune ye" + +#, fuzzy +msgid "No packages found" +msgstr "Amûrên U2F nehatin dîtin" + +#, fuzzy +msgid "Select which greeter to install" +msgstr "Tika ka kîjan silavkar divê were sazkirin hilbijêre" + +#, fuzzy +msgid "Select a profile type" +msgstr "Profîlên hilbijartî: " + +#, fuzzy +msgid "Enter new password" +msgstr "Borînpeyva wifi têxîne" + +msgid "Enter a username" +msgstr "" + +#, fuzzy +msgid "Enter a password" +msgstr "Borînpeyvekê têxîne: " + +#, fuzzy +msgid "The password did not match, please try again" +msgstr "Pejirandina borînpeyvê li hev nehat, tika dîsa hewl bide" + +msgid "Password strength: Weak" +msgstr "" + +msgid "Password strength: Moderate" +msgstr "" + +msgid "Password strength: Strong" +msgstr "" + +msgid "The selected desktop profile requires a regular user to log in via the greeter" +msgstr "" + +#, fuzzy, python-brace-format +msgid "Environment type: {} {}" +msgstr "Cûreya jîngehê: {}" + +#, fuzzy +msgid "Input cannot be empty" +msgstr "Nirx nabe ku vala be" + +msgid "Recommended" +msgstr "" + +#, fuzzy +msgid "Package" +msgstr "Koma pakêtê:" + +msgid "Curated selection of KDE Plasma packages" +msgstr "" + +msgid "Dependencies" +msgstr "" + +#, fuzzy +msgid "Package group" +msgstr "Koma pakêtê:" + +msgid "Extensive KDE Plasma installation" +msgstr "" + +#, fuzzy +msgid "Packages in group" +msgstr "Koma pakêtê:" + +msgid "Minimal KDE Plasma installation" +msgstr "" + +#, fuzzy +msgid "Description" +msgstr "Şîfrekirina dîskê" + +msgid "Select a flavor of KDE Plasma to install" +msgstr "" diff --git a/pyproject.toml b/pyproject.toml index 2845458b..79d41d29 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "archinstall" -version = "4.1" +version = "4.2" description = "Arch Linux installer - guided, templates etc." authors = [ {name = "Anton Hvornum", email = "anton@hvornum.se"}, From 7ea171369a396f62fb5203e2632788766691094b Mon Sep 17 00:00:00 2001 From: codefiles <11915375+codefiles@users.noreply.github.com> Date: Thu, 16 Apr 2026 00:05:08 -0400 Subject: [PATCH 21/38] Refactor PartitionType (#4432) * Use UPPER_CASE for PartitionType * Use StrEnum for PartitionType --- archinstall/lib/disk/disk_menu.py | 10 +++++----- archinstall/lib/disk/partitioning_menu.py | 4 ++-- archinstall/lib/models/device.py | 16 ++++++++-------- docs/examples/python.rst | 2 +- examples/full_automated_installation.py | 6 +++--- 5 files changed, 19 insertions(+), 19 deletions(-) diff --git a/archinstall/lib/disk/disk_menu.py b/archinstall/lib/disk/disk_menu.py index 9cc7271a..95a73c6b 100644 --- a/archinstall/lib/disk/disk_menu.py +++ b/archinstall/lib/disk/disk_menu.py @@ -503,7 +503,7 @@ def _boot_partition(sector_size: SectorSize, using_gpt: bool) -> PartitionModifi # boot partition return PartitionModification( status=ModificationStatus.CREATE, - type=PartitionType.Primary, + type=PartitionType.PRIMARY, start=start, length=size, mountpoint=Path('/boot'), @@ -655,7 +655,7 @@ async def suggest_single_disk_layout( root_partition = PartitionModification( status=ModificationStatus.CREATE, - type=PartitionType.Primary, + type=PartitionType.PRIMARY, start=root_start, length=root_length, mountpoint=Path('/') if not using_subvolumes else None, @@ -680,7 +680,7 @@ async def suggest_single_disk_layout( home_partition = PartitionModification( status=ModificationStatus.CREATE, - type=PartitionType.Primary, + type=PartitionType.PRIMARY, start=home_start, length=home_length, mountpoint=Path('/home'), @@ -765,7 +765,7 @@ async def suggest_multi_disk_layout( # add root partition to the root device root_partition = PartitionModification( status=ModificationStatus.CREATE, - type=PartitionType.Primary, + type=PartitionType.PRIMARY, start=root_start, length=root_length, mountpoint=Path('/'), @@ -787,7 +787,7 @@ async def suggest_multi_disk_layout( # add home partition to home device home_partition = PartitionModification( status=ModificationStatus.CREATE, - type=PartitionType.Primary, + type=PartitionType.PRIMARY, start=home_start, length=home_length, mountpoint=Path('/home'), diff --git a/archinstall/lib/disk/partitioning_menu.py b/archinstall/lib/disk/partitioning_menu.py index d5c6f064..7e07d776 100644 --- a/archinstall/lib/disk/partitioning_menu.py +++ b/archinstall/lib/disk/partitioning_menu.py @@ -58,7 +58,7 @@ class DiskSegment: part_mod = PartitionModification( status=ModificationStatus.CREATE, - type=PartitionType._Unknown, + type=PartitionType._UNKNOWN, start=self.segment.start, length=self.segment.length, ) @@ -527,7 +527,7 @@ class PartitioningList(ListManager[DiskSegment]): partition = PartitionModification( status=ModificationStatus.CREATE, - type=PartitionType.Primary, + type=PartitionType.PRIMARY, start=free_space.start, length=length, fs_type=fs_type, diff --git a/archinstall/lib/models/device.py b/archinstall/lib/models/device.py index 897a32bc..74fb7e77 100644 --- a/archinstall/lib/models/device.py +++ b/archinstall/lib/models/device.py @@ -720,23 +720,23 @@ class BDevice: return hash(self.disk.device.path) -class PartitionType(Enum): - Boot = 'boot' - Primary = 'primary' - _Unknown = 'unknown' +class PartitionType(StrEnum): + BOOT = auto() + PRIMARY = auto() + _UNKNOWN = 'unknown' @classmethod def get_type_from_code(cls, code: int) -> Self: if code == parted.PARTITION_NORMAL: - return cls.Primary + return cls.PRIMARY else: debug(f'Partition code not supported: {code}') - return cls._Unknown + return cls._UNKNOWN def get_partition_code(self) -> int | None: - if self == PartitionType.Primary: + if self == PartitionType.PRIMARY: return parted.PARTITION_NORMAL - elif self == PartitionType.Boot: + elif self == PartitionType.BOOT: return parted.PARTITION_BOOT return None diff --git a/docs/examples/python.rst b/docs/examples/python.rst index 84fb57c0..1243aca5 100644 --- a/docs/examples/python.rst +++ b/docs/examples/python.rst @@ -64,7 +64,7 @@ After running ``python -m archinstall test_installer`` it should print something _PartitionInfo( partition=, name='primary', - type=, + type=, fs_type=, path='/dev/nvme0n1p1', start=Size(value=2048, unit=, sector_size=SectorSize(value=512, unit=)), diff --git a/examples/full_automated_installation.py b/examples/full_automated_installation.py index cd74962a..d4517795 100644 --- a/examples/full_automated_installation.py +++ b/examples/full_automated_installation.py @@ -38,7 +38,7 @@ device_modification = DeviceModification(device, wipe=True) # create a new boot partition boot_partition = PartitionModification( status=ModificationStatus.CREATE, - type=PartitionType.Primary, + type=PartitionType.PRIMARY, start=Size(1, Unit.MiB, device.device_info.sector_size), length=Size(512, Unit.MiB, device.device_info.sector_size), mountpoint=Path('/boot'), @@ -50,7 +50,7 @@ device_modification.add_partition(boot_partition) # create a root partition root_partition = PartitionModification( status=ModificationStatus.CREATE, - type=PartitionType.Primary, + type=PartitionType.PRIMARY, start=Size(513, Unit.MiB, device.device_info.sector_size), length=Size(20, Unit.GiB, device.device_info.sector_size), mountpoint=None, @@ -65,7 +65,7 @@ length_home = device.device_info.total_size - start_home # create a new home partition home_partition = PartitionModification( status=ModificationStatus.CREATE, - type=PartitionType.Primary, + type=PartitionType.PRIMARY, start=start_home, length=length_home, mountpoint=Path('/home'), From 3cabe860ae4d8082247c7ded2db31f4bc73a6706 Mon Sep 17 00:00:00 2001 From: codefiles <11915375+codefiles@users.noreply.github.com> Date: Thu, 16 Apr 2026 00:06:23 -0400 Subject: [PATCH 22/38] Refactor LsblkInfo field validators (#4428) --- archinstall/lib/models/device.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/archinstall/lib/models/device.py b/archinstall/lib/models/device.py index 74fb7e77..da98d15b 100644 --- a/archinstall/lib/models/device.py +++ b/archinstall/lib/models/device.py @@ -4,7 +4,7 @@ import uuid from dataclasses import dataclass, field from enum import Enum, StrEnum, auto from pathlib import Path -from typing import NotRequired, Self, TypedDict, override +from typing import Any, NotRequired, Self, TypedDict, override from uuid import UUID import parted @@ -1590,14 +1590,18 @@ class LsblkInfo(BaseModel): @field_validator('size', mode='before') @classmethod - def convert_size(cls, v: int, info: ValidationInfo) -> Size: - sector_size = SectorSize(info.data['log_sec'], Unit.B) - return Size(v, Unit.B, sector_size) + def convert_size(cls, value: Any, info: ValidationInfo) -> Any: + if isinstance(value, int): + sector_size = SectorSize(info.data['log_sec'], Unit.B) + return Size(value, Unit.B, sector_size) + return value @field_validator('mountpoints', 'fsroots', mode='before') @classmethod - def remove_none(cls, v: list[Path | None]) -> list[Path]: - return [item for item in v if item is not None] + def remove_none(cls, value: Any) -> Any: + if isinstance(value, list): + return [item for item in value if item is not None] + return value @field_serializer('size', when_used='json') def serialize_size(self, size: Size) -> str: From 29588fadeeeebd9c8e32e546af160e17b60822f1 Mon Sep 17 00:00:00 2001 From: Daniel Girtler Date: Thu, 16 Apr 2026 15:29:53 +1000 Subject: [PATCH 23/38] Fix encrypted partition selection (#4407) --- archinstall/lib/disk/encryption_menu.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/archinstall/lib/disk/encryption_menu.py b/archinstall/lib/disk/encryption_menu.py index b3950f05..925deb0d 100644 --- a/archinstall/lib/disk/encryption_menu.py +++ b/archinstall/lib/disk/encryption_menu.py @@ -321,7 +321,7 @@ async def select_partitions_to_encrypt( avail_partitions = [p for p in partitions if not p.exists()] if avail_partitions: - group = MenuItemGroup.from_objects(partitions) + group = MenuItemGroup.from_objects(avail_partitions) group.set_selected_by_value(preset) result = await Table[PartitionModification]( From 06488dfb9a55b00664e3a0fdae0129d6753a568d Mon Sep 17 00:00:00 2001 From: Daniel Girtler Date: Thu, 16 Apr 2026 15:30:38 +1000 Subject: [PATCH 24/38] Fix table column error (#4406) --- archinstall/tui/ui/components.py | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/archinstall/tui/ui/components.py b/archinstall/tui/ui/components.py index e06dd216..3163d4ca 100644 --- a/archinstall/tui/ui/components.py +++ b/archinstall/tui/ui/components.py @@ -1046,6 +1046,20 @@ class TableSelectionScreen(BaseScreen[ValueT]): header = self.query_one('#header_text', Label) header.display = not is_loading + def _get_column_keys(self, items: list[MenuItem]) -> list[str]: + all_keys: list[str] = [] + for item in items: + if item.value: + all_keys.extend(item.value.table_data().keys()) + + # Create unique list while preserving order + unique_keys: list[str] = list(dict.fromkeys(all_keys)) + + if self._multi: + unique_keys.insert(0, ' ') + + return unique_keys + def _put_data_to_table(self, table: DataTable[ValueT], group: MenuItemGroup) -> None: items = group.items selected = group.selected_items @@ -1054,15 +1068,7 @@ class TableSelectionScreen(BaseScreen[ValueT]): _ = self.dismiss(Result(ResultType.Selection)) return - value = items[0].value - if not value: - _ = self.dismiss(Result(ResultType.Selection)) - return - - cols = list(value.table_data().keys()) - - if self._multi: - cols.insert(0, ' ') + cols = self._get_column_keys(items) table.add_columns(*cols) From 98d72a6b5777a1223ec39e596ca605af834338f7 Mon Sep 17 00:00:00 2001 From: "Dylan M. Taylor" Date: Thu, 16 Apr 2026 05:17:07 -0400 Subject: [PATCH 25/38] ci: Update renovate to track Arch Linux repos using repology (#4434) --- pyproject.toml | 8 ++++---- renovate.json | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 79d41d29..90a2d8b1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,11 +18,11 @@ classifiers = [ "Operating System :: POSIX :: Linux", ] dependencies = [ - "pyparted>=3.13.0", + "pyparted==3.13.0", "pydantic==2.12.5", - "cryptography>=45.0.7", - "textual>=5.3.0", - "markdown-it-py[linkify]>=4.0.0", + "cryptography==46.0.7", + "textual==8.2.3", + "markdown-it-py[linkify]==4.0.0", ] [project.urls] diff --git a/renovate.json b/renovate.json index 94a2f2cf..540d563c 100644 --- a/renovate.json +++ b/renovate.json @@ -8,6 +8,30 @@ "pre-commit": { "enabled": true }, + "customManagers": [ + { + "customType": "regex", + "description": "Track runtime Python deps via Arch Linux repos instead of PyPI", + "managerFilePatterns": ["**/pyproject.toml"], + "matchStrings": [ + "\"(?pyparted|pydantic|cryptography|textual|markdown-it-py)(?:\\[.*?\\])?==(?[^\"]+)\"" + ], + "depNameTemplate": "arch/python-{{{depName}}}", + "datasourceTemplate": "repology", + "versioningTemplate": "loose" + }, + { + "customType": "regex", + "description": "Track systemd_python via Arch Linux repos (different package name)", + "managerFilePatterns": ["**/pyproject.toml"], + "matchStrings": [ + "\"systemd_python==(?[^\"]+)\"" + ], + "depNameTemplate": "arch/python-systemd", + "datasourceTemplate": "repology", + "versioningTemplate": "loose" + } + ], "packageRules": [ { "matchDepTypes": [ @@ -24,6 +48,19 @@ "astral-sh/ruff-pre-commit" ], "automerge": true + }, + { + "description": "Disable PyPI updates for runtime deps tracked via Arch repos", + "matchDatasources": ["pypi"], + "matchPackageNames": [ + "pyparted", + "pydantic", + "cryptography", + "textual", + "markdown-it-py", + "systemd_python" + ], + "enabled": false } ] } From 9b9f9d6ac0ea90973d8cde87f329e7df3465d97d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 17 Apr 2026 10:06:51 +1000 Subject: [PATCH 26/38] Update dependency ruff to v0.15.11 (#4435) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 90a2d8b1..1b2e8bdc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,7 +36,7 @@ dev = [ "mypy==1.20.1", "flake8==7.3.0", "pre-commit==4.5.1", - "ruff==0.15.10", + "ruff==0.15.11", "pylint==4.0.5", "pytest==9.0.3", ] From 02faf9fbb967dfc1da6518a77363179aba5dc1bb Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 17 Apr 2026 10:07:09 +1000 Subject: [PATCH 27/38] Update pre-commit hook astral-sh/ruff-pre-commit to v0.15.11 (#4436) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 5be827a1..22adc703 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,7 +1,7 @@ default_stages: ['pre-commit'] repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.15.10 + rev: v0.15.11 hooks: # fix unused imports and sort them - id: ruff From 8fe8d4e35f4a10a44efa23fe76d6db606b25601f Mon Sep 17 00:00:00 2001 From: codefiles <11915375+codefiles@users.noreply.github.com> Date: Thu, 16 Apr 2026 20:07:57 -0400 Subject: [PATCH 28/38] Pin linkify-it-py to Arch Linux package version (#4437) --- pyproject.toml | 3 ++- renovate.json | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 1b2e8bdc..f758c745 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -22,7 +22,8 @@ dependencies = [ "pydantic==2.12.5", "cryptography==46.0.7", "textual==8.2.3", - "markdown-it-py[linkify]==4.0.0", + "markdown-it-py==4.0.0", + "linkify-it-py==2.1.0", ] [project.urls] diff --git a/renovate.json b/renovate.json index 540d563c..a8949fba 100644 --- a/renovate.json +++ b/renovate.json @@ -14,7 +14,7 @@ "description": "Track runtime Python deps via Arch Linux repos instead of PyPI", "managerFilePatterns": ["**/pyproject.toml"], "matchStrings": [ - "\"(?pyparted|pydantic|cryptography|textual|markdown-it-py)(?:\\[.*?\\])?==(?[^\"]+)\"" + "\"(?pyparted|pydantic|cryptography|textual|markdown-it-py|linkify-it-py)==(?[^\"]+)\"" ], "depNameTemplate": "arch/python-{{{depName}}}", "datasourceTemplate": "repology", @@ -58,6 +58,7 @@ "cryptography", "textual", "markdown-it-py", + "linkify-it-py", "systemd_python" ], "enabled": false From 9fdd7eb12e7959c58459516dfc15827a048ace9c Mon Sep 17 00:00:00 2001 From: codefiles <11915375+codefiles@users.noreply.github.com> Date: Thu, 16 Apr 2026 20:08:23 -0400 Subject: [PATCH 29/38] Refactor EncryptionType (#4438) * Use UPPER_CASE for EncryptionType * Use StrEnum for EncryptionType --- archinstall/lib/disk/disk_menu.py | 2 +- archinstall/lib/disk/encryption_menu.py | 18 +++++++++--------- archinstall/lib/disk/filesystem.py | 4 ++-- archinstall/lib/installer.py | 24 ++++++++++++------------ archinstall/lib/models/device.py | 24 ++++++++++++------------ archinstall/scripts/guided.py | 2 +- examples/full_automated_installation.py | 2 +- 7 files changed, 38 insertions(+), 38 deletions(-) diff --git a/archinstall/lib/disk/disk_menu.py b/archinstall/lib/disk/disk_menu.py index 95a73c6b..9743ee78 100644 --- a/archinstall/lib/disk/disk_menu.py +++ b/archinstall/lib/disk/disk_menu.py @@ -280,7 +280,7 @@ class DiskLayoutConfigurationMenu(AbstractSubMenu[DiskMenuConfig]): if enc_config.encryption_password: output += tr('Password') + f': {enc_config.encryption_password.hidden()}\n' - if enc_type != EncryptionType.NoEncryption: + if enc_type != EncryptionType.NO_ENCRYPTION: output += tr('Iteration time') + f': {enc_config.iter_time or DEFAULT_ITER_TIME}ms\n' if enc_config.partitions: diff --git a/archinstall/lib/disk/encryption_menu.py b/archinstall/lib/disk/encryption_menu.py index 925deb0d..39c631cd 100644 --- a/archinstall/lib/disk/encryption_menu.py +++ b/archinstall/lib/disk/encryption_menu.py @@ -105,19 +105,19 @@ class DiskEncryptionMenu(AbstractSubMenu[DiskEncryption]): def _check_dep_enc_type(self) -> bool: enc_type: EncryptionType | None = self._item_group.find_by_key('encryption_type').value - if enc_type and enc_type != EncryptionType.NoEncryption: + if enc_type and enc_type != EncryptionType.NO_ENCRYPTION: return True return False def _check_dep_partitions(self) -> bool: enc_type: EncryptionType | None = self._item_group.find_by_key('encryption_type').value - if enc_type and enc_type in [EncryptionType.Luks, EncryptionType.LvmOnLuks]: + if enc_type and enc_type in [EncryptionType.LUKS, EncryptionType.LVM_ON_LUKS]: return True return False def _check_dep_lvm_vols(self) -> bool: enc_type: EncryptionType | None = self._item_group.find_by_key('encryption_type').value - if enc_type and enc_type == EncryptionType.LuksOnLvm: + if enc_type and enc_type == EncryptionType.LUKS_ON_LVM: return True return False @@ -137,13 +137,13 @@ class DiskEncryptionMenu(AbstractSubMenu[DiskEncryption]): assert enc_partitions is not None assert enc_lvm_vols is not None - if enc_type in [EncryptionType.Luks, EncryptionType.LvmOnLuks] and enc_partitions: + if enc_type in [EncryptionType.LUKS, EncryptionType.LVM_ON_LUKS] and enc_partitions: enc_lvm_vols = [] - if enc_type == EncryptionType.LuksOnLvm: + if enc_type == EncryptionType.LUKS_ON_LVM: enc_partitions = [] - if enc_type != EncryptionType.NoEncryption and enc_password and (enc_partitions or enc_lvm_vols): + if enc_type != EncryptionType.NO_ENCRYPTION and enc_password and (enc_partitions or enc_lvm_vols): return DiskEncryption( encryption_password=enc_password, encryption_type=enc_type, @@ -227,7 +227,7 @@ class DiskEncryptionMenu(AbstractSubMenu[DiskEncryption]): iter_time = item.value enc_type = self._item_group.find_by_key('encryption_type').value - if iter_time and enc_type != EncryptionType.NoEncryption: + if iter_time and enc_type != EncryptionType.NO_ENCRYPTION: return f'{tr("Iteration time")}: {iter_time}ms' return None @@ -240,9 +240,9 @@ async def select_encryption_type( options: list[EncryptionType] = [] if lvm_config: - options = [EncryptionType.LvmOnLuks, EncryptionType.LuksOnLvm] + options = [EncryptionType.LVM_ON_LUKS, EncryptionType.LUKS_ON_LVM] else: - options = [EncryptionType.Luks] + options = [EncryptionType.LUKS] if not preset: preset = options[0] diff --git a/archinstall/lib/disk/filesystem.py b/archinstall/lib/disk/filesystem.py index 67636491..1afa8c6e 100644 --- a/archinstall/lib/disk/filesystem.py +++ b/archinstall/lib/disk/filesystem.py @@ -139,7 +139,7 @@ class FilesystemHandler: self._format_lvm_vols(self._disk_config.lvm_config) def _setup_lvm_encrypted(self, lvm_config: LvmConfiguration, enc_config: DiskEncryption) -> None: - if enc_config.encryption_type == EncryptionType.LvmOnLuks: + if enc_config.encryption_type == EncryptionType.LVM_ON_LUKS: enc_mods = self._encrypt_partitions(enc_config, lock_after_create=False) self._setup_lvm(lvm_config, enc_mods) @@ -148,7 +148,7 @@ class FilesystemHandler: # Don't close LVM or LUKS during setup - keep everything active # The installation phase will handle unlocking and mounting # Closing causes "parent leaked" and lvchange errors - elif enc_config.encryption_type == EncryptionType.LuksOnLvm: + elif enc_config.encryption_type == EncryptionType.LUKS_ON_LVM: self._setup_lvm(lvm_config) enc_vols = self._encrypt_lvm_vols(lvm_config, enc_config, False) self._format_lvm_vols(lvm_config, enc_vols) diff --git a/archinstall/lib/installer.py b/archinstall/lib/installer.py index 17b4d0d0..f2d39f98 100644 --- a/archinstall/lib/installer.py +++ b/archinstall/lib/installer.py @@ -82,7 +82,7 @@ class Installer: self.kernels = kernels or ['linux'] self._disk_config = disk_config - self._disk_encryption = disk_config.disk_encryption or DiskEncryption(EncryptionType.NoEncryption) + self._disk_encryption = disk_config.disk_encryption or DiskEncryption(EncryptionType.NO_ENCRYPTION) self.target: Path = target self.init_time = time.strftime('%Y-%m-%d_%H-%M-%S') @@ -254,16 +254,16 @@ class Installer: luks_handlers: dict[Any, Luks2] = {} match self._disk_encryption.encryption_type: - case EncryptionType.NoEncryption: + case EncryptionType.NO_ENCRYPTION: self._import_lvm() self._mount_lvm_layout() - case EncryptionType.Luks: + case EncryptionType.LUKS: luks_handlers = self._prepare_luks_partitions(self._disk_encryption.partitions) - case EncryptionType.LvmOnLuks: + case EncryptionType.LVM_ON_LUKS: luks_handlers = self._prepare_luks_partitions(self._disk_encryption.partitions) self._import_lvm() self._mount_lvm_layout(luks_handlers) - case EncryptionType.LuksOnLvm: + case EncryptionType.LUKS_ON_LVM: self._import_lvm() luks_handlers = self._prepare_luks_lvm(self._disk_encryption.lvm_volumes) self._mount_lvm_layout(luks_handlers) @@ -433,11 +433,11 @@ class Installer: def generate_key_files(self) -> None: match self._disk_encryption.encryption_type: - case EncryptionType.Luks: + case EncryptionType.LUKS: self._generate_key_files_partitions() - case EncryptionType.LuksOnLvm: + case EncryptionType.LUKS_ON_LVM: self._generate_key_file_lvm_volumes() - case EncryptionType.LvmOnLuks: + case EncryptionType.LVM_ON_LUKS: # currently LvmOnLuks only supports a single # partitioning layout (boot + partition) # so we won't need any keyfile generation atm @@ -899,7 +899,7 @@ class Installer: if vol.fs_type is not None: self._prepare_fs_type(vol.fs_type, vol.mountpoint) - types = (EncryptionType.LvmOnLuks, EncryptionType.LuksOnLvm) + types = (EncryptionType.LVM_ON_LUKS, EncryptionType.LUKS_ON_LVM) if self._disk_encryption.encryption_type in types: self._prepare_encrypt(lvm) else: @@ -1137,7 +1137,7 @@ class Installer: kernel_parameters = [] match self._disk_encryption.encryption_type: - case EncryptionType.LvmOnLuks: + case EncryptionType.LVM_ON_LUKS: if not lvm.vg_name: raise ValueError(f'Unable to determine VG name for {lvm.name}') @@ -1154,7 +1154,7 @@ class Installer: else: debug(f'LvmOnLuks, encrypted root partition, identifying by UUID: {uuid}') kernel_parameters.append(f'cryptdevice=UUID={uuid}:cryptlvm root={lvm.safe_dev_path}') - case EncryptionType.LuksOnLvm: + case EncryptionType.LUKS_ON_LVM: uuid = self._get_luks_uuid_from_mapper_dev(lvm.mapper_path) if self._disk_encryption.hsm_device: @@ -1163,7 +1163,7 @@ class Installer: else: debug(f'LuksOnLvm, encrypted root partition, identifying by UUID: {uuid}') kernel_parameters.append(f'cryptdevice=UUID={uuid}:root root=/dev/mapper/root') - case EncryptionType.NoEncryption: + case EncryptionType.NO_ENCRYPTION: debug(f'Identifying root lvm by mapper device: {lvm.dev_path}') kernel_parameters.append(f'root={lvm.safe_dev_path}') diff --git a/archinstall/lib/models/device.py b/archinstall/lib/models/device.py index da98d15b..3015833d 100644 --- a/archinstall/lib/models/device.py +++ b/archinstall/lib/models/device.py @@ -1400,19 +1400,19 @@ class DeviceModification: } -class EncryptionType(Enum): - NoEncryption = 'no_encryption' - Luks = 'luks' - LvmOnLuks = 'lvm_on_luks' - LuksOnLvm = 'luks_on_lvm' +class EncryptionType(StrEnum): + NO_ENCRYPTION = auto() + LUKS = auto() + LVM_ON_LUKS = auto() + LUKS_ON_LVM = auto() @classmethod def _encryption_type_mapper(cls) -> dict[str, Self]: return { - tr('No Encryption'): cls.NoEncryption, - tr('LUKS'): cls.Luks, - tr('LVM on LUKS'): cls.LvmOnLuks, - tr('LUKS on LVM'): cls.LuksOnLvm, + tr('No Encryption'): cls.NO_ENCRYPTION, + tr('LUKS'): cls.LUKS, + tr('LVM on LUKS'): cls.LVM_ON_LUKS, + tr('LUKS on LVM'): cls.LUKS_ON_LVM, } @classmethod @@ -1436,7 +1436,7 @@ class _DiskEncryptionSerialization(TypedDict): @dataclass class DiskEncryption: - encryption_type: EncryptionType = EncryptionType.NoEncryption + encryption_type: EncryptionType = EncryptionType.NO_ENCRYPTION encryption_password: Password | None = None partitions: list[PartitionModification] = field(default_factory=list) lvm_volumes: list[LvmVolume] = field(default_factory=list) @@ -1444,10 +1444,10 @@ class DiskEncryption: iter_time: int = DEFAULT_ITER_TIME def __post_init__(self) -> None: - if self.encryption_type in [EncryptionType.Luks, EncryptionType.LvmOnLuks] and not self.partitions: + if self.encryption_type in [EncryptionType.LUKS, EncryptionType.LVM_ON_LUKS] and not self.partitions: raise ValueError('Luks or LvmOnLuks encryption require partitions to be defined') - if self.encryption_type == EncryptionType.LuksOnLvm and not self.lvm_volumes: + if self.encryption_type == EncryptionType.LUKS_ON_LVM and not self.lvm_volumes: raise ValueError('LuksOnLvm encryption require LMV volumes to be defined') def should_generate_encryption_file(self, dev: PartitionModification | LvmVolume) -> bool: diff --git a/archinstall/scripts/guided.py b/archinstall/scripts/guided.py index 601ca7bc..34133722 100644 --- a/archinstall/scripts/guided.py +++ b/archinstall/scripts/guided.py @@ -92,7 +92,7 @@ def perform_installation( ) if disk_config.config_type != DiskLayoutType.Pre_mount: - if disk_config.disk_encryption and disk_config.disk_encryption.encryption_type != EncryptionType.NoEncryption: + if disk_config.disk_encryption and disk_config.disk_encryption.encryption_type != EncryptionType.NO_ENCRYPTION: # generate encryption key files for the mounted luks devices installation.generate_key_files() diff --git a/examples/full_automated_installation.py b/examples/full_automated_installation.py index d4517795..8193c149 100644 --- a/examples/full_automated_installation.py +++ b/examples/full_automated_installation.py @@ -82,7 +82,7 @@ disk_config = DiskLayoutConfiguration( # disk encryption configuration (Optional) disk_encryption = DiskEncryption( encryption_password=Password(plaintext='enc_password'), - encryption_type=EncryptionType.Luks, + encryption_type=EncryptionType.LUKS, partitions=[home_partition], hsm_device=None, ) From 4fcef35af03ffdd74be3a0447a0730c98121b216 Mon Sep 17 00:00:00 2001 From: Softer Date: Sat, 18 Apr 2026 05:02:47 +0300 Subject: [PATCH 30/38] Add optional "Additional fonts" selection to Applications menu (#4420) * Add Fonts application with multi-select for emoji and CJK packages * Rename to Additional fonts and add package descriptions * Add noto-fonts to font package selection * Move font descriptions into FontPackage enum method * ci: trigger tests * Add ttf-liberation and ttf-dejavu to font selection --- archinstall/applications/fonts.py | 14 ++++++ .../lib/applications/application_handler.py | 7 +++ .../lib/applications/application_menu.py | 44 +++++++++++++++++ archinstall/lib/models/application.py | 47 +++++++++++++++++++ archinstall/locales/base.pot | 15 ++++++ archinstall/locales/uk/LC_MESSAGES/base.po | 15 ++++++ 6 files changed, 142 insertions(+) create mode 100644 archinstall/applications/fonts.py diff --git a/archinstall/applications/fonts.py b/archinstall/applications/fonts.py new file mode 100644 index 00000000..3fa54c67 --- /dev/null +++ b/archinstall/applications/fonts.py @@ -0,0 +1,14 @@ +from typing import TYPE_CHECKING + +from archinstall.lib.models.application import FontsConfiguration +from archinstall.lib.output import debug + +if TYPE_CHECKING: + from archinstall.lib.installer import Installer + + +class FontsApp: + def install(self, install_session: Installer, fonts_config: FontsConfiguration) -> None: + packages = [f.value for f in fonts_config.fonts] + debug(f'Installing fonts: {packages}') + install_session.add_additional_packages(packages) diff --git a/archinstall/lib/applications/application_handler.py b/archinstall/lib/applications/application_handler.py index fb0ceced..7fcf5dba 100644 --- a/archinstall/lib/applications/application_handler.py +++ b/archinstall/lib/applications/application_handler.py @@ -3,6 +3,7 @@ from typing import TYPE_CHECKING from archinstall.applications.audio import AudioApp from archinstall.applications.bluetooth import BluetoothApp from archinstall.applications.firewall import FirewallApp +from archinstall.applications.fonts import FontsApp from archinstall.applications.power_management import PowerManagementApp from archinstall.applications.print_service import PrintServiceApp from archinstall.lib.models import Audio @@ -42,3 +43,9 @@ class ApplicationHandler: install_session, app_config.firewall_config, ) + + if app_config.fonts_config: + FontsApp().install( + install_session, + app_config.fonts_config, + ) diff --git a/archinstall/lib/applications/application_menu.py b/archinstall/lib/applications/application_menu.py index 5ef50441..990dcda7 100644 --- a/archinstall/lib/applications/application_menu.py +++ b/archinstall/lib/applications/application_menu.py @@ -10,6 +10,8 @@ from archinstall.lib.models.application import ( BluetoothConfiguration, Firewall, FirewallConfiguration, + FontPackage, + FontsConfiguration, PowerManagement, PowerManagementConfiguration, PrintServiceConfiguration, @@ -77,6 +79,13 @@ class ApplicationMenu(AbstractSubMenu[ApplicationConfiguration]): preview_action=self._prev_firewall, key='firewall_config', ), + MenuItem( + text=tr('Additional fonts'), + action=select_fonts, + value=self._app_config.fonts_config, + preview_action=self._prev_fonts, + key='fonts_config', + ), ] def _prev_power_management(self, item: MenuItem) -> str | None: @@ -115,6 +124,13 @@ class ApplicationMenu(AbstractSubMenu[ApplicationConfiguration]): return f'{tr("Firewall")}: {config.firewall.value}' return None + def _prev_fonts(self, item: MenuItem) -> str | None: + if item.value is not None: + config: FontsConfiguration = item.value + packages = ', '.join(f.value for f in config.fonts) + return f'{tr("Additional fonts")}: {packages}' + return None + async def select_power_management(preset: PowerManagementConfiguration | None = None) -> PowerManagementConfiguration | None: group = MenuItemGroup.from_enum(PowerManagement) @@ -217,3 +233,31 @@ async def select_firewall(preset: FirewallConfiguration | None = None) -> Firewa return FirewallConfiguration(firewall=result.get_value()) case ResultType.Reset: return None + + +async def select_fonts(preset: FontsConfiguration | None = None) -> FontsConfiguration | None: + items = [MenuItem(f'{f.value} ({f.description()})', value=f) for f in FontPackage] + group = MenuItemGroup(items) + + if preset: + for f in preset.fonts: + group.set_selected_by_value(f) + + result = await Selection[FontPackage]( + group, + header=tr('Select font packages to install'), + allow_skip=True, + allow_reset=True, + multi=True, + ).show() + + match result.type_: + case ResultType.Skip: + return preset + case ResultType.Selection: + selected = result.get_values() + if selected: + return FontsConfiguration(fonts=selected) + return None + case ResultType.Reset: + return None diff --git a/archinstall/lib/models/application.py b/archinstall/lib/models/application.py index f0d6424e..04d1a342 100644 --- a/archinstall/lib/models/application.py +++ b/archinstall/lib/models/application.py @@ -2,6 +2,8 @@ from dataclasses import dataclass from enum import StrEnum, auto from typing import Any, NotRequired, Self, TypedDict +from archinstall.lib.translationhandler import tr + class PowerManagement(StrEnum): POWER_PROFILES_DAEMON = 'power-profiles-daemon' @@ -39,6 +41,31 @@ class FirewallConfigSerialization(TypedDict): firewall: str +class FontPackage(StrEnum): + NOTO = 'noto-fonts' + EMOJI = 'noto-fonts-emoji' + CJK = 'noto-fonts-cjk' + LIBERATION = 'ttf-liberation' + DEJAVU = 'ttf-dejavu' + + def description(self) -> str: + match self: + case FontPackage.NOTO: + return tr('Unicode font coverage for most languages') + case FontPackage.EMOJI: + return tr('color emoji for browsers and apps') + case FontPackage.CJK: + return tr('Chinese, Japanese, Korean characters') + case FontPackage.LIBERATION: + return tr('Arial/Times/Courier replacement, Cyrillic support for Steam/games') + case FontPackage.DEJAVU: + return tr('wide Unicode coverage, good fallback font') + + +class FontsConfigSerialization(TypedDict): + fonts: list[str] + + class ZramAlgorithm(StrEnum): ZSTD = auto() LZO_RLE = 'lzo-rle' @@ -53,6 +80,7 @@ class ApplicationSerialization(TypedDict): power_management_config: NotRequired[PowerManagementConfigSerialization] print_service_config: NotRequired[PrintServiceConfigSerialization] firewall_config: NotRequired[FirewallConfigSerialization] + fonts_config: NotRequired[FontsConfigSerialization] @dataclass @@ -127,6 +155,18 @@ class FirewallConfiguration: ) +@dataclass +class FontsConfiguration: + fonts: list[FontPackage] + + def json(self) -> FontsConfigSerialization: + return {'fonts': [f.value for f in self.fonts]} + + @classmethod + def parse_arg(cls, arg: FontsConfigSerialization) -> Self: + return cls(fonts=[FontPackage(f) for f in arg['fonts']]) + + @dataclass(frozen=True) class ZramConfiguration: enabled: bool @@ -149,6 +189,7 @@ class ApplicationConfiguration: power_management_config: PowerManagementConfiguration | None = None print_service_config: PrintServiceConfiguration | None = None firewall_config: FirewallConfiguration | None = None + fonts_config: FontsConfiguration | None = None @classmethod def parse_arg( @@ -177,6 +218,9 @@ class ApplicationConfiguration: if args and (firewall_config := args.get('firewall_config')) is not None: app_config.firewall_config = FirewallConfiguration.parse_arg(firewall_config) + if args and (fonts_config := args.get('fonts_config')) is not None: + app_config.fonts_config = FontsConfiguration.parse_arg(fonts_config) + return app_config def json(self) -> ApplicationSerialization: @@ -197,4 +241,7 @@ class ApplicationConfiguration: if self.firewall_config: config['firewall_config'] = self.firewall_config.json() + if self.fonts_config: + config['fonts_config'] = self.fonts_config.json() + return config diff --git a/archinstall/locales/base.pot b/archinstall/locales/base.pot index 9d61ca77..10e4535a 100644 --- a/archinstall/locales/base.pot +++ b/archinstall/locales/base.pot @@ -2070,6 +2070,21 @@ msgstr "" msgid "Firewall" msgstr "" +msgid "Additional fonts" +msgstr "" + +msgid "Select font packages to install" +msgstr "" + +msgid "Unicode font coverage for most languages" +msgstr "" + +msgid "color emoji for browsers and apps" +msgstr "" + +msgid "Chinese, Japanese, Korean characters" +msgstr "" + msgid "Select audio configuration" msgstr "" diff --git a/archinstall/locales/uk/LC_MESSAGES/base.po b/archinstall/locales/uk/LC_MESSAGES/base.po index 04695709..a178ac2d 100644 --- a/archinstall/locales/uk/LC_MESSAGES/base.po +++ b/archinstall/locales/uk/LC_MESSAGES/base.po @@ -2011,6 +2011,21 @@ msgstr "Використовувати NetworkManager (з iwd)" msgid "Firewall" msgstr "Брандмауер" +msgid "Additional fonts" +msgstr "Додаткові шрифти" + +msgid "Select font packages to install" +msgstr "Оберіть пакети шрифтів для встановлення" + +msgid "Unicode font coverage for most languages" +msgstr "покриття шрифтами Unicode для більшості мов" + +msgid "color emoji for browsers and apps" +msgstr "кольорові емодзі для браузерів та програм" + +msgid "Chinese, Japanese, Korean characters" +msgstr "китайські, японські, корейські символи" + msgid "Select audio configuration" msgstr "Оберіть конфігурацію аудіо" From e8ea33c41c6eaaa220f091f6acfef7996f1e21b7 Mon Sep 17 00:00:00 2001 From: Softer Date: Sat, 18 Apr 2026 05:04:14 +0300 Subject: [PATCH 31/38] Enable power management services after package installation (#4440) --- archinstall/applications/power_management.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/archinstall/applications/power_management.py b/archinstall/applications/power_management.py index 92ca4c7c..b9f32b05 100644 --- a/archinstall/applications/power_management.py +++ b/archinstall/applications/power_management.py @@ -21,6 +21,18 @@ class PowerManagementApp: 'tuned-ppd', ] + @property + def ppd_services(self) -> list[str]: + return [ + 'power-profiles-daemon.service', + ] + + @property + def tuned_services(self) -> list[str]: + return [ + 'tuned.service', + ] + def install( self, install_session: Installer, @@ -31,5 +43,7 @@ class PowerManagementApp: match power_management_config.power_management: case PowerManagement.POWER_PROFILES_DAEMON: install_session.add_additional_packages(self.ppd_packages) + install_session.enable_service(self.ppd_services) case PowerManagement.TUNED: install_session.add_additional_packages(self.tuned_packages) + install_session.enable_service(self.tuned_services) From cd62eff4a745b08543d71a69238d867b03dd0f64 Mon Sep 17 00:00:00 2001 From: codefiles <11915375+codefiles@users.noreply.github.com> Date: Fri, 17 Apr 2026 22:05:00 -0400 Subject: [PATCH 32/38] Fix copying into target directory (#4441) --- archinstall/lib/installer.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/archinstall/lib/installer.py b/archinstall/lib/installer.py index f2d39f98..9f8c51b2 100644 --- a/archinstall/lib/installer.py +++ b/archinstall/lib/installer.py @@ -505,10 +505,9 @@ class Installer: # Copy over the install log (if there is one) to the install medium if # at least the base has been strapped in, otherwise we won't have a filesystem/structure to copy to. if self._helper_flags.get('base-strapped', False) is True: - absolute_logfile = logger.path - logfile_target = self.target / absolute_logfile - logfile_target.parent.mkdir(parents=True, exist_ok=True) - absolute_logfile.copy(logfile_target, preserve_metadata=True) + logfile_target = self.target / LPath(logger.directory).relative_to_root() + logfile_target.mkdir(parents=True, exist_ok=True) + logger.path.copy_into(logfile_target, preserve_metadata=True) return True @@ -1490,7 +1489,7 @@ class Installer: efi_dir_path.mkdir(parents=True, exist_ok=True) for file in ('BOOTIA32.EFI', 'BOOTX64.EFI'): - (limine_path / file).copy(efi_dir_path) + (limine_path / file).copy_into(efi_dir_path) except Exception as err: raise DiskError(f'Failed to install Limine in {self.target}{efi_partition.mountpoint}: {err}') @@ -1539,7 +1538,7 @@ class Installer: try: # The `limine-bios.sys` file contains stage 3 code. - (limine_path / 'limine-bios.sys').copy(boot_limine_path) + (limine_path / 'limine-bios.sys').copy_into(boot_limine_path) # `limine bios-install` deploys the stage 1 and 2 to the self.arch_chroot(f'limine bios-install {parent_dev_path}', peek_output=True) From 86dc1bbc12aa79576abcbd3f2ba22cf0704eb855 Mon Sep 17 00:00:00 2001 From: Dhruv <148534040+Dhruv1249@users.noreply.github.com> Date: Mon, 20 Apr 2026 13:59:26 +0530 Subject: [PATCH 33/38] locale(hindi): Completed the hindi translation locale (#4446) * locale: ran generate_locale before making change * locale: first 1000 confirmed everything is fine * locale(hi): fixed rest of the fuzzy and empty strings * locale(hi): ran locale generator --- archinstall/locales/base.pot | 6 + archinstall/locales/hi/LC_MESSAGES/base.mo | Bin 2098 -> 101574 bytes archinstall/locales/hi/LC_MESSAGES/base.po | 324 ++++++++++++++++++++- 3 files changed, 325 insertions(+), 5 deletions(-) diff --git a/archinstall/locales/base.pot b/archinstall/locales/base.pot index 10e4535a..ac1728eb 100644 --- a/archinstall/locales/base.pot +++ b/archinstall/locales/base.pot @@ -2245,3 +2245,9 @@ msgstr "" msgid "Select a flavor of KDE Plasma to install" msgstr "" + +msgid "Arial/Times/Courier replacement, Cyrillic support for Steam/games" +msgstr "" + +msgid "wide Unicode coverage, good fallback font" +msgstr "" diff --git a/archinstall/locales/hi/LC_MESSAGES/base.mo b/archinstall/locales/hi/LC_MESSAGES/base.mo index 65ce321ce679d23b04ea1dd6a9733d40626f993f..70f2738a503d4f6d461be59b6d057e258b193f88 100644 GIT binary patch literal 101574 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 fV|s4<&7JujgLD!o-;l!p^^1?g3$hzs{o9- delta 726 zcmYk&OK1~87zglgY|_|jnzpO$CBf0gM{N;lRm2BAx<0U07eWPv6xL=aA!#=3E=}Wu zo~$6LV5c&O;KhhRq^-U5sJ)0NUPUOB;Nzf26+G&HS_yve%`ZC}cE0()eo(*AJh9Rm zxKF57bQJv@9YY^sSWxpY4qre6et>Q8JKPD`I-*9{3D?7YFbt2v7T6CvVG>5*ZP*7D z>>!$;W&9Yx#viCZFi=NS4==$6n1lg10^h+bJPr?Hb1N*u4)_q};Y+9o+#4j?49~!B zn1uV`9caNS>JXl>$8P^a?)>V$%rQr~17Lwu&f;0A#a@QlE2UH>OJiW!M(ga zEXcAwui&^TO4wt9+qo1M<7uA~A}fY{ZgW39Dy}&>A-|4yMFu^=PbK=e?{F`Z&da4z zy9|{~`LPs{o2Jh3L!3sPlyGfdkmtKjZiL2!TjT{{X9$a|n>j3#Gj{_$dwLq>mWnBN z&zWkzn+0XlQchm{)-Hd(H\n" "Language-Team: \n" -"Language: he\n" +"Language: hi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -807,10 +807,10 @@ msgstr "" " (1 से {} के बीच मान दर्ज करें)\n" "नोट:" -msgid " - Maximum value   : {} ( Allows {} parallel downloads, allows {} downloads at a time )" +msgid " - Maximum value : {} ( Allows {} parallel downloads, allows {} downloads at a time )" msgstr " - अधिकतम मान : {} ( {} समानांतर डाउनलोड की अनुमति देता है, एक समय में {} डाउनलोड की अनुमति देता है )" -msgid " - Minimum value   : 1 ( Allows 1 parallel download, allows 2 downloads at a time )" +msgid " - Minimum value : 1 ( Allows 1 parallel download, allows 2 downloads at a time )" msgstr " - न्यूनतम मान : 1 ( 1 समानांतर डाउनलोड की अनुमति देता है, एक समय में 2 डाउनलोड की अनुमति देता है )" msgid " - Disable/Default : 0 ( Disables parallel downloading, allows only 1 download at a time )" @@ -823,6 +823,19 @@ msgstr "अमान्य इनपुट! एक मान्य इनपु msgid "Parallel Downloads" msgstr "समानांतर डाउनलोड" +msgid "Pacman" +msgstr "Pacman" + +msgid "Color" +msgstr "रंग" + +#, python-brace-format +msgid "Enter the number of parallel downloads (1-{})" +msgstr "समानांतर डाउनलोड की संख्या दर्ज करें (1-{})" + +msgid "Enable colored output for pacman" +msgstr "Pacman के लिए रंगीन आउटपुट सक्षम करें" + msgid "ESC to skip" msgstr "छोड़ने के लिए ESC दबाएँ" @@ -1163,7 +1176,7 @@ msgstr "मिरर (Mirrors)" msgid "Mirror regions" msgstr "मिरर क्षेत्र" -msgid " - Maximum value   : {} ( Allows {} parallel downloads, allows {max_downloads+1} downloads at a time )" +msgid " - Maximum value : {} ( Allows {} parallel downloads, allows {max_downloads+1} downloads at a time )" msgstr " - अधिकतम मान : {} ( {} समानांतर डाउनलोड की अनुमति देता है, एक समय में {max_downloads+1} डाउनलोड की अनुमति देता है )" msgid "Invalid input! Try again with a valid input [1 to {}, or 0 to disable]" @@ -1412,6 +1425,7 @@ msgstr "आपके द्वारा दर्ज किया गया य msgid "Username" msgstr "उपयोगकर्ता नाम" +#, python-brace-format msgid "Should \"{}\" be a superuser (sudo)?\n" msgstr "क्या \"{}\" को superuser (sudo) होना चाहिए?\n" @@ -1489,7 +1503,7 @@ msgid "Disabled" msgstr "अक्षम" msgid "Please submit this issue (and file) to https://github.com/archlinux/archinstall/issues" -msgstr "कृपया इस समस्या (और फ़ाइल) को https://github.com/archlinux/archinstall/issues पर सबमिट करें" +msgstr "कृपया इस समस्या (और फ़ाइल) को https://github.com/archlinux/archinstall/issues पर सबमिट करें।" msgid "Mirror name" msgstr "मिरर का नाम" @@ -1662,6 +1676,123 @@ msgstr "खोज मोड शुरू करें" msgid "Exit search mode" msgstr "खोज मोड से बाहर निकलें" +msgid "General" +msgstr "सामान्य" + +msgid "Navigation" +msgstr "नेविगेशन" + +msgid "Selection" +msgstr "चयन" + +msgid "Search" +msgstr "खोज" + +msgid "Down" +msgstr "नीचे" + +msgid "Up" +msgstr "ऊपर" + +msgid "Confirm" +msgstr "पुष्टि करें" + +msgid "Focus right" +msgstr "दाएँ फोकस करें" + +msgid "Focus left" +msgstr "बाएँ फोकस करें" + +msgid "Toggle" +msgstr "बदलें" + +msgid "Show/Hide help" +msgstr "मदद दिखाएँ/छुपाएँ" + +msgid "Quit" +msgstr "बाहर निकलें" + +msgid "First" +msgstr "पहला" + +msgid "Last" +msgstr "अंतिम" + +msgid "Select" +msgstr "चुनें" + +msgid "Page Up" +msgstr "पेज ऊपर" + +msgid "Page Down" +msgstr "पेज नीचे" + +msgid "Page up" +msgstr "पेज ऊपर" + +msgid "Page down" +msgstr "पेज नीचे" + +msgid "Page Left" +msgstr "पेज बाएँ" + +msgid "Page Right" +msgstr "पेज दाएँ" + +msgid "Cursor up" +msgstr "कर्सर ऊपर" + +msgid "Cursor down" +msgstr "कर्सर नीचे" + +msgid "Cursor right" +msgstr "कर्सर दाएँ" + +msgid "Cursor left" +msgstr "कर्सर बाएँ" + +msgid "Top" +msgstr "ऊपर" + +msgid "Bottom" +msgstr "नीचे" + +msgid "Home" +msgstr "होम" + +msgid "End" +msgstr "एंड" + +msgid "Toggle option" +msgstr "विकल्प बदलें" + +msgid "Scroll Up" +msgstr "ऊपर स्क्रॉल करें" + +msgid "Scroll Down" +msgstr "नीचे स्क्रॉल करें" + +msgid "Scroll Left" +msgstr "बाएँ स्क्रॉल करें" + +msgid "Scroll Right" +msgstr "दाएँ स्क्रॉल करें" + +msgid "Scroll Home" +msgstr "स्क्रॉल होम" + +msgid "Scroll End" +msgstr "स्क्रॉल एंड" + +msgid "Focus Next" +msgstr "अगले पर फोकस" + +msgid "Focus Previous" +msgstr "पिछले पर फोकस" + +msgid "Copy selected text" +msgstr "चयनित टेक्स्ट कॉपी करें" + msgid "labwc needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)" msgstr "labwc को आपकी सीट (हार्डवेयर डिवाइसेज का संग्रह यानी कीबोर्ड, माउस, आदि) तक पहुंच की आवश्यकता है" @@ -1876,3 +2007,186 @@ msgstr "नेटवर्क मैनेजर का उपयोग कर msgid "Use Network Manager (iwd backend)" msgstr "नेटवर्क मैनेजर का उपयोग करें (iwd बैकएंड)" + +msgid "Firewall" +msgstr "फ़ायरवॉल" + +msgid "Additional fonts" +msgstr "अतिरिक्त फ़ॉन्ट" + +msgid "Select font packages to install" +msgstr "इंस्टॉल करने के लिए फ़ॉन्ट पैकेज चुनें" + +msgid "Unicode font coverage for most languages" +msgstr "अधिकांश भाषाओं के लिए यूनिकोड फ़ॉन्ट समर्थन" + +msgid "color emoji for browsers and apps" +msgstr "ब्राउज़र और ऐप्स के लिए रंगीन इमोजी" + +msgid "Chinese, Japanese, Korean characters" +msgstr "चीनी, जापानी, कोरियाई वर्ण" + +msgid "Select audio configuration" +msgstr "ऑडियो कॉन्फ़िगरेशन चुनें" + +msgid "Enter credentials file decryption password" +msgstr "क्रेडेंशियल्स फ़ाइल डिक्रिप्शन पासवर्ड दर्ज करें" + +msgid "Enter root password" +msgstr "रूट पासवर्ड दर्ज करें" + +msgid "Select bootloader to install" +msgstr "इंस्टॉल करने के लिए बूटलोडर चुनें" + +msgid "Configuration preview" +msgstr "कॉन्फ़िगरेशन पूर्वावलोकन देखें" + +msgid "Enter a directory for the configuration(s) to be saved" +msgstr "कॉन्फ़िगरेशन सहेजने के लिए डायरेक्टरी दर्ज करें" + +msgid "Select encryption type" +msgstr "एन्क्रिप्शन प्रकार चुनें" + +msgid "Select disks for the installation" +msgstr "इंस्टॉलेशन के लिए डिस्क चुनें" + +msgid "Enter a mountpoint" +msgstr "माउंटपॉइंट दर्ज करें" + +#, python-brace-format +msgid "Enter a size (default: {}): " +msgstr "आकार दर्ज करें (डिफ़ॉल्ट: {}): " + +msgid "Enter subvolume name" +msgstr "सबवॉल्यूम का नाम दर्ज करें" + +msgid "Enter subvolume mountpoint" +msgstr "सबवॉल्यूम माउंटपॉइंट दर्ज करें" + +msgid "Select a disk configuration" +msgstr "एक डिस्क कॉन्फ़िगरेशन चुनें" + +msgid "Enter root mount directory" +msgstr "रूट माउंट डायरेक्टरी दर्ज करें" + +msgid "You will use whatever drive-setup is mounted at the specified directory" +msgstr "आप निर्दिष्ट डायरेक्टरी पर माउंट किए गए किसी भी ड्राइव-सेटअप का उपयोग करेंगे" + +msgid "WARNING: Archinstall won't check the suitability of this setup" +msgstr "चेतावनी: Archinstall इस सेटअप की उपयुक्तता की जाँच नहीं करेगा" + +msgid "Select main filesystem" +msgstr "मुख्य फ़ाइलसिस्टम चुनें" + +msgid "Enter a hostname" +msgstr "होस्टनेम दर्ज करें" + +msgid "Select timezone" +msgstr "समयक्षेत्र चुनें" + +msgid "Enter the number of parallel downloads to be enabled" +msgstr "सक्षम किए जाने वाले समानांतर डाउनलोड की संख्या दर्ज करें" + +#, python-brace-format +msgid "Value must be between 1 and {}" +msgstr "मान 1 और {} के बीच होना चाहिए" + +msgid "Select which kernel(s) to install" +msgstr "इंस्टॉल करने के लिए कौन से कर्नेल चुनें" + +msgid "Enter a respository name" +msgstr "रिपॉजिटरी का नाम दर्ज करें" + +msgid "Enter the repository url" +msgstr "रिपॉजिटरी URL दर्ज करें" + +msgid "Enter server url" +msgstr "सर्वर URL दर्ज करें" + +msgid "Select mirror regions to be enabled" +msgstr "सक्षम करने के लिए मिरर क्षेत्र चुनें" + +msgid "Select optional repositories to be enabled" +msgstr "सक्षम करने के लिए वैकल्पिक रिपॉजिटरी चुनें" + +msgid "Select an interface" +msgstr "एक इंटरफ़ेस चुनें" + +msgid "Choose network configuration" +msgstr "नेटवर्क कॉन्फ़िगरेशन चुनें" + +msgid "No packages found" +msgstr "कोई पैकेज नहीं मिला" + +msgid "Select which greeter to install" +msgstr "कौन सा ग्रीटर इंस्टॉल करना है चुनें" + +msgid "Select a profile type" +msgstr "प्रोफ़ाइल प्रकार चुनें" + +msgid "Enter new password" +msgstr "नया पासवर्ड दर्ज करें" + +msgid "Enter a username" +msgstr "यूज़रनेम दर्ज करें" + +msgid "Enter a password" +msgstr "पासवर्ड दर्ज करें" + +msgid "The password did not match, please try again" +msgstr "पासवर्ड मेल नहीं खाया, कृपया पुनः प्रयास करें" + +msgid "Password strength: Weak" +msgstr "पासवर्ड मजबूती: कमजोर" + +msgid "Password strength: Moderate" +msgstr "पासवर्ड मजबूती: मध्यम" + +msgid "Password strength: Strong" +msgstr "पासवर्ड मजबूती: मजबूत" + +msgid "The selected desktop profile requires a regular user to log in via the greeter" +msgstr "चयनित डेस्कटॉप प्रोफ़ाइल में ग्रीटर के जरिए लॉग इन करने के लिए एक सामान्य उपयोगकर्ता आवश्यक है" + +#, python-brace-format +msgid "Environment type: {} {}" +msgstr "एन्वायरनमेंट प्रकार: {} {}" + +msgid "Input cannot be empty" +msgstr "इनपुट खाली नहीं हो सकता" + +msgid "Recommended" +msgstr "अनुशंसित" + +msgid "Package" +msgstr "पैकेज" + +msgid "Curated selection of KDE Plasma packages" +msgstr "KDE Plasma पैकेजों का चुना हुआ संग्रह" + +msgid "Dependencies" +msgstr "निर्भरताएँ" + +msgid "Package group" +msgstr "पैकेज समूह:" + +msgid "Extensive KDE Plasma installation" +msgstr "विस्तृत KDE Plasma इंस्टॉलेशन" + +msgid "Packages in group" +msgstr "समूह में पैकेज" + +msgid "Minimal KDE Plasma installation" +msgstr "न्यूनतम KDE Plasma इंस्टॉलेशन" + +msgid "Description" +msgstr "विवरण" + +msgid "Select a flavor of KDE Plasma to install" +msgstr "इंस्टॉल करने के लिए KDE Plasma का एक प्रकार चुनें" + +msgid "Arial/Times/Courier replacement, Cyrillic support for Steam/games" +msgstr "Arial/Times/Courier का विकल्प, Steam/गेम्स के लिए Cyrillic समर्थन" + +msgid "wide Unicode coverage, good fallback font" +msgstr "विस्तृत यूनिकोड कवरेज, अच्छा फॉलबैक फ़ॉन्ट" From 82a46c66cab3f166a5bf581a1555ba552018caf7 Mon Sep 17 00:00:00 2001 From: Softer Date: Mon, 20 Apr 2026 11:36:49 +0300 Subject: [PATCH 34/38] Fix shell injection in user_set_shell and chown (#4443) Use argv list with run() instead of sh -c with f-string interpolation, fix mutable default argument in chown, add debug logging on failure. --- archinstall/lib/installer.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/archinstall/lib/installer.py b/archinstall/lib/installer.py index 9f8c51b2..973e80ac 100644 --- a/archinstall/lib/installer.py +++ b/archinstall/lib/installer.py @@ -1964,18 +1964,22 @@ class Installer: def user_set_shell(self, user: str, shell: str) -> bool: info(f'Setting shell for {user} to {shell}') + cmd = ['arch-chroot', '-S', str(self.target), 'chsh', '-s', shell, user] try: - self.arch_chroot(f'sh -c "chsh -s {shell} {user}"') + run(cmd) return True - except SysCallError: + except CalledProcessError as err: + debug(f'Error setting user shell: {err}') return False - def chown(self, owner: str, path: str, options: list[str] = []) -> bool: - cleaned_path = path.replace("'", "\\'") + def chown(self, owner: str, path: str, options: list[str] | None = None) -> bool: + options = options or [] + cmd = ['arch-chroot', '-S', str(self.target), 'chown', *options, owner, path] try: - self.arch_chroot(f"sh -c 'chown {' '.join(options)} {owner} {cleaned_path}'") + run(cmd) return True - except SysCallError: + except CalledProcessError as err: + debug(f'Error changing ownership of {path}: {err}') return False def set_vconsole(self, locale_config: LocaleConfiguration) -> None: From 68d137cdceab28bdabb0cd5e5966247ac5d5dd8f Mon Sep 17 00:00:00 2001 From: Anton Hvornum Date: Mon, 20 Apr 2026 22:28:35 +0200 Subject: [PATCH 35/38] Bumping version to: 4.3 --- PKGBUILD | 2 +- archinstall/locales/ar/LC_MESSAGES/base.po | 23 ++++++++++++++++++++++ archinstall/locales/ca/LC_MESSAGES/base.po | 23 ++++++++++++++++++++++ archinstall/locales/cs/LC_MESSAGES/base.po | 23 ++++++++++++++++++++++ archinstall/locales/de/LC_MESSAGES/base.po | 23 ++++++++++++++++++++++ archinstall/locales/el/LC_MESSAGES/base.po | 23 ++++++++++++++++++++++ archinstall/locales/en/LC_MESSAGES/base.po | 21 ++++++++++++++++++++ archinstall/locales/es/LC_MESSAGES/base.po | 23 ++++++++++++++++++++++ archinstall/locales/et/LC_MESSAGES/base.po | 23 ++++++++++++++++++++++ archinstall/locales/fi/LC_MESSAGES/base.po | 23 ++++++++++++++++++++++ archinstall/locales/fr/LC_MESSAGES/base.po | 23 ++++++++++++++++++++++ archinstall/locales/ga/LC_MESSAGES/base.po | 23 ++++++++++++++++++++++ archinstall/locales/he/LC_MESSAGES/base.po | 23 ++++++++++++++++++++++ pyproject.toml | 2 +- 14 files changed, 276 insertions(+), 2 deletions(-) diff --git a/PKGBUILD b/PKGBUILD index cdb00823..e9ee1173 100644 --- a/PKGBUILD +++ b/PKGBUILD @@ -5,7 +5,7 @@ # Contributor: demostanis worlds pkgname=archinstall -pkgver=4.2 +pkgver=4.3 pkgrel=1 pkgdesc="Just another guided/automated Arch Linux installer with a twist" arch=(any) diff --git a/archinstall/locales/ar/LC_MESSAGES/base.po b/archinstall/locales/ar/LC_MESSAGES/base.po index 1139e147..54c39d82 100644 --- a/archinstall/locales/ar/LC_MESSAGES/base.po +++ b/archinstall/locales/ar/LC_MESSAGES/base.po @@ -2040,6 +2040,23 @@ msgstr "استخدم Network Manager (الخادم الخلفي iwd)" msgid "Firewall" msgstr "جدار الحماية" +#, fuzzy +msgid "Additional fonts" +msgstr "المستودعات الإضافيّة" + +#, fuzzy +msgid "Select font packages to install" +msgstr "اختر برنامج الإقلاع المُراد تثبيته" + +msgid "Unicode font coverage for most languages" +msgstr "" + +msgid "color emoji for browsers and apps" +msgstr "" + +msgid "Chinese, Japanese, Korean characters" +msgstr "" + msgid "Select audio configuration" msgstr "حدّد إعدادات الصوت" @@ -2208,3 +2225,9 @@ msgstr "تشفير القرص " #, fuzzy msgid "Select a flavor of KDE Plasma to install" msgstr "اختر برنامج الإقلاع المُراد تثبيته" + +msgid "Arial/Times/Courier replacement, Cyrillic support for Steam/games" +msgstr "" + +msgid "wide Unicode coverage, good fallback font" +msgstr "" diff --git a/archinstall/locales/ca/LC_MESSAGES/base.po b/archinstall/locales/ca/LC_MESSAGES/base.po index c2513191..05897bb5 100644 --- a/archinstall/locales/ca/LC_MESSAGES/base.po +++ b/archinstall/locales/ca/LC_MESSAGES/base.po @@ -2027,6 +2027,23 @@ msgstr "Utilitzar Network Manager (backend per a iwd)" msgid "Firewall" msgstr "Tallafocs" +#, fuzzy +msgid "Additional fonts" +msgstr "Repositoris addicionals" + +#, fuzzy +msgid "Select font packages to install" +msgstr "Selecció del bootloader a instal·lar" + +msgid "Unicode font coverage for most languages" +msgstr "" + +msgid "color emoji for browsers and apps" +msgstr "" + +msgid "Chinese, Japanese, Korean characters" +msgstr "" + msgid "Select audio configuration" msgstr "Seleccionar configuració d'àudio" @@ -2191,3 +2208,9 @@ msgstr "Xifrat de disc" #, fuzzy msgid "Select a flavor of KDE Plasma to install" msgstr "Selecció del bootloader a instal·lar" + +msgid "Arial/Times/Courier replacement, Cyrillic support for Steam/games" +msgstr "" + +msgid "wide Unicode coverage, good fallback font" +msgstr "" diff --git a/archinstall/locales/cs/LC_MESSAGES/base.po b/archinstall/locales/cs/LC_MESSAGES/base.po index 2816bfba..35bf9c45 100644 --- a/archinstall/locales/cs/LC_MESSAGES/base.po +++ b/archinstall/locales/cs/LC_MESSAGES/base.po @@ -2019,6 +2019,23 @@ msgstr "Použít Network Manager (iwd backend)" msgid "Firewall" msgstr "Firewall" +#, fuzzy +msgid "Additional fonts" +msgstr "Dodatečné repozitáře" + +#, fuzzy +msgid "Select font packages to install" +msgstr "Zvolte zavaděč k instalaci" + +msgid "Unicode font coverage for most languages" +msgstr "" + +msgid "color emoji for browsers and apps" +msgstr "" + +msgid "Chinese, Japanese, Korean characters" +msgstr "" + msgid "Select audio configuration" msgstr "Zvolte konfiguraci zvuku" @@ -2184,3 +2201,9 @@ msgstr "Šifrování disku" #, fuzzy msgid "Select a flavor of KDE Plasma to install" msgstr "Zvolte zavaděč k instalaci" + +msgid "Arial/Times/Courier replacement, Cyrillic support for Steam/games" +msgstr "" + +msgid "wide Unicode coverage, good fallback font" +msgstr "" diff --git a/archinstall/locales/de/LC_MESSAGES/base.po b/archinstall/locales/de/LC_MESSAGES/base.po index 48795bd2..9e2386a4 100644 --- a/archinstall/locales/de/LC_MESSAGES/base.po +++ b/archinstall/locales/de/LC_MESSAGES/base.po @@ -2013,6 +2013,23 @@ msgstr "NetworkManager verwenden (iwd-Backend)" msgid "Firewall" msgstr "Firewall" +#, fuzzy +msgid "Additional fonts" +msgstr "Zusätzliche Repositorien" + +#, fuzzy +msgid "Select font packages to install" +msgstr "Bootloader zur Installation auswählen" + +msgid "Unicode font coverage for most languages" +msgstr "" + +msgid "color emoji for browsers and apps" +msgstr "" + +msgid "Chinese, Japanese, Korean characters" +msgstr "" + msgid "Select audio configuration" msgstr "Audiokonfiguration auswählen" @@ -2172,6 +2189,12 @@ msgstr "Beschreibung" msgid "Select a flavor of KDE Plasma to install" msgstr "KDE-Plasma-Variante zur Installation auswählen" +msgid "Arial/Times/Courier replacement, Cyrillic support for Steam/games" +msgstr "" + +msgid "wide Unicode coverage, good fallback font" +msgstr "" + #~ msgid "All open-source" #~ msgstr "Alle quelloffene" diff --git a/archinstall/locales/el/LC_MESSAGES/base.po b/archinstall/locales/el/LC_MESSAGES/base.po index 6b76b7cb..5a56491a 100644 --- a/archinstall/locales/el/LC_MESSAGES/base.po +++ b/archinstall/locales/el/LC_MESSAGES/base.po @@ -2180,6 +2180,23 @@ msgstr "" msgid "Firewall" msgstr "" +#, fuzzy +msgid "Additional fonts" +msgstr "Προαιρετικά αποθετήρια" + +#, fuzzy +msgid "Select font packages to install" +msgstr "Επιλέξτε ποιες διαμερίσεις να κρυπτογραφηθούν." + +msgid "Unicode font coverage for most languages" +msgstr "" + +msgid "color emoji for browsers and apps" +msgstr "" + +msgid "Chinese, Japanese, Korean characters" +msgstr "" + #, fuzzy msgid "Select audio configuration" msgstr "Αποθήκευση διαμόρφωσης χρήστη" @@ -2370,3 +2387,9 @@ msgstr "Κρυπτογράφηση δίσκου" #, fuzzy msgid "Select a flavor of KDE Plasma to install" msgstr "Επιλέξτε ποιες διαμερίσεις να κρυπτογραφηθούν." + +msgid "Arial/Times/Courier replacement, Cyrillic support for Steam/games" +msgstr "" + +msgid "wide Unicode coverage, good fallback font" +msgstr "" diff --git a/archinstall/locales/en/LC_MESSAGES/base.po b/archinstall/locales/en/LC_MESSAGES/base.po index 79489d88..ac54721e 100644 --- a/archinstall/locales/en/LC_MESSAGES/base.po +++ b/archinstall/locales/en/LC_MESSAGES/base.po @@ -1946,6 +1946,21 @@ msgstr "" msgid "Firewall" msgstr "" +msgid "Additional fonts" +msgstr "" + +msgid "Select font packages to install" +msgstr "" + +msgid "Unicode font coverage for most languages" +msgstr "" + +msgid "color emoji for browsers and apps" +msgstr "" + +msgid "Chinese, Japanese, Korean characters" +msgstr "" + msgid "Select audio configuration" msgstr "" @@ -2104,3 +2119,9 @@ msgstr "" msgid "Select a flavor of KDE Plasma to install" msgstr "" + +msgid "Arial/Times/Courier replacement, Cyrillic support for Steam/games" +msgstr "" + +msgid "wide Unicode coverage, good fallback font" +msgstr "" diff --git a/archinstall/locales/es/LC_MESSAGES/base.po b/archinstall/locales/es/LC_MESSAGES/base.po index 1a1a0d5f..d311804c 100644 --- a/archinstall/locales/es/LC_MESSAGES/base.po +++ b/archinstall/locales/es/LC_MESSAGES/base.po @@ -2031,6 +2031,23 @@ msgstr "Usar gestor de Red (backend iwd)" msgid "Firewall" msgstr "Cortafuegos" +#, fuzzy +msgid "Additional fonts" +msgstr "Repositorios adicionales" + +#, fuzzy +msgid "Select font packages to install" +msgstr "Seleccione el gestor de arranque que desea instalar" + +msgid "Unicode font coverage for most languages" +msgstr "" + +msgid "color emoji for browsers and apps" +msgstr "" + +msgid "Chinese, Japanese, Korean characters" +msgstr "" + msgid "Select audio configuration" msgstr "Seleccionar configuración de audio" @@ -2196,6 +2213,12 @@ msgstr "Cifrado de disco" msgid "Select a flavor of KDE Plasma to install" msgstr "Seleccione el gestor de arranque que desea instalar" +msgid "Arial/Times/Courier replacement, Cyrillic support for Steam/games" +msgstr "" + +msgid "wide Unicode coverage, good fallback font" +msgstr "" + #~ msgid "Add :" #~ msgstr "Añadir :" diff --git a/archinstall/locales/et/LC_MESSAGES/base.po b/archinstall/locales/et/LC_MESSAGES/base.po index 4807b949..d6837654 100644 --- a/archinstall/locales/et/LC_MESSAGES/base.po +++ b/archinstall/locales/et/LC_MESSAGES/base.po @@ -2168,6 +2168,23 @@ msgstr "" msgid "Firewall" msgstr "" +#, fuzzy +msgid "Additional fonts" +msgstr "Valikulised repositooriumid" + +#, fuzzy +msgid "Select font packages to install" +msgstr "Palun valige millist tervitajat installida" + +msgid "Unicode font coverage for most languages" +msgstr "" + +msgid "color emoji for browsers and apps" +msgstr "" + +msgid "Chinese, Japanese, Korean characters" +msgstr "" + #, fuzzy msgid "Select audio configuration" msgstr "Salvesta kasutaja konfiguratsioon" @@ -2358,3 +2375,9 @@ msgstr "Ketta krüpteerimine" #, fuzzy msgid "Select a flavor of KDE Plasma to install" msgstr "Palun valige millist tervitajat installida" + +msgid "Arial/Times/Courier replacement, Cyrillic support for Steam/games" +msgstr "" + +msgid "wide Unicode coverage, good fallback font" +msgstr "" diff --git a/archinstall/locales/fi/LC_MESSAGES/base.po b/archinstall/locales/fi/LC_MESSAGES/base.po index 0dbc443f..7651bb13 100644 --- a/archinstall/locales/fi/LC_MESSAGES/base.po +++ b/archinstall/locales/fi/LC_MESSAGES/base.po @@ -2147,6 +2147,23 @@ msgstr "" msgid "Firewall" msgstr "" +#, fuzzy +msgid "Additional fonts" +msgstr "Valinnaiset arkistot" + +#, fuzzy +msgid "Select font packages to install" +msgstr "Valitse asennettava käyttöliittymä" + +msgid "Unicode font coverage for most languages" +msgstr "" + +msgid "color emoji for browsers and apps" +msgstr "" + +msgid "Chinese, Japanese, Korean characters" +msgstr "" + #, fuzzy msgid "Select audio configuration" msgstr "Tallenna käyttäjän määritykset" @@ -2337,3 +2354,9 @@ msgstr "Levyn salaus" #, fuzzy msgid "Select a flavor of KDE Plasma to install" msgstr "Valitse asennettava käyttöliittymä" + +msgid "Arial/Times/Courier replacement, Cyrillic support for Steam/games" +msgstr "" + +msgid "wide Unicode coverage, good fallback font" +msgstr "" diff --git a/archinstall/locales/fr/LC_MESSAGES/base.po b/archinstall/locales/fr/LC_MESSAGES/base.po index 71335dac..042f5d69 100644 --- a/archinstall/locales/fr/LC_MESSAGES/base.po +++ b/archinstall/locales/fr/LC_MESSAGES/base.po @@ -2055,6 +2055,23 @@ msgstr "" msgid "Firewall" msgstr "" +#, fuzzy +msgid "Additional fonts" +msgstr "Dépôts supplémentaires" + +#, fuzzy +msgid "Select font packages to install" +msgstr "Veuillez choisir le greeter (interface de connexion) à installer" + +msgid "Unicode font coverage for most languages" +msgstr "" + +msgid "color emoji for browsers and apps" +msgstr "" + +msgid "Chinese, Japanese, Korean characters" +msgstr "" + #, fuzzy msgid "Select audio configuration" msgstr "Enregistrer la configuration utilisateur" @@ -2252,6 +2269,12 @@ msgstr "Chiffrement du disque" msgid "Select a flavor of KDE Plasma to install" msgstr "Veuillez choisir le greeter (interface de connexion) à installer" +msgid "Arial/Times/Courier replacement, Cyrillic support for Steam/games" +msgstr "" + +msgid "wide Unicode coverage, good fallback font" +msgstr "" + #, python-brace-format #~ msgid "Edit {origkey} :" #~ msgstr "Modifier {origkey} :" diff --git a/archinstall/locales/ga/LC_MESSAGES/base.po b/archinstall/locales/ga/LC_MESSAGES/base.po index fd9bacfd..ec8b2b50 100644 --- a/archinstall/locales/ga/LC_MESSAGES/base.po +++ b/archinstall/locales/ga/LC_MESSAGES/base.po @@ -2125,6 +2125,23 @@ msgstr "" msgid "Firewall" msgstr "" +#, fuzzy +msgid "Additional fonts" +msgstr "Taisclanna roghnacha" + +#, fuzzy +msgid "Select font packages to install" +msgstr "Roghnaigh cé acu beannaitheoir atá le suiteáil" + +msgid "Unicode font coverage for most languages" +msgstr "" + +msgid "color emoji for browsers and apps" +msgstr "" + +msgid "Chinese, Japanese, Korean characters" +msgstr "" + #, fuzzy msgid "Select audio configuration" msgstr "Sábháil cumraíocht úsáideora" @@ -2315,3 +2332,9 @@ msgstr "Criptiú diosca" #, fuzzy msgid "Select a flavor of KDE Plasma to install" msgstr "Roghnaigh cé acu beannaitheoir atá le suiteáil" + +msgid "Arial/Times/Courier replacement, Cyrillic support for Steam/games" +msgstr "" + +msgid "wide Unicode coverage, good fallback font" +msgstr "" diff --git a/archinstall/locales/he/LC_MESSAGES/base.po b/archinstall/locales/he/LC_MESSAGES/base.po index 6442a1fc..cdbffbcc 100644 --- a/archinstall/locales/he/LC_MESSAGES/base.po +++ b/archinstall/locales/he/LC_MESSAGES/base.po @@ -2077,6 +2077,23 @@ msgstr "" msgid "Firewall" msgstr "" +#, fuzzy +msgid "Additional fonts" +msgstr "מאגרים נוספים" + +#, fuzzy +msgid "Select font packages to install" +msgstr "נא לבחור איזו מערכת קבלת פנים להתקין" + +msgid "Unicode font coverage for most languages" +msgstr "" + +msgid "color emoji for browsers and apps" +msgstr "" + +msgid "Chinese, Japanese, Korean characters" +msgstr "" + #, fuzzy msgid "Select audio configuration" msgstr "שמירת הגדרת משתמש" @@ -2269,3 +2286,9 @@ msgstr "הצפנת כונן" #, fuzzy msgid "Select a flavor of KDE Plasma to install" msgstr "נא לבחור איזו מערכת קבלת פנים להתקין" + +msgid "Arial/Times/Courier replacement, Cyrillic support for Steam/games" +msgstr "" + +msgid "wide Unicode coverage, good fallback font" +msgstr "" diff --git a/pyproject.toml b/pyproject.toml index f758c745..cffb51e0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "archinstall" -version = "4.2" +version = "4.3" description = "Arch Linux installer - guided, templates etc." authors = [ {name = "Anton Hvornum", email = "anton@hvornum.se"}, From 7d10f9e08b122ae34d4aff998f7dcb6d5d43357a Mon Sep 17 00:00:00 2001 From: "Dylan M. Taylor" Date: Tue, 21 Apr 2026 01:18:25 -0400 Subject: [PATCH 37/38] ci: Strip Arch pkgrel from Repology versions in Renovate config (#4453) * ci: Strip Arch pkgrel from Repology versions in Renovate config * ci: Use .+ instead of .* in extractVersionTemplate Co-authored-by: codefiles <11915375+codefiles@users.noreply.github.com> --------- Co-authored-by: codefiles <11915375+codefiles@users.noreply.github.com> --- renovate.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/renovate.json b/renovate.json index a8949fba..6c96b629 100644 --- a/renovate.json +++ b/renovate.json @@ -18,7 +18,8 @@ ], "depNameTemplate": "arch/python-{{{depName}}}", "datasourceTemplate": "repology", - "versioningTemplate": "loose" + "versioningTemplate": "loose", + "extractVersionTemplate": "^(?.+)-\\d+$" }, { "customType": "regex", @@ -29,7 +30,8 @@ ], "depNameTemplate": "arch/python-systemd", "datasourceTemplate": "repology", - "versioningTemplate": "loose" + "versioningTemplate": "loose", + "extractVersionTemplate": "^(?.+)-\\d+$" } ], "packageRules": [ From 03b245a77a1c2608c9f792266dea18b093a76d84 Mon Sep 17 00:00:00 2001 From: Softer Date: Tue, 21 Apr 2026 11:36:29 +0300 Subject: [PATCH 38/38] Set console font automatically when selecting language (#4356) * Set console font automatically when selecting language Add console_font field to languages.json and Language dataclass. When a language is activated, setfont is called automatically, falling back to default8x16 on error or for languages without a custom font. Also activate translation when loading language from config file. * Support FONT environment variable for console font override When FONT env var is set, use it as the console font instead of the language-specific font mapping from languages.json. The font is applied at startup and preserved across language switches. On exit (success or failure), restore the console font to default8x16. * CI checks fix * Try to restore original console font with setfont -O * Fix for pylint * Restore console font before Textual exits application mode Move font set/restore into Textual lifecycle to prevent color artifacts from 256/512 glyph transitions. Apply FONT env var and language font in on_mount, restore in _on_exit_app. Skip font change when loading language from config (set_font=False) to defer it until TUI starts. * Fall back to language font mapping when FONT env var is invalid Add _using_env_font flag to skip mapping only when FONT was successfully applied. Show info message after TUI exits if FONT could not be set. * Use tempfile for console font backup files * Fix linter errors: use mkstemp, close fds, add @override * Fix ruff formatting * Move font state from module singleton into TranslationHandler * Refactor font handling per review feedback * Make font methods members of TranslationHandler, skip on non-ISO * ci: trigger tests * Move running_from_iso import to module level No circular dep, simpler than per-method local imports. * Add explicit ISO guard to restore_console_font Matches the existing guards in _set_font and save_console_font. Behaviour was already safe implicitly via _font_backup=None, but the explicit check makes intent obvious at the call site. * Skip apply_console_font off-ISO * Use list form for setfont SysCommand calls --- archinstall/lib/args.py | 1 + archinstall/lib/general/general_menu.py | 6 +- archinstall/lib/translationhandler.py | 106 +++++++++++++++++++++++- archinstall/locales/languages.json | 2 +- archinstall/main.py | 6 +- archinstall/tui/ui/components.py | 10 +++ 6 files changed, 124 insertions(+), 7 deletions(-) diff --git a/archinstall/lib/args.py b/archinstall/lib/args.py index 20ff37cf..79441a06 100644 --- a/archinstall/lib/args.py +++ b/archinstall/lib/args.py @@ -143,6 +143,7 @@ class ArchConfig: if archinstall_lang := args_config.get('archinstall-language', None): arch_config.archinstall_language = translation_handler.get_language_by_name(archinstall_lang) + translation_handler.activate(arch_config.archinstall_language, set_font=False) if disk_config := args_config.get('disk_config', {}): enc_password = args_config.get('encryption_password', '') diff --git a/archinstall/lib/general/general_menu.py b/archinstall/lib/general/general_menu.py index ad85c14b..257b61e5 100644 --- a/archinstall/lib/general/general_menu.py +++ b/archinstall/lib/general/general_menu.py @@ -105,9 +105,9 @@ async def select_archinstall_language(languages: list[Language], preset: Languag group = MenuItemGroup(items, sort_items=True) group.set_focus_by_value(preset) - title = 'NOTE: If a language can not displayed properly, a proper font must be set manually in the console.\n' - title += 'All available fonts can be found in "/usr/share/kbd/consolefonts"\n' - title += 'e.g. setfont LatGrkCyr-8x16 (to display latin/greek/cyrillic characters)\n' + title = 'NOTE: Console font will be set automatically for supported languages.\n' + title += 'For other languages, fonts can be found in "/usr/share/kbd/consolefonts"\n' + title += 'and set manually with: setfont \n' result = await Selection[Language]( header=title, diff --git a/archinstall/lib/translationhandler.py b/archinstall/lib/translationhandler.py index c7ce959b..093ca6de 100644 --- a/archinstall/lib/translationhandler.py +++ b/archinstall/lib/translationhandler.py @@ -2,10 +2,16 @@ import builtins import gettext import json import os +import tempfile from dataclasses import dataclass from pathlib import Path from typing import override +from archinstall.lib.command import SysCommand +from archinstall.lib.exceptions import SysCallError +from archinstall.lib.output import debug +from archinstall.lib.utils.util import running_from_iso + @dataclass class Language: @@ -14,6 +20,7 @@ class Language: translation: gettext.NullTranslations translation_percent: int translated_lang: str | None + console_font: str | None = None @property def display_name(self) -> str: @@ -31,10 +38,18 @@ class Language: return self.name_en +_DEFAULT_FONT = 'default8x16' +_ENV_FONT = os.environ.get('FONT') + + class TranslationHandler: def __init__(self) -> None: self._base_pot = 'base.pot' self._languages = 'languages.json' + self._active_language: Language | None = None + self._font_backup: Path | None = None + self._cmap_backup: Path | None = None + self._using_env_font: bool = False self._total_messages = self._get_total_active_messages() self._translated_languages = self._get_translations() @@ -43,6 +58,65 @@ class TranslationHandler: def translated_languages(self) -> list[Language]: return self._translated_languages + @property + def active_font(self) -> str | None: + if self._active_language is not None: + return self._active_language.console_font + return None + + def _set_font(self, font_name: str | None) -> bool: + """Set the console font via setfont. Only runs on ISO. Returns True on success.""" + if not running_from_iso(): + return False + + target = font_name or _DEFAULT_FONT + try: + SysCommand(['setfont', target]) + return True + except SysCallError as err: + debug(f'Failed to set console font {target}: {err}') + return False + + def save_console_font(self) -> None: + """Save the current console font (with unicode map) and console map to temp files.""" + if not running_from_iso(): + return + + try: + font_fd, font_path = tempfile.mkstemp(prefix='archinstall_font_') + cmap_fd, cmap_path = tempfile.mkstemp(prefix='archinstall_cmap_') + os.close(font_fd) + os.close(cmap_fd) + self._font_backup = Path(font_path) + self._cmap_backup = Path(cmap_path) + SysCommand(['setfont', '-O', str(self._font_backup), '-om', str(self._cmap_backup)]) + except SysCallError as err: + debug(f'Failed to save console font: {err}') + self._font_backup = None + self._cmap_backup = None + + def restore_console_font(self) -> None: + """Restore console font (with unicode map) and console map from backup.""" + if not running_from_iso(): + return + + if self._font_backup is None or not self._font_backup.exists(): + return + + cmd = ['setfont', str(self._font_backup)] + if self._cmap_backup is not None and self._cmap_backup.exists(): + cmd += ['-m', str(self._cmap_backup)] + try: + SysCommand(cmd) + except SysCallError as err: + debug(f'Failed to restore console font: {err}') + + self._font_backup.unlink(missing_ok=True) + self._font_backup = None + if self._cmap_backup is not None: + self._cmap_backup.unlink(missing_ok=True) + self._cmap_backup = None + def _get_translations(self) -> list[Language]: """ Load all translated languages and return a list of such @@ -57,6 +131,7 @@ class TranslationHandler: abbr = mapping_entry['abbr'] lang = mapping_entry['lang'] translated_lang = mapping_entry.get('translated_lang', None) + console_font = mapping_entry.get('console_font', None) try: # get a translation for a specific language @@ -71,7 +146,7 @@ class TranslationHandler: # prevent cases where the .pot file is out of date and the percentage is above 100 percent = min(100, percent) - language = Language(abbr, lang, translation, percent, translated_lang) + language = Language(abbr, lang, translation, percent, translated_lang, console_font) languages.append(language) except FileNotFoundError as err: raise FileNotFoundError(f"Could not locate language file for '{lang}': {err}") @@ -127,12 +202,39 @@ class TranslationHandler: except Exception: raise ValueError(f'No language with abbreviation "{abbr}" found') - def activate(self, language: Language) -> None: + def activate(self, language: Language, set_font: bool = True) -> None: """ Set the provided language as the current translation """ # The install() call has the side effect of assigning GNUTranslations.gettext to builtins._ language.translation.install() + self._active_language = language + + if set_font and not self._using_env_font: + self._set_font(language.console_font) + + def apply_console_font(self) -> None: + """Apply console font from FONT env var or active language mapping. + + If FONT env var is set and valid, use it and skip language mapping. + If FONT is set but invalid, fall back to language font. + If FONT is not set, use active language font. + """ + if not running_from_iso(): + return + + if _ENV_FONT: + if self._set_font(_ENV_FONT): + self._using_env_font = True + debug(f'Console font set from FONT env var: {_ENV_FONT}') + else: + debug(f'FONT={_ENV_FONT} could not be set, falling back to language font mapping') + if self.active_font: + self._set_font(self.active_font) + debug(f'Console font set from language mapping: {self.active_font}') + elif self.active_font: + self._set_font(self.active_font) + debug(f'Console font set from language mapping: {self.active_font}') def _get_locales_dir(self) -> Path: """ diff --git a/archinstall/locales/languages.json b/archinstall/locales/languages.json index 1cc5cda4..2dbcf3b4 100644 --- a/archinstall/locales/languages.json +++ b/archinstall/locales/languages.json @@ -169,7 +169,7 @@ {"abbr": "tr", "lang": "Turkish", "translated_lang" : "Türkçe"}, {"abbr": "tw", "lang": "Twi"}, {"abbr": "ug", "lang": "Uighur"}, - {"abbr": "uk", "lang": "Ukrainian"}, + {"abbr": "uk", "lang": "Ukrainian", "console_font": "UniCyr_8x16"}, {"abbr": "ur", "lang": "Urdu", "translated_lang": "اردو"}, {"abbr": "uz", "lang": "Uzbek", "translated_lang": "O'zbek"}, {"abbr": "ve", "lang": "Venda"}, diff --git a/archinstall/main.py b/archinstall/main.py index ac072b0e..cf0e42f6 100644 --- a/archinstall/main.py +++ b/archinstall/main.py @@ -16,7 +16,7 @@ from archinstall.lib.networking import ping from archinstall.lib.output import debug, error, info, warn from archinstall.lib.packages.util import check_version_upgrade from archinstall.lib.pacman.pacman import Pacman -from archinstall.lib.translationhandler import tr +from archinstall.lib.translationhandler import tr, translation_handler from archinstall.lib.utils.util import running_from_iso from archinstall.tui.ui.components import tui @@ -95,6 +95,8 @@ def run() -> int: print(tr('Archinstall requires root privileges to run. See --help for more.')) return 1 + translation_handler.save_console_font() + _log_sys_info() if not arch_config_handler.args.offline: @@ -159,6 +161,8 @@ def main() -> int: _error_message(exc) rc = 1 + translation_handler.restore_console_font() + return rc diff --git a/archinstall/tui/ui/components.py b/archinstall/tui/ui/components.py index 3163d4ca..c51d35f9 100644 --- a/archinstall/tui/ui/components.py +++ b/archinstall/tui/ui/components.py @@ -1272,6 +1272,13 @@ class _AppInstance(App[ValueT]): super().__init__(ansi_color=True) self._main = main + @override + async def _on_exit_app(self) -> None: + from archinstall.lib.translationhandler import translation_handler + + translation_handler.restore_console_font() + await super()._on_exit_app() + def action_trigger_help(self) -> None: from textual.widgets import HelpPanel @@ -1281,6 +1288,9 @@ class _AppInstance(App[ValueT]): _ = self.screen.mount(HelpPanel()) def on_mount(self) -> None: + from archinstall.lib.translationhandler import translation_handler + + translation_handler.apply_console_font() _translate_bindings(self._merged_bindings, self._bindings) self._run_worker()