From ecfb3ec2c359829b833595873c8b4647a83c465f Mon Sep 17 00:00:00 2001 From: Limdongju <69478178+DocRAID@users.noreply.github.com> Date: Tue, 11 Apr 2023 17:10:39 +0900 Subject: [PATCH 01/31] Add Korean translation --- src/translations/translations.rs | 105 ++++++++++++++++++++++++++++--- 1 file changed, 96 insertions(+), 9 deletions(-) diff --git a/src/translations/translations.rs b/src/translations/translations.rs index 24b68f95..0fdd0170 100644 --- a/src/translations/translations.rs +++ b/src/translations/translations.rs @@ -13,6 +13,7 @@ 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 => "검사할 네트워크 어댑터 선택", }) } @@ -27,6 +28,8 @@ pub fn application_protocol_translation(language: Language) -> &'static str { Language::UK => "Протокол аплікації", Language::ZH => "目标应用层协议", Language::RO => "Protocol aplicație", + Language::KO => "어플리케이션 프로토콜", + } } @@ -41,12 +44,13 @@ 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 => "네트워크 트레픽에 적용할 필터 선택", }) } 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!", @@ -66,6 +70,7 @@ pub fn address_translation(language: Language) -> &'static str { Language::UK => "\nАдреса:", Language::ZH => "\n网络地址:", Language::RO => "\nAdresă:", + Language::KO => "\n주소:", } } @@ -80,6 +85,7 @@ pub fn addresses_translation(language: Language) -> &'static str { Language::UK => "\nАдреси:", Language::ZH => "\n网络地址:", Language::RO => "\nAdrese:", + Language::KO => "\n주소:", } } @@ -94,6 +100,7 @@ pub fn ip_version_translation(language: Language) -> Text<'static> { Language::UK => "Версія IP", Language::ZH => "目标IP协议版本", Language::RO => "Versiune IP", + Language::KO => "IP 버전", }) } @@ -108,6 +115,7 @@ pub fn transport_protocol_translation(language: Language) -> &'static str { Language::UK => "Транспортний протокол", Language::ZH => "目标传输协议", Language::RO => "Protocol de transport", + Language::KO => "전송 프로토콜", } } @@ -122,6 +130,7 @@ pub fn traffic_rate_translation(language: Language) -> Text<'static> { Language::UK => "Швидкість руху:", Language::ZH => "网络速率图:", Language::RO => "Rata de trafic:", + Language::KO => "트레픽 속도:", }) } @@ -136,6 +145,7 @@ pub fn relevant_connections_translation(language: Language) -> Text<'static> { Language::UK => "Важливі підключення:", Language::ZH => "连接详情:", Language::RO => "Conexiuni relevante:", + Language::KO => "관련 연결", }) } @@ -150,6 +160,7 @@ pub fn settings_translation(language: Language) -> &'static str { Language::UK => "Налаштування", Language::ZH => "设置", Language::RO => "Setări", + Language::KO => "설정", } } @@ -164,6 +175,7 @@ pub fn yes_translation(language: Language) -> Text<'static> { Language::UK => "Так", Language::ZH => "是", Language::RO => "Da", + Language::KO => "네", }) } @@ -178,6 +190,7 @@ 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 => "정말로 분석을 종료하겠습니까?", }) } @@ -192,6 +205,7 @@ 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(), } } @@ -206,6 +220,7 @@ 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 => "알림을 삭제하시겠습니까?", }) } @@ -220,6 +235,7 @@ 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(), } } @@ -234,6 +250,7 @@ pub fn hide_translation(language: Language) -> &'static str { Language::UK => "Заховати", Language::ZH => "隐藏", Language::RO => "Ascundeți", + Language::KO => "숨기기", } } @@ -266,6 +283,9 @@ 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\ + 인터넷이 연결되어있다면 다른 어댑터로 시도해보세요."), }) } @@ -297,7 +317,10 @@ 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\ + 인터넷에 연결되어 있고 올바른 어댑터를 선택하셨습니까?"), }) } @@ -333,7 +356,13 @@ 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::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}"), + Language::KO => format!("감지한 총 패킷: {observed}\n\n\ + 필터링된 패킷: 0\n\n\ + 일부 패킷이 감지되었지만, 지정한 필터에 따라 선택되지 않았습니다...\n\n{filters}"), }) } @@ -354,10 +383,13 @@ pub fn filtered_packets_translation( } Language::ZH => { format!("目标数据包计数:\n {filtered} (占所有数据包的 {percentage})") - } + }, Language::RO => { format!("Pachete filtrate:\n {filtered} ({percentage} din total)") - } + }, + Language::KO => { + format!("필터링된 패킷:\n {filtered} ({percentage} 의 일부)") + }, }) } @@ -375,13 +407,16 @@ pub fn filtered_bytes_translation( Language::DE => format!("Gefilterte Bytes:\n {filtered} ({percentage} der Gesamtzahl)"), Language::UK => { format!("Відфільтровані байти:\n {filtered} ({percentage} від загальної суми)") - } + }, Language::ZH => { 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} 의 일부)") + }, }) } @@ -396,6 +431,7 @@ pub fn filtered_application_translation(language: Language) -> Text<'static> { Language::UK => "Відфільтровані пакети протоколу аплікації/програми:", Language::ZH => "按应用层协议分类的目标数据包计数:", Language::RO => "Pachete filtrate pe protocol de aplicație:", + Language::KO => "애플리케이션 프로토콜당 필터링된 패킷 수:", }) } @@ -419,6 +455,8 @@ 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\ + 즐겨찾기에 연결을 추가하려면 별을 눌러주세요.", }) } @@ -460,6 +498,10 @@ pub fn error_translation(language: Language, error: &str) -> Text<'static> { "A apărut o eroare! \n\n\ {error}" ), + Language::KO => format!( + "오류가 발생하였습니다! \n\n\ + {error}" + ), }) } @@ -474,6 +516,7 @@ pub fn both_translation(language: Language) -> &'static str { Language::UK => "обидва", Language::ZH => "皆需", Language::RO => "ambele", + Language::KO => "둘다", } } @@ -499,6 +542,7 @@ pub fn all_translation(language: Language) -> &'static str { Language::UK => "Усі", Language::ZH => "所有", Language::RO => "Toate", + Language::KO => "모두", } } @@ -513,6 +557,7 @@ pub fn packets_chart_translation(language: Language) -> &'static str { Language::UK => "пакети на секунду", Language::ZH => "数据包", Language::RO => "pachete pe secundă", + Language::KO => "초당 패킷", } } @@ -527,6 +572,7 @@ pub fn bytes_chart_translation(language: Language) -> &'static str { Language::UK => "байти на секунду", Language::ZH => "网络流量", Language::RO => "octeți pe secundă", + Language::KO => "초당 바이트", } } @@ -541,6 +587,7 @@ pub fn recent_report_translation(language: Language) -> &'static str { Language::UK => "найновіші", Language::ZH => "按时间", Language::RO => "cea mai recentă", + Language::KO => "가장 최근", } } @@ -555,6 +602,7 @@ pub fn packets_report_translation(language: Language) -> &'static str { Language::UK => "найбільше пакетів", Language::ZH => "按数据包", Language::RO => "cele mai multe pachete", + Language::KO => "대부분의 패킷", } } @@ -569,6 +617,7 @@ pub fn bytes_report_translation(language: Language) -> &'static str { Language::UK => "найбільше байтів", Language::ZH => "按流量", Language::RO => "cei mai mulți octeți", + Language::KO => "대부분의 바이트", } } @@ -583,6 +632,7 @@ pub fn favorite_report_translation(language: Language) -> &'static str { Language::UK => "улюблені", Language::ZH => "收藏夹", Language::RO => "favorite", + Language::KO => "즐겨찾기", } } @@ -597,6 +647,7 @@ pub fn notifications_title_translation(language: Language) -> Text<'static> { Language::UK => "Достосуй повідомлення", Language::ZH => "自定义通知", Language::RO => "Personalizați-vă notificările", + Language::KO => "사용자 지정 알림", }) } @@ -611,6 +662,7 @@ pub fn appearance_title_translation(language: Language) -> Text<'static> { Language::UK => "Вибери улюблену тему", Language::ZH => "选择您喜欢的主题", Language::RO => "Selectați tema preferată", + Language::KO => "태마를 선택하세요", }) } @@ -625,6 +677,7 @@ pub fn languages_title_translation(language: Language) -> Text<'static> { Language::UK => "Вибери мову", Language::ZH => "选择显示语言", Language::RO => "Selectați limba", + Language::KO => "언어를 선택하세요", }) } @@ -639,6 +692,7 @@ pub fn active_filters_translation(language: Language) -> &'static str { Language::UK => "Активні фільтри:", Language::ZH => "活动的过滤器:", Language::RO => "Filtre active:", + Language::KO => "활성화된 필터:", } } @@ -653,6 +707,7 @@ pub fn none_translation(language: Language) -> &'static str { Language::UK => "бракує", Language::ZH => "无", Language::RO => "niciunul", + Language::KO => "없음", } } @@ -667,6 +722,7 @@ pub fn yeti_night_translation(language: Language) -> &'static str { Language::UK => "Оригінальний, темний мотив Sniffnet", Language::ZH => "Sniffnet暗黑", Language::RO => "Tema întunecată originală Sniffnet", + Language::KO => "Sniffnet의 기본 다크테마", } } @@ -681,6 +737,7 @@ pub fn yeti_day_translation(language: Language) -> &'static str { Language::UK => "Оригінальний, світлий мотив Sniffnet", Language::ZH => "Sniffnet浅色", Language::RO => "Tema deschisă originală Sniffnet", + Language::KO => "Sniffnet의 기본 라이트테마", } } @@ -695,6 +752,7 @@ 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 => "네트워크 트레픽으로 바로가기", } } @@ -709,6 +767,7 @@ pub fn mon_amour_translation(language: Language) -> &'static str { Language::UK => "Прекрасна тема для мрійників", Language::ZH => "梦想家的主题", Language::RO => "O temă minunată creată pentru visători", + Language::KO => "사랑스러운 몽환가들을 위한 테마", } } @@ -723,6 +782,7 @@ pub fn incoming_translation(language: Language) -> &'static str { Language::UK => "Вхідні", Language::ZH => "入站", Language::RO => "de intrare", + Language::KO => "수신중", } } @@ -737,6 +797,7 @@ pub fn outgoing_translation(language: Language) -> &'static str { Language::UK => "Вихідні", Language::ZH => "出站", Language::RO => "de ieșire", + Language::KO => "발신중", } } @@ -750,6 +811,7 @@ pub fn notifications_translation(language: Language) -> &'static str { Language::UK => "Повідомлення", Language::ZH => "通知", Language::RO => "Notificări", + Language::KO => "알림", } } @@ -762,6 +824,7 @@ pub fn style_translation(language: Language) -> &'static str { Language::DE | Language::RO => "Stil", Language::UK => "Стиль", Language::ZH => "主题", + Language::KO => "스타일", } } @@ -776,6 +839,7 @@ pub fn language_translation(language: Language) -> &'static str { Language::UK => "Мова", Language::ZH => "语言", Language::RO => "Limbă", + Language::KO => "언어", } } @@ -790,6 +854,7 @@ pub fn overview_translation(language: Language) -> &'static str { Language::UK => "Огляд", Language::ZH => "概览", Language::RO => "Prezentare generală", + Language::KO => "개요", } } @@ -815,6 +880,7 @@ 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 => "패킷 임계값을 초과하면 알림", } } @@ -829,6 +895,7 @@ 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 => "바이트 임계값을 초과하면 알림", } } @@ -843,6 +910,7 @@ pub fn per_second_translation(language: Language) -> &'static str { Language::UK => "(на секунду)", Language::ZH => "(每秒) ", Language::RO => "(pe secundă)", + Language::KO => "(초당)", } } @@ -857,6 +925,7 @@ 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'", } } @@ -873,6 +942,7 @@ 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 => "즐겨찾기에서 새 데이터가 교환될 때 알림", } } @@ -887,6 +957,7 @@ pub fn threshold_translation(language: Language) -> String { Language::UK => "Ліміт: ".to_string(), Language::ZH => "阈值: ".to_string(), Language::RO => "Prag: ".to_string(), + Language::KO => "임계값: ".to_string(), } } @@ -899,6 +970,7 @@ pub fn volume_translation(language: Language, value: u8) -> String { Language::UK => format!("Гучність: {value:^3}%"), Language::ZH => format!("通知音量: {value:^3}%"), Language::RO => format!("Volum: {value:^3}%"), + Language::KO => format!("볼륨: {value:^3}%"), } } @@ -913,6 +985,7 @@ pub fn sound_translation(language: Language) -> &'static str { Language::UK => "Звук:", Language::ZH => "通知音:", Language::RO => "Sunet:", + Language::KO => "사운드:", } } @@ -927,6 +1000,7 @@ pub fn open_report_translation(language: Language) -> &'static str { Language::UK => "Відкрий повний рапорт", Language::ZH => "打开完整报告", Language::RO => "Deschideți raport complet", + Language::KO => "전체 보고서 열기", } } @@ -941,6 +1015,7 @@ pub fn bytes_exceeded_translation(language: Language) -> &'static str { Language::UK => "Ліміт байтів перевищено!", Language::ZH => "达到设定的网络流量阈值!", Language::RO => "Prag de octeți depășit!", + Language::KO => "바이트 임계값 초과!", } } @@ -956,6 +1031,7 @@ 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} 가 교환되었습니다"), } } @@ -970,6 +1046,7 @@ pub fn packets_exceeded_translation(language: Language) -> &'static str { Language::UK => "Ліміт пакетів перевищено!", Language::ZH => "达到设定的数据包数量阈值!", Language::RO => "Prag de pachete depășit!", + Language::KO => "패킷 임계값 초과!", } } @@ -987,6 +1064,7 @@ 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!("패킷 {trimmed_value} 가 교환되었습니다"), } } @@ -1001,6 +1079,7 @@ pub fn favorite_transmitted_translation(language: Language) -> &'static str { Language::UK => "Нові дані обміняно з улюблених!", Language::ZH => "收藏夹内的连接有新活动!", Language::RO => "Date noi transferate de la favorite!", + Language::KO => "즐겨찾기에서 새 데이터 교환", } } @@ -1033,6 +1112,9 @@ 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\ + You can enable notifications from settings:", }) } @@ -1074,6 +1156,10 @@ 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\ + 알림을 받으면 여기에 표시됩니다" + } }) } @@ -1088,5 +1174,6 @@ 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개의 알림만 표시됩니다", } } From 63c2e02345296df29ae3dc321a07552b05a7df92 Mon Sep 17 00:00:00 2001 From: Limdongju <69478178+DocRAID@users.noreply.github.com> Date: Tue, 11 Apr 2023 17:18:55 +0900 Subject: [PATCH 02/31] Add Korean translation fix --- src/translations/translations.rs | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/translations/translations.rs b/src/translations/translations.rs index 0fdd0170..9655b5a0 100644 --- a/src/translations/translations.rs +++ b/src/translations/translations.rs @@ -357,9 +357,6 @@ pub fn some_observed_translation( 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}"), - 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}"), Language::KO => format!("감지한 총 패킷: {observed}\n\n\ 필터링된 패킷: 0\n\n\ 일부 패킷이 감지되었지만, 지정한 필터에 따라 선택되지 않았습니다...\n\n{filters}"), From e1e9ee30051eee21be5409b4ff328e3f9a713267 Mon Sep 17 00:00:00 2001 From: Giuliano Bellini s294739 Date: Tue, 11 Apr 2023 11:14:00 +0200 Subject: [PATCH 03/31] added korean characters and language --- resources/fonts/full/subset_characters.txt | 180 +++++++++++++++++- .../subset/sarasa-mono-sc-bold.subset.ttf | Bin 81392 -> 103968 bytes .../subset/sarasa-mono-sc-regular.subset.ttf | Bin 82124 -> 105240 bytes src/translations/translations.rs | 19 +- src/translations/types/language.rs | 12 +- src/utils/countries.rs | 1 + 6 files changed, 200 insertions(+), 12 deletions(-) diff --git a/resources/fonts/full/subset_characters.txt b/resources/fonts/full/subset_characters.txt index 07489096..f5f9d9e5 100644 --- a/resources/fonts/full/subset_characters.txt +++ b/resources/fonts/full/subset_characters.txt @@ -178,7 +178,6 @@ z є і ї -⌘ ⏎ ❤ 一 @@ -370,4 +369,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 73cbe7e9741803aebf694a2d5c36bbf2e116a4c4..8639d77f571ce4ddba9827e918ff6769d3341f46 100644 GIT binary patch delta 27278 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 EU#u(d@Bjb+ diff --git a/resources/fonts/subset/sarasa-mono-sc-regular.subset.ttf b/resources/fonts/subset/sarasa-mono-sc-regular.subset.ttf index d77b6efa2f9d2247cb59034ac2c693572ae7ae21..41ffdf80da5d730ecba713b29d62c2eb8379a95e 100644 GIT binary patch delta 27733 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 delta 4738 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 &'static str { Language::ZH => "目标应用层协议", Language::RO => "Protocol aplicație", Language::KO => "어플리케이션 프로토콜", - } } @@ -145,7 +144,7 @@ pub fn relevant_connections_translation(language: Language) -> Text<'static> { Language::UK => "Важливі підключення:", Language::ZH => "连接详情:", Language::RO => "Conexiuni relevante:", - Language::KO => "관련 연결", + Language::KO => "관련 연결:", }) } @@ -380,13 +379,13 @@ pub fn filtered_packets_translation( } Language::ZH => { format!("目标数据包计数:\n {filtered} (占所有数据包的 {percentage})") - }, + } Language::RO => { format!("Pachete filtrate:\n {filtered} ({percentage} din total)") - }, + } Language::KO => { format!("필터링된 패킷:\n {filtered} ({percentage} 의 일부)") - }, + } }) } @@ -404,16 +403,16 @@ pub fn filtered_bytes_translation( Language::DE => format!("Gefilterte Bytes:\n {filtered} ({percentage} der Gesamtzahl)"), Language::UK => { format!("Відфільтровані байти:\n {filtered} ({percentage} від загальної суми)") - }, + } Language::ZH => { format!("目标网络流量计数:\n {filtered} (占所有网络流量的 {percentage})") - }, + } Language::RO => { format!("Octeți filtrați:\n {filtered} ({percentage} din total)") - }, + } Language::KO => { format!("필터링된 바이트:\n {filtered} ({percentage} 의 일부)") - }, + } }) } @@ -1061,7 +1060,7 @@ 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!("패킷 {trimmed_value} 가 교환되었습니다"), + Language::KO => format!("패킷 {value} 가 교환되었습니다"), } } diff --git a/src/translations/types/language.rs b/src/translations/types/language.rs index 931fd7d4..e3636ff3 100644 --- a/src/translations/types/language.rs +++ b/src/translations/types/language.rs @@ -21,6 +21,8 @@ pub enum Language { ZH, /// Romanian RO, + /// Korean + KO, } impl Default for Language { @@ -37,7 +39,14 @@ impl Language { Language::RO, Language::ZH, ]; - pub(crate) const COL2: [Language; 4] = [Language::DE, Language::FR, Language::PL, Language::UK]; + pub(crate) const COL2: [Language; 5] = [ + Language::DE, + Language::FR, + Language::KO, + Language::PL, + Language::UK, + ]; + pub fn get_radio_label(&self) -> &str { match self { Language::EN => "English", @@ -49,6 +58,7 @@ impl Language { Language::UK => "Українська", Language::ZH => "简体中文", Language::RO => "Română", + Language::KO => "한국인", } } } diff --git a/src/utils/countries.rs b/src/utils/countries.rs index dcc207f2..65e27c72 100644 --- a/src/utils/countries.rs +++ b/src/utils/countries.rs @@ -513,6 +513,7 @@ pub fn get_flag_from_language_code(language: &str) -> Image { "FR" => FR, "EN" => GB, "IT" => IT, + "KO" => KR, "PL" => PL, "RO" => RO, "UK" => UA, From df365a3dcbaf43013cf57f825a9193ab22e567a3 Mon Sep 17 00:00:00 2001 From: Giuliano Bellini s294739 Date: Tue, 11 Apr 2023 11:25:55 +0200 Subject: [PATCH 04/31] fix: language radios order in settings --- src/translations/types/language.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/translations/types/language.rs b/src/translations/types/language.rs index e3636ff3..bb80aadb 100644 --- a/src/translations/types/language.rs +++ b/src/translations/types/language.rs @@ -36,15 +36,15 @@ impl Language { Language::EN, Language::ES, Language::IT, - Language::RO, - Language::ZH, + Language::PL, + Language::UK, ]; pub(crate) const COL2: [Language; 5] = [ Language::DE, Language::FR, Language::KO, - Language::PL, - Language::UK, + Language::RO, + Language::ZH, ]; pub fn get_radio_label(&self) -> &str { From dc5c1b02eaecd90c711d58642f0d329e352de401 Mon Sep 17 00:00:00 2001 From: Limdongju <69478178+DocRAID@users.noreply.github.com> Date: Wed, 12 Apr 2023 09:12:29 +0900 Subject: [PATCH 05/31] update --- src/translations/translations.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/translations/translations.rs b/src/translations/translations.rs index c0daba8b..e48218cb 100644 --- a/src/translations/translations.rs +++ b/src/translations/translations.rs @@ -1110,7 +1110,7 @@ pub fn no_notifications_set_translation(language: Language) -> Text<'static> { Puteți activa notificările din setări:", Language::KO => "아직 알림을 활성화하지 않았습니다!\n\n\ 활성화로 설정하면 이 페이지에 알림 로그가 표시됩니다\n\n\ - You can enable notifications from settings:", + 설정에서 알림을 활성화할 수 있습니다:", }) } From f77beecf14e945c2a65e2169ee38e172f23c6658 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 12 Apr 2023 04:12:47 +0000 Subject: [PATCH 06/31] Bump serde from 1.0.159 to 1.0.160 Bumps [serde](https://github.com/serde-rs/serde) from 1.0.159 to 1.0.160. - [Release notes](https://github.com/serde-rs/serde/releases) - [Commits](https://github.com/serde-rs/serde/compare/v1.0.159...v1.0.160) --- updated-dependencies: - dependency-name: serde dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 8 ++++---- Cargo.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 239566fd..189c8e37 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3034,18 +3034,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", diff --git a/Cargo.toml b/Cargo.toml index 9f780948..3210e47a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -37,7 +37,7 @@ iced_lazy = "0.5.0" plotters-iced = "0.7.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"] } From d383aa89ae08b802f43b0b1fa6d7c63e2971ec65 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 12 Apr 2023 08:20:04 +0200 Subject: [PATCH 07/31] docs: add DocRAID as a contributor for translation (#131) * docs: update CONTRIBUTORS.md [skip ci] * docs: update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ CONTRIBUTORS.md | 23 +++++++++++++---------- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index ca6ce1c4..d205276a 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -97,6 +97,15 @@ "contributions": [ "translation" ] + }, + { + "login": "DocRAID", + "name": "Limdongju", + "avatar_url": "https://avatars.githubusercontent.com/u/69478178?v=4", + "profile": "https://github.com/DocRAID", + "contributions": [ + "translation" + ] } ], "contributorsPerLine": 7, diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 9c84e169..557f1add 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -6,16 +6,19 @@ 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

🌍
From 39349bf861179d29ba32d1b846c70d3510a02172 Mon Sep 17 00:00:00 2001 From: Francisco Salgueiro Date: Wed, 12 Apr 2023 19:21:18 +0100 Subject: [PATCH 08/31] add portuguese translation --- src/translations/translations.rs | 91 +++++++++++++++++++++++++++++- src/translations/types/language.rs | 3 + 2 files changed, 92 insertions(+), 2 deletions(-) diff --git a/src/translations/translations.rs b/src/translations/translations.rs index e48218cb..819dda2c 100644 --- a/src/translations/translations.rs +++ b/src/translations/translations.rs @@ -14,6 +14,7 @@ pub fn choose_adapters_translation(language: Language) -> Text<'static> { Language::ZH => "选择需要监控的网络适配器", Language::RO => "Selectați adaptor de rețea pentru a inspecta", Language::KO => "검사할 네트워크 어댑터 선택", + Language::PT => "Selecione o adaptador de rede para inspecionar", }) } @@ -29,6 +30,7 @@ pub fn application_protocol_translation(language: Language) -> &'static str { Language::ZH => "目标应用层协议", Language::RO => "Protocol aplicație", Language::KO => "어플리케이션 프로토콜", + Language::PT => "Protocolo de aplicação", } } @@ -44,6 +46,7 @@ pub fn select_filters_translation(language: Language) -> Text<'static> { Language::ZH => "选择需要监控的目标", Language::RO => "Selectați filtre pentru traficul de rețea", Language::KO => "네트워크 트레픽에 적용할 필터 선택", + Language::PT => "Selecione os filtros a serem aplicados no tráfego de rede", }) } @@ -56,6 +59,7 @@ pub fn start_translation(language: Language) -> &'static str { Language::PL => "Rozpocznij!", Language::UK => "Почати!", Language::ZH => "开始!", + Language::PT => "Começar!", } } @@ -70,6 +74,7 @@ pub fn address_translation(language: Language) -> &'static str { Language::ZH => "\n网络地址:", Language::RO => "\nAdresă:", Language::KO => "\n주소:", + Language::PT => "\nEndereço:", } } @@ -85,6 +90,7 @@ pub fn addresses_translation(language: Language) -> &'static str { Language::ZH => "\n网络地址:", Language::RO => "\nAdrese:", Language::KO => "\n주소:", + Language::PT => "\nEndereços:", } } @@ -100,6 +106,7 @@ pub fn ip_version_translation(language: Language) -> Text<'static> { Language::ZH => "目标IP协议版本", Language::RO => "Versiune IP", Language::KO => "IP 버전", + Language::PT => "Versão IP", }) } @@ -115,6 +122,7 @@ pub fn transport_protocol_translation(language: Language) -> &'static str { Language::ZH => "目标传输协议", Language::RO => "Protocol de transport", Language::KO => "전송 프로토콜", + Language::PT => "Protocolo de transporte", } } @@ -130,6 +138,7 @@ pub fn traffic_rate_translation(language: Language) -> Text<'static> { Language::ZH => "网络速率图:", Language::RO => "Rata de trafic:", Language::KO => "트레픽 속도:", + Language::PT => "Taxa de tráfego:", }) } @@ -145,6 +154,7 @@ pub fn relevant_connections_translation(language: Language) -> Text<'static> { Language::ZH => "连接详情:", Language::RO => "Conexiuni relevante:", Language::KO => "관련 연결:", + Language::PT => "Conexões relevantes:", }) } @@ -160,6 +170,7 @@ pub fn settings_translation(language: Language) -> &'static str { Language::ZH => "设置", Language::RO => "Setări", Language::KO => "설정", + Language::PT => "Configurações", } } @@ -175,6 +186,7 @@ pub fn yes_translation(language: Language) -> Text<'static> { Language::ZH => "是", Language::RO => "Da", Language::KO => "네", + Language::PT => "Sim", }) } @@ -190,6 +202,7 @@ pub fn ask_quit_translation(language: Language) -> Text<'static> { Language::ZH => "您确定退出当前监控吗?", Language::RO => "Sunteți sigur că doriți să renunțați la această analiză?", Language::KO => "정말로 분석을 종료하겠습니까?", + Language::PT => "Tem a certeza que deseja sair desta análise?", }) } @@ -205,6 +218,7 @@ pub fn quit_analysis_translation(language: Language) -> String { Language::ZH => "退出监控".to_string(), Language::RO => "Renunță la analiză".to_string(), Language::KO => "분석종료".to_string(), + Language::PT => "Sair da análise".to_string(), } } @@ -220,6 +234,7 @@ pub fn ask_clear_all_translation(language: Language) -> Text<'static> { Language::ZH => "确定清除所有通知?", Language::RO => "Sigur doriți să ștergeți notificările?", Language::KO => "알림을 삭제하시겠습니까?", + Language::PT => "Tem a certeza que deseja eliminar as notificações?", }) } @@ -235,6 +250,7 @@ pub fn clear_all_translation(language: Language) -> String { Language::ZH => "清除所有".to_string(), Language::RO => "Ștergeți tot".to_string(), Language::KO => "모두 지우기".to_string(), + Language::PT => "Limpar tudo".to_string(), } } @@ -250,6 +266,7 @@ pub fn hide_translation(language: Language) -> &'static str { Language::ZH => "隐藏", Language::RO => "Ascundeți", Language::KO => "숨기기", + Language::PT => "Esconder", } } @@ -285,6 +302,9 @@ pub fn no_addresses_translation(language: Language, adapter: &str) -> Text<'stat Language::KO => 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 estiver certo de que está ligado à internet, tente escolher um adaptador diferente."), }) } @@ -320,6 +340,9 @@ pub fn waiting_translation(language: Language, adapter: &str) -> Text<'static> { Language::KO => 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?"), }) } @@ -359,6 +382,9 @@ pub fn some_observed_translation( Language::KO => 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}"), }) } @@ -385,7 +411,10 @@ pub fn filtered_packets_translation( } Language::KO => { format!("필터링된 패킷:\n {filtered} ({percentage} 의 일부)") - } + }, + Language::PT => { + format!("Pacotes filtrados:\n {filtered} ({percentage} do total)") + }, }) } @@ -412,7 +441,10 @@ pub fn filtered_bytes_translation( } Language::KO => { format!("필터링된 바이트:\n {filtered} ({percentage} 의 일부)") - } + }, + Language::PT => { + format!("Bytes filtrados:\n {filtered} ({percentage} do total)") + }, }) } @@ -428,6 +460,7 @@ pub fn filtered_application_translation(language: Language) -> Text<'static> { Language::ZH => "按应用层协议分类的目标数据包计数:", Language::RO => "Pachete filtrate pe protocol de aplicație:", Language::KO => "애플리케이션 프로토콜당 필터링된 패킷 수:", + Language::PT => "Pacotes filtrados por protocolo de aplicação:", }) } @@ -453,6 +486,8 @@ pub fn no_favorites_translation(language: Language) -> Text<'static> { Pentru a adăuga o conexiune la favorite, faceți clic pe simbolul stea din apropierea conexiunii.", Language::KO => "현재는 보여줄게 없습니다.\n\ 즐겨찾기에 연결을 추가하려면 별을 눌러주세요.", + Language::PT => "Nada para mostrar de momento.\n\ + Para adicionar uma conexão aos seus favoritos, clique na estrela perto da conexão.", }) } @@ -498,6 +533,10 @@ pub fn error_translation(language: Language, error: &str) -> Text<'static> { "오류가 발생하였습니다! \n\n\ {error}" ), + Language::PT => format!( + "Ocorreu um erro! \n\n\ + {error}" + ), }) } @@ -513,6 +552,7 @@ pub fn both_translation(language: Language) -> &'static str { Language::ZH => "皆需", Language::RO => "ambele", Language::KO => "둘다", + Language::PT => "ambos", } } @@ -539,6 +579,7 @@ pub fn all_translation(language: Language) -> &'static str { Language::ZH => "所有", Language::RO => "Toate", Language::KO => "모두", + Language::PT => "Todos", } } @@ -554,6 +595,7 @@ pub fn packets_chart_translation(language: Language) -> &'static str { Language::ZH => "数据包", Language::RO => "pachete pe secundă", Language::KO => "초당 패킷", + Language::PT => "pacotes por segundo", } } @@ -569,6 +611,7 @@ pub fn bytes_chart_translation(language: Language) -> &'static str { Language::ZH => "网络流量", Language::RO => "octeți pe secundă", Language::KO => "초당 바이트", + Language::PT => "bytes por segundo", } } @@ -584,6 +627,7 @@ pub fn recent_report_translation(language: Language) -> &'static str { Language::ZH => "按时间", Language::RO => "cea mai recentă", Language::KO => "가장 최근", + Language::PT => "mais recente", } } @@ -599,6 +643,7 @@ pub fn packets_report_translation(language: Language) -> &'static str { Language::ZH => "按数据包", Language::RO => "cele mai multe pachete", Language::KO => "대부분의 패킷", + Language::PT => "mais pacotes", } } @@ -614,6 +659,7 @@ pub fn bytes_report_translation(language: Language) -> &'static str { Language::ZH => "按流量", Language::RO => "cei mai mulți octeți", Language::KO => "대부분의 바이트", + Language::PT => "mais bytes", } } @@ -629,6 +675,7 @@ pub fn favorite_report_translation(language: Language) -> &'static str { Language::ZH => "收藏夹", Language::RO => "favorite", Language::KO => "즐겨찾기", + Language::PT => "favoritos", } } @@ -644,6 +691,7 @@ pub fn notifications_title_translation(language: Language) -> Text<'static> { Language::ZH => "自定义通知", Language::RO => "Personalizați-vă notificările", Language::KO => "사용자 지정 알림", + Language::PT => "Personalize as suas notificações", }) } @@ -659,6 +707,7 @@ pub fn appearance_title_translation(language: Language) -> Text<'static> { Language::ZH => "选择您喜欢的主题", Language::RO => "Selectați tema preferată", Language::KO => "태마를 선택하세요", + Language::PT => "Escolha o seu tema favorito", }) } @@ -674,6 +723,7 @@ pub fn languages_title_translation(language: Language) -> Text<'static> { Language::ZH => "选择显示语言", Language::RO => "Selectați limba", Language::KO => "언어를 선택하세요", + Language::PT => "Selecione o seu idioma", }) } @@ -689,6 +739,7 @@ pub fn active_filters_translation(language: Language) -> &'static str { Language::ZH => "活动的过滤器:", Language::RO => "Filtre active:", Language::KO => "활성화된 필터:", + Language::PT => "Filtros ativos:", } } @@ -704,6 +755,7 @@ pub fn none_translation(language: Language) -> &'static str { Language::ZH => "无", Language::RO => "niciunul", Language::KO => "없음", + Language::PT => "nenhum", } } @@ -719,6 +771,7 @@ pub fn yeti_night_translation(language: Language) -> &'static str { Language::ZH => "Sniffnet暗黑", Language::RO => "Tema întunecată originală Sniffnet", Language::KO => "Sniffnet의 기본 다크테마", + Language::PT => "Tema escuro original de Sniffnet", } } @@ -734,6 +787,7 @@ pub fn yeti_day_translation(language: Language) -> &'static str { Language::ZH => "Sniffnet浅色", Language::RO => "Tema deschisă originală Sniffnet", Language::KO => "Sniffnet의 기본 라이트테마", + Language::PT => "Tema claro original de Sniffnet", } } @@ -749,6 +803,7 @@ pub fn deep_sea_translation(language: Language) -> &'static str { Language::ZH => "潜入网络活动的海洋", Language::RO => "Pentru a vă scufunda în traficul de rețea", Language::KO => "네트워크 트레픽으로 바로가기", + Language::PT => "Para mergulhar no tráfego de rede", } } @@ -764,6 +819,7 @@ pub fn mon_amour_translation(language: Language) -> &'static str { Language::ZH => "梦想家的主题", Language::RO => "O temă minunată creată pentru visători", Language::KO => "사랑스러운 몽환가들을 위한 테마", + Language::PT => "Tema encantador feito para sonhadores", } } @@ -779,6 +835,7 @@ pub fn incoming_translation(language: Language) -> &'static str { Language::ZH => "入站", Language::RO => "de intrare", Language::KO => "수신중", + Language::PT => "Entrando", } } @@ -794,6 +851,7 @@ pub fn outgoing_translation(language: Language) -> &'static str { Language::ZH => "出站", Language::RO => "de ieșire", Language::KO => "발신중", + Language::PT => "Saindo", } } @@ -808,6 +866,7 @@ pub fn notifications_translation(language: Language) -> &'static str { Language::ZH => "通知", Language::RO => "Notificări", Language::KO => "알림", + Language::PT => "Notificações", } } @@ -821,6 +880,7 @@ pub fn style_translation(language: Language) -> &'static str { Language::UK => "Стиль", Language::ZH => "主题", Language::KO => "스타일", + Language::PT => "Estilo", } } @@ -836,6 +896,7 @@ pub fn language_translation(language: Language) -> &'static str { Language::ZH => "语言", Language::RO => "Limbă", Language::KO => "언어", + Language::PT => "Língua", } } @@ -851,6 +912,7 @@ pub fn overview_translation(language: Language) -> &'static str { Language::ZH => "概览", Language::RO => "Prezentare generală", Language::KO => "개요", + Language::PT => "Visão geral", } } @@ -877,6 +939,7 @@ pub fn packets_threshold_translation(language: Language) -> &'static str { Language::ZH => "超过设定的数据包数量阈值时通知我", Language::RO => "Anunță-mă când este depășit un prag de pachete", Language::KO => "패킷 임계값을 초과하면 알림", + Language::PT => "Notifique-me quando um limite de pacotes for excedido", } } @@ -892,6 +955,7 @@ pub fn bytes_threshold_translation(language: Language) -> &'static str { Language::ZH => "超过设定的网络流量阈值时通知我", Language::RO => "Anunță-mă când este depășit un prag de octeți", Language::KO => "바이트 임계값을 초과하면 알림", + Language::PT => "Notifique-me quando um limite de bytes for excedido", } } @@ -907,6 +971,7 @@ pub fn per_second_translation(language: Language) -> &'static str { Language::ZH => "(每秒) ", Language::RO => "(pe secundă)", Language::KO => "(초당)", + Language::PT => "(por segundo)", } } @@ -922,6 +987,7 @@ pub fn specify_multiples_translation(language: Language) -> &'static str { Language::ZH => "您可指定 'K', 'M', 'G'", Language::RO => "; puteți specifica 'K', 'M', 'G'", Language::KO => "; 지정가능합니다 'K', 'M', 'G'", + Language::PT => "; também pode especificar 'K', 'M' e 'G'", } } @@ -939,6 +1005,7 @@ pub fn favorite_notification_translation(language: Language) -> &'static str { Language::ZH => "收藏夹内的连接有新活动时通知我", Language::RO => "Anunță-mă când sunt transferate date noi de la favoritele mele", Language::KO => "즐겨찾기에서 새 데이터가 교환될 때 알림", + Language::PT => "Notificar-me quando novos dados forem trocados dos meus favoritos", } } @@ -954,6 +1021,7 @@ pub fn threshold_translation(language: Language) -> String { Language::ZH => "阈值: ".to_string(), Language::RO => "Prag: ".to_string(), Language::KO => "임계값: ".to_string(), + Language::PT => "Limite: ".to_string(), } } @@ -967,6 +1035,7 @@ pub fn volume_translation(language: Language, value: u8) -> String { Language::ZH => format!("通知音量: {value:^3}%"), Language::RO => format!("Volum: {value:^3}%"), Language::KO => format!("볼륨: {value:^3}%"), + Language::PT => format!("Volume: {value:^3}%"), } } @@ -982,6 +1051,7 @@ pub fn sound_translation(language: Language) -> &'static str { Language::ZH => "通知音:", Language::RO => "Sunet:", Language::KO => "사운드:", + Language::PT => "Som:", } } @@ -997,6 +1067,7 @@ pub fn open_report_translation(language: Language) -> &'static str { Language::ZH => "打开完整报告", Language::RO => "Deschideți raport complet", Language::KO => "전체 보고서 열기", + Language::PT => "Abrir relatório completo", } } @@ -1012,6 +1083,7 @@ pub fn bytes_exceeded_translation(language: Language) -> &'static str { Language::ZH => "达到设定的网络流量阈值!", Language::RO => "Prag de octeți depășit!", Language::KO => "바이트 임계값 초과!", + Language::PT => "Limite de bytes excedido!", } } @@ -1028,6 +1100,7 @@ pub fn bytes_exceeded_value_translation(language: Language, value: &str) -> Stri Language::ZH => format!("已交换字节 {trimmed_value}"), Language::RO => format!("au fost transferați {trimmed_value} octeți"), Language::KO => format!("바이트 {trimmed_value} 가 교환되었습니다"), + Language::PT => format!("Foram trocados {trimmed_value} bytes"), } } @@ -1043,6 +1116,7 @@ pub fn packets_exceeded_translation(language: Language) -> &'static str { Language::ZH => "达到设定的数据包数量阈值!", Language::RO => "Prag de pachete depășit!", Language::KO => "패킷 임계값 초과!", + Language::PT => "Limite de pacotes excedido!", } } @@ -1061,6 +1135,10 @@ pub fn packets_exceeded_value_translation(language: Language, value: u32) -> Str Language::ZH => format!("已交换数据包 {value}"), Language::RO => format!("au fost transferate {value} pachete"), Language::KO => format!("패킷 {value} 가 교환되었습니다"), + Language::PT => match value { + 1 => "Foi trocado 1 pacote".to_owned(), + npackets => format!("Foram trocados {npackets} pacotes"), + }, } } @@ -1076,6 +1154,7 @@ pub fn favorite_transmitted_translation(language: Language) -> &'static str { Language::ZH => "收藏夹内的连接有新活动!", Language::RO => "Date noi transferate de la favorite!", Language::KO => "즐겨찾기에서 새 데이터 교환", + Language::PT => "Novos dados trocados dos favoritos!", } } @@ -1111,6 +1190,9 @@ pub fn no_notifications_set_translation(language: Language) -> Text<'static> { Language::KO => "아직 알림을 활성화하지 않았습니다!\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:", }) } @@ -1156,6 +1238,10 @@ pub fn no_notifications_received_translation(language: Language) -> Text<'static "현재는 볼 것이 없습니다...\n\n\ 알림을 받으면 여기에 표시됩니다" } + Language::PT => { + "Nada para ver neste momento...\n\n\ + Quando receber uma notificação, ela será mostrada aqui" + } }) } @@ -1171,5 +1257,6 @@ pub fn only_last_30_translation(language: Language) -> &'static str { Language::ZH => "仅显示最近 30 条通知", Language::RO => "Sunt afișate doar ultimele 30 de notificări", Language::KO => "최근 30개의 알림만 표시됩니다", + Language::PT => "São mostradas apenas as últimas 30 notificações", } } diff --git a/src/translations/types/language.rs b/src/translations/types/language.rs index bb80aadb..a8e04f20 100644 --- a/src/translations/types/language.rs +++ b/src/translations/types/language.rs @@ -23,6 +23,8 @@ pub enum Language { RO, /// Korean KO, + /// Portuguese + PT, } impl Default for Language { @@ -59,6 +61,7 @@ impl Language { Language::ZH => "简体中文", Language::RO => "Română", Language::KO => "한국인", + Language::PT => "Português", } } } From 17cab43dd9882d38f4d38c83fdfe8f40af4696f0 Mon Sep 17 00:00:00 2001 From: Giuliano Bellini s294739 Date: Thu, 13 Apr 2023 09:45:43 +0200 Subject: [PATCH 09/31] migrating to iced 0.9 --- Cargo.lock | 260 +++++++++++++++---- Cargo.toml | 6 +- src/gui/components/radio.rs | 16 +- src/gui/pages/settings_notifications_page.rs | 28 +- src/gui/styles/scrollbar.rs | 2 +- src/gui/styles/slider.rs | 17 +- src/gui/styles/text_input.rs | 12 + src/main.rs | 5 + 8 files changed, 259 insertions(+), 87 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 189c8e37..9b711e52 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" @@ -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,15 +1514,15 @@ 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_core 0.9.0", "iced_futures", "iced_glow", - "iced_graphics", - "iced_native", + "iced_graphics 0.8.0", + "iced_native 0.10.1", "iced_wgpu", "iced_winit", "image", @@ -1470,6 +1540,17 @@ dependencies = [ "palette", ] +[[package]] +name = "iced_core" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11e1942e28dedee756cc27e67e7a838cdc1e59fb6bf9627ec9f709ab3b135782" +dependencies = [ + "bitflags", + "instant", + "palette", +] + [[package]] name = "iced_futures" version = "0.6.0" @@ -1485,17 +1566,17 @@ 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", - "iced_native", + "iced_graphics 0.8.0", + "iced_native 0.10.1", "log", ] @@ -1508,10 +1589,8 @@ dependencies = [ "bitflags", "bytemuck", "glam", - "iced_native", - "iced_style", - "image", - "kamadak-exif", + "iced_native 0.9.1", + "iced_style 0.7.0", "log", "lyon", "raw-window-handle 0.5.0", @@ -1519,12 +1598,30 @@ dependencies = [ ] [[package]] -name = "iced_lazy" -version = "0.5.0" +name = "iced_graphics" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "370ffb291ff5609ca488a2596df98a049b2a4d572c621aa0b2c586694ca327cf" +checksum = "338a6aff7db906537074ad0fe8b720cfdb9512cdfea43c628c76bd1cf50fdcc0" dependencies = [ - "iced_native", + "bitflags", + "bytemuck", + "glam", + "iced_native 0.10.1", + "iced_style 0.8.0", + "image", + "kamadak-exif", + "log", + "raw-window-handle 0.5.0", + "thiserror", +] + +[[package]] +name = "iced_lazy" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6fac760b5a21438da841b74dde5f59ab8391bc65a7f9a411f311ed814a8e8ec" +dependencies = [ + "iced_native 0.10.1", "ouroboros", ] @@ -1534,30 +1631,56 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9942cdcd78591e816aae558721942aa366b03ed7f3f964b51de23c68ec78be7" dependencies = [ - "iced_core", + "iced_core 0.8.0", "iced_futures", - "iced_style", + "iced_style 0.7.0", "num-traits", "twox-hash", "unicode-segmentation", ] +[[package]] +name = "iced_native" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b3dd42731b43f1ee0a028af35abefbb756956d093552d0f92f678628e6384fe" +dependencies = [ + "iced_core 0.9.0", + "iced_futures", + "iced_style 0.8.0", + "num-traits", + "thiserror", + "twox-hash", + "unicode-segmentation", +] + [[package]] name = "iced_style" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad5eb9547d32b9ff9b019526657974112b86baab58b2b91b1624316b309700b6" dependencies = [ - "iced_core", + "iced_core 0.8.0", + "once_cell", + "palette", +] + +[[package]] +name = "iced_style" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e37333dc2991201140302cd0d4cea051bd37ca3671d5008ec85df86d232ff30" +dependencies = [ + "iced_core 0.9.0", "once_cell", "palette", ] [[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", @@ -1566,8 +1689,8 @@ dependencies = [ "glam", "glyph_brush", "guillotiere", - "iced_graphics", - "iced_native", + "iced_graphics 0.8.0", + "iced_native 0.10.1", "log", "raw-window-handle 0.5.0", "wgpu", @@ -1576,13 +1699,13 @@ 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", - "iced_native", + "iced_graphics 0.8.0", + "iced_native 0.10.1", "log", "thiserror", "web-sys", @@ -2021,9 +2144,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 +2416,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" @@ -2612,8 +2744,8 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc932e1abce0251e908cf30bde8e66c30db30753a30b1b72f64846824783e0bf" dependencies = [ - "iced_graphics", - "iced_native", + "iced_graphics 0.7.0", + "iced_native 0.9.1", "plotters", "plotters-backend", ] @@ -2905,6 +3037,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" @@ -3176,7 +3314,7 @@ dependencies = [ "etherparse", "iced", "iced_lazy", - "iced_native", + "iced_native 0.10.1", "indexmap", "maxminddb", "pcap", @@ -3810,15 +3948,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 +3972,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 +3995,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 +4009,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 +4037,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 +4058,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 3210e47a..b29c3f6d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -31,9 +31,9 @@ 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" +iced = { version = "0.9.0", features = ["tokio", "image"] } +iced_native = "0.10.1" +iced_lazy = "0.6.0" plotters-iced = "0.7.0" maxminddb = "0.23.0" confy = "0.5.1" 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/settings_notifications_page.rs b/src/gui/pages/settings_notifications_page.rs index 772f97a8..da3c7570 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)) diff --git a/src/gui/styles/scrollbar.rs b/src/gui/styles/scrollbar.rs index 9fd2ee33..8dc3a09a 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)), diff --git a/src/gui/styles/slider.rs b/src/gui/styles/slider.rs index 28f1ecc0..cbaf1f60 100644 --- a/src/gui/styles/slider.rs +++ b/src/gui/styles/slider.rs @@ -1,7 +1,7 @@ //! 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; @@ -20,7 +20,10 @@ 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.primary), + width: 0.0, + }, handle: Handle { shape: HandleShape::Circle { radius: 7.0 }, color: colors.primary, @@ -33,7 +36,10 @@ 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.secondary), + width: 0.0, + }, handle: Handle { shape: HandleShape::Circle { radius: 7.0 }, color: colors.secondary, @@ -46,7 +52,10 @@ 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.secondary), + width: 0.0, + }, handle: Handle { shape: HandleShape::Circle { radius: 7.0 }, color: colors.secondary, diff --git a/src/gui/styles/text_input.rs b/src/gui/styles/text_input.rs index 7bc4acaa..e08630bb 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/main.rs b/src/main.rs index 7c8ef5f8..32f3d5fd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -106,6 +106,11 @@ pub fn main() -> iced::Result { transparent: false, always_on_top: false, icon: None, + platform_specific: iced::window::PlatformSpecific { + title_hidden: true, + titlebar_transparent: true, + fullsize_content_view: true, + }, }, flags: Sniffer::new( current_capture_id1, From dfb688c67f4cc28cd1f90b8c09fc1c18a5705ff7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=BCseyin=20Fahri=20Uzun?= Date: Thu, 13 Apr 2023 10:46:03 +0300 Subject: [PATCH 10/31] Added Turkish Translation --- src/translations/translations.rs | 80 ++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/src/translations/translations.rs b/src/translations/translations.rs index e48218cb..f4b2cac1 100644 --- a/src/translations/translations.rs +++ b/src/translations/translations.rs @@ -14,6 +14,7 @@ pub fn choose_adapters_translation(language: Language) -> Text<'static> { 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", }) } @@ -29,6 +30,7 @@ pub fn application_protocol_translation(language: Language) -> &'static str { Language::ZH => "目标应用层协议", Language::RO => "Protocol aplicație", Language::KO => "어플리케이션 프로토콜", + Language::TR => "Uygulama protokolü", } } @@ -44,6 +46,7 @@ pub fn select_filters_translation(language: Language) -> Text<'static> { Language::ZH => "选择需要监控的目标", Language::RO => "Selectați filtre pentru traficul de rețea", Language::KO => "네트워크 트레픽에 적용할 필터 선택", + Language::TR => "Ağ trafiğine uygulanacak filtreleri seçiniz", }) } @@ -56,6 +59,7 @@ pub fn start_translation(language: Language) -> &'static str { Language::PL => "Rozpocznij!", Language::UK => "Почати!", Language::ZH => "开始!", + Language::TR => "Başla!", } } @@ -70,6 +74,7 @@ pub fn address_translation(language: Language) -> &'static str { Language::ZH => "\n网络地址:", Language::RO => "\nAdresă:", Language::KO => "\n주소:", + Language::TR => "\nAdres:", } } @@ -85,6 +90,7 @@ pub fn addresses_translation(language: Language) -> &'static str { Language::ZH => "\n网络地址:", Language::RO => "\nAdrese:", Language::KO => "\n주소:", + Language::TR => "\nAdresler:", } } @@ -100,6 +106,7 @@ pub fn ip_version_translation(language: Language) -> Text<'static> { Language::ZH => "目标IP协议版本", Language::RO => "Versiune IP", Language::KO => "IP 버전", + Language::TR => "IP versiyonu", }) } @@ -115,6 +122,7 @@ pub fn transport_protocol_translation(language: Language) -> &'static str { Language::ZH => "目标传输协议", Language::RO => "Protocol de transport", Language::KO => "전송 프로토콜", + Language::TR => "İletişim protokolü", } } @@ -130,6 +138,7 @@ pub fn traffic_rate_translation(language: Language) -> Text<'static> { Language::ZH => "网络速率图:", Language::RO => "Rata de trafic:", Language::KO => "트레픽 속도:", + Language::TR => "Trafik oranı:", }) } @@ -145,6 +154,7 @@ pub fn relevant_connections_translation(language: Language) -> Text<'static> { Language::ZH => "连接详情:", Language::RO => "Conexiuni relevante:", Language::KO => "관련 연결:", + Language::TR => "İlgili bağlantılar:", }) } @@ -160,6 +170,7 @@ pub fn settings_translation(language: Language) -> &'static str { Language::ZH => "设置", Language::RO => "Setări", Language::KO => "설정", + Language::TR => "Ayarlar", } } @@ -175,6 +186,7 @@ pub fn yes_translation(language: Language) -> Text<'static> { Language::ZH => "是", Language::RO => "Da", Language::KO => "네", + Language::TR => "Evet", }) } @@ -190,6 +202,7 @@ pub fn ask_quit_translation(language: Language) -> Text<'static> { 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?", }) } @@ -205,6 +218,7 @@ pub fn quit_analysis_translation(language: Language) -> String { Language::ZH => "退出监控".to_string(), Language::RO => "Renunță la analiză".to_string(), Language::KO => "분석종료".to_string(), + Language::TR => "Analizden çık".to_string(), } } @@ -220,6 +234,7 @@ pub fn ask_clear_all_translation(language: Language) -> Text<'static> { Language::ZH => "确定清除所有通知?", Language::RO => "Sigur doriți să ștergeți notificările?", Language::KO => "알림을 삭제하시겠습니까?", + Language::TR => "Bildirimleri temizlemek istediğine emin misin?", }) } @@ -235,6 +250,7 @@ pub fn clear_all_translation(language: Language) -> String { Language::ZH => "清除所有".to_string(), Language::RO => "Ștergeți tot".to_string(), Language::KO => "모두 지우기".to_string(), + Language::TR => "Hepsini temizle".to_string(), } } @@ -250,6 +266,7 @@ pub fn hide_translation(language: Language) -> &'static str { Language::ZH => "隐藏", Language::RO => "Ascundeți", Language::KO => "숨기기", + Language::TR => "Gizle", } } @@ -285,6 +302,9 @@ pub fn no_addresses_translation(language: Language, adapter: &str) -> Text<'stat 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.") }) } @@ -320,6 +340,9 @@ pub fn waiting_translation(language: Language, adapter: &str) -> Text<'static> { 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?") }) } @@ -359,6 +382,9 @@ pub fn some_observed_translation( Language::KO => format!("감지한 총 패킷: {observed}\n\n\ 필터링된 패킷: 0\n\n\ 일부 패킷이 감지되었지만, 지정한 필터에 따라 선택되지 않았습니다...\n\n{filters}"), + Language::TR => format!("Toplam yakalanan paketler: {observerd}\n\n\ + Filterelenen paketler: 0\n\n\ + Bazı paketler yakalandı, fakat belirttiğiniz filtrelere göre hiç biri seçilmedi...\n\n{filters}") }) } @@ -386,6 +412,7 @@ pub fn filtered_packets_translation( Language::KO => { format!("필터링된 패킷:\n {filtered} ({percentage} 의 일부)") } + Language::TR => format!("Filtrelenen paketler: \n {filtered} toplamın ({percentage})"), }) } @@ -413,6 +440,7 @@ pub fn filtered_bytes_translation( Language::KO => { format!("필터링된 바이트:\n {filtered} ({percentage} 의 일부)") } + Language::TR => format!("Filtrelenen bayt:\n {filtered} toplamın ({percentage})"), }) } @@ -428,6 +456,7 @@ pub fn filtered_application_translation(language: Language) -> Text<'static> { Language::ZH => "按应用层协议分类的目标数据包计数:", Language::RO => "Pachete filtrate pe protocol de aplicație:", Language::KO => "애플리케이션 프로토콜당 필터링된 패킷 수:", + Language::TR => "Uygulama protokolü bazında filtrelenen paketler:", }) } @@ -453,6 +482,8 @@ pub fn no_favorites_translation(language: Language) -> Text<'static> { 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." }) } @@ -498,6 +529,10 @@ pub fn error_translation(language: Language, error: &str) -> Text<'static> { "오류가 발생하였습니다! \n\n\ {error}" ), + Language::TR => format!( + "Bir hata oluştu! \n\n\ + {error}" + ), }) } @@ -513,6 +548,7 @@ pub fn both_translation(language: Language) -> &'static str { Language::ZH => "皆需", Language::RO => "ambele", Language::KO => "둘다", + Language::TR => "ikiside", } } @@ -539,6 +575,7 @@ pub fn all_translation(language: Language) -> &'static str { Language::ZH => "所有", Language::RO => "Toate", Language::KO => "모두", + Language::TR => "Hepsi", } } @@ -554,6 +591,7 @@ pub fn packets_chart_translation(language: Language) -> &'static str { Language::ZH => "数据包", Language::RO => "pachete pe secundă", Language::KO => "초당 패킷", + Language::TR => "saniye başı paket", } } @@ -569,6 +607,7 @@ pub fn bytes_chart_translation(language: Language) -> &'static str { Language::ZH => "网络流量", Language::RO => "octeți pe secundă", Language::KO => "초당 바이트", + Language::TR => "saniye başı bayt", } } @@ -584,6 +623,7 @@ pub fn recent_report_translation(language: Language) -> &'static str { Language::ZH => "按时间", Language::RO => "cea mai recentă", Language::KO => "가장 최근", + Language::TR => "en son", } } @@ -599,6 +639,7 @@ pub fn packets_report_translation(language: Language) -> &'static str { Language::ZH => "按数据包", Language::RO => "cele mai multe pachete", Language::KO => "대부분의 패킷", + Language::TR => "en çok paket", } } @@ -614,6 +655,7 @@ pub fn bytes_report_translation(language: Language) -> &'static str { Language::ZH => "按流量", Language::RO => "cei mai mulți octeți", Language::KO => "대부분의 바이트", + Language::TR => "en çok bayt", } } @@ -629,6 +671,7 @@ pub fn favorite_report_translation(language: Language) -> &'static str { Language::ZH => "收藏夹", Language::RO => "favorite", Language::KO => "즐겨찾기", + Language::TR => "favoriler", } } @@ -644,6 +687,7 @@ pub fn notifications_title_translation(language: Language) -> Text<'static> { Language::ZH => "自定义通知", Language::RO => "Personalizați-vă notificările", Language::KO => "사용자 지정 알림", + Language::TR => "Bildirimlerinizi özelleştirin", }) } @@ -659,6 +703,7 @@ pub fn appearance_title_translation(language: Language) -> Text<'static> { Language::ZH => "选择您喜欢的主题", Language::RO => "Selectați tema preferată", Language::KO => "태마를 선택하세요", + Language::TR => "Favori temanızı seçin", }) } @@ -674,6 +719,7 @@ pub fn languages_title_translation(language: Language) -> Text<'static> { Language::ZH => "选择显示语言", Language::RO => "Selectați limba", Language::KO => "언어를 선택하세요", + Language::TR => "Dilinizi seçin", }) } @@ -689,6 +735,7 @@ pub fn active_filters_translation(language: Language) -> &'static str { Language::ZH => "活动的过滤器:", Language::RO => "Filtre active:", Language::KO => "활성화된 필터:", + Language::TR => "Aktif filtreler", } } @@ -704,6 +751,7 @@ pub fn none_translation(language: Language) -> &'static str { Language::ZH => "无", Language::RO => "niciunul", Language::KO => "없음", + Language::TR => "hiç biri", } } @@ -719,6 +767,7 @@ pub fn yeti_night_translation(language: Language) -> &'static str { Language::ZH => "Sniffnet暗黑", Language::RO => "Tema întunecată originală Sniffnet", Language::KO => "Sniffnet의 기본 다크테마", + Language::TR => "Sniffnet'in orjinal koyu teması", } } @@ -734,6 +783,7 @@ pub fn yeti_day_translation(language: Language) -> &'static str { Language::ZH => "Sniffnet浅色", Language::RO => "Tema deschisă originală Sniffnet", Language::KO => "Sniffnet의 기본 라이트테마", + Language::TR => "Sniffnet'in orjinal açık teması", } } @@ -749,6 +799,7 @@ pub fn deep_sea_translation(language: Language) -> &'static str { Language::ZH => "潜入网络活动的海洋", Language::RO => "Pentru a vă scufunda în traficul de rețea", Language::KO => "네트워크 트레픽으로 바로가기", + Language::TR => "Ağ trafiğine dalmak", } } @@ -764,6 +815,7 @@ pub fn mon_amour_translation(language: Language) -> &'static str { Language::ZH => "梦想家的主题", Language::RO => "O temă minunată creată pentru visători", Language::KO => "사랑스러운 몽환가들을 위한 테마", + Language::TR => "Hayal perestler için yapılmış güzel tema", } } @@ -779,6 +831,7 @@ pub fn incoming_translation(language: Language) -> &'static str { Language::ZH => "入站", Language::RO => "de intrare", Language::KO => "수신중", + Language::TR => "Gelen", } } @@ -794,6 +847,7 @@ pub fn outgoing_translation(language: Language) -> &'static str { Language::ZH => "出站", Language::RO => "de ieșire", Language::KO => "발신중", + Language::TR => "Giden", } } @@ -808,6 +862,7 @@ pub fn notifications_translation(language: Language) -> &'static str { Language::ZH => "通知", Language::RO => "Notificări", Language::KO => "알림", + Language::TR => "Bildirimler", } } @@ -821,6 +876,7 @@ pub fn style_translation(language: Language) -> &'static str { Language::UK => "Стиль", Language::ZH => "主题", Language::KO => "스타일", + Language::TR => "Stil", } } @@ -836,6 +892,7 @@ pub fn language_translation(language: Language) -> &'static str { Language::ZH => "语言", Language::RO => "Limbă", Language::KO => "언어", + Language::TR => "Dil", } } @@ -851,6 +908,7 @@ pub fn overview_translation(language: Language) -> &'static str { Language::ZH => "概览", Language::RO => "Prezentare generală", Language::KO => "개요", + Language::TR => "Ön izleme", } } @@ -877,6 +935,7 @@ pub fn packets_threshold_translation(language: Language) -> &'static str { 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", } } @@ -892,6 +951,7 @@ pub fn bytes_threshold_translation(language: Language) -> &'static str { 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", } } @@ -907,6 +967,7 @@ pub fn per_second_translation(language: Language) -> &'static str { Language::ZH => "(每秒) ", Language::RO => "(pe secundă)", Language::KO => "(초당)", + Language::TR => "(her saniye)", } } @@ -922,6 +983,7 @@ pub fn specify_multiples_translation(language: Language) -> &'static str { 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'", } } @@ -939,6 +1001,7 @@ pub fn favorite_notification_translation(language: Language) -> &'static str { 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", } } @@ -954,6 +1017,7 @@ pub fn threshold_translation(language: Language) -> String { Language::ZH => "阈值: ".to_string(), Language::RO => "Prag: ".to_string(), Language::KO => "임계값: ".to_string(), + Language::TR => "Eşik: ".to_string(), } } @@ -967,6 +1031,7 @@ pub fn volume_translation(language: Language, value: u8) -> String { Language::ZH => format!("通知音量: {value:^3}%"), Language::RO => format!("Volum: {value:^3}%"), Language::KO => format!("볼륨: {value:^3}%"), + Language::TR => format!("Ses: {value:^3}%"), } } @@ -982,6 +1047,7 @@ pub fn sound_translation(language: Language) -> &'static str { Language::ZH => "通知音:", Language::RO => "Sunet:", Language::KO => "사운드:", + Language::TR => "Ses:", } } @@ -997,6 +1063,7 @@ pub fn open_report_translation(language: Language) -> &'static str { Language::ZH => "打开完整报告", Language::RO => "Deschideți raport complet", Language::KO => "전체 보고서 열기", + Language::TR => "Tam raporu aç", } } @@ -1012,6 +1079,7 @@ pub fn bytes_exceeded_translation(language: Language) -> &'static str { Language::ZH => "达到设定的网络流量阈值!", Language::RO => "Prag de octeți depășit!", Language::KO => "바이트 임계값 초과!", + Language::TR => "Bayt eşik değeri aşıldı!", } } @@ -1028,6 +1096,7 @@ pub fn bytes_exceeded_value_translation(language: Language, value: &str) -> Stri 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ı"), } } @@ -1043,6 +1112,7 @@ pub fn packets_exceeded_translation(language: Language) -> &'static str { Language::ZH => "达到设定的数据包数量阈值!", Language::RO => "Prag de pachete depășit!", Language::KO => "패킷 임계값 초과!", + Language::TR => "Paket eşik değeri aşıldı!", } } @@ -1061,6 +1131,7 @@ pub fn packets_exceeded_value_translation(language: Language, value: u32) -> Str Language::ZH => format!("已交换数据包 {value}"), Language::RO => format!("au fost transferate {value} pachete"), Language::KO => format!("패킷 {value} 가 교환되었습니다"), + Language::TR => format!("{value} paket aktarıldı"), } } @@ -1076,6 +1147,7 @@ pub fn favorite_transmitted_translation(language: Language) -> &'static str { Language::ZH => "收藏夹内的连接有新活动!", Language::RO => "Date noi transferate de la favorite!", Language::KO => "즐겨찾기에서 새 데이터 교환", + Language::TR => "Favorilerden yeni veri aktarıldı!", } } @@ -1111,6 +1183,9 @@ pub fn no_notifications_set_translation(language: Language) -> Text<'static> { 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:" }) } @@ -1156,6 +1231,10 @@ pub fn no_notifications_received_translation(language: Language) -> Text<'static "현재는 볼 것이 없습니다...\n\n\ 알림을 받으면 여기에 표시됩니다" } + Language::TR => { + "Şu an görecek bir şey yok...\n\n\ + Bildirim aldığınız zaman burada gözükecektir" + } }) } @@ -1171,5 +1250,6 @@ pub fn only_last_30_translation(language: Language) -> &'static str { 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", } } From 9248e5ea1eed63c75d3c07eb2020baff07ae2c24 Mon Sep 17 00:00:00 2001 From: Francisco Salgueiro Date: Thu, 13 Apr 2023 08:47:15 +0100 Subject: [PATCH 11/31] small improvements to pt translation --- src/translations/translations.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/translations/translations.rs b/src/translations/translations.rs index 819dda2c..e9a77611 100644 --- a/src/translations/translations.rs +++ b/src/translations/translations.rs @@ -14,7 +14,7 @@ pub fn choose_adapters_translation(language: Language) -> Text<'static> { Language::ZH => "选择需要监控的网络适配器", Language::RO => "Selectați adaptor de rețea pentru a inspecta", Language::KO => "검사할 네트워크 어댑터 선택", - Language::PT => "Selecione o adaptador de rede para inspecionar", + Language::PT => "Selecione o adaptador de rede a inspecionar", }) } @@ -106,7 +106,7 @@ pub fn ip_version_translation(language: Language) -> Text<'static> { Language::ZH => "目标IP协议版本", Language::RO => "Versiune IP", Language::KO => "IP 버전", - Language::PT => "Versão IP", + Language::PT => "Versão de IP", }) } @@ -304,7 +304,7 @@ pub fn no_addresses_translation(language: Language, adapter: &str) -> Text<'stat 인터넷이 연결되어있다면 다른 어댑터로 시도해보세요."), 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 estiver certo de que está ligado à internet, tente escolher um adaptador diferente."), + Se tiver a certeza que está ligado à internet, tente escolher um adaptador diferente."), }) } From c61668dc38bf74fefb9f2494439ed94c14e2fd0b Mon Sep 17 00:00:00 2001 From: Giuliano Bellini s294739 Date: Thu, 13 Apr 2023 11:31:21 +0200 Subject: [PATCH 12/31] added turkish characters and language; fixed errors and added third language column --- resources/fonts/full/subset_characters.txt | 6 ++++++ .../subset/sarasa-mono-sc-bold.subset.ttf | Bin 103968 -> 104164 bytes .../subset/sarasa-mono-sc-regular.subset.ttf | Bin 105240 -> 105436 bytes src/gui/pages/settings_language_page.rs | 5 ++++- src/translations/translations.rs | 12 +++++------ src/translations/types/language.rs | 20 ++++++------------ src/utils/countries.rs | 1 + 7 files changed, 22 insertions(+), 22 deletions(-) diff --git a/resources/fonts/full/subset_characters.txt b/resources/fonts/full/subset_characters.txt index f5f9d9e5..1ab39be1 100644 --- a/resources/fonts/full/subset_characters.txt +++ b/resources/fonts/full/subset_characters.txt @@ -96,6 +96,7 @@ z ¿ Ê Î +Ö Ü à á @@ -120,9 +121,14 @@ z ą ć ę +ğ +İ +ı ł ń ś +Ş +ş ź ż Ș diff --git a/resources/fonts/subset/sarasa-mono-sc-bold.subset.ttf b/resources/fonts/subset/sarasa-mono-sc-bold.subset.ttf index 8639d77f571ce4ddba9827e918ff6769d3341f46..e6a27ac3fec706d4e59dbf43e2131c35c462f3bb 100644 GIT binary patch delta 6708 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 doN1_~^R;ONsU2)be?+adv0=vtys3=k* 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 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) diff --git a/src/translations/translations.rs b/src/translations/translations.rs index f4b2cac1..d624a926 100644 --- a/src/translations/translations.rs +++ b/src/translations/translations.rs @@ -69,12 +69,11 @@ 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::TR => "\nAdres:", } } @@ -382,7 +381,7 @@ pub fn some_observed_translation( Language::KO => format!("감지한 총 패킷: {observed}\n\n\ 필터링된 패킷: 0\n\n\ 일부 패킷이 감지되었지만, 지정한 필터에 따라 선택되지 않았습니다...\n\n{filters}"), - Language::TR => format!("Toplam yakalanan paketler: {observerd}\n\n\ + 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}") }) @@ -412,7 +411,7 @@ pub fn filtered_packets_translation( Language::KO => { format!("필터링된 패킷:\n {filtered} ({percentage} 의 일부)") } - Language::TR => format!("Filtrelenen paketler: \n {filtered} toplamın ({percentage})"), + Language::TR => format!("Filtrelenen paketler:\n {filtered} toplamın ({percentage})"), }) } @@ -735,7 +734,7 @@ pub fn active_filters_translation(language: Language) -> &'static str { Language::ZH => "活动的过滤器:", Language::RO => "Filtre active:", Language::KO => "활성화된 필터:", - Language::TR => "Aktif filtreler", + Language::TR => "Aktif filtreler:", } } @@ -872,11 +871,10 @@ pub fn style_translation(language: Language) -> &'static str { Language::IT => "Stile", Language::ES => "Estilo", Language::PL => "Styl", - Language::DE | Language::RO => "Stil", + Language::DE | Language::RO | Language::TR => "Stil", Language::UK => "Стиль", Language::ZH => "主题", Language::KO => "스타일", - Language::TR => "Stil", } } diff --git a/src/translations/types/language.rs b/src/translations/types/language.rs index bb80aadb..838f76a2 100644 --- a/src/translations/types/language.rs +++ b/src/translations/types/language.rs @@ -23,6 +23,8 @@ pub enum Language { RO, /// Korean KO, + /// Turkish + TR, } impl Default for Language { @@ -32,20 +34,9 @@ impl Default for Language { } impl Language { - pub(crate) const COL1: [Language; 5] = [ - Language::EN, - Language::ES, - Language::IT, - Language::PL, - Language::UK, - ]; - pub(crate) const COL2: [Language; 5] = [ - Language::DE, - Language::FR, - Language::KO, - Language::RO, - Language::ZH, - ]; + pub(crate) const COL1: [Language; 4] = [Language::EN, Language::FR, Language::PL, Language::UK]; + pub(crate) const COL2: [Language; 4] = [Language::DE, Language::IT, Language::RO, Language::ZH]; + pub(crate) const COL3: [Language; 3] = [Language::ES, Language::KO, Language::TR]; pub fn get_radio_label(&self) -> &str { match self { @@ -59,6 +50,7 @@ impl Language { Language::ZH => "简体中文", Language::RO => "Română", Language::KO => "한국인", + Language::TR => "Türkçe", } } } diff --git a/src/utils/countries.rs b/src/utils/countries.rs index 65e27c72..623c936a 100644 --- a/src/utils/countries.rs +++ b/src/utils/countries.rs @@ -516,6 +516,7 @@ pub fn get_flag_from_language_code(language: &str) -> Image { "KO" => KR, "PL" => PL, "RO" => RO, + "TR" => TR, "UK" => UA, _ => UNKNOWN, }))) From 5fc595c378a419e2274f2bcd4b919af07d7ed83b Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 13 Apr 2023 11:59:57 +0200 Subject: [PATCH 13/31] docs: add fuzunspm as a contributor for translation (#140) * docs: update CONTRIBUTORS.md [skip ci] * docs: update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ CONTRIBUTORS.md | 1 + 2 files changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index d205276a..998cbeaa 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -106,6 +106,15 @@ "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" + ] } ], "contributorsPerLine": 7, diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 557f1add..97c4cc6e 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -19,6 +19,7 @@ A big shout-out to all the contributors of Sniffnet ([emoji key](https://allcont yossarian
yossarian

