diff --git a/.all-contributorsrc b/.all-contributorsrc index ca6ce1c4..4702d2cb 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -97,6 +97,60 @@ "contributions": [ "translation" ] + }, + { + "login": "DocRAID", + "name": "Limdongju", + "avatar_url": "https://avatars.githubusercontent.com/u/69478178?v=4", + "profile": "https://github.com/DocRAID", + "contributions": [ + "translation" + ] + }, + { + "login": "fuzunspm", + "name": "Hüseyin Fahri Uzun", + "avatar_url": "https://avatars.githubusercontent.com/u/12132746?v=4", + "profile": "https://github.com/fuzunspm", + "contributions": [ + "translation" + ] + }, + { + "login": "jauderho", + "name": "Jauder Ho", + "avatar_url": "https://avatars.githubusercontent.com/u/13562?v=4", + "profile": "https://github.com/jauderho", + "contributions": [ + "infra" + ] + }, + { + "login": "amarao", + "name": "George Shuklin", + "avatar_url": "https://avatars.githubusercontent.com/u/652496?v=4", + "profile": "https://github.com/amarao", + "contributions": [ + "translation" + ] + }, + { + "login": "franciscoBSalgueiro", + "name": "Francisco Salgueiro", + "avatar_url": "https://avatars.githubusercontent.com/u/92053465?v=4", + "profile": "https://github.com/franciscoBSalgueiro", + "contributions": [ + "translation" + ] + }, + { + "login": "philclifford", + "name": "Phil Clifford", + "avatar_url": "https://avatars.githubusercontent.com/u/8797027?v=4", + "profile": "https://hachyderm.io/@phil8o", + "contributions": [ + "platform" + ] } ], "contributorsPerLine": 7, diff --git a/.github/dependabot.yml b/.github/dependabot.yml index e349c0f5..74d83c9d 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -5,6 +5,14 @@ version: 2 updates: + +# Maintain dependencies for GitHub Actions +- package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "daily" + +# Maintain dependencies for cargo - package-ecosystem: cargo directory: "/" schedule: diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index dc9900ea..90a2fcbd 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -21,7 +21,7 @@ jobs: name: Rustfmt runs-on: macos-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: actions-rs/toolchain@v1 with: profile: minimal @@ -37,7 +37,7 @@ jobs: name: Clippy runs-on: macos-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: actions-rs/toolchain@v1 with: profile: minimal diff --git a/CHANGELOG.md b/CHANGELOG.md index 16945267..662170f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,20 @@ # Change Log All Sniffnet releases with the relative changes are documented in this file. + +## [1.1.4] - UNRELEASED + +- Added new translations of the GUI: + * Portuguese 🇵🇹 ([#134](https://github.com/GyulyVGC/sniffnet/pull/134)) + * Russian 🇷🇺 ([#151](https://github.com/GyulyVGC/sniffnet/pull/151)) + * Korean 🇰🇷 ([#128](https://github.com/GyulyVGC/sniffnet/pull/128)) + * Turkish 🇹🇷 ([#139](https://github.com/GyulyVGC/sniffnet/pull/139)) + * ...the total number of supported languages is now 13 🎉 +- Changed adapter buttons format and improved volume slider layout (see [#119](https://github.com/GyulyVGC/sniffnet/issues/119) for more details or to give me further suggestions) +- Scrollbars are now highlighted when hovering on the respective scrollable area +- Fixed problem causing a crash on macOS when starting Sniffnet's Homebrew package or building from source in release mode ([#109](https://github.com/GyulyVGC/sniffnet/issues/109) - [#137](https://github.com/GyulyVGC/sniffnet/issues/137)) + + ## [1.1.3] - 2023-04-04 - Added Romanian translation 🇷🇴 ([#113](https://github.com/GyulyVGC/sniffnet/pull/113)) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 9c84e169..b305e716 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -6,16 +6,26 @@ A big shout-out to all the contributors of Sniffnet ([emoji key](https://allcont - - - - - - - - - - + + + + + + + + + + + + + + + + + + + +
Cristiano
Cristiano

💻 🤔
Antoine Colombier
Antoine Colombier

⚠️ 🌍
Colin Delahunty
Colin Delahunty

⚠️
AmadeusGraves
AmadeusGraves

🌍
Charpy
Charpy

🌍
Hubert
Hubert

🌍
luca3s
luca3s

🌍
陈寒彤
陈寒彤

🌍
yossarian
yossarian

🌍
ervinpopescu
ervinpopescu

🌍
Cristiano
Cristiano

💻 🤔
Antoine Colombier
Antoine Colombier

⚠️ 🌍
Colin Delahunty
Colin Delahunty

⚠️
AmadeusGraves
AmadeusGraves

🌍
Charpy
Charpy

🌍
Hubert
Hubert

🌍
luca3s
luca3s

🌍
陈寒彤
陈寒彤

🌍
yossarian
yossarian

🌍
ervinpopescu
ervinpopescu

🌍
Limdongju
Limdongju

🌍
Hüseyin Fahri Uzun
Hüseyin Fahri Uzun

🌍
Jauder Ho
Jauder Ho

🚇
George Shuklin
George Shuklin

🌍
Francisco Salgueiro
Francisco Salgueiro

🌍
Phil Clifford
Phil Clifford

