From a7661d168b8bdf9b67fba25a0c9bd69bebf212ab Mon Sep 17 00:00:00 2001 From: Pato05 Date: Tue, 13 Feb 2024 23:56:53 +0100 Subject: [PATCH] systray + try to put in youtube sans without success --- linux/app_icon.ico => assets/icon.ico | Bin assets/icon_mono_small.ico | Bin 0 -> 21509 bytes assets/icon_mono_small.png | Bin 0 -> 1199 bytes assets/icon_small.png | Bin 0 -> 814 bytes {assets/fonts => fonts}/MabryPro.otf | Bin {assets/fonts => fonts}/MabryProBlack.otf | Bin {assets/fonts => fonts}/MabryProBold.otf | Bin {assets/fonts => fonts}/MabryProItalic.otf | Bin fonts/YouTubeSansExtrabold.otf | Bin 0 -> 89576 bytes fonts/YouTubeSansLight.otf | Bin 0 -> 90224 bytes fonts/YouTubeSansMedium.otf | Bin 0 -> 90056 bytes fonts/YouTubeSansRegular.otf | Bin 0 -> 89048 bytes fonts/YouTubeSansSemibold.otf | Bin 0 -> 89320 bytes .../download_manager/download_manager.dart | 1 - .../download_manager/download_service.dart | 3 - lib/api/pipe_api.dart | 35 ++- lib/api/player/audio_handler.dart | 200 ++++++++------ lib/api/player/player_helper.dart | 6 +- lib/api/player/systray.dart | 107 ++++++++ lib/main.dart | 6 +- lib/settings.dart | 11 +- lib/translations.i18n.dart | 6 + lib/ui/home_screen.dart | 4 +- lib/ui/lyrics_screen.dart | 7 + lib/ui/menu.dart | 4 +- lib/ui/player_screen.dart | 69 +++-- lib/ui/search.dart | 6 +- lib/ui/settings_screen.dart | 18 ++ lib/ui/tiles.dart | 11 +- linux/CMakeLists.txt | 3 - linux/flutter/generated_plugin_registrant.cc | 12 + linux/flutter/generated_plugins.cmake | 3 + macos/Flutter/GeneratedPluginRegistrant.swift | 6 + pubspec.lock | 68 ++++- pubspec.yaml | 33 +-- translations/crowdin.py | 53 ---- translations/freezer.json | 226 ---------------- translations/old_languages/ar_ar.dart | 212 --------------- translations/old_languages/de_de.dart | 236 ---------------- translations/old_languages/el_gr.dart | 244 ----------------- translations/old_languages/es_es.dart | 235 ---------------- translations/old_languages/fil_ph.dart | 192 -------------- translations/old_languages/fr_fr.dart | 251 ------------------ translations/old_languages/he_il.dart | 193 -------------- translations/old_languages/hr_hr.dart | 195 -------------- translations/old_languages/id_id.dart | 239 ----------------- translations/old_languages/it_it.dart | 232 ---------------- translations/old_languages/ko_ko.dart | 188 ------------- translations/old_languages/pt_br.dart | 169 ------------ translations/old_languages/ro_ro.dart | 230 ---------------- translations/old_languages/ru_ru.dart | 232 ---------------- translations/old_languages/tr_tr.dart | 235 ---------------- .../flutter/generated_plugin_registrant.cc | 9 + windows/flutter/generated_plugins.cmake | 3 + 54 files changed, 453 insertions(+), 3740 deletions(-) rename linux/app_icon.ico => assets/icon.ico (100%) create mode 100644 assets/icon_mono_small.ico create mode 100644 assets/icon_mono_small.png create mode 100644 assets/icon_small.png rename {assets/fonts => fonts}/MabryPro.otf (100%) rename {assets/fonts => fonts}/MabryProBlack.otf (100%) rename {assets/fonts => fonts}/MabryProBold.otf (100%) rename {assets/fonts => fonts}/MabryProItalic.otf (100%) create mode 100644 fonts/YouTubeSansExtrabold.otf create mode 100644 fonts/YouTubeSansLight.otf create mode 100644 fonts/YouTubeSansMedium.otf create mode 100644 fonts/YouTubeSansRegular.otf create mode 100644 fonts/YouTubeSansSemibold.otf create mode 100644 lib/api/player/systray.dart delete mode 100644 translations/crowdin.py delete mode 100644 translations/freezer.json delete mode 100644 translations/old_languages/ar_ar.dart delete mode 100644 translations/old_languages/de_de.dart delete mode 100644 translations/old_languages/el_gr.dart delete mode 100644 translations/old_languages/es_es.dart delete mode 100644 translations/old_languages/fil_ph.dart delete mode 100644 translations/old_languages/fr_fr.dart delete mode 100644 translations/old_languages/he_il.dart delete mode 100644 translations/old_languages/hr_hr.dart delete mode 100644 translations/old_languages/id_id.dart delete mode 100644 translations/old_languages/it_it.dart delete mode 100644 translations/old_languages/ko_ko.dart delete mode 100644 translations/old_languages/pt_br.dart delete mode 100644 translations/old_languages/ro_ro.dart delete mode 100644 translations/old_languages/ru_ru.dart delete mode 100644 translations/old_languages/tr_tr.dart diff --git a/linux/app_icon.ico b/assets/icon.ico similarity index 100% rename from linux/app_icon.ico rename to assets/icon.ico diff --git a/assets/icon_mono_small.ico b/assets/icon_mono_small.ico new file mode 100644 index 0000000000000000000000000000000000000000..9550e09113db7ba5db819f44bbda2584064b82a9 GIT binary patch literal 21509 zcmeHPziSjh6rNZl_y;H{B1Qy>bp)}nQwdn8SZXVXSfopJmgz)$D{U0dLbMUVBG?JR z*6vV*L+)~S%N4;N;r!m|!ZN!v_l}+2>@MGh@9t)9ZsyIG@4cNjvxzYa_}SPncwRNb zo5mbB#;gITGLHeNpFVE74?GRD86v|-mCvnYOG&uL&A_@uP$8``}r z2s=s}259#LxZdmarc@Qd5Be9M`U%)ErcULzuzx8uKj?D}_*HXm;@{(T0sK5{2sgsf zD2k#5?X_Fe4t>6F5I@4vie}#0Ht6p|!}wX%&Rx@v{P^<>@V=6IUDRhx&18LsL)vP(K=-xY|%Z)Q?LWntJMo`qAjb)n*R;)MbDAF!p~gkH=#J zE*}B$UT;-j%jRbq6`23}WtjgRp3?@$!`Izb~-wx2{_`^!=;-e&5LYrYUH*+a`}*?C-*_ zUITj#!U=nhdCK5r*8YYzE>@*o==e;2Jh?sflRJMGzj+7T2RcAi{K#cT+5WXZ8jY6Z zIuC9xk)M=4xc}q#8S+DZoNG$NlUdhy>WBKFemrYHU;aV=%Dp~h{9*iI{3$N}{6>sg z{-0mmVt$dzFC-6?|7r6I*e5@k{J3)ED%O{szgLk1pH1Y)f4wC?etu5+*2D9DhIsp| z1~J#?Psz^?FqfnAa^P!^{;oBMpEsRO$GO(?@!EX>4Tx04R}tkv&MmKp2MKrbAFB6^c+H)C#RSm|Xe?O&XFE z7e~Rh;NZ_<)xpJCR|i)?5c~mga&%I3krKa43N2zhxVwk9s$1J#dwx~-JhdJ%~=cxh{UtZFm2)u;^|G> z;Ji;9VMSRbJ|`YC>4LCuVzld|SV+-%+{ZuU`XzEHI{4H2e1h>~wN*Y!;P`00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNlirueSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00M_eL_t(|+U?vsXcR#l$MNs(c~KEzM>q{w31VTbU}Yh` zz{0{S1Uny~jd0jVAQ8dFCSVf_TR{{Ag-fB3PJDDi3bl}k8dlVEayg0XWzVt5bxF*e z>_syEez35`f9G~T%!^yt$T^2kMn*=c)oO7RMHhkdz)qmV+Q~Oy92hdjd`#1n!NI{5 zFN%DDn$0H8xjVo~)^vax8O z?EwMB-JVn^P-uw+R8Ut_RuO0#xDR9kTAUo%V~nW+X9cvxUNX<~Pu=r30@56$2uMHz z5|DrdBp?BKW>dLbUf(@WLIGM=U|SoUa}TYxb>NbKmd=sxp&_O@Na=ZqwODxh7D_rk zMcywC8;u5W98QOun3$kit*%_?obx({hlhh2I%%4EJ-2rcnwgo|1#Aw;XfjEXc9CA@iP^;AfI28&|(eK3`=Xu@+2GoO=&wz%QCTT@L0uqpb1SB8< z2}nSSfCMBU0R;in3GCVPqJbs@!fD2FJY6)mf7%;kZd+@g0cU`Nz+R8bJ^;`A^sw82{T_9eg->RT=Xw61QmK%pY4Jc^q_@D3 zwRXxA=&3QLFJG>*)*ki*nli?mTkU23hiBc-J`NY(d-(n@_Cb$;S&zDVeFS;|y!WWP zyXrv3m@mLl;3e>DiIQpHf^%-XUpmH^cK05hEVEDh3S3E&WbAK$<2Od&;9Q)H8Gir( N002ovPDHLkV1oI?60ZON literal 0 HcmV?d00001 diff --git a/assets/icon_small.png b/assets/icon_small.png new file mode 100644 index 0000000000000000000000000000000000000000..a8f2f3cd8ddbb20b8085911404dd8e56562d9412 GIT binary patch literal 814 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@ZgvM!oCO|{#XuSa7#UhB#ep2A2c9mD zAr*7pUO(*}QYdk((AZZ}+=;DhBG1C8D~b~rUde0XXxw6`?AN_d9QL7qM4`PiF6Yc~7ls!Aa$x z6K1>v3eB?E!7X%oukRO!{L@{EhIenf@PAoW!mqNddiIOPxan_NkCfyK+g@0GHx;73 zDzbn9qW=8fr%<6u)e;b){yB>$oXL|*7 z=+0ep*)p8?MM|U=a@t<-d~O2tNYtLA(Ki0;Q@n+N9IaElAeYarR0Jy9a`!$DP!HGk zZ4ODBw)V=cP}t84vFmo(7U!g0KwD14U*Uy#>dquN51;R57nyUl-nK*B-Bv3I5n8Lg zAF3);R2ky#sK9c5h*>XtlOaN%=1M~}24r2fP}zKYiuYstyP%MZ65GQMbjKv8#TQ!S zGG0#I4Wu+azTyBm{!$V9tP9MlTaGQ@`g`kuVWSU0A=EA4q(*3RxH*&JHBX zwL=!(?@e3bw11uekee^CYJ>j9_eww$ymnQ}0Zmx?WqvC#0{4B;1bW=0_~mv#2WJ0A zXJU>e{5@=;lX9B9-~Ox4g*T~g+51!7vNj&@sg`?oK3bUfK<^rl1&0oszbXICxBi~N z^Hly&-xU5(=S^ihcHP)*9wN4@()rKY$#HuV@12%h*Yc#k;_#jCJ2WzD-$*?Bw0@r9 hd+A5{e`eqR$NHVi?f=Qlxn-bK@9FC2vd$@?2>>6QagqQ4 literal 0 HcmV?d00001 diff --git a/assets/fonts/MabryPro.otf b/fonts/MabryPro.otf similarity index 100% rename from assets/fonts/MabryPro.otf rename to fonts/MabryPro.otf diff --git a/assets/fonts/MabryProBlack.otf b/fonts/MabryProBlack.otf similarity index 100% rename from assets/fonts/MabryProBlack.otf rename to fonts/MabryProBlack.otf diff --git a/assets/fonts/MabryProBold.otf b/fonts/MabryProBold.otf similarity index 100% rename from assets/fonts/MabryProBold.otf rename to fonts/MabryProBold.otf diff --git a/assets/fonts/MabryProItalic.otf b/fonts/MabryProItalic.otf similarity index 100% rename from assets/fonts/MabryProItalic.otf rename to fonts/MabryProItalic.otf diff --git a/fonts/YouTubeSansExtrabold.otf b/fonts/YouTubeSansExtrabold.otf new file mode 100644 index 0000000000000000000000000000000000000000..9a2b70ce3197ce6b43bce53376ce07c7e40d5026 GIT binary patch literal 89576 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¥Ray6 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 literal 0 HcmV?d00001 diff --git a/fonts/YouTubeSansLight.otf b/fonts/YouTubeSansLight.otf new file mode 100644 index 0000000000000000000000000000000000000000..e2b8bc110039ed33c65697c44d9589397030470c GIT binary patch literal 90224 zcmeEv2Vk4U_4s|C*9E8xZA~dNjIs$?ghE+KNFWfBki8QRdCHQkWm%SNS)R!yaV*QS zEZedy+wzE4oMo~TLJ|njunT3C0%f$ULO;1O@PBvTrx6MXfrelBgKX*6yZ7F`yYKGZ zyYbDOJ9j1;fh;HrojrN#)R8yNIj|X_vpWzs?a`TYZXBC=G-eG#9D>ivYk=>Bbcl!=j2;62v+%tlJzHz|yAFKZVl6^3!`X=j6<0V5 zB9I@xv5LfO*}q)Byc7UdA`~@3rPOGF5BQv20Y4)dSs;Drv$vmF@ypvjLs3!h(9~CI zp0o$uFJJlcrsxNw&xLRl;%O{=AWziRFJpmEjTj*oK=M<7LWE|qUlhfC%zcVt5aL(! zJ0NL|=yI>2FkV5%D;}KO(|^Muh*& z2>)3T{$E7+<0JfMNAP(L<1-3z(IbHO<>*O}IrVesJb)7YJURniBl)AywcJF>9}Oj( zBKc!bG^&^Uu^^>9$sZRHk0bmeBK&7W_|J^+pB3T%MT9>-!hd!IpXX3M7b$gfbxE?3 za}pIAv!k!JQq-rC}i%(g36y>ESm8 zjk@fzTfe64l+RngNpyfFBmw#)(Dn|k1YD@Cv(A=xS(1 z*P`pt_2>rR@nAf=w|c>DATRzkLWgZJGuki2~XlgGzm&{H?*>;P}Y0V zG;|-j9~gK5%|J8Zaeoj>I0x!?9-5C9poPHnVzdM;Ma!TiuRtrIwv$jYlvIXNSygAC zOq2zZ$%a-y<(dPs&>$_e4?W6729UE6(H687Z9{|TA+#OsKs(Vcv>WX~d(l3$A3cl?phwU_bO;?rkD|w* zKY1KI0Z-YV&{6ahdKx_g{pxe*dGrGMGkOudg#LnFMz5e((QD{+^jGu-`Wt!^y@lRJ ze@E}2chP(3ee@6XPxJx$5PgI`MxUU6p-<6g=-)_y{&xud2L;eD`W$_MzT^P95ZVWe`yNR2?-OT-gyM?=z z`y+Q7cRP0ncPDojH<6pfP3G?Arf^fad$@bK`?&kL>D&X{3~nYji+hlp&CTKFa`U+P z+yZVPw}@NJE#a1O%edv-3T`Er$R%;fTnZ=SQn@rPoy*`dxhzi3WpfHn$*H&;PR(gJ zEvMu3TrOwe@;D=x&zU$gSHM+rHqOH}bA4PtcYu3@JIEd44s(xkk8wx1$GIoDXSuhz zzjN<#?{oj*0^Bh7IrjzkC69QH=lLi;nvdaQ`8Xc)Blt7;Gx@XlU-0q#FZr|ibNFBJ zzvh3#C-CR;zva*4f5)HCU%+3>U&mk1-@uRN$M9qMaeP0&ainKt_m^MN2jJ%?;O8gc zr~Cwb`PU!y-`+2O{yUKbc7OS8|8{-(L;dx9x#3GU{8hnU!GHakzchTA27fa6Tkt>l zoA#ynch8sX?~5Z}9C`hf*PmuO5gP=4{`pw~KS>F&dH*+;oI}w}Nj*oJgM?>Npt)Y- zzX16!#`7e$pfffI`@4{$J%tbKG_~e)H`^yi{As11D#;-Ul504s5v0<`tB}^{p z#Aq^16lTF>AO#ftTvUjPQ3YCu>@eAG1hu{eRQYaD-#3BEz6+G}gP@E*1M2r{pk#kH z6+0f(=gUDU{=+w_ztfJZ0IvjPHyae$e6EyR#Z_^2Tm#p}b#t4!U7)%?$GrwB>qp$b zxnWRF&jKa%JWxF^2Zi$w{GI&${31S?&*XFYVty50$-8(D-^uraB09+L<`3|H;{VLQ z%D>5f$ou&~6c-g2^^2(UqArfQD(c3lo1*?0H8E;>)V!!AQ7fY|qf}A)sG_LysP$1b zQMFM`QEgEhqP9luiFzdJNYwLDuSLBP^-k0WQJ+SA866WHAN`x?^P@*bUl~0n`qt>X zqNha9h@Ka{G&(6dJz5#9k2XbHqt`||qrK7H(F4(g(YvD$L_ZdNH2Q_;SEJvIelPmd z=r3YoV$O>BRm^!Ym&c5X86R_N%-u0FV&=sxjY*49$LM2>F_xIJn6)wX7*~uZrah)N zW-w-N%#oPqV_u1QGv=e1f5!~RM#Y{Hdv@%(vFFEL9D7CVwXvgPC&b6LHVRy%hIa+?#Rl#(fa?S==y=!e`)f@Ok(Wd?mgCkH>$+6Y)KG2A+pk;0&z7 zx!8)=Vmq$KUfhZM@ix30KY|~}&)}EvU-3KmL;P?2`H1KdXO8&Qh~JGEIpV4jqek2` z;Yk|bB?vXf+LO-7m`MJbmjs#P*|vP_{(%m$ApQIW#nG#Lu8Q>YTvGKE~0 zs%0K##z@p?W$Fw~mP)SEBrCJC6Vvll=`sc6%}}OjeLLqOp{^I$n-LWj9NSt846jlQm#~JWZ43CMBoHQq$5iGPC5_3Z*JXt0 zktvciDp8&(%3K8%92JNh#Fea5gS3+K@&HDy%!1!UwMLdq3z3o`Q-c72zGMtis#8*- zI!z{3}Lft_!igHes%M25lpe6k^w3ipfZd|DJBNNQ!?}!DKaH1q>km#u^hT^4qXs7 zkELj7A@hQ96UFA0C^{39)bOY#vfqiyG-wA|iJ~)^skk0P9N{7o$9_z5#u9tHcI0xe#VHd8E!Qgmjrk|^2l%yb>J zZ?!HPx)7~0GB9(BQZ}1mhrSbfAcp)Vu?#oeJey%xv)?%^UBiCogbS?+d*?`xk4AFm zuzVW!%kWMR>uAEbxhzi0e&<51z!0FG$Ld7Ke&>lr(234GRt6pWokyQk9sQXXSqxod zV4hfQI?-7WW-vGGT@?1_g}sY{kJMsTOe6bU9IAd}$hVlWZVVUg4^va+N?>ayeKM8w zXCD30u^-w#Cy!?$m@HP`WKqJCZx$o}AUd~*&P34>o5#8Hm{1FfTtjdXEn;CM7(03@3yl%!jS=aM5$TN)>5UQT zjS=aM5$TN)>5UQTjS=aM5$TN)>5UabW2KNteXK}*oJen+NN=1-Z=6VPl9)D$ra=)# zPtmEBFcabkw}xBGtpg+VdeHN2Ts3FsYB&d1%Q->ocX9Qg`8RTIu8Enjy<7{|3Nry8 z*Uoitom>~U0cHg~TrV?jZ{!BJO)y8;!foZYaf94L+;(mUw-e?JySY8wUTz<^pL_Ug zOyEy|5&TcwQSK@3Y3>;?hd;+X&%MC?nR}6YiTexpGWQDiD$F=u=l;sQ!TpVUlY5I9 z%-`YOWk&OVaR1~!;68-;$j96#+`qU_xzAu`B5;0g=zn5RzmUI(znH&-AIV?JUk0)_*&k{*TLMao^RkA zc{kq#v$$s7%eU~Yd>ilM+xZTd)phY3_-?)jW_Nvbp@ARZH}RYKE&Nt~8_f0|;uqzroD$E&gr(@BBObyZn3n`}{xnfASx|Z1N-i zWBwEVU;L;1XZ*i;0cMv&{D1fWKg@s5f5CqlggSH`0&kD#jt(bW&4Yn15P z3(>VD=(^vd>)`h#bp6Zd1|u4EHX8LDy0Hq~IE=+2H=Tn~{1WHc!QP5J~)HlVw&L{qLoQ)Z&6(P(M`n))KTM~?3CpnGpd_qL;HIp{tOntm2~ z;2QKmKbr9eG~-Wb<^eS8MfBinXm&Z8^E{fn49$HL&C5sgE7APt(SnQ60xeoN4K4aT zT6_jtd>Ab$LrdqPWfrvj2wHI!T6rH@`EQiyMM=w1axF?3fl_v%)N@f<21?(FGA}_{ zucPdJNLh_?tVn$rXyT~va8Ol-KQe><~`TLQ{h|FV=`9G*|B(kKU zqF7`-7g_&|ie0Egj!Ji;va3!|!iRFQ~QZ9!|EMC%ry$_G%@FHzOU$o43z-j3{E zRMUzaji|N~ISr`pKIFO<)yJaxFHl1%YP2KwgQ&@YJa?dG1@b1Nme)~hE^4bqzCP6c zCF;B#b!|c$UPe8)quzz6Zv*O|gf?D^Hok@i4x&x@X!B^aITvl-jkf#|Z5c#cv(Yvg z+V%w6_6ZtnL=WA79@>w#&qv$0pdDwS9VKYT2WV#=+IbZ1x)<$w4(%>RyFW#HO3;m)E0LQqZeq=+$BLS|56S40?SS zy^(&Y(M&UHxjaue>xgULjTD{femPQ9{T($^u-0} zi?`61FL1D)%;$1Z_i@q5T+C)J_H_=&awBf!&b*vE^8+p(alf3xot?{_a}oEeb=$gEQSLt z951BD3-g6@1cuIE$3W)LWYR2Eei<7#V7xibVAFRcB$zXBMn6{az&^BE{10Wr9l20tVx z0EqXueM(_=3G)~d;U*EwqJS9QDF%bd?}|a!Lk##DF|=72%YyG5lX#sN8WiqkiHpVH z@_-l&NOZm_nHRxVFJqZM5JO1;kx+mW!$eH|rx-eh<&XWBCJ+)VO(>&8RpdC{e~(Z( z9>B=!j0$)N-f0_X?C8Ml9d(MC$uMO~Sz1iMNaikpf6SqsQGh*Rs()#Tc-zFJqM zSw|y5;NZ-qoWb|TFyxYolzh1o%N6-4WKl3XS?rQ^C~=2kvwE*S7mQ1r_@QW_vml{=&4wzU6Sp~A8a=HbgniQ)ThEAWjS>(GLWp3S1ODLA zCr5>ISZs0^bM6iNA`Db&DJ?3q0#IPNU=By?Tl2jZFD~?!wvmpIta}|kuN!;aoizg? zS^G#!xyOn<)~3Rye1L3^XkkjPsy@etRkoaUs!)d6WVty*h0|5W6tXacI;|?(sm8VH zhMZO$-zjnye8GH!fs`2?uJ6#RnS}7A3`0tiq@I0s@>_sPG7UP z+XK0T`GMSU!HoJmlirH;)|@hVD4&{WE46m4wdd8D-Pr6dX(Qc1dhxV>-4hw$-O~*WZL@s?bES+dhLVt^Kt!r_p;_xNZZ~J z<}vfA`UT@F*!YU|ujFk^-nRd>;T7EQO6v>VM*(svg#?1H1?C3nHTSy*>-XaNz0ODM zk74^`l}E^vA$m`gKW=>tTOTWUB!4f?-)k7u^;0ayFum@nt#>xuf*WqJ-$X`ZGTM5R z@fK{nMSW-HRLU8Jj2E62#`{x%;8WMJj05e=nesk!gqVKjn#8_35R=M+L^zYV@Mtqx z2gG0?2)&F&3lj8{>sW9=$(*O&2PfWtn=nJzNy{0yghflw9}&bLbr@=h2VN-<3koBd zJ5LG*#9$~Ho@#)mK(uJrKOcw(5<7)>G4mnj+$!ar$wJ*?XlX!%fpXHE0pVd`7i4YN z!+-)lDbE5H6lz4M>t85j!*O*rwn@V=Bv24%xuc{S7uzhA1&nPPSwM=)i%W3v*N)1? z$BxRM2pyF!UU;p>{}%Av zxRkLfj6TX-G8|wo2%o_Yi5**@;0g%G`C=_;*$os09%oGZuV)MpvY!P5yJ;}qpYxdiec+vb zu-Da6_<#iQoD8?JC-Q_)@$fwD^hW>8c z-|gN`4hA8~pk<@J3+ubGJc+fz$bMIQb7MPh@Yy#I+NIDBCVN5pJvgmDuZONSKD!pU0tK0gLh9r!CWsGu`QS)}k1L=_Io_%Y-xY zHF~2e$eHbcYgg-5+`6T^f9nRkb;F*H!)=f@CZb?tQtzF+d=g$hNp};uHkgmx*fe$1 za=dBzUhR`1&dC0Rr6i?Z(S@_SOpzLHhpo-!#dTh{yQL1d)cI_kp*$N%dr7Mqx0v0A zIyJ6S+ms|TL}aNcC0hY%Xo@MU>&5%$3X|!qLU1sZ3~F6!NXB_$oxLwIA6WHy9E*Uu zqK#myf7U?4mR`?xawtS#o26gdg|%Io%}I5^$PQPFr-3%}>J6k9liuPkqYoR~v>t^E zXS>pEVTq=YjFM~<&NgZF#vE)^70XFFCh7L91{H2lw&*)eL7a)^Or2JawerGLvLYBs zW_p%xNyl5#59B>V@H6B<mpZ_DS@ENm4@5k=_ z_Q%PeLxlDf4I27zZeNa%w#P=9JXhRSxhp9`T~(Cin6=of zH5fEztTwAkvO^g_pEyP1J@H?Aiu8!@ssXL>J5LQq{@eWV!UNEx0yg0y_SAxgeHrr* z=<%U)0-ptzi3y(tL`{M`24T<`{qg=^(Z(pLgs;=8hp(jbiNV0c6F>l-hu9z@*a9L0 z0b4*~V3tHz5E%%3CP)lWl_lOkLbyk`jiQHPC)kRJdtF173$J(8xawTE&gE`|i4=gq z2lsZgb=G&_`i|;u+QEpCWUp~cdIwJLSnQe+!jeU@%avBFuqw>ibjsbaB1~bhYqx8E z2yzg*gJwPU=pES+-GR1D%Z44jMxhN7QmD1sd;>NbEQZoNTwH z18;Nm*L5-DggCFE`LWWNQIJxElZ%qel0zBpCJ(sgci?#)iJP%x1x9<6_x;HSx>=6wphSFt6jb0O|r2)gP$p$zF2nI#HbqA1c77_m9e zXw3}~(h@_hsTG@AO1j7Z%^<8{6&1AFMCi2{n-@3TAIdm`EHR{};MA17xnv3^Q{40V zQ*eLEj@&~b5V9v>IZ1P=yKqit!4|SN#LqtGmbMPu+R^743;}N^{iaq0Zq2SuB=bX% z^9mEy*;t*OYFZkCjQ4-;|0^9H0;{AE`fe&m8kUSIN5t?U;g2j{U?VgkhXP`lB?o%^ z9|I2I;^E(jnPCD-kq8(0X+*sLQ{kD=7~~`kYns+z_ZrVSPZjp8ciS7CxUtsN;P7IH zx2hxJIUBI{8oRI&G}~n%&9>Xw+EnkuE;{6gHQR%^gDIUjxnr(tD&u~+$N-TFA;7#9 zRL^lk)Q~HjFC|iEFWF-4G~$jtR|Z)e5>;lYy1;-748{U|3Dy;B%9)9TYPC#qLN#>* zk5Xh)B9Lt(eMRjC?8~i7ix`j6OL7YGu-TAXs4l@dCGzq##^R_TGG;UIzaV^OPUs`u zm0fn+Rozv$p$WKAM6_*%QDw=Y2$bdF0qt%wr!8qWPTH-1mi!~c{(DW&4(!DPdk?m~ z#Q3F@+DL1Kw*-4j+6sNt7Sy?2EDKG`^vLT})nE(Ct_&Mqt|E8I7f;8FrmM%0KwJoS zAhz|U-LvrSSQ3 z_LC<I`3(?H;d;-YS&1SL&$h*0-!Xt1ev{7`~0l%Mbr*-|-R#~bbK4!4Vz zRCtY{2;3!72rAQ*I86>nlQJ4Kl;xM1DzK?MzrwT{=dU)b)-f2GHi^vkCGN$Ed!g~X zLo?Dy@@UOo_aJr;w)OP3;@+0cwPAhhFga*GK<6WojVHY^)0tI`vuvrAVTExtnVhw7 zI$kh6XY4VJC#r42o*8)0jA!NVh1iH6nk$SK-UIGwZy}c8J?4h&4Y#u(SbN0Ojm)K; z4GRlmIG8NeQZTbXam5R(g&SDyNZs7m0mlmmHBi1RyJvk1 zUhiGoLYO}5H#6EnG{a($o zp0B|SnKhjwELM0WAbKSIC@?I%FDASryv;nf(R@(Te+qzgnWBRZmbyWHB4q$m0Ji+& zKTpg=qz3u26da2C@2v4dFS9&BAqJm4%kT~c48N3|VDXD#GAurvL3l~Z6GgDV>fuKj ze1P~x&m@U9;}aUdvBdt)fc<9-i=L-~j2_zzhF@i1!*PDm^A((T_y=D~*m=114I;!) z2{9x>jQVejAH|CgPwg5@@K`cczIX;+{D2zFYhj>3OzZfaGw{v_j>_L8_)T)OYv-eQ zIC^tJ${xeBBG_uS7xH@k7qzP6*V+(7o_3@pGK=esA8>q8*d8z#vX;FS6Ea$sDV zO6Il6_Cj^{2CG}tLWSQl-b5CUl7}0&^x-Xio_*x$5S~MZ?Xq4h>wT~Rtb$PQbEF)R z^-TVIbn7C%@>VNuwKkbudhF8M6cHNdLUW2zg%zr#g82+*a99**`-mU9#sA9n&?W;D z-(+H@+~FtccW>-Fi2DvUzDV8=G576+io7=u&cK5+j%2)223Z9Xfae!H&2)?#zFx@s zpNTj0G>QF!aHS+H>eP@LVqZh)UlSN$^q&+{17n0;EDS+{2VFfao?h(faSTvX4f|kn zIB$DuFHY@Q&@hcjOin@J8(9mh#ab96B~b^|vBEYDZq+!`BTRuy3(|7v{6DQ=8ABG# zA#8>$@%{>7O@6|YWDiVx@j#b*Fv1ctXdX~(z>2QLol`o3yk$9+PHipL*5%m@6Pt7*QFJ;O@+^g#=u&biJtiBZ2m$-{P7C`0}M?`=iILoD|RafI2 zo4hhLly5d!W=d7y)NI2_5*~IJ)+cu~<~JB?@^DSw`dku9 z1M7!erNb(n%(5_qT0vBmDmzx$<#ibz;3Zd_7BXHAr#z7hsyX#D@$45K6}$5|2tsY@ zXf%AqzHL|%TiZ1^)qCy?qFJ@<mm9(CN}g^)H}>LjISe)CqpjNT^V58Wug!KeF&B z3I79PIB>!6zeW7P9Cu0yJyL>T85RLaK-9RzTK9MQEexO3Qldrj{xhXva5&ht&SO}GPsQ}%UrKGqpT^h{ z+=6DP3`9W0UL){p5srMJ5c37YV)DIG>VM8)sjSb57d{l;zlusxTnb{V2&|rhOGUsU zNI-CJ4V*_QEjkwSe?&?l%3?A@4ZvTBlo(-VcoAfj)UAS@VF}zC5Is!FgnTN9gX^aO z(UpX+@{gSl+3Lk!A*6AM52l~VE?(#p%&gN3+;xEA&RZxlIvbu346Ly6#GfRj6(n?! z*7ePH?14ES*jgY>#y}nh9}P+BIrt#xS=C(8iYr=*y_RNdY0hiZ)L~6srY)>xX2Qx* zPBB(lHAPymYLM2IA{v_A<7lpKwqZ||H)1ho2kAC7DsY3szLeZg2~tS2E6=I7W1T%` zy@GK;Bj=Nq&_m%YRlbZY4MLJ-uGB6ibaPwH4~HPv>`9Q3Y`fl#^^KNRYO&nlX!SH; zPeW&Qc=_8)JQYo)*j-XzRBOhyrYeJI%AvGKdO?obh}FjI;`9*Ocz?6dQ;=|&>}c-a ziu<=V9wIMd@?zeh)U7ym>tauM{p^0SSd+h6La zFgfVl;p@e|-u{O0M5L88t*S4>uCj(=HyyQFw}w$C`<6MwW6FJGp)Pd=PF;~VliV4? zd0XSmzLmId=Z<6CCdCf{P56}lTM9^N> zUDav#VSAg))8xW#S6lUl5H(n)7A{~ldzC4L5cBwQBKu&%MH0arCR zUG7@!c63yQ_hUIpEpe>Ij@7lRoU3R#_k{CV))uZUSc41Jz=pgK1JLD8pGyKfg&h`K z2dh_DHWexY3!r3MYrr>oqm7)B-xzvTz2UsjaBB1h%VAxxAE*7f;(*yrnWhMRLQX)9?k z;|5c$!KT4gYS^NbO-mPWvy8zWP3VZg<6YHK(Spmp#m$x`T-ao+*HLviyGj;f08I2{ zsv@j}wcR{sM;BUH{$PDX_Ls1q6YPX^)b)!)R1j!5V#HeSe<#6iuXKo;I2~5l#A#<% zce;Di3cEM0uzS-?8HW$Gx?Aj4Y_~e-?oDYAXuMz$F7wl&IYgi)qENGS%9WIVIYU5* zxOt^Z3Q?zz&6 zMOWT|q+k_P%p*<21B$?M7AF1)%ng?CSUKkl%Sx!6#fPp)L<+wIuOzw6YuU3sFhMHSSg@whkOwQAKuR3a7lV(6 zBAaHszcnZUu~?7}K=81&x8rtSUtRcN>mhB$4JP`qhgc{vopL6$$*86V5tDxuPx@HpAs+_w$)ZEZX(DK}|baoW~} zp70PmjV#ost;A_7Vf>~;Y~u_%aIe^{dm=;^)R!f+gX+bq-mi90;VzO6w_oX?(y=N% za=4B6dxZ-E_tC~El!zjwLhD|-QxjH}zJ)@T4i&04;~cX-H=kNd$x((3^mE4Z=NB-S zwKL%=A?JUsd^HQJ{OW|0(oF(laf3~NNaQg1yv`Q+rtBZ9|Bwa$V=YE_E7)lDVVdNC z^P#q0+}1My=6Voku=f)uaM_YnsUs)yVucASOd53_+nFLxHNUvWVbl5#Zl@abP>}E7v<)fajscW5*`4xL|3V`VXaN= zR5t*mPMoN*3_fF9VOue7D{hY%{NsfegvTO!=io2|IY8Js>nO6Syjo^)DsEZ5fl?RN zu>uBlvU;&!56q`|X!7rv8*E#{5lRqAuTs|PajmZ2*kr*?h2G-Ua@<0R%+LXnbYJ4miYUmO9sxq*GwHV8RrhuqcUceZCzV?S;-_ z7q-H*VpSuqXk6V$8X3#2EPs&YKwkv9z;7S9Pl#hwMgHzw$3}Buvee%_Bl09nl9-Zg zMuBUF$1*g5>;0mKCB*x`fCCuN0|{~di&(l4H!OPoBq2KcSVUJ1Unb&-@t?yy_lR(T zsNr9;@KydRm@5$$ekm~~+93QlJjKZUPJjx6!V2fpngS1uxYP;!Q79J^ZV*J>@_s4d z7r_%8XGteJrilr{4U&EkxFt}^vL2xc@%~%DlCV|`1}cZ8*}_LOB3{@g+%H@N z{Ll|3+spf{K5X@wJ$h!CpphO|org|Be3ku#&EcetjAD-Ns}c@Rchb#(s)t0X zG-FDE$^aYpj4ErYXz`UcM2Z;~6{nii*re7M#><P zk4VA)&>$5I^5=yFv$QhRuEKUzo!(=jY*JXg$*i}kuvJx_Do*r{VJx#W$6~~VdHVcp z#@I4Ogk>CXwl_8S=!U&MaY}TIM0ZthbhTnvtEaY&${;9;T`Yf4Oq6~O(L3o*i`L?P zvWqfx44T2>KDrIir))}L6%#?fv%r&In};2A&oCPy7~^y+`%b}|u%EQ`ucr3dphiV$ zk>v$Cb*M@#q^PpUhKp>LYKt9P>;-nS4V!Gnb%qeg43eF?W+Gq-c1H}0x3ZzyfvX*k z^`QJi42`TMwH1yM>?m6jTC zwiN<9S5|JP=ff(+T|VVS^az=?sQj37WtGL%aM-Mz&00i0h_kY$nr9lPEMJ*F zo9>?xBgrJ!?5;%ImAF-NpoHbPl;sc)Ecr|P(^)4XY7x|0P0=+7P0SUf77(;3q>0Hk zA%-PW3b^WDkM0phgqYYw`pUZL*jy{NR|d1fkyI64JGqlQn3t4_lTvkaEA9r!Qn6X|YzDZ2|eEl5B_03sQJUIKXO65XUy*I^dI%6Ga{f2LHigL#ex2 zFqFDROf3=w=9wYl2qXm#iExR6=#dfxOF#r9tHtzdC8Cm8|n+y23_3m~@nS3mb7kW4=pYi}kfyhpHx+mQ$m%Gj+GXUhKfI zU$Bl)#Zk=XwKuY@TP;-`tP&_P4`~wB-3C$J^+c$up$P(>k?ZRg4ES_v9Z4mCq$~Cgj=jzIhJNYHxx~I*l%Gb^F>NKUEb~t8C1& zNJZ3N;4?SU`LI0>ZrK;g7Z~$dLTbNZcf^Uir`-Gc2XOzuZgLju=5x8R%iUyWN)BtVU<_PkufTTD20#&j z^^6Fd`3{r4U_CBapT9OQRI)^pY1SyQMghl=7KKE(xHi?R!d_LkIc(pG7v2>{`9~zc zq2qO~D(tGNt#+`-TSHr2NJpXj7(;kk%9~3(xY$!rZ*XFRQ&|;$QnW;0VJO9hlDrZV z<+Mp01jJHQ)va%+#0`}VYr_i62I47(C%PuTDrXJd?av^K?1k0lDr{PxAE7rvCvVjn zu_muD@;sN^p=mbYWpqef|?lCn;qCxQxe%DHQMT2HMq{+w7xY|8rbMiUT?+q z)@n1!4KhFs#io2K&bJ!M!u#Rk{S$@tbW>;G5@|{!1U)cIr3eETN|PQT=y{ALfcE(v za*3<5bmMG5+UFJA2j3-9BZ1#Ds{2f0-3S@re#?W6|KB`uoD&2@gfo~3V2VSlVZG=) z9uQ+eg`=@kC8YpD(8<=h+au27bQF0FE}ZL9RcBDptHm57Ag*h}L=s{JJ5bs#rBG)h zap#jP0H+^J3Zz!d%U_m-(rd{^Ef^ukbLJE;v zG+M0D7P5mtskQPJE%s`<3PFwANV;lUT5yZEwu|m-?l0`pda=eUcZAi)RVxy_#9iVt zVVB94OV^LpB?hwzn@omcSki;-=hY?`Hn~dNbdO@It;yxWE?1+?OBtgdVB|KTSQx`3 zdWpy&I4oI|MCcUmNgUDz1d#`Tg-b?L{1U#ev}_iP7oHN%ViTH|C8ZwV39k1#JvDA@ zcdu`Zu&Md1EqQKiaOc#7JE2@+SY;@Ky{(2~Jsr^+lf*JmEDiR0o2wGL*43?bh048! zcnlFc-%Mrs);wI4S7W9xuGH%l{u*B$^0^L~M1Hxb7JA zt;AjCEW*wro0;SVWli)YCbI>bEO}xVlR~q@7n%<^15$`O2S|r5;s9cjNL| z3Tk20MU-)awzqH~1hSR%*jwDV#a$~+_8Dq#soPQyHcUfpjy=dyb4|Uo#)WHK>+2&V z++}Iiy0O-s6>$JD1$6xky2Rk2WaEW?pqRKaP={iRX@7|4|5F2AqyavD=sMvYW)q>?5kvefA}MB-3M-Z7$nkY{-O6@3 z_Q?nGcTvb^qzuFLEMv%e{yqfZ{1J$2js)>JjUwb22znMxu%4PDT0-eR1G5v_NVAP9 z=uSK95P%oTg}b!g;=~qbeswOLSJ#PVqePZQ^mj8x8Kh@beYv9)*Oaa=id@7jE3%ei zYe`{+IV7z@Qn0q55|CMv!`a=XVE7J!#0$Qrp%@TJJx~J3H~U0L>2$8x1H-DNI74G6K%6WSX*dfu=s&RJV6DB%LV$?i z>x6tjN&T3IyOx>8aiK~irg_< zXbcr_dN6E!VGQTmgSAlyKJ4}b^13*7` z1L>^nu;X@nM_nhix+p|dk)XF5@mxv^d+yj{+Ad5>kggFcwnm=&tS)9dP$W#j34i!9vJyL- z9xaNv_T&dSCHTIO1kykL9?~D+u%ZwrqyrzvS9E>=KGq1yz=jYD_HJ6|k~$r`p9KTK zXlc=oMgJhR^oVc`oJaHavu*6Kuo7zIWLdG69dM$}3YUC>yre z3M%tM8I}-DDwzmnlO}a6A9<+8>j{BWlj?FC7^zBZR+|;utafWn39c!rEe~t>w@n#s=KjU}x9j z`K;c&2AtQRu`5C#Bq_nQ+F8!_#;q?{6Ix|lZ7M6YTCugLpbX9~()Ix@%e1C&J=RLU13A%P=|l}AYB9z(){CC#2Tty#s9d^ z{^rAlmZ#NB;|DnG3nz6}op7)^^=FO+`%vWx$EqKIjmw5spY&LD>e(6`TK?newFNs| zph~+7=>S4-PA2s~Z0Ydvp*<&Rc;5!iYeSEmsNui~r<+g2P4>{Clp zI0Aku#&LR1KTe?28WMPtb?kz)b__A!|NaAt_D>A$EfgJm7cl1)8af=PqjZC(X4+MX7NKK>r4;N#AVPGj!dhv-dF$DK`` z#@ydDbT4p!Qj@ULxHO8P_@AG;Z+Az-k)aDu$w+a^c38l|-eloind+7e3DS?p;on&m^CvXrPExeRKj=7P8;)jIIa4Az4TjsOTYXKlXi(b4(^B3~( zU`S8~=rP`mYIYH;Q01=*Lk`YwzMbBfE9N7|TRc*WJjo`M+-DfxBSB zH}d=zx&qoq2t0GYZth0>v=@aFPT{`AM=$6p!L21t<_0~k*H>pp+@^p03wr#AgtrP3 zwvb+XdjoE7@HE$T;JOZ5SH%5!eWkFa7F)dejruyQuY(sqgth|soL)~u7jEdXcSo!= z^cHs-+pw`!+XNTrDqI;67wFC)i}GbzSe9j2Ozxuv9WH0Z2(D@S!MGOcBOj{ng-e88 zUN>xmWS4h`w_|N4J%z1W-1?Qva0@dvYOKkT7o<=uS(1pvdCmqYM4e93Ugj&pK8q(G z1lFLdRz@to=*r<%0c_Qq^9*KefE}LUqmxU?a#s@F?VPhD%x6PEOJRoZELAFIdf~U-mY5DwwY7D@o8~Mnef#2xo|0P zbojhebjjI|@uo22X}9A26T1BCRe_#KKJIb|4EsNsyU;#hyXKC&zVcHNN2RdrJ81bo znbtB2&i3*&TO#~b!kWU+4PVX zggr@p_q)eJB*P-xzNqDaPF_`3rDOFu-B`7uU@+oseEXf-d>e3ESATtYl??74%lFA~Tb6T0 z#KGlR13waRu*Co5X*R<@9q*BQiJ6*?ucDlee81=aJ2dy>>k_9U z-^BmM$#%K^)3F=}{2f0(T_?Py@ml}ZQ!)~sG93oCW|aGpce9OhH@Nlq&V%hL0I1kW6gm4GBbjxsfAZ;byGItSx1?~!nhYlGz zd5p2;p;kDN^Wk7SfSWc!gdjvwHFroge6;2!_p zm!H?CPHKHhi18nRhw->F9U1}eBm$sQ`Nq;!!!r};t7<%U++5RG`#*YBjj9;ueABCH zJT~0?)mPP+8?tfZv9GGB&#TqhvA!m!GJJfJzN#imh2^UJRI-HjF7UzM^HnwOQrvXB zSJmWaTf_R@-~A6KG`St^Yw6V*ix_p0iBrA<)2sc|B3+wVjkVmZB^E$AxGqY|<2vSY76}nQaFVPk2Eg?vv-U{@*&X$@s zJN8v~RED+T&7`}e#f)3bjd>0ocIc|L>ojXJgKC2p2GKG>d@t#=x7Op<1}D22PK+e2rS3u(2JUNeZP-wyUk7(Pu_Sg6X0hIg z^+t=DUQCtcPF6kR$1W@$iQ!DYlQW3%<=ZIi)A^Q2$!CHyXscbe7UkNO?d z!Y_uNfsXa~iu{jpyTNdRxHZ&*=sP5`1I($)ETaRt>RD4kuN0Z~S=Qohdvga3HaVgj<>3D;-kR1jOKG zs!acXeZhmjTdF%ho%s^-AuTc7k_5Lqf)f}a28p=d5}ekGM|cC5N{Qm04Ivl|z}-nf z#rW7)hMm-F$>7}wfQ6YwPsJ-!PyH1%!nz?XG_B*>vwlk3^F9;kT^7d|#}7~|nj!f& z8LYnN%>O5}^YnG$&Qm1BAD{(H9?Jaw3ffPovipVGzrVbGfO_o@RGelum7h=}c?9hB zrs)z;wzB4#E@Jxh;5^xc(_igBCr5nF2A*=%Zatj$WypA|x_A=-7iDy&}sai^W5pROG z2?YsDNoqq5>`Lq@*g+2Chz;7?LwR?Q|JuKw!FDBvx7|GCrL1dR?M`;UzN^ zQ>Ju3peW!!)5!Rtxx#pXzOTj~G-wCjW5DcIWB~cfoyh^Z?*=ZZ3PMXeF2D9#E>OcL zE@7@e^Q2X>HsJzhEEhH~dcX*f9jxo~`LNH|=Nt@4rkAvpG??M7pS1>?23M)qsYo`J zxU^k}895;+bVT6su4<`h!R6lKW=j(;Y%XLm4hh5rhe(+lw6NbP6;yl(f>kFz z1mmSN(ZK%3u_9sB8ZWFC;9hG;`N|^@d2P7wbh~g_NQZmyDAUI|k=t>)oi_Y7l74Zh z3yO7I6Zf|%`vLaK!62GssotT3r0r)e4SuV7-#z3#HQN8TDZ^ekQ}7M@LcgC9{B7!C zA-n+Zv@%A08;Py=zw>?dvN@moPP1}bqv{f}YaD$`PW%J;wrgbgEN7?e%LZTAhXmpbN_+Ja&k$QyjA-ob0J?sb~C^Eys z`(na7!rRPq8&Cs^fjU-0YzZB$drEqbAwWj)R7f;KK3fBXbpKe6v083A0~DTB(jf(*NdI- zW!tAfZbIF6>Q_&1QC{|)%5(~(3$2pAEbF9JLQike+SyfCCsm-Kx&DvX*4I!^1&SIx z4DcX}o?{+lLcZE9BuL!?$dTakrG@EwE!Jx?3;$nx&jKD*b!I|P&bGU;sKK?mZP!*^ z>*H%{eYCr_)@q^hD54-B@(K_Vl3_B*%p{Y{WHNb>aL9XJnO9yjAtZr7!0>1`Jc=Sv zk-Dg#$X3=BZC&?M`>~!o+`(`EbM9k?Kr$JUfr}=3IQP8%d(Qv==gc|h{*T4-G}B>S zwZ0bVYjyRxc7U8WSD0V4f#2L#(o&9E%Ka4^#<6YflK5CQaSLh5 z&2YC=EO?(HQgxwqNCL)B5`fa$+Lu&at6I>imL>KD@@hSVb1eQk|4;j8q5hf2Ge3~) z@(+=3r>xkUcOt^-;swsJj^q8=BXfn89NbH4sH2%4TSpV>@U?7oQKOCY54l&ht_9y( zo%*fCee%1no@MTIvs#DN>U65Y)lv@&w`n_6O(?4=&BpG_Shp`)`hQ24{-u#iKRGih zgV|@mVD?xUagp!cgio5}E{b_N4v1{n20Gx7BKPpUEL;2($N!l8d$`&z*XFk7EvR|3 zy%+aMZSkx5d%%U!s?E=PeoF!J(p_TYz1(_cT$R8vQ+_A>-W3IMkUz({8ZVZCEi$EL zXCrlXn(0LbOlm=PKuc0h=D<`O_9BR!kxpchJDY>f-GMD&`lc6V6TC~h;1uRgRz$Bd zab}6C5UC1tH2E2{SHk)6lE*3Y#D22lD#(U{lw)|WtG5&NcKUYVL-N|N%h;>xLaNS%o1UUBxac2R<6P^^ zrQ!_vE|UkDJY}s|F2h?L9j(o%wRy8`r@ZVmW8Zpr1#(rm%iU$jUFs`ordC^gf|{ZL z)1`7~8c=q9X3Z+O-5mU4;VKncm6f+N!ualdcWS2!b*gq{znm*|sjr~BpsfJ47I+M{ zd}Pb7)nmB~FE?eXwMea9X`U~GR$+CG+KSZH%*J$T(MB(9nOI+5UGbX!4Y?+{G5BV* z1(5p@S!4vEp_d$;ZK$)&wK-y`4wN+)c~Ftt&Q}AC#H$KHs>YekSDNClem8pdNU~`JiIQ#{+6gQDoT*v9lAs4!*!f+G@2@QE-7>qE4Z8c0gJ`@AlE1alx-Lnqxw0%Y-2PpX6@UlS6_ z$!9d<=OYkx8Iuw5)5k!ElN*yU^WPu68f`K+CRn*M_KUf(!NJVfB{+gp$WdcTKi*;6 z(u6kqHnz7=i7|JtZ6~tz)$Yc7fa&NT!X!y^dch&I;FVu*x}UNl%Uy+6m9H#DD~neb ztf68P8y7P+Wn~?{&c<#l>b7>(ggu79o6Ox>)Sc_k^sGRhRNITy^PpV_KETO9*ITIn z5(F+xED?HNd{XNpyXT$lh$ODylMVK&A~QY?d4FH{lu2VSWOw8+tS1CBx_d z4V%<_t%ALaLFZ%>znZMNA1Ev|0l>aOfD^ujw9=7nF;V5rKk$Vcn)Ero?esL-S< z%a*&f+MU`ER=XIHaOwy6cxV4%6q>kWtYlL!DM3zA3EezVa4?g)DP<{Nt=sN!BhZER zZD>UsTFTl?R2w=~A34}+LuCP~EGRQsicxW~sl1R5c0B_oK*?xLb%ZV1TqH&sM-77H z;M~)K&G^uL;V$F*TAtkb0_t0MBqux(PT|9CJNr@J?_1swq<=X<8<63l1GhGKUC86I zH`N4CwZFW>*fogg4s}&dsTP&y=9!t3v4tW6E_m^;40AG4QTp;l`mlx@*!FJ9*n!fw z8xG<(DdIVyt8C{*t+A9D!K>QFx^^cDIGcSQKdl3MBZxo*iAI?FxA5TnxTV2EyJ~By z@uM1ldAo5F)L9apWG{-)czYNce$KpHt3tV|^ujRLuEpBg0xL3Di<~7cWO0>yD!r(} zyWWevv^T`h+DpIad`|>8{+5@YCX-mF>D!WTpO~X$qyFa}n@5+oQEpmdR$x0l`EBx7j5~ zJ(Ta;mU`4Y*!OLrSA{$m`o4ALJ9Sp1wPx3{Z7I+NBkKD$Q;pWB3s&MqlvFfxl)i6c z^H@BY*`1c}&Yoi&6UEP!vLy`24Y5nEeJzZ^k_nd~D>-foc4#xiBsuoUqhKxS0)DTu zzW7}7cI0Z?LfFHvRT!4ebN@y6dhv89kI4aLiv*BKBn5CVtcLFR-k>6;y@4(Gu(FB% zKjhYEG!J%g3-?1MEEzY*VLL1=88;{ul9-6b4Sp}C#fzrz2uc2LqE7iyA$^+sE88a# zsW~sE$py`M2JLs;yR-wLp9)*6)j}1L#y!X~Hf(^1JVmBO9ZCt^+V;jU4>z;KmD|~@^^$Zwf6sz-)I!~8vTqA8}%YCI@vm2S+g-*Q<>8$G7botUT1FP0u z^^G<8)2J*Z90yAYD{+=p=R-QL*^j#r?y~!vJ*e5UsbQ-;)Y#ptJGc*{a>N}Zy^-=3 z<$k_hpS$jKCZf$a_`r4@GIo?n#O;`11&u}QIBYaN$3&&Fz47p`d#LwQ>-g+ zVxogxJ2%`hHQ2acO*82q8uXb($i(;irw%NIDvO0x0AvEy1s;&LReFitTs&!K`UsQ#1r9l99T(1EU@Kaq@7~p^vR0hLh3VmUCldb%Hz^?1(nHretm! zDHvBo@RhoY9Y*9Rtjoh1S?*-DDO+Pe8bek|SW4z2?hkRXOZGsB0I}HN@L9aHF|z|@ zZYoXkTDtJ#4AzBC3~FpcjL!17tTNnW@vtl`AITt{(ApI z1GCY4_r-|`msP{8SPls>_!hb^gRxzFk@jgfctV9X} z+Of6(gTi4!3-8K-I_VIWLijZV4TLEWCO{~L05B51fcigyXZjw1l{8JrpU?^Mw;=?? zva=9BAf{(Sy{Yhg3xwMsq(IwmKzKonX&+8OfU?A6Q2q}PZxUlj(=pMpP@FIveE@ko z;Q1qf3waa11?m5T7!b+YJ_BhF1Ud%jdtw*F84x!@fc_<#A$%VK^pC~xeg>D~^J55~ zLH!#b+$q-i1mbK+Z-aO)gv}6WpVP#=r{Nj;!}1=3cou})q3rJ=H~==q_veszBZTK6 zK>G>*3w=+5a1W#b_YCh8_k%*x&5%dOLFo_?5&~l1WKF8 zKxsko`XInKcIhzTQ^*He3@%Uj3%vBt5JEzncpl)0bfC1jAW&RU`cOWK2#gjKFSJiE zZbo~+1&gILjGghqP%-6Ez&9KJKSB&RV(p{Fl%MI?hl=+>*<=VOApqSd-!mSG64SYn z0Q|}32jz(-2z1T?uSUj+z+WuQ3vpsHwAlv%aCpg>@&VA4;c-x$^gi&>y--f)2DCKAk2q67+c~|G0zWaI)-Bq(|$>`lVFHE!{!X|E#-NJFNv3=co1(4rmfs3 e3GQIL4#J0oR~c_oyTP%Dmjs|CTfZQtH2Z(PrYi6N literal 0 HcmV?d00001 diff --git a/fonts/YouTubeSansMedium.otf b/fonts/YouTubeSansMedium.otf new file mode 100644 index 0000000000000000000000000000000000000000..44a3c1d550fc08f3a4e8f06f7dd1b0e71c8e88b2 GIT binary patch literal 90056 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 literal 0 HcmV?d00001 diff --git a/fonts/YouTubeSansRegular.otf b/fonts/YouTubeSansRegular.otf new file mode 100644 index 0000000000000000000000000000000000000000..0037d93b4b5a7a6dbac19a50571d7a7a65cf3dd0 GIT binary patch literal 89048 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