🌍 ervinpopescu
ervinpopescu

🌍 Limdongju
Limdongju

🌍 + Hüseyin Fahri Uzun
Hüseyin Fahri Uzun

🌍 From d155252621801a27c2fed3ad35b6c26d7df3ea56 Mon Sep 17 00:00:00 2001 From: George Shuklin Date: Thu, 13 Apr 2023 17:04:12 +0300 Subject: [PATCH 14/31] feat: add Russian translation --- src/translations/translations.rs | 93 ++++++++++++++++++++++++++++-- src/translations/translations_2.rs | 1 + src/translations/types/language.rs | 5 +- 3 files changed, 93 insertions(+), 6 deletions(-) diff --git a/src/translations/translations.rs b/src/translations/translations.rs index d624a926..9a1dc1ce 100644 --- a/src/translations/translations.rs +++ b/src/translations/translations.rs @@ -15,6 +15,7 @@ pub fn choose_adapters_translation(language: Language) -> Text<'static> { 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 => "Выберите сетевой адаптер для инспекции", }) } @@ -31,6 +32,7 @@ pub fn application_protocol_translation(language: Language) -> &'static str { Language::RO => "Protocol aplicație", Language::KO => "어플리케이션 프로토콜", Language::TR => "Uygulama protokolü", + Language::RU => "Прикладной протокол", } } @@ -47,6 +49,7 @@ pub fn select_filters_translation(language: Language) -> Text<'static> { Language::RO => "Selectați filtre pentru traficul de rețea", Language::KO => "네트워크 트레픽에 적용할 필터 선택", Language::TR => "Ağ trafiğine uygulanacak filtreleri seçiniz", + Language::RU => "Выберите фильтры для применения к сетевому трафику", }) } @@ -60,6 +63,7 @@ pub fn start_translation(language: Language) -> &'static str { Language::UK => "Почати!", Language::ZH => "开始!", Language::TR => "Başla!", + Language::RU => "Начать!", } } @@ -74,6 +78,7 @@ pub fn address_translation(language: Language) -> &'static str { Language::ZH => "\n网络地址:", Language::RO => "\nAdresă:", Language::KO => "\n주소:", + Language::RU => "\nАдрес:", } } @@ -90,6 +95,7 @@ pub fn addresses_translation(language: Language) -> &'static str { Language::RO => "\nAdrese:", Language::KO => "\n주소:", Language::TR => "\nAdresler:", + Language::RU => "\nАдреса:", } } @@ -106,6 +112,7 @@ pub fn ip_version_translation(language: Language) -> Text<'static> { Language::RO => "Versiune IP", Language::KO => "IP 버전", Language::TR => "IP versiyonu", + Language::RU => "Версия IP", }) } @@ -122,6 +129,7 @@ pub fn transport_protocol_translation(language: Language) -> &'static str { Language::RO => "Protocol de transport", Language::KO => "전송 프로토콜", Language::TR => "İletişim protokolü", + Language::RU => "Транспортный протокол", } } @@ -138,6 +146,7 @@ pub fn traffic_rate_translation(language: Language) -> Text<'static> { Language::RO => "Rata de trafic:", Language::KO => "트레픽 속도:", Language::TR => "Trafik oranı:", + Language::RU => "Cкорость трафика:", }) } @@ -154,6 +163,7 @@ pub fn relevant_connections_translation(language: Language) -> Text<'static> { Language::RO => "Conexiuni relevante:", Language::KO => "관련 연결:", Language::TR => "İlgili bağlantılar:", + Language::RU => "Относящиеся подключения:", }) } @@ -170,6 +180,7 @@ pub fn settings_translation(language: Language) -> &'static str { Language::RO => "Setări", Language::KO => "설정", Language::TR => "Ayarlar", + Language::RU => "Настройки", } } @@ -186,6 +197,7 @@ pub fn yes_translation(language: Language) -> Text<'static> { Language::RO => "Da", Language::KO => "네", Language::TR => "Evet", + Language::RU => "Да", }) } @@ -202,6 +214,7 @@ pub fn ask_quit_translation(language: Language) -> Text<'static> { 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 => "Вы уверены, что хотите выйти из текущего анализа?", }) } @@ -218,6 +231,7 @@ pub fn quit_analysis_translation(language: Language) -> String { Language::RO => "Renunță la analiză".to_string(), Language::KO => "분석종료".to_string(), Language::TR => "Analizden çık".to_string(), + Language::RU => "Закончить анализ".to_string(), } } @@ -234,6 +248,7 @@ pub fn ask_clear_all_translation(language: Language) -> Text<'static> { Language::RO => "Sigur doriți să ștergeți notificările?", Language::KO => "알림을 삭제하시겠습니까?", Language::TR => "Bildirimleri temizlemek istediğine emin misin?", + Language::RU => "Вы уверены, что хотите удлить все уведомления?", }) } @@ -250,6 +265,7 @@ pub fn clear_all_translation(language: Language) -> String { Language::RO => "Ștergeți tot".to_string(), Language::KO => "모두 지우기".to_string(), Language::TR => "Hepsini temizle".to_string(), + Language::RU => "Очистить всё".to_string(), } } @@ -266,6 +282,7 @@ pub fn hide_translation(language: Language) -> &'static str { Language::RO => "Ascundeți", Language::KO => "숨기기", Language::TR => "Gizle", + Language::RU => "Скрыть", } } @@ -303,7 +320,10 @@ pub fn no_addresses_translation(language: Language, adapter: &str) -> Text<'stat 인터넷이 연결되어있다면 다른 어댑터로 시도해보세요."), 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.") + 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\ + Если Вы уверены, что подключены к Интернету, попробуйте выбрать другой интерфейс."), }) } @@ -341,7 +361,10 @@ pub fn waiting_translation(language: Language, adapter: &str) -> Text<'static> { 인터넷에 연결되어 있고 올바른 어댑터를 선택하셨습니까?"), 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?") + İnternete bağlı olduğunuza ve doğru adaptörü seçtiğinize emin misiniz?"), + Language::RU => format!("Трафик не обнаружен. Ожидаем сетевые пакеты...\n\n\ + Сетевой интерфейс: {adapter}\n\n\ + Вы уверены, что подключены к Интернету и выбрали правильный интерфейс?"), }) } @@ -383,7 +406,10 @@ pub fn some_observed_translation( 일부 패킷이 감지되었지만, 지정한 필터에 따라 선택되지 않았습니다...\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}") + 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}"), }) } @@ -412,6 +438,7 @@ pub fn filtered_packets_translation( format!("필터링된 패킷:\n {filtered} ({percentage} 의 일부)") } Language::TR => format!("Filtrelenen paketler:\n {filtered} toplamın ({percentage})"), + Language::RU => format!("Отфильтровано пакетов:\n {filtered} ({percentage}% от общего числа)"), }) } @@ -440,6 +467,7 @@ pub fn filtered_bytes_translation( format!("필터링된 바이트:\n {filtered} ({percentage} 의 일부)") } Language::TR => format!("Filtrelenen bayt:\n {filtered} toplamın ({percentage})"), + Language::RU => format!("Отфильтровано байт:\n {filtered} ({percentage}% от общего числа)"), }) } @@ -456,6 +484,7 @@ pub fn filtered_application_translation(language: Language) -> Text<'static> { Language::RO => "Pachete filtrate pe protocol de aplicație:", Language::KO => "애플리케이션 프로토콜당 필터링된 패킷 수:", Language::TR => "Uygulama protokolü bazında filtrelenen paketler:", + Language::RU => "Отфильтровано пакетов прикладного протокола:", }) } @@ -482,7 +511,10 @@ pub fn no_favorites_translation(language: Language) -> Text<'static> { 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." + Favorilere bağlantı eklemek için, bağlantı yanındaki yıldız sembolüne tıklayınız.", + Language::RU => "Нечего показать в настоящий момент.\n\ + Для добавления соединения в избранные, нажмите на символ звезды возле соединения." + }) } @@ -532,6 +564,10 @@ pub fn error_translation(language: Language, error: &str) -> Text<'static> { "Bir hata oluştu! \n\n\ {error}" ), + Language::RU => format!( + "Произошла ошибка! \n\n\ + {error}" + ), }) } @@ -548,6 +584,7 @@ pub fn both_translation(language: Language) -> &'static str { Language::RO => "ambele", Language::KO => "둘다", Language::TR => "ikiside", + Language::RU => "оба", } } @@ -559,6 +596,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 => "Все протоколы", // } // } @@ -575,6 +613,7 @@ pub fn all_translation(language: Language) -> &'static str { Language::RO => "Toate", Language::KO => "모두", Language::TR => "Hepsi", + Language::RU => "Всё", } } @@ -591,6 +630,7 @@ pub fn packets_chart_translation(language: Language) -> &'static str { Language::RO => "pachete pe secundă", Language::KO => "초당 패킷", Language::TR => "saniye başı paket", + Language::RU => "пакектов в секунду", } } @@ -607,6 +647,7 @@ pub fn bytes_chart_translation(language: Language) -> &'static str { Language::RO => "octeți pe secundă", Language::KO => "초당 바이트", Language::TR => "saniye başı bayt", + Language::RU => "байтов в секунду", } } @@ -623,6 +664,7 @@ pub fn recent_report_translation(language: Language) -> &'static str { Language::RO => "cea mai recentă", Language::KO => "가장 최근", Language::TR => "en son", + Language::RU => "новейшие", } } @@ -639,6 +681,7 @@ pub fn packets_report_translation(language: Language) -> &'static str { Language::RO => "cele mai multe pachete", Language::KO => "대부분의 패킷", Language::TR => "en çok paket", + Language::RU => "больше всего пакетов", } } @@ -655,6 +698,7 @@ pub fn bytes_report_translation(language: Language) -> &'static str { Language::RO => "cei mai mulți octeți", Language::KO => "대부분의 바이트", Language::TR => "en çok bayt", + Language::RU => "больше всего байт", } } @@ -671,6 +715,7 @@ pub fn favorite_report_translation(language: Language) -> &'static str { Language::RO => "favorite", Language::KO => "즐겨찾기", Language::TR => "favoriler", + Language::RU => "избранное", } } @@ -687,6 +732,7 @@ pub fn notifications_title_translation(language: Language) -> Text<'static> { Language::RO => "Personalizați-vă notificările", Language::KO => "사용자 지정 알림", Language::TR => "Bildirimlerinizi özelleştirin", + Language::RU => "Настройка уведомлений", }) } @@ -703,6 +749,7 @@ pub fn appearance_title_translation(language: Language) -> Text<'static> { Language::RO => "Selectați tema preferată", Language::KO => "태마를 선택하세요", Language::TR => "Favori temanızı seçin", + Language::RU => "Выберите предпочительную тему", }) } @@ -719,6 +766,7 @@ pub fn languages_title_translation(language: Language) -> Text<'static> { Language::RO => "Selectați limba", Language::KO => "언어를 선택하세요", Language::TR => "Dilinizi seçin", + Language::RU => "Выберите язык", }) } @@ -735,6 +783,7 @@ pub fn active_filters_translation(language: Language) -> &'static str { Language::RO => "Filtre active:", Language::KO => "활성화된 필터:", Language::TR => "Aktif filtreler:", + Language::RU => "Выберите фильтры:", } } @@ -751,6 +800,7 @@ pub fn none_translation(language: Language) -> &'static str { Language::RO => "niciunul", Language::KO => "없음", Language::TR => "hiç biri", + Language::RU => "ничего", } } @@ -767,6 +817,7 @@ pub fn yeti_night_translation(language: Language) -> &'static str { Language::RO => "Tema întunecată originală Sniffnet", Language::KO => "Sniffnet의 기본 다크테마", Language::TR => "Sniffnet'in orjinal koyu teması", + Language::RU => "Оригинальная тёмная тема Sniffnet'а", } } @@ -783,6 +834,7 @@ pub fn yeti_day_translation(language: Language) -> &'static str { Language::RO => "Tema deschisă originală Sniffnet", Language::KO => "Sniffnet의 기본 라이트테마", Language::TR => "Sniffnet'in orjinal açık teması", + Language::RU => "Оригинальная светая тема Sniffnet'а", } } @@ -799,6 +851,7 @@ pub fn deep_sea_translation(language: Language) -> &'static str { Language::RO => "Pentru a vă scufunda în traficul de rețea", Language::KO => "네트워크 트레픽으로 바로가기", Language::TR => "Ağ trafiğine dalmak", + Language::RU => "Анализировать сетевой трафик", } } @@ -815,6 +868,7 @@ pub fn mon_amour_translation(language: Language) -> &'static str { Language::RO => "O temă minunată creată pentru visători", Language::KO => "사랑스러운 몽환가들을 위한 테마", Language::TR => "Hayal perestler için yapılmış güzel tema", + Language::RU => "Милая тема для мечтателей", } } @@ -831,6 +885,7 @@ pub fn incoming_translation(language: Language) -> &'static str { Language::RO => "de intrare", Language::KO => "수신중", Language::TR => "Gelen", + Language::RU => "Входящий", } } @@ -847,6 +902,7 @@ pub fn outgoing_translation(language: Language) -> &'static str { Language::RO => "de ieșire", Language::KO => "발신중", Language::TR => "Giden", + Language::RU => "Исходящий", } } @@ -862,6 +918,7 @@ pub fn notifications_translation(language: Language) -> &'static str { Language::RO => "Notificări", Language::KO => "알림", Language::TR => "Bildirimler", + Language::RU => "Уведомления", } } @@ -875,6 +932,7 @@ pub fn style_translation(language: Language) -> &'static str { Language::UK => "Стиль", Language::ZH => "主题", Language::KO => "스타일", + Language::RU => "Стиль", } } @@ -891,6 +949,7 @@ pub fn language_translation(language: Language) -> &'static str { Language::RO => "Limbă", Language::KO => "언어", Language::TR => "Dil", + Language::RU => "Язык", } } @@ -907,6 +966,7 @@ pub fn overview_translation(language: Language) -> &'static str { Language::RO => "Prezentare generală", Language::KO => "개요", Language::TR => "Ön izleme", + Language::RU => "Обзор", } } @@ -918,6 +978,7 @@ pub fn overview_translation(language: Language) -> &'static str { // Language::ES => "Inspeccionar", // Language::PL => "Sprawdź", // Language::DE => "Überprüfen", +// Language::RU => "Инспектировать", // } // } @@ -934,6 +995,7 @@ pub fn packets_threshold_translation(language: Language) -> &'static str { 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 => "Уведомить, когда порог по частоте пакетов превышен", } } @@ -950,6 +1012,7 @@ pub fn bytes_threshold_translation(language: Language) -> &'static str { 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 => "Уведомить, когда порог по полосе в байтах превышен", } } @@ -966,6 +1029,7 @@ pub fn per_second_translation(language: Language) -> &'static str { Language::RO => "(pe secundă)", Language::KO => "(초당)", Language::TR => "(her saniye)", + Language::RU => "(в секунду)", } } @@ -982,6 +1046,7 @@ pub fn specify_multiples_translation(language: Language) -> &'static str { 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'", } } @@ -1000,6 +1065,7 @@ pub fn favorite_notification_translation(language: Language) -> &'static str { 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 => "Уведомить, если произошёл обмен данными в соединениях из избранного", } } @@ -1016,6 +1082,7 @@ pub fn threshold_translation(language: Language) -> String { Language::RO => "Prag: ".to_string(), Language::KO => "임계값: ".to_string(), Language::TR => "Eşik: ".to_string(), + Language::RU => "Порог: ".to_string(), } } @@ -1030,6 +1097,7 @@ pub fn volume_translation(language: Language, value: u8) -> String { Language::RO => format!("Volum: {value:^3}%"), Language::KO => format!("볼륨: {value:^3}%"), Language::TR => format!("Ses: {value:^3}%"), + Language::RU => format!("Объём: {value:^3}%"), } } @@ -1046,6 +1114,7 @@ pub fn sound_translation(language: Language) -> &'static str { Language::RO => "Sunet:", Language::KO => "사운드:", Language::TR => "Ses:", + Language::RU => "Звук:", } } @@ -1062,6 +1131,7 @@ pub fn open_report_translation(language: Language) -> &'static str { Language::RO => "Deschideți raport complet", Language::KO => "전체 보고서 열기", Language::TR => "Tam raporu aç", + Language::RU => "Открыть полный отчёт", } } @@ -1078,6 +1148,7 @@ pub fn bytes_exceeded_translation(language: Language) -> &'static str { Language::RO => "Prag de octeți depășit!", Language::KO => "바이트 임계값 초과!", Language::TR => "Bayt eşik değeri aşıldı!", + Language::RU => "Порог в байтах превышен!", } } @@ -1095,6 +1166,7 @@ pub fn bytes_exceeded_value_translation(language: Language, value: &str) -> Stri 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} байт обмена информацией"), } } @@ -1111,6 +1183,7 @@ pub fn packets_exceeded_translation(language: Language) -> &'static str { Language::RO => "Prag de pachete depășit!", Language::KO => "패킷 임계값 초과!", Language::TR => "Paket eşik değeri aşıldı!", + Language::RU => "Порог по числу пакетов превышен!", } } @@ -1130,6 +1203,7 @@ pub fn packets_exceeded_value_translation(language: Language, value: u32) -> Str Language::RO => format!("au fost transferate {value} pachete"), Language::KO => format!("패킷 {value} 가 교환되었습니다"), Language::TR => format!("{value} paket aktarıldı"), + Language::RU => format!("{value} пакет(ов) обмена информацией"), } } @@ -1146,6 +1220,7 @@ pub fn favorite_transmitted_translation(language: Language) -> &'static str { Language::RO => "Date noi transferate de la favorite!", Language::KO => "즐겨찾기에서 새 데이터 교환", Language::TR => "Favorilerden yeni veri aktarıldı!", + Language::RU => "Новый обмен данными в избранных соедиениях!", } } @@ -1183,7 +1258,10 @@ pub fn no_notifications_set_translation(language: Language) -> Text<'static> { 설정에서 알림을 활성화할 수 있습니다:", 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:" + Bildirimleri, ayarlardan etkinleştirebilirsin:", + Language::RU => "Уведомления пока не настроены!\n\n\ + После настройки, эта страница будет показывать журнал уведомлений\n\n\ + Вы можете включить уведомления в настройках:", }) } @@ -1233,6 +1311,10 @@ pub fn no_notifications_received_translation(language: Language) -> Text<'static "Şu an görecek bir şey yok...\n\n\ Bildirim aldığınız zaman burada gözükecektir" } + Language::RU => { + "Нечего показывать в текущий момент...\n\n\ + Когда прийдут уведомления, они будут показаны тут" + } }) } @@ -1249,5 +1331,6 @@ pub fn only_last_30_translation(language: Language) -> &'static str { 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 уведомлений", } } diff --git a/src/translations/translations_2.rs b/src/translations/translations_2.rs index 942a24c2..88b36a60 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", } } diff --git a/src/translations/types/language.rs b/src/translations/types/language.rs index 838f76a2..03af7a6c 100644 --- a/src/translations/types/language.rs +++ b/src/translations/types/language.rs @@ -25,6 +25,8 @@ pub enum Language { KO, /// Turkish TR, + /// Russian + RU } impl Default for Language { @@ -36,7 +38,7 @@ impl Default for Language { impl Language { pub(crate) const COL1: [Language; 4] = [Language::EN, Language::FR, Language::PL, Language::UK]; pub(crate) const COL2: [Language; 4] = [Language::DE, Language::IT, Language::RO, Language::ZH]; - pub(crate) const COL3: [Language; 3] = [Language::ES, Language::KO, Language::TR]; + pub(crate) const COL3: [Language; 4] = [Language::ES, Language::KO, Language::TR, Language::RU]; pub fn get_radio_label(&self) -> &str { match self { @@ -51,6 +53,7 @@ impl Language { Language::RO => "Română", Language::KO => "한국인", Language::TR => "Türkçe", + Language::RU => "Русский", } } } From 4f5de1b7ead948c0ee696936ecc93e741f28ef90 Mon Sep 17 00:00:00 2001 From: Jauder Ho Date: Thu, 13 Apr 2023 09:18:45 -0700 Subject: [PATCH 15/31] Update dependabot.yml Make Dependabot issue pull requests to update Actions as needed. --- .github/dependabot.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index e349c0f5..03db2cb3 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -5,6 +5,11 @@ version: 2 updates: +- package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "daily" + - package-ecosystem: cargo directory: "/" schedule: From 1de333f926c9c0fdf3631653433e10ec2e4390ba Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Apr 2023 17:09:09 +0000 Subject: [PATCH 16/31] Bump h2 from 0.3.16 to 0.3.17 Bumps [h2](https://github.com/hyperium/h2) from 0.3.16 to 0.3.17. - [Release notes](https://github.com/hyperium/h2/releases) - [Changelog](https://github.com/hyperium/h2/blob/master/CHANGELOG.md) - [Commits](https://github.com/hyperium/h2/compare/v0.3.16...v0.3.17) --- updated-dependencies: - dependency-name: h2 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 189c8e37..738eb6c0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1291,9 +1291,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", From fd20ed0ed5335cdee6cacd5526a442dafab9f64c Mon Sep 17 00:00:00 2001 From: Giuliano Bellini s294739 Date: Thu, 13 Apr 2023 21:54:54 +0200 Subject: [PATCH 17/31] update plotters_iced and fix adapter radios --- Cargo.lock | 94 ++++++++--------------------------- Cargo.toml | 2 +- src/gui/pages/initial_page.rs | 2 +- src/gui/styles/text_input.rs | 2 +- 4 files changed, 24 insertions(+), 76 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9b711e52..f7fb5580 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1518,28 +1518,17 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "efbddf356d01e9d41cd394a9d04d62bfd89650a30f12fda5839cabb8c4591c88" dependencies = [ - "iced_core 0.9.0", + "iced_core", "iced_futures", "iced_glow", - "iced_graphics 0.8.0", - "iced_native 0.10.1", + "iced_graphics", + "iced_native", "iced_wgpu", "iced_winit", "image", "thiserror", ] -[[package]] -name = "iced_core" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a571e43a4dea90e3a7a9f8bb40e4238d0847f9f9d862c87a6719e3e241dd6292" -dependencies = [ - "bitflags", - "instant", - "palette", -] - [[package]] name = "iced_core" version = "0.9.0" @@ -1575,28 +1564,11 @@ dependencies = [ "glow 0.11.2", "glow_glyph", "glyph_brush", - "iced_graphics 0.8.0", - "iced_native 0.10.1", + "iced_graphics", + "iced_native", "log", ] -[[package]] -name = "iced_graphics" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d58ad90b769e97bd245946b03c4932f82841c8645a7cee47d99115c8b341e8aa" -dependencies = [ - "bitflags", - "bytemuck", - "glam", - "iced_native 0.9.1", - "iced_style 0.7.0", - "log", - "lyon", - "raw-window-handle 0.5.0", - "thiserror", -] - [[package]] name = "iced_graphics" version = "0.8.0" @@ -1606,11 +1578,12 @@ dependencies = [ "bitflags", "bytemuck", "glam", - "iced_native 0.10.1", - "iced_style 0.8.0", + "iced_native", + "iced_style", "image", "kamadak-exif", "log", + "lyon", "raw-window-handle 0.5.0", "thiserror", ] @@ -1621,57 +1594,32 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6fac760b5a21438da841b74dde5f59ab8391bc65a7f9a411f311ed814a8e8ec" dependencies = [ - "iced_native 0.10.1", + "iced_native", "ouroboros", ] -[[package]] -name = "iced_native" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9942cdcd78591e816aae558721942aa366b03ed7f3f964b51de23c68ec78be7" -dependencies = [ - "iced_core 0.8.0", - "iced_futures", - "iced_style 0.7.0", - "num-traits", - "twox-hash", - "unicode-segmentation", -] - [[package]] name = "iced_native" version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b3dd42731b43f1ee0a028af35abefbb756956d093552d0f92f678628e6384fe" dependencies = [ - "iced_core 0.9.0", + "iced_core", "iced_futures", - "iced_style 0.8.0", + "iced_style", "num-traits", "thiserror", "twox-hash", "unicode-segmentation", ] -[[package]] -name = "iced_style" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad5eb9547d32b9ff9b019526657974112b86baab58b2b91b1624316b309700b6" -dependencies = [ - "iced_core 0.8.0", - "once_cell", - "palette", -] - [[package]] name = "iced_style" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e37333dc2991201140302cd0d4cea051bd37ca3671d5008ec85df86d232ff30" dependencies = [ - "iced_core 0.9.0", + "iced_core", "once_cell", "palette", ] @@ -1689,8 +1637,8 @@ dependencies = [ "glam", "glyph_brush", "guillotiere", - "iced_graphics 0.8.0", - "iced_native 0.10.1", + "iced_graphics", + "iced_native", "log", "raw-window-handle 0.5.0", "wgpu", @@ -1704,8 +1652,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a59ea3a85149a6a1f9e92b6c740ce90f04e5c7d848cfd05742336863fceb955" dependencies = [ "iced_futures", - "iced_graphics 0.8.0", - "iced_native 0.10.1", + "iced_graphics", + "iced_native", "log", "thiserror", "web-sys", @@ -2740,12 +2688,12 @@ 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 0.7.0", - "iced_native 0.9.1", + "iced_graphics", + "iced_native", "plotters", "plotters-backend", ] @@ -3314,7 +3262,7 @@ dependencies = [ "etherparse", "iced", "iced_lazy", - "iced_native 0.10.1", + "iced_native", "indexmap", "maxminddb", "pcap", diff --git a/Cargo.toml b/Cargo.toml index b29c3f6d..a5ecfab4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -34,7 +34,7 @@ plotters = { version = "0.3.4", default_features = false, features = ["area_seri iced = { version = "0.9.0", features = ["tokio", "image"] } iced_native = "0.10.1" iced_lazy = "0.6.0" -plotters-iced = "0.7.0" +plotters-iced = "0.8.0" maxminddb = "0.23.0" confy = "0.5.1" serde = { version = "1.0.160", default_features = false, features = ["derive"] } diff --git a/src/gui/pages/initial_page.rs b/src/gui/pages/initial_page.rs index 3ae46c4f..85e494a1 100644 --- a/src/gui/pages/initial_page.rs +++ b/src/gui/pages/initial_page.rs @@ -186,7 +186,7 @@ fn get_col_adapter(sniffer: &Sniffer, font: Font) -> Column { let name = &adapter.0; scroll_adapters.push( Container::new( - Radio::new(name, &adapter.1, Some(&sniffer.device.name), |name| { + Radio::new(&adapter.1, name, Some(&sniffer.device.name), |name| { Message::AdapterSelection(name.to_string()) }) .font(font) diff --git a/src/gui/styles/text_input.rs b/src/gui/styles/text_input.rs index e08630bb..04e278b4 100644 --- a/src/gui/styles/text_input.rs +++ b/src/gui/styles/text_input.rs @@ -73,7 +73,7 @@ impl iced::widget::text_input::StyleSheet for StyleTuple { text_input::StyleSheet::active(self, style) } - fn disabled_color(&self, style: &Self::Style) -> Color { + fn disabled_color(&self, _style: &Self::Style) -> Color { Color::BLACK } } From 700247d7f3bc66f40d60db1f564b8a0f5b9fb1ec Mon Sep 17 00:00:00 2001 From: Giuliano Bellini s294739 Date: Fri, 14 Apr 2023 09:37:19 +0200 Subject: [PATCH 18/31] update slider style and fixed platform specific settings error --- Cargo.toml | 2 +- src/gui/styles/slider.rs | 12 ++++++------ src/main.rs | 8 ++------ 3 files changed, 9 insertions(+), 13 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index a5ecfab4..f1005f01 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -33,7 +33,7 @@ indexmap = "1.9.3" plotters = { version = "0.3.4", default_features = false, features = ["area_series"] } iced = { version = "0.9.0", features = ["tokio", "image"] } iced_native = "0.10.1" -iced_lazy = "0.6.0" +iced_lazy = "0.6.1" plotters-iced = "0.8.0" maxminddb = "0.23.0" confy = "0.5.1" diff --git a/src/gui/styles/slider.rs b/src/gui/styles/slider.rs index cbaf1f60..1025e979 100644 --- a/src/gui/styles/slider.rs +++ b/src/gui/styles/slider.rs @@ -21,8 +21,8 @@ impl iced::widget::slider::StyleSheet for StyleTuple { let colors = get_colors(self.0); Appearance { rail: Rail { - colors: (colors.secondary, colors.primary), - width: 0.0, + colors: (colors.secondary, colors.buttons), + width: 3.0, }, handle: Handle { shape: HandleShape::Circle { radius: 7.0 }, @@ -37,8 +37,8 @@ impl iced::widget::slider::StyleSheet for StyleTuple { let colors = get_colors(self.0); Appearance { rail: Rail { - colors: (colors.secondary, colors.secondary), - width: 0.0, + colors: (colors.secondary, colors.buttons), + width: 3.0, }, handle: Handle { shape: HandleShape::Circle { radius: 7.0 }, @@ -53,8 +53,8 @@ impl iced::widget::slider::StyleSheet for StyleTuple { let colors = get_colors(self.0); Appearance { rail: Rail { - colors: (colors.secondary, colors.secondary), - width: 0.0, + colors: (colors.secondary, colors.buttons), + width: 3.0, }, handle: Handle { shape: HandleShape::Circle { radius: 7.0 }, diff --git a/src/main.rs b/src/main.rs index 32f3d5fd..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,11 +106,7 @@ pub fn main() -> iced::Result { transparent: false, always_on_top: false, icon: None, - platform_specific: iced::window::PlatformSpecific { - title_hidden: true, - titlebar_transparent: true, - fullsize_content_view: true, - }, + platform_specific: PlatformSpecific::default(), }, flags: Sniffer::new( current_capture_id1, From 056f85cfd4b9aa7d63bf52f4cd7a937340f60da3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 14 Apr 2023 07:54:29 +0000 Subject: [PATCH 19/31] Bump iced_lazy from 0.5.0 to 0.6.1 Bumps [iced_lazy](https://github.com/iced-rs/iced) from 0.5.0 to 0.6.1. - [Release notes](https://github.com/iced-rs/iced/releases) - [Changelog](https://github.com/iced-rs/iced/blob/master/CHANGELOG.md) - [Commits](https://github.com/iced-rs/iced/commits) --- updated-dependencies: - dependency-name: iced_lazy dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 16fa06f5..4ce11d6d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1590,9 +1590,9 @@ dependencies = [ [[package]] name = "iced_lazy" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6fac760b5a21438da841b74dde5f59ab8391bc65a7f9a411f311ed814a8e8ec" +checksum = "bdf1cb6b8cd90488d3a03fbf438ad42038cb83c81a0d61f3692c51875efdb818" dependencies = [ "iced_native", "ouroboros", From a6bab7dd119538f9863583a92cc6d83d41cd8fee Mon Sep 17 00:00:00 2001 From: Giuliano Bellini <100347457+GyulyVGC@users.noreply.github.com> Date: Fri, 14 Apr 2023 10:32:49 +0200 Subject: [PATCH 20/31] Update dependabot.yml --- .github/dependabot.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 03db2cb3..74d83c9d 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -5,11 +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: From fe96249cb60906dec5e3e0dbb3782862ed476f83 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 14 Apr 2023 08:53:28 +0000 Subject: [PATCH 21/31] Bump actions/checkout from 2 to 3 Bumps [actions/checkout](https://github.com/actions/checkout) from 2 to 3. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v2...v3) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/rust.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 From 03d955ffae09c8b93e67315d12d748f555762dcd Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 14 Apr 2023 11:02:08 +0200 Subject: [PATCH 22/31] docs: add jauderho as a contributor for infra (#150) * docs: update CONTRIBUTORS.md [skip ci] * docs: update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ CONTRIBUTORS.md | 1 + 2 files changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 998cbeaa..7f37cd1c 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -115,6 +115,15 @@ "contributions": [ "translation" ] + }, + { + "login": "jauderho", + "name": "Jauder Ho", + "avatar_url": "https://avatars.githubusercontent.com/u/13562?v=4", + "profile": "https://github.com/jauderho", + "contributions": [ + "infra" + ] } ], "contributorsPerLine": 7, diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 97c4cc6e..d67792c4 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -20,6 +20,7 @@ A big shout-out to all the contributors of Sniffnet ([emoji key](https://allcont ervinpopescu
ervinpopescu

