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 1/2] 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 c61668dc38bf74fefb9f2494439ed94c14e2fd0b Mon Sep 17 00:00:00 2001 From: Giuliano Bellini s294739 Date: Thu, 13 Apr 2023 11:31:21 +0200 Subject: [PATCH 2/2] 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, })))