PqB 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 literal 0 HcmV?d00001 diff --git a/fonts/YouTubeSansSemibold.otf b/fonts/YouTubeSansSemibold.otf new file mode 100644 index 0000000000000000000000000000000000000000..7a62056504901824ae34e5c9d2992a34babaf9e3 GIT binary patch literal 89320 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 literal 0 HcmV?d00001 diff --git a/lib/api/download_manager/download_manager.dart b/lib/api/download_manager/download_manager.dart index 95c7fad..5ecf2a5 100644 --- a/lib/api/download_manager/download_manager.dart +++ b/lib/api/download_manager/download_manager.dart @@ -82,7 +82,6 @@ class DownloadManager { FlutterBackgroundService().invoke(method, args); } - @override Future addOfflineTrack(d.Track track, {bool private = true, BuildContext? context, isSingleton = false}) async { //Permission diff --git a/lib/api/download_manager/download_service.dart b/lib/api/download_manager/download_service.dart index cfb3c7c..269cead 100644 --- a/lib/api/download_manager/download_service.dart +++ b/lib/api/download_manager/download_service.dart @@ -1,6 +1,3 @@ -import 'package:freezer/api/cache.dart'; -import 'package:freezer/api/deezer_audio.dart'; -import 'package:freezer/api/download_manager/database.dart'; import 'package:freezer/api/download_manager/service_interface.dart'; import 'package:freezer/settings.dart'; diff --git a/lib/api/pipe_api.dart b/lib/api/pipe_api.dart index 0481cd7..f4f3187 100644 --- a/lib/api/pipe_api.dart +++ b/lib/api/pipe_api.dart @@ -11,8 +11,8 @@ class PipeAPI { PipeAPI._(); // JWT for pipe.deezer.com - String? jwt; - int jwtExpiration = 0; + String? _jwt; + int _jwtExpiration = 0; final _logger = Logger('PipeAPI'); @@ -21,26 +21,32 @@ class PipeAPI { Future authorize() async { // authorize on pipe.deezer.com - if (DateTime.now().millisecondsSinceEpoch ~/ 1000 < jwtExpiration) { + if (DateTime.now().millisecondsSinceEpoch ~/ 1000 < _jwtExpiration) { // only continue if JWT expired! return; } // arl should be contained in cookies, so we should be fine - final res = await dio.post( - 'https://auth.deezer.com/login/arl?jo=p&rto=c&i=c', + var res = await dio.post('https://auth.deezer.com/login/arl?jo=p&rto=c&i=c', options: Options(responseType: ResponseType.plain)); final data = jsonDecode(res.data); + + if (res.statusCode == 400) { + // renew token (refresh token should be in cookies) + res = await dio.post('https://auth.deezer.com/login/renew?jo=p&rto=c&i=c', + options: Options(responseType: ResponseType.plain)); + } + if (res.statusCode != 200 || data['jwt'] == null || data['jwt'] == '') { throw Exception('Pipe authentication failed!'); } - jwt = data['jwt']; - _logger.fine('got jwt: $jwt'); + _jwt = data['jwt']; + _logger.fine('got jwt: $_jwt'); // decode JWT - final parts = jwt!.split('.'); + final parts = _jwt!.split('.'); final jwtData = jsonDecode(utf8.decode(base64Url.decode(parts[1]))); - jwtExpiration = jwtData['exp']; + _jwtExpiration = jwtData['exp']; } Future> callApi( @@ -55,13 +61,12 @@ class PipeAPI { 'variables': variables, 'query': query, }), - options: Options(headers: {'Authorization': 'Bearer $jwt'}), + options: Options(headers: {'Authorization': 'Bearer $_jwt'}), cancelToken: cancelToken); return res.data; } // -- Not working -- - @deprecated Future<(String, int)> getTrackToken(String trackId) async { final data = await callApi( 'TrackMediaToken', @@ -77,7 +82,7 @@ class PipeAPI { ); } - Future lyrics(String trackId, {CancelToken? cancelToken}) async { + Future lyrics(String trackId, {CancelToken? cancelToken}) async { final data = await callApi( 'SynchronizedTrackLyrics', r'''query SynchronizedTrackLyrics($trackId: String!) { @@ -119,7 +124,11 @@ fragment LyricsSynchronizedLines on LyricsSynchronizedLine { {'trackId': trackId}, cancelToken: cancelToken, ); - final lyrics = data['data']['track']['lyrics'] as Map; + final lyrics = data['data']['track']['lyrics'] as Map?; + if (lyrics == null) { + return null; + } + if (lyrics['synchronizedLines'] != null) { return Lyrics( id: lyrics['id'], diff --git a/lib/api/player/audio_handler.dart b/lib/api/player/audio_handler.dart index 1757fbf..f837e5b 100644 --- a/lib/api/player/audio_handler.dart +++ b/lib/api/player/audio_handler.dart @@ -8,6 +8,7 @@ import 'package:freezer/api/audio_sources/offline_audio_source.dart'; import 'package:freezer/api/paths.dart'; import 'package:freezer/api/player/player_helper.dart'; import 'package:freezer/api/audio_sources/url_audio_source.dart'; +import 'package:freezer/api/player/systray.dart'; import 'package:freezer/ui/android_auto.dart'; import 'package:hive_flutter/hive_flutter.dart'; import 'package:just_audio/just_audio.dart'; @@ -17,7 +18,6 @@ import 'package:logging/logging.dart'; import 'package:path/path.dart' as p; import 'package:path_provider/path_provider.dart'; import 'package:collection/collection.dart'; -import 'package:rxdart/rxdart.dart'; import 'package:scrobblenaut/scrobblenaut.dart'; import '../definitions.dart'; @@ -72,6 +72,8 @@ class AudioPlayerTaskInitArguments { class AudioPlayerTask extends BaseAudioHandler { final _logger = Logger('AudioPlayerTask'); + bool _disposed = false; + late AudioPlayer _player; late ConcatenatingAudioSource _audioSource; late DeezerAPI _deezerAPI; @@ -90,11 +92,7 @@ class AudioPlayerTask extends BaseAudioHandler { int _queueAutoIncrement = 0; //Stream subscriptions - StreamSubscription? _eventSubscription; - StreamSubscription? _bufferPositionSubscription; - StreamSubscription? _audioSessionSubscription; - StreamSubscription? _visualizerSubscription; - StreamSubscription? _connectivitySubscription; + List _subscriptions = []; bool _isConnectivityPluginAvailable = true; /// Android Auto helper class for navigation @@ -135,6 +133,8 @@ class AudioPlayerTask extends BaseAudioHandler { /// When playback begun (in SECONDS) int? _timestamp; + bool _ignoreInterruptions = false; + MediaItem get currentMediaItem => queue.value[_queueIndex]; bool get currentMediaItemIsShow => @@ -145,13 +145,13 @@ class AudioPlayerTask extends BaseAudioHandler { AudioPlayerTask([AudioPlayerTaskInitArguments? initArgs]) { if (initArgs == null) { - unawaited(AudioPlayerTaskInitArguments.loadSettings().then(_init)); + unawaited(AudioPlayerTaskInitArguments.loadSettings().then(_start)); return; } - unawaited(_init(initArgs)); + unawaited(_start(initArgs)); } - Future _init(AudioPlayerTaskInitArguments initArgs) async { + Future _start(AudioPlayerTaskInitArguments initArgs) async { // Linux and Windows support JustAudioMediaKit.ensureInitialized(); JustAudioMediaKit.title = 'Freezer'; @@ -162,79 +162,95 @@ class AudioPlayerTask extends BaseAudioHandler { _androidAuto = AndroidAuto(deezerAPI: _deezerAPI); _shouldLogTracks = initArgs.logListen; _seekAsSkip = initArgs.seekAsSkip; + _ignoreInterruptions = initArgs.ignoreInterruptions; final session = await AudioSession.instance; - session.configure(const AudioSessionConfiguration.music()); + await session.configure(const AudioSessionConfiguration.music()); _box = await Hive.openLazyBox('playback', path: await Paths.cacheDir()); + _init(); + await _loadQueueFile(); + + if (Platform.isLinux || Platform.isWindows || Platform.isMacOS) { + unawaited(sysTray.init()); + } + + if (initArgs.lastFMUsername != null && initArgs.lastFMPassword != null) { + unawaited( + _authorizeLastFM(initArgs.lastFMUsername!, initArgs.lastFMPassword!)); + } + } + + Future _init() async { _player = AudioPlayer( - handleInterruptions: !initArgs.ignoreInterruptions, + handleInterruptions: !_ignoreInterruptions, androidApplyAudioAttributes: true, handleAudioSessionActivation: true, ); - _player.currentIndexStream.listen((index) { - if (index != null && queue.value.isNotEmpty) { - // Update track index + update media item - _queueIndex = index; - mediaItem.add(currentMediaItem); + _subscriptions = [ + _player.currentIndexStream.listen((index) { + if (index != null && queue.value.isNotEmpty) { + // Update track index + update media item + _queueIndex = index; + mediaItem.add(currentMediaItem); - // log previous track - if (index != 0 && - _lastTrackId != null && - _lastTrackId! != currentMediaItem.id) { - unawaited(_logListenedTrack(_lastTrackId!, - sync: _amountPaused == 0 && _amountSeeked == 0)); - } - - _lastTrackId = currentMediaItem.id; - _amountSeeked = 0; - _amountPaused = 0; - _timestamp = DateTime.now().millisecondsSinceEpoch ~/ 1000; - - //LastFM - if (_queueIndex >= queue.value.length) return; - if (_scrobblenaut != null && currentMediaItem.id != _loggedTrackId) { - _loggedTrackId = currentMediaItem.id; - unawaited(_scrobblenaut!.track.scrobble( - track: currentMediaItem.title, - artist: currentMediaItem.artist!, - album: currentMediaItem.album, - duration: currentMediaItem.duration, - )); - } - } - - if (index == queue.value.length - 1) { - // if the queue is ended, load more tracks if applicable - unawaited(_onQueueEnd()); - } - }); - //Update state on all clients on change - _eventSubscription = _player.playbackEventStream.listen((event) { - //Update - _broadcastState(); - }, onError: (Object e, StackTrace st) { - _logger.severe('A stream error occurred: $e'); - }); - _player.processingStateStream.listen((state) { - switch (state) { - case ProcessingState.completed: - //Player ended, get more songs - if (_queueIndex == queue.value.length - 1) { - _onQueueEnd(); + // log previous track + if (index != 0 && + _lastTrackId != null && + _lastTrackId! != currentMediaItem.id) { + unawaited(_logListenedTrack(_lastTrackId!, + sync: _amountPaused == 0 && _amountSeeked == 0)); } - break; - default: - break; - } - }); - _bufferPositionSubscription = - _player.bufferedPositionStream.listen((bufferPosition) { - customEvent.add({'action': 'bufferPosition', 'data': bufferPosition}); - }); + _lastTrackId = currentMediaItem.id; + _amountSeeked = 0; + _amountPaused = 0; + _timestamp = DateTime.now().millisecondsSinceEpoch ~/ 1000; + + //LastFM + if (_queueIndex >= queue.value.length) return; + if (_scrobblenaut != null && currentMediaItem.id != _loggedTrackId) { + _loggedTrackId = currentMediaItem.id; + unawaited(_scrobblenaut!.track.scrobble( + track: currentMediaItem.title, + artist: currentMediaItem.artist!, + album: currentMediaItem.album, + duration: currentMediaItem.duration, + )); + } + } + + if (index == queue.value.length - 1) { + // if the queue is ended, load more tracks if applicable + unawaited(_onQueueEnd()); + } + }), + //Update state on all clients on change + _player.playbackEventStream.listen((event) { + //Update + _broadcastState(); + }, onError: (Object e, StackTrace st) { + _logger.severe('A stream error occurred: $e'); + }), + _player.processingStateStream.listen((state) { + switch (state) { + case ProcessingState.completed: + //Player ended, get more songs + if (_queueIndex == queue.value.length - 1) { + _onQueueEnd(); + } + break; + default: + break; + } + }), + + _player.bufferedPositionStream.listen((bufferPosition) { + customEvent.add({'action': 'bufferPosition', 'data': bufferPosition}); + }), + ]; //Audio session // _audioSessionSubscription = @@ -247,17 +263,16 @@ class AudioPlayerTask extends BaseAudioHandler { // ex. Linux without NetworkManager if (await _determineAudioQuality()) { // listen for connectivity changes - _connectivitySubscription = Connectivity() + _subscriptions.add(Connectivity() .onConnectivityChanged - .listen(_determineAudioQualityByResult); + .listen(_determineAudioQualityByResult)); } + } - await _loadQueueFile(); + Future _maybeResume() { + if (!_disposed) return Future.value(); - if (initArgs.lastFMUsername != null && initArgs.lastFMPassword != null) { - await _authorizeLastFM( - initArgs.lastFMUsername!, initArgs.lastFMPassword!); - } + return _init(); } /// Determine the [AudioQuality] to use according to current connection @@ -303,9 +318,15 @@ class AudioPlayerTask extends BaseAudioHandler { @override Future skipToQueueItem(int index) async { + await _maybeResume(); _lastPosition = null; - - unawaited(_logListenedTrack(currentMediaItem.id, sync: false)); + // next or prev track? + unawaited(_logListenedTrack( + currentMediaItem.id, + sync: false, + next: _queueIndex + 1 == index, + prev: _queueIndex - 1 == index, + )); //Skip in player await _player.seek(Duration.zero, index: index); _queueIndex = index; @@ -314,6 +335,7 @@ class AudioPlayerTask extends BaseAudioHandler { @override Future play() async { + await _maybeResume(); _player.play(); //Restore position on play if (_lastPosition != null) { @@ -329,13 +351,15 @@ class AudioPlayerTask extends BaseAudioHandler { } @override - Future seek(Duration? position) { + Future seek(Duration? position) async { + await _maybeResume(); _amountSeeked++; return _player.seek(position); } @override - Future fastForward() { + Future fastForward() async { + await _maybeResume(); print('fast forward called'); if (currentMediaItemIsShow) { return _seekRelative(const Duration(seconds: 30)); @@ -347,7 +371,8 @@ class AudioPlayerTask extends BaseAudioHandler { } @override - Future rewind() { + Future rewind() async { + await _maybeResume(); print('rewind called'); if (currentMediaItemIsShow) { return _seekRelative(-const Duration(seconds: 30)); @@ -395,6 +420,7 @@ class AudioPlayerTask extends BaseAudioHandler { @override Future skipToNext() async { + await _maybeResume(); _lastPosition = null; if (_queueIndex == queue.value.length - 1) return; //Update buffering state @@ -406,6 +432,7 @@ class AudioPlayerTask extends BaseAudioHandler { @override Future skipToPrevious() async { + await _maybeResume(); if (_queueIndex == 0) return; //Update buffering state //_skipState = AudioProcessingState.skippingToPrevious; @@ -737,12 +764,11 @@ class AudioPlayerTask extends BaseAudioHandler { @override Future stop() async { await _saveQueue(); - _player.stop(); - _eventSubscription?.cancel(); - _audioSessionSubscription?.cancel(); - _visualizerSubscription?.cancel(); - _bufferPositionSubscription?.cancel(); - _connectivitySubscription?.cancel(); + _disposed = true; + _player.dispose(); + for (final subscription in _subscriptions) { + subscription.cancel(); + } await super.stop(); } diff --git a/lib/api/player/player_helper.dart b/lib/api/player/player_helper.dart index f3b6713..adeeb39 100644 --- a/lib/api/player/player_helper.dart +++ b/lib/api/player/player_helper.dart @@ -208,7 +208,7 @@ class PlayerHelper { tracks[0].id, QueueSource( id: trackId, - text: '${'Mix based on'.i18n} $trackTitle', + text: 'Mix based on %s'.i18n.fill([trackTitle]), source: 'mix')); } @@ -218,7 +218,7 @@ class PlayerHelper { null, QueueSource( id: track.id, - text: "${'Mix based on'.i18n} ${track.title}", + text: 'Mix based on %s'.i18n.fill([track.title!]), source: 'searchMix')); List tracks = await deezerAPI.getSearchTrackMix(track.id, false); // discard first track (if it is the searched track) @@ -237,7 +237,7 @@ class PlayerHelper { null, // we can avoid passing it, as the index is 0 QueueSource( id: trackId, - text: "${'Mix based on'.i18n} $trackTitle", + text: 'Mix based on %s'.i18n.fill([trackTitle]), source: 'searchMix')); } diff --git a/lib/api/player/systray.dart b/lib/api/player/systray.dart new file mode 100644 index 0000000..b4e984f --- /dev/null +++ b/lib/api/player/systray.dart @@ -0,0 +1,107 @@ +import 'dart:io'; + +import 'package:audio_service/audio_service.dart'; +import 'package:flutter/services.dart'; +import 'package:freezer/api/player/audio_handler.dart'; +import 'package:freezer/settings.dart'; +import 'package:freezer/translations.i18n.dart'; +import 'package:tray_manager/tray_manager.dart'; +import 'package:window_manager/window_manager.dart'; + +final sysTray = SysTray._(); + +class SysTray with TrayListener { + SysTray._(); + + static String getIcon({bool forcePng = false}) { + if (Platform.isWindows && !forcePng) { + if (settings.useColorTrayIcon) { + return 'assets/icon.ico'; + } + return 'assets/icon_mono_small.ico'; + } + + if (settings.useColorTrayIcon) { + return 'assets/icon_small.png'; + } + + return 'assets/icon_mono_small.png'; + } + + bool _inited = false; + Future init() async { + if (_inited) return; + _inited = true; + + updateIcon(); + try { + await trayManager.setToolTip('freezer'); + // ignore: empty_catches + } catch (e) {} + + await updateContextMenu(); + + trayManager.addListener(this); + + playerHelper.playing + .listen((playing) => updateContextMenu(playing: playing)); + audioHandler.mediaItem + .listen((mediaItem) => updateContextMenu(mediaItem: mediaItem)); + } + + Future updateIcon() { + return trayManager.setIcon(getIcon()); + } + + Future updateContextMenu({bool? playing, MediaItem? mediaItem}) async { + playing ??= playerHelper.playing.valueOrNull ?? false; + mediaItem ??= audioHandler.mediaItem.valueOrNull; + // create context menu + final menu = Menu(items: [ + if (mediaItem != null) ...[ + MenuItem(label: mediaItem.title, disabled: true), + MenuItem(label: mediaItem.artist!, disabled: true), + ], + MenuItem.separator(), + MenuItem( + label: 'Previous'.i18n, + onClick: (menuItem) => audioHandler.skipToPrevious()), + playing + ? MenuItem( + label: 'Pause'.i18n, onClick: (menuItem) => audioHandler.pause()) + : MenuItem( + label: 'Play'.i18n, onClick: (menuItem) => audioHandler.play()), + MenuItem( + label: 'Next'.i18n, onClick: (menuItem) => audioHandler.skipToNext()), + MenuItem.separator(), + MenuItem( + label: 'Show'.i18n, + // we can safely ignore it if it errors, as it's expected + onClick: (menuItem) => windowManager.show().catchError((e) {})), + MenuItem( + label: 'Exit'.i18n, + onClick: (menuItem) async { + await audioHandler.pause(); + SystemNavigator.pop(); + }, + ), + ]); + + // set context menu + await trayManager.setContextMenu(menu); + } + + @override + void onTrayIconMouseUp() async { + try { + await windowManager.show(); + // ignore: empty_catches + } catch (e) {} + } + + @override + void onTrayIconRightMouseUp() => trayManager.popUpContextMenu(); + + @override + void onTrayMenuItemClick(MenuItem menuItem) {} +} diff --git a/lib/main.dart b/lib/main.dart index eaa7028..125e0b4 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -161,7 +161,7 @@ class _FreezerAppState extends State with WidgetsBindingObserver { break; default: - print('lifecycle: $state'); + break; } } @@ -193,6 +193,8 @@ class _FreezerAppState extends State with WidgetsBindingObserver { DynamicColorBuilder(builder: (lightScheme, darkScheme) { final lightTheme = settings.materialYouAccent ? ThemeData( + textTheme: settings.textTheme, + fontFamily: settings.fontFamily, colorScheme: lightScheme, useMaterial3: true, appBarTheme: const AppBarTheme( @@ -208,6 +210,8 @@ class _FreezerAppState extends State with WidgetsBindingObserver { : settings.themeData; final darkTheme = settings.materialYouAccent ? ThemeData( + textTheme: settings.textTheme, + fontFamily: settings.fontFamily, colorScheme: darkScheme, useMaterial3: true, brightness: Brightness.dark, diff --git a/lib/settings.dart b/lib/settings.dart index c91951c..0ce4429 100644 --- a/lib/settings.dart +++ b/lib/settings.dart @@ -175,6 +175,10 @@ class Settings { @HiveField(49, defaultValue: true) bool enableMaterial3PlayButton = true; + // DESKTOP ONLY -- TRAY ICON + @HiveField(50, defaultValue: false) + bool useColorTrayIcon = false; + static LazyBox? __box; static Future> get _box async => __box ??= await Hive.openLazyBox('settings'); @@ -218,9 +222,10 @@ class Settings { return _themeData[theme] ?? ThemeData(); } + final customFonts = ['System', 'YouTube Sans', 'Deezer']; //Get all available fonts List get fonts { - return ['System', 'Deezer', ...GoogleFonts.asMap().keys]; + return [...customFonts, ...GoogleFonts.asMap().keys]; } //JSON to forward into download service @@ -310,11 +315,11 @@ class Settings { static const deezerBg = Color(0xFF1F1A16); static const deezerBottom = Color(0xFF1b1714); - TextTheme? get textTheme => (font == 'Deezer' || font == 'System') + TextTheme? get textTheme => customFonts.contains(font) ? null : GoogleFonts.getTextTheme(font, isDark ? ThemeData.dark().textTheme : ThemeData.light().textTheme); - String? get fontFamily => (font == 'Deezer') ? 'MabryPro' : null; + String? get fontFamily => (font == 'Deezer') ? 'Mabry Pro' : null; final _elevation1Black = Color.alphaBlend(Colors.white12, Colors.black); diff --git a/lib/translations.i18n.dart b/lib/translations.i18n.dart index 7c95ce3..a458a68 100644 --- a/lib/translations.i18n.dart +++ b/lib/translations.i18n.dart @@ -42,6 +42,12 @@ extension Localization on String { static final _t = Translations.byLocale("en_US") + language_en_us + crowdin; String get i18n => localize(this, _t); + + String plural(value) { + return replaceAll("%d", value.toString()); + } + + String fill(List params) => localizeFill(this, params); } class Language { diff --git a/lib/ui/home_screen.dart b/lib/ui/home_screen.dart index 064a47d..95b44ea 100644 --- a/lib/ui/home_screen.dart +++ b/lib/ui/home_screen.dart @@ -382,9 +382,9 @@ class HomePageItemWidget extends StatelessWidget { Navigator.of(context) .pushRoute(builder: (context) => AlbumDetails(item.value)); }, - onHold: () { + onSecondary: (details) { MenuSheet m = MenuSheet(context); - m.defaultAlbumMenu(item.value); + m.defaultAlbumMenu(item.value, details: details); }, ); case HomePageItemType.ARTIST: diff --git a/lib/ui/lyrics_screen.dart b/lib/ui/lyrics_screen.dart index 718073c..4be7394 100644 --- a/lib/ui/lyrics_screen.dart +++ b/lib/ui/lyrics_screen.dart @@ -85,6 +85,7 @@ class _LyricsWidgetState extends State _freeScroll = false; _loading = true; _lyrics = null; + _error = null; }); } @@ -92,7 +93,13 @@ class _LyricsWidgetState extends State _lyricsCancelToken = CancelToken(); final lyrics = await pipeAPI.lyrics(trackId, cancelToken: _lyricsCancelToken); + if (lyrics == null) { + setState(() { + _error = 'No lyrics available.'; + }); + return; + } _syncedLyrics = lyrics.sync; _availableTranslation = lyrics.lyrics![0].translated != null; if (!_availableTranslation) { diff --git a/lib/ui/menu.dart b/lib/ui/menu.dart index e3db986..a6d5afa 100644 --- a/lib/ui/menu.dart +++ b/lib/ui/menu.dart @@ -105,7 +105,7 @@ class MenuSheetOption { class MenuSheet { final BuildContext context; - final Function? navigateCallback; + final VoidCallback? navigateCallback; MenuSheet(this.context, {this.navigateCallback}); @@ -233,12 +233,14 @@ class MenuSheet { void defaultTrackMenu( Track track, { List options = const [], + List optionsTop = const [], Function? onRemove, TapUpDetails? details, }) { showWithTrack( track, [ + ...optionsTop, addToQueueNext(track), addToQueue(track), (cache.checkTrackFavorite(track)) diff --git a/lib/ui/player_screen.dart b/lib/ui/player_screen.dart index 8c7bcf5..cd584ca 100644 --- a/lib/ui/player_screen.dart +++ b/lib/ui/player_screen.dart @@ -832,7 +832,7 @@ class BigAlbumArt extends StatefulWidget { State createState() => _BigAlbumArtState(); } -class _BigAlbumArtState extends State { +class _BigAlbumArtState extends State with WidgetsBindingObserver { final _pageController = PageController( initialPage: playerHelper.queueIndex, keepPage: false, @@ -842,14 +842,15 @@ class _BigAlbumArtState extends State { /// is true on pointer down event /// used to distinguish between [PageController.animateToPage] and user gesture - bool _userScroll = false; + bool _userScroll = true; /// whether the user has already scrolled the [PageView], /// so to avoid calling [PageController.animateToPage] again. bool _initiatedByUser = false; - @override - void initState() { + void _listenForMediaItemChanges() { + if (_currentItemSub != null) return; + _currentItemSub = audioHandler.mediaItem.listen((event) async { if (_initiatedByUser) { _initiatedByUser = false; @@ -859,12 +860,32 @@ class _BigAlbumArtState extends State { if (_pageController.page?.toInt() == playerHelper.queueIndex) return; print('animating controller to page'); + _userScroll = false; await _pageController.animateToPage(playerHelper.queueIndex, duration: const Duration(milliseconds: 300), curve: Curves.easeInOut); + _userScroll = true; }); + } + + @override + void initState() { + _listenForMediaItemChanges(); super.initState(); } + @override + void didChangeAppLifecycleState(AppLifecycleState state) { + switch (state) { + case AppLifecycleState.paused: + _currentItemSub?.cancel(); + case AppLifecycleState.resumed: + _listenForMediaItemChanges(); + default: + break; + } + super.didChangeAppLifecycleState(state); + } + @override void dispose() { _currentItemSub?.cancel(); @@ -874,11 +895,6 @@ class _BigAlbumArtState extends State { @override Widget build(BuildContext context) { final child = GestureDetector( - // onVerticalDragUpdate: (DragUpdateDetails details) { - // if (details.delta.dy > 16) { - // Navigator.of(context).pop(); - // } - // }, onTap: () => Navigator.push( context, FadePageRoute( @@ -889,29 +905,7 @@ class _BigAlbumArtState extends State { return ZoomableImageRoute( imageUrl: mediaItem.artUri.toString(), heroKey: mediaItem.id); }, - ) - // PageRouteBuilder( - // opaque: false, // transparent background - // barrierDismissible: true, - // pageBuilder: (context, animation, __) { - // return FadeTransition( - // opacity: animation, - // child: PhotoView( - // imageProvider: CachedNetworkImageProvider( - // audioHandler.mediaItem.value!.artUri.toString()), - // maxScale: 8.0, - // minScale: 0.2, - // heroAttributes: PhotoViewHeroAttributes( - // tag: audioHandler.mediaItem.value!.id), - // backgroundDecoration: const BoxDecoration( - // color: Color.fromARGB(0x90, 0, 0, 0))), - // ); - // }), - ), - onHorizontalDragDown: (_) => _userScroll = true, - // delayed a bit, so to make sure that the page view updated. - onHorizontalDragEnd: (_) => Future.delayed( - const Duration(milliseconds: 100), () => _userScroll = false), + )), child: StreamBuilder>( stream: audioHandler.queue, initialData: audioHandler.queue.valueOrNull, @@ -927,10 +921,10 @@ class _BigAlbumArtState extends State { if (!_userScroll) return; Logger('BigAlbumArt') .fine('page changed, skipping to media item'); - // if (queue[index].id == audioHandler.mediaItem.value?.id) { - // return; - // } - _initiatedByUser = true; + if (queue[index].id == audioHandler.mediaItem.value?.id) { + return; + } + audioHandler.skipToQueueItem(index); }, itemCount: queue.length, @@ -1010,8 +1004,7 @@ class PlayerScreenTopRow extends StatelessWidget { text: TextSpan(children: [ if (!short) TextSpan( - text: - '${'Playing from:'.i18n.toUpperCase().withoutLast(1)}\n', + text: '${'PLAYING FROM'.i18n}\n', style: TextStyle( fontWeight: FontWeight.bold, letterSpacing: 1.5, diff --git a/lib/ui/search.dart b/lib/ui/search.dart index bca4c6b..57ab4d8 100644 --- a/lib/ui/search.dart +++ b/lib/ui/search.dart @@ -29,7 +29,11 @@ FutureOr openScreenByURL(BuildContext context, String url) async { switch (res.type) { case DeezerLinkType.TRACK: Track t = await deezerAPI.track(res.id!); - MenuSheet(context).defaultTrackMenu(t); + MenuSheet(context).defaultTrackMenu(t, optionsTop: [ + MenuSheetOption(Text('Play'.i18n), + icon: const Icon(Icons.play_arrow), + onTap: () => playerHelper.playSearchMixDeferred(t)), + ]); break; case DeezerLinkType.ALBUM: Album a = await deezerAPI.album(res.id); diff --git a/lib/ui/settings_screen.dart b/lib/ui/settings_screen.dart index 8f2cd6b..c8c35dd 100644 --- a/lib/ui/settings_screen.dart +++ b/lib/ui/settings_screen.dart @@ -1,3 +1,5 @@ +import 'dart:async'; +import 'dart:io'; import 'dart:math'; import 'package:country_pickers/country.dart'; @@ -11,6 +13,7 @@ import 'package:fluttericon/font_awesome5_icons.dart'; import 'package:fluttericon/web_symbols_icons.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:freezer/api/definitions.dart'; +import 'package:freezer/api/player/systray.dart'; import 'package:freezer/ui/login_on_other_device.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:permission_handler/permission_handler.dart'; @@ -463,6 +466,21 @@ class _AppearanceSettingsState extends State { .toList(growable: false), )), ), + if (Platform.isLinux || Platform.isWindows || Platform.isMacOS) + SwitchListTile( + title: Text('Use colorful tray icon'.i18n), + secondary: + Image.asset(SysTray.getIcon(forcePng: true), height: 24.0), + value: settings.useColorTrayIcon, + onChanged: (value) { + setState(() { + settings.useColorTrayIcon = value; + unawaited(settings.save()); + sysTray.updateIcon(); + }); + }, + ), + //Display mode (Android only!) if (defaultTargetPlatform == TargetPlatform.android) ListTile( diff --git a/lib/ui/tiles.dart b/lib/ui/tiles.dart index 701f74d..0ad6215 100644 --- a/lib/ui/tiles.dart +++ b/lib/ui/tiles.dart @@ -48,8 +48,8 @@ class TrackTile extends StatelessWidget { this.onSecondary, this.trailing, this.checkTrackOffline = true, - Key? key, - }) : super(key: key); + super.key, + }); factory TrackTile.fromTrack(Track track, {VoidCallback? onTap, @@ -602,15 +602,16 @@ class _SmartTrackListTileState extends State { class AlbumCard extends StatelessWidget { final Album album; final void Function()? onTap; - final void Function()? onHold; + final SecondaryTapCallback? onSecondary; - const AlbumCard(this.album, {super.key, this.onTap, this.onHold}); + const AlbumCard(this.album, {super.key, this.onTap, this.onSecondary}); @override Widget build(BuildContext context) { return InkWell( onTap: onTap, - onLongPress: onHold, + onLongPress: () => onSecondary?.call(null), + onSecondaryTapUp: onSecondary, child: Column( children: [ Padding( diff --git a/linux/CMakeLists.txt b/linux/CMakeLists.txt index 87d2131..7acbcc2 100644 --- a/linux/CMakeLists.txt +++ b/linux/CMakeLists.txt @@ -123,9 +123,6 @@ foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) COMPONENT Runtime) endforeach(bundled_library) -# add app icon -install(FILES "app_icon.ico" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}") - # Fully re-copy the assets directory on each build to avoid having stale files # from a previous install. set(FLUTTER_ASSET_DIR_NAME "flutter_assets") diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc index 606c5a6..9245a4b 100644 --- a/linux/flutter/generated_plugin_registrant.cc +++ b/linux/flutter/generated_plugin_registrant.cc @@ -9,7 +9,10 @@ #include #include #include +#include +#include #include +#include void fl_register_plugins(FlPluginRegistry* registry) { g_autoptr(FlPluginRegistrar) dynamic_color_registrar = @@ -21,7 +24,16 @@ void fl_register_plugins(FlPluginRegistry* registry) { g_autoptr(FlPluginRegistrar) media_kit_libs_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "MediaKitLibsLinuxPlugin"); media_kit_libs_linux_plugin_register_with_registrar(media_kit_libs_linux_registrar); + g_autoptr(FlPluginRegistrar) screen_retriever_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "ScreenRetrieverPlugin"); + screen_retriever_plugin_register_with_registrar(screen_retriever_registrar); + g_autoptr(FlPluginRegistrar) tray_manager_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "TrayManagerPlugin"); + tray_manager_plugin_register_with_registrar(tray_manager_registrar); g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); + g_autoptr(FlPluginRegistrar) window_manager_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "WindowManagerPlugin"); + window_manager_plugin_register_with_registrar(window_manager_registrar); } diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index 6023074..466d1b5 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -6,7 +6,10 @@ list(APPEND FLUTTER_PLUGIN_LIST dynamic_color isar_flutter_libs media_kit_libs_linux + screen_retriever + tray_manager url_launcher_linux + window_manager ) list(APPEND FLUTTER_FFI_PLUGIN_LIST diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index edc83b7..611e01d 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -15,10 +15,13 @@ import just_audio import network_info_plus import package_info_plus import path_provider_foundation +import screen_retriever import share_plus import sqflite +import tray_manager import url_launcher_macos import wakelock_plus +import window_manager func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { AudioServicePlugin.register(with: registry.registrar(forPlugin: "AudioServicePlugin")) @@ -31,8 +34,11 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { NetworkInfoPlusPlugin.register(with: registry.registrar(forPlugin: "NetworkInfoPlusPlugin")) FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) + ScreenRetrieverPlugin.register(with: registry.registrar(forPlugin: "ScreenRetrieverPlugin")) SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin")) SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) + TrayManagerPlugin.register(with: registry.registrar(forPlugin: "TrayManagerPlugin")) UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) WakelockPlusMacosPlugin.register(with: registry.registrar(forPlugin: "WakelockPlusMacosPlugin")) + WindowManagerPlugin.register(with: registry.registrar(forPlugin: "WindowManagerPlugin")) } diff --git a/pubspec.lock b/pubspec.lock index 05b8961..737adcb 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -362,6 +362,14 @@ packages: url: "https://pub.dev" source: hosted version: "5.0.3" + equatable: + dependency: transitive + description: + name: equatable + sha256: c2b87cb7756efdf69892005af546c56c0b5037f54d2a88269b4f347a505e3ca2 + url: "https://pub.dev" + source: hosted + version: "2.0.5" fading_edge_scrollview: dependency: transitive description: @@ -575,6 +583,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.2.0" + gettext_parser: + dependency: transitive + description: + name: gettext_parser + sha256: "9565c9dd1033ec125e1fbc7ccba6c0d2d753dd356122ba1a17e6aa7dc868f34a" + url: "https://pub.dev" + source: hosted + version: "0.2.0" glob: dependency: transitive description: @@ -679,6 +695,14 @@ packages: url: "https://pub.dev" source: hosted version: "10.0.3" + i18n_extension_importer: + dependency: "direct main" + description: + name: i18n_extension_importer + sha256: "4fd651ff47ac52f604b34b5cd80ee225d38fe589d51b042f00178081b476252f" + url: "https://pub.dev" + source: hosted + version: "0.0.6" image: dependency: transitive description: @@ -855,6 +879,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.9" + menu_base: + dependency: transitive + description: + name: menu_base + sha256: "820368014a171bd1241030278e6c2617354f492f5c703d7b7d4570a6b8b84405" + url: "https://pub.dev" + source: hosted + version: "0.1.1" meta: dependency: transitive description: @@ -1215,6 +1247,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.2" + screen_retriever: + dependency: transitive + description: + name: screen_retriever + sha256: "6ee02c8a1158e6dae7ca430da79436e3b1c9563c8cf02f524af997c201ac2b90" + url: "https://pub.dev" + source: hosted + version: "0.1.9" scrobblenaut: dependency: "direct main" description: @@ -1256,6 +1296,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.4" + shortid: + dependency: transitive + description: + name: shortid + sha256: d0b40e3dbb50497dad107e19c54ca7de0d1a274eb9b4404991e443dadb9ebedb + url: "https://pub.dev" + source: hosted + version: "0.1.2" sky_engine: dependency: transitive description: flutter @@ -1397,6 +1445,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.1" + tray_manager: + dependency: "direct main" + description: + name: tray_manager + sha256: "4ab709d70a4374af172f8c39e018db33a4271265549c6fc9d269a65e5f4b0225" + url: "https://pub.dev" + source: hosted + version: "0.2.1" typed_data: dependency: transitive description: @@ -1521,10 +1577,10 @@ packages: dependency: transitive description: name: uuid - sha256: cd210a09f7c18cbe5a02511718e0334de6559871052c90a90c0cca46a4aa81c8 + sha256: "648e103079f7c64a36dc7d39369cabb358d377078a051d6ae2ad3aa539519313" url: "https://pub.dev" source: hosted - version: "4.3.3" + version: "3.0.7" vector_math: dependency: transitive description: @@ -1621,6 +1677,14 @@ packages: url: "https://pub.dev" source: hosted version: "5.2.0" + window_manager: + dependency: "direct main" + description: + name: window_manager + sha256: b3c895bdf936c77b83c5254bec2e6b3f066710c1f89c38b20b8acc382b525494 + url: "https://pub.dev" + source: hosted + version: "0.3.8" xdg_directories: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index c39a7d5..f03ca8e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -100,10 +100,13 @@ dependencies: flutter_cache_manager_hive: git: https://github.com/Pato05/flutter_cache_manager_hive.git flex_color_picker: ^3.3.0 - webview_flutter: - ^4.4.4 + webview_flutter: ^4.4.4 network_info_plus: ^4.1.0+1 pointycastle: ^3.7.4 + i18n_extension_importer: ^0.0.6 + tray_manager: ^0.2.1 + window_manager: + ^0.3.8 #deezcryptor: #path: deezcryptor/ @@ -134,27 +137,27 @@ flutter: assets: - assets/cover.jpg - assets/cover_thumb.jpg - - assets/icon.png - assets/favorites_thumb.jpg - assets/browse_icon.png + - assets/icon.png + - assets/icon_small.png + - assets/icon_mono_small.png + - assets/icon.ico + - assets/icon_mono_small.ico fonts: - # - family: Montserrat - # fonts: - # - asset: assets/fonts/Montserrat-Regular.ttf - # - asset: assets/fonts/Montserrat-Bold.ttf - # weight: 700 - # - asset: assets/fonts/Montserrat-Italic.ttf - # style: italic - - family: MabryPro + - family: "Mabry Pro" fonts: - - asset: assets/fonts/MabryPro.otf - - asset: assets/fonts/MabryProItalic.otf + - asset: fonts/MabryPro.otf + - asset: fonts/MabryProItalic.otf style: italic - - asset: assets/fonts/MabryProBold.otf + - asset: fonts/MabryProBold.otf weight: 700 - - asset: assets/fonts/MabryProBlack.otf + - asset: fonts/MabryProBlack.otf weight: 900 + - family: "YouTube Sans" + fonts: + - asset: fonts/YouTubeSansMedium.otf # An image asset can refer to one or more resolution-specific "variants", see # https://flutter.dev/assets-and-images/#resolution-aware. diff --git a/translations/crowdin.py b/translations/crowdin.py deleted file mode 100644 index d2a6d80..0000000 --- a/translations/crowdin.py +++ /dev/null @@ -1,53 +0,0 @@ -import zipfile -import json - -lang_crowdin = { - 'ar': 'ar_ar', - 'bg': 'bul_bg', - 'ast': 'ast_es', - 'de': 'de_de', - 'el': 'el_gr', - 'es-ES': 'es_es', - 'fa': 'fa_ir', - 'fil': 'fil_ph', - 'fr': 'fr_fr', - 'he': 'he_il', - 'hr': 'hr_hr', - 'id': 'id_id', - 'it': 'it_id', - 'ko': 'ko_ko', - 'pt-BR': 'pt_br', - 'ro': 'ro_ro', - 'ru': 'ru_ru', - 'tr': 'tr_tr', - 'pl': 'pl_pl', - 'uk': 'uk_ua', - 'hu': 'hu_hu', - 'ur-PK': 'ur_pk', - 'hi': 'hi_in', - 'sk': 'sk_sk', - 'cs': 'cs_cz', - 'vi': 'vi_vi', - 'uwu': 'uwu_uwu', - 'nl': 'nl_NL', - 'sl': 'sl_SL', - 'zh-CN': 'zh-CN' -} - -def generate_dart(): - out = {} - with zipfile.ZipFile('translations.zip') as zip: - for file in zip.namelist(): - if 'freezer.json' in file: - data = zip.open(file).read() - lang = file.split('/')[0] - out[lang_crowdin[lang]] = json.loads(data) - - with open('../lib/languages/crowdin.dart', 'w') as f: - data = json.dumps(out, ensure_ascii=False).replace('$', '\\$') - out = f'const crowdin = {data};' - f.write(out) - - -if __name__ == '__main__': - generate_dart() diff --git a/translations/freezer.json b/translations/freezer.json deleted file mode 100644 index 898ba9b..0000000 --- a/translations/freezer.json +++ /dev/null @@ -1,226 +0,0 @@ -{ - "Home": "Home", - "Search": "Search", - "Library": "Library", - "Offline mode, can't play flow or smart track lists.": - "Offline mode, can't play flow or smart track lists.", - "Added to library": "Added to library", - "Download": "Download", - "Disk": "Disk", - "Offline": "Offline", - "Top Tracks": "Top Tracks", - "Show more tracks": "Show more tracks", - "Top": "Top", - "Top Albums": "Top Albums", - "Show all albums": "Show all albums", - "Discography": "Discography", - "Default": "Default", - "Reverse": "Reverse", - "Alphabetic": "Alphabetic", - "Artist": "Artist", - "Post processing...": "Post processing...", - "Done": "Done", - "Delete": "Delete", - "Are you sure you want to delete this download?": - "Are you sure you want to delete this download?", - "Cancel": "Cancel", - "Downloads": "Downloads", - "Clear queue": "Clear queue", - "This won't delete currently downloading item": - "This won't delete currently downloading item", - "Are you sure you want to delete all queued downloads?": - "Are you sure you want to delete all queued downloads?", - "Clear downloads history": "Clear downloads history", - "WARNING: This will only clear non-offline (external downloads)": - "WARNING: This will only clear non-offline (external downloads)", - "Please check your connection and try again later...": - "Please check your connection and try again later...", - "Show more": "Show more", - "Importer": "Importer", - "Currently supporting only Spotify, with 100 tracks limit": - "Currently supporting only Spotify, with 100 tracks limit", - "Due to API limitations": "Due to API limitations", - "Enter your playlist link below": "Enter your playlist link below", - "Error loading URL!": "Error loading URL!", - "Convert": "Convert", - "Download only": "Download only", - "Downloading is currently stopped, click here to resume.": - "Downloading is currently stopped, click here to resume.", - "Tracks": "Tracks", - "Albums": "Albums", - "Artists": "Artists", - "Playlists": "Playlists", - "Import": "Import", - "Import playlists from Spotify": "Import playlists from Spotify", - "Statistics": "Statistics", - "Offline tracks": "Offline tracks", - "Offline albums": "Offline albums", - "Offline playlists": "Offline playlists", - "Offline size": "Offline size", - "Free space": "Free space", - "Loved tracks": "Loved tracks", - "Favorites": "Favorites", - "All offline tracks": "All offline tracks", - "Create new playlist": "Create new playlist", - "Cannot create playlists in offline mode": - "Cannot create playlists in offline mode", - "Error": "Error", - "Error logging in! Please check your token and internet connection and try again.": - "Error logging in! Please check your token and internet connection and try again.", - "Dismiss": "Dismiss", - "Welcome to": "Welcome to", - "Please login using your Deezer account.": - "Please login using your Deezer account.", - "Login using browser": "Login using browser", - "Login using token": "Login using token", - "Enter ARL": "Enter ARL", - "Token (ARL)": "Token (ARL)", - "Save": "Save", - "If you don't have account, you can register on deezer.com for free.": - "If you don't have account, you can register on deezer.com for free.", - "Open in browser": "Open in browser", - "By using this app, you don't agree with the Deezer ToS": - "By using this app, you don't agree with the Deezer ToS", - "Play next": "Play next", - "Add to queue": "Add to queue", - "Add track to favorites": "Add track to favorites", - "Add to playlist": "Add to playlist", - "Select playlist": "Select playlist", - "Track added to": "Track added to", - "Remove from playlist": "Remove from playlist", - "Track removed from": "Track removed from", - "Remove favorite": "Remove favorite", - "Track removed from library": "Track removed from library", - "Go to": "Go to", - "Make offline": "Make offline", - "Add to library": "Add to library", - "Remove album": "Remove album", - "Album removed": "Album removed", - "Remove from favorites": "Remove from favorites", - "Artist removed from library": "Artist removed from library", - "Add to favorites": "Add to favorites", - "Remove from library": "Remove from library", - "Add playlist to library": "Add playlist to library", - "Added playlist to library": "Added playlist to library", - "Make playlist offline": "Make playlist offline", - "Download playlist": "Download playlist", - "Create playlist": "Create playlist", - "Title": "Title", - "Description": "Description", - "Private": "Private", - "Collaborative": "Collaborative", - "Create": "Create", - "Playlist created!": "Playlist created!", - "Playing from:": "Playing from:", - "Queue": "Queue", - "Offline search": "Offline search", - "Search Results": "Search Results", - "No results!": "No results!", - "Show all tracks": "Show all tracks", - "Show all playlists": "Show all playlists", - "Settings": "Settings", - "General": "General", - "Appearance": "Appearance", - "Quality": "Quality", - "Deezer": "Deezer", - "Theme": "Theme", - "Currently": "Currently", - "Select theme": "Select theme", - "Dark": "Dark", - "Black (AMOLED)": "Black (AMOLED)", - "Deezer (Dark)": "Deezer (Dark)", - "Primary color": "Primary color", - "Selected color": "Selected color", - "Use album art primary color": "Use album art primary color", - "Warning: might be buggy": "Warning: might be buggy", - "Mobile streaming": "Mobile streaming", - "Wifi streaming": "Wifi streaming", - "External downloads": "External downloads", - "Content language": "Content language", - "Not app language, used in headers. Now": - "Not app language, used in headers. Now", - "Select language": "Select language", - "Content country": "Content country", - "Country used in headers. Now": "Country used in headers. Now", - "Log tracks": "Log tracks", - "Send track listen logs to Deezer, enable it for features like Flow to work properly": - "Send track listen logs to Deezer, enable it for features like Flow to work properly", - "Offline mode": "Offline mode", - "Will be overwritten on start.": "Will be overwritten on start.", - "Error logging in, check your internet connections.": - "Error logging in, check your internet connections.", - "Logging in...": "Logging in...", - "Download path": "Download path", - "Downloads naming": "Downloads naming", - "Downloaded tracks filename": "Downloaded tracks filename", - "Valid variables are": "Valid variables are", - "Reset": "Reset", - "Clear": "Clear", - "Create folders for artist": "Create folders for artist", - "Create folders for albums": "Create folders for albums", - "Separate albums by discs": "Separate albums by disks", - "Overwrite already downloaded files": "Overwrite already downloaded files", - "Copy ARL": "Copy ARL", - "Copy userToken/ARL Cookie for use in other apps.": - "Copy userToken/ARL Cookie for use in other apps.", - "Copied": "Copied", - "Log out": "Log out", - "Due to plugin incompatibility, login using browser is unavailable without restart.": - "Due to plugin incompatibility, login using browser is unavailable without restart.", - "(ARL ONLY) Continue": "(ARL ONLY) Continue", - "Log out & Exit": "Log out & Exit", - "Pick-a-Path": "Pick-a-Path", - "Select storage": "Select storage", - "Go up": "Go up", - "Permission denied": "Permission denied", - "Language": "Language", - "Language changed, please restart Freezer to apply!": - "Language changed, please restart Freezer to apply!", - "Importing...": "Importing...", - "Radio": "Radio", - "Flow": "Flow", - "Track is not available on Deezer!": "Track is not available on Deezer!", - "Failed to download track! Please restart.": "Failed to download track! Please restart.", - "Storage permission denied!": "Storage permission denied!", - "Failed": "Failed", - "Queued": "Queued", - "External": "Storage", - "Restart failed downloads": "Restart failed downloads", - "Clear failed": "Clear failed", - "Download Settings": "Download Settings", - "Create folder for playlist": "Create folder for playlist", - "Download .LRC lyrics": "Download .LRC lyrics", - "Proxy": "Proxy", - "Not set": "Not set", - "Search or paste URL": "Search or paste URL", - "History": "History", - "Download threads": "Concurrent downloads", - "Lyrics unavailable, empty or failed to load!": "Lyrics unavailable, empty or failed to load!", - "About": "About", - "Telegram Channel": "Telegram Channel", - "To get latest releases": "To get latest releases", - "Official chat": "Official chat", - "Telegram Group": "Telegram Group", - "Huge thanks to all the contributors! <3": "Huge thanks to all the contributors! <3", - "Edit playlist": "Edit playlist", - "Update": "Update", - "Playlist updated!": "Playlist updated!", - "Downloads added!": "Downloads added!", - "Save cover file for every track": "Save cover file for every track", - "Download Log": "Download Log", - "Repository": "Repository", - "Source code, report issues there.": "Source code, report issues there.", - "Use system theme": "Use system theme", - "Light": "Light", - "Popularity": "Popularity", - "User": "User", - "Track count": "Track count", - "If you want to use custom directory naming - use '/' as directory separator.": "If you want to use custom directory naming - use '/' as directory separator.", - "Share": "Share", - "Save album cover": "Save album cover", - "Warning": "Warning", - "Using too many concurrent downloads on older/weaker devices might cause crashes!": "Using too many concurrent downloads on older/weaker devices might cause crashes!", - "Create .nomedia files": "Create .nomedia files", - "To prevent gallery being filled with album art": "To prevent gallery being filled with album art" - } - diff --git a/translations/old_languages/ar_ar.dart b/translations/old_languages/ar_ar.dart deleted file mode 100644 index 0a419ed..0000000 --- a/translations/old_languages/ar_ar.dart +++ /dev/null @@ -1,212 +0,0 @@ -/* - -Translated by: Xandar Null - -*/ - -const language_ar_ar = { - "ar_ar": { - "Home": "القائمة الرئيسية", - "Search": "بحث", - "Library": "المكتبة", - "Offline mode, can't play flow or smart track lists.": "وضع خارج الشبكة, لا تستطيع تشغيل اغاني من قوائم ديزر فلو", - "Added to library": "تمت الاضافة الى المكتبة", - "Download": "تنزيل", - "Disk": "القرص", - "Offline": "خارج الشبكة", - "Top Tracks": "افضل الاغاني", - "Show more tracks": "اضهار المزيد من الاغاني", - "Top": "الافضل", - "Top Albums": "افضل الالبومات", - "Show all albums": "اضهار كل الالبومات", - "Discography": "كل الالبومات و الاغاني", - "Default": "افتراضي", - "Reverse": "عكس", - "Alphabetic": "أبجدي", - "Artist": "فنان", - "Post processing...": "بعد المعالجة...", - "Done": "تم", - "Delete": "حذف", - "Are you sure you want to delete this download?": "هل أنت متأكد أنك تريد حذف هذا التنزيل؟", - "Cancel": "الغاء", - "Downloads": "التنزيلات", - "Clear queue": "مسح قائمة الانتظار", - "This won't delete currently downloading item": "لن يؤدي هذا إلى حذف العنصر الذي يتم تنزيله حاليًا", - "Are you sure you want to delete all queued downloads?": "هل أنت متأكد أنك تريد حذف كافة التنزيلات في قائمة الانتظار؟", - "Clear downloads history": "مسح تاريخ التنزيلات", - "WARNING: This will only clear non-offline (external downloads)": "تحذير: سيؤدي هذا فقط إلى مسح الملفات غير المتصلة (التنزيلات الخارجية)", - "Please check your connection and try again later...": "يرجى التحقق من الاتصال الخاص بك والمحاولة مرة أخرى في وقت لاحق...", - "Show more": "اظهار المزيد", - "Importer": "المستورد", - "Currently supporting only Spotify, with 100 tracks limit": "حاليا يدعم سبوتفاي فقط, بحد اقصى 100 اغنية", - "Due to API limitations": "بسبب قيود API", - "Enter your playlist link below": "أدخل رابط قائمة التشغيل أدناه", - "Error loading URL!": "خطأ في تنزيل الرابط!", - "Convert": "تحويل", - "Download only": "تنزيل فقط", - "Downloading is currently stopped, click here to resume.": "التنزيل متوقف حاليًا ، انقر هنا للاستئناف.", - "Tracks": "اغاني", - "Albums": "البومات", - "Artists": "فنانون", - "Playlists": "قوائم تشغيل", - "Import": "استيراد", - "Import playlists from Spotify": "استيراد قائمة تشغيل من سبوتيفاي", - "Statistics": "احصائيات", - "Offline tracks": "اغاني بدون اتصال", - "Offline albums": "البومات بدون اتصال", - "Offline playlists": "قوائم تشغيل بدون اتصال", - "Offline size": "حجم بدون اتصال", - "Free space": "مساحة فارغة", - "Loved tracks": "الاغاني المحبوبة", - "Favorites": "المفضلات", - "All offline tracks": "كل الاغاني بدون اتصال", - "Create new playlist": "انشاء قائمة تشغيل جديدة", - "Cannot create playlists in offline mode": "لا يمكن إنشاء قوائم التشغيل في وضع عدم الاتصال", - "Error": "خطأ", - "Error logging in! Please check your token and internet connection and try again.": "خطأ في تسجيل الدخول! يرجى التحقق من الرمز المميز والاتصال بالإنترنت وحاول مرة أخرى.", - "Dismiss": "رفض", - "Welcome to": "مرحبا بك في", - "Please login using your Deezer account.": "يرجى تسجيل الدخول باستخدام حساب ديزر الخاص بك.", - "Login using browser": "تسجيل الدخول باستخدام المتصفح", - "Login using token": "تسجيل الدخول باستخدام الرمز المميز", - "Enter ARL": "أدخل الرمز المميز (arl)", - "Token (ARL)": "الرمز المميز (ARL)", - "Save": "حفظ", - "If you don't have account, you can register on deezer.com for free.": "إذا لم يكن لديك حساب ، يمكنك التسجيل على deezer.com مجانًا.", - "Open in browser": "افتح في المتصفح", - "By using this app, you don't agree with the Deezer ToS": "باستخدام هذا التطبيق ، أنت لا توافق على شروط خدمة ديزر", - "Play next": "شغل التالي", - "Add to queue": "إضافة إلى قائمة الانتظار", - "Add track to favorites": "اضافة الاغنية الى المفضلة", - "Add to playlist": "اضافة الى قائمة التشغيل", - "Select playlist": "اختيار قائمة التشغيل", - "Track added to": "تم اضافة الاغنية الى", - "Remove from playlist": "إزالة من قائمة التشغيل", - "Track removed from": "تم إزالة الاغنية من", - "Remove favorite": "إزالة المفضلة", - "Track removed from library": "تم إزالة الاغنية من المكتبة", - "Go to": "الذهاب الى", - "Make offline": "جعله في وضع عدم الاتصال", - "Add to library": "إضافة إلى مكتبة", - "Remove album": "إزالة الالبوم", - "Album removed": "تم إزالة الالبوم", - "Remove from favorites": "تم الإزالة من المفضلة", - "Artist removed from library": "تم إزالة الفنان من المكتبة", - "Add to favorites": "اضافة الى المفضلة", - "Remove from library": "إزالة من المكتبة", - "Add playlist to library": "أضف قائمة التشغيل إلى المكتبة", - "Added playlist to library": "تم اضافة قائمة التشغيل الى المكتبة", - "Make playlist offline": "جعل قائمة التشغيل في وضع عدم الاتصال", - "Download playlist": "تنزيل قائمة التشغيل", - "Create playlist": "إنشاء قائمة التشغيل", - "Title": "عنوان", - "Description": "وصف", - "Private": "خاص", - "Collaborative": "التعاونيه", - "Create": "إنشاء", - "Playlist created!": "تم إنشاء قائمة التشغيل", - "Playing from:": "التشغيل من:", - "Queue": "قائمة الانتظار", - "Offline search": "البحث دون اتصال", - "Search Results": "نتائج البحث", - "No results!": "لا نتائج!", - "Show all tracks": "عرض كل الاغاني", - "Show all playlists": "عرض كل قوائم التشغيل", - "Settings": "الإعدادات", - "General": "عام", - "Appearance": "المظهر", - "Quality": "الجودة", - "Deezer": "ديزر", - "Theme": "ثيم", - "Currently": "حاليا", - "Select theme": "اختر ثيم", - "Light (default)": "ابيض (افتراضي)", - "Dark": "داكن (أفضل)", - "Black (AMOLED)": "أسود", - "Deezer (Dark)": "داكن (ديزر)", - "Primary color": "اللون الأساسي", - "Selected color": "اللون المحدد", - "Use album art primary color": "استخدم اللون الأساسي لصورة الألبوم", - "Warning: might be buggy": "تحذير: قد يكون غير مستقر", - "Mobile streaming": "البث عبر شبكة الجوال", - "Wifi streaming": "البث عبر الوايفاي", - "External downloads": "التنزيلات الخارجية", - "Content language": "لغة المحتوى", - "Not app language, used in headers. Now": "ليست لغة التطبيق المستخدمة في العناوين. الآن", - "Select language": "اختار اللغة", - "Content country": "بلد المحتوى", - "Country used in headers. Now": "البلد المستخدم في العناوين. الآن", - "Log tracks": "تسجيل الاغاني", - "Send track listen logs to Deezer, enable it for features like Flow to work properly": "أرسال سجلات الاستماع إلى ديزر ، قم بتمكينها لميزات مثل فلو لتعمل بشكل صحيح (ينصح تفعيلها)", - "Offline mode": "وضع عدم الاتصال", - "Will be overwritten on start.": "سيتم الكتابة فوقها في البداية.", - "Error logging in, check your internet connections.": "خطأ في تسجيل الدخول ، تحقق من اتصالات الإنترنت الخاص بك.", - "Logging in...": "جار تسجيل الدخول...", - "Download path": "مسار التنزيل", - "Downloads naming": "تسمية التنزيلات", - "Downloaded tracks filename": "اسم ملف الاغاني التي تم تنزيلها", - "Valid variables are": "المتغيرات الصالحة هي", - "Reset": "إعادة تعيين", - "Clear": "مسح", - "Create folders for artist": "إنشاء ملفات للفنان", - "Create folders for albums": "إنشاء ملفات للالبوم", - "Separate albums by discs": "افصل الالبومات عبر رقم الاقراص", - "Overwrite already downloaded files": "الكتابة فوق الملفات التي تم تنزيلها", - "Copy ARL": "نسخ الرمز المميز (ARL)", - "Copy userToken/ARL Cookie for use in other apps.": "انسخ ملف الرابط الرمز المميز لاستخدامه في تطبيقات أخرى.", - "Copied": "تم النسخ", - "Log out": "تسجيل خروج", - "Due to plugin incompatibility, login using browser is unavailable without restart.": "نظرًا لعدم توافق المكون الإضافي ، لا يتوفر تسجيل الدخول باستخدام المتصفح بدون إعادة التشغيل.", - "(ARL ONLY) Continue": "استمر (رمز مميز فقط ARL)", - "Log out & Exit": "تسجيل الخروج والخروج", - "Pick-a-Path": "اختر المسار", - "Select storage": "حدد وحدة التخزين", - "Go up": "اذهب للأعلى", - "Permission denied": "طلب الاذن مرفوض", - "Language": "اللغة", - "Language changed, please restart Freezer to apply!": "تم تغيير اللغة، الرجاء إعادة تشغيل فريزر لتطبيق!", - "Importing...": "جار الاستيراد...", - "Radio": "راديو", - - //0.5.0 Strings: - "Storage permission denied!": "رفض إذن التخزين!", - "Failed": "فشل", - "Queued": "في قائمة الانتظار", - "Restart failed downloads": "أعد استئناف التنزيلات الفاشلة", - "Clear failed": "فشل المسح", - "Download Settings": "إعدادات التنزيل", - "Create folder for playlist": "إنشاء ملف لقائمة التشغيل", - "Download .LRC lyrics": "تنزيل ملف كلمات الاغنية .LRC", - "Proxy": "بروكسي", - "Not set": "غير محدد", - "Search or paste URL": "ابحث أو الصق رابط", - "History": "تاريخ السماع", - "Download threads": "عدد التنزيلات في نفس الوقت", - "Lyrics unavailable, empty or failed to load!": "الكلمات غير متوفرة، فارغة أو فشل تنزيلها!", - "About": "حول البرنامج", - "Telegram Channel": "قناة التلكرام", - "To get latest releases": "لتنزيل اخر اصدارات البرنامج", - "Official chat": "الدردشة الرسمية", - "Telegram Group": "مجموعة التلكرام", - "Huge thanks to all the contributors! <3": "شكرا جزيلا لجميع المساهمين! <3", - "Edit playlist": "تعديل قائمة التشغيل", - "Update": "تحديث", - "Playlist updated!": "تم تحديث قائمة التشغيل!", - "Downloads added!": "تم إضافة التنزيلات!", - "External": "تخزين", - "Save cover file for every track": "حفظ صورة الالبوم لكل اغنية", - "Download Log": "سجل التنزيل", - "Repository": "Repository", - "Source code, report issues there.": "كود المصدر ، ابلغ عن المشاكل هنا.", - - //0.5.2 Strings: - "Use system theme": "استخدم ثيم النظام", - "Light": "ابيض", - - //0.5.3 Strings: - "Popularity": "الشعبية", - "User": "المستخدم", - "Track count": "عدد الاغاني", - "If you want to use custom directory naming - use '/' as directory separator.": "إذا كنت تريد استخدام تسمية مخصصة، استخدم '/' كفاصل بين المسار." - } -}; diff --git a/translations/old_languages/de_de.dart b/translations/old_languages/de_de.dart deleted file mode 100644 index 197e62d..0000000 --- a/translations/old_languages/de_de.dart +++ /dev/null @@ -1,236 +0,0 @@ -/* - -Translated by: Markus - -*/ -const language_de_de = { - "de_de": { - "Home": "Start", - "Search": "Suche", - "Library": "Mediathek", - "Offline mode, can't play flow or smart track lists.": - "Offline-Modus, kann keine Flow- oder Smart Track-Listen abspielen.", - "Added to library": "Zur Mediathek hinzufügen", - "Download": "Download", - "Disk": "Disk", - "Offline": "Offline", - "Top Tracks": "Top Titel", - "Show more tracks": "Zeige mehr Titel", - "Top": "Top", - "Top Albums": "Top Alben", - "Show all albums": "Zeige alle Alben", - "Discography": "Diskografie", - "Default": "Standard", - "Reverse": "Rückwärts", - "Alphabetic": "Alphabetisch", - "Artist": "Künstler", - "Post processing...": "Nachbearbeitung...", - "Done": "Erledigt", - "Delete": "Gelöscht", - "Are you sure you want to delete this download?": - "Bist du sicher, dass du diesen Download löschen willst?", - "Cancel": "Abbrechen", - "Downloads": "Downloads", - "Clear queue": "Warteschleife löschen", - "This won't delete currently downloading item": - "Dies löscht das derzeit heruntergeladene Element nicht", - "Are you sure you want to delete all queued downloads?": - "Bist du sicher, dass du alle Downloads aus der Warteschleife löschen willst?", - "Clear downloads history": "Download-Verlauf löschen", - "WARNING: This will only clear non-offline (external downloads)": - "ACHTUNG: (Externe Downloads) werden entfernt", - "Please check your connection and try again later...": - "Bitte überprüfe deine Verbindung und versuche es später noch einmal...", - "Show more": "Mehr anzeigen", - "Importer": "Importieren", - "Currently supporting only Spotify, with 100 tracks limit": - "Derzeit begrenzt auf maximal 100 Titel", - "Due to API limitations": "Aufgrund von API-Einschränkungen", - "Enter your playlist link below": - "Gebe deinen Wiedergabelisten-Link unten ein", - "Error loading URL!": "Fehler beim Laden der URL!", - "Convert": "Konvertieren", - "Download only": "Nur Herunterladen", - "Downloading is currently stopped, click here to resume.": - "Das Herunterladen ist derzeit gestoppt, klicke hier, um fortzufahren.", - "Tracks": "Titel", - "Albums": "Alben", - "Artists": "Künstler", - "Playlists": "Wiedergabelisten", - "Import": "Importieren", - "Import playlists from Spotify": "Wiedergabelisten aus Spotify importieren", - "Statistics": "Statistiken", - "Offline tracks": "Offline-Titel", - "Offline albums": "Offline-Alben", - "Offline playlists": "Offline-Wiedergabelisten", - "Offline size": "Offline-Größe", - "Free space": "Freier Speicherplatz", - "Loved tracks": "Beliebte Titel", - "Favorites": "Favoriten", - "All offline tracks": "Alle Offline-Titel", - "Create new playlist": "Neue Wiedergabeliste erstellen", - "Cannot create playlists in offline mode": - "Wiedergabelisten können im Offline-Modus nicht erstellt werden", - "Error": "Fehler", - "Error logging in! Please check your token and internet connection and try again.": - "Fehler beim Einloggen! Bitte überprüfe dein Token und deine Internetverbindung und versuche es erneut.", - "Dismiss": "Verwerfen", - "Welcome to": "Willkommen bei", - "Please login using your Deezer account.": - "Bitte melde dich mit deinem Deezer-Konto an.", - "Login using browser": "Anmeldung über Browser", - "Login using token": "Anmeldung per Token", - "Enter ARL": "ARL eingeben", - "Token (ARL)": "Token (ARL)", - "Save": "Speichern", - "If you don't have account, you can register on deezer.com for free.": - "Wenn Du noch kein Konto hast, kannst Du Dich kostenlos auf deezer.com registrieren.", - "Open in browser": "Im Browser öffnen", - "By using this app, you don't agree with the Deezer ToS": - "Wenn Du diese Anwendung verwendest, bist Du nicht mit den Deezer ToS einverstanden", - "Play next": "Als nächstes spielen", - "Add to queue": "Zur Warteschleife hinzufügen", - "Add track to favorites": "Titel zu Favoriten hinzufügen", - "Add to playlist": "Zur Wiedergabeliste hinzufügen", - "Select playlist": "Wiedergabeliste auswählen", - "Track added to": "Titel hinzugefügt zu", - "Remove from playlist": "Aus Wiedergabeliste entfernen", - "Track removed from": "Titel entfernt aus", - "Remove favorite": "Favorit entfernen", - "Track removed from library": "Titel aus Mediathek entfernt", - "Go to": "Gehe zu", - "Make offline": "Offline verfügbar machen", - "Add to library": "Zur Mediathek hinzufügen", - "Remove album": "Album entfernen", - "Album removed": "Album entfernt", - "Remove from favorites": "Aus Favoriten entfernen", - "Artist removed from library": "Künstler aus Bibliothek entfernt", - "Add to favorites": "Zu Favoriten hinzufügen", - "Remove from library": "Aus der Mediathek entfernen", - "Add playlist to library": "Wiedergabeliste zur Mediathek hinzufügen", - "Added playlist to library": "Wiedergabeliste zur Mediathek hinzugefügt", - "Make playlist offline": "Wiedergabeliste offline verfügbar machen", - "Download playlist": "Wiedergabeliste herunterladen", - "Create playlist": "Wiedergabeliste erstellen", - "Title": "Titel", - "Description": "Beschreibung", - "Private": "Privat", - "Collaborative": "Collaborative", - "Create": "Erstellen", - "Playlist created!": "Wiedergabeliste erstellt!", - "Playing from:": "Wiedergabe von:", - "Queue": "Warteschleife", - "Offline search": "Offline-Suche", - "Search Results": "Suchergebnisse", - "No results!": "Keine Ergebnisse!", - "Show all tracks": "Alle Titel anzeigen", - "Show all playlists": "Alle Wiedergabelisten anzeigen", - "Settings": "Einstellungen", - "General": "Allgemein", - "Appearance": "Aussehen", - "Quality": "Qualität", - "Deezer": "Deezer", - "Theme": "App-Design", - "Currently": "Aktuell", - "Select theme": "App-Design auswählen", - "Light (default)": "Heller Modus (Standard)", - "Dark": "Dunkler Modus", - "Black (AMOLED)": "Schwarz (AMOLED)", - "Deezer (Dark)": "Deezer (Dunkel)", - "Primary color": "Primärfarbe", - "Selected color": "Ausgewählte Farbe", - "Use album art primary color": "Verwende die Primärfarbe des Albumcovers", - "Warning: might be buggy": "Warnung: könnte fehlerhaft sein", - "Mobile streaming": "Wiedergabe über Mobilfunknetz", - "Wifi streaming": "Wiedergabe über WLAN", - "External downloads": "Externe Downloads", - "Content language": "Content-Sprache", - "Not app language, used in headers. Now": "Aktuell", - "Select language": "Sprache auswählen", - "Content country": "Content-Land", - "Country used in headers. Now": "Aktuell", - "Log tracks": "Protokolliere Titel", - "Send track listen logs to Deezer, enable it for features like Flow to work properly": - "Gehörte Titel-Protokolle an Deezer senden, damit Flow richtig funktioniert", - "Offline mode": "Offline-Modus", - "Will be overwritten on start.": "Wird beim Start überschrieben.", - "Error logging in, check your internet connections.": - "Fehler beim Anmelden, überprüfe deine Internetverbindung.", - "Logging in...": "Angemeldet...", - "Download path": "Download-Pfad", - "Downloads naming": "Benennung der Downloads", - "Downloaded tracks filename": "Dateiname der heruntergeladenen Titel", - "Valid variables are": "Gültige Variablen sind", - "Reset": "Zurücksetzen", - "Clear": "Löschen", - "Create folders for artist": "Ordner für Künstler erstellen", - "Create folders for albums": "Ordner für Alben erstellen", - "Separate albums by discs": "Alben nach Discs trennen", - "Overwrite already downloaded files": - "Bereits heruntergeladene Dateien überschreiben", - "Copy ARL": "ARL kopieren", - "Copy userToken/ARL Cookie for use in other apps.": - "UserToken / ARL-Cookie zur Verwendung in anderen Anwendungen kopieren.", - "Copied": "Kopiert", - "Log out": "Abmelden", - "Due to plugin incompatibility, login using browser is unavailable without restart.": - "Aufgrund von Plugin-Inkompatibilität ist die Anmeldung mit dem Browser ohne Neustart nicht möglich.", - "(ARL ONLY) Continue": "(NUR ARL) Fortfahren", - "Log out & Exit": "Abmelden & Beenden", - "Pick-a-Path": "Wähle einen Pfad", - "Select storage": "Verzeichnis auswählen", - "Go up": "Nach oben", - "Permission denied": "Zugriff verweigert", - "Language": "Sprache", - "Language changed, please restart Freezer to apply!": - "Sprache geändert, bitte Freezer neu starten!", - "Importing...": "Importiere...", - "Radio": "Radio", - //0.5.0 Strings: - "Storage permission denied!": "Speicherzugriff verweigert!", - "Failed": "Fehlgeschlagen", - "Queued": "Warteschleife", - //Updated in 0.5.1 - used in context of download: - "External": "Speicherplatz", - //0.5.0 - "Restart failed downloads": "Fehlgeschlagene Downloads neu starten", - "Clear failed": "Fehlgeschlagene Downloads löschen", - "Download Settings": "Download-Einstellungen", - "Create folder for playlist": "Ordner für Wiedergabelisten erstellen", - "Download .LRC lyrics": "Download .LRC lyrics", - "Proxy": "Proxy", - "Not set": "Nicht festgelegt", - "Search or paste URL": "Suchen oder Einfügen von URLs", - "History": "Verlauf", - //Updated 0.5.1 - "Download threads": "Gleichzeitige Downloads", - //0.5.0 - "Lyrics unavailable, empty or failed to load!": "Lyrics nicht verfügbar, leer oder laden fehlgeschlagen!", - "About": "Über", - "Telegram Channel": "Telegram Kanal", - "To get latest releases": "Um die neuesten Versionen zu erhalten", - "Official chat": "Offizieller Chat", - "Telegram Group": "Telegram Gruppe", - "Huge thanks to all the contributors! <3": "Großer Dank an alle Mitwirkenden! <3", - "Edit playlist": "Wiedergabeliste bearbeiten", - "Update": "Update", - "Playlist updated!": "Wiedergabeliste aktualisiert!", - "Downloads added!": "Downloads hinzugefügt!", - - //0.5.1 Strings: - "Save cover file for every track": "Albumcover für jeden Titel speichern", - "Download Log": "Download-Log", - "Repository": "Repository", - "Source code, report issues there.": "Quellcode, Probleme dort melden.", - - //0.5.2 Strings: - "Use system theme": "Systemvorgabe benutzen", - "Light": "Heller Modus", - - //0.5.3 Strings: - "Popularity": "Beliebtheit", - "User": "Benutzer", - "Track count": "Anzahl der Titel", - "If you want to use custom directory naming - use '/' as directory separator.": "Wenn du eine benutzerdefinierte Verzeichnisbenennung verwenden möchtest - verwende '/' als Verzeichnistrennzeichen." - } -}; \ No newline at end of file diff --git a/translations/old_languages/el_gr.dart b/translations/old_languages/el_gr.dart deleted file mode 100644 index adcc630..0000000 --- a/translations/old_languages/el_gr.dart +++ /dev/null @@ -1,244 +0,0 @@ -/* - -Translated by: VIRGIN_KLM - - */ - -const language_el_gr = { - "el_gr": { - "Home": "Αρχική", - "Search": "Αναζήτηση", - "Library": "Βιβλιοθήκη", - "Offline mode, can't play flow or smart track lists.": - "Λειτουργία εκτός σύνδεσης, δεν είναι δυνατή η αναπαραγωγή flow ή έξυπνων λιστών κομματιών.", - "Added to library": "Προστέθηκε στη βιβλιοθήκη", - "Download": "Λήψη", - "Disk": "Δίσκος", - "Offline": "Εκτός σύνδεσης", - "Top Tracks": "Κορυφαία κομμάτια", - "Show more tracks": "Εμφάνιση περισσότερων κομματιών", - "Top": "Κορυφαία", - "Top Albums": "Κορυφαία Album", - "Show all albums": "Εμφάνιση όλων των album", - "Discography": "Δισκογραφία", - "Default": "Προεπιλογή", - "Reverse": "Αντίστροφα", - "Alphabetic": "Αλφαβητικά", - "Artist": "Καλλιτέχνης", - "Post processing...": "Μετεπεξεργασία...", - "Done": "Ολοκληρώθηκε", - "Delete": "Διαγραφή", - "Are you sure you want to delete this download?": - "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτήν τη λήψη;", - "Cancel": "Άκυρο", - "Downloads": "Λήψεις", - "Clear queue": "Εκκαθάριση ουράς", - "This won't delete currently downloading item": - "Αυτό δεν θα διαγράψει το τρέχον αντικείμενο λήψης", - "Are you sure you want to delete all queued downloads?": - "Είστε βέβαιοι ότι θέλετε να διαγράψετε όλες τις λήψεις στην ουρά;", - "Clear downloads history": "Διαγραφή ιστορικού λήψεων", - "WARNING: This will only clear non-offline (external downloads)": - "ΠΡΟΕΙΔΟΠΟΙΗΣΗ: Αυτό θα καθαρίσει μόνο τις εκτός σύνδεσης (εξωτερικές) λήψεις", - "Please check your connection and try again later...": - "Ελέγξτε τη σύνδεσή σας και δοκιμάστε ξανά αργότερα...", - "Show more": "Δείτε περισσότερα", - "Importer": "Εισαγωγέας", - "Currently supporting only Spotify, with 100 tracks limit": - "Αυτήν τη στιγμή υποστηρίζεται μόνο το Spotify, με όριο 100 κομματιών", - "Due to API limitations": "Λόγω περιορισμών API", - "Enter your playlist link below": - "Εισαγάγετε τον σύνδεσμο λίστας αναπαραγωγής παρακάτω", - "Error loading URL!": "Σφάλμα φόρτωσης διεύθυνσης URL!", - "Convert": "Μετατροπή", - "Download only": "Μόνο λήψη", - "Downloading is currently stopped, click here to resume.": - "Η λήψη έχει σταματήσει, κάντε κλικ εδώ για να συνεχίσετε.", - "Tracks": "Κομμάτια", - "Albums": "Album", - "Artists": "Καλλιτέχνες", - "Playlists": "Λίστες αναπαραγωγής", - "Import": "Εισαγωγή", - "Import playlists from Spotify": - "Εισαγωγή λιστών αναπαραγωγής από το Spotify", - "Statistics": "Στατιστικά", - "Offline tracks": "Κομμάτια εκτός σύνδεσης", - "Offline albums": "Album εκτός σύνδεσης", - "Offline playlists": "Λίστες αναπαραγωγής εκτός σύνδεσης", - "Offline size": "Μέγεθος εκτός σύνδεσης", - "Free space": "Ελεύθερος χώρος", - "Loved tracks": "Αγαπημένα κομμάτια", - "Favorites": "Αγαπημένα", - "All offline tracks": "Όλα τα κομμάτια εκτός σύνδεσης", - "Create new playlist": "Δημιουργία λίστας αναπαραγωγής", - "Cannot create playlists in offline mode": - "Δεν είναι δυνατή η δημιουργία λιστών αναπαραγωγής σε λειτουργία εκτός σύνδεσης", - "Error": "Σφάλμα", - "Error logging in! Please check your token and internet connection and try again.": - "Σφάλμα σύνδεσης! Ελέγξτε το token και τη σύνδεσή σας στο δίκτυο και δοκιμάστε ξανά.", - "Dismiss": "Απόρριψη", - "Welcome to": "Καλωσήρθατε στο", - "Please login using your Deezer account.": - "Συνδεθείτε χρησιμοποιώντας τον λογαριασμό σας στο Deezer.", - "Login using browser": "Σύνδεση χρησιμοποιώντας το πρόγραμμα περιήγησης", - "Login using token": "Σύνδεση χρησιμοποιώντας token", - "Enter ARL": "Εισαγωγή ARL", - "Token (ARL)": "Token (ARL)", - "Save": "Αποθήκευση", - "If you don't have account, you can register on deezer.com for free.": - "Εάν δεν έχετε λογαριασμό, μπορείτε να εγγραφείτε δωρεάν στο deezer.com.", - "Open in browser": "Ανοιγμα σε πρόγραμμα περιήγησης", - "By using this app, you don't agree with the Deezer ToS": - "Χρησιμοποιώντας αυτήν την εφαρμογή, δεν συμφωνείτε με τους κανονισμούς χρήσης Deezer", - "Play next": "Παίξε αμέσως μετά", - "Add to queue": "Προσθήκη στην ουρά", - "Add track to favorites": "Προσθήκη κομμάτι στα αγαπημένα", - "Add to playlist": "Προσθήκη στην λίστα αναπαραγωγής", - "Select playlist": "Επιλογή λίστας αναπαραγωγής", - "Track added to": "Το κομμάτι προστέθηκε στο", - "Remove from playlist": "Κατάργηση από τη λίστα αναπαραγωγής", - "Track removed from": "Το κομμάτι καταργήθηκε από", - "Remove favorite": "Κατάργηση αγαπημένου", - "Track removed from library": "Το κομμάτι καταργήθηκε από τη βιβλιοθήκη", - "Go to": "Πήγαινε σε", - "Make offline": "Κάνε εκτός σύνδεσης", - "Add to library": "Προσθήκη στη βιβλιοθήκη", - "Remove album": "Κατάργηση album", - "Album removed": "Το album καταργήθηκε", - "Remove from favorites": "Κατάργηση από τα αγαπημένα", - "Artist removed from library": - "Ο καλλιτέχνης καταργήθηκε από τη βιβλιοθήκη", - "Add to favorites": "Προσθήκη στα αγαπημένα", - "Remove from library": "Κατάργηση από τη βιβλιοθήκη", - "Add playlist to library": "Προσθήκη λίστας αναπαραγωγής στη βιβλιοθήκη", - "Added playlist to library": "Προστέθηκε λίστα αναπαραγωγής στη βιβλιοθήκη", - "Make playlist offline": "Δημιουργία λίστας αναπαραγωγής εκτός σύνδεσης", - "Download playlist": "Λήψη λίστας αναπαραγωγής", - "Create playlist": "Δημιουργία λίστας αναπαραγωγής", - "Title": "Τίτλος", - "Description": "Περιγραφή", - "Private": "Ιδιωτικό", - "Collaborative": "Συνεργατικό", - "Create": "Δημιουργία", - "Playlist created!": "Η λίστα αναπαραγωγής δημιουργήθηκε!", - "Playing from:": "Παίζοντας από:", - "Queue": "Ουρά", - "Offline search": "Αναζήτηση εκτός σύνδεσης", - "Search Results": "Αποτελέσματα αναζήτησης", - "No results!": "Κανένα αποτέλεσμα!", - "Show all tracks": "Εμφάνιση όλων των κομματιών", - "Show all playlists": "Εμφάνιση όλων των λιστών αναπαραγωγής", - "Settings": "Ρυθμίσεις", - "General": "Γενικά", - "Appearance": "Εμφάνιση", - "Quality": "Ποιότητα", - "Deezer": "Deezer", - "Theme": "Θέμα", - "Currently": "Τρέχον", - "Select theme": "Επιλογή θέματος", - "Light (default)": "Φωτεινό (Προεπιλογή)", - "Dark": "Σκούρο", - "Black (AMOLED)": "Μαύρο (AMOLED)", - "Deezer (Dark)": "Deezer (Σκούρο)", - "Primary color": "Πρωτεύον χρώμα", - "Selected color": "Επιλεγμένο χρώμα", - "Use album art primary color": - "Χρησιμοποιήστε το πρωτεύον χρώμα του εξώφυλλου του album", - "Warning: might be buggy": "Προειδοποίηση: μπορεί να μη λειτουργεί σωστά", - "Mobile streaming": "Ροή μέσω δεδομένων κινητού δικτύου", - "Wifi streaming": "Ροή μέσω WIFI", - "External downloads": "Εξωτερικές λήψεις", - "Content language": "Γλώσσα περιεχομένου", - "Not app language, used in headers. Now": - "Όχι γλώσσα εφαρμογής, χρησιμοποιείται στις κεφαλίδες. Τρέχουσα", - "Select language": "Επιλογή γλώσσας", - "Content country": "Χώρα περιεχομένου", - "Country used in headers. Now": - "Χώρα που χρησιμοποιείται στις κεφαλίδες. Τρέχουσα", - "Log tracks": "Αρχεία καταγραφής", - "Send track listen logs to Deezer, enable it for features like Flow to work properly": - "Αποστολή αρχείων καταγραφής ακρόασης στο Deezer, ενεργοποιήστε το για ορθή λειτουργία υπηρεσιών όπως το Flow", - "Offline mode": "Λειτουργία εκτός σύνδεσης", - "Will be overwritten on start.": "Θα αντικατασταθεί κατά την εκκίνηση.", - "Error logging in, check your internet connections.": - "Σφάλμα σύνδεσης, ελέγξτε την σύνδεσή σας στο Δίκτυο.", - "Logging in...": "Σύνδεση...", - "Download path": "Διαδρομή λήψεων", - "Downloads naming": "Ονομασία λήψεων", - "Downloaded tracks filename": "Λήψη ονόματος αρχείου κομματιών", - "Valid variables are": "Οι έγκυρες μεταβλητές είναι", - "Reset": "Επαναφορά", - "Clear": "Εκκαθάριση", - "Create folders for artist": "Δημιουργήστε φακέλου για καλλιτέχνη", - "Create folders for albums": "Δημιουργήστε φακέλων για album", - "Separate albums by discs": "Διαχωρισμός albums σε δίσκους", - "Overwrite already downloaded files": "Αντικατάσταση ήδη ληφθέντων αρχείων", - "Copy ARL": "Αντιγραφή ARL", - "Copy userToken/ARL Cookie for use in other apps.": - "Αντιγραφή userToken/ARL Cookie για χρήση σε άλλες εφαρμογές.", - "Copied": "Αντιγράφηκε", - "Log out": "Αποσύνδεση", - "Due to plugin incompatibility, login using browser is unavailable without restart.": - "Λόγω ασυμβατότητας προσθηκών, η σύνδεση μέσω προγράμματος περιήγησης δεν είναι διαθέσιμη χωρίς επανεκκίνηση.", - "(ARL ONLY) Continue": "(ARL ΜΟΝΟ) Συνέχεια", - "Log out & Exit": "Αποσύνδεση & Έξοδος", - "Pick-a-Path": "Διαλέξτε ένα μονοπάτι", - "Select storage": "Επιλέξτε χώρο αποθήκευσης", - "Go up": "Πήγαινε πάνω", - "Permission denied": "Η άδεια απορρίφθηκε", - "Language": "Γλώσσα", - "Language changed, please restart Freezer to apply!": - "Η γλώσσα άλλαξε, κάντε επανεκκίνηση του Freezer για εφαρμογή!", - "Importing...": "Εισαγωγή...", - "Radio": "Ραδιόφωνο", - "Flow": "Flow", - "Track is not available on Deezer!": - "Το κομμάτι δεν είναι διαθέσιμο στο Deezer!", - "Failed to download track! Please restart.": - "Αποτυχία λήψης κομματιού! Κάντε επανεκκίνηση. ", - - //0.5.0 Strings: - "Storage permission denied!": "Η άδεια χώρου αποθήκευσης απορρίφθηκε!", - "Failed": "Απέτυχαν", - "Queued": "Σε ουρά", - //Updated in 0.5.1 - used in context of download: - "External": "Χώρος αποθήκευσης", - //0.5.0 - "Restart failed downloads": "Επανεκκίνηση αποτυχημένων λήψεων", - "Clear failed": "Εκκαθάριση αποτυχημένων", - "Download Settings": "Ρυθμίσεις Λήψεων", - "Create folder for playlist": "Δημιουργία φακέλου για λίστα αναπαραγωγής", - "Download .LRC lyrics": "Λήψη στίχων .LRC", - "Proxy": "Μεσολαβητής", - "Not set": "Δεν ρυθμίστηκε", - "Search or paste URL": "Αναζήτηση ή επικόλληση διεύθυνσης URL", - "History": "Ιστορικό", - //Updated 0.5.1 - "Download threads": "Ταυτόχρονες λήψεις", - //0.5.0 - "Lyrics unavailable, empty or failed to load!": - "Οι στίχοι δεν είναι διαθέσιμοι, είναι άδειοι ή δεν φορτώθηκαν!", - "About": "Σχετικά", - "Telegram Channel": "Κανάλι Telegram ", - "To get latest releases": "Για να λάβετε τις τελευταίες κυκλοφορίες", - "Official chat": "Επίσημη συνομιλία", - "Telegram Group": "Ομάδα Telegram", - "Huge thanks to all the contributors! <3": - "Πολλά ευχαριστώ σε όλους τους συνεισφέροντες! <3", - "Edit playlist": "Edit playlist", - "Update": "Ενημέρωση", - "Playlist updated!": "Η λίστα αναπαραγωγής ενημερώθηκε!", - "Downloads added!": "Προστέθηκαν λήψεις!", - - //0.5.1 Strings: - "Save cover file for every track": "Αποθήκευση εξώφυλλου για κάθε κομμάτι", - "Download Log": "Αρχείο καταγραφής λήψεων", - "Repository": "Repository", - "Source code, report issues there.": - "Πηγαίος κώδικας, αναφέρετε ζητήματα εκεί.", - - //0.5.2 Strings: - "Use system theme": "Χρησιμοποίηση θέματος συστήματος", - "Light": "Φωτεινο" - } -}; diff --git a/translations/old_languages/es_es.dart b/translations/old_languages/es_es.dart deleted file mode 100644 index 9ebbcbe..0000000 --- a/translations/old_languages/es_es.dart +++ /dev/null @@ -1,235 +0,0 @@ -/* - -Translated by: ArcherDelta & PetFix - -*/ - -const language_es_es = { - "es_es": { - "Home": "Inicio", - "Search": "Buscar", - "Library": "Biblioteca", - "Offline mode, can't play flow or smart track lists.": - "Modo sin conexión, no se puede reproducir el flow o las listas de pistas inteligentes.", - "Added to library": "Agregado a la biblioteca", - "Download": "Descargar", - "Disk": "Disco", - "Offline": "Sin conexión", - "Top Tracks": "Los mejores temas", - "Show more tracks": "Mostrar más pistas", - "Top": "Top", - "Top Albums": "Mejores álbumes", - "Show all albums": "Mostrar todos los álbumes", - "Discography": "Discografía", - "Default": "Predeterminado", - "Reverse": "Invertir", - "Alphabetic": "Alfabético", - "Artist": "Artista", - "Post processing...": "Post procesamiento...", - "Done": "Hecho", - "Delete": "Eliminar", - "Are you sure you want to delete this download?": - "¿Estás seguro de que quieres borrar esta descarga?", - "Cancel": "Cancelar", - "Downloads": "Descargas", - "Clear queue": "Limpiar la cola", - "This won't delete currently downloading item": - "Esto no borrará el elemento que se está descargando actualmente", - "Are you sure you want to delete all queued downloads?": - "¿Estás seguro de que quieres borrar todas las descargas en cola?", - "Clear downloads history": "Borrar el historial de descargas", - "WARNING: This will only clear non-offline (external downloads)": - "ADVERTENCIA: Esto sólo borrará las descargas que no están en modo sin conexión (descargas externas).", - "Please check your connection and try again later...": - "Por favor, compruebe su conexión y vuelva a intentarlo más tarde...", - "Show more": "Mostrar más", - "Importer": "Importador", - "Currently supporting only Spotify, with 100 tracks limit": - "Actualmente sólo se soporta Spotify, con un límite de 100 pistas", - "Due to API limitations": "Debido a limitaciones de API", - "Enter your playlist link below": - "Ingrese el enlace de su lista de reproducción a continuación", - "Error loading URL!": "¡Error al cargar la URL!", - "Convert": "Convertir", - "Download only": "Sólo descargar", - "Downloading is currently stopped, click here to resume.": - "La descarga está actualmente detenida, haga clic aquí para reanudarla.", - "Tracks": "Pistas", - "Albums": "Álbumes", - "Artists": "Artistas", - "Playlists": "Listas de reproducción", - "Import": "Importar", - "Import playlists from Spotify": - "Importar listas de reproducción de Spotify", - "Statistics": "Estadísticas", - "Offline tracks": "Pistas sin conexión", - "Offline albums": "Álbumes sin conexión", - "Offline playlists": "Listas de reproducción sin conexión", - "Offline size": "El tamaño sin conexión", - "Free space": "Espacio libre", - "Loved tracks": "Pistas favoritas", - "Favorites": "Favoritas", - "All offline tracks": "Todas las pistas fuera de línea", - "Create new playlist": "Crear nueva lista de reproducción", - "Cannot create playlists in offline mode": - "No se pueden crear listas de reproducción en el modo sin conexión", - "Error": "Error", - "Error logging in! Please check your token and internet connection and try again.": - "¡Error al iniciar la sesión! Por favor, compruebe su token y su conexión a Internet e inténtelo de nuevo.", - "Dismiss": "Descartar", - "Welcome to": "Bienvenido a", - "Please login using your Deezer account.": - "Por favor, inicie sesión con su cuenta de Deezer.", - "Login using browser": "Ingresar usando el navegador", - "Login using token": "Ingresar usando token", - "Enter ARL": "Ingrese ARL", - "Token (ARL)": "Token (ARL)", - "Save": "Guardar", - "If you don't have account, you can register on deezer.com for free.": - "Si no tienes una cuenta, puedes registrarte en deezer.com de forma gratuita.", - "Open in browser": "Abrir en el navegador", - "By using this app, you don't agree with the Deezer ToS": - "Al usar esta aplicación, no está de acuerdo con las Condiciones de servicio de Deezer", - "Play next": "Reproducir siguiente", - "Add to queue": "Añadir a la cola", - "Add track to favorites": "Agregar pista a favoritos", - "Add to playlist": "Agregar a la lista de reproducción", - "Select playlist": "Seleccionar lista de reproducción", - "Track added to": "Pista agregada a", - "Remove from playlist": "Quitar de la lista de reproducción", - "Track removed from": "Pista eliminada de", - "Remove favorite": "Eliminar favorito", - "Track removed from library": "Pista eliminada de la biblioteca", - "Go to": "Ir a", - "Make offline": "Hacerlo sin conexión", - "Add to library": "Agregar a la biblioteca", - "Remove album": "Eliminar álbum", - "Album removed": "Álbum eliminado", - "Remove from favorites": "Eliminar de favoritos", - "Artist removed from library": "Artista eliminado de la biblioteca", - "Add to favorites": "Agregar a favoritos", - "Remove from library": "Eliminar de la biblioteca", - "Add playlist to library": "Agregar lista de reproducción a la biblioteca", - "Added playlist to library": - "Lista de reproducción agregada a la biblioteca", - "Make playlist offline": "Hacer lista de reproducción sin conexión", - "Download playlist": "Descargar lista de reproducción", - "Create playlist": "Crear lista de reproducción", - "Title": "Título", - "Description": "Descripción", - "Private": "Privado", - "Collaborative": "Colaborativo", - "Create": "Crear", - "Playlist created!": "Lista de reproducción creada!", - "Playing from:": "Reproduciendo desde:", - "Queue": "Cola", - "Offline search": "Búsqueda sin conexión", - "Search Results": "Resultados de la búsqueda", - "No results!": "No hay resultados!", - "Show all tracks": "Mostrar todas las pistas", - "Show all playlists": "Mostrar todas las listas de reproducción", - "Settings": "Ajustes", - "General": "General", - "Appearance": "Apariencia", - "Quality": "Calidad", - "Deezer": "Deezer", - "Theme": "Tema", - "Currently": "Actualmente", - "Select theme": "Seleccione el tema", - "Light (default)": "Claro (predeterminado)", - "Dark": "Oscuro", - "Black (AMOLED)": "Negro (AMOLED)", - "Deezer (Dark)": "Deezer (oscuro)", - "Primary color": "Color primario", - "Selected color": "Color seleccionado", - "Use album art primary color": - "Usar el color primario de la carátula del álbum", - "Warning: might be buggy": "Advertencia: podría tener errores", - "Mobile streaming": "Transmisión móvil", - "Wifi streaming": "Transmisión WiFi", - "External downloads": "Descargas externas", - "Content language": "Lenguaje del contenido", - "Not app language, used in headers. Now": - "No es un lenguaje de la aplicación, se usa en los encabezados. Ahora", - "Select language": "Seleccione el idioma", - "Content country": "País del contenido", - "Country used in headers. Now": "País utilizado en los encabezados. Ahora", - "Log tracks": "Seguimiento de las pistas", - "Send track listen logs to Deezer, enable it for features like Flow to work properly": - "Envía los registros de escucha de las pistas a Deezer, habilítalo para que funciones como Flow funcionen correctamente", - "Offline mode": "Modo sin conexión", - "Will be overwritten on start.": "Se sobrescribirá al inicio.", - "Error logging in, check your internet connections.": - "Error al iniciar sesión, verifique su conexión a internet.", - "Logging in...": "Ingresando...", - "Download path": "Ruta de las descargas", - "Downloads naming": "Nombramiento de las descargas", - "Downloaded tracks filename": "Nombre de archivo de las pistas descargadas", - "Valid variables are": "Las variables válidas son", - "Reset": "Reiniciar", - "Clear": "Limpiar", - "Create folders for artist": "Crear carpetas por artista", - "Create folders for albums": "Crear carpetas por álbumes", - "Separate albums by discs": "Separar los álbumes por discos", - "Overwrite already downloaded files": - "Sobrescribir los archivos ya descargados", - "Copy ARL": "Copiar ARL", - "Copy userToken/ARL Cookie for use in other apps.": - "Copia el Token de usuario/Cookie ARL para su uso en otras aplicaciones.", - "Copied": "Copiado", - "Log out": "Cerrar sesión", - "Due to plugin incompatibility, login using browser is unavailable without restart.": - "Debido a la incompatibilidad de los plugins, no se puede iniciar la sesión con el navegador sin reiniciar.", - "(ARL ONLY) Continue": "Continuar (SÓLO ARL)", - "Log out & Exit": "Cerrar sesión y salir", - "Pick-a-Path": "Escoja una ruta", - "Select storage": "Seleccionar el almacenamiento", - "Go up": "Subir", - "Permission denied": "Permiso denegado", - "Language": "Idioma", - "Language changed, please restart Freezer to apply!": - "¡El idioma ha cambiado, por favor reinicie Freezer para aplicarlo!", - "Importing...": "Importando...", - "Radio": "Radio", - "Flow": "Flow", - - //0.5.0 Strings: - "Storage permission denied!": "Permiso de almacenamiento denegado!", - "Failed": "Fallido", - "Queued": "Puesto en cola", - "External": "Almacenamiento", - "Restart failed downloads": "Reiniciar descargas fallidas", - "Clear failed": "Limpiar fallidas", - "Download Settings": "Opciones de descarga", - "Create folder for playlist": "Crear carpeta para lista de reproducción", - "Download .LRC lyrics": "Descargar archivo .LRC", - "Proxy": "Proxy", - "Not set": "No establecido", - "Search or paste URL": "Buscar o pegar URL", - "History": "Historial", - "Download threads": "Descargas simultáneas", - "Lyrics unavailable, empty or failed to load!": - "Letras no disponibles, vacías o no se pudieron cargar!", - "About": "Acerca de", - "Telegram Channel": "Canal de Telegram", - "To get latest releases": "Para obtener los últimos lanzamientos", - "Official chat": "Chat oficial", - "Telegram Group": "Grupo de Telegram", - "Huge thanks to all the contributors! <3": - "Muchas gracias a todos los contribuyentes contributors! <3", - "Edit playlist": "Editar lista de reproducción", - "Update": "Actualizar", - "Playlist updated!": "Lista de reproducción actualizada!", - "Downloads added!": "Descargas agregadas!", - "Save cover file for every track": - "Guarde el archivo de portada para cada pista", - "Download Log": "Registro de Descarga", - "Repository": "Repositorio", - "Source code, report issues there.": - "Código fuente, informe de problemas allí.", - - //0.5.2 Strings: - "Use system theme": "Usar tema del sistema", - "Light": "blanco" - } -}; diff --git a/translations/old_languages/fil_ph.dart b/translations/old_languages/fil_ph.dart deleted file mode 100644 index a5ba171..0000000 --- a/translations/old_languages/fil_ph.dart +++ /dev/null @@ -1,192 +0,0 @@ -/* - -Translated by: Chino Pacia -Revised by: Garri Palao - -*/ - -const language_fil_ph = { - "fil_ph": { - "Home": "Home", - "Search": "Maghanap", - "Library": "Library", - "Offline mode, can't play flow or smart track lists.": - "Ikaw ay naka-offline mode, hindi ka pwedeng mag-play ng flow o mga smart track.", - "Added to library": "Idinagdag na sa library", - "Download": "I-download", - "Disk": "Disk", - "Offline": "Offline", - "Top Tracks": "Mga Nangungunang Track", - "Show more tracks": "Ipakita ang iba pang mga track", - "Top": "Nangunguna", - "Top Albums": "Nangungunang mga Album", - "Show all albums": "Ipakita lahat ng album", - "Discography": "Discography", - "Default": "Default", - "Reverse": "Pabalik", - "Alphabetic": "Alphabetic", - "Artist": "Artist", - "Post processing...": "Tinatapos na ang proseso...", - "Done": "Tapos na", - "Delete": "Burahin", - "Are you sure you want to delete this download?": - "Sigurado ka bang buburahin mo ang iyong dinownload?", - "Cancel": "I-kansel", - "Downloads": "Mga Download", - "Clear queue": "I-clear ang queue", - "This won't delete currently downloading item": - "Hindi nito buburahin ang dina-download mo ngayon", - "Are you sure you want to delete all queued downloads?": - "Sigurado ka bang buburahin lahat ang mga dina-download?", - "Clear downloads history": "I-clear ang kasaysayan ng mga download", - "WARNING: This will only clear non-offline (external downloads)": - "BABALA: Buburahin lang nito ang hindi pang-offline (mga eksternal na download)", - "Please check your connection and try again later...": - "I-check ang iyong koneksiyon at maaaring subukan mo ulit mamaya...", - "Show more": "Higit pa", - "Importer": "Taga-import", - "Currently supporting only Spotify, with 100 tracks limit": - "Suportado lang ang Spotify sa ngayon,na may limit sa 100 mga track", - "Due to API limitations": "Dahil sa limitasyon ng API", - "Enter your playlist link below": "Pakilagay ang link ng iyong playlist sa ibaba", - "Error loading URL!": "Nagkaroon ng problema sa URL!", - "Convert": "I-convert", - "Download only": "I-download lang", - "Downloading is currently stopped, click here to resume.": - "Huminto ang download mo, mag-click dito para ituloy", - "Tracks": "Mga Track", - "Albums": "Mga Album", - "Artists": "Mga Artist", - "Playlists": "Mga Playlist", - "Import": "I-import", - "Import playlists from Spotify": "I-import ang mga playlist galing sa Spotify", - "Statistics": "Statistics", - "Offline tracks": "Mga offline na track", - "Offline albums": "Mga offline na album", - "Offline playlists": "Mga offline na playlist", - "Offline size": "Laki ng offline", - "Free space": "Natitirang space", - "Loved tracks": "Pinusuang mga track", - "Favorites": "Mga paborito", - "All offline tracks": "Lahat ng track na pang-offline", - "Create new playlist": "Gumawa ng bagong playlist", - "Cannot create playlists in offline mode": - "Hindi makagagawa ng playlist habang naka-offline mode", - "Error": "Error", - "Error logging in! Please check your token and internet connection and try again.": - "Hindi maka-login! I-check ang iyong token at koneksiyon at ulitin mo.", - "Dismiss": "I-dismiss", - "Welcome to": "Welcome sa", - "Please login using your Deezer account.": - "Paki-login ang iyong Deezer account", - "Login using browser": "Mag-login gamit ng browser", - "Login using token": "Mag-login gamit ng token", - "Enter ARL": "Pakilagay ang ARL", - "Token (ARL)": "Token (ARL)", - "Save": "I-save", - "If you don't have account, you can register on deezer.com for free.": - "Kung wala kang account, pumunta sa deezer.com para sa libreng pag-register.", - "Open in browser": "Buksan sa browser", - "By using this app, you don't agree with the Deezer ToS": - "Sa pag-gamit nitong app, ikaw ay hindi sumusunod sa Deezer ToS", - "Play next": "I-play ang kasunod", - "Add to queue": "Idagdag sa queue", - "Add track to favorites": "Idagdag ang track sa mga paborito", - "Add to playlist": "Idagdag sa playlist", - "Select playlist": "Piliin ang playlist", - "Track added to": "Idinagdag ang track sa", - "Remove from playlist": "Tinanggal sa playlist", - "Track removed from": "Tinanggal ang track sa", - "Remove favorite": "Tanggalin ang paborito", - "Track removed from library": "Tinanggal ang track sa library", - "Go to": "Pumunta sa", - "Make offline": "Gawing offline", - "Add to library": "Idagdag sa library", - "Remove album": "Tanggalin ang album", - "Album removed": "Tinanggal ang album", - "Remove from favorites": "Tanggalin sa mga paborito", - "Artist removed from library": "Tinanggal ang artist sa library", - "Add to favorites": "Idagdag sa mga paborito", - "Remove from library": "Tanggalin sa library", - "Add playlist to library": "Idagdag ang playlist sa library", - "Added playlist to library": "Idinagdag ang playlist sa library", - "Make playlist offline": "Gawing offline ang playlist", - "Download playlist": "I-download ang playlist", - "Create playlist": "Gumawa ng playlist", - "Title": "Pamagat", - "Description": "Deskripsiyon", - "Private": "Pribado", - "Collaborative": "Pagtutulungan", - "Create": "Mag-buo", - "Playlist created!": "Nagawa na ang playlist!", - "Playing from:": "Tumutugtog galing sa:", - "Queue": "Queue", - "Offline search": "Offline na paghahanap", - "Search Results": "Resulta sa Paghahanap", - "No results!": "Walang mahanap!", - "Show all tracks": "Ipakita lahat ng mga track", - "Show all playlists": "Ipakita lahat ng mga playlist", - "Settings": "Mga Setting", - "General": "Pangkalahatan", - "Appearance": "Itsura", - "Quality": "Kalidad", - "Deezer": "Deezer", - "Theme": "Tema", - "Currently": "Kasalukuyan", - "Select theme": "Piliin ang Tema", - "Light (default)": "Puti (Default)", - "Dark": "Dark", - "Black (AMOLED)": "Maitim (AMOLED)", - "Deezer (Dark)": "Deezer (Madilim)", - "Primary color": "Pangunahing kulay", - "Selected color": "Piniling kulay", - "Use album art primary color": "Gamitin ang pangunahing kulay ng album art", - "Warning: might be buggy": "Babala: Pwedeng magkaroon ng bug", - "Mobile streaming": "Pag-stream sa mobile", - "Wifi streaming": "Pag-stream sa Wifi", - "External downloads": "Eksternal na download", - "Content language": "Wika ng nilalaman", - "Not app language, used in headers. Now": - "gagamitin lang ang wika sa header, hindi sa app. Ngayon", - "Select language": "Piliin ang wika", - "Content country": "Bansa ng nilalaman", - "Country used in headers. Now": "Gagamitin ang bansa sa mga header. Ngayon", - "Log tracks": "Log ng mga track", - "Send track listen logs to Deezer, enable it for features like Flow to work properly": - "Ipadala ang log ng mga napakinggang track sa Deezer, I-enable mo para gumana nang maayos sa mga feature kagaya ng Flow", - "Offline mode": "Offline mode", - "Will be overwritten on start.": "Papatungan sa simula pa lang.", - "Error logging in, check your internet connections.": - "Hindi maka-login, Pakicheck ang iyong internet connection.", - "Logging in...": "Nagla-login...", - "Download path": "Paglalagyan ng download", - "Downloads naming": "Pagpapangalan sa mga download", - "Downloaded tracks filename": "Filename ng mga nadownload na track", - "Valid variables are": "Ang mga pwede lang gamitin ay", - "Reset": "I-reset", - "Clear": "I-clear", - "Create folders for artist": "Gumawa ng folder para sa mga artist", - "Create folders for albums": "Gumawa ng folder para sa mga album", - "Separate albums by discs": "Ihiwalay ang mga album batay sa disk", - "Overwrite already downloaded files": "Patungan ang mga nadownload na file", - "Copy ARL": "Kopyahin ang ARL", - "Copy userToken/ARL Cookie for use in other apps.": - "Kopyahin ang userToken/ARL Cookie para gamitin sa iba pang app.", - "Copied": "Nakopya na", - "Log out": "Mag-Log out", - "Due to plugin incompatibility, login using browser is unavailable without restart.": - "Hindi ka makakapag-login gamit ng browser kung hindi mo ito ire-restart dahil hindi pa compatible ang plugin sa ngayon", - "(ARL ONLY) Continue": "(ARL LANG) Ituloy", - "Log out & Exit": "Mag-Log out at Lumabas", - "Pick-a-Path": "Pumili-ng-Path", - "Select storage": "Piliin ang storage", - "Go up": "Pumunta paitaas", - "Permission denied": "Hindi pinapayagan", - "Language": "Wika", - "Language changed, please restart Freezer to apply!": - "Pinalitan ang wika, paki-restart ang Deezer para mai-apply!", - "Importing...": "Ini-import...", - "Radio": "Radyo", - "Flow": "Flow", - } -}; \ No newline at end of file diff --git a/translations/old_languages/fr_fr.dart b/translations/old_languages/fr_fr.dart deleted file mode 100644 index a2e742d..0000000 --- a/translations/old_languages/fr_fr.dart +++ /dev/null @@ -1,251 +0,0 @@ -/* - -Translated by: Fwwwwwwwwwweze - - */ - -const language_fr_fr = { - "fr_fr": { - "Home": "Accueil", - "Search": "Recherche", - "Library": "Bibliothèque", - "Offline mode, can't play flow or smart track lists.": - "Le mode hors connexion ne permet pas d'accéder à votre Flow.", - "Added to library": "Ajouté à la bibliothèque", - "Download": "Télécharger", - "Disk": "Disque", - "Offline": "Hors connexion", - "Top Tracks": "Top Tracks", - "Show more tracks": "Afficher plus de pistes", - "Top": "Top", - "Top Albums": "Top Albums", - "Show all albums": "Afficher tous les albums", - "Discography": "Discographie", - "Default": "Par défaut", - "Reverse": "Inverse", - "Alphabetic": "Alphabétique", - "Artist": "Artiste", - "Post processing...": "Post-traitement...", - "Done": "Effectué", - "Delete": "Supprimer", - "Are you sure you want to delete this download?": - "Êtes-vous certain de vouloir supprimer ce téléchargement ?", - "Cancel": "Annuler", - "Downloads": "Téléchargements", - "Clear queue": "Effacer file d'attente", - "This won't delete currently downloading item": - "Ceci ne supprimera pas l'élément en cours de téléchargement", - "Are you sure you want to delete all queued downloads?": - "Êtes-vous sûr de vouloir supprimer tous les téléchargements en file d'attente ?", - "Clear downloads history": "Effacer l'historique des téléchargements", - "WARNING: This will only clear non-offline (external downloads)": - "AVERTISSEMENT: Ceci n'effacera que les téléchargements non hors connexion (téléchargements externes)", - "Please check your connection and try again later...": - "Veuillez vérifier votre connexion et réessayer plus tard...", - "Show more": "Plus d'informations", - "Importer": "Importer", - "Currently supporting only Spotify, with 100 tracks limit": - "Ne fonctionne qu'avec Spotify pour le moment, avec une limite de 100 pistes", - "Due to API limitations": "En raison des limitations de l'API", - "Enter your playlist link below": - "Coller le lien de votre playlist ci-dessous", - "Error loading URL!": "Erreur de chargement de l'URL!", - "Convert": "Convertir", - "Download only": "Téléchargement uniquement", - "Downloading is currently stopped, click here to resume.": - "Le téléchargement est actuellement arrêté, cliquez ici pour le reprendre.", - "Tracks": "Pistes", - "Albums": "Albums", - "Artists": "Artistes", - "Playlists": "Playlists", - "Import": "Importer", - "Import playlists from Spotify": "Importer des playlists depuis Spotify", - "Statistics": "Statistiques", - "Offline tracks": "Pistes hors connexion", - "Offline albums": "Albums hors connexion", - "Offline playlists": "Playlists hors connexion", - "Offline size": "Taille des fichiers hors connexion", - "Free space": "Espace libre", - "Loved tracks": "Coups de cœur", - "Favorites": "Favoris", - "All offline tracks": "Toutes les pistes hors connexion", - "Create new playlist": "Créer une nouvelle playlist", - "Cannot create playlists in offline mode": - "Création de playlists impossible en mode hors connexion", - "Error": "Erreur", - "Error logging in! Please check your token and internet connection and try again.": - "Erreur de connexion ! Veuillez vérifier votre token et votre connexion internet et réessayer.", - "Dismiss": "Abandonner", - "Welcome to": "Bienvenue sur", - "Please login using your Deezer account.": - "Veuillez vous connecter en utilisant votre compte Deezer.", - "Login using browser": "Connexion via navigateur", - "Login using token": "Connexion via token", - "Enter ARL": "Saisir ARL", - "Token (ARL)": "Token (ARL)", - "Save": "Sauvegarder", - "If you don't have account, you can register on deezer.com for free.": - "Si vous n'avez pas de compte, vous pouvez vous inscrire gratuitement sur deezer.com.", - "Open in browser": "Ouvrir dans le navigateur", - "By using this app, you don't agree with the Deezer ToS": - "En utilisant cette application, vous ne respectez pas les CGU de Deezer", - "Play next": "Écouter juste après", - "Add to queue": "Ajouter à la file d'attente", - "Add track to favorites": "Ajouter aux Coups de cœur", - "Add to playlist": "Ajouter à une playlist", - "Select playlist": "Choisir une playlist", - "Track added to": "Piste ajoutée à", - "Remove from playlist": "Retirer de la playlist", - "Track removed from": "Piste retirée de", - "Remove favorite": "Supprimer Coup de cœur ", - "Track removed from library": "Piste supprimée de la bibliothèque", - "Go to": "Aller à", - "Make offline": "Rendre hors connexion", - "Add to library": "Ajouter à la bibliothèque", - "Remove album": "Supprimer l'album", - "Album removed": "Album supprimé", - "Remove from favorites": "Retirer des Coups de cœur", - "Artist removed from library": "Artiste supprimé de la bibliothèque", - "Add to favorites": "Ajouter aux Coups de cœur", - "Remove from library": "Retirer de la bibliothèque", - "Add playlist to library": "Ajouter la playlist à la bibliothèque", - "Added playlist to library": "Playlist ajoutée à la bibliothèque", - "Make playlist offline": "Rendre la playlist hors connexion", - "Download playlist": "Télécharger la playlist", - "Create playlist": "Créer une playlist", - "Title": "Titre", - "Description": "Description", - "Private": "Privée", - "Collaborative": "Collaborative", - "Create": "Créer", - "Playlist created!": "Playlist créée !", - "Playing from:": "Lecture à partir de :", - "Queue": "File d'attente", - "Offline search": "Recherche hors connexion", - "Search Results": "Résultats de la recherche", - "No results!": "Aucun résultat !", - "Show all tracks": "Afficher toutes les pistes", - "Show all playlists": "Afficher toutes les playlists", - "Settings": "Paramètres", - "General": "Général", - "Appearance": "Apparence", - "Quality": "Qualité", - "Deezer": "Deezer", - "Theme": "Thème", - "Currently": "Actuellement", - "Select theme": "Selectionner un thème", - "Light (default)": "Clair (Par défaut)", - "Dark": "Sombre", - "Black (AMOLED)": "Noir (AMOLED)", - "Deezer (Dark)": "Deezer (Sombre)", - "Primary color": "Couleur principale", - "Selected color": "Couleur sélectionnée", - "Use album art primary color": - "Utiliser la couleur dominante de la pochette en tant que couleur principale", - "Warning: might be buggy": "Attention : peut être buggé", - "Mobile streaming": "Streaming via réseau mobile", - "Wifi streaming": "Streaming via Wifi", - "External downloads": "Téléchargements externes", - "Content language": "Langue du contenu", - "Not app language, used in headers. Now": - "Pas la langue de l'appli, utilisée dans les en-têtes de catégories. Actuellement", - "Select language": "Selectionner la langue", - "Content country": "Pays contenu", - "Country used in headers. Now": - "Pays utilisé pour les bannières. Actuellement", - "Log tracks": "Journal d'écoute", - "Send track listen logs to Deezer, enable it for features like Flow to work properly": - "Envoie les journaux d'écoute à Deezer, activez-le pour que les fonctionnalités comme Flow fonctionnent correctement", - "Offline mode": "Mode hors connexion", - "Will be overwritten on start.": "Sera écrasé au démarrage.", - "Error logging in, check your internet connections.": - "Erreur de connexion, vérifiez votre connexion internet", - "Logging in...": "Connexion...", - "Download path": "Emplacement des téléchargements", - "Downloads naming": "Désignation des téléchargement", - "Downloaded tracks filename": "nom de fichier des pistes téléchargées", - "Valid variables are": "Les variables valides sont", - "Reset": "Réinitialiser", - "Clear": "Effacer", - "Create folders for artist": "Générer des dossiers par artiste", - "Create folders for albums": "Générer des dossiers par album", - "Separate albums by discs": "Séparer les albums par disques", - "Overwrite already downloaded files": - "Écraser les fichiers déjà téléchargés", - "Copy ARL": "Copier ARL", - "Copy userToken/ARL Cookie for use in other apps.": - "Copier le Cookie userToken/ARL pour l'utiliser dans d'autres applications.", - "Copied": "Copié", - "Log out": "Déconnexion", - "Due to plugin incompatibility, login using browser is unavailable without restart.": - "En raison d'une incompatibilité de plugin, la connexion à l'aide du navigateur est impossible sans redémarrage.", - "(ARL ONLY) Continue": "(ARL SEULEMENT) Continuer", - "Log out & Exit": "Se déconnecter et quitter", - "Pick-a-Path": "Choissez un emplacement", - "Select storage": "Selectionner le stockage", - "Go up": "Remonter", - "Permission denied": "Autorisation refusée", - "Language": "Langue", - "Language changed, please restart Freezer to apply!": - "Langue modifiée, veuillez redémarrer Freezer pour que les changements prennent effet!", - "Importing...": "Importation...", - "Radio": "Radio", - "Flow": "Flow", - "Track is not available on Deezer!": - "La piste n'est pas disponible sur Deezer!", - "Failed to download track! Please restart.": - "Echec du téléchargement de la piste ! Veuillez réessayer.", - - //0.5.0 Strings: - "Storage permission denied!": "Autorisation d'accès au stockage refusée!", - "Failed": "Echec", - "Queued": "Ajouté à la file d'attente", - //Updated in 0.5.1 - used in context of download: - "External": "Storage", - //0.5.0 - "Restart failed downloads": "Relancer les téléchargements échoués", - "Clear failed": "Effacer les téléchargements échoués", - "Download Settings": "Paramètres des téléchargements", - "Create folder for playlist": "Générer des dossiers par playlist", - "Download .LRC lyrics": "Télécharger les fichiers de paroles .LRC", - "Proxy": "Proxy", - "Not set": "Non défini", - "Search or paste URL": "Rechercher ou coller un lien", - "History": "Historique", - //Updated 0.5.1 - "Download threads": "Téléchargements simultanés", - //0.5.0 - "Lyrics unavailable, empty or failed to load!": - "Paroles indisponibles, vides ou erreur de chargement !", - "About": "A propos", - "Telegram Channel": "Telegram Channel", - "To get latest releases": "Pour obtenir les dernières versions de l'app", - "Official chat": "Chat officiel", - "Telegram Group": "Groupe Telegram", - "Huge thanks to all the contributors! <3": - "Un grand merci à tous les contributeurs ! <3", - "Edit playlist": "Modifier la playlist", - "Update": "Mettre à jour", - "Playlist updated!": "Playlist mise à jour !", - "Downloads added!": "Téléchargements ajoutés !", - - //0.5.1 Strings: - "Save cover file for every track": - "Sauvegarder la pochette pour chaque piste", - "Download Log": "Journal des téléchargements", - "Repository": "Dépôt", - "Source code, report issues there.": - "Code source, signaler les problèmes ici.", - - //0.5.2 Strings: - "Use system theme": "Utiliser le thème du système", - "Light": "Clair", - - //0.5.3 Strings: - "Popularity": "Popularité", - "User": "Utilisateur", - "Track count": "Nombre de pistes", - "If you want to use custom directory naming - use '/' as directory separator.": - "Si vous souhaitez utiliser un nom de répertoire personnalisé, utilisez '/' comme séparateur." - } -}; diff --git a/translations/old_languages/he_il.dart b/translations/old_languages/he_il.dart deleted file mode 100644 index 7ec39a7..0000000 --- a/translations/old_languages/he_il.dart +++ /dev/null @@ -1,193 +0,0 @@ -/* - -Translated by: kobyrevah - -*/ - -const language_he_il = { - "he_il": { - "Home": "בית", - "Search": "חיפוש", - "Library": "ספריה", - "Offline mode, can't play flow or smart track lists.": - "מצב לא מקוון, לא יכול לנגן flow או רשימות שירים חכמות.", - "Added to library": "הוסף לסיפרייה", - "Download": "הורד", - "Disk": "דיסק", - "Offline": "לא מקוון", - "Top Tracks": "השירים שבטופ", - "Show more tracks": "הראה עוד שירים", - "Top": "טופ", - "Top Albums": "האלבומים המובילים", - "Show all albums": "הראה את כל האלבומים", - "Discography": "דיסקוגרפיה", - "Default": "ברירת מחדל", - "Reverse": "הפוך", - "Alphabetic": "אלפבתי", - "Artist": "אמן", - "Post processing...": "לאחר עיבוד...", - "Done": "בוצע", - "Delete": "מחק", - "Are you sure you want to delete this download?": - "האם אתה בטוח שאתה רוצה למחוק את ההורדה הזאת?", - "Cancel": "בטל", - "Downloads": "הורדות", - "Clear queue": "נקה תור ", - "This won't delete currently downloading item": - "פעולה זו לא תמחק את הפריט שמורד עכשיו", - "Are you sure you want to delete all queued downloads?": - "האם אתה בטוח שאתה רוצה למחוק את כל ההורדות שבתור?", - "Clear downloads history": "נקה היסטורית הורדות", - "WARNING: This will only clear non-offline (external downloads)": - "אזהרה: זה ינקה רק את הקבצים שלא אופליין (כלומר רק הורדות חיצוניות)", - "Please check your connection and try again later...": - "בבקשה בדוק את חיבור הרשת שלך ונסה שוב מאוחר יותר...", - "Show more": "הראה עוד", - "Importer": "מייבא רשימות השמעה", - "Currently supporting only Spotify, with 100 tracks limit": - "כרגע תומך רק בספוטיפיי, עם הגבלה של 100 שירים", - "Due to API limitations": "בגלל מגבלות ה- API", - "Enter your playlist link below": "הכנס את קישור רשימת ההשמעה שלך למטה", - "Error loading URL!": "שגיאה בטעינת הקישור!", - "Convert": "המר", - "Download only": "הורד", - "Downloading is currently stopped, click here to resume.": - "ההורדה כרגע מושהית, לחץ כאן להמשיך.", - "Tracks": "שירים", - "Albums": "אלבומים", - "Artists": "אומנים", - "Playlists": "רשימות השמעה", - "Import": "יבא", - "Import playlists from Spotify": "יבא רשימת השמעה מספוטיפיי", - "Statistics": "סטטיסטיקה", - "Offline tracks": "שירים לא מקוונים", - "Offline albums": "אלבומים לא מקוונים", - "Offline playlists": "רשימות השמעה לא מקוונות", - "Offline size": "גודל קבצים לא מקוונים", - "Free space": "מקום פנוי", - "Loved tracks": "שירים אהובים", - "Favorites": "מועדפים", - "All offline tracks": "כל השירים הלא מקוונים", - "Create new playlist": "צור רשימת השמעה חדשה", - "Cannot create playlists in offline mode": - "לא יכול ליצור רשימת השמעה במצב אופליין", - "Error": "שגיאה", - "Error logging in! Please check your token and internet connection and try again.": - "שגיאה בהתחברות! בדוק בבקשה את הטוקן שלך או את חיבור האינטרנט שלך ונסה שוב.", - "Dismiss": "התעלם", - "Welcome to": "ברוך הבא ל", - "Please login using your Deezer account.": - "בבקשה התחבר עם חשבון הדיזר שלך.", - "Login using browser": "התחבר דרך הדפדפן", - "Login using token": "התחבר דרך טוקן", - "Enter ARL": "הכנס טוקן", - "Token (ARL)": "טוקן (קישור אישי)", - "Save": "שמור", - "If you don't have account, you can register on deezer.com for free.": - "לאם אין לך חשבון, אתה יכול להירשם ב deezer.com בחינם.", - "Open in browser": "פתח בדפדפן", - "By using this app, you don't agree with the Deezer ToS": - "באמצעות שימוש ביישום הזה, אתה לא מסכים עם התנאים של דיזר", - "Play next": "נגן הבא בתור", - "Add to queue": "הוסף לתור", - "Add track to favorites": "הוסף שיר למועדפים", - "Add to playlist": "הוסף לרשימת השמעה", - "Select playlist": "בחר רשימת השמעה", - "Track added to": "שיר נוסף ל", - "Remove from playlist": "הסר מרשימת השמעה", - "Track removed from": "שיר הוסר מ", - "Remove favorite": "הסר מועדף", - "Track removed from library": "השיר הוסר מהסיפרייה", - "Go to": "לך ל", - "Make offline": "הורד לשימוש לא מקוון", - "Add to library": "הוסף לספריה", - "Remove album": "הסר אלבום", - "Album removed": "אלבום הוסר", - "Remove from favorites": "הסר מהמועדפים", - "Artist removed from library": "אמן הוסר מהסיפרייה", - "Add to favorites": "הוסף למועדפים", - "Remove from library": "הסר מהסיפרייה", - "Add playlist to library": "הוסף רשימת השמעה לסיפרייה", - "Added playlist to library": "רשימת השמעה נוספה לסיפרייה", - "Make playlist offline": "צור רשימת השמעה לא מקוונת", - "Download playlist": "הורד רשימת השמעה", - "Create playlist": "צור רשימת המעה", - "Title": "שם", - "Description": "תיאור", - "Private": "פרטי", - "Collaborative": "שיתופי פעולה", - "Create": "צור", - "Playlist created!": "רשימת השמעה נוצרה!", - "Playing from:": "מנגן מ:", - "Queue": "תור", - "Offline search": "חיפוש אופליין", - "Search Results": "תוצאות חיפוש", - "No results!": "אין תוצאות!", - "Show all tracks": "הראה את כל השירים", - "Show all playlists": "הראה את כל רשימות ההשמעה", - "Settings": "הגדרות", - "General": "כללי", - "Appearance": "מראה", - "Quality": "איכות", - "Deezer": "דיזר", - "Theme": "ערכת נושא", - "Currently": "בשימוש כרגע", - "Select theme": "בחר ערכת נושא", - "Light (default)": "בהיר (ברירת מחדח)", - "Dark": "כהה", - "Black (AMOLED)": "שחור (אמולד)", - "Deezer (Dark)": "דיזר (כהה)", - "Primary color": "צבע ראשי", - "Selected color": "בחר צבע", - "Use album art primary color": "השתמש בצבע ראשי של תמונת האלבום", - "Warning: might be buggy": "אזהרה: יכול להיות באגים", - "Mobile streaming": "הזרמת רשת סלולרית", - "Wifi streaming": "הזרמת רשת אלחוטית", - "External downloads": "הורדות חיצוניות", - "Content language": "שפת תוכן", - "Not app language, used in headers. Now": - "לא שפת היישום, שימוש בכותרות. עכשיו", - "Select language": "בחר שפה", - "Content country": "מדינת תוכן", - "Country used in headers. Now": "מדינה שמוצגת בכותרות. עכשיו", - "Log tracks": "לוג שמיעת שירים", - "Send track listen logs to Deezer, enable it for features like Flow to work properly": - "שלח לוגים של השמעה לדיזר, הפעל מצב זה כדי שתכונות כמו flow יעבדו טוב", - "Offline mode": "מצב אופליין", - "Will be overwritten on start.": "יוחלף בהפעלה.", - "Error logging in, check your internet connections.": - "שגיאה בהתחברות, בדוק את חיבור הרשת שלך.", - "Logging in...": "מתחבר...", - "Download path": "נתיב הורדה", - "Downloads naming": "שינוי שם בהורדה", - "Downloaded tracks filename": "שם קבצי שירים בהורדה", - "Valid variables are": "האפשרויות המוצעות הם", - "Reset": "אתחל", - "Clear": "נקה", - "Create folders for artist": "צור תיקייה לאמנים", - "Create folders for albums": "צור תיקייה לאלבומים", - "Separate albums by discs": "חלק אלבומים לפי דיסקים", - "Overwrite already downloaded files": "החלף קבצים שכבר הורדו", - "Copy ARL": "העתק טוקן", - "Copy userToken/ARL Cookie for use in other apps.": - "העתק את הטוקן לשימוש בישומים אחרים.", - "Copied": "הועתק", - "Log out": "התנתק", - "Due to plugin incompatibility, login using browser is unavailable without restart.": - "בגלל אי התאמת התוסף, ההתחברות באמצעות הדפדפן אינה זמינה ללא הפעלה מחדש.", - "(ARL only) Continue": "(טוקן בלבד) המשך", - "Log out & Exit": "התנתק וצא", - "Pick-a-Path": "בחר נתיב", - "Select storage": "בחר אחסון", - "Go up": "עלה למעלה", - "Permission denied": "הרשאה נדחתה", - "Language": "שפה", - "Language changed, please restart Freezer to apply!": - "שפה שונתה, בבקשה הפעל מחדש את Freezer כדי להחיל!", - "Importing...": "מייבא...", - "Radio": "רדיו", - "Flow": "Flow", - "Track is not available on Deezer!": "שיר לא קיים בדיזר!", - "Failed to download track! Please restart.": "הורדת השיר נכשלה! התחל מחדש." - } -}; diff --git a/translations/old_languages/hr_hr.dart b/translations/old_languages/hr_hr.dart deleted file mode 100644 index 5e6bb0d..0000000 --- a/translations/old_languages/hr_hr.dart +++ /dev/null @@ -1,195 +0,0 @@ -/* - -Translated by: Shazzaam - - */ - -const language_hr_hr = { - "hr_hr": { - "Home": "Početna", - "Search": "Tražilica", - "Library": "Biblioteka", - "Offline mode, can't play flow or smart track lists.": - "Izvanmrežični način, ne može se reproducirati flow ili pametni popis pjesama", - "Added to library": "Dodano u biblioteku", - "Download": "Skini", - "Disk": "Disk", - "Offline": "Izvranmrežno", - "Top Tracks": "Top Pjesme", - "Show more tracks": "Prikaži više pjesama", - "Top": "Top", - "Top Albums": "Top Albumi", - "Show all albums": "Prikaži više albuma", - "Discography": "Diskografija", - "Default": "Zadano", - "Reverse": "Obrnuto", - "Alphabetic": "Abecedno", - "Artist": "Umjetnik", - "Post processing...": "Naknadna obrada...", - "Done": "Gotovo", - "Delete": "Izbriši", - "Are you sure you want to delete this download?": - "Jeste li sigurni da želite izbrisati ovo skidanje?", - "Cancel": "Poništi", - "Downloads": "Skidanja", - "Clear queue": "Očisti red", - "This won't delete currently downloading item": - "Ovo neće izbrisati stavku koja se trenutno skida ", - "Are you sure you want to delete all queued downloads?": - "Jeste li sigurni da želite da poništite sva skidanja u redu čekanja", - "Clear downloads history": "Očisti povijest skidanja", - "WARNING: This will only clear non-offline (external downloads)": - "UPOZORENJE: Ovo će ukloniti samo izvanmrežna (vanjska) skidanja", - "Please check your connection and try again later...": - "Molimo vas da provjerite vašu konekciju i da pokušate ponovno...", - "Show more": "Pokaži više", - "Importer": "Uvoznik", - "Currently supporting only Spotify, with 100 tracks limit": - "Trenutno podržava samo Spotify, sa limitom od 100 pjesama", - "Due to API limitations": "Zbog ograničenja API-a", - "Enter your playlist link below": - "Unesite vezu od vašeg popisa za reprodukciju ispod", - "Error loading URL!": "Pogreška pri učitavanju URL-a!", - "Convert": "Pretvori", - "Download only": "Samo skidanja", - "Downloading is currently stopped, click here to resume.": - "Skidanja su trenutno zaustavljena, kliknite ovdje da se nastave.", - "Tracks": "Pjesme", - "Albums": "Albumi", - "Artists": "Umjetnici", - "Playlists": "Popisi za reprodukciju", - "Import": "Uvezi", - "Import playlists from Spotify": "Uvezi popis za reprodukciju sa Spotify-a", - "Statistics": "Statistike", - "Offline tracks": "Izvanmrežične pjesme", - "Offline albums": "Izvanmrežični albumi", - "Offline playlists": "Izvanmrežični popisi za reprodukciju", - "Offline size": "Izvanmrežična veličina", - "Free space": "Slobodno mjesto", - "Loved tracks": "Voljene pjesme", - "Favorites": "Favoriti", - "All offline tracks": "Sve izvanmrežične pjesme", - "Create new playlist": "Kreirajte novi popis za reprodukciju", - "Cannot create playlists in offline mode": - "Nije moguće napraviti popis za reprodukciju u izvanmrežnom načinu", - "Error": "Pogreška", - "Error logging in! Please check your token and internet connection and try again.": - "Pogreška pri prijavljivanju! Molimo vas da provjerite token i internet konekciju i da pokušate ponovno.", - "Dismiss": "Odbaciti", - "Welcome to": "Dobrodošli u", - "Please login using your Deezer account.": - "Molimo vas da se prijavite pomoću vašeg Deezer računa.", - "Login using browser": "Prijava pomoću preglednika", - "Login using token": "Prijava pomoću tokena", - "Enter ARL": "Upišite ARL", - "Token (ARL)": "Token (ARL)", - "Save": "Spremi", - "If you don't have account, you can register on deezer.com for free.": - "Ako nemate račun, možete se besplatno registrirati na deezer.com.", - "Open in browser": "Otvori u pregledniku", - "By using this app, you don't agree with the Deezer ToS": - "Korištenjem ove aplikacije, ne slažete se sa Deezer Uvjetima pružanja usluge", - "Play next": "Pokreni sljedeću", - "Add to queue": "Dodaj u red ", - "Add track to favorites": "Dodaj pjesmu u omiljene", - "Add to playlist": "Dodaj u popis za reprodukciju", - "Select playlist": "Izaberi popis za reprodukciju", - "Track added to": "Pjesma je dodana u", - "Remove from playlist": "Ukloni iz popisa za reprodukciju", - "Track removed from": "Pjesma je uklonjena iz", - "Remove favorite": "Uklonite omiljenu", - "Track removed from library": "Pjesma je uklonjena iz biblioteke", - "Go to": "Idi u", - "Make offline": "Postavi izvanmrežno", - "Add to library": "Dodaj u biblioteku", - "Remove album": "Ukloni album", - "Album removed": "Album uklonjen", - "Remove from favorites": "Ukloni iz omiljenih", - "Artist removed from library": "Umjetnik je uklonjen iz biblioteke", - "Add to favorites": "Dodaj u omiljene", - "Remove from library": "Ukloni iz biblioteke", - "Add playlist to library": "Dodaj popis za reprodukciju u biblioteku", - "Added playlist to library": "Popis za reprodukciju je dodan u biblioteku", - "Make playlist offline": "Napravi popis za reprodukciju izvanmrežan.", - "Download playlist": "Skini popis za reprodukciju", - "Create playlist": "Napravi popis za reprodukciju", - "Title": "Naslov", - "Description": "Opis", - "Private": "Privatno", - "Collaborative": "Suradnički", - "Create": "Napravi", - "Playlist created!": "Popis za reprodukciju je napravljen!", - "Playing from:": "Svira iz:", - "Queue": "Red", - "Offline search": "Izvanmrežno traženje", - "Search Results": "Rezultati traženja", - "No results!": "Nema rezultata!", - "Show all tracks": "Prikaži sve pjesme!", - "Show all playlists": "Prikaži sve popise za reprodukciju", - "Settings": "Postavke", - "General": "Općenito", - "Appearance": "Izgled", - "Quality": "Kvalitet", - "Deezer": "Deezer", - "Theme": "Tema", - "Currently": "Trenutno", - "Select theme": "Izaberi temu", - "Light (default)": "Svijetla (Zadano)", - "Dark": "Mračno", - "Black (AMOLED)": "Crno (AMOLED)", - "Deezer (Dark)": "Deezer (Mračno)", - "Primary color": "Primarna boja", - "Selected color": "Izabrana boja", - "Use album art primary color": "Koristi primarnu boju slike albuma", - "Warning: might be buggy": "Upozorenje: može biti bugovito", - "Mobile streaming": "Strimovanje preko mobilnih podataka", - "Wifi streaming": "Strimovanje preko wifi-a", - "External downloads": "Vanjska skidanja", - "Content language": "Jezik skidanja", - "Not app language, used in headers. Now": - "Nije jezik aplikacije, korišteno u zaglavjima.", - "Select language": "Izaberi jezik", - "Content country": "Zemlja sadržaja", - "Country used in headers. Now": "Zemlja korištena u zaglavjima. Sad", - "Log tracks": "Zapis traka", - "Send track listen logs to Deezer, enable it for features like Flow to work properly": - "Šalji zapisnike slušanja pjesama Deezeru, omogućite za mogućnosti kao Flow da rade ispravno", - "Offline mode": "Izvanmrežični način", - "Will be overwritten on start.": "Biti će napisano preko na početku.", - "Error logging in, check your internet connections.": - "Pogreška prilikom prijavljivanja, molimo vas da provjerite vašu internet konekciju.", - "Logging in...": "Prijavljivanje...", - "Download path": "Mjesto za skidanja", - "Downloads naming": "Imenovanja skidanja", - "Downloaded tracks filename": "Naziv datoteka skinutih pjesama", - "Valid variables are": "Važeće varijable su", - "Reset": "Resetiraj", - "Clear": "Očisti", - "Create folders for artist": "Napravi datoteke za umjetnike", - "Create folders for albums": "Napravi datoteke za albume", - "Separate albums by discs": "Odvoji albume od diskova", - "Overwrite already downloaded files": "Napiši preko već skinutih datoteka", - "Copy ARL": "Kopiraj ARL", - "Copy userToken/ARL Cookie for use in other apps.": - "Kopiraj userToken/ARL cookie za korištenje u drugim aplikacijama.", - "Copied": "Kopirano", - "Log out": "Odjavi se", - "Due to plugin incompatibility, login using browser is unavailable without restart.": - "Zbog nekompatibilnosti dodataka, prijava putem preglednika nije dostupna bez ponovnog pokretanja.", - "(ARL ONLY) Continue": "(SAMO ARL) Nastavi", - "Log out & Exit": "Odjavi se i izađi", - "Pick-a-Path": "Izaberi mjesto", - "Select storage": "Izaberi skladište", - "Go up": "Idi gore", - "Permission denied": "Dozvola odbijena", - "Language": "Jezik", - "Language changed, please restart Freezer to apply!": - "Jezik je promjenjen, molimo vas da ponovno pokrenete Freezer da se promjene primjene.", - "Importing...": "Uvoženje...", - "Radio": "Radio", - "Flow": "Flow", - "Track is not available on Deezer!": "Pjesma nije dostupna na Deezeru!", - "Failed to download track! Please restart.": - "Preuzimanje pjesme nije uspjelo! Molimo vas da ponovno pokrenite." - } -}; diff --git a/translations/old_languages/id_id.dart b/translations/old_languages/id_id.dart deleted file mode 100644 index 2d9f781..0000000 --- a/translations/old_languages/id_id.dart +++ /dev/null @@ -1,239 +0,0 @@ -/* - -Translated by: LenteraMalam - - */ - -const language_id_id = { - "id_id": { - "Home": "Beranda", - "Search": "Cari", - "Library": "Perpustakaan", - "Offline mode, can't play flow or smart track lists.": - "Mode offline, tidak dapat memutar aliran atau daftar putar pintar.", - "Added to library": "Ditambahkan ke Perpustakaan", - "Download": "Unduh", - "Disk": "Disk", - "Offline": "Offline", - "Top Tracks": "Lagu Populer", - "Show more tracks": "Tampilkan lebih banyak lagu", - "Top": "Populer", - "Top Albums": "Album Populer", - "Show all albums": "Tampilkan semua album", - "Discography": "Diskografi", - "Default": "Default", - "Reverse": "Membalik", - "Alphabetic": "Alfabet", - "Artist": "Artis", - "Post processing...": "Sedang diproses...", - "Done": "Selesai", - "Delete": "Hapus", - "Are you sure you want to delete this download?": - "Apakah kamu yakin ingin menghapus unduhan ini?", - "Cancel": "Batalkan", - "Downloads": "Unduhan", - "Clear queue": "Bersihkan antrean", - "This won't delete currently downloading item": - "Ini tidak akan menghapus item yang sedang diunduh", - "Are you sure you want to delete all queued downloads?": - "Apakah kamu yakin ingin menghapus semua antrean yang terunduh?", - "Clear downloads history": "Bersihkan riwayat unduhan", - "WARNING: This will only clear non-offline (external downloads)": - "PERINGATAN: Ini hanya akan menghapus non-offline (unduhan eksternal)", - "Please check your connection and try again later...": - "Periksa kembali koneksi internet anda dan ulangi kembali...", - "Show more": "Tampilkan lebih banyak", - "Importer": "Pengimport", - "Currently supporting only Spotify, with 100 tracks limit": - "Saat ini hanya mendukung Spotify, dengan batas 100 lagu", - "Due to API limitations": "Karena keterbatasan API", - "Enter your playlist link below": "Masukkan link playlist Anda di bawah ini", - "Error loading URL!": "Gagal memuat URL!", - "Convert": "Konversikan", - "Download only": "Hanya mengunduh", - "Downloading is currently stopped, click here to resume.": - "Pengunduhan saat ini dihentikan, klik di sini untuk melanjutkan.", - "Tracks": "Lagu", - "Albums": "Album", - "Artists": "Artis", - "Playlists": "Daftar Putar", - "Import": "Impo", - "Import playlists from Spotify": "Impor playlist dari Spotify", - "Statistics": "Statistik", - "Offline tracks": "Lagu offline", - "Offline albums": "Album offline", - "Offline playlists": "Daftar putar offline", - "Offline size": "Ukuran offline", - "Free space": "Penyimpanan tersedia", - "Loved tracks": "Lagu yang disukai", - "Favorites": "Favorit", - "All offline tracks": "Semua lagu offline", - "Create new playlist": "Buat daftar putar baru", - "Cannot create playlists in offline mode": - "Tidak dapat membuat daftar putar di mode offline", - "Error": "Terjadi kesalahan", - "Error logging in! Please check your token and internet connection and try again.": - "Kesalahan saat masuk! Periksa token dan koneksi internet Anda, lalu coba lagi.", - "Dismiss": "Abaikan", - "Welcome to": "Selamat datang di", - "Please login using your Deezer account.": - "Silakan masuk menggunakan akun Deezer Anda.", - "Login using browser": "Masuk menggunakan browser", - "Login using token": "Masuk menggunakan token", - "Enter ARL": "Masukkan ARL", - "Token (ARL)": "Token (ARL)", - "Save": "Simpan", - "If you don't have account, you can register on deezer.com for free.": - "Jika Anda tidak memiliki akun, Anda dapat mendaftar di deezer.com secara gratis.", - "Open in browser": "Buka di browser", - "By using this app, you don't agree with the Deezer ToS": - "Dengan menggunakan aplikasi ini, Anda tidak setuju dengan ToS Deezer", - "Play next": "Putar selanjutnya", - "Add to queue": "Tambahkan ke antrean", - "Add track to favorites": "Tambahkan lagu ke favorit", - "Add to playlist": "Tambahkan ke daftar putar", - "Select playlist": "Pilih daftar putar", - "Track added to": "Lagu ditamhahkan ke", - "Remove from playlist": "Hapus dari daftar putar", - "Track removed from": "Lagu dihapus dari", - "Remove favorite": "Hapus favorit", - "Track removed from library": "Lagu dihapus dari perpustakaan", - "Go to": "Pergi ke", - "Make offline": "Buat offline", - "Add to library": "Tambahkan ke perpustakaan", - "Remove album": "Hapus album", - "Album removed": "Album dihapus", - "Remove from favorites": "Hapus dari favorit", - "Artist removed from library": "Artis dihapus dari perpustakaan", - "Add to favorites": "Tambahkan ke favorit", - "Remove from library": "Hapus dari perpustakaan", - "Add playlist to library": "Tambahkan daftar putar ke perpustakaan", - "Added playlist to library": "Menambahkan daftar putar ke perpustakaan", - "Make playlist offline": "Buat daftar putar offline", - "Download playlist": "Unduh daftar putar", - "Create playlist": "Buat daftar putar", - "Title": "Judul", - "Description": "Deskripsi", - "Private": "Pribadi", - "Collaborative": "Kolaboratif", - "Create": "Buat", - "Playlist created!": "Daftar putar berhasil dibuat!", - "Playing from:": "Memainkan:", - "Queue": "Antrean", - "Offline search": "Pencarian offline", - "Search Results": "Hasil perncarian", - "No results!": "Hasil tidak ditemukan!", - "Show all tracks": "Tampilkan semua lagu", - "Show all playlists": "Tampilkan semua daftar putar", - "Settings": "Pengaturan", - "General": "Umum", - "Appearance": "Tampilan", - "Quality": "Kualitas", - "Deezer": "Deezer", - "Theme": "Tema", - "Currently": "Saat ini", - "Select theme": "Pilih tema", - "Dark": "Gelap", - "Black (AMOLED)": "Hitam (AMOLED)", - "Deezer (Dark)": "Deezer (Gelap)", - "Primary color": "Warna utama", - "Selected color": "Warna yang dipilih", - "Use album art primary color": "Gunakan foto album sebagai warna utama", - "Warning: might be buggy": "Peringatan: masih ada bug", - "Mobile streaming": "Mobile streaming", - "Wifi streaming": "Wifi streaming", - "External downloads": "Unduhan eksternal", - "Content language": "Bahasa konten", - "Not app language, used in headers. Now": - "Bukan bahasa aplikasi, digunakan di header. Digunakan", - "Select language": "Pilih bahasa", - "Content country": "Wilayah konten", - "Country used in headers. Now": "Negara digunakan di header. Digunakan", - "Log tracks": "Catatan lagu", - "Send track listen logs to Deezer, enable it for features like Flow to work properly": - "Kirim catatan mendengarkan lagu ke Deezer, aktifkan agar fitur seperti Flow berfungsi dengan benar", - "Offline mode": "Mode offline", - "Will be overwritten on start.": "Akan ditimpa saat mulai.", - "Error logging in, check your internet connections.": - "Kesalahan saat masuk, periksa koneksi internet Anda.", - "Logging in...": "Masuk...", - "Download path": "Path unduhan", - "Downloads naming": "Penamaan unduhan", - "Downloaded tracks filename": "Nama file yang diunduh", - "Valid variables are": "Variabel yang valid", - "Reset": "Atur ulang", - "Clear": "Bersihkan", - "Create folders for artist": "Buat folder dari artis", - "Create folders for albums": "Buat folder dari album", - "Separate albums by discs": "Pisahkan album dengan disk", - "Overwrite already downloaded files": "Timpa file yang sudah diunduh", - "Copy ARL": "Salin ARL", - "Copy userToken/ARL Cookie for use in other apps.": - "Salin Token/ARL Cookie untuk digunakan di apps lain.", - "Copied": "Tersalin", - "Log out": "Keluar", - "Due to plugin incompatibility, login using browser is unavailable without restart.": - "Karena ketidakcocokan plugin, masuk menggunakan browser tidak tersedia tanpa restart.", - "(ARL ONLY) Continue": "(HANYA ARL) Lanjutkan", - "Log out & Exit": "Keluar", - "Pick-a-Path": "Pilih-sebuah-Jalur", - "Select storage": "Pilih penyimpanan", - "Go up": "Naik", - "Permission denied": "Akses dilarang", - "Language": "Bahasa", - "Language changed, please restart Freezer to apply!": - "Bahasa diganti, Mulai ulang aplikasi untuk menerapkannya!", - "Importing...": "Mengimpor...", - "Radio": "Radio", - "Flow": "Flow", - "Track is not available on Deezer!": "Lagu tidak tersedia di Deezer!", - "Failed to download track! Please restart.": "Gagal untuk mengunduh lagu! Ulangi kembali.", - - //0.5.0 Strings: - "Storage permission denied!": "Izin penyimpanan ditolak!", - "Failed": "Gagal", - "Queued": "Dalam antrean", - //Updated in 0.5.1 - used in context of download: - "External": "Penyimpanan", - //0.5.0 - "Restart failed downloads": "Gagal memulai ulang unduhan", - "Clear failed": "Gagal membersihkan", - "Download Settings": "Pengaturan unduhan", - "Create folder for playlist": "Buat folder dari daftar putar", - "Download .LRC lyrics": "Unduh lirik .LRC", - "Proxy": "Proxy", - "Not set": "Tidak diatur", - "Search or paste URL": "Cari atau masukkan URL", - "History": "Riwayat", - //Updated 0.5.1 - "Download threads": "Unduh bersamaan", - //0.5.0 - "Lyrics unavailable, empty or failed to load!": "Lirik tidak tersedia, kosong atau gagal untuk memuat!", - "About": "Tentang", - "Telegram Channel": "Channel Telegram", - "To get latest releases": "Untuk mendapatkan rilisan terbaru", - "Official chat": "Obrolan resmi", - "Telegram Group": "Grub Telegram", - "Huge thanks to all the contributors! <3": "Terima kasih banyak untuk semua kontributor! <3", - "Edit playlist": "Edit daftar putar", - "Update": "Perbarui", - "Playlist updated!": "Daftar putar diperbarui!", - "Downloads added!": "Unduhan ditambahkan!", - - //0.5.1 Strings: - "Save cover file for every track": "Simpan cover foto dari setiap lagu", - "Download Log": "Catatan unduhan", - "Repository": "Repository", - "Source code, report issues there.": "Kode sumber, laporkan masalah disini.", - - //0.5.2 Strings: - "Use system theme": "Gunakan tema sistem", - "Light": "Cerah", - - //0.5.3 Strings: - "Popularity": "Popularitas", - "User": "Pengguna", - "Track count": "Jumlah lagu", - "If you want to use custom directory naming - use '/' as directory separator.": "Jika Anda ingin menggunakan penamaan direktori kustom - gunakan '/' sebagai pemisah direktori." - } -}; \ No newline at end of file diff --git a/translations/old_languages/it_it.dart b/translations/old_languages/it_it.dart deleted file mode 100644 index b16badc..0000000 --- a/translations/old_languages/it_it.dart +++ /dev/null @@ -1,232 +0,0 @@ -/* - -Translated by: Andrea - -*/ - -const language_it_it = { - "it_it": { - "Home": "Pagina Iniziale", - "Search": "Cerca", - "Library": "Libreria", - "Offline mode, can't play flow or smart track lists.": - "Modalità offline, non è possibile riprodurre flow o tracklist smart", - "Added to library": "Aggiunto alla libreria", - "Download": "Scarica", - "Disk": "Disco", - "Offline": "Offline", - "Top Tracks": "Brani in evidenza", - "Show more tracks": "Mostra più brani", - "Top": "Top", - "Top Albums": "Album in evidenza", - "Show all albums": "Mostra tutti gli album", - "Discography": "Discografia", - "Default": "Default", - "Reverse": "Reverse", - "Alphabetic": "Alfabetico", - "Artist": "Artista", - "Post processing...": "Elaborazione...", - "Done": "Fatto", - "Delete": "Cancellare", - "Are you sure you want to delete this download?": - "Sei sicuro di voler cancellare questo download?", - "Cancel": "Annulla", - "Downloads": "Download", - "Clear queue": "Pulisci la coda", - "This won't delete currently downloading item": - "Questa azione non cancellerà i download", - "Are you sure you want to delete all queued downloads?": - "Sei sicuro di voler cancellare tutti i download in coda?", - "Clear downloads history": "Pulisci la cronologia dei download", - "WARNING: This will only clear non-offline (external downloads)": - "ATTENZIONE: Questa azione, pulirà solo i files che non sono offline (download esterni)", - "Please check your connection and try again later...": - "Per favore controlla la tua connessione e riprova più tardi...", - "Show more": "Mostra di più", - "Importer": "Importa", - "Currently supporting only Spotify, with 100 tracks limit": - "Attualmente supporta solo Spotify, con un limite di 100 brani", - "Due to API limitations": "A causa delle limitazioni delle API", - "Enter your playlist link below": - "Inserisci il link della tua playlist qui sotto", - "Error loading URL!": "Errore nel caricare l'URL!", - "Convert": "Converti", - "Download only": "Solo Download", - "Downloading is currently stopped, click here to resume.": - "Il download è attualmente interrotto, fare clic qui per riprenderlo.", - "Tracks": "Brani", - "Albums": "Album", - "Artists": "Artisti", - "Playlists": "Playlist", - "Import": "Importa", - "Import playlists from Spotify": "Importa playlists da Spotify", - "Statistics": "Statistiche", - "Offline tracks": "Brani offline", - "Offline albums": "Album offline", - "Offline playlists": "Playlist offline", - "Offline size": "Spazio occupato offline", - "Free space": "Spazio libero", - "Loved tracks": "Brani preferiti", - "Favorites": "Preferiti", - "All offline tracks": "Tutte i brani offline", - "Create new playlist": "Crea una nuova playlist", - "Cannot create playlists in offline mode": - "Impossibile creare playlist in modalità offline", - "Error": "Errore", - "Error logging in! Please check your token and internet connection and try again.": - "Errore durante l'accesso! Controlla il token, la tua connessione ad internet e riprova.", - "Dismiss": "Chiudi", - "Welcome to": "Benvenuto su", - "Please login using your Deezer account.": - "Per favore, esegui il login utilizzando il tuo account Deezer.", - "Login using browser": "Login utilizzando il browser", - "Login using token": "Login utilizzando il token", - "Enter ARL": "Inserisci l'ARL", - "Token (ARL)": "Token (ARL)", - "Save": "Salva", - "If you don't have account, you can register on deezer.com for free.": - "Se non possiedi un account, puoi registrarti sul sito deezer.com gratuitamente.", - "Open in browser": "Apri nel browser", - "By using this app, you don't agree with the Deezer ToS": - "Utilizzando questa applicazione, non accetti i ToS di Deezer", - "Play next": "Riproduci subito dopo", - "Add to queue": "Aggiungi alla coda", - "Add track to favorites": "Aggiungi il brano ai preferiti", - "Add to playlist": "Aggiungi a playlist...", - "Select playlist": "Seleziona playlist", - "Track added to": "Brano aggiunto a", - "Remove from playlist": "Rimuovi dalla playlist", - "Track removed from": "Brano rimosso da", - "Remove favorite": "Rimuovi dai preferiti", - "Track removed from library": "Brano rimosso dalla libreria", - "Go to": "Vai a", - "Make offline": "Rendi offline", - "Add to library": "Aggiungi alla libreria", - "Remove album": "Rimuovi album", - "Album removed": "Album rimosso", - "Remove from favorites": "Rimuovi dai preferiti", - "Artist removed from library": "Artista rimosso dalla libreria", - "Add to favorites": "Aggiungi ai preferiti", - "Remove from library": "Rimuovi dalla libreria", - "Add playlist to library": "Aggiungi playlist alla libreria", - "Added playlist to library": "Playlist aggiunta alla libreria", - "Make playlist offline": "Rendi la playlist offline", - "Download playlist": "Scarica playlist", - "Create playlist": "Crea playlist", - "Title": "Titolo", - "Description": "Descrizione", - "Private": "Privata", - "Collaborative": "Collaborativa", - "Create": "Crea", - "Playlist created!": "Playlist creata!", - "Playing from:": "Riproduzione da:", - "Queue": "Coda", - "Offline search": "Ricerca offline", - "Search Results": "Risultati della ricerca", - "No results!": "Nessun risultato!", - "Show all tracks": "Mostra tutti i brani", - "Show all playlists": "Mostra tutte le playlists", - "Settings": "Opzioni", - "General": "Generale", - "Appearance": "Aspetto", - "Quality": "Qualità", - "Deezer": "Deezer", - "Theme": "Tema", - "Currently": "Attuale", - "Select theme": "Seleziona Tema", - "Light (default)": "Chiaro (Default)", - "Dark": "Scuro", - "Black (AMOLED)": "Nero (AMOLED)", - "Deezer (Dark)": "Deezer (Scuro)", - "Primary color": "Colore Principale", - "Selected color": "Colore Selezionato", - "Use album art primary color": - "Usa il colore principale della copertina dell'album", - "Warning: might be buggy": "Attenzione: potrebbe causare problemi", - "Mobile streaming": "Streaming con dati", - "Wifi streaming": "Streaming con WiFi", - "External downloads": "Download esterni", - "Content language": "Lingua dei contenuti", - "Not app language, used in headers. Now": - "Non la lingua dell'app, utilizzata negli header. Adesso", - "Select language": "Seleziona la lingua", - "Content country": "Contenuto dal Paese", - "Country used in headers. Now": "Paese contenuto negli header. Ora", - "Log tracks": "Log delle tracce", - "Send track listen logs to Deezer, enable it for features like Flow to work properly": - "Invia i log delle canzioni ascoltate a Deezer, abilitalo affinché features come Flow funzionino correttamente", - "Offline mode": "Modalità Offline", - "Will be overwritten on start.": "Sarà sovrascritto all'avvio.", - "Error logging in, check your internet connections.": - "Errore durante l'accesso, controlla la tua connessione Internet.", - "Logging in...": "Accesso in corso...", - "Download path": "Percorso di download", - "Downloads naming": "Denominazione dei download", - "Downloaded tracks filename": "Nome del file dei brani scaricati", - "Valid variables are": "Le variabili valide sono", - "Reset": "Ripristina", - "Clear": "Pulisci", - "Create folders for artist": "Crea cartelle per gli artisti", - "Create folders for albums": "Crea cartelle per gli album", - "Separate albums by discs": "Separa gli album per disco", - "Overwrite already downloaded files": "Sovrascrivi i file già scaricati", - "Copy ARL": "Copia ARL", - "Copy userToken/ARL Cookie for use in other apps.": - "Copia userToken / ARL Cookie da utilizzare in altre app.", - "Copied": "Copiato", - "Log out": "Disconnettiti", - "Due to plugin incompatibility, login using browser is unavailable without restart.": - "A causa dell'incompatibilità del plug-in, l'accesso tramite browser non è disponibile senza riavvio.", - "(ARL ONLY) Continue": "(SOLO ARL) Continua", - "Log out & Exit": "Disconnettiti e Esci", - "Pick-a-Path": "Scegli un percorso", - "Select storage": "Seleziona dispositivo di archiviazione", - "Go up": "Vai su", - "Permission denied": "Permesso negato", - "Language": "Lingua", - "Language changed, please restart Freezer to apply!": - "Lingua cambiata, riavvia Freezer per applicare la modifica!", - "Importing...": "Importando...", - "Radio": "Radio", - "Flow": "Flow", - - //0.5.0 Strings: - "Storage permission denied!": "Autorizzazione di archiviazione negata!", - "Failed": "Fallito", - "Queued": "In coda", - "External": "Archiviazione", - "Restart failed downloads": "Riavvia download non riusciti", - "Clear failed": "Pulisci fallito", - "Download Settings": "Impostazioni download", - "Create folder for playlist": "Crea cartella per playlist", - "Download .LRC lyrics": "Scarica testi .LRC", - "Proxy": "Proxy", - "Not set": "Non impostato", - "Search or paste URL": "Cerca o incolla l'URL", - "History": "Storia", - "Download threads": "Download simultanei", - "Lyrics unavailable, empty or failed to load!": - "Testi non disponibili, vuoti o caricamento non riuscito!", - "About": "Info", - "Telegram Channel": "Canale Telegram", - "To get latest releases": "Per ottenere le ultime versioni", - "Official chat": "Chat ufficiale", - "Telegram Group": "Gruppo Telegram", - "Huge thanks to all the contributors! <3": - "Un enorme grazie a tutti i collaboratori! <3", - "Edit playlist": "Modifica playlist", - "Update": "Aggiorna", - "Playlist updated!": "Playlist aggiornata!", - "Downloads added!": "Download aggiunti!", - "Save cover file for every track": - "Salva la copertina dell'album per ogni traccia", - "Download Log": "Download Log", - "Repository": "Repository", - "Source code, report issues there.": - "Codice sorgente, segnala i problemi lì.", - - //0.5.2 Strings: - "Use system theme": "Utilizza il tema di sistema", - "Light": "Chiaro" - } -}; diff --git a/translations/old_languages/ko_ko.dart b/translations/old_languages/ko_ko.dart deleted file mode 100644 index 90f5bbc..0000000 --- a/translations/old_languages/ko_ko.dart +++ /dev/null @@ -1,188 +0,0 @@ -/* - -Translated by: koreezzz - - */ - -const language_ko_ko = { - "ko_ko": { - "Home": "홈", - "Search": "검색", - "Library": "라이브러리", - "Offline mode, can't play flow or smart track lists.": - "오프라인 모드. Flow 또는 스마트 트랙 목록을 재생할 수 없습니다.", - "Added to library": "라이브러리에 추가됨", - "Download": "다운로드", - "Disk": "디스크", - "Offline": "오프라인", - "Top Tracks": "인기 트랙", - "Show more tracks": "더 많은 트랙보기", - "Top": "인기", - "Top Albums": "인기 앨범", - "Show all albums": "모든 앨범보기", - "Discography": "디스코그래피", - "Default": "기본값", - "Reverse": "역전", - "Alphabetic": "알파벳순", - "Artist": "가수", - "Post processing...": "후 처리…", - "Done": "완료", - "Delete": "삭제", - "Are you sure you want to delete this download?": "이 다운로드를 삭제 하시겠습니까?", - "Cancel": "취소", - "Downloads": "다운로드한 내용", - "Clear queue": "목록 지우기", - "This won't delete currently downloading item": "현재 다운로드중인 항목은 삭제되지 않습니다.", - "Are you sure you want to delete all queued downloads?": - "대기중인 모든 다운로드를 삭제 하시겠습니까?", - "Clear downloads history": "다운로드 기록 지우기", - "WARNING: This will only clear non-offline (external downloads)": - "경고 : 오프라인이 아닌 내용만 삭제됩니다 (외부 다운로드).", - "Please check your connection and try again later...": - "인터넷 연결을 확인하고 나중에 다시 시도하십시오 ...", - "Show more": "자세히보기", - "Importer": "수입자", - "Currently supporting only Spotify, with 100 tracks limit": - "현재 Spotify 만 지원하며 트랙 제한은 100 곡입니다.", - "Due to API limitations": "API 제한으로 인해", - "Enter your playlist link below": "아래에 곡목표 링크 입력 하십시오", - "Error loading URL!": "URL 불러 오기 오류!", - "Convert": "변환", - "Download only": "다운로드 전용", - "Downloading is currently stopped, click here to resume.": - "다운로드는 현재 중지되었습니다. 다시 시작하려면 여기를 클릭하십시오.", - "Tracks": "트랙", - "Albums": "앨범", - "Artists": "가수", - "Playlists": "재생 목록", - "Import": "수입", - "Import playlists from Spotify": "Spotify에서 재생 목록을 가져 오기", - "Statistics": "통계", - "Offline tracks": "오프라인 트랙", - "Offline albums": "오프라인 앨범", - "Offline playlists": "오프라인 재생 목록", - "Offline size": "오프라인 사이즈", - "Free space": "자유 공간", - "Loved tracks": "즐겨 찾기는 트랙", - "Favorites": "즐겨 찾기", - "All offline tracks": "모든 오프라인 트랙", - "Create new playlist": "새 재생 목록을 만들기", - "Cannot create playlists in offline mode": "오프라인 모드에서 재생 목록을 만들 수 없습니다.", - "Error": "오류", - "Error logging in! Please check your token and internet connection and try again.": - "로그인 오류! 토큰 및 인터넷 연결을 확인하고 다시 시도하십시오.", - "Dismiss": "해고", - "Welcome to": "\$에 오신 것을 환영합니다", - "Please login using your Deezer account.": "Deezer 계정을 사용하여 로그인하십시오.", - "Login using browser": "브라우저를 사용하여 로그인", - "Login using token": "토큰을 사용하여 로그인", - "Enter ARL": "ARL 입력", - "Token (ARL)": "토큰 (ARL)", - "Save": "저장", - "If you don't have account, you can register on deezer.com for free.": - "계정이 없으시면 deezer.com에서 무료로 등록하실 수 있습니다.", - "Open in browser": "브라우저에서 열기", - "By using this app, you don't agree with the Deezer ToS": - "이 앱을 사용하면 Deezer ToS에 동의하지 않습니다.", - "Play next": "다음 재생", - "Add to queue": "목록에 추가", - "Add track to favorites": "즐겨 찾기에 트랙 추가", - "Add to playlist": "재생 목록에 추가", - "Select playlist": "재생 목록을 선택", - "Track added to": "\$에 트랙을 추가되었습니다", - "Remove from playlist": "재생 목록에서 삭제", - "Track removed from": "\$에서 트랙을 삭제되었습니다", - "Remove favorite": "즐겨 찾기를 삭제", - "Track removed from library": "라이브러리에서 트랙을 삭제되었습니다", - "Go to": "\$에 이동", - "Make offline": "오프라인으로 설정", - "Add to library": "라이브러리에 추가", - "Remove album": "앨범을 삭제", - "Album removed": "앨범을 삭제되었습니다", - "Remove from favorites": "즐겨 찾기에서 삭제", - "Artist removed from library": "가수를 라이브러리에서 삭제되었습니다.", - "Add to favorites": "즐겨 찾기에 추가", - "Remove from library": "라이브러리에서 삭제", - "Add playlist to library": "라이브러리에 재생 목록을 추가", - "Added playlist to library": "라이브러리에 재생 목록을 추가되었습니다", - "Make playlist offline": "재생 목록을 오프라인으로 설정", - "Download playlist": "재생 목록을 다운로드", - "Create playlist": "재생 목록을 만들기", - "Title": "타이틀", - "Description": "서술", - "Private": "사유의", - "Collaborative": "공동의", - "Create": "창조", - "Playlist created!": "재생 목록을 생성되었습니다!", - "Playing from:": "\$부터 재생:", - "Queue": "목록", - "Offline search": "오프라인 검색", - "Search Results": "검색 결과", - "No results!": "결과가 없습니다!", - "Show all tracks": "모든 트랙을 보기", - "Show all playlists": "모든 재생 목록을 보기", - "Settings": "설정", - "General": "일반", - "Appearance": "외모", - "Quality": "품질", - "Deezer": "Deezer", - "Theme": "테마", - "Currently": "현재", - "Select theme": "테마 선택", - "Light (default)": "라이트 (기본값)", - "Dark": "다크", - "Black (AMOLED)": "블랙 (AMOLED)", - "Deezer (Dark)": "Deezer (다크)", - "Primary color": "원색", - "Selected color": "선택한 색상", - "Use album art primary color": "앨범 아트 기본 색상 사용", - "Warning: might be buggy": "경고: 버그가 있을 수 있습니다.", - "Mobile streaming": "모바일 스트리밍", - "Wifi streaming": "Wi-Fi 스트리밍", - "External downloads": "외부 다운로드", - "Content language": "콘텐츠 언어", - "Not app language, used in headers. Now": "헤더에 사용된 앱 언어가 아닙니다. 현재", - "Select language": "언어 선택", - "Content country": "콘텐츠 국가", - "Country used in headers. Now": "헤더에 사용 된 국가. 현재", - "Log tracks": "트랙로그", - "Send track listen logs to Deezer, enable it for features like Flow to work properly": - "Deezer에 트랙로그를 전송. Flow와 같은 기능이 제대로 작동하려면 이 기능을 활성화하십시오.", - "Offline mode": "오프라인 모드", - "Will be overwritten on start.": "시작할 때 덮어 씁니다.", - "Error logging in, check your internet connections.": - "로그인 오류, 인터넷 연결을 확인하십시오.", - "Logging in...": "…\$에로그인 중", - "Download path": "다운로드 경로", - "Downloads naming": "다운로드 네이밍", - "Downloaded tracks filename": "다운로드 된 트랙 파일명", - "Valid variables are": "유효한 변수", - "Reset": "초기화", - "Clear": "치우기", - "Create folders for artist": "가수 용 폴더 만들기", - "Create folders for albums": "앨범 용 폴더 만들기", - "Separate albums by discs": "디스크별로 앨범 분리", - "Overwrite already downloaded files": "이미 다운로드 한 파일을 덮어 쓰기", - "Copy ARL": "ARL 복사", - "Copy userToken/ARL Cookie for use in other apps.": - "다른 앱에서 사용하기 위해 사용자 토큰 / ARL 쿠키를 복사하기.", - "Copied": "복사 됨", - "Log out": "로그 아웃", - "Due to plugin incompatibility, login using browser is unavailable without restart.": - "플러그인 비 호환성으로 인해 다시 시작하지 않으면 브라우저를 사용하여 로그인 할 수 없습니다.", - "(ARL ONLY) Continue": "(ARL 만 해당) 계속", - "Log out & Exit": "로그 아웃 및 종료", - "Pick-a-Path": "경로 선택", - "Select storage": "저장소 선택", - "Go up": "위로 이동", - "Permission denied": "권한이 거부되었습니다.", - "Language": "언어", - "Language changed, please restart Freezer to apply!": - "언어가 변경되었습니다. 적용하려면 Freezer를 다시 시작하세요!", - "Importing...": "…\$가져 오는 중", - "Radio": "라디오", - "Flow": "Flow", - "Track is not available on Deezer!": "Deezer에서는 트랙을 사용할 수 없습니다!", - "Failed to download track! Please restart.": "트랙을 다운로드하지 못했습니다! 다시 시작하십시오.", - } -}; diff --git a/translations/old_languages/pt_br.dart b/translations/old_languages/pt_br.dart deleted file mode 100644 index 76df011..0000000 --- a/translations/old_languages/pt_br.dart +++ /dev/null @@ -1,169 +0,0 @@ -/* - -Translated by: Diego Hiro - -*/ - -const language_pt_br = {"pt_br": { - "Home": "Início", - "Search": "Pesquisar", - "Library": "Biblioteca", - "Offline mode, can't play flow or smart track lists.": "Modo offline, incapaz de reproduzir faixas do flow(personalizadas) ou playlist inteligentes.", - "Added to library": "Adicionado para sua biblioteca", - "Download": "Download", - "Disk": "Disco", - "Offline": "Offline", - "Top Tracks": "Faixas no Top", - "Show more tracks": "Exibir mais faixas", - "Top": "Top", - "Top Albums": "Álbuns no Top", - "Show all albums": "Mostrar todos os álbuns", - "Discography": "Discografia", - "Default": "Padrão", - "Reverse": "Reverter", - "Alphabetic": "Alfabética", - "Artist": "Artista", - "Post processing...": "Processando...", - "Done": "Feito", - "Delete": "Deletar", - "Are you sure you want to delete this download?": "Tem certeza que deseja excluir este download?", - "Cancel": "Cancelar", - "Downloads": "Downloads", - "Clear queue": "Limpar fila", - "This won't delete currently downloading item": "Isso não excluirá os itens que estão fazendo download", - "Are you sure you want to delete all queued downloads?": "Tem certeza que deseja excluir todos os downloads que estão na fila?", - "Clear downloads history": "Limpar histórico de downloads", - "WARNING: This will only clear non-offline (external downloads)": "Cuidado: Isso limpará apenas faixas e listas off-line (downloads externos)", - "Please check your connection and try again later...": "Verifique sua conexão e tente novamente. Caso sua rede não esteja estável, tente mais tarde...", - "Show more": "Mostrar Mais", - "Importer": "importador", - "Currently supporting only Spotify, with 100 tracks limit": "Atualmente suportando apenas Spotify, com limite de 100 faixas", - "Due to API limitations": "Devido às limitações da API", - "Enter your playlist link below": "Insira o link da sua lista de reprodução abaixo", - "Error loading URL!": "Erro ao carregar URL!", - "Convert": "Converter", - "Download only": "Somente download", - "Downloading is currently stopped, click here to resume.": "O download está parado no momento, clique aqui para retomar.", - "Tracks": "Faixas", - "Albums": "Álbuns", - "Artists": "Artistas", - "Playlists": "Playlists", - "Import": "Importar", - "Import playlists from Spotify": "Importar playlists do Spotify", - "Statistics": "Estatísticas", - "Offline tracks": "Faixas Offline", - "Offline albums": "Álbuns Offline", - "Offline playlists": "Playlists Offline", - "Offline size": "Espaço ocupado Offline", - "Free space": "Espaço livre", - "Loved tracks": "Faixas que gostou", - "Favorites": "Favoritos", - "All offline tracks": "Todas as faixas offline", - "Create new playlist": "Criar nova playlist", - "Cannot create playlists in offline mode": "Não é possível criar playlists no modo offline", - "Error": "Erro", - "Error logging in! Please check your token and internet connection and try again.": "Erro ao tentar login! Verifique seu token e sua conexão com a Internet, tente novamente.", - "Dismiss": "Dispensar", - "Welcome to": "Bem-vindo ao", - "Please login using your Deezer account.": "Faça login usando sua conta Deezer.", - "Login using browser": "Faça login usando o navegador", - "Login using token": "Faça login usando o token", - "Enter ARL": "Inserir ARL", - "Token (ARL)": "Token (ARL)", - "Save": "Salvar", - "If you don't have account, you can register on deezer.com for free.": "Se você não tem uma conta, pode se registrar em deezer.com gratuitamente.", - "Open in browser": "Abra no navegador", - "By using this app, you don't agree with the Deezer ToS": "Ao usar este aplicativo, você não concorda com os Termos de Uso com a Deezer", - "Play next": "Tocar próxima", - "Add to queue": "Adicionar à fila", - "Add track to favorites": "Adicionar faixa aos favoritos", - "Add to playlist": "Adicionar à Playlist", - "Select playlist": "Selecionar playlist", - "Track added to": "Faixa adicionada para", - "Remove from playlist": "Remover da playlist", - "Track removed from": "Faixa removida do(a)", - "Remove favorite": "Remover favorito", - "Track removed from library": "Faixa removida da biblioteca", - "Go to": "Ir para", - "Make offline": "Reproduzir offline", - "Add to library": "Adicionar à biblioteca", - "Remove album": "Remover álbum", - "Album removed": "Álbum removido", - "Remove from favorites": "Remover do favoritos", - "Artist removed from library": "Artista Removido da biblioteca", - "Add to favorites": "Adicionar para favoritos", - "Remove from library": "Remover da biblioteca", - "Add playlist to library": "Adicionar playlist para biblioteca", - "Added playlist to library": "Playlist adicionada para biblioteca", - "Make playlist offline": "Converter playlist para modo offline", - "Download playlist": " Efetuar download da playlist", - "Create playlist": "Criar playlist", - "Title": "Título", - "Description": "Descrição", - "Private": "Privado", - "Collaborative": "Colaborativo", - "Create": "Criar", - "Playlist created!": "Playlist criada!", - "Playing from:": "Playing de:", - "Queue": "Fila", - "Offline search": "Pesquisa Offline", - "Search Results": "Resultado da pesquisa", - "No results!": "Nenhum resultado encontrado!", - "Show all tracks": "Mostrar todas as faixas", - "Show all playlists": "Mostrar todas playlists", - "Settings": "Configurações", - "General": "Geral", - "Appearance": "Aparência", - "Quality": "Qualidade", - "Deezer": "Deezer", - "Theme": "Tema", - "Currently": "Atualmente", - "Select theme": "Selecionar tema", - "Light (default)": "Claro (Padrão)", - "Dark": "Escuro", - "Black (AMOLED)": "Preto (AMOLED)", - "Deezer (Dark)": "Deezer (Escuro - Dark Mode)", - "Primary color": "Cor Primária", - "Selected color": "Cor selecionada", - "Use album art primary color": "Use a cor primária da capa do álbum", - "Warning: might be buggy": "Cuidado: pode ter erros dependendo do dispositivo", - "Mobile streaming": "Streaming por dados móveis", - "Wifi streaming": "Streaming por Rede Wifi", - "External downloads": "Downloads Externos", - "Content language": "Linguagem do conteúdo", - "Not app language, used in headers. Now": "Não é o idioma do aplicativo, programação feita em outra Linguagem. Agora", - "Select language": "Selecione a linguagem", - "Content country": "País do conteúdo a Exibir", - "Country used in headers. Now": "País habilitado no banco de dados. Agora", - "Log tracks": "Log de faixas", - "Send track listen logs to Deezer, enable it for features like Flow to work properly": "Enviar registros de faixas de trilhas para o Deezer, habilite-o para o funcionamento de recursos, como o Flow para funcionar corretamente", - "Offline mode": "Modo Offline", - "Will be overwritten on start.": "Será sobrescrito no próximo início do aplicativo.", - "Error logging in, check your internet connections.": "Erro ao fazer login, verifique suas conexões de internet.", - "Logging in...": "Logando em...", - "Download path": "Caminho de download", - "Downloads naming": "Nomenclatura de downloads", - "Downloaded tracks filename": "Nome de arquivo das faixas baixadas", - "Valid variables are": "Variáveis ​​válidas são", - "Reset": "Resetar", - "Clear": "Limpar", - "Create folders for artist": "Create folders for artist", - "Create folders for albums": "Create folders for albums", - "Separate albums by discs": "Separate albums by discs", - "Overwrite already downloaded files": "Overwrite already downloaded files", - "Copy ARL": "Copiar ARL", - "Copy userToken/ARL Cookie for use in other apps.": "Copiar userToken/ARL Cookie para uso em outros aplicativos.", - "Copied": "Copiado", - "Log out": "Deslogar", - "Due to plugin incompatibility, login using browser is unavailable without restart.": "Due to plugin incompatibility, login using browser is unavailable without restart.", - "(ARL ONLY) Continue": "(Somente ARL) Continuar", - "Log out & Exit": "Deslogar & Sair", - "Pick-a-Path": "Escola-um-Caminho", - "Select storage": "Selecione o armazenamento", - "Go up": "Subir", - "Permission denied": "Permissão negada", - "Language": "Linguagem", - "Language changed, please restart Freezer to apply!": "Idioma alterado, reinicie o Freezer para aplicar!", - "Importing...": "Importando..." - } -}; diff --git a/translations/old_languages/ro_ro.dart b/translations/old_languages/ro_ro.dart deleted file mode 100644 index 59591fd..0000000 --- a/translations/old_languages/ro_ro.dart +++ /dev/null @@ -1,230 +0,0 @@ -/* - -Translated by: MicroMihai - -*/ - -const language_ro_ro = { - "ro_ro": { - "Home": "Home", - "Search": "Căutare", - "Library": "Librărie", - "Offline mode, can't play flow or smart track lists.": - "Mod offline, nu pot reda flow-uri sau liste smart track.", - "Added to library": "Adăugat la librărie", - "Download": "Descărcați", - "Disk": "Disc", - "Offline": "Offline", - "Top Tracks": "Piese Top", - "Show more tracks": "Afișează mai multe piese", - "Top": "Top", - "Top Albums": "Albume Top", - "Show all albums": "Afișează toate albumele", - "Discography": "Discografie", - "Default": "Implicit", - "Reverse": "Invers", - "Alphabetic": "Alfabetic", - "Artist": "Artist", - "Post processing...": "Post procesare...", - "Done": "Gata", - "Delete": "Ștergeți", - "Are you sure you want to delete this download?": - "Ești sigur că vrei să ștergi această descărcare?", - "Cancel": "Anulează", - "Downloads": "Descărcări", - "Clear queue": "Ștergeți coada", - "This won't delete currently downloading item": - "Aceasta nu va șterge elementul care se descarcă acum", - "Are you sure you want to delete all queued downloads?": - "Ești sigur că vrei să ștergi toate descărcările aflate în coadă?", - "Clear downloads history": "Șterge istoricul descărcărilor", - "WARNING: This will only clear non-offline (external downloads)": - "AVERTISMENT: Aceasta va șterge numai non-offline-urile (descărcări externe)", - "Please check your connection and try again later...": - "Vă rugăm să verificați conexiunea și să încercați din nou mai târziu...", - "Show more": "Arată mai multe", - "Importer": "Importator", - "Currently supporting only Spotify, with 100 tracks limit": - "În prezent acceptă doar Spotify, cu limita de 100 de piese", - "Due to API limitations": "Din cauza limitărilor API", - "Enter your playlist link below": "Introduceți linkul playlistului de mai jos", - "Error loading URL!": "Eroare la încărcarea URL-ului!", - "Convert": "Convertiți", - "Download only": "Doar descărcare", - "Downloading is currently stopped, click here to resume.": - "Descărcarea acum este oprită, faceți clic pentru a relua.", - "Tracks": "Piese", - "Albums": "Albume", - "Artists": "Artiști", - "Playlists": "Playlist-uri", - "Import": "Import", - "Import playlists from Spotify": "Importă playlist-uri din Spotify", - "Statistics": "Statistici", - "Offline tracks": "Piese offline", - "Offline albums": "Albume offline", - "Offline playlists": "Playlist-uri offline", - "Offline size": "Dimensiune offline", - "Free space": "Spațiu liber", - "Loved tracks": "Piese favorite", - "Favorites": "Favorite", - "All offline tracks": "Toate piesele offline", - "Create new playlist": "Crează un nou playlist", - "Cannot create playlists in offline mode": - "Nu se pot crea playlist-uri în modul offline", - "Error": "Eroare", - "Error logging in! Please check your token and internet connection and try again.": - "Eroare la conectare! Verificați token-ul și conexiunea la internet și încercați din nou.", - "Dismiss": "Renunță", - "Welcome to": "Bun venit la", - "Please login using your Deezer account.": - "Te rugăm să te conectezi utilizând contul tau Deezer.", - "Login using browser": "Autentificare utilizând browserul", - "Login using token": "Autentificare folosind token-ul", - "Enter ARL": "Introduceți ARL-ul", - "Token (ARL)": "Token (ARL)", - "Save": "Salvează", - "If you don't have account, you can register on deezer.com for free.": - "Dacă nu ai un cont, te poți înregistra gratuit pe deezer.com.", - "Open in browser": "Deschide în browser", - "By using this app, you don't agree with the Deezer ToS": - "Prin utilizarea acestei aplicații, nu sunteți de acord cu Deezer ToS", - "Play next": "Redă urmatorul", - "Add to queue": "Adaugă la coadă", - "Add track to favorites": "Adaugă piesa la favorite", - "Add to playlist": "Adaugă la un playlist", - "Select playlist": "Selectează playlist-ul", - "Track added to": "Piesa a fost adăugată la", - "Remove from playlist": "Șterge din playlist", - "Track removed from": "Piesa a fost eliminată din", - "Remove favorite": "Ștergeți favoritul", - "Track removed from library": "Piesa a fost eliminată din librărie", - "Go to": "Accesați", - "Make offline": "Pune offline", - "Add to library": "Adaugă la librărie", - "Remove album": "Șterge album-ul", - "Album removed": "Album-ul a fost șters", - "Remove from favorites": "Șterge din favorite", - "Artist removed from library": "Artist șters din librărie", - "Add to favorites": "Adaugă la favorite", - "Remove from library": "Șterge din librărie", - "Add playlist to library": "Adaugă playlist-ul la librărie", - "Added playlist to library": "Playlist-ul a fost adăugat la librărie", - "Make playlist offline": "Pune playlist-ul offline", - "Download playlist": "Descarcă playlist-ul", - "Create playlist": "Crează un playlist", - "Title": "Titlu", - "Description": "Descriere", - "Private": "Privat", - "Collaborative": "Colaborativ", - "Create": "Create", - "Playlist created!": "Playlist-ul a fost creat!", - "Playing from:": "Redare din:", - "Queue": "Coadă", - "Offline search": "Căutare offline", - "Search Results": "Rezultate găsite", - "No results!": "Nici un rezultat", - "Show all tracks": "Afișează toate piesele", - "Show all playlists": "Afișează toate playlist-urile", - "Settings": "Setări", - "General": "General", - "Appearance": "Aspect", - "Quality": "Calitate", - "Deezer": "Deezer", - "Theme": "Temă", - "Currently": "Acum", - "Select theme": "Alege tema", - "Light (default)": "Aprins (Default)", - "Dark": "Întunecat", - "Black (AMOLED)": "Negru (AMOLED)", - "Deezer (Dark)": "Deezer (Întunecat)", - "Primary color": "Culoare primară", - "Selected color": "Culoarea selectată", - "Use album art primary color": "Utilizați culoarea primară ale album-ului", - "Warning: might be buggy": "Avertisment: ar putea fi cam bug-uit", - "Mobile streaming": "Streaming mobil", - "Wifi streaming": "Streaming Wi-Fi", - "External downloads": "Descărcări externe", - "Content language": "Limbajul conținutului", - "Not app language, used in headers. Now": - "Nu este limba aplicației, folosit în header (titlu). Acum", - "Select language": "Alege o limbă", - "Content country": "Conținutul tării", - "Country used in headers. Now": "Țara este utilizată în header-i (titluri). Acum", - "Log tracks": "Log-ul pieselor", - "Send track listen logs to Deezer, enable it for features like Flow to work properly": - "Trimiteți log-urile de ascultare a pieselor către Deezer, activați-l pentru funcții precum Flow să funcționeze corect", - "Offline mode": "Mod offline", - "Will be overwritten on start.": "Va fi suprascris la început.", - "Error logging in, check your internet connections.": - "Eroare la conectare, verificați conexiunile la internet.", - "Logging in...": "Conectare...", - "Download path": "Calea descărcărilor", - "Downloads naming": "Denumirea descărcărilor", - "Downloaded tracks filename": "Numele pieselor descărcate", - "Valid variables are": "Variabilele valide sunt", - "Reset": "Reset", - "Clear": "Șterge", - "Create folders for artist": "Creați foldere pentru artiști", - "Create folders for albums": "Creați foldere pentru albume", - "Separate albums by discs": "Separează albumele după discuri", - "Overwrite already downloaded files": "Suprascrieți fișierele deja descărcate", - "Copy ARL": "Copiază ARL-ul", - "Copy userToken/ARL Cookie for use in other apps.": - "Copiază userToken-ul/ARL-ul Cookie utilizarea în alte aplicații.", - "Copied": "Copiat", - "Log out": "Deconectază", - "Due to plugin incompatibility, login using browser is unavailable without restart.": - "Din cauza incompatibilității plugin-ului, conectarea utilizând browserul nu este disponibilă fără un restart", - "(ARL ONLY) Continue": "(DOAR ARL) Continuă", - "Log out & Exit": "Deconectează și ieși", - "Pick-a-Path": "Alege o cale", - "Select storage": "Selectează stocarea", - "Go up": "Du-te sus", - "Permission denied": "Permisie refuzată", - "Language": "Limbă", - "Language changed, please restart Freezer to apply!": - "Limba a fost schimbată, restart-ați Freezer pentru a aplica schimbarea!", - "Importing...": "Importând...", - "Radio": "Radio", - "Flow": "Flow", - "Track is not available on Deezer!": "Piesa nu este disponibilă pe Deezer!", - "Failed to download track! Please restart.": "Descărcarea piesei nu a reușit! Restart-ați.", - - //0.5.0 Strings: - "Storage permission denied!": "Permisia de stocare a fost refuzată!", - "Failed": "Eșuat", - "Queued": "În coadă", - //Updated in 0.5.1 - used in context of download: - "External": "Stocare", - //0.5.0 - "Restart failed downloads": "Restart-ați descărcările eșuate", - "Clear failed": "Șterge eșuatele", - "Download Settings": "Descărcați setările", - "Create folder for playlist": "Creați foldere pentru playlist-uri", - "Download .LRC lyrics": "Descărcați versurile .LRC", - "Proxy": "Proxy", - "Not set": "Nu este setat", - "Search or paste URL": "Caută sau pune un URL", - "History": "Istorie", - //Updated 0.5.1 - "Download threads": "Descărcări simultane", - //0.5.0 - "Lyrics unavailable, empty or failed to load!": "Versurile nu sunt disponibile, goale sau au eșuat încărcarea!", - "About": "Despre", - "Telegram Channel": "Canalul Telegram", - "To get latest releases": "Pentru a obține cele mai recente versiuni", - "Official chat": "Chat-ul oficial", - "Telegram Group": "Grupul Telegram", - "Huge thanks to all the contributors! <3": "Mulțumesc frumos tuturor colaboratorilor! <3", - "Edit playlist": "Editați playlist-ul", - "Update": "Actualizează", - "Playlist updated!": "Playlist actualizat!", - "Downloads added!": "Descărcări adăugate!", - - //0.5.1 Strings: - "Save cover file for every track": "Salvează cover-ul pentru fiecare piesă", - "Download Log": "Log-ul descărcării", - "Repository": "Depozit", - "Source code, report issues there.": "Codul sursă (Source code), raportați problemele acolo." - } -}; \ No newline at end of file diff --git a/translations/old_languages/ru_ru.dart b/translations/old_languages/ru_ru.dart deleted file mode 100644 index 281d77f..0000000 --- a/translations/old_languages/ru_ru.dart +++ /dev/null @@ -1,232 +0,0 @@ -/* - -Translated by: @Orfej - -*/ -const language_ru_ru = { - "ru_ru": { - "Home": "Главная", - "Search": "Поиск", - "Library": "Избранное", - "Offline mode, can't play flow or smart track lists.": - "Режим офлайн. Невозможно воспроизвести персональные подборки", - "Added to library": "Добавлено в любимые треки", - "Download": "Скачать", - "Disk": "Диск", - "Offline": "Загрузить в кеш", - "Top Tracks": "Популярные треки", - "Show more tracks": "Показать все", - "Top": "Лучшее", - "Top Albums": "Лучшие альбомы", - "Show all albums": "Показать все", - "Discography": "Дискография", - "Default": "По умолчанию", - "Reverse": "В обратном порядке", - "Alphabetic": "По алфавиту", - "Artist": "Исполнитель", - "Post processing...": "Делаем магию...", - "Done": "Готово", - "Delete": "Удалить", - "Are you sure you want to delete this download?": - "Вы действительно хотите удалить эту загрузку?", - "Cancel": "Отмена", - "Downloads": "Загрузки", - "Clear queue": "Очистить очередь", - "This won't delete currently downloading item": - "Это не удалит загружаемый сейчас трек", - "Are you sure you want to delete all queued downloads?": - "Вы действительно хотите удалить все запланированные загрузки?", - "Clear downloads history": "Очистить историю загрузок", - "WARNING: This will only clear non-offline (external downloads)": - "Внимание! Это удалит только загрузки (не кеш)", - "Please check your connection and try again later...": - "Проверьте соединение с Интернетом...", - "Show more": "Показать больше", - "Importer": "Импорт плейлистов", - "Currently supporting only Spotify, with 100 tracks limit": - "В настоящий момент поддерживается только Spotify", - "Due to API limitations": "Можно импортировать не более 100 треков за раз", - "Enter your playlist link below": "Ссылка на плейлист", - "Error loading URL!": "Ошибка загрузки!", - "Convert": "Импортировать", - "Download only": "Скачать", - "Downloading is currently stopped, click here to resume.": - "Загрузка приостановлена, нажмите, чтобы продолжить.", - "Tracks": "Треки", - "Albums": "Альбомы", - "Artists": "Артисты", - "Playlists": "Playlists", - "Import": "Импорт плейлистов", - "Import playlists from Spotify": "В настоящий момент поддерживается только Spotify", - "Statistics": "Размер кеша", - "Offline tracks": "Треки в кеше:", - "Offline albums": "Альбомы в кеше:", - "Offline playlists": "Плейлисты в кеше:", - "Offline size": "Размер кеша:", - "Free space": "Свободно:", - "Loved tracks": "Любимые треки", - "Favorites": "Избранное", - "All offline tracks": "Все треки в кеше", - "Create new playlist": "Новый плейлист", - "Cannot create playlists in offline mode": - "Нельзя создавать плейлисты в режиме офлайн", - "Error": "Ошибка", - "Error logging in! Please check your token and internet connection and try again.": - "Ошибка входа. Проверьте корректность ARL и соединение с Интернетом", - "Dismiss": "Я понял", - "Welcome to": "Добро пожаловать в", - "Please login using your Deezer account.": - "Войдите, используя свой аккаунт Deezer.", - "Login using browser": "Войти через браузер", - "Login using token": "Войти по токену (ARL)", - "Enter ARL": "Введите ARL", - "Token (ARL)": "Токен (ARL)", - "Save": "Сохранить", - "If you don't have account, you can register on deezer.com for free.": - "Вы можете создать аккаунт на deezer.com. Это бесплатно.", - "Open in browser": "Зарегестрироваться", - "By using this app, you don't agree with the Deezer ToS": - "Используя это приложение, вы не соглашаетесь с Условиями использования Deezer.", - "Play next": "Играть следующим", - "Add to queue": "Добавить в очередь", - "Add track to favorites": "Добавить в любимые треки", - "Add to playlist": "Добавить в плейлист", - "Select playlist": "Выберите плейлист", - "Track added to": "Трек добавлен в", - "Remove from playlist": "Удалить из плейлиста", - "Track removed from": "Трек удалён из", - "Remove favorite": "Удалить из любимых треков", - "Track removed from library": "Трек удален из Избранного", - "Go to": "Перейти к", - "Make offline": "Загрузить в кеш", - "Add to library": "Добавить в Избранное", - "Remove album": "Удалить альбом", - "Album removed": "Альбом удален", - "Remove from favorites": "Удалить из Избранного", - "Artist removed from library": "Артист удалён", - "Add to favorites": "Добавить в Избранное", - "Remove from library": "Удалить из Избранного", - "Add playlist to library": "Добавить плейлист в Избранное", - "Added playlist to library": "Плейлист добавлен в Избранное", - "Make playlist offline": "Загрузить плейлист в кеш", - "Download playlist": "Скачать плейлист", - "Create playlist": "Создать плейлист", - "Title": "Название", - "Description": "Описание", - "Private": "Скрытый", - "Collaborative": "Общего пользования", - "Create": "Создать", - "Playlist created!": "Плейлист создан!", - "Playing from:": "Сейчас играет:", - "Queue": "Очередь", - "Offline search": "Поиск по кешу", - "Search Results": "Результаты поиска", - "No results!": "Ничего не найдено!", - "Show all tracks": "Показать все треки", - "Show all playlists": "Показать все плейлисты", - "Settings": "Настрокий", - "General": "Управление аккаунтом", - "Appearance": "Внешний вид", - "Quality": "Качество звука", - "Deezer": "Взаимодействие с Deezer", - "Theme": "Тема", - "Currently": "Используется:", - "Select theme": "Выберите тему", - "Light (default)": "Светлая (По умолчанию)", - "Dark": "Темная", - "Black (AMOLED)": "Черная (AMOLED)", - "Deezer (Dark)": "Deezer (Темная)", - "Primary color": "Цвет акцента", - "Selected color": "Акцент будет выглядеть так", - "Use album art primary color": "Подбирать акцент в цвет обложки", - "Warning: might be buggy": "Осторожно, может вызвать баги", - "Mobile streaming": "Воспроизведение в мобильной сети", - "Wifi streaming": "Воспроизведение по Wi-Fi", - "External downloads": "Скачанные треки", - "Content language": "Язык контента", - "Not app language, used in headers. Now": - "Используется в тегах.", - "Select language": "Выберите язык", - "Content country": "Страна контента", - "Country used in headers. Now": "Также используется в тегах.", - "Log tracks": "Отправлять статистику", - "Send track listen logs to Deezer, enable it for features like Flow to work properly": - "Отправлять статистику прослушивания. Необходимо для правильной работы рекомендаций", - "Offline mode": "Режим офлайн", - "Will be overwritten on start.": "Можно слушать только кешированные треки. Работает до перезапуска.", - "Error logging in, check your internet connections.": - "Ошибка входа, проверьте соединение с Интернетом", - "Logging in...": "Вход...", - "Download path": "Папка загрузок", - "Downloads naming": "Шаблон для названия", - "Downloaded tracks filename": "Шаблон для названий загруженных треков", - "Valid variables are": "Допустимые переменные:", - "Reset": "Сброс", - "Clear": "Очистить", - "Create folders for artist": "Создавать папки для исполнителей", - "Create folders for albums": "Создавать папки для альбомов", - "Separate albums by discs": "Разделять альбомы по дискам", - "Overwrite already downloaded files": "Перезаписывать существующие", - "Copy ARL": "Скопировать токен (ARL)", - "Copy userToken/ARL Cookie for use in other apps.": - "Может быть полезно для использования в других приложениях. Не сообщайте токен никому!", - "Copied": "Скопировано", - "Log out": "Выйти", - "Due to plugin incompatibility, login using browser is unavailable without restart.": - "После авторизации/выхода через браузер требуется перезапуск.", - "(ARL ONLY) Continue": "(Вход по токену) Выйти", - "Log out & Exit": "Выйти и перезапустить", - "Pick-a-Path": "Выберите папку", - "Select storage": "Выбрерите хранилище", - "Go up": "На уровень вверх", - "Permission denied": "Доступ запрещен", - "Language": "Язык", - "Language changed, please restart Freezer to apply!": - "Язык изменен, перезапустите приложения для применения", - "Importing...": "Импорт...", - "Radio": "Радио", - "Flow": "Flow", - "Track is not available on Deezer!": "Трек недоступен на Deezer!", - "Failed to download track! Please restart.": "Ошибка заргузки.Попробуйте снова.", - - //0.5.0 Strings: - "Storage permission denied!": "Доступ к хранилищу запрещен!", - "Failed": "Ошибка", - "Queued": "Добавлено в очередь", - //Updated in 0.5.1 - used in context of download: - "External": "Хранилище", - //0.5.0 - "Restart failed downloads": "Перезапустить загрузки с ошибками", - "Clear failed": "Не удалось очистить", - "Download Settings": "Настройки загрузок", - "Create folder for playlist": "Создавать папки для плейлистов", - "Download .LRC lyrics": "Скачивать тексты .LRC", - "Proxy": "Настройки прокси", - "Not set": "Прокси не настроен", - "Search or paste URL": "Введите запрос или ссылку", - "History": "История", - //Updated 0.5.1 - "Download threads": "Количество одновременных загрузок", - //0.5.0 - "Lyrics unavailable, empty or failed to load!": "Ошибка получения текста!", - "About": "О приложении", - "Telegram Channel": "Канал в Telegram", - "To get latest releases": "Здесь можно скачать официальные обновления", - "Official chat": "Группа в Telegram", - "Telegram Group": "Свободное общение о приложении", - "Huge thanks to all the contributors! <3": "Большое спасибо всем участинкам <3", - "Edit playlist": "Изменить плейлист", - "Update": "Обновить", - "Playlist updated!": "Плейлист обновлен!", - "Downloads added!": "Загрузки добавлены!", - - //0.5.1 Strings: - "Save cover file for every track": "Обложки для каждого трека отдельным файлом", - "Download Log": "Лог загрузок (технические данные)", - "Repository": "Репозиторий", - "Source code, report issues there.": "Исходный код, вопросы, предложения.", - //0.5.2 Strings: - "Use system theme": "Использовать тему системы", - "Light": "Светлая" - } -}; \ No newline at end of file diff --git a/translations/old_languages/tr_tr.dart b/translations/old_languages/tr_tr.dart deleted file mode 100644 index b1b59f1..0000000 --- a/translations/old_languages/tr_tr.dart +++ /dev/null @@ -1,235 +0,0 @@ -/* - -Translated by: HoScHaKaL - -*/ - -const language_tr_tr = { - "tr_tr": { - "Kebab": "Based", - "Home": "Anasayfa", - "Search": "Ara", - "Library": "Kütüphane", - "Offline mode, can't play flow or smart track lists.": - "Çevrimdışı mod, akış veya akıllı parça listelerini çalınamaz.", - "Added to library": "Kütüphaneye eklendi", - "Download": "İndir", - "Disk": "Disk", - "Offline": "Çevrimdışı", - "Top Tracks": "En iyi Parçalar", - "Show more tracks": "Daha fazla parça göster", - "Top": "En iyiler", - "Top Albums": "En iyi Albümler", - "Show all albums": "Tüm albümleri göster", - "Discography": "Diskografi", - "Default": "Varsayılan", - "Reverse": "Tersten", - "Alphabetic": "Alfabetik", - "Artist": "Sanatçı", - "Post processing...": "İşleniyor...", - "Done": "Bitti", - "Delete": "Sil", - "Are you sure you want to delete this download?": - "Bu indirmeyi silmek istediğinizden emin misiniz?", - "Cancel": "İptal", - "Downloads": "İndirilenler", - "Clear queue": "Sırayı temizle", - "This won't delete currently downloading item": - "Bu, şu anda indirilen öğeyi silemez", - "Are you sure you want to delete all queued downloads?": - "Sıradaki tüm indirmeleri silmek istediğinizden emin misiniz?", - "Clear downloads history": "İndirme geçmişini temizle", - "WARNING: This will only clear non-offline (external downloads)": - "UYARI: Bu yalnızca çevrimdışı olmayanları temizler (harici indirmeler)", - "Please check your connection and try again later...": - "Lütfen bağlantınızı kontrol edin ve daha sonra tekrar deneyin ...", - "Show more": "Daha fazla göster", - "Importer": "Aktar", - "Currently supporting only Spotify, with 100 tracks limit": - "Şu anda 100 parça sınırıyla yalnızca Spotify'ı destekliyor", - "Due to API limitations": "API sınırlamaları nedeniyle", - "Enter your playlist link below": "Oynatma listesi bağlantınızı aşağıya girin", - "Error loading URL!": "URL yüklenirken hata oluştu!", - "Convert": "Dönüştür", - "Download only": "Sadece indir", - "Downloading is currently stopped, click here to resume.": - "İndirme durduruldu , devam etmek için tıklayın.", - "Tracks": "Parçalar", - "Albums": "Albümler", - "Artists": "Sanatçılar", - "Playlists": "Oynatma listeleri", - "Import": "İçe Aktar", - "Import playlists from Spotify": "Spotify'dan çalma listelerini içe aktarın", - "Statistics": "İstatistikler", - "Offline tracks": "Çevrimdışı parçalar", - "Offline albums": "Çevrimdışı albümler", - "Offline playlists": "Çevrimdışı oynatma listeleri", - "Offline size": "Çevrimdışı boyut", - "Free space": "Boş alan", - "Loved tracks": "Sevilen parçalar", - "Favorites": "Favoriler", - "All offline tracks": "Tüm çevrimdışı parçalar", - "Create new playlist": "Yeni oynatma listesi oluştur", - "Cannot create playlists in offline mode": - "Çevrimdışı modda oynatma listeleri oluşturulamaz", - "Error": "Hata", - "Error logging in! Please check your token and internet connection and try again.": - "Oturum açılamadı! Lütfen tokeninizi ve internet bağlantınızı kontrol edin ve tekrar deneyin.", - "Dismiss": "Kapat", - "Welcome to": "Hoşgeldiniz", - "Please login using your Deezer account.": - "Lütfen Deezer hesabınızı kullanarak giriş yapın.", - "Login using browser": "Tarayıcı kullanarak giriş yapın", - "Login using token": "Token kullanarak giriş yap", - "Enter ARL": "ARL girin", - "Token (ARL)": "Token (ARL)", - "Save": "Kaydet", - "If you don't have account, you can register on deezer.com for free.": - "Hesabınız yoksa deezer.com'a ücretsiz kayıt olabilirsiniz.", - "Open in browser": "Tarayıcıda aç", - "By using this app, you don't agree with the Deezer ToS": - "Bu uygulamayı kullanarak Deezer Hizmet Şartları'nı kabul etmiyorsunuz", - "Play next": "Sonrakini çal", - "Add to queue": "Sıraya ekle", - "Add track to favorites": "Parçayı favorilere ekle", - "Add to playlist": "Oynatma listesine ekle", - "Select playlist": "Oynatma listesi seçin", - "Track added to": "Parça şuraya eklendi", - "Remove from playlist": "Oynatma listesinden kaldır", - "Track removed from": "Parça şuradan kaldırıldı", - "Remove favorite": "Favorilerden kaldır", - "Track removed from library": "Parça kütüphaneden kaldırıldı", - "Go to": "Git", - "Make offline": "Çevrimdışı yap", - "Add to library": "Kütüphaneye ekle", - "Remove album": "Albümü kaldır", - "Album removed": "Albüm kaldırıldı", - "Remove from favorites": "Favorilerden kaldır", - "Artist removed from library": "Sanatçı kütüphaneden kaldırıldı", - "Add to favorites": "Favorilere ekle", - "Remove from library": "Kütüphaneden kaldır", - "Add playlist to library": "Oynatma listesini kütüphaneye ekleyin", - "Added playlist to library": "Oynatma listesi kütüphaneye eklendi", - "Make playlist offline": "Oynatma listesini çevrimdışı yapın", - "Download playlist": "Oynatma listesini indirin", - "Create playlist": "Oynatma listesi oluştur", - "Title": "Başlık", - "Description": "Açıklama", - "Private": "Özel", - "Collaborative": "Paylaşılan", - "Create": "Oluştur", - "Playlist created!": "Oynatma listesi oluşturuldu!", - "Playing from:": "Şuradan oynatılıyor:", - "Queue": "Kuyruk", - "Offline search": "Çevrimdışı arama", - "Search Results": "Arama Sonuçları", - "No results!": "Sonuç yok!", - "Show all tracks": "Tüm parçaları göster", - "Show all playlists": "Tüm oynatma listelerini göster", - "Settings": "Ayarlar", - "General": "Genel", - "Appearance": "Arayüz", - "Quality": "Kalite", - "Deezer": "Deezer", - "Theme": "Tema", - "Currently": "Şu anda", - "Select theme": "Tema seçin", - "Light (default)": "Açık (Varsayılan)", - "Dark": "Koyu", - "Black (AMOLED)": "Siyah (AMOLED)", - "Deezer (Dark)": "Deezer (Dark)", - "Primary color": "Ana renk", - "Selected color": "Seçilen renk", - "Use album art primary color": "Albüm resmini ana renk olarak kullan", - "Warning: might be buggy": "Uyarı: hatalı olabilir", - "Mobile streaming": "Mobil veri", - "Wifi streaming": "Wifi", - "External downloads": "Harici indirmeler", - "Content language": "İçerik dili", - "Not app language, used in headers. Now": - "Uygulama dili değil, başlıklarda kullanılacak. Şuan", - "Select language": "Dil seçin", - "Content country": "İçerik ülkesi", - "Country used in headers. Now": "Başlıklarda kullanılan ülke. Şuan", - "Log tracks": "Parça günlükleri", - "Send track listen logs to Deezer, enable it for features like Flow to work properly": - "Parça dinleme günlüklerini Deezer'a gönderin, Flow gibi özelliklerin düzgün çalışması için etkinleştirin", - "Offline mode": "Çevrimdışı mod", - "Will be overwritten on start.": "Başlangıçta üzerine yazılacak.", - "Error logging in, check your internet connections.": - "Giriş hatası, internet bağlantılarınızı kontrol edin.", - "Logging in...": "Giriş yapılıyor...", - "Download path": "İndirme konumu", - "Downloads naming": "İndirilenleri adlandır", - "Downloaded tracks filename": "İndirilen parçaların dosya adı", - "Valid variables are": "Geçerli değişkenler", - "Reset": "Sıfırla", - "Clear": "Temizle", - "Create folders for artist": "Sanatçılar için klasörler oluşturun", - "Create folders for albums": "Albümler için klasörler oluşturun", - "Separate albums by discs": "Albümleri disklere göre ayırın", - "Overwrite already downloaded files": "İndirilmiş dosyaların üzerine yaz", - "Copy ARL": "ARL kopyala", - "Copy userToken/ARL Cookie for use in other apps.": - "Diğer uygulamalarda kullanmak için userToken / ARL Cookie'yi kopyalayın.", - "Copied": "Kopyalandı", - "Log out": "Çıkış yap", - "Due to plugin incompatibility, login using browser is unavailable without restart.": - "Eklenti uyumsuzluğu nedeniyle, yeniden başlatmadan tarayıcı kullanılarak oturum açılamaz.", - "(ARL ONLY) Continue": "(SADECE ARL) Devam et", - "Log out & Exit": "Çıkış yap & Kapat", - "Pick-a-Path": "Konum seç", - "Select storage": "Depolama seç", - "Go up": "Yukarı git", - "Permission denied": "İzin reddedildi", - "Language": "Dil", - "Language changed, please restart Freezer to apply!": - "Dil değişti,değişiklik için Freezeri yeniden başlatın!", - "Importing...": "İçe aktarılıyor...", - "Radio": "Radyo", - "Flow": "Flow", - "Track is not available on Deezer!": "Parça Deezer'da mevcut değil!", - "Failed to download track! Please restart.": "Parça indirilemedi! Lütfen yeniden başlat.", - - //0.5.0 Strings: - "Storage permission denied!": "Depolama izni reddedildi!", - "Failed": "Başarısız", - "Queued": "Sıraya alındı", - //Updated in 0.5.1 - used in context of download: - "External": "Depolama", - //0.5.0 - "Restart failed downloads": "Başarısız indirmeleri yeniden başlatın", - "Clear failed": "Silinemedi", - "Download Settings": "İndirme Ayarları", - "Create folder for playlist": "Oynatma listesi için klasör oluştur", - "Download .LRC lyrics": ".LRC şarkı sözlerini indir", - "Proxy": "Proxy", - "Not set": "Ayarlanmadı", - "Search or paste URL": "Arayın veya URL yapıştırın", - "History": "Geçmiş", - //Updated 0.5.1 - "Download threads": "Eşzamanlı indirmeler", - //0.5.0 - "Lyrics unavailable, empty or failed to load!": "Sözler mevcut değil, boş veya yüklenemedi!", - "About": "Hakkında", - "Telegram Channel": "Telegram Kanalı", - "To get latest releases": "En son sürümleri indirmek için", - "Official chat": "Resmi sohbet", - "Telegram Group": "Telegram Grubu", - "Huge thanks to all the contributors! <3": "Katkıda bulunanlara çok teşekkürler! <3", - "Edit playlist": "Oynatma listesini düzenleyin", - "Update": "Güncelle", - "Playlist updated!": "Oynatma listesi güncellendi!", - "Downloads added!": "İndirmeler eklendi!", - - //0.5.1 Strings: - "Save cover file for every track": "Her parça için kapak dosyasını kaydedin", - "Download Log": "İndirme Kayıtları", - "Repository": "Repo", - "Source code, report issues there.": "Kaynak kodu, sorunları bildirin", - - //0.5.2 Strings: - "Use system theme": "Sistem temasını kullan", - "Light": "Açık" - } -}; \ No newline at end of file diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index 1dc0921..a39a23f 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -11,8 +11,11 @@ #include #include #include +#include #include +#include #include +#include void RegisterPlugins(flutter::PluginRegistry* registry) { ConnectivityPlusWindowsPluginRegisterWithRegistrar( @@ -25,8 +28,14 @@ void RegisterPlugins(flutter::PluginRegistry* registry) { registry->GetRegistrarForPlugin("MediaKitLibsWindowsAudioPluginCApi")); PermissionHandlerWindowsPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin")); + ScreenRetrieverPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("ScreenRetrieverPlugin")); SharePlusWindowsPluginCApiRegisterWithRegistrar( registry->GetRegistrarForPlugin("SharePlusWindowsPluginCApi")); + TrayManagerPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("TrayManagerPlugin")); UrlLauncherWindowsRegisterWithRegistrar( registry->GetRegistrarForPlugin("UrlLauncherWindows")); + WindowManagerPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("WindowManagerPlugin")); } diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index 6e51edc..ab2dc27 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -8,8 +8,11 @@ list(APPEND FLUTTER_PLUGIN_LIST isar_flutter_libs media_kit_libs_windows_audio permission_handler_windows + screen_retriever share_plus + tray_manager url_launcher_windows + window_manager ) list(APPEND FLUTTER_FFI_PLUGIN_LIST