🌍 Limdongju
Limdongju

🌍 Hüseyin Fahri Uzun
Hüseyin Fahri Uzun

🌍 + Jauder Ho
Jauder Ho

🚇 From 98582e161842f07ae853e2f9fa9f163076880876 Mon Sep 17 00:00:00 2001 From: Giuliano Bellini s294739 Date: Fri, 14 Apr 2023 18:41:22 +0200 Subject: [PATCH 23/31] updated layout of BorderedRound buttons --- src/gui/pages/initial_page.rs | 40 +++++++++++++--------------- src/gui/pages/settings_style_page.rs | 12 ++++++++- src/gui/styles/button.rs | 15 ++++++++--- src/gui/styles/types/element_type.rs | 1 + src/gui/styles/types/style_type.rs | 2 +- 5 files changed, 43 insertions(+), 27 deletions(-) diff --git a/src/gui/pages/initial_page.rs b/src/gui/pages/initial_page.rs index 85e494a1..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(&adapter.1, name, 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_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/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/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/styles/types/style_type.rs b/src/gui/styles/types/style_type.rs index 37cc2256..5d46a48b 100644 --- a/src/gui/styles/types/style_type.rs +++ b/src/gui/styles/types/style_type.rs @@ -1,7 +1,7 @@ use serde::{Deserialize, Serialize}; /// Used to specify the kind of style of the application -#[derive(Clone, Copy, Serialize, Deserialize, Debug, Hash)] +#[derive(Clone, Copy, Serialize, Deserialize, Debug, Hash, PartialEq)] pub enum StyleType { Night, Day, From b248fcc7fd71c730cab3d2aeadeff66ca63d7b15 Mon Sep 17 00:00:00 2001 From: Giuliano Bellini s294739 Date: Sat, 15 Apr 2023 10:45:25 +0200 Subject: [PATCH 24/31] minor improvements to slider and scrollbar stylesheets --- src/gui/pages/settings_notifications_page.rs | 4 ++-- src/gui/styles/scrollbar.rs | 8 ++++++-- src/gui/styles/slider.rs | 11 ++++++----- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/gui/pages/settings_notifications_page.rs b/src/gui/pages/settings_notifications_page.rs index da3c7570..c26a182c 100644 --- a/src/gui/pages/settings_notifications_page.rs +++ b/src/gui/pages/settings_notifications_page.rs @@ -425,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/styles/scrollbar.rs b/src/gui/styles/scrollbar.rs index 8dc3a09a..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, _is_mouse_over_scrollbar: bool) -> 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 1025e979..5bffcf80 100644 --- a/src/gui/styles/slider.rs +++ b/src/gui/styles/slider.rs @@ -6,6 +6,7 @@ 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 { @@ -25,7 +26,7 @@ impl iced::widget::slider::StyleSheet for StyleTuple { 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, @@ -41,8 +42,8 @@ impl iced::widget::slider::StyleSheet for StyleTuple { 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, }, @@ -57,8 +58,8 @@ impl iced::widget::slider::StyleSheet for StyleTuple { 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, }, From b30592e4259010782d093a7ba4026bd1da73cb80 Mon Sep 17 00:00:00 2001 From: George Shuklin Date: Sat, 15 Apr 2023 11:58:51 +0300 Subject: [PATCH 25/31] fix: minor context changes to RU localization --- src/translations/translations.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/translations/translations.rs b/src/translations/translations.rs index 9a1dc1ce..5b540bc6 100644 --- a/src/translations/translations.rs +++ b/src/translations/translations.rs @@ -163,7 +163,7 @@ pub fn relevant_connections_translation(language: Language) -> Text<'static> { Language::RO => "Conexiuni relevante:", Language::KO => "관련 연결:", Language::TR => "İlgili bağlantılar:", - Language::RU => "Относящиеся подключения:", + Language::RU => "Важные подключения:", }) } @@ -783,7 +783,7 @@ pub fn active_filters_translation(language: Language) -> &'static str { Language::RO => "Filtre active:", Language::KO => "활성화된 필터:", Language::TR => "Aktif filtreler:", - Language::RU => "Выберите фильтры:", + Language::RU => "Выбранные фильтры:", } } @@ -800,7 +800,7 @@ pub fn none_translation(language: Language) -> &'static str { Language::RO => "niciunul", Language::KO => "없음", Language::TR => "hiç biri", - Language::RU => "ничего", + Language::RU => "не выбран", } } @@ -851,7 +851,7 @@ pub fn deep_sea_translation(language: Language) -> &'static str { Language::RO => "Pentru a vă scufunda în traficul de rețea", Language::KO => "네트워크 트레픽으로 바로가기", Language::TR => "Ağ trafiğine dalmak", - Language::RU => "Анализировать сетевой трафик", + Language::RU => "Для погружения в сетевой трафик", } } @@ -1331,6 +1331,6 @@ pub fn only_last_30_translation(language: Language) -> &'static str { 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::RU => "Тут показываются только последние 30 уведомлений", } } From 118abcc50639e0a3873d4f2c925b2a3feea2f5e0 Mon Sep 17 00:00:00 2001 From: Giuliano Bellini s294739 Date: Sat, 15 Apr 2023 11:18:05 +0200 Subject: [PATCH 26/31] added russian characters and flag, fixed lints --- resources/fonts/full/subset_characters.txt | 8 ++++++++ .../subset/sarasa-mono-sc-bold.subset.ttf | Bin 104164 -> 105012 bytes .../subset/sarasa-mono-sc-regular.subset.ttf | Bin 105436 -> 106288 bytes src/translations/translations.rs | 14 ++++++++------ src/translations/types/language.rs | 8 ++++---- src/utils/countries.rs | 1 + 6 files changed, 21 insertions(+), 10 deletions(-) diff --git a/resources/fonts/full/subset_characters.txt b/resources/fonts/full/subset_characters.txt index 1ab39be1..f0e11ab9 100644 --- a/resources/fonts/full/subset_characters.txt +++ b/resources/fonts/full/subset_characters.txt @@ -138,16 +138,20 @@ z В Г Д +Е З +И К Л М Н О П +Р С Т У +Ф Ч Ш Щ @@ -178,9 +182,13 @@ z ч ш щ +ъ +ы ь +э ю я +ё є і ї diff --git a/resources/fonts/subset/sarasa-mono-sc-bold.subset.ttf b/resources/fonts/subset/sarasa-mono-sc-bold.subset.ttf index e6a27ac3fec706d4e59dbf43e2131c35c462f3bb..ffc5918123304a55d4c7d1797749e654a7568448 100644 GIT binary patch delta 6447 zcmZ`-2UrwW*S`1c0*iE5Se9k!3P=+vN>M;1qM<3pE?^}p(u;~L3L*+3eJBFEEX7XI zxN1ynF&Z_Z@iUrY$roGHm{?*9n*Yoo#QgvB?>u+ro^#*xo^#u|GkbfF`u_duGC~O< z`gr3LGI>()M;g(B@Lx6#** zgcuRJ;2^fg$3{$_%uB@@t?I|SU|~{1ic8(KUkF`jN{IG}r7Kn~@r>I(3jx}MMi?e8 zPLM4cq1bCpXly7NcqgJpYoq2nB&qltvPlUkJl;re`zb_FF?9fHFJq!5-VMY={8}w1O z%SzJC$a%fsnTXJ8?7#Z3ecCkE9(b^Ck;8uk`hWjTCSt6I;HD7B2tumHx_=YoH=rR# zgrpmI7zlMi!^p$H*1&T-jN$nugN7FWVDi8NZod1$HaIxg7X02?(-Bw&BYmdw}x_l`WTJZg7)o~xYnMnXTCb|MO zO4S6qCYc`!IuNaA=`_kiyhZFW%E?kM`hSVL=|)`>vDi#!i;kICY@+)wVV{l1LOxaP zD;m?slbK*Jmq0*-#G37os~jczL>l6E)tL`g4G>(+H`7hK7N3 zgp;wBP?OKs6lw*~?eT{NCf4>&CMHhy)+T~@J!6r!w#Znoj1V5NNA_=!okvWtyCeaJ z(c0ic50n0JL6@Zc9f@==XgHbTO4&={@bdT{+0n|5^uNRB7s0O+|65{X=3N%A*PfX+L-GYSvv@| z+FfW2&pBt}E7Y=WCf@u(pmaB1&;SgjNnNB9Y5T8)MCQU6Djr$IL`)vW`TgPk{Jw zkqK01+$p0&^O^VnI)<)e>H?@W&14P-&>otpS`kPk6vg5oYKh|ZAexDy%3>mYp$R;` z$|Q`=pfU^70@HTWqoxl{pPBw8=83h$Mq-KBRywb|h@Y6*o4J{7HT%)*fy6)} zmiS8)k`s~(lDp>G=I-Xf=3(Y><~z-M%}<)2la7!ENMogIrB%`{=?x1*ivWvqiyM}@ zmS&dAEwe2PEajGOt-P()S(RBGv$|nzW4+S)sLc9?jnHP1&1Rcxw)1VvZJ*hVv|DJW zwEJUt%J913XGR!|2pW+(qR-yPzRLcN!y<>z9CaLLIes;A_{fBjpF8O|t#Nwf9Ozu{ z{F{rv%OaO@mshSyu0ObqaXUE5Wt4o>33rLR!u{%KqtVkx@AuI0nC7w7)7i7Y^Nm-o z*AZ_&?^JKug)xp}y2p~Skz>1j)O{4b4!+gCFZ@RPt@ZoKU(Y|x|M)n!aofjdkG~g? zAE*=97DR#~gKkflJK@^Igo#fk#RWs~s^GgH^-PYO{3ygPq$uR4DI=!rn5sE-?bOR3 z8-6_d^i!q-UA;vct=DmTy>oVa4(!gQW8--B%u8 zc_-O8IX-z)@}cCHDb^_&DYC|t%c(SVci>( zEhjrio^vJV?JCz*F{?^fU0C&awPh#rBtIw@|zQ$zDq&3-V>elqFc`D15=1$Aa z%5BZ{+Q_X;SH~(m%JjZ;9Jdz2$1zh_VG`b!GRr zI&EFBwPx$Zt*^@c%a@ebl%FeqQ8A)oa>e3``ict`uPddM(<(Pqo~Tl*npV|P^|acj zdSmquH6AskHNVxm*GAN?s6EU$Fw>dY%mQW^lg89C&+F{!M%9JXMb<5a?$>&K zS^doV_WGY2Bn`_NR1IG@3K|m{a~qFu)7xgft!&%%CdVe`Dyt@`8D}1`F;5x z3aZdl7%0RFYlWl2UE!k$Qp72iDsmOFLPe>fTCq*hrBEr3Do!i<6jv2D755asw@O=w zw~lZ9sC8~@a_jom&8?NK4Xv%MJ6n5O54WCZJ==P<^-=3Vzj?X$yc3kVY)A72Kc4~GSbc#EzJH0xmbY^vK!q)}%P00YZUJsNB;`IFgBznC2 zs3AA+oXlXKw{+XQ`nBGwBBE$9s7=Jw?#_&grIrR$vFd@v?R~Li`eW!Cu?dRySp2Z~ zysul}(?gXXOFh)7iK=@p{Q@wtGAVI1UDSr>B^!b{;cFM;F=_$$ibXA$H*s{Fo-yB) zZ^w7!NARcdqxmzKl?$nlsvw@;05yBQ8-JQ=*+Oc}lWpuT>M!h<_2>2H_OH3F{(Wli z)!xs0yL*+rOMB<`M)!vHI``W3N_+KsHGBT*x!!ZFXJ1cePe;$%p4c8~_sOpGuFYM! zU4p&u_Fmb0Xm8@)_`Uo+pY7STr+$zB9?L!EdtmpQ-S>9i-hFnr+pg6+yLOuGc(UWc zjvqT8cmC4Z*cl~jKhxgSUejLOp44v9cCKB}c3bI%(_hm%QgKbusfd+7lW&wSmyd6; zX@1`P-{y+u@MibsQBBvHzG-5bYPSg*`x?(TMmJV8^f$a}3~jV)G;Y*r__Cq9A*3O& z!K%Ts{$YJj{p7kG%!OLFn%`?SRPV3;xZ1p0R4uI5tGZn!n^C!{63RQanr``_&zG7X)da_QE_c|{v@9~<}>?hf~vhHMF z&ODuYFtatYGP5+ZB(pFhB>h$D!_?!chf=#!ccylvZb&Um%}ZUGx-4Z}vRU$x73s_C zmlrK}T27W#e6k_&Pg!C@;+qAgF;y{zF$FQJV?;5=F*?z2qMt=SivB+Oi)dxEJbGHR zSJbYk?NOOgvm*;4QzM!pOd{07Z-;*!{%LqucuROtxO>>|VcWv$!)n9I!V<$0LT`j# z4J{2#ojPHv>r{s+SEd}E(lTY+lutt5gd~T=hfE6z53vl<577=$50UXg$mDsGM@}~R zXj|~{;Ln1igN-NMo%GA3Ta)HZnjPd3Bo0ywJRNu{@I>H&!0y0`!1aM~fuRB41)L5D z4e$>z2{7{S_TS~d)4#>P&Og|Hg1?u)r@xE8A)ag6{?zY=-&Ma9zqx*~eo=n@ermoC zeEWRQ_#XE?;M?e1=Ud}jw!pW5p65KPJsd}0a6jsv>7L|1-JOiOGpf>UjhnV>lgke-9xl$#{mw6(e{sI$eBJqq z^EqdKr{A0&I^B0_;`yoKKcUt2$q(UY@mu*1)S}hyt7mDbYs}ZUD@fEFt$9H6yyl}}x3nU) zztt7!>l=Jz5O0uWP;T&@A>Yu#(9gBL_-Y3 z!VH)RvtTyNfw?db=A)f4*+xEAkRH-Y_K{D?0iq%Y$sux>93fwjt5y zKsuzWUZv3_%FBQ(CNYCf5obUqWFh5jOmTo89%Bg)I305~gIekhHV-OaWzYo9cy1<@ z8M8Ay3JodI#aS-ECncAeKQgJceJv+wammvV>-Z&#cR~VKJqHD%h2XJSbd1M(D1;5L z2{uCw)I$TbfE*231J;x+1BPlCq8^bDE68M8vuJ>H5A20*=!JdQz(eC2>;w{^hZbmO z-epmVWQY+y1XEBTz%!c$Nmw<@fOCutoO5h!g*F6~XHzjU3@HBr@`nIlX44qIAs1ZG zfS*@(7%-j_WCF6XMGc0!$Vnwo23w&Ds+s5FqJuU)|f8nK@6W&z<&6Y z8$lsztgtv>8DJe~AHV{OV{BH@X_{RK0M?MnT}8#3JAhSC6q{GkF_V!J!{S3Jl%ld6 z%JJR_oty>Rf)eMB9eEbV0E4U@#hUq$KY(Or=22_Sb(|q< za%>%SQtip352)rz_!2Q+!D&XGPseZ~aN@0ex<~IMoa9=+Vmm~1nfZBCqWL9favDyn zkcUTU4)f)D8WeW%{fvEw>yw=+cFrQO#uf@WL=9zj@AI$)a3Pwb%x*-s@ZdA}94>OT z95@EYndt@8jjm$W7tkPjh5538+N1QS0Jl*tEf|C5yrO01piEu$%)t z90Nc<^rOsfb|B2D5-QZ-{6Rk(kx2HKgR`H?0DaJhq>o`xHyDsUx~2oI|8GDxEDzcb z^1vVu%Zb-N`j_w$<$-`qn6FBxkp|}wUUCt+jOXy}enShp+*z+dnelUG9L$T%+e3mXTP9uRF@HmgYtWGZ2e2U;oQ z0#3&u77ij+F0B1P(}9{i82H1HUCQiq0dN}<>rz~BL)N&WhRHBf6>#ae2sYxj+=S9* zgrE`TYc}~xi3J*2k;{PpP!2lAouLIKs4ImnTy87JRb0ttIK*giwmKL(Yj4gu#T5R5 zwKFlo+*^wYM^?w30FAitn{e6VNq~u1$!2Rz$)Cc0G&1@>bX-7qkPRhbHhFUNY;Vsa zegScX4m{X8VLRe>z)si&yCDm*G4*%j$*>O(fi~y?r8m0j;+*xOJGN;**Vur8)T4tI z1a;woAV-pVq+>NZppz-xLM5`HBo8Gx5NwJsXNLem%==!k{b3ImC40QEQF5nJ7dq-; z42kYa=% zfzO9DtgCL6xC4C1%>qOng=7ChDLItIkPdJK@Zbb+x%j=M*1%dl#pUAeGAfpxfv?d5 zaOOX>6cP={f%EVUT!6E1j>mprX_QZB0wcG?hQ?1PKAPrilA@E^pgPv4rp8D*PyeAGpPas~oPuPYBh;i(9~4B4*R_`y>o!xCA{& z#fEqtF*o2Q+=8Fszg&oHM+U9gbUuh?choPKnFkW&KV6lvSy2t{z+Jcp_u(D_*jE^B zmIQ8mK*09#S9kyq;St^+VT<|z3IoS<{s9uVDEx-W>v#AAbIDV94u8Tk_yZBc(1INo zOKxQP*zuD6%hZ(!G5x=USMVC%V8ZE#cknm7MfnYn;t4k(afC=Go@y-Y<=|rtWnn>gEN+erU Uvn#0?PnA|fBPb=zv07^PKZ=e;p#T5? delta 5471 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 XZy60&N$aQqPjz%VolBWvjnw>qP?o%& diff --git a/src/translations/translations.rs b/src/translations/translations.rs index 5b540bc6..aae86a24 100644 --- a/src/translations/translations.rs +++ b/src/translations/translations.rs @@ -438,7 +438,9 @@ pub fn filtered_packets_translation( format!("필터링된 패킷:\n {filtered} ({percentage} 의 일부)") } Language::TR => format!("Filtrelenen paketler:\n {filtered} toplamın ({percentage})"), - Language::RU => format!("Отфильтровано пакетов:\n {filtered} ({percentage}% от общего числа)"), + Language::RU => { + format!("Отфильтровано пакетов:\n {filtered} ({percentage}% от общего числа)") + } }) } @@ -467,7 +469,9 @@ pub fn filtered_bytes_translation( format!("필터링된 바이트:\n {filtered} ({percentage} 의 일부)") } Language::TR => format!("Filtrelenen bayt:\n {filtered} toplamın ({percentage})"), - Language::RU => format!("Отфильтровано байт:\n {filtered} ({percentage}% от общего числа)"), + Language::RU => { + format!("Отфильтровано байт:\n {filtered} ({percentage}% от общего числа)") + } }) } @@ -929,10 +933,9 @@ pub fn style_translation(language: Language) -> &'static str { Language::ES => "Estilo", Language::PL => "Styl", Language::DE | Language::RO | Language::TR => "Stil", - Language::UK => "Стиль", + Language::UK | Language::RU => "Стиль", Language::ZH => "主题", Language::KO => "스타일", - Language::RU => "Стиль", } } @@ -1109,12 +1112,11 @@ 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::RU => "Звук:", } } diff --git a/src/translations/types/language.rs b/src/translations/types/language.rs index 03af7a6c..9a571c78 100644 --- a/src/translations/types/language.rs +++ b/src/translations/types/language.rs @@ -26,7 +26,7 @@ pub enum Language { /// Turkish TR, /// Russian - RU + RU, } impl Default for Language { @@ -36,9 +36,9 @@ impl Default for Language { } impl Language { - pub(crate) const COL1: [Language; 4] = [Language::EN, Language::FR, Language::PL, Language::UK]; - pub(crate) const COL2: [Language; 4] = [Language::DE, Language::IT, Language::RO, Language::ZH]; - pub(crate) const COL3: [Language; 4] = [Language::ES, Language::KO, Language::TR, Language::RU]; + pub(crate) const COL1: [Language; 4] = [Language::EN, Language::FR, Language::PL, Language::TR]; + pub(crate) const COL2: [Language; 4] = [Language::DE, Language::IT, Language::RO, Language::UK]; + pub(crate) const COL3: [Language; 4] = [Language::ES, Language::KO, Language::RU, Language::ZH]; pub fn get_radio_label(&self) -> &str { match self { diff --git a/src/utils/countries.rs b/src/utils/countries.rs index 623c936a..dfb361af 100644 --- a/src/utils/countries.rs +++ b/src/utils/countries.rs @@ -516,6 +516,7 @@ pub fn get_flag_from_language_code(language: &str) -> Image { "KO" => KR, "PL" => PL, "RO" => RO, + "RU" => RU, "TR" => TR, "UK" => UA, _ => UNKNOWN, From b9ffcf20f8a2fddfd52949c6fe2859d841f929e5 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 16 Apr 2023 08:53:24 +0200 Subject: [PATCH 27/31] docs: add amarao as a contributor for translation (#153) * docs: update CONTRIBUTORS.md [skip ci] * docs: update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ CONTRIBUTORS.md | 1 + 2 files changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 7f37cd1c..0cce913f 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -124,6 +124,15 @@ "contributions": [ "infra" ] + }, + { + "login": "amarao", + "name": "George Shuklin", + "avatar_url": "https://avatars.githubusercontent.com/u/652496?v=4", + "profile": "https://github.com/amarao", + "contributions": [ + "translation" + ] } ], "contributorsPerLine": 7, diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index d67792c4..b1ac1835 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -21,6 +21,7 @@ A big shout-out to all the contributors of Sniffnet ([emoji key](https://allcont Limdongju
Limdongju

🌍 Hüseyin Fahri Uzun
Hüseyin Fahri Uzun

🌍 Jauder Ho
Jauder Ho

🚇 + George Shuklin
George Shuklin

🌍 From efd5359d2518daf5d699301822d1b4eba416e7b9 Mon Sep 17 00:00:00 2001 From: Giuliano Bellini s294739 Date: Sun, 16 Apr 2023 22:49:07 +0200 Subject: [PATCH 28/31] added portuguese characters and radio button; fixed lints --- resources/fonts/full/subset_characters.txt | 2 + .../subset/sarasa-mono-sc-bold.subset.ttf | Bin 105012 -> 105060 bytes .../subset/sarasa-mono-sc-regular.subset.ttf | Bin 106288 -> 106336 bytes src/gui/pages/settings_language_page.rs | 21 +------- src/translations/translations.rs | 46 ++++++++---------- src/translations/types/language.rs | 12 +++-- src/utils/countries.rs | 1 + 7 files changed, 34 insertions(+), 48 deletions(-) diff --git a/resources/fonts/full/subset_characters.txt b/resources/fonts/full/subset_characters.txt index f0e11ab9..04138b46 100644 --- a/resources/fonts/full/subset_characters.txt +++ b/resources/fonts/full/subset_characters.txt @@ -101,6 +101,7 @@ z à á â +ã ä ç è @@ -112,6 +113,7 @@ z ñ ó ô +õ ö ù ú diff --git a/resources/fonts/subset/sarasa-mono-sc-bold.subset.ttf b/resources/fonts/subset/sarasa-mono-sc-bold.subset.ttf index ffc5918123304a55d4c7d1797749e654a7568448..226a73cb577d06bd301320c94e109f2ac6439181 100644 GIT binary patch delta 6321 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 diff --git a/resources/fonts/subset/sarasa-mono-sc-regular.subset.ttf b/resources/fonts/subset/sarasa-mono-sc-regular.subset.ttf index 107ba56bc1533f568ead731ad43fba4e11003f3d..f7aae9f6c4fcd05bd02776a57a2bd28fb77c7e61 100644 GIT binary patch delta 6232 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 N$7#xk^)x`^{{Xc1llA}r delta 6087 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 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/translations/translations.rs b/src/translations/translations.rs index 2e259973..67b3c600 100644 --- a/src/translations/translations.rs +++ b/src/translations/translations.rs @@ -128,7 +128,7 @@ 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 => "Транспортний протокол", @@ -137,7 +137,6 @@ pub fn transport_protocol_translation(language: Language) -> &'static str { Language::KO => "전송 프로토콜", Language::TR => "İletişim protokolü", Language::RU => "Транспортный протокол", - Language::PT => "Protocolo de transporte", } } @@ -467,10 +466,9 @@ pub fn filtered_packets_translation( Language::RU => { format!("Отфильтровано пакетов:\n {filtered} ({percentage}% от общего числа)") } - }, Language::PT => { format!("Pacotes filtrados:\n {filtered} ({percentage} do total)") - }, + } }) } @@ -502,10 +500,9 @@ pub fn filtered_bytes_translation( Language::RU => { format!("Отфильтровано байт:\n {filtered} ({percentage}% от общего числа)") } - }, Language::PT => { format!("Bytes filtrados:\n {filtered} ({percentage} do total)") - }, + } }) } @@ -552,8 +549,7 @@ pub fn no_favorites_translation(language: Language) -> Text<'static> { 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.", }) @@ -621,7 +617,7 @@ 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 => "обидва", @@ -630,7 +626,6 @@ pub fn both_translation(language: Language) -> &'static str { Language::KO => "둘다", Language::TR => "ikiside", Language::RU => "оба", - Language::PT => "ambos", } } @@ -651,7 +646,7 @@ 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 => "Усі", @@ -660,7 +655,6 @@ pub fn all_translation(language: Language) -> &'static str { Language::KO => "모두", Language::TR => "Hepsi", Language::RU => "Всё", - Language::PT => "Todos", } } @@ -687,7 +681,7 @@ 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 => "байти на секунду", @@ -696,7 +690,6 @@ pub fn bytes_chart_translation(language: Language) -> &'static str { Language::KO => "초당 바이트", Language::TR => "saniye başı bayt", Language::RU => "байтов в секунду", - Language::PT => "bytes por segundo", } } @@ -759,7 +752,7 @@ 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 => "улюблені", @@ -768,7 +761,6 @@ pub fn favorite_report_translation(language: Language) -> &'static str { Language::KO => "즐겨찾기", Language::TR => "favoriler", Language::RU => "избранное", - Language::PT => "favoritos", } } @@ -885,7 +877,7 @@ 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", @@ -894,7 +886,6 @@ pub fn yeti_day_translation(language: Language) -> &'static str { Language::KO => "Sniffnet의 기본 라이트테마", Language::TR => "Sniffnet'in orjinal açık teması", Language::RU => "Оригинальная светая тема Sniffnet'а", - Language::PT => "Tema claro original de Sniffnet", } } @@ -991,13 +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 | Language::TR => "Stil", Language::UK | Language::RU => "Стиль", Language::ZH => "主题", Language::KO => "스타일", - Language::PT => "Estilo", } } @@ -1090,7 +1080,7 @@ 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 => "(на секунду)", @@ -1099,7 +1089,6 @@ pub fn per_second_translation(language: Language) -> &'static str { Language::KO => "(초당)", Language::TR => "(her saniye)", Language::RU => "(в секунду)", - Language::PT => "(por segundo)", } } @@ -1161,7 +1150,7 @@ pub fn threshold_translation(language: Language) -> 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}%"), @@ -1171,7 +1160,6 @@ pub fn volume_translation(language: Language, value: u8) -> String { Language::KO => format!("볼륨: {value:^3}%"), Language::TR => format!("Ses: {value:^3}%"), Language::RU => format!("Объём: {value:^3}%"), - Language::PT => format!("Volume: {value:^3}%"), } } @@ -1267,8 +1255,14 @@ pub fn packets_exceeded_translation(language: Language) -> &'static str { 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"), diff --git a/src/translations/types/language.rs b/src/translations/types/language.rs index 03078927..692fa63a 100644 --- a/src/translations/types/language.rs +++ b/src/translations/types/language.rs @@ -38,9 +38,15 @@ impl Default for Language { } impl Language { - pub(crate) const COL1: [Language; 4] = [Language::EN, Language::FR, Language::PL, Language::TR]; - pub(crate) const COL2: [Language; 4] = [Language::DE, Language::IT, Language::RO, Language::UK]; - pub(crate) const COL3: [Language; 4] = [Language::ES, Language::KO, Language::RU, Language::ZH]; + pub(crate) const COL1: [Language; 5] = [ + Language::EN, + Language::FR, + Language::PL, + Language::RU, + Language::ZH, + ]; + 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 { diff --git a/src/utils/countries.rs b/src/utils/countries.rs index dfb361af..0f4f395f 100644 --- a/src/utils/countries.rs +++ b/src/utils/countries.rs @@ -515,6 +515,7 @@ pub fn get_flag_from_language_code(language: &str) -> Image { "IT" => IT, "KO" => KR, "PL" => PL, + "PT" => PT, "RO" => RO, "RU" => RU, "TR" => TR, From cdacba39fda3c7aac942495484a6d0f1b7aa3fb8 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 16 Apr 2023 23:19:04 +0200 Subject: [PATCH 29/31] docs: add franciscoBSalgueiro as a contributor for translation (#154) * docs: update CONTRIBUTORS.md [skip ci] * docs: update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ CONTRIBUTORS.md | 3 +++ 2 files changed, 12 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 0cce913f..f1b2c332 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -133,6 +133,15 @@ "contributions": [ "translation" ] + }, + { + "login": "franciscoBSalgueiro", + "name": "Francisco Salgueiro", + "avatar_url": "https://avatars.githubusercontent.com/u/92053465?v=4", + "profile": "https://github.com/franciscoBSalgueiro", + "contributions": [ + "translation" + ] } ], "contributorsPerLine": 7, diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index b1ac1835..d314b087 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -23,6 +23,9 @@ A big shout-out to all the contributors of Sniffnet ([emoji key](https://allcont Jauder Ho
Jauder Ho

🚇 George Shuklin
George Shuklin

🌍 + + Francisco Salgueiro
Francisco Salgueiro

🌍 + From e6a01df5cb8ec46b6eb99fe6d43d19410f084e0b Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 17 Apr 2023 09:03:38 +0200 Subject: [PATCH 30/31] docs: add philclifford as a contributor for platform (#156) * docs: update CONTRIBUTORS.md [skip ci] * docs: update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ CONTRIBUTORS.md | 1 + 2 files changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index f1b2c332..4702d2cb 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -142,6 +142,15 @@ "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/CONTRIBUTORS.md b/CONTRIBUTORS.md index d314b087..b305e716 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -25,6 +25,7 @@ A big shout-out to all the contributors of Sniffnet ([emoji key](https://allcont Francisco Salgueiro
Francisco Salgueiro

🌍 + Phil Clifford
Phil Clifford

📦 From 2ab518eff0b78dba2fca38694e81008085a4c38e Mon Sep 17 00:00:00 2001 From: Giuliano Bellini s294739 Date: Mon, 17 Apr 2023 09:56:30 +0200 Subject: [PATCH 31/31] added instructions for glow renderer and updated CHANGELOG --- CHANGELOG.md | 14 ++++++++++++++ README.md | 7 +++++++ 2 files changed, 21 insertions(+) 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/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!***