diff --git a/czkawka_core/src/similar_images.rs b/czkawka_core/src/similar_images.rs index 7a205f0..e1f9653 100644 --- a/czkawka_core/src/similar_images.rs +++ b/czkawka_core/src/similar_images.rs @@ -666,6 +666,14 @@ impl SimilarImages { continue; } + // This shouldn't be executed too much times, so it should be quite fast to check this + if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() { + // End thread which send info to gui + progress_thread_run.store(false, Ordering::Relaxed); + progress_thread_handle.join().unwrap(); + return false; + } + // Jeśli jeszcze nie dodał, to dodaje teraz grupę główną do już obrobionych if !master_of_group.contains(hash) { master_of_group.insert(hash.clone()); diff --git a/czkawka_gui/src/compute_results.rs b/czkawka_gui/src/compute_results.rs index 965c583..edb97a5 100644 --- a/czkawka_gui/src/compute_results.rs +++ b/czkawka_gui/src/compute_results.rs @@ -676,10 +676,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver< let (directory, file) = split_path(&file_entry.path); let values: [(u32, &dyn ToValue); 7] = [ (ColumnsBigFiles::SelectionButton as u32, &false), - ( - ColumnsBigFiles::Size as u32, - &(format!("{} ({} {})", size.file_size(options::BINARY).unwrap(), size, fl!("general_bytes"))), - ), + (ColumnsBigFiles::Size as u32, &(size.file_size(options::BINARY).unwrap())), (ColumnsBigFiles::Name as u32, &file), (ColumnsBigFiles::Path as u32, &directory), ( diff --git a/czkawka_gui/src/help_functions.rs b/czkawka_gui/src/help_functions.rs index 64c19b4..61e8c29 100644 --- a/czkawka_gui/src/help_functions.rs +++ b/czkawka_gui/src/help_functions.rs @@ -425,7 +425,11 @@ pub fn add_text_to_text_view(text_view: &TextView, string_to_append: &str) { Some(t) => t.to_string(), None => "".to_string(), }; - buffer.set_text(format!("{}\n{}", current_text, string_to_append).as_str()); + if current_text.is_empty() { + buffer.set_text(string_to_append); + } else { + buffer.set_text(format!("{}\n{}", current_text, string_to_append).as_str()); + } } pub fn set_buttons(hashmap: &mut HashMap, buttons_array: &[gtk::Widget], button_names: &[String]) { @@ -577,7 +581,6 @@ pub fn clean_invalid_headers(model: >k::ListStore, column_color: i32, column_p } // Non empty means that header points at reference folder else { - // TODO verify how it works 'reference: loop { if model.value(¤t_iter, column_color).get::().unwrap() != HEADER_ROW_COLOR { panic!("First deleted element, should be a header"); // First element should be header diff --git a/czkawka_gui/src/saving_loading.rs b/czkawka_gui/src/saving_loading.rs index fa5fc99..a164c21 100644 --- a/czkawka_gui/src/saving_loading.rs +++ b/czkawka_gui/src/saving_loading.rs @@ -38,11 +38,15 @@ const DEFAULT_DUPLICATE_REMOVE_AUTO_OUTDATED_CACHE: bool = true; struct LoadSaveStruct { loaded_items: HashMap>, + text_view: gtk::TextView, } impl LoadSaveStruct { - pub fn new() -> Self { - Self { loaded_items: Default::default() } + pub fn with_text_view(text_view: gtk::TextView) -> Self { + Self { + loaded_items: Default::default(), + text_view, + } } pub fn get_vector_string(&self, key: String, default_value: Vec) -> Vec { @@ -66,7 +70,13 @@ impl LoadSaveStruct { } else if item.is_empty() { "".to_string() } else { - println!("For key {}, found invalid {:?} result(not string)", key, item); + add_text_to_text_view( + &self.text_view, + &fl!( + "saving_loading_invalid_string", + generate_translation_hashmap(vec![("key", key), ("result", format!("{:?}", item))]) + ), + ); default_value }; } @@ -86,7 +96,13 @@ impl LoadSaveStruct { } } } else { - println!("For key {}, found invalid {:?} result(not string)", key, item); + add_text_to_text_view( + &self.text_view, + &fl!( + "saving_loading_invalid_int", + generate_translation_hashmap(vec![("key", key), ("result", format!("{:?}", item))]) + ), + ); default_value }; } @@ -103,11 +119,23 @@ impl LoadSaveStruct { } else if text == "true" || text == "1" { true } else { - println!("Failed to decode bool from \"{}\", found {}", key, item[0]); + add_text_to_text_view( + &self.text_view, + &fl!( + "saving_loading_decode_problem_bool", + generate_translation_hashmap(vec![("key", key), ("result", item[0].to_string())]) + ), + ); default_value } } else { - println!("For key {}, found invalid {:?} result(not bool)", key, item); + add_text_to_text_view( + &self.text_view, + &fl!( + "saving_loading_invalid_bool", + generate_translation_hashmap(vec![("key", key), ("result", format!("{:?}", item))]) + ), + ); default_value }; } @@ -118,7 +146,10 @@ impl LoadSaveStruct { // Bool, int, string pub fn save_var(&mut self, key: String, value: T) { if self.loaded_items.contains_key(&key) { - println!("Already exists in hashmap key {}", key) + add_text_to_text_view( + &self.text_view, + &fl!("saving_loading_saving_same_keys", generate_translation_hashmap(vec![("key", key.clone())])), + ); } self.loaded_items.insert(key, vec![value.to_string()]); @@ -153,18 +184,20 @@ impl LoadSaveStruct { if !config_dir.is_dir() { add_text_to_text_view( text_view_errors, - format!( - "Cannot create or open save configuration file in path {} because already there is a folder.", - config_dir.display() - ) - .as_str(), + &fl!( + "saving_loading_folder_config_instead_file", + generate_translation_hashmap(vec![("path", config_dir.display().to_string())]) + ), ); return None; } } else if let Err(e) = fs::create_dir_all(config_dir) { add_text_to_text_view( text_view_errors, - format!("Failed configuration to create configuration folder {}, reason {}", config_dir.display(), e).as_str(), + &fl!( + "saving_loading_failed_to_create_configuration_folder", + generate_translation_hashmap(vec![("path", config_dir.display().to_string()), ("reason", e.to_string())]) + ), ); return None; } @@ -172,7 +205,13 @@ impl LoadSaveStruct { let config_file_handler = match File::create(&config_file) { Ok(t) => t, Err(e) => { - add_text_to_text_view(text_view_errors, format!("Failed to create config file {}, reason {}", config_dir.display(), e).as_str()); + add_text_to_text_view( + text_view_errors, + &fl!( + "saving_loading_failed_to_create_config_file", + generate_translation_hashmap(vec![("path", config_file.display().to_string()), ("reason", e.to_string())]) + ), + ); return None; } }; @@ -181,7 +220,13 @@ impl LoadSaveStruct { if !config_file.exists() || !config_file.is_file() { if manual_execution { // Don't show errors when there is no configuration file when starting app - add_text_to_text_view(text_view_errors, format!("Cannot load configuration from file {:?}.", config_file.display()).as_str()); + add_text_to_text_view( + text_view_errors, + &fl!( + "saving_loading_failed_to_read_config_file", + generate_translation_hashmap(vec![("path", config_file.display().to_string())]) + ), + ); } return None; } @@ -189,7 +234,13 @@ impl LoadSaveStruct { let config_file_handler = match File::open(&config_file) { Ok(t) => t, Err(e) => { - add_text_to_text_view(text_view_errors, format!("Failed to create config file {}, reason {}", config_dir.display(), e).as_str()); + add_text_to_text_view( + text_view_errors, + &fl!( + "saving_loading_failed_to_create_config_file", + generate_translation_hashmap(vec![("path", config_file.display().to_string()), ("reason", e.to_string())]) + ), + ); return None; } }; @@ -205,7 +256,13 @@ impl LoadSaveStruct { if let Some((mut config_file_handler, config_file)) = self.open_save_file(text_view_errors, false, manual_execution) { let mut loaded_data: String = String::new(); if let Err(e) = config_file_handler.read_to_string(&mut loaded_data) { - add_text_to_text_view(text_view_errors, format!("Failed to read data from file {:?}, reason {}", config_file, e).as_str()); + add_text_to_text_view( + text_view_errors, + &fl!( + "saving_loading_failed_to_read_data_from_file", + generate_translation_hashmap(vec![("path", config_file.display().to_string()), ("reason", e.to_string())]) + ), + ); return; } @@ -219,18 +276,29 @@ impl LoadSaveStruct { self.loaded_items.entry(header.clone()).or_insert_with(Vec::new); self.loaded_items.get_mut(&header).unwrap().push(line.to_string()); } else { - println!("Failed {} orphan data in line {}", line, index); + add_text_to_text_view( + text_view_errors, + &fl!( + "saving_loading_orphan_data", + generate_translation_hashmap(vec![("data", line.to_string()), ("index", index.to_string())]) + ), + ); } } let (_, hashmap_sl) = create_hash_map(); for setting in self.loaded_items.keys() { if !hashmap_sl.contains_key(setting) { - println!("Setting {} is not valid", setting); + add_text_to_text_view( + text_view_errors, + &fl!("saving_loading_not_valid", generate_translation_hashmap(vec![("data", setting.to_string())])), + ); } } - // dbg!(&self.loaded_items); + if manual_execution { + add_text_to_text_view(text_view_errors, &fl!("saving_loading_loading_success")); + } } } @@ -353,7 +421,7 @@ pub fn save_configuration(manual_execution: bool, upper_notebook: &GuiUpperNoteb return; } - let mut saving_struct = LoadSaveStruct::new(); + let mut saving_struct = LoadSaveStruct::with_text_view(text_view_errors.clone()); let (hashmap_ls, _hashmap_sl) = create_hash_map(); @@ -454,7 +522,7 @@ pub fn load_configuration(manual_execution: bool, upper_notebook: &GuiUpperNoteb reset_text_view(&text_view_errors); - let mut loaded_entries = LoadSaveStruct::new(); + let mut loaded_entries = LoadSaveStruct::with_text_view(text_view_errors.clone()); loaded_entries.open_and_read_content(&text_view_errors, manual_execution); // Load here language, default system language could change value in settings so we don't want to lose this value @@ -569,10 +637,6 @@ pub fn load_configuration(manual_execution: bool, upper_notebook: &GuiUpperNoteb } else { settings.check_button_settings_load_at_start.set_active(false); } - - if manual_execution { - add_text_to_text_view(&text_view_errors, &fl!("saving_loading_reset_configuration")); - } } pub fn reset_configuration(manual_clearing: bool, upper_notebook: &GuiUpperNotebook, settings: &GuiSettings, text_view_errors: &TextView) { diff --git a/i18n/en/czkawka_gui.ftl b/i18n/en/czkawka_gui.ftl index 2038389..a90dcad 100644 --- a/i18n/en/czkawka_gui.ftl +++ b/i18n/en/czkawka_gui.ftl @@ -24,9 +24,6 @@ window_progress_title = Scanning general_ok_button = Ok general_close_button = Close -general_bytes = bytes -general_lost = lost - # Main window music_title_checkbox = Title music_artist_checkbox = Artist @@ -340,10 +337,6 @@ settings_saving_button = Save configuration settings_loading_button = Load configuration settings_reset_button = Reset configuration -settings_load_orphan_data = Found invalid header in line {$line_number} \"{$line}\" when loading file {$name} (save file may be from different Czkawka version) -settings_load_invalid_bool_value = Found invalid header in line {$line_number} \"{$line}\" which isn't proper value(0/1/true/false) when loading file {$name} - - ## Opening cache/config folders settings_folder_cache_open_tooltip = Opens folder where are stored txt files with cache. @@ -399,9 +392,23 @@ progress_all_stages = All Stages:{" "} saving_loading_saving_success = Saved configuration to file { $name }. saving_loading_saving_failure = Failed to save configuration data to file { $name }. saving_loading_reset_configuration = Current configuration was cleared. -saving_loading_loading_success = Properly loaded configuration from file. +saving_loading_loading_success = Properly loaded app configuration. + +saving_loading_invalid_string = For key "{ $key }" found invalid result - "{ $result }" which is not a string. +saving_loading_invalid_int = For key "{ $key }" found invalid result - "{ $result }" which is not a integer. +saving_loading_invalid_bool = For key "{ $key }" found invalid result - "{ $result }" which is not a bool. +saving_loading_decode_problem_bool = Failed to decode bool from key "{ $key }" found "{ $result }" but allowed values are 0, 1, true or false. +saving_loading_saving_same_keys = Trying to save setting with duplicated key "{ $key }". saving_loading_failed_to_get_home_directory = Failed to get home directory to open/save config file. +saving_loading_folder_config_instead_file = Cannot create or open save configuration file in path "{ $path }" because already there is a folder. +saving_loading_failed_to_create_configuration_folder = Failed configuration to create configuration folder "{ $path }", reason "{ $reason }". +saving_loading_failed_to_create_config_file = Failed to create config file "{ $path }", reason "{ $reason }". +saving_loading_failed_to_read_config_file = Cannot load configuration from "{ $path }" because not exists or is not a file. +saving_loading_failed_to_read_data_from_file = Cannot read data from file "{ $path }", reason "{ $reason }". +saving_loading_orphan_data = Found orphan data "{ $data }" in line "{ $line }". +saving_loading_not_valid = Setting "{ $data }" not exists in current app version. + # Invalid symlinks invalid_symlink_infinite_recursion = Infinite recursion @@ -416,7 +423,6 @@ about_window_motto = This program is free to use and will always be. # Various dialog dialogs_ask_next_time = Ask next time -reason_of_error = reason delete_file_failed = Failed to remove file {$name}, reason {$reason} diff --git a/i18n/pl/czkawka_gui.ftl b/i18n/pl/czkawka_gui.ftl index aaf0c69..b725ddd 100644 --- a/i18n/pl/czkawka_gui.ftl +++ b/i18n/pl/czkawka_gui.ftl @@ -20,8 +20,6 @@ window_progress_title = Skanowanie # General general_ok_button = Ok general_close_button = Zamknij -general_bytes = bajtów -general_lost = zaprzepaszczono # Main window music_title_checkbox = Tytuł music_artist_checkbox = Wykonawca @@ -41,7 +39,7 @@ duplicate_hash_type_tooltip = Blake3 - kryptograficzna funkcja haszująca. Z racji połączenia szybkości i niskiej ilości kolizji jest to domyślny tryb. - CRC32 - prosta funkcja haszująca. Powinna być szybsza niż Blake3, lecz bardzo rzadko może mogą wystąpić kolizje hashy. + CRC32 - prosta funkcja haszująca. Powinna być szybsza niż Blake3, lecz bardzo rzadko może mogą wystąpić kolizje hashów. XXH3 - zarówno pod względem jakości hashu jak i wydajności jest podobny do Blake3, dlatego te algorytmy mogą być używane wymiennie. duplicate_check_method_tooltip = @@ -98,7 +96,7 @@ check_button_general_same_size_tooltip = Wyrzuca z wyników skanowania pliki, kt main_label_size_bytes_tooltip = Rozmiar plików które będą zawarte przy przeszukiwaniu # Upper window upper_tree_view_included_folder_column_title = Foldery do Przeszukania -upper_tree_view_included_reference_column_title = Źródłowy Folder +upper_tree_view_included_reference_column_title = Foldery Referencyjne upper_recursive_button = Rekursywnie upper_recursive_button_tooltip = Jeśli zaznaczony, szuka plików i folderów również w katalogach wewnątrz, nawet jeśli nie znajdują się one bezpośrednio w tym folderze. upper_manual_add_included_button = Ręcznie Dodaj @@ -107,21 +105,21 @@ upper_remove_included_button = Usuń upper_manual_add_excluded_button = Ręcznie Dodaj upper_add_excluded_button = Dodaj upper_remove_excluded_button = Usuń -upper_manual_add_included_button_tooltip = Pozwala ręcznie dodać foldery do skanowania -upper_add_included_button_tooltip = Dodaje wybrany folder do przeskanowania -upper_remove_included_button_tooltip = Usuwa zaznaczony folder z listy do przeskanowania -upper_manual_add_excluded_button_tooltip = Pozwala ręcznie dodać foldery do ignorowania -upper_add_excluded_button_tooltip = Dodaje wybrany folder do ignorowanych -upper_remove_excluded_button_tooltip = Usuwa zaznaczony folder z ignorowanych +upper_manual_add_included_button_tooltip = Pozwala ręcznie dodać foldery do skanowania. +upper_add_included_button_tooltip = Dodaje wybrany folder do przeskanowania. +upper_remove_included_button_tooltip = Usuwa zaznaczony folder z listy do skanowania. +upper_manual_add_excluded_button_tooltip = Pozwala ręcznie dodać ignorowane foldery. +upper_add_excluded_button_tooltip = Dodaje wybrany folder do ignorowanych. +upper_remove_excluded_button_tooltip = Usuwa zaznaczony folder z ignorowanych. upper_notebook_items_configuration = Konfiguracja Skanowania upper_notebook_excluded_directories = Ignorowane Foldery upper_notebook_included_directories = Przeszukiwane Foldery upper_allowed_extensions_tooltip = - Dozwolone rozszerzenia muszą być oddzielone za pomocą przecinków - brak rozszerzeń oznacza ż wszystkie rozszerzenia są używane. + Dozwolone rozszerzenia muszą być oddzielone za pomocą przecinków - brak rozszerzeń oznacza że wszystkie rozszerzenia są używane. - Makra IMAGE, VIDEO, MUSIC, TEXT które dodają rozrzerzenia w paczkach, również są wspierane + Makra IMAGE, VIDEO, MUSIC, TEXT które dodają rozszerzenia w paczkach, również są wspierane. - Przykładowe użycie ".exe, IMAGE, VIDEO, .rar, 7z" oznacza że obrazy(np. jpg, png), widea(np. avi, mp4) oraz pliki z roszerzeniami exe, rar i 7z będą przeskanowane + Przykładowe użycie ".exe, IMAGE, VIDEO, .rar, 7z" oznacza że obrazy(np. jpg, png), widea(np. avi, mp4) oraz pliki z rozszerzeniami exe, rar i 7z będą przeskanowane. upper_excluded_items_tooltip = Ignorowane obiekty mogą zawierać *(oznaczający dowolny ciąg znaków) i muszą być oddzielone za pomocą przecinków. Działa o wiele wolniej niż Ignorowane Foldery, dlatego należy używać tego ostrożnie. @@ -152,9 +150,9 @@ popover_custom_name_check_button_entry_tooltip = popover_custom_regex_check_button_entry_tooltip = Pozwala wyszukiwać rekordy za pomocą regexów. - W tym trybie przeszukiwanym tekstem jest pełna ścieżka(nazwa + ścieżka) + W tym trybie przeszukiwanym tekstem jest pełna ścieżka(nazwa pliku + ścieżka do niego). - Example usage: + Przykładowe użycie: /usr/bin/ziemniak.txt może zostać znalezione with /ziem[a-z]+ Używana jest domyśla implementacja Rust regex o której użyciu można więcej przeczytać tutaj - https://docs.rs/regex. @@ -253,13 +251,6 @@ settings_notebook_videos = Podobne Wideo ## Multiple - settings used in multiple tabs -settings_multiple_delete_outdated_cache_checkbutton = Delete outdated cache entries automatically -settings_multiple_delete_outdated_cache_checkbutton_tooltip = - Dozwolone rozszerzenia muszą być oddzielone za pomocą przecinków - brak rozszerzeń oznacza że wszystkie rozszerzenia są używane. - - Makra IMAGE, VIDEO, MUSIC, TEXT które dodają rozszerzenia w paczkach, również są wspierane - - Przykładowe użycie ". exe, Image, Video,. rar, 7z" oznacza że obrazy(np. jpg, png), widea(np. avi, mp4) oraz pliki z rozszerzeniami exe, rar i 7z będą przeskanowane. settings_multiple_image_preview_checkbutton_tooltip = Pokazuje podgląd obrazów po ich zaznaczeniu po prawej stronie aplikacji. settings_multiple_image_preview_checkbutton = Pokazuj podgląd obrazów settings_multiple_clear_cache_button_tooltip = Ręcznie czyści pamięć podręczną z nieaktualnych danych. @@ -281,7 +272,7 @@ settings_duplicates_prehash_checkbutton_tooltip = Domyślnie jest zablokowane, ponieważ może powodować spowolnione skanowanie w niektórych sytuacjach. Jest mocno polecane osobom które skanują tylko i wyłącznie katalogi zawierające dziesiątki lub setki tysięcy lub nawet miliony plików, ponieważ może to wielokrotnie przyspieszyć proces skanowania. -settings_duplicates_prehash_minimal_entry_tooltip = Minimalny rozmiar pliku, którego cząstowy hash będzie zapisywany do pamięci podręcznej. +settings_duplicates_prehash_minimal_entry_tooltip = Minimalny rozmiar pliku, którego cząstkowy hash będzie zapisywany do pamięci podręcznej. settings_duplicates_hide_hard_link_button = Ukrywaj twarde dowiązania(nie działa na Windowsie) settings_duplicates_prehash_checkbutton = Używaj pamięci podręcznej dla hashy cząstkowych settings_duplicates_minimal_size_cache_label = Wielkość pliku, od którego hash będzie zapisywany w pamięci podręcznej @@ -295,44 +286,40 @@ settings_reset_button_tooltip = Resetuje aktualne ustawienia do domyślnie używ settings_saving_button = Zapisanie ustawień settings_loading_button = Załadowanie ustawień settings_reset_button = Reset ustawień -settings_load_orphan_data = Znaleziono dane bez wlaściciela w lini { $line_number } \"{ $line }\" podczas ładowania pliku { $name } (plik zapisu może pochodzić z innej wersji Czkawki) -settings_load_invalid_bool_value = Znaleziono nieprawidłowe dane w linii { $line_number } \"{ $line }\" które nie są poprawną wartością binarną(0/1/true/false) w pliku { $name } ## Opening cache/config folders settings_folder_cache_open_tooltip = Otwiera folder gdzie przechowywana jest pamięć podręczna aplikacji. - Jej ręczne modyfikowanie może powodować wyświetlanie niepoprawnych wyników lub jej uszkodzenie spowoduje koniecznośc ponownej generacji, lecz umożliwia też oszczędzenie czasu przy przesuwaniu większej ilości plików. + Jej ręczne modyfikowanie może powodować wyświetlanie niepoprawnych wyników lub jej uszkodzenie spowoduje konieczność ponownej generacji, lecz umożliwia też oszczędzenie czasu przy przesuwaniu większej ilości plików. Można pliki kopiować pomiędzy komputerami by zaoszczędzić czas na hashowaniu plików(oczywiście tylko gdy dane są przechowywane w identycznej strukturze katalogów na komputerach). settings_folder_settings_open_tooltip = Otwiera folder gdzie Czkawka przechowuje ustawienia. - Ich ręczna zmiana, może spowodować różne błędy i kataklizmy, którym fiziologom się nie śniły. + Ich ręczna zmiana, może spowodować różne błędy i kataklizmy, o których fizjologom się nie śniło. settings_folder_cache_open = Otwórz folder pamięci podręcznej settings_folder_settings_open = Otwórz folder ustawień # Compute results compute_stopped_by_user = Przeszukiwanie zostało zatrzymane przez użytkownika -compute_found = Znaleziono -compute_duplicated_files_in = duplikatów w -compute_groups_which_took = grupach, które zabrały -compute_groups = grup -compute_duplicates_for = duplikatów dla -compute_empty_folders = pustych folderów -compute_empty_files = pustych plików -compute_biggest_files = największych plików -compute_temporary_files = plików tymczasowych -compute_similar_image = obrazów -compute_similar_videos = plików wideo -compute_music_files = plików muzycznych -compute_symlinks = niepoprawnych linków symbolicznych -compute_broken_files = zepsutych plików +compute_found_duplicates_hash_size = Znaleziono { $number_files } duplikatów w { $number_groups } grupach, które zajmują { $size } +compute_found_duplicates_name = Znaleziono { $number_files } duplikatów w { $number_groups } grupach +compute_found_empty_folders = Znaleziono { $number_files } pustych folderów +compute_found_empty_files = Znaleziono { $number_files } pustych plików +compute_found_big_files = Znaleziono { $number_files } największych plików +compute_found_temporary_files = Znaleziono { $number_files } tymczasowych plików +compute_found_images = Znaleziono { $number_files } podobnych obrazów w { $number_groups } grupach +compute_found_videos = Znaleziono { $number_files } podobnych plików wideo w { $number_groups } grupach +compute_found_music = Znaleziono { $number_files } podobnych plików muzycznych w { $number_groups } grupach +compute_found_invalid_symlinks = Znaleziono { $number_files } niepoprawnych dowiązań symbolicznych +compute_found_broken_files = Znaleziono { $number_files } uszkodzonych plików # Progress window progress_scanning_general_file = Skanowanie { $file_number } pliku progress_scanning_broken_files = Sprawdzanie { $file_checked }/{ $all_files } pliku progress_scanning_video = Hashowanie { $file_checked }/{ $all_files } pliku wideo progress_scanning_image = Hashowanie { $file_checked }/{ $all_files } obrazu +progress_comparing_image_hashes = Porównywanie { $file_checked }/{ $all_files } hashu obrazu progress_scanning_music_tags_end = Porównywanie tagów { $file_checked }/{ $all_files } pliku audio progress_scanning_music_tags = Sczytywanie tagów { $file_checked }/{ $all_files } pliku audio progress_scanning_empty_folders = Przeszukiwanie { $folder_number } folderu @@ -343,9 +330,23 @@ progress_analyzed_full_hash = Obliczanie pełnego hashu { $file_checked }/{ $all progress_current_stage = Aktualny Etap:{ " " } progress_all_stages = Wszystkie Etapy:{ " " } # Saving loading -saving_loading_saving_success = Zapisano konfigurację do pliku +saving_loading_saving_success = Zapisano konfigurację do pliku { $name }. +saving_loading_saving_failure = Nie udało zapisać się konfiguracji do pliku { $name }. saving_loading_reset_configuration = Przywrócono domyślą konfigurację. -saving_loading_loading_success = Poprawnie załadowano konfigurację z pliku +saving_loading_loading_success = Poprawnie załadowano ustawienia aplikacji. +saving_loading_invalid_string = Dla klucza "{ $key }" znaleziono niepoprawną wartość - "{ $result }" która nie jest jedno-liniowym ciągiem znaków. +saving_loading_invalid_int = Dla klucza "{ $key }" znaleziono niepoprawną wartość - "{ $result }" która nie jest liczbą całkowitą. +saving_loading_invalid_bool = Dla klucza "{ $key }" znaleziono niepoprawną wartość - "{ $result }" która nie jest typem logicznym. +saving_loading_decode_problem_bool = Nie udało się zdekodować wartości z klucza "{ $key }", znaleziono "{ $result }" ale dozwolone wartości to 0, 1, true lub false. +saving_loading_saving_same_keys = Próba zapisania ustawień z zduplikowanym kluczem "{ $key }". +saving_loading_failed_to_get_home_directory = Nie udało się pobrać informacji o katalogu domowym by otworzyć i zapisać plik konfiguracyjny. +saving_loading_folder_config_instead_file = Nie można utworzyć lub otworzyć pliku konfiguracyjnego w ścieżce "{ $path }", ponieważ w danej ścieżce istnieje już folder. +saving_loading_failed_to_create_configuration_folder = Nie udało się utworzyć folderu konfiguracyjnego "{ $path }", powód "{ $reason }". +saving_loading_failed_to_create_config_file = Nie udało się utworzyć pliku konfiguracyjnego "{ $path }", powód "{ $reason }". +saving_loading_failed_to_read_config_file = Nie można załadować konfiguracji z "{ $path }" ponieważ nie istnieje lub nie jest plikiem. +saving_loading_failed_to_read_data_from_file = Nie można odczytać danych z pliku "{ $path }", powód "{ $reason }". +saving_loading_orphan_data = Znaleziono osierocone dane "{ $data }" w wierszu "{ $line }". +saving_loading_not_valid = Ustawienie "{ $data }" nie istnieje w bieżącej wersji aplikacji. # Invalid symlinks invalid_symlink_infinite_recursion = Nieskończona rekurencja invalid_symlink_non_existent_destination = Nie istniejący docelowy plik @@ -361,44 +362,43 @@ about_window_motto = ale za to przynajmniej kod jest nieczytelny. # Various dialog dialogs_ask_next_time = Pytaj następnym razem -reason_of_error = powód delete_file_failed = Nie udało się usunąć pliku { $name }, powód { $reason } delete_title_dialog = Potwierdzenie usunięcia delete_question_label = Czy na pewno usunąć te pliki? delete_all_files_in_group_title = Potwierdzenie usunięcia wszystkich plików w grupie delete_all_files_in_group_label1 = W niektórych grupach zaznaczono wszystkie rekordy. delete_all_files_in_group_label2 = Czy na pewno je usunąć? -delete_folder_failed = Nie udało się usunąć folderu { $name } ponieważ nie istnieje, uprawnienia nie są wystarczające lub nie jest pusty. -delete_items_label = { $items } plików zostanie usuniętych. +delete_folder_failed = Nie udało się usunąć folderu { $dir } ponieważ nie istnieje, uprawnienia nie są wystarczające lub nie jest pusty. +delete_items_label = { $items } plików będzie usuniętych. delete_items_groups_label = { $items } plików z { $groups } grup będzie usuniętych. hardlink_failed = Nie udało się utworzyć twardego dowiązania hard_sym_invalid_selection_title_dialog = Niepoprawne zaznaczenie w niektórych grupach -hard_sym_invalid_selection_label_1 = W niektórych grupach zaznaczono tylko 1 rekord który zostanie zignorowany. +hard_sym_invalid_selection_label_1 = W niektórych grupach zaznaczono tylko 1 rekord, który zostanie zignorowany. hard_sym_invalid_selection_label_2 = Aby móc używać dowiązań, należy zaznaczyć przynajmniej 2 obiekty w danej grupie. hard_sym_invalid_selection_label_3 = Pierwszy pozostaje nienaruszony a drugi i kolejne są dowiązywane do tego pierwszego. hard_sym_link_title_dialog = Potwierdzenie dowiązania hard_sym_link_label = Czy na pewno dowiązać te pliki? move_folder_failed = Nie można przenieść folderu { $name }, powód { $reason } move_file_failed = Nie można przenieść pliku { $name }, powód { $reason } -move_files_title_dialog = Wybierz folder do którego zostaną przeniesione pliki -move_files_choose_more_than_1_path = Można przenieść elementy tylko do 1 folderu, zaznaczono { $path_number } +move_files_title_dialog = Wybierz folder, do którego zostaną przeniesione pliki +move_files_choose_more_than_1_path = Można przenieść elementy tylko do 1 folderu, zaznaczono { $path_number }. move_stats = Poprawnie przeniesiono { $num_files }/{ $all_files } elementów save_results_to_file = Zapisano wyniki do pliku { $name } search_not_choosing_any_music = BŁĄD: Musisz zaznaczyć przynajmniej jeden pole, według którego będą wyszukiwane podobne pliki muzyczne. include_folders_dialog_title = Foldery do przeszukiwania exclude_folders_dialog_title = Foldery do ignorowania include_manually_directories_dialog_title = Dodaj katalogi ręcznie -cache_properly_cleared = Poprawnie wyczyszczono pamięc podręczną +cache_properly_cleared = Poprawnie wyczyszczono pamięć podręczną cache_clear_duplicates_title = Czyszczenie pamięci podręcznej duplikatów cache_clear_similar_images_title = Czyszczenie pamięci podręcznej podobnych obrazów -cache_clear_similar_videos_title = Czyszczenie pamięci podręcznej podobnych plików Wideo +cache_clear_similar_videos_title = Czyszczenie pamięci podręcznej podobnych plików wideo cache_clear_message_label_1 = Czy na pewno chcesz oczyścić pamięć podręczną z przestarzałych wpisów? cache_clear_message_label_2 = Ta operacja usunie wszystkie rekordy, które wskazują na nieistniejące pliki. cache_clear_message_label_3 = Może spowodować to przyspieszenie ładowania i zapisywania danych do pamięci w trakcie skanowania. cache_clear_message_label_4 = OSTRZEŻENIE: Usunięte zostaną wszystkie rekordy z odpiętych dyskach zewnętrznych i konieczne będzie ich ponowne sprawdzenie po podpięciu. # Show preview -preview_temporary_file = Nie udało się otworzyć tymczasowego obrazu { $name }, powód { $reason } -preview_0_size = Nie można stworzyć podglądu obrazu { $name }, z wysokością lub szerokością 0 pikseli -preview_temporary_image_save = Nie udało się zapisać tymczasowego obrazu do { $name }, powód { $reason } -preview_temporary_image_remove = Nie udało się usunąć tymczasowego obrazu { $name }, powód { $reason } -preview_failed_to_create_cache_dir = Nie udało stworzyć się katalogu { $name } wymaganego do stworzenia podglądu obrazu, powód { $reason } +preview_temporary_file = Nie udało się otworzyć tymczasowego obrazu { $name }, powód { $reason }. +preview_0_size = Nie można stworzyć podglądu obrazu { $name }, z wysokością lub szerokością 0 pikseli. +preview_temporary_image_save = Nie udało się zapisać tymczasowego obrazu do { $name }, powód { $reason }. +preview_temporary_image_remove = Nie udało się usunąć tymczasowego obrazu { $name }, powód { $reason }. +preview_failed_to_create_cache_dir = Nie udało stworzyć się katalogu { $name } wymaganego do stworzenia podglądu obrazu, powód { $reason }. diff --git a/misc/translation_test.py b/misc/translation_test.py index 20b5600..e2e050e 100644 --- a/misc/translation_test.py +++ b/misc/translation_test.py @@ -7,6 +7,9 @@ with open('i18n/' + base_translation + "/czkawka_gui.ftl", 'r') as file: for line in base_translation_file_content: if line.find("=") != -1: first_split = line.split("=")[0].strip() + # Debug check, check for usage of AAAAA in result to see which esults are unused + # To check in what exactly places are usused, remove -c parameter + # print("rg \"" + first_split + "\" czkawka_gui/src -c;echo \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - "+first_split+"\"") try: base_keywords.index(first_split) print("Duplicated member " + first_split +" in base translation") diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 00252ea..d6bf895 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -26,3 +26,10 @@ apps: - home - removable-media - udisks2 + slots: + - dbus-daemon +slots: + dbus-daemon: + interface: dbus + bus: session + name: pl.qarmin.czkawka \ No newline at end of file