From 8b715db7f37fdd982ff7196d852f7ef61fb8ab3a Mon Sep 17 00:00:00 2001 From: Valeria Fadeeva Date: Thu, 30 Jan 2025 12:29:58 +0500 Subject: [PATCH] Update --- Cargo.lock | 507 +++++++++++++++++- Cargo.toml | 1 + assets/images/home-partition-separated.svg | 90 ++++ assets/images/home-partition-shared.svg | 88 +++ assets/text/about_ru.txt | 2 +- locales/app.yml | 147 +++++ ...staller_with_partition_separated_layout.sh | 4 + ..._installer_with_partition_shared_layout.sh | 4 + src/main.rs | 306 +++++++---- 9 files changed, 1036 insertions(+), 113 deletions(-) create mode 100644 assets/images/home-partition-separated.svg create mode 100644 assets/images/home-partition-shared.svg create mode 100644 locales/app.yml create mode 100755 scripts/run_installer_with_partition_separated_layout.sh create mode 100755 scripts/run_installer_with_partition_shared_layout.sh diff --git a/Cargo.lock b/Cargo.lock index df70c11..a9929fd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,15 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + [[package]] name = "android-tzdata" version = "0.1.1" @@ -17,18 +26,49 @@ dependencies = [ "libc", ] +[[package]] +name = "arc-swap" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" + [[package]] name = "autocfg" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +[[package]] +name = "base62" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10e52a7bcb1d6beebee21fb5053af9e3cbb7a7ed1a4909e534040e676437ab1f" +dependencies = [ + "rustversion", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + [[package]] name = "bitflags" version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" +[[package]] +name = "bstr" +version = "1.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "531a9155a481e2ee699d4f98f43c0ca4ff8ee1bfd55c31e9e98fb29d2b176fe0" +dependencies = [ + "memchr", + "serde", +] + [[package]] name = "bumpalo" version = "3.16.0" @@ -94,19 +134,66 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-utils" version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +dependencies = [ + "libc", + "windows-sys", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + [[package]] name = "fltk" version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c56f0f52b2113c3e23adca6c870ee9d16b5222536b8c23a9baf64968bcc7cc5e" dependencies = [ - "bitflags", + "bitflags 2.8.0", "crossbeam-channel", "fltk-sys", "once_cell", @@ -222,6 +309,54 @@ dependencies = [ "slab", ] +[[package]] +name = "getrandom" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" +dependencies = [ + "cfg-if", + "libc", + "wasi", + "windows-targets", +] + +[[package]] +name = "glob" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" + +[[package]] +name = "globset" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15f1ce686646e7f1e19bf7d5533fe443a45dbfb990e00629110797578b42fb19" +dependencies = [ + "aho-corasick", + "bstr", + "log", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "globwalk" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93e3af942408868f6934a7b85134a3230832b9977cf66125df2f9edcfce4ddcc" +dependencies = [ + "bitflags 1.3.2", + "ignore", + "walkdir", +] + +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" + [[package]] name = "iana-time-zone" version = "0.1.61" @@ -245,6 +380,47 @@ dependencies = [ "cc", ] +[[package]] +name = "ignore" +version = "0.4.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d89fd380afde86567dfba715db065673989d6253f42b88179abd3eae47bda4b" +dependencies = [ + "crossbeam-deque", + "globset", + "log", + "memchr", + "regex-automata", + "same-file", + "walkdir", + "winapi-util", +] + +[[package]] +name = "indexmap" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" + [[package]] name = "js-sys" version = "0.3.77" @@ -255,12 +431,30 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + [[package]] name = "libc" version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" +[[package]] +name = "libyml" +version = "0.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64804cc6a5042d4f05379909ba25b503ec04e2c082151d62122d5dcaa274b961" + +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + [[package]] name = "log" version = "0.4.25" @@ -275,6 +469,7 @@ dependencies = [ "fltk", "fltk-theme", "futures", + "rust-i18n", ] [[package]] @@ -283,6 +478,15 @@ version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +[[package]] +name = "normpath" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8911957c4b1549ac0dc74e30db9c8b0e66ddcd6d7acc33098f4c63a64a6d7ed" +dependencies = [ + "windows-sys", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -334,18 +538,193 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "rust-i18n" +version = "3.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "039f57d22229db401af3458ca939300178e99e88b938573cea12b7c2b0f09724" +dependencies = [ + "globwalk", + "once_cell", + "regex", + "rust-i18n-macro", + "rust-i18n-support", + "smallvec", +] + +[[package]] +name = "rust-i18n-macro" +version = "3.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dde5c022360a2e54477882843d56b6f9bcb4bc62f504b651a2f497f0028d174f" +dependencies = [ + "glob", + "once_cell", + "proc-macro2", + "quote", + "rust-i18n-support", + "serde", + "serde_json", + "serde_yml", + "syn", +] + +[[package]] +name = "rust-i18n-support" +version = "3.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75d2844d36f62b5d6b66f9cf8f8cbdbbbdcdb5fd37a473a9cc2fb45fdcf485d2" +dependencies = [ + "arc-swap", + "base62", + "globwalk", + "itertools", + "lazy_static", + "normpath", + "once_cell", + "proc-macro2", + "regex", + "serde", + "serde_json", + "serde_yml", + "siphasher", + "toml", + "triomphe", +] + +[[package]] +name = "rustix" +version = "0.38.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +dependencies = [ + "bitflags 2.8.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys", +] + [[package]] name = "rustversion" version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" +[[package]] +name = "ryu" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "serde" +version = "1.0.217" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.217" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.138" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_yml" +version = "0.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48e76bab63c3fd98d27c17f9cbce177f64a91f5e69ac04cafe04e1bb25d1dc3c" +dependencies = [ + "indexmap", + "itoa", + "libyml", + "log", + "memchr", + "ryu", + "serde", + "serde_json", + "tempfile", +] + [[package]] name = "shlex" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + [[package]] name = "slab" version = "0.4.9" @@ -355,6 +734,18 @@ dependencies = [ "autocfg", ] +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "syn" version = "2.0.96" @@ -366,6 +757,65 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "tempfile" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c246215d7d24f48ae091a2902398798e05d978b24315d6efbc00ede9a8bb91" +dependencies = [ + "cfg-if", + "fastrand", + "getrandom", + "once_cell", + "rustix", + "windows-sys", +] + +[[package]] +name = "toml" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + +[[package]] +name = "triomphe" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef8f7726da4807b58ea5c96fdc122f80702030edc33b35aff9190a51148ccc85" +dependencies = [ + "arc-swap", + "serde", + "stable_deref_trait", +] + [[package]] name = "ttf-parser" version = "0.25.1" @@ -378,6 +828,25 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "11cd88e12b17c6494200a9c1b683a04fcac9573ed74cd1b62aeb2727c5592243" +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasi" +version = "0.13.3+wasi-0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" +dependencies = [ + "wit-bindgen-rt", +] + [[package]] name = "wasm-bindgen" version = "0.2.100" @@ -436,6 +905,15 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys", +] + [[package]] name = "windows-core" version = "0.52.0" @@ -445,6 +923,15 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + [[package]] name = "windows-targets" version = "0.52.6" @@ -508,3 +995,21 @@ name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen-rt" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" +dependencies = [ + "bitflags 2.8.0", +] diff --git a/Cargo.toml b/Cargo.toml index 840536f..f8d9ec4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,3 +12,4 @@ futures = "^0.3" fltk = "^1.5" fltk-theme = "^0.7" chrono = "^0.4" +rust-i18n = "3" diff --git a/assets/images/home-partition-separated.svg b/assets/images/home-partition-separated.svg new file mode 100644 index 0000000..816b4e1 --- /dev/null +++ b/assets/images/home-partition-separated.svg @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + diff --git a/assets/images/home-partition-shared.svg b/assets/images/home-partition-shared.svg new file mode 100644 index 0000000..7309854 --- /dev/null +++ b/assets/images/home-partition-shared.svg @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + diff --git a/assets/text/about_ru.txt b/assets/text/about_ru.txt index 6dd985b..801d3e1 100644 --- a/assets/text/about_ru.txt +++ b/assets/text/about_ru.txt @@ -25,7 +25,7 @@ ---------------------------------------------- -Чтобы весь мир мог оценить какой профессиональный вы "Васян" или "Василиса" жмите по кнопкам во вкладке "Information" и предлагайте нам своё свободное время и свободный, неоплачиваемый труд для блага общества и мира свободного и открытого программного обеспечения. +Чтобы весь мир мог оценить какой профессиональный вы "Васян" или "Василиса" жмите по кнопкам во вкладке "Информация" и предлагайте нам своё свободное время и свободный, неоплачиваемый труд для блага общества и мира свободного и открытого программного обеспечения. ---------------------------------------------- diff --git a/locales/app.yml b/locales/app.yml new file mode 100644 index 0000000..3076a2e --- /dev/null +++ b/locales/app.yml @@ -0,0 +1,147 @@ +_version: 2 + +tab.main: + en: Main + ru_RU.UTF-8: Главная + +tab.sys_and_rep: + en: System and repositories + ru_RU.UTF-8: Система и репозитории + +tab.services: + en: Services + ru_RU.UTF-8: Службы + +tab.information: + en: Information + ru_RU.UTF-8: Информация + +tab.about: + en: About + ru_RU.UTF-8: Об этом + +label.installation_start_here: + en: Installation operating system start here + ru_RU.UTF-8: Установка операционной системы начинается здесь + +label.users_and_passwords: + en: "Useful information\nUsers and Passwords:\nroot 123; liveuser 123" + ru_RU.UTF-8: "Полезная информация\nПользователи и Пароли:\nroot 123; liveuser 123" + +label.choice_partition_layout: + en: Choose how to partition the disk + ru_RU.UTF-8: Выберите способ разбиения диска на разделы + + +option.0: + en: The home directory shares a common space with the operating system + ru_RU.UTF-8: Домашниый каталог делит общее пространство с операционной системой + +option.1: + en: The home directory is located on its own partition of the disk, separate from the operating system + ru_RU.UTF-8: Домашниый каталог находится на собственном разделе диска, отдельно от операционной системы + + +tooltip.partition_shared: + en: Useful on small disks, when you want to use the home partition on a separate disk in the future, then this disk will be completely dedicated to the operating system. + ru_RU.UTF-8: Полезно на небольших дисках, когда вы хотите вдальнейшем использовать домашний раздел на отдельном диске, тогда этот диск будет полностью выделен под операционную систему. + +tooltip.partition_separated: + en: Useful when you want to separate the system from the home directory on a large drive. + ru_RU.UTF-8: Полезно, когда вы хотите отделить систему от домашнего каталога на большом диске. + +button.install: + en: Launch the installer, where you can choose other settings + ru_RU.UTF-8: Запустите установщик, где вы сможете выбрать другие настройки + +button.update_repo_mirrorlists: + en: Update repo mirrorlists + ru_RU.UTF-8: Обновить список зеркал репозиториев + +button.fix_repo_keys: + en: Fix repo keys + ru_RU.UTF-8: Исправить ключи репозиториев + +button.update_system: + en: Update system + ru_RU.UTF-8: Обновить систему + +button.unlock_repo_databases: + en: Unlock repo databases + ru_RU.UTF-8: Разблокировать базы данных репозиториев + +button.сlear_old_package_cache: + en: Clear old package cache + ru_RU.UTF-8: Удалить старые пакеты из кэша + +button.clear_all_package_cache: + en: Clear all package cache + ru_RU.UTF-8: Удалить все пакеты из кэша + +button.fix_missing_files_in_packages: + en: Fix missing files in packages + ru_RU.UTF-8: Исправить отсутствующие файлы пакетов + +button.reinstall_all_packages: + en: Reinstall all packages + ru_RU.UTF-8: Переустановить все пакеты + +button.restart_kde_plasma: + en: Restart KDE Plasma + ru_RU.UTF-8: Перезапустить KDE Plasma + +button.restart_kde_plasma_effects: + en: Restart KDE Plasma Effects + ru_RU.UTF-8: Перезапустить эффекты KDE Plasma + +button.reset_kde_plasma_layout: + en: Reset KDE Plasma Layout + ru_RU.UTF-8: Сбросить оформление KDE Plasma + +button.restart_tuned_and_ppd: + en: Restart Tuned and Power Profile Daemon + ru_RU.UTF-8: Перезапустить Tuned и Power Profile Daemon + +button.restart_dns_crypt_proxy: + en: Restart DNS Crypt Proxy + ru_RU.UTF-8: Перезапустить DNS Crypt Proxy + +button.restart_tor: + en: Restart Tor + ru_RU.UTF-8: Перезапустить Tor + +button.visit_stie_melawy_linux: + en: Visit Melawy Linux site + ru_RU.UTF-8: Посетить сайт Melawy Linux + +button.i_need_help: + en: I need help + ru_RU.UTF-8: Мне нужна помощь + +button.i_can_help_other_users: + en: "I can help \nother users" + ru_RU.UTF-8: "Я могу оказать помощь \nдругим пользователям" + +button.donate: + en: "I really liked this version \nof the Linux operating system \nand I am ready to support the project" + ru_RU.UTF-8: "Мне очень понравился этот вариант \nоперационной системы Linux \nи я готов поддержать проект" + +button.telegram_channel: + en: Telegram сhannel + ru_RU.UTF-8: Telegram канал + +button.telegram_chat: + en: Telegram сhat + ru_RU.UTF-8: Telegram чат + +button.youtube: + en: YouTube + ru_RU.UTF-8: Ютуб + +button.discord: + en: Discord + ru_RU.UTF-8: Дискорд + +button.mastodon: + en: Mastodon (News) + ru_RU.UTF-8: Мастодон (Новости) diff --git a/scripts/run_installer_with_partition_separated_layout.sh b/scripts/run_installer_with_partition_separated_layout.sh new file mode 100755 index 0000000..9763237 --- /dev/null +++ b/scripts/run_installer_with_partition_separated_layout.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +cp -vf /etc/calamares/modules/partition_separated.conf /etc/calamares/modules/partition.conf +dbus-launch calamares diff --git a/scripts/run_installer_with_partition_shared_layout.sh b/scripts/run_installer_with_partition_shared_layout.sh new file mode 100755 index 0000000..d1e1abb --- /dev/null +++ b/scripts/run_installer_with_partition_shared_layout.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +cp -vf /etc/calamares/modules/partition_shared.conf /etc/calamares/modules/partition.conf +dbus-launch calamares diff --git a/src/main.rs b/src/main.rs index 7b45596..f5496a9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,24 +1,40 @@ // #![cfg_attr(debug_assertions, allow(dead_code, unused))] +use rust_i18n::i18n; +use rust_i18n::t; +rust_i18n::i18n!("locales"); + use fltk::{ - app::App, button::*, enums::*, frame::Frame, group::{Flex, Tabs}, image::*, prelude::*, terminal::{self, RedrawStyle}, window::{DoubleWindow, Window} + app::App, + button::*, + enums::*, + frame::Frame, + group::{Flex, Tabs}, + image::*, + menu::*, + prelude::*, + terminal::{self, RedrawStyle}, + window::{DoubleWindow, Window}, }; use fltk_theme::{ - /*color_themes, widget_themes, ColorTheme, SchemeType,*/ ThemeType, /*WidgetScheme,*/ WidgetTheme, + /*color_themes, widget_themes, ColorTheme, SchemeType,*/ ThemeType, + /*WidgetScheme,*/ WidgetTheme, }; -use std::{thread, time}; -use std::process::Command; use std::env; use std::fs::File; use std::io::{self, BufRead}; use std::path::Path; +use std::process::Command; +use std::{thread, time}; use chrono::Datelike; fn read_lines

(filename: P) -> io::Result>> -where P: AsRef, { +where + P: AsRef, +{ let file = File::open(filename)?; Ok(io::BufReader::new(file).lines()) } @@ -34,18 +50,36 @@ fn run_cmd(cmd_string: &str, lang_env_var: Option<&str>) { if args_vec.len() == 1 { let cmd = args_vec[0]; + let _cmd = &cmd; + println!("{_cmd}"); + let status = Command::new(cmd).output(); println!("{:#?}", status); } else { let cmd = args_vec[0]; let new_args_vec = &args_vec[1..].to_vec(); + let _cmd = &cmd; + let _new_args_vec = &new_args_vec.as_slice(); + println!("{_cmd} {:#?}", _new_args_vec); + let status = Command::new(cmd).args(new_args_vec).output(); println!("{:#?}", status); } } fn main() { + i18n!("locales", fallback = "en"); + + let locale_key = "LANG"; + let locale = match env::var(locale_key) { + Ok(val) => val, + _ => String::from(""), + }; + + rust_i18n::set_locale(&locale); + // let _locale = rust_i18n::locale(); + let current_date = chrono::Utc::now(); let current_year = format!("{}", current_date.year()); @@ -73,8 +107,7 @@ fn main() { .center_screen() .with_label("Melawy Linux: Welcome"); - let icon = - SvgImage::load("/usr/share/melawy-linux-welcome/assets/icons/Melawy.svg").unwrap(); + let icon = SvgImage::load("/usr/share/melawy-linux-welcome/assets/icons/Melawy.svg").unwrap(); win.set_icon(Some(icon)); let mut scale_image = @@ -84,46 +117,99 @@ fn main() { let mut tabs = Tabs::default_fill(); - let mut grp_install_new_sys = Flex::default_fill() - .with_label("Main\t\t") - .column(); + let mut grp_install_new_sys = Flex::default_fill().with_label(&t!("tab.main")).column(); + let mut frame1 = Frame::default(); + // frame1.set_frame(FrameType::BorderBox); - let mut frame1 = Frame::default().with_label("Empty Data"); - frame1.set_frame(FrameType::BorderBox); - - scale_image.scale(500, 500, true, true); + scale_image.scale(500, 300, true, true); frame1.set_image(Some(scale_image)); - frame1.set_label(""); - if Path::new("/usr/bin/calamares").exists() && - Path::new("/etc/calamares/settings.conf").exists() && - Path::new("/etc/calamares/modules/").exists() { + if Path::new("/usr/bin/calamares").exists() + && Path::new("/etc/calamares/settings.conf").exists() + && Path::new("/etc/calamares/modules/").exists() + { let mut col_install_new_sys = Flex::default().column(); col_install_new_sys.set_margin(10); col_install_new_sys.set_pad(10); - let mut label_passwords = Button::default().with_label("User: Password\n---------------------\nroot: 123\nliveuser: 123"); - label_passwords.deactivate(); - let mut btn_install_system = Button::default().with_label("INSTALL NEW SYSTEM"); + let _installation_start_here = Frame::default().with_label(&t!("label.installation_start_here")); + let _label_passwords = Frame::default().with_label(&t!("label.users_and_passwords")); - btn_install_system.set_callback(move |b| { - b.deactivate(); - std::thread::spawn({ - let mut b = b.clone(); - move || { - let cmd = "/usr/lib/kf6/kdesu dbus-launch calamares"; - let _ = run_cmd(cmd, None); + let frame_label_choice_partition_layout = + Frame::default().with_label(&t!("label.choice_partition_layout")); + let mut choice = Choice::default(); + choice.add_choice(&t!("option.0")); + choice.add_choice(&t!("option.1")); - b.activate(); + let mut frame_show_partition_layout = Frame::default(); + + let mut btn_install_system = Button::default().with_label(&t!("button.install")); + btn_install_system.deactivate(); + + choice.set_callback(move |c| { + let _x: &str = match c.value() { + 0 => { + let mut image_home_partition_shared = SvgImage::load( + "assets/images/home-partition-shared.svg" + ).unwrap(); + image_home_partition_shared.scale(550, 200, true, true); + frame_show_partition_layout.set_image(Some(image_home_partition_shared)); + c.redraw(); + frame_show_partition_layout.set_tooltip(&t!("tooltip.partition_shared")); + frame_show_partition_layout.redraw(); + btn_install_system.activate(); + "shared" } + 1 => { + let mut image_home_partition_separated = SvgImage::load( + "assets/images/home-partition-separated.svg" + ).unwrap(); + image_home_partition_separated.scale(550, 200, true, true); + frame_show_partition_layout.set_image(Some(image_home_partition_separated)); + c.redraw(); + frame_show_partition_layout.set_tooltip(&t!("tooltip.partition_separated")); + frame_show_partition_layout.redraw(); + btn_install_system.activate(); + "separated" + } + _ => unreachable!(), + }; + + btn_install_system.set_callback(move |b| { + b.deactivate(); + std::thread::spawn({ + let mut b = b.clone(); + move || { + if + Path::new("/etc/calamares/modules/partition_separated.conf").exists() && + Path::new("/etc/calamares/modules/partition_shared.conf").exists() + { + if _x == "separated" { + let cmd = + "/usr/lib/kf6/kdesu -t dbus-launch /data/github/active/Melawy/Melawy-Dev/MELAWY/Installer/melawy-linux-welcome/scripts/run_installer_with_partition_separated_layout.sh"; + let _ = run_cmd(cmd, None); + } + + if _x == "shared" { + let cmd = + "/usr/lib/kf6/kdesu -t dbus-launch /data/github/active/Melawy/Melawy-Dev/MELAWY/Installer/melawy-linux-welcome/scripts/run_installer_with_partition_shared_layout.sh"; + let _ = run_cmd(cmd, None); + } + } + + b.activate(); + } + }); }); }); col_install_new_sys.end(); - grp_install_new_sys.fixed(&col_install_new_sys, 200); + col_install_new_sys.fixed(&frame_label_choice_partition_layout, 20); + col_install_new_sys.fixed(&choice, 50); + grp_install_new_sys.fixed(&col_install_new_sys, 400); } grp_install_new_sys.end(); @@ -131,20 +217,22 @@ fn main() { // ----------------------------------------------------------- let grp_sys_and_repo = Flex::default_fill() - .with_label("System and repositories\t\t") + .with_label(&t!("tab.sys_and_rep")) .row(); let mut col_sys_and_repo = Flex::default().column(); col_sys_and_repo.set_margin(10); col_sys_and_repo.set_pad(10); - let mut btn_update_repo_mirrorlists = Button::default().with_label("Update repo mirrorlists"); + let mut btn_update_repo_mirrorlists = + Button::default().with_label(&t!("button.update_repo_mirrorlists")); btn_update_repo_mirrorlists.set_callback(move |b| { b.deactivate(); std::thread::spawn({ let mut b = b.clone(); move || { - let cmd = "/usr/bin/konsole --noclose --separate -e /bin/sh -c /usr/share/melawy-linux-welcome/scripts/update_mirrorlist.sh"; + let cmd = + "/usr/bin/konsole --noclose --separate -e /bin/sh -c /usr/share/melawy-linux-welcome/scripts/update_mirrorlist.sh"; let _ = run_cmd(cmd, None); b.activate(); @@ -152,14 +240,15 @@ fn main() { }); }); - let mut btn_fix_repo_keys = Button::default().with_label("Fix repo keys"); + let mut btn_fix_repo_keys = Button::default().with_label(&t!("button.fix_repo_keys")); btn_fix_repo_keys.set_callback(move |b| { b.deactivate(); std::thread::spawn({ let mut b = b.clone(); move || { - let cmd = "/usr/bin/konsole --noclose --separate -e /bin/sh -c /usr/share/melawy-linux-welcome/scripts/key_sign.sh"; + let cmd = + "/usr/bin/konsole --noclose --separate -e /bin/sh -c /usr/share/melawy-linux-welcome/scripts/key_sign.sh"; let _ = run_cmd(cmd, None); b.activate(); @@ -167,7 +256,7 @@ fn main() { }); }); - let mut btn_update_system = Button::default().with_label("Update system"); + let mut btn_update_system = Button::default().with_label(&t!("button.update_system")); btn_update_system.set_callback(move |b| { b.deactivate(); @@ -182,14 +271,16 @@ fn main() { }); }); - let mut btn_unlock_repo_databases = Button::default().with_label("Unlock repo databases"); + let mut btn_unlock_repo_databases = + Button::default().with_label(&t!("button.unlock_repo_databases")); btn_unlock_repo_databases.set_callback(move |b| { b.deactivate(); std::thread::spawn({ let mut b = b.clone(); move || { - let cmd = "/usr/bin/konsole --noclose --separate -e /bin/sh -c /usr/share/melawy-linux-welcome/scripts/unlock_pacman_db.sh"; + let cmd = + "/usr/bin/konsole --noclose --separate -e /bin/sh -c /usr/share/melawy-linux-welcome/scripts/unlock_pacman_db.sh"; let _ = run_cmd(cmd, None); b.activate(); @@ -197,7 +288,8 @@ fn main() { }); }); - let mut btn_clear_old_package_cache = Button::default().with_label("Clear old package cache"); + let mut btn_clear_old_package_cache = + Button::default().with_label(&t!("button.сlear_old_package_cache")); btn_clear_old_package_cache.set_callback(move |b| { b.deactivate(); @@ -212,7 +304,8 @@ fn main() { }); }); - let mut btn_clear_all_package_cache = Button::default().with_label("Clear all package cache"); + let mut btn_clear_all_package_cache = + Button::default().with_label(&t!("button.clear_all_package_cache")); btn_clear_all_package_cache.set_callback(move |b| { b.deactivate(); @@ -228,14 +321,15 @@ fn main() { }); let mut btn_check_missing_files_in_packages = - Button::default().with_label("Fix missing files in packages"); + Button::default().with_label(&t!("button.fix_missing_files_in_packages")); btn_check_missing_files_in_packages.set_callback(move |b| { b.deactivate(); std::thread::spawn({ let mut b = b.clone(); move || { - let cmd = "/usr/bin/konsole --noclose --separate -e /bin/sh -c /usr/share/melawy-linux-welcome/scripts/fix_missing_files_in_packages.sh"; + let cmd = + "/usr/bin/konsole --noclose --separate -e /bin/sh -c /usr/share/melawy-linux-welcome/scripts/fix_missing_files_in_packages.sh"; let _ = run_cmd(cmd, Some("C.UTF-8")); b.activate(); @@ -243,14 +337,16 @@ fn main() { }); }); - let mut btn_reinstall_all_packages = Button::default().with_label("Reinstall all packages"); + let mut btn_reinstall_all_packages = + Button::default().with_label(&t!("button.reinstall_all_packages")); btn_reinstall_all_packages.set_callback(move |b| { b.deactivate(); std::thread::spawn({ let mut b = b.clone(); move || { - let cmd = "/usr/bin/konsole --noclose --separate -e /bin/sh -c /usr/share/melawy-linux-welcome/scripts/reinstall_all_packages.sh"; + let cmd = + "/usr/bin/konsole --noclose --separate -e /bin/sh -c /usr/share/melawy-linux-welcome/scripts/reinstall_all_packages.sh"; let _ = run_cmd(cmd, None); b.activate(); @@ -263,12 +359,12 @@ fn main() { // ----------------------------------------------------------- - let grp_services = Flex::default_fill().with_label("Services\t\t").row(); + let grp_services = Flex::default_fill().with_label(&t!("tab.services")).row(); let mut col_services = Flex::default().column(); col_services.set_margin(10); col_services.set_pad(10); - let mut btn_restart_kde_plasma = Button::default().with_label("Restart KDE Plasma"); + let mut btn_restart_kde_plasma = Button::default().with_label(&t!("button.restart_kde_plasma")); btn_restart_kde_plasma.set_callback(move |b| { b.deactivate(); @@ -283,7 +379,8 @@ fn main() { }); }); - let mut btn_restart_kde_effects = Button::default().with_label("Restart KDE Plasma Effects"); + let mut btn_restart_kde_effects = + Button::default().with_label(&t!("button.restart_kde_plasma_effects")); btn_restart_kde_effects.set_callback(move |b| { b.deactivate(); @@ -298,7 +395,8 @@ fn main() { }); }); - let mut btn_reset_kde_plasma_layout = Button::default().with_label("Reset KDE Plasma Layout"); + let mut btn_reset_kde_plasma_layout = + Button::default().with_label(&t!("button.reset_kde_plasma_layout")); btn_reset_kde_plasma_layout.set_callback(move |b| { b.deactivate(); @@ -326,8 +424,7 @@ fn main() { }); }); - let mut btn_restart_tuned = - Button::default().with_label("Restart Tuned and Tuned - Power Profile Daemon"); + let mut btn_restart_tuned = Button::default().with_label(&t!("button.restart_tuned_and_ppd")); btn_restart_tuned.set_callback(move |b| { b.deactivate(); @@ -342,7 +439,8 @@ fn main() { }); }); - let mut btn_restart_dnscrypt_proxy = Button::default().with_label("Restart DNS Crypt Proxy"); + let mut btn_restart_dnscrypt_proxy = + Button::default().with_label(&t!("button.restart_dns_crypt_proxy")); btn_restart_dnscrypt_proxy.set_callback(move |b| { b.deactivate(); @@ -357,7 +455,7 @@ fn main() { }); }); - let mut btn_restart_tor = Button::default().with_label("Restart Tor"); + let mut btn_restart_tor = Button::default().with_label(&t!("button.restart_tor")); btn_restart_tor.set_callback(move |b| { b.deactivate(); @@ -377,12 +475,14 @@ fn main() { // ----------------------------------------------------------- - let grp_information = Flex::default_fill().with_label("Information\t\t").row(); + let grp_information = Flex::default_fill() + .with_label(&t!("tab.information")) + .row(); let mut col_information = Flex::default().column(); col_information.set_margin(10); col_information.set_pad(10); - let mut btn_visit_site = Button::default().with_label("Visit Melawy Linux site"); + let mut btn_visit_site = Button::default().with_label(&t!("button.visit_stie_melawy_linux")); btn_visit_site.set_callback(move |b| { b.deactivate(); @@ -399,7 +499,7 @@ fn main() { let row_help = Flex::default().row(); - let mut btn_get_help = Button::default().with_label("I need help"); + let mut btn_get_help = Button::default().with_label(&t!("button.i_need_help")); btn_get_help.set_callback(move |b| { b.deactivate(); @@ -414,7 +514,7 @@ fn main() { }); }); - let mut btn_give_help = Button::default().with_label("I'm ready to help"); + let mut btn_give_help = Button::default().with_label(&t!("button.i_can_help_other_users")); btn_give_help.set_callback(move |b| { b.deactivate(); @@ -429,7 +529,7 @@ fn main() { }); }); - let mut btn_donate = Button::default().with_label("Donate"); + let mut btn_donate = Button::default().with_label(&t!("button.donate")); btn_donate.set_callback(move |b| { b.deactivate(); @@ -446,10 +546,9 @@ fn main() { row_help.end(); - let row_telegram = Flex::default().row(); - let mut btn_telegram_channel = Button::default().with_label("Telegram Channel"); + let mut btn_telegram_channel = Button::default().with_label(&t!("button.telegram_channel")); btn_telegram_channel.set_callback(move |b| { b.deactivate(); @@ -464,7 +563,7 @@ fn main() { }); }); - let mut btn_telegram_chat = Button::default().with_label("Telegram Chat"); + let mut btn_telegram_chat = Button::default().with_label(&t!("button.telegram_chat")); btn_telegram_chat.set_callback(move |b| { b.deactivate(); @@ -483,7 +582,7 @@ fn main() { let row_other_media = Flex::default().row(); - let mut btn_youtube = Button::default().with_label("YouTube"); + let mut btn_youtube = Button::default().with_label(&t!("button.youtube")); btn_youtube.set_callback(move |b| { b.deactivate(); @@ -498,7 +597,7 @@ fn main() { }); }); - let mut btn_discord = Button::default().with_label("Discrord"); + let mut btn_discord = Button::default().with_label(&t!("button.discord")); btn_discord.set_callback(move |b| { b.deactivate(); @@ -513,7 +612,7 @@ fn main() { }); }); - let mut btn_mastodon = Button::default().with_label("Mastodon"); + let mut btn_mastodon = Button::default().with_label(&t!("button.mastodon")); btn_mastodon.set_callback(move |b| { b.deactivate(); @@ -535,65 +634,50 @@ fn main() { // ----------------------------------------------------------- - let grp_about = Flex::default_fill() - .with_label("About\t\t") - .column(); + let mut grp_about = Flex::default_fill().with_label(&t!("tab.about")).column(); + // grp_about.set_margin(10); + grp_about.set_pad(10); - let mut tabs_mini_about = Tabs::default_fill(); + if locale == "ru_RU.UTF-8" { + let mut term = terminal::Terminal::default_fill(); + term.set_color(Color::Light1); + term.set_text_color(Color::Gray0); + term.set_redraw_style(RedrawStyle::PerWrite); - let grp_mini_about_en = Flex::default_fill() - .with_label("EN\t\t") - .column(); - - let mut term_en = terminal::Terminal::default_fill(); - term_en.set_color(Color::Light1); - term_en.set_text_color(Color::Gray0); - term_en.set_redraw_style(RedrawStyle::PerWrite); - - if let Ok(lines) = read_lines("/usr/share/melawy-linux-welcome/assets/text/about_en.txt") { - // Получает итератор, который возвращает Option - for line in lines { - if let Ok(text_string) = line { - term_en.append(format!("{}\n", text_string).as_str()); + if let Ok(lines) = read_lines("/usr/share/melawy-linux-welcome/assets/text/about_ru.txt") { + // Получает итератор, который возвращает Option + for line in lines { + if let Ok(text_string) = line { + term.append(format!("{}\n", text_string).as_str()); + } } } + + let copyright = format!("\n(с) Валерия Фадеева, 2023 - {}\n", current_year.clone()); + + term.append(copyright.as_str()); } - - let copyright_en = format!("\n(с) Valeria Fadeeva, 2023 - {}\n", current_year.clone()); - - term_en.append(copyright_en.as_str()); - - grp_mini_about_en.end(); - // ----------------------------------------------------------- + else { + let mut term = terminal::Terminal::default_fill(); + term.set_color(Color::Light1); + term.set_text_color(Color::Gray0); + term.set_redraw_style(RedrawStyle::PerWrite); - let grp_mini_about_ru = Flex::default_fill() - .with_label("RU\t\t") - .column(); - - let mut term_ru = terminal::Terminal::default_fill(); - term_ru.set_color(Color::Light1); - term_ru.set_text_color(Color::Gray0); - term_ru.set_redraw_style(RedrawStyle::PerWrite); - - if let Ok(lines) = read_lines("/usr/share/melawy-linux-welcome/assets/text/about_ru.txt") { - // Получает итератор, который возвращает Option - for line in lines { - if let Ok(text_string) = line { - term_ru.append(format!("{}\n", text_string).as_str()); + if let Ok(lines) = read_lines("/usr/share/melawy-linux-welcome/assets/text/about_en.txt") { + // Получает итератор, который возвращает Option + for line in lines { + if let Ok(text_string) = line { + term.append(format!("{}\n", text_string).as_str()); + } } } + + let copyright = format!("\n(с) Valeria Fadeeva, 2023 - {}\n", current_year.clone()); + + term.append(copyright.as_str()); } - let copyright_ru = format!("\n(с) Валерия Фадеева, 2023 - {}\n", current_year.clone()); - - term_ru.append(copyright_ru.as_str()); - - grp_mini_about_ru.end(); - - tabs_mini_about.end(); - tabs_mini_about.auto_layout(); - grp_about.end(); // -----------------------------------------------------------