📦
diff --git a/Cargo.lock b/Cargo.lock index 239566fd..4ce11d6d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -24,6 +24,15 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046" +[[package]] +name = "addr2line" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a76fd60b23679b7d19bd066031410fb7e458ccc5e958eb5c325888ce4baedc97" +dependencies = [ + "gimli", +] + [[package]] name = "adler" version = "1.0.2" @@ -129,6 +138,21 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "backtrace" +version = "0.3.67" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233d376d6d185f2a3093e58f283f60f880315b6c60075b01f36b3b85154564ca" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + [[package]] name = "base64" version = "0.21.0" @@ -269,12 +293,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" -[[package]] -name = "cfg_aliases" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" - [[package]] name = "chrono" version = "0.4.24" @@ -395,6 +413,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" +[[package]] +name = "com-rs" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf43edc576402991846b093a7ca18a3477e0ef9c588cde84964b5d3e43016642" + [[package]] name = "combine" version = "4.6.6" @@ -661,9 +685,9 @@ dependencies = [ [[package]] name = "d3d12" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "827914e1f53b1e0e025ecd3d967a7836b7bcb54520f90e21ef8df7b4d88a2759" +checksum = "d8f0de2f5a8e7bd4a9eec0e3c781992a4ce1724f68aec7d7a3715344de8b39da" dependencies = [ "bitflags", "libloading 0.7.4", @@ -1166,6 +1190,12 @@ dependencies = [ "weezl", ] +[[package]] +name = "gimli" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0a93d233ebf96623465aad4046a8d3aa4da22d4f4beba5388838c8a434bbb4" + [[package]] name = "glam" version = "0.21.3" @@ -1190,6 +1220,18 @@ dependencies = [ "web-sys", ] +[[package]] +name = "glow" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e007a07a24de5ecae94160f141029e9a347282cfe25d1d58d85d845cf3130f1" +dependencies = [ + "js-sys", + "slotmap", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "glow_glyph" version = "0.5.1" @@ -1197,7 +1239,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f4e62c64947b9a24fe20e2bba9ad819ecb506ef5c8df7ffc4737464c6df9510" dependencies = [ "bytemuck", - "glow", + "glow 0.11.2", "glyph_brush", "log", ] @@ -1259,6 +1301,19 @@ dependencies = [ "bitflags", ] +[[package]] +name = "gpu-allocator" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce95f9e2e11c2c6fadfce42b5af60005db06576f231f5c92550fdded43c423e8" +dependencies = [ + "backtrace", + "log", + "thiserror", + "winapi", + "windows", +] + [[package]] name = "gpu-descriptor" version = "0.2.3" @@ -1291,9 +1346,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.16" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5be7b54589b581f624f566bf5d8eb2bab1db736c51528720b6bd36b96b55924d" +checksum = "66b91535aa35fea1523ad1b86cb6b53c28e0ae566ba4a460f4457e936cad7c6f" dependencies = [ "bytes", "fnv", @@ -1326,6 +1381,21 @@ dependencies = [ "ahash", ] +[[package]] +name = "hassle-rs" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90601c6189668c7345fc53842cb3f3a3d872203d523be1b3cb44a36a3e62fb85" +dependencies = [ + "bitflags", + "com-rs", + "libc", + "libloading 0.7.4", + "thiserror", + "widestring", + "winapi", +] + [[package]] name = "hermit-abi" version = "0.2.6" @@ -1444,9 +1514,9 @@ dependencies = [ [[package]] name = "iced" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d11492d829f0035ed3fa9217faccf16e57a5612a74dc7c49822c6f6a5ab1b829" +checksum = "efbddf356d01e9d41cd394a9d04d62bfd89650a30f12fda5839cabb8c4591c88" dependencies = [ "iced_core", "iced_futures", @@ -1461,9 +1531,9 @@ dependencies = [ [[package]] name = "iced_core" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a571e43a4dea90e3a7a9f8bb40e4238d0847f9f9d862c87a6719e3e241dd6292" +checksum = "11e1942e28dedee756cc27e67e7a838cdc1e59fb6bf9627ec9f709ab3b135782" dependencies = [ "bitflags", "instant", @@ -1485,13 +1555,13 @@ dependencies = [ [[package]] name = "iced_glow" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d237909aab71ad4b0f005784f9530d3b352eb95b3514bed1a6eb9fc019e9fe04" +checksum = "adc5b081015f5c75777c96ad75e2288916e7d444c97396d6d136517877ef9129" dependencies = [ "bytemuck", "euclid", - "glow", + "glow 0.11.2", "glow_glyph", "glyph_brush", "iced_graphics", @@ -1501,9 +1571,9 @@ dependencies = [ [[package]] name = "iced_graphics" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d58ad90b769e97bd245946b03c4932f82841c8645a7cee47d99115c8b341e8aa" +checksum = "338a6aff7db906537074ad0fe8b720cfdb9512cdfea43c628c76bd1cf50fdcc0" dependencies = [ "bitflags", "bytemuck", @@ -1520,9 +1590,9 @@ dependencies = [ [[package]] name = "iced_lazy" -version = "0.5.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "370ffb291ff5609ca488a2596df98a049b2a4d572c621aa0b2c586694ca327cf" +checksum = "bdf1cb6b8cd90488d3a03fbf438ad42038cb83c81a0d61f3692c51875efdb818" dependencies = [ "iced_native", "ouroboros", @@ -1530,23 +1600,24 @@ dependencies = [ [[package]] name = "iced_native" -version = "0.9.1" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9942cdcd78591e816aae558721942aa366b03ed7f3f964b51de23c68ec78be7" +checksum = "2b3dd42731b43f1ee0a028af35abefbb756956d093552d0f92f678628e6384fe" dependencies = [ "iced_core", "iced_futures", "iced_style", "num-traits", + "thiserror", "twox-hash", "unicode-segmentation", ] [[package]] name = "iced_style" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad5eb9547d32b9ff9b019526657974112b86baab58b2b91b1624316b309700b6" +checksum = "0e37333dc2991201140302cd0d4cea051bd37ca3671d5008ec85df86d232ff30" dependencies = [ "iced_core", "once_cell", @@ -1555,9 +1626,9 @@ dependencies = [ [[package]] name = "iced_wgpu" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbdcca29092b56f6715dfbc183796b627d3ead82883594e7d6babf5c76151c45" +checksum = "478803c56061f567ce5ddf223b20d11d3c118cc46bb0d0552370dc65cdc4cb9c" dependencies = [ "bitflags", "bytemuck", @@ -1576,9 +1647,9 @@ dependencies = [ [[package]] name = "iced_winit" -version = "0.8.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ef7747251a0b4a417589c5a8139d1858edf88d05566018a1a0b772d0229ef68" +checksum = "8a59ea3a85149a6a1f9e92b6c740ce90f04e5c7d848cfd05742336863fceb955" dependencies = [ "iced_futures", "iced_graphics", @@ -2021,9 +2092,9 @@ checksum = "16cf681a23b4d0a43fc35024c176437f9dcd818db34e0f42ab456a0ee5ad497b" [[package]] name = "naga" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "262d2840e72dbe250e8cf2f522d080988dfca624c4112c096238a4845f591707" +checksum = "5eafe22a23b797c9bc227c6c896419b26b5bb88fa903417a3adaed08778850d5" dependencies = [ "bit-set", "bitflags", @@ -2293,6 +2364,15 @@ dependencies = [ "objc", ] +[[package]] +name = "object" +version = "0.30.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea86265d3d3dcb6a27fc51bd29a4bf387fae9d2986b823079d4986af253eb439" +dependencies = [ + "memchr", +] + [[package]] name = "oboe" version = "0.5.0" @@ -2608,9 +2688,9 @@ checksum = "193228616381fecdc1224c62e96946dfbc73ff4384fba576e052ff8c1bea8142" [[package]] name = "plotters-iced" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc932e1abce0251e908cf30bde8e66c30db30753a30b1b72f64846824783e0bf" +checksum = "83affd565dbe7b16a6bb4935ab5d3a91abc88a8e75ca29a17306f298495c7c8e" dependencies = [ "iced_graphics", "iced_native", @@ -2905,6 +2985,12 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "rustc-demangle" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4a36c42d1873f9a77c53bde094f9664d9891bc604a45b4798fd2c389ed12e5b" + [[package]] name = "rustc-hash" version = "1.1.0" @@ -3034,18 +3120,18 @@ checksum = "58bc9567378fc7690d6b2addae4e60ac2eeea07becb2c64b9f218b53865cba2a" [[package]] name = "serde" -version = "1.0.159" +version = "1.0.160" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c04e8343c3daeec41f58990b9d77068df31209f2af111e059e9fe9646693065" +checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.159" +version = "1.0.160" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c614d17805b093df4b147b51339e7e44bf05ef59fba1e45d83500bcfb4d8585" +checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df" dependencies = [ "proc-macro2", "quote", @@ -3810,15 +3896,17 @@ checksum = "9193164d4de03a926d909d3bc7c30543cecb35400c02114792c2cae20d5e2dbb" [[package]] name = "wgpu" -version = "0.14.2" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81f643110d228fd62a60c5ed2ab56c4d5b3704520bd50561174ec4ec74932937" +checksum = "d745a1b6d91d85c33defbb29f0eee0450e1d2614d987e14bf6baf26009d132d7" dependencies = [ "arrayvec 0.7.2", + "cfg-if", "js-sys", "log", "naga", "parking_lot 0.12.1", + "profiling", "raw-window-handle 0.5.0", "smallvec", "static_assertions", @@ -3832,14 +3920,13 @@ dependencies = [ [[package]] name = "wgpu-core" -version = "0.14.2" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6000d1284ef8eec6076fd5544a73125fd7eb9b635f18dceeb829d826f41724ca" +checksum = "7131408d940e335792645a98f03639573b0480e9e2e7cddbbab74f7c6d9f3fff" dependencies = [ "arrayvec 0.7.2", "bit-vec", "bitflags", - "cfg_aliases", "codespan-reporting", "fxhash", "log", @@ -3856,9 +3943,9 @@ dependencies = [ [[package]] name = "wgpu-hal" -version = "0.14.1" +version = "0.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cc320a61acb26be4f549c9b1b53405c10a223fbfea363ec39474c32c348d12f" +checksum = "bdcf61a283adc744bb5453dd88ea91f3f86d5ca6b027661c6c73c7734ae0288b" dependencies = [ "android_system_properties", "arrayvec 0.7.2", @@ -3870,11 +3957,14 @@ dependencies = [ "d3d12", "foreign-types 0.3.2", "fxhash", - "glow", + "glow 0.12.1", "gpu-alloc", + "gpu-allocator", "gpu-descriptor", + "hassle-rs", "js-sys", "khronos-egl", + "libc", "libloading 0.7.4", "log", "metal", @@ -3895,18 +3985,20 @@ dependencies = [ [[package]] name = "wgpu-types" -version = "0.14.1" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb6b28ef22cac17b9109b25b3bf8c9a103eeb293d7c5f78653979b09140375f6" +checksum = "32444e121b0bd00cb02c0de32fde457a9491bd44e03e7a5db6df9b1da2f6f110" dependencies = [ "bitflags", + "js-sys", + "web-sys", ] [[package]] name = "wgpu_glyph" -version = "0.18.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cafb82773e0f124a33674dab5de4dff73175aeb921949047ab014efb58fb446" +checksum = "e25440d5f32ec39de49c57c15c2d3f9133a7939b069b5ad07e5afd8b78fb8adc" dependencies = [ "bytemuck", "glyph_brush", @@ -3914,6 +4006,12 @@ dependencies = [ "wgpu", ] +[[package]] +name = "widestring" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17882f045410753661207383517a6f62ec3dbeb6a4ed2acce01f0728238d1983" + [[package]] name = "winapi" version = "0.3.9" diff --git a/Cargo.toml b/Cargo.toml index 9f780948..f1005f01 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -31,13 +31,13 @@ chrono = { version = "0.4.24", default_features = false, features = ["clock"] } thousands = "0.2.0" indexmap = "1.9.3" plotters = { version = "0.3.4", default_features = false, features = ["area_series"] } -iced = { version = "0.8.0", features = ["tokio", "image"] } -iced_native = "0.9.1" -iced_lazy = "0.5.0" -plotters-iced = "0.7.0" +iced = { version = "0.9.0", features = ["tokio", "image"] } +iced_native = "0.10.1" +iced_lazy = "0.6.1" +plotters-iced = "0.8.0" maxminddb = "0.23.0" confy = "0.5.1" -serde = { version = "1.0.159", default_features = false, features = ["derive"] } +serde = { version = "1.0.160", default_features = false, features = ["derive"] } rodio = { version = "0.17.1", default_features = false, features = ["mp3"] } reqwest = { version = "0.11.16", features = ["json", "blocking"] } diff --git a/README.md b/README.md index d254f1fb..4f0f4591 100644 --- a/README.md +++ b/README.md @@ -302,6 +302,13 @@ If you have problems after having installed Sniffnet through the provided instal it could be due to your OS not being compatible with the pre-built binaries I generated for you.
Reach me out, and I'll try to generate an installer for your specific operating system. +### Rendering problems + +In some cases, especially if you are running on an old architecture, the `wgpu` default renderer used by [iced](https://github.com/iced-rs/iced) +may cause some problems that could prevent you from running Sniffnet.
+In this case, you can try building the application from the [`glow-renderer`](https://github.com/GyulyVGC/sniffnet/tree/glow-renderer) +branch, which uses the `glow` renderer. + ### ***In any case don't hesitate to [open an issue](https://github.com/GyulyVGC/sniffnet/issues), and I will do my best to help you!*** diff --git a/resources/fonts/full/subset_characters.txt b/resources/fonts/full/subset_characters.txt index 07489096..04138b46 100644 --- a/resources/fonts/full/subset_characters.txt +++ b/resources/fonts/full/subset_characters.txt @@ -96,10 +96,12 @@ z ¿ Ê Î +Ö Ü à á â +ã ä ç è @@ -111,6 +113,7 @@ z ñ ó ô +õ ö ù ú @@ -120,9 +123,14 @@ z ą ć ę +ğ +İ +ı ł ń ś +Ş +ş ź ż Ș @@ -132,16 +140,20 @@ z В Г Д +Е З +И К Л М Н О П +Р С Т У +Ф Ч Ш Щ @@ -172,13 +184,16 @@ z ч ш щ +ъ +ы ь +э ю я +ё є і ї -⌘ ⏎ ❤ 一 @@ -370,4 +385,183 @@ z 页 题 黑 +가 +감 +값 +개 +검 +것 +게 +겠 +겨 +결 +계 +고 +과 +관 +교 +국 +그 +근 +기 +까 +네 +넷 +눌 +는 +능 +니 +다 +당 +대 +댑 +데 +뎁 +도 +되 +된 +될 +됩 +두 +둘 +드 +들 +따 +때 +라 +랑 +래 +러 +레 +려 +련 +로 +료 +류 +륨 +른 +를 +리 +림 +링 +마 +만 +말 +면 +모 +몽 +문 +바 +받 +발 +버 +별 +보 +본 +볼 +부 +분 +사 +삭 +새 +생 +서 +석 +선 +설 +성 +세 +션 +셨 +소 +속 +송 +수 +숨 +스 +습 +시 +신 +아 +않 +알 +았 +애 +어 +언 +없 +었 +에 +여 +연 +열 +였 +오 +올 +요 +용 +우 +운 +워 +위 +유 +으 +을 +음 +의 +이 +인 +일 +임 +있 +자 +장 +재 +적 +전 +정 +제 +종 +주 +줄 +중 +즐 +지 +직 +찰 +찾 +체 +초 +총 +최 +추 +케 +콜 +크 +킷 +타 +태 +택 +터 +테 +토 +트 +패 +페 +표 +프 +플 +픽 +필 +하 +한 +할 +합 +해 +현 +화 +확 +환 +활 +효 , diff --git a/resources/fonts/subset/sarasa-mono-sc-bold.subset.ttf b/resources/fonts/subset/sarasa-mono-sc-bold.subset.ttf index 73cbe7e9..226a73cb 100644 Binary files a/resources/fonts/subset/sarasa-mono-sc-bold.subset.ttf and b/resources/fonts/subset/sarasa-mono-sc-bold.subset.ttf differ diff --git a/resources/fonts/subset/sarasa-mono-sc-regular.subset.ttf b/resources/fonts/subset/sarasa-mono-sc-regular.subset.ttf index d77b6efa..f7aae9f6 100644 Binary files a/resources/fonts/subset/sarasa-mono-sc-regular.subset.ttf and b/resources/fonts/subset/sarasa-mono-sc-regular.subset.ttf differ diff --git a/src/gui/components/radio.rs b/src/gui/components/radio.rs index 9ee9eb8b..ae98d56e 100644 --- a/src/gui/components/radio.rs +++ b/src/gui/components/radio.rs @@ -31,8 +31,8 @@ pub fn ip_version_radios( for option in IpVersion::ALL { ret_val = ret_val.push( Radio::new( - option, option.get_radio_label(language), + option, Some(active), Message::IpVersionSelection, ) @@ -62,8 +62,8 @@ pub fn transport_protocol_radios( for option in TransProtocol::ALL { ret_val = ret_val.push( Radio::new( - option, option.get_radio_label(language), + option, Some(active), Message::TransportProtocolSelection, ) @@ -92,8 +92,8 @@ pub fn language_radios( .align_items(Alignment::Center) .push( Radio::new( - *option, format!("{} ({:?})", option.get_radio_label(), option), + *option, Some(active), Message::LanguageSelection, ) @@ -124,8 +124,8 @@ pub fn sound_packets_threshold_radios( for option in Sound::ALL { ret_val = ret_val.push( Radio::new( - option, option.get_radio_label(language), + option, Some(packets_notification.sound), |value| { Message::UpdateNotificationSettings( @@ -161,8 +161,8 @@ pub fn sound_bytes_threshold_radios( for option in Sound::ALL { ret_val = ret_val.push( Radio::new( - option, option.get_radio_label(language), + option, Some(bytes_notification.sound), |value| { Message::UpdateNotificationSettings( @@ -198,8 +198,8 @@ pub fn sound_favorite_radios( for option in Sound::ALL { ret_val = ret_val.push( Radio::new( - option, option.get_radio_label(language), + option, Some(favorite_notification.sound), |value| { Message::UpdateNotificationSettings( @@ -241,8 +241,8 @@ pub fn chart_radios( for option in ChartType::ALL { ret_val = ret_val.push( Radio::new( - option, option.get_radio_label(language), + option, Some(active), Message::ChartSelection, ) @@ -276,8 +276,8 @@ pub fn report_radios( for option in ReportType::ALL { ret_val = ret_val.push( Radio::new( - option, option.get_radio_label(language), + option, Some(active), Message::ReportSelection, ) diff --git a/src/gui/pages/initial_page.rs b/src/gui/pages/initial_page.rs index 3ae46c4f..51375e17 100644 --- a/src/gui/pages/initial_page.rs +++ b/src/gui/pages/initial_page.rs @@ -3,7 +3,7 @@ //! It contains elements to select network adapter and traffic filters. use iced::widget::{ - button, horizontal_space, vertical_space, Column, Container, PickList, Radio, Row, Scrollable, + button, horizontal_space, vertical_space, Button, Column, Container, PickList, Row, Scrollable, Text, Tooltip, }; use iced::Length::FillPortion; @@ -138,7 +138,7 @@ fn button_start(style: StyleType, language: Language) -> Tooltip<'static, Messag fn get_col_adapter(sniffer: &Sniffer, font: Font) -> Column { let mut dev_str_list = vec![]; for dev in Device::list().expect("Error retrieving device list\r\n") { - let mut dev_str = "\n".to_string(); + let mut dev_str = String::new(); let name = dev.name; match dev.desc { None => { @@ -165,7 +165,6 @@ fn get_col_adapter(sniffer: &Sniffer, font: Font) -> Column { let address_string = addr.addr.to_string(); dev_str.push_str(&format!("\n {address_string}")); } - dev_str.push_str("\n "); dev_str_list.push((name, dev_str)); } @@ -183,27 +182,24 @@ fn get_col_adapter(sniffer: &Sniffer, font: Font) -> Column { Scrollable::new(dev_str_list.iter().fold( Column::new().padding(13).spacing(5), |scroll_adapters, adapter| { - let name = &adapter.0; + let name = adapter.0.clone(); + let description = adapter.1.clone(); scroll_adapters.push( - Container::new( - Radio::new(name, &adapter.1, Some(&sniffer.device.name), |name| { - Message::AdapterSelection(name.to_string()) - }) - .font(font) - .size(15) + Button::new(Text::new(description).font(font)) + .padding([20, 30]) .width(Length::Fill) - .style(>::into( - StyleTuple(sniffer.style, ElementType::Standard), - )), - ) - .padding(10) - .style(>::into( - StyleTuple(sniffer.style, ElementType::BorderedRound), - )), + .style( + StyleTuple( + sniffer.style, + if name == sniffer.device.name { + ElementType::BorderedRoundSelected + } else { + ElementType::BorderedRound + }, + ) + .into(), + ) + .on_press(Message::AdapterSelection(name)), ) }, )) diff --git a/src/gui/pages/settings_language_page.rs b/src/gui/pages/settings_language_page.rs index e81ccdd3..3a299828 100644 --- a/src/gui/pages/settings_language_page.rs +++ b/src/gui/pages/settings_language_page.rs @@ -1,5 +1,4 @@ -use iced::alignment::Horizontal; -use iced::widget::{Column, Container, Row, Text}; +use iced::widget::{Column, Container, Row}; use iced::Length::Fixed; use iced::{Alignment, Length}; use iced_native::widget::vertical_space; @@ -23,10 +22,13 @@ pub fn settings_language_page(sniffer: &Sniffer) -> Container { language_radios(language_active, &Language::COL1, font, sniffer.style); let col_language_radio_2 = language_radios(language_active, &Language::COL2, font, sniffer.style); + let col_language_radio_3 = + language_radios(language_active, &Language::COL3, font, sniffer.style); let row_language_radio = Row::new() .spacing(50) .push(col_language_radio_1) - .push(col_language_radio_2); + .push(col_language_radio_2) + .push(col_language_radio_3); let content = Column::new() .align_items(Alignment::Center) @@ -54,24 +56,8 @@ pub fn settings_language_page(sniffer: &Sniffer) -> Container { .font(font) .size(FONT_SIZE_SUBTITLE), ) - .push(vertical_space(Fixed(20.0))) - .push(row_language_radio) .push(vertical_space(Fixed(30.0))) - .push( - Container::new( - Text::new( - "Would you like to add support for your native language?\n\n\ - Give a look at Sniffnet issues on GitHub.", - ) - .horizontal_alignment(Horizontal::Center) - .width(Length::Fixed(500.0)) - .font(font), - ) - .padding(10) - .style(>::into( - StyleTuple(sniffer.style, ElementType::BorderedRound), - )), - ); + .push(row_language_radio); Container::new(content) .height(Fixed(400.0)) diff --git a/src/gui/pages/settings_notifications_page.rs b/src/gui/pages/settings_notifications_page.rs index 772f97a8..c26a182c 100644 --- a/src/gui/pages/settings_notifications_page.rs +++ b/src/gui/pages/settings_notifications_page.rs @@ -328,15 +328,15 @@ fn input_group_packets( } else { curr_threshold_str }, - move |value| { - let packets_notification = - PacketsNotification::from(&value, Some(packets_notification)); - Message::UpdateNotificationSettings( - Notification::Packets(packets_notification), - false, - ) - }, ) + .on_input(move |value| { + let packets_notification = + PacketsNotification::from(&value, Some(packets_notification)); + Message::UpdateNotificationSettings( + Notification::Packets(packets_notification), + false, + ) + }) .padding([0, 0, 0, 10]) .font(font) .width(Length::Fixed(100.0)) @@ -377,15 +377,11 @@ fn input_group_bytes( } else { &curr_threshold_str }, - move |value| { - let bytes_notification = - BytesNotification::from(&value, Some(bytes_notification)); - Message::UpdateNotificationSettings( - Notification::Bytes(bytes_notification), - false, - ) - }, ) + .on_input(move |value| { + let bytes_notification = BytesNotification::from(&value, Some(bytes_notification)); + Message::UpdateNotificationSettings(Notification::Bytes(bytes_notification), false) + }) .padding([0, 0, 0, 10]) .font(font) .width(Length::Fixed(100.0)) @@ -429,9 +425,9 @@ fn volume_slider(language: Language, style: StyleType, volume: u8) -> Container< ElementType::Standard, ))), ) - .push(horizontal_space(Length::Fixed(10.0))) + .push(horizontal_space(Length::Fixed(15.0))) .push( - Text::new('Z'.to_string()) + Text::new("Z") .vertical_alignment(Vertical::Center) .size(20) .font(ICONS), diff --git a/src/gui/pages/settings_style_page.rs b/src/gui/pages/settings_style_page.rs index 34bf4e85..d11fd309 100644 --- a/src/gui/pages/settings_style_page.rs +++ b/src/gui/pages/settings_style_page.rs @@ -114,6 +114,16 @@ fn get_palette_container( .height(Length::Fixed(130.0)) .width(Length::Fixed(360.0)) .padding(5) - .style(StyleTuple(style, ElementType::BorderedRound).into()) + .style( + StyleTuple( + style, + if on_press.eq(&style) { + ElementType::BorderedRoundSelected + } else { + ElementType::BorderedRound + }, + ) + .into(), + ) .on_press(Message::Style(on_press)) } diff --git a/src/gui/pages/types/running_page.rs b/src/gui/pages/types/running_page.rs index 39b51f10..a65167dc 100644 --- a/src/gui/pages/types/running_page.rs +++ b/src/gui/pages/types/running_page.rs @@ -46,12 +46,14 @@ mod tests { #[test] fn test_previous_running_page() { assert_eq!(RunningPage::Overview.previous(), RunningPage::Notifications); - assert_eq!(RunningPage::Notifications.previous(), RunningPage::Overview); + assert_eq!(RunningPage::Notifications.previous(), RunningPage::Inspect); + assert_eq!(RunningPage::Inspect.previous(), RunningPage::Overview); } #[test] fn test_next_running_page() { - assert_eq!(RunningPage::Overview.next(), RunningPage::Notifications); + assert_eq!(RunningPage::Overview.next(), RunningPage::Inspect); + assert_eq!(RunningPage::Inspect.next(), RunningPage::Notifications); assert_eq!(RunningPage::Notifications.next(), RunningPage::Overview); } } diff --git a/src/gui/styles/button.rs b/src/gui/styles/button.rs index 64dadb30..7704314b 100644 --- a/src/gui/styles/button.rs +++ b/src/gui/styles/button.rs @@ -27,11 +27,16 @@ impl button::StyleSheet for StyleTuple { StyleTuple(_, ElementType::Starred) => STARRED, StyleTuple(_, ElementType::Badge) => colors.secondary, StyleTuple(_, ElementType::BorderedRound) => colors.round_containers, + StyleTuple(_, ElementType::BorderedRoundSelected) => { + mix_colors(colors.primary, colors.buttons) + } _ => colors.buttons, })), border_radius: match self { StyleTuple(_, ElementType::TabActive | ElementType::TabInactive) => 0.0, - StyleTuple(_, ElementType::BorderedRound) => 12.0, + StyleTuple(_, ElementType::BorderedRound | ElementType::BorderedRoundSelected) => { + 12.0 + } _ => BORDER_BUTTON_RADIUS, }, border_width: match self { @@ -71,7 +76,9 @@ impl button::StyleSheet for StyleTuple { })), border_radius: match self { StyleTuple(_, ElementType::TabActive | ElementType::TabInactive) => 0.0, - StyleTuple(_, ElementType::BorderedRound) => 12.0, + StyleTuple(_, ElementType::BorderedRound | ElementType::BorderedRoundSelected) => { + 12.0 + } _ => BORDER_BUTTON_RADIUS, }, border_width: match self { @@ -80,12 +87,14 @@ impl button::StyleSheet for StyleTuple { ElementType::Starred | ElementType::NotStarred | ElementType::TabActive - | ElementType::TabInactive, + | ElementType::TabInactive + | ElementType::BorderedRound, ) => 0.0, _ => BORDER_WIDTH, }, border_color: match self { StyleTuple(_, ElementType::Alert) => Color::new(1.0, 0.0, 0.0, 1.0), + StyleTuple(_, ElementType::BorderedRound) => colors.round_borders, _ => colors.secondary, }, text_color: match self { diff --git a/src/gui/styles/scrollbar.rs b/src/gui/styles/scrollbar.rs index 9fd2ee33..58605df0 100644 --- a/src/gui/styles/scrollbar.rs +++ b/src/gui/styles/scrollbar.rs @@ -33,7 +33,7 @@ impl iced::widget::scrollable::StyleSheet for StyleTuple { } } - fn hovered(&self, _: &Self::Style) -> Scrollbar { + fn hovered(&self, _: &Self::Style, is_mouse_over_scrollbar: bool) -> Scrollbar { let colors = get_colors(self.0); Scrollbar { background: Some(Background::Color(colors.round_borders)), @@ -43,7 +43,11 @@ impl iced::widget::scrollable::StyleSheet for StyleTuple { scroller: Scroller { color: colors.secondary, border_radius: BORDER_ROUNDED_RADIUS, - border_width: BORDER_WIDTH * 1.5, + border_width: if is_mouse_over_scrollbar { + BORDER_WIDTH * 1.25 + } else { + BORDER_WIDTH * 1.75 + }, border_color: Color::TRANSPARENT, }, } diff --git a/src/gui/styles/slider.rs b/src/gui/styles/slider.rs index 28f1ecc0..5bffcf80 100644 --- a/src/gui/styles/slider.rs +++ b/src/gui/styles/slider.rs @@ -1,11 +1,12 @@ //! Slider style use iced::widget::slider::Appearance; -use iced_native::widget::slider::Handle; +use iced_native::widget::slider::{Handle, Rail}; use iced_native::widget::vertical_slider::HandleShape; use crate::get_colors; use crate::gui::styles::style_constants::BORDER_WIDTH; +use crate::gui::styles::types::palette::mix_colors; use crate::gui::styles::types::style_tuple::StyleTuple; impl From for iced::theme::Slider { @@ -20,9 +21,12 @@ impl iced::widget::slider::StyleSheet for StyleTuple { fn active(&self, _: &Self::Style) -> Appearance { let colors = get_colors(self.0); Appearance { - rail_colors: (colors.secondary, colors.primary), + rail: Rail { + colors: (colors.secondary, colors.buttons), + width: 3.0, + }, handle: Handle { - shape: HandleShape::Circle { radius: 7.0 }, + shape: HandleShape::Circle { radius: 5.0 }, color: colors.primary, border_width: BORDER_WIDTH, border_color: colors.secondary, @@ -33,10 +37,13 @@ impl iced::widget::slider::StyleSheet for StyleTuple { fn hovered(&self, _: &Self::Style) -> Appearance { let colors = get_colors(self.0); Appearance { - rail_colors: (colors.secondary, colors.secondary), + rail: Rail { + colors: (colors.secondary, colors.buttons), + width: 3.0, + }, handle: Handle { - shape: HandleShape::Circle { radius: 7.0 }, - color: colors.secondary, + shape: HandleShape::Circle { radius: 8.0 }, + color: mix_colors(colors.primary, colors.buttons), border_width: BORDER_WIDTH, border_color: colors.secondary, }, @@ -46,10 +53,13 @@ impl iced::widget::slider::StyleSheet for StyleTuple { fn dragging(&self, _: &Self::Style) -> Appearance { let colors = get_colors(self.0); Appearance { - rail_colors: (colors.secondary, colors.secondary), + rail: Rail { + colors: (colors.secondary, colors.buttons), + width: 3.0, + }, handle: Handle { - shape: HandleShape::Circle { radius: 7.0 }, - color: colors.secondary, + shape: HandleShape::Circle { radius: 8.0 }, + color: mix_colors(colors.primary, colors.buttons), border_width: BORDER_WIDTH, border_color: colors.secondary, }, diff --git a/src/gui/styles/text_input.rs b/src/gui/styles/text_input.rs index 7bc4acaa..04e278b4 100644 --- a/src/gui/styles/text_input.rs +++ b/src/gui/styles/text_input.rs @@ -1,5 +1,6 @@ //! Text Input style +use iced::widget::text_input; use iced::widget::text_input::Appearance; use iced::{Background, Color}; @@ -22,6 +23,7 @@ impl iced::widget::text_input::StyleSheet for StyleTuple { border_radius: 0.0, border_width: 1.0, border_color: colors.round_borders, + icon_color: colors.text_body, } } @@ -32,6 +34,7 @@ impl iced::widget::text_input::StyleSheet for StyleTuple { border_radius: 0.0, border_width: 1.0, border_color: colors.secondary, + icon_color: colors.text_body, } } @@ -62,6 +65,15 @@ impl iced::widget::text_input::StyleSheet for StyleTuple { border_radius: 0.0, border_width: 1.0, border_color: colors.secondary, + icon_color: colors.text_body, } } + + fn disabled(&self, style: &Self::Style) -> Appearance { + text_input::StyleSheet::active(self, style) + } + + fn disabled_color(&self, _style: &Self::Style) -> Color { + Color::BLACK + } } diff --git a/src/gui/styles/types/element_type.rs b/src/gui/styles/types/element_type.rs index bc30dfec..97098d1b 100644 --- a/src/gui/styles/types/element_type.rs +++ b/src/gui/styles/types/element_type.rs @@ -4,6 +4,7 @@ pub enum ElementType { Standard, Headers, BorderedRound, + BorderedRoundSelected, TabActive, TabInactive, Starred, diff --git a/src/gui/types/sniffer.rs b/src/gui/types/sniffer.rs index 828ac97b..27fd9723 100644 --- a/src/gui/types/sniffer.rs +++ b/src/gui/types/sniffer.rs @@ -1131,14 +1131,14 @@ mod tests { assert_eq!(sniffer.running_page, RunningPage::Overview); // switch with closed setting => change running page sniffer.update(Message::SwitchPage(true)); - assert_eq!(sniffer.running_page, RunningPage::Notifications); + assert_eq!(sniffer.running_page, RunningPage::Inspect); assert_eq!(sniffer.settings_page, None); // switch with opened settings => change settings sniffer.update(Message::OpenLastSettings); - assert_eq!(sniffer.running_page, RunningPage::Notifications); + assert_eq!(sniffer.running_page, RunningPage::Inspect); assert_eq!(sniffer.settings_page, Some(SettingsPage::Notifications)); sniffer.update(Message::SwitchPage(true)); - assert_eq!(sniffer.running_page, RunningPage::Notifications); + assert_eq!(sniffer.running_page, RunningPage::Inspect); assert_eq!(sniffer.settings_page, Some(SettingsPage::Appearance)); } } diff --git a/src/main.rs b/src/main.rs index 7c8ef5f8..ebd9b345 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,7 +3,7 @@ use std::sync::{Arc, Condvar, Mutex}; use std::{panic, process, thread}; -use iced::window::Position; +use iced::window::{PlatformSpecific, Position}; use iced::{window, Application, Settings}; use chart::types::chart_type::ChartType; @@ -106,6 +106,7 @@ pub fn main() -> iced::Result { transparent: false, always_on_top: false, icon: None, + platform_specific: PlatformSpecific::default(), }, flags: Sniffer::new( current_capture_id1, diff --git a/src/translations/translations.rs b/src/translations/translations.rs index a231dee4..007c95dc 100644 --- a/src/translations/translations.rs +++ b/src/translations/translations.rs @@ -13,6 +13,10 @@ pub fn choose_adapters_translation(language: Language) -> Text<'static> { Language::UK => "Вибрати мережевий адаптер для інспекції", Language::ZH => "选择需要监控的网络适配器", Language::RO => "Selectați adaptor de rețea pentru a inspecta", + Language::KO => "검사할 네트워크 어댑터 선택", + Language::TR => "İncelemek için bir ağ adaptörü seçiniz", + Language::RU => "Выберите сетевой адаптер для инспекции", + Language::PT => "Selecione o adaptador de rede a inspecionar", }) } @@ -27,6 +31,10 @@ pub fn application_protocol_translation(language: Language) -> &'static str { Language::UK => "Протокол аплікації", Language::ZH => "目标应用层协议", Language::RO => "Protocol aplicație", + Language::KO => "어플리케이션 프로토콜", + Language::TR => "Uygulama protokolü", + Language::RU => "Прикладной протокол", + Language::PT => "Protocolo de aplicação", } } @@ -41,18 +49,25 @@ pub fn select_filters_translation(language: Language) -> Text<'static> { Language::UK => "Вибрати фільтри, які мають бути застосовані до мережевого трафіку", Language::ZH => "选择需要监控的目标", Language::RO => "Selectați filtre pentru traficul de rețea", + Language::KO => "네트워크 트레픽에 적용할 필터 선택", + Language::TR => "Ağ trafiğine uygulanacak filtreleri seçiniz", + Language::RU => "Выберите фильтры для применения к сетевому трафику", + Language::PT => "Selecione os filtros a serem aplicados no tráfego de rede", }) } pub fn start_translation(language: Language) -> &'static str { match language { - Language::EN | Language::DE | Language::RO => "Start!", + Language::EN | Language::DE | Language::RO | Language::KO => "Start!", Language::IT => "Avvia!", Language::FR => "Commencer!", Language::ES => "¡Empieza!", Language::PL => "Rozpocznij!", Language::UK => "Почати!", Language::ZH => "开始!", + Language::TR => "Başla!", + Language::RU => "Начать!", + Language::PT => "Começar!", } } @@ -62,10 +77,13 @@ pub fn address_translation(language: Language) -> &'static str { Language::IT => "\nIndirizzo:", Language::FR | Language::DE => "\nAdresse:", Language::ES => "\nDirección:", - Language::PL => "\nAdres:", + Language::PL | Language::TR => "\nAdres:", Language::UK => "\nАдреса:", Language::ZH => "\n网络地址:", Language::RO => "\nAdresă:", + Language::KO => "\n주소:", + Language::RU => "\nАдрес:", + Language::PT => "\nEndereço:", } } @@ -80,6 +98,10 @@ pub fn addresses_translation(language: Language) -> &'static str { Language::UK => "\nАдреси:", Language::ZH => "\n网络地址:", Language::RO => "\nAdrese:", + Language::KO => "\n주소:", + Language::TR => "\nAdresler:", + Language::RU => "\nАдреса:", + Language::PT => "\nEndereços:", } } @@ -94,6 +116,10 @@ pub fn ip_version_translation(language: Language) -> Text<'static> { Language::UK => "Версія IP", Language::ZH => "目标IP协议版本", Language::RO => "Versiune IP", + Language::KO => "IP 버전", + Language::TR => "IP versiyonu", + Language::RU => "Версия IP", + Language::PT => "Versão de IP", }) } @@ -102,12 +128,15 @@ pub fn transport_protocol_translation(language: Language) -> &'static str { Language::EN => "Transport protocol", Language::IT => "Protocollo di trasporto", Language::FR => "Protocole de transport", - Language::ES => "Protocolo de transporte", + Language::ES | Language::PT => "Protocolo de transporte", Language::PL => "Protokół transportowy", Language::DE => "Netzwerkprotokoll", Language::UK => "Транспортний протокол", Language::ZH => "目标传输协议", Language::RO => "Protocol de transport", + Language::KO => "전송 프로토콜", + Language::TR => "İletişim protokolü", + Language::RU => "Транспортный протокол", } } @@ -122,6 +151,10 @@ pub fn traffic_rate_translation(language: Language) -> Text<'static> { Language::UK => "Швидкість руху:", Language::ZH => "网络速率图:", Language::RO => "Rata de trafic:", + Language::KO => "트레픽 속도:", + Language::TR => "Trafik oranı:", + Language::RU => "Cкорость трафика:", + Language::PT => "Taxa de tráfego:", }) } @@ -136,6 +169,10 @@ pub fn relevant_connections_translation(language: Language) -> Text<'static> { Language::UK => "Важливі підключення:", Language::ZH => "连接详情:", Language::RO => "Conexiuni relevante:", + Language::KO => "관련 연결:", + Language::TR => "İlgili bağlantılar:", + Language::RU => "Важные подключения:", + Language::PT => "Conexões relevantes:", }) } @@ -150,6 +187,10 @@ pub fn settings_translation(language: Language) -> &'static str { Language::UK => "Налаштування", Language::ZH => "设置", Language::RO => "Setări", + Language::KO => "설정", + Language::TR => "Ayarlar", + Language::RU => "Настройки", + Language::PT => "Configurações", } } @@ -164,6 +205,10 @@ pub fn yes_translation(language: Language) -> Text<'static> { Language::UK => "Так", Language::ZH => "是", Language::RO => "Da", + Language::KO => "네", + Language::TR => "Evet", + Language::RU => "Да", + Language::PT => "Sim", }) } @@ -178,6 +223,10 @@ pub fn ask_quit_translation(language: Language) -> Text<'static> { Language::UK => "Чи справді хочеш закінчити аналіз?", Language::ZH => "您确定退出当前监控吗?", Language::RO => "Sunteți sigur că doriți să renunțați la această analiză?", + Language::KO => "정말로 분석을 종료하겠습니까?", + Language::TR => "Bu analizden çıkmak istediğine emin misin?", + Language::RU => "Вы уверены, что хотите выйти из текущего анализа?", + Language::PT => "Tem a certeza que deseja sair desta análise?", }) } @@ -192,6 +241,10 @@ pub fn quit_analysis_translation(language: Language) -> String { Language::UK => "Закінчити аналіз".to_string(), Language::ZH => "退出监控".to_string(), Language::RO => "Renunță la analiză".to_string(), + Language::KO => "분석종료".to_string(), + Language::TR => "Analizden çık".to_string(), + Language::RU => "Закончить анализ".to_string(), + Language::PT => "Sair da análise".to_string(), } } @@ -206,6 +259,10 @@ pub fn ask_clear_all_translation(language: Language) -> Text<'static> { Language::UK => "Чи справді хочеш видалити всі повідомлення?", Language::ZH => "确定清除所有通知?", Language::RO => "Sigur doriți să ștergeți notificările?", + Language::KO => "알림을 삭제하시겠습니까?", + Language::TR => "Bildirimleri temizlemek istediğine emin misin?", + Language::RU => "Вы уверены, что хотите удлить все уведомления?", + Language::PT => "Tem a certeza que deseja eliminar as notificações?", }) } @@ -220,6 +277,10 @@ pub fn clear_all_translation(language: Language) -> String { Language::UK => "Видалити все".to_string(), Language::ZH => "清除所有".to_string(), Language::RO => "Ștergeți tot".to_string(), + Language::KO => "모두 지우기".to_string(), + Language::TR => "Hepsini temizle".to_string(), + Language::RU => "Очистить всё".to_string(), + Language::PT => "Limpar tudo".to_string(), } } @@ -234,6 +295,10 @@ pub fn hide_translation(language: Language) -> &'static str { Language::UK => "Заховати", Language::ZH => "隐藏", Language::RO => "Ascundeți", + Language::KO => "숨기기", + Language::TR => "Gizle", + Language::RU => "Скрыть", + Language::PT => "Esconder", } } @@ -266,6 +331,18 @@ pub fn no_addresses_translation(language: Language, adapter: &str) -> Text<'stat Language::RO => format!("Niciun trafic nu poate fi observat deoarece adaptorul selectat nu are adrese active...\n\n\ Adaptor de rețea: {adapter}\n\n\ Dacă sunteți sigur că sunteți conectat la internet, încercați să alegeți un alt adaptor."), + Language::KO => format!("선택한 어댑터에 유효한 주소가 없기 때문에 트래픽을 확인할 수 없습니다...\n\n\ + 네트워크 어뎁터: {adapter}\n\n\ + 인터넷이 연결되어있다면 다른 어댑터로 시도해보세요."), + Language::TR => format!("Seçtiğiniz adaptör aktif bir adrese sahip olmadığı için hiç bir trafik izlenemez...\n\n\ + Ağ adaptörü: {adapter}\n\n\ + Eğer gerçekten internete bağlı olduğunuza eminseniz, başka bir adaptör seçmeyi deneyiniz."), + Language::RU => format!("Наблюдение за трафиком не возможно, потому что Вы выбрали интерфейс без активного адреса...\n\n\ + Сетевой интерфейс: {adapter}\n\n\ + Если Вы уверены, что подключены к Интернету, попробуйте выбрать другой интерфейс."), + Language::PT => format!("Não é possível observar tráfego porque o adaptador que selecionou não tem endereços ativos...\n\n\ + Adaptador de rede: {adapter}\n\n\ + Se tiver a certeza que está ligado à internet, tente escolher um adaptador diferente."), }) } @@ -297,7 +374,19 @@ pub fn waiting_translation(language: Language, adapter: &str) -> Text<'static> { 您确信您已成功连接到互联网, 并选择了当前正在使用的的网络适配器吗?"), Language::RO => format!("Nu a fost observat încă trafic. Se așteaptă pachetele de rețea...\n\n\ Adaptor de rețea: {adapter}\n\n\ - Ești sigur că ești conectat la internet și ai selectat adaptorul corect?") + Ești sigur că ești conectat la internet și ai selectat adaptorul corect?"), + Language::KO => format!("아직 트래픽이 관찰되지 않았습니다. 네트워크 패킷 대기 중...\n\n\ + 네트워크 어뎁터: {adapter}\n\n\ + 인터넷에 연결되어 있고 올바른 어댑터를 선택하셨습니까?"), + Language::TR => format!("Henüz bir trafik algılanamadı. Ağ paketleri için bekleniyor...\n\n\ + Ağ adaptörü: {adapter}\n\n\ + İnternete bağlı olduğunuza ve doğru adaptörü seçtiğinize emin misiniz?"), + Language::RU => format!("Трафик не обнаружен. Ожидаем сетевые пакеты...\n\n\ + Сетевой интерфейс: {adapter}\n\n\ + Вы уверены, что подключены к Интернету и выбрали правильный интерфейс?"), + Language::PT => format!("Ainda não foi observado tráfego. Aguardando por pacotes...\n\n\ + Adaptador de rede: {adapter}\n\n\ + Tem a certeza de que está ligado à internet e selecionou o adaptador correto?"), }) } @@ -333,7 +422,19 @@ pub fn some_observed_translation( 当前已监测到一些数据包, 但其中并未包含您的目标数据包......\n\n{filters}"), Language::RO => format!("Total pachete interceptate: {observed}\n\n\ Pachete filtrate: 0\n\n\ - Unele pachete au fost interceptate, dar încă niciunul nu a fost selectat conform filtrelor pe care le-ați specificat...\n\n{filters}") + Unele pachete au fost interceptate, dar încă niciunul nu a fost selectat conform filtrelor pe care le-ați specificat...\n\n{filters}"), + Language::KO => format!("감지한 총 패킷: {observed}\n\n\ + 필터링된 패킷: 0\n\n\ + 일부 패킷이 감지되었지만, 지정한 필터에 따라 선택되지 않았습니다...\n\n{filters}"), + Language::TR => format!("Toplam yakalanan paketler: {observed}\n\n\ + Filterelenen paketler: 0\n\n\ + Bazı paketler yakalandı, fakat belirttiğiniz filtrelere göre hiç biri seçilmedi...\n\n{filters}"), + Language::RU => format!("Всего пакетов перехвачено: {observed}\n\n\ + Фильтровано пакетов: 0\n\n\ + Сетевые пакеты были перехвачены, но ни один из них не соответствует заданным фильтрам...\n\n{filters}"), + Language::PT => format!("Total de pacotes interceptados: {observed}\n\n\ + Pacotes filtrados: 0\n\n\ + Alguns pacotes foram interceptados, mas nenhum deles foi selecionado de acordo com os filtros especificados...\n\n{filters}"), }) } @@ -358,6 +459,16 @@ pub fn filtered_packets_translation( Language::RO => { format!("Pachete filtrate:\n {filtered} ({percentage} din total)") } + Language::KO => { + format!("필터링된 패킷:\n {filtered} ({percentage} 의 일부)") + } + Language::TR => format!("Filtrelenen paketler:\n {filtered} toplamın ({percentage})"), + Language::RU => { + format!("Отфильтровано пакетов:\n {filtered} ({percentage}% от общего числа)") + } + Language::PT => { + format!("Pacotes filtrados:\n {filtered} ({percentage} do total)") + } }) } @@ -380,7 +491,17 @@ pub fn filtered_bytes_translation( format!("目标网络流量计数:\n {filtered} (占所有网络流量的 {percentage})") } Language::RO => { - format!("Octeți filtrați::\n {filtered} ({percentage} din total)") + format!("Octeți filtrați:\n {filtered} ({percentage} din total)") + } + Language::KO => { + format!("필터링된 바이트:\n {filtered} ({percentage} 의 일부)") + } + Language::TR => format!("Filtrelenen bayt:\n {filtered} toplamın ({percentage})"), + Language::RU => { + format!("Отфильтровано байт:\n {filtered} ({percentage}% от общего числа)") + } + Language::PT => { + format!("Bytes filtrados:\n {filtered} ({percentage} do total)") } }) } @@ -396,6 +517,10 @@ pub fn filtered_application_translation(language: Language) -> Text<'static> { Language::UK => "Відфільтровані пакети протоколу аплікації/програми:", Language::ZH => "按应用层协议分类的目标数据包计数:", Language::RO => "Pachete filtrate pe protocol de aplicație:", + Language::KO => "애플리케이션 프로토콜당 필터링된 패킷 수:", + Language::TR => "Uygulama protokolü bazında filtrelenen paketler:", + Language::RU => "Отфильтровано пакетов прикладного протокола:", + Language::PT => "Pacotes filtrados por protocolo de aplicação:", }) } @@ -419,6 +544,14 @@ pub fn no_favorites_translation(language: Language) -> Text<'static> { 小贴士: 点击连接右侧的小星星即可收藏到这里哦.", Language::RO => "Nimic de arătat în acest moment.\n\ Pentru a adăuga o conexiune la favorite, faceți clic pe simbolul stea din apropierea conexiunii.", + Language::KO => "현재는 보여줄게 없습니다.\n\ + 즐겨찾기에 연결을 추가하려면 별을 눌러주세요.", + Language::TR => "Şu an gösterecek bir şey yok.\n\ + Favorilere bağlantı eklemek için, bağlantı yanındaki yıldız sembolüne tıklayınız.", + Language::RU => "Нечего показать в настоящий момент.\n\ + Для добавления соединения в избранные, нажмите на символ звезды возле соединения.", + Language::PT => "Nada para mostrar de momento.\n\ + Para adicionar uma conexão aos seus favoritos, clique na estrela perto da conexão.", }) } @@ -460,6 +593,22 @@ pub fn error_translation(language: Language, error: &str) -> Text<'static> { "A apărut o eroare! \n\n\ {error}" ), + Language::KO => format!( + "오류가 발생하였습니다! \n\n\ + {error}" + ), + Language::TR => format!( + "Bir hata oluştu! \n\n\ + {error}" + ), + Language::RU => format!( + "Произошла ошибка! \n\n\ + {error}" + ), + Language::PT => format!( + "Ocorreu um erro! \n\n\ + {error}" + ), }) } @@ -468,12 +617,15 @@ pub fn both_translation(language: Language) -> &'static str { Language::EN => "both", Language::IT => "entrambi", Language::FR => "les deux", - Language::ES => "ambos", + Language::ES | Language::PT => "ambos", Language::PL => "oba", Language::DE => "beide", Language::UK => "обидва", Language::ZH => "皆需", Language::RO => "ambele", + Language::KO => "둘다", + Language::TR => "ikiside", + Language::RU => "оба", } } @@ -485,6 +637,7 @@ pub fn both_translation(language: Language) -> &'static str { // Language::ES => "Todos los protocolos", // Language::PL => "Wszystkie protokoły", // Language::DE => "Alle Protokolle", +// Language::RU => "Все протоколы", // } // } @@ -493,12 +646,15 @@ pub fn all_translation(language: Language) -> &'static str { Language::EN => "All", Language::IT => "Tutti", Language::FR => "Tous", - Language::ES => "Todos", + Language::ES | Language::PT => "Todos", Language::PL => "Wszystkie", Language::DE => "Alle", Language::UK => "Усі", Language::ZH => "所有", Language::RO => "Toate", + Language::KO => "모두", + Language::TR => "Hepsi", + Language::RU => "Всё", } } @@ -513,6 +669,10 @@ pub fn packets_chart_translation(language: Language) -> &'static str { Language::UK => "пакети на секунду", Language::ZH => "数据包", Language::RO => "pachete pe secundă", + Language::KO => "초당 패킷", + Language::TR => "saniye başı paket", + Language::RU => "пакектов в секунду", + Language::PT => "pacotes por segundo", } } @@ -521,12 +681,15 @@ pub fn bytes_chart_translation(language: Language) -> &'static str { Language::EN => "bytes per second", Language::IT => "byte al secondo", Language::FR => "octets par seconde", - Language::ES => "bytes por segundo", + Language::ES | Language::PT => "bytes por segundo", Language::PL => "bajty na sekundę", Language::DE => "bytes pro Sekunde", Language::UK => "байти на секунду", Language::ZH => "网络流量", Language::RO => "octeți pe secundă", + Language::KO => "초당 바이트", + Language::TR => "saniye başı bayt", + Language::RU => "байтов в секунду", } } @@ -541,6 +704,10 @@ pub fn recent_report_translation(language: Language) -> &'static str { Language::UK => "найновіші", Language::ZH => "按时间", Language::RO => "cea mai recentă", + Language::KO => "가장 최근", + Language::TR => "en son", + Language::RU => "новейшие", + Language::PT => "mais recente", } } @@ -555,6 +722,10 @@ pub fn packets_report_translation(language: Language) -> &'static str { Language::UK => "найбільше пакетів", Language::ZH => "按数据包", Language::RO => "cele mai multe pachete", + Language::KO => "대부분의 패킷", + Language::TR => "en çok paket", + Language::RU => "больше всего пакетов", + Language::PT => "mais pacotes", } } @@ -569,6 +740,10 @@ pub fn bytes_report_translation(language: Language) -> &'static str { Language::UK => "найбільше байтів", Language::ZH => "按流量", Language::RO => "cei mai mulți octeți", + Language::KO => "대부분의 바이트", + Language::TR => "en çok bayt", + Language::RU => "больше всего байт", + Language::PT => "mais bytes", } } @@ -577,12 +752,15 @@ pub fn favorite_report_translation(language: Language) -> &'static str { Language::EN => "favorites", Language::IT => "preferiti", Language::FR => "favoris", - Language::ES => "favoritos", + Language::ES | Language::PT => "favoritos", Language::PL => "ulubione", Language::DE => "Favoriten", Language::UK => "улюблені", Language::ZH => "收藏夹", Language::RO => "favorite", + Language::KO => "즐겨찾기", + Language::TR => "favoriler", + Language::RU => "избранное", } } @@ -597,6 +775,10 @@ pub fn notifications_title_translation(language: Language) -> Text<'static> { Language::UK => "Достосуй повідомлення", Language::ZH => "自定义通知", Language::RO => "Personalizați-vă notificările", + Language::KO => "사용자 지정 알림", + Language::TR => "Bildirimlerinizi özelleştirin", + Language::RU => "Настройка уведомлений", + Language::PT => "Personalize as suas notificações", }) } @@ -611,6 +793,10 @@ pub fn appearance_title_translation(language: Language) -> Text<'static> { Language::UK => "Вибери улюблену тему", Language::ZH => "选择您喜欢的主题", Language::RO => "Selectați tema preferată", + Language::KO => "태마를 선택하세요", + Language::TR => "Favori temanızı seçin", + Language::RU => "Выберите предпочительную тему", + Language::PT => "Escolha o seu tema favorito", }) } @@ -625,6 +811,10 @@ pub fn languages_title_translation(language: Language) -> Text<'static> { Language::UK => "Вибери мову", Language::ZH => "选择显示语言", Language::RO => "Selectați limba", + Language::KO => "언어를 선택하세요", + Language::TR => "Dilinizi seçin", + Language::RU => "Выберите язык", + Language::PT => "Selecione o seu idioma", }) } @@ -639,6 +829,10 @@ pub fn active_filters_translation(language: Language) -> &'static str { Language::UK => "Активні фільтри:", Language::ZH => "活动的过滤器:", Language::RO => "Filtre active:", + Language::KO => "활성화된 필터:", + Language::TR => "Aktif filtreler:", + Language::RU => "Выбранные фильтры:", + Language::PT => "Filtros ativos:", } } @@ -653,6 +847,10 @@ pub fn none_translation(language: Language) -> &'static str { Language::UK => "бракує", Language::ZH => "无", Language::RO => "niciunul", + Language::KO => "없음", + Language::TR => "hiç biri", + Language::RU => "не выбран", + Language::PT => "nenhum", } } @@ -667,6 +865,10 @@ pub fn yeti_night_translation(language: Language) -> &'static str { Language::UK => "Оригінальний, темний мотив Sniffnet", Language::ZH => "Sniffnet暗黑", Language::RO => "Tema întunecată originală Sniffnet", + Language::KO => "Sniffnet의 기본 다크테마", + Language::TR => "Sniffnet'in orjinal koyu teması", + Language::RU => "Оригинальная тёмная тема Sniffnet'а", + Language::PT => "Tema escuro original de Sniffnet", } } @@ -675,12 +877,15 @@ pub fn yeti_day_translation(language: Language) -> &'static str { Language::EN => "Sniffnet's original light theme", Language::IT => "Il tema chiaro originale di Sniffnet", Language::FR => "Thème original clair de Sniffnet", - Language::ES => "Tema claro original de Sniffnet", + Language::ES | Language::PT => "Tema claro original de Sniffnet", Language::PL => "Oryginalny, jasny motyw Sniffnet", Language::DE => "Sniffnets urspüngliches, helles Design", Language::UK => "Оригінальний, світлий мотив Sniffnet", Language::ZH => "Sniffnet浅色", Language::RO => "Tema deschisă originală Sniffnet", + Language::KO => "Sniffnet의 기본 라이트테마", + Language::TR => "Sniffnet'in orjinal açık teması", + Language::RU => "Оригинальная светая тема Sniffnet'а", } } @@ -695,6 +900,10 @@ pub fn deep_sea_translation(language: Language) -> &'static str { Language::UK => "Проаналізувати мережевий рух", Language::ZH => "潜入网络活动的海洋", Language::RO => "Pentru a vă scufunda în traficul de rețea", + Language::KO => "네트워크 트레픽으로 바로가기", + Language::TR => "Ağ trafiğine dalmak", + Language::RU => "Для погружения в сетевой трафик", + Language::PT => "Para mergulhar no tráfego de rede", } } @@ -709,6 +918,10 @@ pub fn mon_amour_translation(language: Language) -> &'static str { Language::UK => "Прекрасна тема для мрійників", Language::ZH => "梦想家的主题", Language::RO => "O temă minunată creată pentru visători", + Language::KO => "사랑스러운 몽환가들을 위한 테마", + Language::TR => "Hayal perestler için yapılmış güzel tema", + Language::RU => "Милая тема для мечтателей", + Language::PT => "Tema encantador feito para sonhadores", } } @@ -723,6 +936,10 @@ pub fn incoming_translation(language: Language) -> &'static str { Language::UK => "Вхідні", Language::ZH => "入站", Language::RO => "de intrare", + Language::KO => "수신중", + Language::TR => "Gelen", + Language::RU => "Входящий", + Language::PT => "Entrando", } } @@ -737,6 +954,10 @@ pub fn outgoing_translation(language: Language) -> &'static str { Language::UK => "Вихідні", Language::ZH => "出站", Language::RO => "de ieșire", + Language::KO => "발신중", + Language::TR => "Giden", + Language::RU => "Исходящий", + Language::PT => "Saindo", } } @@ -750,6 +971,10 @@ pub fn notifications_translation(language: Language) -> &'static str { Language::UK => "Повідомлення", Language::ZH => "通知", Language::RO => "Notificări", + Language::KO => "알림", + Language::TR => "Bildirimler", + Language::RU => "Уведомления", + Language::PT => "Notificações", } } @@ -757,11 +982,12 @@ pub fn style_translation(language: Language) -> &'static str { match language { Language::EN | Language::FR => "Style", Language::IT => "Stile", - Language::ES => "Estilo", + Language::ES | Language::PT => "Estilo", Language::PL => "Styl", - Language::DE | Language::RO => "Stil", - Language::UK => "Стиль", + Language::DE | Language::RO | Language::TR => "Stil", + Language::UK | Language::RU => "Стиль", Language::ZH => "主题", + Language::KO => "스타일", } } @@ -776,6 +1002,10 @@ pub fn language_translation(language: Language) -> &'static str { Language::UK => "Мова", Language::ZH => "语言", Language::RO => "Limbă", + Language::KO => "언어", + Language::TR => "Dil", + Language::RU => "Язык", + Language::PT => "Língua", } } @@ -790,6 +1020,10 @@ pub fn overview_translation(language: Language) -> &'static str { Language::UK => "Огляд", Language::ZH => "概览", Language::RO => "Prezentare generală", + Language::KO => "개요", + Language::TR => "Ön izleme", + Language::RU => "Обзор", + Language::PT => "Visão geral", } } @@ -804,6 +1038,10 @@ pub fn packets_threshold_translation(language: Language) -> &'static str { Language::UK => "Повідом мене про переліміт пакетів", Language::ZH => "超过设定的数据包数量阈值时通知我", Language::RO => "Anunță-mă când este depășit un prag de pachete", + Language::KO => "패킷 임계값을 초과하면 알림", + Language::TR => "Paket eşiği aşıldığında beni bilgilendir", + Language::RU => "Уведомить, когда порог по частоте пакетов превышен", + Language::PT => "Notifique-me quando um limite de pacotes for excedido", } } @@ -818,6 +1056,10 @@ pub fn bytes_threshold_translation(language: Language) -> &'static str { Language::UK => "Повідом мене про переліміт байтів", Language::ZH => "超过设定的网络流量阈值时通知我", Language::RO => "Anunță-mă când este depășit un prag de octeți", + Language::KO => "바이트 임계값을 초과하면 알림", + Language::TR => "Bayt eşiği aşıldığında beni bilgilendir", + Language::RU => "Уведомить, когда порог по полосе в байтах превышен", + Language::PT => "Notifique-me quando um limite de bytes for excedido", } } @@ -826,12 +1068,15 @@ pub fn per_second_translation(language: Language) -> &'static str { Language::EN => "(per second)", Language::IT => "(al secondo)", Language::FR => "(par seconde)", - Language::ES => "(por segundo)", + Language::ES | Language::PT => "(por segundo)", Language::PL => "(na sekundę)", Language::DE => "(pro Sekunde)", Language::UK => "(на секунду)", Language::ZH => "(每秒) ", Language::RO => "(pe secundă)", + Language::KO => "(초당)", + Language::TR => "(her saniye)", + Language::RU => "(в секунду)", } } @@ -846,6 +1091,10 @@ pub fn specify_multiples_translation(language: Language) -> &'static str { Language::UK => "; можеш також вибрати 'K', 'M' i 'G'", Language::ZH => "您可指定 'K', 'M', 'G'", Language::RO => "; puteți specifica 'K', 'M', 'G'", + Language::KO => "; 지정가능합니다 'K', 'M', 'G'", + Language::TR => "; şunları da kullanabilirsin 'K', 'M' ve 'G'", + Language::RU => "; Так же можно указать 'K', 'M' или 'G'", + Language::PT => "; também pode especificar 'K', 'M' e 'G'", } } @@ -862,6 +1111,10 @@ pub fn favorite_notification_translation(language: Language) -> &'static str { Language::UK => "Повідом мене, коли буде обмін даними з моїх улюблених", Language::ZH => "收藏夹内的连接有新活动时通知我", Language::RO => "Anunță-mă când sunt transferate date noi de la favoritele mele", + Language::KO => "즐겨찾기에서 새 데이터가 교환될 때 알림", + Language::TR => "Favorilerimde veri akışı olduğunda beni uyar", + Language::RU => "Уведомить, если произошёл обмен данными в соединениях из избранного", + Language::PT => "Notificar-me quando novos dados forem trocados dos meus favoritos", } } @@ -876,18 +1129,25 @@ pub fn threshold_translation(language: Language) -> String { Language::UK => "Ліміт: ".to_string(), Language::ZH => "阈值: ".to_string(), Language::RO => "Prag: ".to_string(), + Language::KO => "임계값: ".to_string(), + Language::TR => "Eşik: ".to_string(), + Language::RU => "Порог: ".to_string(), + Language::PT => "Limite: ".to_string(), } } pub fn volume_translation(language: Language, value: u8) -> String { match language { - Language::EN | Language::IT | Language::FR => format!("Volume: {value:^3}%"), + Language::EN | Language::IT | Language::FR | Language::PT => format!("Volume: {value:^3}%"), Language::ES => format!("Volumen: {value:^3}%"), Language::PL => format!("Głośność: {value:^3}%"), Language::DE => format!("Lautstärke: {value:^3}%"), Language::UK => format!("Гучність: {value:^3}%"), Language::ZH => format!("通知音量: {value:^3}%"), Language::RO => format!("Volum: {value:^3}%"), + Language::KO => format!("볼륨: {value:^3}%"), + Language::TR => format!("Ses: {value:^3}%"), + Language::RU => format!("Объём: {value:^3}%"), } } @@ -899,9 +1159,12 @@ pub fn sound_translation(language: Language) -> &'static str { Language::ES => "Sonido:", Language::PL => "Dźwięk:", Language::DE => "Ton:", - Language::UK => "Звук:", + Language::UK | Language::RU => "Звук:", Language::ZH => "通知音:", Language::RO => "Sunet:", + Language::KO => "사운드:", + Language::TR => "Ses:", + Language::PT => "Som:", } } @@ -916,6 +1179,10 @@ pub fn open_report_translation(language: Language) -> &'static str { Language::UK => "Відкрий повний рапорт", Language::ZH => "打开完整报告", Language::RO => "Deschideți raport complet", + Language::KO => "전체 보고서 열기", + Language::TR => "Tam raporu aç", + Language::RU => "Открыть полный отчёт", + Language::PT => "Abrir relatório completo", } } @@ -930,6 +1197,10 @@ pub fn bytes_exceeded_translation(language: Language) -> &'static str { Language::UK => "Ліміт байтів перевищено!", Language::ZH => "达到设定的网络流量阈值!", Language::RO => "Prag de octeți depășit!", + Language::KO => "바이트 임계값 초과!", + Language::TR => "Bayt eşik değeri aşıldı!", + Language::RU => "Порог в байтах превышен!", + Language::PT => "Limite de bytes excedido!", } } @@ -945,6 +1216,10 @@ pub fn bytes_exceeded_value_translation(language: Language, value: &str) -> Stri Language::UK => format!("{trimmed_value} байтів було обміняно"), Language::ZH => format!("已交换字节 {trimmed_value}"), Language::RO => format!("au fost transferați {trimmed_value} octeți"), + Language::KO => format!("바이트 {trimmed_value} 가 교환되었습니다"), + Language::TR => format!("{trimmed_value} bayt aktarıldı"), + Language::RU => format!("{trimmed_value} байт обмена информацией"), + Language::PT => format!("Foram trocados {trimmed_value} bytes"), } } @@ -959,13 +1234,23 @@ pub fn packets_exceeded_translation(language: Language) -> &'static str { Language::UK => "Ліміт пакетів перевищено!", Language::ZH => "达到设定的数据包数量阈值!", Language::RO => "Prag de pachete depășit!", + Language::KO => "패킷 임계값 초과!", + Language::TR => "Paket eşik değeri aşıldı!", + Language::RU => "Порог по числу пакетов превышен!", + Language::PT => "Limite de pacotes excedido!", } } pub fn packets_exceeded_value_translation(language: Language, value: u32) -> String { match language { - Language::EN => format!("{value} packets have been exchanged"), - Language::IT => format!("{value} pacchetti sono stati scambiati"), + Language::EN => match value { + 1 => "1 packet has been exchanged".to_owned(), + npackets => format!("{npackets} packets have been exchanged"), + }, + Language::IT => match value { + 1 => "1 pacchetto è stato scambiato".to_owned(), + npackets => format!("{npackets} pacchetti sono stati scambiati"), + }, Language::FR => match value { 1 => "1 paquet a été échangé".to_owned(), npackets => format!("{npackets} paquets ont été échangés"), @@ -976,6 +1261,13 @@ pub fn packets_exceeded_value_translation(language: Language, value: u32) -> Str Language::UK => format!("Обміняно {value} пакетів"), Language::ZH => format!("已交换数据包 {value}"), Language::RO => format!("au fost transferate {value} pachete"), + Language::KO => format!("패킷 {value} 가 교환되었습니다"), + Language::TR => format!("{value} paket aktarıldı"), + Language::RU => format!("{value} пакет(ов) обмена информацией"), + Language::PT => match value { + 1 => "Foi trocado 1 pacote".to_owned(), + npackets => format!("Foram trocados {npackets} pacotes"), + }, } } @@ -990,6 +1282,10 @@ pub fn favorite_transmitted_translation(language: Language) -> &'static str { Language::UK => "Нові дані обміняно з улюблених!", Language::ZH => "收藏夹内的连接有新活动!", Language::RO => "Date noi transferate de la favorite!", + Language::KO => "즐겨찾기에서 새 데이터 교환", + Language::TR => "Favorilerden yeni veri aktarıldı!", + Language::RU => "Новый обмен данными в избранных соедиениях!", + Language::PT => "Novos dados trocados dos favoritos!", } } @@ -1022,6 +1318,18 @@ pub fn no_notifications_set_translation(language: Language) -> Text<'static> { Language::RO => "Încă nu ați activat notificările!\n\n\ După ce le veți activa, această pagină va afișa un jurnal al notificărilor dvs\n\n\ Puteți activa notificările din setări:", + Language::KO => "아직 알림을 활성화하지 않았습니다!\n\n\ + 활성화로 설정하면 이 페이지에 알림 로그가 표시됩니다\n\n\ + 설정에서 알림을 활성화할 수 있습니다:", + Language::TR => "Henüz bildirimleri etkinleştirmedin!\n\n\ + Etkinleştirdikten sonra bu sayfada bildirimlerine ait kütüğü görebilirsin\n\n\ + Bildirimleri, ayarlardan etkinleştirebilirsin:", + Language::RU => "Уведомления пока не настроены!\n\n\ + После настройки, эта страница будет показывать журнал уведомлений\n\n\ + Вы можете включить уведомления в настройках:", + Language::PT => "Ainda não ativou as notificações!\n\n\ + Depois de ativá-las, esta página irá mostrar um registo das suas notificações\n\n\ + Pode ativar as notificações nas definições:", }) } @@ -1063,6 +1371,22 @@ pub fn no_notifications_received_translation(language: Language) -> Text<'static "Nimic de văzut momentan...\n\n\ Când veți primi o notificare, aceasta va fi afișată aici" } + Language::KO => { + "현재는 볼 것이 없습니다...\n\n\ + 알림을 받으면 여기에 표시됩니다" + } + Language::TR => { + "Şu an görecek bir şey yok...\n\n\ + Bildirim aldığınız zaman burada gözükecektir" + } + Language::RU => { + "Нечего показывать в текущий момент...\n\n\ + Когда прийдут уведомления, они будут показаны тут" + } + Language::PT => { + "Nada para ver neste momento...\n\n\ + Quando receber uma notificação, ela será mostrada aqui" + } }) } @@ -1077,5 +1401,9 @@ pub fn only_last_30_translation(language: Language) -> &'static str { Language::UK => "Можеш побачити лише 30 останніх повідомлень", Language::ZH => "仅显示最近 30 条通知", Language::RO => "Sunt afișate doar ultimele 30 de notificări", + Language::KO => "최근 30개의 알림만 표시됩니다", + Language::TR => "Sadece son 30 bildirim gösterilmektedir", + Language::RU => "Тут показываются только последние 30 уведомлений", + Language::PT => "São mostradas apenas as últimas 30 notificações", } } diff --git a/src/translations/translations_2.rs b/src/translations/translations_2.rs index 1136a80f..6d18f08e 100644 --- a/src/translations/translations_2.rs +++ b/src/translations/translations_2.rs @@ -5,6 +5,7 @@ pub fn new_version_available_translation(language: Language) -> &'static str { match language { Language::EN => "A newer version is available on GitHub", Language::IT => "Una versione più recente è disponibile su GitHub", + Language::RU => "Новая версия доступна на GitHub", _ => "A newer version is available on GitHub", } } @@ -17,6 +18,7 @@ pub fn inspect_translation(language: Language) -> &'static str { Language::ES => "Inspeccionar", Language::PL => "Sprawdź", Language::DE => "Überprüfen", + Language::RU => "Инспектировать", _ => "Inspect", } } diff --git a/src/translations/types/language.rs b/src/translations/types/language.rs index 931fd7d4..692fa63a 100644 --- a/src/translations/types/language.rs +++ b/src/translations/types/language.rs @@ -21,6 +21,14 @@ pub enum Language { ZH, /// Romanian RO, + /// Korean + KO, + /// Portuguese + PT, + /// Turkish + TR, + /// Russian + RU, } impl Default for Language { @@ -32,12 +40,14 @@ impl Default for Language { impl Language { pub(crate) const COL1: [Language; 5] = [ Language::EN, - Language::ES, - Language::IT, - Language::RO, + Language::FR, + Language::PL, + Language::RU, Language::ZH, ]; - pub(crate) const COL2: [Language; 4] = [Language::DE, Language::FR, Language::PL, Language::UK]; + pub(crate) const COL2: [Language; 4] = [Language::DE, Language::IT, Language::PT, Language::TR]; + pub(crate) const COL3: [Language; 4] = [Language::ES, Language::KO, Language::RO, Language::UK]; + pub fn get_radio_label(&self) -> &str { match self { Language::EN => "English", @@ -49,6 +59,10 @@ impl Language { Language::UK => "Українська", Language::ZH => "简体中文", Language::RO => "Română", + Language::KO => "한국인", + Language::TR => "Türkçe", + Language::RU => "Русский", + Language::PT => "Português", } } } diff --git a/src/utils/countries.rs b/src/utils/countries.rs index dcc207f2..0f4f395f 100644 --- a/src/utils/countries.rs +++ b/src/utils/countries.rs @@ -513,8 +513,12 @@ pub fn get_flag_from_language_code(language: &str) -> Image { "FR" => FR, "EN" => GB, "IT" => IT, + "KO" => KR, "PL" => PL, + "PT" => PT, "RO" => RO, + "RU" => RU, + "TR" => TR, "UK" => UA, _ => UNKNOWN, })))